am 5028a1a1: am 1eba16a5: am 86eecf46: am a15ba0e7: am b55ee96b: am f9a6b37b: am cf05e0c2: am 0969f15c: am ac08bc8a: Merge "Update Android CTS bandaid urls that use test_key1 to a new key" into jb-dev

* commit '5028a1a1b5534a5abc4f15cb5ae0c1a5f0554a90':
  Update Android CTS bandaid urls that use test_key1 to a new key
diff --git a/CtsCoverage.mk b/CtsCoverage.mk
index 4689bae..21d46d1 100644
--- a/CtsCoverage.mk
+++ b/CtsCoverage.mk
@@ -28,26 +28,41 @@
 api_xml_description := $(coverage_out)/api.xml
 $(api_xml_description) : $(api_text_description) $(APICHECK)
 	$(hide) echo "Converting API file to XML: $@"
-	$(hide) mkdir -p $(coverage_out)
-	$(hide) $(APICHECK_COMMAND) -convert2xml $(api_text_description) $(api_xml_description)
+	$(hide) mkdir -p $(dir $@)
+	$(hide) $(APICHECK_COMMAND) -convert2xml $< $@
 
 cts-test-coverage-report := $(coverage_out)/test-coverage.html
 cts-verifier-coverage-report := $(coverage_out)/verifier-coverage.html
 cts-combined-coverage-report := $(coverage_out)/combined-coverage.html
 
-cts_api_coverage_dependencies := $(cts_api_coverage_exe) $(dexdeps_exe) $(api_xml_description) $(ACP)
+cts_api_coverage_dependencies := $(cts_api_coverage_exe) $(dexdeps_exe) $(api_xml_description)
 
-$(cts-test-coverage-report) : $(CTS_COVERAGE_TEST_CASE_LIST) $(cts_api_coverage_dependencies)
+cts_coverage_test_cases_dependencies := $(foreach c, $(CTS_COVERAGE_TEST_CASE_LIST), $(call intermediates-dir-for,APPS,$(c))/package.apk)
+$(cts-test-coverage-report): PRIVATE_TEST_CASES_APKS := $(cts_coverage_test_cases_dependencies)
+$(cts-test-coverage-report): PRIVATE_CTS_API_COVERAGE_EXE := $(cts_api_coverage_exe)
+$(cts-test-coverage-report): PRIVATE_DEXDEPS_EXE := $(dexdeps_exe)
+$(cts-test-coverage-report): PRIVATE_API_XML_DESC := $(api_xml_description)
+$(cts-test-coverage-report) : $(cts_coverage_test_cases_dependencies) $(cts_api_coverage_dependencies) | $(ACP)
 	$(call generate-coverage-report,"CTS Tests API Coverage Report",\
-			$(CTS_COVERAGE_TEST_CASE_LIST),cts-test-apks,html,test-coverage.html)
+			$(PRIVATE_TEST_CASES_APKS),html)
 
-$(cts-verifier-coverage-report) : CtsVerifier $(cts_api_coverage_dependencies)
+cts_coverage_test_cases_dependencies := $(call intermediates-dir-for,APPS,CtsVerifier)/package.apk
+$(cts-verifier-coverage-report): PRIVATE_TEST_CASES_APKS := $(cts_coverage_test_cases_dependencies)
+$(cts-verifier-coverage-report): PRIVATE_CTS_API_COVERAGE_EXE := $(cts_api_coverage_exe)
+$(cts-verifier-coverage-report): PRIVATE_DEXDEPS_EXE := $(dexdeps_exe)
+$(cts-verifier-coverage-report): PRIVATE_API_XML_DESC := $(api_xml_description)
+$(cts-verifier-coverage-report) : $(cts_coverage_test_cases_dependencies) $(cts_api_coverage_dependencies) | $(ACP)
 	$(call generate-coverage-report,"CTS Verifier API Coverage Report",\
-			CtsVerifier,cts-verifier-apks,html,verifier-coverage.html)
+			$(PRIVATE_TEST_CASES_APKS),html)
 
-$(cts-combined-coverage-report) : CtsVerifier $(cts_api_coverage_dependencies) $(CTS_COVERAGE_TEST_CASE_LIST) $(cts_api_coverage_dependencies)
+cts_coverage_test_cases_dependencies := $(foreach c, $(CTS_COVERAGE_TEST_CASE_LIST) CtsVerifier, $(call intermediates-dir-for,APPS,$(c))/package.apk)
+$(cts-combined-coverage-report): PRIVATE_TEST_CASES_APKS := $(cts_coverage_test_cases_dependencies)
+$(cts-combined-coverage-report): PRIVATE_CTS_API_COVERAGE_EXE := $(cts_api_coverage_exe)
+$(cts-combined-coverage-report): PRIVATE_DEXDEPS_EXE := $(dexdeps_exe)
+$(cts-combined-coverage-report): PRIVATE_API_XML_DESC := $(api_xml_description)
+$(cts-combined-coverage-report) : $(cts_coverage_test_cases_dependencies) $(cts_api_coverage_dependencies) | $(ACP)
 	$(call generate-coverage-report,"CTS Combined API Coverage Report",\
-			$(CTS_COVERAGE_TEST_CASE_LIST) CtsVerifier,cts-combined-apks,html,combined-coverage.html)
+			$(PRIVATE_TEST_CASES_APKS),html)
 
 .PHONY: cts-test-coverage
 cts-test-coverage : $(cts-test-coverage-report)
@@ -67,17 +82,22 @@
 
 # Arguments;
 #  1 - Name of the report printed out on the screen
-#  2 - Name of APK packages that will be scanned to generate the report
-#  3 - Name of variable to hold the calculated paths of the APKs
-#  4 - Format of the report
-#  5 - Output file name of the report
+#  2 - List of apk files that will be scanned to generate the report
+#  3 - Format of the report
 define generate-coverage-report
-	$(foreach testcase,$(2),$(eval $(call add-testcase-apk,$(3),$(testcase))))
-	$(hide) mkdir -p $(coverage_out)
-	$(hide) $(cts_api_coverage_exe) -d $(dexdeps_exe) -a $(api_xml_description) -f $(4) -o $(coverage_out)/$(5) $($(3))
-	$(hide) echo $(1): file://$(ANDROID_BUILD_TOP)/$(coverage_out)/$(5)
+	$(hide) mkdir -p $(dir $@)
+	$(hide) $(PRIVATE_CTS_API_COVERAGE_EXE) -d $(PRIVATE_DEXDEPS_EXE) -a $(PRIVATE_API_XML_DESC) -f $(3) -o $@ $(2)
+	@ echo $(1): file://$(ANDROID_BUILD_TOP)/$@
 endef
 
-define add-testcase-apk
-	$(1) += $(call intermediates-dir-for,APPS,$(2))/package.apk
-endef
+# Reset temp vars
+cts_api_coverage_dependencies :=
+cts_coverage_test_cases_dependencies :=
+cts-combined-coverage-report :=
+cts-verifier-coverage-report :=
+cts-test-coverage-report :=
+api_xml_description :=
+api_text_description :=
+coverage_out :=
+dexdeps_exe :=
+cts_api_coverage_exe :=
diff --git a/CtsTestCaseList.mk b/CtsTestCaseList.mk
index 45150c1..76b91a7 100644
--- a/CtsTestCaseList.mk
+++ b/CtsTestCaseList.mk
@@ -19,6 +19,7 @@
 	CtsInstrumentationAppDiffCert \
 	CtsPermissionDeclareApp \
 	CtsPermissionDeclareAppCompat \
+	CtsReadExternalStorageApp \
 	CtsSharedUidInstall \
 	CtsSharedUidInstallDiffCert \
 	CtsSimpleAppInstall \
@@ -29,17 +30,24 @@
 	CtsMultiUserStorageApp
 
 cts_support_packages := \
-	CtsAccelerationTestStubs \
-	CtsDeviceAdmin \
-	CtsThemeDeviceApp \
-	CtsMonkeyApp \
-	CtsMonkeyApp2 \
-	CtsSomeAccessibilityServices \
-	CtsTestStubs \
-	SignatureTest \
-	TestDeviceSetup \
-	CtsUiAutomatorApp \
-	$(cts_security_apps_list)
+    CtsAccelerationTestStubs \
+    CtsDeviceAdmin \
+    CtsDeviceOpenGl \
+    CtsDeviceTaskswitchingAppA \
+    CtsDeviceTaskswitchingAppB \
+    CtsDeviceTaskswitchingControl \
+    CtsDeviceUi \
+    CtsMonkeyApp \
+    CtsMonkeyApp2 \
+    CtsSampleDeviceApp \
+    CtsSomeAccessibilityServices \
+    CtsTestStubs \
+    CtsThemeDeviceApp \
+    SignatureTest \
+    TestDeviceSetup \
+    CtsUiAutomatorApp \
+    CtsUsbSerialTestApp \
+    $(cts_security_apps_list)
 
 cts_external_packages := \
 	com.replica.replicaisland
@@ -52,92 +60,108 @@
 
 # Test packages that require an associated test package XML.
 cts_test_packages := \
-	CtsAccelerationTestCases \
-	CtsAccountManagerTestCases \
-	CtsAccessibilityServiceTestCases \
-	CtsAccessibilityTestCases \
-	CtsAdminTestCases \
-	CtsAnimationTestCases \
-	CtsAppTestCases \
-	CtsBluetoothTestCases \
-	CtsCalendarcommon2TestCases \
-	CtsContentTestCases \
-	CtsDatabaseTestCases \
-	CtsDisplayTestCases \
-	CtsDpiTestCases \
-	CtsDpiTestCases2 \
-	CtsDreamsTestCases \
-	CtsDrmTestCases \
-	CtsEffectTestCases \
-	CtsExampleTestCases \
-	CtsGestureTestCases \
-	CtsGraphicsTestCases \
-	CtsGraphics2TestCases \
-	CtsHardwareTestCases \
-	CtsJniTestCases \
-	CtsKeystoreTestCases \
-	CtsLocationTestCases \
-	CtsMediaStressTestCases \
-	CtsMediaTestCases \
-	CtsNativeOpenGLTestCases \
-	CtsNdefTestCases \
-	CtsNetTestCases \
-	CtsOpenGLTestCases \
-	CtsOpenGlPerfTestCases \
-	CtsOsTestCases \
-	CtsPermissionTestCases \
-	CtsPermission2TestCases \
-	CtsPreferenceTestCases \
-	CtsPreference2TestCases \
-	CtsProviderTestCases \
-	CtsRenderscriptTestCases \
-	CtsSaxTestCases \
-	CtsSecurityTestCases \
-	CtsSpeechTestCases \
-	CtsTelephonyTestCases \
-	CtsTextTestCases \
-	CtsTextureViewTestCases \
-	CtsThemeTestCases \
-	CtsUtilTestCases \
-	CtsViewTestCases \
-	CtsWebkitTestCases \
-	CtsWidgetTestCases
+    CtsDeviceFilePerf \
+    CtsDeviceUi \
+    CtsDeviceDram \
+    CtsDeviceSimpleCpu \
+    CtsDeviceBrowserBench \
+    CtsDeviceVideoPerf \
+    CtsDeviceOpenGl \
+    CtsAccelerationTestCases \
+    CtsAccountManagerTestCases \
+    CtsAccessibilityServiceTestCases \
+    CtsAccessibilityTestCases \
+    CtsAdminTestCases \
+    CtsAnimationTestCases \
+    CtsAppTestCases \
+    CtsBluetoothTestCases \
+    CtsCalendarcommon2TestCases \
+    CtsContentTestCases \
+    CtsDatabaseTestCases \
+    CtsDisplayTestCases \
+    CtsDpiTestCases \
+    CtsDpiTestCases2 \
+    CtsDreamsTestCases \
+    CtsDrmTestCases \
+    CtsEffectTestCases \
+    CtsGestureTestCases \
+    CtsGraphicsTestCases \
+    CtsGraphics2TestCases \
+    CtsHardwareTestCases \
+    CtsJniTestCases \
+    CtsKeystoreTestCases \
+    CtsLocationTestCases \
+    CtsMediaStressTestCases \
+    CtsMediaTestCases \
+    CtsNativeOpenGLTestCases \
+    CtsNdefTestCases \
+    CtsNetTestCases \
+    CtsOpenGLTestCases \
+    CtsOpenGlPerfTestCases \
+    CtsOsTestCases \
+    CtsPermissionTestCases \
+    CtsPermission2TestCases \
+    CtsPreferenceTestCases \
+    CtsPreference2TestCases \
+    CtsProviderTestCases \
+    CtsRenderscriptTestCases \
+    CtsRenderscriptGraphicsTestCases \
+    CtsRsCppTestCases \
+    CtsSampleDeviceTestCases \
+    CtsSaxTestCases \
+    CtsSecurityTestCases \
+    CtsSpeechTestCases \
+    CtsTelephonyTestCases \
+    CtsTextTestCases \
+    CtsTextureViewTestCases \
+    CtsThemeTestCases \
+    CtsUtilTestCases \
+    CtsViewTestCases \
+    CtsWebkitTestCases \
+    CtsWidgetTestCases
 
 # All APKs that need to be scanned by the coverage utilities.
 CTS_COVERAGE_TEST_CASE_LIST := \
 	$(cts_support_packages) \
 	$(cts_test_packages)
 
-
 # Host side only tests
 cts_host_libraries := \
-	CtsAdbTests \
-	CtsAppSecurityTests \
-	CtsThemeHostTestCases \
-	CtsMonkeyTestCases
-
+    CtsAdbTests \
+    CtsAppSecurityTests \
+    CtsHostJank \
+    CtsHostUi \
+    CtsMonkeyTestCases \
+    CtsSampleHostTestCases \
+    CtsThemeHostTestCases \
+    CtsUsbTests
 
 # Native test executables that need to have associated test XMLs.
 cts_native_exes := \
 	NativeMediaTest_SL \
-	NativeMediaTest_XA
+	NativeMediaTest_XA \
+	bionic-unit-tests-cts \
 
 cts_ui_tests := \
-        CtsUiAutomatorTests
+    CtsUiAutomatorTests
+
+cts_device_jars := \
+    CtsDeviceJank
 
 # All the files that will end up under the repository/testcases
 # directory of the final CTS distribution.
 CTS_TEST_CASES := $(call cts-get-lib-paths,$(cts_host_libraries)) \
-		$(call cts-get-package-paths,$(cts_test_packages)) \
-		$(call cts-get-native-paths,$(cts_native_exes)) \
-		$(call cts-get-ui-lib-paths,$(cts_ui_tests))
+    $(call cts-get-package-paths,$(cts_test_packages)) \
+    $(call cts-get-native-paths,$(cts_native_exes)) \
+    $(call cts-get-ui-lib-paths,$(cts_ui_tests)) \
+    $(call cts-get-ui-lib-paths,$(cts_device_jars))
 
 # All the XMLs that will end up under the repository/testcases
 # and that need to be created before making the final CTS distribution.
 CTS_TEST_XMLS := $(call cts-get-test-xmls,$(cts_host_libraries)) \
-		$(call cts-get-test-xmls,$(cts_test_packages)) \
-		$(call cts-get-test-xmls,$(cts_native_exes)) \
-		$(call cts-get-test-xmls,$(cts_ui_tests))
+    $(call cts-get-test-xmls,$(cts_test_packages)) \
+    $(call cts-get-test-xmls,$(cts_native_exes)) \
+    $(call cts-get-test-xmls,$(cts_ui_tests))
 
 
 # The following files will be placed in the tools directory of the CTS distribution
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index 834320b..397b39a 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -23,6 +23,8 @@
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
+LOCAL_STATIC_JAVA_LIBRARIES := cts-sensors-tests
+
 LOCAL_PACKAGE_NAME := CtsVerifier
 
 LOCAL_JNI_SHARED_LIBRARIES := libctsverifier_jni \
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index c3232bf..f0e6c56 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -17,8 +17,8 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
-      android:versionCode="1"
-      android:versionName="4.3_r1">
+      android:versionCode="3"
+      android:versionName="4.4_r3">
 
     <!-- Using 10+ for more complete NFC support... -->
     <uses-sdk android:minSdkVersion="12"></uses-sdk>
@@ -41,6 +41,8 @@
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+
     <uses-feature android:name="android.hardware.usb.accessory" />
 
     <!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
@@ -74,7 +76,7 @@
                 android:configChanges="keyboardHidden|orientation|screenSize"
                 android:label="@string/report_viewer" />
 
-        <provider android:name=".TestResultsProvider" 
+        <provider android:name=".TestResultsProvider"
                 android:authorities="com.android.cts.verifier.testresultsprovider" />
 
         <activity android:name=".admin.PolicySerializationTestActivity"
@@ -87,6 +89,9 @@
             <meta-data android:name="test_category" android:value="@string/test_category_device_admin" />
         </activity>
 
+        <!-- A generic activity for intent based tests -->
+        <activity android:name=".IntentDrivenTestActivity"/>
+
         <activity android:name=".admin.ScreenLockTestActivity"
                 android:label="@string/da_screen_lock_test"
                 android:configChanges="keyboardHidden|orientation|screenSize">
@@ -203,6 +208,122 @@
                 android:label="@string/bt_device_picker"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
 
+        <service android:name=".bluetooth.BleClientService"
+                android:label="@string/ble_client_service_name" />
+
+        <service android:name=".bluetooth.BleServerService"
+                android:label="ble_server_service_name" />
+
+        <activity android:name=".bluetooth.BleClientTestActivity"
+                android:label="@string/ble_client_test_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleClientConnectActivity"
+                android:label="@string/ble_client_connect_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleDiscoverServiceActivity"
+                android:label="@string/ble_discover_service_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleClientCharacteristicActivity"
+                android:label="@string/ble_client_characteristic_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleNotifyCharacteristicActivity"
+                android:label="@string/ble_notify_characteristic_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleClientDescriptorActivity"
+                android:label="@string/ble_client_descriptor_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleReliableWriteActivity"
+                android:label="@string/ble_reliable_write_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleReadRssiActivity"
+                android:label="@string/ble_read_rssi_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleClientDisconnectActivity"
+                android:label="@string/ble_client_disconnect_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BleClientTestActivity" />
+        </activity>
+
+        <activity android:name=".bluetooth.BleServerStartActivity"
+                android:label="@string/ble_server_start_name"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/bt_le" />
+            <meta-data android:name="test_parent" android:value="com.android.cts.verifier.bluetooth.BluetoothTestActivity" />
+        </activity>
+
         <activity android:name=".suid.SuidFilesActivity"
                 android:label="@string/suid_files"
                 android:configChanges="keyboardHidden|orientation|screenSize">
@@ -268,6 +389,16 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.nfc" />
         </activity>
 
+        <activity android:name="com.android.cts.verifier.nfc.hce.HceReaderTestActivity"
+                android:label="@string/nfc_hce_reader_tests"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+        </activity>
+
+        <activity android:name="com.android.cts.verifier.nfc.hce.HceEmulatorTestActivity"
+                android:label="@string/nfc_hce_emulator_tests"
+                android:configChanges="keyboardHidden|orientation|screenSize">
+        </activity>
+
         <activity android:name=".nfc.NdefPushSenderActivity"
                 android:label="@string/nfc_ndef_push_sender"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -280,6 +411,128 @@
                 android:label="@string/nfc_tag_verifier"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
 
+        <activity android:name=".nfc.hce.DefaultRouteEmulatorActivity"
+                android:label="@string/nfc_hce_default_route_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.ProtocolParamsEmulatorActivity"
+                android:label="@string/nfc_hce_protocol_params_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.SinglePaymentEmulatorActivity"
+                android:label="@string/nfc_hce_single_payment_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.SimpleReaderActivity"
+                android:label="@string/nfc_hce_single_payment_reader"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.ProtocolParamsReaderActivity"
+                android:label="@string/nfc_hce_protocol_params_reader"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.DualPaymentEmulatorActivity"
+                android:label="@string/nfc_hce_dual_payment_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.ChangeDefaultEmulatorActivity"
+                android:label="@string/nfc_hce_change_default_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.SingleNonPaymentEmulatorActivity"
+                android:label="@string/nfc_hce_single_non_payment_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.DualNonPaymentEmulatorActivity"
+                android:label="@string/nfc_hce_dual_non_payment_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.ConflictingNonPaymentEmulatorActivity"
+                android:label="@string/nfc_hce_conflicting_non_payment_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.OffHostEmulatorActivity"
+                android:label="@string/nfc_hce_offhost_service_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.OnAndOffHostEmulatorActivity"
+                android:label="@string/nfc_hce_on_and_offhost_service_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.ThroughputEmulatorActivity"
+                android:label="@string/nfc_hce_throughput_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <activity android:name=".nfc.hce.TapTestEmulatorActivity"
+                android:label="@string/nfc_hce_tap_test_emulator"
+                android:configChanges="keyboardHidden|orientation|screenSize" />
+
+        <!-- services used for testing NFC host-based card emulation -->
+        <service android:name=".nfc.hce.PaymentService1" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/payment_aid_list_1"/>
+        </service>
+        <service android:name=".nfc.hce.PaymentService2" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/payment_aid_list_2"/>
+        </service>
+        <service android:name=".nfc.hce.TransportService1" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/transport_aid_list_1"/>
+        </service>
+        <service android:name=".nfc.hce.TransportService2" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/transport_aid_list_2"/>
+        </service>
+        <service android:name=".nfc.hce.AccessService" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/access_aid_list"/>
+        </service>
+        <service android:name=".nfc.hce.ThroughputService" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.host_apdu_service" android:resource="@xml/throughput_aid_list"/>
+        </service>
+
+        <service android:name=".nfc.hce.OffHostService" android:exported="true"
+                 android:permission="android.permission.BIND_NFC_SERVICE"
+                 android:enabled="false">
+            <intent-filter>
+                <action android:name="android.nfc.cardemulation.action.OFF_HOST_APDU_SERVICE"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+            </intent-filter>
+            <meta-data android:name="android.nfc.cardemulation.off_host_apdu_service" android:resource="@xml/offhost_aid_list"/>
+        </service>
+
         <activity android:name=".sensors.AccelerometerTestActivity" android:label="@string/snsr_accel_test"
                 android:screenOrientation="nosensor">
             <intent-filter>
@@ -290,6 +543,18 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.sensor.accelerometer" />
         </activity>
 
+        <activity android:name=".sensors.AccelerometerMeasurementTestActivity"
+                  android:label="@string/snsr_accel_m_test"
+                  android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+            <meta-data android:name="test_required_features"
+                       android:value="android.hardware.sensor.accelerometer"/>
+        </activity>
+
         <activity android:name=".sensors.GyroscopeTestActivity" android:label="@string/snsr_gyro_test"
                 android:screenOrientation="nosensor">
             <intent-filter>
@@ -300,6 +565,64 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.sensor.gyroscope" />
         </activity>
 
+        <activity android:name=".sensors.GyroscopeMeasurementTestActivity"
+                  android:label="@string/snsr_gyro_m_test"
+                  android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.cts.intent.category.MANUAL_TEST"/>
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+            <meta-data android:name="test_required_features"
+                       android:value="android.hardware.sensor.gyroscope"/>
+        </activity>
+
+        <!-- Disable the test until calibration routine is verified -->
+        <!--activity android:name=".sensors.MagneticFieldMeasurementTestActivity"
+                  android:label="@string/snsr_mag_m_test"
+                  android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_sensors" />
+            <meta-data android:name="test_required_features"
+                       android:value="android.hardware.sensor.compass" />
+        </activity-->
+
+        <activity android:name=".location.LocationModeOffTestActivity"
+                android:label="@string/location_mode_off_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_location" />
+        </activity>
+        <activity android:name=".location.LocationModeHighAccuracyTestActivity"
+                android:label="@string/location_mode_high_accuracy_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_location" />
+        </activity>
+        <activity android:name=".location.LocationModeBatterySavingTestActivity"
+                android:label="@string/location_mode_battery_saving_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_location" />
+        </activity>
+        <activity android:name=".location.LocationModeDeviceOnlyTestActivity"
+                android:label="@string/location_mode_device_only_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_location" />
+        </activity>
+
         <activity android:name=".camera.formats.CameraFormatsActivity"
                  android:label="@string/camera_format"
                  android:screenOrientation="landscape">
@@ -340,6 +663,7 @@
             <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
         </activity>
 
+
         <activity android:name=".camera.orientation.CameraOrientationActivity"
                  android:label="@string/camera_orientation"
                  android:screenOrientation="landscape">
@@ -376,6 +700,19 @@
             android:label="@string/camera_fov_label_options" >
         </activity>
 
+
+        <activity android:name=".camera.video.CameraVideoActivity"
+                 android:label="@string/camera_video"
+                 android:screenOrientation="landscape">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_camera" />
+            <meta-data android:name="test_required_features"
+                    android:value="android.hardware.camera.any"/>
+        </activity>
+
         <activity android:name=".usb.UsbAccessoryTestActivity"
                 android:label="@string/usb_accessory_test"
                 android:configChanges="keyboardHidden|orientation|screenSize">
@@ -397,7 +734,7 @@
             <meta-data android:name="test_category" android:value="@string/test_category_networking" />
             <meta-data android:name="test_required_features" android:value="android.hardware.wifi.direct" />
         </activity>
-        
+
         <activity android:name=".nls.NotificationListenerVerifierActivity"
                 android:label="@string/nls_test">
             <intent-filter>
@@ -415,9 +752,25 @@
                 <action android:name="android.service.notification.NotificationListenerService" />
             </intent-filter>
         </service>
-        
-        <service  android:name="nls.NotificationListenerVerifierActivity$DismissService"/>
-        
+
+        <service  android:name=".nls.NotificationListenerVerifierActivity$DismissService"/>
+        <activity android:name=".security.CAInstallNotificationVerifierActivity"
+                android:label="@string/cacert_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
+        </activity>
+        <activity android:name=".security.CANotifyOnBootActivity"
+                android:label="@string/caboot_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
+        </activity>
+
         <activity android:name=".p2p.GoNegRequesterTestListActivity"
                 android:label="@string/p2p_go_neg_requester"
                 android:configChanges="keyboardHidden|orientation|screenSize" />
@@ -462,6 +815,15 @@
             </intent-filter>
         </activity-alias>
 
+        <activity android:name=".sample.SampleTestActivity"
+                  android:label="@string/sample_framework_test">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_other" />
+        </activity>
+
         <activity android:name=".widget.WidgetTestActivity"
                 android:label="@string/widget_framework_test">
             <intent-filter>
@@ -471,6 +833,15 @@
             <meta-data android:name="test_category" android:value="@string/test_category_other" />
         </activity>
 
+        <activity android:name=".deskclock.DeskClockTestsActivity"
+                  android:label="@string/deskclock_tests">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.cts.intent.category.MANUAL_TEST" />
+            </intent-filter>
+            <meta-data android:name="test_category" android:value="@string/test_category_deskclock" />
+        </activity>
+
         <receiver android:name=".widget.WidgetCtsProvider">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
diff --git a/apps/CtsVerifier/assets/myCA.cer b/apps/CtsVerifier/assets/myCA.cer
new file mode 100644
index 0000000..3b98d3e
--- /dev/null
+++ b/apps/CtsVerifier/assets/myCA.cer
Binary files differ
diff --git a/apps/CtsVerifier/proguard.flags b/apps/CtsVerifier/proguard.flags
index ddaf962..7e6587a 100644
--- a/apps/CtsVerifier/proguard.flags
+++ b/apps/CtsVerifier/proguard.flags
@@ -6,3 +6,7 @@
     private <fields>;
 }
 
+-keepclasseswithmembers class * extends com.android.cts.verifier.location.LocationModeTestActivity
+
+-dontwarn android.hardware.Sensor
+-dontwarn java.util.concurrent.ConcurrentLinkedDeque
diff --git a/apps/CtsVerifier/res/layout/ble_button.xml b/apps/CtsVerifier/res/layout/ble_button.xml
new file mode 100644
index 0000000..6428fe2
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_button.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <Button android:id="@+id/ble_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            />
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_client_connect.xml b/apps/CtsVerifier/res/layout/ble_client_connect.xml
new file mode 100644
index 0000000..54a0a99
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_client_connect.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+
+    <LinearLayout android:orientation="horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            >
+        <EditText android:id="@+id/ble_address"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:hint="@string/ble_address"
+                />
+        <Button android:id="@+id/ble_connect"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/ble_connect"
+                />
+    </LinearLayout>
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_client_read_write.xml b/apps/CtsVerifier/res/layout/ble_client_read_write.xml
new file mode 100644
index 0000000..7edba62
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_client_read_write.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <LinearLayout android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            >
+        <LinearLayout android:orientation="horizontal"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                >
+            <EditText android:id="@+id/write_text"
+                    android:layout_width="0dp"
+                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
+                    android:hint="@string/ble_write_hint"
+                    android:padding="10dip"
+                    />
+            <Button android:id="@+id/ble_write"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:text="@string/ble_write"
+                    />
+        </LinearLayout>
+
+        <LinearLayout android:orientation="horizontal"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                >
+            <TextView android:id="@+id/read_text"
+                    android:layout_width="0dp"
+                    android:layout_weight="1"
+                    android:layout_height="wrap_content"
+                    android:hint="@string/ble_read_hint"
+                    android:padding="10dip"
+                    android:textSize="18sp"
+                    />
+            <Button android:id="@+id/ble_read"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/ble_read"
+                    />
+        </LinearLayout>
+    </LinearLayout>
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_client_test.xml b/apps/CtsVerifier/res/layout/ble_client_test.xml
new file mode 100644
index 0000000..660abd5
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_client_test.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <ListView android:id="@+id/ble_client_tests"
+            android:layout_height="fill_parent"
+            android:layout_width="match_parent"
+            android:padding="10dip"
+            />
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_notify_characteristic.xml b/apps/CtsVerifier/res/layout/ble_notify_characteristic.xml
new file mode 100644
index 0000000..786918a
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_notify_characteristic.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <RelativeLayout android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            >
+        <Button android:id="@+id/ble_notify"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:text="@string/ble_begin_notification"
+                android:padding="10dip"
+                />
+        <TextView android:id="@+id/ble_notify_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:layout_below="@id/ble_notify"
+                android:textSize="20sp"
+                android:padding="10dip"
+                />
+    </RelativeLayout>
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_read_rssi.xml b/apps/CtsVerifier/res/layout/ble_read_rssi.xml
new file mode 100644
index 0000000..8aa3193
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_read_rssi.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <RelativeLayout android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            >
+        <Button android:id="@+id/ble_read_rssi"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:text="@string/ble_read_rssi"
+                android:padding="10dip"
+                />
+        <TextView android:id="@+id/ble_rssi_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:layout_below="@id/ble_read_rssi"
+                android:textSize="20sp"
+                android:padding="10dip"
+                />
+    </RelativeLayout>
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_reliable_write.xml b/apps/CtsVerifier/res/layout/ble_reliable_write.xml
new file mode 100644
index 0000000..7db78ff
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_reliable_write.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <LinearLayout android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerInParent="true"
+            >
+        <EditText android:id="@+id/write_text"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="@string/ble_write_hint"
+                android:padding="5dip"
+                />
+        <LinearLayout android:orientation="horizontal"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                >
+            <Button android:id="@+id/ble_begin"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:text="@string/ble_begin_write"
+                    />
+            <Button android:id="@+id/ble_write"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:text="@string/ble_write"
+                    />
+            <Button android:id="@+id/ble_execute"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:text="@string/ble_execute_write"
+                    />
+        </LinearLayout>
+    </LinearLayout>
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_server_start.xml b/apps/CtsVerifier/res/layout/ble_server_start.xml
new file mode 100644
index 0000000..9ce714d
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_server_start.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="10dip"
+        >
+    <include android:id="@+id/pass_fail_buttons" 
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons"
+            />
+    <ListView android:id="@+id/ble_server_tests"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:layout_above="@id/pass_fail_buttons"
+            android:layout_alignParentTop="true"
+            android:padding="10dip"
+            />
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ble_server_start_item.xml b/apps/CtsVerifier/res/layout/ble_server_start_item.xml
new file mode 100644
index 0000000..136192f
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ble_server_start_item.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dip"
+        android:orientation="horizontal"
+        >
+    <ImageView android:id="@+id/status"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="10dip"
+            android:src="@drawable/fs_indeterminate"
+            />
+    <TextView android:id="@+id/instructions"
+            style="@style/InstructionsSmallFont"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            />
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/ca_boot_notify.xml b/apps/CtsVerifier/res/layout/ca_boot_notify.xml
new file mode 100644
index 0000000..e9309d4
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/ca_boot_notify.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2013 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:orientation="vertical" android:layout_width="fill_parent"
+  android:layout_height="fill_parent">
+
+  <ScrollView
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_alignParentTop="true" >
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+      android:orientation="vertical"
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content">
+
+      <TextView
+          android:id="@+id/check_cert_desc"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_check_cert_installed"/>
+
+      <Button android:id="@+id/check_creds"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_check_creds" />
+
+      <TextView
+          android:id="@+id/need_to_install_cert"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_if_not_installed"/>
+
+      <Button android:id="@+id/install"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_install_cert" />
+
+      <TextView
+          android:id="@+id/reboot"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_reboot_desc"/>
+
+      <TextView
+          android:id="@+id/after_reboot"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/caboot_after_boot"/>
+
+      <include layout="@layout/pass_fail_buttons" />
+    </LinearLayout>
+  </ScrollView>
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/cainstallnotify_item.xml b/apps/CtsVerifier/res/layout/cainstallnotify_item.xml
new file mode 100644
index 0000000..1359cb4
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cainstallnotify_item.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" >
+
+    <ImageView
+        android:id="@+id/ca_notify_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_marginTop="10dip"
+        android:contentDescription="@string/pass_button_text"
+        android:padding="10dip"
+        android:src="@drawable/fs_indeterminate" />
+
+    <TextView
+        android:id="@+id/ca_notify_instructions"
+        style="@style/InstructionsSmallFont"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:layout_toRightOf="@id/ca_notify_status" />
+
+    <Button
+        android:id="@+id/ca_notify_do_something"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_below="@id/ca_notify_instructions"
+        android:layout_marginLeft="20dip"
+        android:layout_marginRight="20dip"
+        android:layout_toRightOf="@id/ca_notify_status"
+        android:text="@string/cacert_do_something" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/cainstallnotify_main.xml b/apps/CtsVerifier/res/layout/cainstallnotify_main.xml
new file mode 100644
index 0000000..16882bd
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/cainstallnotify_main.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="10dip" >
+
+    <ScrollView
+        android:id="@+id/ca_notify_test_scroller"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:padding="10dip" >
+
+        <LinearLayout
+            android:id="@+id/ca_notify_test_items"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" >
+        </LinearLayout>
+    </ScrollView>
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="0"
+        layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/apps/CtsVerifier/res/layout/camera_video.xml b/apps/CtsVerifier/res/layout/camera_video.xml
new file mode 100644
index 0000000..b81721b
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/camera_video.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2013 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="fill_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" >
+
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="0dp"
+            android:layout_height="fill_parent"
+            android:layout_weight="3"
+            android:gravity="center" >
+
+            <TextureView
+                android:id="@+id/video_capture"
+                android:layout_height="0dp"
+                android:layout_width="fill_parent"
+                android:layout_weight="3" />
+            <TextView
+                android:id="@+id/camera_video_capture_label"
+                android:layout_height="wrap_content"
+                android:layout_width="fill_parent"
+                android:text="@string/video_capture_label"
+                android:padding="2dp"
+                android:textSize="16sp"
+                android:gravity="center" />
+
+        </LinearLayout>
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="0dp"
+            android:layout_height="fill_parent"
+            android:layout_weight="3"
+            android:gravity="center" >
+
+            <VideoView
+                android:id="@+id/video_playback"
+                android:layout_height="0dp"
+                android:layout_width="fill_parent"
+                android:layout_weight="3" />
+            <TextView
+                android:id="@+id/camera_video_playback_label"
+                android:layout_height="wrap_content"
+                android:layout_width="fill_parent"
+                android:text="@string/video_playback_label"
+                android:padding="2dp"
+                android:textSize="16sp"
+                android:gravity="center" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="0dp"
+            android:layout_height="fill_parent"
+            android:layout_weight="2" >
+
+            <Spinner
+                android:id="@+id/cameras_selection"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"/>
+            <Spinner
+                android:id="@+id/resolution_selection"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"/>
+            <Button
+                android:id="@+id/record_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/record_button_text"/>
+            <TextView
+                android:id="@+id/status_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/status_ready"
+                android:padding="2dp"
+                android:textSize="16sp"
+                android:gravity="center" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <include layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/intent_driven_test.xml b/apps/CtsVerifier/res/layout/intent_driven_test.xml
new file mode 100644
index 0000000..e23f441
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/intent_driven_test.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="vertical"
+    >
+
+  <ScrollView
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="1">
+    <TextView android:id="@+id/info"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:textSize="18sp"
+              android:padding="5dp"
+              android:text="@string/dc_start_alarm_test_info"
+        />
+  </ScrollView>
+
+  <LinearLayout android:id="@+id/buttons"
+                android:orientation="horizontal"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <include layout="@layout/pass_fail_buttons"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/location_mode_item.xml b/apps/CtsVerifier/res/layout/location_mode_item.xml
new file mode 100644
index 0000000..5e8dedb
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/location_mode_item.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" >
+
+    <ImageView
+        android:id="@+id/status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentTop="true"
+        android:layout_marginTop="10dip"
+        android:contentDescription="@string/pass_button_text"
+        android:padding="10dip"
+        android:src="@drawable/fs_indeterminate" />
+
+    <TextView
+        android:id="@+id/instructions"
+        style="@style/InstructionsSmallFont"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:layout_toRightOf="@id/status"
+        android:text="@string/location_mode_select_high_accuracy" />
+
+    <Button
+        android:id="@+id/launch_settings"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_below="@id/instructions"
+        android:layout_marginLeft="20dip"
+        android:layout_marginRight="20dip"
+        android:layout_toRightOf="@id/status"
+        android:onClick="launchSettings"
+        android:text="@string/location_mode_start_settings" />
+
+</RelativeLayout>
diff --git a/apps/CtsVerifier/res/layout/location_mode_main.xml b/apps/CtsVerifier/res/layout/location_mode_main.xml
new file mode 100644
index 0000000..fde6aba
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/location_mode_main.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2013 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="10dip" >
+
+    <ScrollView
+        android:id="@+id/test_scroller"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:padding="10dip" >
+
+        <LinearLayout
+            android:id="@+id/test_items"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical" >
+        </LinearLayout>
+    </ScrollView>
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="0"
+        layout="@layout/pass_fail_buttons" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/nfc_hce_reader.xml b/apps/CtsVerifier/res/layout/nfc_hce_reader.xml
new file mode 100644
index 0000000..be6617e
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/nfc_hce_reader.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2012 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+
+
+    <Spinner
+        android:id="@+id/type_ab_selection"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"/>
+
+    <include layout="@layout/pass_fail_text" />
+
+</LinearLayout>
diff --git a/apps/CtsVerifier/res/layout/pass_fail_sample.xml b/apps/CtsVerifier/res/layout/pass_fail_sample.xml
new file mode 100644
index 0000000..84d79ee
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/pass_fail_sample.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <Button android:id="@+id/sample_share_btn"
+            android:text="@string/share_button_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+    <include android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            layout="@layout/pass_fail_buttons" />
+</RelativeLayout>
diff --git a/apps/CtsVerifier/res/layout/snsr_semi_auto_test.xml b/apps/CtsVerifier/res/layout/snsr_semi_auto_test.xml
new file mode 100644
index 0000000..92039f0
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/snsr_semi_auto_test.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <TextView android:id="@+id/log_text"
+              android:gravity="bottom"
+              android:layout_height="wrap_content"
+              android:layout_width="wrap_content"
+              android:maxLines="27"
+              android:paddingBottom="5dip"
+              android:paddingLeft="10dip"
+              android:paddingRight="10dip"
+              android:paddingTop="5dip"
+              android:scrollbars="vertical"
+            />
+
+    <Button android:id="@+id/next_button"
+            android:layout_alignParentBottom="true"
+            android:layout_centerInParent="true"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="20dip"
+            android:layout_width="120dip"
+            android:text="@string/next_button_text"
+            android:textSize="24dip"
+            />
+
+</RelativeLayout>
diff --git a/apps/CtsVerifier/res/values/nfc_reader_types.xml b/apps/CtsVerifier/res/values/nfc_reader_types.xml
new file mode 100644
index 0000000..9a073a4
--- /dev/null
+++ b/apps/CtsVerifier/res/values/nfc_reader_types.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string-array name="nfc_types_array">
+    <item>Type A</item>
+    <item>Type B</item>
+    </string-array>
+</resources>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 57ad890..00ff965 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -15,12 +15,13 @@
 -->
 <resources>
     <string name="app_name">CTS Verifier</string>
-    
+
     <string name="title_version">CTS Verifier %1$s</string>
 
     <string name="pass_button_text">Pass</string>
     <string name="info_button_text">Info</string>
     <string name="fail_button_text">Fail</string>
+    <string name="next_button_text">Next</string>
 
     <!-- Strings for TestListActivity -->
     <string name="test_category_audio">Audio</string>
@@ -29,9 +30,11 @@
     <string name="test_category_hardware">Hardware</string>
     <string name="test_category_networking">Networking</string>
     <string name="test_category_sensors">Sensors</string>
+    <string name="test_category_location">Location</string>
     <string name="test_category_security">Security</string>
     <string name="test_category_streaming">Streaming</string>
     <string name="test_category_features">Features</string>
+    <string name="test_category_deskclock">Clock</string>
     <string name="test_category_other">Other</string>
     <string name="clear">Clear</string>
     <string name="test_results_cleared">Test results cleared.</string>
@@ -116,6 +119,7 @@
 
     <string name="bt_control">Bluetooth Control</string>
     <string name="bt_device_communication">Device Communication</string>
+    <string name="bt_le">Bluetooth Low Energy</string>
 
     <string name="bt_toggle_bluetooth">Toggle Bluetooth</string>
     <string name="bt_toggle_instructions">Disable and enable Bluetooth to successfully complete this test.</string>
@@ -128,16 +132,16 @@
     <string name="bt_connection_access_client">Connection Access Client</string>
     <string name="bt_connection_access_server_info">
         Start the CTS Verifier on another device, start the Bluetooth test, and choose
-        \"Connection Access Client\" to setup the test. 
-        \n\nFirst, unpair the devices via Bluetooth settings. Then connect the devices together 
+        \"Connection Access Client\" to setup the test.
+        \n\nFirst, unpair the devices via Bluetooth settings. Then connect the devices together
         using the \"Make Discoverable\" and \"Pick Server\" buttons.
         \n\nA connection access request should appear on the server and enable the pass button.
     </string>
     <string name="bt_connection_access_client_info">
         Start the CTS Verifier on another device, start the Bluetooth test, and choose
-        \"Connection Access Server\" to complete the test. 
-        \n\nMake the device acting as the server discoverable and connect to it via the 
-        \"Pick Server\" button. Check that the server displays the connection access request 
+        \"Connection Access Server\" to complete the test.
+        \n\nMake the device acting as the server discoverable and connect to it via the
+        \"Pick Server\" button. Check that the server displays the connection access request
         dialog. The client device does not need to do anything else.
     </string>
     <string name="bt_ca_dialog">Was the connection access request dialog shown?</string>
@@ -176,6 +180,53 @@
     <string name="bt_unpair">Device must be unpaired via Bluetooth settings before completing the test.\n\nUnpair the device in settings, make the server discoverable, and rescan to pick this device.</string>
     <string name="bt_settings">Bluetooth Settings</string>
 
+    <!-- BLE client side strings -->
+    <string name="ble_client_service_name">Bluetooth LE GATT Client Handler Service</string>
+    <string name="ble_client_test_name">BLE Client Test</string>
+    <string name="ble_client_connect_name">1. BLE Client Connect</string>
+    <string name="ble_discover_service_name">2. BLE Discover Service</string>
+    <string name="ble_client_characteristic_name">3. BLE Read/Write Characteristic</string>
+    <string name="ble_reliable_write_name">4. BLE Reliable Write</string>
+    <string name="ble_notify_characteristic_name">5. BLE Notify Characteristic</string>
+    <string name="ble_client_descriptor_name">6. BLE Read/Write Descriptor</string>
+    <string name="ble_read_rssi_name">7. BLE Read RSSI</string>
+    <string name="ble_client_disconnect_name">8. BLE Client Disconnect</string>
+    <string name="ble_client_test_info">The BLE test must be done simultaneously on two devices. This device is the client. All tests listed here must be done in order.</string>
+    <string name="ble_client_send_connect_info">Type in the Bluetooth address of the remote device to connect to, and verify that the devices are connected.</string>
+    <string name="ble_discover_service_info">Verify that the service is discovered when you press the "Discover Service" button.</string>
+    <string name="ble_read_write_info">Write values to and read values from the server to verify that the write and read functionalities are working correctly.</string>
+    <string name="ble_reliable_write_info">A Reliable Write has two steps.\n\n1) Write to the device. This will trigger a callback from the server to verify that the value written was correct.\n2) Execute the write, if the value written is valid.</string>
+    <string name="ble_notify_characteristic_info">Start accepting notifications, and verify that notifications are being reported correctly. The server should be notifying this device with the time every second.</string>
+    <string name="ble_read_rssi_info">Press button to read the RSSI value. Verify that the RSSI changes as you move the two devices further apart or closer together.</string>
+    <string name="ble_client_disconnect_info">Verify that the device is disconnected when you press the "Disconnect" button</string>
+    <string name="ble_address">Bluetooth address</string>
+    <string name="ble_connect">Connect</string>
+    <string name="ble_discover_service">Discover service</string>
+    <string name="ble_write_hint">Nothing to write yet</string>
+    <string name="ble_read_hint">Nothing read yet</string>
+    <string name="ble_write">Write</string>
+    <string name="ble_read">Read</string>
+    <string name="ble_begin_write">Begin write</string>
+    <string name="ble_execute_write">Execute write</string>
+    <string name="ble_begin_notification">Begin notification</string>
+    <string name="ble_stop_notification">Stop notification</string>
+    <string name="ble_waiting_notification">Waiting on notification</string>
+    <string name="ble_read_rssi">Read RSSI</string>
+    <string name="ble_disconnect">Disconnect</string>
+
+    <!-- BLE server side strings -->
+    <string name="ble_server_service_name">Bluetooth LE GATT Server Handler Service</string>
+    <string name="ble_server_start_name">BLE Server Test</string>
+    <string name="ble_server_start_info">The BLE test must be done simultaneously on two devices, a server device and a client device. This device is the server.</string>
+    <string name="ble_server_receiving_connect">Waiting on connection from BLE client.</string>
+    <string name="ble_server_add_service">Adding service to BLE server.</string>
+    <string name="ble_server_write_characteristic">Waiting on write characteristic request</string>
+    <string name="ble_server_read_characteristic">Waiting on read characteristic request</string>
+    <string name="ble_server_write_descriptor">Waiting on write descriptor request</string>
+    <string name="ble_server_read_descriptor">Waiting on read descriptor request</string>
+    <string name="ble_server_reliable_write">Waiting on reliable write from client</string>
+    <string name="ble_server_receiving_disconnect">Waiting on disconnection from BLE client</string>
+
     <!-- Strings for FeatureSummaryActivity -->
     <string name="feature_summary">Hardware/Software Feature Summary</string>
     <string name="feature_summary_info">This is a test for...</string>
@@ -205,10 +256,12 @@
         known to be compatible.\n\nThe Tag Verification tests check that your
         device can properly read and write to tags of different technologies. The MIFARE
         Ultralight test is only applicable for devices that support it.
+        \n\nThe Host-based card emulation tests check that your device has properly implemented
+             host-based card emulation.
     </string>
 
     <string name="nfc_not_enabled">NFC is not enabled!</string>
-    <string name="nfc_not_enabled_message">These tests require NFC to be enabled. Click the 
+    <string name="nfc_not_enabled_message">These tests require NFC to be enabled. Click the
         button below to goto Settings and enable it.</string>
     <string name="nfc_settings">NFC Settings</string>
 
@@ -238,7 +291,7 @@
         device running the \"CTS Verifier NDEF Sender\"...</string>
     <string name="nfc_ndef_push_receive_success">Successfully received the correct NDEF push
         message.</string>
-    <string name="nfc_ndef_push_receive_failure">Failed to receive the correct NDEF push 
+    <string name="nfc_ndef_push_receive_failure">Failed to receive the correct NDEF push
         message.</string>
 
     <string name="nfc_tag_verifier">NFC Tag Verifier</string>
@@ -263,10 +316,91 @@
     <string name="nfc_result_message">Written data:\n%1$s\n\nRead data:\n%2$s</string>
     <string name="nfc_ndef_content">Id: %1$s\nMime: %2$s\nPayload: %3$s</string>
 
-    <!-- Strings for AccelerometerTestActivity and GyroscopeTestActivity -->
+    <string name="nfc_hce">Host-based card emulation</string>
+    <string name="nfc_hce_reader_tests">HCE reader tests</string>
+    <string name="nfc_hce_emulator_tests">HCE emulator tests</string>
+    <string name="nfc_hce_emulator_test_info">The host-based card emulation
+        tests require two devices to be completed. The HCE emulator tests are used
+        to actually test the host-based card emulation feature of the device-under-test. So the
+        device running the emulator tests must be the candidate device running the software
+        to be tested. \n\nFor each emulator test, there is a corresponding "reader test"
+        in the "HCE reader tests" section. The "reader test" acts as a NFC terminal/POS
+        and makes sure the device-under-test implements card emulation correctly.</string>
+    <string name="nfc_hce_reader_test_info">The host-based card emulation
+        tests require two devices to be completed. The HCE emulator tests are used
+        to actually test the host-based card emulation feature of the device-under-test. So the
+        device running the emulator tests must be the candidate device running the software
+        to be tested. \n\nFor each emulator test, there is a corresponding "reader test"
+        in the "HCE reader tests" section. The "reader test" acts as a NFC terminal/POS
+        and makes sure the device-under-test implements card emulation correctly.
+    </string>
+    <string name="nfc_hce_type_selection">By default HCE applications must run on type A. If your device is restricted to type B (for example, because of a type B only UICC), select "Type B" from the drop-down box above. Note that all tests must be completed in the same mode (either "Type A" or "Type B").</string>
+    <string name="nfc_hce_please_wait">Please wait</string>
+    <string name="nfc_hce_setting_up">Setting up card emulation services...</string>
+
+    <string name="nfc_hce_default_route_emulator">Default route (Emulator)</string>
+    <string name="nfc_hce_default_route_reader">Default route (Reader)</string>
+    <string name="nfc_hce_default_route_emulator_help">This test verifies that the default route for ISO-DEP (ISO14443-4) frames is the host CPU. It does this by selecting an AID that any Android HCE phone will respond to if the select command is routed to the host. Please verify that there is no rule in the routing table that points this AID to the host. This test may be passed if the "PASS" button on the reader side lights up after tapping the devices together.</string>
+
+    <string name="nfc_hce_protocol_params_emulator">Protocol parameters (Emulator)</string>
+    <string name="nfc_hce_protocol_params_reader">Protocol parameters (Reader)</string>
+    <string name="nfc_hce_protocol_params_emulator_help">This test verifies that the Nfc-A and ISO-DEP protocol parameters are being set correctly. The test may be passed when no FAIL entries show up in the results below. Note that the reader device may be different from the device under test - the DUT itself does not need to be able to act as the reader for this test. \n\n Note that for each test there are 3 possible outcomes:\n1) OK -> test has passed;\n2) FAIL -> test has failed and this must be fixed;\n3) FAIL EMVCO -> this protocol parameter is deviating from the requirements in the EMV Contactless Communication Protocol specification.\n\nWhile it is allowed to ship a HCE implementation with EMVCo failures, it may not perform optimal when EMVco based payment HCE apps are run on the device.</string>
+
+    <string name="nfc_hce_single_payment_emulator">Single payment (Emulator)</string>
+    <string name="nfc_hce_single_payment_reader">Single payment (Reader)</string>
+
+    <string name="nfc_hce_dual_payment_emulator">Two payment services (Emulator)</string>
+    <string name="nfc_hce_dual_payment_reader">Two payment services (Reader)</string>
+
+    <string name="nfc_hce_change_default_emulator">Change default payment service (Emulator)</string>
+    <string name="nfc_hce_change_default_reader">Change default payment service (Reader)</string>
+
+    <string name="nfc_hce_tap_reader_title">Tap reader</string>
+    <string name="nfc_hce_tap_reader_message">Select the corresponding reader test on the remote device, click OK on this dialog, and tap devices together. The pass button will be enabled if the test passes.</string>
+
+    <string name="nfc_hce_single_non_payment_emulator">Single non-payment (Emulator)</string>
+    <string name="nfc_hce_single_non_payment_reader">Single non-payment (Reader)</string>
+
+    <string name="nfc_hce_dual_non_payment_emulator">Two non-payment services (Emulator)</string>
+    <string name="nfc_hce_dual_non_payment_reader">Two non-payment services (Reader)</string>
+
+    <string name="nfc_hce_conflicting_non_payment_emulator">Two conflicting non-payment services (Emulator)</string>
+    <string name="nfc_hce_conflicting_non_payment_reader">Two conflicting non-payment services (Reader)</string>
+
+    <string name="nfc_hce_offhost_service_emulator">Off-host service (Emulator)</string>
+    <string name="nfc_hce_offhost_service_reader">Off-host service (Reader)</string>
+    <string name="nfc_hce_offhost_emulator_help">This tests enables a service that declares some AIDs to reside off-host. This test only needs to be passed if your device has a secure element (either embedded or UICC.). The responses from the secure element are not verified by the test - it is up to the tester to verify the responses are as expected.</string>
+
+    <string name="nfc_hce_on_and_offhost_service_emulator">On and off-host services (Emulator)</string>
+    <string name="nfc_hce_on_and_offhost_service_reader">On and off-host services (Reader)</string>
+    <string name="nfc_hce_on_and_offhost_emulator_help">This tests enables a service that declares some AIDs to reside off-host, and another service that runs on host. It then first sends an APDU sequence that goes off-host, and subsequently some APDUs that should go to the on-host service. This test only needs to be passed if your device has a secure element (either embedded or UICC.). The pass button will be enabled if the on-host sequence is performed as expected. The responses from the secure element are not verified by the test - it is up to the tester to verify the responses are as expected. </string>
+
+    <string name="nfc_hce_tap_test_emulator">50 successful taps test (Emulator)</string>
+    <string name="nfc_hce_tap_test_reader">50 successful taps test (Reader)</string>
+    <string name="nfc_hce_tap_test_emulator_help">This test requires you to complete at least 50 HCE taps, to ensure stability of the HCE feature. The NFC service and controller should not crash or hang during any of the 50 taps.</string>
+    <string name="nfc_hce_throughput_emulator">HCE throughput test (Emulator)</string>
+    <string name="nfc_hce_throughput_reader">HCE throughput test (Reader)</string>
+    <string name="nfc_hce_throughput_emulator_help">This tests verifies that your HCE implementation can reach a decent throughput. While Android does not have any requirements on HCE performance, many HCE applications such as transport and payment apps do. If the average APDU roundtrip time is more than 50ms, please take a look at your implementation to see where the delay is coming from.</string>
+    <string name="nfc_hce_change_preinstalled_wallet">The device has an installed payment application that is currently set as default. To complete the test, you will be asked whether you want to make Payment Service #1 or #2 the default app. Select yes.</string>
+    <string name="nfc_hce_change_default_help">You will now be asked whether you want to make Payment Service #1 the default app. Select yes.</string>
+    <string name="nfc_hce_conflicting_non_payment_help">When tapping the first time, you will be shown a dialog that asks you to choose between TransportService #1 and TransportService #2. Select TransportService #2. Verify a dialog is shown that asks you to tap again to complete. Now tap again, and if communication with TransportService #2 is successfull the pass button will be enabled."</string>
+    <string name="nfc_payment_service_desc">NFC Payment service</string>
+    <string name="ppse">PPSE</string>
+    <string name="mastercard">MasterCard</string>
+    <string name="paymentService1">Payment Service #1</string>
+    <string name="paymentService2">Payment Service #2</string>
+    <string name="transportService1">TransportService #1</string>
+    <string name="transportService2">TransportService #2</string>
+    <string name="accessService">AccessService</string>
+    <string name="offhostService">OffhostService</string>
+
+    <!-- Strings for Sensor Test Activities -->
+    <!-- Accelerometer -->
     <string name="snsr_accel_test">Accelerometer Test</string>
     <string name="snsr_accel_test_info">This test verifies that the accelerometer is working properly. As you move the device around through space, the triangle should always point down (i.e. in the direction of gravity.) If it does not, the accelerometer is improperly configured.</string>
+    <string name="snsr_accel_m_test">Accelerometer Measurement Tests</string>
 
+    <!-- Gyroscope -->
     <string name="snsr_gyro_test">Gyroscope Test</string>
     <string name="snsr_gyro_test_info">This test verifies that the gyroscope is working properly.\n\nRotate your device as shown by the 3D block. A green background or a check mark indicates that the gyroscope\'s value is correct. A red background or a X mark indicates that the gyroscope\'s value is not right.\n\nThere are 6 parts of the test corresponding to each rotation. Press Pass for all the stages to complete this test.</string>
     <string name="snsr_gyro_test_progress">Test %1$d of %2$d</string>
@@ -274,6 +408,16 @@
     <string name="snsr_gyro_test_no_gyro_message">It doesn\'t seem like you have a gyroscope, so you don\'t need to run this test.</string>
     <string name="snsr_gyro_test_degrees_title">Wrong units?</string>
     <string name="snsr_gyro_test_degrees_message">These values looks like degrees per second. These should be radians per second!</string>
+    <string name="snsr_gyro_m_test">Gyroscope Measurement Test</string>
+
+    <!-- Magnetic Field -->
+    <string name="snsr_mag_m_test">Magnetic Field Measurement Tests</string>
+
+    <!-- Strings for Sample Test Activities -->
+    <string name="share_button_text">Share</string>
+    <string name="sample_framework_test">Sample Framework Test</string>
+    <string name="sample_test">Sample Test</string>
+    <string name="sample_test_info">This test verifies that bluetooth sharing is working properly.\nThe test assumes the Device Under Test has bluetooth enabled and is already paired with a second device, also with bluetooth enabled.\nStart this test by clicking share, choose bluetooth from the options, and then select a device to share with.\nNote: This is a sample test, used to demonstrate how to write CTS Verifier tests, so just click pass.</string>
 
     <!-- Strings for SuidFilesActivity -->
     <string name="suid_files">SUID File Scanner</string>
@@ -392,10 +536,33 @@
     <string name="cf_preview_label">Normal preview</string>
     <string name="cf_format_label">Processed callback data</string>
 
+    <!-- Strings for Camera Video -->
+    <string name="record_button_text">Test</string>
+    <string name="camera_video">Camera Video</string>
+    <string name="video_info"> This test checks video capture
+    at different resolutions. \n - The left view window shows the preview.
+    \n - Pressing the test button will trigger three
+    seconds of video recording. Playback will show up in the right view
+    window after recording is complete. \n - Use the spinners to choose
+    camera and resolution combinations. The playback should be similar
+    to what you saw in preview. \n - After all possible combinations
+    are tested, the pass button will be enabled. You may press the pass
+    button to indicate a pass. \n - You may press fail button any time during
+    the test to indicate failure.
+    </string>
+    <string name="video_capture_label">Video capture</string>
+    <string name="video_playback_label">Video playback</string>
+    <string name="dialog_fail_test">Test failed</string>
+    <string name="fail_quit">Fail and quit</string>
+    <string name="cancel">Cancel</string>
+    <string name="status_ready">Ready</string>
+    <string name="status_recording">Recording</string>
+    <string name="status_playback">Playing back</string>
+
     <!-- Strings for USB accessory test activity -->
     <string name="usb_accessory_test">USB Accessory Test</string>
     <string name="usb_accessory_test_info">
-        1. Connect your Android device to a computer and run the \'cts-usb-accessory\' program 
+        1. Connect your Android device to a computer and run the \'cts-usb-accessory\' program
         included with the CTS Verifier bundle.
         \n\n2. If you have not started the CTS Verifier, press \'OK\' when asked to open the CTS
         Verifier when the accessory is connected. \n\nIf you are already in this test,
@@ -593,9 +760,9 @@
         and disabled, and that once enabled the service is able to receive notificaitons and
         dismiss them.
     </string>
-    <string name="nls_enable_service">Please enable \"Notification Listener for CTS Verifier\" 
+    <string name="nls_enable_service">Please enable \"Notification Listener for CTS Verifier\"
         under Security > Notification Access and return here.</string>
-    <string name="nls_disable_service">Please disable \"Notification Listener for CTS Verifier\" 
+    <string name="nls_disable_service">Please disable \"Notification Listener for CTS Verifier\"
         under Security > Notification Access and return here.</string>
     <string name="nls_start_settings">Launch Settings</string>
     <string name="nls_service_started">Service should start once enabled.</string>
@@ -605,7 +772,74 @@
     <string name="nls_clear_all">Check that service can clear all notifications.</string>
     <string name="nls_service_stopped">Service should stop once disabled.</string>
     <string name="nls_note_missed">Check that notification was not received.</string>
-    
+
+    <string name="location_mode_high_accuracy_test">High Accuracy Mode Test</string>
+    <string name="location_mode_high_accuracy_info">
+        This test checks that the Location Mode API is consistent with the
+        Location Provider API when the device is in High Accuracy location mode.
+    </string>
+    <string name="location_mode_select_high_accuracy">
+        Please select the \"High accuracy\" mode at Settings > Location and return here.
+    </string>
+    <string name="location_mode_battery_saving_test">Battery Saving Mode Test</string>
+    <string name="location_mode_battery_saving_info">
+        This test checks that the Location Mode API is consistent with the
+        Location Provider API when the device is in Battery Saving location mode.
+    </string>
+    <string name="location_mode_select_battery_saving">
+        Please select the \"Battery Saving\" mode at Settings > Location and return here.
+    </string>
+    <string name="location_mode_device_only_test">Device Only Mode Test</string>
+    <string name="location_mode_device_only_info">
+        This test checks that the Location Mode API is consistent with the
+        Location Provider API when the device is in Device Only location mode.
+    </string>
+    <string name="location_mode_select_device_only">
+        Please select the \"Device Only\" mode at
+        Settings > Location and return here.
+    </string>
+    <string name="location_mode_off_test">Location Mode Off Test</string>
+    <string name="location_mode_off_info">
+        This test checks that the Location Mode API is consistent with the
+        Location Provider API when the device is in the Off location mode.
+    </string>
+
+    <string name="location_mode_start_settings">Launch Settings</string>
+    <string name="location_mode_turn_on">
+        Please turn ON location access (the switch at the top of Settings > Location)
+        and return here.
+    </string>
+    <string name="location_mode_turn_off">
+        Please turn OFF location access (the switch at the top of Settings > Location)
+        and return here.
+    </string>
+    <string name="location_mode_secure_gps_on">GPS provider should be ON in secure settings.</string>
+    <string name="location_mode_secure_gps_off">GPS provider should be OFF in secure settings.</string>
+    <string name="location_mode_secure_nlp_on">Network location provider should be ON in secure settings.</string>
+    <string name="location_mode_secure_nlp_off">Network location provider should be OFF in secure settings.</string>
+    <string name="location_mode_manager_gps_on">GPS provider should be ON in LocationManager.</string>
+    <string name="location_mode_manager_gps_off">GPS provider should be OFF in LocationManager.</string>
+    <string name="location_mode_manager_nlp_on">Network location provider should be ON in LocationManager.</string>
+    <string name="location_mode_manager_nlp_off">Network location provider should be OFF in LocationManager.</string>
+
+    <string name="cacert_test">CA Cert Notification Test</string>
+    <string name="cacert_info">This test checks that when a CA Certificate is installed, the user is notified.</string>
+    <string name="cacert_do_something">Do it</string>
+    <string name="cacert_done">Done</string>
+    <string name="cacert_install_cert">Use the CertInstaller to install the certificate. When it opens, just tap "Okay". If this button does nothing, pass the test and move on.</string>
+    <string name="cacert_check_cert_in_settings">Visit the user-installed trusted credentials page and confirm that the "Internet Widgits Pty Ltd" cert appears in the list.</string>
+    <string name="cacert_check_notification">Please look at the new notification and confirm: It say the network may be monitored. Tapping it brings up a more detailed explanation and a button to check trusted credentials. Tapping that button brings up the Trusted Credentials page you just visited.</string>
+    <string name="cacert_dismiss_notification">Dismiss the notification. If it cannot be dismissed, fail the test.</string>
+
+    <string name="caboot_test">CA Cert Notification on Boot test</string>
+    <string name="caboot_info">This test is to confirm that when the user has installed a trusted credential, the system notifies the user when it boots.</string>
+    <string name="caboot_check_cert_installed">Please check here to see whether a certificate is already installed. (If this button does nothing, pass the test and move on.)</string>
+    <string name="caboot_check_creds">Check Credentials</string>
+    <string name="caboot_if_not_installed">Only if there is no credential currently installed, install one. (If this button does nothing, pass the test and move on.)</string>
+    <string name="caboot_install_cert">Install credential</string>
+    <string name="caboot_reboot_desc">Please reboot the device and return to this test.</string>
+    <string name="caboot_after_boot">AFTER REBOOTING: Check that there is a notification that the network may be monitored. Opening that notification should show a dialog box giving more information, with a button to check trusted credentials. This should open up the same view of trusted credentials that you get via the "Check credentials" button.</string>
+
     <!-- Strings for Widget -->
     <string name="widget_framework_test">Widget Framework Test</string>
     <string name="widget_framework_test_info">This test checks some basic features of the widget
@@ -614,6 +848,84 @@
     <string name="widget_name">Widget Framework Test</string>
     <string name="widget_pass">Pass</string>
     <string name="widget_fail">Fail</string>
+
+    <!-- Strings for DeskClock -->
+    <string name="deskclock_tests">Alarms and Timers Tests</string>
+    <string name="deskclock_tests_info">
+        The Alarms and Timers tests verify that the Clock app implements the AlarmClock API properly.
+    </string>
+    <string name="deskclock_group_alarms">Alarms</string>
+    <string name="deskclock_group_timers">Timers</string>
+
+    <string name="dc_show_alarms_test">Show Alarms Test</string>
+    <string name="dc_show_alarms_test_info">
+        This test verifies that the SHOW_ALARMS API works.\n
+        1. Press the "Show Alarms" button.\n
+        2. Verify that a UI of the clock app is launched and displays the list of alarms\n
+    </string>
+    <string name="dc_show_alarms_button">Show Alarms</string>
+
+    <string name="dc_set_alarm_with_ui_test">Set Alarm Test</string>
+    <string name="dc_set_alarm_with_ui_test_info">
+        This test verifies that the ACTION_SET_ALARM with no parameters API works.\n
+        1. Press the "Set Alarm" button.\n
+        2. Verify that the clock app is launched and displays a UI to manage alarms.\n
+    </string>
+    <string name="dc_set_alarm_button">Set Alarm</string>
+    <string name="dc_set_alarm_verify_button">Verify</string>
+
+    <string name="dc_start_alarm_test">Start Alarm Test</string>
+    <string name="dc_start_alarm_test_info">
+        This test verifies that the ACTION_SET_ALARM API actually starts an alarm.\n
+        1. Press the "Start Alarm" button.\n
+        2. Make sure the alarms UI is NOT shown\n
+        3. Wait for the alarm to fire (may take up to 2 minutes)\n
+        4. Verify that the alarm title is: "Start Alarm Test",\n
+           the alarm is silent and vibrating (if the device supports vibrate).\n
+        5. Dismiss the alarm.\n
+        6. Verify that the alarm is not in the Clock\'s alarms list. The Verify button opens
+           the alarm view.\n
+    </string>
+    <string name="dc_start_alarm_button">Start Alarm</string>
+
+    <string name="dc_full_alarm_test">Full Alarm Test</string>
+    <string name="dc_full_alarm_test_info">
+        This test verifies that the ACTION_SET_ALARM API supports all extras.\n
+        1. Press the "Create Alarm" button.\n
+        2. Verify that you see one alarm with the following information:\n
+           Name of alarm: Create Alarm Test. \n
+           Vibrate: on.\n
+           Ringtone: silent.\n
+           Time:  01:23. \n
+           Repeating on: Monday and Wednesday. \n
+    </string>
+    <string name="dc_full_alarm_button">Create Alarm</string>
+
+    <string name="dc_set_timer_with_ui_test">Set Timer Test</string>
+    <string name="dc_set_timer_with_ui_test_info">
+        This test verifies that the ACTION_SET_TIMER API with no paramters open the UI\n
+        1. Press the "Set Timer" button.\n
+        2. Verify that the an app is launched and displays a UI to manage timers.\n
+    </string>
+    <string name="dc_set_timer_with_ui_button">Set Timer</string>
+
+    <string name="dc_start_timer_test">Start Timer Test</string>
+    <string name="dc_start_timer_test_info">
+        This test verifies that the ACTION_SET_TIMER API actually starts a timer\n
+        1. Press the "Start Timer" button.\n
+        2. Verify that a timer is started  and NO timers UI is shown.\n
+        3. Verify that the timer named "Start Timer Test" rings after 30 seconds. Dismiss it.\n
+        4. Verify that the timer is deleted after the dismissal.\n
+    </string>
+    <string name="dc_start_timer_button">Start Timer</string>
+
+    <string name="dc_start_timer_with_ui_test">Start Timer With UI Test</string>
+    <string name="dc_start_timer_with_ui_test_info">
+        This test verifies that the ACTION_SET_TIMER API actually starts a timer with UI\n
+        1. Press the "Start Timer" button.\n
+        2. Verify that a timer is started  and the timers UI is shown with a timer named "Start Timer Test".\n
+        3. Verify that the timer rings after 30 seconds.\n
+    </string>
     
     <!-- Strings for LockConfirmBypassTest -->
     <string name="lock_confirm_test_title">Keyguard Password Verification</string>
diff --git a/apps/CtsVerifier/res/xml/access_aid_list.xml b/apps/CtsVerifier/res/xml/access_aid_list.xml
new file mode 100644
index 0000000..1303f13
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/access_aid_list.xml
@@ -0,0 +1,6 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/transportService1">
+        <aid-group>
+            <aid-filter android:name="F005060708"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/offhost_aid_list.xml b/apps/CtsVerifier/res/xml/offhost_aid_list.xml
new file mode 100644
index 0000000..524e54d
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/offhost_aid_list.xml
@@ -0,0 +1,9 @@
+<offhost-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/offhostService">
+    <aid-group>
+        <!-- OBTH card manager AID -->
+        <aid-filter android:name="A000000151000000"/>
+        <!-- NXP card manager AID -->
+        <aid-filter android:name="A000000003000000"/>
+    </aid-group>
+</offhost-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/payment_aid_list_1.xml b/apps/CtsVerifier/res/xml/payment_aid_list_1.xml
new file mode 100644
index 0000000..2036402
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/payment_aid_list_1.xml
@@ -0,0 +1,9 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/paymentService1">
+        <aid-group android:description="@string/paymentService1" android:category="payment">
+            <aid-filter android:name="325041592E5359532E4444463031"
+                        android:description="@string/ppse"/>
+            <aid-filter android:name="A0000000041010"
+                        android:description="@string/mastercard"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/payment_aid_list_2.xml b/apps/CtsVerifier/res/xml/payment_aid_list_2.xml
new file mode 100644
index 0000000..36a5af0
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/payment_aid_list_2.xml
@@ -0,0 +1,9 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/paymentService2">
+        <aid-group android:description="@string/paymentService2" android:category="payment">
+            <aid-filter android:name="325041592E5359532E4444463031"
+                        android:description="@string/ppse"/>
+            <aid-filter android:name="A0000000041010"
+                        android:description="@string/mastercard"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/throughput_aid_list.xml b/apps/CtsVerifier/res/xml/throughput_aid_list.xml
new file mode 100644
index 0000000..7f49eb3
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/throughput_aid_list.xml
@@ -0,0 +1,6 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/transportService1">
+        <aid-group>
+            <aid-filter android:name="F0010203040607FF"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/transport_aid_list_1.xml b/apps/CtsVerifier/res/xml/transport_aid_list_1.xml
new file mode 100644
index 0000000..9396391
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/transport_aid_list_1.xml
@@ -0,0 +1,6 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/transportService1">
+        <aid-group>
+            <aid-filter android:name="F001020304"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/res/xml/transport_aid_list_2.xml b/apps/CtsVerifier/res/xml/transport_aid_list_2.xml
new file mode 100644
index 0000000..9e20ff3
--- /dev/null
+++ b/apps/CtsVerifier/res/xml/transport_aid_list_2.xml
@@ -0,0 +1,6 @@
+<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
+    android:description="@string/transportService2">
+        <aid-group>
+            <aid-filter android:name="F001020304"/>
+        </aid-group>
+</host-apdu-service>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/IntentDrivenTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/IntentDrivenTestActivity.java
new file mode 100644
index 0000000..678a338
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/IntentDrivenTestActivity.java
@@ -0,0 +1,223 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ *  A generic activity for intent based tests.
+ *
+ *  This activity can be reused for various tests that are intent based. The activity consists of a
+ *  text view containing instructions and one or more buttons that trigger intents.
+ *  Each button can send one or more intenrs as startActivity() calls.
+ *
+ *  The intents can either be generated statically and passed as an extra to the intent that started
+ *  this activity or in some cases where the intent needs to be based on dynamic data (for example
+ *  time of day), an {@link IntentFactory} class name can be passed instead. This intent factory
+ *  will dynamically create the intent when the button is clicked based on the test id and the
+ *  button that was clicked.
+ */
+public class IntentDrivenTestActivity extends PassFailButtons.Activity implements OnClickListener {
+    public static final String EXTRA_ID = "id";
+    public static final String EXTRA_TITLE = "title";
+    public static final String EXTRA_INFO = "info";
+    public static final String EXTRA_BUTTONS = "buttons";
+
+    private String mTestId;
+    private ButtonInfo[] mButtonInfos;
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.intent_driven_test);
+        setPassFailButtonClickListeners();
+
+        final Intent intent = getIntent();
+        if (!intent.hasExtra(EXTRA_ID)
+                || !intent.hasExtra(EXTRA_TITLE)
+                || !intent.hasExtra(EXTRA_INFO)
+                || !intent.hasExtra(EXTRA_BUTTONS)) {
+            throw new IllegalArgumentException(
+                    "Intent must have EXTRA_ID, EXTRA_TITLE, EXTRA_INFO & EXTRA_BUTTONS");
+        }
+
+        mTestId = intent.getStringExtra(EXTRA_ID);
+        setTitle(intent.getIntExtra(EXTRA_TITLE, -1));
+
+        final TextView info = (TextView) findViewById(R.id.info);
+        info.setText(intent.getIntExtra(EXTRA_INFO, -1));
+
+        final ViewGroup buttons = (ViewGroup) findViewById(R.id.buttons);
+        final Parcelable[] parcelables = intent.getParcelableArrayExtra(EXTRA_BUTTONS);
+        mButtonInfos = new ButtonInfo[parcelables.length];
+        for (int i = 0; i < parcelables.length; i++) {
+            final ButtonInfo buttonInfo = (ButtonInfo) parcelables[i];
+            mButtonInfos[i] = buttonInfo;
+            final Button button = new Button(this);
+            buttons.addView(button);
+            button.setText(buttonInfo.mButtonText);
+            button.setTag(i);
+            button.setOnClickListener(this);
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        setResult(RESULT_CANCELED);
+    }
+
+    @Override
+    public void onClick(View v) {
+        final ButtonInfo buttonInfo = mButtonInfos[(Integer) v.getTag()];
+        final Intent[] intents = buttonInfo.getIntents();
+        if (intents != null) {
+            for (Parcelable intent : intents) {
+                startActivity((Intent) intent);
+            }
+        } else {
+            final Class<?> factoryClass;
+            final String className = buttonInfo.getIntentFactoryClassName();
+            try {
+                factoryClass = Thread.currentThread().getContextClassLoader().loadClass(className);
+            } catch (ClassNotFoundException e) {
+                throw new IllegalArgumentException("Factory not found: " + className, e);
+            }
+            final IntentFactory factory;
+            try {
+                factory = (IntentFactory) factoryClass.newInstance();
+            } catch (InstantiationException e) {
+                throw new IllegalArgumentException("Can't create factory: " + className, e);
+            } catch (IllegalAccessException e) {
+                throw new IllegalArgumentException("Can't create factory: " + className, e);
+            }
+
+            for (Intent intent : factory.createIntents(mTestId, buttonInfo.getButtonText())) {
+                startActivity(intent);
+            }
+        }
+    }
+
+    @Override
+    public String getTestId() {
+        return mTestId;
+    }
+
+    public static class TestInfo {
+        private final String mTestId;
+        private final int mTitle;
+        private final int mInfoText;
+        private final ButtonInfo[] mButtons;
+
+        public TestInfo(String testId,  int title, int infoText, ButtonInfo... buttons) {
+            /** The Intent Driven Test layout {@link R.layout.intent_driven_test} is designed for
+             *  up to 2 buttons and won't render well with more buttons on small screen devices.
+             *  If you need more than 2 buttons, please change the layout so it can properly render
+             *  them even on the smallest devices.
+             */
+            if (buttons.length > 2) {
+                throw new RuntimeException("Too many buttons");
+            }
+            mTestId = testId;
+            mTitle = title;
+            mInfoText = infoText;
+            mButtons = buttons;
+        }
+
+        public String getTestId() {
+            return mTestId;
+        }
+
+        public int getTitle() {
+            return mTitle;
+        }
+
+        public int getInfoText() {
+            return mInfoText;
+        }
+
+        public ButtonInfo[] getButtons() {
+            return mButtons;
+        }
+    }
+
+    public static class ButtonInfo implements Parcelable {
+        private final int mButtonText;
+        private final Intent[] mIntents;
+        private final String mIntentFactoryClassName;
+
+        public ButtonInfo(int buttonText, Intent... intents) {
+            mButtonText = buttonText;
+            mIntents = intents;
+            mIntentFactoryClassName = null;
+        }
+
+        public ButtonInfo(int buttonText, String intentFactoryClassName) {
+            mButtonText = buttonText;
+            mIntents = null;
+            mIntentFactoryClassName = intentFactoryClassName;
+        }
+
+        public ButtonInfo(Parcel source) {
+            mButtonText = source.readInt();
+            final Parcelable[] parcelables = source.readParcelableArray(null);
+            if (parcelables != null) {
+                mIntents = new Intent[parcelables.length];
+                for (int i = 0, parcelablesLength = parcelables.length; i < parcelablesLength; i++) {
+                    mIntents[i] = (Intent) parcelables[i];
+                }
+            } else {
+                mIntents = null;
+            }
+            mIntentFactoryClassName = source.readString();
+        }
+
+        public int getButtonText() {
+            return mButtonText;
+        }
+
+        public Intent[] getIntents() {
+            return mIntents;
+        }
+
+        public String getIntentFactoryClassName() {
+            return mIntentFactoryClassName;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mButtonText);
+            dest.writeParcelableArray(mIntents, 0);
+            dest.writeString(mIntentFactoryClassName);
+        }
+
+        public static final Creator<ButtonInfo> CREATOR = new Creator<ButtonInfo>() {
+            public ButtonInfo createFromParcel(Parcel source) {
+                return new ButtonInfo(source);
+            }
+
+            public ButtonInfo[] newArray(int size) {
+                return new ButtonInfo[size];
+            }
+        };
+
+    }
+
+    public interface IntentFactory {
+        Intent[] createIntents(String testId, int buttonText);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleButtonActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleButtonActivity.java
new file mode 100644
index 0000000..19900af
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleButtonActivity.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+public class BleButtonActivity extends PassFailButtons.Activity {
+
+    static final int DISCOVER_SERVICE = 0;
+    static final int DISCONNECT = 1;
+
+    private int mName;
+    private int mInfo;
+    private int mButtonText;
+    private int mCommand;
+    private String mFilter;
+    private String mMessage;
+
+    BleButtonActivity(int target) {
+        if (target == DISCOVER_SERVICE) {
+            mName = R.string.ble_discover_service_name;
+            mInfo = R.string.ble_discover_service_info;
+            mButtonText = R.string.ble_discover_service;
+            mCommand = BleClientService.COMMAND_DISCOVER_SERVICE;
+            mFilter = BleClientService.BLE_SERVICES_DISCOVERED;
+            mMessage = "Service discovered.";
+        } else if (target == DISCONNECT) {
+            mName = R.string.ble_client_disconnect_name;
+            mInfo = R.string.ble_client_disconnect_name;
+            mButtonText = R.string.ble_disconnect;
+            mCommand = BleClientService.COMMAND_DISCONNECT;
+            mFilter = BleClientService.BLE_BLUETOOTH_DISCONNECTED;
+            mMessage = "Bluetooth LE disconnected.";
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_button);
+        setPassFailButtonClickListeners();
+        setInfoResources(mName, mInfo, -1);
+        getPassButton().setEnabled(false);
+
+        ((Button) findViewById(R.id.ble_button)).setText(mButtonText);
+        ((Button) findViewById(R.id.ble_button)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(BleButtonActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND, mCommand);
+                startService(intent);
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(mFilter);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+    }
+
+    private void showMessage(String msg) {
+        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            showMessage(mMessage);
+            getPassButton().setEnabled(true);
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientCharacteristicActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientCharacteristicActivity.java
new file mode 100644
index 0000000..1e1941f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientCharacteristicActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+public class BleClientCharacteristicActivity extends BleReadWriteActivity {
+    public BleClientCharacteristicActivity() {
+        super(BleReadWriteActivity.CHARACTERISTIC);
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientConnectActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientConnectActivity.java
new file mode 100755
index 0000000..fb351b1
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientConnectActivity.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class BleClientConnectActivity extends PassFailButtons.Activity {
+
+    private EditText mEditText;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_client_connect);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_client_connect_name,
+                         R.string.ble_client_send_connect_info, -1);
+        getPassButton().setEnabled(false);
+
+        mEditText = (EditText) findViewById(R.id.ble_address);
+
+        ((Button) findViewById(R.id.ble_connect)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String address = mEditText.getText().toString();
+                if (!BluetoothAdapter.checkBluetoothAddress(address)) {
+                    showMessage("Invalid bluetooth address.");
+                } else {
+                    Intent intent = new Intent(BleClientConnectActivity.this,
+                                               BleClientService.class);
+                    intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                    BleClientService.COMMAND_CONNECT);
+                    intent.putExtra(BluetoothDevice.EXTRA_DEVICE, address);
+                    startService(intent);
+                }
+            }
+        });
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BleClientService.BLE_BLUETOOTH_CONNECTED);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    protected void onDestroy(){
+        super.onDestroy();
+        unregisterReceiver(onBroadcast);
+    }
+
+    private void showMessage(String msg) {
+        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            showMessage("Bluetooth LE connected");
+            getPassButton().setEnabled(true);
+        }
+    };
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDescriptorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDescriptorActivity.java
new file mode 100644
index 0000000..ab2229a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDescriptorActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+public class BleClientDescriptorActivity extends BleReadWriteActivity {
+    public BleClientDescriptorActivity() {
+        super(BleReadWriteActivity.DESCRIPTOR);
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDisconnectActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDisconnectActivity.java
new file mode 100644
index 0000000..083d327
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientDisconnectActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+public class BleClientDisconnectActivity extends BleButtonActivity {
+    public BleClientDisconnectActivity() {
+        super(BleButtonActivity.DISCONNECT);
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientService.java
new file mode 100644
index 0000000..556ad06
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientService.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import java.util.UUID;
+import java.util.List;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCallback;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattDescriptor;
+import android.bluetooth.BluetoothGattService;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.Log;
+import android.widget.Toast;
+
+public class BleClientService extends Service {
+
+    public static final boolean DEBUG = true;
+    public static final String TAG = "BleClientService";
+
+    public static final int COMMAND_CONNECT = 0;
+    public static final int COMMAND_DISCONNECT = 1;
+    public static final int COMMAND_DISCOVER_SERVICE = 2;
+    public static final int COMMAND_READ_RSSI = 3;
+    public static final int COMMAND_WRITE_CHARACTERISTIC = 4;
+    public static final int COMMAND_READ_CHARACTERISTIC = 5;
+    public static final int COMMAND_WRITE_DESCRIPTOR = 6;
+    public static final int COMMAND_READ_DESCRIPTOR = 7;
+    public static final int COMMAND_SET_NOTIFICATION = 8;
+    public static final int COMMAND_BEGIN_WRITE = 9;
+    public static final int COMMAND_EXECUTE_WRITE = 10;
+    public static final int COMMAND_ABORT_RELIABLE = 11;
+
+    public static final String BLE_BLUETOOTH_CONNECTED =
+            "com.android.cts.verifier.bluetooth.BLE_BLUETOOTH_CONNECTED";
+    public static final String BLE_BLUETOOTH_DISCONNECTED =
+            "com.android.cts.verifier.bluetooth.BLE_BLUETOOTH_DISCONNECTED";
+    public static final String BLE_SERVICES_DISCOVERED =
+            "com.android.cts.verifier.bluetooth.BLE_SERVICES_DISCOVERED";
+    public static final String BLE_CHARACTERISTIC_READ =
+            "com.android.cts.verifier.bluetooth.BLE_CHARACTERISTIC_READ";
+    public static final String BLE_CHARACTERISTIC_WRITE =
+            "com.android.cts.verifier.bluetooth.BLE_CHARACTERISTIC_WRITE";
+    public static final String BLE_CHARACTERISTIC_CHANGED =
+            "com.android.cts.verifier.bluetooth.BLE_CHARACTERISTIC_CHANGED";
+    public static final String BLE_DESCRIPTOR_READ =
+            "com.android.cts.verifier.bluetooth.BLE_DESCRIPTOR_READ";
+    public static final String BLE_DESCRIPTOR_WRITE =
+            "com.android.cts.verifier.bluetooth.BLE_DESCRIPTOR_WRITE";
+    public static final String BLE_RELIABLE_WRITE_COMPLETED =
+            "com.android.cts.verifier.bluetooth.BLE_RELIABLE_WRITE_COMPLETED";
+    public static final String BLE_READ_REMOTE_RSSI =
+            "com.android.cts.verifier.bluetooth.BLE_READ_REMOTE_RSSI";
+
+    public static final String EXTRA_COMMAND =
+            "com.android.cts.verifier.bluetooth.EXTRA_COMMAND";
+    public static final String EXTRA_WRITE_VALUE =
+            "com.android.cts.verifier.bluetooth.EXTRA_WRITE_VALUE";
+    public static final String EXTRA_BOOL =
+            "com.android.cts.verifier.bluetooth.EXTRA_BOOL";
+    public static final String EXTRA_CHARACTERISTIC_VALUE =
+            "com.android.cts.verifier.bluetooth.EXTRA_CHARACTERISTIC_VALUE";
+    public static final String EXTRA_DESCRIPTOR_VALUE =
+            "com.android.cts.verifier.bluetooth.EXTRA_DESCRIPTOR_VALUE";
+    public static final String EXTRA_RSSI_VALUE =
+            "com.android.cts.verifier.bluetooth.EXTRA_RSSI_VALUE";
+
+    private static final UUID SERVICE_UUID =
+            UUID.fromString("00009999-0000-1000-8000-00805f9b34fb");
+    private static final UUID CHARACTERISTIC_UUID =
+            UUID.fromString("00009998-0000-1000-8000-00805f9b34fb");
+    private static final UUID UPDATE_CHARACTERISTIC_UUID =
+            UUID.fromString("00009997-0000-1000-8000-00805f9b34fb");
+    private static final UUID DESCRIPTOR_UUID =
+            UUID.fromString("00009996-0000-1000-8000-00805f9b34fb");
+
+    private BluetoothManager mBluetoothManager;
+    private BluetoothAdapter mBluetoothAdapter;
+    private BluetoothDevice mDevice;
+    private BluetoothGatt mBluetoothGatt;
+    private Handler mHandler;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
+        mBluetoothAdapter = mBluetoothManager.getAdapter();
+        mHandler = new Handler();
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (intent != null) handleIntent(intent);
+        return START_NOT_STICKY;
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mBluetoothGatt.disconnect();
+        mBluetoothGatt.close();
+    }
+
+    private void handleIntent(Intent intent) {
+        int command = intent.getIntExtra(EXTRA_COMMAND, -1);
+        String address = intent.getStringExtra(BluetoothDevice.EXTRA_DEVICE); // sometimes null
+        String writeValue = intent.getStringExtra(EXTRA_WRITE_VALUE); // sometimes null
+        boolean enable = intent.getBooleanExtra(EXTRA_BOOL, false);
+        BluetoothGattService service;
+        BluetoothGattCharacteristic characteristic;
+        BluetoothGattDescriptor descriptor;
+
+        switch (command) {
+            case COMMAND_CONNECT:
+                mDevice = mBluetoothAdapter.getRemoteDevice(address);
+                mBluetoothGatt = mDevice.connectGatt(this, false, mGattCallbacks);
+                break;
+            case COMMAND_DISCONNECT:
+                if (mBluetoothGatt != null) mBluetoothGatt.disconnect();
+                break;
+            case COMMAND_DISCOVER_SERVICE:
+                if (mBluetoothGatt != null) mBluetoothGatt.discoverServices();
+                break;
+            case COMMAND_READ_RSSI:
+                if (mBluetoothGatt != null) mBluetoothGatt.readRemoteRssi();
+                break;
+            case COMMAND_WRITE_CHARACTERISTIC:
+                writeCharacteristic(writeValue);
+                break;
+            case COMMAND_READ_CHARACTERISTIC:
+                readCharacteristic();
+                break;
+            case COMMAND_WRITE_DESCRIPTOR:
+                writeDescriptor(writeValue);
+                break;
+            case COMMAND_READ_DESCRIPTOR:
+                readDescriptor();
+                break;
+            case COMMAND_SET_NOTIFICATION:
+                setNotification(enable);
+                break;
+            case COMMAND_BEGIN_WRITE:
+                if (mBluetoothGatt != null) mBluetoothGatt.beginReliableWrite();
+                break;
+            case COMMAND_EXECUTE_WRITE:
+                if (mBluetoothGatt != null) mBluetoothGatt.executeReliableWrite();
+                break;
+            case COMMAND_ABORT_RELIABLE:
+                if (mBluetoothGatt != null) mBluetoothGatt.abortReliableWrite(mDevice);
+                break;
+            default:
+                showMessage("Unrecognized command: " + command);
+                break;
+        }
+    }
+
+    private void writeCharacteristic(String writeValue) {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(CHARACTERISTIC_UUID);
+        if (characteristic == null) return;
+        characteristic.setValue(writeValue);
+        mBluetoothGatt.writeCharacteristic(characteristic);
+    }
+
+    private void readCharacteristic() {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(CHARACTERISTIC_UUID);
+        if (characteristic != null) mBluetoothGatt.readCharacteristic(characteristic);
+    }
+
+    private void writeDescriptor(String writeValue) {
+        BluetoothGattDescriptor descriptor = getDescriptor();
+        if (descriptor == null) return;
+        descriptor.setValue(writeValue.getBytes());
+        mBluetoothGatt.writeDescriptor(descriptor);
+    }
+
+    private void readDescriptor() {
+        BluetoothGattDescriptor descriptor = getDescriptor();
+        if (descriptor != null) mBluetoothGatt.readDescriptor(descriptor);
+    }
+
+    private void setNotification(boolean enable) {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(UPDATE_CHARACTERISTIC_UUID);
+        if (characteristic != null)
+            mBluetoothGatt.setCharacteristicNotification(characteristic, enable);
+    }
+
+    private void notifyConnected() {
+        Intent intent = new Intent(BLE_BLUETOOTH_CONNECTED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDisconnected() {
+        Intent intent = new Intent(BLE_BLUETOOTH_DISCONNECTED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyServicesDiscovered() {
+        Intent intent = new Intent(BLE_SERVICES_DISCOVERED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyCharacteristicRead(String value) {
+        Intent intent = new Intent(BLE_CHARACTERISTIC_READ);
+        intent.putExtra(EXTRA_CHARACTERISTIC_VALUE, value);
+        sendBroadcast(intent);
+    }
+
+    private void notifyCharacteristicWrite() {
+        Intent intent = new Intent(BLE_CHARACTERISTIC_WRITE);
+        sendBroadcast(intent);
+    }
+
+    private void notifyCharacteristicChanged(String value) {
+        Intent intent = new Intent(BLE_CHARACTERISTIC_CHANGED);
+        intent.putExtra(EXTRA_CHARACTERISTIC_VALUE, value);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDescriptorRead(String value) {
+        Intent intent = new Intent(BLE_DESCRIPTOR_READ);
+        intent.putExtra(EXTRA_DESCRIPTOR_VALUE, value);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDescriptorWrite() {
+        Intent intent = new Intent(BLE_DESCRIPTOR_WRITE);
+        sendBroadcast(intent);
+    }
+
+    private void notifyReliableWriteCompleted() {
+        Intent intent = new Intent(BLE_RELIABLE_WRITE_COMPLETED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyReadRemoteRssi(int rssi) {
+        Intent intent = new Intent(BLE_READ_REMOTE_RSSI);
+        intent.putExtra(EXTRA_RSSI_VALUE, rssi);
+        sendBroadcast(intent);
+    }
+
+    private BluetoothGattService getService() {
+        if (mBluetoothGatt == null) return null;
+
+        BluetoothGattService service = mBluetoothGatt.getService(SERVICE_UUID);
+        if (service == null) {
+            showMessage("Service not found");
+            return null;
+        }
+        return service;
+    }
+
+    private BluetoothGattCharacteristic getCharacteristic(UUID uuid) {
+        BluetoothGattService service = getService();
+        if (service == null) return null;
+
+        BluetoothGattCharacteristic characteristic = service.getCharacteristic(uuid);
+        if (characteristic == null) {
+            showMessage("Characteristic not found");
+            return null;
+        }
+        return characteristic;
+    }
+
+    private BluetoothGattDescriptor getDescriptor() {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(CHARACTERISTIC_UUID);
+        if (characteristic == null) return null;
+
+        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(DESCRIPTOR_UUID);
+        if (descriptor == null) {
+            showMessage("Descriptor not found");
+            return null;
+        }
+        return descriptor;
+    }
+
+    private void showMessage(final String msg) {
+        mHandler.post(new Runnable() {
+            public void run() {
+                Toast.makeText(BleClientService.this, msg, Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
+
+    private final BluetoothGattCallback mGattCallbacks = new BluetoothGattCallback() {
+        @Override
+        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
+            if (DEBUG) Log.d(TAG, "onConnectionStateChange");
+            if (status == BluetoothGatt.GATT_SUCCESS) {
+                if (newState == BluetoothProfile.STATE_CONNECTED) notifyConnected();
+                else if (status == BluetoothProfile.STATE_DISCONNECTED) {
+                    notifyDisconnected();
+                    showMessage("Bluetooth LE disconnected");
+                }
+            }
+        }
+
+        @Override
+        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
+            if ((status == BluetoothGatt.GATT_SUCCESS) &&
+                (mBluetoothGatt.getService(SERVICE_UUID) != null)) {
+                notifyServicesDiscovered();
+            }
+        }
+
+        @Override
+        public void onCharacteristicRead(BluetoothGatt gatt,
+                                         BluetoothGattCharacteristic characteristic, int status) {
+            if ((status == BluetoothGatt.GATT_SUCCESS) &&
+                (characteristic.getUuid().equals(CHARACTERISTIC_UUID))) {
+                notifyCharacteristicRead(characteristic.getStringValue(0));
+            }
+        }
+
+        @Override
+        public void onCharacteristicWrite(BluetoothGatt gatt,
+                                          BluetoothGattCharacteristic characteristic, int status) {
+            if (DEBUG) Log.d(TAG, "onCharacteristicWrite: characteristic.val=" + characteristic.getStringValue(0)
+                                  + " status=" + status);
+            BluetoothGattCharacteristic mCharacteristic = getCharacteristic(CHARACTERISTIC_UUID);
+            if ((status == BluetoothGatt.GATT_SUCCESS) &&
+                (characteristic.getStringValue(0).equals(mCharacteristic.getStringValue(0)))) {
+                notifyCharacteristicWrite();
+            }
+        }
+
+        @Override
+        public void onCharacteristicChanged(BluetoothGatt gatt,
+                                            BluetoothGattCharacteristic characteristic) {
+            if (characteristic.getUuid().equals(UPDATE_CHARACTERISTIC_UUID))
+                notifyCharacteristicChanged(characteristic.getStringValue(0));
+        }
+
+        @Override
+        public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor,
+                                     int status) {
+            if ((status == BluetoothGatt.GATT_SUCCESS) &&
+                (descriptor.getUuid().equals(DESCRIPTOR_UUID))) {
+                notifyDescriptorRead(new String(descriptor.getValue()));
+            }
+        }
+
+        @Override
+        public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor,
+                                      int status) {
+            if ((status == BluetoothGatt.GATT_SUCCESS) &&
+                (descriptor.getUuid().equals(DESCRIPTOR_UUID))) {
+                notifyDescriptorWrite();
+            }
+        }
+
+        @Override
+        public void onReliableWriteCompleted(BluetoothGatt gatt, int status) {
+            if (status == BluetoothGatt.GATT_SUCCESS) notifyReliableWriteCompleted();
+        }
+
+        @Override
+        public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) {
+            if (status == BluetoothGatt.GATT_SUCCESS) notifyReadRemoteRssi(rssi);
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientTestActivity.java
new file mode 100644
index 0000000..a13d934
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleClientTestActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.ManifestTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.os.Bundle;
+
+public class BleClientTestActivity extends PassFailButtons.TestListActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_client_test_name, R.string.ble_client_test_info, -1);
+
+        setTestListAdapter(new ManifestTestListAdapter(this, getClass().getName()));
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleDiscoverServiceActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleDiscoverServiceActivity.java
new file mode 100644
index 0000000..6896b04
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleDiscoverServiceActivity.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+public class BleDiscoverServiceActivity extends BleButtonActivity {
+    public BleDiscoverServiceActivity() {
+        super(BleButtonActivity.DISCOVER_SERVICE);
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleNotifyCharacteristicActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleNotifyCharacteristicActivity.java
new file mode 100644
index 0000000..e0c79bf
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleNotifyCharacteristicActivity.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class BleNotifyCharacteristicActivity extends PassFailButtons.Activity {
+
+    private boolean mEnable;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_notify_characteristic);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_notify_characteristic_name,
+                         R.string.ble_notify_characteristic_info, -1);
+
+        mEnable = false;
+
+        ((Button) findViewById(R.id.ble_notify)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mEnable = !mEnable;
+                if (mEnable) ((Button) v).setText(getString(R.string.ble_stop_notification));
+                else ((Button) v).setText(getString(R.string.ble_begin_notification));
+
+                Intent intent = new Intent(BleNotifyCharacteristicActivity.this,
+                                           BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                BleClientService.COMMAND_SET_NOTIFICATION);
+                intent.putExtra(BleClientService.EXTRA_BOOL, mEnable);
+                startService(intent);
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BleClientService.BLE_CHARACTERISTIC_CHANGED);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+        mEnable = false;
+        Intent intent = new Intent(BleNotifyCharacteristicActivity.this,
+                                   BleClientService.class);
+        intent.putExtra(BleClientService.EXTRA_COMMAND,
+                        BleClientService.COMMAND_SET_NOTIFICATION);
+        intent.putExtra(BleClientService.EXTRA_BOOL, mEnable);
+        startService(intent);
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String value = intent.getStringExtra(BleClientService.EXTRA_CHARACTERISTIC_VALUE);
+            ((TextView) findViewById(R.id.ble_notify_text)).setText(value);
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadRssiActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadRssiActivity.java
new file mode 100644
index 0000000..800499c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadRssiActivity.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class BleReadRssiActivity extends PassFailButtons.Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_read_rssi);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_read_rssi_name,
+                         R.string.ble_read_rssi_info, -1);
+
+        ((Button) findViewById(R.id.ble_read_rssi)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(BleReadRssiActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                BleClientService.COMMAND_READ_RSSI);
+                startService(intent);
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BleClientService.BLE_READ_REMOTE_RSSI);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            int rssi = intent.getIntExtra(BleClientService.EXTRA_RSSI_VALUE, 128);
+            ((TextView) findViewById(R.id.ble_rssi_text)).setText(Integer.toString(rssi));
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadWriteActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadWriteActivity.java
new file mode 100644
index 0000000..22233ef
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReadWriteActivity.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+class BleReadWriteActivity extends PassFailButtons.Activity {
+
+    static final int CHARACTERISTIC = 0;
+    static final int DESCRIPTOR = 1;
+
+    private int mWriteCommand;
+    private int mReadCommand;
+    private String mWriteFilter;
+    private String mReadFilter;
+    private String mExtraValue;
+    private int mName;
+    private EditText mEditText;
+
+    BleReadWriteActivity(int target) {
+        if (target == CHARACTERISTIC) {
+            mWriteCommand = BleClientService.COMMAND_WRITE_CHARACTERISTIC;
+            mReadCommand = BleClientService.COMMAND_READ_CHARACTERISTIC;
+            mWriteFilter = BleClientService.BLE_CHARACTERISTIC_WRITE;
+            mReadFilter = BleClientService.BLE_CHARACTERISTIC_READ;
+            mExtraValue = BleClientService.EXTRA_CHARACTERISTIC_VALUE;
+            mName = R.string.ble_client_characteristic_name;
+        } else if (target == DESCRIPTOR) {
+            mWriteCommand = BleClientService.COMMAND_WRITE_DESCRIPTOR;
+            mReadCommand = BleClientService.COMMAND_READ_DESCRIPTOR;
+            mWriteFilter = BleClientService.BLE_DESCRIPTOR_WRITE;
+            mReadFilter = BleClientService.BLE_DESCRIPTOR_READ;
+            mExtraValue = BleClientService.EXTRA_DESCRIPTOR_VALUE;
+            mName = R.string.ble_client_descriptor_name;
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_client_read_write);
+        setPassFailButtonClickListeners();
+        setInfoResources(mName, R.string.ble_read_write_info, -1);
+
+        mEditText = (EditText) findViewById(R.id.write_text);
+
+        ((Button) findViewById(R.id.ble_write)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String writeValue = mEditText.getText().toString();
+                Intent intent = new Intent(BleReadWriteActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND, mWriteCommand);
+                intent.putExtra(BleClientService.EXTRA_WRITE_VALUE, writeValue);
+                startService(intent);
+                mEditText.setText("");
+            }
+        });
+
+        ((Button) findViewById(R.id.ble_read)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(BleReadWriteActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND, mReadCommand);
+                startService(intent);
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(mReadFilter);
+        filter.addAction(mWriteFilter);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+    }
+
+    private void showMessage(String msg) {
+        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action == mWriteFilter)
+                showMessage("Write successful callback");
+            else if (action == mReadFilter) {
+                String value = intent.getStringExtra(mExtraValue);
+                ((TextView) findViewById(R.id.read_text)).setText(value);
+            }
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReliableWriteActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReliableWriteActivity.java
new file mode 100644
index 0000000..c7460b5
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleReliableWriteActivity.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+public class BleReliableWriteActivity extends PassFailButtons.Activity {
+
+    EditText mEditText;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_reliable_write);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_reliable_write_name, R.string.ble_reliable_write_info, -1);
+        getPassButton().setEnabled(false);
+        ((Button) findViewById(R.id.ble_execute)).setEnabled(false);
+
+        mEditText = (EditText) findViewById(R.id.write_text);
+
+        ((Button) findViewById(R.id.ble_begin)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(BleReliableWriteActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                BleClientService.COMMAND_BEGIN_WRITE);
+                startService(intent);
+            }
+        });
+
+        ((Button) findViewById(R.id.ble_write)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String writeValue = mEditText.getText().toString();
+                Intent intent = new Intent(BleReliableWriteActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                BleClientService.COMMAND_WRITE_CHARACTERISTIC);
+                intent.putExtra(BleClientService.EXTRA_WRITE_VALUE, writeValue);
+                startService(intent);
+                mEditText.setText("");
+            }
+        });
+
+        ((Button) findViewById(R.id.ble_execute)).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(BleReliableWriteActivity.this, BleClientService.class);
+                intent.putExtra(BleClientService.EXTRA_COMMAND,
+                                BleClientService.COMMAND_EXECUTE_WRITE);
+                startService(intent);
+            }
+        });
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BleClientService.BLE_CHARACTERISTIC_WRITE);
+        filter.addAction(BleClientService.BLE_RELIABLE_WRITE_COMPLETED);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+        Intent intent = new Intent(this, BleClientService.class);
+        intent.putExtra(BleClientService.EXTRA_COMMAND, BleClientService.COMMAND_ABORT_RELIABLE);
+        startService(intent);
+    }
+
+    private void showMessage(String msg) {
+        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action == BleClientService.BLE_CHARACTERISTIC_WRITE) {
+                showMessage("Write value verified.");
+                ((Button) findViewById(R.id.ble_execute)).setEnabled(true);
+            } else if (action == BleClientService.BLE_RELIABLE_WRITE_COMPLETED) {
+                showMessage("Reliable write completed.");
+                getPassButton().setEnabled(true);
+            }
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
new file mode 100644
index 0000000..5606041
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerService.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.UUID;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCharacteristic;
+import android.bluetooth.BluetoothGattDescriptor;
+import android.bluetooth.BluetoothGattServer;
+import android.bluetooth.BluetoothGattServerCallback;
+import android.bluetooth.BluetoothGattService;
+import android.bluetooth.BluetoothManager;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.IBinder;
+import android.util.Log;
+import android.widget.Toast;
+
+public class BleServerService extends Service {
+
+    public static final boolean DEBUG = true;
+    public static final String TAG = "BleServerService";
+
+    public static final int COMMAND_ADD_SERVICE = 0;
+    public static final int COMMAND_WRITE_CHARACTERISTIC = 1;
+    public static final int COMMAND_WRITE_DESCRIPTOR = 2;
+
+    public static final String BLE_SERVER_CONNECTED =
+            "com.android.cts.verifier.bluetooth.BLE_SERVER_CONNECTED";
+    public static final String BLE_SERVER_DISCONNECTED =
+            "com.android.cts.verifier.bluetooth.BLE_SERVER_DISCONNECTED";
+    public static final String BLE_SERVICE_ADDED =
+            "com.android.cts.verifier.bluetooth.BLE_SERVICE_ADDED";
+    public static final String BLE_CHARACTERISTIC_READ_REQUEST =
+            "com.android.cts.verifier.bluetooth.BLE_CHARACTERISTIC_READ_REQUEST";
+    public static final String BLE_CHARACTERISTIC_WRITE_REQUEST =
+            "com.android.cts.verifier.bluetooth.BLE_CHARACTERISTIC_WRITE_REQUEST";
+    public static final String BLE_DESCRIPTOR_READ_REQUEST =
+            "com.android.cts.verifier.bluetooth.BLE_DESCRIPTOR_READ_REQUEST";
+    public static final String BLE_DESCRIPTOR_WRITE_REQUEST =
+            "com.android.cts.verifier.bluetooth.BLE_DESCRIPTOR_WRITE_REQUEST";
+    public static final String BLE_EXECUTE_WRITE =
+            "com.android.cts.verifier.bluetooth.BLE_EXECUTE_WRITE";
+
+    private static final UUID SERVICE_UUID =
+            UUID.fromString("00009999-0000-1000-8000-00805f9b34fb");
+    private static final UUID CHARACTERISTIC_UUID =
+            UUID.fromString("00009998-0000-1000-8000-00805f9b34fb");
+    private static final UUID UPDATE_CHARACTERISTIC_UUID =
+            UUID.fromString("00009997-0000-1000-8000-00805f9b34fb");
+    private static final UUID DESCRIPTOR_UUID =
+            UUID.fromString("00009996-0000-1000-8000-00805f9b34fb");
+
+    private BluetoothManager mBluetoothManager;
+    private BluetoothGattServer mGattServer;
+    private BluetoothGattService mService;
+    private BluetoothDevice mDevice;
+    private Timer mNotificationTimer;
+    private Handler mHandler;
+    private String mReliableWriteValue;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
+        mGattServer = mBluetoothManager.openGattServer(this, mCallbacks);
+        mService = createService();
+        mGattServer.addService(mService);
+        mDevice = null;
+        mReliableWriteValue = null;
+
+        mHandler = new Handler();
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        return START_NOT_STICKY;
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mDevice != null) mGattServer.cancelConnection(mDevice);
+        mGattServer.close();
+    }
+
+    private void writeCharacteristic(String writeValue) {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(CHARACTERISTIC_UUID);
+        if (characteristic != null) return;
+        characteristic.setValue(writeValue);
+    }
+
+    private void writeDescriptor(String writeValue) {
+        BluetoothGattDescriptor descriptor = getDescriptor();
+        if (descriptor == null) return;
+        descriptor.setValue(writeValue.getBytes());
+    }
+
+    private void notifyConnected() {
+        if (DEBUG) Log.d(TAG, "notifyConnected");
+        Intent intent = new Intent(BLE_SERVER_CONNECTED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDisconnected() {
+        if (DEBUG) Log.d(TAG, "notifyDisconnected");
+        Intent intent = new Intent(BLE_SERVER_DISCONNECTED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyServiceAdded() {
+        if (DEBUG) Log.d(TAG, "notifyServiceAdded");
+        Intent intent = new Intent(BLE_SERVICE_ADDED);
+        sendBroadcast(intent);
+    }
+
+    private void notifyCharacteristicReadRequest() {
+        if (DEBUG) Log.d(TAG, "notifyCharacteristicReadRequest");
+        Intent intent = new Intent(BLE_CHARACTERISTIC_READ_REQUEST);
+        sendBroadcast(intent);
+    }
+
+    private void notifyCharacteristicWriteRequest() {
+        if (DEBUG) Log.d(TAG, "notifyCharacteristicWriteRequest");
+        Intent intent = new Intent(BLE_CHARACTERISTIC_WRITE_REQUEST);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDescriptorReadRequest() {
+        if (DEBUG) Log.d(TAG, "notifyDescriptorReadRequest");
+        Intent intent = new Intent(BLE_DESCRIPTOR_READ_REQUEST);
+        sendBroadcast(intent);
+    }
+
+    private void notifyDescriptorWriteRequest() {
+        if (DEBUG) Log.d(TAG, "notifyDescriptorWriteRequest");
+        Intent intent = new Intent(BLE_DESCRIPTOR_WRITE_REQUEST);
+        sendBroadcast(intent);
+    }
+
+    private void notifyExecuteWrite() {
+        if (DEBUG) Log.d(TAG, "notifyExecuteWrite");
+        Intent intent = new Intent(BLE_EXECUTE_WRITE);
+        sendBroadcast(intent);
+    }
+
+    private BluetoothGattCharacteristic getCharacteristic(UUID uuid) {
+        BluetoothGattCharacteristic characteristic =
+                mService.getCharacteristic(uuid);
+        if (characteristic == null) {
+            showMessage("Characteristic not found");
+            return null;
+        }
+        return characteristic;
+    }
+
+    private BluetoothGattDescriptor getDescriptor() {
+        BluetoothGattCharacteristic characteristic = getCharacteristic(CHARACTERISTIC_UUID);
+        if (characteristic == null) return null;
+
+        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(DESCRIPTOR_UUID);
+        if (descriptor == null) {
+            showMessage("Descriptor not found");
+            return null;
+        }
+        return descriptor;
+    }
+
+    private BluetoothGattService createService() {
+        BluetoothGattService service =
+                new BluetoothGattService(SERVICE_UUID, BluetoothGattService.SERVICE_TYPE_PRIMARY);
+        BluetoothGattCharacteristic characteristic =
+                new BluetoothGattCharacteristic(CHARACTERISTIC_UUID, 0x0A, 0x11);
+        BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor(DESCRIPTOR_UUID, 0x11);
+        characteristic.addDescriptor(descriptor);
+        service.addCharacteristic(characteristic);
+
+        BluetoothGattCharacteristic notiCharacteristic =
+                new BluetoothGattCharacteristic(UPDATE_CHARACTERISTIC_UUID, 0x10, 0x00);
+        service.addCharacteristic(notiCharacteristic);
+
+        return service;
+    }
+
+    private void beginNotification() {
+        TimerTask task = new TimerTask() {
+            @Override
+            public void run() {
+                BluetoothGattCharacteristic characteristic =
+                        mService.getCharacteristic(UPDATE_CHARACTERISTIC_UUID);
+                if (characteristic == null) return;
+
+                String date = (new Date()).toString();
+                characteristic.setValue(date);
+                mGattServer.notifyCharacteristicChanged(mDevice, characteristic, false);
+            }
+        };
+        mNotificationTimer = new Timer();
+        mNotificationTimer.schedule(task, 0, 1000);
+    }
+
+    private void stopNotification() {
+        if (mNotificationTimer == null) return;
+        mNotificationTimer.cancel();
+        mNotificationTimer = null;
+    }
+
+    private void showMessage(final String msg) {
+        mHandler.post(new Runnable() {
+            public void run() {
+                Toast.makeText(BleServerService.this, msg, Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
+
+    private final BluetoothGattServerCallback mCallbacks = new BluetoothGattServerCallback() {
+        @Override
+        public void onConnectionStateChange(BluetoothDevice device, int status, int newState) {
+            if (DEBUG) Log.d(TAG, "onConnectionStateChange: newState=" + newState);
+            if (status == BluetoothGatt.GATT_SUCCESS) {
+                if (newState == BluetoothProfile.STATE_CONNECTED) {
+                    mDevice = device;
+                    notifyConnected();
+                    beginNotification();
+                } else if (status == BluetoothProfile.STATE_DISCONNECTED) {
+                    stopNotification();
+                    notifyDisconnected();
+                    mDevice = null;
+                }
+            }
+        }
+
+        @Override
+        public void onServiceAdded(int status, BluetoothGattService service) {
+            if (DEBUG) Log.d(TAG, "onServiceAdded()");
+            if (status == BluetoothGatt.GATT_SUCCESS) notifyServiceAdded();
+        }
+
+        @Override
+        public void onCharacteristicReadRequest(BluetoothDevice device, int requestId,
+                            int offset, BluetoothGattCharacteristic characteristic) {
+            if (DEBUG) Log.d(TAG, "onCharacteristicReadRequest()");
+
+            notifyCharacteristicReadRequest();
+            mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0,
+                                     characteristic.getValue());
+        }
+
+        @Override
+        public void onCharacteristicWriteRequest(BluetoothDevice device, int requestId,
+                                                 BluetoothGattCharacteristic characteristic,
+                                                 boolean preparedWrite, boolean responseNeeded,
+                                                 int offset, byte[] value) {
+            if (DEBUG) Log.d(TAG, "onCharacteristicWriteRequest: preparedWrite=" + preparedWrite);
+
+            notifyCharacteristicWriteRequest();
+            if (preparedWrite) mReliableWriteValue = new String(value);
+            else characteristic.setValue(value);
+
+            if (responseNeeded)
+                mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null);
+        }
+
+        @Override
+        public void onDescriptorReadRequest(BluetoothDevice device, int requestId,
+                                            int offset, BluetoothGattDescriptor descriptor) {
+            if (DEBUG) Log.d(TAG, "onDescriptorReadRequest(): (descriptor == getDescriptor())="
+                                  + (descriptor == getDescriptor()));
+
+            notifyDescriptorReadRequest();
+            mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0,
+                                     descriptor.getValue());
+        }
+
+        @Override
+        public void onDescriptorWriteRequest(BluetoothDevice device, int requestId,
+                                             BluetoothGattDescriptor descriptor,
+                                             boolean preparedWrite, boolean responseNeeded,
+                                             int offset,  byte[] value) {
+            if (DEBUG) Log.d(TAG, "onDescriptorWriteRequest(): (descriptor == getDescriptor())="
+                                  + (descriptor == getDescriptor()));
+
+            notifyDescriptorWriteRequest();
+            descriptor.setValue(value);
+            if (responseNeeded)
+                mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null);
+        }
+
+        @Override
+        public void onExecuteWrite(BluetoothDevice device, int requestId, boolean execute) {
+            if (DEBUG) Log.d(TAG, "onExecuteWrite");
+            if (execute) {
+                notifyExecuteWrite();
+                getCharacteristic(CHARACTERISTIC_UUID).setValue(mReliableWriteValue);
+                mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, null);
+            }
+        }
+    };
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java
new file mode 100644
index 0000000..ec31fde
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/BleServerStartActivity.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.bluetooth;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public class BleServerStartActivity extends PassFailButtons.Activity {
+
+    private List<Test> mTestList;
+    private TestAdapter mTestAdapter;
+    private int mAllPassed;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.ble_server_start);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.ble_server_start_name,
+                         R.string.ble_server_start_info, -1);
+        getPassButton().setEnabled(false);
+
+        mTestList = setupTestList();
+        mTestAdapter = new TestAdapter(this, mTestList);
+
+        ListView listView = (ListView) findViewById(R.id.ble_server_tests);
+        listView.setAdapter(mTestAdapter);
+
+        mAllPassed = 0;
+        startService(new Intent(this, BleServerService.class));
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(BleServerService.BLE_SERVICE_ADDED);
+        filter.addAction(BleServerService.BLE_SERVER_CONNECTED);
+        filter.addAction(BleServerService.BLE_CHARACTERISTIC_READ_REQUEST);
+        filter.addAction(BleServerService.BLE_CHARACTERISTIC_WRITE_REQUEST);
+        filter.addAction(BleServerService.BLE_DESCRIPTOR_READ_REQUEST);
+        filter.addAction(BleServerService.BLE_DESCRIPTOR_WRITE_REQUEST);
+        filter.addAction(BleServerService.BLE_EXECUTE_WRITE);
+        filter.addAction(BleServerService.BLE_SERVER_DISCONNECTED);
+        registerReceiver(onBroadcast, filter);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        unregisterReceiver(onBroadcast);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        stopService(new Intent(this, BleServerService.class));
+    }
+
+    private List<Test> setupTestList() {
+        ArrayList<Test> testList = new ArrayList<Test>();
+        testList.add(new Test(R.string.ble_server_add_service));
+        testList.add(new Test(R.string.ble_server_receiving_connect));
+        testList.add(new Test(R.string.ble_server_read_characteristic));
+        testList.add(new Test(R.string.ble_server_write_characteristic));
+        testList.add(new Test(R.string.ble_server_read_descriptor));
+        testList.add(new Test(R.string.ble_server_write_descriptor));
+        testList.add(new Test(R.string.ble_server_reliable_write));
+        testList.add(new Test(R.string.ble_server_receiving_disconnect));
+        return testList;
+    }
+
+    class Test {
+        private boolean passed;
+        private int instructions;
+
+        private Test(int instructions) {
+            passed = false;
+            this.instructions = instructions;
+        }
+    }
+
+    private BroadcastReceiver onBroadcast = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action == BleServerService.BLE_SERVICE_ADDED) {
+                mTestList.get(0).passed = true;
+                mAllPassed |= 0x01;
+            } else if (action == BleServerService.BLE_SERVER_CONNECTED) {
+                mTestList.get(1).passed = true;
+                mAllPassed |= 0x02;
+            } else if (action == BleServerService.BLE_CHARACTERISTIC_READ_REQUEST) {
+                mTestList.get(2).passed = true;
+                mAllPassed |= 0x04;
+            } else if (action == BleServerService.BLE_CHARACTERISTIC_WRITE_REQUEST) {
+                mTestList.get(3).passed = true;
+                mAllPassed |= 0x08;
+            } else if (action == BleServerService.BLE_DESCRIPTOR_READ_REQUEST) {
+                mTestList.get(4).passed = true;
+                mAllPassed |= 0x10;
+            } else if (action == BleServerService.BLE_DESCRIPTOR_WRITE_REQUEST) {
+                mTestList.get(5).passed = true;
+                mAllPassed |= 0x20;
+            } else if (action == BleServerService.BLE_EXECUTE_WRITE) {
+                mTestList.get(6).passed = true;
+                mAllPassed |= 0x40;
+            } else if (action == BleServerService.BLE_SERVER_DISCONNECTED) {
+                mTestList.get(7).passed = true;
+                mAllPassed |= 0x80;
+            }
+            mTestAdapter.notifyDataSetChanged();
+            if (mAllPassed == 0xFF) getPassButton().setEnabled(true);
+        }
+    };
+
+    class TestAdapter extends BaseAdapter {
+        Context context;
+        List<Test> tests;
+        LayoutInflater inflater;
+
+        public TestAdapter(Context context, List<Test> tests) {
+            this.context = context;
+            inflater = LayoutInflater.from(context);
+            this.tests = tests;
+        }
+
+        @Override
+        public int getCount() {
+            return tests.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return tests.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ViewGroup vg;
+
+            if (convertView != null) {
+                vg = (ViewGroup) convertView;
+            } else {
+                vg = (ViewGroup) inflater.inflate(R.layout.ble_server_start_item, null);
+            }
+
+            Test test = tests.get(position);
+            if (test.passed) {
+                ((ImageView) vg.findViewById(R.id.status)).setImageResource(R.drawable.fs_good);
+            } else {
+                ((ImageView) vg.findViewById(R.id.status)).
+                                setImageResource(R.drawable.fs_indeterminate);
+            }
+            ((TextView) vg.findViewById(R.id.instructions)).setText(test.instructions);
+
+            return vg;
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
index bc4e5f0..d68d1da 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/formats/CameraFormatsActivity.java
@@ -172,6 +172,7 @@
         super.onPause();
 
         shutdownCamera();
+        mPreviewTexture = null;
     }
 
     @Override
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
new file mode 100644
index 0000000..b010f79
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/video/CameraVideoActivity.java
@@ -0,0 +1,752 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.camera.video;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.graphics.Matrix;
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
+import android.hardware.Camera.Size;
+import android.media.CamcorderProfile;
+import android.media.MediaPlayer;
+import android.media.MediaRecorder;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.util.Log;
+import android.view.Surface;
+import android.view.TextureView;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.VideoView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.TreeSet;
+
+
+/**
+ * Tests for manual verification of camera video capture
+ */
+public class CameraVideoActivity extends PassFailButtons.Activity
+        implements TextureView.SurfaceTextureListener {
+
+    private static final String TAG = "CtsCameraVideo";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final int MEDIA_TYPE_IMAGE = 1;
+    private static final int MEDIA_TYPE_VIDEO = 2;
+    private static final int VIDEO_LENGTH = 3000; // in ms
+
+    private TextureView mPreviewView;
+    private SurfaceTexture mPreviewTexture;
+    private int mPreviewTexWidth;
+    private int mPreviewTexHeight;
+    private int mPreviewRotation;
+
+    private VideoView mPlaybackView;
+
+    private Spinner mCameraSpinner;
+    private Spinner mResolutionSpinner;
+
+    private int mCurrentCameraId = -1;
+    private Camera mCamera;
+
+    private MediaRecorder mMediaRecorder;
+
+    private List<Size> mPreviewSizes;
+    private Size mNextPreviewSize;
+    private Size mPreviewSize;
+    private List<Integer> mVideoSizeIds;
+    private int mCurrentVideoSizeId;
+
+    private boolean isRecording = false;
+    private boolean isPlayingBack = false;
+    private Button captureButton;
+    private Button mPassButton;
+    private Button mFailButton;
+
+    private TextView mStatusLabel;
+
+    private TreeSet<String> mTestedCombinations = new TreeSet<String>();
+    private TreeSet<String> mUntestedCombinations = new TreeSet<String>();
+
+    private File outputVideoFile;
+
+    /**
+     * @see #MEDIA_TYPE_IMAGE
+     * @see #MEDIA_TYPE_VIDEO
+     */
+    private static File getOutputMediaFile(int type) {
+        // Question: why do I need to comment this to get it working?
+        // Logcat says "external storage not ready"
+        // if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED) {
+        //     Log.e(TAG, "external storage not ready");
+        //     return null;
+        // }
+
+        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
+                Environment.DIRECTORY_MOVIES), TAG);
+
+        if (!mediaStorageDir.exists()) {
+            if (!mediaStorageDir.mkdirs()) {
+                Log.d(TAG, "failed to create directory");
+                return null;
+            }
+        }
+
+        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
+        File mediaFile;
+        if (type == MEDIA_TYPE_IMAGE) {
+            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
+                    "IMG_" + timeStamp + ".jpg");
+        } else if (type == MEDIA_TYPE_VIDEO) {
+            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
+                    "VID_" + timeStamp + ".mp4");
+            if (VERBOSE) {
+                Log.v(TAG, "getOutputMediaFile: output file " + mediaFile.getPath());
+            }
+        } else {
+            return null;
+        }
+
+        return mediaFile;
+    }
+
+    private boolean prepareVideoRecorder() {
+
+        mMediaRecorder = new MediaRecorder();
+
+        // Step 1: unlock and set camera to MediaRecorder
+        mCamera.unlock();
+        mMediaRecorder.setCamera(mCamera);
+
+        // Step 2: set sources
+        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
+        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+
+        // Step 3: set a CamcorderProfile
+        mMediaRecorder.setProfile(CamcorderProfile.get(mCurrentCameraId, mCurrentVideoSizeId));
+
+        // Step 4: set output file
+        outputVideoFile = getOutputMediaFile(MEDIA_TYPE_VIDEO);
+        mMediaRecorder.setOutputFile(outputVideoFile.toString());
+
+        // Step 5: set preview output
+        // This is not necessary since preview has been taken care of
+
+        // Step 6: prepare configured MediaRecorder
+        try {
+            mMediaRecorder.prepare();
+        } catch (IOException e) {
+            Log.e(TAG, "IOException preparing MediaRecorder: ", e);
+            releaseMediaRecorder();
+            throw new AssertionError(e);
+        }
+
+        mMediaRecorder.setOnErrorListener(
+                new MediaRecorder.OnErrorListener() {
+                    @Override
+                    public void onError(MediaRecorder mr, int what, int extra) {
+                        if (what == MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN) {
+                            Log.e(TAG, "unknown error in media recorder, error: " + extra);
+                        } else {
+                            Log.e(TAG, "media recorder server died, error: " + extra);
+                        }
+
+                        failTest("Media recorder error.");
+                    }
+                });
+
+        if (VERBOSE) {
+            Log.v(TAG, "prepareVideoRecorder: prepared configured MediaRecorder");
+        }
+
+        return true;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.camera_video);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.camera_video, R.string.video_info, /*viewId*/-1);
+
+        mPreviewView = (TextureView) findViewById(R.id.video_capture);
+        mPlaybackView = (VideoView) findViewById(R.id.video_playback);
+        mPlaybackView.setOnCompletionListener(mPlaybackViewListener);
+
+        captureButton = (Button) findViewById(R.id.record_button);
+        mPassButton = (Button) findViewById(R.id.pass_button);
+        mFailButton = (Button) findViewById(R.id.fail_button);
+        mPassButton.setEnabled(false);
+        mFailButton.setEnabled(true);
+
+        mPreviewView.setSurfaceTextureListener(this);
+
+        int numCameras = Camera.getNumberOfCameras();
+        String[] cameraNames = new String[numCameras];
+        for (int i = 0; i < numCameras; i++) {
+            cameraNames[i] = "Camera " + i;
+            mUntestedCombinations.add("All combinations for Camera " + i + "\n");
+        }
+        if (VERBOSE) {
+            Log.v(TAG, "onCreate: number of cameras=" + numCameras);
+        }
+        mCameraSpinner = (Spinner) findViewById(R.id.cameras_selection);
+        mCameraSpinner.setAdapter(
+            new ArrayAdapter<String>(
+                this, R.layout.cf_format_list_item, cameraNames));
+        mCameraSpinner.setOnItemSelectedListener(mCameraSpinnerListener);
+
+        mResolutionSpinner = (Spinner) findViewById(R.id.resolution_selection);
+        mResolutionSpinner.setOnItemSelectedListener(mResolutionSelectedListener);
+
+        mStatusLabel = (TextView) findViewById(R.id.status_label);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        setUpCamera(mCameraSpinner.getSelectedItemPosition());
+        if (VERBOSE) {
+            Log.v(TAG, "onResume: camera has been setup");
+        }
+
+        setUpCaptureButton();
+        if (VERBOSE) {
+            Log.v(TAG, "onResume: captureButton has been setup");
+        }
+
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+
+        releaseMediaRecorder();
+        shutdownCamera();
+        mPreviewTexture = null;
+    }
+
+    private MediaPlayer.OnCompletionListener mPlaybackViewListener =
+            new MediaPlayer.OnCompletionListener() {
+
+                @Override
+                public void onCompletion(MediaPlayer mp) {
+                    isPlayingBack = false;
+                    captureButton.setEnabled(true);
+                    mStatusLabel.setText(getResources().getString(R.string.status_ready));
+                }
+
+    };
+
+    private void releaseMediaRecorder() {
+        if (mMediaRecorder != null) {
+            mMediaRecorder.reset();
+            mMediaRecorder.release();
+            mMediaRecorder = null;
+            mCamera.lock(); // check here, lock camera for later use
+        }
+    }
+
+    @Override
+    public String getTestDetails() {
+        StringBuilder reportBuilder = new StringBuilder();
+        reportBuilder.append("Tested combinations:\n");
+        for (String combination : mTestedCombinations) {
+            reportBuilder.append(combination);
+        }
+        reportBuilder.append("Untested combinations:\n");
+        for (String combination : mUntestedCombinations) {
+            reportBuilder.append(combination);
+        }
+        return reportBuilder.toString();
+    }
+
+    @Override
+    public void onSurfaceTextureAvailable(SurfaceTexture surface,
+            int width, int height) {
+        mPreviewTexture = surface;
+        mPreviewTexWidth = width;
+        mPreviewTexHeight = height;
+        if (mCamera != null) {
+            startPreview();
+        }
+    }
+
+    @Override
+    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+        // Ignored, Camera does all the work for us
+    }
+
+    @Override
+    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+        return true;
+    }
+
+
+    @Override
+    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+        // Invoked every time there's a new Camera preview frame
+    }
+
+    private AdapterView.OnItemSelectedListener mCameraSpinnerListener =
+            new AdapterView.OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(AdapterView<?> parent,
+                        View view, int pos, long id) {
+                    if (mCurrentCameraId != pos) {
+                        setUpCamera(pos);
+                    }
+                }
+
+                @Override
+                public void onNothingSelected(AdapterView<?> parent) {
+                    // Intentionally left blank
+                }
+
+            };
+
+    private AdapterView.OnItemSelectedListener mResolutionSelectedListener =
+            new AdapterView.OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(AdapterView<?> parent,
+                        View view, int position, long id) {
+                    if (mVideoSizeIds.get(position) != mCurrentVideoSizeId) {
+                        mCurrentVideoSizeId = mVideoSizeIds.get(position);
+                        if (VERBOSE) {
+                            Log.v(TAG, "onItemSelected: mCurrentVideoSizeId = " +
+                                    mCurrentVideoSizeId);
+                        }
+                        mNextPreviewSize = matchPreviewRecordSize();
+                        if (VERBOSE) {
+                            Log.v(TAG, "onItemSelected: setting preview size "
+                                    + mNextPreviewSize.width + "x" + mNextPreviewSize.height);
+                        }
+
+                        startPreview();
+                        if (VERBOSE) {
+                            Log.v(TAG, "onItemSelected: started new preview");
+                        }
+                    }
+                }
+
+                @Override
+                public void onNothingSelected(AdapterView<?> parent) {
+                    // Intentionally left blank
+                }
+
+            };
+
+
+    private void setUpCaptureButton() {
+        captureButton.setOnClickListener (
+                new View.OnClickListener() {
+                    @Override
+                    public void onClick(View V) {
+                        if ((!isRecording) && (!isPlayingBack)) {
+                            if (prepareVideoRecorder()) {
+                                mMediaRecorder.start();
+                                if (VERBOSE) {
+                                    Log.v(TAG, "onClick: started mMediaRecorder");
+                                }
+                                isRecording = true;
+                                captureButton.setEnabled(false);
+                                mStatusLabel.setText(getResources()
+                                        .getString(R.string.status_recording));
+                            } else {
+                                releaseMediaRecorder();
+                                Log.e(TAG, "media recorder cannot be set up");
+                                failTest("Unable to set up media recorder.");
+                            }
+                            Handler h = new Handler();
+                            Runnable mDelayedPreview = new Runnable() {
+                                @Override
+                                public void run() {
+                                    mMediaRecorder.stop();
+                                    releaseMediaRecorder();
+
+                                    mPlaybackView.setVideoPath(outputVideoFile.getPath());
+                                    mPlaybackView.start();
+                                    isRecording = false;
+                                    isPlayingBack = true;
+                                    mStatusLabel.setText(getResources()
+                                            .getString(R.string.status_playback));
+                                    String combination = "Camera " + mCurrentCameraId + ", " +
+                                            mCurrentVideoSizeId + "\n";
+                                    mUntestedCombinations.remove(combination);
+                                    mTestedCombinations.add(combination);
+
+                                    if (mUntestedCombinations.isEmpty()) {
+                                        mPassButton.setEnabled(true);
+                                        if (VERBOSE) {
+                                            Log.v(TAG, "run: test success");
+                                        }
+                                    }
+                                }
+                            };
+                            h.postDelayed(mDelayedPreview, VIDEO_LENGTH);
+                        }
+
+                    }
+                }
+        );
+    }
+
+    private class VideoSizeNamePair {
+        private int sizeId;
+        private String sizeName;
+
+        public VideoSizeNamePair(int id, String name) {
+            sizeId = id;
+            sizeName = name;
+        }
+
+        public int getSizeId() {
+            return sizeId;
+        }
+
+        public String getSizeName() {
+            return sizeName;
+        }
+    }
+
+    private ArrayList<VideoSizeNamePair> getVideoSizeNamePairs(int cameraId) {
+        int[] qualityArray = {
+                CamcorderProfile.QUALITY_LOW,
+                CamcorderProfile.QUALITY_HIGH,
+                CamcorderProfile.QUALITY_QCIF,
+                CamcorderProfile.QUALITY_QVGA,
+                CamcorderProfile.QUALITY_CIF,
+                CamcorderProfile.QUALITY_480P,
+                CamcorderProfile.QUALITY_720P,
+                CamcorderProfile.QUALITY_1080P
+        };
+
+        String[] nameArray = {
+                "LOW",
+                "HIGH",
+                "QCIF",
+                "QVGA",
+                "CIF",
+                "480P",
+                "720P",
+                "1080P"
+        };
+
+        ArrayList<VideoSizeNamePair> availableSizes =
+                new ArrayList<VideoSizeNamePair> ();
+
+        for (int i = 0; i < qualityArray.length; i++) {
+            if (CamcorderProfile.hasProfile(cameraId, qualityArray[i])) {
+                VideoSizeNamePair pair = new VideoSizeNamePair(qualityArray[i], nameArray[i]);
+                availableSizes.add(pair);
+            }
+        }
+        return availableSizes;
+    }
+
+    static class ResolutionQuality {
+        private int videoSizeId;
+        private int width;
+        private int height;
+
+        public ResolutionQuality() {
+            // intentionally left blank
+        }
+        public ResolutionQuality(int newSizeId, int newWidth, int newHeight) {
+            videoSizeId = newSizeId;
+            width = newWidth;
+            height = newHeight;
+        }
+    }
+
+    private Size findRecordSize(int cameraId) {
+        int[] possibleQuality = {
+                CamcorderProfile.QUALITY_LOW,
+                CamcorderProfile.QUALITY_HIGH,
+                CamcorderProfile.QUALITY_QCIF,
+                CamcorderProfile.QUALITY_QVGA,
+                CamcorderProfile.QUALITY_CIF,
+                CamcorderProfile.QUALITY_480P,
+                CamcorderProfile.QUALITY_720P,
+                CamcorderProfile.QUALITY_1080P
+        };
+
+        ArrayList<ResolutionQuality> qualityList = new ArrayList<ResolutionQuality>();
+        for (int i = 0; i < possibleQuality.length; i++) {
+            if (CamcorderProfile.hasProfile(cameraId, possibleQuality[i])) {
+                CamcorderProfile profile = CamcorderProfile.get(cameraId, possibleQuality[i]);
+                qualityList.add(new ResolutionQuality(possibleQuality[i],
+                        profile.videoFrameWidth, profile.videoFrameHeight));
+            }
+        }
+
+        Size recordSize = null;
+        for (int i = 0; i < qualityList.size(); i++) {
+            if (mCurrentVideoSizeId == qualityList.get(i).videoSizeId) {
+                recordSize = mCamera.new Size(qualityList.get(i).width,
+                        qualityList.get(i).height);
+                break;
+            }
+        }
+
+        if (recordSize == null) {
+            Log.e(TAG, "findRecordSize: did not find a match");
+            failTest("Cannot find video size");
+        }
+        return recordSize;
+    }
+
+    // Match preview size with current recording size mCurrentVideoSizeId
+    private Size matchPreviewRecordSize() {
+        Size recordSize = findRecordSize(mCurrentCameraId);
+
+        Size matchedSize = null;
+        // First try to find exact match in size
+        for (int i = 0; i < mPreviewSizes.size(); i++) {
+            if (mPreviewSizes.get(i).equals(recordSize)) {
+                matchedSize = mCamera.new Size(recordSize.width, recordSize.height);
+                break;
+            }
+        }
+        // Second try to find one with similar if not the same aspect ratio
+        if (matchedSize == null) {
+            for (int i = mPreviewSizes.size() - 1; i >= 0; i--) {
+                if (Math.abs((float)mPreviewSizes.get(i).width * recordSize.height /
+                        mPreviewSizes.get(i).height / recordSize.width - 1) < 0.1) {
+                    matchedSize = mCamera.new Size(mPreviewSizes.get(i).width,
+                            mPreviewSizes.get(i).height);
+                    break;
+                }
+            }
+        }
+        // Last resort, just use the first preview size
+        if (matchedSize == null) {
+            matchedSize = mCamera.new Size(mPreviewSizes.get(0).width,
+                    mPreviewSizes.get(0).height);
+        }
+
+        if (VERBOSE) {
+            Log.v(TAG, "matchPreviewRecordSize " + matchedSize.width + "x" + matchedSize.height);
+        }
+
+        return matchedSize;
+    }
+
+    private void setUpCamera(int id) {
+        shutdownCamera();
+
+        mCurrentCameraId = id;
+        try {
+            mCamera = Camera.open(id);
+        }
+        catch (Exception e) {
+            Log.e(TAG, "camera is not available", e);
+            failTest("camera not available" + e.getMessage());
+            return;
+        }
+
+        Camera.Parameters p = mCamera.getParameters();
+        if (VERBOSE) {
+            Log.v(TAG, "setUpCamera: setUpCamera got camera parameters");
+        }
+
+        // Get preview resolutions
+        List<Size> unsortedSizes = p.getSupportedPreviewSizes();
+
+        class SizeCompare implements Comparator<Size> {
+            @Override
+            public int compare(Size lhs, Size rhs) {
+                if (lhs.width < rhs.width) return -1;
+                if (lhs.width > rhs.width) return 1;
+                if (lhs.height < rhs.height) return -1;
+                if (lhs.height > rhs.height) return 1;
+                return 0;
+            }
+        };
+
+        SizeCompare s = new SizeCompare();
+        TreeSet<Size> sortedResolutions = new TreeSet<Size>(s);
+        sortedResolutions.addAll(unsortedSizes);
+
+        mPreviewSizes = new ArrayList<Size>(sortedResolutions);
+
+        ArrayList<VideoSizeNamePair> availableVideoSizes = getVideoSizeNamePairs(id);
+        String[] availableVideoSizeNames = new String[availableVideoSizes.size()];
+        mVideoSizeIds = new ArrayList<Integer>();
+        for (int i = 0; i < availableVideoSizes.size(); i++) {
+            availableVideoSizeNames[i] = availableVideoSizes.get(i).getSizeName();
+            mVideoSizeIds.add(availableVideoSizes.get(i).getSizeId());
+        }
+
+        mResolutionSpinner.setAdapter(
+            new ArrayAdapter<String>(
+                this, R.layout.cf_format_list_item, availableVideoSizeNames));
+
+        // Update untested
+        mUntestedCombinations.remove("All combinations for Camera " + id + "\n");
+        for (int videoSizeId: mVideoSizeIds) {
+            String combination = "Camera " + id + ", " + videoSizeId + "\n";
+            if (!mTestedCombinations.contains(combination)) {
+                mUntestedCombinations.add(combination);
+            }
+        }
+
+        // Set initial values
+        mCurrentVideoSizeId = mVideoSizeIds.get(0);
+        mNextPreviewSize = matchPreviewRecordSize();
+        mResolutionSpinner.setSelection(0);
+
+        // Set up correct display orientation
+        CameraInfo info = new CameraInfo();
+        Camera.getCameraInfo(id, info);
+        int rotation = getWindowManager().getDefaultDisplay().getRotation();
+        int degrees = 0;
+        switch (rotation) {
+            case Surface.ROTATION_0: degrees = 0; break;
+            case Surface.ROTATION_90: degrees = 90; break;
+            case Surface.ROTATION_180: degrees = 180; break;
+            case Surface.ROTATION_270: degrees = 270; break;
+        }
+
+        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
+            mPreviewRotation = (info.orientation + degrees) % 360;
+            mPreviewRotation = (360 - mPreviewRotation) % 360;  // compensate the mirror
+        } else {  // back-facing
+            mPreviewRotation = (info.orientation - degrees + 360) % 360;
+        }
+        if (mPreviewRotation != 0 && mPreviewRotation != 180) {
+            Log.w(TAG,
+                "Display orientation correction is not 0 or 180, as expected!");
+        }
+
+        mCamera.setDisplayOrientation(mPreviewRotation);
+
+        // Start up preview if display is ready
+        if (mPreviewTexture != null) {
+            startPreview();
+        }
+    }
+
+    private void shutdownCamera() {
+        if (mCamera != null) {
+            mCamera.setPreviewCallback(null);
+            mCamera.stopPreview();
+            mCamera.release();
+            mCamera = null;
+        }
+    }
+
+    /**
+     * starts capturing and drawing frames on screen
+     */
+    private void startPreview() {
+
+        mCamera.stopPreview();
+
+        Matrix transform = new Matrix();
+        float widthRatio = mNextPreviewSize.width / (float)mPreviewTexWidth;
+        float heightRatio = mNextPreviewSize.height / (float)mPreviewTexHeight;
+        if (VERBOSE) {
+            Log.v(TAG, "startPreview: widthRatio=" + widthRatio + " " + "heightRatio=" +
+                    heightRatio);
+        }
+
+        if (heightRatio < widthRatio) {
+            transform.setScale(1, heightRatio / widthRatio);
+            transform.postTranslate(0,
+                    mPreviewTexHeight * (1 - heightRatio / widthRatio) / 2);
+            if (VERBOSE) {
+                Log.v(TAG, "startPreview: shrink vertical by " + heightRatio / widthRatio);
+            }
+        } else {
+            transform.setScale(widthRatio / heightRatio, 1);
+            transform.postTranslate(mPreviewTexWidth * (1 - widthRatio / heightRatio) / 2, 0);
+            if (VERBOSE) {
+                Log.v(TAG, "startPreview: shrink horizontal by " + widthRatio / heightRatio);
+            }
+        }
+
+        mPreviewView.setTransform(transform);
+
+        mPreviewSize = mNextPreviewSize;
+
+        Camera.Parameters p = mCamera.getParameters();
+        p.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
+        mCamera.setParameters(p);
+
+        try {
+            mCamera.setPreviewTexture(mPreviewTexture);
+            if (mPreviewTexture == null) {
+                Log.e(TAG, "preview texture is null.");
+            }
+            if (VERBOSE) {
+                Log.v(TAG, "startPreview: set preview texture in startPreview");
+            }
+            mCamera.startPreview();
+            if (VERBOSE) {
+                Log.v(TAG, "startPreview: started preview in startPreview");
+            }
+        } catch (IOException ioe) {
+            Log.e(TAG, "Unable to start up preview", ioe);
+            // Show a dialog box to tell user test failed
+            failTest("Unable to start preview.");
+        }
+    }
+
+    private void failTest(String failMessage) {
+        DialogInterface.OnClickListener dialogClickListener =
+                new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        switch (which) {
+                            case DialogInterface.BUTTON_POSITIVE:
+                                PassFailButtons.setTestResultAndFinish(CameraVideoActivity.this,
+                                        CameraVideoActivity.this.getTestId(),
+                                        CameraVideoActivity.this.getTestDetails(),
+                                        /* passed */false);
+                                break;
+                            case DialogInterface.BUTTON_NEGATIVE:
+                                break;
+                        }
+                    }
+                };
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(CameraVideoActivity.this);
+        builder.setMessage(getString(R.string.dialog_fail_test) + ". " + failMessage)
+                .setPositiveButton(R.string.fail_quit, dialogClickListener)
+                .setNegativeButton(R.string.cancel, dialogClickListener)
+                .show();
+    }
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
new file mode 100644
index 0000000..fcd88d1
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
@@ -0,0 +1,196 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier.deskclock;
+
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+import android.provider.AlarmClock;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.IntentDrivenTestActivity;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.IntentDrivenTestActivity.ButtonInfo;
+import com.android.cts.verifier.IntentDrivenTestActivity.IntentFactory;
+import com.android.cts.verifier.IntentDrivenTestActivity.TestInfo;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+
+/**
+ * Activity that lists all the DeskClock tests.
+ */
+public class DeskClockTestsActivity extends PassFailButtons.TestListActivity {
+
+    private static final String SHOW_ALARMS_TEST = "SHOW_ALARMS";
+    public static final String SET_ALARM_WITH_UI_TEST = "SET_ALARM_WITH_UI";
+    public static final String START_ALARM_TEST = "START_ALARM";
+    public static final String CREATE_ALARM_TEST = "CREATE_ALARM";
+    public static final String SET_TIMER_WITH_UI_TEST = "SET_TIMER_WITH_UI";
+    public static final String START_TIMER = "START_TIMER";
+    public static final String START_TIMER_WITH_UI = "START_TIMER_WITH_UI";
+
+    private static final ArrayList<Integer> DAYS = new ArrayList<Integer>();
+
+    private static final Intent CREATE_ALARM_INTENT = new Intent(AlarmClock.ACTION_SET_ALARM)
+            .putExtra(AlarmClock.EXTRA_MESSAGE, "Create Alarm Test")
+            .putExtra(AlarmClock.EXTRA_SKIP_UI, false)
+            .putExtra(AlarmClock.EXTRA_VIBRATE, true)
+            .putExtra(AlarmClock.EXTRA_RINGTONE, AlarmClock.VALUE_RINGTONE_SILENT)
+            .putExtra(AlarmClock.EXTRA_HOUR, 1)
+            .putExtra(AlarmClock.EXTRA_MINUTES, 23)
+            .putExtra(AlarmClock.EXTRA_DAYS, DAYS);
+
+    static {
+        DAYS.add(Calendar.MONDAY);
+        DAYS.add(Calendar.WEDNESDAY);
+    }
+
+    private static final Intent SHOW__ALARMS_INTENT = new Intent(AlarmClock.ACTION_SHOW_ALARMS);
+
+    private static final Intent SET_ALARM_WITH_UI_INTENT = new Intent(AlarmClock.ACTION_SET_ALARM)
+            .putExtra(AlarmClock.EXTRA_SKIP_UI, false);
+
+    private static final Intent SET_TIMER_WITH_UI_INTENT = new Intent(AlarmClock.ACTION_SET_TIMER)
+             .putExtra(AlarmClock.EXTRA_SKIP_UI, false);
+
+    private static final Intent START_TIMER_INTENT = new Intent(AlarmClock.ACTION_SET_TIMER)
+    .putExtra(AlarmClock.EXTRA_SKIP_UI, true)
+    .putExtra(AlarmClock.EXTRA_MESSAGE, "Start Timer Test")
+    .putExtra(AlarmClock.EXTRA_LENGTH, 30);
+
+    private static final Intent START_TIMER_WITH_UI_INTENT = new Intent(AlarmClock.ACTION_SET_TIMER)
+    .putExtra(AlarmClock.EXTRA_SKIP_UI, false)
+    .putExtra(AlarmClock.EXTRA_MESSAGE, "Start Timer Test")
+    .putExtra(AlarmClock.EXTRA_LENGTH, 30);
+
+    private static final TestInfo[] ALARM_TESTS = new TestInfo[] {
+            new TestInfo(
+                    SHOW_ALARMS_TEST,
+                    R.string.dc_show_alarms_test,
+                    R.string.dc_show_alarms_test_info,
+                    new ButtonInfo(
+                            R.string.dc_show_alarms_button,
+                            SHOW__ALARMS_INTENT)),
+            new TestInfo(
+                    SET_ALARM_WITH_UI_TEST,
+                    R.string.dc_set_alarm_with_ui_test,
+                    R.string.dc_set_alarm_with_ui_test_info,
+                    new ButtonInfo(
+                            R.string.dc_set_alarm_button,
+                            SET_ALARM_WITH_UI_INTENT)),
+            new TestInfo(
+                    START_ALARM_TEST,
+                    R.string.dc_start_alarm_test,
+                    R.string.dc_start_alarm_test_info,
+                    new ButtonInfo(
+                            R.string.dc_set_alarm_button,
+                            DeskClockIntentFactory.class.getName()),
+                    new ButtonInfo(
+                            R.string.dc_set_alarm_verify_button,
+                            SHOW__ALARMS_INTENT)),
+            new TestInfo(
+                    CREATE_ALARM_TEST,
+                    R.string.dc_full_alarm_test,
+                    R.string.dc_full_alarm_test_info,
+                    new ButtonInfo(
+                            R.string.dc_full_alarm_button,
+                            CREATE_ALARM_INTENT)),
+    };
+
+    private static final TestInfo[] TIMER_TESTS = new TestInfo[] {
+            new TestInfo(
+                    SET_TIMER_WITH_UI_TEST,
+                    R.string.dc_set_timer_with_ui_test,
+                    R.string.dc_set_timer_with_ui_test_info,
+                    new ButtonInfo(
+                            R.string.dc_set_timer_with_ui_button,
+                            SET_TIMER_WITH_UI_INTENT)),
+            new TestInfo(
+                    START_TIMER,
+                    R.string.dc_start_timer_test,
+                    R.string.dc_start_timer_test_info,
+                    new ButtonInfo(
+                            R.string.dc_start_timer_button,
+                            START_TIMER_INTENT)),
+            new TestInfo(
+                    START_TIMER_WITH_UI,
+                    R.string.dc_start_timer_with_ui_test,
+                    R.string.dc_start_timer_with_ui_test_info,
+                    new ButtonInfo(
+                            R.string.dc_start_timer_button,
+                            START_TIMER_WITH_UI_INTENT)),
+  };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setInfoResources(R.string.deskclock_tests, R.string.deskclock_tests_info, 0);
+        setPassFailButtonClickListeners();
+
+        getPassButton().setEnabled(false);
+
+        final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        adapter.add(TestListItem.newCategory(this, R.string.deskclock_group_alarms));
+        addTests(adapter, ALARM_TESTS);
+
+        adapter.add(TestListItem.newCategory(this, R.string.deskclock_group_timers));
+        addTests(adapter, TIMER_TESTS);
+
+        adapter.registerDataSetObserver(new DataSetObserver() {
+            @Override
+            public void onChanged() {
+                updatePassButton();
+            }
+        });
+
+        setTestListAdapter(adapter);
+    }
+
+    private void addTests(ArrayTestListAdapter adapter, TestInfo[] tests) {
+        for (TestInfo info : tests) {
+
+            final int title = info.getTitle();
+            adapter.add(TestListItem.newTest(this, title, info.getTestId(),
+            new Intent(this, IntentDrivenTestActivity.class)
+                    .putExtra(IntentDrivenTestActivity.EXTRA_ID, info.getTestId())
+                    .putExtra(IntentDrivenTestActivity.EXTRA_TITLE, title)
+                    .putExtra(IntentDrivenTestActivity.EXTRA_INFO, info.getInfoText())
+                    .putExtra(IntentDrivenTestActivity.EXTRA_BUTTONS, info.getButtons()),
+                    null));
+        }
+    }
+
+    /**
+     * Enable Pass Button when the all tests passed.
+     */
+    private void updatePassButton() {
+        getPassButton().setEnabled(mAdapter.allTestsPassed());
+    }
+
+    public static class DeskClockIntentFactory implements IntentFactory {
+        @Override
+        public Intent[] createIntents(String testId, int buttonText) {
+            if (testId.equals(START_ALARM_TEST)) {
+                // Alarm should go off 2 minutes from now
+                final Calendar cal = Calendar.getInstance();
+                cal.setTimeInMillis(cal.getTimeInMillis() + 120000);
+                return new Intent[] {
+                        new Intent(AlarmClock.ACTION_SET_ALARM)
+                                .putExtra(AlarmClock.EXTRA_MESSAGE, "Start Alarm Test")
+                        .putExtra(AlarmClock.EXTRA_SKIP_UI, true)
+                        .putExtra(AlarmClock.EXTRA_VIBRATE, true)
+                        .putExtra(AlarmClock.EXTRA_RINGTONE, AlarmClock.VALUE_RINGTONE_SILENT)
+                        .putExtra(AlarmClock.EXTRA_HOUR, cal.get(Calendar.HOUR_OF_DAY))
+                        .putExtra(AlarmClock.EXTRA_MINUTES, cal.get(Calendar.MINUTE)),
+                };
+            } else {
+                throw new IllegalArgumentException("Unknown test: " + testId);
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
index 1a68b48..6b87261 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
@@ -180,6 +180,14 @@
             new Feature("android.hardware.camera.any", false),
     };
 
+    public static final Feature[] ALL_KITKAT_FEATURES = {
+            new Feature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, false),
+            new Feature(PackageManager.FEATURE_CONSUMER_IR, false),
+            new Feature(PackageManager.FEATURE_DEVICE_ADMIN, false),
+            new Feature(PackageManager.FEATURE_SENSOR_STEP_COUNTER, false),
+            new Feature(PackageManager.FEATURE_SENSOR_STEP_DETECTOR, false),
+    };
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -210,6 +218,9 @@
 
         // add features from latest to last so that the latest requirements are put in the set first
         int apiVersion = Build.VERSION.SDK_INT;
+        if (apiVersion >= Build.VERSION_CODES.KITKAT) {
+            Collections.addAll(features, ALL_KITKAT_FEATURES);
+        }
         if (apiVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
             Collections.addAll(features, ALL_JELLY_BEAN_MR2_FEATURES);
         }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeBatterySavingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeBatterySavingTestActivity.java
new file mode 100644
index 0000000..08fb34d
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeBatterySavingTestActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.location;
+
+import android.location.LocationManager;
+import android.provider.Settings.Secure;
+import com.android.cts.verifier.R;
+
+public class LocationModeBatterySavingTestActivity extends LocationModeTestActivity {
+
+    @Override
+    protected void createTestItems() {
+        createUserItem(R.string.location_mode_turn_on);
+        createUserItem(R.string.location_mode_select_battery_saving);
+        createAutoItem(R.string.location_mode_secure_gps_off);
+        createAutoItem(R.string.location_mode_secure_nlp_on);
+        createAutoItem(R.string.location_mode_manager_gps_off);
+        createAutoItem(R.string.location_mode_manager_nlp_on);
+    }
+
+    @Override
+    protected void setInfoResources() {
+        setInfoResources(R.string.location_mode_battery_saving_test,
+                R.string.location_mode_battery_saving_info, -1);
+    }
+
+    @Override
+    protected void testAdvance(int state) {
+        switch (state) {
+            case 0:
+                testIsOn(0);
+                break;
+            case 1:
+                testIsExpectedMode(1, Secure.LOCATION_MODE_BATTERY_SAVING);
+                break;
+            case 2:
+                testSecureProviderIsDisabled(2, LocationManager.GPS_PROVIDER);
+                break;
+            case 3:
+                testSecureProviderIsEnabled(3, LocationManager.NETWORK_PROVIDER);
+                break;
+            case 4:
+                testManagerProviderIsDisabled(4, LocationManager.GPS_PROVIDER);
+                break;
+            case 5:
+                testManagerProviderIsEnabled(5, LocationManager.NETWORK_PROVIDER);
+                break;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeDeviceOnlyTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeDeviceOnlyTestActivity.java
new file mode 100644
index 0000000..0ba9f76
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeDeviceOnlyTestActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.location;
+
+import android.location.LocationManager;
+import android.provider.Settings.Secure;
+import com.android.cts.verifier.R;
+
+public class LocationModeDeviceOnlyTestActivity extends LocationModeTestActivity {
+
+    @Override
+    protected void createTestItems() {
+        createUserItem(R.string.location_mode_turn_on);
+        createUserItem(R.string.location_mode_select_device_only);
+        createAutoItem(R.string.location_mode_secure_gps_on);
+        createAutoItem(R.string.location_mode_secure_nlp_off);
+        createAutoItem(R.string.location_mode_manager_gps_on);
+        createAutoItem(R.string.location_mode_manager_nlp_off);
+    }
+
+    @Override
+    protected void setInfoResources() {
+        setInfoResources(R.string.location_mode_device_only_test,
+                R.string.location_mode_device_only_info, -1);
+    }
+
+    @Override
+    protected void testAdvance(int state) {
+        switch (state) {
+            case 0:
+                testIsOn(0);
+                break;
+            case 1:
+                testIsExpectedMode(1, Secure.LOCATION_MODE_SENSORS_ONLY);
+                break;
+            case 2:
+                testSecureProviderIsEnabled(2, LocationManager.GPS_PROVIDER);
+                break;
+            case 3:
+                testSecureProviderIsDisabled(3, LocationManager.NETWORK_PROVIDER);
+                break;
+            case 4:
+                testManagerProviderIsEnabled(4, LocationManager.GPS_PROVIDER);
+                break;
+            case 5:
+                testManagerProviderIsDisabled(5, LocationManager.NETWORK_PROVIDER);
+                break;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeHighAccuracyTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeHighAccuracyTestActivity.java
new file mode 100644
index 0000000..9c10705
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeHighAccuracyTestActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.location;
+
+import android.location.LocationManager;
+import android.provider.Settings.Secure;
+import com.android.cts.verifier.R;
+
+public class LocationModeHighAccuracyTestActivity extends LocationModeTestActivity {
+
+    @Override
+    protected void createTestItems() {
+        createUserItem(R.string.location_mode_turn_on);
+        createUserItem(R.string.location_mode_select_high_accuracy);
+        createAutoItem(R.string.location_mode_secure_gps_on);
+        createAutoItem(R.string.location_mode_secure_nlp_on);
+        createAutoItem(R.string.location_mode_manager_gps_on);
+        createAutoItem(R.string.location_mode_manager_nlp_on);
+    }
+
+    @Override
+    protected void setInfoResources() {
+        setInfoResources(R.string.location_mode_high_accuracy_test,
+                R.string.location_mode_high_accuracy_info, -1);
+    }
+
+    @Override
+    protected void testAdvance(int state) {
+        switch (state) {
+            case 0:
+                testIsOn(0);
+                break;
+            case 1:
+                testIsExpectedMode(1, Secure.LOCATION_MODE_HIGH_ACCURACY);
+                break;
+            case 2:
+                testSecureProviderIsEnabled(2, LocationManager.GPS_PROVIDER);
+                break;
+            case 3:
+                testSecureProviderIsEnabled(3, LocationManager.NETWORK_PROVIDER);
+                break;
+            case 4:
+                testManagerProviderIsEnabled(4, LocationManager.GPS_PROVIDER);
+                break;
+            case 5:
+                testManagerProviderIsEnabled(5, LocationManager.NETWORK_PROVIDER);
+                break;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeOffTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeOffTestActivity.java
new file mode 100644
index 0000000..92b0742
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeOffTestActivity.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.location;
+
+import android.location.LocationManager;
+import android.provider.Settings.Secure;
+import com.android.cts.verifier.R;
+
+public class LocationModeOffTestActivity extends LocationModeTestActivity {
+
+    @Override
+    protected void createTestItems() {
+        createUserItem(R.string.location_mode_turn_off);
+        createAutoItem(R.string.location_mode_secure_gps_off);
+        createAutoItem(R.string.location_mode_secure_nlp_off);
+        createAutoItem(R.string.location_mode_manager_gps_off);
+        createAutoItem(R.string.location_mode_manager_nlp_off);
+    }
+
+    @Override
+    protected void setInfoResources() {
+        setInfoResources(R.string.location_mode_off_test,
+                R.string.location_mode_off_info, -1);
+    }
+
+    @Override
+    protected void testAdvance(int state) {
+        switch (state) {
+            case 0:
+                testIsExpectedMode(0, Secure.LOCATION_MODE_OFF);
+                break;
+            case 1:
+                testSecureProviderIsDisabled(1, LocationManager.GPS_PROVIDER);
+                break;
+            case 2:
+                testSecureProviderIsDisabled(2, LocationManager.NETWORK_PROVIDER);
+                break;
+            case 3:
+                testManagerProviderIsDisabled(3, LocationManager.GPS_PROVIDER);
+                break;
+            case 4:
+                testManagerProviderIsDisabled(4, LocationManager.NETWORK_PROVIDER);
+                break;
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeTestActivity.java
new file mode 100644
index 0000000..92d41f4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/location/LocationModeTestActivity.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.location;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.location.LocationManager;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.provider.Settings.Secure;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+/**
+ * Asks the user to put the device in one of the four location modes and then checks to see if
+ * {@link Secure#isLocationProviderEnabled(ContentResolver, String)} and {@link
+ * LocationManager#isProviderEnabled(String)} have the expected values for GPS and Wi-Fi. For
+ * example in battery saving mode, Wi-Fi should be on but GPS should be off.
+ *
+ * It would be hard to automate these tests because the {@link Secure#LOCATION_MODE} API is only
+ * accessible to apps in the system image. Furthermore, selecting two of the modes requires the user
+ * to accept the NLP confirmation dialog.
+ */
+public abstract class LocationModeTestActivity
+        extends PassFailButtons.Activity implements Runnable {
+
+    private static final String STATE = "state";
+    protected static final int PASS = 1;
+    protected static final int FAIL = 2;
+    protected static final int WAIT_FOR_USER = 3;
+
+    protected int mState;
+    protected int[] mStatus;
+    private LayoutInflater mInflater;
+    private ViewGroup mItemList;
+    private Runnable mRunner;
+    private View mHandler;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState != null) {
+            mState = savedInstanceState.getInt(STATE, 0);
+        }
+
+        mRunner = this;
+        mInflater = getLayoutInflater();
+        View view = mInflater.inflate(R.layout.location_mode_main, null);
+        mItemList = (ViewGroup) view.findViewById(R.id.test_items);
+        mHandler = mItemList;
+
+        createTestItems();
+        mStatus = new int[mItemList.getChildCount()];
+        setContentView(view);
+
+        setPassFailButtonClickListeners();
+
+        setInfoResources();
+
+        getPassButton().setEnabled(false);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        outState.putInt(STATE, mState);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        next();
+    }
+
+    /**
+     * Template method used by the subclass to create the checks corresponding to each value of
+     * {@link #mState}. Subclass should call {@link #createUserItem(int)} and {@link
+     * #createAutoItem(int)} as appropriate to generate each item.
+     */
+    protected abstract void createTestItems();
+
+    /**
+     * Template method used by the subclass to call {@link #setInfoResources(int, int, int)} with
+     * the appropriate resources.
+     */
+    protected abstract void setInfoResources();
+
+    /**
+     * Subclass can call this to create a test step where the user must perform some action such
+     * as setting the location mode.
+     */
+    protected View createUserItem(int stringId) {
+        View item = mInflater.inflate(R.layout.location_mode_item, mItemList, false);
+        TextView instructions = (TextView) item.findViewById(R.id.instructions);
+        instructions.setText(stringId);
+        mItemList.addView(item);
+        return item;
+    }
+
+    /**
+     * Subclass can call this to create a test step where the test automatically evaluates whether
+     * an expected condition is satisfied, such as GPS is off.
+     */
+    protected View createAutoItem(int stringId) {
+        View item = mInflater.inflate(R.layout.location_mode_item, mItemList, false);
+        TextView instructions = (TextView) item.findViewById(R.id.instructions);
+        instructions.setText(stringId);
+        View button = item.findViewById(R.id.launch_settings);
+        button.setVisibility(View.GONE);
+        mItemList.addView(item);
+        return item;
+    }
+
+    /**
+     * Set the visible state of a test item to passed or failed.
+     */
+    private void setItemState(int index, boolean passed) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.status);
+        status.setImageResource(passed ? R.drawable.fs_good : R.drawable.fs_error);
+        View button = item.findViewById(R.id.launch_settings);
+        button.setClickable(false);
+        button.setEnabled(false);
+        status.invalidate();
+    }
+
+    /**
+     * Set the visible state of a test item to waiting.
+     */
+    protected void markItemWaiting(int index) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.status);
+        status.setImageResource(R.drawable.fs_warning);
+        status.invalidate();
+    }
+
+    /**
+     * Advances the state machine.
+     */
+    public void run() {
+        // Advance test state until we find case where it hasn't passed (yet)
+        while (mState < mStatus.length && mStatus[mState] != WAIT_FOR_USER) {
+            if (mStatus[mState] == PASS) {
+                setItemState(mState, true);
+                mState++;
+            } else if (mStatus[mState] == FAIL) {
+                setItemState(mState, false);
+                return;
+            } else {
+                break;
+            }
+        }
+
+        if (mState < mStatus.length && mStatus[mState] == WAIT_FOR_USER) {
+            markItemWaiting(mState);
+        }
+
+        testAdvance(mState);
+
+        if (mState == mStatus.length - 1 && mStatus[mState] == PASS) {
+            // All tests run and pass
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    /**
+     * Launches Locations &gt; Settings so the user can set the location mode. Public because it
+     * is referenced by layout.
+     */
+    public void launchSettings(View button) {
+        startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
+    }
+
+    /**
+     * Return to the state machine to progress through the tests.
+     */
+    protected void next() {
+        mHandler.post(mRunner);
+    }
+
+    /**
+     * Wait for things to settle before returning to the state machine.
+     */
+    protected void delay() {
+        mHandler.postDelayed(mRunner, 2000);
+    }
+
+    // Tests
+
+    private int getLocationMode() {
+        ContentResolver cr = getContentResolver();
+        return Secure.getInt(cr, Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF);
+    }
+
+    protected void testIsOn(int i) {
+        int mode = getLocationMode();
+        boolean passed = mode != Secure.LOCATION_MODE_OFF;
+        if (passed) {
+            mStatus[i] = PASS;
+        } else {
+            mStatus[i] = WAIT_FOR_USER;
+        }
+        next();
+    }
+
+    protected void testIsExpectedMode(int i, int expectedMode) {
+        int mode = getLocationMode();
+        boolean passed = mode == expectedMode;
+        if (passed) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            mStatus[i] = WAIT_FOR_USER;
+            delay();
+        }
+    }
+
+    protected void testSecureProviderIsEnabled(int i, String provider) {
+        ContentResolver cr = getContentResolver();
+        boolean enabled = Secure.isLocationProviderEnabled(cr, provider);
+        mStatus[i] = enabled ? PASS : FAIL;
+        next();
+    }
+
+    protected void testSecureProviderIsDisabled(int i, String provider) {
+        ContentResolver cr = getContentResolver();
+        boolean enabled = Secure.isLocationProviderEnabled(cr, provider);
+        mStatus[i] = !enabled ? PASS : FAIL;
+        next();
+    }
+
+    protected void testManagerProviderIsEnabled(int i, String gpsProvider) {
+        LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
+        boolean enabled = manager.isProviderEnabled(gpsProvider);
+        mStatus[i] = enabled ? PASS : FAIL;
+        next();
+    }
+
+    protected void testManagerProviderIsDisabled(int i, String gpsProvider) {
+        LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
+        boolean enabled = manager.isProviderEnabled(gpsProvider);
+        mStatus[i] = !enabled ? PASS : FAIL;
+        next();
+    }
+
+    protected abstract void testAdvance(int state);
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
index c78062b..40a12ae 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcDialogs.java
@@ -25,7 +25,7 @@
 import android.provider.Settings;
 
 /** Class containing methods to create common dialogs for NFC activities. */
-class NfcDialogs {
+public class NfcDialogs {
 
     static AlertDialog createNotEnabledDialog(final Context context) {
         return new AlertDialog.Builder(context)
@@ -57,6 +57,15 @@
                 .create();
     }
 
+    public static AlertDialog createHceTapReaderDialog(final Context context, String message) {
+        String baseString = context.getString(R.string.nfc_hce_tap_reader_message);
+        return new AlertDialog.Builder(context)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setTitle(R.string.nfc_hce_tap_reader_title)
+                .setMessage(message != null ? message + "\n\n" + baseString : baseString)
+                .setPositiveButton("OK", null)
+                .create();
+    }
     private NfcDialogs() {
     }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
old mode 100755
new mode 100644
index b158ad3..cb90241
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/NfcTestActivity.java
@@ -20,6 +20,8 @@
 import com.android.cts.verifier.PassFailButtons;
 import com.android.cts.verifier.R;
 import com.android.cts.verifier.TestListAdapter.TestListItem;
+import com.android.cts.verifier.nfc.hce.HceEmulatorTestActivity;
+import com.android.cts.verifier.nfc.hce.HceReaderTestActivity;
 
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -64,6 +66,16 @@
                     MIFARE_ULTRALIGHT_ID, getTagIntent(MifareUltralight.class), null));
         }
 
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+            adapter.add(TestListItem.newCategory(this, R.string.nfc_hce));
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_reader_tests,
+                    HceReaderTestActivity.class.getName(),
+                    new Intent(this, HceReaderTestActivity.class), null));
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_emulator_tests,
+                    HceEmulatorTestActivity.class.getName(),
+                    new Intent(this, HceEmulatorTestActivity.class), null));
+        }
+
         setTestListAdapter(adapter);
     }
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/AccessService.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/AccessService.java
new file mode 100644
index 0000000..969f621
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/AccessService.java
@@ -0,0 +1,28 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class AccessService extends HceService {
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            AccessService.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu(HceUtils.ACCESS_AID),
+        "80CA01F000"
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "123456789000",
+        "1481148114819000"
+    };
+
+    public AccessService() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/BaseEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/BaseEmulatorActivity.java
new file mode 100644
index 0000000..bcd2b8d
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/BaseEmulatorActivity.java
@@ -0,0 +1,131 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.hce.PaymentService1;
+
+@TargetApi(19)
+public abstract class BaseEmulatorActivity extends PassFailButtons.Activity {
+    static final String TAG = "BaseEmulatorActivity";
+    NfcAdapter mAdapter;
+    CardEmulation mCardEmulation;
+    ProgressDialog mSetupDialog;
+
+    final ArrayList<ComponentName> SERVICES = new ArrayList<ComponentName>(
+            Arrays.asList(
+            PaymentService1.COMPONENT,
+            PaymentService2.COMPONENT,
+            TransportService1.COMPONENT,
+            TransportService2.COMPONENT,
+            AccessService.COMPONENT,
+            ThroughputService.COMPONENT,
+            OffHostService.COMPONENT)
+    );
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mAdapter = NfcAdapter.getDefaultAdapter(this);
+        mCardEmulation = CardEmulation.getInstance(mAdapter);
+    }
+
+    abstract void onServicesSetup(boolean result);
+
+    abstract void onApduSequenceComplete(ComponentName component, long duration);
+
+    void onApduSequenceError() {
+
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        IntentFilter filter = new IntentFilter(HceUtils.ACTION_APDU_SEQUENCE_COMPLETE);
+        registerReceiver(mReceiver, filter);
+    }
+
+    final void setupServices(Context context, ComponentName... components) {
+        mSetupDialog = new ProgressDialog(context);
+        new SetupServicesTask().execute(components);
+    }
+
+    final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (HceUtils.ACTION_APDU_SEQUENCE_COMPLETE.equals(action)) {
+                // Get component whose sequence was completed
+                ComponentName component = intent.getParcelableExtra(HceUtils.EXTRA_COMPONENT);
+                long duration = intent.getLongExtra(HceUtils.EXTRA_DURATION, 0);
+                if (component != null) {
+                    onApduSequenceComplete(component, duration);
+                }
+            } else if (HceUtils.ACTION_APDU_SEQUENCE_ERROR.equals(action)) {
+                onApduSequenceError();
+            }
+        }
+    };
+
+    private class SetupServicesTask extends AsyncTask<ComponentName, Void, Boolean> {
+        @Override
+        protected void onPostExecute(Boolean result) {
+            super.onPostExecute(result);
+            mSetupDialog.dismiss();
+            onServicesSetup(result);
+        }
+
+        @Override
+        protected void onPreExecute() {
+            super.onPreExecute();
+            mSetupDialog.setTitle(R.string.nfc_hce_please_wait);
+            mSetupDialog.setMessage(getString(R.string.nfc_hce_setting_up));
+            mSetupDialog.setCancelable(false);
+            mSetupDialog.show();
+        }
+
+        @Override
+        protected Boolean doInBackground(ComponentName... components) {
+            List<ComponentName> enableComponents = Arrays.asList(components);
+            for (ComponentName component : SERVICES) {
+                if (enableComponents.contains(component)) {
+                    Log.d(TAG, "Enabling component " + component);
+                    HceUtils.enableComponent(getPackageManager(), component);
+                } else {
+                    Log.d(TAG, "Disabling component " + component);
+                    HceUtils.disableComponent(getPackageManager(), component);
+                }
+            }
+            // This is a trick to invalidate the HCE cache and avoid
+            // having to wait for PackageManager broadcasts to NFCService.
+            ComponentName bogusComponent = new ComponentName("com.android.cts.verifier",
+                    "com.android.cts.verifier.nfc.hce.BogusService");
+            mCardEmulation.isDefaultServiceForCategory(bogusComponent,
+                    CardEmulation.CATEGORY_PAYMENT);
+            return true;
+        }
+    };
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ChangeDefaultEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ChangeDefaultEmulatorActivity.java
new file mode 100644
index 0000000..0681f49
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ChangeDefaultEmulatorActivity.java
@@ -0,0 +1,150 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.app.AlertDialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class ChangeDefaultEmulatorActivity extends BaseEmulatorActivity implements OnClickListener {
+    final static int STATE_IDLE = 0;
+    final static int STATE_SERVICE1_SETTING_UP = 1;
+    final static int STATE_SERVICE2_SETTING_UP = 2;
+    final static int STATE_MAKING_SERVICE1_DEFAULT = 3;
+    final static int STATE_MAKING_SERVICE2_DEFAULT = 4;
+    final static int STATE_DEFAULT_CHANGED = 5;
+
+    boolean mReceiverRegistered = false;
+    int mState = STATE_IDLE;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        mState = STATE_SERVICE2_SETTING_UP;
+        setupServices(this, PaymentService2.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        if (mState == STATE_SERVICE2_SETTING_UP) {
+            mState = STATE_SERVICE1_SETTING_UP;
+            setupServices(this, PaymentService1.COMPONENT, PaymentService2.COMPONENT);
+            return;
+        }
+        // Verify HCE service 2 is the default
+        if (!mCardEmulation.isDefaultServiceForCategory(
+                PaymentService2.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+            mState = STATE_MAKING_SERVICE2_DEFAULT;
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Note");
+            builder.setMessage(R.string.nfc_hce_change_preinstalled_wallet);
+            builder.setPositiveButton("OK", this);
+            builder.show();
+        } else {
+            mState = STATE_MAKING_SERVICE1_DEFAULT;
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Note");
+            builder.setMessage(R.string.nfc_hce_change_default_help);
+            builder.setPositiveButton("OK", this);
+            builder.show();
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (mReceiverRegistered) {
+            unregisterReceiver(mReceiver);
+        }
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                PaymentService1.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                PaymentService1.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_change_default_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(PaymentService1.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (mState == STATE_MAKING_SERVICE1_DEFAULT) {
+            Intent changeDefault = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);
+            changeDefault.putExtra(CardEmulation.EXTRA_CATEGORY, CardEmulation.CATEGORY_PAYMENT);
+            changeDefault.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT, PaymentService1.COMPONENT);
+            startActivityForResult(changeDefault, 0);
+        } else if (mState == STATE_MAKING_SERVICE2_DEFAULT) {
+            Intent changeDefault = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);
+            changeDefault.putExtra(CardEmulation.EXTRA_CATEGORY, CardEmulation.CATEGORY_PAYMENT);
+            changeDefault.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT, PaymentService2.COMPONENT);
+            startActivityForResult(changeDefault, 0);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (mState == STATE_MAKING_SERVICE1_DEFAULT) {
+            if (!mCardEmulation.isDefaultServiceForCategory(
+                    PaymentService1.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+                // Popup dialog-box, fail test
+                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setTitle("Test failed.");
+                builder.setMessage("PaymentService1 is not the default service according " +
+                        "to CardEmulation.getDefaultServiceForCategory(), verify the make " +
+                        "default implementation is correct.");
+                builder.setPositiveButton("OK", null);
+                builder.show();
+            } else {
+                mState = STATE_DEFAULT_CHANGED;
+                NfcDialogs.createHceTapReaderDialog(this, null).show();
+            }
+        } else if (mState == STATE_MAKING_SERVICE2_DEFAULT) {
+            if (!mCardEmulation.isDefaultServiceForCategory(
+                    PaymentService2.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+                // Popup dialog-box, fail test
+                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setTitle("Test failed.");
+                builder.setMessage("PaymentService2 is not the default service according " +
+                        "to CardEmulation.getDefaultServiceForCategory(), verify the make " +
+                        "default implementation is correct.");
+                builder.setPositiveButton("OK", null);
+                builder.show();
+            } else {
+                mState = STATE_MAKING_SERVICE1_DEFAULT;
+                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setTitle("Note");
+                builder.setMessage(R.string.nfc_hce_change_default_help);
+                builder.setPositiveButton("OK", this);
+                builder.show();
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ConflictingNonPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ConflictingNonPaymentEmulatorActivity.java
new file mode 100644
index 0000000..37d5207
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ConflictingNonPaymentEmulatorActivity.java
@@ -0,0 +1,49 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+public class ConflictingNonPaymentEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setupServices(this, TransportService1.COMPONENT, TransportService2.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this,
+                getString(R.string.nfc_hce_conflicting_non_payment_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                TransportService2.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                TransportService2.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_conflicting_non_payment_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(TransportService2.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DefaultRouteEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DefaultRouteEmulatorActivity.java
new file mode 100644
index 0000000..2de99e7
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DefaultRouteEmulatorActivity.java
@@ -0,0 +1,49 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+public class DefaultRouteEmulatorActivity extends BaseEmulatorActivity {
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu("A000000476416E64726F6964484345"),
+    };
+    public static final String[] APDU_RESPONSE_SEQUENCE = {
+        "148100009000"
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this,
+                getString(R.string.nfc_hce_default_route_emulator_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS, APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES, APDU_RESPONSE_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_default_route_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualNonPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualNonPaymentEmulatorActivity.java
new file mode 100644
index 0000000..27b063c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualNonPaymentEmulatorActivity.java
@@ -0,0 +1,63 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+public class DualNonPaymentEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setupServices(this, TransportService2.COMPONENT, AccessService.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this, null).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        // Combine command/response APDU arrays
+        String[] commandSequences = new String[TransportService2.APDU_COMMAND_SEQUENCE.length +
+                                               AccessService.APDU_COMMAND_SEQUENCE.length];
+        System.arraycopy(TransportService2.APDU_COMMAND_SEQUENCE, 0, commandSequences, 0,
+                TransportService2.APDU_COMMAND_SEQUENCE.length);
+        System.arraycopy(AccessService.APDU_COMMAND_SEQUENCE, 0, commandSequences,
+                TransportService2.APDU_COMMAND_SEQUENCE.length,
+                AccessService.APDU_COMMAND_SEQUENCE.length);
+
+        String[] responseSequences = new String[TransportService2.APDU_RESPOND_SEQUENCE.length +
+                                               AccessService.APDU_RESPOND_SEQUENCE.length];
+        System.arraycopy(TransportService2.APDU_RESPOND_SEQUENCE, 0, responseSequences, 0,
+                TransportService2.APDU_RESPOND_SEQUENCE.length);
+        System.arraycopy(AccessService.APDU_RESPOND_SEQUENCE, 0, responseSequences,
+                TransportService2.APDU_RESPOND_SEQUENCE.length,
+                AccessService.APDU_RESPOND_SEQUENCE.length);
+
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS, commandSequences);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES, responseSequences);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_dual_non_payment_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(TransportService2.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualPaymentEmulatorActivity.java
new file mode 100644
index 0000000..125045f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/DualPaymentEmulatorActivity.java
@@ -0,0 +1,111 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.app.AlertDialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class DualPaymentEmulatorActivity extends BaseEmulatorActivity implements OnClickListener {
+    final static int STATE_IDLE = 0;
+    final static int STATE_SERVICE1_SETTING_UP = 1;
+    final static int STATE_SERVICE2_SETTING_UP = 2;
+    final static int STATE_MAKING_SERVICE2_DEFAULT = 3;
+
+    boolean mReceiverRegistered = false;
+    int mState = STATE_IDLE;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        mState = STATE_SERVICE2_SETTING_UP;
+        setupServices(this, PaymentService2.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        if (mState == STATE_SERVICE2_SETTING_UP) {
+            mState = STATE_SERVICE1_SETTING_UP;
+            setupServices(this, PaymentService1.COMPONENT, PaymentService2.COMPONENT);
+            return;
+        }
+        // Verify HCE service 2 is the default
+        if (!mCardEmulation.isDefaultServiceForCategory(
+                PaymentService2.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+            mState = STATE_MAKING_SERVICE2_DEFAULT;
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Note");
+            builder.setMessage(R.string.nfc_hce_change_preinstalled_wallet);
+            builder.setPositiveButton("OK", this);
+            builder.show();
+        } else {
+            NfcDialogs.createHceTapReaderDialog(this,null).show();
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if (mReceiverRegistered) {
+            unregisterReceiver(mReceiver);
+        }
+    }
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (!mCardEmulation.isDefaultServiceForCategory(
+                PaymentService2.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+            // Popup dialog-box, fail test
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Test failed.");
+            builder.setMessage("PaymentService2 is not the default service according " +
+                    "to CardEmulation.getDefaultServiceForCategory(), verify the make " +
+                    "default implementation is correct.");
+            builder.setPositiveButton("OK", null);
+            builder.show();
+        } else {
+            NfcDialogs.createHceTapReaderDialog(this, null).show();
+        }
+    }
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                PaymentService2.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                PaymentService2.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_dual_payment_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(PaymentService2.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        Intent changeDefault = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);
+        changeDefault.putExtra(CardEmulation.EXTRA_CATEGORY, CardEmulation.CATEGORY_PAYMENT);
+        changeDefault.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT, PaymentService2.COMPONENT);
+        startActivityForResult(changeDefault, 0);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceEmulatorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceEmulatorTestActivity.java
new file mode 100644
index 0000000..e85d387
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceEmulatorTestActivity.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2011 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 com.android.cts.verifier.nfc.hce;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+/** Activity that lists all the NFC HCE emulator tests. */
+public class HceEmulatorTestActivity extends PassFailButtons.TestListActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setInfoResources(R.string.nfc_test, R.string.nfc_hce_emulator_test_info, 0);
+        setPassFailButtonClickListeners();
+
+        ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+            adapter.add(TestListItem.newCategory(this, R.string.nfc_hce_emulator_tests));
+
+            /*
+             * Only add this test when supported in platform
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_default_route_emulator,
+                    DefaultRouteEmulatorActivity.class.getName(),
+                    new Intent(this, DefaultRouteEmulatorActivity.class), null));
+            */
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_protocol_params_emulator,
+                    ProtocolParamsEmulatorActivity.class.getName(),
+                    new Intent(this, ProtocolParamsEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_single_payment_emulator,
+                    SinglePaymentEmulatorActivity.class.getName(),
+                    new Intent(this, SinglePaymentEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_dual_payment_emulator,
+                    DualPaymentEmulatorActivity.class.getName(),
+                    new Intent(this, DualPaymentEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_change_default_emulator,
+                    ChangeDefaultEmulatorActivity.class.getName(),
+                    new Intent(this, ChangeDefaultEmulatorActivity.class), null));
+
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_single_non_payment_emulator,
+                    SingleNonPaymentEmulatorActivity.class.getName(),
+                    new Intent(this, SingleNonPaymentEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_dual_non_payment_emulator,
+                    DualNonPaymentEmulatorActivity.class.getName(),
+                    new Intent(this, DualNonPaymentEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_conflicting_non_payment_emulator,
+                    ConflictingNonPaymentEmulatorActivity.class.getName(),
+                    new Intent(this, ConflictingNonPaymentEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_throughput_emulator,
+                    ThroughputEmulatorActivity.class.getName(),
+                    new Intent(this, ThroughputEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_tap_test_emulator,
+                    TapTestEmulatorActivity.class.getName(),
+                    new Intent(this, TapTestEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_offhost_service_emulator,
+                    OffHostEmulatorActivity.class.getName(),
+                    new Intent(this, OffHostEmulatorActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_on_and_offhost_service_emulator,
+                    OnAndOffHostEmulatorActivity.class.getName(),
+                    new Intent(this, OnAndOffHostEmulatorActivity.class), null));
+
+        }
+
+        setTestListAdapter(adapter);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java
new file mode 100644
index 0000000..704cc89
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceReaderTestActivity.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2011 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 com.android.cts.verifier.nfc.hce;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+/** Activity that lists all the NFC HCE reader tests. */
+public class HceReaderTestActivity extends PassFailButtons.TestListActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_list);
+        setInfoResources(R.string.nfc_test, R.string.nfc_hce_reader_test_info, 0);
+        setPassFailButtonClickListeners();
+
+        ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
+            adapter.add(TestListItem.newCategory(this, R.string.nfc_hce_reader_tests));
+            /*
+             * Only add this test when supported in platform
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_default_route_reader,
+                    SimpleReaderActivity.class.getName(),
+                    DefaultRouteEmulatorActivity.buildReaderIntent(this), null));
+             */
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_protocol_params_reader,
+                    ProtocolParamsReaderActivity.class.getName(),
+                    new Intent(this, ProtocolParamsReaderActivity.class), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_single_payment_reader,
+                    SimpleReaderActivity.class.getName(),
+                    SinglePaymentEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_dual_payment_reader,
+                    SimpleReaderActivity.class.getName(),
+                    DualPaymentEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_change_default_reader,
+                    SimpleReaderActivity.class.getName(),
+                    ChangeDefaultEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_single_non_payment_reader,
+                    SimpleReaderActivity.class.getName(),
+                    SingleNonPaymentEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_dual_non_payment_reader,
+                    SimpleReaderActivity.class.getName(),
+                    DualNonPaymentEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_conflicting_non_payment_reader,
+                    SimpleReaderActivity.class.getName(),
+                    ConflictingNonPaymentEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_throughput_reader,
+                    SimpleReaderActivity.class.getName(),
+                    ThroughputEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_tap_test_reader,
+                    SimpleReaderActivity.class.getName(),
+                    TapTestEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_offhost_service_reader,
+                    SimpleReaderActivity.class.getName(),
+                    OffHostEmulatorActivity.buildReaderIntent(this), null));
+
+            adapter.add(TestListItem.newTest(this, R.string.nfc_hce_on_and_offhost_service_reader,
+                    SimpleReaderActivity.class.getName(),
+                    OnAndOffHostEmulatorActivity.buildReaderIntent(this), null));
+        }
+
+        setTestListAdapter(adapter);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceService.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceService.java
new file mode 100644
index 0000000..20b34df
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceService.java
@@ -0,0 +1,86 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.nfc.cardemulation.HostApduService;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.util.Arrays;
+
+@TargetApi(19)
+public abstract class HceService extends HostApduService {
+    final static String TAG = "HceService";
+
+    final static int STATE_IDLE = 0;
+    final static int STATE_IN_PROGRESS = 1;
+    final static int STATE_FAILED = 2;
+
+    // Variables below only used on main thread
+    String[] mCommandApdus = null;
+    String[] mResponseApdus = null;
+    int mApduIndex = 0;
+    int mState = STATE_IDLE;
+    long mStartTime;
+
+    public void initialize(String[] commandApdus, String[] responseApdus) {
+       mCommandApdus = commandApdus;
+       mResponseApdus = responseApdus;
+    }
+
+    @Override
+    public void onDeactivated(int arg0) {
+        mApduIndex = 0;
+        mState = STATE_IDLE;
+    }
+
+    public abstract ComponentName getComponent();
+
+    public void onApduSequenceComplete() {
+        Intent completionIntent = new Intent(HceUtils.ACTION_APDU_SEQUENCE_COMPLETE);
+        completionIntent.putExtra(HceUtils.EXTRA_COMPONENT, getComponent());
+        completionIntent.putExtra(HceUtils.EXTRA_DURATION,
+                System.currentTimeMillis() - mStartTime);
+        sendBroadcast(completionIntent);
+    }
+
+    public void onApduSequenceError() {
+        Intent errorIntent = new Intent(HceUtils.ACTION_APDU_SEQUENCE_ERROR);
+        sendBroadcast(errorIntent);
+    }
+
+    @Override
+    public byte[] processCommandApdu(byte[] arg0, Bundle arg1) {
+        if (mState == STATE_FAILED) {
+            // Don't accept any more APDUs until deactivated
+            return null;
+        }
+
+        if (mState == STATE_IDLE) {
+            mState = STATE_IN_PROGRESS;
+            mStartTime = System.currentTimeMillis();
+        }
+
+        if (mApduIndex >= mCommandApdus.length) {
+            Log.d(TAG, "Ignoring command APDU; protocol complete.");
+            // Ignore new APDUs after completion
+            return null;
+        } else {
+            if (!Arrays.equals(HceUtils.hexStringToBytes(mCommandApdus[mApduIndex]), arg0)) {
+                Log.d(TAG, "Unexpected command APDU: " + HceUtils.getHexBytes("", arg0));
+                onApduSequenceError();
+                return null;
+            } else {
+                // Send corresponding response APDU
+                byte[] responseApdu = HceUtils.hexStringToBytes(mResponseApdus[mApduIndex]);
+                mApduIndex++;
+                if (mApduIndex == mCommandApdus.length) {
+                    // Test passed
+                    onApduSequenceComplete();
+                }
+                return responseApdu;
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceUtils.java
new file mode 100644
index 0000000..3bab53b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/HceUtils.java
@@ -0,0 +1,68 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.content.pm.PackageManager;
+
+public final class HceUtils {
+    public static final String ACTION_APDU_SEQUENCE_COMPLETE =
+            "com.android.cts.verifier.nfc.hce.ACTION_APDU_SEQUENCE_COMPLETE";
+    public static final String ACTION_APDU_SEQUENCE_ERROR =
+            "com.android.cts.verifier.nfc.hce.ACTION_APDU_SEQUENCE_ERROR";
+
+    public static final String EXTRA_COMPONENT = "component";
+    public static final String EXTRA_DURATION = "duration";
+
+    public static final String PPSE_AID = "325041592E5359532E4444463031";
+    public static final String MC_AID = "A0000000041010";
+
+    public static final String TRANSPORT_AID = "F001020304";
+    public static final String ACCESS_AID = "F005060708";
+
+    public static void enableComponent(PackageManager pm, ComponentName component) {
+        pm.setComponentEnabledSetting(
+                component,
+                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                PackageManager.DONT_KILL_APP);
+    }
+
+    public static void disableComponent(PackageManager pm, ComponentName component) {
+        pm.setComponentEnabledSetting(
+                component,
+                PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                PackageManager.DONT_KILL_APP);
+    }
+
+    public static String getHexBytes(String header, byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        if (header != null) {
+            sb.append(header + ": ");
+        }
+        for (byte b : bytes) {
+            sb.append(String.format("%02X ", b));
+        }
+        return sb.toString();
+    }
+
+    public static byte[] hexStringToBytes(String s) {
+        if (s == null || s.length() == 0) return null;
+        int len = s.length();
+        if (len % 2 != 0) {
+            s = '0' + s;
+            len++;
+        }
+        byte[] data = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+                                 + Character.digit(s.charAt(i+1), 16));
+        }
+        return data;
+    }
+
+    public static final String buildSelectApdu(String aid) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("00A40400");
+        sb.append(String.format("%02X", aid.length() / 2));
+        sb.append(aid);
+        return sb.toString();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostEmulatorActivity.java
new file mode 100644
index 0000000..216f35a
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostEmulatorActivity.java
@@ -0,0 +1,46 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class OffHostEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        setupServices(this, OffHostService.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this, getString(R.string.nfc_hce_offhost_emulator_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                OffHostService.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                OffHostService.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_offhost_service_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostService.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostService.java
new file mode 100644
index 0000000..c087c99
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OffHostService.java
@@ -0,0 +1,23 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class OffHostService {
+    public static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+                    OffHostService.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu("A000000151000000"),
+        "80CA9F7F00",
+        HceUtils.buildSelectApdu("A000000003000000"),
+        "80CA9F7F00"
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "*",
+        "*",
+        "*",
+        "*"
+    };
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OnAndOffHostEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OnAndOffHostEmulatorActivity.java
new file mode 100644
index 0000000..3d5190f
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/OnAndOffHostEmulatorActivity.java
@@ -0,0 +1,67 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class OnAndOffHostEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setupServices(this, OffHostService.COMPONENT, AccessService.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this, getString(R.string.nfc_hce_on_and_offhost_emulator_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        // Combine command/response APDU arrays
+        String[] commandSequences = new String[OffHostService.APDU_COMMAND_SEQUENCE.length +
+                                               AccessService.APDU_COMMAND_SEQUENCE.length];
+        System.arraycopy(OffHostService.APDU_COMMAND_SEQUENCE, 0, commandSequences, 0,
+                OffHostService.APDU_COMMAND_SEQUENCE.length);
+        System.arraycopy(AccessService.APDU_COMMAND_SEQUENCE, 0, commandSequences,
+                OffHostService.APDU_COMMAND_SEQUENCE.length,
+                AccessService.APDU_COMMAND_SEQUENCE.length);
+
+        String[] responseSequences = new String[OffHostService.APDU_RESPOND_SEQUENCE.length +
+                                               AccessService.APDU_RESPOND_SEQUENCE.length];
+        System.arraycopy(OffHostService.APDU_RESPOND_SEQUENCE, 0, responseSequences, 0,
+                OffHostService.APDU_RESPOND_SEQUENCE.length);
+        System.arraycopy(AccessService.APDU_RESPOND_SEQUENCE, 0, responseSequences,
+                OffHostService.APDU_RESPOND_SEQUENCE.length,
+                AccessService.APDU_RESPOND_SEQUENCE.length);
+
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                commandSequences);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                responseSequences);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_on_and_offhost_service_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(AccessService.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService1.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService1.java
new file mode 100644
index 0000000..f6119eb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService1.java
@@ -0,0 +1,32 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class PaymentService1 extends HceService {
+    static final String TAG = "PaymentService1";
+
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            PaymentService1.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu(HceUtils.PPSE_AID),
+        HceUtils.buildSelectApdu(HceUtils.MC_AID),
+        "80CA01F000"
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "FFFF9000",
+        "FFEF9000",
+        "FFDFFFAABB9000"
+    };
+
+    public PaymentService1() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService2.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService2.java
new file mode 100644
index 0000000..23664b9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/PaymentService2.java
@@ -0,0 +1,28 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class PaymentService2 extends HceService {
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            PaymentService2.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu(HceUtils.PPSE_AID),
+        HceUtils.buildSelectApdu(HceUtils.MC_AID)
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "12349000",
+        "56789000"
+    };
+
+    public PaymentService2() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsEmulatorActivity.java
new file mode 100644
index 0000000..70842a5
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsEmulatorActivity.java
@@ -0,0 +1,32 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+public class ProtocolParamsEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(true);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        NfcDialogs.createHceTapReaderDialog(this,
+                getString(R.string.nfc_hce_protocol_params_emulator_help)).show();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsReaderActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsReaderActivity.java
new file mode 100644
index 0000000..d3504ff
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ProtocolParamsReaderActivity.java
@@ -0,0 +1,218 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcAdapter.ReaderCallback;
+import android.nfc.tech.IsoDep;
+import android.nfc.tech.NfcA;
+import android.nfc.Tag;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.IOException;
+
+@TargetApi(19)
+public class ProtocolParamsReaderActivity extends PassFailButtons.Activity implements ReaderCallback {
+    public static final String TAG = "ProtocolParamsReaderActivity";
+
+    NfcAdapter mAdapter;
+
+    TextView mTextView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+
+        setTitle(R.string.nfc_hce_protocol_params_reader);
+
+        mAdapter = NfcAdapter.getDefaultAdapter(this);
+        mTextView = (TextView) findViewById(R.id.text);
+        mTextView.setTextSize(12.0f);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A |
+                NfcAdapter.FLAG_READER_NFC_BARCODE | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
+    }
+
+    public boolean parseProtocolParameters(StringBuilder sb, byte[] uid,
+            short sak, byte[] atqa, byte[] ats) {
+
+        boolean success = true;
+
+        sb.append("UID: " + HceUtils.getHexBytes(null, uid) + "\n\n");
+        sb.append("SAK: 0x" + Integer.toHexString(sak & 0xFF) + "\n");
+
+        if ((sak & 0x20) != 0) {
+            sb.append("    (OK) ISO-DEP bit (0x20) is set.\n");
+        } else {
+            success = false;
+            sb.append("    (FAIL) ISO-DEP bit (0x20) is NOT set.\n");
+        }
+
+        if ((sak & 0x40) != 0) {
+            sb.append("    (OK) P2P bit (0x40) is set.\n");
+        } else {
+            sb.append("    (WARN) P2P bit (0x40) is NOT set.\n");
+        }
+
+        sb.append("\n");
+        sb.append("ATQA: " + HceUtils.getHexBytes(null, atqa) + "\n");
+        sb.append("\n");
+
+        sb.append("ATS: " + HceUtils.getHexBytes(null, ats) + "\n");
+        sb.append("    TL: 0x" + Integer.toHexString(ats[0] & 0xFF) + "\n");
+        sb.append("    T0: 0x" + Integer.toHexString(ats[1] & 0xFF) + "\n");
+
+        boolean ta_present = false;
+        boolean tb_present = false;
+        boolean tc_present = false;
+        int atsIndex = 1;
+        if ((ats[atsIndex] & 0x40) != 0) {
+            sb.append("        (OK) T(C) is present (bit 7 is set).\n");
+            tc_present = true;
+        } else {
+            success = false;
+            sb.append("        (FAIL) T(C) is not present (bit 7 is NOT set).\n");
+        }
+        if ((ats[atsIndex] & 0x20) != 0) {
+            sb.append("        (OK) T(B) is present (bit 6 is set).\n");
+            tb_present = true;
+        } else {
+            success = false;
+            sb.append("        (FAIL) T(B) is not present (bit 6 is NOT set).\n");
+        }
+        if ((ats[atsIndex] & 0x10) != 0) {
+            sb.append("        (OK) T(A) is present (bit 5 is set).\n");
+            ta_present = true;
+        } else {
+            success = false;
+            sb.append("        (FAIL) T(A) is not present (bit 5 is NOT set).\n");
+        }
+        int fsc = ats[atsIndex] & 0x0F;
+        if (fsc > 8) {
+            success = false;
+            sb.append("        (FAIL) FSC " + Integer.toString(fsc) + " is > 8\n");
+        } else if (fsc < 2) {
+            sb.append("        (FAIL EMVCO) FSC " + Integer.toString(fsc) + " is < 2\n");
+        } else {
+            sb.append("        (OK) FSC = " + Integer.toString(fsc) + "\n");
+        }
+
+        atsIndex++;
+        if (ta_present) {
+            sb.append("    TA: 0x" + Integer.toHexString(ats[atsIndex] & 0xff) + "\n");
+            if ((ats[atsIndex] & 0x80) != 0) {
+                sb.append("        (OK) bit 8 set, indicating only same bit rate divisor.\n");
+            } else {
+                sb.append("        (FAIL EMVCO) bit 8 NOT set, indicating support for assymetric " +
+                        "bit rate divisors. EMVCo requires bit 8 set.\n");
+            }
+            if ((ats[atsIndex] & 0x70) != 0) {
+                sb.append("        (FAIL EMVCO) EMVCo requires bits 7 to 5 set to 0.\n");
+            } else {
+                sb.append("        (OK) bits 7 to 5 indicating only 106 kbit/s L->P supported.\n");
+            }
+            if ((ats[atsIndex] & 0x7) != 0) {
+                sb.append("        (FAIL EMVCO) EMVCo requires bits 3 to 1 set to 0.\n");
+            } else {
+                sb.append("        (OK) bits 3 to 1 indicating only 106 kbit/s P->L supported.\n");
+            }
+            atsIndex++;
+        }
+
+        if (tb_present) {
+            sb.append("    TB: 0x" + Integer.toHexString(ats[3] & 0xFF) + "\n");
+            int fwi = (ats[atsIndex] & 0xF0) >> 4;
+            if (fwi > 8) {
+                success = false;
+                sb.append("        (FAIL) FWI=" + Integer.toString(fwi) + ", should be <= 8\n");
+            } else if (fwi == 8) {
+                sb.append("        (FAIL EMVCO) FWI=" + Integer.toString(fwi) +
+                        ", EMVCo requires <= 7\n");
+            } else {
+                sb.append("        (OK) FWI=" + Integer.toString(fwi) + "\n");
+            }
+            int sfgi = ats[atsIndex] & 0x0F;
+            if (sfgi > 8) {
+                success = false;
+                sb.append("        (FAIL) SFGI=" + Integer.toString(sfgi) + ", should be <= 8\n");
+            } else {
+                sb.append("        (OK) SFGI=" + Integer.toString(sfgi) + "\n");
+            }
+            atsIndex++;
+        }
+
+        if (tc_present) {
+            sb.append("    TC: 0x" + Integer.toHexString(ats[atsIndex] & 0xFF) + "\n");
+            boolean apSupported = (ats[atsIndex] & 0x10) != 0;
+            boolean didSupported = (ats[atsIndex] & 0x02) != 0;
+            boolean nadSupported = (ats[atsIndex] & 0x01) != 0;
+            if (nadSupported) {
+                success = false;
+                sb.append("        (FAIL) NAD bit is not allowed to be set.\n");
+            } else {
+                sb.append("        (OK) NAD bit is not set.\n");
+            }
+            atsIndex++;
+            // See if there's any bytes left for general bytes
+            if (atsIndex + 1 < ats.length) {
+                int bytesToCopy = ats.length - atsIndex;
+                byte[] historical_bytes = new byte[bytesToCopy];
+                System.arraycopy(ats, atsIndex, historical_bytes, 0, bytesToCopy);
+                sb.append("\n(OK) Historical bytes: " +
+                        HceUtils.getHexBytes(null, historical_bytes));
+            }
+        }
+        return success;
+    }
+
+    @Override
+    public void onTagDiscovered(Tag tag) {
+        final StringBuilder sb = new StringBuilder();
+        IsoDep isoDep = IsoDep.get(tag);
+        NfcA nfcA = NfcA.get(tag);
+        boolean success = false;
+        if (nfcA == null || isoDep == null) {
+            return;
+        }
+        try {
+            nfcA.connect();
+            byte[] ats = nfcA.transceive(new byte[] { (byte) 0xE0, (byte)0xF0});
+            success = parseProtocolParameters(sb, tag.getId(), nfcA.getSak(), nfcA.getAtqa(), ats);
+        } catch (IOException e) {
+            sb.insert(0, "Test failed. IOException (did you keep the devices in range?)\n\n.");
+        } finally {
+            if (success) {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mTextView.setText(sb.toString());
+                        getPassButton().setEnabled(true);
+                    }
+                });
+            } else {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mTextView.setText(sb.toString());
+                        getPassButton().setEnabled(false);
+                    }
+                });
+            }
+            try {
+                nfcA.transceive(new byte[] {(byte) 0xC2});
+                nfcA.close();
+                isoDep.connect();
+            } catch (IOException e) {
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SimpleReaderActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SimpleReaderActivity.java
new file mode 100644
index 0000000..6c15811
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SimpleReaderActivity.java
@@ -0,0 +1,181 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.app.AlertDialog;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcAdapter.ReaderCallback;
+import android.nfc.tech.IsoDep;
+import android.nfc.Tag;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+@TargetApi(19)
+public class SimpleReaderActivity extends PassFailButtons.Activity implements ReaderCallback,
+        OnItemSelectedListener {
+    public static final String PREFS_NAME = "HceTypePrefs";
+
+    public static final String TAG = "SimpleReaderActivity";
+    public static final String EXTRA_APDUS = "apdus";
+    public static final String EXTRA_RESPONSES = "responses";
+    public static final String EXTRA_LABEL = "label";
+
+    NfcAdapter mAdapter;
+    String[] mApdus;
+    String[] mResponses;
+
+    TextView mTextView;
+    Spinner mSpinner;
+    SharedPreferences mPrefs;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.nfc_hce_reader);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+
+        String label = getIntent().getStringExtra(EXTRA_LABEL);
+        setTitle(label);
+
+        mAdapter = NfcAdapter.getDefaultAdapter(this);
+        mTextView = (TextView) findViewById(R.id.text);
+        mTextView.setTextSize(12.0f);
+        mTextView.setText(R.string.nfc_hce_type_selection);
+
+        Spinner spinner = (Spinner) findViewById(R.id.type_ab_selection);
+        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
+                R.array.nfc_types_array, android.R.layout.simple_spinner_item);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        spinner.setAdapter(adapter);
+        spinner.setOnItemSelectedListener(this);
+
+        mPrefs = getSharedPreferences(PREFS_NAME, 0);
+        boolean isTypeB = mPrefs.getBoolean("typeB", false);
+        if (isTypeB) {
+            spinner.setSelection(1);
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A |
+                NfcAdapter.FLAG_READER_NFC_BARCODE | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
+        Intent intent = getIntent();
+        mApdus = intent.getStringArrayExtra(EXTRA_APDUS);
+        mResponses = intent.getStringArrayExtra(EXTRA_RESPONSES);
+    }
+
+    @Override
+    public void onTagDiscovered(Tag tag) {
+        final StringBuilder sb = new StringBuilder();
+        IsoDep isoDep = IsoDep.get(tag);
+        if (isoDep == null) {
+            // TODO dialog box
+            return;
+        }
+
+        try {
+            isoDep.connect();
+            isoDep.setTimeout(5000);
+            int count = 0;
+            boolean success = true;
+            long startTime = System.currentTimeMillis();
+            for (String apdu: mApdus) {
+                sb.append("Request APDU:\n");
+                sb.append(apdu + "\n\n");
+                long apduStartTime = System.currentTimeMillis();
+                byte[] response = isoDep.transceive(HceUtils.hexStringToBytes(apdu));
+                long apduEndTime = System.currentTimeMillis();
+                sb.append("Response APDU (in " + Long.toString(apduEndTime - apduStartTime) +
+                        " ms):\n");
+                sb.append(HceUtils.getHexBytes(null, response));
+
+                sb.append("\n\n\n");
+                boolean wildCard = "*".equals(mResponses[count]);
+                byte[] expectedResponse = HceUtils.hexStringToBytes(mResponses[count]);
+                Log.d(TAG, HceUtils.getHexBytes("APDU response: ", response));
+                if (!wildCard && !Arrays.equals(response, expectedResponse)) {
+                    Log.d(TAG, "Unexpected APDU response: " + HceUtils.getHexBytes("", response));
+                    success = false;
+                    break;
+                }
+                count++;
+            }
+            if (success) {
+                sb.insert(0, "Total APDU exchange time: " +
+                        Long.toString(System.currentTimeMillis() - startTime) + " ms.\n\n");
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mTextView.setText(sb.toString());
+                        getPassButton().setEnabled(true);
+                    }
+                });
+            } else {
+                sb.insert(0, "FAIL. Total APDU exchange time: " +
+                        Long.toString(System.currentTimeMillis() - startTime) + " ms.\n\n");
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        mTextView.setText(sb.toString());
+                        AlertDialog.Builder builder = new AlertDialog.Builder(SimpleReaderActivity.this);
+                        builder.setTitle("Test failed");
+                        builder.setMessage("An unexpected response APDU was received, or no APDUs were received at all.");
+                        builder.setPositiveButton("OK", null);
+                        builder.show();
+                    }
+                });
+            }
+        } catch (IOException e) {
+            sb.insert(0, "Test failed. IOException (did you keep the devices in range?)\n\n.");
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    mTextView.setText(sb.toString());
+                }
+            });
+        } finally {
+        }
+    }
+
+    @Override
+    public void onItemSelected(AdapterView<?> parent, View view, int position,
+            long id) {
+        if (position == 0) {
+            // Type-A
+            mAdapter.disableReaderMode(this);
+            mAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A |
+                NfcAdapter.FLAG_READER_NFC_BARCODE | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
+            SharedPreferences.Editor editor = mPrefs.edit();
+            editor.putBoolean("typeB", false);
+            editor.commit();
+        } else {
+            // Type-B
+            mAdapter.disableReaderMode(this);
+            mAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_B |
+                    NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
+            SharedPreferences.Editor editor = mPrefs.edit();
+            editor.putBoolean("typeB", true);
+            editor.commit();
+        }
+    }
+
+    @Override
+    public void onNothingSelected(AdapterView<?> parent) {
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SingleNonPaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SingleNonPaymentEmulatorActivity.java
new file mode 100644
index 0000000..694199b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SingleNonPaymentEmulatorActivity.java
@@ -0,0 +1,48 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+public class SingleNonPaymentEmulatorActivity extends BaseEmulatorActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setupServices(this, TransportService1.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this, null).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                TransportService1.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                TransportService1.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_single_non_payment_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(TransportService1.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SinglePaymentEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SinglePaymentEmulatorActivity.java
new file mode 100644
index 0000000..13b2fe8
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/SinglePaymentEmulatorActivity.java
@@ -0,0 +1,89 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.app.AlertDialog;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class SinglePaymentEmulatorActivity extends BaseEmulatorActivity implements OnClickListener {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        setupServices(this, PaymentService1.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        // Verify HCE service 1 is the default
+        if (!mCardEmulation.isDefaultServiceForCategory(
+                PaymentService1.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Note");
+            builder.setMessage(R.string.nfc_hce_change_preinstalled_wallet);
+            builder.setPositiveButton("OK", this);
+            builder.show();
+        } else {
+	        NfcDialogs.createHceTapReaderDialog(this, null).show();
+        }
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                PaymentService1.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                PaymentService1.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_single_payment_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(PaymentService1.COMPONENT)) {
+            getPassButton().setEnabled(true);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (!mCardEmulation.isDefaultServiceForCategory(
+                PaymentService1.COMPONENT, CardEmulation.CATEGORY_PAYMENT)) {
+            // Popup dialog-box, fail test
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle("Test failed.");
+            builder.setMessage("PaymentService1 is not the default service according " +
+                    "to CardEmulation.getDefaultServiceForCategory(), verify the make " +
+                    "default implementation is correct.");
+            builder.setPositiveButton("OK", null);
+            builder.show();
+        } else {
+            NfcDialogs.createHceTapReaderDialog(this, null).show();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        Intent changeDefault = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);
+        changeDefault.putExtra(CardEmulation.EXTRA_CATEGORY, CardEmulation.CATEGORY_PAYMENT);
+        changeDefault.putExtra(CardEmulation.EXTRA_SERVICE_COMPONENT, PaymentService1.COMPONENT);
+        startActivityForResult(changeDefault, 0);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TapTestEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TapTestEmulatorActivity.java
new file mode 100644
index 0000000..2eea89c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TapTestEmulatorActivity.java
@@ -0,0 +1,65 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class TapTestEmulatorActivity extends BaseEmulatorActivity {
+    TextView mTextView;
+    int mNumTaps;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        mTextView = (TextView) findViewById(R.id.text);
+        setupServices(this, TransportService1.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mNumTaps = 0;
+        mTextView.setText("Number of successful taps: 0/50.");
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this,
+                getString(R.string.nfc_hce_tap_test_emulator_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                TransportService1.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                TransportService1.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_tap_test_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(TransportService1.COMPONENT)) {
+            mNumTaps++;
+            if (mNumTaps <= 50) {
+                mTextView.setText("Number of successful taps: " + Integer.toString(mNumTaps) +
+                        "/50.");
+            }
+            if (mNumTaps >= 50) {
+                getPassButton().setEnabled(true);
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputEmulatorActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputEmulatorActivity.java
new file mode 100644
index 0000000..f050d77
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputEmulatorActivity.java
@@ -0,0 +1,64 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.annotation.TargetApi;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.nfc.NfcDialogs;
+
+@TargetApi(19)
+public class ThroughputEmulatorActivity extends BaseEmulatorActivity {
+    TextView mTextView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.pass_fail_text);
+        setPassFailButtonClickListeners();
+        getPassButton().setEnabled(false);
+        mTextView = (TextView) findViewById(R.id.text);
+        setupServices(this, ThroughputService.COMPONENT);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    void onServicesSetup(boolean result) {
+        NfcDialogs.createHceTapReaderDialog(this,
+                getString(R.string.nfc_hce_throughput_emulator_help)).show();
+    }
+
+    public static Intent buildReaderIntent(Context context) {
+        Intent readerIntent = new Intent(context, SimpleReaderActivity.class);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_APDUS,
+                ThroughputService.APDU_COMMAND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_RESPONSES,
+                ThroughputService.APDU_RESPOND_SEQUENCE);
+        readerIntent.putExtra(SimpleReaderActivity.EXTRA_LABEL,
+                context.getString(R.string.nfc_hce_throughput_reader));
+        return readerIntent;
+    }
+
+    @Override
+    void onApduSequenceComplete(ComponentName component, long duration) {
+        if (component.equals(ThroughputService.COMPONENT)) {
+            long timePerApdu = duration / ThroughputService.APDU_COMMAND_SEQUENCE.length;
+            if (duration < 1000) {
+                mTextView.setText("PASS. Total duration: " + Long.toString(duration) + " ms " +
+                        "( " + Long.toString(timePerApdu) + " ms per APDU roundtrip).");
+                getPassButton().setEnabled(true);
+            } else {
+                mTextView.setText("FAIL. Total duration: " + Long.toString(duration) + " ms " +
+                        "(" + Long.toString(timePerApdu) + " ms per APDU roundtrip)." +
+                        " Require <= 60ms per APDU roundtrip.");
+            }
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputService.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputService.java
new file mode 100644
index 0000000..8f826ff
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/ThroughputService.java
@@ -0,0 +1,58 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class ThroughputService extends HceService {
+    static final String TAG = "PaymentService1";
+
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            ThroughputService.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu("F0010203040607FF"),
+        "80CA010000",
+        "80CA010100",
+        "80CA010200",
+        "80CA010300",
+        "80CA010400",
+        "80CA010500",
+        "80CA010600",
+        "80CA010700",
+        "80CA010800",
+        "80CA010900",
+        "80CA010A00",
+        "80CA010B00",
+        "80CA010C00",
+        "80CA010D00",
+        "80CA010E00",
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "9000",
+        "0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0002FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0004FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "0009FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "000CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+        "000EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9000",
+    };
+
+    public ThroughputService() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
\ No newline at end of file
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService1.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService1.java
new file mode 100644
index 0000000..c751e76
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService1.java
@@ -0,0 +1,28 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class TransportService1 extends HceService {
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            TransportService1.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu(HceUtils.TRANSPORT_AID),
+        "80CA01E000"
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "80CA9000",
+        "83947102829000"
+    };
+
+    public TransportService1() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService2.java b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService2.java
new file mode 100644
index 0000000..0815b9c
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nfc/hce/TransportService2.java
@@ -0,0 +1,28 @@
+package com.android.cts.verifier.nfc.hce;
+
+import android.content.ComponentName;
+
+public class TransportService2 extends HceService {
+    static final ComponentName COMPONENT =
+            new ComponentName("com.android.cts.verifier",
+            TransportService2.class.getName());
+
+    public static final String[] APDU_COMMAND_SEQUENCE = {
+        HceUtils.buildSelectApdu(HceUtils.TRANSPORT_AID),
+        "80CA01E100"
+    };
+
+    public static final String[] APDU_RESPOND_SEQUENCE = {
+        "81CA9000",
+        "7483624748FEFE9000"
+    };
+
+    public TransportService2() {
+        initialize(APDU_COMMAND_SEQUENCE, APDU_RESPOND_SEQUENCE);
+    }
+
+    @Override
+    public ComponentName getComponent() {
+        return COMPONENT;
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java b/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
index 8549214..0b74fa3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/nls/MockListener.java
@@ -49,12 +49,12 @@
     static final int RESULT_TIMEOUT = Activity.RESULT_FIRST_USER;
     static final int RESULT_NO_SERVER = Activity.RESULT_FIRST_USER + 1;
 
-    static final String JSON_FLAGS = "flag";
-    static final String JSON_ICON = "icon";
-    static final String JSON_ID = "id";
-    static final String JSON_PACKAGE = "pkg";
-    static final String JSON_WHEN = "when";
-    static final String JSON_TAG = "tag";
+    public static final String JSON_FLAGS = "flag";
+    public static final String JSON_ICON = "icon";
+    public static final String JSON_ID = "id";
+    public static final String JSON_PACKAGE = "pkg";
+    public static final String JSON_WHEN = "when";
+    public static final String JSON_TAG = "tag";
 
     private ArrayList<String> mPosted = new ArrayList<String>();
     private ArrayList<String> mPayloads = new ArrayList<String>();
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sample/SampleTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sample/SampleTestActivity.java
new file mode 100644
index 0000000..25f90d9
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sample/SampleTestActivity.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sample;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+/**
+ * A sample CTS Verifier test case for testing file transfers using bluetooth sharing.
+ *
+ * This test assumes bluetooth is turned on and the device is already paired with a second device.
+ * Note: the second device need not be an Android device; it could be a laptop or desktop.
+ */
+public class SampleTestActivity extends PassFailButtons.Activity {
+
+    /**
+     * The name of the test file being transferred.
+     */
+    private static final String FILE_NAME = "test.txt";
+
+    /**
+     * The content of the test file being transferred.
+     */
+    private static final String TEST_STRING = "Sample Test String";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Setup the UI.
+        setContentView(R.layout.pass_fail_sample);
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.sample_test, R.string.sample_test_info, -1);
+        // Get the share button and attach the listener.
+        Button shareBtn = (Button) findViewById(R.id.sample_share_btn);
+        shareBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    createFileAndShare();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    /**
+     * Creates a temporary file containing the test string and then issues the intent to share it.
+     *
+     * @throws Exception
+     */
+    private void createFileAndShare() throws Exception {
+        // Use the external cache directory so the file will be deleted when the app is uninstalled
+        // and the file can be accessed by other apps, such as the sharing app.
+        File dir = getExternalCacheDir ();
+        // Create the file with the given name.
+        File file = new File(dir, FILE_NAME);
+        FileOutputStream outputStream = null;
+        try {
+            // Write the test string to the test file.
+            outputStream = new FileOutputStream(file);
+            outputStream.write(TEST_STRING.getBytes());
+
+            // Create the share intent.
+            Intent intent = new Intent();
+            intent.setAction(Intent.ACTION_SEND);
+            intent.setType("text/plain");
+            intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
+            startActivity(intent);
+        } finally {
+            // Clean up.
+            if (outputStream != null) {
+                outputStream.close();
+            }
+        }
+
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java
new file mode 100644
index 0000000..3e8110e
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/CAInstallNotificationVerifierActivity.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.security;
+
+import android.app.Service;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.LinkedBlockingQueue;
+
+public class CAInstallNotificationVerifierActivity extends PassFailButtons.Activity
+implements Runnable {
+    static final String TAG = CAInstallNotificationVerifierActivity.class.getSimpleName();
+    private static final String STATE = "state";
+    private static final int PASS = 1;
+    private static final int FAIL = 2;
+    private static final int WAIT_FOR_USER = 3;
+    private static LinkedBlockingQueue<String> sDeletedQueue = new LinkedBlockingQueue<String>();
+
+    private int mState;
+    private int[] mStatus;
+    private LayoutInflater mInflater;
+    private ViewGroup mItemList;
+    private Runnable mRunner;
+    private View mHandler;
+
+    private static final String CERT_ASSET_NAME = "myCA.cer";
+    private File certStagingFile = new File("/sdcard/", CERT_ASSET_NAME);
+
+    protected boolean doneInstallingCert = false;
+    protected boolean doneCheckingInSettings = false;
+    protected boolean doneCheckingNotification = false;
+    protected boolean doneDismissingNotification = false;
+
+
+    public static class DismissService extends Service {
+        @Override
+        public IBinder onBind(Intent intent) {
+            return null;
+        }
+
+        @Override
+        public void onStart(Intent intent, int startId) {
+            sDeletedQueue.offer(intent.getAction());
+        }
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState != null) {
+            mState = savedInstanceState.getInt(STATE, 0);
+        }
+        mRunner = this;
+        mInflater = getLayoutInflater();
+        View view = mInflater.inflate(R.layout.cainstallnotify_main, null);
+        mItemList = (ViewGroup) view.findViewById(R.id.ca_notify_test_items);
+        mHandler = mItemList;
+        createTestItems();
+        mStatus = new int[mItemList.getChildCount()];
+        setContentView(view);
+
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.cacert_test, R.string.cacert_info, -1);
+    }
+
+    @Override
+    protected void onSaveInstanceState (Bundle outState) {
+        outState.putInt(STATE, mState);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        next();
+    }
+
+    // Interface Utilities
+
+    private void createTestItems() {
+        createUserItem(R.string.cacert_install_cert, new InstallCert());
+        createUserItem(R.string.cacert_check_cert_in_settings, new OpenTrustedCredentials());
+        createUserItem(R.string.cacert_check_notification,
+                new DoneCheckingNotification(), R.string.cacert_done);
+        createUserItem(R.string.cacert_dismiss_notification,
+                new DoneCheckingDismissed(), R.string.cacert_done);
+    }
+
+    private void setItemState(int index, boolean passed) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.ca_notify_status);
+        status.setImageResource(passed ? R.drawable.fs_good : R.drawable.fs_error);
+        View button = item.findViewById(R.id.ca_notify_do_something);
+        button.setClickable(false);
+        button.setEnabled(false);
+        status.invalidate();
+    }
+
+    private void markItemWaiting(int index) {
+        ViewGroup item = (ViewGroup) mItemList.getChildAt(index);
+        ImageView status = (ImageView) item.findViewById(R.id.ca_notify_status);
+        status.setImageResource(R.drawable.fs_warning);
+        status.invalidate();
+    }
+
+    private View createUserItem(int stringId, OnClickListener listener) {
+        return createUserItem(stringId, listener, 0);
+    }
+
+    private View createUserItem(int stringId, OnClickListener listener, int buttonLabel) {
+        View item = mInflater.inflate(R.layout.cainstallnotify_item, mItemList, false);
+        TextView instructions = (TextView) item.findViewById(R.id.ca_notify_instructions);
+        instructions.setText(stringId);
+        Button button = (Button) item.findViewById(R.id.ca_notify_do_something);
+        if (buttonLabel != 0) {
+            button.setText(buttonLabel);
+        }
+        button.setOnClickListener(listener);
+        mItemList.addView(item);
+        return item;
+    }
+
+    // Test management
+
+    public void run() {
+        while (mState < mStatus.length && mStatus[mState] != WAIT_FOR_USER) {
+            if (mStatus[mState] == PASS) {
+                setItemState(mState, true);
+                mState++;
+            } else if (mStatus[mState] == FAIL) {
+                setItemState(mState, false);
+                return;
+            } else {
+                break;
+            }
+        }
+
+        if (mState < mStatus.length && mStatus[mState] == WAIT_FOR_USER) {
+            markItemWaiting(mState);
+        }
+
+        switch (mState) {
+            case 0:
+                testInstalledCert(0);
+                break;
+            case 1:
+                testCheckedSettings(1);
+                break;
+            case 2:
+                testCheckedNotification(2);
+                break;
+            case 3:
+                testNotificationDismissed(3);
+                break;
+        }
+    }
+
+    /**
+     * Return to the state machine to progress through the tests.
+     */
+    private void next() {
+        mHandler.post(mRunner);
+    }
+
+    /**
+     * Wait for things to settle before returning to the state machine.
+     */
+    private void delay() {
+        mHandler.postDelayed(mRunner, 2000);
+    }
+
+    // Listeners
+
+    class InstallCert implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            InputStream is = null;
+            FileOutputStream os = null;
+            try {
+                try {
+                    is = getAssets().open(CERT_ASSET_NAME);
+                    os = new FileOutputStream(certStagingFile);
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    while ((length = is.read(buffer)) > 0) {
+                        os.write(buffer, 0, length);
+                    }
+                } finally {
+                    if (is != null) is.close();
+                    if (os != null) os.close();
+                    certStagingFile.setReadable(true, false);
+                }
+            } catch (IOException ioe) {
+                Log.w(TAG, "Problem moving cert file to /sdcard/", ioe);
+                return;
+            }
+            try {
+                startActivity(new Intent("android.credentials.INSTALL"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+            doneInstallingCert = true;
+        }
+    }
+
+    class OpenTrustedCredentials implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            try {
+                startActivity(new Intent("com.android.settings.TRUSTED_CREDENTIALS_USER"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+            doneCheckingInSettings = true;
+        }
+    }
+
+    class DoneCheckingNotification implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            doneCheckingNotification = true;
+        }
+    }
+
+    class DoneCheckingDismissed implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            doneDismissingNotification = true;
+        }
+    }
+
+    // Tests
+
+    private void testInstalledCert(final int i) {
+        if (doneInstallingCert) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testCheckedSettings(final int i) {
+        if (doneCheckingInSettings) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testCheckedNotification(final int i) {
+        if (doneCheckingNotification) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+
+    private void testNotificationDismissed(final int i) {
+        if (doneDismissingNotification) {
+            mStatus[i] = PASS;
+            next();
+        } else {
+            delay();
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java
new file mode 100644
index 0000000..5537b15
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/security/CANotifyOnBootActivity.java
@@ -0,0 +1,88 @@
+package com.android.cts.verifier.security;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.Toast;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class CANotifyOnBootActivity extends PassFailButtons.Activity {
+
+    private static final String TAG = CANotifyOnBootActivity.class.getSimpleName();
+    private static final String CERT_ASSET_NAME = "myCA.cer";
+    private File certStagingFile = new File("/sdcard/", CERT_ASSET_NAME);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        View view = getLayoutInflater().inflate(R.layout.ca_boot_notify, null);
+        Button checkCredsButton = (Button) view.findViewById(R.id.check_creds);
+        Button installButton = (Button) view.findViewById(R.id.install);
+        checkCredsButton.setOnClickListener(new OpenTrustedCredentials());
+        installButton.setOnClickListener(new InstallCert());
+
+        setContentView(view);
+
+        setPassFailButtonClickListeners();
+        setInfoResources(R.string.caboot_test, R.string.caboot_info, -1);
+
+        getPassButton().setEnabled(true);
+    }
+
+    class OpenTrustedCredentials implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            try {
+                startActivity(new Intent("com.android.settings.TRUSTED_CREDENTIALS_USER"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+        }
+    }
+
+    class InstallCert implements OnClickListener {
+        @Override
+        public void onClick(View v) {
+            InputStream is = null;
+            FileOutputStream os = null;
+            try {
+                try {
+                    is = getAssets().open(CERT_ASSET_NAME);
+                    os = new FileOutputStream(certStagingFile);
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    while ((length = is.read(buffer)) > 0) {
+                        os.write(buffer, 0, length);
+                    }
+                } finally {
+                    if (is != null) is.close();
+                    if (os != null) os.close();
+                    certStagingFile.setReadable(true, false);
+                }
+            } catch (IOException ioe) {
+                Log.w(TAG, "Problem moving cert file to /sdcard/", ioe);
+                return;
+            }
+
+            try {
+                startActivity(new Intent("android.credentials.INSTALL"));
+            } catch (ActivityNotFoundException e) {
+                // do nothing
+            }
+        }
+    }
+
+
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
new file mode 100644
index 0000000..bcd00ed
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyMeasurementsOperation;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
+ */
+public class AccelerometerMeasurementTestActivity extends BaseSensorSemiAutomatedTestActivity {
+    @Override
+    protected void onRun() throws Throwable {
+        verifyMeasurements(
+                "Place the device in a flat surface with the screen facing the ceiling",
+                0, 0, SensorManager.STANDARD_GRAVITY);
+
+        delayedVerifyMeasurements(
+                "Press 'Next' and place the device in a flat surface with the screen facing it",
+                0, 0, -SensorManager.STANDARD_GRAVITY);
+
+        verifyMeasurements(
+                "Place the device in a flat surface resting vertically on its right side",
+                -SensorManager.STANDARD_GRAVITY, 0, 0);
+
+        verifyMeasurements(
+                "Place the device in a flat surface resting vertically on its left side",
+                SensorManager.STANDARD_GRAVITY, 0, 0);
+
+        verifyMeasurements(
+                "Place the device in a flat surface resting vertically on its top side",
+                0, -SensorManager.STANDARD_GRAVITY, 0);
+
+        verifyMeasurements(
+                "Place the device in a flat surface resting vertically on its bottom side",
+                0, SensorManager.STANDARD_GRAVITY, 0);
+    }
+
+    /**
+     * This test verifies that the Accelerometer measurements are close to the expected reference
+     * values (range and scale).
+     *
+     * The test takes a set of samples from the sensor under test and calculates the mean of each
+     * axis that the sensor data collects. It then compares it against the test expectations that
+     * are represented by reference values and a threshold.
+
+     * The reference values are coupled to the orientation of the device. The test is susceptible to
+     * errors when the device is not oriented properly, or the units in which the data are reported
+     * and the expectations are set are different.
+     *
+     * The error message associated with the test provides the required data needed to identify any
+     * possible issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the values representing the expectation of the test
+     * - the mean of values sampled from the sensor
+     */
+    private void verifyMeasurements(double ... expectations) throws Throwable {
+        Thread.sleep(500 /*ms*/);
+        VerifyMeasurementsOperation verifyMeasurements = new VerifyMeasurementsOperation(
+                getApplicationContext(),
+                Sensor.TYPE_ACCELEROMETER,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                0 /*reportLatencyInUs*/,
+                expectations,
+                1.95f /* m / s^2 */);
+        verifyMeasurements.execute();
+        logSuccess();
+    }
+
+    private void delayedVerifyMeasurements(
+            String message,
+            double ... expectations) throws Throwable {
+        appendText(String.format("\n%s.", message));
+        appendText("A sound will be played once the verification is complete...");
+        waitForUser();
+        Thread.sleep(TimeUnit.MILLISECONDS.convert(10, TimeUnit.SECONDS));
+
+        try {
+            verifyMeasurements(expectations);
+        } finally {
+            playSound();
+        }
+    }
+
+    private void verifyMeasurements(String message, double ... expectations) throws Throwable {
+        appendText(String.format("\n%s.", message));
+        appendText("Press 'Next' when ready and keep the device steady.");
+        waitForUser();
+
+        verifyMeasurements(expectations);
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
new file mode 100644
index 0000000..c634e16
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.method.ScrollingMovementMethod;
+import android.text.style.ForegroundColorSpan;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestResult;
+
+import java.security.InvalidParameterException;
+import java.util.concurrent.Semaphore;
+
+/**
+ * Base class to author Sensor semi-automated test cases.
+ * These tests can only wait for operators to notify at some intervals, but the test needs to be
+ * autonomous to verify the data collected.
+ */
+public abstract class BaseSensorSemiAutomatedTestActivity
+        extends Activity
+        implements View.OnClickListener, Runnable {
+    protected final String LOG_TAG = "TestRunner";
+
+    private final Semaphore mSemaphore = new Semaphore(0);
+
+    private TextView mLogView;
+    private View mNextView;
+    private Thread mWorkerThread;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.snsr_semi_auto_test);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        mLogView = (TextView) this.findViewById(R.id.log_text);
+        mNextView = this.findViewById(R.id.next_button);
+        mNextView.setOnClickListener(this);
+        mLogView.setMovementMethod(new ScrollingMovementMethod());
+
+        updateButton(false /*enabled*/);
+        mWorkerThread = new Thread(this);
+        mWorkerThread.start();
+    }
+
+    @Override
+    public void onClick(View target) {
+        mSemaphore.release();
+    }
+
+    @Override
+    public void run() {
+        String message = "";
+        SensorTestResult testResult = SensorTestResult.PASS;
+        try {
+            onRun();
+        } catch(SensorNotSupportedException e) {
+            // the sensor is not supported/available in the device, log a warning and skip the test
+            testResult = SensorTestResult.SKIPPED;
+            message = e.getMessage();
+        } catch(Throwable e) {
+            testResult = SensorTestResult.FAIL;
+            message = e.getMessage();
+        }
+        setTestResult(testResult, message);
+        appendText("\nTest completed. Press 'Next' to finish.\n");
+        waitForUser();
+        finish();
+    }
+
+    /**
+     * This is the method that subclasses will implement to define the operations that need to be
+     * verified.
+     * Any exception thrown will cause the test to fail, additionally mAssert can be used to verify
+     * the tests state.
+     *
+     * throws Throwable
+     */
+    protected abstract void onRun() throws Throwable;
+
+    /**
+     * Helper methods for subclasses to interact with the UI and the operator.
+     */
+    protected void appendText(String text, int textColor) {
+        this.runOnUiThread(new TextAppender(mLogView, text, textColor));
+    }
+
+    protected void appendText(String text) {
+        this.runOnUiThread(new TextAppender(mLogView, text));
+    }
+
+    protected void clearText() {
+        this.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mLogView.setText("");
+            }
+        });
+    }
+
+    protected void updateButton(boolean enabled) {
+        this.runOnUiThread(new ButtonEnabler(this.mNextView, enabled));
+    }
+
+    protected void waitForUser() {
+        updateButton(true);
+        try {
+            mSemaphore.acquire();
+        } catch(InterruptedException e) {}
+        updateButton(false);
+    }
+
+    protected void logSuccess() {
+        appendText("PASS", Color.GREEN);
+    }
+
+    protected void playSound() {
+        MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_NOTIFICATION_URI);
+        player.start();
+        try {
+            Thread.sleep(500);
+        } catch(InterruptedException e) {
+        } finally {
+            player.stop();
+        }
+    }
+
+    /**
+     * Private methods.
+     */
+    private String getTestId() {
+        return this.getClass().getName();
+    }
+
+    private void setTestResult(SensorTestResult testResult, String message) {
+        int textColor;
+        switch(testResult) {
+            case SKIPPED:
+                textColor = Color.YELLOW;
+                TestResult.setPassedResult(this, this.getTestId(), message);
+                break;
+            case PASS:
+                textColor = Color.GREEN;
+                TestResult.setPassedResult(this, this.getTestId(), message);
+                break;
+            case FAIL:
+                textColor = Color.RED;
+                TestResult.setFailedResult(this, this.getTestId(), message);
+                break;
+            default:
+                throw new InvalidParameterException("Unrecognized testResult.");
+        }
+        appendText(message, textColor);
+    }
+
+    private enum SensorTestResult {
+        SKIPPED,
+        PASS,
+        FAIL
+    }
+
+    private class TextAppender implements Runnable {
+        private final TextView mTextView;
+        private final SpannableStringBuilder mMessageBuilder;
+
+        public TextAppender(TextView textView, String message, int textColor) {
+            mTextView = textView;
+            mMessageBuilder = new SpannableStringBuilder(message + "\n");
+
+            ForegroundColorSpan colorSpan = new ForegroundColorSpan(textColor);
+            mMessageBuilder.setSpan(
+                    colorSpan,
+                    0 /*start*/,
+                    message.length(),
+                    Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+        }
+
+        public TextAppender(TextView textView, String message) {
+            this(textView, message, textView.getCurrentTextColor());
+        }
+
+        @Override
+        public void run() {
+            mTextView.append(mMessageBuilder);
+        }
+    }
+
+    private class ButtonEnabler implements Runnable {
+        private final View mButtonView;
+        private final boolean mButtonEnabled;
+
+        public ButtonEnabler(View buttonView, boolean buttonEnabled) {
+            mButtonView = buttonView;
+            mButtonEnabled = buttonEnabled;
+        }
+
+        @Override
+        public void run() {
+            mButtonView.setEnabled(mButtonEnabled);
+        }
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
new file mode 100644
index 0000000..4bcdd56
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.sensorTestOperations.VerifySignumOperation;
+
+/**
+ * Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
+ */
+public class GyroscopeMeasurementTestActivity extends BaseSensorSemiAutomatedTestActivity {
+    @Override
+    protected void onRun() throws Throwable {
+        appendText("Place the device in a flat surface with the screen facing the ceiling, make "
+                + "sure the device aligns with the orientation specified for each scenario. Then "
+                + "follow the instructions for each scenario:");
+
+        verifyMeasurements(
+                "leave the device static",
+                true /*portrait*/,
+                0, 0, 0);
+
+        verifyMeasurements(
+                "rotate the device clockwise",
+                true /*portrait*/,
+                0, 0, -1);
+
+        verifyMeasurements(
+                "rotate the device counter-clockwise",
+                true /*portrait*/,
+                0, 0, +1);
+
+        verifyMeasurements(
+                "rotate the device on its right until it stands on its side",
+                true /*portrait*/,
+                0, +1, 0);
+
+        verifyMeasurements(
+                "rotate the device on its left until it stands on its side",
+                true /*portrait*/,
+                0, -1, 0);
+
+        verifyMeasurements(
+                "rotate the device on its top until it stands perpendicular",
+                false /*portrait*/,
+                -1, 0, 0);
+
+        verifyMeasurements(
+                "rotate the device on its bottom until it stands perpendicular",
+                false /*portrait*/,
+                +1, 0, 0);
+    }
+
+    /**
+     * This test verifies that the Gyroscope measures angular speeds with the right direction.
+     * The test does not measure the range or scale, apart from filtering small readings that
+     * deviate from zero.
+     *
+     * The test takes a set of samples from the sensor under test and calculates the mean of each
+     * axis that the sensor data collects. It then compares it against the test expectations that
+     * are represented by signed values. It verifies that the readings have the right direction.
+
+     * The reference values are coupled to the orientation of the device. The test is susceptible to
+     * errors when the device is not oriented properly, the device has moved to slowly, or it has
+     * moved in more than the direction conducted.
+     *
+     * The error message associated with the test provides the required data needed to identify any
+     * possible issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the values representing the expectation of the test
+     * - the mean of values sampled from the sensor
+     */
+    private void verifyMeasurements(
+            String scenarioInstructions,
+            boolean usePortraitOrientation,
+            int ... expectations) throws Throwable {
+        final String orientation = usePortraitOrientation ? "Portrait": "Landscape";
+        appendText(String.format("\n[Device orientation]: %s", orientation));
+        appendText(String.format("Press 'Next' and %s.", scenarioInstructions));
+        waitForUser();
+
+        Thread.sleep(500 /*ms*/);
+        VerifySignumOperation verifySignum = new VerifySignumOperation(
+                getApplicationContext(),
+                Sensor.TYPE_GYROSCOPE,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                expectations,
+                0.2 /*noiseThreshold*/);
+        verifySignum.execute();
+        logSuccess();
+    }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
new file mode 100644
index 0000000..ffed1ab
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.verifier.sensors;
+
+import android.graphics.Color;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorManager;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyMagnitudeOperation;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyStandardDeviationOperation;
+
+/**
+ * Semi-automated test that focuses characteristics associated with Accelerometer measurements.
+ * These test cases require calibration of the sensor before performing the verifications.
+ * Also, it is recommended to execute these tests outdoors, or at least far from magnetic
+ * disturbances.
+ */
+public class MagneticFieldMeasurementTestActivity extends BaseSensorSemiAutomatedTestActivity {
+    @Override
+    protected void onRun() throws Throwable {
+        calibrateMagnetometer();
+
+        appendText("Verifying the Norm...");
+        verifyNorm();
+
+        appendText("\nVerifying the Standard Deviation...");
+        verifyStandardDeviation();
+    }
+
+    private void calibrateMagnetometer() {
+        SensorManagerTestVerifier magnetometer = new SensorManagerTestVerifier(
+                this.getApplicationContext(),
+                Sensor.TYPE_MAGNETIC_FIELD,
+                SensorManager.SENSOR_DELAY_NORMAL,
+                0 /*reportLatencyInUs*/) {
+            @Override
+            public void onSensorChanged(SensorEvent event) {
+                float values[] = event.values;
+                clearText();
+                appendText(
+                        "Please calibrate the Magnetometer by moving it in 8 shapes in different " +
+                                "orientations.");
+                appendText(
+                        String.format("->  (%.2f, %.2f, %.2f) uT", values[0], values[1], values[2]),
+                        Color.GRAY);
+                appendText("Then leave the device in a flat surface and press Next...\n");
+            }
+        };
+        magnetometer.registerListener();
+        waitForUser();
+        magnetometer.unregisterListener();
+    }
+
+    /**
+     * This test verifies that the Norm of the sensor data is close to the expected reference value.
+     * The units of the reference value are dependent on the type of sensor.
+     * This test is used to verify that the data reported by the sensor is close to the expected
+     * range and scale.
+     *
+     * The test takes a sample from the sensor under test and calculates the Euclidean Norm of the
+     * vector represented by the sampled data. It then compares it against the test expectations
+     * that are represented by a reference value and a threshold.
+     *
+     * The test is susceptible to errors when the Sensor under test is uncalibrated, or the units in
+     * which the data are reported and the expectations are set are different.
+     *
+     * The assertion associated with the test provides the required data needed to identify any
+     * possible issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the values representing the expectation of the test
+     * - the values sampled from the sensor
+     */
+    private void verifyNorm() throws Throwable {
+        float expectedMagneticFieldEarth =
+                (SensorManager.MAGNETIC_FIELD_EARTH_MAX + SensorManager.MAGNETIC_FIELD_EARTH_MIN) / 2;
+        float magneticFieldEarthThreshold =
+                expectedMagneticFieldEarth - SensorManager.MAGNETIC_FIELD_EARTH_MIN;
+        VerifyMagnitudeOperation verifyNorm = new VerifyMagnitudeOperation(
+                this.getApplicationContext(),
+                Sensor.TYPE_MAGNETIC_FIELD,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                expectedMagneticFieldEarth,
+                magneticFieldEarthThreshold);
+        verifyNorm.execute();
+        logSuccess();
+    }
+
+    /**
+     * This test verifies that the standard deviation of a set of sampled data from a particular
+     * sensor falls into the expectations defined in the CDD. The verification applies to each axis
+     * of the sampled data reported by the Sensor under test.
+     * This test is used to validate the requirement imposed by the CDD to Sensors in Android. And
+     * characterizes how the Sensor behaves while static.
+     *
+     * The test takes a set of samples from the sensor under test, and calculates the Standard
+     * Deviation for each of the axes the Sensor reports data for. The StdDev is compared against
+     * the expected value documented in the CDD.
+     *
+     * The test is susceptible to errors if the device is moving while the test is running, or if
+     * the Sensor's sampled data indeed falls into a large StdDev.
+     *
+     * The assertion associated with the test provides the required data to identify any possible
+     * issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the expectation of the test
+     * - the std dev calculated and the axis it applies to
+     * Additionally, the device's debug output (adb logcat) dumps the set of values associated with
+     * the failure to help track down the issue.
+     */
+    private void verifyStandardDeviation() throws Throwable {
+        VerifyStandardDeviationOperation verifyStdDev = new VerifyStandardDeviationOperation(
+                this.getApplicationContext(),
+                Sensor.TYPE_MAGNETIC_FIELD,
+                SensorManager.SENSOR_DELAY_FASTEST,
+                0 /*reportLatencyInUs*/,
+                2f /* uT */);
+        verifyStdDev.execute();
+        logSuccess();
+    }
+}
diff --git a/build/test_executable.mk b/build/test_executable.mk
index 8b445a3..0d42d02 100644
--- a/build/test_executable.mk
+++ b/build/test_executable.mk
@@ -27,14 +27,14 @@
 
 cts_executable_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml
 
-$(cts_executable_xml): PRIVATE_PATH := $(LOCAL_PATH)
 $(cts_executable_xml): PRIVATE_TEST_PACKAGE := $(LOCAL_CTS_TEST_PACKAGE)
 $(cts_executable_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
+$(cts_executable_xml): PRIVATE_TEST_LIST := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
 $(cts_executable_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES)) $(CTS_EXPECTATIONS) $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
 	$(hide) echo Generating test description for native package $(PRIVATE_TEST_PACKAGE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(CTS_NATIVE_TEST_SCANNER) -s $(PRIVATE_PATH) \
-						-t $(PRIVATE_TEST_PACKAGE) | \
+	$(hide) cat $(PRIVATE_TEST_LIST) | \
+			$(CTS_NATIVE_TEST_SCANNER) -t $(PRIVATE_TEST_PACKAGE) | \
 			$(CTS_XML_GENERATOR) -t native \
 						-n $(PRIVATE_EXECUTABLE) \
 						-p $(PRIVATE_TEST_PACKAGE) \
diff --git a/build/test_gtest_package.mk b/build/test_gtest_package.mk
index 2f4c9bb..cbd9414 100644
--- a/build/test_gtest_package.mk
+++ b/build/test_gtest_package.mk
@@ -21,11 +21,13 @@
 
 # Disable by default so "m cts" will work in emulator builds
 LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
 
 include $(BUILD_PACKAGE)
 
 cts_package_apk := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).apk
 cts_package_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_PACKAGE_NAME).xml
+cts_test_list := $(LOCAL_PATH)/$(LOCAL_MODULE)_list.txt
 
 $(cts_package_apk): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
 $(cts_package_apk): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk | $(ACP)
@@ -36,13 +38,14 @@
 $(cts_package_xml): PRIVATE_TEST_PACKAGE := android.$(notdir $(LOCAL_PATH))
 $(cts_package_xml): PRIVATE_EXECUTABLE := $(LOCAL_MODULE)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
-$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR)
+$(cts_package_xml): PRIVATE_TEST_LIST := $(cts_test_list)
+$(cts_package_xml): $(addprefix $(LOCAL_PATH)/,$(LOCAL_SRC_FILES))  $(CTS_NATIVE_TEST_SCANNER) $(CTS_XML_GENERATOR) $(cts_test_list)
 	$(hide) echo Generating test description for wrapped native package $(PRIVATE_EXECUTABLE)
 	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
-	$(hide) $(CTS_NATIVE_TEST_SCANNER) -s $(PRIVATE_PATH) \
-						-t $(PRIVATE_TEST_PACKAGE) | \
+	$(hide) cat $(PRIVATE_TEST_LIST) | \
+			$(CTS_NATIVE_TEST_SCANNER) -t $(PRIVATE_TEST_PACKAGE) | \
 			$(CTS_XML_GENERATOR) -t wrappednative \
-                                                -m $(PRIVATE_MANIFEST) \
+						-m $(PRIVATE_MANIFEST) \
 						-n $(PRIVATE_EXECUTABLE) \
 						-p $(PRIVATE_TEST_PACKAGE) \
 						-e $(CTS_EXPECTATIONS) \
diff --git a/build/test_package.mk b/build/test_package.mk
index 46718a8..a0adb5f 100644
--- a/build/test_package.mk
+++ b/build/test_package.mk
@@ -36,12 +36,12 @@
 $(cts_package_xml): PRIVATE_PATH := $(LOCAL_PATH)
 $(cts_package_xml): PRIVATE_INSTRUMENTATION := $(LOCAL_INSTRUMENTATION_FOR)
 $(cts_package_xml): PRIVATE_PACKAGE := $(LOCAL_PACKAGE_NAME)
-ifneq ($(filter cts/suite/pts/%, $(LOCAL_PATH)),) # PTS
-PRIVATE_CTS_TEST_PACKAGE_NANE_ := com.android.pts.$(notdir $(LOCAL_PATH))
-else # CTS
-PRIVATE_CTS_TEST_PACKAGE_NANE_ := android.$(notdir $(LOCAL_PATH))
-endif # PTS
-$(cts_package_xml): PRIVATE_TEST_PACKAGE := $(PRIVATE_CTS_TEST_PACKAGE_NANE_)
+ifneq ($(filter cts/suite/cts/%, $(LOCAL_PATH)),)
+PRIVATE_CTS_TEST_PACKAGE_NAME_ := com.android.cts.$(notdir $(LOCAL_PATH))
+else
+PRIVATE_CTS_TEST_PACKAGE_NAME_ := android.$(notdir $(LOCAL_PATH))
+endif
+$(cts_package_xml): PRIVATE_TEST_PACKAGE := $(PRIVATE_CTS_TEST_PACKAGE_NAME_)
 $(cts_package_xml): PRIVATE_MANIFEST := $(LOCAL_PATH)/AndroidManifest.xml
 $(cts_package_xml): PRIVATE_TEST_TYPE := $(if $(LOCAL_CTS_TEST_RUNNER),$(LOCAL_CTS_TEST_RUNNER),'')
 $(cts_package_xml): $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME))/package.apk $(CTS_EXPECTATIONS) $(CTS_JAVA_TEST_SCANNER_DOCLET) $(CTS_JAVA_TEST_SCANNER) $(CTS_XML_GENERATOR)
diff --git a/build/test_uiautomator.mk b/build/test_uiautomator.mk
index 255f70b..c17f12b 100644
--- a/build/test_uiautomator.mk
+++ b/build/test_uiautomator.mk
@@ -17,6 +17,8 @@
 # package XML needed by CTS.
 #
 
+LOCAL_DEX_PREOPT := false
+
 include $(BUILD_JAVA_LIBRARY)
 
 cts_library_xml := $(CTS_TESTCASES_OUT)/$(LOCAL_MODULE).xml 
diff --git a/hostsidetests/aadb/src/com/android/cts/aadb/TestDeviceStressTest.java b/hostsidetests/aadb/src/com/android/cts/aadb/TestDeviceStressTest.java
index c780fb9..2c6fcef 100644
--- a/hostsidetests/aadb/src/com/android/cts/aadb/TestDeviceStressTest.java
+++ b/hostsidetests/aadb/src/com/android/cts/aadb/TestDeviceStressTest.java
@@ -36,7 +36,7 @@
  */
 public class TestDeviceStressTest extends DeviceTestCase {
 
-    private int mIterations = 50;
+    private int mIterations = 25;
 
     private static final String LOG_TAG = "TestDeviceStressTest";
     private static final int TEST_FILE_COUNT= 200;
diff --git a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
index 5298af2..88b05fb 100644
--- a/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
+++ b/hostsidetests/appsecurity/src/com/android/cts/appsecurity/AppSecurityTests.java
@@ -17,7 +17,6 @@
 package com.android.cts.appsecurity;
 
 import com.android.cts.tradefed.build.CtsBuildHelper;
-import com.android.ddmlib.IDevice;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.testrunner.InstrumentationResultParser;
 import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
@@ -66,15 +65,16 @@
     private static final String APP_ACCESS_DATA_PKG = "com.android.cts.appaccessdata";
 
     // External storage constants
+    private static final String COMMON_EXTERNAL_STORAGE_APP_CLASS = "com.android.cts.externalstorageapp.CommonExternalStorageTest";
     private static final String EXTERNAL_STORAGE_APP_APK = "CtsExternalStorageApp.apk";
     private static final String EXTERNAL_STORAGE_APP_PKG = "com.android.cts.externalstorageapp";
-    private static final String EXTERNAL_STORAGE_APP_CLASS = EXTERNAL_STORAGE_APP_PKG
-            + ".ExternalStorageTest";
+    private static final String EXTERNAL_STORAGE_APP_CLASS = EXTERNAL_STORAGE_APP_PKG + ".ExternalStorageTest";
+    private static final String READ_EXTERNAL_STORAGE_APP_APK = "CtsReadExternalStorageApp.apk";
+    private static final String READ_EXTERNAL_STORAGE_APP_PKG = "com.android.cts.readexternalstorageapp";
+    private static final String READ_EXTERNAL_STORAGE_APP_CLASS = READ_EXTERNAL_STORAGE_APP_PKG + ".ReadExternalStorageTest";
     private static final String WRITE_EXTERNAL_STORAGE_APP_APK = "CtsWriteExternalStorageApp.apk";
-    private static final String
-            WRITE_EXTERNAL_STORAGE_APP_PKG = "com.android.cts.writeexternalstorageapp";
-    private static final String WRITE_EXTERNAL_STORAGE_APP_CLASS = WRITE_EXTERNAL_STORAGE_APP_PKG
-            + ".WriteExternalStorageTest";
+    private static final String WRITE_EXTERNAL_STORAGE_APP_PKG = "com.android.cts.writeexternalstorageapp";
+    private static final String WRITE_EXTERNAL_STORAGE_APP_CLASS = WRITE_EXTERNAL_STORAGE_APP_PKG + ".WriteExternalStorageTest";
 
     // testInstrumentationDiffCert constants
     private static final String TARGET_INSTRUMENT_APK = "CtsTargetInstrumentationApp.apk";
@@ -207,61 +207,89 @@
     }
 
     /**
-     * Test behavior when
-     * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} is unenforced.
+     * Verify that app with no external storage permissions works correctly.
      */
-    public void testReadExternalStorageUnenforced() throws Exception {
+    public void testExternalStorageNone() throws Exception {
         try {
+            wipePrimaryExternalStorage(getDevice());
+
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
-            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
-
-            // stage test file on external storage
-            getDevice().pushString("CAEK",
-                    getDevice().getMountPoint(IDevice.MNT_EXTERNAL_STORAGE) + "/meow");
-
-            // mark permission as not enforced
-            setPermissionEnforced(getDevice(), READ_EXTERNAL_STORAGE, false);
-
-            // install apps and run test
             assertNull(getDevice()
                     .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
-            assertNull(getDevice()
-                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
-
-            // normal app should be able to read
-            assertTrue("Normal app unable to read external storage", runDeviceTests(
-                    EXTERNAL_STORAGE_APP_PKG, EXTERNAL_STORAGE_APP_CLASS,
-                    "testReadExternalStorage"));
-
-            // WRITE_EXTERNAL app should be able to read and write
-            assertTrue("WRITE_EXTERNAL app unable to read external storage", runDeviceTests(
-                    WRITE_EXTERNAL_STORAGE_APP_PKG, WRITE_EXTERNAL_STORAGE_APP_CLASS,
-                    "testReadExternalStorage"));
-            assertTrue("WRITE_EXTERNAL app unable to write external storage", runDeviceTests(
-                    WRITE_EXTERNAL_STORAGE_APP_PKG, WRITE_EXTERNAL_STORAGE_APP_CLASS,
-                    "testWriteExternalStorage"));
-
+            assertTrue("Failed external storage with no permissions",
+                    runDeviceTests(EXTERNAL_STORAGE_APP_PKG));
         } finally {
             getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+        }
+    }
+
+    /**
+     * Verify that app with
+     * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} works
+     * correctly.
+     */
+    public void testExternalStorageRead() throws Exception {
+        try {
+            wipePrimaryExternalStorage(getDevice());
+
+            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
+            assertNull(getDevice()
+                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+            assertTrue("Failed external storage with read permissions",
+                    runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG));
+        } finally {
+            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
+        }
+    }
+
+    /**
+     * Verify that app with
+     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} works
+     * correctly.
+     */
+    public void testExternalStorageWrite() throws Exception {
+        try {
+            wipePrimaryExternalStorage(getDevice());
+
+            getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
+            assertNull(getDevice()
+                    .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
+            assertTrue("Failed external storage with write permissions",
+                    runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG));
+        } finally {
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
         }
     }
 
     /**
-     * Verify that legacy filesystem paths continue working, and that they all
-     * point to same location.
+     * Verify that app with WRITE_EXTERNAL can leave gifts in external storage
+     * directories belonging to other apps, and those apps can read.
      */
-    public void testExternalStorageLegacyPaths() throws Exception {
+    public void testExternalStorageGifts() throws Exception {
         try {
+            wipePrimaryExternalStorage(getDevice());
+
+            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
             assertNull(getDevice()
+                    .installPackage(getTestAppFile(EXTERNAL_STORAGE_APP_APK), false));
+            assertNull(getDevice()
+                    .installPackage(getTestAppFile(READ_EXTERNAL_STORAGE_APP_APK), false));
+            assertNull(getDevice()
                     .installPackage(getTestAppFile(WRITE_EXTERNAL_STORAGE_APP_APK), false));
 
-            assertTrue("Failed to verify legacy filesystem paths", runDeviceTests(
-                    WRITE_EXTERNAL_STORAGE_APP_PKG, WRITE_EXTERNAL_STORAGE_APP_CLASS,
-                    "testLegacyPaths"));
+            assertTrue("Failed to write gifts", runDeviceTests(WRITE_EXTERNAL_STORAGE_APP_PKG,
+                    WRITE_EXTERNAL_STORAGE_APP_CLASS, "doWriteGifts"));
+
+            assertTrue("Read failed to verify gifts", runDeviceTests(READ_EXTERNAL_STORAGE_APP_PKG,
+                    READ_EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
+            assertTrue("None failed to verify gifts", runDeviceTests(EXTERNAL_STORAGE_APP_PKG,
+                    EXTERNAL_STORAGE_APP_CLASS, "doVerifyGifts"));
 
         } finally {
+            getDevice().uninstallPackage(EXTERNAL_STORAGE_APP_PKG);
+            getDevice().uninstallPackage(READ_EXTERNAL_STORAGE_APP_PKG);
             getDevice().uninstallPackage(WRITE_EXTERNAL_STORAGE_APP_PKG);
         }
     }
@@ -542,10 +570,8 @@
         return listener.getCurrentRunResults();
     }
 
-    private static void setPermissionEnforced(
-            ITestDevice device, String permission, boolean enforced)
+    private static void wipePrimaryExternalStorage(ITestDevice device)
             throws DeviceNotAvailableException {
-        device.executeShellCommand("pm set-permission-enforced " + permission + " "
-                + Boolean.toString(enforced));
+        device.executeShellCommand("rm -rf /sdcard/*");
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
index 91d6ccf..bc99560 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/Android.mk
@@ -17,7 +17,7 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := 10
+LOCAL_SDK_VERSION := current
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_PACKAGE_NAME := CtsExternalStorageApp
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
new file mode 100644
index 0000000..f38236b
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.externalstorageapp;
+
+import android.content.Context;
+import android.os.Environment;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Tests common functionality that should be supported regardless of external
+ * storage status.
+ */
+public class CommonExternalStorageTest extends AndroidTestCase {
+    public static final String TAG = "CommonExternalStorageTest";
+
+    public static final String PACKAGE_NONE = "com.android.cts.externalstorageapp";
+    public static final String PACKAGE_READ = "com.android.cts.readexternalstorageapp";
+    public static final String PACKAGE_WRITE = "com.android.cts.writeexternalstorageapp";
+
+    /**
+     * Primary storage must always be mounted.
+     */
+    public void testExternalStorageMounted() {
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    }
+
+    /**
+     * Verify that single path is always first item in multiple.
+     */
+    public void testMultipleCacheDirs() throws Exception {
+        final File single = getContext().getExternalCacheDir();
+        assertNotNull("Primary storage must always be available", single);
+        final File firstMultiple = getContext().getExternalCacheDirs()[0];
+        assertEquals(single, firstMultiple);
+    }
+
+    /**
+     * Verify that single path is always first item in multiple.
+     */
+    public void testMultipleFilesDirs() throws Exception {
+        final File single = getContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
+        assertNotNull("Primary storage must always be available", single);
+        final File firstMultiple = getContext()
+                .getExternalFilesDirs(Environment.DIRECTORY_PICTURES)[0];
+        assertEquals(single, firstMultiple);
+    }
+
+    /**
+     * Verify that single path is always first item in multiple.
+     */
+    public void testMultipleObbDirs() throws Exception {
+        final File single = getContext().getObbDir();
+        assertNotNull("Primary storage must always be available", single);
+        final File firstMultiple = getContext().getObbDirs()[0];
+        assertEquals(single, firstMultiple);
+    }
+
+    /**
+     * Verify we can write to our own package dirs.
+     */
+    public void testAllPackageDirsWritable() throws Exception {
+        final List<File> paths = getAllPackageSpecificPaths(getContext());
+        for (File path : paths) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            assertDirReadWriteAccess(path);
+
+            final File directChild = new File(path, "directChild");
+            final File subdir = new File(path, "subdir");
+            final File subdirChild = new File(path, "subdirChild");
+
+            writeInt(directChild, 32);
+            subdir.mkdirs();
+            assertDirReadWriteAccess(subdir);
+            writeInt(subdirChild, 64);
+
+            assertEquals(32, readInt(directChild));
+            assertEquals(64, readInt(subdirChild));
+        }
+
+        for (File path : paths) {
+            deleteContents(path);
+        }
+    }
+
+    /**
+     * Return a set of several package-specific external storage paths.
+     */
+    public static List<File> getAllPackageSpecificPaths(Context context) {
+        final List<File> paths = new ArrayList<File>();
+        Collections.addAll(paths, context.getExternalCacheDirs());
+        Collections.addAll(paths, context.getExternalFilesDirs(null));
+        Collections.addAll(paths, context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES));
+        Collections.addAll(paths, context.getObbDirs());
+        return paths;
+    }
+
+    public static List<File> getAllPackageSpecificPathsExceptObb(Context context) {
+        final List<File> paths = new ArrayList<File>();
+        Collections.addAll(paths, context.getExternalCacheDirs());
+        Collections.addAll(paths, context.getExternalFilesDirs(null));
+        Collections.addAll(paths, context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES));
+        return paths;
+    }
+
+    public static List<File> getPrimaryPackageSpecificPaths(Context context) {
+        final List<File> paths = new ArrayList<File>();
+        Collections.addAll(paths, context.getExternalCacheDir());
+        Collections.addAll(paths, context.getExternalFilesDir(null));
+        Collections.addAll(paths, context.getExternalFilesDir(Environment.DIRECTORY_PICTURES));
+        Collections.addAll(paths, context.getObbDir());
+        return paths;
+    }
+
+    public static List<File> getSecondaryPackageSpecificPaths(Context context) {
+        final List<File> paths = new ArrayList<File>();
+        Collections.addAll(paths, dropFirst(context.getExternalCacheDirs()));
+        Collections.addAll(paths, dropFirst(context.getExternalFilesDirs(null)));
+        Collections.addAll(
+                paths, dropFirst(context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES)));
+        Collections.addAll(paths, dropFirst(context.getObbDirs()));
+        return paths;
+    }
+
+    private static File[] dropFirst(File[] before) {
+        final File[] after = new File[before.length - 1];
+        System.arraycopy(before, 1, after, 0, after.length);
+        return after;
+    }
+
+    public static File buildGiftForPackage(Context context, String packageName) {
+        final File myCache = context.getExternalCacheDir();
+        return new File(myCache.getAbsolutePath().replace(context.getPackageName(), packageName),
+                packageName + ".gift");
+    }
+
+    public static File buildProbeFile(File dir) {
+        return new File(dir, ".probe_" + System.nanoTime());
+    }
+
+    public static void assertDirReadOnlyAccess(File path) {
+        Log.d(TAG, "Asserting read-only access to " + path);
+
+        assertTrue("exists", path.exists());
+        assertTrue("read", path.canRead());
+        assertTrue("execute", path.canExecute());
+        assertNotNull("list", path.list());
+
+        try {
+            final File probe = buildProbeFile(path);
+            probe.createNewFile();
+            probe.delete();
+            fail("able to create probe!");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
+    public static void assertDirReadWriteAccess(File path) {
+        Log.d(TAG, "Asserting read/write access to " + path);
+
+        assertTrue("exists", path.exists());
+        assertTrue("read", path.canRead());
+        assertTrue("execute", path.canExecute());
+        assertNotNull("list", path.list());
+
+        try {
+            final File probe = buildProbeFile(path);
+            probe.createNewFile();
+            probe.delete();
+        } catch (IOException e) {
+            fail("failed to create probe!");
+        }
+    }
+
+    public static void assertDirNoAccess(File path) {
+        Log.d(TAG, "Asserting no access to " + path);
+
+        assertFalse("read", path.canRead());
+        assertNull("list", path.list());
+
+        try {
+            final File probe = buildProbeFile(path);
+            probe.createNewFile();
+            probe.delete();
+            fail("able to create probe!");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
+    public static void assertDirNoWriteAccess(File path) {
+        Log.d(TAG, "Asserting no write access to " + path);
+
+        try {
+            final File probe = buildProbeFile(path);
+            probe.createNewFile();
+            probe.delete();
+            fail("able to create probe!");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
+    public static void assertFileReadOnlyAccess(File path) {
+        try {
+            new FileInputStream(path).close();
+        } catch (IOException e) {
+            fail("failed to read!");
+        }
+
+        try {
+            new FileOutputStream(path, true).close();
+            fail("able to write!");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
+    public static void assertFileReadWriteAccess(File path) {
+        try {
+            new FileInputStream(path).close();
+        } catch (IOException e) {
+            fail("failed to read!");
+        }
+
+        try {
+            new FileOutputStream(path, true).close();
+        } catch (IOException e) {
+            fail("failed to write!");
+        }
+    }
+
+    public static void assertFileNoAccess(File path) {
+        try {
+            new FileInputStream(path).close();
+            fail("able to read!");
+        } catch (IOException e) {
+            // expected
+        }
+
+        try {
+            new FileOutputStream(path, true).close();
+            fail("able to write!");
+        } catch (IOException e) {
+            // expected
+        }
+    }
+
+    public static void deleteContents(File dir) throws IOException {
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.isDirectory()) {
+                    deleteContents(file);
+                }
+                assertTrue(file.delete());
+            }
+            assertEquals(0, dir.listFiles().length);
+        }
+    }
+
+    public static void writeInt(File file, int value) throws IOException {
+        final DataOutputStream os = new DataOutputStream(new FileOutputStream(file));
+        try {
+            os.writeInt(value);
+        } finally {
+            os.close();
+        }
+    }
+
+    public static int readInt(File file) throws IOException {
+        final DataInputStream is = new DataInputStream(new FileInputStream(file));
+        try {
+            return is.readInt();
+        } finally {
+            is.close();
+        }
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
index d42353d..425815f 100644
--- a/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/ExternalStorageApp/src/com/android/cts/externalstorageapp/ExternalStorageTest.java
@@ -16,52 +16,71 @@
 
 package com.android.cts.externalstorageapp;
 
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileNoAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+
 import android.os.Environment;
 import android.test.AndroidTestCase;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.util.List;
 
 /**
- * Test if {@link Environment#getExternalStorageDirectory()} is readable.
+ * Test external storage from an application that has no external storage
+ * permissions.
  */
 public class ExternalStorageTest extends AndroidTestCase {
 
-    private static final String TEST_FILE = "meow";
-
-    private void assertExternalStorageMounted() {
-        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    public void testPrimaryNoAccess() throws Exception {
+        assertDirNoAccess(Environment.getExternalStorageDirectory());
     }
 
-    private void readExternalStorage() throws IOException {
-        final File file = new File(Environment.getExternalStorageDirectory(), TEST_FILE);
-        final InputStream is = new FileInputStream(file);
-        try {
-            is.read();
-        } finally {
-            is.close();
+    /**
+     * Verify that above our package directories we always have no access.
+     */
+    public void testAllWalkingUpTreeNoAccess() throws Exception {
+        final List<File> paths = getAllPackageSpecificPaths(getContext());
+        final String packageName = getContext().getPackageName();
+
+        for (File path : paths) {
+            if (path == null) continue;
+
+            assertTrue(path.getAbsolutePath().contains(packageName));
+
+            // Walk up until we drop our package
+            while (path.getAbsolutePath().contains(packageName)) {
+                assertDirReadWriteAccess(path);
+                path = path.getParentFile();
+            }
+
+            // Keep walking up until we leave device
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+                assertDirNoAccess(path);
+                path = path.getParentFile();
+            }
         }
     }
 
-    public void testReadExternalStorage() throws Exception {
-        assertExternalStorageMounted();
-        try {
-            readExternalStorage();
-        } catch (IOException e) {
-            fail("unable to read external file");
-        }
-    }
+    /**
+     * Verify we can read only our gifts.
+     */
+    public void doVerifyGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        assertFileReadWriteAccess(none);
+        assertEquals(100, readInt(none));
 
-    public void testFailReadExternalStorage() throws Exception {
-        assertExternalStorageMounted();
-        try {
-            readExternalStorage();
-            fail("able read external file");
-        } catch (IOException e) {
-            // expected
-            e.printStackTrace();
-        }
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        assertFileNoAccess(read);
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        assertFileNoAccess(write);
     }
 }
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
index 8781e8b..48f88b8 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/Android.mk
@@ -17,9 +17,11 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := 16
+LOCAL_SDK_VERSION := current
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+
 LOCAL_PACKAGE_NAME := CtsMultiUserStorageApp
 
 LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
index 267bf11..2a80c75 100644
--- a/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/MultiUserStorageApp/src/com/android/cts/multiuserstorageapp/MultiUserStorageTest.java
@@ -16,16 +16,15 @@
 
 package com.android.cts.multiuserstorageapp;
 
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPathsExceptObb;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.writeInt;
+
 import android.os.Environment;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
 
 /**
  * Test multi-user emulated storage environment, ensuring that each user has
@@ -59,22 +58,44 @@
     }
 
     public void writeIsolatedStorage() throws Exception {
-        writeInt(buildApiPath(FILE_SINGLETON), android.os.Process.myUid());
-        writeInt(buildApiPath(FILE_MY_UID), android.os.Process.myUid());
+        final int uid = android.os.Process.myUid();
+
+        writeInt(buildApiPath(FILE_SINGLETON), uid);
+        writeInt(buildApiPath(FILE_MY_UID), uid);
+
+        // Write to every external path we think we have access to
+        for (File path : getAllPackageSpecificPathsExceptObb(getContext())) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            writeInt(new File(path, FILE_SINGLETON), uid);
+        }
     }
 
     public void readIsolatedStorage() throws Exception {
+        final int uid = android.os.Process.myUid();
+
         // Expect that the value we wrote earlier is still valid and wasn't
         // overwritten by us running as another user.
-        assertEquals("Failed to read singleton file from API path", android.os.Process.myUid(),
+        assertEquals("Failed to read singleton file from API path", uid,
                 readInt(buildApiPath(FILE_SINGLETON)));
-        assertEquals("Failed to read singleton file from env path", android.os.Process.myUid(),
+        assertEquals("Failed to read singleton file from env path", uid,
                 readInt(buildEnvPath(FILE_SINGLETON)));
-        assertEquals("Failed to read singleton file from raw path", android.os.Process.myUid(),
+        assertEquals("Failed to read singleton file from raw path", uid,
                 readInt(buildRawPath(FILE_SINGLETON)));
 
-        assertEquals("Failed to read UID file from API path", android.os.Process.myUid(),
+        assertEquals("Failed to read UID file from API path", uid,
                 readInt(buildApiPath(FILE_MY_UID)));
+
+        for (File path : getAllPackageSpecificPathsExceptObb(getContext())) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            assertEquals("Unexpected value in singleton file at " + path, uid,
+                    readInt(new File(path, FILE_SINGLETON)));
+        }
     }
 
     public void cleanObbStorage() throws Exception {
@@ -119,22 +140,4 @@
     private static File buildRawPath(String file) {
         return new File("/sdcard/", file);
     }
-
-    private static void writeInt(File file, int value) throws IOException {
-        final DataOutputStream os = new DataOutputStream(new FileOutputStream(file));
-        try {
-            os.writeInt(value);
-        } finally {
-            os.close();
-        }
-    }
-
-    private static int readInt(File file) throws IOException {
-        final DataInputStream is = new DataInputStream(new FileInputStream(file));
-        try {
-            return is.readInt();
-        } finally {
-            is.close();
-        }
-    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
index 31a3f47..46e1dff 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
@@ -19,27 +19,82 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.UriPermission;
+import android.net.Uri;
 import android.util.Log;
 
+import java.util.List;
+
 public class GrantUriPermission extends BroadcastReceiver {
+    public static final String ACTION_GRANT_URI = "grantUri";
+    public static final String ACTION_REVOKE_URI = "revokeUri";
+    public static final String ACTION_START_ACTIVITY = "startActivity";
+    public static final String ACTION_START_SERVICE = "startService";
+    public static final String ACTION_VERIFY_OUTGOING_PERSISTED = "verifyOutgoingPersisted";
+
+    public static final String EXTRA_PACKAGE_NAME = "packageName";
+    public static final String EXTRA_INTENT = Intent.EXTRA_INTENT;
+    public static final String EXTRA_URI = "uri";
+    public static final String EXTRA_MODE = "mode";
+
+    public static final int SUCCESS = 101;
+    public static final int FAILURE = 100;
+
     @Override
     public void onReceive(Context context, Intent intent) {
-        Intent newIntent = (Intent)intent.getParcelableExtra("intent");
-        boolean service = intent.getBooleanExtra("service", false);
         try {
-            if (!service) {
+            final String action = intent.getAction();
+            if (ACTION_GRANT_URI.equals(action)) {
+                final Uri uri = intent.getParcelableExtra(EXTRA_URI);
+                context.grantUriPermission(intent.getStringExtra(EXTRA_PACKAGE_NAME), uri,
+                        intent.getIntExtra(EXTRA_MODE, 0));
+
+            } else if (ACTION_REVOKE_URI.equals(action)) {
+                final Uri uri = intent.getParcelableExtra(EXTRA_URI);
+                context.revokeUriPermission(uri, intent.getIntExtra(EXTRA_MODE, 0));
+
+            } else if (ACTION_START_ACTIVITY.equals(action)) {
+                final Intent newIntent = intent.getParcelableExtra(EXTRA_INTENT);
                 newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 context.startActivity(newIntent);
-            } else {
+
+            } else if (ACTION_START_SERVICE.equals(action)) {
+                final Intent newIntent = intent.getParcelableExtra(EXTRA_INTENT);
                 context.startService(newIntent);
+
+            } else if (ACTION_VERIFY_OUTGOING_PERSISTED.equals(action)) {
+                verifyOutgoingPersisted(context, intent);
             }
+
             if (isOrderedBroadcast()) {
-                setResultCode(101);
+                setResultCode(SUCCESS);
             }
         } catch (SecurityException e) {
             Log.i("GrantUriPermission", "Security exception", e);
             if (isOrderedBroadcast()) {
-                setResultCode(100);
+                setResultCode(FAILURE);
+            }
+        }
+    }
+
+    private void verifyOutgoingPersisted(Context context, Intent intent) {
+        final Uri uri = intent.getParcelableExtra(EXTRA_URI);
+        final List<UriPermission> perms = context.getContentResolver()
+                .getOutgoingPersistedUriPermissions();
+        if (uri != null) {
+            // Should have a single persisted perm
+            if (perms.size() != 1) {
+                throw new SecurityException("Missing grant");
+            }
+            final UriPermission perm = perms.get(0);
+            if (!perm.getUri().equals(uri)) {
+                throw new SecurityException(
+                        "Expected " + uri + " but found " + perm.getUri());
+            }
+        } else {
+            // Should have zero persisted perms
+            if (perms.size() != 0) {
+                throw new SecurityException("Unexpected grant");
             }
         }
     }
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
new file mode 100644
index 0000000..44e4bef
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/Android.mk
@@ -0,0 +1,29 @@
+# Copyright (C) 2013 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_TAGS := tests
+LOCAL_SDK_VERSION := current
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+
+LOCAL_PACKAGE_NAME := CtsReadExternalStorageApp
+
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_PACKAGE)
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/AndroidManifest.xml
new file mode 100644
index 0000000..f6582b9
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+       package="com.android.cts.readexternalstorageapp">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+        android:targetPackage="com.android.cts.readexternalstorageapp" />
+
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
+</manifest>
diff --git a/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
new file mode 100644
index 0000000..bbd1e7a
--- /dev/null
+++ b/hostsidetests/appsecurity/test-apps/ReadExternalStorageApp/src/com/android/cts/readexternalstorageapp/ReadExternalStorageTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.readexternalstorageapp;
+
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadOnlyAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadOnlyAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+
+import android.os.Environment;
+import android.test.AndroidTestCase;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Test external storage from an application that has
+ * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}.
+ */
+public class ReadExternalStorageTest extends AndroidTestCase {
+
+    public void testPrimaryReadOnly() throws Exception {
+        assertDirReadOnlyAccess(Environment.getExternalStorageDirectory());
+    }
+
+    /**
+     * Verify that above our package directories we always have read only
+     * access.
+     */
+    public void testAllWalkingUpTreeReadOnly() throws Exception {
+        final List<File> paths = getAllPackageSpecificPaths(getContext());
+        final String packageName = getContext().getPackageName();
+
+        for (File path : paths) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            assertTrue(path.getAbsolutePath().contains(packageName));
+
+            // Walk up until we drop our package
+            while (path.getAbsolutePath().contains(packageName)) {
+                assertDirReadWriteAccess(path);
+                path = path.getParentFile();
+            }
+
+            // Keep walking up until we leave device
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+                assertDirReadOnlyAccess(path);
+                path = path.getParentFile();
+            }
+        }
+    }
+
+    /**
+     * Verify we can read all gifts.
+     */
+    public void doVerifyGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        assertFileReadOnlyAccess(none);
+        assertEquals(100, readInt(none));
+
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        assertFileReadWriteAccess(read);
+        assertEquals(101, readInt(read));
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        assertFileReadOnlyAccess(write);
+        assertEquals(102, readInt(write));
+    }
+}
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
index acf9f6f..d836042 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/Android.mk
@@ -18,7 +18,8 @@
 
 LOCAL_MODULE_TAGS := tests
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../PermissionDeclareApp/src/com/android/cts/permissiondeclareapp/GrantUriPermission.java
 
 LOCAL_SDK_VERSION := current
 
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
index 8f40cf1..db26eec 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
@@ -23,13 +23,17 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.content.UriPermission;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.SystemClock;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
+import com.android.cts.permissiondeclareapp.GrantUriPermission;
+
 import java.io.IOException;
+import java.util.List;
 
 /**
  * Tests that signature-enforced permissions cannot be accessed by apps signed
@@ -54,6 +58,14 @@
     private static final String EXPECTED_MIME_TYPE_AMBIGUOUS = "got/theUnspecifiedMIME";
     private static final Uri AMBIGUOUS_URI = Uri.parse("content://ctsambiguousprovider");
 
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        // Always dispose, usually to clean up from failed tests
+        ReceiveUriActivity.finishCurInstanceSync();
+    }
+
     private void assertReadingContentUriNotAllowed(Uri uri, String msg) {
         try {
             getContext().getContentResolver().query(uri, null, null, null, null);
@@ -423,11 +435,11 @@
             synchronized (this) {
                 mHaveResult = true;
                 switch (getResultCode()) {
-                    case 100:
+                    case GrantUriPermission.FAILURE:
                         mGoodResult = true;
                         mSucceeded = false;
                         break;
-                    case 101:
+                    case GrantUriPermission.SUCCESS:
                         mGoodResult = true;
                         mSucceeded = true;
                         break;
@@ -491,8 +503,9 @@
                 service ? ReceiveUriService.class : ReceiveUriActivity.class);
         Intent intent = new Intent();
         intent.setComponent(GRANT_URI_PERM_COMP);
-        intent.putExtra("intent", grantIntent);
-        intent.putExtra("service", service);
+        intent.setAction(service ? GrantUriPermission.ACTION_START_SERVICE
+                : GrantUriPermission.ACTION_START_ACTIVITY);
+        intent.putExtra(GrantUriPermission.EXTRA_INTENT, grantIntent);
         GrantResultReceiver receiver = new GrantResultReceiver();
         getContext().sendOrderedBroadcast(intent, null, receiver, null, 0, null, null);
         receiver.assertFailure("Able to grant URI permission to " + grantDataUri + " when should not");
@@ -502,8 +515,9 @@
                 service ? ReceiveUriService.class : ReceiveUriActivity.class);
         intent = new Intent();
         intent.setComponent(GRANT_URI_PERM_COMP);
-        intent.putExtra("intent", grantIntent);
-        intent.putExtra("service", service);
+        intent.setAction(service ? GrantUriPermission.ACTION_START_SERVICE
+                : GrantUriPermission.ACTION_START_ACTIVITY);
+        intent.putExtra(GrantUriPermission.EXTRA_INTENT, grantIntent);
         receiver = new GrantResultReceiver();
         getContext().sendOrderedBroadcast(intent, null, receiver, null, 0, null, null);
         receiver.assertFailure("Able to grant URI permission to " + grantIntent.getClipData()
@@ -578,8 +592,9 @@
                 service ? ReceiveUriService.class : ReceiveUriActivity.class);
         Intent intent = new Intent();
         intent.setComponent(GRANT_URI_PERM_COMP);
-        intent.putExtra("intent", grantIntent);
-        intent.putExtra("service", service);
+        intent.setAction(service ? GrantUriPermission.ACTION_START_SERVICE
+                : GrantUriPermission.ACTION_START_ACTIVITY);
+        intent.putExtra(GrantUriPermission.EXTRA_INTENT, grantIntent);
         getContext().sendBroadcast(intent);
     }
 
@@ -843,7 +858,7 @@
         doTestGrantActivityUriWritePermission(PRIV_URI_GRANTING, false);
     }
 
-    void doTestGrantServiceUriReadPermission(Uri uri, boolean useClip) {
+    private void doTestGrantServiceUriReadPermission(Uri uri, boolean useClip) {
         final Uri subUri = Uri.withAppendedPath(uri, "foo");
         final Uri subSubUri = Uri.withAppendedPath(subUri, "bar");
         final Uri sub2Uri = Uri.withAppendedPath(uri, "yes");
@@ -1207,4 +1222,137 @@
         assertEquals(EXPECTED_MIME_TYPE_AMBIGUOUS,
                 getContext().getContentResolver().getType(AMBIGUOUS_URI_COMPAT));
     }
+
+    /**
+     * Validate behavior of persistable permission grants.
+     */
+    public void testGrantPersistableUriPermission() {
+        final ContentResolver resolver = getContext().getContentResolver();
+
+        final Uri target = Uri.withAppendedPath(PERM_URI_GRANTING, "foo");
+        final ClipData clip = makeSingleClipData(target);
+
+        // Make sure we can't see the target
+        assertReadingClipNotAllowed(clip, "reading should have failed");
+        assertWritingClipNotAllowed(clip, "writing should have failed");
+
+        // Make sure we can't take a grant we don't have
+        try {
+            resolver.takePersistableUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            fail("taking read should have failed");
+        } catch (SecurityException expected) {
+        }
+
+        // And since we were just installed, no persisted grants yet
+        assertNoPersistedUriPermission();
+
+        // Now, let's grant ourselves some access
+        ReceiveUriActivity.clearStarted();
+        grantClipUriPermission(clip, Intent.FLAG_GRANT_READ_URI_PERMISSION
+                | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
+        ReceiveUriActivity.waitForStart();
+
+        // We should now have reading access, even before taking the persistable
+        // grant. Persisted grants should still be empty.
+        assertReadingClipAllowed(clip);
+        assertWritingClipNotAllowed(clip, "writing should have failed");
+        assertNoPersistedUriPermission();
+
+        // Take the read grant and verify we have it!
+        long before = System.currentTimeMillis();
+        resolver.takePersistableUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        long after = System.currentTimeMillis();
+        assertPersistedUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION, before, after);
+
+        // Make sure we can't take a grant we don't have
+        try {
+            resolver.takePersistableUriPermission(target, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+            fail("taking write should have failed");
+        } catch (SecurityException expected) {
+        }
+
+        // Launch again giving ourselves persistable read and write access
+        ReceiveUriActivity.clearNewIntent();
+        grantClipUriPermission(clip, Intent.FLAG_GRANT_READ_URI_PERMISSION
+                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+                | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
+        ReceiveUriActivity.waitForNewIntent();
+
+        // Previous persisted grant should be unchanged
+        assertPersistedUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION, before, after);
+
+        // We should have both read and write; read is persisted, and write
+        // isn't persisted yet.
+        assertReadingClipAllowed(clip);
+        assertWritingClipAllowed(clip);
+
+        // Take again, but still only read; should just update timestamp
+        before = System.currentTimeMillis();
+        resolver.takePersistableUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        after = System.currentTimeMillis();
+        assertPersistedUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION, before, after);
+
+        // And take yet again, both read and write
+        before = System.currentTimeMillis();
+        resolver.takePersistableUriPermission(target,
+                Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        after = System.currentTimeMillis();
+        assertPersistedUriPermission(target,
+                Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
+                before, after);
+
+        // Now drop the persisted grant; write first, then read
+        resolver.releasePersistableUriPermission(target, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        assertPersistedUriPermission(target, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, before, after);
+        resolver.releasePersistableUriPermission(target, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+        assertNoPersistedUriPermission();
+
+        // And even though we dropped the persistable grants, our activity is
+        // still running with the global grants (until reboot).
+        assertReadingClipAllowed(clip);
+        assertWritingClipAllowed(clip);
+
+        ReceiveUriActivity.finishCurInstanceSync();
+    }
+
+    private void assertNoPersistedUriPermission() {
+        assertPersistedUriPermission(null, 0, -1, -1);
+    }
+
+    private void assertPersistedUriPermission(Uri uri, int flags, long before, long after) {
+        // Assert local
+        final List<UriPermission> perms = getContext()
+                .getContentResolver().getPersistedUriPermissions();
+        if (uri != null) {
+            assertEquals("expected exactly one permission", 1, perms.size());
+
+            final UriPermission perm = perms.get(0);
+            assertEquals("unexpected uri", uri, perm.getUri());
+
+            final long actual = perm.getPersistedTime();
+            if (before != -1) {
+                assertTrue("found " + actual + " before " + before, actual >= before);
+            }
+            if (after != -1) {
+                assertTrue("found " + actual + " after " + after, actual <= after);
+            }
+
+            final boolean expectedRead = (flags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0;
+            final boolean expectedWrite = (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0;
+            assertEquals("unexpected read status", expectedRead, perm.isReadPermission());
+            assertEquals("unexpected write status", expectedWrite, perm.isWritePermission());
+
+        } else {
+            assertEquals("expected zero permissions", 0, perms.size());
+        }
+
+        // And assert remote
+        Intent intent = new Intent();
+        intent.setComponent(GRANT_URI_PERM_COMP);
+        intent.setAction(GrantUriPermission.ACTION_VERIFY_OUTGOING_PERSISTED);
+        intent.putExtra(GrantUriPermission.EXTRA_URI, uri);
+        GrantResultReceiver receiver = new GrantResultReceiver();
+        getContext().sendOrderedBroadcast(intent, null, receiver, null, 0, null, null);
+        receiver.assertSuccess("unexpected outgoing persisted Uri status");
+    }
 }
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
index 851d8da..dd9a5c5 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/ReceiveUriActivity.java
@@ -32,7 +32,7 @@
     private static final Object sLock = new Object();
     private static boolean sStarted;
     private static boolean sNewIntent;
-    private static boolean sDestroyed;
+    private static boolean sDestroyed = true;
     private static ReceiveUriActivity sCurInstance;
 
     private static final long TIMEOUT_MILLIS = 30 * SECOND_IN_MILLIS;
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
index 9e056a9..4352bfb 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/Android.mk
@@ -17,9 +17,11 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := 10
+LOCAL_SDK_VERSION := current
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    ../ExternalStorageApp/src/com/android/cts/externalstorageapp/CommonExternalStorageTest.java
+
 LOCAL_PACKAGE_NAME := CtsWriteExternalStorageApp
 
 LOCAL_DEX_PREOPT := false
diff --git a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
index 3f103b6..6857236 100644
--- a/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
+++ b/hostsidetests/appsecurity/test-apps/WriteExternalStorageApp/src/com/android/cts/writeexternalstorageapp/WriteExternalStorageTest.java
@@ -16,19 +16,38 @@
 
 package com.android.cts.writeexternalstorageapp;
 
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_NONE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_READ;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.PACKAGE_WRITE;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.TAG;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirNoWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadOnlyAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertDirReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.assertFileReadWriteAccess;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildGiftForPackage;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.buildProbeFile;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.deleteContents;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getAllPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getPrimaryPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.getSecondaryPackageSpecificPaths;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.readInt;
+import static com.android.cts.externalstorageapp.CommonExternalStorageTest.writeInt;
+
 import android.os.Environment;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
+import com.android.cts.externalstorageapp.CommonExternalStorageTest;
+
+import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.FileReader;
+import java.util.List;
 import java.util.Random;
 
 /**
- * Test if {@link Environment#getExternalStorageDirectory()} is writable.
+ * Test external storage from an application that has
+ * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE}.
  */
 public class WriteExternalStorageTest extends AndroidTestCase {
 
@@ -57,6 +76,10 @@
         }
     }
 
+    private void assertExternalStorageMounted() {
+        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    }
+
     public void testReadExternalStorage() throws Exception {
         assertExternalStorageMounted();
         Environment.getExternalStorageDirectory().list();
@@ -93,25 +116,207 @@
         }
     }
 
-    private static void assertExternalStorageMounted() {
-        assertEquals(Environment.MEDIA_MOUNTED, Environment.getExternalStorageState());
+    public void testPrimaryReadWrite() throws Exception {
+        assertDirReadWriteAccess(Environment.getExternalStorageDirectory());
     }
 
-    private static void writeInt(File file, int value) throws IOException {
-        final DataOutputStream os = new DataOutputStream(new FileOutputStream(file));
-        try {
-            os.writeInt(value);
-        } finally {
-            os.close();
+    /**
+     * Verify that above our package directories (on primary storage) we always
+     * have write access.
+     */
+    public void testPrimaryWalkingUpTreeReadWrite() throws Exception {
+        final List<File> paths = getPrimaryPackageSpecificPaths(getContext());
+        final String packageName = getContext().getPackageName();
+
+        for (File path : paths) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            assertTrue(path.getAbsolutePath().contains(packageName));
+
+            // Walk until we leave device, writing the whole way
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+                assertDirReadWriteAccess(path);
+                path = path.getParentFile();
+            }
         }
     }
 
-    private static int readInt(File file) throws IOException {
-        final DataInputStream is = new DataInputStream(new FileInputStream(file));
-        try {
-            return is.readInt();
-        } finally {
-            is.close();
+    /**
+     * Verify that we have write access in other packages on primary external
+     * storage.
+     */
+    public void testPrimaryOtherPackageWriteAccess() throws Exception {
+        deleteContents(Environment.getExternalStorageDirectory());
+
+        final File ourCache = getContext().getExternalCacheDir();
+        final File otherCache = new File(ourCache.getAbsolutePath()
+                .replace(getContext().getPackageName(), PACKAGE_NONE));
+
+        assertTrue(otherCache.mkdirs());
+        assertDirReadWriteAccess(otherCache);
+    }
+
+    /**
+     * Verify we have valid mount status until we leave the device.
+     */
+    public void testMountStatusWalkingUpTree() {
+        final File top = Environment.getExternalStorageDirectory();
+        File path = getContext().getExternalCacheDir();
+
+        int depth = 0;
+        while (depth++ < 32) {
+            assertDirReadWriteAccess(path);
+            assertEquals(Environment.MEDIA_MOUNTED, Environment.getStorageState(path));
+
+            if (path.getAbsolutePath().equals(top.getAbsolutePath())) {
+                break;
+            }
+
+            path = path.getParentFile();
         }
+
+        // Make sure we hit the top
+        assertEquals(top.getAbsolutePath(), path.getAbsolutePath());
+
+        // And going one step further should be outside our reach
+        path = path.getParentFile();
+        assertDirNoWriteAccess(path);
+        assertEquals(Environment.MEDIA_UNKNOWN, Environment.getStorageState(path));
+    }
+
+    /**
+     * Verify mount status for random paths.
+     */
+    public void testMountStatus() {
+        assertEquals(Environment.MEDIA_UNKNOWN,
+                Environment.getStorageState(new File("/meow-should-never-exist")));
+
+        // Internal data isn't a mount point
+        assertEquals(Environment.MEDIA_UNKNOWN,
+                Environment.getStorageState(getContext().getCacheDir()));
+    }
+
+    /**
+     * Verify that we have write access in our package-specific directories on
+     * secondary storage devices, but it becomes read-only access above them.
+     */
+    public void testSecondaryWalkingUpTreeReadOnly() throws Exception {
+        final List<File> paths = getSecondaryPackageSpecificPaths(getContext());
+        final String packageName = getContext().getPackageName();
+
+        for (File path : paths) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            assertTrue(path.getAbsolutePath().contains(packageName));
+
+            // Walk up until we drop our package
+            while (path.getAbsolutePath().contains(packageName)) {
+                assertDirReadWriteAccess(path);
+                path = path.getParentFile();
+            }
+
+            // Keep walking up until we leave device
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+                assertDirReadOnlyAccess(path);
+                path = path.getParentFile();
+            }
+        }
+    }
+
+    /**
+     * Verify that .nomedia is created correctly.
+     */
+    public void testVerifyNoMediaCreated() throws Exception {
+        deleteContents(Environment.getExternalStorageDirectory());
+
+        final List<File> paths = getAllPackageSpecificPaths(getContext());
+
+        // Require that .nomedia was created somewhere above each dir
+        for (File path : paths) {
+            assertNotNull("Valid media must be inserted during CTS", path);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(path));
+
+            final File start = path;
+
+            boolean found = false;
+            while (Environment.MEDIA_MOUNTED.equals(Environment.getStorageState(path))) {
+                final File test = new File(path, ".nomedia");
+                if (test.exists()) {
+                    found = true;
+                    break;
+                }
+                path = path.getParentFile();
+            }
+
+            if (!found) {
+                fail("Missing .nomedia file above package-specific directory " + start
+                        + "; gave up at " + path);
+            }
+        }
+    }
+
+    /**
+     * Secondary external storage mount points must always be read-only, per
+     * CDD, <em>except</em> for the package specific directories tested by
+     * {@link CommonExternalStorageTest#testAllPackageDirsWritable()}.
+     */
+    public void testSecondaryMountPointsNotWritable() throws Exception {
+        final File probe = buildProbeFile(Environment.getExternalStorageDirectory());
+        assertTrue(probe.createNewFile());
+
+        final BufferedReader br = new BufferedReader(new FileReader("/proc/self/mounts"));
+        try {
+            String line;
+            while ((line = br.readLine()) != null) {
+                final String[] fields = line.split(" ");
+                final File testMount = new File(fields[1]);
+                final File testProbe = new File(testMount, probe.getName());
+                if (testProbe.exists()) {
+                    Log.d(TAG, "Primary external mountpoint " + testMount);
+                } else {
+                    // This mountpoint is not primary external storage; we must
+                    // not be able to write.
+                    Log.d(TAG, "Other mountpoint " + testMount);
+                    assertDirNoWriteAccess(testProbe.getParentFile());
+                }
+            }
+       } finally {
+           br.close();
+           probe.delete();
+       }
+    }
+
+    /**
+     * Leave gifts for other packages in their primary external cache dirs.
+     */
+    public void doWriteGifts() throws Exception {
+        final File none = buildGiftForPackage(getContext(), PACKAGE_NONE);
+        none.getParentFile().mkdirs();
+        none.createNewFile();
+        assertFileReadWriteAccess(none);
+
+        writeInt(none, 100);
+        assertEquals(100, readInt(none));
+
+        final File read = buildGiftForPackage(getContext(), PACKAGE_READ);
+        read.getParentFile().mkdirs();
+        read.createNewFile();
+        assertFileReadWriteAccess(read);
+
+        writeInt(read, 101);
+        assertEquals(101, readInt(read));
+
+        final File write = buildGiftForPackage(getContext(), PACKAGE_WRITE);
+        write.getParentFile().mkdirs();
+        write.createNewFile();
+        assertFileReadWriteAccess(write);
+
+        writeInt(write, 102);
+        assertEquals(102, readInt(write));
     }
 }
diff --git a/hostsidetests/sample/Android.mk b/hostsidetests/sample/Android.mk
new file mode 100644
index 0000000..1d3ddc8
--- /dev/null
+++ b/hostsidetests/sample/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2014 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_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_MODULE := CtsSampleHostTestCases
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed ddmlib-prebuilt tradefed-prebuilt
+
+LOCAL_CTS_TEST_PACKAGE := android.host.sample
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/sample/app/Android.mk b/hostsidetests/sample/app/Android.mk
new file mode 100644
index 0000000..4af45b9
--- /dev/null
+++ b/hostsidetests/sample/app/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2014 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)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsSampleDeviceApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/sample/app/AndroidManifest.xml b/hostsidetests/sample/app/AndroidManifest.xml
new file mode 100755
index 0000000..c087435
--- /dev/null
+++ b/hostsidetests/sample/app/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2014 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.sample.app">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <application>
+        <activity android:name=".SampleDeviceActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
+
diff --git a/hostsidetests/sample/app/src/android/sample/app/SampleDeviceActivity.java b/hostsidetests/sample/app/src/android/sample/app/SampleDeviceActivity.java
new file mode 100644
index 0000000..d7efc0c
--- /dev/null
+++ b/hostsidetests/sample/app/src/android/sample/app/SampleDeviceActivity.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2014 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 android.sample.app;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.lang.Override;
+
+/**
+ * A simple activity which logs to Logcat.
+ */
+public class SampleDeviceActivity extends Activity {
+
+    private static final String TAG = SampleDeviceActivity.class.getSimpleName();
+
+    /**
+     * The test string to log.
+     */
+    private static final String TEST_STRING = "SampleTestString";
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        // Log the test string to Logcat.
+        Log.i(TAG, TEST_STRING);
+    }
+
+}
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
new file mode 100644
index 0000000..a3bc08f
--- /dev/null
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostResultTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2014 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 android.sample.cts;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.Stat;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.IDevice;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.RunUtil;
+
+import java.io.File;
+import java.lang.Exception;
+
+/**
+ * Test to measure the transfer time of a file from the host to the device.
+ */
+public class SampleHostResultTest extends DeviceTestCase implements IBuildReceiver {
+
+    private static final String TAG = SampleHostResultTest.class.getSimpleName();
+
+    /**
+     * The number of times to repeat the test.
+     */
+    private static final int REPEAT = 5;
+
+    /**
+     * The name of the plan to transfer.
+     *
+     * In this case we will transfer the CTS.xml file.
+     */
+    private static final String PLAN_NAME = "CTS";
+
+    /**
+     * A reference to the build.
+     */
+    private CtsBuildHelper mBuild;
+
+    /**
+     * A reference to the device under test.
+     */
+    private ITestDevice mDevice;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        // Get the build, this is used to access the APK.
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Get the device, this gives a handle to run commands and install APKs.
+        mDevice = getDevice();
+    }
+
+    /**
+     * Measures the time taken to transfer a file to the device and then back.
+     *
+     * The workload is repeated several times and the report is populated with the result.
+     *
+     * @throws Exception
+     */
+    public void testTransferTime() throws Exception {
+        final ITestDevice device = mDevice;
+        // Get the external storage location and ensure its not null.
+        final String externalStorePath = mDevice.getMountPoint(IDevice.MNT_EXTERNAL_STORAGE);
+        assertNotNull("External storage location no found", externalStorePath);
+        // Create the device side path where the file will be transfered.
+        final String devicePath = String.format("%s/%s", externalStorePath, "tmp_testPushPull.txt");
+        // Get the file from the build.
+        final File testFile = mBuild.getTestPlanFile(PLAN_NAME);
+        double[] result = MeasureTime.measure(REPEAT, new MeasureRun() {
+            @Override
+            public void prepare(int i) throws Exception {
+                device.executeShellCommand(String.format("rm %s", devicePath));
+            }
+            @Override
+            public void run(int i) throws Exception {
+                // Create a temporary file to compare with.
+                File tmpFile = FileUtil.createTempFile("tmp", "txt");
+                try {
+                    // Push the file across and ensure it exists.
+                    assertTrue("Could not push file", device.pushFile(testFile, devicePath));
+                    assertTrue("Unsuccessful transfer", device.doesFileExist(devicePath));
+                    // Pull the file back and ensure it is the same.
+                    assertTrue("Could not pull file", device.pullFile(devicePath, tmpFile));
+                    assertFilesAreEqual(testFile, tmpFile);
+                } finally {
+                    // Clean up.
+                    tmpFile.delete();
+                    device.executeShellCommand(String.format("rm %s", devicePath));
+                }
+            }
+        });
+        // Compute the stats.
+        Stat.StatResult stat = Stat.getStat(result);
+        // Get the report for this test and add the results to record.
+        HostReportLog report = new HostReportLog(mDevice.getSerialNumber(),
+                ReportLog.getClassMethodNames());
+        report.printArray("Times", result, ResultType.LOWER_BETTER, ResultUnit.MS);
+        report.printValue("Min", stat.mMin, ResultType.LOWER_BETTER, ResultUnit.MS);
+        report.printValue("Max", stat.mMax, ResultType.LOWER_BETTER, ResultUnit.MS);
+        // Every report must have a summary,
+        report.printSummary("Average", stat.mAverage, ResultType.LOWER_BETTER, ResultUnit.MS);
+        // Send the report to Tradefed.
+        report.deliverReportToHost();
+    }
+
+    /**
+     * Asserts the two given files are equal using the diff utility.
+     *
+     * @throws Exception
+     */
+    private static void assertFilesAreEqual(File first, File second) throws Exception {
+        CommandResult result = RunUtil.getDefault().runTimedCmd(5000, "diff",
+                first.getAbsolutePath(), second.getAbsolutePath());
+        assertTrue("Diff failed to run", result.getStatus() == CommandStatus.SUCCESS);
+        assertTrue("Files are not equivalent", "".equals(result.getStdout()));
+    }
+
+}
diff --git a/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
new file mode 100644
index 0000000..7ccde0e
--- /dev/null
+++ b/hostsidetests/sample/src/android/sample/cts/SampleHostTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2014 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 android.sample.cts;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.lang.String;
+import java.util.Scanner;
+
+/**
+ * Test to check the APK logs to Logcat.
+ *
+ * When this test builds, it also builds {@see android.sample.app.SampleDeviceActivity} into an APK
+ * which it then installs at runtime and starts. The activity simply prints a message to Logcat and
+ * then gets uninstalled.
+ */
+public class SampleHostTest extends DeviceTestCase implements IBuildReceiver {
+
+    /**
+     * The package name of the APK.
+     */
+    private static final String PACKAGE = "android.sample.app";
+
+    /**
+     * The file name of the APK.
+     */
+    private static final String APK = "CtsSampleDeviceApp.apk";
+
+    /**
+     * The class name of the main activity in the APK.
+     */
+    private static final String CLASS = "SampleDeviceActivity";
+
+    /**
+     * The command to launch the main activity.
+     */
+    private static final String START_COMMAND = String.format(
+            "am start -W -a android.intent.action.MAIN -n %s/%s.%s", PACKAGE, PACKAGE, CLASS);
+
+    /**
+     * The test string to look for.
+     */
+    private static final String TEST_STRING = "SampleTestString";
+
+    /**
+     * A reference to the build.
+     */
+    private CtsBuildHelper mBuild;
+
+    /**
+     * A reference to the device under test.
+     */
+    private ITestDevice mDevice;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        // Get the build, this is used to access the APK.
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Get the device, this gives a handle to run commands and install APKs.
+        mDevice = getDevice();
+        // Remove any previously installed versions of this APK.
+        mDevice.uninstallPackage(PACKAGE);
+        // Get the APK from the build.
+        File app = mBuild.getTestApp(APK);
+        // Install the APK on the device.
+        mDevice.installPackage(app, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Remove the package once complete.
+        mDevice.uninstallPackage(PACKAGE);
+        super.tearDown();
+    }
+
+    /**
+     * Tests the string was successfully logged to Logcat from the activity.
+     *
+     * @throws Exception
+     */
+    public void testLogcat() throws Exception {
+        // Clear logcat.
+        mDevice.executeAdbCommand("logcat", "-c");
+        // Start the APK and wait for it to complete.
+        mDevice.executeShellCommand(START_COMMAND);
+        // Dump logcat.
+        String logs = mDevice.executeAdbCommand("logcat", "-d", CLASS + ":I", "*:S");
+        // Search for string.
+        String testString = "";
+        Scanner in = new Scanner(logs);
+        while (in.hasNextLine()) {
+            String line = in.nextLine();
+            if(line.startsWith("I/"+CLASS)) {
+                testString = line.split(":")[1].trim();
+            }
+        }
+        // Assert the logged string matches the test string.
+        assertEquals("Incorrect test string", TEST_STRING, testString);
+    }
+}
diff --git a/hostsidetests/theme/Android.mk b/hostsidetests/theme/Android.mk
index 75ee891..8e283a3 100644
--- a/hostsidetests/theme/Android.mk
+++ b/hostsidetests/theme/Android.mk
@@ -16,8 +16,7 @@
 
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src) \
-                   ../../libs/util/src/android/cts/util/TimeoutReq.java
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_JAVA_RESOURCE_DIRS := assets/$(PLATFORM_SDK_VERSION)/
 
diff --git a/hostsidetests/theme/app/res/drawable-xxxhdpi/display_info.png b/hostsidetests/theme/app/res/drawable-xxxhdpi/display_info.png
new file mode 100644
index 0000000..095382c
--- /dev/null
+++ b/hostsidetests/theme/app/res/drawable-xxxhdpi/display_info.png
Binary files differ
diff --git a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
index fc6ae13..12504c1 100644
--- a/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
+++ b/hostsidetests/theme/app/src/android/theme/app/DisplayInfoActivity.java
@@ -62,9 +62,15 @@
             case DisplayMetrics.DENSITY_XHIGH:
                 return "xhdpi";
 
+            case DisplayMetrics.DENSITY_400:
+                return "400dpi";
+
             case DisplayMetrics.DENSITY_XXHIGH:
                 return "xxhdpi";
 
+            case DisplayMetrics.DENSITY_XXXHIGH:
+                return "xxxhdpi";
+
             case DisplayMetrics.DENSITY_TV:
                 return "tvdpi";
 
diff --git a/hostsidetests/theme/assets/19/400dpi.zip b/hostsidetests/theme/assets/19/400dpi.zip
new file mode 100644
index 0000000..2f9edd2
--- /dev/null
+++ b/hostsidetests/theme/assets/19/400dpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/hdpi.zip b/hostsidetests/theme/assets/19/hdpi.zip
new file mode 100644
index 0000000..45f07f4
--- /dev/null
+++ b/hostsidetests/theme/assets/19/hdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/ldpi.zip b/hostsidetests/theme/assets/19/ldpi.zip
new file mode 100644
index 0000000..89d6544
--- /dev/null
+++ b/hostsidetests/theme/assets/19/ldpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/mdpi.zip b/hostsidetests/theme/assets/19/mdpi.zip
new file mode 100644
index 0000000..6559c4a
--- /dev/null
+++ b/hostsidetests/theme/assets/19/mdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/tvdpi.zip b/hostsidetests/theme/assets/19/tvdpi.zip
new file mode 100644
index 0000000..6496a1f
--- /dev/null
+++ b/hostsidetests/theme/assets/19/tvdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/xhdpi.zip b/hostsidetests/theme/assets/19/xhdpi.zip
new file mode 100644
index 0000000..515dcf2
--- /dev/null
+++ b/hostsidetests/theme/assets/19/xhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/19/xxhdpi.zip b/hostsidetests/theme/assets/19/xxhdpi.zip
new file mode 100644
index 0000000..c9c7a59
--- /dev/null
+++ b/hostsidetests/theme/assets/19/xxhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
index c9688fb..fe24bcb 100644
--- a/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
+++ b/hostsidetests/theme/src/android/theme/cts/ThemeHostTest.java
@@ -25,7 +25,7 @@
 import com.android.tradefed.testtype.DeviceTestCase;
 import com.android.tradefed.testtype.IBuildReceiver;
 
-import android.cts.util.TimeoutReq;
+import com.android.cts.util.TimeoutReq;
 
 import java.io.File;
 import java.io.FileOutputStream;
diff --git a/hostsidetests/usb/Android.mk b/hostsidetests/usb/Android.mk
new file mode 100644
index 0000000..488acbb
--- /dev/null
+++ b/hostsidetests/usb/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2013 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)
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsUsbTests
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+
+LOCAL_CTS_TEST_PACKAGE := android.usb
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+# Build the test APKs using their own makefiles
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/hostsidetests/usb/SerialTestApp/Android.mk b/hostsidetests/usb/SerialTestApp/Android.mk
new file mode 100644
index 0000000..d36b98e
--- /dev/null
+++ b/hostsidetests/usb/SerialTestApp/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2013 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsUsbSerialTestApp
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/hostsidetests/usb/SerialTestApp/AndroidManifest.xml b/hostsidetests/usb/SerialTestApp/AndroidManifest.xml
new file mode 100644
index 0000000..0667d60
--- /dev/null
+++ b/hostsidetests/usb/SerialTestApp/AndroidManifest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.usb.serialtest">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation
+        android:targetPackage="com.android.cts.usb.serialtest"
+        android:name="android.test.InstrumentationCtsTestRunner" />
+</manifest>
diff --git a/hostsidetests/usb/SerialTestApp/src/com/android/cts/usb/serialtest/UsbSerialTest.java b/hostsidetests/usb/SerialTestApp/src/com/android/cts/usb/serialtest/UsbSerialTest.java
new file mode 100644
index 0000000..a2b0c72
--- /dev/null
+++ b/hostsidetests/usb/SerialTestApp/src/com/android/cts/usb/serialtest/UsbSerialTest.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.usb.serialtest;
+
+import android.os.Build;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+
+/**
+ * Device test which reads Build.SERIAL and just print it.
+ */
+public class UsbSerialTest extends AndroidTestCase {
+    private static final String TAG = "CtsUsbSerialTest";
+
+    public void testSerial() throws Exception {
+        Log.e(TAG, Build.SERIAL);
+    }
+}
diff --git a/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
new file mode 100644
index 0000000..f53d210
--- /dev/null
+++ b/hostsidetests/usb/src/com/android/cts/usb/TestUsbTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.usb;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.ddmlib.IDevice;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
+import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.IFileEntry;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.CollectingTestListener;
+import com.android.tradefed.result.InputStreamSource;
+import com.android.tradefed.result.TestRunResult;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.RunUtil;
+import com.android.tradefed.util.StreamUtil;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Functional tests for usb connection
+ */
+public class TestUsbTest extends DeviceTestCase implements IBuildReceiver {
+
+    private static final String LOG_TAG = "TestUsbTest";
+    private static final String CTS_RUNNER = "android.test.InstrumentationCtsTestRunner";
+    private static final String PACKAGE_NAME = "com.android.cts.usb.serialtest";
+    private static final String APK_NAME="CtsUsbSerialTestApp.apk";
+    private ITestDevice mDevice;
+    private CtsBuildHelper mBuild;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+        mDevice.uninstallPackage(PACKAGE_NAME);
+        File app = mBuild.getTestApp(APK_NAME);
+        mDevice.installPackage(app, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mDevice.uninstallPackage(PACKAGE_NAME);
+    }
+
+    /**
+     * Check if adb serial number, USB serial number, ro.serialno, and android.os.Build.SERIAL
+     * all matches and meets the format requirement [a-zA-Z0-9]{6,20}
+     */
+    public void testUsbSerial() throws Exception {
+        String adbSerial = mDevice.getSerialNumber().toLowerCase().trim();
+        if (adbSerial.startsWith("emulator-")) {
+            return;
+        }
+        if (mDevice.isAdbTcp()) { // adb over WiFi, no point checking it
+            return;
+        }
+
+        String roSerial = mDevice.executeShellCommand("getprop ro.serialno").toLowerCase().
+                trim();
+        assertEquals("adb serial != ro.serialno" , adbSerial, roSerial);
+
+        CommandResult result = RunUtil.getDefault().runTimedCmd(5000, "lsusb", "-v");
+        assertTrue("lsusb -v failed", result.getStatus() == CommandStatus.SUCCESS);
+        String lsusbOutput = result.getStdout();
+        Pattern pattern = Pattern.compile("^\\s+iSerial\\s+\\d+\\s+([a-zA-Z0-9]{6,20})",
+                Pattern.MULTILINE);
+        Matcher matcher = pattern.matcher(lsusbOutput);
+        String usbSerial = "";
+        while (matcher.find()) {
+            String currentSerial = matcher.group(1).toLowerCase();
+            if (adbSerial.compareTo(currentSerial) == 0) {
+                usbSerial = currentSerial;
+                break;
+            }
+        }
+        assertEquals("usb serial != adb serial" , usbSerial, adbSerial);
+
+        // now check Build.SERIAL
+        clearLogCat();
+        CollectingTestListener listener = new CollectingTestListener();
+        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGE_NAME, CTS_RUNNER,
+                mDevice.getIDevice());
+        mDevice.runInstrumentationTests(testRunner, listener);
+        TestRunResult runResult = listener.getCurrentRunResults();
+        if (runResult.isRunFailure()) {
+            fail(runResult.getRunFailureMessage());
+        }
+        String logs = mDevice.executeAdbCommand("logcat", "-d", "CtsUsbSerialTest:W", "*:S");
+        pattern = Pattern.compile("^.*CtsUsbSerialTest\\(.*\\):\\s+([a-zA-Z0-9]{6,20})",
+                Pattern.MULTILINE);
+        matcher = pattern.matcher(logs);
+        String buildSerial = "";
+        while (matcher.find()) {
+            String currentSerial = matcher.group(1).toLowerCase();
+            if (usbSerial.compareTo(currentSerial) == 0) {
+                buildSerial = currentSerial;
+                break;
+            }
+        }
+        assertEquals("usb serial != Build.SERIAL" , usbSerial, buildSerial);
+    }
+
+    private void clearLogCat() throws DeviceNotAvailableException {
+        mDevice.executeAdbCommand("logcat", "-c");
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/CtsException.java b/libs/commonutil/src/com/android/cts/util/CtsException.java
new file mode 100644
index 0000000..7e79590
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/CtsException.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+/**
+ * Exception throw by CTS test to pass the result to host
+ * This should not be thrown by test app unless the result is complete.
+ */
+@SuppressWarnings("serial")
+public class CtsException extends Exception {
+    public CtsException(String message) {
+        super(message);
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/MeasureRun.java b/libs/commonutil/src/com/android/cts/util/MeasureRun.java
new file mode 100644
index 0000000..43b5acf
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/MeasureRun.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+/**
+ * interface for measuring time for each run.
+ */
+public abstract class MeasureRun {
+    /**
+     *  called before each run. not included to time measurement.
+     */
+    public void prepare(int i) throws Exception {
+        // default empty implementation
+    };
+
+    abstract public void run(int i) throws Exception;
+}
diff --git a/libs/commonutil/src/com/android/cts/util/MeasureTime.java b/libs/commonutil/src/com/android/cts/util/MeasureTime.java
new file mode 100644
index 0000000..fd22ef2
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/MeasureTime.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+
+public class MeasureTime {
+    /**
+     * measure time taken for each run for given count
+     * @param count
+     * @param run
+     * @return array of time taken in each run in msec.
+     * @throws Exception
+     */
+    public static double[] measure(int count, MeasureRun run) throws Exception {
+        double[] result = new double[count];
+
+        for (int i = 0; i < count; i++) {
+            run.prepare(i);
+            long start = System.currentTimeMillis();
+            run.run(i);
+            long end =  System.currentTimeMillis();
+            result[i] = end - start;
+        }
+        return result;
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/ReportLog.java b/libs/commonutil/src/com/android/cts/util/ReportLog.java
new file mode 100644
index 0000000..115cec6
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/ReportLog.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+
+/**
+ * Utility class to print performance measurement result back to host.
+ * For now, throws know exception with message.
+ *
+ * Format:
+ * Message = summary log SUMMARY_SEPARATOR [LOG_SEPARATOR log]*
+ * summary = message|target|unit|type|value, target can be " " if there is no target set.
+ * log for array = classMethodName:line_number|message|unit|type|space seSummaryparated values
+ */
+public class ReportLog {
+    private static final String LOG_SEPARATOR = "+++";
+    private static final String SUMMARY_SEPARATOR = "++++";
+    private static final String LOG_ELEM_SEPARATOR = "|";
+
+    private List<String> mMessages = new LinkedList<String> ();
+    private String mSummary = null;
+    protected static int mDepth = 3;
+
+    /**
+     * print array of values to output log
+     */
+    public void printArray(String message, double[] values, ResultType type,
+            ResultUnit unit) {
+        doPrintArray(message, values, type, unit);
+    }
+
+    /**
+     * Print a value to output log
+     */
+    public void printValue(String message, double value, ResultType type,
+            ResultUnit unit) {
+        double[] vals = { value };
+        doPrintArray(message, vals, type, unit);
+    }
+
+    private void doPrintArray(String message, double[] values, ResultType type,
+    ResultUnit unit) {
+        StringBuilder builder = new StringBuilder();
+        // note mDepth + 1 as this function will be called by printVaue or printArray
+        // and we need caller of printValue / printArray
+        builder.append(getClassMethodNames(mDepth + 1, true) + LOG_ELEM_SEPARATOR + message +
+                LOG_ELEM_SEPARATOR + type.getXmlString() + LOG_ELEM_SEPARATOR +
+                unit.getXmlString() + LOG_ELEM_SEPARATOR);
+        for (double v : values) {
+            builder.append(v);
+            builder.append(" ");
+        }
+        mMessages.add(builder.toString());
+        printLog(builder.toString());
+    }
+
+    /**
+     * record the result of benchmarking with performance target.
+     * Depending on the ResultType, the function can fail if the result
+     * does not meet the target. For example, for the type of HIGHER_BETTER,
+     * value of 1.0 with target of 2.0 will fail.
+     *
+     * @param message message to be printed in the final report
+     * @param target target performance for the benchmarking
+     * @param value measured value
+     * @param type
+     * @param unit
+     */
+    public void printSummaryWithTarget(String message, double target, double value,
+            ResultType type, ResultUnit unit) {
+        mSummary = message + LOG_ELEM_SEPARATOR + target + LOG_ELEM_SEPARATOR + type.getXmlString()
+                + LOG_ELEM_SEPARATOR + unit.getXmlString() + LOG_ELEM_SEPARATOR + value;
+        boolean resultOk = true;
+        if (type == ResultType.HIGHER_BETTER) {
+            resultOk = value >= target;
+        } else if (type == ResultType.LOWER_BETTER) {
+            resultOk = value <= target;
+        }
+        if (!resultOk) {
+            Assert.fail("Measured result " + value + " does not meet perf target " + target +
+                    " with type " + type.getXmlString());
+        }
+    }
+
+    /**
+     * For standard report summary without target value.
+     * Note that this function will not fail as there is no target.
+     * @param messsage
+     * @param value
+     * @param type type of the value
+     * @param unit unit of the data
+     */
+    public void printSummary(String message, double value, ResultType type,
+            ResultUnit unit) {
+        mSummary = message + LOG_ELEM_SEPARATOR + " " + LOG_ELEM_SEPARATOR + type.getXmlString() +
+                LOG_ELEM_SEPARATOR + unit.getXmlString() + LOG_ELEM_SEPARATOR + value;
+    }
+
+    protected String generateReport() {
+        if ((mSummary == null) && mMessages.isEmpty()) {
+            // just return empty string
+            return "";
+        }
+        StringBuilder builder = new StringBuilder();
+        builder.append(mSummary);
+        builder.append(SUMMARY_SEPARATOR);
+        for (String entry : mMessages) {
+            builder.append(entry);
+            builder.append(LOG_SEPARATOR);
+        }
+        // delete the last separator
+        if (builder.length() >= LOG_SEPARATOR.length()) {
+            builder.delete(builder.length() - LOG_SEPARATOR.length(), builder.length());
+        }
+        mSummary = null;
+        mMessages.clear();
+        return builder.toString();
+    }
+
+    /**
+     * calculate rate per sec for given change happened during given timeInMSec.
+     * timeInSec with 0 value will be changed to small value to prevent divide by zero.
+     * @param change total change of quality for the given duration timeInMSec.
+     * @param timeInMSec
+     * @return
+     */
+    public static double calcRatePerSec(double change, double timeInMSec) {
+        if (timeInMSec == 0) {
+            return change * 1000.0 / 0.001; // do not allow zero
+        } else {
+            return change * 1000.0 / timeInMSec;
+        }
+    }
+
+    /**
+     * array version of calcRatePerSecArray
+     */
+    public static double[] calcRatePerSecArray(double change, double[] timeInMSec) {
+        double[] result = new double[timeInMSec.length];
+        change *= 1000.0;
+        for (int i = 0; i < timeInMSec.length; i++) {
+            if (timeInMSec[i] == 0) {
+                result[i] = change / 0.001;
+            } else {
+                result[i] = change / timeInMSec[i];
+            }
+        }
+        return result;
+    }
+
+    /**
+     * copy array from src to dst with given offset in dst.
+     * dst should be big enough to hold src
+     */
+    public static void copyArray(double[] src, double[] dst, int dstOffset) {
+        for (int i = 0; i < src.length; i++) {
+            dst[dstOffset + i] = src[i];
+        }
+    }
+
+    /**
+     * get classname#methodname from call stack of the current thread
+     */
+    public static String getClassMethodNames() {
+        return getClassMethodNames(mDepth, false);
+    }
+
+    private static String getClassMethodNames(int depth, boolean addLineNumber) {
+        StackTraceElement[] elements = Thread.currentThread().getStackTrace();
+        String names = elements[depth].getClassName() + "#" + elements[depth].getMethodName() +
+                (addLineNumber ? ":" + elements[depth].getLineNumber() : "");
+        return names;
+    }
+
+    /**
+     * to be overridden by child to print message to be passed
+     */
+    protected void printLog(String msg) {
+
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/ResultType.java b/libs/commonutil/src/com/android/cts/util/ResultType.java
new file mode 100644
index 0000000..a5a388c
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/ResultType.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+/**
+ * Enum for distinguishing performance results.
+ */
+public enum ResultType {
+    /** lower score shows better performance */
+    LOWER_BETTER,
+    /** higher score shows better performance */
+    HIGHER_BETTER,
+    /** This value is not directly correlated with performance. */
+    NEUTRAL,
+    /** presence of this type requires some attention although it may not be an error. */
+    WARNING;
+
+    /**
+     * Return string used in CTS XML report
+     */
+    public String getXmlString() {
+        return name().toLowerCase();
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/ResultUnit.java b/libs/commonutil/src/com/android/cts/util/ResultUnit.java
new file mode 100644
index 0000000..a216a7e
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/ResultUnit.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+/**
+ * Enum for representing the unit of performance results.
+ *
+ */
+public enum ResultUnit {
+    /** for value with no unit */
+    NONE,
+    /** milli-seconds */
+    MS,
+    /** frames per second */
+    FPS,
+    /** operations per second */
+    OPS,
+    /** kilo-bytes-per-second, not bits-per-second */
+    KBPS,
+    /** mega-bytes-per-second */
+    MBPS,
+    /** amount of data, bytes */
+    BYTE,
+    /** tell how many times it did happen. */
+    COUNT,
+    /** unit for benchmarking with generic score. */
+    SCORE;
+
+    /**
+     * Return string used in CTS XML report
+     */
+    public String getXmlString() {
+        return name().toLowerCase();
+    }
+}
+
diff --git a/libs/commonutil/src/com/android/cts/util/Stat.java b/libs/commonutil/src/com/android/cts/util/Stat.java
new file mode 100644
index 0000000..ceafa4e
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/Stat.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+import java.util.Arrays;
+
+/**
+ * Utilities for doing statistics
+ *
+ */
+public class Stat {
+
+    /**
+     * Collection of statistical propertirs like average, max, min, and stddev
+     */
+    public static class StatResult {
+        public double mAverage;
+        public double mMin;
+        public double mMax;
+        public double mStddev;
+        public int mDataCount;
+        public StatResult(double average, double min, double max, double stddev, int dataCount) {
+            mAverage = average;
+            mMin = min;
+            mMax = max;
+            mStddev = stddev;
+            mDataCount = dataCount;
+        }
+    }
+
+    /**
+     * Calculate statistics properties likes average, min, max, and stddev for the given array
+     */
+    public static StatResult getStat(double[] data) {
+        double average = data[0];
+        double min = data[0];
+        double max = data[0];
+        double eX2 = data[0] * data[0]; // will become E[X^2]
+        for (int i = 1; i < data.length; i++) {
+            average += data[i];
+            eX2 += data[i] * data[i];
+            if (data[i] > max) {
+                max = data[i];
+            }
+            if (data[i] < min) {
+                min = data[i];
+            }
+        }
+        average /= data.length;
+        eX2 /= data.length;
+        // stddev = sqrt(E[X^2] - (E[X])^2)
+        double stddev = Math.sqrt(eX2 - average * average);
+        return new StatResult(average, min, max, stddev, data.length);
+    }
+
+    /**
+     * Calculate statistics properties likes average, min, max, and stddev for the given array
+     * while rejecting outlier +/- median * rejectionThreshold.
+     * rejectionThreshold should be bigger than 0.0 and be lowerthan 1.0
+     */
+    public static StatResult getStatWithOutlierRejection(double[] data, double rejectionThreshold) {
+        double[] dataCopied = Arrays.copyOf(data, data.length);
+        Arrays.sort(dataCopied);
+        int medianIndex = dataCopied.length / 2;
+        double median;
+        if (dataCopied.length % 2 == 1) {
+            median = dataCopied[medianIndex];
+        } else {
+            median = (dataCopied[medianIndex - 1] + dataCopied[medianIndex]) / 2.0;
+        }
+        double thresholdMin = median * (1.0 - rejectionThreshold);
+        double thresholdMax = median * (1.0 + rejectionThreshold);
+
+        double average = 0.0;
+        double min = median;
+        double max = median;
+        double eX2 = 0.0; // will become E[X^2]
+        int validDataCounter = 0;
+        for (int i = 0; i < data.length; i++) {
+            if ((data[i] > thresholdMin) && (data[i] < thresholdMax)) {
+                validDataCounter++;
+                average += data[i];
+                eX2 += data[i] * data[i];
+                if (data[i] > max) {
+                    max = data[i];
+                }
+                if (data[i] < min) {
+                    min = data[i];
+                }
+            }
+            //TODO report rejected data
+        }
+        double stddev;
+        if (validDataCounter > 0) {
+            average /= validDataCounter;
+            eX2 /= validDataCounter;
+            // stddev = sqrt(E[X^2] - (E[X])^2)
+            stddev = Math.sqrt(eX2 - average * average);
+        } else { // both median is showing too much diff
+            average = median;
+            stddev = 0; // don't care
+        }
+
+        return new StatResult(average, min, max, stddev, validDataCounter);
+    }
+
+    /**
+     * return the average value of the passed array
+     */
+    public static double getAverage(double[] data) {
+        double sum = data[0];
+        for (int i = 1; i < data.length; i++) {
+            sum += data[i];
+        }
+        return sum / data.length;
+    }
+
+    /**
+     * return the minimum value of the passed array
+     */
+    public static double getMin(double[] data) {
+        double min = data[0];
+        for (int i = 1; i < data.length; i++) {
+            if (data[i] < min) {
+                min = data[i];
+            }
+        }
+        return min;
+    }
+
+    /**
+     * return the maximum value of the passed array
+     */
+    public static double getMax(double[] data) {
+        double max = data[0];
+        for (int i = 1; i < data.length; i++) {
+            if (data[i] > max) {
+                max = data[i];
+            }
+        }
+        return max;
+    }
+}
diff --git a/libs/commonutil/src/com/android/cts/util/TimeoutReq.java b/libs/commonutil/src/com/android/cts/util/TimeoutReq.java
new file mode 100644
index 0000000..144cd33
--- /dev/null
+++ b/libs/commonutil/src/com/android/cts/util/TimeoutReq.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.util;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Annotation to specify necessary timeout for the test
+ * timeout is specified in minutes and 0 value means no timeout ( = infinite waiting).
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TimeoutReq {
+    int  minutes() default -1;
+}
diff --git a/libs/deviceutil/Android.mk b/libs/deviceutil/Android.mk
new file mode 100644
index 0000000..1b7db18
--- /dev/null
+++ b/libs/deviceutil/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2012 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_SRC_FILES := \
+    $(call all-java-files-under, src) \
+    $(call all-java-files-under, ../commonutil/src)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := ctsdeviceutil
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/libs/util/src/android/app/cts/CTSResult.java b/libs/deviceutil/src/android/app/cts/CTSResult.java
similarity index 100%
rename from libs/util/src/android/app/cts/CTSResult.java
rename to libs/deviceutil/src/android/app/cts/CTSResult.java
diff --git a/libs/deviceutil/src/android/cts/util/CtsActivityInstrumentationTestCase2.java b/libs/deviceutil/src/android/cts/util/CtsActivityInstrumentationTestCase2.java
new file mode 100644
index 0000000..e039407
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/CtsActivityInstrumentationTestCase2.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2012 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 android.cts.util;
+
+import com.android.cts.util.ReportLog;
+
+import android.app.Activity;
+import android.test.ActivityInstrumentationTestCase2;
+
+
+public class CtsActivityInstrumentationTestCase2<T extends Activity> extends
+        ActivityInstrumentationTestCase2<T> {
+
+    private DeviceReportLog mReportLog = new DeviceReportLog();
+
+    public CtsActivityInstrumentationTestCase2(Class<T> activityClass) {
+        super(activityClass);
+    }
+
+    public ReportLog getReportLog() {
+        return mReportLog;
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mReportLog.deliverReportToHost(getInstrumentation());
+        super.tearDown();
+    }
+
+}
diff --git a/libs/deviceutil/src/android/cts/util/CtsAndroidTestCase.java b/libs/deviceutil/src/android/cts/util/CtsAndroidTestCase.java
new file mode 100644
index 0000000..b1164bc
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/CtsAndroidTestCase.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 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 android.cts.util;
+
+import android.content.Context;
+
+/**
+ *  This class emulates AndroidTestCase, but internally it is ActivityInstrumentationTestCase2
+ *  to access Instrumentation.
+ *  DummyActivity is not supposed to be accessed.
+ */
+public class CtsAndroidTestCase extends CtsActivityInstrumentationTestCase2<DummyActivity> {
+    public CtsAndroidTestCase() {
+        super(DummyActivity.class);
+    }
+
+    public Context getContext() {
+        return getInstrumentation().getContext();
+    }
+}
diff --git a/libs/deviceutil/src/android/cts/util/DeviceReportLog.java b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
new file mode 100644
index 0000000..b707fc8
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/DeviceReportLog.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 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 android.cts.util;
+
+import com.android.cts.util.ReportLog;
+
+import android.app.Instrumentation;
+import android.os.Bundle;
+import android.util.Log;
+
+public class DeviceReportLog extends ReportLog {
+    private static final String TAG = "DeviceCtsReport";
+    private static final String CTS_RESULT = "CTS_RESULT";
+    private static final int INST_STATUS_IN_PROGRESS = 2;
+
+    DeviceReportLog() {
+        mDepth = 4;
+    }
+
+    @Override
+    protected void printLog(String msg) {
+        Log.i(TAG, msg);
+    }
+
+    public void deliverReportToHost(Instrumentation instrumentation) {
+        Log.i(TAG, "deliverReportToHost");
+        String report = generateReport();
+        if (!report.equals("")) {
+            Bundle output = new Bundle();
+            output.putString(CTS_RESULT, report);
+            instrumentation.sendStatus(INST_STATUS_IN_PROGRESS, output);
+        }
+    }
+}
diff --git a/libs/deviceutil/src/android/cts/util/DummyActivity.java b/libs/deviceutil/src/android/cts/util/DummyActivity.java
new file mode 100644
index 0000000..16e3507
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/DummyActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2013 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 android.cts.util;
+
+import android.app.Activity;
+
+public class DummyActivity extends Activity {
+
+}
diff --git a/libs/deviceutil/src/android/cts/util/EvaluateJsResultPollingCheck.java b/libs/deviceutil/src/android/cts/util/EvaluateJsResultPollingCheck.java
new file mode 100644
index 0000000..17d6a73
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/EvaluateJsResultPollingCheck.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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 android.cts.util;
+
+import android.webkit.ValueCallback;
+
+public class EvaluateJsResultPollingCheck  extends PollingCheck
+        implements ValueCallback<String> {
+    private String mActualResult;
+    private String mExpectedResult;
+
+    public EvaluateJsResultPollingCheck(String expected) {
+        mExpectedResult = expected;
+    }
+
+    @Override
+    public synchronized boolean check() {
+        return mExpectedResult.equals(mActualResult);
+    }
+
+    @Override
+    public synchronized void onReceiveValue(String result) {
+        mActualResult = result;
+    }
+}
\ No newline at end of file
diff --git a/libs/util/src/android/cts/util/PollingCheck.java b/libs/deviceutil/src/android/cts/util/PollingCheck.java
similarity index 100%
rename from libs/util/src/android/cts/util/PollingCheck.java
rename to libs/deviceutil/src/android/cts/util/PollingCheck.java
diff --git a/libs/deviceutil/src/android/cts/util/SystemUtil.java b/libs/deviceutil/src/android/cts/util/SystemUtil.java
new file mode 100644
index 0000000..e6222cb
--- /dev/null
+++ b/libs/deviceutil/src/android/cts/util/SystemUtil.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 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 android.cts.util;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.MemoryInfo;
+import android.content.Context;
+import android.os.StatFs;
+
+public class SystemUtil {
+    public static long getFreeDiskSize(Context context) {
+        StatFs statFs = new StatFs(context.getFilesDir().getAbsolutePath());
+        return (long)statFs.getAvailableBlocks() * statFs.getBlockSize();
+    }
+
+    public static long getFreeMemory(Context context) {
+        MemoryInfo info = new MemoryInfo();
+        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        activityManager.getMemoryInfo(info);
+        return info.availMem;
+    }
+
+    public static long getTotalMemory(Context context) {
+        MemoryInfo info = new MemoryInfo();
+        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+        activityManager.getMemoryInfo(info);
+        return info.totalMem; // TODO totalMem N/A in ICS.
+    }
+}
diff --git a/libs/util/src/android/cts/util/WatchDog.java b/libs/deviceutil/src/android/cts/util/WatchDog.java
similarity index 100%
rename from libs/util/src/android/cts/util/WatchDog.java
rename to libs/deviceutil/src/android/cts/util/WatchDog.java
diff --git a/libs/util/src/android/provider/cts/FileCopyHelper.java b/libs/deviceutil/src/android/provider/cts/FileCopyHelper.java
similarity index 100%
rename from libs/util/src/android/provider/cts/FileCopyHelper.java
rename to libs/deviceutil/src/android/provider/cts/FileCopyHelper.java
diff --git a/libs/testserver/src/android/webkit/cts/CtsTestServer.java b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
old mode 100755
new mode 100644
index 0d1db19..928a68e
--- a/libs/testserver/src/android/webkit/cts/CtsTestServer.java
+++ b/libs/testserver/src/android/webkit/cts/CtsTestServer.java
@@ -59,6 +59,7 @@
 import java.net.Socket;
 import java.net.URI;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.net.URLConnection;
 import java.security.KeyManagementException;
 import java.security.KeyStore;
@@ -67,8 +68,10 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
@@ -104,6 +107,7 @@
     public static final String APPCACHE_PATH = "/appcache.html";
     public static final String APPCACHE_MANIFEST_PATH = "/appcache.manifest";
     public static final String REDIRECT_PREFIX = "/redirect";
+    public static final String QUERY_REDIRECT_PATH = "/alt_redirect";
     public static final String DELAY_PREFIX = "/delayed";
     public static final String BINARY_PREFIX = "/binary";
     public static final String COOKIE_PREFIX = "/cookie";
@@ -133,6 +137,7 @@
     private MimeTypeMap mMap;
     private Vector<String> mQueries;
     private ArrayList<HttpEntity> mRequestEntities;
+    private final Map<String, HttpRequest> mLastRequestMap = new HashMap<String, HttpRequest>();
     private long mDocValidity;
     private long mDocAge;
 
@@ -336,6 +341,24 @@
         return sb.toString();
     }
 
+    /**
+     * Return an absolute URL that indirectly refers to the given asset, without having
+     * the destination path be part of the redirecting path.
+     * When a client fetches this URL, the server will respond with a temporary redirect (302)
+     * referring to the absolute URL of the given asset.
+     * @param path The path of the asset. See {@link AssetManager#open(String)}
+     */
+    public String getQueryRedirectingAssetUrl(String path) {
+        StringBuilder sb = new StringBuilder(getBaseUri());
+        sb.append(QUERY_REDIRECT_PATH);
+        sb.append("?dest=");
+        try {
+            sb.append(URLEncoder.encode(getAssetUrl(path), "UTF-8"));
+        } catch (UnsupportedEncodingException e) {
+        }
+        return sb.toString();
+    }
+
     public String getBinaryUrl(String mimeType, int contentLength) {
         StringBuilder sb = new StringBuilder(getBaseUri());
         sb.append(BINARY_PREFIX);
@@ -437,6 +460,15 @@
     }
 
     /**
+     * Returns the last HttpRequest at this path. Can return null if it is never requested.
+     */
+    public synchronized HttpRequest getLastRequest(String requestPath) {
+        String relativeUrl = getRelativeUrl(requestPath);
+        if (!mLastRequestMap.containsKey(relativeUrl))
+            return null;
+        return mLastRequestMap.get(relativeUrl);
+    }
+    /**
      * Hook for adding stuffs for HTTP POST. Default implementation does nothing.
      * @return null to use the default response mechanism of sending the requested uri as it is.
      *         Otherwise, the whole response should be handled inside onPost.
@@ -446,6 +478,16 @@
     }
 
     /**
+     * Return the relative URL that refers to the given asset.
+     * @param path The path of the asset. See {@link AssetManager#open(String)}
+     */
+    private String getRelativeUrl(String path) {
+        StringBuilder sb = new StringBuilder(ASSET_PREFIX);
+        sb.append(path);
+        return sb.toString();
+    }
+
+    /**
      * Generate a response to the given request.
      * @throws InterruptedException
      * @throws IOException
@@ -458,6 +500,7 @@
 
         synchronized (this) {
             mQueries.add(uriString);
+            mLastRequestMap.put(uriString, request);
             if (request instanceof HttpEntityEnclosingRequest) {
                 mRequestEntities.add(((HttpEntityEnclosingRequest)request).getEntity());
             }
@@ -562,6 +605,13 @@
             String location = getBaseUri() + path.substring(REDIRECT_PREFIX.length());
             Log.i(TAG, "Redirecting to: " + location);
             response.addHeader("Location", location);
+        } else if (path.equals(QUERY_REDIRECT_PATH)) {
+            String location = Uri.parse(uriString).getQueryParameter("dest");
+            if (location != null) {
+                Log.i(TAG, "Redirecting to: " + location);
+                response = createResponse(HttpStatus.SC_MOVED_TEMPORARILY);
+                response.addHeader("Location", location);
+            }
         } else if (path.startsWith(COOKIE_PREFIX)) {
             /*
              * Return a page with a title containing a list of all incoming cookies,
diff --git a/libs/util/Android.mk b/libs/util/Android.mk
deleted file mode 100644
index b3e128c..0000000
--- a/libs/util/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (C) 2012 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_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := ctsutil
-
-include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/libs/util/src/android/cts/util/TimeoutReq.java b/libs/util/src/android/cts/util/TimeoutReq.java
deleted file mode 100644
index 943c3ce..0000000
--- a/libs/util/src/android/cts/util/TimeoutReq.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.cts.util;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Annotation to specify necessary timeout for the test
- * timeout is specified in minutes and 0 value means no timeout ( = infinite waiting).
- */
-@Retention(RetentionPolicy.RUNTIME)
-public @interface TimeoutReq {
-    int  minutes() default -1;
-}
diff --git a/suite/audio_quality/Android.mk b/suite/audio_quality/Android.mk
index 21d8fb8..65abd23 100644
--- a/suite/audio_quality/Android.mk
+++ b/suite/audio_quality/Android.mk
@@ -22,18 +22,24 @@
 CTS_AUDIO_INSTALL_DIR := $(HOST_OUT)/cts-audio-quality/android-cts-audio-quality
 CTS_AUDIO_QUALITY_ZIP := $(HOST_OUT)/cts-audio-quality/android-cts-audio-quality.zip
 
-$(CTS_AUDIO_QUALITY_ZIP): cts_audio_quality_test cts_audio_quality \
-  CtsAudioClient $(CTS_AUDIO_TOP)/test_description
-	$(hide) mkdir -p $(CTS_AUDIO_INSTALL_DIR)
+cts_audio_quality_client_apk := $(TARGET_OUT_DATA_APPS)/CtsAudioClient.apk
+cts_audio_quality_host_bins := $(HOST_OUT)/bin/cts_audio_quality_test $(HOST_OUT)/bin/cts_audio_quality
+$(CTS_AUDIO_QUALITY_ZIP): PRIVATE_CLIENT_APK := $(cts_audio_quality_client_apk)
+$(CTS_AUDIO_QUALITY_ZIP): PRIVATE_HOST_BINS := $(cts_audio_quality_host_bins)
+$(CTS_AUDIO_QUALITY_ZIP): PRIVATE_TEST_DESC := $(CTS_AUDIO_TOP)/test_description
+$(CTS_AUDIO_QUALITY_ZIP): $(cts_audio_quality_client_apk) $(cts_audio_quality_host_bins) \
+    $(CTS_AUDIO_TOP)/test_description | $(ACP)
 	$(hide) mkdir -p $(CTS_AUDIO_INSTALL_DIR)/client
-	$(hide) $(ACP) -fp $(PRODUCT_OUT)/data/app/CtsAudioClient.apk \
+	$(hide) $(ACP) -fp $(PRIVATE_CLIENT_APK) \
         $(CTS_AUDIO_INSTALL_DIR)/client
-	$(hide) $(ACP) -fp $(HOST_OUT)/bin/cts_audio_quality_test $(CTS_AUDIO_INSTALL_DIR)
-	$(hide) $(ACP) -fp $(HOST_OUT)/bin/cts_audio_quality $(CTS_AUDIO_INSTALL_DIR)
-	$(hide) $(ACP) -fr $(CTS_AUDIO_TOP)/test_description $(CTS_AUDIO_INSTALL_DIR)
+	$(hide) $(ACP) -fp $(PRIVATE_HOST_BINS) $(CTS_AUDIO_INSTALL_DIR)
+	$(hide) $(ACP) -fr $(PRIVATE_TEST_DESC) $(CTS_AUDIO_INSTALL_DIR)
 	$(hide) echo "Package cts_audio: $@"
-	$(hide) cd $(HOST_OUT)/cts-audio-quality && \
-        zip -rq android-cts-audio-quality.zip android-cts-audio-quality -x android-cts-audio-quality/reports/\*
+	$(hide) cd $(dir $@) && \
+        zip -rq $(notdir $@) android-cts-audio-quality -x android-cts-audio-quality/reports/\*
+
+cts_audio_quality_client_apk :=
+cts_audio_quality_host_bins :=
 
 # target to build only this package
 .PHONY: cts_audio_quality_package
diff --git a/suite/cts/Android.mk b/suite/cts/Android.mk
new file mode 100644
index 0000000..c141484
--- /dev/null
+++ b/suite/cts/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2012 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.
+#
+
+include $(call all-subdir-makefiles)
diff --git a/suite/cts/deviceTests/Android.mk b/suite/cts/deviceTests/Android.mk
new file mode 100644
index 0000000..c141484
--- /dev/null
+++ b/suite/cts/deviceTests/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2012 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.
+#
+
+include $(call all-subdir-makefiles)
diff --git a/suite/cts/deviceTests/browserbench/Android.mk b/suite/cts/deviceTests/browserbench/Android.mk
new file mode 100644
index 0000000..6b241a9
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner ctstestserver
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceBrowserBench
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/suite/cts/deviceTests/browserbench/AndroidManifest.xml b/suite/cts/deviceTests/browserbench/AndroidManifest.xml
new file mode 100644
index 0000000..16626ad
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.browser">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+            android:targetPackage="com.android.cts.browser" />
+</manifest>
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/base.js b/suite/cts/deviceTests/browserbench/assets/octane/base.js
new file mode 100644
index 0000000..8801f2d
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/base.js
@@ -0,0 +1,289 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Simple framework for running the benchmark suites and
+// computing a score based on the timing measurements.
+
+
+// A benchmark has a name (string) and a function that will be run to
+// do the performance measurement. The optional setup and tearDown
+// arguments are functions that will be invoked before and after
+// running the benchmark, but the running time of these functions will
+// not be accounted for in the benchmark score.
+function Benchmark(name, run, setup, tearDown, minIterations) {
+  this.name = name;
+  this.run = run;
+  this.Setup = setup ? setup : function() { };
+  this.TearDown = tearDown ? tearDown : function() { };
+  this.minIterations = minIterations ? minIterations : 32;
+}
+
+
+// Benchmark results hold the benchmark and the measured time used to
+// run the benchmark. The benchmark score is computed later once a
+// full benchmark suite has run to completion.
+function BenchmarkResult(benchmark, time) {
+  this.benchmark = benchmark;
+  this.time = time;
+}
+
+
+// Automatically convert results to numbers. Used by the geometric
+// mean computation.
+BenchmarkResult.prototype.valueOf = function() {
+  return this.time;
+}
+
+
+// Suites of benchmarks consist of a name and the set of benchmarks in
+// addition to the reference timing that the final score will be based
+// on. This way, all scores are relative to a reference run and higher
+// scores implies better performance.
+function BenchmarkSuite(name, reference, benchmarks) {
+  this.name = name;
+  this.reference = reference;
+  this.benchmarks = benchmarks;
+  BenchmarkSuite.suites.push(this);
+}
+
+
+// Keep track of all declared benchmark suites.
+BenchmarkSuite.suites = [];
+
+
+// Scores are not comparable across versions. Bump the version if
+// you're making changes that will affect that scores, e.g. if you add
+// a new benchmark or change an existing one.
+BenchmarkSuite.version = '8';
+
+// Override the alert function to throw an exception instead.
+alert = function(s) {
+  throw "Alert called with argument: " + s;
+};
+
+// To make the benchmark results predictable, we replace Math.random
+// with a 100% deterministic alternative.
+Math.random = (function() {
+  var seed = 49734321;
+  return function() {
+    // Robert Jenkins' 32 bit integer hash function.
+    seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
+    seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
+    seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
+    seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
+    seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
+    seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
+    return (seed & 0xfffffff) / 0x10000000;
+  };
+})();
+
+
+// Runs all registered benchmark suites and optionally yields between
+// each individual benchmark to avoid running for too long in the
+// context of browsers. Once done, the final score is reported to the
+// runner.
+BenchmarkSuite.RunSuites = function(runner) {
+  var continuation = null;
+  var suites = BenchmarkSuite.suites;
+  var length = suites.length;
+  BenchmarkSuite.scores = [];
+  var index = 0;
+  function RunStep() {
+    while (continuation || index < length) {
+      if (continuation) {
+        continuation = continuation();
+      } else {
+        var suite = suites[index++];
+        if (runner.NotifyStart) runner.NotifyStart(suite.name);
+        continuation = suite.RunStep(runner);
+      }
+      if (continuation && typeof window != 'undefined' && window.setTimeout) {
+        window.setTimeout(RunStep, 25);
+        return;
+      }
+    }
+    if (runner.NotifyScore) {
+      var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores);
+      var formatted = BenchmarkSuite.FormatScore(100 * score);
+      runner.NotifyScore(formatted);
+    }
+  }
+  RunStep();
+}
+
+
+// Counts the total number of registered benchmarks. Useful for
+// showing progress as a percentage.
+BenchmarkSuite.CountBenchmarks = function() {
+  var result = 0;
+  var suites = BenchmarkSuite.suites;
+  for (var i = 0; i < suites.length; i++) {
+    result += suites[i].benchmarks.length;
+  }
+  return result;
+}
+
+
+// Computes the geometric mean of a set of numbers.
+BenchmarkSuite.GeometricMean = function(numbers) {
+  var log = 0;
+  for (var i = 0; i < numbers.length; i++) {
+    log += Math.log(numbers[i]);
+  }
+  return Math.pow(Math.E, log / numbers.length);
+}
+
+
+// Converts a score value to a string with at least three significant
+// digits.
+BenchmarkSuite.FormatScore = function(value) {
+  if (value > 100) {
+    return value.toFixed(0);
+  } else {
+    return value.toPrecision(3);
+  }
+}
+
+// Notifies the runner that we're done running a single benchmark in
+// the benchmark suite. This can be useful to report progress.
+BenchmarkSuite.prototype.NotifyStep = function(result) {
+  this.results.push(result);
+  if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name);
+}
+
+
+// Notifies the runner that we're done with running a suite and that
+// we have a result which can be reported to the user if needed.
+BenchmarkSuite.prototype.NotifyResult = function() {
+  var mean = BenchmarkSuite.GeometricMean(this.results);
+  var score = this.reference / mean;
+  BenchmarkSuite.scores.push(score);
+  if (this.runner.NotifyResult) {
+    var formatted = BenchmarkSuite.FormatScore(100 * score);
+    this.runner.NotifyResult(this.name, formatted);
+  }
+}
+
+
+// Notifies the runner that running a benchmark resulted in an error.
+BenchmarkSuite.prototype.NotifyError = function(error) {
+  if (this.runner.NotifyError) {
+    this.runner.NotifyError(this.name, error);
+  }
+  if (this.runner.NotifyStep) {
+    this.runner.NotifyStep(this.name);
+  }
+}
+
+
+// Runs a single benchmark for at least a second and computes the
+// average time it takes to run a single iteration.
+BenchmarkSuite.prototype.RunSingleBenchmark = function(benchmark, data) {
+  function Measure(data) {
+    var elapsed = 0;
+    var start = new Date();
+    for (var n = 0; elapsed < 1000; n++) {
+      benchmark.run();
+      elapsed = new Date() - start;
+    }
+    if (data != null) {
+      data.runs += n;
+      data.elapsed += elapsed;
+    }
+  }
+
+  if (data == null) {
+    // Measure the benchmark once for warm up and throw the result
+    // away. Return a fresh data object.
+    Measure(null);
+    return { runs: 0, elapsed: 0 };
+  } else {
+    Measure(data);
+    // If we've run too few iterations, we continue for another second.
+    if (data.runs < benchmark.minIterations) return data;
+    var usec = (data.elapsed * 1000) / data.runs;
+    this.NotifyStep(new BenchmarkResult(benchmark, usec));
+    return null;
+  }
+}
+
+
+// This function starts running a suite, but stops between each
+// individual benchmark in the suite and returns a continuation
+// function which can be invoked to run the next benchmark. Once the
+// last benchmark has been executed, null is returned.
+BenchmarkSuite.prototype.RunStep = function(runner) {
+  this.results = [];
+  this.runner = runner;
+  var length = this.benchmarks.length;
+  var index = 0;
+  var suite = this;
+  var data;
+
+  // Run the setup, the actual benchmark, and the tear down in three
+  // separate steps to allow the framework to yield between any of the
+  // steps.
+
+  function RunNextSetup() {
+    if (index < length) {
+      try {
+        suite.benchmarks[index].Setup();
+      } catch (e) {
+        suite.NotifyError(e);
+        return null;
+      }
+      return RunNextBenchmark;
+    }
+    suite.NotifyResult();
+    return null;
+  }
+
+  function RunNextBenchmark() {
+    try {
+      data = suite.RunSingleBenchmark(suite.benchmarks[index], data);
+    } catch (e) {
+      suite.NotifyError(e);
+      return null;
+    }
+    // If data is null, we're done with this benchmark.
+    return (data == null) ? RunNextTearDown : RunNextBenchmark();
+  }
+
+  function RunNextTearDown() {
+    try {
+      suite.benchmarks[index++].TearDown();
+    } catch (e) {
+      suite.NotifyError(e);
+      return null;
+    }
+    return RunNextSetup;
+  }
+
+  // Start out running the setup.
+  return RunNextSetup();
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/box2d.js b/suite/cts/deviceTests/browserbench/assets/octane/box2d.js
new file mode 100644
index 0000000..d6352e9
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/box2d.js
@@ -0,0 +1,562 @@
+// Portions copyright 2012 Google, Inc
+
+/*
+* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
+*
+* This software is provided 'as-is', without any express or implied
+* warranty.  In no event will the authors be held liable for any damages
+* arising from the use of this software.
+* Permission is granted to anyone to use this software for any purpose,
+* including commercial applications, and to alter it and redistribute it
+* freely, subject to the following restrictions:
+* 1. The origin of this software must not be misrepresented; you must not
+* claim that you wrote the original software. If you use this software
+* in a product, an acknowledgment in the product documentation would be
+* appreciated but is not required.
+* 2. Altered source versions must be plainly marked as such, and must not be
+* misrepresented as being the original software.
+* 3. This notice may not be removed or altered from any source distribution.
+*/
+
+var Box2D={};
+(function(F,G){function K(){}if(!(Object.defineProperty instanceof Function)&&Object.prototype.__defineGetter__ instanceof Function&&Object.prototype.__defineSetter__ instanceof Function)Object.defineProperty=function(y,w,A){A.get instanceof Function&&y.__defineGetter__(w,A.get);A.set instanceof Function&&y.__defineSetter__(w,A.set)};F.inherit=function(y,w){K.prototype=w.prototype;y.prototype=new K;y.prototype.constructor=y};F.generateCallback=function(y,w){return function(){w.apply(y,arguments)}};
+F.NVector=function(y){if(y===G)y=0;for(var w=Array(y||0),A=0;A<y;++A)w[A]=0;return w};F.is=function(y,w){if(y===null)return false;if(w instanceof Function&&y instanceof w)return true;if(y.constructor.__implements!=G&&y.constructor.__implements[w])return true;return false};F.parseUInt=function(y){return Math.abs(parseInt(y))}})(Box2D);var Vector=Array,Vector_a2j_Number=Box2D.NVector;if(typeof Box2D==="undefined")Box2D={};if(typeof Box2D.Collision==="undefined")Box2D.Collision={};
+if(typeof Box2D.Collision.Shapes==="undefined")Box2D.Collision.Shapes={};if(typeof Box2D.Common==="undefined")Box2D.Common={};if(typeof Box2D.Common.Math==="undefined")Box2D.Common.Math={};if(typeof Box2D.Dynamics==="undefined")Box2D.Dynamics={};if(typeof Box2D.Dynamics.Contacts==="undefined")Box2D.Dynamics.Contacts={};if(typeof Box2D.Dynamics.Controllers==="undefined")Box2D.Dynamics.Controllers={};if(typeof Box2D.Dynamics.Joints==="undefined")Box2D.Dynamics.Joints={};
+(function(){function F(){F.b2AABB.apply(this,arguments)}function G(){G.b2Bound.apply(this,arguments)}function K(){K.b2BoundValues.apply(this,arguments);this.constructor===K&&this.b2BoundValues.apply(this,arguments)}function y(){y.b2Collision.apply(this,arguments)}function w(){w.b2ContactID.apply(this,arguments);this.constructor===w&&this.b2ContactID.apply(this,arguments)}function A(){A.b2ContactPoint.apply(this,arguments)}function U(){U.b2Distance.apply(this,arguments)}function p(){p.b2DistanceInput.apply(this,
+arguments)}function B(){B.b2DistanceOutput.apply(this,arguments)}function Q(){Q.b2DistanceProxy.apply(this,arguments)}function V(){V.b2DynamicTree.apply(this,arguments);this.constructor===V&&this.b2DynamicTree.apply(this,arguments)}function M(){M.b2DynamicTreeBroadPhase.apply(this,arguments)}function L(){L.b2DynamicTreeNode.apply(this,arguments)}function I(){I.b2DynamicTreePair.apply(this,arguments)}function W(){W.b2Manifold.apply(this,arguments);this.constructor===W&&this.b2Manifold.apply(this,arguments)}
+function Y(){Y.b2ManifoldPoint.apply(this,arguments);this.constructor===Y&&this.b2ManifoldPoint.apply(this,arguments)}function k(){k.b2Point.apply(this,arguments)}function z(){z.b2RayCastInput.apply(this,arguments);this.constructor===z&&this.b2RayCastInput.apply(this,arguments)}function u(){u.b2RayCastOutput.apply(this,arguments)}function D(){D.b2Segment.apply(this,arguments)}function H(){H.b2SeparationFunction.apply(this,arguments)}function O(){O.b2Simplex.apply(this,arguments);this.constructor===
+O&&this.b2Simplex.apply(this,arguments)}function E(){E.b2SimplexCache.apply(this,arguments)}function R(){R.b2SimplexVertex.apply(this,arguments)}function N(){N.b2TimeOfImpact.apply(this,arguments)}function S(){S.b2TOIInput.apply(this,arguments)}function aa(){aa.b2WorldManifold.apply(this,arguments);this.constructor===aa&&this.b2WorldManifold.apply(this,arguments)}function Z(){Z.ClipVertex.apply(this,arguments)}function d(){d.Features.apply(this,arguments)}function h(){h.b2CircleShape.apply(this,arguments);
+this.constructor===h&&this.b2CircleShape.apply(this,arguments)}function l(){l.b2EdgeChainDef.apply(this,arguments);this.constructor===l&&this.b2EdgeChainDef.apply(this,arguments)}function j(){j.b2EdgeShape.apply(this,arguments);this.constructor===j&&this.b2EdgeShape.apply(this,arguments)}function o(){o.b2MassData.apply(this,arguments)}function q(){q.b2PolygonShape.apply(this,arguments);this.constructor===q&&this.b2PolygonShape.apply(this,arguments)}function n(){n.b2Shape.apply(this,arguments);this.constructor===
+n&&this.b2Shape.apply(this,arguments)}function a(){a.b2Color.apply(this,arguments);this.constructor===a&&this.b2Color.apply(this,arguments)}function c(){c.b2Settings.apply(this,arguments)}function g(){g.b2Mat22.apply(this,arguments);this.constructor===g&&this.b2Mat22.apply(this,arguments)}function b(){b.b2Mat33.apply(this,arguments);this.constructor===b&&this.b2Mat33.apply(this,arguments)}function e(){e.b2Math.apply(this,arguments)}function f(){f.b2Sweep.apply(this,arguments)}function m(){m.b2Transform.apply(this,
+arguments);this.constructor===m&&this.b2Transform.apply(this,arguments)}function r(){r.b2Vec2.apply(this,arguments);this.constructor===r&&this.b2Vec2.apply(this,arguments)}function s(){s.b2Vec3.apply(this,arguments);this.constructor===s&&this.b2Vec3.apply(this,arguments)}function v(){v.b2Body.apply(this,arguments);this.constructor===v&&this.b2Body.apply(this,arguments)}function t(){t.b2BodyDef.apply(this,arguments);this.constructor===t&&this.b2BodyDef.apply(this,arguments)}function x(){x.b2ContactFilter.apply(this,
+arguments)}function C(){C.b2ContactImpulse.apply(this,arguments)}function J(){J.b2ContactListener.apply(this,arguments)}function T(){T.b2ContactManager.apply(this,arguments);this.constructor===T&&this.b2ContactManager.apply(this,arguments)}function P(){P.b2DebugDraw.apply(this,arguments);this.constructor===P&&this.b2DebugDraw.apply(this,arguments)}function X(){X.b2DestructionListener.apply(this,arguments)}function $(){$.b2FilterData.apply(this,arguments)}function ba(){ba.b2Fixture.apply(this,arguments);
+this.constructor===ba&&this.b2Fixture.apply(this,arguments)}function ca(){ca.b2FixtureDef.apply(this,arguments);this.constructor===ca&&this.b2FixtureDef.apply(this,arguments)}function da(){da.b2Island.apply(this,arguments);this.constructor===da&&this.b2Island.apply(this,arguments)}function Fa(){Fa.b2TimeStep.apply(this,arguments)}function ea(){ea.b2World.apply(this,arguments);this.constructor===ea&&this.b2World.apply(this,arguments)}function Ga(){Ga.b2CircleContact.apply(this,arguments)}function fa(){fa.b2Contact.apply(this,
+arguments);this.constructor===fa&&this.b2Contact.apply(this,arguments)}function ga(){ga.b2ContactConstraint.apply(this,arguments);this.constructor===ga&&this.b2ContactConstraint.apply(this,arguments)}function Ha(){Ha.b2ContactConstraintPoint.apply(this,arguments)}function Ia(){Ia.b2ContactEdge.apply(this,arguments)}function ha(){ha.b2ContactFactory.apply(this,arguments);this.constructor===ha&&this.b2ContactFactory.apply(this,arguments)}function Ja(){Ja.b2ContactRegister.apply(this,arguments)}function Ka(){Ka.b2ContactResult.apply(this,
+arguments)}function ia(){ia.b2ContactSolver.apply(this,arguments);this.constructor===ia&&this.b2ContactSolver.apply(this,arguments)}function La(){La.b2EdgeAndCircleContact.apply(this,arguments)}function ja(){ja.b2NullContact.apply(this,arguments);this.constructor===ja&&this.b2NullContact.apply(this,arguments)}function Ma(){Ma.b2PolyAndCircleContact.apply(this,arguments)}function Na(){Na.b2PolyAndEdgeContact.apply(this,arguments)}function Oa(){Oa.b2PolygonContact.apply(this,arguments)}function ka(){ka.b2PositionSolverManifold.apply(this,
+arguments);this.constructor===ka&&this.b2PositionSolverManifold.apply(this,arguments)}function Pa(){Pa.b2BuoyancyController.apply(this,arguments)}function Qa(){Qa.b2ConstantAccelController.apply(this,arguments)}function Ra(){Ra.b2ConstantForceController.apply(this,arguments)}function Sa(){Sa.b2Controller.apply(this,arguments)}function Ta(){Ta.b2ControllerEdge.apply(this,arguments)}function Ua(){Ua.b2GravityController.apply(this,arguments)}function Va(){Va.b2TensorDampingController.apply(this,arguments)}
+function la(){la.b2DistanceJoint.apply(this,arguments);this.constructor===la&&this.b2DistanceJoint.apply(this,arguments)}function ma(){ma.b2DistanceJointDef.apply(this,arguments);this.constructor===ma&&this.b2DistanceJointDef.apply(this,arguments)}function na(){na.b2FrictionJoint.apply(this,arguments);this.constructor===na&&this.b2FrictionJoint.apply(this,arguments)}function oa(){oa.b2FrictionJointDef.apply(this,arguments);this.constructor===oa&&this.b2FrictionJointDef.apply(this,arguments)}function pa(){pa.b2GearJoint.apply(this,
+arguments);this.constructor===pa&&this.b2GearJoint.apply(this,arguments)}function qa(){qa.b2GearJointDef.apply(this,arguments);this.constructor===qa&&this.b2GearJointDef.apply(this,arguments)}function Wa(){Wa.b2Jacobian.apply(this,arguments)}function ra(){ra.b2Joint.apply(this,arguments);this.constructor===ra&&this.b2Joint.apply(this,arguments)}function sa(){sa.b2JointDef.apply(this,arguments);this.constructor===sa&&this.b2JointDef.apply(this,arguments)}function Xa(){Xa.b2JointEdge.apply(this,arguments)}
+function ta(){ta.b2LineJoint.apply(this,arguments);this.constructor===ta&&this.b2LineJoint.apply(this,arguments)}function ua(){ua.b2LineJointDef.apply(this,arguments);this.constructor===ua&&this.b2LineJointDef.apply(this,arguments)}function va(){va.b2MouseJoint.apply(this,arguments);this.constructor===va&&this.b2MouseJoint.apply(this,arguments)}function wa(){wa.b2MouseJointDef.apply(this,arguments);this.constructor===wa&&this.b2MouseJointDef.apply(this,arguments)}function xa(){xa.b2PrismaticJoint.apply(this,
+arguments);this.constructor===xa&&this.b2PrismaticJoint.apply(this,arguments)}function ya(){ya.b2PrismaticJointDef.apply(this,arguments);this.constructor===ya&&this.b2PrismaticJointDef.apply(this,arguments)}function za(){za.b2PulleyJoint.apply(this,arguments);this.constructor===za&&this.b2PulleyJoint.apply(this,arguments)}function Aa(){Aa.b2PulleyJointDef.apply(this,arguments);this.constructor===Aa&&this.b2PulleyJointDef.apply(this,arguments)}function Ba(){Ba.b2RevoluteJoint.apply(this,arguments);
+this.constructor===Ba&&this.b2RevoluteJoint.apply(this,arguments)}function Ca(){Ca.b2RevoluteJointDef.apply(this,arguments);this.constructor===Ca&&this.b2RevoluteJointDef.apply(this,arguments)}function Da(){Da.b2WeldJoint.apply(this,arguments);this.constructor===Da&&this.b2WeldJoint.apply(this,arguments)}function Ea(){Ea.b2WeldJointDef.apply(this,arguments);this.constructor===Ea&&this.b2WeldJointDef.apply(this,arguments)}Box2D.Collision.IBroadPhase="Box2D.Collision.IBroadPhase";Box2D.Collision.b2AABB=
+F;Box2D.Collision.b2Bound=G;Box2D.Collision.b2BoundValues=K;Box2D.Collision.b2Collision=y;Box2D.Collision.b2ContactID=w;Box2D.Collision.b2ContactPoint=A;Box2D.Collision.b2Distance=U;Box2D.Collision.b2DistanceInput=p;Box2D.Collision.b2DistanceOutput=B;Box2D.Collision.b2DistanceProxy=Q;Box2D.Collision.b2DynamicTree=V;Box2D.Collision.b2DynamicTreeBroadPhase=M;Box2D.Collision.b2DynamicTreeNode=L;Box2D.Collision.b2DynamicTreePair=I;Box2D.Collision.b2Manifold=W;Box2D.Collision.b2ManifoldPoint=Y;Box2D.Collision.b2Point=
+k;Box2D.Collision.b2RayCastInput=z;Box2D.Collision.b2RayCastOutput=u;Box2D.Collision.b2Segment=D;Box2D.Collision.b2SeparationFunction=H;Box2D.Collision.b2Simplex=O;Box2D.Collision.b2SimplexCache=E;Box2D.Collision.b2SimplexVertex=R;Box2D.Collision.b2TimeOfImpact=N;Box2D.Collision.b2TOIInput=S;Box2D.Collision.b2WorldManifold=aa;Box2D.Collision.ClipVertex=Z;Box2D.Collision.Features=d;Box2D.Collision.Shapes.b2CircleShape=h;Box2D.Collision.Shapes.b2EdgeChainDef=l;Box2D.Collision.Shapes.b2EdgeShape=j;Box2D.Collision.Shapes.b2MassData=
+o;Box2D.Collision.Shapes.b2PolygonShape=q;Box2D.Collision.Shapes.b2Shape=n;Box2D.Common.b2internal="Box2D.Common.b2internal";Box2D.Common.b2Color=a;Box2D.Common.b2Settings=c;Box2D.Common.Math.b2Mat22=g;Box2D.Common.Math.b2Mat33=b;Box2D.Common.Math.b2Math=e;Box2D.Common.Math.b2Sweep=f;Box2D.Common.Math.b2Transform=m;Box2D.Common.Math.b2Vec2=r;Box2D.Common.Math.b2Vec3=s;Box2D.Dynamics.b2Body=v;Box2D.Dynamics.b2BodyDef=t;Box2D.Dynamics.b2ContactFilter=x;Box2D.Dynamics.b2ContactImpulse=C;Box2D.Dynamics.b2ContactListener=
+J;Box2D.Dynamics.b2ContactManager=T;Box2D.Dynamics.b2DebugDraw=P;Box2D.Dynamics.b2DestructionListener=X;Box2D.Dynamics.b2FilterData=$;Box2D.Dynamics.b2Fixture=ba;Box2D.Dynamics.b2FixtureDef=ca;Box2D.Dynamics.b2Island=da;Box2D.Dynamics.b2TimeStep=Fa;Box2D.Dynamics.b2World=ea;Box2D.Dynamics.Contacts.b2CircleContact=Ga;Box2D.Dynamics.Contacts.b2Contact=fa;Box2D.Dynamics.Contacts.b2ContactConstraint=ga;Box2D.Dynamics.Contacts.b2ContactConstraintPoint=Ha;Box2D.Dynamics.Contacts.b2ContactEdge=Ia;Box2D.Dynamics.Contacts.b2ContactFactory=
+ha;Box2D.Dynamics.Contacts.b2ContactRegister=Ja;Box2D.Dynamics.Contacts.b2ContactResult=Ka;Box2D.Dynamics.Contacts.b2ContactSolver=ia;Box2D.Dynamics.Contacts.b2EdgeAndCircleContact=La;Box2D.Dynamics.Contacts.b2NullContact=ja;Box2D.Dynamics.Contacts.b2PolyAndCircleContact=Ma;Box2D.Dynamics.Contacts.b2PolyAndEdgeContact=Na;Box2D.Dynamics.Contacts.b2PolygonContact=Oa;Box2D.Dynamics.Contacts.b2PositionSolverManifold=ka;Box2D.Dynamics.Controllers.b2BuoyancyController=Pa;Box2D.Dynamics.Controllers.b2ConstantAccelController=
+Qa;Box2D.Dynamics.Controllers.b2ConstantForceController=Ra;Box2D.Dynamics.Controllers.b2Controller=Sa;Box2D.Dynamics.Controllers.b2ControllerEdge=Ta;Box2D.Dynamics.Controllers.b2GravityController=Ua;Box2D.Dynamics.Controllers.b2TensorDampingController=Va;Box2D.Dynamics.Joints.b2DistanceJoint=la;Box2D.Dynamics.Joints.b2DistanceJointDef=ma;Box2D.Dynamics.Joints.b2FrictionJoint=na;Box2D.Dynamics.Joints.b2FrictionJointDef=oa;Box2D.Dynamics.Joints.b2GearJoint=pa;Box2D.Dynamics.Joints.b2GearJointDef=qa;
+Box2D.Dynamics.Joints.b2Jacobian=Wa;Box2D.Dynamics.Joints.b2Joint=ra;Box2D.Dynamics.Joints.b2JointDef=sa;Box2D.Dynamics.Joints.b2JointEdge=Xa;Box2D.Dynamics.Joints.b2LineJoint=ta;Box2D.Dynamics.Joints.b2LineJointDef=ua;Box2D.Dynamics.Joints.b2MouseJoint=va;Box2D.Dynamics.Joints.b2MouseJointDef=wa;Box2D.Dynamics.Joints.b2PrismaticJoint=xa;Box2D.Dynamics.Joints.b2PrismaticJointDef=ya;Box2D.Dynamics.Joints.b2PulleyJoint=za;Box2D.Dynamics.Joints.b2PulleyJointDef=Aa;Box2D.Dynamics.Joints.b2RevoluteJoint=
+Ba;Box2D.Dynamics.Joints.b2RevoluteJointDef=Ca;Box2D.Dynamics.Joints.b2WeldJoint=Da;Box2D.Dynamics.Joints.b2WeldJointDef=Ea})();Box2D.postDefs=[];
+(function(){var F=Box2D.Collision.Shapes.b2CircleShape,G=Box2D.Collision.Shapes.b2PolygonShape,K=Box2D.Collision.Shapes.b2Shape,y=Box2D.Common.b2Settings,w=Box2D.Common.Math.b2Math,A=Box2D.Common.Math.b2Sweep,U=Box2D.Common.Math.b2Transform,p=Box2D.Common.Math.b2Vec2,B=Box2D.Collision.b2AABB,Q=Box2D.Collision.b2Bound,V=Box2D.Collision.b2BoundValues,M=Box2D.Collision.b2Collision,L=Box2D.Collision.b2ContactID,I=Box2D.Collision.b2ContactPoint,W=Box2D.Collision.b2Distance,Y=Box2D.Collision.b2DistanceInput,
+k=Box2D.Collision.b2DistanceOutput,z=Box2D.Collision.b2DistanceProxy,u=Box2D.Collision.b2DynamicTree,D=Box2D.Collision.b2DynamicTreeBroadPhase,H=Box2D.Collision.b2DynamicTreeNode,O=Box2D.Collision.b2DynamicTreePair,E=Box2D.Collision.b2Manifold,R=Box2D.Collision.b2ManifoldPoint,N=Box2D.Collision.b2Point,S=Box2D.Collision.b2RayCastInput,aa=Box2D.Collision.b2RayCastOutput,Z=Box2D.Collision.b2Segment,d=Box2D.Collision.b2SeparationFunction,h=Box2D.Collision.b2Simplex,l=Box2D.Collision.b2SimplexCache,j=
+Box2D.Collision.b2SimplexVertex,o=Box2D.Collision.b2TimeOfImpact,q=Box2D.Collision.b2TOIInput,n=Box2D.Collision.b2WorldManifold,a=Box2D.Collision.ClipVertex,c=Box2D.Collision.Features,g=Box2D.Collision.IBroadPhase;B.b2AABB=function(){this.lowerBound=new p;this.upperBound=new p};B.prototype.IsValid=function(){var b=this.upperBound.y-this.lowerBound.y;return b=(b=this.upperBound.x-this.lowerBound.x>=0&&b>=0)&&this.lowerBound.IsValid()&&this.upperBound.IsValid()};B.prototype.GetCenter=function(){return new p((this.lowerBound.x+
+this.upperBound.x)/2,(this.lowerBound.y+this.upperBound.y)/2)};B.prototype.GetExtents=function(){return new p((this.upperBound.x-this.lowerBound.x)/2,(this.upperBound.y-this.lowerBound.y)/2)};B.prototype.Contains=function(b){var e=true;return e=(e=(e=(e=e&&this.lowerBound.x<=b.lowerBound.x)&&this.lowerBound.y<=b.lowerBound.y)&&b.upperBound.x<=this.upperBound.x)&&b.upperBound.y<=this.upperBound.y};B.prototype.RayCast=function(b,e){var f=-Number.MAX_VALUE,m=Number.MAX_VALUE,r=e.p1.x,s=e.p1.y,v=e.p2.x-
+e.p1.x,t=e.p2.y-e.p1.y,x=Math.abs(t),C=b.normal,J=0,T=0,P=J=0;P=0;if(Math.abs(v)<Number.MIN_VALUE){if(r<this.lowerBound.x||this.upperBound.x<r)return false}else{J=1/v;T=(this.lowerBound.x-r)*J;J=(this.upperBound.x-r)*J;P=-1;if(T>J){P=T;T=J;J=P;P=1}if(T>f){C.x=P;C.y=0;f=T}m=Math.min(m,J);if(f>m)return false}if(x<Number.MIN_VALUE){if(s<this.lowerBound.y||this.upperBound.y<s)return false}else{J=1/t;T=(this.lowerBound.y-s)*J;J=(this.upperBound.y-s)*J;P=-1;if(T>J){P=T;T=J;J=P;P=1}if(T>f){C.y=P;C.x=0;f=
+T}m=Math.min(m,J);if(f>m)return false}b.fraction=f;return true};B.prototype.TestOverlap=function(b){var e=b.lowerBound.y-this.upperBound.y,f=this.lowerBound.y-b.upperBound.y;if(b.lowerBound.x-this.upperBound.x>0||e>0)return false;if(this.lowerBound.x-b.upperBound.x>0||f>0)return false;return true};B.Combine=function(b,e){var f=new B;f.Combine(b,e);return f};B.prototype.Combine=function(b,e){this.lowerBound.x=Math.min(b.lowerBound.x,e.lowerBound.x);this.lowerBound.y=Math.min(b.lowerBound.y,e.lowerBound.y);
+this.upperBound.x=Math.max(b.upperBound.x,e.upperBound.x);this.upperBound.y=Math.max(b.upperBound.y,e.upperBound.y)};Q.b2Bound=function(){};Q.prototype.IsLower=function(){return(this.value&1)==0};Q.prototype.IsUpper=function(){return(this.value&1)==1};Q.prototype.Swap=function(b){var e=this.value,f=this.proxy,m=this.stabbingCount;this.value=b.value;this.proxy=b.proxy;this.stabbingCount=b.stabbingCount;b.value=e;b.proxy=f;b.stabbingCount=m};V.b2BoundValues=function(){};V.prototype.b2BoundValues=function(){this.lowerValues=
+new Vector_a2j_Number;this.lowerValues[0]=0;this.lowerValues[1]=0;this.upperValues=new Vector_a2j_Number;this.upperValues[0]=0;this.upperValues[1]=0};M.b2Collision=function(){};M.ClipSegmentToLine=function(b,e,f,m){if(m===undefined)m=0;var r,s=0;r=e[0];var v=r.v;r=e[1];var t=r.v,x=f.x*v.x+f.y*v.y-m;r=f.x*t.x+f.y*t.y-m;x<=0&&b[s++].Set(e[0]);r<=0&&b[s++].Set(e[1]);if(x*r<0){f=x/(x-r);r=b[s];r=r.v;r.x=v.x+f*(t.x-v.x);r.y=v.y+f*(t.y-v.y);r=b[s];r.id=(x>0?e[0]:e[1]).id;++s}return s};M.EdgeSeparation=
+function(b,e,f,m,r){if(f===undefined)f=0;parseInt(b.m_vertexCount);var s=b.m_vertices;b=b.m_normals;var v=parseInt(m.m_vertexCount),t=m.m_vertices,x,C;x=e.R;C=b[f];b=x.col1.x*C.x+x.col2.x*C.y;m=x.col1.y*C.x+x.col2.y*C.y;x=r.R;var J=x.col1.x*b+x.col1.y*m;x=x.col2.x*b+x.col2.y*m;for(var T=0,P=Number.MAX_VALUE,X=0;X<v;++X){C=t[X];C=C.x*J+C.y*x;if(C<P){P=C;T=X}}C=s[f];x=e.R;f=e.position.x+(x.col1.x*C.x+x.col2.x*C.y);e=e.position.y+(x.col1.y*C.x+x.col2.y*C.y);C=t[T];x=r.R;s=r.position.x+(x.col1.x*C.x+
+x.col2.x*C.y);r=r.position.y+(x.col1.y*C.x+x.col2.y*C.y);s-=f;r-=e;return s*b+r*m};M.FindMaxSeparation=function(b,e,f,m,r){var s=parseInt(e.m_vertexCount),v=e.m_normals,t,x;x=r.R;t=m.m_centroid;var C=r.position.x+(x.col1.x*t.x+x.col2.x*t.y),J=r.position.y+(x.col1.y*t.x+x.col2.y*t.y);x=f.R;t=e.m_centroid;C-=f.position.x+(x.col1.x*t.x+x.col2.x*t.y);J-=f.position.y+(x.col1.y*t.x+x.col2.y*t.y);x=C*f.R.col1.x+J*f.R.col1.y;J=C*f.R.col2.x+J*f.R.col2.y;C=0;for(var T=-Number.MAX_VALUE,P=0;P<s;++P){t=v[P];
+t=t.x*x+t.y*J;if(t>T){T=t;C=P}}v=M.EdgeSeparation(e,f,C,m,r);t=parseInt(C-1>=0?C-1:s-1);x=M.EdgeSeparation(e,f,t,m,r);J=parseInt(C+1<s?C+1:0);T=M.EdgeSeparation(e,f,J,m,r);var X=P=0,$=0;if(x>v&&x>T){$=-1;P=t;X=x}else if(T>v){$=1;P=J;X=T}else{b[0]=C;return v}for(;;){C=$==-1?P-1>=0?P-1:s-1:P+1<s?P+1:0;v=M.EdgeSeparation(e,f,C,m,r);if(v>X){P=C;X=v}else break}b[0]=P;return X};M.FindIncidentEdge=function(b,e,f,m,r,s){if(m===undefined)m=0;parseInt(e.m_vertexCount);var v=e.m_normals,t=parseInt(r.m_vertexCount);
+e=r.m_vertices;r=r.m_normals;var x;x=f.R;f=v[m];v=x.col1.x*f.x+x.col2.x*f.y;var C=x.col1.y*f.x+x.col2.y*f.y;x=s.R;f=x.col1.x*v+x.col1.y*C;C=x.col2.x*v+x.col2.y*C;v=f;x=0;for(var J=Number.MAX_VALUE,T=0;T<t;++T){f=r[T];f=v*f.x+C*f.y;if(f<J){J=f;x=T}}r=parseInt(x);v=parseInt(r+1<t?r+1:0);t=b[0];f=e[r];x=s.R;t.v.x=s.position.x+(x.col1.x*f.x+x.col2.x*f.y);t.v.y=s.position.y+(x.col1.y*f.x+x.col2.y*f.y);t.id.features.referenceEdge=m;t.id.features.incidentEdge=r;t.id.features.incidentVertex=0;t=b[1];f=e[v];
+x=s.R;t.v.x=s.position.x+(x.col1.x*f.x+x.col2.x*f.y);t.v.y=s.position.y+(x.col1.y*f.x+x.col2.y*f.y);t.id.features.referenceEdge=m;t.id.features.incidentEdge=v;t.id.features.incidentVertex=1};M.MakeClipPointVector=function(){var b=new Vector(2);b[0]=new a;b[1]=new a;return b};M.CollidePolygons=function(b,e,f,m,r){var s;b.m_pointCount=0;var v=e.m_radius+m.m_radius;s=0;M.s_edgeAO[0]=s;var t=M.FindMaxSeparation(M.s_edgeAO,e,f,m,r);s=M.s_edgeAO[0];if(!(t>v)){var x=0;M.s_edgeBO[0]=x;var C=M.FindMaxSeparation(M.s_edgeBO,
+m,r,e,f);x=M.s_edgeBO[0];if(!(C>v)){var J=0,T=0;if(C>0.98*t+0.0010){t=m;m=e;e=r;f=f;J=x;b.m_type=E.e_faceB;T=1}else{t=e;m=m;e=f;f=r;J=s;b.m_type=E.e_faceA;T=0}s=M.s_incidentEdge;M.FindIncidentEdge(s,t,e,J,m,f);x=parseInt(t.m_vertexCount);r=t.m_vertices;t=r[J];var P;P=J+1<x?r[parseInt(J+1)]:r[0];J=M.s_localTangent;J.Set(P.x-t.x,P.y-t.y);J.Normalize();r=M.s_localNormal;r.x=J.y;r.y=-J.x;m=M.s_planePoint;m.Set(0.5*(t.x+P.x),0.5*(t.y+P.y));C=M.s_tangent;x=e.R;C.x=x.col1.x*J.x+x.col2.x*J.y;C.y=x.col1.y*
+J.x+x.col2.y*J.y;var X=M.s_tangent2;X.x=-C.x;X.y=-C.y;J=M.s_normal;J.x=C.y;J.y=-C.x;var $=M.s_v11,ba=M.s_v12;$.x=e.position.x+(x.col1.x*t.x+x.col2.x*t.y);$.y=e.position.y+(x.col1.y*t.x+x.col2.y*t.y);ba.x=e.position.x+(x.col1.x*P.x+x.col2.x*P.y);ba.y=e.position.y+(x.col1.y*P.x+x.col2.y*P.y);e=J.x*$.x+J.y*$.y;x=C.x*ba.x+C.y*ba.y+v;P=M.s_clipPoints1;t=M.s_clipPoints2;ba=0;ba=M.ClipSegmentToLine(P,s,X,-C.x*$.x-C.y*$.y+v);if(!(ba<2)){ba=M.ClipSegmentToLine(t,P,C,x);if(!(ba<2)){b.m_localPlaneNormal.SetV(r);
+b.m_localPoint.SetV(m);for(m=r=0;m<y.b2_maxManifoldPoints;++m){s=t[m];if(J.x*s.v.x+J.y*s.v.y-e<=v){C=b.m_points[r];x=f.R;X=s.v.x-f.position.x;$=s.v.y-f.position.y;C.m_localPoint.x=X*x.col1.x+$*x.col1.y;C.m_localPoint.y=X*x.col2.x+$*x.col2.y;C.m_id.Set(s.id);C.m_id.features.flip=T;++r}}b.m_pointCount=r}}}}};M.CollideCircles=function(b,e,f,m,r){b.m_pointCount=0;var s,v;s=f.R;v=e.m_p;var t=f.position.x+(s.col1.x*v.x+s.col2.x*v.y);f=f.position.y+(s.col1.y*v.x+s.col2.y*v.y);s=r.R;v=m.m_p;t=r.position.x+
+(s.col1.x*v.x+s.col2.x*v.y)-t;r=r.position.y+(s.col1.y*v.x+s.col2.y*v.y)-f;s=e.m_radius+m.m_radius;if(!(t*t+r*r>s*s)){b.m_type=E.e_circles;b.m_localPoint.SetV(e.m_p);b.m_localPlaneNormal.SetZero();b.m_pointCount=1;b.m_points[0].m_localPoint.SetV(m.m_p);b.m_points[0].m_id.key=0}};M.CollidePolygonAndCircle=function(b,e,f,m,r){var s=b.m_pointCount=0,v=0,t,x;x=r.R;t=m.m_p;var C=r.position.y+(x.col1.y*t.x+x.col2.y*t.y);s=r.position.x+(x.col1.x*t.x+x.col2.x*t.y)-f.position.x;v=C-f.position.y;x=f.R;f=s*
+x.col1.x+v*x.col1.y;x=s*x.col2.x+v*x.col2.y;var J=0;C=-Number.MAX_VALUE;r=e.m_radius+m.m_radius;var T=parseInt(e.m_vertexCount),P=e.m_vertices;e=e.m_normals;for(var X=0;X<T;++X){t=P[X];s=f-t.x;v=x-t.y;t=e[X];s=t.x*s+t.y*v;if(s>r)return;if(s>C){C=s;J=X}}s=parseInt(J);v=parseInt(s+1<T?s+1:0);t=P[s];P=P[v];if(C<Number.MIN_VALUE){b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.SetV(e[J]);b.m_localPoint.x=0.5*(t.x+P.x);b.m_localPoint.y=0.5*(t.y+P.y)}else{C=(f-P.x)*(t.x-P.x)+(x-P.y)*(t.y-P.y);
+if((f-t.x)*(P.x-t.x)+(x-t.y)*(P.y-t.y)<=0){if((f-t.x)*(f-t.x)+(x-t.y)*(x-t.y)>r*r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=f-t.x;b.m_localPlaneNormal.y=x-t.y;b.m_localPlaneNormal.Normalize();b.m_localPoint.SetV(t)}else if(C<=0){if((f-P.x)*(f-P.x)+(x-P.y)*(x-P.y)>r*r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=f-P.x;b.m_localPlaneNormal.y=x-P.y;b.m_localPlaneNormal.Normalize();b.m_localPoint.SetV(P)}else{J=0.5*(t.x+P.x);t=0.5*(t.y+P.y);C=(f-J)*e[s].x+
+(x-t)*e[s].y;if(C>r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=e[s].x;b.m_localPlaneNormal.y=e[s].y;b.m_localPlaneNormal.Normalize();b.m_localPoint.Set(J,t)}}b.m_points[0].m_localPoint.SetV(m.m_p);b.m_points[0].m_id.key=0};M.TestOverlap=function(b,e){var f=e.lowerBound,m=b.upperBound,r=f.x-m.x,s=f.y-m.y;f=b.lowerBound;m=e.upperBound;var v=f.y-m.y;if(r>0||s>0)return false;if(f.x-m.x>0||v>0)return false;return true};Box2D.postDefs.push(function(){Box2D.Collision.b2Collision.s_incidentEdge=
+M.MakeClipPointVector();Box2D.Collision.b2Collision.s_clipPoints1=M.MakeClipPointVector();Box2D.Collision.b2Collision.s_clipPoints2=M.MakeClipPointVector();Box2D.Collision.b2Collision.s_edgeAO=new Vector_a2j_Number(1);Box2D.Collision.b2Collision.s_edgeBO=new Vector_a2j_Number(1);Box2D.Collision.b2Collision.s_localTangent=new p;Box2D.Collision.b2Collision.s_localNormal=new p;Box2D.Collision.b2Collision.s_planePoint=new p;Box2D.Collision.b2Collision.s_normal=new p;Box2D.Collision.b2Collision.s_tangent=
+new p;Box2D.Collision.b2Collision.s_tangent2=new p;Box2D.Collision.b2Collision.s_v11=new p;Box2D.Collision.b2Collision.s_v12=new p;Box2D.Collision.b2Collision.b2CollidePolyTempVec=new p;Box2D.Collision.b2Collision.b2_nullFeature=255});L.b2ContactID=function(){this.features=new c};L.prototype.b2ContactID=function(){this.features._m_id=this};L.prototype.Set=function(b){this.key=b._key};L.prototype.Copy=function(){var b=new L;b.key=this.key;return b};Object.defineProperty(L.prototype,"key",{enumerable:false,
+configurable:true,get:function(){return this._key}});Object.defineProperty(L.prototype,"key",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._key=b;this.features._referenceEdge=this._key&255;this.features._incidentEdge=(this._key&65280)>>8&255;this.features._incidentVertex=(this._key&16711680)>>16&255;this.features._flip=(this._key&4278190080)>>24&255}});I.b2ContactPoint=function(){this.position=new p;this.velocity=new p;this.normal=new p;this.id=new L};W.b2Distance=
+function(){};W.Distance=function(b,e,f){++W.b2_gjkCalls;var m=f.proxyA,r=f.proxyB,s=f.transformA,v=f.transformB,t=W.s_simplex;t.ReadCache(e,m,s,r,v);var x=t.m_vertices,C=W.s_saveA,J=W.s_saveB,T=0;t.GetClosestPoint().LengthSquared();for(var P=0,X,$=0;$<20;){T=t.m_count;for(P=0;P<T;P++){C[P]=x[P].indexA;J[P]=x[P].indexB}switch(t.m_count){case 1:break;case 2:t.Solve2();break;case 3:t.Solve3();break;default:y.b2Assert(false)}if(t.m_count==3)break;X=t.GetClosestPoint();X.LengthSquared();P=t.GetSearchDirection();
+if(P.LengthSquared()<Number.MIN_VALUE*Number.MIN_VALUE)break;X=x[t.m_count];X.indexA=m.GetSupport(w.MulTMV(s.R,P.GetNegative()));X.wA=w.MulX(s,m.GetVertex(X.indexA));X.indexB=r.GetSupport(w.MulTMV(v.R,P));X.wB=w.MulX(v,r.GetVertex(X.indexB));X.w=w.SubtractVV(X.wB,X.wA);++$;++W.b2_gjkIters;var ba=false;for(P=0;P<T;P++)if(X.indexA==C[P]&&X.indexB==J[P]){ba=true;break}if(ba)break;++t.m_count}W.b2_gjkMaxIters=w.Max(W.b2_gjkMaxIters,$);t.GetWitnessPoints(b.pointA,b.pointB);b.distance=w.SubtractVV(b.pointA,
+b.pointB).Length();b.iterations=$;t.WriteCache(e);if(f.useRadii){e=m.m_radius;r=r.m_radius;if(b.distance>e+r&&b.distance>Number.MIN_VALUE){b.distance-=e+r;f=w.SubtractVV(b.pointB,b.pointA);f.Normalize();b.pointA.x+=e*f.x;b.pointA.y+=e*f.y;b.pointB.x-=r*f.x;b.pointB.y-=r*f.y}else{X=new p;X.x=0.5*(b.pointA.x+b.pointB.x);X.y=0.5*(b.pointA.y+b.pointB.y);b.pointA.x=b.pointB.x=X.x;b.pointA.y=b.pointB.y=X.y;b.distance=0}}};Box2D.postDefs.push(function(){Box2D.Collision.b2Distance.s_simplex=new h;Box2D.Collision.b2Distance.s_saveA=
+new Vector_a2j_Number(3);Box2D.Collision.b2Distance.s_saveB=new Vector_a2j_Number(3)});Y.b2DistanceInput=function(){};k.b2DistanceOutput=function(){this.pointA=new p;this.pointB=new p};z.b2DistanceProxy=function(){};z.prototype.Set=function(b){switch(b.GetType()){case K.e_circleShape:b=b instanceof F?b:null;this.m_vertices=new Vector(1,true);this.m_vertices[0]=b.m_p;this.m_count=1;this.m_radius=b.m_radius;break;case K.e_polygonShape:b=b instanceof G?b:null;this.m_vertices=b.m_vertices;this.m_count=
+b.m_vertexCount;this.m_radius=b.m_radius;break;default:y.b2Assert(false)}};z.prototype.GetSupport=function(b){for(var e=0,f=this.m_vertices[0].x*b.x+this.m_vertices[0].y*b.y,m=1;m<this.m_count;++m){var r=this.m_vertices[m].x*b.x+this.m_vertices[m].y*b.y;if(r>f){e=m;f=r}}return e};z.prototype.GetSupportVertex=function(b){for(var e=0,f=this.m_vertices[0].x*b.x+this.m_vertices[0].y*b.y,m=1;m<this.m_count;++m){var r=this.m_vertices[m].x*b.x+this.m_vertices[m].y*b.y;if(r>f){e=m;f=r}}return this.m_vertices[e]};
+z.prototype.GetVertexCount=function(){return this.m_count};z.prototype.GetVertex=function(b){if(b===undefined)b=0;y.b2Assert(0<=b&&b<this.m_count);return this.m_vertices[b]};u.b2DynamicTree=function(){};u.prototype.b2DynamicTree=function(){this.m_freeList=this.m_root=null;this.m_insertionCount=this.m_path=0};u.prototype.CreateProxy=function(b,e){var f=this.AllocateNode(),m=y.b2_aabbExtension,r=y.b2_aabbExtension;f.aabb.lowerBound.x=b.lowerBound.x-m;f.aabb.lowerBound.y=b.lowerBound.y-r;f.aabb.upperBound.x=
+b.upperBound.x+m;f.aabb.upperBound.y=b.upperBound.y+r;f.userData=e;this.InsertLeaf(f);return f};u.prototype.DestroyProxy=function(b){this.RemoveLeaf(b);this.FreeNode(b)};u.prototype.MoveProxy=function(b,e,f){y.b2Assert(b.IsLeaf());if(b.aabb.Contains(e))return false;this.RemoveLeaf(b);var m=y.b2_aabbExtension+y.b2_aabbMultiplier*(f.x>0?f.x:-f.x);f=y.b2_aabbExtension+y.b2_aabbMultiplier*(f.y>0?f.y:-f.y);b.aabb.lowerBound.x=e.lowerBound.x-m;b.aabb.lowerBound.y=e.lowerBound.y-f;b.aabb.upperBound.x=e.upperBound.x+
+m;b.aabb.upperBound.y=e.upperBound.y+f;this.InsertLeaf(b);return true};u.prototype.Rebalance=function(b){if(b===undefined)b=0;if(this.m_root!=null)for(var e=0;e<b;e++){for(var f=this.m_root,m=0;f.IsLeaf()==false;){f=this.m_path>>m&1?f.child2:f.child1;m=m+1&31}++this.m_path;this.RemoveLeaf(f);this.InsertLeaf(f)}};u.prototype.GetFatAABB=function(b){return b.aabb};u.prototype.GetUserData=function(b){return b.userData};u.prototype.Query=function(b,e){if(this.m_root!=null){var f=new Vector,m=0;for(f[m++]=
+this.m_root;m>0;){var r=f[--m];if(r.aabb.TestOverlap(e))if(r.IsLeaf()){if(!b(r))break}else{f[m++]=r.child1;f[m++]=r.child2}}}};u.prototype.RayCast=function(b,e){if(this.m_root!=null){var f=e.p1,m=e.p2,r=w.SubtractVV(f,m);r.Normalize();r=w.CrossFV(1,r);var s=w.AbsV(r),v=e.maxFraction,t=new B,x=0,C=0;x=f.x+v*(m.x-f.x);C=f.y+v*(m.y-f.y);t.lowerBound.x=Math.min(f.x,x);t.lowerBound.y=Math.min(f.y,C);t.upperBound.x=Math.max(f.x,x);t.upperBound.y=Math.max(f.y,C);var J=new Vector,T=0;for(J[T++]=this.m_root;T>
+0;){v=J[--T];if(v.aabb.TestOverlap(t)!=false){x=v.aabb.GetCenter();C=v.aabb.GetExtents();if(!(Math.abs(r.x*(f.x-x.x)+r.y*(f.y-x.y))-s.x*C.x-s.y*C.y>0))if(v.IsLeaf()){x=new S;x.p1=e.p1;x.p2=e.p2;x.maxFraction=e.maxFraction;v=b(x,v);if(v==0)break;if(v>0){x=f.x+v*(m.x-f.x);C=f.y+v*(m.y-f.y);t.lowerBound.x=Math.min(f.x,x);t.lowerBound.y=Math.min(f.y,C);t.upperBound.x=Math.max(f.x,x);t.upperBound.y=Math.max(f.y,C)}}else{J[T++]=v.child1;J[T++]=v.child2}}}}};u.prototype.AllocateNode=function(){if(this.m_freeList){var b=
+this.m_freeList;this.m_freeList=b.parent;b.parent=null;b.child1=null;b.child2=null;return b}return new H};u.prototype.FreeNode=function(b){b.parent=this.m_freeList;this.m_freeList=b};u.prototype.InsertLeaf=function(b){++this.m_insertionCount;if(this.m_root==null){this.m_root=b;this.m_root.parent=null}else{var e=b.aabb.GetCenter(),f=this.m_root;if(f.IsLeaf()==false){do{var m=f.child1;f=f.child2;f=Math.abs((m.aabb.lowerBound.x+m.aabb.upperBound.x)/2-e.x)+Math.abs((m.aabb.lowerBound.y+m.aabb.upperBound.y)/
+2-e.y)<Math.abs((f.aabb.lowerBound.x+f.aabb.upperBound.x)/2-e.x)+Math.abs((f.aabb.lowerBound.y+f.aabb.upperBound.y)/2-e.y)?m:f}while(f.IsLeaf()==false)}e=f.parent;m=this.AllocateNode();m.parent=e;m.userData=null;m.aabb.Combine(b.aabb,f.aabb);if(e){if(f.parent.child1==f)e.child1=m;else e.child2=m;m.child1=f;m.child2=b;f.parent=m;b.parent=m;do{if(e.aabb.Contains(m.aabb))break;e.aabb.Combine(e.child1.aabb,e.child2.aabb);m=e;e=e.parent}while(e)}else{m.child1=f;m.child2=b;f.parent=m;this.m_root=b.parent=
+m}}};u.prototype.RemoveLeaf=function(b){if(b==this.m_root)this.m_root=null;else{var e=b.parent,f=e.parent;b=e.child1==b?e.child2:e.child1;if(f){if(f.child1==e)f.child1=b;else f.child2=b;b.parent=f;for(this.FreeNode(e);f;){e=f.aabb;f.aabb=B.Combine(f.child1.aabb,f.child2.aabb);if(e.Contains(f.aabb))break;f=f.parent}}else{this.m_root=b;b.parent=null;this.FreeNode(e)}}};D.b2DynamicTreeBroadPhase=function(){this.m_tree=new u;this.m_moveBuffer=new Vector;this.m_pairBuffer=new Vector;this.m_pairCount=0};
+D.prototype.CreateProxy=function(b,e){var f=this.m_tree.CreateProxy(b,e);++this.m_proxyCount;this.BufferMove(f);return f};D.prototype.DestroyProxy=function(b){this.UnBufferMove(b);--this.m_proxyCount;this.m_tree.DestroyProxy(b)};D.prototype.MoveProxy=function(b,e,f){this.m_tree.MoveProxy(b,e,f)&&this.BufferMove(b)};D.prototype.TestOverlap=function(b,e){var f=this.m_tree.GetFatAABB(b),m=this.m_tree.GetFatAABB(e);return f.TestOverlap(m)};D.prototype.GetUserData=function(b){return this.m_tree.GetUserData(b)};
+D.prototype.GetFatAABB=function(b){return this.m_tree.GetFatAABB(b)};D.prototype.GetProxyCount=function(){return this.m_proxyCount};D.prototype.UpdatePairs=function(b){var e=this;var f=e.m_pairCount=0,m;for(f=0;f<e.m_moveBuffer.length;++f){m=e.m_moveBuffer[f];var r=e.m_tree.GetFatAABB(m);e.m_tree.Query(function(t){if(t==m)return true;if(e.m_pairCount==e.m_pairBuffer.length)e.m_pairBuffer[e.m_pairCount]=new O;var x=e.m_pairBuffer[e.m_pairCount];x.proxyA=t<m?t:m;x.proxyB=t>=m?t:m;++e.m_pairCount;return true},
+r)}for(f=e.m_moveBuffer.length=0;f<e.m_pairCount;){r=e.m_pairBuffer[f];var s=e.m_tree.GetUserData(r.proxyA),v=e.m_tree.GetUserData(r.proxyB);b(s,v);for(++f;f<e.m_pairCount;){s=e.m_pairBuffer[f];if(s.proxyA!=r.proxyA||s.proxyB!=r.proxyB)break;++f}}};D.prototype.Query=function(b,e){this.m_tree.Query(b,e)};D.prototype.RayCast=function(b,e){this.m_tree.RayCast(b,e)};D.prototype.Validate=function(){};D.prototype.Rebalance=function(b){if(b===undefined)b=0;this.m_tree.Rebalance(b)};D.prototype.BufferMove=
+function(b){this.m_moveBuffer[this.m_moveBuffer.length]=b};D.prototype.UnBufferMove=function(b){this.m_moveBuffer.splice(parseInt(this.m_moveBuffer.indexOf(b)),1)};D.prototype.ComparePairs=function(){return 0};D.__implements={};D.__implements[g]=true;H.b2DynamicTreeNode=function(){this.aabb=new B};H.prototype.IsLeaf=function(){return this.child1==null};O.b2DynamicTreePair=function(){};E.b2Manifold=function(){this.m_pointCount=0};E.prototype.b2Manifold=function(){this.m_points=new Vector(y.b2_maxManifoldPoints);
+for(var b=0;b<y.b2_maxManifoldPoints;b++)this.m_points[b]=new R;this.m_localPlaneNormal=new p;this.m_localPoint=new p};E.prototype.Reset=function(){for(var b=0;b<y.b2_maxManifoldPoints;b++)(this.m_points[b]instanceof R?this.m_points[b]:null).Reset();this.m_localPlaneNormal.SetZero();this.m_localPoint.SetZero();this.m_pointCount=this.m_type=0};E.prototype.Set=function(b){this.m_pointCount=b.m_pointCount;for(var e=0;e<y.b2_maxManifoldPoints;e++)(this.m_points[e]instanceof R?this.m_points[e]:null).Set(b.m_points[e]);
+this.m_localPlaneNormal.SetV(b.m_localPlaneNormal);this.m_localPoint.SetV(b.m_localPoint);this.m_type=b.m_type};E.prototype.Copy=function(){var b=new E;b.Set(this);return b};Box2D.postDefs.push(function(){Box2D.Collision.b2Manifold.e_circles=1;Box2D.Collision.b2Manifold.e_faceA=2;Box2D.Collision.b2Manifold.e_faceB=4});R.b2ManifoldPoint=function(){this.m_localPoint=new p;this.m_id=new L};R.prototype.b2ManifoldPoint=function(){this.Reset()};R.prototype.Reset=function(){this.m_localPoint.SetZero();this.m_tangentImpulse=
+this.m_normalImpulse=0;this.m_id.key=0};R.prototype.Set=function(b){this.m_localPoint.SetV(b.m_localPoint);this.m_normalImpulse=b.m_normalImpulse;this.m_tangentImpulse=b.m_tangentImpulse;this.m_id.Set(b.m_id)};N.b2Point=function(){this.p=new p};N.prototype.Support=function(){return this.p};N.prototype.GetFirstVertex=function(){return this.p};S.b2RayCastInput=function(){this.p1=new p;this.p2=new p};S.prototype.b2RayCastInput=function(b,e,f){if(b===undefined)b=null;if(e===undefined)e=null;if(f===undefined)f=
+1;b&&this.p1.SetV(b);e&&this.p2.SetV(e);this.maxFraction=f};aa.b2RayCastOutput=function(){this.normal=new p};Z.b2Segment=function(){this.p1=new p;this.p2=new p};Z.prototype.TestSegment=function(b,e,f,m){if(m===undefined)m=0;var r=f.p1,s=f.p2.x-r.x,v=f.p2.y-r.y;f=this.p2.y-this.p1.y;var t=-(this.p2.x-this.p1.x),x=100*Number.MIN_VALUE,C=-(s*f+v*t);if(C>x){var J=r.x-this.p1.x,T=r.y-this.p1.y;r=J*f+T*t;if(0<=r&&r<=m*C){m=-s*T+v*J;if(-x*C<=m&&m<=C*(1+x)){r/=C;m=Math.sqrt(f*f+t*t);f/=m;t/=m;b[0]=r;e.Set(f,
+t);return true}}}return false};Z.prototype.Extend=function(b){this.ExtendForward(b);this.ExtendBackward(b)};Z.prototype.ExtendForward=function(b){var e=this.p2.x-this.p1.x,f=this.p2.y-this.p1.y;b=Math.min(e>0?(b.upperBound.x-this.p1.x)/e:e<0?(b.lowerBound.x-this.p1.x)/e:Number.POSITIVE_INFINITY,f>0?(b.upperBound.y-this.p1.y)/f:f<0?(b.lowerBound.y-this.p1.y)/f:Number.POSITIVE_INFINITY);this.p2.x=this.p1.x+e*b;this.p2.y=this.p1.y+f*b};Z.prototype.ExtendBackward=function(b){var e=-this.p2.x+this.p1.x,
+f=-this.p2.y+this.p1.y;b=Math.min(e>0?(b.upperBound.x-this.p2.x)/e:e<0?(b.lowerBound.x-this.p2.x)/e:Number.POSITIVE_INFINITY,f>0?(b.upperBound.y-this.p2.y)/f:f<0?(b.lowerBound.y-this.p2.y)/f:Number.POSITIVE_INFINITY);this.p1.x=this.p2.x+e*b;this.p1.y=this.p2.y+f*b};d.b2SeparationFunction=function(){this.m_localPoint=new p;this.m_axis=new p};d.prototype.Initialize=function(b,e,f,m,r){this.m_proxyA=e;this.m_proxyB=m;var s=parseInt(b.count);y.b2Assert(0<s&&s<3);var v,t,x,C,J=C=x=m=e=0,T=0;J=0;if(s==
+1){this.m_type=d.e_points;v=this.m_proxyA.GetVertex(b.indexA[0]);t=this.m_proxyB.GetVertex(b.indexB[0]);s=v;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=t;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);this.m_axis.x=x-e;this.m_axis.y=C-m;this.m_axis.Normalize()}else{if(b.indexB[0]==b.indexB[1]){this.m_type=d.e_faceA;e=this.m_proxyA.GetVertex(b.indexA[0]);m=this.m_proxyA.GetVertex(b.indexA[1]);t=this.m_proxyB.GetVertex(b.indexB[0]);
+this.m_localPoint.x=0.5*(e.x+m.x);this.m_localPoint.y=0.5*(e.y+m.y);this.m_axis=w.CrossVF(w.SubtractVV(m,e),1);this.m_axis.Normalize();s=this.m_axis;b=f.R;J=b.col1.x*s.x+b.col2.x*s.y;T=b.col1.y*s.x+b.col2.y*s.y;s=this.m_localPoint;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=t;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);J=(x-e)*J+(C-m)*T}else if(b.indexA[0]==b.indexA[0]){this.m_type=d.e_faceB;x=this.m_proxyB.GetVertex(b.indexB[0]);
+C=this.m_proxyB.GetVertex(b.indexB[1]);v=this.m_proxyA.GetVertex(b.indexA[0]);this.m_localPoint.x=0.5*(x.x+C.x);this.m_localPoint.y=0.5*(x.y+C.y);this.m_axis=w.CrossVF(w.SubtractVV(C,x),1);this.m_axis.Normalize();s=this.m_axis;b=r.R;J=b.col1.x*s.x+b.col2.x*s.y;T=b.col1.y*s.x+b.col2.y*s.y;s=this.m_localPoint;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=v;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);J=(e-
+x)*J+(m-C)*T}else{e=this.m_proxyA.GetVertex(b.indexA[0]);m=this.m_proxyA.GetVertex(b.indexA[1]);x=this.m_proxyB.GetVertex(b.indexB[0]);C=this.m_proxyB.GetVertex(b.indexB[1]);w.MulX(f,v);v=w.MulMV(f.R,w.SubtractVV(m,e));w.MulX(r,t);J=w.MulMV(r.R,w.SubtractVV(C,x));r=v.x*v.x+v.y*v.y;t=J.x*J.x+J.y*J.y;b=w.SubtractVV(J,v);f=v.x*b.x+v.y*b.y;b=J.x*b.x+J.y*b.y;v=v.x*J.x+v.y*J.y;T=r*t-v*v;J=0;if(T!=0)J=w.Clamp((v*b-f*t)/T,0,1);if((v*J+b)/t<0)J=w.Clamp((v-f)/r,0,1);v=new p;v.x=e.x+J*(m.x-e.x);v.y=e.y+J*(m.y-
+e.y);t=new p;t.x=x.x+J*(C.x-x.x);t.y=x.y+J*(C.y-x.y);if(J==0||J==1){this.m_type=d.e_faceB;this.m_axis=w.CrossVF(w.SubtractVV(C,x),1);this.m_axis.Normalize();this.m_localPoint=t}else{this.m_type=d.e_faceA;this.m_axis=w.CrossVF(w.SubtractVV(m,e),1);this.m_localPoint=v}}J<0&&this.m_axis.NegativeSelf()}};d.prototype.Evaluate=function(b,e){var f,m,r=0;switch(this.m_type){case d.e_points:f=w.MulTMV(b.R,this.m_axis);m=w.MulTMV(e.R,this.m_axis.GetNegative());f=this.m_proxyA.GetSupportVertex(f);m=this.m_proxyB.GetSupportVertex(m);
+f=w.MulX(b,f);m=w.MulX(e,m);return r=(m.x-f.x)*this.m_axis.x+(m.y-f.y)*this.m_axis.y;case d.e_faceA:r=w.MulMV(b.R,this.m_axis);f=w.MulX(b,this.m_localPoint);m=w.MulTMV(e.R,r.GetNegative());m=this.m_proxyB.GetSupportVertex(m);m=w.MulX(e,m);return r=(m.x-f.x)*r.x+(m.y-f.y)*r.y;case d.e_faceB:r=w.MulMV(e.R,this.m_axis);m=w.MulX(e,this.m_localPoint);f=w.MulTMV(b.R,r.GetNegative());f=this.m_proxyA.GetSupportVertex(f);f=w.MulX(b,f);return r=(f.x-m.x)*r.x+(f.y-m.y)*r.y;default:y.b2Assert(false);return 0}};
+Box2D.postDefs.push(function(){Box2D.Collision.b2SeparationFunction.e_points=1;Box2D.Collision.b2SeparationFunction.e_faceA=2;Box2D.Collision.b2SeparationFunction.e_faceB=4});h.b2Simplex=function(){this.m_v1=new j;this.m_v2=new j;this.m_v3=new j;this.m_vertices=new Vector(3)};h.prototype.b2Simplex=function(){this.m_vertices[0]=this.m_v1;this.m_vertices[1]=this.m_v2;this.m_vertices[2]=this.m_v3};h.prototype.ReadCache=function(b,e,f,m,r){y.b2Assert(0<=b.count&&b.count<=3);var s,v;this.m_count=b.count;
+for(var t=this.m_vertices,x=0;x<this.m_count;x++){var C=t[x];C.indexA=b.indexA[x];C.indexB=b.indexB[x];s=e.GetVertex(C.indexA);v=m.GetVertex(C.indexB);C.wA=w.MulX(f,s);C.wB=w.MulX(r,v);C.w=w.SubtractVV(C.wB,C.wA);C.a=0}if(this.m_count>1){b=b.metric;s=this.GetMetric();if(s<0.5*b||2*b<s||s<Number.MIN_VALUE)this.m_count=0}if(this.m_count==0){C=t[0];C.indexA=0;C.indexB=0;s=e.GetVertex(0);v=m.GetVertex(0);C.wA=w.MulX(f,s);C.wB=w.MulX(r,v);C.w=w.SubtractVV(C.wB,C.wA);this.m_count=1}};h.prototype.WriteCache=
+function(b){b.metric=this.GetMetric();b.count=Box2D.parseUInt(this.m_count);for(var e=this.m_vertices,f=0;f<this.m_count;f++){b.indexA[f]=Box2D.parseUInt(e[f].indexA);b.indexB[f]=Box2D.parseUInt(e[f].indexB)}};h.prototype.GetSearchDirection=function(){switch(this.m_count){case 1:return this.m_v1.w.GetNegative();case 2:var b=w.SubtractVV(this.m_v2.w,this.m_v1.w);return w.CrossVV(b,this.m_v1.w.GetNegative())>0?w.CrossFV(1,b):w.CrossVF(b,1);default:y.b2Assert(false);return new p}};h.prototype.GetClosestPoint=
+function(){switch(this.m_count){case 0:y.b2Assert(false);return new p;case 1:return this.m_v1.w;case 2:return new p(this.m_v1.a*this.m_v1.w.x+this.m_v2.a*this.m_v2.w.x,this.m_v1.a*this.m_v1.w.y+this.m_v2.a*this.m_v2.w.y);default:y.b2Assert(false);return new p}};h.prototype.GetWitnessPoints=function(b,e){switch(this.m_count){case 0:y.b2Assert(false);break;case 1:b.SetV(this.m_v1.wA);e.SetV(this.m_v1.wB);break;case 2:b.x=this.m_v1.a*this.m_v1.wA.x+this.m_v2.a*this.m_v2.wA.x;b.y=this.m_v1.a*this.m_v1.wA.y+
+this.m_v2.a*this.m_v2.wA.y;e.x=this.m_v1.a*this.m_v1.wB.x+this.m_v2.a*this.m_v2.wB.x;e.y=this.m_v1.a*this.m_v1.wB.y+this.m_v2.a*this.m_v2.wB.y;break;case 3:e.x=b.x=this.m_v1.a*this.m_v1.wA.x+this.m_v2.a*this.m_v2.wA.x+this.m_v3.a*this.m_v3.wA.x;e.y=b.y=this.m_v1.a*this.m_v1.wA.y+this.m_v2.a*this.m_v2.wA.y+this.m_v3.a*this.m_v3.wA.y;break;default:y.b2Assert(false)}};h.prototype.GetMetric=function(){switch(this.m_count){case 0:y.b2Assert(false);return 0;case 1:return 0;case 2:return w.SubtractVV(this.m_v1.w,
+this.m_v2.w).Length();case 3:return w.CrossVV(w.SubtractVV(this.m_v2.w,this.m_v1.w),w.SubtractVV(this.m_v3.w,this.m_v1.w));default:y.b2Assert(false);return 0}};h.prototype.Solve2=function(){var b=this.m_v1.w,e=this.m_v2.w,f=w.SubtractVV(e,b);b=-(b.x*f.x+b.y*f.y);if(b<=0)this.m_count=this.m_v1.a=1;else{e=e.x*f.x+e.y*f.y;if(e<=0){this.m_count=this.m_v2.a=1;this.m_v1.Set(this.m_v2)}else{f=1/(e+b);this.m_v1.a=e*f;this.m_v2.a=b*f;this.m_count=2}}};h.prototype.Solve3=function(){var b=this.m_v1.w,e=this.m_v2.w,
+f=this.m_v3.w,m=w.SubtractVV(e,b),r=w.Dot(b,m),s=w.Dot(e,m);r=-r;var v=w.SubtractVV(f,b),t=w.Dot(b,v),x=w.Dot(f,v);t=-t;var C=w.SubtractVV(f,e),J=w.Dot(e,C);C=w.Dot(f,C);J=-J;v=w.CrossVV(m,v);m=v*w.CrossVV(e,f);f=v*w.CrossVV(f,b);b=v*w.CrossVV(b,e);if(r<=0&&t<=0)this.m_count=this.m_v1.a=1;else if(s>0&&r>0&&b<=0){x=1/(s+r);this.m_v1.a=s*x;this.m_v2.a=r*x;this.m_count=2}else if(x>0&&t>0&&f<=0){s=1/(x+t);this.m_v1.a=x*s;this.m_v3.a=t*s;this.m_count=2;this.m_v2.Set(this.m_v3)}else if(s<=0&&J<=0){this.m_count=
+this.m_v2.a=1;this.m_v1.Set(this.m_v2)}else if(x<=0&&C<=0){this.m_count=this.m_v3.a=1;this.m_v1.Set(this.m_v3)}else if(C>0&&J>0&&m<=0){s=1/(C+J);this.m_v2.a=C*s;this.m_v3.a=J*s;this.m_count=2;this.m_v1.Set(this.m_v3)}else{s=1/(m+f+b);this.m_v1.a=m*s;this.m_v2.a=f*s;this.m_v3.a=b*s;this.m_count=3}};l.b2SimplexCache=function(){this.indexA=new Vector_a2j_Number(3);this.indexB=new Vector_a2j_Number(3)};j.b2SimplexVertex=function(){};j.prototype.Set=function(b){this.wA.SetV(b.wA);this.wB.SetV(b.wB);this.w.SetV(b.w);
+this.a=b.a;this.indexA=b.indexA;this.indexB=b.indexB};o.b2TimeOfImpact=function(){};o.TimeOfImpact=function(b){++o.b2_toiCalls;var e=b.proxyA,f=b.proxyB,m=b.sweepA,r=b.sweepB;y.b2Assert(m.t0==r.t0);y.b2Assert(1-m.t0>Number.MIN_VALUE);var s=e.m_radius+f.m_radius;b=b.tolerance;var v=0,t=0,x=0;o.s_cache.count=0;for(o.s_distanceInput.useRadii=false;;){m.GetTransform(o.s_xfA,v);r.GetTransform(o.s_xfB,v);o.s_distanceInput.proxyA=e;o.s_distanceInput.proxyB=f;o.s_distanceInput.transformA=o.s_xfA;o.s_distanceInput.transformB=
+o.s_xfB;W.Distance(o.s_distanceOutput,o.s_cache,o.s_distanceInput);if(o.s_distanceOutput.distance<=0){v=1;break}o.s_fcn.Initialize(o.s_cache,e,o.s_xfA,f,o.s_xfB);var C=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(C<=0){v=1;break}if(t==0)x=C>s?w.Max(s-b,0.75*s):w.Max(C-b,0.02*s);if(C-x<0.5*b){if(t==0){v=1;break}break}var J=v,T=v,P=1;C=C;m.GetTransform(o.s_xfA,P);r.GetTransform(o.s_xfB,P);var X=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(X>=x){v=1;break}for(var $=0;;){var ba=0;ba=$&1?T+(x-C)*(P-T)/(X-C):0.5*(T+P);
+m.GetTransform(o.s_xfA,ba);r.GetTransform(o.s_xfB,ba);var ca=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(w.Abs(ca-x)<0.025*b){J=ba;break}if(ca>x){T=ba;C=ca}else{P=ba;X=ca}++$;++o.b2_toiRootIters;if($==50)break}o.b2_toiMaxRootIters=w.Max(o.b2_toiMaxRootIters,$);if(J<(1+100*Number.MIN_VALUE)*v)break;v=J;t++;++o.b2_toiIters;if(t==1E3)break}o.b2_toiMaxIters=w.Max(o.b2_toiMaxIters,t);return v};Box2D.postDefs.push(function(){Box2D.Collision.b2TimeOfImpact.b2_toiCalls=0;Box2D.Collision.b2TimeOfImpact.b2_toiIters=
+0;Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters=0;Box2D.Collision.b2TimeOfImpact.b2_toiRootIters=0;Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters=0;Box2D.Collision.b2TimeOfImpact.s_cache=new l;Box2D.Collision.b2TimeOfImpact.s_distanceInput=new Y;Box2D.Collision.b2TimeOfImpact.s_xfA=new U;Box2D.Collision.b2TimeOfImpact.s_xfB=new U;Box2D.Collision.b2TimeOfImpact.s_fcn=new d;Box2D.Collision.b2TimeOfImpact.s_distanceOutput=new k});q.b2TOIInput=function(){this.proxyA=new z;this.proxyB=new z;this.sweepA=
+new A;this.sweepB=new A};n.b2WorldManifold=function(){this.m_normal=new p};n.prototype.b2WorldManifold=function(){this.m_points=new Vector(y.b2_maxManifoldPoints);for(var b=0;b<y.b2_maxManifoldPoints;b++)this.m_points[b]=new p};n.prototype.Initialize=function(b,e,f,m,r){if(f===undefined)f=0;if(r===undefined)r=0;if(b.m_pointCount!=0){var s=0,v,t,x=0,C=0,J=0,T=0,P=0;v=0;switch(b.m_type){case E.e_circles:t=e.R;v=b.m_localPoint;s=e.position.x+t.col1.x*v.x+t.col2.x*v.y;e=e.position.y+t.col1.y*v.x+t.col2.y*
+v.y;t=m.R;v=b.m_points[0].m_localPoint;b=m.position.x+t.col1.x*v.x+t.col2.x*v.y;m=m.position.y+t.col1.y*v.x+t.col2.y*v.y;v=b-s;t=m-e;x=v*v+t*t;if(x>Number.MIN_VALUE*Number.MIN_VALUE){x=Math.sqrt(x);this.m_normal.x=v/x;this.m_normal.y=t/x}else{this.m_normal.x=1;this.m_normal.y=0}v=e+f*this.m_normal.y;m=m-r*this.m_normal.y;this.m_points[0].x=0.5*(s+f*this.m_normal.x+(b-r*this.m_normal.x));this.m_points[0].y=0.5*(v+m);break;case E.e_faceA:t=e.R;v=b.m_localPlaneNormal;x=t.col1.x*v.x+t.col2.x*v.y;C=t.col1.y*
+v.x+t.col2.y*v.y;t=e.R;v=b.m_localPoint;J=e.position.x+t.col1.x*v.x+t.col2.x*v.y;T=e.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_normal.x=x;this.m_normal.y=C;for(s=0;s<b.m_pointCount;s++){t=m.R;v=b.m_points[s].m_localPoint;P=m.position.x+t.col1.x*v.x+t.col2.x*v.y;v=m.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_points[s].x=P+0.5*(f-(P-J)*x-(v-T)*C-r)*x;this.m_points[s].y=v+0.5*(f-(P-J)*x-(v-T)*C-r)*C}break;case E.e_faceB:t=m.R;v=b.m_localPlaneNormal;x=t.col1.x*v.x+t.col2.x*v.y;C=t.col1.y*v.x+t.col2.y*
+v.y;t=m.R;v=b.m_localPoint;J=m.position.x+t.col1.x*v.x+t.col2.x*v.y;T=m.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_normal.x=-x;this.m_normal.y=-C;for(s=0;s<b.m_pointCount;s++){t=e.R;v=b.m_points[s].m_localPoint;P=e.position.x+t.col1.x*v.x+t.col2.x*v.y;v=e.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_points[s].x=P+0.5*(r-(P-J)*x-(v-T)*C-f)*x;this.m_points[s].y=v+0.5*(r-(P-J)*x-(v-T)*C-f)*C}}}};a.ClipVertex=function(){this.v=new p;this.id=new L};a.prototype.Set=function(b){this.v.SetV(b.v);this.id.Set(b.id)};
+c.Features=function(){};Object.defineProperty(c.prototype,"referenceEdge",{enumerable:false,configurable:true,get:function(){return this._referenceEdge}});Object.defineProperty(c.prototype,"referenceEdge",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._referenceEdge=b;this._m_id._key=this._m_id._key&4294967040|this._referenceEdge&255}});Object.defineProperty(c.prototype,"incidentEdge",{enumerable:false,configurable:true,get:function(){return this._incidentEdge}});Object.defineProperty(c.prototype,
+"incidentEdge",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._incidentEdge=b;this._m_id._key=this._m_id._key&4294902015|this._incidentEdge<<8&65280}});Object.defineProperty(c.prototype,"incidentVertex",{enumerable:false,configurable:true,get:function(){return this._incidentVertex}});Object.defineProperty(c.prototype,"incidentVertex",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._incidentVertex=b;this._m_id._key=this._m_id._key&4278255615|
+this._incidentVertex<<16&16711680}});Object.defineProperty(c.prototype,"flip",{enumerable:false,configurable:true,get:function(){return this._flip}});Object.defineProperty(c.prototype,"flip",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._flip=b;this._m_id._key=this._m_id._key&16777215|this._flip<<24&4278190080}})})();
+(function(){var F=Box2D.Common.b2Settings,G=Box2D.Collision.Shapes.b2CircleShape,K=Box2D.Collision.Shapes.b2EdgeChainDef,y=Box2D.Collision.Shapes.b2EdgeShape,w=Box2D.Collision.Shapes.b2MassData,A=Box2D.Collision.Shapes.b2PolygonShape,U=Box2D.Collision.Shapes.b2Shape,p=Box2D.Common.Math.b2Mat22,B=Box2D.Common.Math.b2Math,Q=Box2D.Common.Math.b2Transform,V=Box2D.Common.Math.b2Vec2,M=Box2D.Collision.b2Distance,L=Box2D.Collision.b2DistanceInput,I=Box2D.Collision.b2DistanceOutput,W=Box2D.Collision.b2DistanceProxy,
+Y=Box2D.Collision.b2SimplexCache;Box2D.inherit(G,Box2D.Collision.Shapes.b2Shape);G.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;G.b2CircleShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments);this.m_p=new V};G.prototype.Copy=function(){var k=new G;k.Set(this);return k};G.prototype.Set=function(k){this.__super.Set.call(this,k);if(Box2D.is(k,G))this.m_p.SetV((k instanceof G?k:null).m_p)};G.prototype.TestPoint=function(k,z){var u=k.R,D=k.position.x+(u.col1.x*this.m_p.x+
+u.col2.x*this.m_p.y);u=k.position.y+(u.col1.y*this.m_p.x+u.col2.y*this.m_p.y);D=z.x-D;u=z.y-u;return D*D+u*u<=this.m_radius*this.m_radius};G.prototype.RayCast=function(k,z,u){var D=u.R,H=z.p1.x-(u.position.x+(D.col1.x*this.m_p.x+D.col2.x*this.m_p.y));u=z.p1.y-(u.position.y+(D.col1.y*this.m_p.x+D.col2.y*this.m_p.y));D=z.p2.x-z.p1.x;var O=z.p2.y-z.p1.y,E=H*D+u*O,R=D*D+O*O,N=E*E-R*(H*H+u*u-this.m_radius*this.m_radius);if(N<0||R<Number.MIN_VALUE)return false;E=-(E+Math.sqrt(N));if(0<=E&&E<=z.maxFraction*
+R){E/=R;k.fraction=E;k.normal.x=H+E*D;k.normal.y=u+E*O;k.normal.Normalize();return true}return false};G.prototype.ComputeAABB=function(k,z){var u=z.R,D=z.position.x+(u.col1.x*this.m_p.x+u.col2.x*this.m_p.y);u=z.position.y+(u.col1.y*this.m_p.x+u.col2.y*this.m_p.y);k.lowerBound.Set(D-this.m_radius,u-this.m_radius);k.upperBound.Set(D+this.m_radius,u+this.m_radius)};G.prototype.ComputeMass=function(k,z){if(z===undefined)z=0;k.mass=z*F.b2_pi*this.m_radius*this.m_radius;k.center.SetV(this.m_p);k.I=k.mass*
+(0.5*this.m_radius*this.m_radius+(this.m_p.x*this.m_p.x+this.m_p.y*this.m_p.y))};G.prototype.ComputeSubmergedArea=function(k,z,u,D){if(z===undefined)z=0;u=B.MulX(u,this.m_p);var H=-(B.Dot(k,u)-z);if(H<-this.m_radius+Number.MIN_VALUE)return 0;if(H>this.m_radius){D.SetV(u);return Math.PI*this.m_radius*this.m_radius}z=this.m_radius*this.m_radius;var O=H*H;H=z*(Math.asin(H/this.m_radius)+Math.PI/2)+H*Math.sqrt(z-O);z=-2/3*Math.pow(z-O,1.5)/H;D.x=u.x+k.x*z;D.y=u.y+k.y*z;return H};G.prototype.GetLocalPosition=
+function(){return this.m_p};G.prototype.SetLocalPosition=function(k){this.m_p.SetV(k)};G.prototype.GetRadius=function(){return this.m_radius};G.prototype.SetRadius=function(k){if(k===undefined)k=0;this.m_radius=k};G.prototype.b2CircleShape=function(k){if(k===undefined)k=0;this.__super.b2Shape.call(this);this.m_type=U.e_circleShape;this.m_radius=k};K.b2EdgeChainDef=function(){};K.prototype.b2EdgeChainDef=function(){this.vertexCount=0;this.isALoop=true;this.vertices=[]};Box2D.inherit(y,Box2D.Collision.Shapes.b2Shape);
+y.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;y.b2EdgeShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments);this.s_supportVec=new V;this.m_v1=new V;this.m_v2=new V;this.m_coreV1=new V;this.m_coreV2=new V;this.m_normal=new V;this.m_direction=new V;this.m_cornerDir1=new V;this.m_cornerDir2=new V};y.prototype.TestPoint=function(){return false};y.prototype.RayCast=function(k,z,u){var D,H=z.p2.x-z.p1.x,O=z.p2.y-z.p1.y;D=u.R;var E=u.position.x+(D.col1.x*this.m_v1.x+
+D.col2.x*this.m_v1.y),R=u.position.y+(D.col1.y*this.m_v1.x+D.col2.y*this.m_v1.y),N=u.position.y+(D.col1.y*this.m_v2.x+D.col2.y*this.m_v2.y)-R;u=-(u.position.x+(D.col1.x*this.m_v2.x+D.col2.x*this.m_v2.y)-E);D=100*Number.MIN_VALUE;var S=-(H*N+O*u);if(S>D){E=z.p1.x-E;var aa=z.p1.y-R;R=E*N+aa*u;if(0<=R&&R<=z.maxFraction*S){z=-H*aa+O*E;if(-D*S<=z&&z<=S*(1+D)){R/=S;k.fraction=R;z=Math.sqrt(N*N+u*u);k.normal.x=N/z;k.normal.y=u/z;return true}}}return false};y.prototype.ComputeAABB=function(k,z){var u=z.R,
+D=z.position.x+(u.col1.x*this.m_v1.x+u.col2.x*this.m_v1.y),H=z.position.y+(u.col1.y*this.m_v1.x+u.col2.y*this.m_v1.y),O=z.position.x+(u.col1.x*this.m_v2.x+u.col2.x*this.m_v2.y);u=z.position.y+(u.col1.y*this.m_v2.x+u.col2.y*this.m_v2.y);if(D<O){k.lowerBound.x=D;k.upperBound.x=O}else{k.lowerBound.x=O;k.upperBound.x=D}if(H<u){k.lowerBound.y=H;k.upperBound.y=u}else{k.lowerBound.y=u;k.upperBound.y=H}};y.prototype.ComputeMass=function(k){k.mass=0;k.center.SetV(this.m_v1);k.I=0};y.prototype.ComputeSubmergedArea=
+function(k,z,u,D){if(z===undefined)z=0;var H=new V(k.x*z,k.y*z),O=B.MulX(u,this.m_v1);u=B.MulX(u,this.m_v2);var E=B.Dot(k,O)-z;k=B.Dot(k,u)-z;if(E>0)if(k>0)return 0;else{O.x=-k/(E-k)*O.x+E/(E-k)*u.x;O.y=-k/(E-k)*O.y+E/(E-k)*u.y}else if(k>0){u.x=-k/(E-k)*O.x+E/(E-k)*u.x;u.y=-k/(E-k)*O.y+E/(E-k)*u.y}D.x=(H.x+O.x+u.x)/3;D.y=(H.y+O.y+u.y)/3;return 0.5*((O.x-H.x)*(u.y-H.y)-(O.y-H.y)*(u.x-H.x))};y.prototype.GetLength=function(){return this.m_length};y.prototype.GetVertex1=function(){return this.m_v1};y.prototype.GetVertex2=
+function(){return this.m_v2};y.prototype.GetCoreVertex1=function(){return this.m_coreV1};y.prototype.GetCoreVertex2=function(){return this.m_coreV2};y.prototype.GetNormalVector=function(){return this.m_normal};y.prototype.GetDirectionVector=function(){return this.m_direction};y.prototype.GetCorner1Vector=function(){return this.m_cornerDir1};y.prototype.GetCorner2Vector=function(){return this.m_cornerDir2};y.prototype.Corner1IsConvex=function(){return this.m_cornerConvex1};y.prototype.Corner2IsConvex=
+function(){return this.m_cornerConvex2};y.prototype.GetFirstVertex=function(k){var z=k.R;return new V(k.position.x+(z.col1.x*this.m_coreV1.x+z.col2.x*this.m_coreV1.y),k.position.y+(z.col1.y*this.m_coreV1.x+z.col2.y*this.m_coreV1.y))};y.prototype.GetNextEdge=function(){return this.m_nextEdge};y.prototype.GetPrevEdge=function(){return this.m_prevEdge};y.prototype.Support=function(k,z,u){if(z===undefined)z=0;if(u===undefined)u=0;var D=k.R,H=k.position.x+(D.col1.x*this.m_coreV1.x+D.col2.x*this.m_coreV1.y),
+O=k.position.y+(D.col1.y*this.m_coreV1.x+D.col2.y*this.m_coreV1.y),E=k.position.x+(D.col1.x*this.m_coreV2.x+D.col2.x*this.m_coreV2.y);k=k.position.y+(D.col1.y*this.m_coreV2.x+D.col2.y*this.m_coreV2.y);if(H*z+O*u>E*z+k*u){this.s_supportVec.x=H;this.s_supportVec.y=O}else{this.s_supportVec.x=E;this.s_supportVec.y=k}return this.s_supportVec};y.prototype.b2EdgeShape=function(k,z){this.__super.b2Shape.call(this);this.m_type=U.e_edgeShape;this.m_nextEdge=this.m_prevEdge=null;this.m_v1=k;this.m_v2=z;this.m_direction.Set(this.m_v2.x-
+this.m_v1.x,this.m_v2.y-this.m_v1.y);this.m_length=this.m_direction.Normalize();this.m_normal.Set(this.m_direction.y,-this.m_direction.x);this.m_coreV1.Set(-F.b2_toiSlop*(this.m_normal.x-this.m_direction.x)+this.m_v1.x,-F.b2_toiSlop*(this.m_normal.y-this.m_direction.y)+this.m_v1.y);this.m_coreV2.Set(-F.b2_toiSlop*(this.m_normal.x+this.m_direction.x)+this.m_v2.x,-F.b2_toiSlop*(this.m_normal.y+this.m_direction.y)+this.m_v2.y);this.m_cornerDir1=this.m_normal;this.m_cornerDir2.Set(-this.m_normal.x,-this.m_normal.y)};
+y.prototype.SetPrevEdge=function(k,z,u,D){this.m_prevEdge=k;this.m_coreV1=z;this.m_cornerDir1=u;this.m_cornerConvex1=D};y.prototype.SetNextEdge=function(k,z,u,D){this.m_nextEdge=k;this.m_coreV2=z;this.m_cornerDir2=u;this.m_cornerConvex2=D};w.b2MassData=function(){this.mass=0;this.center=new V(0,0);this.I=0};Box2D.inherit(A,Box2D.Collision.Shapes.b2Shape);A.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;A.b2PolygonShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments)};
+A.prototype.Copy=function(){var k=new A;k.Set(this);return k};A.prototype.Set=function(k){this.__super.Set.call(this,k);if(Box2D.is(k,A)){k=k instanceof A?k:null;this.m_centroid.SetV(k.m_centroid);this.m_vertexCount=k.m_vertexCount;this.Reserve(this.m_vertexCount);for(var z=0;z<this.m_vertexCount;z++){this.m_vertices[z].SetV(k.m_vertices[z]);this.m_normals[z].SetV(k.m_normals[z])}}};A.prototype.SetAsArray=function(k,z){if(z===undefined)z=0;var u=new Vector,D=0,H;for(D=0;D<k.length;++D){H=k[D];u.push(H)}this.SetAsVector(u,
+z)};A.AsArray=function(k,z){if(z===undefined)z=0;var u=new A;u.SetAsArray(k,z);return u};A.prototype.SetAsVector=function(k,z){if(z===undefined)z=0;if(z==0)z=k.length;F.b2Assert(2<=z);this.m_vertexCount=z;this.Reserve(z);var u=0;for(u=0;u<this.m_vertexCount;u++)this.m_vertices[u].SetV(k[u]);for(u=0;u<this.m_vertexCount;++u){var D=parseInt(u),H=parseInt(u+1<this.m_vertexCount?u+1:0);D=B.SubtractVV(this.m_vertices[H],this.m_vertices[D]);F.b2Assert(D.LengthSquared()>Number.MIN_VALUE);this.m_normals[u].SetV(B.CrossVF(D,
+1));this.m_normals[u].Normalize()}this.m_centroid=A.ComputeCentroid(this.m_vertices,this.m_vertexCount)};A.AsVector=function(k,z){if(z===undefined)z=0;var u=new A;u.SetAsVector(k,z);return u};A.prototype.SetAsBox=function(k,z){if(k===undefined)k=0;if(z===undefined)z=0;this.m_vertexCount=4;this.Reserve(4);this.m_vertices[0].Set(-k,-z);this.m_vertices[1].Set(k,-z);this.m_vertices[2].Set(k,z);this.m_vertices[3].Set(-k,z);this.m_normals[0].Set(0,-1);this.m_normals[1].Set(1,0);this.m_normals[2].Set(0,
+1);this.m_normals[3].Set(-1,0);this.m_centroid.SetZero()};A.AsBox=function(k,z){if(k===undefined)k=0;if(z===undefined)z=0;var u=new A;u.SetAsBox(k,z);return u};A.prototype.SetAsOrientedBox=function(k,z,u,D){if(k===undefined)k=0;if(z===undefined)z=0;if(u===undefined)u=null;if(D===undefined)D=0;this.m_vertexCount=4;this.Reserve(4);this.m_vertices[0].Set(-k,-z);this.m_vertices[1].Set(k,-z);this.m_vertices[2].Set(k,z);this.m_vertices[3].Set(-k,z);this.m_normals[0].Set(0,-1);this.m_normals[1].Set(1,0);
+this.m_normals[2].Set(0,1);this.m_normals[3].Set(-1,0);this.m_centroid=u;k=new Q;k.position=u;k.R.Set(D);for(u=0;u<this.m_vertexCount;++u){this.m_vertices[u]=B.MulX(k,this.m_vertices[u]);this.m_normals[u]=B.MulMV(k.R,this.m_normals[u])}};A.AsOrientedBox=function(k,z,u,D){if(k===undefined)k=0;if(z===undefined)z=0;if(u===undefined)u=null;if(D===undefined)D=0;var H=new A;H.SetAsOrientedBox(k,z,u,D);return H};A.prototype.SetAsEdge=function(k,z){this.m_vertexCount=2;this.Reserve(2);this.m_vertices[0].SetV(k);
+this.m_vertices[1].SetV(z);this.m_centroid.x=0.5*(k.x+z.x);this.m_centroid.y=0.5*(k.y+z.y);this.m_normals[0]=B.CrossVF(B.SubtractVV(z,k),1);this.m_normals[0].Normalize();this.m_normals[1].x=-this.m_normals[0].x;this.m_normals[1].y=-this.m_normals[0].y};A.AsEdge=function(k,z){var u=new A;u.SetAsEdge(k,z);return u};A.prototype.TestPoint=function(k,z){var u;u=k.R;for(var D=z.x-k.position.x,H=z.y-k.position.y,O=D*u.col1.x+H*u.col1.y,E=D*u.col2.x+H*u.col2.y,R=0;R<this.m_vertexCount;++R){u=this.m_vertices[R];
+D=O-u.x;H=E-u.y;u=this.m_normals[R];if(u.x*D+u.y*H>0)return false}return true};A.prototype.RayCast=function(k,z,u){var D=0,H=z.maxFraction,O=0,E=0,R,N;O=z.p1.x-u.position.x;E=z.p1.y-u.position.y;R=u.R;var S=O*R.col1.x+E*R.col1.y,aa=O*R.col2.x+E*R.col2.y;O=z.p2.x-u.position.x;E=z.p2.y-u.position.y;R=u.R;z=O*R.col1.x+E*R.col1.y-S;R=O*R.col2.x+E*R.col2.y-aa;for(var Z=parseInt(-1),d=0;d<this.m_vertexCount;++d){N=this.m_vertices[d];O=N.x-S;E=N.y-aa;N=this.m_normals[d];O=N.x*O+N.y*E;E=N.x*z+N.y*R;if(E==
+0){if(O<0)return false}else if(E<0&&O<D*E){D=O/E;Z=d}else if(E>0&&O<H*E)H=O/E;if(H<D-Number.MIN_VALUE)return false}if(Z>=0){k.fraction=D;R=u.R;N=this.m_normals[Z];k.normal.x=R.col1.x*N.x+R.col2.x*N.y;k.normal.y=R.col1.y*N.x+R.col2.y*N.y;return true}return false};A.prototype.ComputeAABB=function(k,z){for(var u=z.R,D=this.m_vertices[0],H=z.position.x+(u.col1.x*D.x+u.col2.x*D.y),O=z.position.y+(u.col1.y*D.x+u.col2.y*D.y),E=H,R=O,N=1;N<this.m_vertexCount;++N){D=this.m_vertices[N];var S=z.position.x+(u.col1.x*
+D.x+u.col2.x*D.y);D=z.position.y+(u.col1.y*D.x+u.col2.y*D.y);H=H<S?H:S;O=O<D?O:D;E=E>S?E:S;R=R>D?R:D}k.lowerBound.x=H-this.m_radius;k.lowerBound.y=O-this.m_radius;k.upperBound.x=E+this.m_radius;k.upperBound.y=R+this.m_radius};A.prototype.ComputeMass=function(k,z){if(z===undefined)z=0;if(this.m_vertexCount==2){k.center.x=0.5*(this.m_vertices[0].x+this.m_vertices[1].x);k.center.y=0.5*(this.m_vertices[0].y+this.m_vertices[1].y);k.mass=0;k.I=0}else{for(var u=0,D=0,H=0,O=0,E=1/3,R=0;R<this.m_vertexCount;++R){var N=
+this.m_vertices[R],S=R+1<this.m_vertexCount?this.m_vertices[parseInt(R+1)]:this.m_vertices[0],aa=N.x-0,Z=N.y-0,d=S.x-0,h=S.y-0,l=aa*h-Z*d,j=0.5*l;H+=j;u+=j*E*(0+N.x+S.x);D+=j*E*(0+N.y+S.y);N=aa;Z=Z;d=d;h=h;O+=l*(E*(0.25*(N*N+d*N+d*d)+(0*N+0*d))+0+(E*(0.25*(Z*Z+h*Z+h*h)+(0*Z+0*h))+0))}k.mass=z*H;u*=1/H;D*=1/H;k.center.Set(u,D);k.I=z*O}};A.prototype.ComputeSubmergedArea=function(k,z,u,D){if(z===undefined)z=0;var H=B.MulTMV(u.R,k),O=z-B.Dot(k,u.position),E=new Vector_a2j_Number,R=0,N=parseInt(-1);z=
+parseInt(-1);var S=false;for(k=k=0;k<this.m_vertexCount;++k){E[k]=B.Dot(H,this.m_vertices[k])-O;var aa=E[k]<-Number.MIN_VALUE;if(k>0)if(aa){if(!S){N=k-1;R++}}else if(S){z=k-1;R++}S=aa}switch(R){case 0:if(S){k=new w;this.ComputeMass(k,1);D.SetV(B.MulX(u,k.center));return k.mass}else return 0;case 1:if(N==-1)N=this.m_vertexCount-1;else z=this.m_vertexCount-1}k=parseInt((N+1)%this.m_vertexCount);H=parseInt((z+1)%this.m_vertexCount);O=(0-E[N])/(E[k]-E[N]);E=(0-E[z])/(E[H]-E[z]);N=new V(this.m_vertices[N].x*
+(1-O)+this.m_vertices[k].x*O,this.m_vertices[N].y*(1-O)+this.m_vertices[k].y*O);z=new V(this.m_vertices[z].x*(1-E)+this.m_vertices[H].x*E,this.m_vertices[z].y*(1-E)+this.m_vertices[H].y*E);E=0;O=new V;R=this.m_vertices[k];for(k=k;k!=H;){k=(k+1)%this.m_vertexCount;S=k==H?z:this.m_vertices[k];aa=0.5*((R.x-N.x)*(S.y-N.y)-(R.y-N.y)*(S.x-N.x));E+=aa;O.x+=aa*(N.x+R.x+S.x)/3;O.y+=aa*(N.y+R.y+S.y)/3;R=S}O.Multiply(1/E);D.SetV(B.MulX(u,O));return E};A.prototype.GetVertexCount=function(){return this.m_vertexCount};
+A.prototype.GetVertices=function(){return this.m_vertices};A.prototype.GetNormals=function(){return this.m_normals};A.prototype.GetSupport=function(k){for(var z=0,u=this.m_vertices[0].x*k.x+this.m_vertices[0].y*k.y,D=1;D<this.m_vertexCount;++D){var H=this.m_vertices[D].x*k.x+this.m_vertices[D].y*k.y;if(H>u){z=D;u=H}}return z};A.prototype.GetSupportVertex=function(k){for(var z=0,u=this.m_vertices[0].x*k.x+this.m_vertices[0].y*k.y,D=1;D<this.m_vertexCount;++D){var H=this.m_vertices[D].x*k.x+this.m_vertices[D].y*
+k.y;if(H>u){z=D;u=H}}return this.m_vertices[z]};A.prototype.Validate=function(){return false};A.prototype.b2PolygonShape=function(){this.__super.b2Shape.call(this);this.m_type=U.e_polygonShape;this.m_centroid=new V;this.m_vertices=new Vector;this.m_normals=new Vector};A.prototype.Reserve=function(k){if(k===undefined)k=0;for(var z=parseInt(this.m_vertices.length);z<k;z++){this.m_vertices[z]=new V;this.m_normals[z]=new V}};A.ComputeCentroid=function(k,z){if(z===undefined)z=0;for(var u=new V,D=0,H=1/
+3,O=0;O<z;++O){var E=k[O],R=O+1<z?k[parseInt(O+1)]:k[0],N=0.5*((E.x-0)*(R.y-0)-(E.y-0)*(R.x-0));D+=N;u.x+=N*H*(0+E.x+R.x);u.y+=N*H*(0+E.y+R.y)}u.x*=1/D;u.y*=1/D;return u};A.ComputeOBB=function(k,z,u){if(u===undefined)u=0;var D=0,H=new Vector(u+1);for(D=0;D<u;++D)H[D]=z[D];H[u]=H[0];z=Number.MAX_VALUE;for(D=1;D<=u;++D){var O=H[parseInt(D-1)],E=H[D].x-O.x,R=H[D].y-O.y,N=Math.sqrt(E*E+R*R);E/=N;R/=N;for(var S=-R,aa=E,Z=N=Number.MAX_VALUE,d=-Number.MAX_VALUE,h=-Number.MAX_VALUE,l=0;l<u;++l){var j=H[l].x-
+O.x,o=H[l].y-O.y,q=E*j+R*o;j=S*j+aa*o;if(q<N)N=q;if(j<Z)Z=j;if(q>d)d=q;if(j>h)h=j}l=(d-N)*(h-Z);if(l<0.95*z){z=l;k.R.col1.x=E;k.R.col1.y=R;k.R.col2.x=S;k.R.col2.y=aa;E=0.5*(N+d);R=0.5*(Z+h);S=k.R;k.center.x=O.x+(S.col1.x*E+S.col2.x*R);k.center.y=O.y+(S.col1.y*E+S.col2.y*R);k.extents.x=0.5*(d-N);k.extents.y=0.5*(h-Z)}}};Box2D.postDefs.push(function(){Box2D.Collision.Shapes.b2PolygonShape.s_mat=new p});U.b2Shape=function(){};U.prototype.Copy=function(){return null};U.prototype.Set=function(k){this.m_radius=
+k.m_radius};U.prototype.GetType=function(){return this.m_type};U.prototype.TestPoint=function(){return false};U.prototype.RayCast=function(){return false};U.prototype.ComputeAABB=function(){};U.prototype.ComputeMass=function(){};U.prototype.ComputeSubmergedArea=function(){return 0};U.TestOverlap=function(k,z,u,D){var H=new L;H.proxyA=new W;H.proxyA.Set(k);H.proxyB=new W;H.proxyB.Set(u);H.transformA=z;H.transformB=D;H.useRadii=true;k=new Y;k.count=0;z=new I;M.Distance(z,k,H);return z.distance<10*Number.MIN_VALUE};
+U.prototype.b2Shape=function(){this.m_type=U.e_unknownShape;this.m_radius=F.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Collision.Shapes.b2Shape.e_unknownShape=parseInt(-1);Box2D.Collision.Shapes.b2Shape.e_circleShape=0;Box2D.Collision.Shapes.b2Shape.e_polygonShape=1;Box2D.Collision.Shapes.b2Shape.e_edgeShape=2;Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount=3;Box2D.Collision.Shapes.b2Shape.e_hitCollide=1;Box2D.Collision.Shapes.b2Shape.e_missCollide=0;Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide=
+parseInt(-1)})})();
+(function(){var F=Box2D.Common.b2Color,G=Box2D.Common.b2Settings,K=Box2D.Common.Math.b2Math;F.b2Color=function(){this._b=this._g=this._r=0};F.prototype.b2Color=function(y,w,A){if(y===undefined)y=0;if(w===undefined)w=0;if(A===undefined)A=0;this._r=Box2D.parseUInt(255*K.Clamp(y,0,1));this._g=Box2D.parseUInt(255*K.Clamp(w,0,1));this._b=Box2D.parseUInt(255*K.Clamp(A,0,1))};F.prototype.Set=function(y,w,A){if(y===undefined)y=0;if(w===undefined)w=0;if(A===undefined)A=0;this._r=Box2D.parseUInt(255*K.Clamp(y,
+0,1));this._g=Box2D.parseUInt(255*K.Clamp(w,0,1));this._b=Box2D.parseUInt(255*K.Clamp(A,0,1))};Object.defineProperty(F.prototype,"r",{enumerable:false,configurable:true,set:function(y){if(y===undefined)y=0;this._r=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"g",{enumerable:false,configurable:true,set:function(y){if(y===undefined)y=0;this._g=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"b",{enumerable:false,configurable:true,set:function(y){if(y===
+undefined)y=0;this._b=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"color",{enumerable:false,configurable:true,get:function(){return this._r<<16|this._g<<8|this._b}});G.b2Settings=function(){};G.b2MixFriction=function(y,w){if(y===undefined)y=0;if(w===undefined)w=0;return Math.sqrt(y*w)};G.b2MixRestitution=function(y,w){if(y===undefined)y=0;if(w===undefined)w=0;return y>w?y:w};G.b2Assert=function(y){if(!y)throw"Assertion Failed";};Box2D.postDefs.push(function(){Box2D.Common.b2Settings.VERSION=
+"2.1alpha";Box2D.Common.b2Settings.USHRT_MAX=65535;Box2D.Common.b2Settings.b2_pi=Math.PI;Box2D.Common.b2Settings.b2_maxManifoldPoints=2;Box2D.Common.b2Settings.b2_aabbExtension=0.1;Box2D.Common.b2Settings.b2_aabbMultiplier=2;Box2D.Common.b2Settings.b2_polygonRadius=2*G.b2_linearSlop;Box2D.Common.b2Settings.b2_linearSlop=0.0050;Box2D.Common.b2Settings.b2_angularSlop=2/180*G.b2_pi;Box2D.Common.b2Settings.b2_toiSlop=8*G.b2_linearSlop;Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland=32;Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland=
+32;Box2D.Common.b2Settings.b2_velocityThreshold=1;Box2D.Common.b2Settings.b2_maxLinearCorrection=0.2;Box2D.Common.b2Settings.b2_maxAngularCorrection=8/180*G.b2_pi;Box2D.Common.b2Settings.b2_maxTranslation=2;Box2D.Common.b2Settings.b2_maxTranslationSquared=G.b2_maxTranslation*G.b2_maxTranslation;Box2D.Common.b2Settings.b2_maxRotation=0.5*G.b2_pi;Box2D.Common.b2Settings.b2_maxRotationSquared=G.b2_maxRotation*G.b2_maxRotation;Box2D.Common.b2Settings.b2_contactBaumgarte=0.2;Box2D.Common.b2Settings.b2_timeToSleep=
+0.5;Box2D.Common.b2Settings.b2_linearSleepTolerance=0.01;Box2D.Common.b2Settings.b2_angularSleepTolerance=2/180*G.b2_pi})})();
+(function(){var F=Box2D.Common.Math.b2Mat22,G=Box2D.Common.Math.b2Mat33,K=Box2D.Common.Math.b2Math,y=Box2D.Common.Math.b2Sweep,w=Box2D.Common.Math.b2Transform,A=Box2D.Common.Math.b2Vec2,U=Box2D.Common.Math.b2Vec3;F.b2Mat22=function(){this.col1=new A;this.col2=new A};F.prototype.b2Mat22=function(){this.SetIdentity()};F.FromAngle=function(p){if(p===undefined)p=0;var B=new F;B.Set(p);return B};F.FromVV=function(p,B){var Q=new F;Q.SetVV(p,B);return Q};F.prototype.Set=function(p){if(p===undefined)p=0;
+var B=Math.cos(p);p=Math.sin(p);this.col1.x=B;this.col2.x=-p;this.col1.y=p;this.col2.y=B};F.prototype.SetVV=function(p,B){this.col1.SetV(p);this.col2.SetV(B)};F.prototype.Copy=function(){var p=new F;p.SetM(this);return p};F.prototype.SetM=function(p){this.col1.SetV(p.col1);this.col2.SetV(p.col2)};F.prototype.AddM=function(p){this.col1.x+=p.col1.x;this.col1.y+=p.col1.y;this.col2.x+=p.col2.x;this.col2.y+=p.col2.y};F.prototype.SetIdentity=function(){this.col1.x=1;this.col2.x=0;this.col1.y=0;this.col2.y=
+1};F.prototype.SetZero=function(){this.col1.x=0;this.col2.x=0;this.col1.y=0;this.col2.y=0};F.prototype.GetAngle=function(){return Math.atan2(this.col1.y,this.col1.x)};F.prototype.GetInverse=function(p){var B=this.col1.x,Q=this.col2.x,V=this.col1.y,M=this.col2.y,L=B*M-Q*V;if(L!=0)L=1/L;p.col1.x=L*M;p.col2.x=-L*Q;p.col1.y=-L*V;p.col2.y=L*B;return p};F.prototype.Solve=function(p,B,Q){if(B===undefined)B=0;if(Q===undefined)Q=0;var V=this.col1.x,M=this.col2.x,L=this.col1.y,I=this.col2.y,W=V*I-M*L;if(W!=
+0)W=1/W;p.x=W*(I*B-M*Q);p.y=W*(V*Q-L*B);return p};F.prototype.Abs=function(){this.col1.Abs();this.col2.Abs()};G.b2Mat33=function(){this.col1=new U;this.col2=new U;this.col3=new U};G.prototype.b2Mat33=function(p,B,Q){if(p===undefined)p=null;if(B===undefined)B=null;if(Q===undefined)Q=null;if(!p&&!B&&!Q){this.col1.SetZero();this.col2.SetZero();this.col3.SetZero()}else{this.col1.SetV(p);this.col2.SetV(B);this.col3.SetV(Q)}};G.prototype.SetVVV=function(p,B,Q){this.col1.SetV(p);this.col2.SetV(B);this.col3.SetV(Q)};
+G.prototype.Copy=function(){return new G(this.col1,this.col2,this.col3)};G.prototype.SetM=function(p){this.col1.SetV(p.col1);this.col2.SetV(p.col2);this.col3.SetV(p.col3)};G.prototype.AddM=function(p){this.col1.x+=p.col1.x;this.col1.y+=p.col1.y;this.col1.z+=p.col1.z;this.col2.x+=p.col2.x;this.col2.y+=p.col2.y;this.col2.z+=p.col2.z;this.col3.x+=p.col3.x;this.col3.y+=p.col3.y;this.col3.z+=p.col3.z};G.prototype.SetIdentity=function(){this.col1.x=1;this.col2.x=0;this.col3.x=0;this.col1.y=0;this.col2.y=
+1;this.col3.y=0;this.col1.z=0;this.col2.z=0;this.col3.z=1};G.prototype.SetZero=function(){this.col1.x=0;this.col2.x=0;this.col3.x=0;this.col1.y=0;this.col2.y=0;this.col3.y=0;this.col1.z=0;this.col2.z=0;this.col3.z=0};G.prototype.Solve22=function(p,B,Q){if(B===undefined)B=0;if(Q===undefined)Q=0;var V=this.col1.x,M=this.col2.x,L=this.col1.y,I=this.col2.y,W=V*I-M*L;if(W!=0)W=1/W;p.x=W*(I*B-M*Q);p.y=W*(V*Q-L*B);return p};G.prototype.Solve33=function(p,B,Q,V){if(B===undefined)B=0;if(Q===undefined)Q=0;
+if(V===undefined)V=0;var M=this.col1.x,L=this.col1.y,I=this.col1.z,W=this.col2.x,Y=this.col2.y,k=this.col2.z,z=this.col3.x,u=this.col3.y,D=this.col3.z,H=M*(Y*D-k*u)+L*(k*z-W*D)+I*(W*u-Y*z);if(H!=0)H=1/H;p.x=H*(B*(Y*D-k*u)+Q*(k*z-W*D)+V*(W*u-Y*z));p.y=H*(M*(Q*D-V*u)+L*(V*z-B*D)+I*(B*u-Q*z));p.z=H*(M*(Y*V-k*Q)+L*(k*B-W*V)+I*(W*Q-Y*B));return p};K.b2Math=function(){};K.IsValid=function(p){if(p===undefined)p=0;return isFinite(p)};K.Dot=function(p,B){return p.x*B.x+p.y*B.y};K.CrossVV=function(p,B){return p.x*
+B.y-p.y*B.x};K.CrossVF=function(p,B){if(B===undefined)B=0;return new A(B*p.y,-B*p.x)};K.CrossFV=function(p,B){if(p===undefined)p=0;return new A(-p*B.y,p*B.x)};K.MulMV=function(p,B){return new A(p.col1.x*B.x+p.col2.x*B.y,p.col1.y*B.x+p.col2.y*B.y)};K.MulTMV=function(p,B){return new A(K.Dot(B,p.col1),K.Dot(B,p.col2))};K.MulX=function(p,B){var Q=K.MulMV(p.R,B);Q.x+=p.position.x;Q.y+=p.position.y;return Q};K.MulXT=function(p,B){var Q=K.SubtractVV(B,p.position),V=Q.x*p.R.col1.x+Q.y*p.R.col1.y;Q.y=Q.x*
+p.R.col2.x+Q.y*p.R.col2.y;Q.x=V;return Q};K.AddVV=function(p,B){return new A(p.x+B.x,p.y+B.y)};K.SubtractVV=function(p,B){return new A(p.x-B.x,p.y-B.y)};K.Distance=function(p,B){var Q=p.x-B.x,V=p.y-B.y;return Math.sqrt(Q*Q+V*V)};K.DistanceSquared=function(p,B){var Q=p.x-B.x,V=p.y-B.y;return Q*Q+V*V};K.MulFV=function(p,B){if(p===undefined)p=0;return new A(p*B.x,p*B.y)};K.AddMM=function(p,B){return F.FromVV(K.AddVV(p.col1,B.col1),K.AddVV(p.col2,B.col2))};K.MulMM=function(p,B){return F.FromVV(K.MulMV(p,
+B.col1),K.MulMV(p,B.col2))};K.MulTMM=function(p,B){var Q=new A(K.Dot(p.col1,B.col1),K.Dot(p.col2,B.col1)),V=new A(K.Dot(p.col1,B.col2),K.Dot(p.col2,B.col2));return F.FromVV(Q,V)};K.Abs=function(p){if(p===undefined)p=0;return p>0?p:-p};K.AbsV=function(p){return new A(K.Abs(p.x),K.Abs(p.y))};K.AbsM=function(p){return F.FromVV(K.AbsV(p.col1),K.AbsV(p.col2))};K.Min=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return p<B?p:B};K.MinV=function(p,B){return new A(K.Min(p.x,B.x),K.Min(p.y,B.y))};
+K.Max=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return p>B?p:B};K.MaxV=function(p,B){return new A(K.Max(p.x,B.x),K.Max(p.y,B.y))};K.Clamp=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;return p<B?B:p>Q?Q:p};K.ClampV=function(p,B,Q){return K.MaxV(B,K.MinV(p,Q))};K.Swap=function(p,B){var Q=p[0];p[0]=B[0];B[0]=Q};K.Random=function(){return Math.random()*2-1};K.RandomRange=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;var Q=Math.random();return Q=
+(B-p)*Q+p};K.NextPowerOfTwo=function(p){if(p===undefined)p=0;p|=p>>1&2147483647;p|=p>>2&1073741823;p|=p>>4&268435455;p|=p>>8&16777215;p|=p>>16&65535;return p+1};K.IsPowerOfTwo=function(p){if(p===undefined)p=0;return p>0&&(p&p-1)==0};Box2D.postDefs.push(function(){Box2D.Common.Math.b2Math.b2Vec2_zero=new A(0,0);Box2D.Common.Math.b2Math.b2Mat22_identity=F.FromVV(new A(1,0),new A(0,1));Box2D.Common.Math.b2Math.b2Transform_identity=new w(K.b2Vec2_zero,K.b2Mat22_identity)});y.b2Sweep=function(){this.localCenter=
+new A;this.c0=new A;this.c=new A};y.prototype.Set=function(p){this.localCenter.SetV(p.localCenter);this.c0.SetV(p.c0);this.c.SetV(p.c);this.a0=p.a0;this.a=p.a;this.t0=p.t0};y.prototype.Copy=function(){var p=new y;p.localCenter.SetV(this.localCenter);p.c0.SetV(this.c0);p.c.SetV(this.c);p.a0=this.a0;p.a=this.a;p.t0=this.t0;return p};y.prototype.GetTransform=function(p,B){if(B===undefined)B=0;p.position.x=(1-B)*this.c0.x+B*this.c.x;p.position.y=(1-B)*this.c0.y+B*this.c.y;p.R.Set((1-B)*this.a0+B*this.a);
+var Q=p.R;p.position.x-=Q.col1.x*this.localCenter.x+Q.col2.x*this.localCenter.y;p.position.y-=Q.col1.y*this.localCenter.x+Q.col2.y*this.localCenter.y};y.prototype.Advance=function(p){if(p===undefined)p=0;if(this.t0<p&&1-this.t0>Number.MIN_VALUE){var B=(p-this.t0)/(1-this.t0);this.c0.x=(1-B)*this.c0.x+B*this.c.x;this.c0.y=(1-B)*this.c0.y+B*this.c.y;this.a0=(1-B)*this.a0+B*this.a;this.t0=p}};w.b2Transform=function(){this.position=new A;this.R=new F};w.prototype.b2Transform=function(p,B){if(p===undefined)p=
+null;if(B===undefined)B=null;if(p){this.position.SetV(p);this.R.SetM(B)}};w.prototype.Initialize=function(p,B){this.position.SetV(p);this.R.SetM(B)};w.prototype.SetIdentity=function(){this.position.SetZero();this.R.SetIdentity()};w.prototype.Set=function(p){this.position.SetV(p.position);this.R.SetM(p.R)};w.prototype.GetAngle=function(){return Math.atan2(this.R.col1.y,this.R.col1.x)};A.b2Vec2=function(){};A.prototype.b2Vec2=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;this.x=p;this.y=B};
+A.prototype.SetZero=function(){this.y=this.x=0};A.prototype.Set=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;this.x=p;this.y=B};A.prototype.SetV=function(p){this.x=p.x;this.y=p.y};A.prototype.GetNegative=function(){return new A(-this.x,-this.y)};A.prototype.NegativeSelf=function(){this.x=-this.x;this.y=-this.y};A.Make=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return new A(p,B)};A.prototype.Copy=function(){return new A(this.x,this.y)};A.prototype.Add=function(p){this.x+=p.x;
+this.y+=p.y};A.prototype.Subtract=function(p){this.x-=p.x;this.y-=p.y};A.prototype.Multiply=function(p){if(p===undefined)p=0;this.x*=p;this.y*=p};A.prototype.MulM=function(p){var B=this.x;this.x=p.col1.x*B+p.col2.x*this.y;this.y=p.col1.y*B+p.col2.y*this.y};A.prototype.MulTM=function(p){var B=K.Dot(this,p.col1);this.y=K.Dot(this,p.col2);this.x=B};A.prototype.CrossVF=function(p){if(p===undefined)p=0;var B=this.x;this.x=p*this.y;this.y=-p*B};A.prototype.CrossFV=function(p){if(p===undefined)p=0;var B=
+this.x;this.x=-p*this.y;this.y=p*B};A.prototype.MinV=function(p){this.x=this.x<p.x?this.x:p.x;this.y=this.y<p.y?this.y:p.y};A.prototype.MaxV=function(p){this.x=this.x>p.x?this.x:p.x;this.y=this.y>p.y?this.y:p.y};A.prototype.Abs=function(){if(this.x<0)this.x=-this.x;if(this.y<0)this.y=-this.y};A.prototype.Length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};A.prototype.LengthSquared=function(){return this.x*this.x+this.y*this.y};A.prototype.Normalize=function(){var p=Math.sqrt(this.x*this.x+
+this.y*this.y);if(p<Number.MIN_VALUE)return 0;var B=1/p;this.x*=B;this.y*=B;return p};A.prototype.IsValid=function(){return K.IsValid(this.x)&&K.IsValid(this.y)};U.b2Vec3=function(){};U.prototype.b2Vec3=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;this.x=p;this.y=B;this.z=Q};U.prototype.SetZero=function(){this.x=this.y=this.z=0};U.prototype.Set=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;this.x=p;this.y=B;this.z=Q};U.prototype.SetV=
+function(p){this.x=p.x;this.y=p.y;this.z=p.z};U.prototype.GetNegative=function(){return new U(-this.x,-this.y,-this.z)};U.prototype.NegativeSelf=function(){this.x=-this.x;this.y=-this.y;this.z=-this.z};U.prototype.Copy=function(){return new U(this.x,this.y,this.z)};U.prototype.Add=function(p){this.x+=p.x;this.y+=p.y;this.z+=p.z};U.prototype.Subtract=function(p){this.x-=p.x;this.y-=p.y;this.z-=p.z};U.prototype.Multiply=function(p){if(p===undefined)p=0;this.x*=p;this.y*=p;this.z*=p}})();
+(function(){var F=Box2D.Common.Math.b2Math,G=Box2D.Common.Math.b2Sweep,K=Box2D.Common.Math.b2Transform,y=Box2D.Common.Math.b2Vec2,w=Box2D.Common.b2Color,A=Box2D.Common.b2Settings,U=Box2D.Collision.b2AABB,p=Box2D.Collision.b2ContactPoint,B=Box2D.Collision.b2DynamicTreeBroadPhase,Q=Box2D.Collision.b2RayCastInput,V=Box2D.Collision.b2RayCastOutput,M=Box2D.Collision.Shapes.b2CircleShape,L=Box2D.Collision.Shapes.b2EdgeShape,I=Box2D.Collision.Shapes.b2MassData,W=Box2D.Collision.Shapes.b2PolygonShape,Y=Box2D.Collision.Shapes.b2Shape,
+k=Box2D.Dynamics.b2Body,z=Box2D.Dynamics.b2BodyDef,u=Box2D.Dynamics.b2ContactFilter,D=Box2D.Dynamics.b2ContactImpulse,H=Box2D.Dynamics.b2ContactListener,O=Box2D.Dynamics.b2ContactManager,E=Box2D.Dynamics.b2DebugDraw,R=Box2D.Dynamics.b2DestructionListener,N=Box2D.Dynamics.b2FilterData,S=Box2D.Dynamics.b2Fixture,aa=Box2D.Dynamics.b2FixtureDef,Z=Box2D.Dynamics.b2Island,d=Box2D.Dynamics.b2TimeStep,h=Box2D.Dynamics.b2World,l=Box2D.Dynamics.Contacts.b2Contact,j=Box2D.Dynamics.Contacts.b2ContactFactory,
+o=Box2D.Dynamics.Contacts.b2ContactSolver,q=Box2D.Dynamics.Joints.b2Joint,n=Box2D.Dynamics.Joints.b2PulleyJoint;k.b2Body=function(){this.m_xf=new K;this.m_sweep=new G;this.m_linearVelocity=new y;this.m_force=new y};k.prototype.connectEdges=function(a,c,g){if(g===undefined)g=0;var b=Math.atan2(c.GetDirectionVector().y,c.GetDirectionVector().x);g=F.MulFV(Math.tan((b-g)*0.5),c.GetDirectionVector());g=F.SubtractVV(g,c.GetNormalVector());g=F.MulFV(A.b2_toiSlop,g);g=F.AddVV(g,c.GetVertex1());var e=F.AddVV(a.GetDirectionVector(),
+c.GetDirectionVector());e.Normalize();var f=F.Dot(a.GetDirectionVector(),c.GetNormalVector())>0;a.SetNextEdge(c,g,e,f);c.SetPrevEdge(a,g,e,f);return b};k.prototype.CreateFixture=function(a){if(this.m_world.IsLocked()==true)return null;var c=new S;c.Create(this,this.m_xf,a);this.m_flags&k.e_activeFlag&&c.CreateProxy(this.m_world.m_contactManager.m_broadPhase,this.m_xf);c.m_next=this.m_fixtureList;this.m_fixtureList=c;++this.m_fixtureCount;c.m_body=this;c.m_density>0&&this.ResetMassData();this.m_world.m_flags|=
+h.e_newFixture;return c};k.prototype.CreateFixture2=function(a,c){if(c===undefined)c=0;var g=new aa;g.shape=a;g.density=c;return this.CreateFixture(g)};k.prototype.DestroyFixture=function(a){if(this.m_world.IsLocked()!=true){for(var c=this.m_fixtureList,g=null;c!=null;){if(c==a){if(g)g.m_next=a.m_next;else this.m_fixtureList=a.m_next;break}g=c;c=c.m_next}for(c=this.m_contactList;c;){g=c.contact;c=c.next;var b=g.GetFixtureA(),e=g.GetFixtureB();if(a==b||a==e)this.m_world.m_contactManager.Destroy(g)}this.m_flags&
+k.e_activeFlag&&a.DestroyProxy(this.m_world.m_contactManager.m_broadPhase);a.Destroy();a.m_body=null;a.m_next=null;--this.m_fixtureCount;this.ResetMassData()}};k.prototype.SetPositionAndAngle=function(a,c){if(c===undefined)c=0;var g;if(this.m_world.IsLocked()!=true){this.m_xf.R.Set(c);this.m_xf.position.SetV(a);g=this.m_xf.R;var b=this.m_sweep.localCenter;this.m_sweep.c.x=g.col1.x*b.x+g.col2.x*b.y;this.m_sweep.c.y=g.col1.y*b.x+g.col2.y*b.y;this.m_sweep.c.x+=this.m_xf.position.x;this.m_sweep.c.y+=
+this.m_xf.position.y;this.m_sweep.c0.SetV(this.m_sweep.c);this.m_sweep.a0=this.m_sweep.a=c;b=this.m_world.m_contactManager.m_broadPhase;for(g=this.m_fixtureList;g;g=g.m_next)g.Synchronize(b,this.m_xf,this.m_xf);this.m_world.m_contactManager.FindNewContacts()}};k.prototype.SetTransform=function(a){this.SetPositionAndAngle(a.position,a.GetAngle())};k.prototype.GetTransform=function(){return this.m_xf};k.prototype.GetPosition=function(){return this.m_xf.position};k.prototype.SetPosition=function(a){this.SetPositionAndAngle(a,
+this.GetAngle())};k.prototype.GetAngle=function(){return this.m_sweep.a};k.prototype.SetAngle=function(a){if(a===undefined)a=0;this.SetPositionAndAngle(this.GetPosition(),a)};k.prototype.GetWorldCenter=function(){return this.m_sweep.c};k.prototype.GetLocalCenter=function(){return this.m_sweep.localCenter};k.prototype.SetLinearVelocity=function(a){this.m_type!=k.b2_staticBody&&this.m_linearVelocity.SetV(a)};k.prototype.GetLinearVelocity=function(){return this.m_linearVelocity};k.prototype.SetAngularVelocity=
+function(a){if(a===undefined)a=0;if(this.m_type!=k.b2_staticBody)this.m_angularVelocity=a};k.prototype.GetAngularVelocity=function(){return this.m_angularVelocity};k.prototype.GetDefinition=function(){var a=new z;a.type=this.GetType();a.allowSleep=(this.m_flags&k.e_allowSleepFlag)==k.e_allowSleepFlag;a.angle=this.GetAngle();a.angularDamping=this.m_angularDamping;a.angularVelocity=this.m_angularVelocity;a.fixedRotation=(this.m_flags&k.e_fixedRotationFlag)==k.e_fixedRotationFlag;a.bullet=(this.m_flags&
+k.e_bulletFlag)==k.e_bulletFlag;a.awake=(this.m_flags&k.e_awakeFlag)==k.e_awakeFlag;a.linearDamping=this.m_linearDamping;a.linearVelocity.SetV(this.GetLinearVelocity());a.position=this.GetPosition();a.userData=this.GetUserData();return a};k.prototype.ApplyForce=function(a,c){if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_force.x+=a.x;this.m_force.y+=a.y;this.m_torque+=(c.x-this.m_sweep.c.x)*a.y-(c.y-this.m_sweep.c.y)*a.x}};k.prototype.ApplyTorque=function(a){if(a===
+undefined)a=0;if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_torque+=a}};k.prototype.ApplyImpulse=function(a,c){if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_linearVelocity.x+=this.m_invMass*a.x;this.m_linearVelocity.y+=this.m_invMass*a.y;this.m_angularVelocity+=this.m_invI*((c.x-this.m_sweep.c.x)*a.y-(c.y-this.m_sweep.c.y)*a.x)}};k.prototype.Split=function(a){for(var c=this.GetLinearVelocity().Copy(),g=this.GetAngularVelocity(),
+b=this.GetWorldCenter(),e=this.m_world.CreateBody(this.GetDefinition()),f,m=this.m_fixtureList;m;)if(a(m)){var r=m.m_next;if(f)f.m_next=r;else this.m_fixtureList=r;this.m_fixtureCount--;m.m_next=e.m_fixtureList;e.m_fixtureList=m;e.m_fixtureCount++;m.m_body=e;m=r}else{f=m;m=m.m_next}this.ResetMassData();e.ResetMassData();f=this.GetWorldCenter();a=e.GetWorldCenter();f=F.AddVV(c,F.CrossFV(g,F.SubtractVV(f,b)));c=F.AddVV(c,F.CrossFV(g,F.SubtractVV(a,b)));this.SetLinearVelocity(f);e.SetLinearVelocity(c);
+this.SetAngularVelocity(g);e.SetAngularVelocity(g);this.SynchronizeFixtures();e.SynchronizeFixtures();return e};k.prototype.Merge=function(a){var c;for(c=a.m_fixtureList;c;){var g=c.m_next;a.m_fixtureCount--;c.m_next=this.m_fixtureList;this.m_fixtureList=c;this.m_fixtureCount++;c.m_body=e;c=g}b.m_fixtureCount=0;var b=this,e=a;b.GetWorldCenter();e.GetWorldCenter();b.GetLinearVelocity().Copy();e.GetLinearVelocity().Copy();b.GetAngularVelocity();e.GetAngularVelocity();b.ResetMassData();this.SynchronizeFixtures()};
+k.prototype.GetMass=function(){return this.m_mass};k.prototype.GetInertia=function(){return this.m_I};k.prototype.GetMassData=function(a){a.mass=this.m_mass;a.I=this.m_I;a.center.SetV(this.m_sweep.localCenter)};k.prototype.SetMassData=function(a){A.b2Assert(this.m_world.IsLocked()==false);if(this.m_world.IsLocked()!=true)if(this.m_type==k.b2_dynamicBody){this.m_invI=this.m_I=this.m_invMass=0;this.m_mass=a.mass;if(this.m_mass<=0)this.m_mass=1;this.m_invMass=1/this.m_mass;if(a.I>0&&(this.m_flags&k.e_fixedRotationFlag)==
+0){this.m_I=a.I-this.m_mass*(a.center.x*a.center.x+a.center.y*a.center.y);this.m_invI=1/this.m_I}var c=this.m_sweep.c.Copy();this.m_sweep.localCenter.SetV(a.center);this.m_sweep.c0.SetV(F.MulX(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.SetV(this.m_sweep.c0);this.m_linearVelocity.x+=this.m_angularVelocity*-(this.m_sweep.c.y-c.y);this.m_linearVelocity.y+=this.m_angularVelocity*+(this.m_sweep.c.x-c.x)}};k.prototype.ResetMassData=function(){this.m_invI=this.m_I=this.m_invMass=this.m_mass=0;this.m_sweep.localCenter.SetZero();
+if(!(this.m_type==k.b2_staticBody||this.m_type==k.b2_kinematicBody)){for(var a=y.Make(0,0),c=this.m_fixtureList;c;c=c.m_next)if(c.m_density!=0){var g=c.GetMassData();this.m_mass+=g.mass;a.x+=g.center.x*g.mass;a.y+=g.center.y*g.mass;this.m_I+=g.I}if(this.m_mass>0){this.m_invMass=1/this.m_mass;a.x*=this.m_invMass;a.y*=this.m_invMass}else this.m_invMass=this.m_mass=1;if(this.m_I>0&&(this.m_flags&k.e_fixedRotationFlag)==0){this.m_I-=this.m_mass*(a.x*a.x+a.y*a.y);this.m_I*=this.m_inertiaScale;A.b2Assert(this.m_I>
+0);this.m_invI=1/this.m_I}else this.m_invI=this.m_I=0;c=this.m_sweep.c.Copy();this.m_sweep.localCenter.SetV(a);this.m_sweep.c0.SetV(F.MulX(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.SetV(this.m_sweep.c0);this.m_linearVelocity.x+=this.m_angularVelocity*-(this.m_sweep.c.y-c.y);this.m_linearVelocity.y+=this.m_angularVelocity*+(this.m_sweep.c.x-c.x)}};k.prototype.GetWorldPoint=function(a){var c=this.m_xf.R;a=new y(c.col1.x*a.x+c.col2.x*a.y,c.col1.y*a.x+c.col2.y*a.y);a.x+=this.m_xf.position.x;
+a.y+=this.m_xf.position.y;return a};k.prototype.GetWorldVector=function(a){return F.MulMV(this.m_xf.R,a)};k.prototype.GetLocalPoint=function(a){return F.MulXT(this.m_xf,a)};k.prototype.GetLocalVector=function(a){return F.MulTMV(this.m_xf.R,a)};k.prototype.GetLinearVelocityFromWorldPoint=function(a){return new y(this.m_linearVelocity.x-this.m_angularVelocity*(a.y-this.m_sweep.c.y),this.m_linearVelocity.y+this.m_angularVelocity*(a.x-this.m_sweep.c.x))};k.prototype.GetLinearVelocityFromLocalPoint=function(a){var c=
+this.m_xf.R;a=new y(c.col1.x*a.x+c.col2.x*a.y,c.col1.y*a.x+c.col2.y*a.y);a.x+=this.m_xf.position.x;a.y+=this.m_xf.position.y;return new y(this.m_linearVelocity.x-this.m_angularVelocity*(a.y-this.m_sweep.c.y),this.m_linearVelocity.y+this.m_angularVelocity*(a.x-this.m_sweep.c.x))};k.prototype.GetLinearDamping=function(){return this.m_linearDamping};k.prototype.SetLinearDamping=function(a){if(a===undefined)a=0;this.m_linearDamping=a};k.prototype.GetAngularDamping=function(){return this.m_angularDamping};
+k.prototype.SetAngularDamping=function(a){if(a===undefined)a=0;this.m_angularDamping=a};k.prototype.SetType=function(a){if(a===undefined)a=0;if(this.m_type!=a){this.m_type=a;this.ResetMassData();if(this.m_type==k.b2_staticBody){this.m_linearVelocity.SetZero();this.m_angularVelocity=0}this.SetAwake(true);this.m_force.SetZero();this.m_torque=0;for(a=this.m_contactList;a;a=a.next)a.contact.FlagForFiltering()}};k.prototype.GetType=function(){return this.m_type};k.prototype.SetBullet=function(a){if(a)this.m_flags|=
+k.e_bulletFlag;else this.m_flags&=~k.e_bulletFlag};k.prototype.IsBullet=function(){return(this.m_flags&k.e_bulletFlag)==k.e_bulletFlag};k.prototype.SetSleepingAllowed=function(a){if(a)this.m_flags|=k.e_allowSleepFlag;else{this.m_flags&=~k.e_allowSleepFlag;this.SetAwake(true)}};k.prototype.SetAwake=function(a){if(a){this.m_flags|=k.e_awakeFlag;this.m_sleepTime=0}else{this.m_flags&=~k.e_awakeFlag;this.m_sleepTime=0;this.m_linearVelocity.SetZero();this.m_angularVelocity=0;this.m_force.SetZero();this.m_torque=
+0}};k.prototype.IsAwake=function(){return(this.m_flags&k.e_awakeFlag)==k.e_awakeFlag};k.prototype.SetFixedRotation=function(a){if(a)this.m_flags|=k.e_fixedRotationFlag;else this.m_flags&=~k.e_fixedRotationFlag;this.ResetMassData()};k.prototype.IsFixedRotation=function(){return(this.m_flags&k.e_fixedRotationFlag)==k.e_fixedRotationFlag};k.prototype.SetActive=function(a){if(a!=this.IsActive()){var c;if(a){this.m_flags|=k.e_activeFlag;a=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=
+c.m_next)c.CreateProxy(a,this.m_xf)}else{this.m_flags&=~k.e_activeFlag;a=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=c.m_next)c.DestroyProxy(a);for(a=this.m_contactList;a;){c=a;a=a.next;this.m_world.m_contactManager.Destroy(c.contact)}this.m_contactList=null}}};k.prototype.IsActive=function(){return(this.m_flags&k.e_activeFlag)==k.e_activeFlag};k.prototype.IsSleepingAllowed=function(){return(this.m_flags&k.e_allowSleepFlag)==k.e_allowSleepFlag};k.prototype.GetFixtureList=
+function(){return this.m_fixtureList};k.prototype.GetJointList=function(){return this.m_jointList};k.prototype.GetControllerList=function(){return this.m_controllerList};k.prototype.GetContactList=function(){return this.m_contactList};k.prototype.GetNext=function(){return this.m_next};k.prototype.GetUserData=function(){return this.m_userData};k.prototype.SetUserData=function(a){this.m_userData=a};k.prototype.GetWorld=function(){return this.m_world};k.prototype.b2Body=function(a,c){this.m_flags=0;
+if(a.bullet)this.m_flags|=k.e_bulletFlag;if(a.fixedRotation)this.m_flags|=k.e_fixedRotationFlag;if(a.allowSleep)this.m_flags|=k.e_allowSleepFlag;if(a.awake)this.m_flags|=k.e_awakeFlag;if(a.active)this.m_flags|=k.e_activeFlag;this.m_world=c;this.m_xf.position.SetV(a.position);this.m_xf.R.Set(a.angle);this.m_sweep.localCenter.SetZero();this.m_sweep.t0=1;this.m_sweep.a0=this.m_sweep.a=a.angle;var g=this.m_xf.R,b=this.m_sweep.localCenter;this.m_sweep.c.x=g.col1.x*b.x+g.col2.x*b.y;this.m_sweep.c.y=g.col1.y*
+b.x+g.col2.y*b.y;this.m_sweep.c.x+=this.m_xf.position.x;this.m_sweep.c.y+=this.m_xf.position.y;this.m_sweep.c0.SetV(this.m_sweep.c);this.m_contactList=this.m_controllerList=this.m_jointList=null;this.m_controllerCount=0;this.m_next=this.m_prev=null;this.m_linearVelocity.SetV(a.linearVelocity);this.m_angularVelocity=a.angularVelocity;this.m_linearDamping=a.linearDamping;this.m_angularDamping=a.angularDamping;this.m_force.Set(0,0);this.m_sleepTime=this.m_torque=0;this.m_type=a.type;if(this.m_type==
+k.b2_dynamicBody)this.m_invMass=this.m_mass=1;else this.m_invMass=this.m_mass=0;this.m_invI=this.m_I=0;this.m_inertiaScale=a.inertiaScale;this.m_userData=a.userData;this.m_fixtureList=null;this.m_fixtureCount=0};k.prototype.SynchronizeFixtures=function(){var a=k.s_xf1;a.R.Set(this.m_sweep.a0);var c=a.R,g=this.m_sweep.localCenter;a.position.x=this.m_sweep.c0.x-(c.col1.x*g.x+c.col2.x*g.y);a.position.y=this.m_sweep.c0.y-(c.col1.y*g.x+c.col2.y*g.y);g=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=
+c.m_next)c.Synchronize(g,a,this.m_xf)};k.prototype.SynchronizeTransform=function(){this.m_xf.R.Set(this.m_sweep.a);var a=this.m_xf.R,c=this.m_sweep.localCenter;this.m_xf.position.x=this.m_sweep.c.x-(a.col1.x*c.x+a.col2.x*c.y);this.m_xf.position.y=this.m_sweep.c.y-(a.col1.y*c.x+a.col2.y*c.y)};k.prototype.ShouldCollide=function(a){if(this.m_type!=k.b2_dynamicBody&&a.m_type!=k.b2_dynamicBody)return false;for(var c=this.m_jointList;c;c=c.next)if(c.other==a)if(c.joint.m_collideConnected==false)return false;
+return true};k.prototype.Advance=function(a){if(a===undefined)a=0;this.m_sweep.Advance(a);this.m_sweep.c.SetV(this.m_sweep.c0);this.m_sweep.a=this.m_sweep.a0;this.SynchronizeTransform()};Box2D.postDefs.push(function(){Box2D.Dynamics.b2Body.s_xf1=new K;Box2D.Dynamics.b2Body.e_islandFlag=1;Box2D.Dynamics.b2Body.e_awakeFlag=2;Box2D.Dynamics.b2Body.e_allowSleepFlag=4;Box2D.Dynamics.b2Body.e_bulletFlag=8;Box2D.Dynamics.b2Body.e_fixedRotationFlag=16;Box2D.Dynamics.b2Body.e_activeFlag=32;Box2D.Dynamics.b2Body.b2_staticBody=
+0;Box2D.Dynamics.b2Body.b2_kinematicBody=1;Box2D.Dynamics.b2Body.b2_dynamicBody=2});z.b2BodyDef=function(){this.position=new y;this.linearVelocity=new y};z.prototype.b2BodyDef=function(){this.userData=null;this.position.Set(0,0);this.angle=0;this.linearVelocity.Set(0,0);this.angularDamping=this.linearDamping=this.angularVelocity=0;this.awake=this.allowSleep=true;this.bullet=this.fixedRotation=false;this.type=k.b2_staticBody;this.active=true;this.inertiaScale=1};u.b2ContactFilter=function(){};u.prototype.ShouldCollide=
+function(a,c){var g=a.GetFilterData(),b=c.GetFilterData();if(g.groupIndex==b.groupIndex&&g.groupIndex!=0)return g.groupIndex>0;return(g.maskBits&b.categoryBits)!=0&&(g.categoryBits&b.maskBits)!=0};u.prototype.RayCollide=function(a,c){if(!a)return true;return this.ShouldCollide(a instanceof S?a:null,c)};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactFilter.b2_defaultFilter=new u});D.b2ContactImpulse=function(){this.normalImpulses=new Vector_a2j_Number(A.b2_maxManifoldPoints);this.tangentImpulses=
+new Vector_a2j_Number(A.b2_maxManifoldPoints)};H.b2ContactListener=function(){};H.prototype.BeginContact=function(){};H.prototype.EndContact=function(){};H.prototype.PreSolve=function(){};H.prototype.PostSolve=function(){};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactListener.b2_defaultListener=new H});O.b2ContactManager=function(){};O.prototype.b2ContactManager=function(){this.m_world=null;this.m_contactCount=0;this.m_contactFilter=u.b2_defaultFilter;this.m_contactListener=H.b2_defaultListener;
+this.m_contactFactory=new j(this.m_allocator);this.m_broadPhase=new B};O.prototype.AddPair=function(a,c){var g=a instanceof S?a:null,b=c instanceof S?c:null,e=g.GetBody(),f=b.GetBody();if(e!=f){for(var m=f.GetContactList();m;){if(m.other==e){var r=m.contact.GetFixtureA(),s=m.contact.GetFixtureB();if(r==g&&s==b)return;if(r==b&&s==g)return}m=m.next}if(f.ShouldCollide(e)!=false)if(this.m_contactFilter.ShouldCollide(g,b)!=false){m=this.m_contactFactory.Create(g,b);g=m.GetFixtureA();b=m.GetFixtureB();
+e=g.m_body;f=b.m_body;m.m_prev=null;m.m_next=this.m_world.m_contactList;if(this.m_world.m_contactList!=null)this.m_world.m_contactList.m_prev=m;this.m_world.m_contactList=m;m.m_nodeA.contact=m;m.m_nodeA.other=f;m.m_nodeA.prev=null;m.m_nodeA.next=e.m_contactList;if(e.m_contactList!=null)e.m_contactList.prev=m.m_nodeA;e.m_contactList=m.m_nodeA;m.m_nodeB.contact=m;m.m_nodeB.other=e;m.m_nodeB.prev=null;m.m_nodeB.next=f.m_contactList;if(f.m_contactList!=null)f.m_contactList.prev=m.m_nodeB;f.m_contactList=
+m.m_nodeB;++this.m_world.m_contactCount}}};O.prototype.FindNewContacts=function(){this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this,this.AddPair))};O.prototype.Destroy=function(a){var c=a.GetFixtureA(),g=a.GetFixtureB();c=c.GetBody();g=g.GetBody();a.IsTouching()&&this.m_contactListener.EndContact(a);if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_world.m_contactList)this.m_world.m_contactList=a.m_next;if(a.m_nodeA.prev)a.m_nodeA.prev.next=a.m_nodeA.next;
+if(a.m_nodeA.next)a.m_nodeA.next.prev=a.m_nodeA.prev;if(a.m_nodeA==c.m_contactList)c.m_contactList=a.m_nodeA.next;if(a.m_nodeB.prev)a.m_nodeB.prev.next=a.m_nodeB.next;if(a.m_nodeB.next)a.m_nodeB.next.prev=a.m_nodeB.prev;if(a.m_nodeB==g.m_contactList)g.m_contactList=a.m_nodeB.next;this.m_contactFactory.Destroy(a);--this.m_contactCount};O.prototype.Collide=function(){for(var a=this.m_world.m_contactList;a;){var c=a.GetFixtureA(),g=a.GetFixtureB(),b=c.GetBody(),e=g.GetBody();if(b.IsAwake()==false&&e.IsAwake()==
+false)a=a.GetNext();else{if(a.m_flags&l.e_filterFlag){if(e.ShouldCollide(b)==false){c=a;a=c.GetNext();this.Destroy(c);continue}if(this.m_contactFilter.ShouldCollide(c,g)==false){c=a;a=c.GetNext();this.Destroy(c);continue}a.m_flags&=~l.e_filterFlag}if(this.m_broadPhase.TestOverlap(c.m_proxy,g.m_proxy)==false){c=a;a=c.GetNext();this.Destroy(c)}else{a.Update(this.m_contactListener);a=a.GetNext()}}}};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactManager.s_evalCP=new p});E.b2DebugDraw=function(){};
+E.prototype.b2DebugDraw=function(){};E.prototype.SetFlags=function(){};E.prototype.GetFlags=function(){};E.prototype.AppendFlags=function(){};E.prototype.ClearFlags=function(){};E.prototype.SetSprite=function(){};E.prototype.GetSprite=function(){};E.prototype.SetDrawScale=function(){};E.prototype.GetDrawScale=function(){};E.prototype.SetLineThickness=function(){};E.prototype.GetLineThickness=function(){};E.prototype.SetAlpha=function(){};E.prototype.GetAlpha=function(){};E.prototype.SetFillAlpha=
+function(){};E.prototype.GetFillAlpha=function(){};E.prototype.SetXFormScale=function(){};E.prototype.GetXFormScale=function(){};E.prototype.DrawPolygon=function(){};E.prototype.DrawSolidPolygon=function(){};E.prototype.DrawCircle=function(){};E.prototype.DrawSolidCircle=function(){};E.prototype.DrawSegment=function(){};E.prototype.DrawTransform=function(){};Box2D.postDefs.push(function(){Box2D.Dynamics.b2DebugDraw.e_shapeBit=1;Box2D.Dynamics.b2DebugDraw.e_jointBit=2;Box2D.Dynamics.b2DebugDraw.e_aabbBit=
+4;Box2D.Dynamics.b2DebugDraw.e_pairBit=8;Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit=16;Box2D.Dynamics.b2DebugDraw.e_controllerBit=32});R.b2DestructionListener=function(){};R.prototype.SayGoodbyeJoint=function(){};R.prototype.SayGoodbyeFixture=function(){};N.b2FilterData=function(){this.categoryBits=1;this.maskBits=65535;this.groupIndex=0};N.prototype.Copy=function(){var a=new N;a.categoryBits=this.categoryBits;a.maskBits=this.maskBits;a.groupIndex=this.groupIndex;return a};S.b2Fixture=function(){this.m_filter=
+new N};S.prototype.GetType=function(){return this.m_shape.GetType()};S.prototype.GetShape=function(){return this.m_shape};S.prototype.SetSensor=function(a){if(this.m_isSensor!=a){this.m_isSensor=a;if(this.m_body!=null)for(a=this.m_body.GetContactList();a;){var c=a.contact,g=c.GetFixtureA(),b=c.GetFixtureB();if(g==this||b==this)c.SetSensor(g.IsSensor()||b.IsSensor());a=a.next}}};S.prototype.IsSensor=function(){return this.m_isSensor};S.prototype.SetFilterData=function(a){this.m_filter=a.Copy();if(!this.m_body)for(a=
+this.m_body.GetContactList();a;){var c=a.contact,g=c.GetFixtureA(),b=c.GetFixtureB();if(g==this||b==this)c.FlagForFiltering();a=a.next}};S.prototype.GetFilterData=function(){return this.m_filter.Copy()};S.prototype.GetBody=function(){return this.m_body};S.prototype.GetNext=function(){return this.m_next};S.prototype.GetUserData=function(){return this.m_userData};S.prototype.SetUserData=function(a){this.m_userData=a};S.prototype.TestPoint=function(a){return this.m_shape.TestPoint(this.m_body.GetTransform(),
+a)};S.prototype.RayCast=function(a,c){return this.m_shape.RayCast(a,c,this.m_body.GetTransform())};S.prototype.GetMassData=function(a){if(a===undefined)a=null;if(a==null)a=new I;this.m_shape.ComputeMass(a,this.m_density);return a};S.prototype.SetDensity=function(a){if(a===undefined)a=0;this.m_density=a};S.prototype.GetDensity=function(){return this.m_density};S.prototype.GetFriction=function(){return this.m_friction};S.prototype.SetFriction=function(a){if(a===undefined)a=0;this.m_friction=a};S.prototype.GetRestitution=
+function(){return this.m_restitution};S.prototype.SetRestitution=function(a){if(a===undefined)a=0;this.m_restitution=a};S.prototype.GetAABB=function(){return this.m_aabb};S.prototype.b2Fixture=function(){this.m_aabb=new U;this.m_shape=this.m_next=this.m_body=this.m_userData=null;this.m_restitution=this.m_friction=this.m_density=0};S.prototype.Create=function(a,c,g){this.m_userData=g.userData;this.m_friction=g.friction;this.m_restitution=g.restitution;this.m_body=a;this.m_next=null;this.m_filter=g.filter.Copy();
+this.m_isSensor=g.isSensor;this.m_shape=g.shape.Copy();this.m_density=g.density};S.prototype.Destroy=function(){this.m_shape=null};S.prototype.CreateProxy=function(a,c){this.m_shape.ComputeAABB(this.m_aabb,c);this.m_proxy=a.CreateProxy(this.m_aabb,this)};S.prototype.DestroyProxy=function(a){if(this.m_proxy!=null){a.DestroyProxy(this.m_proxy);this.m_proxy=null}};S.prototype.Synchronize=function(a,c,g){if(this.m_proxy){var b=new U,e=new U;this.m_shape.ComputeAABB(b,c);this.m_shape.ComputeAABB(e,g);
+this.m_aabb.Combine(b,e);c=F.SubtractVV(g.position,c.position);a.MoveProxy(this.m_proxy,this.m_aabb,c)}};aa.b2FixtureDef=function(){this.filter=new N};aa.prototype.b2FixtureDef=function(){this.userData=this.shape=null;this.friction=0.2;this.density=this.restitution=0;this.filter.categoryBits=1;this.filter.maskBits=65535;this.filter.groupIndex=0;this.isSensor=false};Z.b2Island=function(){};Z.prototype.b2Island=function(){this.m_bodies=new Vector;this.m_contacts=new Vector;this.m_joints=new Vector};
+Z.prototype.Initialize=function(a,c,g,b,e,f){if(a===undefined)a=0;if(c===undefined)c=0;if(g===undefined)g=0;var m=0;this.m_bodyCapacity=a;this.m_contactCapacity=c;this.m_jointCapacity=g;this.m_jointCount=this.m_contactCount=this.m_bodyCount=0;this.m_allocator=b;this.m_listener=e;this.m_contactSolver=f;for(m=this.m_bodies.length;m<a;m++)this.m_bodies[m]=null;for(m=this.m_contacts.length;m<c;m++)this.m_contacts[m]=null;for(m=this.m_joints.length;m<g;m++)this.m_joints[m]=null};Z.prototype.Clear=function(){this.m_jointCount=
+this.m_contactCount=this.m_bodyCount=0};Z.prototype.Solve=function(a,c,g){var b=0,e=0,f;for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];if(e.GetType()==k.b2_dynamicBody){e.m_linearVelocity.x+=a.dt*(c.x+e.m_invMass*e.m_force.x);e.m_linearVelocity.y+=a.dt*(c.y+e.m_invMass*e.m_force.y);e.m_angularVelocity+=a.dt*e.m_invI*e.m_torque;e.m_linearVelocity.Multiply(F.Clamp(1-a.dt*e.m_linearDamping,0,1));e.m_angularVelocity*=F.Clamp(1-a.dt*e.m_angularDamping,0,1)}}this.m_contactSolver.Initialize(a,this.m_contacts,
+this.m_contactCount,this.m_allocator);c=this.m_contactSolver;c.InitVelocityConstraints(a);for(b=0;b<this.m_jointCount;++b){f=this.m_joints[b];f.InitVelocityConstraints(a)}for(b=0;b<a.velocityIterations;++b){for(e=0;e<this.m_jointCount;++e){f=this.m_joints[e];f.SolveVelocityConstraints(a)}c.SolveVelocityConstraints()}for(b=0;b<this.m_jointCount;++b){f=this.m_joints[b];f.FinalizeVelocityConstraints()}c.FinalizeVelocityConstraints();for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];if(e.GetType()!=
+k.b2_staticBody){var m=a.dt*e.m_linearVelocity.x,r=a.dt*e.m_linearVelocity.y;if(m*m+r*r>A.b2_maxTranslationSquared){e.m_linearVelocity.Normalize();e.m_linearVelocity.x*=A.b2_maxTranslation*a.inv_dt;e.m_linearVelocity.y*=A.b2_maxTranslation*a.inv_dt}m=a.dt*e.m_angularVelocity;if(m*m>A.b2_maxRotationSquared)e.m_angularVelocity=e.m_angularVelocity<0?-A.b2_maxRotation*a.inv_dt:A.b2_maxRotation*a.inv_dt;e.m_sweep.c0.SetV(e.m_sweep.c);e.m_sweep.a0=e.m_sweep.a;e.m_sweep.c.x+=a.dt*e.m_linearVelocity.x;e.m_sweep.c.y+=
+a.dt*e.m_linearVelocity.y;e.m_sweep.a+=a.dt*e.m_angularVelocity;e.SynchronizeTransform()}}for(b=0;b<a.positionIterations;++b){m=c.SolvePositionConstraints(A.b2_contactBaumgarte);r=true;for(e=0;e<this.m_jointCount;++e){f=this.m_joints[e];f=f.SolvePositionConstraints(A.b2_contactBaumgarte);r=r&&f}if(m&&r)break}this.Report(c.m_constraints);if(g){g=Number.MAX_VALUE;c=A.b2_linearSleepTolerance*A.b2_linearSleepTolerance;m=A.b2_angularSleepTolerance*A.b2_angularSleepTolerance;for(b=0;b<this.m_bodyCount;++b){e=
+this.m_bodies[b];if(e.GetType()!=k.b2_staticBody){if((e.m_flags&k.e_allowSleepFlag)==0)g=e.m_sleepTime=0;if((e.m_flags&k.e_allowSleepFlag)==0||e.m_angularVelocity*e.m_angularVelocity>m||F.Dot(e.m_linearVelocity,e.m_linearVelocity)>c)g=e.m_sleepTime=0;else{e.m_sleepTime+=a.dt;g=F.Min(g,e.m_sleepTime)}}}if(g>=A.b2_timeToSleep)for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];e.SetAwake(false)}}};Z.prototype.SolveTOI=function(a){var c=0,g=0;this.m_contactSolver.Initialize(a,this.m_contacts,this.m_contactCount,
+this.m_allocator);var b=this.m_contactSolver;for(c=0;c<this.m_jointCount;++c)this.m_joints[c].InitVelocityConstraints(a);for(c=0;c<a.velocityIterations;++c){b.SolveVelocityConstraints();for(g=0;g<this.m_jointCount;++g)this.m_joints[g].SolveVelocityConstraints(a)}for(c=0;c<this.m_bodyCount;++c){g=this.m_bodies[c];if(g.GetType()!=k.b2_staticBody){var e=a.dt*g.m_linearVelocity.x,f=a.dt*g.m_linearVelocity.y;if(e*e+f*f>A.b2_maxTranslationSquared){g.m_linearVelocity.Normalize();g.m_linearVelocity.x*=A.b2_maxTranslation*
+a.inv_dt;g.m_linearVelocity.y*=A.b2_maxTranslation*a.inv_dt}e=a.dt*g.m_angularVelocity;if(e*e>A.b2_maxRotationSquared)g.m_angularVelocity=g.m_angularVelocity<0?-A.b2_maxRotation*a.inv_dt:A.b2_maxRotation*a.inv_dt;g.m_sweep.c0.SetV(g.m_sweep.c);g.m_sweep.a0=g.m_sweep.a;g.m_sweep.c.x+=a.dt*g.m_linearVelocity.x;g.m_sweep.c.y+=a.dt*g.m_linearVelocity.y;g.m_sweep.a+=a.dt*g.m_angularVelocity;g.SynchronizeTransform()}}for(c=0;c<a.positionIterations;++c){e=b.SolvePositionConstraints(0.75);f=true;for(g=0;g<
+this.m_jointCount;++g){var m=this.m_joints[g].SolvePositionConstraints(A.b2_contactBaumgarte);f=f&&m}if(e&&f)break}this.Report(b.m_constraints)};Z.prototype.Report=function(a){if(this.m_listener!=null)for(var c=0;c<this.m_contactCount;++c){for(var g=this.m_contacts[c],b=a[c],e=0;e<b.pointCount;++e){Z.s_impulse.normalImpulses[e]=b.points[e].normalImpulse;Z.s_impulse.tangentImpulses[e]=b.points[e].tangentImpulse}this.m_listener.PostSolve(g,Z.s_impulse)}};Z.prototype.AddBody=function(a){a.m_islandIndex=
+this.m_bodyCount;this.m_bodies[this.m_bodyCount++]=a};Z.prototype.AddContact=function(a){this.m_contacts[this.m_contactCount++]=a};Z.prototype.AddJoint=function(a){this.m_joints[this.m_jointCount++]=a};Box2D.postDefs.push(function(){Box2D.Dynamics.b2Island.s_impulse=new D});d.b2TimeStep=function(){};d.prototype.Set=function(a){this.dt=a.dt;this.inv_dt=a.inv_dt;this.positionIterations=a.positionIterations;this.velocityIterations=a.velocityIterations;this.warmStarting=a.warmStarting};h.b2World=function(){this.s_stack=
+new Vector;this.m_contactManager=new O;this.m_contactSolver=new o;this.m_island=new Z};h.prototype.b2World=function(a,c){this.m_controllerList=this.m_jointList=this.m_contactList=this.m_bodyList=this.m_debugDraw=this.m_destructionListener=null;this.m_controllerCount=this.m_jointCount=this.m_contactCount=this.m_bodyCount=0;h.m_warmStarting=true;h.m_continuousPhysics=true;this.m_allowSleep=c;this.m_gravity=a;this.m_inv_dt0=0;this.m_contactManager.m_world=this;this.m_groundBody=this.CreateBody(new z)};
+h.prototype.SetDestructionListener=function(a){this.m_destructionListener=a};h.prototype.SetContactFilter=function(a){this.m_contactManager.m_contactFilter=a};h.prototype.SetContactListener=function(a){this.m_contactManager.m_contactListener=a};h.prototype.SetDebugDraw=function(a){this.m_debugDraw=a};h.prototype.SetBroadPhase=function(a){var c=this.m_contactManager.m_broadPhase;this.m_contactManager.m_broadPhase=a;for(var g=this.m_bodyList;g;g=g.m_next)for(var b=g.m_fixtureList;b;b=b.m_next)b.m_proxy=
+a.CreateProxy(c.GetFatAABB(b.m_proxy),b)};h.prototype.Validate=function(){this.m_contactManager.m_broadPhase.Validate()};h.prototype.GetProxyCount=function(){return this.m_contactManager.m_broadPhase.GetProxyCount()};h.prototype.CreateBody=function(a){if(this.IsLocked()==true)return null;a=new k(a,this);a.m_prev=null;if(a.m_next=this.m_bodyList)this.m_bodyList.m_prev=a;this.m_bodyList=a;++this.m_bodyCount;return a};h.prototype.DestroyBody=function(a){if(this.IsLocked()!=true){for(var c=a.m_jointList;c;){var g=
+c;c=c.next;this.m_destructionListener&&this.m_destructionListener.SayGoodbyeJoint(g.joint);this.DestroyJoint(g.joint)}for(c=a.m_controllerList;c;){g=c;c=c.nextController;g.controller.RemoveBody(a)}for(c=a.m_contactList;c;){g=c;c=c.next;this.m_contactManager.Destroy(g.contact)}a.m_contactList=null;for(c=a.m_fixtureList;c;){g=c;c=c.m_next;this.m_destructionListener&&this.m_destructionListener.SayGoodbyeFixture(g);g.DestroyProxy(this.m_contactManager.m_broadPhase);g.Destroy()}a.m_fixtureList=null;a.m_fixtureCount=
+0;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_bodyList)this.m_bodyList=a.m_next;--this.m_bodyCount}};h.prototype.CreateJoint=function(a){var c=q.Create(a,null);c.m_prev=null;if(c.m_next=this.m_jointList)this.m_jointList.m_prev=c;this.m_jointList=c;++this.m_jointCount;c.m_edgeA.joint=c;c.m_edgeA.other=c.m_bodyB;c.m_edgeA.prev=null;if(c.m_edgeA.next=c.m_bodyA.m_jointList)c.m_bodyA.m_jointList.prev=c.m_edgeA;c.m_bodyA.m_jointList=c.m_edgeA;c.m_edgeB.joint=c;
+c.m_edgeB.other=c.m_bodyA;c.m_edgeB.prev=null;if(c.m_edgeB.next=c.m_bodyB.m_jointList)c.m_bodyB.m_jointList.prev=c.m_edgeB;c.m_bodyB.m_jointList=c.m_edgeB;var g=a.bodyA,b=a.bodyB;if(a.collideConnected==false)for(a=b.GetContactList();a;){a.other==g&&a.contact.FlagForFiltering();a=a.next}return c};h.prototype.DestroyJoint=function(a){var c=a.m_collideConnected;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_jointList)this.m_jointList=a.m_next;var g=a.m_bodyA,b=
+a.m_bodyB;g.SetAwake(true);b.SetAwake(true);if(a.m_edgeA.prev)a.m_edgeA.prev.next=a.m_edgeA.next;if(a.m_edgeA.next)a.m_edgeA.next.prev=a.m_edgeA.prev;if(a.m_edgeA==g.m_jointList)g.m_jointList=a.m_edgeA.next;a.m_edgeA.prev=null;a.m_edgeA.next=null;if(a.m_edgeB.prev)a.m_edgeB.prev.next=a.m_edgeB.next;if(a.m_edgeB.next)a.m_edgeB.next.prev=a.m_edgeB.prev;if(a.m_edgeB==b.m_jointList)b.m_jointList=a.m_edgeB.next;a.m_edgeB.prev=null;a.m_edgeB.next=null;q.Destroy(a,null);--this.m_jointCount;if(c==false)for(a=
+b.GetContactList();a;){a.other==g&&a.contact.FlagForFiltering();a=a.next}};h.prototype.AddController=function(a){a.m_next=this.m_controllerList;a.m_prev=null;this.m_controllerList=a;a.m_world=this;this.m_controllerCount++;return a};h.prototype.RemoveController=function(a){if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(this.m_controllerList==a)this.m_controllerList=a.m_next;this.m_controllerCount--};h.prototype.CreateController=function(a){if(a.m_world!=this)throw Error("Controller can only be a member of one world");
+a.m_next=this.m_controllerList;a.m_prev=null;if(this.m_controllerList)this.m_controllerList.m_prev=a;this.m_controllerList=a;++this.m_controllerCount;a.m_world=this;return a};h.prototype.DestroyController=function(a){a.Clear();if(a.m_next)a.m_next.m_prev=a.m_prev;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a==this.m_controllerList)this.m_controllerList=a.m_next;--this.m_controllerCount};h.prototype.SetWarmStarting=function(a){h.m_warmStarting=a};h.prototype.SetContinuousPhysics=function(a){h.m_continuousPhysics=
+a};h.prototype.GetBodyCount=function(){return this.m_bodyCount};h.prototype.GetJointCount=function(){return this.m_jointCount};h.prototype.GetContactCount=function(){return this.m_contactCount};h.prototype.SetGravity=function(a){this.m_gravity=a};h.prototype.GetGravity=function(){return this.m_gravity};h.prototype.GetGroundBody=function(){return this.m_groundBody};h.prototype.Step=function(a,c,g){if(a===undefined)a=0;if(c===undefined)c=0;if(g===undefined)g=0;if(this.m_flags&h.e_newFixture){this.m_contactManager.FindNewContacts();
+this.m_flags&=~h.e_newFixture}this.m_flags|=h.e_locked;var b=h.s_timestep2;b.dt=a;b.velocityIterations=c;b.positionIterations=g;b.inv_dt=a>0?1/a:0;b.dtRatio=this.m_inv_dt0*a;b.warmStarting=h.m_warmStarting;this.m_contactManager.Collide();b.dt>0&&this.Solve(b);h.m_continuousPhysics&&b.dt>0&&this.SolveTOI(b);if(b.dt>0)this.m_inv_dt0=b.inv_dt;this.m_flags&=~h.e_locked};h.prototype.ClearForces=function(){for(var a=this.m_bodyList;a;a=a.m_next){a.m_force.SetZero();a.m_torque=0}};h.prototype.DrawDebugData=
+function(){if(this.m_debugDraw!=null){this.m_debugDraw.m_sprite.graphics.clear();var a=this.m_debugDraw.GetFlags(),c,g,b;new y;new y;new y;var e;new U;new U;e=[new y,new y,new y,new y];var f=new w(0,0,0);if(a&E.e_shapeBit)for(c=this.m_bodyList;c;c=c.m_next){e=c.m_xf;for(g=c.GetFixtureList();g;g=g.m_next){b=g.GetShape();if(c.IsActive()==false)f.Set(0.5,0.5,0.3);else if(c.GetType()==k.b2_staticBody)f.Set(0.5,0.9,0.5);else if(c.GetType()==k.b2_kinematicBody)f.Set(0.5,0.5,0.9);else c.IsAwake()==false?
+f.Set(0.6,0.6,0.6):f.Set(0.9,0.7,0.7);this.DrawShape(b,e,f)}}if(a&E.e_jointBit)for(c=this.m_jointList;c;c=c.m_next)this.DrawJoint(c);if(a&E.e_controllerBit)for(c=this.m_controllerList;c;c=c.m_next)c.Draw(this.m_debugDraw);if(a&E.e_pairBit){f.Set(0.3,0.9,0.9);for(c=this.m_contactManager.m_contactList;c;c=c.GetNext()){b=c.GetFixtureA();g=c.GetFixtureB();b=b.GetAABB().GetCenter();g=g.GetAABB().GetCenter();this.m_debugDraw.DrawSegment(b,g,f)}}if(a&E.e_aabbBit){b=this.m_contactManager.m_broadPhase;e=[new y,
+new y,new y,new y];for(c=this.m_bodyList;c;c=c.GetNext())if(c.IsActive()!=false)for(g=c.GetFixtureList();g;g=g.GetNext()){var m=b.GetFatAABB(g.m_proxy);e[0].Set(m.lowerBound.x,m.lowerBound.y);e[1].Set(m.upperBound.x,m.lowerBound.y);e[2].Set(m.upperBound.x,m.upperBound.y);e[3].Set(m.lowerBound.x,m.upperBound.y);this.m_debugDraw.DrawPolygon(e,4,f)}}if(a&E.e_centerOfMassBit)for(c=this.m_bodyList;c;c=c.m_next){e=h.s_xf;e.R=c.m_xf.R;e.position=c.GetWorldCenter();this.m_debugDraw.DrawTransform(e)}}};h.prototype.QueryAABB=
+function(a,c){var g=this.m_contactManager.m_broadPhase;g.Query(function(b){return a(g.GetUserData(b))},c)};h.prototype.QueryShape=function(a,c,g){if(g===undefined)g=null;if(g==null){g=new K;g.SetIdentity()}var b=this.m_contactManager.m_broadPhase,e=new U;c.ComputeAABB(e,g);b.Query(function(f){f=b.GetUserData(f)instanceof S?b.GetUserData(f):null;if(Y.TestOverlap(c,g,f.GetShape(),f.GetBody().GetTransform()))return a(f);return true},e)};h.prototype.QueryPoint=function(a,c){var g=this.m_contactManager.m_broadPhase,
+b=new U;b.lowerBound.Set(c.x-A.b2_linearSlop,c.y-A.b2_linearSlop);b.upperBound.Set(c.x+A.b2_linearSlop,c.y+A.b2_linearSlop);g.Query(function(e){e=g.GetUserData(e)instanceof S?g.GetUserData(e):null;if(e.TestPoint(c))return a(e);return true},b)};h.prototype.RayCast=function(a,c,g){var b=this.m_contactManager.m_broadPhase,e=new V,f=new Q(c,g);b.RayCast(function(m,r){var s=b.GetUserData(r);s=s instanceof S?s:null;if(s.RayCast(e,m)){var v=e.fraction,t=new y((1-v)*c.x+v*g.x,(1-v)*c.y+v*g.y);return a(s,
+t,e.normal,v)}return m.maxFraction},f)};h.prototype.RayCastOne=function(a,c){var g;this.RayCast(function(b,e,f,m){if(m===undefined)m=0;g=b;return m},a,c);return g};h.prototype.RayCastAll=function(a,c){var g=new Vector;this.RayCast(function(b){g[g.length]=b;return 1},a,c);return g};h.prototype.GetBodyList=function(){return this.m_bodyList};h.prototype.GetJointList=function(){return this.m_jointList};h.prototype.GetContactList=function(){return this.m_contactList};h.prototype.IsLocked=function(){return(this.m_flags&
+h.e_locked)>0};h.prototype.Solve=function(a){for(var c,g=this.m_controllerList;g;g=g.m_next)g.Step(a);g=this.m_island;g.Initialize(this.m_bodyCount,this.m_contactCount,this.m_jointCount,null,this.m_contactManager.m_contactListener,this.m_contactSolver);for(c=this.m_bodyList;c;c=c.m_next)c.m_flags&=~k.e_islandFlag;for(var b=this.m_contactList;b;b=b.m_next)b.m_flags&=~l.e_islandFlag;for(b=this.m_jointList;b;b=b.m_next)b.m_islandFlag=false;parseInt(this.m_bodyCount);b=this.s_stack;for(var e=this.m_bodyList;e;e=
+e.m_next)if(!(e.m_flags&k.e_islandFlag))if(!(e.IsAwake()==false||e.IsActive()==false))if(e.GetType()!=k.b2_staticBody){g.Clear();var f=0;b[f++]=e;for(e.m_flags|=k.e_islandFlag;f>0;){c=b[--f];g.AddBody(c);c.IsAwake()==false&&c.SetAwake(true);if(c.GetType()!=k.b2_staticBody){for(var m,r=c.m_contactList;r;r=r.next)if(!(r.contact.m_flags&l.e_islandFlag))if(!(r.contact.IsSensor()==true||r.contact.IsEnabled()==false||r.contact.IsTouching()==false)){g.AddContact(r.contact);r.contact.m_flags|=l.e_islandFlag;
+m=r.other;if(!(m.m_flags&k.e_islandFlag)){b[f++]=m;m.m_flags|=k.e_islandFlag}}for(c=c.m_jointList;c;c=c.next)if(c.joint.m_islandFlag!=true){m=c.other;if(m.IsActive()!=false){g.AddJoint(c.joint);c.joint.m_islandFlag=true;if(!(m.m_flags&k.e_islandFlag)){b[f++]=m;m.m_flags|=k.e_islandFlag}}}}}g.Solve(a,this.m_gravity,this.m_allowSleep);for(f=0;f<g.m_bodyCount;++f){c=g.m_bodies[f];if(c.GetType()==k.b2_staticBody)c.m_flags&=~k.e_islandFlag}}for(f=0;f<b.length;++f){if(!b[f])break;b[f]=null}for(c=this.m_bodyList;c;c=
+c.m_next)c.IsAwake()==false||c.IsActive()==false||c.GetType()!=k.b2_staticBody&&c.SynchronizeFixtures();this.m_contactManager.FindNewContacts()};h.prototype.SolveTOI=function(a){var c,g,b,e=this.m_island;e.Initialize(this.m_bodyCount,A.b2_maxTOIContactsPerIsland,A.b2_maxTOIJointsPerIsland,null,this.m_contactManager.m_contactListener,this.m_contactSolver);var f=h.s_queue;for(c=this.m_bodyList;c;c=c.m_next){c.m_flags&=~k.e_islandFlag;c.m_sweep.t0=0}for(b=this.m_contactList;b;b=b.m_next)b.m_flags&=~(l.e_toiFlag|
+l.e_islandFlag);for(b=this.m_jointList;b;b=b.m_next)b.m_islandFlag=false;for(;;){var m=null,r=1;for(b=this.m_contactList;b;b=b.m_next)if(!(b.IsSensor()==true||b.IsEnabled()==false||b.IsContinuous()==false)){c=1;if(b.m_flags&l.e_toiFlag)c=b.m_toi;else{c=b.m_fixtureA;g=b.m_fixtureB;c=c.m_body;g=g.m_body;if((c.GetType()!=k.b2_dynamicBody||c.IsAwake()==false)&&(g.GetType()!=k.b2_dynamicBody||g.IsAwake()==false))continue;var s=c.m_sweep.t0;if(c.m_sweep.t0<g.m_sweep.t0){s=g.m_sweep.t0;c.m_sweep.Advance(s)}else if(g.m_sweep.t0<
+c.m_sweep.t0){s=c.m_sweep.t0;g.m_sweep.Advance(s)}c=b.ComputeTOI(c.m_sweep,g.m_sweep);A.b2Assert(0<=c&&c<=1);if(c>0&&c<1){c=(1-c)*s+c;if(c>1)c=1}b.m_toi=c;b.m_flags|=l.e_toiFlag}if(Number.MIN_VALUE<c&&c<r){m=b;r=c}}if(m==null||1-100*Number.MIN_VALUE<r)break;c=m.m_fixtureA;g=m.m_fixtureB;c=c.m_body;g=g.m_body;h.s_backupA.Set(c.m_sweep);h.s_backupB.Set(g.m_sweep);c.Advance(r);g.Advance(r);m.Update(this.m_contactManager.m_contactListener);m.m_flags&=~l.e_toiFlag;if(m.IsSensor()==true||m.IsEnabled()==
+false){c.m_sweep.Set(h.s_backupA);g.m_sweep.Set(h.s_backupB);c.SynchronizeTransform();g.SynchronizeTransform()}else if(m.IsTouching()!=false){c=c;if(c.GetType()!=k.b2_dynamicBody)c=g;e.Clear();m=b=0;f[b+m++]=c;for(c.m_flags|=k.e_islandFlag;m>0;){c=f[b++];--m;e.AddBody(c);c.IsAwake()==false&&c.SetAwake(true);if(c.GetType()==k.b2_dynamicBody){for(g=c.m_contactList;g;g=g.next){if(e.m_contactCount==e.m_contactCapacity)break;if(!(g.contact.m_flags&l.e_islandFlag))if(!(g.contact.IsSensor()==true||g.contact.IsEnabled()==
+false||g.contact.IsTouching()==false)){e.AddContact(g.contact);g.contact.m_flags|=l.e_islandFlag;s=g.other;if(!(s.m_flags&k.e_islandFlag)){if(s.GetType()!=k.b2_staticBody){s.Advance(r);s.SetAwake(true)}f[b+m]=s;++m;s.m_flags|=k.e_islandFlag}}}for(c=c.m_jointList;c;c=c.next)if(e.m_jointCount!=e.m_jointCapacity)if(c.joint.m_islandFlag!=true){s=c.other;if(s.IsActive()!=false){e.AddJoint(c.joint);c.joint.m_islandFlag=true;if(!(s.m_flags&k.e_islandFlag)){if(s.GetType()!=k.b2_staticBody){s.Advance(r);s.SetAwake(true)}f[b+
+m]=s;++m;s.m_flags|=k.e_islandFlag}}}}}b=h.s_timestep;b.warmStarting=false;b.dt=(1-r)*a.dt;b.inv_dt=1/b.dt;b.dtRatio=0;b.velocityIterations=a.velocityIterations;b.positionIterations=a.positionIterations;e.SolveTOI(b);for(r=r=0;r<e.m_bodyCount;++r){c=e.m_bodies[r];c.m_flags&=~k.e_islandFlag;if(c.IsAwake()!=false)if(c.GetType()==k.b2_dynamicBody){c.SynchronizeFixtures();for(g=c.m_contactList;g;g=g.next)g.contact.m_flags&=~l.e_toiFlag}}for(r=0;r<e.m_contactCount;++r){b=e.m_contacts[r];b.m_flags&=~(l.e_toiFlag|
+l.e_islandFlag)}for(r=0;r<e.m_jointCount;++r){b=e.m_joints[r];b.m_islandFlag=false}this.m_contactManager.FindNewContacts()}}};h.prototype.DrawJoint=function(a){var c=a.GetBodyA(),g=a.GetBodyB(),b=c.m_xf.position,e=g.m_xf.position,f=a.GetAnchorA(),m=a.GetAnchorB(),r=h.s_jointColor;switch(a.m_type){case q.e_distanceJoint:this.m_debugDraw.DrawSegment(f,m,r);break;case q.e_pulleyJoint:c=a instanceof n?a:null;a=c.GetGroundAnchorA();c=c.GetGroundAnchorB();this.m_debugDraw.DrawSegment(a,f,r);this.m_debugDraw.DrawSegment(c,
+m,r);this.m_debugDraw.DrawSegment(a,c,r);break;case q.e_mouseJoint:this.m_debugDraw.DrawSegment(f,m,r);break;default:c!=this.m_groundBody&&this.m_debugDraw.DrawSegment(b,f,r);this.m_debugDraw.DrawSegment(f,m,r);g!=this.m_groundBody&&this.m_debugDraw.DrawSegment(e,m,r)}};h.prototype.DrawShape=function(a,c,g){switch(a.m_type){case Y.e_circleShape:var b=a instanceof M?a:null;this.m_debugDraw.DrawSolidCircle(F.MulX(c,b.m_p),b.m_radius,c.R.col1,g);break;case Y.e_polygonShape:b=0;b=a instanceof W?a:null;
+a=parseInt(b.GetVertexCount());var e=b.GetVertices(),f=new Vector(a);for(b=0;b<a;++b)f[b]=F.MulX(c,e[b]);this.m_debugDraw.DrawSolidPolygon(f,a,g);break;case Y.e_edgeShape:b=a instanceof L?a:null;this.m_debugDraw.DrawSegment(F.MulX(c,b.GetVertex1()),F.MulX(c,b.GetVertex2()),g)}};Box2D.postDefs.push(function(){Box2D.Dynamics.b2World.s_timestep2=new d;Box2D.Dynamics.b2World.s_xf=new K;Box2D.Dynamics.b2World.s_backupA=new G;Box2D.Dynamics.b2World.s_backupB=new G;Box2D.Dynamics.b2World.s_timestep=new d;
+Box2D.Dynamics.b2World.s_queue=new Vector;Box2D.Dynamics.b2World.s_jointColor=new w(0.5,0.8,0.8);Box2D.Dynamics.b2World.e_newFixture=1;Box2D.Dynamics.b2World.e_locked=2})})();
+(function(){var F=Box2D.Collision.Shapes.b2CircleShape,G=Box2D.Collision.Shapes.b2EdgeShape,K=Box2D.Collision.Shapes.b2PolygonShape,y=Box2D.Collision.Shapes.b2Shape,w=Box2D.Dynamics.Contacts.b2CircleContact,A=Box2D.Dynamics.Contacts.b2Contact,U=Box2D.Dynamics.Contacts.b2ContactConstraint,p=Box2D.Dynamics.Contacts.b2ContactConstraintPoint,B=Box2D.Dynamics.Contacts.b2ContactEdge,Q=Box2D.Dynamics.Contacts.b2ContactFactory,V=Box2D.Dynamics.Contacts.b2ContactRegister,M=Box2D.Dynamics.Contacts.b2ContactResult,
+L=Box2D.Dynamics.Contacts.b2ContactSolver,I=Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,W=Box2D.Dynamics.Contacts.b2NullContact,Y=Box2D.Dynamics.Contacts.b2PolyAndCircleContact,k=Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,z=Box2D.Dynamics.Contacts.b2PolygonContact,u=Box2D.Dynamics.Contacts.b2PositionSolverManifold,D=Box2D.Dynamics.b2Body,H=Box2D.Dynamics.b2TimeStep,O=Box2D.Common.b2Settings,E=Box2D.Common.Math.b2Mat22,R=Box2D.Common.Math.b2Math,N=Box2D.Common.Math.b2Vec2,S=Box2D.Collision.b2Collision,
+aa=Box2D.Collision.b2ContactID,Z=Box2D.Collision.b2Manifold,d=Box2D.Collision.b2TimeOfImpact,h=Box2D.Collision.b2TOIInput,l=Box2D.Collision.b2WorldManifold;Box2D.inherit(w,Box2D.Dynamics.Contacts.b2Contact);w.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;w.b2CircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};w.Create=function(){return new w};w.Destroy=function(){};w.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};w.prototype.Evaluate=
+function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();S.CollideCircles(this.m_manifold,this.m_fixtureA.GetShape()instanceof F?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};A.b2Contact=function(){this.m_nodeA=new B;this.m_nodeB=new B;this.m_manifold=new Z;this.m_oldManifold=new Z};A.prototype.GetManifold=function(){return this.m_manifold};A.prototype.GetWorldManifold=function(j){var o=this.m_fixtureA.GetBody(),
+q=this.m_fixtureB.GetBody(),n=this.m_fixtureA.GetShape(),a=this.m_fixtureB.GetShape();j.Initialize(this.m_manifold,o.GetTransform(),n.m_radius,q.GetTransform(),a.m_radius)};A.prototype.IsTouching=function(){return(this.m_flags&A.e_touchingFlag)==A.e_touchingFlag};A.prototype.IsContinuous=function(){return(this.m_flags&A.e_continuousFlag)==A.e_continuousFlag};A.prototype.SetSensor=function(j){if(j)this.m_flags|=A.e_sensorFlag;else this.m_flags&=~A.e_sensorFlag};A.prototype.IsSensor=function(){return(this.m_flags&
+A.e_sensorFlag)==A.e_sensorFlag};A.prototype.SetEnabled=function(j){if(j)this.m_flags|=A.e_enabledFlag;else this.m_flags&=~A.e_enabledFlag};A.prototype.IsEnabled=function(){return(this.m_flags&A.e_enabledFlag)==A.e_enabledFlag};A.prototype.GetNext=function(){return this.m_next};A.prototype.GetFixtureA=function(){return this.m_fixtureA};A.prototype.GetFixtureB=function(){return this.m_fixtureB};A.prototype.FlagForFiltering=function(){this.m_flags|=A.e_filterFlag};A.prototype.b2Contact=function(){};
+A.prototype.Reset=function(j,o){if(j===undefined)j=null;if(o===undefined)o=null;this.m_flags=A.e_enabledFlag;if(!j||!o)this.m_fixtureB=this.m_fixtureA=null;else{if(j.IsSensor()||o.IsSensor())this.m_flags|=A.e_sensorFlag;var q=j.GetBody(),n=o.GetBody();if(q.GetType()!=D.b2_dynamicBody||q.IsBullet()||n.GetType()!=D.b2_dynamicBody||n.IsBullet())this.m_flags|=A.e_continuousFlag;this.m_fixtureA=j;this.m_fixtureB=o;this.m_manifold.m_pointCount=0;this.m_next=this.m_prev=null;this.m_nodeA.contact=null;this.m_nodeA.prev=
+null;this.m_nodeA.next=null;this.m_nodeA.other=null;this.m_nodeB.contact=null;this.m_nodeB.prev=null;this.m_nodeB.next=null;this.m_nodeB.other=null}};A.prototype.Update=function(j){var o=this.m_oldManifold;this.m_oldManifold=this.m_manifold;this.m_manifold=o;this.m_flags|=A.e_enabledFlag;var q=false;o=(this.m_flags&A.e_touchingFlag)==A.e_touchingFlag;var n=this.m_fixtureA.m_body,a=this.m_fixtureB.m_body,c=this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb);if(this.m_flags&A.e_sensorFlag){if(c){q=
+this.m_fixtureA.GetShape();c=this.m_fixtureB.GetShape();n=n.GetTransform();a=a.GetTransform();q=y.TestOverlap(q,n,c,a)}this.m_manifold.m_pointCount=0}else{if(n.GetType()!=D.b2_dynamicBody||n.IsBullet()||a.GetType()!=D.b2_dynamicBody||a.IsBullet())this.m_flags|=A.e_continuousFlag;else this.m_flags&=~A.e_continuousFlag;if(c){this.Evaluate();q=this.m_manifold.m_pointCount>0;for(c=0;c<this.m_manifold.m_pointCount;++c){var g=this.m_manifold.m_points[c];g.m_normalImpulse=0;g.m_tangentImpulse=0;for(var b=
+g.m_id,e=0;e<this.m_oldManifold.m_pointCount;++e){var f=this.m_oldManifold.m_points[e];if(f.m_id.key==b.key){g.m_normalImpulse=f.m_normalImpulse;g.m_tangentImpulse=f.m_tangentImpulse;break}}}}else this.m_manifold.m_pointCount=0;if(q!=o){n.SetAwake(true);a.SetAwake(true)}}if(q)this.m_flags|=A.e_touchingFlag;else this.m_flags&=~A.e_touchingFlag;o==false&&q==true&&j.BeginContact(this);o==true&&q==false&&j.EndContact(this);(this.m_flags&A.e_sensorFlag)==0&&j.PreSolve(this,this.m_oldManifold)};A.prototype.Evaluate=
+function(){};A.prototype.ComputeTOI=function(j,o){A.s_input.proxyA.Set(this.m_fixtureA.GetShape());A.s_input.proxyB.Set(this.m_fixtureB.GetShape());A.s_input.sweepA=j;A.s_input.sweepB=o;A.s_input.tolerance=O.b2_linearSlop;return d.TimeOfImpact(A.s_input)};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag=1;Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag=2;Box2D.Dynamics.Contacts.b2Contact.e_islandFlag=4;Box2D.Dynamics.Contacts.b2Contact.e_toiFlag=8;Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag=
+16;Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag=32;Box2D.Dynamics.Contacts.b2Contact.e_filterFlag=64;Box2D.Dynamics.Contacts.b2Contact.s_input=new h});U.b2ContactConstraint=function(){this.localPlaneNormal=new N;this.localPoint=new N;this.normal=new N;this.normalMass=new E;this.K=new E};U.prototype.b2ContactConstraint=function(){this.points=new Vector(O.b2_maxManifoldPoints);for(var j=0;j<O.b2_maxManifoldPoints;j++)this.points[j]=new p};p.b2ContactConstraintPoint=function(){this.localPoint=new N;
+this.rA=new N;this.rB=new N};B.b2ContactEdge=function(){};Q.b2ContactFactory=function(){};Q.prototype.b2ContactFactory=function(j){this.m_allocator=j;this.InitializeRegisters()};Q.prototype.AddType=function(j,o,q,n){if(q===undefined)q=0;if(n===undefined)n=0;this.m_registers[q][n].createFcn=j;this.m_registers[q][n].destroyFcn=o;this.m_registers[q][n].primary=true;if(q!=n){this.m_registers[n][q].createFcn=j;this.m_registers[n][q].destroyFcn=o;this.m_registers[n][q].primary=false}};Q.prototype.InitializeRegisters=
+function(){this.m_registers=new Vector(y.e_shapeTypeCount);for(var j=0;j<y.e_shapeTypeCount;j++){this.m_registers[j]=new Vector(y.e_shapeTypeCount);for(var o=0;o<y.e_shapeTypeCount;o++)this.m_registers[j][o]=new V}this.AddType(w.Create,w.Destroy,y.e_circleShape,y.e_circleShape);this.AddType(Y.Create,Y.Destroy,y.e_polygonShape,y.e_circleShape);this.AddType(z.Create,z.Destroy,y.e_polygonShape,y.e_polygonShape);this.AddType(I.Create,I.Destroy,y.e_edgeShape,y.e_circleShape);this.AddType(k.Create,k.Destroy,
+y.e_polygonShape,y.e_edgeShape)};Q.prototype.Create=function(j,o){var q=parseInt(j.GetType()),n=parseInt(o.GetType());q=this.m_registers[q][n];if(q.pool){n=q.pool;q.pool=n.m_next;q.poolCount--;n.Reset(j,o);return n}n=q.createFcn;if(n!=null){if(q.primary){n=n(this.m_allocator);n.Reset(j,o)}else{n=n(this.m_allocator);n.Reset(o,j)}return n}else return null};Q.prototype.Destroy=function(j){if(j.m_manifold.m_pointCount>0){j.m_fixtureA.m_body.SetAwake(true);j.m_fixtureB.m_body.SetAwake(true)}var o=parseInt(j.m_fixtureA.GetType()),
+q=parseInt(j.m_fixtureB.GetType());o=this.m_registers[o][q];o.poolCount++;j.m_next=o.pool;o.pool=j;o=o.destroyFcn;o(j,this.m_allocator)};V.b2ContactRegister=function(){};M.b2ContactResult=function(){this.position=new N;this.normal=new N;this.id=new aa};L.b2ContactSolver=function(){this.m_step=new H;this.m_constraints=new Vector};L.prototype.b2ContactSolver=function(){};L.prototype.Initialize=function(j,o,q,n){if(q===undefined)q=0;var a;this.m_step.Set(j);this.m_allocator=n;j=0;for(this.m_constraintCount=
+q;this.m_constraints.length<this.m_constraintCount;)this.m_constraints[this.m_constraints.length]=new U;for(j=0;j<q;++j){a=o[j];n=a.m_fixtureA;var c=a.m_fixtureB,g=n.m_shape.m_radius,b=c.m_shape.m_radius,e=n.m_body,f=c.m_body,m=a.GetManifold(),r=O.b2MixFriction(n.GetFriction(),c.GetFriction()),s=O.b2MixRestitution(n.GetRestitution(),c.GetRestitution()),v=e.m_linearVelocity.x,t=e.m_linearVelocity.y,x=f.m_linearVelocity.x,C=f.m_linearVelocity.y,J=e.m_angularVelocity,T=f.m_angularVelocity;O.b2Assert(m.m_pointCount>
+0);L.s_worldManifold.Initialize(m,e.m_xf,g,f.m_xf,b);c=L.s_worldManifold.m_normal.x;a=L.s_worldManifold.m_normal.y;n=this.m_constraints[j];n.bodyA=e;n.bodyB=f;n.manifold=m;n.normal.x=c;n.normal.y=a;n.pointCount=m.m_pointCount;n.friction=r;n.restitution=s;n.localPlaneNormal.x=m.m_localPlaneNormal.x;n.localPlaneNormal.y=m.m_localPlaneNormal.y;n.localPoint.x=m.m_localPoint.x;n.localPoint.y=m.m_localPoint.y;n.radius=g+b;n.type=m.m_type;for(g=0;g<n.pointCount;++g){r=m.m_points[g];b=n.points[g];b.normalImpulse=
+r.m_normalImpulse;b.tangentImpulse=r.m_tangentImpulse;b.localPoint.SetV(r.m_localPoint);r=b.rA.x=L.s_worldManifold.m_points[g].x-e.m_sweep.c.x;s=b.rA.y=L.s_worldManifold.m_points[g].y-e.m_sweep.c.y;var P=b.rB.x=L.s_worldManifold.m_points[g].x-f.m_sweep.c.x,X=b.rB.y=L.s_worldManifold.m_points[g].y-f.m_sweep.c.y,$=r*a-s*c,ba=P*a-X*c;$*=$;ba*=ba;b.normalMass=1/(e.m_invMass+f.m_invMass+e.m_invI*$+f.m_invI*ba);var ca=e.m_mass*e.m_invMass+f.m_mass*f.m_invMass;ca+=e.m_mass*e.m_invI*$+f.m_mass*f.m_invI*ba;
+b.equalizedMass=1/ca;ba=a;ca=-c;$=r*ca-s*ba;ba=P*ca-X*ba;$*=$;ba*=ba;b.tangentMass=1/(e.m_invMass+f.m_invMass+e.m_invI*$+f.m_invI*ba);b.velocityBias=0;r=n.normal.x*(x+-T*X-v- -J*s)+n.normal.y*(C+T*P-t-J*r);if(r<-O.b2_velocityThreshold)b.velocityBias+=-n.restitution*r}if(n.pointCount==2){C=n.points[0];x=n.points[1];m=e.m_invMass;e=e.m_invI;v=f.m_invMass;f=f.m_invI;t=C.rA.x*a-C.rA.y*c;C=C.rB.x*a-C.rB.y*c;J=x.rA.x*a-x.rA.y*c;x=x.rB.x*a-x.rB.y*c;c=m+v+e*t*t+f*C*C;a=m+v+e*J*J+f*x*x;f=m+v+e*t*J+f*C*x;if(c*
+c<100*(c*a-f*f)){n.K.col1.Set(c,f);n.K.col2.Set(f,a);n.K.GetInverse(n.normalMass)}else n.pointCount=1}}};L.prototype.InitVelocityConstraints=function(j){for(var o=0;o<this.m_constraintCount;++o){var q=this.m_constraints[o],n=q.bodyA,a=q.bodyB,c=n.m_invMass,g=n.m_invI,b=a.m_invMass,e=a.m_invI,f=q.normal.x,m=q.normal.y,r=m,s=-f,v=0,t=0;if(j.warmStarting){t=q.pointCount;for(v=0;v<t;++v){var x=q.points[v];x.normalImpulse*=j.dtRatio;x.tangentImpulse*=j.dtRatio;var C=x.normalImpulse*f+x.tangentImpulse*
+r,J=x.normalImpulse*m+x.tangentImpulse*s;n.m_angularVelocity-=g*(x.rA.x*J-x.rA.y*C);n.m_linearVelocity.x-=c*C;n.m_linearVelocity.y-=c*J;a.m_angularVelocity+=e*(x.rB.x*J-x.rB.y*C);a.m_linearVelocity.x+=b*C;a.m_linearVelocity.y+=b*J}}else{t=q.pointCount;for(v=0;v<t;++v){n=q.points[v];n.normalImpulse=0;n.tangentImpulse=0}}}};L.prototype.SolveVelocityConstraints=function(){for(var j=0,o,q=0,n=0,a=0,c=n=n=q=q=0,g=q=q=0,b=q=a=0,e=0,f,m=0;m<this.m_constraintCount;++m){a=this.m_constraints[m];var r=a.bodyA,
+s=a.bodyB,v=r.m_angularVelocity,t=s.m_angularVelocity,x=r.m_linearVelocity,C=s.m_linearVelocity,J=r.m_invMass,T=r.m_invI,P=s.m_invMass,X=s.m_invI;b=a.normal.x;var $=e=a.normal.y;f=-b;g=a.friction;for(j=0;j<a.pointCount;j++){o=a.points[j];q=C.x-t*o.rB.y-x.x+v*o.rA.y;n=C.y+t*o.rB.x-x.y-v*o.rA.x;q=q*$+n*f;q=o.tangentMass*-q;n=g*o.normalImpulse;n=R.Clamp(o.tangentImpulse+q,-n,n);q=n-o.tangentImpulse;c=q*$;q=q*f;x.x-=J*c;x.y-=J*q;v-=T*(o.rA.x*q-o.rA.y*c);C.x+=P*c;C.y+=P*q;t+=X*(o.rB.x*q-o.rB.y*c);o.tangentImpulse=
+n}parseInt(a.pointCount);if(a.pointCount==1){o=a.points[0];q=C.x+-t*o.rB.y-x.x- -v*o.rA.y;n=C.y+t*o.rB.x-x.y-v*o.rA.x;a=q*b+n*e;q=-o.normalMass*(a-o.velocityBias);n=o.normalImpulse+q;n=n>0?n:0;q=n-o.normalImpulse;c=q*b;q=q*e;x.x-=J*c;x.y-=J*q;v-=T*(o.rA.x*q-o.rA.y*c);C.x+=P*c;C.y+=P*q;t+=X*(o.rB.x*q-o.rB.y*c);o.normalImpulse=n}else{o=a.points[0];j=a.points[1];q=o.normalImpulse;g=j.normalImpulse;var ba=(C.x-t*o.rB.y-x.x+v*o.rA.y)*b+(C.y+t*o.rB.x-x.y-v*o.rA.x)*e,ca=(C.x-t*j.rB.y-x.x+v*j.rA.y)*b+(C.y+
+t*j.rB.x-x.y-v*j.rA.x)*e;n=ba-o.velocityBias;c=ca-j.velocityBias;f=a.K;n-=f.col1.x*q+f.col2.x*g;for(c-=f.col1.y*q+f.col2.y*g;;){f=a.normalMass;$=-(f.col1.x*n+f.col2.x*c);f=-(f.col1.y*n+f.col2.y*c);if($>=0&&f>=0){q=$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}$=-o.normalMass*n;f=0;ca=a.K.col1.y*$+c;if($>=0&&ca>=0){q=$-q;g=f-g;a=q*b;
+q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}$=0;f=-j.normalMass*c;ba=a.K.col2.x*f+n;if(f>=0&&ba>=0){q=$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}f=$=0;ba=n;ca=c;if(ba>=0&&ca>=0){q=
+$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}break}}r.m_angularVelocity=v;s.m_angularVelocity=t}};L.prototype.FinalizeVelocityConstraints=function(){for(var j=0;j<this.m_constraintCount;++j)for(var o=this.m_constraints[j],q=o.manifold,n=0;n<o.pointCount;++n){var a=q.m_points[n],c=o.points[n];a.m_normalImpulse=c.normalImpulse;a.m_tangentImpulse=
+c.tangentImpulse}};L.prototype.SolvePositionConstraints=function(j){if(j===undefined)j=0;for(var o=0,q=0;q<this.m_constraintCount;q++){var n=this.m_constraints[q],a=n.bodyA,c=n.bodyB,g=a.m_mass*a.m_invMass,b=a.m_mass*a.m_invI,e=c.m_mass*c.m_invMass,f=c.m_mass*c.m_invI;L.s_psm.Initialize(n);for(var m=L.s_psm.m_normal,r=0;r<n.pointCount;r++){var s=n.points[r],v=L.s_psm.m_points[r],t=L.s_psm.m_separations[r],x=v.x-a.m_sweep.c.x,C=v.y-a.m_sweep.c.y,J=v.x-c.m_sweep.c.x;v=v.y-c.m_sweep.c.y;o=o<t?o:t;t=
+R.Clamp(j*(t+O.b2_linearSlop),-O.b2_maxLinearCorrection,0);t=-s.equalizedMass*t;s=t*m.x;t=t*m.y;a.m_sweep.c.x-=g*s;a.m_sweep.c.y-=g*t;a.m_sweep.a-=b*(x*t-C*s);a.SynchronizeTransform();c.m_sweep.c.x+=e*s;c.m_sweep.c.y+=e*t;c.m_sweep.a+=f*(J*t-v*s);c.SynchronizeTransform()}}return o>-1.5*O.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold=new l;Box2D.Dynamics.Contacts.b2ContactSolver.s_psm=new u});Box2D.inherit(I,Box2D.Dynamics.Contacts.b2Contact);
+I.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;I.b2EdgeAndCircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};I.Create=function(){return new I};I.Destroy=function(){};I.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};I.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();this.b2CollideEdgeAndCircle(this.m_manifold,this.m_fixtureA.GetShape()instanceof G?this.m_fixtureA.GetShape():null,j.m_xf,
+this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};I.prototype.b2CollideEdgeAndCircle=function(){};Box2D.inherit(W,Box2D.Dynamics.Contacts.b2Contact);W.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;W.b2NullContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};W.prototype.b2NullContact=function(){this.__super.b2Contact.call(this)};W.prototype.Evaluate=function(){};Box2D.inherit(Y,Box2D.Dynamics.Contacts.b2Contact);Y.prototype.__super=
+Box2D.Dynamics.Contacts.b2Contact.prototype;Y.b2PolyAndCircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};Y.Create=function(){return new Y};Y.Destroy=function(){};Y.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o);O.b2Assert(j.GetType()==y.e_polygonShape);O.b2Assert(o.GetType()==y.e_circleShape)};Y.prototype.Evaluate=function(){var j=this.m_fixtureA.m_body,o=this.m_fixtureB.m_body;S.CollidePolygonAndCircle(this.m_manifold,this.m_fixtureA.GetShape()instanceof
+K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};Box2D.inherit(k,Box2D.Dynamics.Contacts.b2Contact);k.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;k.b2PolyAndEdgeContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};k.Create=function(){return new k};k.Destroy=function(){};k.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o);O.b2Assert(j.GetType()==y.e_polygonShape);
+O.b2Assert(o.GetType()==y.e_edgeShape)};k.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();this.b2CollidePolyAndEdge(this.m_manifold,this.m_fixtureA.GetShape()instanceof K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof G?this.m_fixtureB.GetShape():null,o.m_xf)};k.prototype.b2CollidePolyAndEdge=function(){};Box2D.inherit(z,Box2D.Dynamics.Contacts.b2Contact);z.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;z.b2PolygonContact=
+function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};z.Create=function(){return new z};z.Destroy=function(){};z.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};z.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();S.CollidePolygons(this.m_manifold,this.m_fixtureA.GetShape()instanceof K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof K?this.m_fixtureB.GetShape():null,o.m_xf)};u.b2PositionSolverManifold=
+function(){};u.prototype.b2PositionSolverManifold=function(){this.m_normal=new N;this.m_separations=new Vector_a2j_Number(O.b2_maxManifoldPoints);this.m_points=new Vector(O.b2_maxManifoldPoints);for(var j=0;j<O.b2_maxManifoldPoints;j++)this.m_points[j]=new N};u.prototype.Initialize=function(j){O.b2Assert(j.pointCount>0);var o=0,q=0,n=0,a,c=0,g=0;switch(j.type){case Z.e_circles:a=j.bodyA.m_xf.R;n=j.localPoint;o=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);q=j.bodyA.m_xf.position.y+(a.col1.y*
+n.x+a.col2.y*n.y);a=j.bodyB.m_xf.R;n=j.points[0].localPoint;c=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);a=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);n=c-o;g=a-q;var b=n*n+g*g;if(b>Number.MIN_VALUE*Number.MIN_VALUE){b=Math.sqrt(b);this.m_normal.x=n/b;this.m_normal.y=g/b}else{this.m_normal.x=1;this.m_normal.y=0}this.m_points[0].x=0.5*(o+c);this.m_points[0].y=0.5*(q+a);this.m_separations[0]=n*this.m_normal.x+g*this.m_normal.y-j.radius;break;case Z.e_faceA:a=j.bodyA.m_xf.R;n=j.localPlaneNormal;
+this.m_normal.x=a.col1.x*n.x+a.col2.x*n.y;this.m_normal.y=a.col1.y*n.x+a.col2.y*n.y;a=j.bodyA.m_xf.R;n=j.localPoint;c=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);g=j.bodyA.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);a=j.bodyB.m_xf.R;for(o=0;o<j.pointCount;++o){n=j.points[o].localPoint;q=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);n=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);this.m_separations[o]=(q-c)*this.m_normal.x+(n-g)*this.m_normal.y-j.radius;this.m_points[o].x=q;this.m_points[o].y=
+n}break;case Z.e_faceB:a=j.bodyB.m_xf.R;n=j.localPlaneNormal;this.m_normal.x=a.col1.x*n.x+a.col2.x*n.y;this.m_normal.y=a.col1.y*n.x+a.col2.y*n.y;a=j.bodyB.m_xf.R;n=j.localPoint;c=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);g=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);a=j.bodyA.m_xf.R;for(o=0;o<j.pointCount;++o){n=j.points[o].localPoint;q=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);n=j.bodyA.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);this.m_separations[o]=(q-c)*this.m_normal.x+
+(n-g)*this.m_normal.y-j.radius;this.m_points[o].Set(q,n)}this.m_normal.x*=-1;this.m_normal.y*=-1}};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA=new N;Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB=new N})})();
+(function(){var F=Box2D.Common.Math.b2Mat22,G=Box2D.Common.Math.b2Math,K=Box2D.Common.Math.b2Vec2,y=Box2D.Common.b2Color,w=Box2D.Dynamics.Controllers.b2BuoyancyController,A=Box2D.Dynamics.Controllers.b2ConstantAccelController,U=Box2D.Dynamics.Controllers.b2ConstantForceController,p=Box2D.Dynamics.Controllers.b2Controller,B=Box2D.Dynamics.Controllers.b2ControllerEdge,Q=Box2D.Dynamics.Controllers.b2GravityController,V=Box2D.Dynamics.Controllers.b2TensorDampingController;Box2D.inherit(w,Box2D.Dynamics.Controllers.b2Controller);
+w.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;w.b2BuoyancyController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.normal=new K(0,-1);this.density=this.offset=0;this.velocity=new K(0,0);this.linearDrag=2;this.angularDrag=1;this.useDensity=false;this.useWorldGravity=true;this.gravity=null};w.prototype.Step=function(){if(this.m_bodyList){if(this.useWorldGravity)this.gravity=this.GetWorld().GetGravity().Copy();for(var M=this.m_bodyList;M;M=
+M.nextBody){var L=M.body;if(L.IsAwake()!=false){for(var I=new K,W=new K,Y=0,k=0,z=L.GetFixtureList();z;z=z.GetNext()){var u=new K,D=z.GetShape().ComputeSubmergedArea(this.normal,this.offset,L.GetTransform(),u);Y+=D;I.x+=D*u.x;I.y+=D*u.y;var H=0;H=1;k+=D*H;W.x+=D*u.x*H;W.y+=D*u.y*H}I.x/=Y;I.y/=Y;W.x/=k;W.y/=k;if(!(Y<Number.MIN_VALUE)){k=this.gravity.GetNegative();k.Multiply(this.density*Y);L.ApplyForce(k,W);W=L.GetLinearVelocityFromWorldPoint(I);W.Subtract(this.velocity);W.Multiply(-this.linearDrag*
+Y);L.ApplyForce(W,I);L.ApplyTorque(-L.GetInertia()/L.GetMass()*Y*L.GetAngularVelocity()*this.angularDrag)}}}}};w.prototype.Draw=function(M){var L=new K,I=new K;L.x=this.normal.x*this.offset+this.normal.y*1E3;L.y=this.normal.y*this.offset-this.normal.x*1E3;I.x=this.normal.x*this.offset-this.normal.y*1E3;I.y=this.normal.y*this.offset+this.normal.x*1E3;var W=new y(0,0,1);M.DrawSegment(L,I,W)};Box2D.inherit(A,Box2D.Dynamics.Controllers.b2Controller);A.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;
+A.b2ConstantAccelController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.A=new K(0,0)};A.prototype.Step=function(M){M=new K(this.A.x*M.dt,this.A.y*M.dt);for(var L=this.m_bodyList;L;L=L.nextBody){var I=L.body;I.IsAwake()&&I.SetLinearVelocity(new K(I.GetLinearVelocity().x+M.x,I.GetLinearVelocity().y+M.y))}};Box2D.inherit(U,Box2D.Dynamics.Controllers.b2Controller);U.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;U.b2ConstantForceController=
+function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.F=new K(0,0)};U.prototype.Step=function(){for(var M=this.m_bodyList;M;M=M.nextBody){var L=M.body;L.IsAwake()&&L.ApplyForce(this.F,L.GetWorldCenter())}};p.b2Controller=function(){};p.prototype.Step=function(){};p.prototype.Draw=function(){};p.prototype.AddBody=function(M){var L=new B;L.controller=this;L.body=M;L.nextBody=this.m_bodyList;L.prevBody=null;this.m_bodyList=L;if(L.nextBody)L.nextBody.prevBody=L;this.m_bodyCount++;
+L.nextController=M.m_controllerList;L.prevController=null;M.m_controllerList=L;if(L.nextController)L.nextController.prevController=L;M.m_controllerCount++};p.prototype.RemoveBody=function(M){for(var L=M.m_controllerList;L&&L.controller!=this;)L=L.nextController;if(L.prevBody)L.prevBody.nextBody=L.nextBody;if(L.nextBody)L.nextBody.prevBody=L.prevBody;if(L.nextController)L.nextController.prevController=L.prevController;if(L.prevController)L.prevController.nextController=L.nextController;if(this.m_bodyList==
+L)this.m_bodyList=L.nextBody;if(M.m_controllerList==L)M.m_controllerList=L.nextController;M.m_controllerCount--;this.m_bodyCount--};p.prototype.Clear=function(){for(;this.m_bodyList;)this.RemoveBody(this.m_bodyList.body)};p.prototype.GetNext=function(){return this.m_next};p.prototype.GetWorld=function(){return this.m_world};p.prototype.GetBodyList=function(){return this.m_bodyList};B.b2ControllerEdge=function(){};Box2D.inherit(Q,Box2D.Dynamics.Controllers.b2Controller);Q.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;
+Q.b2GravityController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.G=1;this.invSqr=true};Q.prototype.Step=function(){var M=null,L=null,I=null,W=0,Y=null,k=null,z=null,u=0,D=0,H=0;u=null;if(this.invSqr)for(M=this.m_bodyList;M;M=M.nextBody){L=M.body;I=L.GetWorldCenter();W=L.GetMass();for(Y=this.m_bodyList;Y!=M;Y=Y.nextBody){k=Y.body;z=k.GetWorldCenter();u=z.x-I.x;D=z.y-I.y;H=u*u+D*D;if(!(H<Number.MIN_VALUE)){u=new K(u,D);u.Multiply(this.G/H/Math.sqrt(H)*
+W*k.GetMass());L.IsAwake()&&L.ApplyForce(u,I);u.Multiply(-1);k.IsAwake()&&k.ApplyForce(u,z)}}}else for(M=this.m_bodyList;M;M=M.nextBody){L=M.body;I=L.GetWorldCenter();W=L.GetMass();for(Y=this.m_bodyList;Y!=M;Y=Y.nextBody){k=Y.body;z=k.GetWorldCenter();u=z.x-I.x;D=z.y-I.y;H=u*u+D*D;if(!(H<Number.MIN_VALUE)){u=new K(u,D);u.Multiply(this.G/H*W*k.GetMass());L.IsAwake()&&L.ApplyForce(u,I);u.Multiply(-1);k.IsAwake()&&k.ApplyForce(u,z)}}}};Box2D.inherit(V,Box2D.Dynamics.Controllers.b2Controller);V.prototype.__super=
+Box2D.Dynamics.Controllers.b2Controller.prototype;V.b2TensorDampingController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.T=new F;this.maxTimestep=0};V.prototype.SetAxisAligned=function(M,L){if(M===undefined)M=0;if(L===undefined)L=0;this.T.col1.x=-M;this.T.col1.y=0;this.T.col2.x=0;this.T.col2.y=-L;this.maxTimestep=M>0||L>0?1/Math.max(M,L):0};V.prototype.Step=function(M){M=M.dt;if(!(M<=Number.MIN_VALUE)){if(M>this.maxTimestep&&this.maxTimestep>0)M=this.maxTimestep;
+for(var L=this.m_bodyList;L;L=L.nextBody){var I=L.body;if(I.IsAwake()){var W=I.GetWorldVector(G.MulMV(this.T,I.GetLocalVector(I.GetLinearVelocity())));I.SetLinearVelocity(new K(I.GetLinearVelocity().x+W.x*M,I.GetLinearVelocity().y+W.y*M))}}}}})();
+(function(){var F=Box2D.Common.b2Settings,G=Box2D.Common.Math.b2Mat22,K=Box2D.Common.Math.b2Mat33,y=Box2D.Common.Math.b2Math,w=Box2D.Common.Math.b2Vec2,A=Box2D.Common.Math.b2Vec3,U=Box2D.Dynamics.Joints.b2DistanceJoint,p=Box2D.Dynamics.Joints.b2DistanceJointDef,B=Box2D.Dynamics.Joints.b2FrictionJoint,Q=Box2D.Dynamics.Joints.b2FrictionJointDef,V=Box2D.Dynamics.Joints.b2GearJoint,M=Box2D.Dynamics.Joints.b2GearJointDef,L=Box2D.Dynamics.Joints.b2Jacobian,I=Box2D.Dynamics.Joints.b2Joint,W=Box2D.Dynamics.Joints.b2JointDef,
+Y=Box2D.Dynamics.Joints.b2JointEdge,k=Box2D.Dynamics.Joints.b2LineJoint,z=Box2D.Dynamics.Joints.b2LineJointDef,u=Box2D.Dynamics.Joints.b2MouseJoint,D=Box2D.Dynamics.Joints.b2MouseJointDef,H=Box2D.Dynamics.Joints.b2PrismaticJoint,O=Box2D.Dynamics.Joints.b2PrismaticJointDef,E=Box2D.Dynamics.Joints.b2PulleyJoint,R=Box2D.Dynamics.Joints.b2PulleyJointDef,N=Box2D.Dynamics.Joints.b2RevoluteJoint,S=Box2D.Dynamics.Joints.b2RevoluteJointDef,aa=Box2D.Dynamics.Joints.b2WeldJoint,Z=Box2D.Dynamics.Joints.b2WeldJointDef;
+Box2D.inherit(U,Box2D.Dynamics.Joints.b2Joint);U.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;U.b2DistanceJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_u=new w};U.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};U.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};U.prototype.GetReactionForce=function(d){if(d===undefined)d=
+0;return new w(d*this.m_impulse*this.m_u.x,d*this.m_impulse*this.m_u.y)};U.prototype.GetReactionTorque=function(){return 0};U.prototype.GetLength=function(){return this.m_length};U.prototype.SetLength=function(d){if(d===undefined)d=0;this.m_length=d};U.prototype.GetFrequency=function(){return this.m_frequencyHz};U.prototype.SetFrequency=function(d){if(d===undefined)d=0;this.m_frequencyHz=d};U.prototype.GetDampingRatio=function(){return this.m_dampingRatio};U.prototype.SetDampingRatio=function(d){if(d===
+undefined)d=0;this.m_dampingRatio=d};U.prototype.b2DistanceJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_length=d.length;this.m_frequencyHz=d.frequencyHz;this.m_dampingRatio=d.dampingRatio;this.m_bias=this.m_gamma=this.m_impulse=0};U.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;h=j.m_xf.R;var q=this.m_localAnchor1.x-j.m_sweep.localCenter.x,n=this.m_localAnchor1.y-
+j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchor2.x-o.m_sweep.localCenter.x,c=this.m_localAnchor2.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;this.m_u.x=o.m_sweep.c.x+a-j.m_sweep.c.x-q;this.m_u.y=o.m_sweep.c.y+c-j.m_sweep.c.y-n;l=Math.sqrt(this.m_u.x*this.m_u.x+this.m_u.y*this.m_u.y);l>F.b2_linearSlop?this.m_u.Multiply(1/l):this.m_u.SetZero();h=q*this.m_u.y-n*this.m_u.x;var g=a*this.m_u.y-c*this.m_u.x;
+h=j.m_invMass+j.m_invI*h*h+o.m_invMass+o.m_invI*g*g;this.m_mass=h!=0?1/h:0;if(this.m_frequencyHz>0){l=l-this.m_length;g=2*Math.PI*this.m_frequencyHz;var b=this.m_mass*g*g;this.m_gamma=d.dt*(2*this.m_mass*this.m_dampingRatio*g+d.dt*b);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_bias=l*d.dt*b*this.m_gamma;this.m_mass=h+this.m_gamma;this.m_mass=this.m_mass!=0?1/this.m_mass:0}if(d.warmStarting){this.m_impulse*=d.dtRatio;d=this.m_impulse*this.m_u.x;h=this.m_impulse*this.m_u.y;j.m_linearVelocity.x-=
+j.m_invMass*d;j.m_linearVelocity.y-=j.m_invMass*h;j.m_angularVelocity-=j.m_invI*(q*h-n*d);o.m_linearVelocity.x+=o.m_invMass*d;o.m_linearVelocity.y+=o.m_invMass*h;o.m_angularVelocity+=o.m_invI*(a*h-c*d)}else this.m_impulse=0};U.prototype.SolveVelocityConstraints=function(){var d,h=this.m_bodyA,l=this.m_bodyB;d=h.m_xf.R;var j=this.m_localAnchor1.x-h.m_sweep.localCenter.x,o=this.m_localAnchor1.y-h.m_sweep.localCenter.y,q=d.col1.x*j+d.col2.x*o;o=d.col1.y*j+d.col2.y*o;j=q;d=l.m_xf.R;var n=this.m_localAnchor2.x-
+l.m_sweep.localCenter.x,a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;q=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=q;q=-this.m_mass*(this.m_u.x*(l.m_linearVelocity.x+-l.m_angularVelocity*a-(h.m_linearVelocity.x+-h.m_angularVelocity*o))+this.m_u.y*(l.m_linearVelocity.y+l.m_angularVelocity*n-(h.m_linearVelocity.y+h.m_angularVelocity*j))+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=q;d=q*this.m_u.x;q=q*this.m_u.y;h.m_linearVelocity.x-=h.m_invMass*d;h.m_linearVelocity.y-=h.m_invMass*
+q;h.m_angularVelocity-=h.m_invI*(j*q-o*d);l.m_linearVelocity.x+=l.m_invMass*d;l.m_linearVelocity.y+=l.m_invMass*q;l.m_angularVelocity+=l.m_invI*(n*q-a*d)};U.prototype.SolvePositionConstraints=function(){var d;if(this.m_frequencyHz>0)return true;var h=this.m_bodyA,l=this.m_bodyB;d=h.m_xf.R;var j=this.m_localAnchor1.x-h.m_sweep.localCenter.x,o=this.m_localAnchor1.y-h.m_sweep.localCenter.y,q=d.col1.x*j+d.col2.x*o;o=d.col1.y*j+d.col2.y*o;j=q;d=l.m_xf.R;var n=this.m_localAnchor2.x-l.m_sweep.localCenter.x,
+a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;q=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=q;q=l.m_sweep.c.x+n-h.m_sweep.c.x-j;var c=l.m_sweep.c.y+a-h.m_sweep.c.y-o;d=Math.sqrt(q*q+c*c);q/=d;c/=d;d=d-this.m_length;d=y.Clamp(d,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);var g=-this.m_mass*d;this.m_u.Set(q,c);q=g*this.m_u.x;c=g*this.m_u.y;h.m_sweep.c.x-=h.m_invMass*q;h.m_sweep.c.y-=h.m_invMass*c;h.m_sweep.a-=h.m_invI*(j*c-o*q);l.m_sweep.c.x+=l.m_invMass*q;l.m_sweep.c.y+=l.m_invMass*c;
+l.m_sweep.a+=l.m_invI*(n*c-a*q);h.SynchronizeTransform();l.SynchronizeTransform();return y.Abs(d)<F.b2_linearSlop};Box2D.inherit(p,Box2D.Dynamics.Joints.b2JointDef);p.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;p.b2DistanceJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};p.prototype.b2DistanceJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_distanceJoint;this.length=1;this.dampingRatio=
+this.frequencyHz=0};p.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(j));d=j.x-l.x;l=j.y-l.y;this.length=Math.sqrt(d*d+l*l);this.dampingRatio=this.frequencyHz=0};Box2D.inherit(B,Box2D.Dynamics.Joints.b2Joint);B.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;B.b2FrictionJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchorA=new w;
+this.m_localAnchorB=new w;this.m_linearMass=new G;this.m_linearImpulse=new w};B.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)};B.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)};B.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_linearImpulse.x,d*this.m_linearImpulse.y)};B.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_angularImpulse};B.prototype.SetMaxForce=
+function(d){if(d===undefined)d=0;this.m_maxForce=d};B.prototype.GetMaxForce=function(){return this.m_maxForce};B.prototype.SetMaxTorque=function(d){if(d===undefined)d=0;this.m_maxTorque=d};B.prototype.GetMaxTorque=function(){return this.m_maxTorque};B.prototype.b2FrictionJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchorA.SetV(d.localAnchorA);this.m_localAnchorB.SetV(d.localAnchorB);this.m_linearMass.SetZero();this.m_angularMass=0;this.m_linearImpulse.SetZero();this.m_angularImpulse=
+0;this.m_maxForce=d.maxForce;this.m_maxTorque=d.maxTorque};B.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;h=j.m_xf.R;var q=this.m_localAnchorA.x-j.m_sweep.localCenter.x,n=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchorB.x-o.m_sweep.localCenter.x,c=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;h=j.m_invMass;l=o.m_invMass;
+var g=j.m_invI,b=o.m_invI,e=new G;e.col1.x=h+l;e.col2.x=0;e.col1.y=0;e.col2.y=h+l;e.col1.x+=g*n*n;e.col2.x+=-g*q*n;e.col1.y+=-g*q*n;e.col2.y+=g*q*q;e.col1.x+=b*c*c;e.col2.x+=-b*a*c;e.col1.y+=-b*a*c;e.col2.y+=b*a*a;e.GetInverse(this.m_linearMass);this.m_angularMass=g+b;if(this.m_angularMass>0)this.m_angularMass=1/this.m_angularMass;if(d.warmStarting){this.m_linearImpulse.x*=d.dtRatio;this.m_linearImpulse.y*=d.dtRatio;this.m_angularImpulse*=d.dtRatio;d=this.m_linearImpulse;j.m_linearVelocity.x-=h*d.x;
+j.m_linearVelocity.y-=h*d.y;j.m_angularVelocity-=g*(q*d.y-n*d.x+this.m_angularImpulse);o.m_linearVelocity.x+=l*d.x;o.m_linearVelocity.y+=l*d.y;o.m_angularVelocity+=b*(a*d.y-c*d.x+this.m_angularImpulse)}else{this.m_linearImpulse.SetZero();this.m_angularImpulse=0}};B.prototype.SolveVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB,q=j.m_linearVelocity,n=j.m_angularVelocity,a=o.m_linearVelocity,c=o.m_angularVelocity,g=j.m_invMass,b=o.m_invMass,e=j.m_invI,f=o.m_invI;h=j.m_xf.R;var m=
+this.m_localAnchorA.x-j.m_sweep.localCenter.x,r=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*m+h.col2.x*r;r=h.col1.y*m+h.col2.y*r;m=l;h=o.m_xf.R;var s=this.m_localAnchorB.x-o.m_sweep.localCenter.x,v=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*s+h.col2.x*v;v=h.col1.y*s+h.col2.y*v;s=l;h=0;l=-this.m_angularMass*(c-n);var t=this.m_angularImpulse;h=d.dt*this.m_maxTorque;this.m_angularImpulse=y.Clamp(this.m_angularImpulse+l,-h,h);l=this.m_angularImpulse-t;n-=e*l;c+=f*l;h=y.MulMV(this.m_linearMass,
+new w(-(a.x-c*v-q.x+n*r),-(a.y+c*s-q.y-n*m)));l=this.m_linearImpulse.Copy();this.m_linearImpulse.Add(h);h=d.dt*this.m_maxForce;if(this.m_linearImpulse.LengthSquared()>h*h){this.m_linearImpulse.Normalize();this.m_linearImpulse.Multiply(h)}h=y.SubtractVV(this.m_linearImpulse,l);q.x-=g*h.x;q.y-=g*h.y;n-=e*(m*h.y-r*h.x);a.x+=b*h.x;a.y+=b*h.y;c+=f*(s*h.y-v*h.x);j.m_angularVelocity=n;o.m_angularVelocity=c};B.prototype.SolvePositionConstraints=function(){return true};Box2D.inherit(Q,Box2D.Dynamics.Joints.b2JointDef);
+Q.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;Q.b2FrictionJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};Q.prototype.b2FrictionJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_frictionJoint;this.maxTorque=this.maxForce=0};Q.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l))};
+Box2D.inherit(V,Box2D.Dynamics.Joints.b2Joint);V.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;V.b2GearJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_groundAnchor1=new w;this.m_groundAnchor2=new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_J=new L};V.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};V.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};V.prototype.GetReactionForce=
+function(d){if(d===undefined)d=0;return new w(d*this.m_impulse*this.m_J.linearB.x,d*this.m_impulse*this.m_J.linearB.y)};V.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;var h=this.m_bodyB.m_xf.R,l=this.m_localAnchor1.x-this.m_bodyB.m_sweep.localCenter.x,j=this.m_localAnchor1.y-this.m_bodyB.m_sweep.localCenter.y,o=h.col1.x*l+h.col2.x*j;j=h.col1.y*l+h.col2.y*j;l=o;return d*(this.m_impulse*this.m_J.angularB-l*this.m_impulse*this.m_J.linearB.y+j*this.m_impulse*this.m_J.linearB.x)};V.prototype.GetRatio=
+function(){return this.m_ratio};V.prototype.SetRatio=function(d){if(d===undefined)d=0;this.m_ratio=d};V.prototype.b2GearJoint=function(d){this.__super.b2Joint.call(this,d);var h=parseInt(d.joint1.m_type),l=parseInt(d.joint2.m_type);this.m_prismatic2=this.m_revolute2=this.m_prismatic1=this.m_revolute1=null;var j=0,o=0;this.m_ground1=d.joint1.GetBodyA();this.m_bodyA=d.joint1.GetBodyB();if(h==I.e_revoluteJoint){this.m_revolute1=d.joint1 instanceof N?d.joint1:null;this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1);
+this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2);j=this.m_revolute1.GetJointAngle()}else{this.m_prismatic1=d.joint1 instanceof H?d.joint1:null;this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1);this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2);j=this.m_prismatic1.GetJointTranslation()}this.m_ground2=d.joint2.GetBodyA();this.m_bodyB=d.joint2.GetBodyB();if(l==I.e_revoluteJoint){this.m_revolute2=d.joint2 instanceof N?d.joint2:null;this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1);
+this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2);o=this.m_revolute2.GetJointAngle()}else{this.m_prismatic2=d.joint2 instanceof H?d.joint2:null;this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1);this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2);o=this.m_prismatic2.GetJointTranslation()}this.m_ratio=d.ratio;this.m_constant=j+this.m_ratio*o;this.m_impulse=0};V.prototype.InitVelocityConstraints=function(d){var h=this.m_ground1,l=this.m_ground2,j=this.m_bodyA,o=this.m_bodyB,
+q=0,n=0,a=0,c=0,g=a=0,b=0;this.m_J.SetZero();if(this.m_revolute1){this.m_J.angularA=-1;b+=j.m_invI}else{h=h.m_xf.R;n=this.m_prismatic1.m_localXAxis1;q=h.col1.x*n.x+h.col2.x*n.y;n=h.col1.y*n.x+h.col2.y*n.y;h=j.m_xf.R;a=this.m_localAnchor1.x-j.m_sweep.localCenter.x;c=this.m_localAnchor1.y-j.m_sweep.localCenter.y;g=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=g;a=a*n-c*q;this.m_J.linearA.Set(-q,-n);this.m_J.angularA=-a;b+=j.m_invMass+j.m_invI*a*a}if(this.m_revolute2){this.m_J.angularB=-this.m_ratio;
+b+=this.m_ratio*this.m_ratio*o.m_invI}else{h=l.m_xf.R;n=this.m_prismatic2.m_localXAxis1;q=h.col1.x*n.x+h.col2.x*n.y;n=h.col1.y*n.x+h.col2.y*n.y;h=o.m_xf.R;a=this.m_localAnchor2.x-o.m_sweep.localCenter.x;c=this.m_localAnchor2.y-o.m_sweep.localCenter.y;g=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=g;a=a*n-c*q;this.m_J.linearB.Set(-this.m_ratio*q,-this.m_ratio*n);this.m_J.angularB=-this.m_ratio*a;b+=this.m_ratio*this.m_ratio*(o.m_invMass+o.m_invI*a*a)}this.m_mass=b>0?1/b:0;if(d.warmStarting){j.m_linearVelocity.x+=
+j.m_invMass*this.m_impulse*this.m_J.linearA.x;j.m_linearVelocity.y+=j.m_invMass*this.m_impulse*this.m_J.linearA.y;j.m_angularVelocity+=j.m_invI*this.m_impulse*this.m_J.angularA;o.m_linearVelocity.x+=o.m_invMass*this.m_impulse*this.m_J.linearB.x;o.m_linearVelocity.y+=o.m_invMass*this.m_impulse*this.m_J.linearB.y;o.m_angularVelocity+=o.m_invI*this.m_impulse*this.m_J.angularB}else this.m_impulse=0};V.prototype.SolveVelocityConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=-this.m_mass*this.m_J.Compute(d.m_linearVelocity,
+d.m_angularVelocity,h.m_linearVelocity,h.m_angularVelocity);this.m_impulse+=l;d.m_linearVelocity.x+=d.m_invMass*l*this.m_J.linearA.x;d.m_linearVelocity.y+=d.m_invMass*l*this.m_J.linearA.y;d.m_angularVelocity+=d.m_invI*l*this.m_J.angularA;h.m_linearVelocity.x+=h.m_invMass*l*this.m_J.linearB.x;h.m_linearVelocity.y+=h.m_invMass*l*this.m_J.linearB.y;h.m_angularVelocity+=h.m_invI*l*this.m_J.angularB};V.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=0,j=0;l=this.m_revolute1?
+this.m_revolute1.GetJointAngle():this.m_prismatic1.GetJointTranslation();j=this.m_revolute2?this.m_revolute2.GetJointAngle():this.m_prismatic2.GetJointTranslation();l=-this.m_mass*(this.m_constant-(l+this.m_ratio*j));d.m_sweep.c.x+=d.m_invMass*l*this.m_J.linearA.x;d.m_sweep.c.y+=d.m_invMass*l*this.m_J.linearA.y;d.m_sweep.a+=d.m_invI*l*this.m_J.angularA;h.m_sweep.c.x+=h.m_invMass*l*this.m_J.linearB.x;h.m_sweep.c.y+=h.m_invMass*l*this.m_J.linearB.y;h.m_sweep.a+=h.m_invI*l*this.m_J.angularB;d.SynchronizeTransform();
+h.SynchronizeTransform();return 0<F.b2_linearSlop};Box2D.inherit(M,Box2D.Dynamics.Joints.b2JointDef);M.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;M.b2GearJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments)};M.prototype.b2GearJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_gearJoint;this.joint2=this.joint1=null;this.ratio=1};L.b2Jacobian=function(){this.linearA=new w;this.linearB=new w};L.prototype.SetZero=function(){this.linearA.SetZero();
+this.angularA=0;this.linearB.SetZero();this.angularB=0};L.prototype.Set=function(d,h,l,j){if(h===undefined)h=0;if(j===undefined)j=0;this.linearA.SetV(d);this.angularA=h;this.linearB.SetV(l);this.angularB=j};L.prototype.Compute=function(d,h,l,j){if(h===undefined)h=0;if(j===undefined)j=0;return this.linearA.x*d.x+this.linearA.y*d.y+this.angularA*h+(this.linearB.x*l.x+this.linearB.y*l.y)+this.angularB*j};I.b2Joint=function(){this.m_edgeA=new Y;this.m_edgeB=new Y;this.m_localCenterA=new w;this.m_localCenterB=
+new w};I.prototype.GetType=function(){return this.m_type};I.prototype.GetAnchorA=function(){return null};I.prototype.GetAnchorB=function(){return null};I.prototype.GetReactionForce=function(){return null};I.prototype.GetReactionTorque=function(){return 0};I.prototype.GetBodyA=function(){return this.m_bodyA};I.prototype.GetBodyB=function(){return this.m_bodyB};I.prototype.GetNext=function(){return this.m_next};I.prototype.GetUserData=function(){return this.m_userData};I.prototype.SetUserData=function(d){this.m_userData=
+d};I.prototype.IsActive=function(){return this.m_bodyA.IsActive()&&this.m_bodyB.IsActive()};I.Create=function(d){var h=null;switch(d.type){case I.e_distanceJoint:h=new U(d instanceof p?d:null);break;case I.e_mouseJoint:h=new u(d instanceof D?d:null);break;case I.e_prismaticJoint:h=new H(d instanceof O?d:null);break;case I.e_revoluteJoint:h=new N(d instanceof S?d:null);break;case I.e_pulleyJoint:h=new E(d instanceof R?d:null);break;case I.e_gearJoint:h=new V(d instanceof M?d:null);break;case I.e_lineJoint:h=
+new k(d instanceof z?d:null);break;case I.e_weldJoint:h=new aa(d instanceof Z?d:null);break;case I.e_frictionJoint:h=new B(d instanceof Q?d:null)}return h};I.Destroy=function(){};I.prototype.b2Joint=function(d){F.b2Assert(d.bodyA!=d.bodyB);this.m_type=d.type;this.m_next=this.m_prev=null;this.m_bodyA=d.bodyA;this.m_bodyB=d.bodyB;this.m_collideConnected=d.collideConnected;this.m_islandFlag=false;this.m_userData=d.userData};I.prototype.InitVelocityConstraints=function(){};I.prototype.SolveVelocityConstraints=
+function(){};I.prototype.FinalizeVelocityConstraints=function(){};I.prototype.SolvePositionConstraints=function(){return false};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2Joint.e_unknownJoint=0;Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint=1;Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint=2;Box2D.Dynamics.Joints.b2Joint.e_distanceJoint=3;Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint=4;Box2D.Dynamics.Joints.b2Joint.e_mouseJoint=5;Box2D.Dynamics.Joints.b2Joint.e_gearJoint=6;Box2D.Dynamics.Joints.b2Joint.e_lineJoint=
+7;Box2D.Dynamics.Joints.b2Joint.e_weldJoint=8;Box2D.Dynamics.Joints.b2Joint.e_frictionJoint=9;Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit=0;Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit=1;Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit=2;Box2D.Dynamics.Joints.b2Joint.e_equalLimits=3});W.b2JointDef=function(){};W.prototype.b2JointDef=function(){this.type=I.e_unknownJoint;this.bodyB=this.bodyA=this.userData=null;this.collideConnected=false};Y.b2JointEdge=function(){};Box2D.inherit(k,Box2D.Dynamics.Joints.b2Joint);
+k.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;k.b2LineJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_localXAxis1=new w;this.m_localYAxis1=new w;this.m_axis=new w;this.m_perp=new w;this.m_K=new G;this.m_impulse=new w};k.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};k.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};k.prototype.GetReactionForce=
+function(d){if(d===undefined)d=0;return new w(d*(this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.x),d*(this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.y))};k.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.y};k.prototype.GetJointTranslation=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.GetWorldPoint(this.m_localAnchor1),j=h.GetWorldPoint(this.m_localAnchor2);h=j.x-l.x;l=j.y-l.y;d=d.GetWorldVector(this.m_localXAxis1);
+return d.x*h+d.y*l};k.prototype.GetJointSpeed=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;l=h.m_sweep.c.x+n-(d.m_sweep.c.x+j);q=h.m_sweep.c.y+a-(d.m_sweep.c.y+o);var c=d.GetWorldVector(this.m_localXAxis1),
+g=d.m_linearVelocity,b=h.m_linearVelocity;d=d.m_angularVelocity;h=h.m_angularVelocity;return l*-d*c.y+q*d*c.x+(c.x*(b.x+-h*a-g.x- -d*o)+c.y*(b.y+h*n-g.y-d*j))};k.prototype.IsLimitEnabled=function(){return this.m_enableLimit};k.prototype.EnableLimit=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableLimit=d};k.prototype.GetLowerLimit=function(){return this.m_lowerTranslation};k.prototype.GetUpperLimit=function(){return this.m_upperTranslation};k.prototype.SetLimits=function(d,
+h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_lowerTranslation=d;this.m_upperTranslation=h};k.prototype.IsMotorEnabled=function(){return this.m_enableMotor};k.prototype.EnableMotor=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableMotor=d};k.prototype.SetMotorSpeed=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};k.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};
+k.prototype.SetMaxMotorForce=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_maxMotorForce=d};k.prototype.GetMaxMotorForce=function(){return this.m_maxMotorForce};k.prototype.GetMotorForce=function(){return this.m_motorImpulse};k.prototype.b2LineJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_localXAxis1.SetV(d.localAxisA);this.m_localYAxis1.x=-this.m_localXAxis1.y;
+this.m_localYAxis1.y=this.m_localXAxis1.x;this.m_impulse.SetZero();this.m_motorImpulse=this.m_motorMass=0;this.m_lowerTranslation=d.lowerTranslation;this.m_upperTranslation=d.upperTranslation;this.m_maxMotorForce=d.maxMotorForce;this.m_motorSpeed=d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit;this.m_axis.SetZero();this.m_perp.SetZero()};k.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;this.m_localCenterA.SetV(h.GetLocalCenter());
+this.m_localCenterB.SetV(l.GetLocalCenter());var q=h.GetTransform();l.GetTransform();j=h.m_xf.R;var n=this.m_localAnchor1.x-this.m_localCenterA.x,a=this.m_localAnchor1.y-this.m_localCenterA.y;o=j.col1.x*n+j.col2.x*a;a=j.col1.y*n+j.col2.y*a;n=o;j=l.m_xf.R;var c=this.m_localAnchor2.x-this.m_localCenterB.x,g=this.m_localAnchor2.y-this.m_localCenterB.y;o=j.col1.x*c+j.col2.x*g;g=j.col1.y*c+j.col2.y*g;c=o;j=l.m_sweep.c.x+c-h.m_sweep.c.x-n;o=l.m_sweep.c.y+g-h.m_sweep.c.y-a;this.m_invMassA=h.m_invMass;this.m_invMassB=
+l.m_invMass;this.m_invIA=h.m_invI;this.m_invIB=l.m_invI;this.m_axis.SetV(y.MulMV(q.R,this.m_localXAxis1));this.m_a1=(j+n)*this.m_axis.y-(o+a)*this.m_axis.x;this.m_a2=c*this.m_axis.y-g*this.m_axis.x;this.m_motorMass=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_a1*this.m_a1+this.m_invIB*this.m_a2*this.m_a2;this.m_motorMass=this.m_motorMass>Number.MIN_VALUE?1/this.m_motorMass:0;this.m_perp.SetV(y.MulMV(q.R,this.m_localYAxis1));this.m_s1=(j+n)*this.m_perp.y-(o+a)*this.m_perp.x;this.m_s2=c*this.m_perp.y-
+g*this.m_perp.x;q=this.m_invMassA;n=this.m_invMassB;a=this.m_invIA;c=this.m_invIB;this.m_K.col1.x=q+n+a*this.m_s1*this.m_s1+c*this.m_s2*this.m_s2;this.m_K.col1.y=a*this.m_s1*this.m_a1+c*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=q+n+a*this.m_a1*this.m_a1+c*this.m_a2*this.m_a2;if(this.m_enableLimit){j=this.m_axis.x*j+this.m_axis.y*o;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop)this.m_limitState=I.e_equalLimits;else if(j<=this.m_lowerTranslation){if(this.m_limitState!=
+I.e_atLowerLimit){this.m_limitState=I.e_atLowerLimit;this.m_impulse.y=0}}else if(j>=this.m_upperTranslation){if(this.m_limitState!=I.e_atUpperLimit){this.m_limitState=I.e_atUpperLimit;this.m_impulse.y=0}}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.y=0}}else this.m_limitState=I.e_inactiveLimit;if(this.m_enableMotor==false)this.m_motorImpulse=0;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+
+this.m_impulse.y)*this.m_axis.x;j=this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.y;o=this.m_impulse.x*this.m_s1+(this.m_motorImpulse+this.m_impulse.y)*this.m_a1;q=this.m_impulse.x*this.m_s2+(this.m_motorImpulse+this.m_impulse.y)*this.m_a2;h.m_linearVelocity.x-=this.m_invMassA*d;h.m_linearVelocity.y-=this.m_invMassA*j;h.m_angularVelocity-=this.m_invIA*o;l.m_linearVelocity.x+=this.m_invMassB*d;l.m_linearVelocity.y+=this.m_invMassB*j;l.m_angularVelocity+=this.m_invIB*
+q}else{this.m_impulse.SetZero();this.m_motorImpulse=0}};k.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=h.m_linearVelocity,o=h.m_angularVelocity,q=l.m_linearVelocity,n=l.m_angularVelocity,a=0,c=0,g=0,b=0;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){b=this.m_motorMass*(this.m_motorSpeed-(this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o));a=this.m_motorImpulse;c=d.dt*this.m_maxMotorForce;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+
+b,-c,c);b=this.m_motorImpulse-a;a=b*this.m_axis.x;c=b*this.m_axis.y;g=b*this.m_a1;b=b*this.m_a2;j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b}c=this.m_perp.x*(q.x-j.x)+this.m_perp.y*(q.y-j.y)+this.m_s2*n-this.m_s1*o;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){g=this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o;a=this.m_impulse.Copy();d=this.m_K.Solve(new w,-c,-g);this.m_impulse.Add(d);
+if(this.m_limitState==I.e_atLowerLimit)this.m_impulse.y=y.Max(this.m_impulse.y,0);else if(this.m_limitState==I.e_atUpperLimit)this.m_impulse.y=y.Min(this.m_impulse.y,0);c=-c-(this.m_impulse.y-a.y)*this.m_K.col2.x;g=0;g=this.m_K.col1.x!=0?c/this.m_K.col1.x+a.x:a.x;this.m_impulse.x=g;d.x=this.m_impulse.x-a.x;d.y=this.m_impulse.y-a.y;a=d.x*this.m_perp.x+d.y*this.m_axis.x;c=d.x*this.m_perp.y+d.y*this.m_axis.y;g=d.x*this.m_s1+d.y*this.m_a1;b=d.x*this.m_s2+d.y*this.m_a2}else{d=0;d=this.m_K.col1.x!=0?-c/
+this.m_K.col1.x:0;this.m_impulse.x+=d;a=d*this.m_perp.x;c=d*this.m_perp.y;g=d*this.m_s1;b=d*this.m_s2}j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b;h.m_linearVelocity.SetV(j);h.m_angularVelocity=o;l.m_linearVelocity.SetV(q);l.m_angularVelocity=n};k.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.m_sweep.c,j=d.m_sweep.a,o=h.m_sweep.c,q=h.m_sweep.a,n,a=0,c=0,g=0,b=0,e=n=0,f=0;c=false;
+var m=0,r=G.FromAngle(j);g=G.FromAngle(q);n=r;f=this.m_localAnchor1.x-this.m_localCenterA.x;var s=this.m_localAnchor1.y-this.m_localCenterA.y;a=n.col1.x*f+n.col2.x*s;s=n.col1.y*f+n.col2.y*s;f=a;n=g;g=this.m_localAnchor2.x-this.m_localCenterB.x;b=this.m_localAnchor2.y-this.m_localCenterB.y;a=n.col1.x*g+n.col2.x*b;b=n.col1.y*g+n.col2.y*b;g=a;n=o.x+g-l.x-f;a=o.y+b-l.y-s;if(this.m_enableLimit){this.m_axis=y.MulMV(r,this.m_localXAxis1);this.m_a1=(n+f)*this.m_axis.y-(a+s)*this.m_axis.x;this.m_a2=g*this.m_axis.y-
+b*this.m_axis.x;var v=this.m_axis.x*n+this.m_axis.y*a;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop){m=y.Clamp(v,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);e=y.Abs(v);c=true}else if(v<=this.m_lowerTranslation){m=y.Clamp(v-this.m_lowerTranslation+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);e=this.m_lowerTranslation-v;c=true}else if(v>=this.m_upperTranslation){m=y.Clamp(v-this.m_upperTranslation+F.b2_linearSlop,0,F.b2_maxLinearCorrection);e=v-this.m_upperTranslation;
+c=true}}this.m_perp=y.MulMV(r,this.m_localYAxis1);this.m_s1=(n+f)*this.m_perp.y-(a+s)*this.m_perp.x;this.m_s2=g*this.m_perp.y-b*this.m_perp.x;r=new w;s=this.m_perp.x*n+this.m_perp.y*a;e=y.Max(e,y.Abs(s));f=0;if(c){c=this.m_invMassA;g=this.m_invMassB;b=this.m_invIA;n=this.m_invIB;this.m_K.col1.x=c+g+b*this.m_s1*this.m_s1+n*this.m_s2*this.m_s2;this.m_K.col1.y=b*this.m_s1*this.m_a1+n*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=c+g+b*this.m_a1*this.m_a1+n*this.m_a2*this.m_a2;this.m_K.Solve(r,
+-s,-m)}else{c=this.m_invMassA;g=this.m_invMassB;b=this.m_invIA;n=this.m_invIB;m=c+g+b*this.m_s1*this.m_s1+n*this.m_s2*this.m_s2;c=0;c=m!=0?-s/m:0;r.x=c;r.y=0}m=r.x*this.m_perp.x+r.y*this.m_axis.x;c=r.x*this.m_perp.y+r.y*this.m_axis.y;s=r.x*this.m_s1+r.y*this.m_a1;r=r.x*this.m_s2+r.y*this.m_a2;l.x-=this.m_invMassA*m;l.y-=this.m_invMassA*c;j-=this.m_invIA*s;o.x+=this.m_invMassB*m;o.y+=this.m_invMassB*c;q+=this.m_invIB*r;d.m_sweep.a=j;h.m_sweep.a=q;d.SynchronizeTransform();h.SynchronizeTransform();return e<=
+F.b2_linearSlop&&f<=F.b2_angularSlop};Box2D.inherit(z,Box2D.Dynamics.Joints.b2JointDef);z.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;z.b2LineJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w;this.localAxisA=new w};z.prototype.b2LineJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_lineJoint;this.localAxisA.Set(1,0);this.enableLimit=false;this.upperTranslation=this.lowerTranslation=
+0;this.enableMotor=false;this.motorSpeed=this.maxMotorForce=0};z.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.localAxisA=this.bodyA.GetLocalVector(j)};Box2D.inherit(u,Box2D.Dynamics.Joints.b2Joint);u.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;u.b2MouseJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.K=new G;this.K1=new G;this.K2=new G;
+this.m_localAnchor=new w;this.m_target=new w;this.m_impulse=new w;this.m_mass=new G;this.m_C=new w};u.prototype.GetAnchorA=function(){return this.m_target};u.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor)};u.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};u.prototype.GetReactionTorque=function(){return 0};u.prototype.GetTarget=function(){return this.m_target};u.prototype.SetTarget=function(d){this.m_bodyB.IsAwake()==
+false&&this.m_bodyB.SetAwake(true);this.m_target=d};u.prototype.GetMaxForce=function(){return this.m_maxForce};u.prototype.SetMaxForce=function(d){if(d===undefined)d=0;this.m_maxForce=d};u.prototype.GetFrequency=function(){return this.m_frequencyHz};u.prototype.SetFrequency=function(d){if(d===undefined)d=0;this.m_frequencyHz=d};u.prototype.GetDampingRatio=function(){return this.m_dampingRatio};u.prototype.SetDampingRatio=function(d){if(d===undefined)d=0;this.m_dampingRatio=d};u.prototype.b2MouseJoint=
+function(d){this.__super.b2Joint.call(this,d);this.m_target.SetV(d.target);var h=this.m_target.x-this.m_bodyB.m_xf.position.x,l=this.m_target.y-this.m_bodyB.m_xf.position.y,j=this.m_bodyB.m_xf.R;this.m_localAnchor.x=h*j.col1.x+l*j.col1.y;this.m_localAnchor.y=h*j.col2.x+l*j.col2.y;this.m_maxForce=d.maxForce;this.m_impulse.SetZero();this.m_frequencyHz=d.frequencyHz;this.m_dampingRatio=d.dampingRatio;this.m_gamma=this.m_beta=0};u.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyB,l=h.GetMass(),
+j=2*Math.PI*this.m_frequencyHz,o=l*j*j;this.m_gamma=d.dt*(2*l*this.m_dampingRatio*j+d.dt*o);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_beta=d.dt*o*this.m_gamma;o=h.m_xf.R;l=this.m_localAnchor.x-h.m_sweep.localCenter.x;j=this.m_localAnchor.y-h.m_sweep.localCenter.y;var q=o.col1.x*l+o.col2.x*j;j=o.col1.y*l+o.col2.y*j;l=q;o=h.m_invMass;q=h.m_invI;this.K1.col1.x=o;this.K1.col2.x=0;this.K1.col1.y=0;this.K1.col2.y=o;this.K2.col1.x=q*j*j;this.K2.col2.x=-q*l*j;this.K2.col1.y=-q*l*j;this.K2.col2.y=
+q*l*l;this.K.SetM(this.K1);this.K.AddM(this.K2);this.K.col1.x+=this.m_gamma;this.K.col2.y+=this.m_gamma;this.K.GetInverse(this.m_mass);this.m_C.x=h.m_sweep.c.x+l-this.m_target.x;this.m_C.y=h.m_sweep.c.y+j-this.m_target.y;h.m_angularVelocity*=0.98;this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;h.m_linearVelocity.x+=o*this.m_impulse.x;h.m_linearVelocity.y+=o*this.m_impulse.y;h.m_angularVelocity+=q*(l*this.m_impulse.y-j*this.m_impulse.x)};u.prototype.SolveVelocityConstraints=function(d){var h=
+this.m_bodyB,l,j=0,o=0;l=h.m_xf.R;var q=this.m_localAnchor.x-h.m_sweep.localCenter.x,n=this.m_localAnchor.y-h.m_sweep.localCenter.y;j=l.col1.x*q+l.col2.x*n;n=l.col1.y*q+l.col2.y*n;q=j;j=h.m_linearVelocity.x+-h.m_angularVelocity*n;var a=h.m_linearVelocity.y+h.m_angularVelocity*q;l=this.m_mass;j=j+this.m_beta*this.m_C.x+this.m_gamma*this.m_impulse.x;o=a+this.m_beta*this.m_C.y+this.m_gamma*this.m_impulse.y;a=-(l.col1.x*j+l.col2.x*o);o=-(l.col1.y*j+l.col2.y*o);l=this.m_impulse.x;j=this.m_impulse.y;this.m_impulse.x+=
+a;this.m_impulse.y+=o;d=d.dt*this.m_maxForce;this.m_impulse.LengthSquared()>d*d&&this.m_impulse.Multiply(d/this.m_impulse.Length());a=this.m_impulse.x-l;o=this.m_impulse.y-j;h.m_linearVelocity.x+=h.m_invMass*a;h.m_linearVelocity.y+=h.m_invMass*o;h.m_angularVelocity+=h.m_invI*(q*o-n*a)};u.prototype.SolvePositionConstraints=function(){return true};Box2D.inherit(D,Box2D.Dynamics.Joints.b2JointDef);D.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;D.b2MouseJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,
+arguments);this.target=new w};D.prototype.b2MouseJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_mouseJoint;this.maxForce=0;this.frequencyHz=5;this.dampingRatio=0.7};Box2D.inherit(H,Box2D.Dynamics.Joints.b2Joint);H.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;H.b2PrismaticJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_localXAxis1=new w;this.m_localYAxis1=new w;this.m_axis=new w;
+this.m_perp=new w;this.m_K=new K;this.m_impulse=new A};H.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};H.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};H.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*(this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.x),d*(this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.y))};H.prototype.GetReactionTorque=
+function(d){if(d===undefined)d=0;return d*this.m_impulse.y};H.prototype.GetJointTranslation=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.GetWorldPoint(this.m_localAnchor1),j=h.GetWorldPoint(this.m_localAnchor2);h=j.x-l.x;l=j.y-l.y;d=d.GetWorldVector(this.m_localXAxis1);return d.x*h+d.y*l};H.prototype.GetJointSpeed=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;
+o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;l=h.m_sweep.c.x+n-(d.m_sweep.c.x+j);q=h.m_sweep.c.y+a-(d.m_sweep.c.y+o);var c=d.GetWorldVector(this.m_localXAxis1),g=d.m_linearVelocity,b=h.m_linearVelocity;d=d.m_angularVelocity;h=h.m_angularVelocity;return l*-d*c.y+q*d*c.x+(c.x*(b.x+-h*a-g.x- -d*o)+c.y*(b.y+h*n-g.y-d*j))};H.prototype.IsLimitEnabled=function(){return this.m_enableLimit};
+H.prototype.EnableLimit=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableLimit=d};H.prototype.GetLowerLimit=function(){return this.m_lowerTranslation};H.prototype.GetUpperLimit=function(){return this.m_upperTranslation};H.prototype.SetLimits=function(d,h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_lowerTranslation=d;this.m_upperTranslation=h};H.prototype.IsMotorEnabled=function(){return this.m_enableMotor};
+H.prototype.EnableMotor=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableMotor=d};H.prototype.SetMotorSpeed=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};H.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};H.prototype.SetMaxMotorForce=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_maxMotorForce=d};H.prototype.GetMotorForce=function(){return this.m_motorImpulse};
+H.prototype.b2PrismaticJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_localXAxis1.SetV(d.localAxisA);this.m_localYAxis1.x=-this.m_localXAxis1.y;this.m_localYAxis1.y=this.m_localXAxis1.x;this.m_refAngle=d.referenceAngle;this.m_impulse.SetZero();this.m_motorImpulse=this.m_motorMass=0;this.m_lowerTranslation=d.lowerTranslation;this.m_upperTranslation=d.upperTranslation;this.m_maxMotorForce=d.maxMotorForce;this.m_motorSpeed=
+d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit;this.m_axis.SetZero();this.m_perp.SetZero()};H.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;this.m_localCenterA.SetV(h.GetLocalCenter());this.m_localCenterB.SetV(l.GetLocalCenter());var q=h.GetTransform();l.GetTransform();j=h.m_xf.R;var n=this.m_localAnchor1.x-this.m_localCenterA.x,a=this.m_localAnchor1.y-this.m_localCenterA.y;o=j.col1.x*n+j.col2.x*
+a;a=j.col1.y*n+j.col2.y*a;n=o;j=l.m_xf.R;var c=this.m_localAnchor2.x-this.m_localCenterB.x,g=this.m_localAnchor2.y-this.m_localCenterB.y;o=j.col1.x*c+j.col2.x*g;g=j.col1.y*c+j.col2.y*g;c=o;j=l.m_sweep.c.x+c-h.m_sweep.c.x-n;o=l.m_sweep.c.y+g-h.m_sweep.c.y-a;this.m_invMassA=h.m_invMass;this.m_invMassB=l.m_invMass;this.m_invIA=h.m_invI;this.m_invIB=l.m_invI;this.m_axis.SetV(y.MulMV(q.R,this.m_localXAxis1));this.m_a1=(j+n)*this.m_axis.y-(o+a)*this.m_axis.x;this.m_a2=c*this.m_axis.y-g*this.m_axis.x;this.m_motorMass=
+this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_a1*this.m_a1+this.m_invIB*this.m_a2*this.m_a2;if(this.m_motorMass>Number.MIN_VALUE)this.m_motorMass=1/this.m_motorMass;this.m_perp.SetV(y.MulMV(q.R,this.m_localYAxis1));this.m_s1=(j+n)*this.m_perp.y-(o+a)*this.m_perp.x;this.m_s2=c*this.m_perp.y-g*this.m_perp.x;q=this.m_invMassA;n=this.m_invMassB;a=this.m_invIA;c=this.m_invIB;this.m_K.col1.x=q+n+a*this.m_s1*this.m_s1+c*this.m_s2*this.m_s2;this.m_K.col1.y=a*this.m_s1+c*this.m_s2;this.m_K.col1.z=a*
+this.m_s1*this.m_a1+c*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=a+c;this.m_K.col2.z=a*this.m_a1+c*this.m_a2;this.m_K.col3.x=this.m_K.col1.z;this.m_K.col3.y=this.m_K.col2.z;this.m_K.col3.z=q+n+a*this.m_a1*this.m_a1+c*this.m_a2*this.m_a2;if(this.m_enableLimit){j=this.m_axis.x*j+this.m_axis.y*o;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop)this.m_limitState=I.e_equalLimits;else if(j<=this.m_lowerTranslation){if(this.m_limitState!=I.e_atLowerLimit){this.m_limitState=
+I.e_atLowerLimit;this.m_impulse.z=0}}else if(j>=this.m_upperTranslation){if(this.m_limitState!=I.e_atUpperLimit){this.m_limitState=I.e_atUpperLimit;this.m_impulse.z=0}}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.z=0}}else this.m_limitState=I.e_inactiveLimit;if(this.m_enableMotor==false)this.m_motorImpulse=0;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.x;
+j=this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.y;o=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1;q=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;h.m_linearVelocity.x-=this.m_invMassA*d;h.m_linearVelocity.y-=this.m_invMassA*j;h.m_angularVelocity-=this.m_invIA*o;l.m_linearVelocity.x+=this.m_invMassB*d;l.m_linearVelocity.y+=this.m_invMassB*j;l.m_angularVelocity+=this.m_invIB*
+q}else{this.m_impulse.SetZero();this.m_motorImpulse=0}};H.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=h.m_linearVelocity,o=h.m_angularVelocity,q=l.m_linearVelocity,n=l.m_angularVelocity,a=0,c=0,g=0,b=0;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){b=this.m_motorMass*(this.m_motorSpeed-(this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o));a=this.m_motorImpulse;d=d.dt*this.m_maxMotorForce;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+
+b,-d,d);b=this.m_motorImpulse-a;a=b*this.m_axis.x;c=b*this.m_axis.y;g=b*this.m_a1;b=b*this.m_a2;j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b}g=this.m_perp.x*(q.x-j.x)+this.m_perp.y*(q.y-j.y)+this.m_s2*n-this.m_s1*o;c=n-o;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o;a=this.m_impulse.Copy();d=this.m_K.Solve33(new A,-g,-c,-d);this.m_impulse.Add(d);
+if(this.m_limitState==I.e_atLowerLimit)this.m_impulse.z=y.Max(this.m_impulse.z,0);else if(this.m_limitState==I.e_atUpperLimit)this.m_impulse.z=y.Min(this.m_impulse.z,0);g=-g-(this.m_impulse.z-a.z)*this.m_K.col3.x;c=-c-(this.m_impulse.z-a.z)*this.m_K.col3.y;c=this.m_K.Solve22(new w,g,c);c.x+=a.x;c.y+=a.y;this.m_impulse.x=c.x;this.m_impulse.y=c.y;d.x=this.m_impulse.x-a.x;d.y=this.m_impulse.y-a.y;d.z=this.m_impulse.z-a.z;a=d.x*this.m_perp.x+d.z*this.m_axis.x;c=d.x*this.m_perp.y+d.z*this.m_axis.y;g=d.x*
+this.m_s1+d.y+d.z*this.m_a1;b=d.x*this.m_s2+d.y+d.z*this.m_a2}else{d=this.m_K.Solve22(new w,-g,-c);this.m_impulse.x+=d.x;this.m_impulse.y+=d.y;a=d.x*this.m_perp.x;c=d.x*this.m_perp.y;g=d.x*this.m_s1+d.y;b=d.x*this.m_s2+d.y}j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b;h.m_linearVelocity.SetV(j);h.m_angularVelocity=o;l.m_linearVelocity.SetV(q);l.m_angularVelocity=n};H.prototype.SolvePositionConstraints=function(){var d=
+this.m_bodyA,h=this.m_bodyB,l=d.m_sweep.c,j=d.m_sweep.a,o=h.m_sweep.c,q=h.m_sweep.a,n,a=0,c=0,g=0,b=a=n=0,e=0;c=false;var f=0,m=G.FromAngle(j),r=G.FromAngle(q);n=m;e=this.m_localAnchor1.x-this.m_localCenterA.x;var s=this.m_localAnchor1.y-this.m_localCenterA.y;a=n.col1.x*e+n.col2.x*s;s=n.col1.y*e+n.col2.y*s;e=a;n=r;r=this.m_localAnchor2.x-this.m_localCenterB.x;g=this.m_localAnchor2.y-this.m_localCenterB.y;a=n.col1.x*r+n.col2.x*g;g=n.col1.y*r+n.col2.y*g;r=a;n=o.x+r-l.x-e;a=o.y+g-l.y-s;if(this.m_enableLimit){this.m_axis=
+y.MulMV(m,this.m_localXAxis1);this.m_a1=(n+e)*this.m_axis.y-(a+s)*this.m_axis.x;this.m_a2=r*this.m_axis.y-g*this.m_axis.x;var v=this.m_axis.x*n+this.m_axis.y*a;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop){f=y.Clamp(v,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);b=y.Abs(v);c=true}else if(v<=this.m_lowerTranslation){f=y.Clamp(v-this.m_lowerTranslation+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);b=this.m_lowerTranslation-v;c=true}else if(v>=this.m_upperTranslation){f=
+y.Clamp(v-this.m_upperTranslation+F.b2_linearSlop,0,F.b2_maxLinearCorrection);b=v-this.m_upperTranslation;c=true}}this.m_perp=y.MulMV(m,this.m_localYAxis1);this.m_s1=(n+e)*this.m_perp.y-(a+s)*this.m_perp.x;this.m_s2=r*this.m_perp.y-g*this.m_perp.x;m=new A;s=this.m_perp.x*n+this.m_perp.y*a;r=q-j-this.m_refAngle;b=y.Max(b,y.Abs(s));e=y.Abs(r);if(c){c=this.m_invMassA;g=this.m_invMassB;n=this.m_invIA;a=this.m_invIB;this.m_K.col1.x=c+g+n*this.m_s1*this.m_s1+a*this.m_s2*this.m_s2;this.m_K.col1.y=n*this.m_s1+
+a*this.m_s2;this.m_K.col1.z=n*this.m_s1*this.m_a1+a*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=n+a;this.m_K.col2.z=n*this.m_a1+a*this.m_a2;this.m_K.col3.x=this.m_K.col1.z;this.m_K.col3.y=this.m_K.col2.z;this.m_K.col3.z=c+g+n*this.m_a1*this.m_a1+a*this.m_a2*this.m_a2;this.m_K.Solve33(m,-s,-r,-f)}else{c=this.m_invMassA;g=this.m_invMassB;n=this.m_invIA;a=this.m_invIB;f=n*this.m_s1+a*this.m_s2;v=n+a;this.m_K.col1.Set(c+g+n*this.m_s1*this.m_s1+a*this.m_s2*this.m_s2,f,0);this.m_K.col2.Set(f,
+v,0);f=this.m_K.Solve22(new w,-s,-r);m.x=f.x;m.y=f.y;m.z=0}f=m.x*this.m_perp.x+m.z*this.m_axis.x;c=m.x*this.m_perp.y+m.z*this.m_axis.y;s=m.x*this.m_s1+m.y+m.z*this.m_a1;m=m.x*this.m_s2+m.y+m.z*this.m_a2;l.x-=this.m_invMassA*f;l.y-=this.m_invMassA*c;j-=this.m_invIA*s;o.x+=this.m_invMassB*f;o.y+=this.m_invMassB*c;q+=this.m_invIB*m;d.m_sweep.a=j;h.m_sweep.a=q;d.SynchronizeTransform();h.SynchronizeTransform();return b<=F.b2_linearSlop&&e<=F.b2_angularSlop};Box2D.inherit(O,Box2D.Dynamics.Joints.b2JointDef);
+O.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;O.b2PrismaticJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w;this.localAxisA=new w};O.prototype.b2PrismaticJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_prismaticJoint;this.localAxisA.Set(1,0);this.referenceAngle=0;this.enableLimit=false;this.upperTranslation=this.lowerTranslation=0;this.enableMotor=false;this.motorSpeed=this.maxMotorForce=
+0};O.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.localAxisA=this.bodyA.GetLocalVector(j);this.referenceAngle=this.bodyB.GetAngle()-this.bodyA.GetAngle()};Box2D.inherit(E,Box2D.Dynamics.Joints.b2Joint);E.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;E.b2PulleyJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_groundAnchor1=new w;this.m_groundAnchor2=
+new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_u1=new w;this.m_u2=new w};E.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};E.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};E.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse*this.m_u2.x,d*this.m_impulse*this.m_u2.y)};E.prototype.GetReactionTorque=function(){return 0};E.prototype.GetGroundAnchorA=function(){var d=
+this.m_ground.m_xf.position.Copy();d.Add(this.m_groundAnchor1);return d};E.prototype.GetGroundAnchorB=function(){var d=this.m_ground.m_xf.position.Copy();d.Add(this.m_groundAnchor2);return d};E.prototype.GetLength1=function(){var d=this.m_bodyA.GetWorldPoint(this.m_localAnchor1),h=d.x-(this.m_ground.m_xf.position.x+this.m_groundAnchor1.x);d=d.y-(this.m_ground.m_xf.position.y+this.m_groundAnchor1.y);return Math.sqrt(h*h+d*d)};E.prototype.GetLength2=function(){var d=this.m_bodyB.GetWorldPoint(this.m_localAnchor2),
+h=d.x-(this.m_ground.m_xf.position.x+this.m_groundAnchor2.x);d=d.y-(this.m_ground.m_xf.position.y+this.m_groundAnchor2.y);return Math.sqrt(h*h+d*d)};E.prototype.GetRatio=function(){return this.m_ratio};E.prototype.b2PulleyJoint=function(d){this.__super.b2Joint.call(this,d);this.m_ground=this.m_bodyA.m_world.m_groundBody;this.m_groundAnchor1.x=d.groundAnchorA.x-this.m_ground.m_xf.position.x;this.m_groundAnchor1.y=d.groundAnchorA.y-this.m_ground.m_xf.position.y;this.m_groundAnchor2.x=d.groundAnchorB.x-
+this.m_ground.m_xf.position.x;this.m_groundAnchor2.y=d.groundAnchorB.y-this.m_ground.m_xf.position.y;this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_ratio=d.ratio;this.m_constant=d.lengthA+this.m_ratio*d.lengthB;this.m_maxLength1=y.Min(d.maxLengthA,this.m_constant-this.m_ratio*E.b2_minPulleyLength);this.m_maxLength2=y.Min(d.maxLengthB,(this.m_constant-E.b2_minPulleyLength)/this.m_ratio);this.m_limitImpulse2=this.m_limitImpulse1=this.m_impulse=0};E.prototype.InitVelocityConstraints=
+function(d){var h=this.m_bodyA,l=this.m_bodyB,j;j=h.m_xf.R;var o=this.m_localAnchor1.x-h.m_sweep.localCenter.x,q=this.m_localAnchor1.y-h.m_sweep.localCenter.y,n=j.col1.x*o+j.col2.x*q;q=j.col1.y*o+j.col2.y*q;o=n;j=l.m_xf.R;var a=this.m_localAnchor2.x-l.m_sweep.localCenter.x,c=this.m_localAnchor2.y-l.m_sweep.localCenter.y;n=j.col1.x*a+j.col2.x*c;c=j.col1.y*a+j.col2.y*c;a=n;j=l.m_sweep.c.x+a;n=l.m_sweep.c.y+c;var g=this.m_ground.m_xf.position.x+this.m_groundAnchor2.x,b=this.m_ground.m_xf.position.y+
+this.m_groundAnchor2.y;this.m_u1.Set(h.m_sweep.c.x+o-(this.m_ground.m_xf.position.x+this.m_groundAnchor1.x),h.m_sweep.c.y+q-(this.m_ground.m_xf.position.y+this.m_groundAnchor1.y));this.m_u2.Set(j-g,n-b);j=this.m_u1.Length();n=this.m_u2.Length();j>F.b2_linearSlop?this.m_u1.Multiply(1/j):this.m_u1.SetZero();n>F.b2_linearSlop?this.m_u2.Multiply(1/n):this.m_u2.SetZero();if(this.m_constant-j-this.m_ratio*n>0){this.m_state=I.e_inactiveLimit;this.m_impulse=0}else this.m_state=I.e_atUpperLimit;if(j<this.m_maxLength1){this.m_limitState1=
+I.e_inactiveLimit;this.m_limitImpulse1=0}else this.m_limitState1=I.e_atUpperLimit;if(n<this.m_maxLength2){this.m_limitState2=I.e_inactiveLimit;this.m_limitImpulse2=0}else this.m_limitState2=I.e_atUpperLimit;j=o*this.m_u1.y-q*this.m_u1.x;n=a*this.m_u2.y-c*this.m_u2.x;this.m_limitMass1=h.m_invMass+h.m_invI*j*j;this.m_limitMass2=l.m_invMass+l.m_invI*n*n;this.m_pulleyMass=this.m_limitMass1+this.m_ratio*this.m_ratio*this.m_limitMass2;this.m_limitMass1=1/this.m_limitMass1;this.m_limitMass2=1/this.m_limitMass2;
+this.m_pulleyMass=1/this.m_pulleyMass;if(d.warmStarting){this.m_impulse*=d.dtRatio;this.m_limitImpulse1*=d.dtRatio;this.m_limitImpulse2*=d.dtRatio;d=(-this.m_impulse-this.m_limitImpulse1)*this.m_u1.x;j=(-this.m_impulse-this.m_limitImpulse1)*this.m_u1.y;n=(-this.m_ratio*this.m_impulse-this.m_limitImpulse2)*this.m_u2.x;g=(-this.m_ratio*this.m_impulse-this.m_limitImpulse2)*this.m_u2.y;h.m_linearVelocity.x+=h.m_invMass*d;h.m_linearVelocity.y+=h.m_invMass*j;h.m_angularVelocity+=h.m_invI*(o*j-q*d);l.m_linearVelocity.x+=
+l.m_invMass*n;l.m_linearVelocity.y+=l.m_invMass*g;l.m_angularVelocity+=l.m_invI*(a*g-c*n)}else this.m_limitImpulse2=this.m_limitImpulse1=this.m_impulse=0};E.prototype.SolveVelocityConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;
+q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;var c=q=l=0,g=0;l=g=l=g=c=q=l=0;if(this.m_state==I.e_atUpperLimit){l=d.m_linearVelocity.x+-d.m_angularVelocity*o;q=d.m_linearVelocity.y+d.m_angularVelocity*j;c=h.m_linearVelocity.x+-h.m_angularVelocity*a;g=h.m_linearVelocity.y+h.m_angularVelocity*n;l=-(this.m_u1.x*l+this.m_u1.y*q)-this.m_ratio*(this.m_u2.x*c+this.m_u2.y*g);g=this.m_pulleyMass*-l;l=this.m_impulse;this.m_impulse=y.Max(0,this.m_impulse+g);g=this.m_impulse-l;l=-g*this.m_u1.x;q=-g*this.m_u1.y;
+c=-this.m_ratio*g*this.m_u2.x;g=-this.m_ratio*g*this.m_u2.y;d.m_linearVelocity.x+=d.m_invMass*l;d.m_linearVelocity.y+=d.m_invMass*q;d.m_angularVelocity+=d.m_invI*(j*q-o*l);h.m_linearVelocity.x+=h.m_invMass*c;h.m_linearVelocity.y+=h.m_invMass*g;h.m_angularVelocity+=h.m_invI*(n*g-a*c)}if(this.m_limitState1==I.e_atUpperLimit){l=d.m_linearVelocity.x+-d.m_angularVelocity*o;q=d.m_linearVelocity.y+d.m_angularVelocity*j;l=-(this.m_u1.x*l+this.m_u1.y*q);g=-this.m_limitMass1*l;l=this.m_limitImpulse1;this.m_limitImpulse1=
+y.Max(0,this.m_limitImpulse1+g);g=this.m_limitImpulse1-l;l=-g*this.m_u1.x;q=-g*this.m_u1.y;d.m_linearVelocity.x+=d.m_invMass*l;d.m_linearVelocity.y+=d.m_invMass*q;d.m_angularVelocity+=d.m_invI*(j*q-o*l)}if(this.m_limitState2==I.e_atUpperLimit){c=h.m_linearVelocity.x+-h.m_angularVelocity*a;g=h.m_linearVelocity.y+h.m_angularVelocity*n;l=-(this.m_u2.x*c+this.m_u2.y*g);g=-this.m_limitMass2*l;l=this.m_limitImpulse2;this.m_limitImpulse2=y.Max(0,this.m_limitImpulse2+g);g=this.m_limitImpulse2-l;c=-g*this.m_u2.x;
+g=-g*this.m_u2.y;h.m_linearVelocity.x+=h.m_invMass*c;h.m_linearVelocity.y+=h.m_invMass*g;h.m_angularVelocity+=h.m_invI*(n*g-a*c)}};E.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l,j=this.m_ground.m_xf.position.x+this.m_groundAnchor1.x,o=this.m_ground.m_xf.position.y+this.m_groundAnchor1.y,q=this.m_ground.m_xf.position.x+this.m_groundAnchor2.x,n=this.m_ground.m_xf.position.y+this.m_groundAnchor2.y,a=0,c=0,g=0,b=0,e=l=0,f=0,m=0,r=e=m=l=e=l=0;if(this.m_state==I.e_atUpperLimit){l=
+d.m_xf.R;a=this.m_localAnchor1.x-d.m_sweep.localCenter.x;c=this.m_localAnchor1.y-d.m_sweep.localCenter.y;e=l.col1.x*a+l.col2.x*c;c=l.col1.y*a+l.col2.y*c;a=e;l=h.m_xf.R;g=this.m_localAnchor2.x-h.m_sweep.localCenter.x;b=this.m_localAnchor2.y-h.m_sweep.localCenter.y;e=l.col1.x*g+l.col2.x*b;b=l.col1.y*g+l.col2.y*b;g=e;l=d.m_sweep.c.x+a;e=d.m_sweep.c.y+c;f=h.m_sweep.c.x+g;m=h.m_sweep.c.y+b;this.m_u1.Set(l-j,e-o);this.m_u2.Set(f-q,m-n);l=this.m_u1.Length();e=this.m_u2.Length();l>F.b2_linearSlop?this.m_u1.Multiply(1/
+l):this.m_u1.SetZero();e>F.b2_linearSlop?this.m_u2.Multiply(1/e):this.m_u2.SetZero();l=this.m_constant-l-this.m_ratio*e;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_pulleyMass*l;l=-m*this.m_u1.x;e=-m*this.m_u1.y;f=-this.m_ratio*m*this.m_u2.x;m=-this.m_ratio*m*this.m_u2.y;d.m_sweep.c.x+=d.m_invMass*l;d.m_sweep.c.y+=d.m_invMass*e;d.m_sweep.a+=d.m_invI*(a*e-c*l);h.m_sweep.c.x+=h.m_invMass*f;h.m_sweep.c.y+=h.m_invMass*m;h.m_sweep.a+=h.m_invI*(g*m-b*f);d.SynchronizeTransform();
+h.SynchronizeTransform()}if(this.m_limitState1==I.e_atUpperLimit){l=d.m_xf.R;a=this.m_localAnchor1.x-d.m_sweep.localCenter.x;c=this.m_localAnchor1.y-d.m_sweep.localCenter.y;e=l.col1.x*a+l.col2.x*c;c=l.col1.y*a+l.col2.y*c;a=e;l=d.m_sweep.c.x+a;e=d.m_sweep.c.y+c;this.m_u1.Set(l-j,e-o);l=this.m_u1.Length();if(l>F.b2_linearSlop){this.m_u1.x*=1/l;this.m_u1.y*=1/l}else this.m_u1.SetZero();l=this.m_maxLength1-l;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_limitMass1*l;
+l=-m*this.m_u1.x;e=-m*this.m_u1.y;d.m_sweep.c.x+=d.m_invMass*l;d.m_sweep.c.y+=d.m_invMass*e;d.m_sweep.a+=d.m_invI*(a*e-c*l);d.SynchronizeTransform()}if(this.m_limitState2==I.e_atUpperLimit){l=h.m_xf.R;g=this.m_localAnchor2.x-h.m_sweep.localCenter.x;b=this.m_localAnchor2.y-h.m_sweep.localCenter.y;e=l.col1.x*g+l.col2.x*b;b=l.col1.y*g+l.col2.y*b;g=e;f=h.m_sweep.c.x+g;m=h.m_sweep.c.y+b;this.m_u2.Set(f-q,m-n);e=this.m_u2.Length();if(e>F.b2_linearSlop){this.m_u2.x*=1/e;this.m_u2.y*=1/e}else this.m_u2.SetZero();
+l=this.m_maxLength2-e;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_limitMass2*l;f=-m*this.m_u2.x;m=-m*this.m_u2.y;h.m_sweep.c.x+=h.m_invMass*f;h.m_sweep.c.y+=h.m_invMass*m;h.m_sweep.a+=h.m_invI*(g*m-b*f);h.SynchronizeTransform()}return r<F.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2PulleyJoint.b2_minPulleyLength=2});Box2D.inherit(R,Box2D.Dynamics.Joints.b2JointDef);R.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;R.b2PulleyJointDef=
+function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.groundAnchorA=new w;this.groundAnchorB=new w;this.localAnchorA=new w;this.localAnchorB=new w};R.prototype.b2PulleyJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_pulleyJoint;this.groundAnchorA.Set(-1,1);this.groundAnchorB.Set(1,1);this.localAnchorA.Set(-1,0);this.localAnchorB.Set(1,0);this.maxLengthB=this.lengthB=this.maxLengthA=this.lengthA=0;this.ratio=1;this.collideConnected=true};R.prototype.Initialize=
+function(d,h,l,j,o,q,n){if(n===undefined)n=0;this.bodyA=d;this.bodyB=h;this.groundAnchorA.SetV(l);this.groundAnchorB.SetV(j);this.localAnchorA=this.bodyA.GetLocalPoint(o);this.localAnchorB=this.bodyB.GetLocalPoint(q);d=o.x-l.x;l=o.y-l.y;this.lengthA=Math.sqrt(d*d+l*l);l=q.x-j.x;j=q.y-j.y;this.lengthB=Math.sqrt(l*l+j*j);this.ratio=n;n=this.lengthA+this.ratio*this.lengthB;this.maxLengthA=n-this.ratio*E.b2_minPulleyLength;this.maxLengthB=(n-E.b2_minPulleyLength)/this.ratio};Box2D.inherit(N,Box2D.Dynamics.Joints.b2Joint);
+N.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;N.b2RevoluteJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.K=new G;this.K1=new G;this.K2=new G;this.K3=new G;this.impulse3=new A;this.impulse2=new w;this.reduced=new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_impulse=new A;this.m_mass=new K};N.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};N.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};
+N.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};N.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.z};N.prototype.GetJointAngle=function(){return this.m_bodyB.m_sweep.a-this.m_bodyA.m_sweep.a-this.m_referenceAngle};N.prototype.GetJointSpeed=function(){return this.m_bodyB.m_angularVelocity-this.m_bodyA.m_angularVelocity};N.prototype.IsLimitEnabled=function(){return this.m_enableLimit};N.prototype.EnableLimit=
+function(d){this.m_enableLimit=d};N.prototype.GetLowerLimit=function(){return this.m_lowerAngle};N.prototype.GetUpperLimit=function(){return this.m_upperAngle};N.prototype.SetLimits=function(d,h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_lowerAngle=d;this.m_upperAngle=h};N.prototype.IsMotorEnabled=function(){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);return this.m_enableMotor};N.prototype.EnableMotor=function(d){this.m_enableMotor=d};N.prototype.SetMotorSpeed=function(d){if(d===
+undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};N.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};N.prototype.SetMaxMotorTorque=function(d){if(d===undefined)d=0;this.m_maxMotorTorque=d};N.prototype.GetMotorTorque=function(){return this.m_maxMotorTorque};N.prototype.b2RevoluteJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_referenceAngle=d.referenceAngle;
+this.m_impulse.SetZero();this.m_motorImpulse=0;this.m_lowerAngle=d.lowerAngle;this.m_upperAngle=d.upperAngle;this.m_maxMotorTorque=d.maxMotorTorque;this.m_motorSpeed=d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit};N.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;j=h.m_xf.R;var q=this.m_localAnchor1.x-h.m_sweep.localCenter.x,n=this.m_localAnchor1.y-h.m_sweep.localCenter.y;o=j.col1.x*q+j.col2.x*
+n;n=j.col1.y*q+j.col2.y*n;q=o;j=l.m_xf.R;var a=this.m_localAnchor2.x-l.m_sweep.localCenter.x,c=this.m_localAnchor2.y-l.m_sweep.localCenter.y;o=j.col1.x*a+j.col2.x*c;c=j.col1.y*a+j.col2.y*c;a=o;j=h.m_invMass;o=l.m_invMass;var g=h.m_invI,b=l.m_invI;this.m_mass.col1.x=j+o+n*n*g+c*c*b;this.m_mass.col2.x=-n*q*g-c*a*b;this.m_mass.col3.x=-n*g-c*b;this.m_mass.col1.y=this.m_mass.col2.x;this.m_mass.col2.y=j+o+q*q*g+a*a*b;this.m_mass.col3.y=q*g+a*b;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;
+this.m_mass.col3.z=g+b;this.m_motorMass=1/(g+b);if(this.m_enableMotor==false)this.m_motorImpulse=0;if(this.m_enableLimit){var e=l.m_sweep.a-h.m_sweep.a-this.m_referenceAngle;if(y.Abs(this.m_upperAngle-this.m_lowerAngle)<2*F.b2_angularSlop)this.m_limitState=I.e_equalLimits;else if(e<=this.m_lowerAngle){if(this.m_limitState!=I.e_atLowerLimit)this.m_impulse.z=0;this.m_limitState=I.e_atLowerLimit}else if(e>=this.m_upperAngle){if(this.m_limitState!=I.e_atUpperLimit)this.m_impulse.z=0;this.m_limitState=
+I.e_atUpperLimit}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.z=0}}else this.m_limitState=I.e_inactiveLimit;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x;e=this.m_impulse.y;h.m_linearVelocity.x-=j*d;h.m_linearVelocity.y-=j*e;h.m_angularVelocity-=g*(q*e-n*d+this.m_motorImpulse+this.m_impulse.z);l.m_linearVelocity.x+=o*d;l.m_linearVelocity.y+=o*e;l.m_angularVelocity+=b*(a*e-c*d+this.m_motorImpulse+this.m_impulse.z)}else{this.m_impulse.SetZero();
+this.m_motorImpulse=0}};N.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=0,o=j=0,q=0,n=0,a=0,c=h.m_linearVelocity,g=h.m_angularVelocity,b=l.m_linearVelocity,e=l.m_angularVelocity,f=h.m_invMass,m=l.m_invMass,r=h.m_invI,s=l.m_invI;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){o=this.m_motorMass*-(e-g-this.m_motorSpeed);q=this.m_motorImpulse;n=d.dt*this.m_maxMotorTorque;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+o,-n,n);o=this.m_motorImpulse-q;g-=
+r*o;e+=s*o}if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=h.m_xf.R;o=this.m_localAnchor1.x-h.m_sweep.localCenter.x;q=this.m_localAnchor1.y-h.m_sweep.localCenter.y;j=d.col1.x*o+d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=j;d=l.m_xf.R;n=this.m_localAnchor2.x-l.m_sweep.localCenter.x;a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;j=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=j;d=b.x+-e*a-c.x- -g*q;var v=b.y+e*n-c.y-g*o;this.m_mass.Solve33(this.impulse3,-d,-v,-(e-g));if(this.m_limitState==
+I.e_equalLimits)this.m_impulse.Add(this.impulse3);else if(this.m_limitState==I.e_atLowerLimit){j=this.m_impulse.z+this.impulse3.z;if(j<0){this.m_mass.Solve22(this.reduced,-d,-v);this.impulse3.x=this.reduced.x;this.impulse3.y=this.reduced.y;this.impulse3.z=-this.m_impulse.z;this.m_impulse.x+=this.reduced.x;this.m_impulse.y+=this.reduced.y;this.m_impulse.z=0}}else if(this.m_limitState==I.e_atUpperLimit){j=this.m_impulse.z+this.impulse3.z;if(j>0){this.m_mass.Solve22(this.reduced,-d,-v);this.impulse3.x=
+this.reduced.x;this.impulse3.y=this.reduced.y;this.impulse3.z=-this.m_impulse.z;this.m_impulse.x+=this.reduced.x;this.m_impulse.y+=this.reduced.y;this.m_impulse.z=0}}c.x-=f*this.impulse3.x;c.y-=f*this.impulse3.y;g-=r*(o*this.impulse3.y-q*this.impulse3.x+this.impulse3.z);b.x+=m*this.impulse3.x;b.y+=m*this.impulse3.y;e+=s*(n*this.impulse3.y-a*this.impulse3.x+this.impulse3.z)}else{d=h.m_xf.R;o=this.m_localAnchor1.x-h.m_sweep.localCenter.x;q=this.m_localAnchor1.y-h.m_sweep.localCenter.y;j=d.col1.x*o+
+d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=j;d=l.m_xf.R;n=this.m_localAnchor2.x-l.m_sweep.localCenter.x;a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;j=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=j;this.m_mass.Solve22(this.impulse2,-(b.x+-e*a-c.x- -g*q),-(b.y+e*n-c.y-g*o));this.m_impulse.x+=this.impulse2.x;this.m_impulse.y+=this.impulse2.y;c.x-=f*this.impulse2.x;c.y-=f*this.impulse2.y;g-=r*(o*this.impulse2.y-q*this.impulse2.x);b.x+=m*this.impulse2.x;b.y+=m*this.impulse2.y;e+=s*(n*this.impulse2.y-
+a*this.impulse2.x)}h.m_linearVelocity.SetV(c);h.m_angularVelocity=g;l.m_linearVelocity.SetV(b);l.m_angularVelocity=e};N.prototype.SolvePositionConstraints=function(){var d=0,h,l=this.m_bodyA,j=this.m_bodyB,o=0,q=h=0,n=0,a=0;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=j.m_sweep.a-l.m_sweep.a-this.m_referenceAngle;var c=0;if(this.m_limitState==I.e_equalLimits){d=y.Clamp(d-this.m_lowerAngle,-F.b2_maxAngularCorrection,F.b2_maxAngularCorrection);c=-this.m_motorMass*d;o=y.Abs(d)}else if(this.m_limitState==
+I.e_atLowerLimit){d=d-this.m_lowerAngle;o=-d;d=y.Clamp(d+F.b2_angularSlop,-F.b2_maxAngularCorrection,0);c=-this.m_motorMass*d}else if(this.m_limitState==I.e_atUpperLimit){o=d=d-this.m_upperAngle;d=y.Clamp(d-F.b2_angularSlop,0,F.b2_maxAngularCorrection);c=-this.m_motorMass*d}l.m_sweep.a-=l.m_invI*c;j.m_sweep.a+=j.m_invI*c;l.SynchronizeTransform();j.SynchronizeTransform()}h=l.m_xf.R;c=this.m_localAnchor1.x-l.m_sweep.localCenter.x;d=this.m_localAnchor1.y-l.m_sweep.localCenter.y;q=h.col1.x*c+h.col2.x*
+d;d=h.col1.y*c+h.col2.y*d;c=q;h=j.m_xf.R;var g=this.m_localAnchor2.x-j.m_sweep.localCenter.x,b=this.m_localAnchor2.y-j.m_sweep.localCenter.y;q=h.col1.x*g+h.col2.x*b;b=h.col1.y*g+h.col2.y*b;g=q;n=j.m_sweep.c.x+g-l.m_sweep.c.x-c;a=j.m_sweep.c.y+b-l.m_sweep.c.y-d;var e=n*n+a*a;h=Math.sqrt(e);q=l.m_invMass;var f=j.m_invMass,m=l.m_invI,r=j.m_invI,s=10*F.b2_linearSlop;if(e>s*s){e=1/(q+f);n=e*-n;a=e*-a;l.m_sweep.c.x-=0.5*q*n;l.m_sweep.c.y-=0.5*q*a;j.m_sweep.c.x+=0.5*f*n;j.m_sweep.c.y+=0.5*f*a;n=j.m_sweep.c.x+
+g-l.m_sweep.c.x-c;a=j.m_sweep.c.y+b-l.m_sweep.c.y-d}this.K1.col1.x=q+f;this.K1.col2.x=0;this.K1.col1.y=0;this.K1.col2.y=q+f;this.K2.col1.x=m*d*d;this.K2.col2.x=-m*c*d;this.K2.col1.y=-m*c*d;this.K2.col2.y=m*c*c;this.K3.col1.x=r*b*b;this.K3.col2.x=-r*g*b;this.K3.col1.y=-r*g*b;this.K3.col2.y=r*g*g;this.K.SetM(this.K1);this.K.AddM(this.K2);this.K.AddM(this.K3);this.K.Solve(N.tImpulse,-n,-a);n=N.tImpulse.x;a=N.tImpulse.y;l.m_sweep.c.x-=l.m_invMass*n;l.m_sweep.c.y-=l.m_invMass*a;l.m_sweep.a-=l.m_invI*(c*
+a-d*n);j.m_sweep.c.x+=j.m_invMass*n;j.m_sweep.c.y+=j.m_invMass*a;j.m_sweep.a+=j.m_invI*(g*a-b*n);l.SynchronizeTransform();j.SynchronizeTransform();return h<=F.b2_linearSlop&&o<=F.b2_angularSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2RevoluteJoint.tImpulse=new w});Box2D.inherit(S,Box2D.Dynamics.Joints.b2JointDef);S.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;S.b2RevoluteJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=
+new w;this.localAnchorB=new w};S.prototype.b2RevoluteJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_revoluteJoint;this.localAnchorA.Set(0,0);this.localAnchorB.Set(0,0);this.motorSpeed=this.maxMotorTorque=this.upperAngle=this.lowerAngle=this.referenceAngle=0;this.enableMotor=this.enableLimit=false};S.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.referenceAngle=this.bodyB.GetAngle()-
+this.bodyA.GetAngle()};Box2D.inherit(aa,Box2D.Dynamics.Joints.b2Joint);aa.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;aa.b2WeldJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchorA=new w;this.m_localAnchorB=new w;this.m_impulse=new A;this.m_mass=new K};aa.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)};aa.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)};aa.prototype.GetReactionForce=
+function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};aa.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.z};aa.prototype.b2WeldJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchorA.SetV(d.localAnchorA);this.m_localAnchorB.SetV(d.localAnchorB);this.m_referenceAngle=d.referenceAngle;this.m_impulse.SetZero();this.m_mass=new K};aa.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;
+h=j.m_xf.R;var q=this.m_localAnchorA.x-j.m_sweep.localCenter.x,n=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchorB.x-o.m_sweep.localCenter.x,c=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;h=j.m_invMass;l=o.m_invMass;var g=j.m_invI,b=o.m_invI;this.m_mass.col1.x=h+l+n*n*g+c*c*b;this.m_mass.col2.x=-n*q*g-c*a*b;this.m_mass.col3.x=-n*g-c*b;this.m_mass.col1.y=this.m_mass.col2.x;
+this.m_mass.col2.y=h+l+q*q*g+a*a*b;this.m_mass.col3.y=q*g+a*b;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;this.m_mass.col3.z=g+b;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_impulse.z*=d.dtRatio;j.m_linearVelocity.x-=h*this.m_impulse.x;j.m_linearVelocity.y-=h*this.m_impulse.y;j.m_angularVelocity-=g*(q*this.m_impulse.y-n*this.m_impulse.x+this.m_impulse.z);o.m_linearVelocity.x+=l*this.m_impulse.x;o.m_linearVelocity.y+=l*this.m_impulse.y;
+o.m_angularVelocity+=b*(a*this.m_impulse.y-c*this.m_impulse.x+this.m_impulse.z)}else this.m_impulse.SetZero()};aa.prototype.SolveVelocityConstraints=function(){var d,h=0,l=this.m_bodyA,j=this.m_bodyB,o=l.m_linearVelocity,q=l.m_angularVelocity,n=j.m_linearVelocity,a=j.m_angularVelocity,c=l.m_invMass,g=j.m_invMass,b=l.m_invI,e=j.m_invI;d=l.m_xf.R;var f=this.m_localAnchorA.x-l.m_sweep.localCenter.x,m=this.m_localAnchorA.y-l.m_sweep.localCenter.y;h=d.col1.x*f+d.col2.x*m;m=d.col1.y*f+d.col2.y*m;f=h;d=
+j.m_xf.R;var r=this.m_localAnchorB.x-j.m_sweep.localCenter.x,s=this.m_localAnchorB.y-j.m_sweep.localCenter.y;h=d.col1.x*r+d.col2.x*s;s=d.col1.y*r+d.col2.y*s;r=h;d=n.x-a*s-o.x+q*m;h=n.y+a*r-o.y-q*f;var v=a-q,t=new A;this.m_mass.Solve33(t,-d,-h,-v);this.m_impulse.Add(t);o.x-=c*t.x;o.y-=c*t.y;q-=b*(f*t.y-m*t.x+t.z);n.x+=g*t.x;n.y+=g*t.y;a+=e*(r*t.y-s*t.x+t.z);l.m_angularVelocity=q;j.m_angularVelocity=a};aa.prototype.SolvePositionConstraints=function(){var d,h=0,l=this.m_bodyA,j=this.m_bodyB;d=l.m_xf.R;
+var o=this.m_localAnchorA.x-l.m_sweep.localCenter.x,q=this.m_localAnchorA.y-l.m_sweep.localCenter.y;h=d.col1.x*o+d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=h;d=j.m_xf.R;var n=this.m_localAnchorB.x-j.m_sweep.localCenter.x,a=this.m_localAnchorB.y-j.m_sweep.localCenter.y;h=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=h;d=l.m_invMass;h=j.m_invMass;var c=l.m_invI,g=j.m_invI,b=j.m_sweep.c.x+n-l.m_sweep.c.x-o,e=j.m_sweep.c.y+a-l.m_sweep.c.y-q,f=j.m_sweep.a-l.m_sweep.a-this.m_referenceAngle,m=10*F.b2_linearSlop,
+r=Math.sqrt(b*b+e*e),s=y.Abs(f);if(r>m){c*=1;g*=1}this.m_mass.col1.x=d+h+q*q*c+a*a*g;this.m_mass.col2.x=-q*o*c-a*n*g;this.m_mass.col3.x=-q*c-a*g;this.m_mass.col1.y=this.m_mass.col2.x;this.m_mass.col2.y=d+h+o*o*c+n*n*g;this.m_mass.col3.y=o*c+n*g;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;this.m_mass.col3.z=c+g;m=new A;this.m_mass.Solve33(m,-b,-e,-f);l.m_sweep.c.x-=d*m.x;l.m_sweep.c.y-=d*m.y;l.m_sweep.a-=c*(o*m.y-q*m.x+m.z);j.m_sweep.c.x+=h*m.x;j.m_sweep.c.y+=h*m.y;
+j.m_sweep.a+=g*(n*m.y-a*m.x+m.z);l.SynchronizeTransform();j.SynchronizeTransform();return r<=F.b2_linearSlop&&s<=F.b2_angularSlop};Box2D.inherit(Z,Box2D.Dynamics.Joints.b2JointDef);Z.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;Z.b2WeldJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};Z.prototype.b2WeldJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_weldJoint;this.referenceAngle=
+0};Z.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l));this.referenceAngle=this.bodyB.GetAngle()-this.bodyA.GetAngle()}})();
+(function(){var F=Box2D.Dynamics.b2DebugDraw;F.b2DebugDraw=function(){this.m_xformScale=this.m_fillAlpha=this.m_alpha=this.m_lineThickness=this.m_drawScale=1;var G=this;this.m_sprite={graphics:{clear:function(){G.m_ctx.clearRect(0,0,G.m_ctx.canvas.width,G.m_ctx.canvas.height)}}}};F.prototype._color=function(G,K){return"rgba("+((G&16711680)>>16)+","+((G&65280)>>8)+","+(G&255)+","+K+")"};F.prototype.b2DebugDraw=function(){this.m_drawFlags=0};F.prototype.SetFlags=function(G){if(G===undefined)G=0;this.m_drawFlags=
+G};F.prototype.GetFlags=function(){return this.m_drawFlags};F.prototype.AppendFlags=function(G){if(G===undefined)G=0;this.m_drawFlags|=G};F.prototype.ClearFlags=function(G){if(G===undefined)G=0;this.m_drawFlags&=~G};F.prototype.SetSprite=function(G){this.m_ctx=G};F.prototype.GetSprite=function(){return this.m_ctx};F.prototype.SetDrawScale=function(G){if(G===undefined)G=0;this.m_drawScale=G};F.prototype.GetDrawScale=function(){return this.m_drawScale};F.prototype.SetLineThickness=function(G){if(G===
+undefined)G=0;this.m_lineThickness=G;this.m_ctx.strokeWidth=G};F.prototype.GetLineThickness=function(){return this.m_lineThickness};F.prototype.SetAlpha=function(G){if(G===undefined)G=0;this.m_alpha=G};F.prototype.GetAlpha=function(){return this.m_alpha};F.prototype.SetFillAlpha=function(G){if(G===undefined)G=0;this.m_fillAlpha=G};F.prototype.GetFillAlpha=function(){return this.m_fillAlpha};F.prototype.SetXFormScale=function(G){if(G===undefined)G=0;this.m_xformScale=G};F.prototype.GetXFormScale=function(){return this.m_xformScale};
+F.prototype.DrawPolygon=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.moveTo(G[0].x*A,G[0].y*A);for(y=1;y<K;y++)w.lineTo(G[y].x*A,G[y].y*A);w.lineTo(G[0].x*A,G[0].y*A);w.closePath();w.stroke()}};F.prototype.DrawSolidPolygon=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.fillStyle=this._color(y.color,this.m_fillAlpha);w.moveTo(G[0].x*A,G[0].y*A);for(y=
+1;y<K;y++)w.lineTo(G[y].x*A,G[y].y*A);w.lineTo(G[0].x*A,G[0].y*A);w.closePath();w.fill();w.stroke()}};F.prototype.DrawCircle=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.arc(G.x*A,G.y*A,K*A,0,Math.PI*2,true);w.closePath();w.stroke()}};F.prototype.DrawSolidCircle=function(G,K,y,w){if(K){var A=this.m_ctx,U=this.m_drawScale,p=G.x*U,B=G.y*U;A.moveTo(0,0);A.beginPath();A.strokeStyle=this._color(w.color,this.m_alpha);A.fillStyle=
+this._color(w.color,this.m_fillAlpha);A.arc(p,B,K*U,0,Math.PI*2,true);A.moveTo(p,B);A.lineTo((G.x+y.x*K)*U,(G.y+y.y*K)*U);A.closePath();A.fill();A.stroke()}};F.prototype.DrawSegment=function(G,K,y){var w=this.m_ctx,A=this.m_drawScale;w.strokeStyle=this._color(y.color,this.m_alpha);w.beginPath();w.moveTo(G.x*A,G.y*A);w.lineTo(K.x*A,K.y*A);w.closePath();w.stroke()};F.prototype.DrawTransform=function(G){var K=this.m_ctx,y=this.m_drawScale;K.beginPath();K.strokeStyle=this._color(16711680,this.m_alpha);
+K.moveTo(G.position.x*y,G.position.y*y);K.lineTo((G.position.x+this.m_xformScale*G.R.col1.x)*y,(G.position.y+this.m_xformScale*G.R.col1.y)*y);K.strokeStyle=this._color(65280,this.m_alpha);K.moveTo(G.position.x*y,G.position.y*y);K.lineTo((G.position.x+this.m_xformScale*G.R.col2.x)*y,(G.position.y+this.m_xformScale*G.R.col2.y)*y);K.closePath();K.stroke()}})();var i;for(i=0;i<Box2D.postDefs.length;++i)Box2D.postDefs[i]();delete Box2D.postDefs;
+
+// Copyright 2012 the V8 project authors. All rights reserved.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+function MakeNewWorld () {
+  var Vec2 = Box2D.Common.Math.b2Vec2,
+      BodyDef = Box2D.Dynamics.b2BodyDef,
+      Body = Box2D.Dynamics.b2Body,
+      FixtureDef = Box2D.Dynamics.b2FixtureDef,
+      Fixture = Box2D.Dynamics.b2Fixture,
+      World = Box2D.Dynamics.b2World,
+      MassData = Box2D.Collision.Shapes.b2MassData,
+      PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
+      CircleShape = Box2D.Collision.Shapes.b2CircleShape;
+
+  var gravity = new Vec2(0, -10);
+  var world = new World(gravity, true);
+
+  var shape = new PolygonShape();
+  shape.SetAsEdge(new Vec2(-40.0, 0), new Vec2(40.0, 0));
+
+  var fd = new FixtureDef();
+  fd.density = 0.0;
+  fd.shape = shape;
+  var bd = new BodyDef();
+  var ground = world.CreateBody(bd);
+  ground.CreateFixture(fd);
+
+  var a = .5;
+  var shape = new PolygonShape();
+  shape.SetAsBox(a, a);
+
+  var x = new Vec2(-7.0, 0.75);
+  var y = new Vec2();
+  var deltaX = new Vec2(0.5625, 1);
+  var deltaY = new Vec2(1.125, 0.0);
+
+  for (var i = 0; i < 10; ++i) {
+    y.Set(x.x, x.y);
+
+    for (var j = 0; j < 5; ++j) {
+      var fd = new FixtureDef();
+      fd.density = 5.0;
+      fd.shape = shape;
+
+      var bd = new BodyDef();
+      bd.type = Body.b2_dynamicBody;
+      bd.position.Set(y.x, y.y);
+      var body = world.CreateBody(bd);
+      body.CreateFixture(fd);
+      y.Add(deltaY);
+    }
+
+    x.Add(deltaX);
+  }
+
+  return world;
+}
+
+var world = null;
+
+var Box2DBenchmark = new BenchmarkSuite('Box2D', 4559000,
+                                        [new Benchmark('Box2D',
+                                                       runBox2D,
+                                                       setupBox2D,
+                                                       tearDownBox2D,
+                                                       8)]);
+
+function runBox2D() {
+  var world = MakeNewWorld();
+  for (var i = 0; i < 20; i++) {
+    world.Step(1 / 60, 10, 3);
+  }
+}
+
+function setupBox2D() {
+}
+
+function tearDownBox2D() {
+  world = null;
+  Box2D = null;
+}
+
+
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/code-load.js b/suite/cts/deviceTests/browserbench/assets/octane/code-load.js
new file mode 100644
index 0000000..24d7df1
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/code-load.js
@@ -0,0 +1,1531 @@
+// Copyright 2012 the Octane Benchmark project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// The code in BASE_JS below:
+// Copyright 2012 The Closure Library Authors. All Rights Reserved.
+//
+// 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.
+
+
+// The code in JQUERY_JS below:
+// Copyright (c) 2012 John Resig, http://jquery.com/
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+var CodeLoad = new BenchmarkSuite('CodeLoad', 450000, [
+  new Benchmark('CodeLoadClosure',
+                runCodeLoadClosure,
+                setupCodeLoad,
+                tearDownCodeLoad,
+                16),
+  new Benchmark('CodeLoadJQuery',
+                runCodeLoadJQuery,
+                setupCodeLoad,
+                tearDownCodeLoad,
+                16)
+]);
+
+var salt;
+var indirectEval;
+
+function setupCodeLoad() {
+  salt = 0;
+  indirectEval = eval;
+}
+
+function tearDownCodeLoad() {
+  salt = null;
+  indirectEval = null;
+}
+
+function runCodeLoadClosure() {
+  runClosure();
+  salt++;
+}
+
+function runCodeLoadJQuery() {
+  runJQuery();
+  salt++;
+}
+
+/*
+ * BASE_JS is a compiled and formatted version of:
+ * http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/base.js
+ * JQUERY_JS is a formatted copy of:
+ * http://code.jquery.com/jquery.min.js
+ * The following Python script generates both variables:
+
+#!/usr/bin/env python
+
+import urllib
+import urllib2
+
+def escape_and_format(data, varname):
+  data = data.replace("\n", " ").replace("; ", ";")
+  data = data.replace("\\", "\\\\").replace("\"", "\\\"")
+  data = "var " + varname + " = \"" + data + "\""
+  while len(data) > 0:
+    cutoff = min(79, len(data))
+    while data[cutoff-1] == '\\':
+      cutoff -= 1
+    line = data[0:cutoff]
+    data = data[cutoff:]
+    if len(data) > 0:
+      line += '\\'
+    print line
+
+url = "http://closure-compiler.appspot.com/compile"
+request_params = {"output_format": "text",
+                  "compilation_level": "SIMPLE_OPTIMIZATIONS",
+                  "use_closure_library": "true",
+                  "js_code": "",
+                  "output_info": "compiled_code"}
+result = urllib2.urlopen(url, urllib.urlencode(request_params))
+escape_and_format(result.read(), "BASE_JS")
+
+print "\n\n"
+
+url = "http://code.jquery.com/jquery.min.js"
+result = urllib2.urlopen(url)
+escape_and_format(result.read(), "JQUERY_JS")
+
+*/
+var BASE_JS = "var COMPILED=!0,goog=goog||{};goog.global=this;goog.DEBUG=!0;goo\
+g.LOCALE=\"en\";goog.provide=function(a){if(!COMPILED){if(goog.isProvided_(a))t\
+hrow Error('Namespace \"'+a+'\" already declared.');delete goog.implicitNamespa\
+ces_[a];for(var b=a;(b=b.substring(0,b.lastIndexOf(\".\")))&&!goog.getObjectByN\
+ame(b);)goog.implicitNamespaces_[b]=!0}goog.exportPath_(a)};goog.setTestOnly=fu\
+nction(a){if(COMPILED&&!goog.DEBUG)throw a=a||\"\",Error(\"Importing test-only \
+code into non-debug environment\"+a?\": \"+a:\".\");};COMPILED||(goog.isProvide\
+d_=function(a){return!goog.implicitNamespaces_[a]&&!!goog.getObjectByName(a)},g\
+oog.implicitNamespaces_={});goog.exportPath_=function(a,b,c){a=a.split(\".\");c\
+=c||goog.global;!(a[0]in c)&&c.execScript&&c.execScript(\"var \"+a[0]);for(var \
+d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}\
+;goog.getObjectByName=function(a,b){for(var c=a.split(\".\"),d=b||goog.global,e\
+;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};g\
+oog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]};goog.a\
+ddDependency=function(a,b,c){if(!COMPILED){for(var d,a=a.replace(/\\\\/g,\"/\")\
+,e=goog.dependencies_,g=0;d=b[g];g++){e.nameToPath[d]=a;a in e.pathToNames||(e.\
+pathToNames[a]={});e.pathToNames[a][d]=true}for(d=0;b=c[d];d++){a in e.requires\
+||(e.requires[a]={});e.requires[a][b]=true}}};goog.ENABLE_DEBUG_LOADER=!0;goog.\
+require=function(a){if(!COMPILED&&!goog.isProvided_(a)){if(goog.ENABLE_DEBUG_LO\
+ADER){var b=goog.getPathFromDeps_(a);if(b){goog.included_[b]=true;goog.writeScr\
+ipts_();return}}a=\"goog.require could not find: \"+a;goog.global.console&&goog\
+.global.console.error(a);throw Error(a);}};goog.basePath=\"\";goog.nullFunction\
+=function(){};goog.identityFunction=function(a){return a};goog.abstractMethod=f\
+unction(){throw Error(\"unimplemented abstract method\");};goog.addSingletonGet\
+ter=function(a){a.getInstance=function(){return a.instance_||(a.instance_=new a\
+)}};!COMPILED&&goog.ENABLE_DEBUG_LOADER&&(goog.included_={},goog.dependencies_=\
+{pathToNames:{},nameToPath:{},requires:{},visited:{},written:{}},goog.inHtmlDoc\
+ument_=function(){var a=goog.global.document;return typeof a!=\"undefined\"&&\"\
+write\"in a},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goo\
+g.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var\
+ a=goog.global.document.getElementsByTagName(\"script\"),b=a.length-1;b>=0;--b)\
+{var c=a[b].src,d=c.lastIndexOf(\"?\"), d=d==-1?c.length:d;if(c.substr(d-7,7)==\
+\"base.js\"){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function\
+(a){var b=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_;!goog.depende\
+ncies_.written[a]&&b(a)&&(goog.dependencies_.written[a]=true)},goog.writeScript\
+Tag_=function(a){if(goog.inHtmlDocument_()){goog.global.document.write('<script\
+ type=\"text/javascript\" src=\"'+a+'\"><\\/script>');return true}return false}\
+,goog.writeScripts_=function(){function a(e){if(!(e in d.written)){if(!(e in d.\
+visited)){d.visited[e]=true;if(e in d.requires)for(var f in d.requires[e])if(!g\
+oog.isProvided_(f))if(f in d.nameToPath)a(d.nameToPath[f]);else throw Error(\"U\
+ndefined nameToPath for \"+f);}if(!(e in c)){c[e]=true;b.push(e)}}}var b=[],c={\
+},d=goog.dependencies_,e;for(e in goog.included_)d.written[e]||a(e);for(e=0;e<b\
+.length;e++)if(b[e])goog.importScript_(goog.basePath+b[e]);else throw Error(\"U\
+ndefined script input\");},goog.getPathFromDeps_=function(a){return a in goog.d\
+ependencies_.nameToPath?goog.dependencies_.nameToPath[a]: null},goog.findBasePa\
+th_(),goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+\"deps.js\"\
+));goog.typeOf=function(a){var b=typeof a;if(b==\"object\")if(a){if(a instanceo\
+f Array)return\"array\";if(a instanceof Object)return b;var c=Object.prototype.\
+toString.call(a);if(c==\"[object Window]\")return\"object\";if(c==\"[object Arr\
+ay]\"||typeof a.length==\"number\"&&typeof a.splice!=\"undefined\"&&typeof a.pr\
+opertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"splice\"))return\"\
+array\";if(c==\"[object Function]\"||typeof a.call!=\"undefined\"&&typeof a.pro\
+pertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"call\"))return\"fun\
+ction\"}else return\"null\";else if(b==\"function\"&&typeof a.call==\"undefined\
+\")return\"object\";return b};goog.isDef=function(a){return a!==void 0};goog.is\
+Null=function(a){return a===null};goog.isDefAndNotNull=function(a){return a!=nu\
+ll};goog.isArray=function(a){return goog.typeOf(a)==\"array\"};goog.isArrayLike\
+=function(a){var b=goog.typeOf(a);return b==\"array\"||b==\"object\"&&typeof a.\
+length==\"number\"};goog.isDateLike=function(a){return goog.isObject(a)&&typeof\
+ a.getFullYear==\"function\"};goog.isString=function(a){return typeof a==\"stri\
+ng\"};goog.isBoolean=function(a){return typeof a==\"boolean\"};goog.isNumber=fu\
+nction(a){return typeof a==\"number\"};goog.isFunction=function(a){return goog.\
+typeOf(a)==\"function\"};goog.isObject=function(a){var b=typeof a;return b==\"o\
+bject\"&&a!=null||b==\"function\"};goog.getUid=function(a){return a[goog.UID_PR\
+OPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.removeUid=function(a\
+){\"removeAttribute\"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[g\
+oog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_=\"closure_uid_\"+Math.floor(2\
+147483648*Math.random()).toString(36);goog.uidCounter_=0;goog.getHashCode=goog.\
+getUid;goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=go\
+og.typeOf(a);if(b==\"object\"||b==\"array\"){if(a.clone)return a.clone();var b=\
+b==\"array\"?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};\
+goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)};goog.bi\
+ndJs_=function(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.pr\
+ototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.c\
+all(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f\
+unction(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){goog.bind=Fun\
+ction.prototype.bind&&Function.prototype.bind.toString().indexOf(\"native code\
+\")!=-1?goog.bindNative_:goog.bindJs_;return goog.bind.apply(null,arguments)};g\
+oog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return \
+function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,c);ret\
+urn a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.n\
+ow=Date.now||function(){return+new Date};goog.globalEval=function(a){if(goog.gl\
+obal.execScript)goog.global.execScript(a,\"JavaScript\");else if(goog.global.ev\
+al){if(goog.evalWorksForGlobals_==null){goog.global.eval(\"var _et_ = 1;\");if(\
+typeof goog.global._et_!=\"undefined\"){delete goog.global._et_;goog.evalWorksF\
+orGlobals_=true}else goog.evalWorksForGlobals_=false}if(goog.evalWorksForGlobal\
+s_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement(\"scri\
+pt\");c.type=\"text/javascript\";c.defer=false;c.appendChild(b.createTextNode(a\
+));b.body.appendChild(c);b.body.removeChild(c)}}else throw Error(\"goog.globalE\
+val not available\");};goog.evalWorksForGlobals_=null;goog.getCssName=function(\
+a,b){var c=function(a){return goog.cssNameMapping_[a]||a},d=function(a){for(var\
+ a=a.split(\"-\"),b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join(\"-\")}\
+,d=goog.cssNameMapping_?goog.cssNameMappingStyle_==\"BY_WHOLE\"?c:d:function(a)\
+{return a};return b?a+\"-\"+d(b):d(a)};goog.setCssNameMapping=function(a,b){goo\
+g.cssNameMapping_=a;goog.cssNameMappingStyle_=b};!COMPILED&&goog.global.CLOSURE\
+_CSS_NAME_MAPPING&&(goog.cssNameMapping_=goog.global.CLOSURE_CSS_NAME_MAPPING);\
+goog.getMsg=function(a,b){var c=b||{},d;for(d in c)var e=(\"\"+c[d]).replace(/\
+\\$/g,\"$$$$\"),a=a.replace(RegExp(\"\\\\{\\\\$\"+d+\"\\\\}\",\"gi\"),e);return\
+ a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};goog.exportPrope\
+rty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototy\
+pe=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.construc\
+tor=a};goog.base=function(a,b,c){var d=arguments.callee.caller;if(d.superClass_\
+)return d.superClass_.constructor.apply(a,Array.prototype.slice.call(arguments,\
+1));for(var e=Array.prototype.slice.call(arguments,2),g=false,f=a.constructor;f\
+;f=f.superClass_&&f.superClass_.constructor)if(f.prototype[b]===d)g=true;else i\
+f(g)return f.prototype[b].apply(a,e);if(a[b]===d)return a.constructor.prototype\
+[b].apply(a,e);throw Error(\"goog.base called from a method of one name to a me\
+thod of a different name\");};goog.scope=function(a){a.call(goog.global)};"
+
+var JQUERY_JS = "/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function\
+(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.par\
+entWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo\
+(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){ck||(ck=c.create\
+Element(\"iframe\"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!\
+cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.wri\
+te((f.support.boxModel?\"<!doctype html>\":\"\")+\"<html><body>\"),cl.close();d\
+=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,\"display\"),b.removeChil\
+d(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],\
+cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr()\
+{setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObjec\
+t(\"Microsoft.XMLHTTP\")}catch(b){}}function ch(){try{return new a.XMLHttpReque\
+st}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var\
+ d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1\
+)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h\
+]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\
+\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=\
+e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\
+\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}\
+return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h\
+,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h\
+=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[\
+i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.\
+converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j\
+);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||b\
+D.test(a)?d(a,e):b_(a+\"[\"+(typeof e==\"object\"?b:\"\")+\"]\",e,c,d)});else i\
+f(!c&&f.type(b)===\"object\")for(var e in b)b_(a+\"[\"+e+\"]\",b[e],c,d);else d\
+(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]\
+!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g)\
+{f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;f\
+or(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataT\
+ypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=bZ(a,c,d,e,\"*\",g))\
+;return l}function bY(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\
+\");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;fo\
+r(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[\
+j?\"unshift\":\"push\"](c)}}}function bB(a,b,c){var d=b===\"width\"?a.offsetWid\
+th:a.offsetHeight,e=b===\"width\"?1:0,g=4;if(d>0){if(c!==\"border\")for(;e<g;e+\
+=2)c||(d-=parseFloat(f.css(a,\"padding\"+bx[e]))||0),c===\"margin\"?d+=parseFlo\
+at(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0;r\
+eturn d+\"px\"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=\
+parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,\"padding\"+bx[e]))||\
+0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0),c===\
+\"margin\"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+\"px\"}function bo(a)\
+{var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;retur\
+n b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"inpu\
+t\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(\
+a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||\
+a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.ge\
+tElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.queryS\
+electorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;b\
+.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mer\
+geAttributes(a),c=b.nodeName.toLowerCase(),c===\"object\"?b.outerHTML=a.outerHT\
+ML:c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"?c===\"option\"?b.se\
+lected=a.defaultSelected:c===\"input\"||c===\"textarea\"?b.defaultValue=a.defau\
+ltValue:c===\"script\"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.default\
+Checked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttr\
+ibute(f.expando),b.removeAttribute(\"_submit_attached\"),b.removeAttribute(\"_c\
+hange_attached\"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,\
+e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(\
+c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f\
+.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getEleme\
+ntsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\
+\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.cre\
+ateElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b\
+=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);re\
+turn e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(\
+typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.t\
+est(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){re\
+turn f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNod\
+e.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){v\
+ar d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!\
+f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,\
+e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b \
+in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!\
+1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replac\
+e(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d\
+===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?+d:j.test(d)?f\
+.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g\
+[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var\
+ c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isRead\
+y){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.r\
+eady()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/\
+^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<\
+(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u\
+[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:\
+[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(\
+opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv\
+:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toU\
+pperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.\
+hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototyp\
+e.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:func\
+tion(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a\
+,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=\
+c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.cha\
+rAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,\
+null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d\
+:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a\
+,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable\
+?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElem\
+entById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1\
+,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f)\
+.find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.sel\
+ector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray\
+(a,this)},selector:\"\",jquery:\"1.7.2\",length:0,size:function(){return this.l\
+ength},toArray:function(){return F.call(this,0)},get:function(a){return a==null\
+?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var \
+d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d\
+.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \
+\":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:f\
+unction(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);\
+return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)}\
+,first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:\
+function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(argum\
+ents).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b\
+,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constr\
+uctor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.e\
+xtend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments\
+.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"ob\
+ject\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=argumen\
+ts[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject\
+(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)\
+?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:func\
+tion(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,rea\
+dyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){i\
+f(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.re\
+ady,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.tr\
+igger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e\
+.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.\
+ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.\
+addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"on\
+readystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameE\
+lement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:functio\
+n(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return\
+ e.type(a)===\"array\"},isWindow:function(a){return a!=null&&a==a.window},isNum\
+eric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){ret\
+urn a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a\
+||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.construct\
+or&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\
+\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isE\
+mptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){thro\
+w new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b\
+=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o\
+,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))()\
+;e.error(\"Invalid JSON: \"+b)},parseXML:function(c){if(typeof c!=\"string\"||!\
+c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"\
+text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loa\
+dXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsere\
+rror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globa\
+lEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b\
+)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:fun\
+ction(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:\
+function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f\
+ in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)br\
+eak}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c\
+.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\
+\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(\
+l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.leng\
+th==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.cal\
+l(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H\
+.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c\
+]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.len\
+gth==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d+\
++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=\
+0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a\
+,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"\
+&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=n\
+ull&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);ret\
+urn h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){v\
+ar d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=func\
+tion(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.g\
+uid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.\
+length;if(d&&typeof d==\"object\"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}el\
+se if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.cal\
+l(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(\
+a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(n\
+ew Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.ex\
+ec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1\
+]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.in\
+it(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.cons\
+tructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanc\
+eof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;va\
+r b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array D\
+ate RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowe\
+rCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=\
+z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\x\
+A0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventLis\
+tener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.read\
+yState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});re\
+turn e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,\
+l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h\
+===\"array\"?n(g):h===\"function\"&&(!a.unique||!p.has(g))&&c.push(g)},o=functi\
+on(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;\
+m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p\
+.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:funct\
+ion(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1\
+]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<\
+e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.spl\
+ice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.le\
+ngth;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return t\
+his},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock\
+:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return\
+!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));r\
+eturn this},fire:function(){p.fireWith(this,arguments);return this},fired:funct\
+ion(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b\
+=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"me\
+mory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,\
+progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired\
+,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:functio\
+n(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:functio\
+n(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"r\
+eject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunctio\
+n(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.pro\
+mise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i\
+[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h\
+)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]\
+=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(functio\
+n(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a)\
+{function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b\
+,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.\
+call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.\
+length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j\
+.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?\
+b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j\
+.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l\
+,m,n,o,p=c.createElement(\"div\"),q=c.documentElement;p.setAttribute(\"classNam\
+e\",\"t\"),p.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;f\
+loat:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=p.getElementsByTagNam\
+e(\"*\"),e=p.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.c\
+reateElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=p.getEl\
+ementsByTagName(\"input\")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tb\
+ody:!p.getElementsByTagName(\"tbody\").length,htmlSerialize:!!p.getElementsByTa\
+gName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormaliz\
+ed:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssF\
+loat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetA\
+ttribute:p.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5C\
+lone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submi\
+tBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0\
+,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMarg\
+in:!0},f.boxModel=b.boxModel=c.compatMode===\"CSS1Compat\",i.checked=!0,b.noClo\
+neChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{d\
+elete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.\
+fireEvent&&(p.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),p.cloneNod\
+e(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setA\
+ttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"chec\
+ked\",\"checked\"),i.setAttribute(\"name\",\"t\"),p.appendChild(i),j=c.createDo\
+cumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneN\
+ode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendCh\
+ild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=\"on\"+n,o=m in\
+ p,o||(p.setAttribute(m,\"return;\"),o=typeof p[m]==\"function\"),b[n+\"Bubbles\
+\"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,\
+t,u=c.getElementsByTagName(\"body\")[0];!u||(m=1,t=\"padding:0;margin:0;border:\
+\",r=\"position:absolute;top:0;left:0;width:1px;height:1px;\",s=t+\"0;visibilit\
+y:hidden;\",n=\"style='\"+r+t+\"5px solid #000;\",q=\"<div \"+n+\"display:block\
+;'><div style='\"+t+\"0;display:block;overflow:hidden;'></div></div>\"+\"<table\
+ \"+n+\"' cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",d=c\
+.createElement(\"div\"),d.style.cssText=s+\"width:0;height:0;position:static;to\
+p:0;margin-top:\"+m+\"px\",u.insertBefore(d,u.firstChild),p=c.createElement(\"d\
+iv\"),d.appendChild(p),p.innerHTML=\"<table><tr><td style='\"+t+\"0;display:non\
+e'></td><td>t</td></tr></table>\",k=p.getElementsByTagName(\"td\"),o=k[0].offse\
+tHeight===0,k[0].style.display=\"\",k[1].style.display=\"none\",b.reliableHidde\
+nOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML=\"\",l=c.cre\
+ateElement(\"div\"),l.style.width=\"0\",l.style.marginRight=\"0\",p.style.width\
+=\"2px\",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l\
+,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=\"undefi\
+ned\"&&(p.innerHTML=\"\",p.style.width=p.style.padding=\"1px\",p.style.border=0\
+,p.style.overflow=\"hidden\",p.style.display=\"inline\",p.style.zoom=1,b.inline\
+BlockNeedsLayout=p.offsetWidth===3,p.style.display=\"block\",p.style.overflow=\
+\"visible\",p.innerHTML=\"<div style='width:5px;'></div>\",b.shrinkWrapBlocks=p\
+.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChi\
+ld,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,do\
+esAddBorderForTableAndCells:i.offsetTop===5},g.style.position=\"fixed\",g.style\
+.top=\"20px\",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.positi\
+on=g.style.top=\"\",e.style.overflow=\"hidden\",e.style.position=\"relative\",j\
+.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginIn\
+BodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop=\"1%\",b.pixe\
+lMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==\"1%\"),typeof \
+d.style.zoom!=\"undefined\"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.ext\
+end(b,j))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({\
+cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\
+\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",ap\
+plet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];re\
+turn!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expa\
+ndo,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"\
+events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.u\
+uid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeo\
+f c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m\
+[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])\
+return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},remove\
+Data:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j\
+=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArra\
+y(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g\
+=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){de\
+lete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delet\
+e j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.re\
+moveAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},ac\
+ceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if\
+(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data\
+:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f\
+.data(j);if(j.nodeType===1&&!f._data(j,\"parsedAttrs\")){g=j.attributes;for(i=g\
+.length;k<i;k++)h=g[k].name,h.indexOf(\"data-\")===0&&(h=f.camelCase(h.substrin\
+g(5)),l(j,h,m[h]));f._data(j,\"parsedAttrs\",!0)}}return m}if(typeof a==\"objec\
+t\")return this.each(function(){f.data(this,a)});d=a.split(\".\",2),d[1]=d[1]?\
+\".\"+d[1]:\"\",e=d[1]+\"!\";return f.access(this,function(c){if(c===b){m=this.\
+triggerHandler(\"getData\"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));retur\
+n m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.tri\
+ggerHandler(\"setData\"+e,d),f.data(this,a,c),b.triggerHandler(\"changeData\"+e\
+,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.e\
+ach(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b\
+||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a\
+!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1\
+)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,\
+b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=\
+f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b\
+||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),\
+d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,func\
+tion(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0\
+),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=\"str\
+ing\"&&(c=a,a=\"fx\",d--);if(arguments.length<d)return f.queue(this[0],a);retur\
+n c===b?this:this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"\
+inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(functio\
+n(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"\
+fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){\
+clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},pro\
+mise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&\
+&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j\
+=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,\
+b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++\
+,l.add(m);m();return d.promise(c)}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/\
+^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea\
+)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|lo\
+op|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttrib\
+ute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,argum\
+ents.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr\
+(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length\
+>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{t\
+his[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if\
+(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,th\
+is.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length\
+;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className\
+=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b\
+[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:fu\
+nction(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(t\
+his).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a\
+===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeTy\
+pe===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,\
+j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}el\
+se g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=ty\
+peof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).tog\
+gleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c=\
+==\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasC\
+lass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"b\
+oolean\")this.className&&f._data(this,\"__className__\",this.className),this.cl\
+assName=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},ha\
+sClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c\
+].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)\
+return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){\
+e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType\
+===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\
+\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHo\
+oks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(\"set\"in c)||\
+c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHo\
+oks[g.nodeName.toLowerCase()];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)ret\
+urn d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}\
+}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!\
+b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selecte\
+dIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=\
+j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.di\
+sabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeNa\
+me(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.\
+length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeA\
+rray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).v\
+al(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,h\
+tml:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var\
+ g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a\
+)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!\
+f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b\
+){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!\
+==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a\
+,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:funct\
+ion(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d\
+.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,\"\
+\"),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:funct\
+ion(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be c\
+hanged\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")\
+){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{ge\
+t:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?\
+a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a\
+,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\"\
+:\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cell\
+Spacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",u\
+semap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\
+\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=\
+i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\
+\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==nul\
+l?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabi\
+ndex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a\
+.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:fu\
+nction(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getA\
+ttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d\
+;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c\
+,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.butt\
+on={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue\
+!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNod\
+e(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\
+\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b)\
+{f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAt\
+tribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:f\
+unction(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized\
+||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f\
+.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===nu\
+ll?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style\
+.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f\
+.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:\
+function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.s\
+electedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\
+\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[th\
+is]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}})\
+,f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHook\
+s[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(\
+),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,\
+B=/(?:^|\\s)hover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(\
+?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/\
+,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&\
+new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var\
+ c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.\
+id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function\
+(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};\
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===\
+3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.se\
+lector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(\
+h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!=\
+=a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).s\
+plit(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").sp\
+lit(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s\
+=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:\
+d.guid,selector:g,quick:g&&G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m\
+]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListen\
+er?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(\
+s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateC\
+ount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a\
+,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g\
+.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[\
+h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);conti\
+nue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.\
+length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\
+\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType\
+)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\
+\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p\
+.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a\
+,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.ha\
+ndle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent\
+:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeT\
+ype!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f\
+.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\
+\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[\
+h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Even\
+t(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\
+\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\
+\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.ca\
+che;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.ele\
+m,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.un\
+shift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)retur\
+n;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h\
+,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&\
+&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.\
+length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"e\
+vents\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acc\
+eptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrev\
+ented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\
+\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\
+\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.t\
+riggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:f\
+unction(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.typ\
+e]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namesp\
+ace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateT\
+arget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button\
+||c.type!==\"click\")){n=f(this),n.context=this.ownerDocument||this;for(m=c.tar\
+get;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k\
+<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&\
+r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,m\
+atches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c\
+.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStop\
+ped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.n\
+amespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s\
+.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(\
+c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(t\
+his,c);return c.result}},props:\"attrChange attrName relatedNode srcElement alt\
+Key bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget s\
+hiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\
+\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&\
+(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"\
+button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX \
+screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.\
+fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.do\
+cumentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-\
+(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.s\
+crollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relat\
+edTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?\
+2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.\
+fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(\
+g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.\
+target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a\
+.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},l\
+oad:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusou\
+t\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload\
+=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)\
+}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated\
+:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e\
+.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.r\
+emoveEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.remov\
+eEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c\
+)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);\
+a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defa\
+ultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:\
+J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[\
+f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPreve\
+nted=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.retu\
+rnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.\
+originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},s\
+topImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.st\
+opPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropaga\
+tionStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},functi\
+on(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=\
+this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c\
+,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f\
+.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName\
+(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",fu\
+nction(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.\
+form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){a.\
+_submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submi\
+t_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simul\
+ate(\"submit\",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,\
+\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles\
+||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.t\
+ype===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._ch\
+ange\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_chan\
+ged=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a\
+.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});re\
+turn!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z\
+.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",funct\
+ion(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\
+\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a\
+.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\
+\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:functio\
+n(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support\
+.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var\
+ d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.spec\
+ial[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function\
+(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,\
+g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=d||c,c=b);for(i in\
+ a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typ\
+eof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this\
+;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.\
+guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)}\
+)},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a\
+.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.names\
+pace?e.origType+\".\"+e.namespace:e.origType,e.selector,e.handler);return this}\
+if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!\
+1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.e\
+vent.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unb\
+ind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.contex\
+t).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a\
+,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.o\
+n(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"\
+**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.even\
+t.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.t\
+rigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d\
+=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\
+\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)\
+||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:funct\
+ion(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focu\
+sin focusout load resize scroll unload click dblclick mousedown mouseup mousemo\
+ve mouseover mouseout mouseenter mouseleave change select submit keydown keypre\
+ss keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c\
+==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger\
+(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHook\
+s),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(\
+a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];w\
+hile(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset\
+=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).leng\
+th>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length\
+;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];\
+break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){\
+k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\
+\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~\
+])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\"\
+.\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\
+\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d|\
+|c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\
+\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.\
+exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>\
+1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.rela\
+tive[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.s\
+hift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0\
+])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter\
+(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.\
+length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.ex\
+pr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop()\
+,r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=\
+w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.a\
+pply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[\
+t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)\
+k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e\
+));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.\
+length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){ret\
+urn m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a])\
+.length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.or\
+der.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1\
+,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.f\
+ind[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.\
+getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{se\
+t:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&\
+&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].\
+exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.len\
+gth-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,\
+s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++\
+)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b\
+){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==nu\
+ll)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Sy\
+ntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c\
+,d=a.nodeType,e=\"\";if(d){if(d===1||d===9||d===11){if(typeof a.textContent==\"\
+string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerT\
+ext.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3|\
+|d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));ret\
+urn e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00\
+c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\
+\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\
+\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\
+\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\
+\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+\
+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first\
+|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\
+\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:\
+{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:funct\
+ion(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\
+\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.te\
+st(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]\
+){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCas\
+e()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\
+\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a\
+[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(\
+;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}}\
+,\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.to\
+LowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f\
+=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"prev\
+iousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!\
+=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}\
+},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b\
+.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"nam\
+e\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typ\
+eof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}}\
+,preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f\
+)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.classNa\
+me+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1\
+));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){retu\
+rn a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2\
+]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\
+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.te\
+st(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.er\
+ror(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace\
+(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(\
+j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,\
+e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]\
+=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);re\
+turn!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return\
+ b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){retur\
+n a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled=\
+==!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentN\
+ode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){retu\
+rn!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){re\
+turn!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text\
+:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerC\
+ase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.\
+nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){re\
+turn a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function\
+(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:fu\
+nction(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},s\
+ubmit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"bu\
+tton\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()\
+===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCas\
+e();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(\
+a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b=\
+==\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.no\
+deName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilter\
+s:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length\
+-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:fun\
+ction(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(\
+a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO\
+:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"co\
+ntains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e\
+===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;retu\
+rn!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){cas\
+e\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if\
+(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===\
+1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g\
+=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.next\
+Sibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j\
+===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\
+\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&\
+a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.\
+getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=\
+m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttr\
+ibute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f=\
+==\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>\
+=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-\
+g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},\
+POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=\
+o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.matc\
+h[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.left\
+Match[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\
+\\\\(\\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slic\
+e.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slic\
+e.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var\
+ c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);\
+else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);els\
+e for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumen\
+tPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition\
+||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.com\
+pareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.s\
+ourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],\
+g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)r\
+eturn 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parent\
+Node;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k\
+],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)retur\
+n c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),f\
+unction(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.\
+documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChi\
+ld),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!\
+=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e\
+.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[\
+e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefine\
+d\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.r\
+emoveChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChi\
+ld(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=f\
+unction(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(v\
+ar e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a\
+ href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&\
+&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){re\
+turn a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var \
+a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'><\
+/p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=funct\
+ion(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\
+\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.\
+getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)retu\
+rn s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.bo\
+dy)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.pare\
+ntNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelect\
+orAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"obj\
+ect\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.tes\
+t(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentN\
+ode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r\
+){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e\
+]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.moz\
+MatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.ca\
+ll(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!\
+='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\
+\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.\
+test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.node\
+Type!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(\
+){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div c\
+lass='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"\
+e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\")\
+.length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){i\
+f(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClas\
+sName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){ret\
+urn a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosi\
+tion?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.cont\
+ains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).do\
+cumentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=\
+[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace\
+(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)\
+m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find\
+=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text\
+=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:pa\
+rents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=\
+f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend(\
+{find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(fun\
+ction(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=th\
+is.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f\
+.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]\
+){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filte\
+r(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})\
+},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:functio\
+n(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a\
+&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(\
+a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g\
+=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.\
+length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode\
+,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(\
+d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matches\
+Selector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g\
+.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"clos\
+est\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevA\
+ll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.\
+inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a\
+,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushSt\
+ack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.pr\
+evObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType\
+!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:\
+function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth\
+(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},\
+nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return\
+ f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextS\
+ibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},s\
+iblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children\
+:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.node\
+Name(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.ch\
+ildNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)\
+||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.uni\
+que(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pus\
+hStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c\
+&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0\
+]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeT\
+ype!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];\
+return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&\
+&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)\
+a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|b\
+di|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|met\
+er|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|nu\
+ll)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:\
+]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style\
+)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")[\
+\\\\s/>]\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)sc\
+ript/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='mul\
+tiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<\
+table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<\
+table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><\
+colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\
+\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.capt\
+ion=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\
+\"</div>\"]),f.fn.extend({text:function(a){return f.access(this,function(a){ret\
+urn a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).\
+createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFuncti\
+on(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]\
+){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insert\
+Before(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.no\
+deType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:functi\
+on(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(\
+this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.\
+wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.ea\
+ch(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return \
+this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(th\
+is.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,fun\
+ction(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return th\
+is.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,thi\
+s.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.d\
+omManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(argu\
+ments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return t\
+his.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].pa\
+rentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBe\
+fore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"aft\
+er\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a\
+,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nod\
+eType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),f.cleanData([d])),d.pare\
+ntNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b\
+;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\
+\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function\
+(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(th\
+is,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},\
+d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,\"\"):nu\
+ll;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(\
+a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\
+\");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsBy\
+TagName(\"*\")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a\
+,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(\
+f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replace\
+With(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.ea\
+ch(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).\
+before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?\
+a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},do\
+mManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&argume\
+nts.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(\
+this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var \
+g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&\
+&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===t\
+his.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes\
+.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for\
+(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable\
+||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({t\
+ype:\"GET\",global:!1,url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.\
+text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b\
+.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var\
+ e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment|\
+|(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\
+\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone|\
+|!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFr\
+agment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheabl\
+e:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBe\
+fore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b)\
+{f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g\
+&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return \
+this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[\
+h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clon\
+e:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(\"<\
+\"+a.nodeName+\">\")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.supp\
+ort.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h)\
+,d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(\
+a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,\
+b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerD\
+ocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof \
+l==\"number\"&&(l+=\"\");if(!l)continue;if(typeof l==\"string\")if(!_.test(l))l\
+=b.createTextNode(l);else{l=l.replace(Y,\"<$1></$2>\");var m=(Z.exec(l)||[\"\",\
+\"\"])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(\"div\"),\
+q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+\
+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===\"tab\
+le\"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===\"<table>\"&&!s?p.childNo\
+des:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],\"tbody\")&&!t[i].childNodes.l\
+ength&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l\
+)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p\
+&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.\
+parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (\
+u=l.length)==\"number\")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l\
+):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[\
+k];k++){h=j[k];if(e&&f.nodeName(h,\"script\")&&(!h.type||be.test(h.type)))e.pus\
+h(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.g\
+rep(h.getElementsByTagName(\"script\"),g);j.splice.apply(j,[k+1,0].concat(v))}d\
+.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.s\
+pecial,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeNam\
+e&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b\
+&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.\
+handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&\
+&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\\([^)]*\\)/i,bq=/o\
+pacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\\-+]?(?:\\d*\\.)?\\d+$/i,bt=/^-?(?:\\d\
+*\\.)?\\d+(?!px)[^\\d\\s]+$/i,bu=/^([\\-+])=([\\-+.\\de]+)/,bv=/^margin/,bw={po\
+sition:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Top\",\"Righ\
+t\",\"Bottom\",\"Left\"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,f\
+unction(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)}\
+,f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,\"opacity\");r\
+eturn c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,font\
+Weight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssP\
+rops:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(\
+a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCa\
+se(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&\
+&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bu.ex\
+ec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h==\
+=\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k\
+||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d\
+){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&\
+&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return b\
+y(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]\
+=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defau\
+ltView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style\
+;b=b.replace(br,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.ge\
+tComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.owner\
+Document.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.te\
+st(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.docum\
+entElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.curren\
+tStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runti\
+meStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.lef\
+t=b===\"fontSize\"?\"1em\":f,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.l\
+eft=d));return f===\"\"?\"auto\":f}),by=bz||bA,f.each([\"height\",\"width\"],fu\
+nction(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB\
+(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.\
+test(b)?b+\"px\":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b\
+){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\"\
+)?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,\
+d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.fi\
+lter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,\"\"))===\"\"){c.rem\
+oveAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(b\
+p,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.margi\
+nRight={get:function(a,b){return f.swap(a,{display:\"inline-block\"},function()\
+{return b?by(a,\"margin-right\"):a.style.marginRight})}})}),f.expr&&f.expr.filt\
+ers&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;re\
+turn b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display|\
+|f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.\
+expr.filters.hidden(a)}),f.each({margin:\"\",padding:\"\",border:\"Width\"},fun\
+ction(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==\"string\"?c.s\
+plit(\" \"):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}\
+});var bC=/%20/g,bD=/\\[\\]$/,bE=/\\r?\\n/g,bF=/#.*$/,bG=/^(.*?):[ \\t]*([^\\r\
+\\n]*)\\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|nu\
+mber|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\\-s\
+torage|.+\\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\\/\\//,bL=/\
+\\?/,bM=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bN=/^(?:select\
+|textarea)/i,bO=/\\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\
+\\/?#:]*)(?::(\\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[\"*/\"]+[\"*\"];try\
+{bU=e.href}catch(bX){bU=c.createElement(\"a\"),bU.href=\"\",bU=bU.href}bV=bQ.ex\
+ec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"strin\
+g\"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.ind\
+exOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&\
+(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.tr\
+aditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:\
+c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a)\
+{c=a}),i.html(g?f(\"<div>\").append(c.replace(bM,\"\")).find(g):c)),d&&i.each(d\
+,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArr\
+ay())},serializeArray:function(){return this.map(function(){return this.element\
+s?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.d\
+isabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(funct\
+ion(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(\
+a,c){return{name:b.name,value:a.replace(bE,\"\\r\\n\")}}):{name:b.name,value:c.\
+replace(bE,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete aja\
+xError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){re\
+turn this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,\
+e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,succe\
+ss:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"scr\
+ipt\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:functio\
+n(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSett\
+ings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:\"GET\",contentType:\"applic\
+ation/x-www-form-urlencoded;charset=UTF-8\",processData:!0,async:!0,accepts:{xm\
+l:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"a\
+pplication/json, text/javascript\",\"*\":bW},contents:{xml:/xml/,html:/html/,js\
+on:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converter\
+s:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":\
+f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport\
+:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q)\
+,p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200\
+&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))\
+f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w\
+=\"notmodified\",o=!0;else try{r=cb(d,x),w=\"success\",o=!0}catch(A){w=\"parser\
+error\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\
+\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),\
+j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[\
+v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxS\
+top\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.co\
+ntext||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.\
+Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={\
+readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]\
+=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:nu\
+ll},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n\
+))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},override\
+MimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"ab\
+ort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=\
+v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)\
+j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\
+\"\").replace(bF,\"\").replace(bK,bV[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\
+\"*\").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCas\
+e()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]===\"http:\"?80:\
+443))==(bV[3]||(bV[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.da\
+ta!=\"string\"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)re\
+turn!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&\
+f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url\
++=(bL.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){v\
+ar x=f.now(),y=d.url.replace(bP,\"$1_=\"+x);d.url=y+(y===d.url?(bL.test(d.url)?\
+\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.conte\
+ntType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k|\
+|d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModifi\
+ed[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequest\
+Header(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTyp\
+es[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bW+\";q=0.01\":\"\"):d.accepts[\"*\"]);fo\
+r(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeS\
+end.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,com\
+plete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readySta\
+te=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(funct\
+ion(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-\
+1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.i\
+sFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b\
+)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainO\
+bject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g\
+,a[g],c,e);return d.join(\"&\").replace(bC,\"+\")}}),f.extend({active:0,lastMod\
+ified:{},etag:{}});var cc=f.now(),cd=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp\
+:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cc++}}),f.ajaxPre\
+filter(\"json jsonp\",function(b,c,d){var e=typeof b.data==\"string\"&&/^applic\
+ation\\/x\\-www\\-form\\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===\"\
+jsonp\"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCal\
+lback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=\
+b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e\
+&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"\
++h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.\
+isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error\
+(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}\
+),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, appli\
+cation/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecm\
+ascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),\
+f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&\
+&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.cro\
+ssDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElemen\
+t;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.s\
+criptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatech\
+ange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.\
+onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200\
+,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1\
+)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg\
+;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}\
+:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a}\
+)}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.cros\
+sDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.us\
+ername?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c\
+.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.o\
+verrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requeste\
+d-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setReq\
+uestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e)\
+{var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.\
+noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.get\
+AllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m\
+.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal\
+&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(\
+j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce\
+)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},\
+ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,co,c\
+p=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"]\
+,[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\
+\"opacity\"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return t\
+his.animate(ct(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d\
+.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style\
+.display=\"\"),(e===\"\"&&f.css(d,\"display\")===\"none\"||!f.contains(d.ownerD\
+ocument.documentElement,d))&&f._data(d,\"olddisplay\",cu(d.nodeName)));for(g=0;\
+g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.st\
+yle.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){\
+if(a||a===0)return this.animate(ct(\"hide\",3),a,b,c);var d,e,g=0,h=this.length\
+;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data\
+(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&\
+&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:funct\
+ion(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._t\
+oggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).i\
+s(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(ct(\"toggle\",3),a\
+,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css\
+(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c\
+,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeTy\
+pe===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties=\
+{};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks\
+[g])&&\"expand\"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i\
+])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):\
+b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\
+\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"\
+height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX\
+,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\
+\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)===\"inlin\
+e\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(\
+this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(\
+h)?(q=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),q?(f._\
+data(this,\"toggle\"+i,q===\"show\"?\"hide\":\"show\"),j[q]()):j[h]()):(m=cn.ex\
+ec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?\"\":\"px\"),p!==\
+\"px\"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&\
+&(o=(m[1]===\"-=\"?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,\"\"));return!0}var\
+ e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.e\
+xtend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:functi\
+on(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[\
+]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0\
+),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==n\
+ull)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);e\
+lse g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===thi\
+s&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));\
+(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct(\"show\",1),slideUp:ct(\"\
+hide\",1),slideToggle:ct(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opaci\
+ty:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,\
+c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&t\
+ypeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,durat\
+ion:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.durat\
+ion==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.\
+fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.comple\
+te,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.deque\
+ue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){\
+return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:func\
+tion(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.pr\
+ototype={update:function(){this.options.step&&this.options.step.call(this.elem,\
+this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function()\
+{if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==\
+null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isN\
+aN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a\
+){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.no\
+w=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.\
+prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=func\
+tion(){f._data(e.elem,\"fxshow\"+e.prop)===b&&(e.options.hide?f._data(e.elem,\"\
+fxshow\"+e.prop,e.start):e.options.show&&f._data(e.elem,\"fxshow\"+e.prop,e.end\
+))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:funct\
+ion(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop\
+]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.c\
+ur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur(\
+)),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(th\
+is.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!\
+0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.\
+elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.\
+pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.an\
+imatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!\
+f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"o\
+verflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.a\
+nimatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.remo\
+veData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.\
+duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.\
+pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this\
+.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.exte\
+nd(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&\
+b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){cl\
+earInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:\
+function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.styl\
+e&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=\
+a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf(\"margin\")&&(f\
+.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&\
+f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,fun\
+ction(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body\
+|html)$/i;\"getBoundingClientRect\"in c.documentElement?cv=function(a,b,c,d){tr\
+y{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d\
+.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTo\
+p||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scr\
+ollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scroll\
+Left,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=\
+a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.cu\
+rrentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){i\
+f(f.support.fixedPosition&&j.position===\"fixed\")break;d=i?i.getComputedStyle(\
+a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+\
+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndC\
+ells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(\
+d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverfl\
+owNotVisible&&d.overflow!==\"visible\"&&(k+=parseFloat(d.borderTopWidth)||0,l+=\
+parseFloat(d.borderLeftWidth)||0),j=d}if(j.position===\"relative\"||j.position=\
+==\"static\")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position\
+===\"fixed\"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.\
+scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)\
+return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=th\
+is[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.body\
+Offset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){va\
+r b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=\
+parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0\
+);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d\
+===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(\
+a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\
+\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFl\
+oat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(\
+k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.usi\
+ng.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return nul\
+l;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?\
+{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=\
+parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTop\
+Width\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:\
+c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(functi\
+on(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"p\
+osition\")===\"static\")a=a.offsetParent;return a})}}),f.each({scrollLeft:\"pag\
+eXOffset\",scrollTop:\"pageYOffset\"},function(a,c){var d=/Y/.test(c);f.fn[a]=f\
+unction(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c\
+ in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e\
+]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arg\
+uments.length,null)}}),f.each({Height:\"height\",Width:\"width\"},function(a,c)\
+{var d=\"client\"+a,e=\"scroll\"+a,g=\"offset\"+a;f.fn[\"inner\"+a]=function(){\
+var a=this[0];return a?a.style?parseFloat(f.css(a,c,\"padding\")):this[c]():nul\
+l},f.fn[\"outer\"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.cs\
+s(b,c,a?\"margin\":\"border\")):this[c]():null},f.fn[c]=function(a){return f.ac\
+cess(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.docume\
+ntElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType==\
+=9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e\
+],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?\
+l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==\
+\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){re\
+turn f})})(windowmock);"
+
+function cacheBust(str, old) {
+  var replacement = old;
+  for (var i = 1; i < salt % 16 + 2; i++) {
+    replacement += ((salt + i * 7) % 36).toString(36);
+  }
+  return str.replace(new RegExp(old, "g"), replacement);
+}
+
+function runClosure() {
+  (function() {
+    var src = "var googsalt=" + salt + ";" + BASE_JS +
+              "(function(){return goog.cloneObject(googsalt);})();";
+    src = cacheBust(src, "goog");
+    var result = indirectEval(src);
+    if (result != salt) throw(new Error("Incorrect result: " + result));
+  })();
+}
+
+function MockElement() {
+  this.appendChild = function(a) {};
+  this.createComment = function(a) {};
+  this.createDocumentFragment = function() { return new MockElement(); };
+  this.createElement = function(a) { return new MockElement(); };
+  this.documentElement = this;
+  this.getElementById = function(a) { return 0; };
+  this.getElementsByTagName = function(a) {return [0];};
+  this.insertBefore = function(a, b) {};
+  this.removeChild = function(a) {};
+  this.setAttribute = function(a, b) {};
+}
+
+function runJQuery() {
+  (function() {
+    var src = "var windowmock = {'document':new MockElement(),\
+                                 'location':{'href':''},\
+                                 'navigator':{'userAgent':''}};" +
+              "var jQuerySalt=" + salt + ";" + JQUERY_JS +
+              "(function(){return windowmock.jQuery.grep([jQuerySalt],\
+              function(a,b){return true;})[0];})();";
+    src = cacheBust(src, "jQuery");
+    var result = indirectEval(src);
+    if (result != salt) throw(new Error("Incorrect result: " + result));
+  })();
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/crypto.js b/suite/cts/deviceTests/browserbench/assets/octane/crypto.js
new file mode 100644
index 0000000..531ad45
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/crypto.js
@@ -0,0 +1,1698 @@
+/*
+ * Copyright (c) 2003-2005  Tom Wu
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
+ * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * In addition, the following condition applies:
+ *
+ * All redistributions must retain an intact copy of this copyright notice
+ * and disclaimer.
+ */
+
+
+// The code has been adapted for use as a benchmark by Google.
+var Crypto = new BenchmarkSuite('Crypto', 266181, [
+  new Benchmark("Encrypt", encrypt),
+  new Benchmark("Decrypt", decrypt)
+]);
+
+
+// Basic JavaScript BN library - subset useful for RSA encryption.
+
+// Bits per digit
+var dbits;
+var BI_DB;
+var BI_DM;
+var BI_DV;
+
+var BI_FP;
+var BI_FV;
+var BI_F1;
+var BI_F2;
+
+// JavaScript engine analysis
+var canary = 0xdeadbeefcafe;
+var j_lm = ((canary&0xffffff)==0xefcafe);
+
+// (public) Constructor
+function BigInteger(a,b,c) {
+  this.array = new Array();
+  if(a != null)
+    if("number" == typeof a) this.fromNumber(a,b,c);
+    else if(b == null && "string" != typeof a) this.fromString(a,256);
+    else this.fromString(a,b);
+}
+
+// return new, unset BigInteger
+function nbi() { return new BigInteger(null); }
+
+// am: Compute w_j += (x*this_i), propagate carries,
+// c is initial carry, returns final carry.
+// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+// We need to select the fastest one that works in this environment.
+
+// am1: use a single mult and divide to get the high bits,
+// max digit bits should be 26 because
+// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+function am1(i,x,w,j,c,n) {
+  var this_array = this.array;
+  var w_array    = w.array;
+  while(--n >= 0) {
+    var v = x*this_array[i++]+w_array[j]+c;
+    c = Math.floor(v/0x4000000);
+    w_array[j++] = v&0x3ffffff;
+  }
+  return c;
+}
+
+// am2 avoids a big mult-and-extract completely.
+// Max digit bits should be <= 30 because we do bitwise ops
+// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+function am2(i,x,w,j,c,n) {
+  var this_array = this.array;
+  var w_array    = w.array;
+  var xl = x&0x7fff, xh = x>>15;
+  while(--n >= 0) {
+    var l = this_array[i]&0x7fff;
+    var h = this_array[i++]>>15;
+    var m = xh*l+h*xl;
+    l = xl*l+((m&0x7fff)<<15)+w_array[j]+(c&0x3fffffff);
+    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
+    w_array[j++] = l&0x3fffffff;
+  }
+  return c;
+}
+
+// Alternately, set max digit bits to 28 since some
+// browsers slow down when dealing with 32-bit numbers.
+function am3(i,x,w,j,c,n) {
+  var this_array = this.array;
+  var w_array    = w.array;
+
+  var xl = x&0x3fff, xh = x>>14;
+  while(--n >= 0) {
+    var l = this_array[i]&0x3fff;
+    var h = this_array[i++]>>14;
+    var m = xh*l+h*xl;
+    l = xl*l+((m&0x3fff)<<14)+w_array[j]+c;
+    c = (l>>28)+(m>>14)+xh*h;
+    w_array[j++] = l&0xfffffff;
+  }
+  return c;
+}
+
+// This is tailored to VMs with 2-bit tagging. It makes sure
+// that all the computations stay within the 29 bits available.
+function am4(i,x,w,j,c,n) {
+  var this_array = this.array;
+  var w_array    = w.array;
+
+  var xl = x&0x1fff, xh = x>>13;
+  while(--n >= 0) {
+    var l = this_array[i]&0x1fff;
+    var h = this_array[i++]>>13;
+    var m = xh*l+h*xl;
+    l = xl*l+((m&0x1fff)<<13)+w_array[j]+c;
+    c = (l>>26)+(m>>13)+xh*h;
+    w_array[j++] = l&0x3ffffff;
+  }
+  return c;
+}
+
+// am3/28 is best for SM, Rhino, but am4/26 is best for v8.
+// Kestrel (Opera 9.5) gets its best result with am4/26.
+// IE7 does 9% better with am3/28 than with am4/26.
+// Firefox (SM) gets 10% faster with am3/28 than with am4/26.
+
+setupEngine = function(fn, bits) {
+  BigInteger.prototype.am = fn;
+  dbits = bits;
+
+  BI_DB = dbits;
+  BI_DM = ((1<<dbits)-1);
+  BI_DV = (1<<dbits);
+
+  BI_FP = 52;
+  BI_FV = Math.pow(2,BI_FP);
+  BI_F1 = BI_FP-dbits;
+  BI_F2 = 2*dbits-BI_FP;
+}
+
+
+// Digit conversions
+var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+var BI_RC = new Array();
+var rr,vv;
+rr = "0".charCodeAt(0);
+for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
+rr = "a".charCodeAt(0);
+for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
+rr = "A".charCodeAt(0);
+for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
+
+function int2char(n) { return BI_RM.charAt(n); }
+function intAt(s,i) {
+  var c = BI_RC[s.charCodeAt(i)];
+  return (c==null)?-1:c;
+}
+
+// (protected) copy this to r
+function bnpCopyTo(r) {
+  var this_array = this.array;
+  var r_array    = r.array;
+
+  for(var i = this.t-1; i >= 0; --i) r_array[i] = this_array[i];
+  r.t = this.t;
+  r.s = this.s;
+}
+
+// (protected) set from integer value x, -DV <= x < DV
+function bnpFromInt(x) {
+  var this_array = this.array;
+  this.t = 1;
+  this.s = (x<0)?-1:0;
+  if(x > 0) this_array[0] = x;
+  else if(x < -1) this_array[0] = x+DV;
+  else this.t = 0;
+}
+
+// return bigint initialized to value
+function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
+
+// (protected) set from string and radix
+function bnpFromString(s,b) {
+  var this_array = this.array;
+  var k;
+  if(b == 16) k = 4;
+  else if(b == 8) k = 3;
+  else if(b == 256) k = 8; // byte array
+  else if(b == 2) k = 1;
+  else if(b == 32) k = 5;
+  else if(b == 4) k = 2;
+  else { this.fromRadix(s,b); return; }
+  this.t = 0;
+  this.s = 0;
+  var i = s.length, mi = false, sh = 0;
+  while(--i >= 0) {
+    var x = (k==8)?s[i]&0xff:intAt(s,i);
+    if(x < 0) {
+      if(s.charAt(i) == "-") mi = true;
+      continue;
+    }
+    mi = false;
+    if(sh == 0)
+      this_array[this.t++] = x;
+    else if(sh+k > BI_DB) {
+      this_array[this.t-1] |= (x&((1<<(BI_DB-sh))-1))<<sh;
+      this_array[this.t++] = (x>>(BI_DB-sh));
+    }
+    else
+      this_array[this.t-1] |= x<<sh;
+    sh += k;
+    if(sh >= BI_DB) sh -= BI_DB;
+  }
+  if(k == 8 && (s[0]&0x80) != 0) {
+    this.s = -1;
+    if(sh > 0) this_array[this.t-1] |= ((1<<(BI_DB-sh))-1)<<sh;
+  }
+  this.clamp();
+  if(mi) BigInteger.ZERO.subTo(this,this);
+}
+
+// (protected) clamp off excess high words
+function bnpClamp() {
+  var this_array = this.array;
+  var c = this.s&BI_DM;
+  while(this.t > 0 && this_array[this.t-1] == c) --this.t;
+}
+
+// (public) return string representation in given radix
+function bnToString(b) {
+  var this_array = this.array;
+  if(this.s < 0) return "-"+this.negate().toString(b);
+  var k;
+  if(b == 16) k = 4;
+  else if(b == 8) k = 3;
+  else if(b == 2) k = 1;
+  else if(b == 32) k = 5;
+  else if(b == 4) k = 2;
+  else return this.toRadix(b);
+  var km = (1<<k)-1, d, m = false, r = "", i = this.t;
+  var p = BI_DB-(i*BI_DB)%k;
+  if(i-- > 0) {
+    if(p < BI_DB && (d = this_array[i]>>p) > 0) { m = true; r = int2char(d); }
+    while(i >= 0) {
+      if(p < k) {
+        d = (this_array[i]&((1<<p)-1))<<(k-p);
+        d |= this_array[--i]>>(p+=BI_DB-k);
+      }
+      else {
+        d = (this_array[i]>>(p-=k))&km;
+        if(p <= 0) { p += BI_DB; --i; }
+      }
+      if(d > 0) m = true;
+      if(m) r += int2char(d);
+    }
+  }
+  return m?r:"0";
+}
+
+// (public) -this
+function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
+
+// (public) |this|
+function bnAbs() { return (this.s<0)?this.negate():this; }
+
+// (public) return + if this > a, - if this < a, 0 if equal
+function bnCompareTo(a) {
+  var this_array = this.array;
+  var a_array = a.array;
+
+  var r = this.s-a.s;
+  if(r != 0) return r;
+  var i = this.t;
+  r = i-a.t;
+  if(r != 0) return r;
+  while(--i >= 0) if((r=this_array[i]-a_array[i]) != 0) return r;
+  return 0;
+}
+
+// returns bit length of the integer x
+function nbits(x) {
+  var r = 1, t;
+  if((t=x>>>16) != 0) { x = t; r += 16; }
+  if((t=x>>8) != 0) { x = t; r += 8; }
+  if((t=x>>4) != 0) { x = t; r += 4; }
+  if((t=x>>2) != 0) { x = t; r += 2; }
+  if((t=x>>1) != 0) { x = t; r += 1; }
+  return r;
+}
+
+// (public) return the number of bits in "this"
+function bnBitLength() {
+  var this_array = this.array;
+  if(this.t <= 0) return 0;
+  return BI_DB*(this.t-1)+nbits(this_array[this.t-1]^(this.s&BI_DM));
+}
+
+// (protected) r = this << n*DB
+function bnpDLShiftTo(n,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  var i;
+  for(i = this.t-1; i >= 0; --i) r_array[i+n] = this_array[i];
+  for(i = n-1; i >= 0; --i) r_array[i] = 0;
+  r.t = this.t+n;
+  r.s = this.s;
+}
+
+// (protected) r = this >> n*DB
+function bnpDRShiftTo(n,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  for(var i = n; i < this.t; ++i) r_array[i-n] = this_array[i];
+  r.t = Math.max(this.t-n,0);
+  r.s = this.s;
+}
+
+// (protected) r = this << n
+function bnpLShiftTo(n,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  var bs = n%BI_DB;
+  var cbs = BI_DB-bs;
+  var bm = (1<<cbs)-1;
+  var ds = Math.floor(n/BI_DB), c = (this.s<<bs)&BI_DM, i;
+  for(i = this.t-1; i >= 0; --i) {
+    r_array[i+ds+1] = (this_array[i]>>cbs)|c;
+    c = (this_array[i]&bm)<<bs;
+  }
+  for(i = ds-1; i >= 0; --i) r_array[i] = 0;
+  r_array[ds] = c;
+  r.t = this.t+ds+1;
+  r.s = this.s;
+  r.clamp();
+}
+
+// (protected) r = this >> n
+function bnpRShiftTo(n,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  r.s = this.s;
+  var ds = Math.floor(n/BI_DB);
+  if(ds >= this.t) { r.t = 0; return; }
+  var bs = n%BI_DB;
+  var cbs = BI_DB-bs;
+  var bm = (1<<bs)-1;
+  r_array[0] = this_array[ds]>>bs;
+  for(var i = ds+1; i < this.t; ++i) {
+    r_array[i-ds-1] |= (this_array[i]&bm)<<cbs;
+    r_array[i-ds] = this_array[i]>>bs;
+  }
+  if(bs > 0) r_array[this.t-ds-1] |= (this.s&bm)<<cbs;
+  r.t = this.t-ds;
+  r.clamp();
+}
+
+// (protected) r = this - a
+function bnpSubTo(a,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  var a_array = a.array;
+  var i = 0, c = 0, m = Math.min(a.t,this.t);
+  while(i < m) {
+    c += this_array[i]-a_array[i];
+    r_array[i++] = c&BI_DM;
+    c >>= BI_DB;
+  }
+  if(a.t < this.t) {
+    c -= a.s;
+    while(i < this.t) {
+      c += this_array[i];
+      r_array[i++] = c&BI_DM;
+      c >>= BI_DB;
+    }
+    c += this.s;
+  }
+  else {
+    c += this.s;
+    while(i < a.t) {
+      c -= a_array[i];
+      r_array[i++] = c&BI_DM;
+      c >>= BI_DB;
+    }
+    c -= a.s;
+  }
+  r.s = (c<0)?-1:0;
+  if(c < -1) r_array[i++] = BI_DV+c;
+  else if(c > 0) r_array[i++] = c;
+  r.t = i;
+  r.clamp();
+}
+
+// (protected) r = this * a, r != this,a (HAC 14.12)
+// "this" should be the larger one if appropriate.
+function bnpMultiplyTo(a,r) {
+  var this_array = this.array;
+  var r_array = r.array;
+  var x = this.abs(), y = a.abs();
+  var y_array = y.array;
+
+  var i = x.t;
+  r.t = i+y.t;
+  while(--i >= 0) r_array[i] = 0;
+  for(i = 0; i < y.t; ++i) r_array[i+x.t] = x.am(0,y_array[i],r,i,0,x.t);
+  r.s = 0;
+  r.clamp();
+  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
+}
+
+// (protected) r = this^2, r != this (HAC 14.16)
+function bnpSquareTo(r) {
+  var x = this.abs();
+  var x_array = x.array;
+  var r_array = r.array;
+
+  var i = r.t = 2*x.t;
+  while(--i >= 0) r_array[i] = 0;
+  for(i = 0; i < x.t-1; ++i) {
+    var c = x.am(i,x_array[i],r,2*i,0,1);
+    if((r_array[i+x.t]+=x.am(i+1,2*x_array[i],r,2*i+1,c,x.t-i-1)) >= BI_DV) {
+      r_array[i+x.t] -= BI_DV;
+      r_array[i+x.t+1] = 1;
+    }
+  }
+  if(r.t > 0) r_array[r.t-1] += x.am(i,x_array[i],r,2*i,0,1);
+  r.s = 0;
+  r.clamp();
+}
+
+// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+// r != q, this != m.  q or r may be null.
+function bnpDivRemTo(m,q,r) {
+  var pm = m.abs();
+  if(pm.t <= 0) return;
+  var pt = this.abs();
+  if(pt.t < pm.t) {
+    if(q != null) q.fromInt(0);
+    if(r != null) this.copyTo(r);
+    return;
+  }
+  if(r == null) r = nbi();
+  var y = nbi(), ts = this.s, ms = m.s;
+  var pm_array = pm.array;
+  var nsh = BI_DB-nbits(pm_array[pm.t-1]);	// normalize modulus
+  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
+  else { pm.copyTo(y); pt.copyTo(r); }
+  var ys = y.t;
+
+  var y_array = y.array;
+  var y0 = y_array[ys-1];
+  if(y0 == 0) return;
+  var yt = y0*(1<<BI_F1)+((ys>1)?y_array[ys-2]>>BI_F2:0);
+  var d1 = BI_FV/yt, d2 = (1<<BI_F1)/yt, e = 1<<BI_F2;
+  var i = r.t, j = i-ys, t = (q==null)?nbi():q;
+  y.dlShiftTo(j,t);
+
+  var r_array = r.array;
+  if(r.compareTo(t) >= 0) {
+    r_array[r.t++] = 1;
+    r.subTo(t,r);
+  }
+  BigInteger.ONE.dlShiftTo(ys,t);
+  t.subTo(y,y);	// "negative" y so we can replace sub with am later
+  while(y.t < ys) y_array[y.t++] = 0;
+  while(--j >= 0) {
+    // Estimate quotient digit
+    var qd = (r_array[--i]==y0)?BI_DM:Math.floor(r_array[i]*d1+(r_array[i-1]+e)*d2);
+    if((r_array[i]+=y.am(0,qd,r,j,0,ys)) < qd) {	// Try it out
+      y.dlShiftTo(j,t);
+      r.subTo(t,r);
+      while(r_array[i] < --qd) r.subTo(t,r);
+    }
+  }
+  if(q != null) {
+    r.drShiftTo(ys,q);
+    if(ts != ms) BigInteger.ZERO.subTo(q,q);
+  }
+  r.t = ys;
+  r.clamp();
+  if(nsh > 0) r.rShiftTo(nsh,r);	// Denormalize remainder
+  if(ts < 0) BigInteger.ZERO.subTo(r,r);
+}
+
+// (public) this mod a
+function bnMod(a) {
+  var r = nbi();
+  this.abs().divRemTo(a,null,r);
+  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
+  return r;
+}
+
+// Modular reduction using "classic" algorithm
+function Classic(m) { this.m = m; }
+function cConvert(x) {
+  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
+  else return x;
+}
+function cRevert(x) { return x; }
+function cReduce(x) { x.divRemTo(this.m,null,x); }
+function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+Classic.prototype.convert = cConvert;
+Classic.prototype.revert = cRevert;
+Classic.prototype.reduce = cReduce;
+Classic.prototype.mulTo = cMulTo;
+Classic.prototype.sqrTo = cSqrTo;
+
+// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+// justification:
+//         xy == 1 (mod m)
+//         xy =  1+km
+//   xy(2-xy) = (1+km)(1-km)
+// x[y(2-xy)] = 1-k^2m^2
+// x[y(2-xy)] == 1 (mod m^2)
+// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+// JS multiply "overflows" differently from C/C++, so care is needed here.
+function bnpInvDigit() {
+  var this_array = this.array;
+  if(this.t < 1) return 0;
+  var x = this_array[0];
+  if((x&1) == 0) return 0;
+  var y = x&3;		// y == 1/x mod 2^2
+  y = (y*(2-(x&0xf)*y))&0xf;	// y == 1/x mod 2^4
+  y = (y*(2-(x&0xff)*y))&0xff;	// y == 1/x mod 2^8
+  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;	// y == 1/x mod 2^16
+  // last step - calculate inverse mod DV directly;
+  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+  y = (y*(2-x*y%BI_DV))%BI_DV;		// y == 1/x mod 2^dbits
+  // we really want the negative inverse, and -DV < y < DV
+  return (y>0)?BI_DV-y:-y;
+}
+
+// Montgomery reduction
+function Montgomery(m) {
+  this.m = m;
+  this.mp = m.invDigit();
+  this.mpl = this.mp&0x7fff;
+  this.mph = this.mp>>15;
+  this.um = (1<<(BI_DB-15))-1;
+  this.mt2 = 2*m.t;
+}
+
+// xR mod m
+function montConvert(x) {
+  var r = nbi();
+  x.abs().dlShiftTo(this.m.t,r);
+  r.divRemTo(this.m,null,r);
+  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
+  return r;
+}
+
+// x/R mod m
+function montRevert(x) {
+  var r = nbi();
+  x.copyTo(r);
+  this.reduce(r);
+  return r;
+}
+
+// x = x/R mod m (HAC 14.32)
+function montReduce(x) {
+  var x_array = x.array;
+  while(x.t <= this.mt2)	// pad x so am has enough room later
+    x_array[x.t++] = 0;
+  for(var i = 0; i < this.m.t; ++i) {
+    // faster way of calculating u0 = x[i]*mp mod DV
+    var j = x_array[i]&0x7fff;
+    var u0 = (j*this.mpl+(((j*this.mph+(x_array[i]>>15)*this.mpl)&this.um)<<15))&BI_DM;
+    // use am to combine the multiply-shift-add into one call
+    j = i+this.m.t;
+    x_array[j] += this.m.am(0,u0,x,i,0,this.m.t);
+    // propagate carry
+    while(x_array[j] >= BI_DV) { x_array[j] -= BI_DV; x_array[++j]++; }
+  }
+  x.clamp();
+  x.drShiftTo(this.m.t,x);
+  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
+}
+
+// r = "x^2/R mod m"; x != r
+function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+// r = "xy/R mod m"; x,y != r
+function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+
+Montgomery.prototype.convert = montConvert;
+Montgomery.prototype.revert = montRevert;
+Montgomery.prototype.reduce = montReduce;
+Montgomery.prototype.mulTo = montMulTo;
+Montgomery.prototype.sqrTo = montSqrTo;
+
+// (protected) true iff this is even
+function bnpIsEven() {
+  var this_array = this.array;
+  return ((this.t>0)?(this_array[0]&1):this.s) == 0;
+}
+
+// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+function bnpExp(e,z) {
+  if(e > 0xffffffff || e < 1) return BigInteger.ONE;
+  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
+  g.copyTo(r);
+  while(--i >= 0) {
+    z.sqrTo(r,r2);
+    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
+    else { var t = r; r = r2; r2 = t; }
+  }
+  return z.revert(r);
+}
+
+// (public) this^e % m, 0 <= e < 2^32
+function bnModPowInt(e,m) {
+  var z;
+  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
+  return this.exp(e,z);
+}
+
+// protected
+BigInteger.prototype.copyTo = bnpCopyTo;
+BigInteger.prototype.fromInt = bnpFromInt;
+BigInteger.prototype.fromString = bnpFromString;
+BigInteger.prototype.clamp = bnpClamp;
+BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+BigInteger.prototype.lShiftTo = bnpLShiftTo;
+BigInteger.prototype.rShiftTo = bnpRShiftTo;
+BigInteger.prototype.subTo = bnpSubTo;
+BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+BigInteger.prototype.squareTo = bnpSquareTo;
+BigInteger.prototype.divRemTo = bnpDivRemTo;
+BigInteger.prototype.invDigit = bnpInvDigit;
+BigInteger.prototype.isEven = bnpIsEven;
+BigInteger.prototype.exp = bnpExp;
+
+// public
+BigInteger.prototype.toString = bnToString;
+BigInteger.prototype.negate = bnNegate;
+BigInteger.prototype.abs = bnAbs;
+BigInteger.prototype.compareTo = bnCompareTo;
+BigInteger.prototype.bitLength = bnBitLength;
+BigInteger.prototype.mod = bnMod;
+BigInteger.prototype.modPowInt = bnModPowInt;
+
+// "constants"
+BigInteger.ZERO = nbv(0);
+BigInteger.ONE = nbv(1);
+// Copyright (c) 2005  Tom Wu
+// All Rights Reserved.
+// See "LICENSE" for details.
+
+// Extended JavaScript BN functions, required for RSA private ops.
+
+// (public)
+function bnClone() { var r = nbi(); this.copyTo(r); return r; }
+
+// (public) return value as integer
+function bnIntValue() {
+  var this_array = this.array;
+  if(this.s < 0) {
+    if(this.t == 1) return this_array[0]-BI_DV;
+    else if(this.t == 0) return -1;
+  }
+  else if(this.t == 1) return this_array[0];
+  else if(this.t == 0) return 0;
+  // assumes 16 < DB < 32
+  return ((this_array[1]&((1<<(32-BI_DB))-1))<<BI_DB)|this_array[0];
+}
+
+// (public) return value as byte
+function bnByteValue() {
+  var this_array = this.array;
+  return (this.t==0)?this.s:(this_array[0]<<24)>>24;
+}
+
+// (public) return value as short (assumes DB>=16)
+function bnShortValue() {
+  var this_array = this.array;
+  return (this.t==0)?this.s:(this_array[0]<<16)>>16;
+}
+
+// (protected) return x s.t. r^x < DV
+function bnpChunkSize(r) { return Math.floor(Math.LN2*BI_DB/Math.log(r)); }
+
+// (public) 0 if this == 0, 1 if this > 0
+function bnSigNum() {
+  var this_array = this.array;
+  if(this.s < 0) return -1;
+  else if(this.t <= 0 || (this.t == 1 && this_array[0] <= 0)) return 0;
+  else return 1;
+}
+
+// (protected) convert to radix string
+function bnpToRadix(b) {
+  if(b == null) b = 10;
+  if(this.signum() == 0 || b < 2 || b > 36) return "0";
+  var cs = this.chunkSize(b);
+  var a = Math.pow(b,cs);
+  var d = nbv(a), y = nbi(), z = nbi(), r = "";
+  this.divRemTo(d,y,z);
+  while(y.signum() > 0) {
+    r = (a+z.intValue()).toString(b).substr(1) + r;
+    y.divRemTo(d,y,z);
+  }
+  return z.intValue().toString(b) + r;
+}
+
+// (protected) convert from radix string
+function bnpFromRadix(s,b) {
+  this.fromInt(0);
+  if(b == null) b = 10;
+  var cs = this.chunkSize(b);
+  var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
+  for(var i = 0; i < s.length; ++i) {
+    var x = intAt(s,i);
+    if(x < 0) {
+      if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
+      continue;
+    }
+    w = b*w+x;
+    if(++j >= cs) {
+      this.dMultiply(d);
+      this.dAddOffset(w,0);
+      j = 0;
+      w = 0;
+    }
+  }
+  if(j > 0) {
+    this.dMultiply(Math.pow(b,j));
+    this.dAddOffset(w,0);
+  }
+  if(mi) BigInteger.ZERO.subTo(this,this);
+}
+
+// (protected) alternate constructor
+function bnpFromNumber(a,b,c) {
+  if("number" == typeof b) {
+    // new BigInteger(int,int,RNG)
+    if(a < 2) this.fromInt(1);
+    else {
+      this.fromNumber(a,c);
+      if(!this.testBit(a-1))	// force MSB set
+        this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
+      if(this.isEven()) this.dAddOffset(1,0); // force odd
+      while(!this.isProbablePrime(b)) {
+        this.dAddOffset(2,0);
+        if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
+      }
+    }
+  }
+  else {
+    // new BigInteger(int,RNG)
+    var x = new Array(), t = a&7;
+    x.length = (a>>3)+1;
+    b.nextBytes(x);
+    if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
+    this.fromString(x,256);
+  }
+}
+
+// (public) convert to bigendian byte array
+function bnToByteArray() {
+  var this_array = this.array;
+  var i = this.t, r = new Array();
+  r[0] = this.s;
+  var p = BI_DB-(i*BI_DB)%8, d, k = 0;
+  if(i-- > 0) {
+    if(p < BI_DB && (d = this_array[i]>>p) != (this.s&BI_DM)>>p)
+      r[k++] = d|(this.s<<(BI_DB-p));
+    while(i >= 0) {
+      if(p < 8) {
+        d = (this_array[i]&((1<<p)-1))<<(8-p);
+        d |= this_array[--i]>>(p+=BI_DB-8);
+      }
+      else {
+        d = (this_array[i]>>(p-=8))&0xff;
+        if(p <= 0) { p += BI_DB; --i; }
+      }
+      if((d&0x80) != 0) d |= -256;
+      if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
+      if(k > 0 || d != this.s) r[k++] = d;
+    }
+  }
+  return r;
+}
+
+function bnEquals(a) { return(this.compareTo(a)==0); }
+function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
+function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
+
+// (protected) r = this op a (bitwise)
+function bnpBitwiseTo(a,op,r) {
+  var this_array = this.array;
+  var a_array    = a.array;
+  var r_array    = r.array;
+  var i, f, m = Math.min(a.t,this.t);
+  for(i = 0; i < m; ++i) r_array[i] = op(this_array[i],a_array[i]);
+  if(a.t < this.t) {
+    f = a.s&BI_DM;
+    for(i = m; i < this.t; ++i) r_array[i] = op(this_array[i],f);
+    r.t = this.t;
+  }
+  else {
+    f = this.s&BI_DM;
+    for(i = m; i < a.t; ++i) r_array[i] = op(f,a_array[i]);
+    r.t = a.t;
+  }
+  r.s = op(this.s,a.s);
+  r.clamp();
+}
+
+// (public) this & a
+function op_and(x,y) { return x&y; }
+function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
+
+// (public) this | a
+function op_or(x,y) { return x|y; }
+function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
+
+// (public) this ^ a
+function op_xor(x,y) { return x^y; }
+function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
+
+// (public) this & ~a
+function op_andnot(x,y) { return x&~y; }
+function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
+
+// (public) ~this
+function bnNot() {
+  var this_array = this.array;
+  var r = nbi();
+  var r_array = r.array;
+
+  for(var i = 0; i < this.t; ++i) r_array[i] = BI_DM&~this_array[i];
+  r.t = this.t;
+  r.s = ~this.s;
+  return r;
+}
+
+// (public) this << n
+function bnShiftLeft(n) {
+  var r = nbi();
+  if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
+  return r;
+}
+
+// (public) this >> n
+function bnShiftRight(n) {
+  var r = nbi();
+  if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
+  return r;
+}
+
+// return index of lowest 1-bit in x, x < 2^31
+function lbit(x) {
+  if(x == 0) return -1;
+  var r = 0;
+  if((x&0xffff) == 0) { x >>= 16; r += 16; }
+  if((x&0xff) == 0) { x >>= 8; r += 8; }
+  if((x&0xf) == 0) { x >>= 4; r += 4; }
+  if((x&3) == 0) { x >>= 2; r += 2; }
+  if((x&1) == 0) ++r;
+  return r;
+}
+
+// (public) returns index of lowest 1-bit (or -1 if none)
+function bnGetLowestSetBit() {
+  var this_array = this.array;
+  for(var i = 0; i < this.t; ++i)
+    if(this_array[i] != 0) return i*BI_DB+lbit(this_array[i]);
+  if(this.s < 0) return this.t*BI_DB;
+  return -1;
+}
+
+// return number of 1 bits in x
+function cbit(x) {
+  var r = 0;
+  while(x != 0) { x &= x-1; ++r; }
+  return r;
+}
+
+// (public) return number of set bits
+function bnBitCount() {
+  var r = 0, x = this.s&BI_DM;
+  for(var i = 0; i < this.t; ++i) r += cbit(this_array[i]^x);
+  return r;
+}
+
+// (public) true iff nth bit is set
+function bnTestBit(n) {
+  var this_array = this.array;
+  var j = Math.floor(n/BI_DB);
+  if(j >= this.t) return(this.s!=0);
+  return((this_array[j]&(1<<(n%BI_DB)))!=0);
+}
+
+// (protected) this op (1<<n)
+function bnpChangeBit(n,op) {
+  var r = BigInteger.ONE.shiftLeft(n);
+  this.bitwiseTo(r,op,r);
+  return r;
+}
+
+// (public) this | (1<<n)
+function bnSetBit(n) { return this.changeBit(n,op_or); }
+
+// (public) this & ~(1<<n)
+function bnClearBit(n) { return this.changeBit(n,op_andnot); }
+
+// (public) this ^ (1<<n)
+function bnFlipBit(n) { return this.changeBit(n,op_xor); }
+
+// (protected) r = this + a
+function bnpAddTo(a,r) {
+  var this_array = this.array;
+  var a_array = a.array;
+  var r_array = r.array;
+  var i = 0, c = 0, m = Math.min(a.t,this.t);
+  while(i < m) {
+    c += this_array[i]+a_array[i];
+    r_array[i++] = c&BI_DM;
+    c >>= BI_DB;
+  }
+  if(a.t < this.t) {
+    c += a.s;
+    while(i < this.t) {
+      c += this_array[i];
+      r_array[i++] = c&BI_DM;
+      c >>= BI_DB;
+    }
+    c += this.s;
+  }
+  else {
+    c += this.s;
+    while(i < a.t) {
+      c += a_array[i];
+      r_array[i++] = c&BI_DM;
+      c >>= BI_DB;
+    }
+    c += a.s;
+  }
+  r.s = (c<0)?-1:0;
+  if(c > 0) r_array[i++] = c;
+  else if(c < -1) r_array[i++] = BI_DV+c;
+  r.t = i;
+  r.clamp();
+}
+
+// (public) this + a
+function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
+
+// (public) this - a
+function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
+
+// (public) this * a
+function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
+
+// (public) this / a
+function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
+
+// (public) this % a
+function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
+
+// (public) [this/a,this%a]
+function bnDivideAndRemainder(a) {
+  var q = nbi(), r = nbi();
+  this.divRemTo(a,q,r);
+  return new Array(q,r);
+}
+
+// (protected) this *= n, this >= 0, 1 < n < DV
+function bnpDMultiply(n) {
+  var this_array = this.array;
+  this_array[this.t] = this.am(0,n-1,this,0,0,this.t);
+  ++this.t;
+  this.clamp();
+}
+
+// (protected) this += n << w words, this >= 0
+function bnpDAddOffset(n,w) {
+  var this_array = this.array;
+  while(this.t <= w) this_array[this.t++] = 0;
+  this_array[w] += n;
+  while(this_array[w] >= BI_DV) {
+    this_array[w] -= BI_DV;
+    if(++w >= this.t) this_array[this.t++] = 0;
+    ++this_array[w];
+  }
+}
+
+// A "null" reducer
+function NullExp() {}
+function nNop(x) { return x; }
+function nMulTo(x,y,r) { x.multiplyTo(y,r); }
+function nSqrTo(x,r) { x.squareTo(r); }
+
+NullExp.prototype.convert = nNop;
+NullExp.prototype.revert = nNop;
+NullExp.prototype.mulTo = nMulTo;
+NullExp.prototype.sqrTo = nSqrTo;
+
+// (public) this^e
+function bnPow(e) { return this.exp(e,new NullExp()); }
+
+// (protected) r = lower n words of "this * a", a.t <= n
+// "this" should be the larger one if appropriate.
+function bnpMultiplyLowerTo(a,n,r) {
+  var r_array = r.array;
+  var a_array = a.array;
+  var i = Math.min(this.t+a.t,n);
+  r.s = 0; // assumes a,this >= 0
+  r.t = i;
+  while(i > 0) r_array[--i] = 0;
+  var j;
+  for(j = r.t-this.t; i < j; ++i) r_array[i+this.t] = this.am(0,a_array[i],r,i,0,this.t);
+  for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a_array[i],r,i,0,n-i);
+  r.clamp();
+}
+
+// (protected) r = "this * a" without lower n words, n > 0
+// "this" should be the larger one if appropriate.
+function bnpMultiplyUpperTo(a,n,r) {
+  var r_array = r.array;
+  var a_array = a.array;
+  --n;
+  var i = r.t = this.t+a.t-n;
+  r.s = 0; // assumes a,this >= 0
+  while(--i >= 0) r_array[i] = 0;
+  for(i = Math.max(n-this.t,0); i < a.t; ++i)
+    r_array[this.t+i-n] = this.am(n-i,a_array[i],r,0,0,this.t+i-n);
+  r.clamp();
+  r.drShiftTo(1,r);
+}
+
+// Barrett modular reduction
+function Barrett(m) {
+  // setup Barrett
+  this.r2 = nbi();
+  this.q3 = nbi();
+  BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
+  this.mu = this.r2.divide(m);
+  this.m = m;
+}
+
+function barrettConvert(x) {
+  if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
+  else if(x.compareTo(this.m) < 0) return x;
+  else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
+}
+
+function barrettRevert(x) { return x; }
+
+// x = x mod m (HAC 14.42)
+function barrettReduce(x) {
+  x.drShiftTo(this.m.t-1,this.r2);
+  if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
+  this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
+  this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
+  while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
+  x.subTo(this.r2,x);
+  while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
+}
+
+// r = x^2 mod m; x != r
+function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
+
+// r = x*y mod m; x,y != r
+function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
+
+Barrett.prototype.convert = barrettConvert;
+Barrett.prototype.revert = barrettRevert;
+Barrett.prototype.reduce = barrettReduce;
+Barrett.prototype.mulTo = barrettMulTo;
+Barrett.prototype.sqrTo = barrettSqrTo;
+
+// (public) this^e % m (HAC 14.85)
+function bnModPow(e,m) {
+  var e_array = e.array;
+  var i = e.bitLength(), k, r = nbv(1), z;
+  if(i <= 0) return r;
+  else if(i < 18) k = 1;
+  else if(i < 48) k = 3;
+  else if(i < 144) k = 4;
+  else if(i < 768) k = 5;
+  else k = 6;
+  if(i < 8)
+    z = new Classic(m);
+  else if(m.isEven())
+    z = new Barrett(m);
+  else
+    z = new Montgomery(m);
+
+  // precomputation
+  var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
+  g[1] = z.convert(this);
+  if(k > 1) {
+    var g2 = nbi();
+    z.sqrTo(g[1],g2);
+    while(n <= km) {
+      g[n] = nbi();
+      z.mulTo(g2,g[n-2],g[n]);
+      n += 2;
+    }
+  }
+
+  var j = e.t-1, w, is1 = true, r2 = nbi(), t;
+  i = nbits(e_array[j])-1;
+  while(j >= 0) {
+    if(i >= k1) w = (e_array[j]>>(i-k1))&km;
+    else {
+      w = (e_array[j]&((1<<(i+1))-1))<<(k1-i);
+      if(j > 0) w |= e_array[j-1]>>(BI_DB+i-k1);
+    }
+
+    n = k;
+    while((w&1) == 0) { w >>= 1; --n; }
+    if((i -= n) < 0) { i += BI_DB; --j; }
+    if(is1) {	// ret == 1, don't bother squaring or multiplying it
+      g[w].copyTo(r);
+      is1 = false;
+    }
+    else {
+      while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
+      if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
+      z.mulTo(r2,g[w],r);
+    }
+
+    while(j >= 0 && (e_array[j]&(1<<i)) == 0) {
+      z.sqrTo(r,r2); t = r; r = r2; r2 = t;
+      if(--i < 0) { i = BI_DB-1; --j; }
+    }
+  }
+  return z.revert(r);
+}
+
+// (public) gcd(this,a) (HAC 14.54)
+function bnGCD(a) {
+  var x = (this.s<0)?this.negate():this.clone();
+  var y = (a.s<0)?a.negate():a.clone();
+  if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
+  var i = x.getLowestSetBit(), g = y.getLowestSetBit();
+  if(g < 0) return x;
+  if(i < g) g = i;
+  if(g > 0) {
+    x.rShiftTo(g,x);
+    y.rShiftTo(g,y);
+  }
+  while(x.signum() > 0) {
+    if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
+    if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
+    if(x.compareTo(y) >= 0) {
+      x.subTo(y,x);
+      x.rShiftTo(1,x);
+    }
+    else {
+      y.subTo(x,y);
+      y.rShiftTo(1,y);
+    }
+  }
+  if(g > 0) y.lShiftTo(g,y);
+  return y;
+}
+
+// (protected) this % n, n < 2^26
+function bnpModInt(n) {
+  var this_array = this.array;
+  if(n <= 0) return 0;
+  var d = BI_DV%n, r = (this.s<0)?n-1:0;
+  if(this.t > 0)
+    if(d == 0) r = this_array[0]%n;
+    else for(var i = this.t-1; i >= 0; --i) r = (d*r+this_array[i])%n;
+  return r;
+}
+
+// (public) 1/this % m (HAC 14.61)
+function bnModInverse(m) {
+  var ac = m.isEven();
+  if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
+  var u = m.clone(), v = this.clone();
+  var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
+  while(u.signum() != 0) {
+    while(u.isEven()) {
+      u.rShiftTo(1,u);
+      if(ac) {
+        if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
+        a.rShiftTo(1,a);
+      }
+      else if(!b.isEven()) b.subTo(m,b);
+      b.rShiftTo(1,b);
+    }
+    while(v.isEven()) {
+      v.rShiftTo(1,v);
+      if(ac) {
+        if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
+        c.rShiftTo(1,c);
+      }
+      else if(!d.isEven()) d.subTo(m,d);
+      d.rShiftTo(1,d);
+    }
+    if(u.compareTo(v) >= 0) {
+      u.subTo(v,u);
+      if(ac) a.subTo(c,a);
+      b.subTo(d,b);
+    }
+    else {
+      v.subTo(u,v);
+      if(ac) c.subTo(a,c);
+      d.subTo(b,d);
+    }
+  }
+  if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
+  if(d.compareTo(m) >= 0) return d.subtract(m);
+  if(d.signum() < 0) d.addTo(m,d); else return d;
+  if(d.signum() < 0) return d.add(m); else return d;
+}
+
+var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
+var lplim = (1<<26)/lowprimes[lowprimes.length-1];
+
+// (public) test primality with certainty >= 1-.5^t
+function bnIsProbablePrime(t) {
+  var i, x = this.abs();
+  var x_array = x.array;
+  if(x.t == 1 && x_array[0] <= lowprimes[lowprimes.length-1]) {
+    for(i = 0; i < lowprimes.length; ++i)
+      if(x_array[0] == lowprimes[i]) return true;
+    return false;
+  }
+  if(x.isEven()) return false;
+  i = 1;
+  while(i < lowprimes.length) {
+    var m = lowprimes[i], j = i+1;
+    while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
+    m = x.modInt(m);
+    while(i < j) if(m%lowprimes[i++] == 0) return false;
+  }
+  return x.millerRabin(t);
+}
+
+// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+function bnpMillerRabin(t) {
+  var n1 = this.subtract(BigInteger.ONE);
+  var k = n1.getLowestSetBit();
+  if(k <= 0) return false;
+  var r = n1.shiftRight(k);
+  t = (t+1)>>1;
+  if(t > lowprimes.length) t = lowprimes.length;
+  var a = nbi();
+  for(var i = 0; i < t; ++i) {
+    a.fromInt(lowprimes[i]);
+    var y = a.modPow(r,this);
+    if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+      var j = 1;
+      while(j++ < k && y.compareTo(n1) != 0) {
+        y = y.modPowInt(2,this);
+        if(y.compareTo(BigInteger.ONE) == 0) return false;
+      }
+      if(y.compareTo(n1) != 0) return false;
+    }
+  }
+  return true;
+}
+
+// protected
+BigInteger.prototype.chunkSize = bnpChunkSize;
+BigInteger.prototype.toRadix = bnpToRadix;
+BigInteger.prototype.fromRadix = bnpFromRadix;
+BigInteger.prototype.fromNumber = bnpFromNumber;
+BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+BigInteger.prototype.changeBit = bnpChangeBit;
+BigInteger.prototype.addTo = bnpAddTo;
+BigInteger.prototype.dMultiply = bnpDMultiply;
+BigInteger.prototype.dAddOffset = bnpDAddOffset;
+BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+BigInteger.prototype.modInt = bnpModInt;
+BigInteger.prototype.millerRabin = bnpMillerRabin;
+
+// public
+BigInteger.prototype.clone = bnClone;
+BigInteger.prototype.intValue = bnIntValue;
+BigInteger.prototype.byteValue = bnByteValue;
+BigInteger.prototype.shortValue = bnShortValue;
+BigInteger.prototype.signum = bnSigNum;
+BigInteger.prototype.toByteArray = bnToByteArray;
+BigInteger.prototype.equals = bnEquals;
+BigInteger.prototype.min = bnMin;
+BigInteger.prototype.max = bnMax;
+BigInteger.prototype.and = bnAnd;
+BigInteger.prototype.or = bnOr;
+BigInteger.prototype.xor = bnXor;
+BigInteger.prototype.andNot = bnAndNot;
+BigInteger.prototype.not = bnNot;
+BigInteger.prototype.shiftLeft = bnShiftLeft;
+BigInteger.prototype.shiftRight = bnShiftRight;
+BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+BigInteger.prototype.bitCount = bnBitCount;
+BigInteger.prototype.testBit = bnTestBit;
+BigInteger.prototype.setBit = bnSetBit;
+BigInteger.prototype.clearBit = bnClearBit;
+BigInteger.prototype.flipBit = bnFlipBit;
+BigInteger.prototype.add = bnAdd;
+BigInteger.prototype.subtract = bnSubtract;
+BigInteger.prototype.multiply = bnMultiply;
+BigInteger.prototype.divide = bnDivide;
+BigInteger.prototype.remainder = bnRemainder;
+BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+BigInteger.prototype.modPow = bnModPow;
+BigInteger.prototype.modInverse = bnModInverse;
+BigInteger.prototype.pow = bnPow;
+BigInteger.prototype.gcd = bnGCD;
+BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+
+// BigInteger interfaces not implemented in jsbn:
+
+// BigInteger(int signum, byte[] magnitude)
+// double doubleValue()
+// float floatValue()
+// int hashCode()
+// long longValue()
+// static BigInteger valueOf(long val)
+// prng4.js - uses Arcfour as a PRNG
+
+function Arcfour() {
+  this.i = 0;
+  this.j = 0;
+  this.S = new Array();
+}
+
+// Initialize arcfour context from key, an array of ints, each from [0..255]
+function ARC4init(key) {
+  var i, j, t;
+  for(i = 0; i < 256; ++i)
+    this.S[i] = i;
+  j = 0;
+  for(i = 0; i < 256; ++i) {
+    j = (j + this.S[i] + key[i % key.length]) & 255;
+    t = this.S[i];
+    this.S[i] = this.S[j];
+    this.S[j] = t;
+  }
+  this.i = 0;
+  this.j = 0;
+}
+
+function ARC4next() {
+  var t;
+  this.i = (this.i + 1) & 255;
+  this.j = (this.j + this.S[this.i]) & 255;
+  t = this.S[this.i];
+  this.S[this.i] = this.S[this.j];
+  this.S[this.j] = t;
+  return this.S[(t + this.S[this.i]) & 255];
+}
+
+Arcfour.prototype.init = ARC4init;
+Arcfour.prototype.next = ARC4next;
+
+// Plug in your RNG constructor here
+function prng_newstate() {
+  return new Arcfour();
+}
+
+// Pool size must be a multiple of 4 and greater than 32.
+// An array of bytes the size of the pool will be passed to init()
+var rng_psize = 256;
+// Random number generator - requires a PRNG backend, e.g. prng4.js
+
+// For best results, put code like
+// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
+// in your main HTML document.
+
+var rng_state;
+var rng_pool;
+var rng_pptr;
+
+// Mix in a 32-bit integer into the pool
+function rng_seed_int(x) {
+  rng_pool[rng_pptr++] ^= x & 255;
+  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
+  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
+  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
+  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
+}
+
+// Mix in the current time (w/milliseconds) into the pool
+function rng_seed_time() {
+  // Use pre-computed date to avoid making the benchmark
+  // results dependent on the current date.
+  rng_seed_int(1122926989487);
+}
+
+// Initialize the pool with junk if needed.
+if(rng_pool == null) {
+  rng_pool = new Array();
+  rng_pptr = 0;
+  var t;
+  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
+    t = Math.floor(65536 * Math.random());
+    rng_pool[rng_pptr++] = t >>> 8;
+    rng_pool[rng_pptr++] = t & 255;
+  }
+  rng_pptr = 0;
+  rng_seed_time();
+  //rng_seed_int(window.screenX);
+  //rng_seed_int(window.screenY);
+}
+
+function rng_get_byte() {
+  if(rng_state == null) {
+    rng_seed_time();
+    rng_state = prng_newstate();
+    rng_state.init(rng_pool);
+    for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
+      rng_pool[rng_pptr] = 0;
+    rng_pptr = 0;
+    //rng_pool = null;
+  }
+  // TODO: allow reseeding after first request
+  return rng_state.next();
+}
+
+function rng_get_bytes(ba) {
+  var i;
+  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
+}
+
+function SecureRandom() {}
+
+SecureRandom.prototype.nextBytes = rng_get_bytes;
+// Depends on jsbn.js and rng.js
+
+// convert a (hex) string to a bignum object
+function parseBigInt(str,r) {
+  return new BigInteger(str,r);
+}
+
+function linebrk(s,n) {
+  var ret = "";
+  var i = 0;
+  while(i + n < s.length) {
+    ret += s.substring(i,i+n) + "\n";
+    i += n;
+  }
+  return ret + s.substring(i,s.length);
+}
+
+function byte2Hex(b) {
+  if(b < 0x10)
+    return "0" + b.toString(16);
+  else
+    return b.toString(16);
+}
+
+// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
+function pkcs1pad2(s,n) {
+  if(n < s.length + 11) {
+    alert("Message too long for RSA");
+    return null;
+  }
+  var ba = new Array();
+  var i = s.length - 1;
+  while(i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--);
+  ba[--n] = 0;
+  var rng = new SecureRandom();
+  var x = new Array();
+  while(n > 2) { // random non-zero pad
+    x[0] = 0;
+    while(x[0] == 0) rng.nextBytes(x);
+    ba[--n] = x[0];
+  }
+  ba[--n] = 2;
+  ba[--n] = 0;
+  return new BigInteger(ba);
+}
+
+// "empty" RSA key constructor
+function RSAKey() {
+  this.n = null;
+  this.e = 0;
+  this.d = null;
+  this.p = null;
+  this.q = null;
+  this.dmp1 = null;
+  this.dmq1 = null;
+  this.coeff = null;
+}
+
+// Set the public key fields N and e from hex strings
+function RSASetPublic(N,E) {
+  if(N != null && E != null && N.length > 0 && E.length > 0) {
+    this.n = parseBigInt(N,16);
+    this.e = parseInt(E,16);
+  }
+  else
+    alert("Invalid RSA public key");
+}
+
+// Perform raw public operation on "x": return x^e (mod n)
+function RSADoPublic(x) {
+  return x.modPowInt(this.e, this.n);
+}
+
+// Return the PKCS#1 RSA encryption of "text" as an even-length hex string
+function RSAEncrypt(text) {
+  var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
+  if(m == null) return null;
+  var c = this.doPublic(m);
+  if(c == null) return null;
+  var h = c.toString(16);
+  if((h.length & 1) == 0) return h; else return "0" + h;
+}
+
+// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
+//function RSAEncryptB64(text) {
+//  var h = this.encrypt(text);
+//  if(h) return hex2b64(h); else return null;
+//}
+
+// protected
+RSAKey.prototype.doPublic = RSADoPublic;
+
+// public
+RSAKey.prototype.setPublic = RSASetPublic;
+RSAKey.prototype.encrypt = RSAEncrypt;
+//RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
+// Depends on rsa.js and jsbn2.js
+
+// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
+function pkcs1unpad2(d,n) {
+  var b = d.toByteArray();
+  var i = 0;
+  while(i < b.length && b[i] == 0) ++i;
+  if(b.length-i != n-1 || b[i] != 2)
+    return null;
+  ++i;
+  while(b[i] != 0)
+    if(++i >= b.length) return null;
+  var ret = "";
+  while(++i < b.length)
+    ret += String.fromCharCode(b[i]);
+  return ret;
+}
+
+// Set the private key fields N, e, and d from hex strings
+function RSASetPrivate(N,E,D) {
+  if(N != null && E != null && N.length > 0 && E.length > 0) {
+    this.n = parseBigInt(N,16);
+    this.e = parseInt(E,16);
+    this.d = parseBigInt(D,16);
+  }
+  else
+    alert("Invalid RSA private key");
+}
+
+// Set the private key fields N, e, d and CRT params from hex strings
+function RSASetPrivateEx(N,E,D,P,Q,DP,DQ,C) {
+  if(N != null && E != null && N.length > 0 && E.length > 0) {
+    this.n = parseBigInt(N,16);
+    this.e = parseInt(E,16);
+    this.d = parseBigInt(D,16);
+    this.p = parseBigInt(P,16);
+    this.q = parseBigInt(Q,16);
+    this.dmp1 = parseBigInt(DP,16);
+    this.dmq1 = parseBigInt(DQ,16);
+    this.coeff = parseBigInt(C,16);
+  }
+  else
+    alert("Invalid RSA private key");
+}
+
+// Generate a new random private key B bits long, using public expt E
+function RSAGenerate(B,E) {
+  var rng = new SecureRandom();
+  var qs = B>>1;
+  this.e = parseInt(E,16);
+  var ee = new BigInteger(E,16);
+  for(;;) {
+    for(;;) {
+      this.p = new BigInteger(B-qs,1,rng);
+      if(this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
+    }
+    for(;;) {
+      this.q = new BigInteger(qs,1,rng);
+      if(this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) break;
+    }
+    if(this.p.compareTo(this.q) <= 0) {
+      var t = this.p;
+      this.p = this.q;
+      this.q = t;
+    }
+    var p1 = this.p.subtract(BigInteger.ONE);
+    var q1 = this.q.subtract(BigInteger.ONE);
+    var phi = p1.multiply(q1);
+    if(phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+      this.n = this.p.multiply(this.q);
+      this.d = ee.modInverse(phi);
+      this.dmp1 = this.d.mod(p1);
+      this.dmq1 = this.d.mod(q1);
+      this.coeff = this.q.modInverse(this.p);
+      break;
+    }
+  }
+}
+
+// Perform raw private operation on "x": return x^d (mod n)
+function RSADoPrivate(x) {
+  if(this.p == null || this.q == null)
+    return x.modPow(this.d, this.n);
+
+  // TODO: re-calculate any missing CRT params
+  var xp = x.mod(this.p).modPow(this.dmp1, this.p);
+  var xq = x.mod(this.q).modPow(this.dmq1, this.q);
+
+  while(xp.compareTo(xq) < 0)
+    xp = xp.add(this.p);
+  return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
+}
+
+// Return the PKCS#1 RSA decryption of "ctext".
+// "ctext" is an even-length hex string and the output is a plain string.
+function RSADecrypt(ctext) {
+  var c = parseBigInt(ctext, 16);
+  var m = this.doPrivate(c);
+  if(m == null) return null;
+  return pkcs1unpad2(m, (this.n.bitLength()+7)>>3);
+}
+
+// Return the PKCS#1 RSA decryption of "ctext".
+// "ctext" is a Base64-encoded string and the output is a plain string.
+//function RSAB64Decrypt(ctext) {
+//  var h = b64tohex(ctext);
+//  if(h) return this.decrypt(h); else return null;
+//}
+
+// protected
+RSAKey.prototype.doPrivate = RSADoPrivate;
+
+// public
+RSAKey.prototype.setPrivate = RSASetPrivate;
+RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
+RSAKey.prototype.generate = RSAGenerate;
+RSAKey.prototype.decrypt = RSADecrypt;
+//RSAKey.prototype.b64_decrypt = RSAB64Decrypt;
+
+
+nValue="a5261939975948bb7a58dffe5ff54e65f0498f9175f5a09288810b8975871e99af3b5dd94057b0fc07535f5f97444504fa35169d461d0d30cf0192e307727c065168c788771c561a9400fb49175e9e6aa4e23fe11af69e9412dd23b0cb6684c4c2429bce139e848ab26d0829073351f4acd36074eafd036a5eb83359d2a698d3";
+eValue="10001";
+dValue="8e9912f6d3645894e8d38cb58c0db81ff516cf4c7e5a14c7f1eddb1459d2cded4d8d293fc97aee6aefb861859c8b6a3d1dfe710463e1f9ddc72048c09751971c4a580aa51eb523357a3cc48d31cfad1d4a165066ed92d4748fb6571211da5cb14bc11b6e2df7c1a559e6d5ac1cd5c94703a22891464fba23d0d965086277a161";
+pValue="d090ce58a92c75233a6486cb0a9209bf3583b64f540c76f5294bb97d285eed33aec220bde14b2417951178ac152ceab6da7090905b478195498b352048f15e7d";
+qValue="cab575dc652bb66df15a0359609d51d1db184750c00c6698b90ef3465c99655103edbf0d54c56aec0ce3c4d22592338092a126a0cc49f65a4a30d222b411e58f";
+dmp1Value="1a24bca8e273df2f0e47c199bbf678604e7df7215480c77c8db39f49b000ce2cf7500038acfff5433b7d582a01f1826e6f4d42e1c57f5e1fef7b12aabc59fd25";
+dmq1Value="3d06982efbbe47339e1f6d36b1216b8a741d410b0c662f54f7118b27b9a4ec9d914337eb39841d8666f3034408cf94f5b62f11c402fc994fe15a05493150d9fd";
+coeffValue="3a3e731acd8960b7ff9eb81a7ff93bd1cfa74cbd56987db58b4594fb09c09084db1734c8143f98b602b981aaa9243ca28deb69b5b280ee8dcee0fd2625e53250";
+
+setupEngine(am3, 28);
+
+var TEXT = "The quick brown fox jumped over the extremely lazy frog! " +
+    "Now is the time for all good men to come to the party.";
+var encrypted;
+
+function encrypt() {
+  var RSA = new RSAKey();
+  RSA.setPublic(nValue, eValue);
+  RSA.setPrivateEx(nValue, eValue, dValue, pValue, qValue, dmp1Value, dmq1Value, coeffValue);
+  encrypted = RSA.encrypt(TEXT);
+}
+
+function decrypt() {
+  var RSA = new RSAKey();
+  RSA.setPublic(nValue, eValue);
+  RSA.setPrivateEx(nValue, eValue, dValue, pValue, qValue, dmp1Value, dmq1Value, coeffValue);
+  var decrypted = RSA.decrypt(encrypted);
+  if (decrypted != TEXT) {
+    throw new Error("Crypto operation failed");
+  }
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap-responsive.css b/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap-responsive.css
new file mode 100644
index 0000000..06e55c0
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap-responsive.css
@@ -0,0 +1,815 @@
+/*!
+ * Bootstrap Responsive v2.0.4
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 28px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+      -ms-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+@media (max-width: 767px) {
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 18px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .modal {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    left: 10px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: auto;
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 28px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+        -ms-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 28px;
+    margin-left: 2.762430939%;
+    *margin-left: 2.709239449638298%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+        -ms-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 99.999999993%;
+    *width: 99.9468085036383%;
+  }
+  .row-fluid .span11 {
+    width: 91.436464082%;
+    *width: 91.38327259263829%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817100001%;
+    *width: 82.8197366816383%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226%;
+    *width: 74.25620077063829%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585634900001%;
+    *width: 65.6926648596383%;
+  }
+  .row-fluid .span7 {
+    width: 57.182320438000005%;
+    *width: 57.129128948638304%;
+  }
+  .row-fluid .span6 {
+    width: 48.618784527%;
+    *width: 48.5655930376383%;
+  }
+  .row-fluid .span5 {
+    width: 40.055248616%;
+    *width: 40.0020571266383%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712705%;
+    *width: 31.4385212156383%;
+  }
+  .row-fluid .span3 {
+    width: 22.928176794%;
+    *width: 22.874985304638297%;
+  }
+  .row-fluid .span2 {
+    width: 14.364640883%;
+    *width: 14.311449393638298%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972%;
+    *width: 5.747913482638298%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 714px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 652px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 590px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 528px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 466px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 404px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 342px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 280px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 218px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 156px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 94px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 32px;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 28px;
+    margin-left: 2.564102564%;
+    *margin-left: 2.510911074638298%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+        -ms-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145300001%;
+    *width: 91.3997999636383%;
+  }
+  .row-fluid .span10 {
+    width: 82.905982906%;
+    *width: 82.8527914166383%;
+  }
+  .row-fluid .span9 {
+    width: 74.358974359%;
+    *width: 74.30578286963829%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581200001%;
+    *width: 65.7587743226383%;
+  }
+  .row-fluid .span7 {
+    width: 57.264957265%;
+    *width: 57.2117657756383%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948718%;
+    *width: 48.6647572286383%;
+  }
+  .row-fluid .span5 {
+    width: 40.170940171000005%;
+    *width: 40.117748681638304%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931624%;
+    *width: 31.5707401346383%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923077%;
+    *width: 23.0237315876383%;
+  }
+  .row-fluid .span2 {
+    width: 14.529914530000001%;
+    *width: 14.4767230406383%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905983%;
+    *width: 5.929714493638298%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1160px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1060px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 960px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 860px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 760px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 660px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 560px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 460px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 360px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 260px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 160px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 60px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 18px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 18px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 9px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #999999;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 6px 15px;
+    font-weight: bold;
+    color: #999999;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #222222;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: block;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 9px 15px;
+    margin: 9px 0;
+    border-top: 1px solid #222222;
+    border-bottom: 1px solid #222222;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap.css b/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap.css
new file mode 100644
index 0000000..cca3010
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/css/bootstrap.css
@@ -0,0 +1,4214 @@
+/* Portions copyright 2012 Google, Inc */
+/*!
+ * Bootstrap v2.0.4
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+/* added styles by Octane */
+
+span.label-simple {
+font-size: 12px; 
+font-weight: bold; 
+color: #1a1515;
+}
+
+p.p-result {
+    text-align:right;
+    font-size:20px;
+}
+
+div.box {
+  background-color: #B8B7B6;
+  height: 80px;
+  margin-top: 8px;
+  margin-bottom: 8px;
+  padding: 5px;
+  font-size: 20px;
+  position: relative;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+
+}
+
+span.new {font-size:14px; color: #DE0000;}
+
+div.warning-header {
+    font-weight: bold;
+    font-size: 22px;
+    color: #A2412D;
+}
+
+/* original css produced via lavishbootstrap - minor tweaks below */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+}
+.clearfix:after {
+  clear: both;
+}
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 28px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+}
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+  color: #5e3534;
+  background-color: #1a1515;
+}
+a {
+  color: #E26128;
+  text-decoration: none;
+}
+a:hover {
+  color: #a74317;
+  text-decoration: underline;
+}
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+.container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.span12 {
+  width: 940px;
+}
+.span11 {
+  width: 860px;
+}
+.span10 {
+  width: 780px;
+}
+.span9 {
+  width: 700px;
+}
+.span8 {
+  width: 620px;
+}
+.span7 {
+  width: 540px;
+}
+.span6 {
+  width: 460px;
+}
+.span5 {
+  width: 380px;
+}
+.span4 {
+  width: 300px;
+}
+.span3 {
+  width: 220px;
+}
+.span2 {
+  width: 140px;
+}
+.span1 {
+  width: 60px;
+}
+.offset12 {
+  margin-left: 980px;
+}
+.offset11 {
+  margin-left: 900px;
+}
+.offset10 {
+  margin-left: 820px;
+}
+.offset9 {
+  margin-left: 740px;
+}
+.offset8 {
+  margin-left: 660px;
+}
+.offset7 {
+  margin-left: 580px;
+}
+.offset6 {
+  margin-left: 500px;
+}
+.offset5 {
+  margin-left: 420px;
+}
+.offset4 {
+  margin-left: 340px;
+}
+.offset3 {
+  margin-left: 260px;
+}
+.offset2 {
+  margin-left: 180px;
+}
+.offset1 {
+  margin-left: 100px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid [class*="span"] {
+  display: block;
+  width: 100%;
+  min-height: 28px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  float: left;
+  margin-left: 2.127659574%;
+  *margin-left: 2.0744680846382977%;
+}
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid .span12 {
+  width: 99.99999998999999%;
+  *width: 99.94680850063828%;
+}
+.row-fluid .span11 {
+  width: 91.489361693%;
+  *width: 91.4361702036383%;
+}
+.row-fluid .span10 {
+  width: 82.97872339599999%;
+  *width: 82.92553190663828%;
+}
+.row-fluid .span9 {
+  width: 74.468085099%;
+  *width: 74.4148936096383%;
+}
+.row-fluid .span8 {
+  width: 65.95744680199999%;
+  *width: 65.90425531263828%;
+}
+.row-fluid .span7 {
+  width: 57.446808505%;
+  *width: 57.3936170156383%;
+}
+.row-fluid .span6 {
+  width: 48.93617020799999%;
+  *width: 48.88297871863829%;
+}
+.row-fluid .span5 {
+  width: 40.425531911%;
+  *width: 40.3723404216383%;
+}
+.row-fluid .span4 {
+  width: 31.914893614%;
+  *width: 31.8617021246383%;
+}
+.row-fluid .span3 {
+  width: 23.404255317%;
+  *width: 23.3510638276383%;
+}
+.row-fluid .span2 {
+  width: 14.89361702%;
+  *width: 14.8404255306383%;
+}
+.row-fluid .span1 {
+  width: 6.382978723%;
+  *width: 6.329787233638298%;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+}
+.container-fluid:after {
+  clear: both;
+}
+p {
+  margin: 0 0 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+}
+p small {
+  font-size: 11px;
+  color: #E26128;
+}
+.lead {
+  margin-bottom: 18px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 27px;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 0;
+  font-family: inherit;
+  font-weight: bold;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  color: #E26128;
+}
+h1 {
+  font-size: 30px;
+  line-height: 36px;
+}
+h1 small {
+  font-size: 18px;
+}
+h2 {
+  font-size: 24px;
+  line-height: 36px;
+}
+h2 small {
+  font-size: 18px;
+}
+h3 {
+  font-size: 18px;
+  line-height: 27px;
+}
+h3 small {
+  font-size: 14px;
+}
+h4,
+h5,
+h6 {
+  line-height: 18px;
+}
+h4 {
+  font-size: 14px;
+}
+h4 small {
+  font-size: 12px;
+}
+h5 {
+  font-size: 12px;
+}
+h6 {
+  font-size: 11px;
+  color: #E26128;
+  text-transform: uppercase;
+}
+.page-header {
+  padding-bottom: 17px;
+  margin: 18px 0;
+  border-bottom: 1px solid #eb9742;
+}
+.page-header h1 {
+  line-height: 1;
+}
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 9px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: 18px;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+dl {
+  margin-bottom: 18px;
+}
+dt,
+dd {
+  line-height: 18px;
+}
+dt {
+  font-weight: bold;
+  line-height: 17px;
+}
+dd {
+  margin-left: 9px;
+}
+.dl-horizontal dt {
+  float: left;
+  width: 120px;
+  clear: left;
+  text-align: right;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.dl-horizontal dd {
+  margin-left: 130px;
+}
+hr {
+  margin: 18px 0;
+  border: 0;
+  border-top: 1px solid #eb9742;
+  border-bottom: 1px solid #1a1515;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+.muted {
+  color: #E26128;
+}
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #ddd;
+}
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 18px;
+  border-left: 5px solid #eb9742;
+}
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 22.5px;
+}
+blockquote small {
+  display: block;
+  line-height: 18px;
+  color: #E26128;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eb9742;
+  border-left: 0;
+}
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  display: block;
+  margin-bottom: 18px;
+  font-style: normal;
+  line-height: 18px;
+}
+small {
+  font-size: 100%;
+}
+cite {
+  font-style: normal;
+}
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #5e3534;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+pre {
+  display: block;
+  padding: 8.5px;
+  margin: 0 0 9px;
+  font-size: 12.025px;
+  line-height: 18px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+pre.prettyprint {
+  margin-bottom: 18px;
+}
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+form {
+  margin: 0 0 18px;
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 27px;
+  font-size: 19.5px;
+  line-height: 36px;
+  color: #5e3534;
+  border: 0;
+  border-bottom: 1px solid #eee;
+}
+legend small {
+  font-size: 13.5px;
+  color: #E26128;
+}
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+}
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+label {
+  display: block;
+  margin-bottom: 5px;
+  color: #5e3534;
+}
+input,
+textarea,
+select,
+.uneditable-input {
+  display: inline-block;
+  width: 210px;
+  height: 18px;
+  padding: 4px;
+  margin-bottom: 9px;
+  font-size: 13px;
+  line-height: 18px;
+  color: #7b7e8c;
+  background-color: '#fff';
+  border: 1px solid #cccccc;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+label input,
+label textarea,
+label select {
+  display: block;
+}
+input[type="image"],
+input[type="checkbox"],
+input[type="radio"] {
+  width: auto;
+  height: auto;
+  padding: 0;
+  margin: 3px 0;
+  *margin-top: 0;
+  /* IE7 */
+
+  line-height: normal;
+  cursor: pointer;
+  background-color: transparent;
+  border: 0 \9;
+  /* IE9 and down */
+
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+input[type="image"] {
+  border: 0;
+}
+input[type="file"] {
+  width: auto;
+  padding: initial;
+  line-height: initial;
+  background-color: '#fff';
+  background-color: initial;
+  border: initial;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  width: auto;
+  height: auto;
+}
+select,
+input[type="file"] {
+  height: 28px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 28px;
+}
+input[type="file"] {
+  line-height: 18px \9;
+}
+select {
+  width: 220px;
+  background-color: '#fff';
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="image"] {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+textarea {
+  height: auto;
+}
+input[type="hidden"] {
+  display: none;
+}
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+input,
+textarea {
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+  transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+input:focus,
+textarea:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus,
+select:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.input-mini {
+  width: 60px;
+}
+.input-small {
+  width: 90px;
+}
+.input-medium {
+  width: 150px;
+}
+.input-large {
+  width: 210px;
+}
+.input-xlarge {
+  width: 270px;
+}
+.input-xxlarge {
+  width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+input.span12, textarea.span12, .uneditable-input.span12 {
+  width: 930px;
+}
+input.span11, textarea.span11, .uneditable-input.span11 {
+  width: 850px;
+}
+input.span10, textarea.span10, .uneditable-input.span10 {
+  width: 770px;
+}
+input.span9, textarea.span9, .uneditable-input.span9 {
+  width: 690px;
+}
+input.span8, textarea.span8, .uneditable-input.span8 {
+  width: 610px;
+}
+input.span7, textarea.span7, .uneditable-input.span7 {
+  width: 530px;
+}
+input.span6, textarea.span6, .uneditable-input.span6 {
+  width: 450px;
+}
+input.span5, textarea.span5, .uneditable-input.span5 {
+  width: 370px;
+}
+input.span4, textarea.span4, .uneditable-input.span4 {
+  width: 290px;
+}
+input.span3, textarea.span3, .uneditable-input.span3 {
+  width: 210px;
+}
+input.span2, textarea.span2, .uneditable-input.span2 {
+  width: 130px;
+}
+input.span1, textarea.span1, .uneditable-input.span1 {
+  width: 50px;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eb9742;
+  border-color: #ddd;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+}
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: 0 0 6px #dbc59e;
+  -moz-box-shadow: 0 0 6px #dbc59e;
+  box-shadow: 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+}
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: 0 0 6px #d59392;
+  -moz-box-shadow: 0 0 6px #d59392;
+  box-shadow: 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+}
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: 0 0 6px #7aba7b;
+  -moz-box-shadow: 0 0 6px #7aba7b;
+  box-shadow: 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+  padding: 17px 20px 18px;
+  margin-top: 18px;
+  margin-bottom: 18px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  *zoom: 1;
+}
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  content: "";
+}
+.form-actions:after {
+  clear: both;
+}
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+  cursor: not-allowed;
+  background-color: '#fff';
+  border-color: #eee;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+:-moz-placeholder {
+  color: #E26128;
+}
+::-webkit-input-placeholder {
+  color: #E26128;
+}
+.help-block,
+.help-inline {
+  color: #7b7e8c;
+}
+.help-block {
+  display: block;
+  margin-bottom: 9px;
+}
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+.input-prepend,
+.input-append {
+  margin-bottom: 5px;
+}
+.input-prepend input,
+.input-append input,
+.input-prepend select,
+.input-append select,
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  vertical-align: middle;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend input:focus,
+.input-append input:focus,
+.input-prepend select:focus,
+.input-append select:focus,
+.input-prepend .uneditable-input:focus,
+.input-append .uneditable-input:focus {
+  z-index: 2;
+}
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  border-left-color: #ccc;
+}
+.input-prepend .add-on,
+.input-append .add-on {
+  display: inline-block;
+  width: auto;
+  height: 18px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  text-align: center;
+  text-shadow: 0 1px 0 #1a1515;
+  vertical-align: middle;
+  background-color: #eb9742;
+  border: 1px solid #ccc;
+}
+.input-prepend .add-on,
+.input-append .add-on,
+.input-prepend .btn,
+.input-append .btn {
+  margin-left: -1px;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-prepend .active,
+.input-append .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append .uneditable-input {
+  border-right-color: #ccc;
+  border-left-color: #eee;
+}
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 14px;
+  -moz-border-radius: 14px;
+  border-radius: 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-bottom: 0;
+}
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+.form-search label,
+.form-inline label {
+  display: inline-block;
+}
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+.control-group {
+  margin-bottom: 9px;
+}
+legend + .control-group {
+  margin-top: 18px;
+  -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+  margin-bottom: 18px;
+  *zoom: 1;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  content: "";
+}
+.form-horizontal .control-group:after {
+  clear: both;
+}
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 160px;
+  *margin-left: 0;
+}
+.form-horizontal .controls:first-child {
+  *padding-left: 160px;
+}
+.form-horizontal .help-block {
+  margin-top: 9px;
+  margin-bottom: 0;
+}
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.table {
+  width: 100%;
+  margin-bottom: 18px;
+}
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 18px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+.table th {
+  font-weight: bold;
+}
+.table thead th {
+  vertical-align: bottom;
+}
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapsed;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+  border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+  border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+  -moz-border-radius: 0 0 0 4px;
+  border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+.table tbody tr:hover td,
+.table tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+[class^="icon-"]:last-child,
+[class*=" icon-"]:last-child {
+  *margin-left: 0;
+}
+.icon-white {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+.icon-glass {
+  background-position: 0      0;
+}
+.icon-music {
+  background-position: -24px 0;
+}
+.icon-search {
+  background-position: -48px 0;
+}
+.icon-envelope {
+  background-position: -72px 0;
+}
+.icon-heart {
+  background-position: -96px 0;
+}
+.icon-star {
+  background-position: -120px 0;
+}
+.icon-star-empty {
+  background-position: -144px 0;
+}
+.icon-user {
+  background-position: -168px 0;
+}
+.icon-film {
+  background-position: -192px 0;
+}
+.icon-th-large {
+  background-position: -216px 0;
+}
+.icon-th {
+  background-position: -240px 0;
+}
+.icon-th-list {
+  background-position: -264px 0;
+}
+.icon-ok {
+  background-position: -288px 0;
+}
+.icon-remove {
+  background-position: -312px 0;
+}
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+.icon-off {
+  background-position: -384px 0;
+}
+.icon-signal {
+  background-position: -408px 0;
+}
+.icon-cog {
+  background-position: -432px 0;
+}
+.icon-trash {
+  background-position: -456px 0;
+}
+.icon-home {
+  background-position: 0 -24px;
+}
+.icon-file {
+  background-position: -24px -24px;
+}
+.icon-time {
+  background-position: -48px -24px;
+}
+.icon-road {
+  background-position: -72px -24px;
+}
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+.icon-download {
+  background-position: -120px -24px;
+}
+.icon-upload {
+  background-position: -144px -24px;
+}
+.icon-inbox {
+  background-position: -168px -24px;
+}
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+.icon-repeat {
+  background-position: -216px -24px;
+}
+.icon-refresh {
+  background-position: -240px -24px;
+}
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+.icon-lock {
+  background-position: -287px -24px;
+}
+.icon-flag {
+  background-position: -312px -24px;
+}
+.icon-headphones {
+  background-position: -336px -24px;
+}
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+.icon-barcode {
+  background-position: -456px -24px;
+}
+.icon-tag {
+  background-position: 0 -48px;
+}
+.icon-tags {
+  background-position: -25px -48px;
+}
+.icon-book {
+  background-position: -48px -48px;
+}
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+.icon-print {
+  background-position: -96px -48px;
+}
+.icon-camera {
+  background-position: -120px -48px;
+}
+.icon-font {
+  background-position: -144px -48px;
+}
+.icon-bold {
+  background-position: -167px -48px;
+}
+.icon-italic {
+  background-position: -192px -48px;
+}
+.icon-text-height {
+  background-position: -216px -48px;
+}
+.icon-text-width {
+  background-position: -240px -48px;
+}
+.icon-align-left {
+  background-position: -264px -48px;
+}
+.icon-align-center {
+  background-position: -288px -48px;
+}
+.icon-align-right {
+  background-position: -312px -48px;
+}
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+.icon-list {
+  background-position: -360px -48px;
+}
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+.icon-picture {
+  background-position: -456px -48px;
+}
+.icon-pencil {
+  background-position: 0 -72px;
+}
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+.icon-adjust {
+  background-position: -48px -72px;
+}
+.icon-tint {
+  background-position: -72px -72px;
+}
+.icon-edit {
+  background-position: -96px -72px;
+}
+.icon-share {
+  background-position: -120px -72px;
+}
+.icon-check {
+  background-position: -144px -72px;
+}
+.icon-move {
+  background-position: -168px -72px;
+}
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+.icon-backward {
+  background-position: -240px -72px;
+}
+.icon-play {
+  background-position: -264px -72px;
+}
+.icon-pause {
+  background-position: -288px -72px;
+}
+.icon-stop {
+  background-position: -312px -72px;
+}
+.icon-forward {
+  background-position: -336px -72px;
+}
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+.icon-eject {
+  background-position: -408px -72px;
+}
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+.icon-plus {
+  background-position: -408px -96px;
+}
+.icon-minus {
+  background-position: -433px -96px;
+}
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+.icon-gift {
+  background-position: -24px -120px;
+}
+.icon-leaf {
+  background-position: -48px -120px;
+}
+.icon-fire {
+  background-position: -72px -120px;
+}
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+.icon-plane {
+  background-position: -168px -120px;
+}
+.icon-calendar {
+  background-position: -192px -120px;
+}
+.icon-random {
+  background-position: -216px -120px;
+}
+.icon-comment {
+  background-position: -240px -120px;
+}
+.icon-magnet {
+  background-position: -264px -120px;
+}
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+.icon-retweet {
+  background-position: -336px -120px;
+}
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+.icon-folder-open {
+  background-position: -408px -120px;
+}
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+.icon-hdd {
+  background-position: 0 -144px;
+}
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+.icon-bell {
+  background-position: -48px -144px;
+}
+.icon-certificate {
+  background-position: -72px -144px;
+}
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+.icon-globe {
+  background-position: -336px -144px;
+}
+.icon-wrench {
+  background-position: -360px -144px;
+}
+.icon-tasks {
+  background-position: -384px -144px;
+}
+.icon-filter {
+  background-position: -408px -144px;
+}
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #1a1515;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown:hover .caret,
+.open .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 4px 0;
+  margin: 1px 0 0;
+  list-style: none;
+  background-color: #1a1515;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 8px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #1a1515;
+}
+.dropdown-menu a {
+  display: block;
+  padding: 3px 15px;
+  clear: both;
+  font-weight: normal;
+  line-height: 18px;
+  color: #5e3534;
+  white-space: nowrap;
+}
+.dropdown-menu li > a:hover,
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #1a1515;
+  text-decoration: none;
+  background-color: #E26128;
+}
+.open {
+  *z-index: 1000;
+}
+.open .dropdown-menu {
+  display: block;
+}
+.pull-right .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #1a1515;
+  content: "\2191";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #eee;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.fade {
+  opacity: 0;
+  filter: alpha(opacity=0);
+  -webkit-transition: opacity 0.15s linear;
+  -moz-transition: opacity 0.15s linear;
+  -ms-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+  -moz-transition: height 0.35s ease;
+  -ms-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+}
+.collapse.in {
+  height: auto;
+}
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #1a1515;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover {
+  color: #1a1515;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+.btn {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  padding: 4px 10px 4px;
+  margin-bottom: 0;
+  font-size: 13px;
+  line-height: 18px;
+  *line-height: 20px;
+  color: #5e3534;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #100d0d;
+  background-image: -moz-linear-gradient(top, #1a1515, #000000);
+  background-image: -ms-linear-gradient(top, #1a1515, #000000);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1a1515), to(#000000));
+  background-image: -webkit-linear-gradient(top, #1a1515, #000000);
+  background-image: -o-linear-gradient(top, #1a1515, #000000);
+  background-image: linear-gradient(top, #1a1515, #000000);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1515', endColorstr='#000000', GradientType=0);
+  border-color: #000000 #000000 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #000000;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border: 1px solid #cccccc;
+  *border: 0;
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  *margin-left: .3em;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  background-color: #000000;
+  *background-color: #000000;
+}
+.btn:active,
+.btn.active {
+  background-color: #000000 \9;
+}
+.btn:first-child {
+  *margin-left: 0;
+}
+.btn:hover {
+  color: #5e3534;
+  text-decoration: none;
+  background-color: #000000;
+  *background-color: #000000;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+  -moz-transition: background-position 0.1s linear;
+  -ms-transition: background-position 0.1s linear;
+  -o-transition: background-position 0.1s linear;
+  transition: background-position 0.1s linear;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn.active,
+.btn:active {
+  background-color: #000000;
+  background-color: #000000 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #000000;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-large {
+  padding: 9px 14px;
+  font-size: 15px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-large [class^="icon-"] {
+  margin-top: 1px;
+}
+.btn-small {
+  padding: 5px 9px;
+  font-size: 11px;
+  line-height: 16px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: -1px;
+}
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 14px;
+}
+.btn-primary,
+.btn-primary:hover,
+.btn-warning,
+.btn-warning:hover,
+.btn-danger,
+.btn-danger:hover,
+.btn-success,
+.btn-success:hover,
+.btn-info,
+.btn-info:hover,
+.btn-inverse,
+.btn-inverse:hover {
+  color: #1a1515;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+.btn {
+  border-color: #ccc;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
+.btn-primary {
+  background-color: #e27428;
+  background-image: -moz-linear-gradient(top, #E26128, #e29028);
+  background-image: -ms-linear-gradient(top, #E26128, #e29028);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#E26128), to(#e29028));
+  background-image: -webkit-linear-gradient(top, #E26128, #e29028);
+  background-image: -o-linear-gradient(top, #E26128, #e29028);
+  background-image: linear-gradient(top, #E26128, #e29028);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#E26128', endColorstr='#e29028', GradientType=0);
+  border-color: #e29028 #e29028 #a76717;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #e29028;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  background-color: #e29028;
+  *background-color: #d4831d;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #bd751a \9;
+}
+.btn-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #f89406;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+.btn-danger {
+  background-color: #da4f49;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(top, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #bd362f;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+.btn-success {
+  background-color: #5bb75b;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -ms-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(top, #62c462, #51a351);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #51a351;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  background-color: #51a351;
+  *background-color: #499249;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+.btn-info {
+  background-color: #49afcd;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(top, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #2f96b4;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+.btn-inverse {
+  background-color: #625962;
+  background-image: -moz-linear-gradient(top, #7b7e8c, #3d2222);
+  background-image: -ms-linear-gradient(top, #7b7e8c, #3d2222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#7b7e8c), to(#3d2222));
+  background-image: -webkit-linear-gradient(top, #7b7e8c, #3d2222);
+  background-image: -o-linear-gradient(top, #7b7e8c, #3d2222);
+  background-image: linear-gradient(top, #7b7e8c, #3d2222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7b7e8c', endColorstr='#3d2222', GradientType=0);
+  border-color: #3d2222 #3d2222 #0c0707;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #3d2222;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  background-color: #3d2222;
+  *background-color: #2d1919;
+}
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #1c1010 \9;
+}
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+.btn-group {
+  position: relative;
+  *zoom: 1;
+  *margin-left: .3em;
+}
+.btn-group:before,
+.btn-group:after {
+  display: table;
+  content: "";
+}
+.btn-group:after {
+  clear: both;
+}
+.btn-group:first-child {
+  *margin-left: 0;
+}
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-toolbar {
+  margin-top: 9px;
+  margin-bottom: 9px;
+}
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-group > .btn {
+  position: relative;
+  float: left;
+  margin-left: -1px;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+}
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 6px;
+  -moz-border-radius-topleft: 6px;
+  border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  border-bottom-left-radius: 6px;
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  border-bottom-right-radius: 6px;
+}
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  *padding-top: 4px;
+  *padding-bottom: 4px;
+}
+.btn-group > .btn-mini.dropdown-toggle {
+  padding-left: 5px;
+  padding-right: 5px;
+}
+.btn-group > .btn-small.dropdown-toggle {
+  *padding-top: 4px;
+  *padding-bottom: 4px;
+}
+.btn-group > .btn-large.dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #000000;
+}
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #e29028;
+}
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #3d2222;
+}
+.btn .caret {
+  margin-top: 7px;
+  margin-left: 0;
+}
+.btn:hover .caret,
+.open.btn-group .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.btn-mini .caret {
+  margin-top: 5px;
+}
+.btn-small .caret {
+  margin-top: 6px;
+}
+.btn-large .caret {
+  margin-top: 6px;
+  border-left-width: 5px;
+  border-right-width: 5px;
+  border-top-width: 5px;
+}
+.dropup .btn-large .caret {
+  border-bottom: 5px solid #1a1515;
+  border-top: 0;
+}
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #1a1515;
+  border-bottom-color: #1a1515;
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 18px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  color: #c09853;
+}
+.alert-heading {
+  color: inherit;
+}
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 18px;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #468847;
+}
+.alert-danger,
+.alert-error {
+  background-color: #f2dede;
+  border-color: #eed3d7;
+  color: #b94a48;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+  color: #3a87ad;
+}
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
+.nav {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: none;
+}
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eb9742;
+}
+.nav > .pull-right {
+  float: right;
+}
+.nav .nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #E26128;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+.nav-list {
+  padding-left: 15px;
+  padding-right: 15px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left: -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #1a1515;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #E26128;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 8px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #1a1515;
+}
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  content: "";
+}
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 18px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eb9742 #eb9742 #dddddd;
+}
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #7b7e8c;
+  background-color: #1a1515;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #1a1515;
+  background-color: #E26128;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 5px 5px;
+  -moz-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;
+}
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.nav-tabs .dropdown-toggle .caret,
+.nav-pills .dropdown-toggle .caret {
+  border-top-color: #E26128;
+  border-bottom-color: #E26128;
+  margin-top: 6px;
+}
+.nav-tabs .dropdown-toggle:hover .caret,
+.nav-pills .dropdown-toggle:hover .caret {
+  border-top-color: #a74317;
+  border-bottom-color: #a74317;
+}
+.nav-tabs .active .dropdown-toggle .caret,
+.nav-pills .active .dropdown-toggle .caret {
+  border-top-color: #5e3534;
+  border-bottom-color: #5e3534;
+}
+.nav > .dropdown.active > a:hover {
+  color: #1a1515;
+  cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #1a1515;
+  background-color: #E26128;
+  border-color: #E26128;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #1a1515;
+  border-bottom-color: #1a1515;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+  border-color: #E26128;
+}
+.tabbable {
+  *zoom: 1;
+}
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  content: "";
+}
+.tabbable:after {
+  clear: both;
+}
+.tab-content {
+  overflow: auto;
+}
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.tabs-below > .nav-tabs > li > a:hover {
+  border-bottom-color: transparent;
+  border-top-color: #ddd;
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eb9742 #dddddd #eb9742 #eb9742;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #1a1515;
+}
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eb9742 #eb9742 #eb9742 #dddddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #1a1515;
+}
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  overflow: visible;
+  margin-bottom: 18px;
+}
+.navbar-inner {
+  min-height: 40px;
+  padding-left: 20px;
+  padding-right: 20px;
+  background-color: #512e2d;
+  background-image: -moz-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -ms-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5e3534), to(#3d2222));
+  background-image: -webkit-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -o-linear-gradient(top, #5e3534, #3d2222);
+  background-image: linear-gradient(top, #5e3534, #3d2222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5e3534', endColorstr='#3d2222', GradientType=0);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);
+  -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);
+  box-shadow: 0 1px 3px rgba(0,0,0,.25), inset 0 -1px 0 rgba(0,0,0,.1);
+}
+.navbar .container {
+  width: auto;
+}
+.nav-collapse.collapse {
+  height: auto;
+}
+.navbar {
+  color: #E26128;
+}
+.navbar .brand:hover {
+  text-decoration: none;
+}
+.navbar .brand {
+  float: left;
+  display: block;
+  padding: 8px 20px 12px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 1;
+  color: #E26128;
+}
+.navbar .navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+}
+.navbar .navbar-link {
+  color: #E26128;
+}
+.navbar .navbar-link:hover {
+  color: #1a1515;
+}
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+.navbar .btn-group .btn {
+  margin: 0;
+}
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  content: "";
+}
+.navbar-form:after {
+  clear: both;
+}
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+.navbar-form input,
+.navbar-form select {
+  display: inline-block;
+  margin-bottom: 0;
+}
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 6px;
+  margin-bottom: 0;
+}
+.navbar-search .search-query {
+  padding: 4px 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  color: #1a1515;
+  background-color: #8f514f;
+  border: 1px solid #2d1919;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+.navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+.navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+.navbar-search .search-query:focus,
+.navbar-search .search-query.focused {
+  padding: 5px 10px;
+  color: #5e3534;
+  text-shadow: 0 1px 0 #1a1515;
+  background-color: #1a1515;
+  border: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  outline: 0;
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.navbar-fixed-top {
+  top: 0;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right;
+}
+.navbar .nav > li {
+  display: block;
+  float: left;
+}
+.navbar .nav > li > a {
+  float: none;
+  padding: 9px 10px 11px;
+  line-height: 19px;
+  color: #E26128;
+  text-decoration: none;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar .btn {
+  display: inline-block;
+  padding: 4px 10px 4px;
+  margin: 5px 5px 6px;
+  line-height: 18px;
+}
+.navbar .btn-group {
+  margin: 0;
+  padding: 5px 5px 6px;
+}
+.navbar .nav > li > a:hover {
+  background-color: transparent;
+  color: #B8B7B6;
+  text-decoration: none;
+}
+.navbar .nav .active > a,
+.navbar .nav .active > a:hover {
+  color: #1a1515;
+  text-decoration: none;
+  background-color: #3d2222;
+}
+.navbar .divider-vertical {
+  height: 40px;
+  width: 1px;
+  margin: 0 9px;
+  overflow: hidden;
+  background-color: #3d2222;
+  border-right: 1px solid #5e3534;
+}
+.navbar .nav.pull-right {
+  margin-left: 10px;
+  margin-right: 0;
+}
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  background-color: #512e2d;
+  background-image: -moz-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -ms-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5e3534), to(#3d2222));
+  background-image: -webkit-linear-gradient(top, #5e3534, #3d2222);
+  background-image: -o-linear-gradient(top, #5e3534, #3d2222);
+  background-image: linear-gradient(top, #5e3534, #3d2222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5e3534', endColorstr='#3d2222', GradientType=0);
+  border-color: #3d2222 #3d2222 #0c0707;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #3d2222;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+}
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  background-color: #3d2222;
+  *background-color: #2d1919;
+}
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #1c1010 \9;
+}
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+.navbar .dropdown-menu:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 9px;
+}
+.navbar .dropdown-menu:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #1a1515;
+  position: absolute;
+  top: -6px;
+  left: 10px;
+}
+.navbar-fixed-bottom .dropdown-menu:before {
+  border-top: 7px solid #ccc;
+  border-top-color: rgba(0, 0, 0, 0.2);
+  border-bottom: 0;
+  bottom: -7px;
+  top: auto;
+}
+.navbar-fixed-bottom .dropdown-menu:after {
+  border-top: 6px solid #1a1515;
+  border-bottom: 0;
+  bottom: -6px;
+  top: auto;
+}
+.navbar .nav li.dropdown .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open .caret {
+  border-top-color: #1a1515;
+  border-bottom-color: #1a1515;
+}
+.navbar .nav li.dropdown.active .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: transparent;
+}
+.navbar .nav li.dropdown.active > .dropdown-toggle:hover {
+  color: #1a1515;
+}
+.navbar .pull-right .dropdown-menu,
+.navbar .dropdown-menu.pull-right {
+  left: auto;
+  right: 0;
+}
+.navbar .pull-right .dropdown-menu:before,
+.navbar .dropdown-menu.pull-right:before {
+  left: auto;
+  right: 12px;
+}
+.navbar .pull-right .dropdown-menu:after,
+.navbar .dropdown-menu.pull-right:after {
+  left: auto;
+  right: 13px;
+}
+.breadcrumb {
+  padding: 7px 14px;
+  margin: 0 0 18px;
+  list-style: none;
+  background-color: #726f6f;
+  background-image: -moz-linear-gradient(top, #1a1515, #f5f5f5);
+  background-image: -ms-linear-gradient(top, #1a1515, #f5f5f5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1a1515), to(#f5f5f5));
+  background-image: -webkit-linear-gradient(top, #1a1515, #f5f5f5);
+  background-image: -o-linear-gradient(top, #1a1515, #f5f5f5);
+  background-image: linear-gradient(top, #1a1515, #f5f5f5);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1515', endColorstr='#f5f5f5', GradientType=0);
+  border: 1px solid #ddd;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 0 #1a1515;
+  -moz-box-shadow: inset 0 1px 0 #1a1515;
+  box-shadow: inset 0 1px 0 #1a1515;
+}
+.breadcrumb li {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  text-shadow: 0 1px 0 #1a1515;
+}
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #E26128;
+}
+.breadcrumb .active a {
+  color: #5e3534;
+}
+.pagination {
+  height: 36px;
+  margin: 18px 0;
+}
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-left: 0;
+  margin-bottom: 0;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+  display: inline;
+}
+.pagination a {
+  float: left;
+  padding: 0 14px;
+  line-height: 34px;
+  text-decoration: none;
+  border: 1px solid #ddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a {
+  background-color: #f5f5f5;
+}
+.pagination .active a {
+  color: #E26128;
+  cursor: default;
+}
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #E26128;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
+.pager {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: none;
+  text-align: center;
+  *zoom: 1;
+}
+.pager:before,
+.pager:after {
+  display: table;
+  content: "";
+}
+.pager:after {
+  clear: both;
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: #E26128;
+  background-color: #fff;
+  cursor: default;
+}
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+.modal-open .popover {
+  z-index: 2060;
+}
+.modal-open .tooltip {
+  z-index: 2070;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #1a1515;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+}
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: #1a1515;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  /* IE6-7 */
+
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.modal.fade {
+  -webkit-transition: opacity .3s linear, top .3s ease-out;
+  -moz-transition: opacity .3s linear, top .3s ease-out;
+  -ms-transition: opacity .3s linear, top .3s ease-out;
+  -o-transition: opacity .3s linear, top .3s ease-out;
+  transition: opacity .3s linear, top .3s ease-out;
+  top: -25%;
+}
+.modal.fade.in {
+  top: 50%;
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+.modal-header .close {
+  margin-top: 2px;
+}
+.modal-body {
+  overflow-y: auto;
+  max-height: 400px;
+  padding: 15px;
+}
+.modal-form {
+  margin-bottom: 0;
+}
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+  -webkit-box-shadow: inset 0 1px 0 #1a1515;
+  -moz-box-shadow: inset 0 1px 0 #1a1515;
+  box-shadow: inset 0 1px 0 #1a1515;
+  *zoom: 1;
+}
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: "";
+}
+.modal-footer:after {
+  clear: both;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.tooltip {
+  position: absolute;
+  z-index: 1020;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.tooltip.top {
+  margin-top: -2px;
+}
+.tooltip.right {
+  margin-left: 2px;
+}
+.tooltip.bottom {
+  margin-top: 2px;
+}
+.tooltip.left {
+  margin-left: -2px;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid #1a1515;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-left: 5px solid #1a1515;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid #1a1515;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-right: 5px solid #1a1515;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #1a1515;
+  text-align: center;
+  text-decoration: none;
+  background-color: #1a1515;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  padding: 5px;
+}
+.popover.top {
+  margin-top: -5px;
+}
+.popover.right {
+  margin-left: 5px;
+}
+.popover.bottom {
+  margin-top: 5px;
+}
+.popover.left {
+  margin-left: -5px;
+}
+.popover.top .arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid #1a1515;
+}
+.popover.right .arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-right: 5px solid #1a1515;
+}
+.popover.bottom .arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-bottom: 5px solid #1a1515;
+}
+.popover.left .arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-top: 5px solid transparent;
+  border-bottom: 5px solid transparent;
+  border-left: 5px solid #1a1515;
+}
+.popover .arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+}
+.popover-inner {
+  padding: 3px;
+  width: 280px;
+  overflow: hidden;
+  background: #1a1515;
+  background: rgba(0, 0, 0, 0.8);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+}
+.popover-title {
+  padding: 9px 15px;
+  line-height: 1;
+  background-color: #f5f5f5;
+  border-bottom: 1px solid #eee;
+  -webkit-border-radius: 3px 3px 0 0;
+  -moz-border-radius: 3px 3px 0 0;
+  border-radius: 3px 3px 0 0;
+}
+.popover-content {
+  padding: 14px;
+  background-color: #1a1515;
+  -webkit-border-radius: 0 0 3px 3px;
+  -moz-border-radius: 0 0 3px 3px;
+  border-radius: 0 0 3px 3px;
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  content: "";
+}
+.thumbnails:after {
+  clear: both;
+}
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+.thumbnails > li {
+  float: left;
+  margin-bottom: 18px;
+  margin-left: 20px;
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 1;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+a.thumbnail:hover {
+  border-color: #E26128;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+}
+.label,
+.badge {
+  font-size: 10.998px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #1a1515;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #E26128;
+}
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+  -moz-border-radius: 9px;
+  border-radius: 9px;
+}
+a.label:hover,
+a.badge:hover {
+  color: #1a1515;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+.label-info,
+.badge-info {
+  background-color: #7B7E8C; /* STE #3a87ad; */
+}
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+.label-inverse,
+.badge-inverse {
+  background-color: #5e3534;
+}
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #3d2222;
+}
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  overflow: hidden;
+  height: 18px;
+  margin-bottom: 18px;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.progress .bar {
+  width: 0%;
+  height: 18px;
+  color: #1a1515;
+  font-size: 12px;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -ms-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(top, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+/*  -webkit-transition: width 0.6s ease;
+  -moz-transition: width 0.6s ease;
+  -ms-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;  STE removed transition*/
+}
+.progress-striped .bar {
+  background-color: #A2412D; /* STE #149bdf */;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+  -moz-background-size: 40px 40px;
+  -o-background-size: 40px 40px;
+  background-size: 40px 40px;
+}
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -moz-animation: progress-bar-stripes 2s linear infinite;
+  -ms-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-danger .bar {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(top, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
+}
+.progress-danger.progress-striped .bar {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-success .bar {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -ms-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(top, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
+}
+.progress-success.progress-striped .bar {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-info .bar {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(top, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
+}
+.progress-info.progress-striped .bar {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-warning .bar {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+}
+.progress-warning.progress-striped .bar {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.accordion {
+  margin-bottom: 18px;
+}
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.accordion-heading {
+  border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+.accordion-toggle {
+  cursor: pointer;
+}
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+.carousel {
+  position: relative;
+  margin-bottom: 18px;
+  line-height: 1;
+}
+.carousel-inner {
+  overflow: hidden;
+  width: 100%;
+  position: relative;
+}
+.carousel .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -moz-transition: 0.6s ease-in-out left;
+  -ms-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+.carousel .active {
+  left: 0;
+}
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel .next {
+  left: 100%;
+}
+.carousel .prev {
+  left: -100%;
+}
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+.carousel .active.left {
+  left: -100%;
+}
+.carousel .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #1a1515;
+  text-align: center;
+  background: #3d2222;
+  border: 3px solid #1a1515;
+  -webkit-border-radius: 23px;
+  -moz-border-radius: 23px;
+  border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.carousel-control.right {
+  left: auto;
+  right: 15px;
+}
+.carousel-control:hover {
+  color: #1a1515;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-caption {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 10px 15px 5px;
+  background: #5e3534;
+  background: rgba(0, 0, 0, 0.75);
+}
+.carousel-caption h4,
+.carousel-caption p {
+  color: #1a1515;
+}
+.hero-unit {
+  padding: 30px; /* STE */
+  margin-bottom: 30px;
+  background-color: #eb9742;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  color: inherit;
+  letter-spacing: -1px;
+}
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 27px;
+  color: inherit;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+.invisible {
+  visibility: hidden;
+}
+
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/css/docs.css b/suite/cts/deviceTests/browserbench/assets/octane/css/docs.css
new file mode 100644
index 0000000..92a4ec8
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/css/docs.css
@@ -0,0 +1,846 @@
+/* Add additional stylesheets below
+-------------------------------------------------- */
+/*
+  Bootstrap's documentation styles
+  Special styles for presenting Bootstrap's documentation and examples
+*/
+
+
+/* Body and structure
+-------------------------------------------------- */
+body {
+  position: relative;
+  padding-top: 90px;
+  background-color: #fff;
+  background-image: url(../img/grid-18px-masked.png);
+  background-repeat: repeat-x;
+  background-position: 0 40px;
+}
+
+
+/* Tweak navbar brand link to be super sleek
+-------------------------------------------------- */
+.navbar-fixed-top .brand {
+  padding-right: 0;
+  padding-left: 0;
+  margin-left: 20px;
+  float: right;
+  font-weight: bold;
+  color: #000;
+  text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125);
+  -webkit-transition: all .2s linear;
+     -moz-transition: all .2s linear;
+          transition: all .2s linear;
+}
+.navbar-fixed-top .brand:hover {
+  text-decoration: none;
+}
+
+
+/* Space out sub-sections more
+-------------------------------------------------- */
+section {
+  padding-top: 60px;
+}
+
+/* Faded out hr */
+hr.soften {
+  height: 1px;
+  margin: 54px 0;
+  background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
+  background-image:    -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
+  background-image:     -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
+  background-image:      -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0));
+  border: 0;
+}
+
+
+/* Jumbotrons
+-------------------------------------------------- */
+.jumbotron {
+  position: relative;
+}
+.jumbotron h1 {
+  margin-bottom: 9px;
+  font-size: 81px;
+  font-weight: bold;
+  letter-spacing: -1px;
+  line-height: 1;
+}
+.jumbotron p {
+  margin-bottom: 18px;
+  font-weight: 300;
+}
+.jumbotron .btn-large {
+  font-size: 20px;
+  font-weight: normal;
+  padding: 14px 24px;
+  margin-right: 10px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+.jumbotron .btn-large small {
+  font-size: 14px;
+}
+
+/* Masthead (docs home) */
+.masthead {
+  padding-top: 36px;
+  margin-bottom: 72px;
+}
+.masthead h1,
+.masthead p {
+  text-align: center;
+}
+.masthead h1 {
+  margin-bottom: 18px;
+}
+.masthead p {
+  margin-left: 5%;
+  margin-right: 5%;
+  font-size: 30px;
+  line-height: 36px;
+}
+
+
+/* Specific jumbotrons
+------------------------- */
+/* supporting docs pages */
+.subhead {
+  padding-bottom: 0;
+  margin-bottom: 9px;
+}
+.subhead h1 {
+  font-size: 54px;
+}
+
+/* Subnav */
+.subnav {
+  width: 100%;
+  height: 36px;
+  background-color: #eeeeee; /* Old browsers */
+  background-repeat: repeat-x; /* Repeat the gradient */
+  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */
+  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); /* Chrome,Safari4+ */
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Chrome 10+,Safari 5.1+ */
+  background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* IE10+ */
+  background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Opera 11.10+ */
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */
+  background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* W3C */
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+.subnav .nav {
+  margin-bottom: 0;
+}
+.subnav .nav > li > a {
+  margin: 0;
+  padding-top:    11px;
+  padding-bottom: 11px;
+  border-left: 1px solid #f5f5f5;
+  border-right: 1px solid #e5e5e5;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+.subnav .nav > .active > a,
+.subnav .nav > .active > a:hover {
+  padding-left: 13px;
+  color: #777;
+  background-color: #e9e9e9;
+  border-right-color: #ddd;
+  border-left: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
+     -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
+          box-shadow: inset 0 3px 5px rgba(0,0,0,.05);
+}
+.subnav .nav > .active > a .caret,
+.subnav .nav > .active > a:hover .caret {
+  border-top-color: #777;
+}
+.subnav .nav > li:first-child > a,
+.subnav .nav > li:first-child > a:hover {
+  border-left: 0;
+  padding-left: 12px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+.subnav .nav > li:last-child > a {
+  border-right: 0;
+}
+.subnav .dropdown-menu {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+/* Fixed subnav on scroll, but only for 980px and up (sorry IE!) */
+@media (min-width: 980px) {
+  .subnav-fixed {
+    position: fixed;
+    top: 40px;
+    left: 0;
+    right: 0;
+    z-index: 1020; /* 10 less than .navbar-fixed to prevent any overlap */
+    border-color: #d5d5d5;
+    border-width: 0 0 1px; /* drop the border on the fixed edges */
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
+       -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
+            box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1);
+    filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */
+  }
+  .subnav-fixed .nav {
+    width: 938px;
+    margin: 0 auto;
+    padding: 0 1px;
+  }
+  .subnav .nav > li:first-child > a,
+  .subnav .nav > li:first-child > a:hover {
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+  }
+}
+
+
+/* Quick links
+-------------------------------------------------- */
+.bs-links {
+  margin: 36px 0;
+}
+.quick-links {
+  min-height: 30px;
+  margin: 0;
+  padding: 5px 20px;
+  list-style: none;
+  text-align: center;
+  overflow: hidden;
+}
+.quick-links:first-child {
+  min-height: 0;
+}
+.quick-links li {
+  display: inline;
+  margin: 0 8px;
+  color: #999;
+}
+.quick-links .github-btn,
+.quick-links .tweet-btn,
+.quick-links .follow-btn {
+  position: relative;
+  top: 5px;
+}
+
+
+/* Marketing section of Overview
+-------------------------------------------------- */
+.marketing .row {
+  margin-bottom: 9px;
+}
+.marketing h1 {
+  margin: 36px 0 27px;
+  font-size: 40px;
+  font-weight: 300;
+  text-align: center;
+}
+.marketing h2,
+.marketing h3 {
+  font-weight: 300;
+}
+.marketing h2 {
+  font-size: 22px;
+}
+.marketing p {
+  margin-right: 10px;
+}
+.marketing .bs-icon {
+  float: left;
+  margin: 7px 10px 0 0;
+  opacity: .8;
+}
+.marketing .small-bs-icon {
+  float: left;
+  margin: 4px 5px 0 0;
+}
+
+
+
+/* Footer
+-------------------------------------------------- */
+.footer {
+  margin-top: 45px;
+  padding: 35px 0 36px;
+  border-top: 1px solid #e5e5e5;
+}
+.footer p {
+  margin-bottom: 0;
+  color: #555;
+}
+
+
+
+/* Special grid styles
+-------------------------------------------------- */
+.show-grid {
+  margin-top: 10px;
+  margin-bottom: 20px;
+}
+.show-grid [class*="span"] {
+  background-color: #eee;
+  text-align: center;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+  min-height: 30px;
+  line-height: 30px;
+}
+.show-grid:hover [class*="span"] {
+  background: #ddd;
+}
+.show-grid .show-grid {
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.show-grid .show-grid [class*="span"] {
+  background-color: #ccc;
+}
+
+
+/* Render mini layout previews
+-------------------------------------------------- */
+.mini-layout {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075);
+     -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075);
+          box-shadow: 0 1px 2px rgba(0,0,0,.075);
+}
+.mini-layout {
+  height: 240px;
+  margin-bottom: 20px;
+  padding: 9px;
+}
+.mini-layout div {
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+.mini-layout .mini-layout-body {
+  background-color: #dceaf4;
+  margin: 0 auto;
+  width: 70%;
+  height: 240px;
+}
+.mini-layout.fluid .mini-layout-sidebar,
+.mini-layout.fluid .mini-layout-header,
+.mini-layout.fluid .mini-layout-body {
+  float: left;
+}
+.mini-layout.fluid .mini-layout-sidebar {
+  background-color: #bbd8e9;
+  width: 20%;
+  height: 240px;
+}
+.mini-layout.fluid .mini-layout-body {
+  width: 77.5%;
+  margin-left: 2.5%;
+}
+
+
+/* Popover docs
+-------------------------------------------------- */
+.popover-well {
+  min-height: 160px;
+}
+.popover-well .popover {
+  display: block;
+}
+.popover-well .popover-wrapper {
+  width: 50%;
+  height: 160px;
+  float: left;
+  margin-left: 55px;
+  position: relative;
+}
+.popover-well .popover-menu-wrapper {
+  height: 80px;
+}
+.large-bird {
+  margin: 5px 0 0 310px;
+  opacity: .1;
+}
+
+
+/* Download page
+-------------------------------------------------- */
+.download .page-header {
+  margin-top: 36px;
+}
+.page-header .toggle-all {
+  margin-top: 5px;
+}
+
+/* Space out h3s when following a section */
+.download h3 {
+  margin-bottom: 5px;
+}
+.download-builder input + h3,
+.download-builder .checkbox + h3 {
+  margin-top: 9px;
+}
+
+/* Fields for variables */
+.download-builder input[type=text] {
+  margin-bottom: 9px;
+  font-family: Menlo, Monaco, "Courier New", monospace;
+  font-size: 12px;
+  color: #d14;
+}
+.download-builder input[type=text]:focus {
+  background-color: #fff;
+}
+
+/* Custom, larger checkbox labels */
+.download .checkbox {
+  padding: 6px 10px 6px 25px;
+  color: #555;
+  background-color: #f9f9f9;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+  cursor: pointer;
+}
+.download .checkbox:hover {
+  color: #333;
+  background-color: #f5f5f5;
+}
+.download .checkbox small {
+  font-size: 12px;
+  color: #777;
+}
+
+/* Variables section */
+#variables label {
+  margin-bottom: 0;
+}
+
+/* Giant download button */
+.download-btn {
+  margin: 36px 0 108px;
+}
+#download p,
+#download h4 {
+  max-width: 50%;
+  margin: 0 auto;
+  color: #999;
+  text-align: center;
+}
+#download h4 {
+  margin-bottom: 0;
+}
+#download p {
+  margin-bottom: 18px;
+}
+.download-btn .btn {
+  display: block;
+  width: auto;
+  padding: 19px 24px;
+  margin-bottom: 27px;
+  font-size: 30px;
+  line-height: 1;
+  text-align: center;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+
+
+/* Color swatches on LESS docs page
+-------------------------------------------------- */
+/* Sets the width of the td */
+.swatch-col {
+  width: 30px;
+}
+/* Le swatch */
+.swatch {
+  display: inline-block;
+  width: 30px;
+  height: 20px;
+  margin: -6px 0;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+/* For white swatches, give a border */
+.swatch-bordered {
+  width: 28px;
+  height: 18px;
+  border: 1px solid #eee;
+}
+
+
+/* Misc
+-------------------------------------------------- */
+
+/* Make tables spaced out a bit more */
+h2 + table,
+h3 + table,
+h4 + table,
+h2 + .row {
+  margin-top: 5px;
+}
+
+/* Example sites showcase */
+.example-sites img {
+  max-width: 100%;
+  margin: 0 auto;
+}
+.marketing-byline {
+  margin: -18px 0 27px;
+  font-size: 18px;
+  font-weight: 300;
+  line-height: 24px;
+  color: #999;
+  text-align: center;
+}
+
+.scrollspy-example {
+  height: 200px;
+  overflow: auto;
+  position: relative;
+}
+
+/* Remove bottom margin on example forms in wells */
+form.well {
+  padding: 14px;
+}
+
+/* Tighten up spacing */
+.well hr {
+  margin: 18px 0;
+}
+
+/* Fake the :focus state to demo it */
+.focused {
+  border-color: rgba(82,168,236,.8);
+  -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
+     -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
+          box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
+  outline: 0;
+}
+
+/* For input sizes, make them display block */
+.docs-input-sizes select,
+.docs-input-sizes input[type=text] {
+  display: block;
+  margin-bottom: 9px;
+}
+
+/* Icons
+------------------------- */
+.the-icons {
+  margin-left: 0;
+  list-style: none;
+}
+.the-icons i:hover {
+  background-color: rgba(255,0,0,.25);
+}
+
+/* Eaxmples page
+------------------------- */
+.bootstrap-examples .thumbnail {
+  margin-bottom: 9px;
+  background-color: #fff;
+}
+
+/* Responsive table
+------------------------- */
+.responsive-utilities th small {
+  display: block;
+  font-weight: normal;
+  color: #999;
+}
+.responsive-utilities tbody th {
+  font-weight: normal;
+}
+.responsive-utilities td {
+  text-align: center;
+}
+.responsive-utilities td.is-visible {
+  color: #468847;
+  background-color: #dff0d8 !important;
+}
+.responsive-utilities td.is-hidden {
+  color: #ccc;
+  background-color: #f9f9f9 !important;
+}
+
+/* Responsive tests
+------------------------- */
+.responsive-utilities-test {
+  margin-top: 5px;
+  margin-left: 0;
+  list-style: none;
+  overflow: hidden; /* clear floats */
+}
+.responsive-utilities-test li {
+  position: relative;
+  float: left;
+  width: 25%;
+  height: 43px;
+  font-size: 14px;
+  font-weight: bold;
+  line-height: 43px;
+  color: #999;
+  text-align: center;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+.responsive-utilities-test li + li {
+  margin-left: 10px;
+}
+.responsive-utilities-test span {
+  position: absolute;
+  top:    -1px;
+  left:   -1px;
+  right:  -1px;
+  bottom: -1px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+.responsive-utilities-test span {
+  color: #468847;
+  background-color: #dff0d8;
+  border: 1px solid #d6e9c6;
+}
+
+
+/* Responsive Docs
+-------------------------------------------------- */
+@media (max-width: 480px) {
+
+  /* Reduce padding above jumbotron */
+  body {
+    padding-top: 70px;
+  }
+
+  /* Change up some type stuff */
+  h2 {
+    margin-top: 27px;
+  }
+  h2 small {
+    display: block;
+    line-height: 18px;
+  }
+  h3 {
+    margin-top: 18px;
+  }
+
+  /* icons */
+  .marketing .bs-icon {
+    margin: 0;
+  }
+
+  /* Adjust the jumbotron */
+  .jumbotron h1,
+  .jumbotron p {
+    text-align: center;
+    margin-right: 0;
+  }
+  .jumbotron h1 {
+    font-size: 45px;
+    margin-right: 0;
+  }
+  .jumbotron p {
+    margin-right: 0;
+    margin-left: 0;
+    font-size: 18px;
+    line-height: 24px;
+  }
+  .jumbotron .btn {
+    display: block;
+    font-size: 18px;
+    padding: 10px 14px;
+    margin: 0 auto 10px;
+  }
+  /* Masthead (home page jumbotron) */
+  .masthead {
+    padding-top: 0;
+  }
+
+  /* Don't space out quick links so much */
+  .quick-links {
+    margin: 40px 0 0;
+  }
+  /* hide the bullets on mobile since our horizontal space is limited */
+  .quick-links .divider {
+    display: none;
+  }
+
+  /* center example sites */
+  .example-sites {
+    margin-left: 0;
+  }
+  .example-sites > li {
+    float: none;
+    display: block;
+    max-width: 280px;
+    margin: 0 auto 18px;
+    text-align: center;
+  }
+  .example-sites .thumbnail > img {
+    max-width: 270px;
+  }
+
+  table code {
+    white-space: normal;
+    word-wrap: break-word;
+    word-break: break-all;
+  }
+
+  /* Modal example */
+  .modal-example .modal {
+    position: relative;
+    top: auto;
+    right: auto;
+    bottom: auto;
+    left: auto;
+  }
+
+}
+
+
+@media (max-width: 768px) {
+
+  /* Remove any padding from the body */
+  body {
+    padding-top: 0;
+  }
+
+  /* Jumbotron buttons */
+  .jumbotron .btn {
+    margin-bottom: 10px;
+  }
+
+  /* Subnav */
+  .subnav {
+    position: static;
+    top: auto;
+    z-index: auto;
+    width: auto;
+    height: auto;
+    background: #fff; /* whole background property since we use a background-image for gradient */
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .subnav .nav > li {
+    float: none;
+  }
+  .subnav .nav > li > a {
+    border: 0;
+  }
+  .subnav .nav > li + li > a {
+    border-top: 1px solid #e5e5e5;
+  }
+  .subnav .nav > li:first-child > a,
+  .subnav .nav > li:first-child > a:hover {
+      -webkit-border-radius: 4px 4px 0 0;
+         -moz-border-radius: 4px 4px 0 0;
+              border-radius: 4px 4px 0 0;
+  }
+
+  /* Popovers */
+  .large-bird {
+    display: none;
+  }
+  .popover-well .popover-wrapper {
+    margin-left: 0;
+  }
+
+  /* Space out the show-grid examples */
+  .show-grid [class*="span"] {
+    margin-bottom: 5px;
+  }
+
+  /* Unfloat the back to top link in footer */
+  .footer .pull-right {
+    float: none;
+  }
+  .footer p {
+    margin-bottom: 9px;
+  }
+
+}
+
+
+@media (min-width: 480px) and (max-width: 768px) {
+
+  /* Scale down the jumbotron content */
+  .jumbotron h1 {
+    font-size: 54px;
+  }
+  .jumbotron p {
+    margin-right: 0;
+    margin-left: 0;
+  }
+
+}
+
+
+@media (min-width: 768px) and (max-width: 980px) {
+
+  /* Remove any padding from the body */
+  body {
+    padding-top: 0;
+  }
+
+  /* Scale down the jumbotron content */
+  .jumbotron h1 {
+    font-size: 72px;
+  }
+
+}
+
+
+@media (max-width: 980px) {
+
+  /* Unfloat brand */
+  .navbar-fixed-top .brand {
+    float: left;
+    margin-left: 0;
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+
+  /* Inline-block quick links for more spacing */
+  .quick-links li {
+    display: inline-block;
+    margin: 5px;
+  }
+
+}
+
+
+/* LARGE DESKTOP SCREENS */
+@media (min-width: 1210px) {
+
+  /* Update subnav container */
+  .subnav-fixed .nav {
+    width: 1168px; /* 2px less to account for left/right borders being removed when in fixed mode */
+  }
+
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/cts_report.html b/suite/cts/deviceTests/browserbench/assets/octane/cts_report.html
new file mode 100644
index 0000000..6dc6f42
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/cts_report.html
@@ -0,0 +1,8 @@
+<!doctype html>
+<html>
+  <head>
+    <title>cts_report</title>
+  </head>
+  <body>
+  </body>
+</html>
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/cts_report.js b/suite/cts/deviceTests/browserbench/assets/octane/cts_report.js
new file mode 100644
index 0000000..ca15479
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/cts_report.js
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+/**
+ *  Utility to report benchmarking result via HTTP POST
+ *  to CTS.
+ * @param msg message to add to the report
+ * @param score resulting score
+ * @param isFinal true if this is the last / final score
+ */
+function CtsReport(msg, score, isFinal)
+{
+    req = new XMLHttpRequest();
+    req.open("POST", "cts_report.html?final=" + (isFinal ? "1" : "0") +
+             "&score=" + score + "&message=" + msg, false);
+    req.send(null)
+}
+
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/deltablue.js b/suite/cts/deviceTests/browserbench/assets/octane/deltablue.js
new file mode 100644
index 0000000..70d3b01
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/deltablue.js
@@ -0,0 +1,883 @@
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Copyright 1996 John Maloney and Mario Wolczko.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+// This implementation of the DeltaBlue benchmark is derived
+// from the Smalltalk implementation by John Maloney and Mario
+// Wolczko. Some parts have been translated directly, whereas
+// others have been modified more aggresively to make it feel
+// more like a JavaScript program.
+
+
+var DeltaBlue = new BenchmarkSuite('DeltaBlue', 66118, [
+  new Benchmark('DeltaBlue', deltaBlue)
+]);
+
+
+/**
+ * A JavaScript implementation of the DeltaBlue constraint-solving
+ * algorithm, as described in:
+ *
+ * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
+ *   Bjorn N. Freeman-Benson and John Maloney
+ *   January 1990 Communications of the ACM,
+ *   also available as University of Washington TR 89-08-06.
+ *
+ * Beware: this benchmark is written in a grotesque style where
+ * the constraint model is built by side-effects from constructors.
+ * I've kept it this way to avoid deviating too much from the original
+ * implementation.
+ */
+
+
+/* --- O b j e c t   M o d e l --- */
+
+Object.defineProperty(Object.prototype, "inheritsFrom", {
+  
+  value: function (shuper) {
+    function Inheriter() { }
+    Inheriter.prototype = shuper.prototype;
+    this.prototype = new Inheriter();
+    this.superConstructor = shuper;
+  }
+});
+
+function OrderedCollection() {
+  this.elms = new Array();
+}
+
+OrderedCollection.prototype.add = function (elm) {
+  this.elms.push(elm);
+}
+
+OrderedCollection.prototype.at = function (index) {
+  return this.elms[index];
+}
+
+OrderedCollection.prototype.size = function () {
+  return this.elms.length;
+}
+
+OrderedCollection.prototype.removeFirst = function () {
+  return this.elms.pop();
+}
+
+OrderedCollection.prototype.remove = function (elm) {
+  var index = 0, skipped = 0;
+  for (var i = 0; i < this.elms.length; i++) {
+    var value = this.elms[i];
+    if (value != elm) {
+      this.elms[index] = value;
+      index++;
+    } else {
+      skipped++;
+    }
+  }
+  for (var i = 0; i < skipped; i++)
+    this.elms.pop();
+}
+
+/* --- *
+ * S t r e n g t h
+ * --- */
+
+/**
+ * Strengths are used to measure the relative importance of constraints.
+ * New strengths may be inserted in the strength hierarchy without
+ * disrupting current constraints.  Strengths cannot be created outside
+ * this class, so pointer comparison can be used for value comparison.
+ */
+function Strength(strengthValue, name) {
+  this.strengthValue = strengthValue;
+  this.name = name;
+}
+
+Strength.stronger = function (s1, s2) {
+  return s1.strengthValue < s2.strengthValue;
+}
+
+Strength.weaker = function (s1, s2) {
+  return s1.strengthValue > s2.strengthValue;
+}
+
+Strength.weakestOf = function (s1, s2) {
+  return this.weaker(s1, s2) ? s1 : s2;
+}
+
+Strength.strongest = function (s1, s2) {
+  return this.stronger(s1, s2) ? s1 : s2;
+}
+
+Strength.prototype.nextWeaker = function () {
+  switch (this.strengthValue) {
+    case 0: return Strength.WEAKEST;
+    case 1: return Strength.WEAK_DEFAULT;
+    case 2: return Strength.NORMAL;
+    case 3: return Strength.STRONG_DEFAULT;
+    case 4: return Strength.PREFERRED;
+    case 5: return Strength.REQUIRED;
+  }
+}
+
+// Strength constants.
+Strength.REQUIRED        = new Strength(0, "required");
+Strength.STONG_PREFERRED = new Strength(1, "strongPreferred");
+Strength.PREFERRED       = new Strength(2, "preferred");
+Strength.STRONG_DEFAULT  = new Strength(3, "strongDefault");
+Strength.NORMAL          = new Strength(4, "normal");
+Strength.WEAK_DEFAULT    = new Strength(5, "weakDefault");
+Strength.WEAKEST         = new Strength(6, "weakest");
+
+/* --- *
+ * C o n s t r a i n t
+ * --- */
+
+/**
+ * An abstract class representing a system-maintainable relationship
+ * (or "constraint") between a set of variables. A constraint supplies
+ * a strength instance variable; concrete subclasses provide a means
+ * of storing the constrained variables and other information required
+ * to represent a constraint.
+ */
+function Constraint(strength) {
+  this.strength = strength;
+}
+
+/**
+ * Activate this constraint and attempt to satisfy it.
+ */
+Constraint.prototype.addConstraint = function () {
+  this.addToGraph();
+  planner.incrementalAdd(this);
+}
+
+/**
+ * Attempt to find a way to enforce this constraint. If successful,
+ * record the solution, perhaps modifying the current dataflow
+ * graph. Answer the constraint that this constraint overrides, if
+ * there is one, or nil, if there isn't.
+ * Assume: I am not already satisfied.
+ */
+Constraint.prototype.satisfy = function (mark) {
+  this.chooseMethod(mark);
+  if (!this.isSatisfied()) {
+    if (this.strength == Strength.REQUIRED)
+      alert("Could not satisfy a required constraint!");
+    return null;
+  }
+  this.markInputs(mark);
+  var out = this.output();
+  var overridden = out.determinedBy;
+  if (overridden != null) overridden.markUnsatisfied();
+  out.determinedBy = this;
+  if (!planner.addPropagate(this, mark))
+    alert("Cycle encountered");
+  out.mark = mark;
+  return overridden;
+}
+
+Constraint.prototype.destroyConstraint = function () {
+  if (this.isSatisfied()) planner.incrementalRemove(this);
+  else this.removeFromGraph();
+}
+
+/**
+ * Normal constraints are not input constraints.  An input constraint
+ * is one that depends on external state, such as the mouse, the
+ * keybord, a clock, or some arbitraty piece of imperative code.
+ */
+Constraint.prototype.isInput = function () {
+  return false;
+}
+
+/* --- *
+ * U n a r y   C o n s t r a i n t
+ * --- */
+
+/**
+ * Abstract superclass for constraints having a single possible output
+ * variable.
+ */
+function UnaryConstraint(v, strength) {
+  UnaryConstraint.superConstructor.call(this, strength);
+  this.myOutput = v;
+  this.satisfied = false;
+  this.addConstraint();
+}
+
+UnaryConstraint.inheritsFrom(Constraint);
+
+/**
+ * Adds this constraint to the constraint graph
+ */
+UnaryConstraint.prototype.addToGraph = function () {
+  this.myOutput.addConstraint(this);
+  this.satisfied = false;
+}
+
+/**
+ * Decides if this constraint can be satisfied and records that
+ * decision.
+ */
+UnaryConstraint.prototype.chooseMethod = function (mark) {
+  this.satisfied = (this.myOutput.mark != mark)
+    && Strength.stronger(this.strength, this.myOutput.walkStrength);
+}
+
+/**
+ * Returns true if this constraint is satisfied in the current solution.
+ */
+UnaryConstraint.prototype.isSatisfied = function () {
+  return this.satisfied;
+}
+
+UnaryConstraint.prototype.markInputs = function (mark) {
+  // has no inputs
+}
+
+/**
+ * Returns the current output variable.
+ */
+UnaryConstraint.prototype.output = function () {
+  return this.myOutput;
+}
+
+/**
+ * Calculate the walkabout strength, the stay flag, and, if it is
+ * 'stay', the value for the current output of this constraint. Assume
+ * this constraint is satisfied.
+ */
+UnaryConstraint.prototype.recalculate = function () {
+  this.myOutput.walkStrength = this.strength;
+  this.myOutput.stay = !this.isInput();
+  if (this.myOutput.stay) this.execute(); // Stay optimization
+}
+
+/**
+ * Records that this constraint is unsatisfied
+ */
+UnaryConstraint.prototype.markUnsatisfied = function () {
+  this.satisfied = false;
+}
+
+UnaryConstraint.prototype.inputsKnown = function () {
+  return true;
+}
+
+UnaryConstraint.prototype.removeFromGraph = function () {
+  if (this.myOutput != null) this.myOutput.removeConstraint(this);
+  this.satisfied = false;
+}
+
+/* --- *
+ * S t a y   C o n s t r a i n t
+ * --- */
+
+/**
+ * Variables that should, with some level of preference, stay the same.
+ * Planners may exploit the fact that instances, if satisfied, will not
+ * change their output during plan execution.  This is called "stay
+ * optimization".
+ */
+function StayConstraint(v, str) {
+  StayConstraint.superConstructor.call(this, v, str);
+}
+
+StayConstraint.inheritsFrom(UnaryConstraint);
+
+StayConstraint.prototype.execute = function () {
+  // Stay constraints do nothing
+}
+
+/* --- *
+ * E d i t   C o n s t r a i n t
+ * --- */
+
+/**
+ * A unary input constraint used to mark a variable that the client
+ * wishes to change.
+ */
+function EditConstraint(v, str) {
+  EditConstraint.superConstructor.call(this, v, str);
+}
+
+EditConstraint.inheritsFrom(UnaryConstraint);
+
+/**
+ * Edits indicate that a variable is to be changed by imperative code.
+ */
+EditConstraint.prototype.isInput = function () {
+  return true;
+}
+
+EditConstraint.prototype.execute = function () {
+  // Edit constraints do nothing
+}
+
+/* --- *
+ * B i n a r y   C o n s t r a i n t
+ * --- */
+
+var Direction = new Object();
+Direction.NONE     = 0;
+Direction.FORWARD  = 1;
+Direction.BACKWARD = -1;
+
+/**
+ * Abstract superclass for constraints having two possible output
+ * variables.
+ */
+function BinaryConstraint(var1, var2, strength) {
+  BinaryConstraint.superConstructor.call(this, strength);
+  this.v1 = var1;
+  this.v2 = var2;
+  this.direction = Direction.NONE;
+  this.addConstraint();
+}
+
+BinaryConstraint.inheritsFrom(Constraint);
+
+/**
+ * Decides if this constraint can be satisfied and which way it
+ * should flow based on the relative strength of the variables related,
+ * and record that decision.
+ */
+BinaryConstraint.prototype.chooseMethod = function (mark) {
+  if (this.v1.mark == mark) {
+    this.direction = (this.v2.mark != mark && Strength.stronger(this.strength, this.v2.walkStrength))
+      ? Direction.FORWARD
+      : Direction.NONE;
+  }
+  if (this.v2.mark == mark) {
+    this.direction = (this.v1.mark != mark && Strength.stronger(this.strength, this.v1.walkStrength))
+      ? Direction.BACKWARD
+      : Direction.NONE;
+  }
+  if (Strength.weaker(this.v1.walkStrength, this.v2.walkStrength)) {
+    this.direction = Strength.stronger(this.strength, this.v1.walkStrength)
+      ? Direction.BACKWARD
+      : Direction.NONE;
+  } else {
+    this.direction = Strength.stronger(this.strength, this.v2.walkStrength)
+      ? Direction.FORWARD
+      : Direction.BACKWARD
+  }
+}
+
+/**
+ * Add this constraint to the constraint graph
+ */
+BinaryConstraint.prototype.addToGraph = function () {
+  this.v1.addConstraint(this);
+  this.v2.addConstraint(this);
+  this.direction = Direction.NONE;
+}
+
+/**
+ * Answer true if this constraint is satisfied in the current solution.
+ */
+BinaryConstraint.prototype.isSatisfied = function () {
+  return this.direction != Direction.NONE;
+}
+
+/**
+ * Mark the input variable with the given mark.
+ */
+BinaryConstraint.prototype.markInputs = function (mark) {
+  this.input().mark = mark;
+}
+
+/**
+ * Returns the current input variable
+ */
+BinaryConstraint.prototype.input = function () {
+  return (this.direction == Direction.FORWARD) ? this.v1 : this.v2;
+}
+
+/**
+ * Returns the current output variable
+ */
+BinaryConstraint.prototype.output = function () {
+  return (this.direction == Direction.FORWARD) ? this.v2 : this.v1;
+}
+
+/**
+ * Calculate the walkabout strength, the stay flag, and, if it is
+ * 'stay', the value for the current output of this
+ * constraint. Assume this constraint is satisfied.
+ */
+BinaryConstraint.prototype.recalculate = function () {
+  var ihn = this.input(), out = this.output();
+  out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength);
+  out.stay = ihn.stay;
+  if (out.stay) this.execute();
+}
+
+/**
+ * Record the fact that this constraint is unsatisfied.
+ */
+BinaryConstraint.prototype.markUnsatisfied = function () {
+  this.direction = Direction.NONE;
+}
+
+BinaryConstraint.prototype.inputsKnown = function (mark) {
+  var i = this.input();
+  return i.mark == mark || i.stay || i.determinedBy == null;
+}
+
+BinaryConstraint.prototype.removeFromGraph = function () {
+  if (this.v1 != null) this.v1.removeConstraint(this);
+  if (this.v2 != null) this.v2.removeConstraint(this);
+  this.direction = Direction.NONE;
+}
+
+/* --- *
+ * S c a l e   C o n s t r a i n t
+ * --- */
+
+/**
+ * Relates two variables by the linear scaling relationship: "v2 =
+ * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
+ * this relationship but the scale factor and offset are considered
+ * read-only.
+ */
+function ScaleConstraint(src, scale, offset, dest, strength) {
+  this.direction = Direction.NONE;
+  this.scale = scale;
+  this.offset = offset;
+  ScaleConstraint.superConstructor.call(this, src, dest, strength);
+}
+
+ScaleConstraint.inheritsFrom(BinaryConstraint);
+
+/**
+ * Adds this constraint to the constraint graph.
+ */
+ScaleConstraint.prototype.addToGraph = function () {
+  ScaleConstraint.superConstructor.prototype.addToGraph.call(this);
+  this.scale.addConstraint(this);
+  this.offset.addConstraint(this);
+}
+
+ScaleConstraint.prototype.removeFromGraph = function () {
+  ScaleConstraint.superConstructor.prototype.removeFromGraph.call(this);
+  if (this.scale != null) this.scale.removeConstraint(this);
+  if (this.offset != null) this.offset.removeConstraint(this);
+}
+
+ScaleConstraint.prototype.markInputs = function (mark) {
+  ScaleConstraint.superConstructor.prototype.markInputs.call(this, mark);
+  this.scale.mark = this.offset.mark = mark;
+}
+
+/**
+ * Enforce this constraint. Assume that it is satisfied.
+ */
+ScaleConstraint.prototype.execute = function () {
+  if (this.direction == Direction.FORWARD) {
+    this.v2.value = this.v1.value * this.scale.value + this.offset.value;
+  } else {
+    this.v1.value = (this.v2.value - this.offset.value) / this.scale.value;
+  }
+}
+
+/**
+ * Calculate the walkabout strength, the stay flag, and, if it is
+ * 'stay', the value for the current output of this constraint. Assume
+ * this constraint is satisfied.
+ */
+ScaleConstraint.prototype.recalculate = function () {
+  var ihn = this.input(), out = this.output();
+  out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength);
+  out.stay = ihn.stay && this.scale.stay && this.offset.stay;
+  if (out.stay) this.execute();
+}
+
+/* --- *
+ * E q u a l i t  y   C o n s t r a i n t
+ * --- */
+
+/**
+ * Constrains two variables to have the same value.
+ */
+function EqualityConstraint(var1, var2, strength) {
+  EqualityConstraint.superConstructor.call(this, var1, var2, strength);
+}
+
+EqualityConstraint.inheritsFrom(BinaryConstraint);
+
+/**
+ * Enforce this constraint. Assume that it is satisfied.
+ */
+EqualityConstraint.prototype.execute = function () {
+  this.output().value = this.input().value;
+}
+
+/* --- *
+ * V a r i a b l e
+ * --- */
+
+/**
+ * A constrained variable. In addition to its value, it maintain the
+ * structure of the constraint graph, the current dataflow graph, and
+ * various parameters of interest to the DeltaBlue incremental
+ * constraint solver.
+ **/
+function Variable(name, initialValue) {
+  this.value = initialValue || 0;
+  this.constraints = new OrderedCollection();
+  this.determinedBy = null;
+  this.mark = 0;
+  this.walkStrength = Strength.WEAKEST;
+  this.stay = true;
+  this.name = name;
+}
+
+/**
+ * Add the given constraint to the set of all constraints that refer
+ * this variable.
+ */
+Variable.prototype.addConstraint = function (c) {
+  this.constraints.add(c);
+}
+
+/**
+ * Removes all traces of c from this variable.
+ */
+Variable.prototype.removeConstraint = function (c) {
+  this.constraints.remove(c);
+  if (this.determinedBy == c) this.determinedBy = null;
+}
+
+/* --- *
+ * P l a n n e r
+ * --- */
+
+/**
+ * The DeltaBlue planner
+ */
+function Planner() {
+  this.currentMark = 0;
+}
+
+/**
+ * Attempt to satisfy the given constraint and, if successful,
+ * incrementally update the dataflow graph.  Details: If satifying
+ * the constraint is successful, it may override a weaker constraint
+ * on its output. The algorithm attempts to resatisfy that
+ * constraint using some other method. This process is repeated
+ * until either a) it reaches a variable that was not previously
+ * determined by any constraint or b) it reaches a constraint that
+ * is too weak to be satisfied using any of its methods. The
+ * variables of constraints that have been processed are marked with
+ * a unique mark value so that we know where we've been. This allows
+ * the algorithm to avoid getting into an infinite loop even if the
+ * constraint graph has an inadvertent cycle.
+ */
+Planner.prototype.incrementalAdd = function (c) {
+  var mark = this.newMark();
+  var overridden = c.satisfy(mark);
+  while (overridden != null)
+    overridden = overridden.satisfy(mark);
+}
+
+/**
+ * Entry point for retracting a constraint. Remove the given
+ * constraint and incrementally update the dataflow graph.
+ * Details: Retracting the given constraint may allow some currently
+ * unsatisfiable downstream constraint to be satisfied. We therefore collect
+ * a list of unsatisfied downstream constraints and attempt to
+ * satisfy each one in turn. This list is traversed by constraint
+ * strength, strongest first, as a heuristic for avoiding
+ * unnecessarily adding and then overriding weak constraints.
+ * Assume: c is satisfied.
+ */
+Planner.prototype.incrementalRemove = function (c) {
+  var out = c.output();
+  c.markUnsatisfied();
+  c.removeFromGraph();
+  var unsatisfied = this.removePropagateFrom(out);
+  var strength = Strength.REQUIRED;
+  do {
+    for (var i = 0; i < unsatisfied.size(); i++) {
+      var u = unsatisfied.at(i);
+      if (u.strength == strength)
+        this.incrementalAdd(u);
+    }
+    strength = strength.nextWeaker();
+  } while (strength != Strength.WEAKEST);
+}
+
+/**
+ * Select a previously unused mark value.
+ */
+Planner.prototype.newMark = function () {
+  return ++this.currentMark;
+}
+
+/**
+ * Extract a plan for resatisfaction starting from the given source
+ * constraints, usually a set of input constraints. This method
+ * assumes that stay optimization is desired; the plan will contain
+ * only constraints whose output variables are not stay. Constraints
+ * that do no computation, such as stay and edit constraints, are
+ * not included in the plan.
+ * Details: The outputs of a constraint are marked when it is added
+ * to the plan under construction. A constraint may be appended to
+ * the plan when all its input variables are known. A variable is
+ * known if either a) the variable is marked (indicating that has
+ * been computed by a constraint appearing earlier in the plan), b)
+ * the variable is 'stay' (i.e. it is a constant at plan execution
+ * time), or c) the variable is not determined by any
+ * constraint. The last provision is for past states of history
+ * variables, which are not stay but which are also not computed by
+ * any constraint.
+ * Assume: sources are all satisfied.
+ */
+Planner.prototype.makePlan = function (sources) {
+  var mark = this.newMark();
+  var plan = new Plan();
+  var todo = sources;
+  while (todo.size() > 0) {
+    var c = todo.removeFirst();
+    if (c.output().mark != mark && c.inputsKnown(mark)) {
+      plan.addConstraint(c);
+      c.output().mark = mark;
+      this.addConstraintsConsumingTo(c.output(), todo);
+    }
+  }
+  return plan;
+}
+
+/**
+ * Extract a plan for resatisfying starting from the output of the
+ * given constraints, usually a set of input constraints.
+ */
+Planner.prototype.extractPlanFromConstraints = function (constraints) {
+  var sources = new OrderedCollection();
+  for (var i = 0; i < constraints.size(); i++) {
+    var c = constraints.at(i);
+    if (c.isInput() && c.isSatisfied())
+      // not in plan already and eligible for inclusion
+      sources.add(c);
+  }
+  return this.makePlan(sources);
+}
+
+/**
+ * Recompute the walkabout strengths and stay flags of all variables
+ * downstream of the given constraint and recompute the actual
+ * values of all variables whose stay flag is true. If a cycle is
+ * detected, remove the given constraint and answer
+ * false. Otherwise, answer true.
+ * Details: Cycles are detected when a marked variable is
+ * encountered downstream of the given constraint. The sender is
+ * assumed to have marked the inputs of the given constraint with
+ * the given mark. Thus, encountering a marked node downstream of
+ * the output constraint means that there is a path from the
+ * constraint's output to one of its inputs.
+ */
+Planner.prototype.addPropagate = function (c, mark) {
+  var todo = new OrderedCollection();
+  todo.add(c);
+  while (todo.size() > 0) {
+    var d = todo.removeFirst();
+    if (d.output().mark == mark) {
+      this.incrementalRemove(c);
+      return false;
+    }
+    d.recalculate();
+    this.addConstraintsConsumingTo(d.output(), todo);
+  }
+  return true;
+}
+
+
+/**
+ * Update the walkabout strengths and stay flags of all variables
+ * downstream of the given constraint. Answer a collection of
+ * unsatisfied constraints sorted in order of decreasing strength.
+ */
+Planner.prototype.removePropagateFrom = function (out) {
+  out.determinedBy = null;
+  out.walkStrength = Strength.WEAKEST;
+  out.stay = true;
+  var unsatisfied = new OrderedCollection();
+  var todo = new OrderedCollection();
+  todo.add(out);
+  while (todo.size() > 0) {
+    var v = todo.removeFirst();
+    for (var i = 0; i < v.constraints.size(); i++) {
+      var c = v.constraints.at(i);
+      if (!c.isSatisfied())
+        unsatisfied.add(c);
+    }
+    var determining = v.determinedBy;
+    for (var i = 0; i < v.constraints.size(); i++) {
+      var next = v.constraints.at(i);
+      if (next != determining && next.isSatisfied()) {
+        next.recalculate();
+        todo.add(next.output());
+      }
+    }
+  }
+  return unsatisfied;
+}
+
+Planner.prototype.addConstraintsConsumingTo = function (v, coll) {
+  var determining = v.determinedBy;
+  var cc = v.constraints;
+  for (var i = 0; i < cc.size(); i++) {
+    var c = cc.at(i);
+    if (c != determining && c.isSatisfied())
+      coll.add(c);
+  }
+}
+
+/* --- *
+ * P l a n
+ * --- */
+
+/**
+ * A Plan is an ordered list of constraints to be executed in sequence
+ * to resatisfy all currently satisfiable constraints in the face of
+ * one or more changing inputs.
+ */
+function Plan() {
+  this.v = new OrderedCollection();
+}
+
+Plan.prototype.addConstraint = function (c) {
+  this.v.add(c);
+}
+
+Plan.prototype.size = function () {
+  return this.v.size();
+}
+
+Plan.prototype.constraintAt = function (index) {
+  return this.v.at(index);
+}
+
+Plan.prototype.execute = function () {
+  for (var i = 0; i < this.size(); i++) {
+    var c = this.constraintAt(i);
+    c.execute();
+  }
+}
+
+/* --- *
+ * M a i n
+ * --- */
+
+/**
+ * This is the standard DeltaBlue benchmark. A long chain of equality
+ * constraints is constructed with a stay constraint on one end. An
+ * edit constraint is then added to the opposite end and the time is
+ * measured for adding and removing this constraint, and extracting
+ * and executing a constraint satisfaction plan. There are two cases.
+ * In case 1, the added constraint is stronger than the stay
+ * constraint and values must propagate down the entire length of the
+ * chain. In case 2, the added constraint is weaker than the stay
+ * constraint so it cannot be accomodated. The cost in this case is,
+ * of course, very low. Typical situations lie somewhere between these
+ * two extremes.
+ */
+function chainTest(n) {
+  planner = new Planner();
+  var prev = null, first = null, last = null;
+
+  // Build chain of n equality constraints
+  for (var i = 0; i <= n; i++) {
+    var name = "v" + i;
+    var v = new Variable(name);
+    if (prev != null)
+      new EqualityConstraint(prev, v, Strength.REQUIRED);
+    if (i == 0) first = v;
+    if (i == n) last = v;
+    prev = v;
+  }
+
+  new StayConstraint(last, Strength.STRONG_DEFAULT);
+  var edit = new EditConstraint(first, Strength.PREFERRED);
+  var edits = new OrderedCollection();
+  edits.add(edit);
+  var plan = planner.extractPlanFromConstraints(edits);
+  for (var i = 0; i < 100; i++) {
+    first.value = i;
+    plan.execute();
+    if (last.value != i)
+      alert("Chain test failed.");
+  }
+}
+
+/**
+ * This test constructs a two sets of variables related to each
+ * other by a simple linear transformation (scale and offset). The
+ * time is measured to change a variable on either side of the
+ * mapping and to change the scale and offset factors.
+ */
+function projectionTest(n) {
+  planner = new Planner();
+  var scale = new Variable("scale", 10);
+  var offset = new Variable("offset", 1000);
+  var src = null, dst = null;
+
+  var dests = new OrderedCollection();
+  for (var i = 0; i < n; i++) {
+    src = new Variable("src" + i, i);
+    dst = new Variable("dst" + i, i);
+    dests.add(dst);
+    new StayConstraint(src, Strength.NORMAL);
+    new ScaleConstraint(src, scale, offset, dst, Strength.REQUIRED);
+  }
+
+  change(src, 17);
+  if (dst.value != 1170) alert("Projection 1 failed");
+  change(dst, 1050);
+  if (src.value != 5) alert("Projection 2 failed");
+  change(scale, 5);
+  for (var i = 0; i < n - 1; i++) {
+    if (dests.at(i).value != i * 5 + 1000)
+      alert("Projection 3 failed");
+  }
+  change(offset, 2000);
+  for (var i = 0; i < n - 1; i++) {
+    if (dests.at(i).value != i * 5 + 2000)
+      alert("Projection 4 failed");
+  }
+}
+
+function change(v, newValue) {
+  var edit = new EditConstraint(v, Strength.PREFERRED);
+  var edits = new OrderedCollection();
+  edits.add(edit);
+  var plan = planner.extractPlanFromConstraints(edits);
+  for (var i = 0; i < 10; i++) {
+    v.value = newValue;
+    plan.execute();
+  }
+  edit.destroyConstraint();
+}
+
+// Global variable holding the current planner.
+var planner = null;
+
+function deltaBlue() {
+  chainTest(100);
+  projectionTest(100);
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/earley-boyer.js b/suite/cts/deviceTests/browserbench/assets/octane/earley-boyer.js
new file mode 100644
index 0000000..b2328d6
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/earley-boyer.js
@@ -0,0 +1,4684 @@
+// This file is automatically generated by scheme2js, except for the
+// benchmark harness code at the beginning and end of the file.
+
+var EarleyBoyer = new BenchmarkSuite('EarleyBoyer', 666463, [
+  new Benchmark("Earley", function () { BgL_earleyzd2benchmarkzd2(); }),
+  new Benchmark("Boyer", function () { BgL_nboyerzd2benchmarkzd2(); })
+]);
+
+
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/************* GENERATED FILE - DO NOT EDIT *************/
+/*
+ * To use write/prints/... the default-output port has to be set first.
+ * Simply setting SC_DEFAULT_OUT and SC_ERROR_OUT to the desired values
+ * should do the trick.
+ * In the following example the std-out and error-port are redirected to
+ * a DIV.
+function initRuntime() {
+    function escapeHTML(s) {
+	var tmp = s;
+	tmp = tmp.replace(/&/g, "&amp;");
+	tmp = tmp.replace(/</g, "&lt;");
+	tmp = tmp.replace(/>/g, "&gt;");
+	tmp = tmp.replace(/ /g, "&nbsp;");
+	tmp = tmp.replace(/\n/g, "<br />");
+	tmp = tmp.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp");
+	return tmp;
+	
+    }
+
+    document.write("<div id='stdout'></div>");
+    SC_DEFAULT_OUT = new sc_GenericOutputPort(
+	function(s) {
+	    var stdout = document.getElementById('stdout');
+	    stdout.innerHTML = stdout.innerHTML + escapeHTML(s);
+	});
+    SC_ERROR_OUT = SC_DEFAULT_OUT;
+}
+*/
+
+
+function sc_print_debug() {
+    sc_print.apply(null, arguments);
+}
+/*** META ((export *js*)) */
+var sc_JS_GLOBALS = this;
+
+var __sc_LINE=-1;
+var __sc_FILE="";
+
+/*** META ((export #t)) */
+function sc_alert() {
+   var len = arguments.length;
+   var s = "";
+   var i;
+
+   for( i = 0; i < len; i++ ) {
+       s += sc_toDisplayString(arguments[ i ]);
+   }
+
+   return alert( s );
+}
+
+/*** META ((export #t)) */
+function sc_typeof( x ) {
+   return typeof x;
+}
+
+/*** META ((export #t)) */
+function sc_error() {
+    var a = [sc_jsstring2symbol("*error*")];
+    for (var i = 0; i < arguments.length; i++) {
+	a[i+1] = arguments[i];
+    }
+    throw a;
+}
+
+/*** META ((export #t)
+           (peephole (prefix "throw ")))
+*/
+function sc_raise(obj) {
+    throw obj;
+}
+
+/*** META ((export with-handler-lambda)) */
+function sc_withHandlerLambda(handler, body) {
+    try {
+	return body();
+    } catch(e) {
+	if (!e._internalException)
+	    return handler(e);
+	else
+	    throw e;
+    }
+}
+
+var sc_properties = new Object();
+
+/*** META ((export #t)) */
+function sc_putpropBang(sym, key, val) {
+    var ht = sc_properties[sym];
+    if (!ht) {
+	ht = new Object();
+	sc_properties[sym] = ht;
+    }
+    ht[key] = val;
+}
+
+/*** META ((export #t)) */
+function sc_getprop(sym, key) {
+    var ht = sc_properties[sym];
+    if (ht) {
+	if (key in ht)
+	    return ht[key];
+	else
+	    return false;
+    } else
+	return false;
+}
+
+/*** META ((export #t)) */
+function sc_rempropBang(sym, key) {
+    var ht = sc_properties[sym];
+    if (ht)
+	delete ht[key];
+}
+
+/*** META ((export #t)) */
+function sc_any2String(o) {
+    return jsstring2string(sc_toDisplayString(o));
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "==="))
+           (type bool))
+*/
+function sc_isEqv(o1, o2) {
+    return (o1 === o2);
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "==="))
+           (type bool))
+*/
+function sc_isEq(o1, o2) {
+    return (o1 === o2);
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isNumber(n) {
+    return (typeof n === "number");
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isComplex(n) {
+    return sc_isNumber(n);
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isReal(n) {
+    return sc_isNumber(n);
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isRational(n) {
+    return sc_isReal(n);
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isInteger(n) {
+    return (parseInt(n) === n);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix ", false")))
+*/
+// we don't have exact numbers...
+function sc_isExact(n) {
+    return false;
+}
+
+/*** META ((export #t)
+           (peephole (postfix ", true"))
+	   (type bool))
+*/
+function sc_isInexact(n) {
+    return true;
+}
+
+/*** META ((export = =fx =fl)
+           (type bool)
+           (peephole (infix 2 2 "===")))
+*/
+function sc_equal(x) {
+    for (var i = 1; i < arguments.length; i++)
+	if (x !== arguments[i])
+	    return false;
+    return true;
+}
+
+/*** META ((export < <fx <fl)
+           (type bool)
+           (peephole (infix 2 2 "<")))
+*/
+function sc_less(x) {
+    for (var i = 1; i < arguments.length; i++) {
+	if (x >= arguments[i])
+	    return false;
+	x = arguments[i];
+    }
+    return true;
+}
+
+/*** META ((export > >fx >fl)
+           (type bool)
+           (peephole (infix 2 2 ">")))
+*/
+function sc_greater(x, y) {
+    for (var i = 1; i < arguments.length; i++) {
+	if (x <= arguments[i])
+	    return false;
+	x = arguments[i];
+    }
+    return true;
+}
+
+/*** META ((export <= <=fx <=fl)
+           (type bool)
+           (peephole (infix 2 2 "<=")))
+*/
+function sc_lessEqual(x, y) {
+    for (var i = 1; i < arguments.length; i++) {
+	if (x > arguments[i])
+	    return false;
+	x = arguments[i];
+    }
+    return true;
+}
+
+/*** META ((export >= >=fl >=fx)
+           (type bool)
+           (peephole (infix 2 2 ">=")))
+*/
+function sc_greaterEqual(x, y) {
+    for (var i = 1; i < arguments.length; i++) {
+	if (x < arguments[i])
+	    return false;
+	x = arguments[i];
+    }
+    return true;
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "=== 0")))
+*/
+function sc_isZero(x) {
+    return (x === 0);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "> 0")))
+*/
+function sc_isPositive(x) {
+    return (x > 0);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "< 0")))
+*/
+function sc_isNegative(x) {
+    return (x < 0);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "%2===1")))
+*/
+function sc_isOdd(x) {
+    return (x % 2 === 1);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "%2===0")))
+*/
+function sc_isEven(x) {
+    return (x % 2 === 0);
+}
+
+/*** META ((export #t)) */
+var sc_max = Math.max;
+/*** META ((export #t)) */
+var sc_min = Math.min;
+
+/*** META ((export + +fx +fl)
+           (peephole (infix 0 #f "+" "0")))
+*/
+function sc_plus() {
+    var sum = 0;
+    for (var i = 0; i < arguments.length; i++)
+	sum += arguments[i];
+    return sum;
+}
+
+/*** META ((export * *fx *fl)
+           (peephole (infix 0 #f "*" "1")))
+*/
+function sc_multi() {
+    var product = 1;
+    for (var i = 0; i < arguments.length; i++)
+	product *= arguments[i];
+    return product;
+}
+
+/*** META ((export - -fx -fl)
+           (peephole (minus)))
+*/
+function sc_minus(x) {
+    if (arguments.length === 1)
+	return -x;
+    else {
+	var res = x;
+	for (var i = 1; i < arguments.length; i++)
+	    res -= arguments[i];
+	return res;
+    }
+}
+
+/*** META ((export / /fl)
+           (peephole (div)))
+*/
+function sc_div(x) {
+    if (arguments.length === 1)
+	return 1/x;
+    else {
+	var res = x;
+	for (var i = 1; i < arguments.length; i++)
+	    res /= arguments[i];
+	return res;
+    }
+}
+
+/*** META ((export #t)) */
+var sc_abs = Math.abs;
+
+/*** META ((export quotient /fx)
+           (peephole (hole 2 "parseInt(" x "/" y ")")))
+*/
+function sc_quotient(x, y) {
+    return parseInt(x / y);
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "%")))
+*/
+function sc_remainder(x, y) {
+    return x % y;
+}
+
+/*** META ((export #t)
+           (peephole (modulo)))
+*/
+function sc_modulo(x, y) {
+    var remainder = x % y;
+    // if they don't have the same sign
+    if ((remainder * y) < 0)
+	return remainder + y;
+    else
+	return remainder;
+}
+
+function sc_euclid_gcd(a, b) {
+    var temp;
+    if (a === 0) return b;
+    if (b === 0) return a;
+    if (a < 0) {a = -a;};
+    if (b < 0) {b = -b;};
+    if (b > a) {temp = a; a = b; b = temp;};
+    while (true) {
+	a %= b;
+	if(a === 0) {return b;};
+	b %= a;
+	if(b === 0) {return a;};
+    };
+    return b;
+}
+
+/*** META ((export #t)) */
+function sc_gcd() {
+    var gcd = 0;
+    for (var i = 0; i < arguments.length; i++)
+	gcd = sc_euclid_gcd(gcd, arguments[i]);
+    return gcd;
+}
+
+/*** META ((export #t)) */
+function sc_lcm() {
+    var lcm = 1;
+    for (var i = 0; i < arguments.length; i++) {
+	var f = Math.round(arguments[i] / sc_euclid_gcd(arguments[i], lcm));
+	lcm *= Math.abs(f);
+    }
+    return lcm;
+}
+
+// LIMITATION: numerator and denominator don't make sense in floating point world.
+//var SC_MAX_DECIMALS = 1000000
+//
+// function sc_numerator(x) {
+//     var rounded = Math.round(x * SC_MAX_DECIMALS);
+//     return Math.round(rounded / sc_euclid_gcd(rounded, SC_MAX_DECIMALS));
+// }
+
+// function sc_denominator(x) {
+//     var rounded = Math.round(x * SC_MAX_DECIMALS);
+//     return Math.round(SC_MAX_DECIMALS / sc_euclid_gcd(rounded, SC_MAX_DECIMALS));
+// }
+
+/*** META ((export #t)) */
+var sc_floor = Math.floor;
+/*** META ((export #t)) */
+var sc_ceiling = Math.ceil;
+/*** META ((export #t)) */
+var sc_truncate = parseInt;
+/*** META ((export #t)) */
+var sc_round = Math.round;
+
+// LIMITATION: sc_rationalize doesn't make sense in a floating point world.
+
+/*** META ((export #t)) */
+var sc_exp = Math.exp;
+/*** META ((export #t)) */
+var sc_log = Math.log;
+/*** META ((export #t)) */
+var sc_sin = Math.sin;
+/*** META ((export #t)) */
+var sc_cos = Math.cos;
+/*** META ((export #t)) */
+var sc_tan = Math.tan;
+/*** META ((export #t)) */
+var sc_asin = Math.asin;
+/*** META ((export #t)) */
+var sc_acos = Math.acos;
+/*** META ((export #t)) */
+var sc_atan = Math.atan;
+
+/*** META ((export #t)) */
+var sc_sqrt = Math.sqrt;
+/*** META ((export #t)) */
+var sc_expt = Math.pow;
+
+// LIMITATION: we don't have complex numbers.
+// LIMITATION: the following functions are hence not implemented.
+// LIMITATION: make-rectangular, make-polar, real-part, imag-part, magnitude, angle
+// LIMITATION: 2 argument atan
+
+/*** META ((export #t)
+           (peephole (id)))
+*/
+function sc_exact2inexact(x) {
+    return x;
+}
+
+/*** META ((export #t)
+           (peephole (id)))
+*/
+function sc_inexact2exact(x) {
+    return x;
+}
+
+function sc_number2jsstring(x, radix) {
+    if (radix)
+	return x.toString(radix);
+    else
+	return x.toString();
+}
+
+function sc_jsstring2number(s, radix) {
+    if (s === "") return false;
+
+    if (radix) {
+	var t = parseInt(s, radix);
+	if (!t && t !== 0) return false;
+	// verify that each char is in range. (parseInt ignores leading
+	// white and trailing chars)
+	var allowedChars = "01234567890abcdefghijklmnopqrstuvwxyz".substring(0, radix+1);
+	if ((new RegExp("^["+allowedChars+"]*$", "i")).test(s))
+	    return t;
+	else return false;
+    } else {
+	var t = +s; // does not ignore trailing chars.
+	if (!t && t !== 0) return false;
+	// simply verify that first char is not whitespace.
+	var c = s.charAt(0);
+	// if +c is 0, but the char is not "0", then we have a whitespace.
+	if (+c === 0 && c !== "0") return false;
+	return t;
+    }
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (not)))
+*/
+function sc_not(b) {
+    return b === false;
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isBoolean(b) {
+    return (b === true) || (b === false);
+}
+
+function sc_Pair(car, cdr) {
+    this.car = car;
+    this.cdr = cdr;
+}
+
+sc_Pair.prototype.toString = function() {
+    return sc_toDisplayString(this);
+};
+sc_Pair.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
+    var current = this;
+
+    var res = "(";
+
+    while(true) {
+	res += writeOrDisplay(current.car);
+	if (sc_isPair(current.cdr)) {
+	    res += " ";
+	    current = current.cdr;
+	} else if (current.cdr !== null) {
+	    res += " . " + writeOrDisplay(current.cdr);
+	    break;
+	} else // current.cdr == null
+	    break;
+    }
+	
+    res += ")";
+
+    return res;
+};
+sc_Pair.prototype.sc_toDisplayString = function() {
+    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
+};
+sc_Pair.prototype.sc_toWriteString = function() {
+    return this.sc_toWriteOrDisplayString(sc_toWriteString);
+};
+// sc_Pair.prototype.sc_toWriteCircleString in IO.js
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix " instanceof sc_Pair")))
+*/
+function sc_isPair(p) {
+    return (p instanceof sc_Pair);
+}
+
+function sc_isPairEqual(p1, p2, comp) {
+    return (comp(p1.car, p2.car) && comp(p1.cdr, p2.cdr));
+}
+
+/*** META ((export #t)
+           (peephole (hole 2 "new sc_Pair(" car ", " cdr ")")))
+*/
+function sc_cons(car, cdr) {
+    return new sc_Pair(car, cdr);
+}
+
+/*** META ((export cons*)) */
+function sc_consStar() {
+    var res = arguments[arguments.length - 1];
+    for (var i = arguments.length-2; i >= 0; i--)
+	res = new sc_Pair(arguments[i], res);
+    return res;
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".car")))
+*/
+function sc_car(p) {
+    return p.car;
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".cdr")))
+*/
+function sc_cdr(p) {
+    return p.cdr;
+}
+
+/*** META ((export #t)
+           (peephole (hole 2 p ".car = " val)))
+*/
+function sc_setCarBang(p, val) {
+    p.car = val;
+}
+
+/*** META ((export #t)
+           (peephole (hole 2 p ".cdr = " val)))
+*/
+function sc_setCdrBang(p, val) {
+    p.cdr = val;
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".car.car")))
+*/
+function sc_caar(p) { return p.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car")))
+*/
+function sc_cadr(p) { return p.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr")))
+*/
+function sc_cdar(p) { return p.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr")))
+*/
+function sc_cddr(p) { return p.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.car")))
+*/
+function sc_caaar(p) { return p.car.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.car")))
+*/
+function sc_cadar(p) { return p.car.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.car")))
+*/
+function sc_caadr(p) { return p.cdr.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.car")))
+*/
+function sc_caddr(p) { return p.cdr.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.cdr")))
+*/
+function sc_cdaar(p) { return p.car.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.cdr")))
+*/
+function sc_cdadr(p) { return p.cdr.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.cdr")))
+*/
+function sc_cddar(p) { return p.car.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.cdr")))
+*/
+function sc_cdddr(p) { return p.cdr.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.car.car")))
+*/
+function sc_caaaar(p) { return p.car.car.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.car.car")))
+*/
+function sc_caadar(p) { return p.car.cdr.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.car.car")))
+*/
+function sc_caaadr(p) { return p.cdr.car.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.car.car")))
+*/
+function sc_caaddr(p) { return p.cdr.cdr.car.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.car.cdr")))
+*/
+function sc_cdaaar(p) { return p.car.car.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.car.cdr")))
+*/
+function sc_cdadar(p) { return p.car.cdr.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.car.cdr")))
+*/
+function sc_cdaadr(p) { return p.cdr.car.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.car.cdr")))
+*/
+function sc_cdaddr(p) { return p.cdr.cdr.car.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.cdr.car")))
+*/
+function sc_cadaar(p) { return p.car.car.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.cdr.car")))
+*/
+function sc_caddar(p) { return p.car.cdr.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.cdr.car")))
+*/
+function sc_cadadr(p) { return p.cdr.car.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.cdr.car")))
+*/
+function sc_cadddr(p) { return p.cdr.cdr.cdr.car; }
+/*** META ((export #t)
+           (peephole (postfix ".car.car.cdr.cdr")))
+*/
+function sc_cddaar(p) { return p.car.car.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".car.cdr.cdr.cdr")))
+*/
+function sc_cdddar(p) { return p.car.cdr.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.car.cdr.cdr")))
+*/
+function sc_cddadr(p) { return p.cdr.car.cdr.cdr; }
+/*** META ((export #t)
+           (peephole (postfix ".cdr.cdr.cdr.cdr")))
+*/
+function sc_cddddr(p) { return p.cdr.cdr.cdr.cdr; }
+
+/*** META ((export #t)) */
+function sc_lastPair(l) {
+    if (!sc_isPair(l)) sc_error("sc_lastPair: pair expected");
+    var res = l;
+    var cdr = l.cdr;
+    while (sc_isPair(cdr)) {
+	res = cdr;
+	cdr = res.cdr;
+    }
+    return res;
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix " === null")))
+*/
+function sc_isNull(o) {
+    return (o === null);
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isList(o) {
+    var rabbit;
+    var turtle;
+
+    var rabbit = o;
+    var turtle = o;
+    while (true) {
+	if (rabbit === null ||
+	    (rabbit instanceof sc_Pair && rabbit.cdr === null))
+	    return true;  // end of list
+	else if ((rabbit instanceof sc_Pair) &&
+		 (rabbit.cdr instanceof sc_Pair)) {
+	    rabbit = rabbit.cdr.cdr;
+	    turtle = turtle.cdr;
+	    if (rabbit === turtle) return false; // cycle
+	} else
+	    return false; // not pair
+    }
+}
+
+/*** META ((export #t)) */
+function sc_list() {
+    var res = null;
+    var a = arguments;
+    for (var i = a.length-1; i >= 0; i--)
+	res = new sc_Pair(a[i], res);
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_iota(num, init) {
+   var res = null;
+   if (!init) init = 0;
+   for (var i = num - 1; i >= 0; i--)
+      res = new sc_Pair(i + init, res);
+   return res;
+}
+
+/*** META ((export #t)) */
+function sc_makeList(nbEls, fill) {
+    var res = null;
+    for (var i = 0; i < nbEls; i++)
+	res = new sc_Pair(fill, res);
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_length(l) {
+    var res = 0;
+    while (l !== null) {
+	res++;
+	l = l.cdr;
+    }
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_remq(o, l) {
+    var dummy = { cdr : null };
+    var tail = dummy;
+    while (l !== null) {
+	if (l.car !== o) {
+	    tail.cdr = sc_cons(l.car, null);
+	    tail = tail.cdr;
+	}
+	l = l.cdr;
+    }
+    return dummy.cdr;
+}
+
+/*** META ((export #t)) */
+function sc_remqBang(o, l) {
+    var dummy = { cdr : null };
+    var tail = dummy;
+    var needsAssig = true;
+    while (l !== null) {
+	if (l.car === o) {
+	    needsAssig = true;
+	} else {
+	    if (needsAssig) {
+		tail.cdr = l;
+		needsAssig = false;
+	    }
+	    tail = l;
+	}
+	l = l.cdr;
+    }
+    tail.cdr = null;
+    return dummy.cdr;
+}
+
+/*** META ((export #t)) */
+function sc_delete(o, l) {
+    var dummy = { cdr : null };
+    var tail = dummy;
+    while (l !== null) {
+	if (!sc_isEqual(l.car, o)) {
+	    tail.cdr = sc_cons(l.car, null);
+	    tail = tail.cdr;
+	}
+	l = l.cdr;
+    }
+    return dummy.cdr;
+}
+
+/*** META ((export #t)) */
+function sc_deleteBang(o, l) {
+    var dummy = { cdr : null };
+    var tail = dummy;
+    var needsAssig = true;
+    while (l !== null) {
+	if (sc_isEqual(l.car, o)) {
+	    needsAssig = true;
+	} else {
+	    if (needsAssig) {
+		tail.cdr = l;
+		needsAssig = false;
+	    }
+	    tail = l;
+	}
+	l = l.cdr;
+    }
+    tail.cdr = null;
+    return dummy.cdr;
+}
+
+function sc_reverseAppendBang(l1, l2) {
+    var res = l2;
+    while (l1 !== null) {
+	var tmp = res;
+	res = l1;
+	l1 = l1.cdr;
+	res.cdr = tmp;
+    }
+    return res;
+}
+	
+function sc_dualAppend(l1, l2) {
+    if (l1 === null) return l2;
+    if (l2 === null) return l1;
+    var rev = sc_reverse(l1);
+    return sc_reverseAppendBang(rev, l2);
+}
+
+/*** META ((export #t)) */
+function sc_append() {
+    if (arguments.length === 0)
+	return null;
+    var res = arguments[arguments.length - 1];
+    for (var i = arguments.length - 2; i >= 0; i--)
+	res = sc_dualAppend(arguments[i], res);
+    return res;
+}
+
+function sc_dualAppendBang(l1, l2) {
+    if (l1 === null) return l2;
+    if (l2 === null) return l1;
+    var tmp = l1;
+    while (tmp.cdr !== null) tmp=tmp.cdr;
+    tmp.cdr = l2;
+    return l1;
+}
+
+/*** META ((export #t)) */
+function sc_appendBang() {
+    var res = null;
+    for (var i = 0; i < arguments.length; i++)
+	res = sc_dualAppendBang(res, arguments[i]);
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_reverse(l1) {
+    var res = null;
+    while (l1 !== null) {
+	res = sc_cons(l1.car, res);
+	l1 = l1.cdr;
+    }
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_reverseBang(l) {
+    return sc_reverseAppendBang(l, null);
+}
+
+/*** META ((export #t)) */
+function sc_listTail(l, k) {
+    var res = l;
+    for (var i = 0; i < k; i++) {
+	res = res.cdr;
+    }
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_listRef(l, k) {
+    return sc_listTail(l, k).car;
+}
+
+/* // unoptimized generic versions
+function sc_memX(o, l, comp) {
+    while (l != null) {
+	if (comp(l.car, o))
+	    return l;
+	l = l.cdr;
+    }
+    return false;
+}
+function sc_memq(o, l) { return sc_memX(o, l, sc_isEq); }
+function sc_memv(o, l) { return sc_memX(o, l, sc_isEqv); }
+function sc_member(o, l) { return sc_memX(o, l, sc_isEqual); }
+*/
+
+/* optimized versions */
+/*** META ((export #t)) */
+function sc_memq(o, l) {
+    while (l !== null) {
+	if (l.car === o)
+	    return l;
+	l = l.cdr;
+    }
+    return false;
+}
+/*** META ((export #t)) */
+function sc_memv(o, l) {
+    while (l !== null) {
+	if (l.car === o)
+	    return l;
+	l = l.cdr;
+    }
+    return false;
+}
+/*** META ((export #t)) */
+function sc_member(o, l) {
+    while (l !== null) {
+	if (sc_isEqual(l.car,o))
+	    return l;
+	l = l.cdr;
+    }
+    return false;
+}
+
+/* // generic unoptimized versions
+function sc_assX(o, al, comp) {
+    while (al != null) {
+	if (comp(al.car.car, o))
+	    return al.car;
+	al = al.cdr;
+    }
+    return false;
+}
+function sc_assq(o, al) { return sc_assX(o, al, sc_isEq); }
+function sc_assv(o, al) { return sc_assX(o, al, sc_isEqv); }
+function sc_assoc(o, al) { return sc_assX(o, al, sc_isEqual); }
+*/
+// optimized versions
+/*** META ((export #t)) */
+function sc_assq(o, al) {
+    while (al !== null) {
+	if (al.car.car === o)
+	    return al.car;
+	al = al.cdr;
+    }
+    return false;
+}
+/*** META ((export #t)) */
+function sc_assv(o, al) {
+    while (al !== null) {
+	if (al.car.car === o)
+	    return al.car;
+	al = al.cdr;
+    }
+    return false;
+}
+/*** META ((export #t)) */
+function sc_assoc(o, al) {
+    while (al !== null) {
+	if (sc_isEqual(al.car.car, o))
+	    return al.car;
+	al = al.cdr;
+    }
+    return false;
+}
+
+/* can be used for mutable strings and characters */
+function sc_isCharStringEqual(cs1, cs2) { return cs1.val === cs2.val; }
+function sc_isCharStringLess(cs1, cs2) { return cs1.val < cs2.val; }
+function sc_isCharStringGreater(cs1, cs2) { return cs1.val > cs2.val; }
+function sc_isCharStringLessEqual(cs1, cs2) { return cs1.val <= cs2.val; }
+function sc_isCharStringGreaterEqual(cs1, cs2) { return cs1.val >= cs2.val; }
+function sc_isCharStringCIEqual(cs1, cs2)
+    { return cs1.val.toLowerCase() === cs2.val.toLowerCase(); }
+function sc_isCharStringCILess(cs1, cs2)
+    { return cs1.val.toLowerCase() < cs2.val.toLowerCase(); }
+function sc_isCharStringCIGreater(cs1, cs2)
+    { return cs1.val.toLowerCase() > cs2.val.toLowerCase(); }
+function sc_isCharStringCILessEqual(cs1, cs2)
+    { return cs1.val.toLowerCase() <= cs2.val.toLowerCase(); }
+function sc_isCharStringCIGreaterEqual(cs1, cs2)
+    { return cs1.val.toLowerCase() >= cs2.val.toLowerCase(); }
+
+
+
+
+function sc_Char(c) {
+    var cached = sc_Char.lazy[c];
+    if (cached)
+	return cached;
+    this.val = c;
+    sc_Char.lazy[c] = this;
+    // add return, so FF does not complain.
+    return undefined;
+}
+sc_Char.lazy = new Object();
+// thanks to Eric
+sc_Char.char2readable = {
+    "\000": "#\\null",
+    "\007": "#\\bell",
+    "\010": "#\\backspace",
+    "\011": "#\\tab",
+    "\012": "#\\newline",
+    "\014": "#\\page",
+    "\015": "#\\return",
+    "\033": "#\\escape",
+    "\040": "#\\space",
+    "\177": "#\\delete",
+
+  /* poeticless names */
+    "\001": "#\\soh",
+    "\002": "#\\stx",
+    "\003": "#\\etx",
+    "\004": "#\\eot",
+    "\005": "#\\enq",
+    "\006": "#\\ack",
+
+    "\013": "#\\vt",
+    "\016": "#\\so",
+    "\017": "#\\si",
+
+    "\020": "#\\dle",
+    "\021": "#\\dc1",
+    "\022": "#\\dc2",
+    "\023": "#\\dc3",
+    "\024": "#\\dc4",
+    "\025": "#\\nak",
+    "\026": "#\\syn",
+    "\027": "#\\etb",
+
+    "\030": "#\\can",
+    "\031": "#\\em",
+    "\032": "#\\sub",
+    "\033": "#\\esc",
+    "\034": "#\\fs",
+    "\035": "#\\gs",
+    "\036": "#\\rs",
+    "\037": "#\\us"};
+
+sc_Char.readable2char = {
+    "null": "\000",
+    "bell": "\007",
+    "backspace": "\010",
+    "tab": "\011",
+    "newline": "\012",
+    "page": "\014",
+    "return": "\015",
+    "escape": "\033",
+    "space": "\040",
+    "delete": "\000",
+    "soh": "\001",
+    "stx": "\002",
+    "etx": "\003",
+    "eot": "\004",
+    "enq": "\005",
+    "ack": "\006",
+    "bel": "\007",
+    "bs": "\010",
+    "ht": "\011",
+    "nl": "\012",
+    "vt": "\013",
+    "np": "\014",
+    "cr": "\015",
+    "so": "\016",
+    "si": "\017",
+    "dle": "\020",
+    "dc1": "\021",
+    "dc2": "\022",
+    "dc3": "\023",
+    "dc4": "\024",
+    "nak": "\025",
+    "syn": "\026",
+    "etb": "\027",
+    "can": "\030",
+    "em": "\031",
+    "sub": "\032",
+    "esc": "\033",
+    "fs": "\034",
+    "gs": "\035",
+    "rs": "\036",
+    "us": "\037",
+    "sp": "\040",
+    "del": "\177"};
+
+sc_Char.prototype.toString = function() {
+    return this.val;
+};
+// sc_toDisplayString == toString
+sc_Char.prototype.sc_toWriteString = function() {
+    var entry = sc_Char.char2readable[this.val];
+    if (entry)
+	return entry;
+    else
+	return "#\\" + this.val;
+};
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix "instanceof sc_Char")))
+*/
+function sc_isChar(c) {
+    return (c instanceof sc_Char);
+}
+
+/*** META ((export char=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val === " c2 ".val")))
+*/
+var sc_isCharEqual = sc_isCharStringEqual;
+/*** META ((export char<?)
+           (type bool)
+           (peephole (hole 2 c1 ".val < " c2 ".val")))
+*/
+var sc_isCharLess = sc_isCharStringLess;
+/*** META ((export char>?)
+           (type bool)
+           (peephole (hole 2 c1 ".val > " c2 ".val")))
+*/
+var sc_isCharGreater = sc_isCharStringGreater;
+/*** META ((export char<=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val <= " c2 ".val")))
+*/
+var sc_isCharLessEqual = sc_isCharStringLessEqual;
+/*** META ((export char>=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val >= " c2 ".val")))
+*/
+var sc_isCharGreaterEqual = sc_isCharStringGreaterEqual;
+/*** META ((export char-ci=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val.toLowerCase() === " c2 ".val.toLowerCase()")))
+*/
+var sc_isCharCIEqual = sc_isCharStringCIEqual;
+/*** META ((export char-ci<?)
+           (type bool)
+           (peephole (hole 2 c1 ".val.toLowerCase() < " c2 ".val.toLowerCase()")))
+*/
+var sc_isCharCILess = sc_isCharStringCILess;
+/*** META ((export char-ci>?)
+           (type bool)
+           (peephole (hole 2 c1 ".val.toLowerCase() > " c2 ".val.toLowerCase()")))
+*/
+var sc_isCharCIGreater = sc_isCharStringCIGreater;
+/*** META ((export char-ci<=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val.toLowerCase() <= " c2 ".val.toLowerCase()")))
+*/
+var sc_isCharCILessEqual = sc_isCharStringCILessEqual;
+/*** META ((export char-ci>=?)
+           (type bool)
+           (peephole (hole 2 c1 ".val.toLowerCase() >= " c2 ".val.toLowerCase()")))
+*/
+var sc_isCharCIGreaterEqual = sc_isCharStringCIGreaterEqual;
+
+var SC_NUMBER_CLASS = "0123456789";
+var SC_WHITESPACE_CLASS = ' \r\n\t\f';
+var SC_LOWER_CLASS = 'abcdefghijklmnopqrstuvwxyz';
+var SC_UPPER_CLASS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+
+function sc_isCharOfClass(c, cl) { return (cl.indexOf(c) != -1); }
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isCharAlphabetic(c)
+    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS) ||
+	  sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
+/*** META ((export #t)
+           (type bool)
+           (peephole (hole 1 "SC_NUMBER_CLASS.indexOf(" c ".val) != -1")))
+*/
+function sc_isCharNumeric(c)
+    { return sc_isCharOfClass(c.val, SC_NUMBER_CLASS); }
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isCharWhitespace(c) {
+    var tmp = c.val;
+    return tmp === " " || tmp === "\r" || tmp === "\n" || tmp === "\t" || tmp === "\f";
+}
+/*** META ((export #t)
+           (type bool)
+           (peephole (hole 1 "SC_UPPER_CLASS.indexOf(" c ".val) != -1")))
+*/
+function sc_isCharUpperCase(c)
+    { return sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
+/*** META ((export #t)
+           (type bool)
+           (peephole (hole 1 "SC_LOWER_CLASS.indexOf(" c ".val) != -1")))
+*/
+function sc_isCharLowerCase(c)
+    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS); }
+
+/*** META ((export #t)
+           (peephole (postfix ".val.charCodeAt(0)")))
+*/
+function sc_char2integer(c)
+    { return c.val.charCodeAt(0); }
+/*** META ((export #t)
+           (peephole (hole 1 "new sc_Char(String.fromCharCode(" n "))")))
+*/
+function sc_integer2char(n)
+    { return new sc_Char(String.fromCharCode(n)); }
+
+/*** META ((export #t)
+           (peephole (hole 1 "new sc_Char(" c ".val.toUpperCase())")))
+*/
+function sc_charUpcase(c)
+    { return new sc_Char(c.val.toUpperCase()); }
+/*** META ((export #t)
+           (peephole (hole 1 "new sc_Char(" c ".val.toLowerCase())")))
+*/
+function sc_charDowncase(c)
+    { return new sc_Char(c.val.toLowerCase()); }
+
+function sc_makeJSStringOfLength(k, c) {
+    var fill;
+    if (c === undefined)
+	fill = " ";
+    else
+	fill = c;
+    var res = "";
+    var len = 1;
+    // every round doubles the size of fill.
+    while (k >= len) {
+	if (k & len)
+	    res = res.concat(fill);
+	fill = fill.concat(fill);
+	len *= 2;
+    }
+    return res;
+}
+
+function sc_makejsString(k, c) {
+    var fill;
+    if (c)
+	fill = c.val;
+    else
+	fill = " ";
+    return sc_makeJSStringOfLength(k, fill);
+}
+
+function sc_jsstring2list(s) {
+    var res = null;
+    for (var i = s.length - 1; i >= 0; i--)
+	res = sc_cons(new sc_Char(s.charAt(i)), res);
+    return res;
+}
+
+function sc_list2jsstring(l) {
+    var a = new Array();
+    while(l !== null) {
+	a.push(l.car.val);
+	l = l.cdr;
+    }
+    return "".concat.apply("", a);
+}
+
+var sc_Vector = Array;
+
+sc_Vector.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
+    if (this.length === 0) return "#()";
+
+    var res = "#(" + writeOrDisplay(this[0]);
+    for (var i = 1; i < this.length; i++)
+	res += " " + writeOrDisplay(this[i]);
+    res += ")";
+    return res;
+};
+sc_Vector.prototype.sc_toDisplayString = function() {
+    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
+};
+sc_Vector.prototype.sc_toWriteString = function() {
+    return this.sc_toWriteOrDisplayString(sc_toWriteString);
+};
+
+/*** META ((export vector? array?)
+           (type bool)
+           (peephole (postfix " instanceof sc_Vector")))
+*/
+function sc_isVector(v) {
+    return (v instanceof sc_Vector);
+}
+
+// only applies to vectors
+function sc_isVectorEqual(v1, v2, comp) {
+    if (v1.length !== v2.length) return false;
+    for (var i = 0; i < v1.length; i++)
+	if (!comp(v1[i], v2[i])) return false;
+    return true;
+}
+
+/*** META ((export make-vector make-array)) */
+function sc_makeVector(size, fill) {
+    var a = new sc_Vector(size);
+    if (fill !== undefined)
+	sc_vectorFillBang(a, fill);
+    return a;
+}
+
+/*** META ((export vector array)
+           (peephole (vector)))
+*/
+function sc_vector() {
+    var a = new sc_Vector();
+    for (var i = 0; i < arguments.length; i++)
+	a.push(arguments[i]);
+    return a;
+}
+
+/*** META ((export vector-length array-length)
+           (peephole (postfix ".length")))
+*/
+function sc_vectorLength(v) {
+    return v.length;
+}
+
+/*** META ((export vector-ref array-ref)
+           (peephole (hole 2 v "[" pos "]")))
+*/
+function sc_vectorRef(v, pos) {
+    return v[pos];
+}
+
+/*** META ((export vector-set! array-set!)
+           (peephole (hole 3 v "[" pos "] = " val)))
+*/
+function sc_vectorSetBang(v, pos, val) {
+    v[pos] = val;
+}
+
+/*** META ((export vector->list array->list)) */
+function sc_vector2list(a) {
+    var res = null;
+    for (var i = a.length-1; i >= 0; i--)
+	res = sc_cons(a[i], res);
+    return res;
+}
+
+/*** META ((export list->vector list->array)) */
+function sc_list2vector(l) {
+    var a = new sc_Vector();
+    while(l !== null) {
+	a.push(l.car);
+	l = l.cdr;
+    }
+    return a;
+}
+
+/*** META ((export vector-fill! array-fill!)) */
+function sc_vectorFillBang(a, fill) {
+    for (var i = 0; i < a.length; i++)
+	a[i] = fill;
+}
+
+
+/*** META ((export #t)) */
+function sc_copyVector(a, len) {
+    if (len <= a.length)
+	return a.slice(0, len);
+    else {
+	var tmp = a.concat();
+	tmp.length = len;
+	return tmp;
+    }
+}
+
+/*** META ((export #t)
+           (peephole (hole 3 a ".slice(" start "," end ")")))
+*/
+function sc_vectorCopy(a, start, end) {
+    return a.slice(start, end);
+}
+
+/*** META ((export #t)) */
+function sc_vectorCopyBang(target, tstart, source, sstart, send) {
+    if (!sstart) sstart = 0;
+    if (!send) send = source.length;
+
+    // if target == source we don't want to overwrite not yet copied elements.
+    if (tstart <= sstart) {
+	for (var i = tstart, j = sstart; j < send; i++, j++) {
+	    target[i] = source[j];
+	}
+    } else {
+	var diff = send - sstart;
+	for (var i = tstart + diff - 1, j = send - 1;
+	     j >= sstart;
+	     i--, j--) {
+	    target[i] = source[j];
+	}
+    }
+    return target;
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (hole 1 "typeof " o " === 'function'")))
+*/
+function sc_isProcedure(o) {
+    return (typeof o === "function");
+}
+
+/*** META ((export #t)) */
+function sc_apply(proc) {
+    var args = new Array();
+    // first part of arguments are not in list-form.
+    for (var i = 1; i < arguments.length - 1; i++)
+	args.push(arguments[i]);
+    var l = arguments[arguments.length - 1];
+    while (l !== null) {
+	args.push(l.car);
+	l = l.cdr;
+    }
+    return proc.apply(null, args);
+}
+
+/*** META ((export #t)) */
+function sc_map(proc, l1) {
+    if (l1 === undefined)
+	return null;
+    // else
+    var nbApplyArgs = arguments.length - 1;
+    var applyArgs = new Array(nbApplyArgs);
+    var revres = null;
+    while (l1 !== null) {
+	for (var i = 0; i < nbApplyArgs; i++) {
+	    applyArgs[i] = arguments[i + 1].car;
+	    arguments[i + 1] = arguments[i + 1].cdr;
+	}
+	revres = sc_cons(proc.apply(null, applyArgs), revres);
+    }
+    return sc_reverseAppendBang(revres, null);
+}
+
+/*** META ((export #t)) */
+function sc_mapBang(proc, l1) {
+    if (l1 === undefined)
+	return null;
+    // else
+    var l1_orig = l1;
+    var nbApplyArgs = arguments.length - 1;
+    var applyArgs = new Array(nbApplyArgs);
+    while (l1 !== null) {
+	var tmp = l1;
+	for (var i = 0; i < nbApplyArgs; i++) {
+	    applyArgs[i] = arguments[i + 1].car;
+	    arguments[i + 1] = arguments[i + 1].cdr;
+	}
+	tmp.car = proc.apply(null, applyArgs);
+    }
+    return l1_orig;
+}
+
+/*** META ((export #t)) */
+function sc_forEach(proc, l1) {
+    if (l1 === undefined)
+	return undefined;
+    // else
+    var nbApplyArgs = arguments.length - 1;
+    var applyArgs = new Array(nbApplyArgs);
+    while (l1 !== null) {
+	for (var i = 0; i < nbApplyArgs; i++) {
+	    applyArgs[i] = arguments[i + 1].car;
+	    arguments[i + 1] = arguments[i + 1].cdr;
+	}
+	proc.apply(null, applyArgs);
+    }
+    // add return so FF does not complain.
+    return undefined;
+}
+
+/*** META ((export #t)) */
+function sc_filter(proc, l1) {
+    var dummy = { cdr : null };
+    var tail = dummy;
+    while (l1 !== null) {
+	if (proc(l1.car) !== false) {
+	    tail.cdr = sc_cons(l1.car, null);
+	    tail = tail.cdr;
+	}
+	l1 = l1.cdr;
+    }
+    return dummy.cdr;
+}
+
+/*** META ((export #t)) */
+function sc_filterBang(proc, l1) {
+    var head = sc_cons("dummy", l1);
+    var it = head;
+    var next = l1;
+    while (next !== null) {
+        if (proc(next.car) !== false) {
+	    it.cdr = next
+	    it = next;
+	}
+	next = next.cdr;
+    }
+    it.cdr = null;
+    return head.cdr;
+}
+
+function sc_filterMap1(proc, l1) {
+    var revres = null;
+    while (l1 !== null) {
+        var tmp = proc(l1.car)
+        if (tmp !== false) revres = sc_cons(tmp, revres);
+        l1 = l1.cdr;
+    }
+    return sc_reverseAppendBang(revres, null);
+}
+function sc_filterMap2(proc, l1, l2) {
+    var revres = null;
+    while (l1 !== null) {
+        var tmp = proc(l1.car, l2.car);
+        if(tmp !== false) revres = sc_cons(tmp, revres);
+	l1 = l1.cdr;
+	l2 = l2.cdr
+    }
+    return sc_reverseAppendBang(revres, null);
+}
+
+/*** META ((export #t)) */
+function sc_filterMap(proc, l1, l2, l3) {
+    if (l2 === undefined)
+	return sc_filterMap1(proc, l1);
+    else if (l3 === undefined)
+	return sc_filterMap2(proc, l1, l2);
+    // else
+    var nbApplyArgs = arguments.length - 1;
+    var applyArgs = new Array(nbApplyArgs);
+    var revres = null;
+    while (l1 !== null) {
+	for (var i = 0; i < nbApplyArgs; i++) {
+	    applyArgs[i] = arguments[i + 1].car;
+	    arguments[i + 1] = arguments[i + 1].cdr;
+	}
+	var tmp = proc.apply(null, applyArgs);
+	if(tmp !== false) revres = sc_cons(tmp, revres);
+    }
+    return sc_reverseAppendBang(revres, null);
+}
+
+/*** META ((export #t)) */
+function sc_any(proc, l) {
+    var revres = null;
+    while (l !== null) {
+        var tmp = proc(l.car);
+        if(tmp !== false) return tmp;
+	l = l.cdr;
+    }
+    return false;
+}
+
+/*** META ((export any?)
+           (peephole (hole 2 "sc_any(" proc "," l ") !== false")))
+*/
+function sc_anyPred(proc, l) {
+    return sc_any(proc, l)!== false;
+}
+
+/*** META ((export #t)) */
+function sc_every(proc, l) {
+    var revres = null;
+    var tmp = true;
+    while (l !== null) {
+        tmp = proc(l.car);
+        if (tmp === false) return false;
+	l = l.cdr;
+    }
+    return tmp;
+}
+
+/*** META ((export every?)
+           (peephole (hole 2 "sc_every(" proc "," l ") !== false")))
+*/
+function sc_everyPred(proc, l) {
+    var tmp = sc_every(proc, l);
+    if (tmp !== false) return true;
+    return false;
+}
+
+/*** META ((export #t)
+           (peephole (postfix "()")))
+*/
+function sc_force(o) {
+    return o();
+}
+
+/*** META ((export #t)) */
+function sc_makePromise(proc) {
+    var isResultReady = false;
+    var result = undefined;
+    return function() {
+	if (!isResultReady) {
+	    var tmp = proc();
+	    if (!isResultReady) {
+		isResultReady = true;
+		result = tmp;
+	    }
+	}
+	return result;
+    };
+}
+
+function sc_Values(values) {
+    this.values = values;
+}
+
+/*** META ((export #t)
+           (peephole (values)))
+*/
+function sc_values() {
+    if (arguments.length === 1)
+	return arguments[0];
+    else
+	return new sc_Values(arguments);
+}
+
+/*** META ((export #t)) */
+function sc_callWithValues(producer, consumer) {
+    var produced = producer();
+    if (produced instanceof sc_Values)
+	return consumer.apply(null, produced.values);
+    else
+	return consumer(produced);
+}
+
+/*** META ((export #t)) */
+function sc_dynamicWind(before, thunk, after) {
+    before();
+    try {
+	var res = thunk();
+	return res;
+    } finally {
+	after();
+    }
+}
+
+
+// TODO: eval/scheme-report-environment/null-environment/interaction-environment
+
+// LIMITATION: 'load' doesn't exist without files.
+// LIMITATION: transcript-on/transcript-off doesn't exist without files.
+
+
+function sc_Struct(name) {
+    this.name = name;
+}
+sc_Struct.prototype.sc_toDisplayString = function() {
+    return "#<struct" + sc_hash(this) + ">";
+};
+sc_Struct.prototype.sc_toWriteString = sc_Struct.prototype.sc_toDisplayString;
+
+/*** META ((export #t)
+           (peephole (hole 1 "new sc_Struct(" name ")")))
+*/
+function sc_makeStruct(name) {
+    return new sc_Struct(name);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix " instanceof sc_Struct")))
+*/
+function sc_isStruct(o) {
+    return (o instanceof sc_Struct);
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (hole 2 "(" 1 " instanceof sc_Struct) && ( " 1 ".name === " 0 ")")))
+*/
+function sc_isStructNamed(name, s) {
+    return ((s instanceof sc_Struct) && (s.name === name));
+}
+
+/*** META ((export struct-field)
+           (peephole (hole 3 0 "[" 2 "]")))
+*/
+function sc_getStructField(s, name, field) {
+    return s[field];
+}
+
+/*** META ((export struct-field-set!)
+           (peephole (hole 4 0 "[" 2 "] = " 3)))
+*/
+function sc_setStructFieldBang(s, name, field, val) {
+    s[field] = val;
+}
+
+/*** META ((export #t)
+           (peephole (prefix "~")))
+*/
+function sc_bitNot(x) {
+    return ~x;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "&")))
+*/
+function sc_bitAnd(x, y) {
+    return x & y;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "|")))
+*/
+function sc_bitOr(x, y) {
+    return x | y;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "^")))
+*/
+function sc_bitXor(x, y) {
+    return x ^ y;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 "<<")))
+*/
+function sc_bitLsh(x, y) {
+    return x << y;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 ">>")))
+*/
+function sc_bitRsh(x, y) {
+    return x >> y;
+}
+
+/*** META ((export #t)
+           (peephole (infix 2 2 ">>>")))
+*/
+function sc_bitUrsh(x, y) {
+    return x >>> y;
+}
+
+/*** META ((export js-field js-property)
+           (peephole (hole 2 o "[" field "]")))
+*/
+function sc_jsField(o, field) {
+    return o[field];
+}
+
+/*** META ((export js-field-set! js-property-set!)
+           (peephole (hole 3 o "[" field "] = " val)))
+*/
+function sc_setJsFieldBang(o, field, val) {
+    return o[field] = val;
+}
+
+/*** META ((export js-field-delete! js-property-delete!)
+           (peephole (hole 2 "delete" o "[" field "]")))
+*/
+function sc_deleteJsFieldBang(o, field) {
+    delete o[field];
+}
+
+/*** META ((export #t)
+           (peephole (jsCall)))
+*/
+function sc_jsCall(o, fun) {
+    var args = new Array();
+    for (var i = 2; i < arguments.length; i++)
+	args[i-2] = arguments[i];
+    return fun.apply(o, args);
+}
+
+/*** META ((export #t)
+           (peephole (jsMethodCall)))
+*/
+function sc_jsMethodCall(o, field) {
+    var args = new Array();
+    for (var i = 2; i < arguments.length; i++)
+	args[i-2] = arguments[i];
+    return o[field].apply(o, args);
+}
+
+/*** META ((export new js-new)
+           (peephole (jsNew)))
+*/
+function sc_jsNew(c) {
+    var evalStr = "new c(";
+    evalStr +=arguments.length > 1? "arguments[1]": "";
+    for (var i = 2; i < arguments.length; i++)
+	evalStr += ", arguments[" + i + "]";
+    evalStr +=")";
+    return eval(evalStr);
+}
+
+// ======================== RegExp ====================
+/*** META ((export #t)) */
+function sc_pregexp(re) {
+    return new RegExp(sc_string2jsstring(re));
+}
+
+/*** META ((export #t)) */
+function sc_pregexpMatch(re, s) {
+    var reg = (re instanceof RegExp) ? re : sc_pregexp(re);
+    var tmp = reg.exec(sc_string2jsstring(s));
+
+    if (tmp == null) return false;
+
+    var res = null;
+    for (var i = tmp.length-1; i >= 0; i--) {
+	if (tmp[i] !== null) {
+	    res = sc_cons(sc_jsstring2string(tmp[i]), res);
+	} else {
+	    res = sc_cons(false, res);
+	}
+    }
+    return res;
+}
+
+/*** META ((export #t)) */
+function sc_pregexpReplace(re, s1, s2) {
+   var reg;
+   var jss1 = sc_string2jsstring(s1);
+   var jss2 = sc_string2jsstring(s2);
+
+   if (re instanceof RegExp) {
+       if (re.global)
+	   reg = re;
+       else
+	   reg = new RegExp(re.source);
+   } else {
+       reg = new RegExp(sc_string2jsstring(re));
+   }
+
+   return jss1.replace(reg, jss2);
+}
+
+/*** META ((export pregexp-replace*)) */
+function sc_pregexpReplaceAll(re, s1, s2) {
+   var reg;
+   var jss1 = sc_string2jsstring(s1);
+   var jss2 = sc_string2jsstring(s2);
+
+   if (re instanceof RegExp) {
+      if (re.global)
+	  reg = re;
+      else
+	  reg = new RegExp(re.source, "g");
+   } else {
+       reg = new RegExp(sc_string2jsstring(re), "g");
+   }
+
+   return jss1.replace(reg, jss2);
+}
+
+/*** META ((export #t)) */
+function sc_pregexpSplit(re, s) {
+   var reg = ((re instanceof RegExp) ?
+	      re :
+	      new RegExp(sc_string2jsstring(re)));
+   var jss = sc_string2jsstring(s);
+   var tmp = jss.split(reg);
+
+   if (tmp == null) return false;
+
+   return sc_vector2list(tmp);
+}
+
+
+/* =========================================================================== */
+/* Other library stuff */
+/* =========================================================================== */
+
+/*** META ((export #t)
+           (peephole (hole 1 "Math.floor(Math.random()*" 'n ")")))
+*/
+function sc_random(n) {
+    return Math.floor(Math.random()*n);
+}
+
+/*** META ((export current-date)
+           (peephole (hole 0 "new Date()")))
+*/
+function sc_currentDate() {
+   return new Date();
+}
+
+function sc_Hashtable() {
+}
+sc_Hashtable.prototype.toString = function() {
+    return "#{%hashtable}";
+};
+// sc_toWriteString == sc_toDisplayString == toString
+
+function sc_HashtableElement(key, val) {
+    this.key = key;
+    this.val = val;
+}
+
+/*** META ((export #t)
+           (peephole (hole 0 "new sc_Hashtable()")))
+*/
+function sc_makeHashtable() {
+    return new sc_Hashtable();
+}
+
+/*** META ((export #t)) */
+function sc_hashtablePutBang(ht, key, val) {
+    var hash = sc_hash(key);
+    ht[hash] = new sc_HashtableElement(key, val);
+}
+
+/*** META ((export #t)) */
+function sc_hashtableGet(ht, key) {
+    var hash = sc_hash(key);
+    if (hash in ht)
+	return ht[hash].val;
+    else
+	return false;
+}
+
+/*** META ((export #t)) */
+function sc_hashtableForEach(ht, f) {
+    for (var v in ht) {
+	if (ht[v] instanceof sc_HashtableElement)
+	    f(ht[v].key, ht[v].val);
+    }
+}
+
+/*** META ((export hashtable-contains?)
+           (peephole (hole 2 "sc_hash(" 1 ") in " 0)))
+*/
+function sc_hashtableContains(ht, key) {
+    var hash = sc_hash(key);
+    if (hash in ht)
+	return true;
+    else
+	return false;
+}
+
+var SC_HASH_COUNTER = 0;
+
+function sc_hash(o) {
+    if (o === null)
+	return "null";
+    else if (o === undefined)
+	return "undefined";
+    else if (o === true)
+	return "true";
+    else if (o === false)
+	return "false";
+    else if (typeof o === "number")
+	return "num-" + o;
+    else if (typeof o === "string")
+	return "jsstr-" + o;
+    else if (o.sc_getHash)
+	return o.sc_getHash();
+    else
+	return sc_counterHash.call(o);
+}
+function sc_counterHash() {
+    if (!this.sc_hash) {
+	this.sc_hash = "hash-" + SC_HASH_COUNTER;
+	SC_HASH_COUNTER++;
+    }
+    return this.sc_hash;
+}
+
+function sc_Trampoline(args, maxTailCalls) {
+    this['__trampoline return__'] = true;
+    this.args = args;
+    this.MAX_TAIL_CALLs = maxTailCalls;
+}
+// TODO: call/cc stuff
+sc_Trampoline.prototype.restart = function() {
+    var o = this;
+    while (true) {
+	// set both globals.
+	SC_TAIL_OBJECT.calls = o.MAX_TAIL_CALLs-1;
+	var fun = o.args.callee;
+	var res = fun.apply(SC_TAIL_OBJECT, o.args);
+	if (res instanceof sc_Trampoline)
+	    o = res;
+	else
+	    return res;
+    }
+}
+
+/*** META ((export bind-exit-lambda)) */
+function sc_bindExitLambda(proc) {
+    var escape_obj = new sc_BindExitException();
+    var escape = function(res) {
+	escape_obj.res = res;
+	throw escape_obj;
+    };
+    try {
+	return proc(escape);
+    } catch(e) {
+	if (e === escape_obj) {
+	    return e.res;
+	}
+	throw e;
+    }
+}
+function sc_BindExitException() {
+    this._internalException = true;
+}
+
+var SC_SCM2JS_GLOBALS = new Object();
+
+// default tail-call depth.
+// normally the program should set it again. but just in case...
+var SC_TAIL_OBJECT = new Object();
+SC_SCM2JS_GLOBALS.TAIL_OBJECT = SC_TAIL_OBJECT;
+// ======================== I/O =======================
+
+/*------------------------------------------------------------------*/
+
+function sc_EOF() {
+}
+var SC_EOF_OBJECT = new sc_EOF();
+
+function sc_Port() {
+}
+
+/* --------------- Input ports -------------------------------------*/
+
+function sc_InputPort() {
+}
+sc_InputPort.prototype = new sc_Port();
+
+sc_InputPort.prototype.peekChar = function() {
+    if (!("peeked" in this))
+	this.peeked = this.getNextChar();
+    return this.peeked;
+}
+sc_InputPort.prototype.readChar = function() {
+    var tmp = this.peekChar();
+    delete this.peeked;
+    return tmp;
+}
+sc_InputPort.prototype.isCharReady = function() {
+    return true;
+}
+sc_InputPort.prototype.close = function() {
+    // do nothing
+}
+
+/* .............. String port ..........................*/
+function sc_ErrorInputPort() {
+};
+sc_ErrorInputPort.prototype = new sc_InputPort();
+sc_ErrorInputPort.prototype.getNextChar = function() {
+    throw "can't read from error-port.";
+};
+sc_ErrorInputPort.prototype.isCharReady = function() {
+    return false;
+};
+
+
+/* .............. String port ..........................*/
+
+function sc_StringInputPort(jsStr) {
+    // we are going to do some charAts on the str.
+    // instead of recreating all the time a String-object, we
+    // create one in the beginning. (not sure, if this is really an optim)
+    this.str = new String(jsStr);
+    this.pos = 0;
+}
+sc_StringInputPort.prototype = new sc_InputPort();
+sc_StringInputPort.prototype.getNextChar = function() {
+    if (this.pos >= this.str.length)
+	return SC_EOF_OBJECT;
+    return this.str.charAt(this.pos++);
+};
+
+/* ------------- Read and other lib-funs  -------------------------------*/
+function sc_Token(type, val, pos) {
+    this.type = type;
+    this.val = val;
+    this.pos = pos;
+}
+sc_Token.EOF = 0/*EOF*/;
+sc_Token.OPEN_PAR = 1/*OPEN_PAR*/;
+sc_Token.CLOSE_PAR = 2/*CLOSE_PAR*/;
+sc_Token.OPEN_BRACE = 3/*OPEN_BRACE*/;
+sc_Token.CLOSE_BRACE = 4/*CLOSE_BRACE*/;
+sc_Token.OPEN_BRACKET = 5/*OPEN_BRACKET*/;
+sc_Token.CLOSE_BRACKET = 6/*CLOSE_BRACKET*/;
+sc_Token.WHITESPACE = 7/*WHITESPACE*/;
+sc_Token.QUOTE = 8/*QUOTE*/;
+sc_Token.ID = 9/*ID*/;
+sc_Token.DOT = 10/*DOT*/;
+sc_Token.STRING = 11/*STRING*/;
+sc_Token.NUMBER = 12/*NUMBER*/;
+sc_Token.ERROR = 13/*ERROR*/;
+sc_Token.VECTOR_BEGIN = 14/*VECTOR_BEGIN*/;
+sc_Token.TRUE = 15/*TRUE*/;
+sc_Token.FALSE = 16/*FALSE*/;
+sc_Token.UNSPECIFIED = 17/*UNSPECIFIED*/;
+sc_Token.REFERENCE = 18/*REFERENCE*/;
+sc_Token.STORE = 19/*STORE*/;
+sc_Token.CHAR = 20/*CHAR*/;
+
+var SC_ID_CLASS = SC_LOWER_CLASS + SC_UPPER_CLASS + "!$%*+-./:<=>?@^_~";
+function sc_Tokenizer(port) {
+    this.port = port;
+}
+sc_Tokenizer.prototype.peekToken = function() {
+    if (this.peeked)
+	return this.peeked;
+    var newToken = this.nextToken();
+    this.peeked = newToken;
+    return newToken;
+};
+sc_Tokenizer.prototype.readToken = function() {
+    var tmp = this.peekToken();
+    delete this.peeked;
+    return tmp;
+};
+sc_Tokenizer.prototype.nextToken = function() {
+    var port = this.port;
+
+    function isNumberChar(c) {
+	return (c >= "0" && c <= "9");
+    };
+    function isIdOrNumberChar(c) {
+	return SC_ID_CLASS.indexOf(c) != -1 || // ID-char
+	    (c >= "0" && c <= "9");
+    }
+    function isWhitespace(c) {
+	return c === " " || c === "\r" || c === "\n" || c === "\t" || c === "\f";
+    };
+    function isWhitespaceOrEOF(c) {
+	return isWhitespace(c) || c === SC_EOF_OBJECT;
+    };
+
+    function readString() {
+	res = "";
+	while (true) {
+	    var c = port.readChar();
+	    switch (c) {
+	    case '"':
+		return new sc_Token(11/*STRING*/, res);
+	    case "\\":
+		var tmp = port.readChar();
+		switch (tmp) {
+		case '0': res += "\0"; break;
+		case 'a': res += "\a"; break;
+		case 'b': res += "\b"; break;
+		case 'f': res += "\f"; break;
+		case 'n': res += "\n"; break;
+		case 'r': res += "\r"; break;
+		case 't': res += "\t"; break;
+		case 'v': res += "\v"; break;
+		case '"': res += '"'; break;
+		case '\\': res += '\\'; break;
+		case 'x':
+		    /* hexa-number */
+		    var nb = 0;
+		    while (true) {
+			var hexC = port.peekChar();
+			if (hexC >= '0' && hexC <= '9') {
+			    port.readChar();
+			    nb = nb * 16 + hexC.charCodeAt(0) - '0'.charCodeAt(0);
+			} else if (hexC >= 'a' && hexC <= 'f') {
+			    port.readChar();
+			    nb = nb * 16 + hexC.charCodeAt(0) - 'a'.charCodeAt(0);
+			} else if (hexC >= 'A' && hexC <= 'F') {
+			    port.readChar();
+			    nb = nb * 16 + hexC.charCodeAt(0) - 'A'.charCodeAt(0);
+			} else {
+			    // next char isn't part of hex.
+			    res += String.fromCharCode(nb);
+			    break;
+			}
+		    }
+		    break;
+		default:
+		    if (tmp === SC_EOF_OBJECT) {
+			return new sc_Token(13/*ERROR*/, "unclosed string-literal" + res);
+		    }
+		    res += tmp;
+		}
+		break;
+	    default:
+		if (c === SC_EOF_OBJECT) {
+		    return new sc_Token(13/*ERROR*/, "unclosed string-literal" + res);
+		}
+		res += c;
+	    }
+	}
+    };
+    function readIdOrNumber(firstChar) {
+	var res = firstChar;
+	while (isIdOrNumberChar(port.peekChar()))
+	    res += port.readChar();
+	if (isNaN(res))
+	    return new sc_Token(9/*ID*/, res);
+	else
+	    return new sc_Token(12/*NUMBER*/, res - 0);
+    };
+
+    function skipWhitespaceAndComments() {
+	var done = false;
+	while (!done) {
+	    done = true;
+	    while (isWhitespace(port.peekChar()))
+		port.readChar();
+	    if (port.peekChar() === ';') {
+		port.readChar();
+		done = false;
+		while (true) {
+		    curChar = port.readChar();
+		    if (curChar === SC_EOF_OBJECT ||
+			curChar === '\n')
+			break;
+		}
+	    }
+	}
+    };
+
+    function readDot() {
+	if (isWhitespace(port.peekChar()))
+	    return new sc_Token(10/*DOT*/);
+	else
+	    return readIdOrNumber(".");
+    };
+
+    function readSharp() {
+	var c = port.readChar();
+	if (isWhitespace(c))
+	    return new sc_Token(13/*ERROR*/, "bad #-pattern0.");
+
+	// reference
+	if (isNumberChar(c)) {
+	    var nb = c - 0;
+	    while (isNumberChar(port.peekChar()))
+		nb = nb*10 + (port.readChar() - 0);
+	    switch (port.readChar()) {
+	    case '#':
+		return new sc_Token(18/*REFERENCE*/, nb);
+	    case '=':
+		return new sc_Token(19/*STORE*/, nb);
+	    default:
+		return new sc_Token(13/*ERROR*/, "bad #-pattern1." + nb);
+	    }
+	}
+
+	if (c === "(")
+	    return new sc_Token(14/*VECTOR_BEGIN*/);
+	
+	if (c === "\\") { // character
+	    var tmp = ""
+	    while (!isWhitespaceOrEOF(port.peekChar()))
+		tmp += port.readChar();
+	    switch (tmp.length) {
+	    case 0: // it's escaping a whitespace char:
+		if (sc_isEOFObject(port.peekChar))
+		    return new sc_Token(13/*ERROR*/, "bad #-pattern2.");
+		else
+		    return new sc_Token(20/*CHAR*/, port.readChar());
+	    case 1:
+		return new sc_Token(20/*CHAR*/, tmp);
+	    default:
+		var entry = sc_Char.readable2char[tmp.toLowerCase()];
+		if (entry)
+		    return new sc_Token(20/*CHAR*/, entry);
+		else
+		    return new sc_Token(13/*ERROR*/, "unknown character description: #\\" + tmp);
+	    }
+	}
+
+	// some constants (#t, #f, #unspecified)
+	var res;
+	var needing;
+	switch (c) {
+	case 't': res = new sc_Token(15/*TRUE*/, true); needing = ""; break;
+	case 'f': res = new sc_Token(16/*FALSE*/, false); needing = ""; break;
+	case 'u': res = new sc_Token(17/*UNSPECIFIED*/, undefined); needing = "nspecified"; break;
+	default:
+	    return new sc_Token(13/*ERROR*/, "bad #-pattern3: " + c);
+	}
+	while(true) {
+	    c = port.peekChar();
+	    if ((isWhitespaceOrEOF(c) || c === ')') &&
+		needing == "")
+		return res;
+	    else if (isWhitespace(c) || needing == "")
+		return new sc_Token(13/*ERROR*/, "bad #-pattern4 " + c + " " + needing);
+	    else if (needing.charAt(0) == c) {
+		port.readChar(); // consume
+		needing = needing.slice(1);
+	    } else
+		return new sc_Token(13/*ERROR*/, "bad #-pattern5");
+	}
+	
+    };
+
+    skipWhitespaceAndComments();
+    var curChar = port.readChar();
+    if (curChar === SC_EOF_OBJECT)
+	return new sc_Token(0/*EOF*/, curChar);
+    switch (curChar)
+    {
+    case " ":
+    case "\n":
+    case "\t":
+	return readWhitespace();
+    case "(":
+	return new sc_Token(1/*OPEN_PAR*/);
+    case ")":
+	return new sc_Token(2/*CLOSE_PAR*/);
+    case "{":
+	return new sc_Token(3/*OPEN_BRACE*/);
+    case "}":
+	return new sc_Token(4/*CLOSE_BRACE*/);
+    case "[":
+	return new sc_Token(5/*OPEN_BRACKET*/);
+    case "]":
+	return new sc_Token(6/*CLOSE_BRACKET*/);
+    case "'":
+	return new sc_Token(8/*QUOTE*/);
+    case "#":
+	return readSharp();
+    case ".":
+	return readDot();
+    case '"':
+	return readString();
+    default:
+	if (isIdOrNumberChar(curChar))
+	    return readIdOrNumber(curChar);
+	throw "unexpected character: " + curChar;
+    }
+};
+
+function sc_Reader(tokenizer) {
+    this.tokenizer = tokenizer;
+    this.backref = new Array();
+}
+sc_Reader.prototype.read = function() {
+    function readList(listBeginType) {
+	function matchesPeer(open, close) {
+	    return open === 1/*OPEN_PAR*/ && close === 2/*CLOSE_PAR*/
+	    	|| open === 3/*OPEN_BRACE*/ && close === 4/*CLOSE_BRACE*/
+		|| open === 5/*OPEN_BRACKET*/ && close === 6/*CLOSE_BRACKET*/;
+	};
+	var res = null;
+
+	while (true) {
+	    var token = tokenizer.peekToken();
+
+	    switch (token.type) {
+	    case 2/*CLOSE_PAR*/:
+	    case 4/*CLOSE_BRACE*/:
+	    case 6/*CLOSE_BRACKET*/:
+		if (matchesPeer(listBeginType, token.type)) {
+		    tokenizer.readToken(); // consume token
+		    return sc_reverseBang(res);
+		} else
+		    throw "closing par doesn't match: " + listBeginType
+			+ " " + listEndType;
+
+	    case 0/*EOF*/:
+		throw "unexpected end of file";
+
+	    case 10/*DOT*/:
+		tokenizer.readToken(); // consume token
+		var cdr = this.read();
+		var par = tokenizer.readToken();
+		if (!matchesPeer(listBeginType, par.type))
+		    throw "closing par doesn't match: " + listBeginType
+			+ " " + par.type;
+		else
+		    return sc_reverseAppendBang(res, cdr);
+		
+
+	    default:
+		res = sc_cons(this.read(), res);
+	    }
+	}
+    };
+    function readQuote() {
+	return sc_cons("quote", sc_cons(this.read(), null));
+    };
+    function readVector() {
+	// opening-parenthesis is already consumed
+	var a = new Array();
+	while (true) {
+	    var token = tokenizer.peekToken();
+	    switch (token.type) {
+	    case 2/*CLOSE_PAR*/:
+		tokenizer.readToken();
+		return a;
+		
+	    default:
+		a.push(this.read());
+	    }
+	}
+    };
+
+    function storeRefence(nb) {
+	var tmp = this.read();
+	this.backref[nb] = tmp;
+	return tmp;
+    };
+	
+    function readReference(nb) {
+	if (nb in this.backref)
+	    return this.backref[nb];
+	else
+	    throw "bad reference: " + nb;
+    };
+
+    var tokenizer = this.tokenizer;
+
+    var token = tokenizer.readToken();
+
+    // handle error
+    if (token.type === 13/*ERROR*/)
+	throw token.val;
+
+    switch (token.type) {
+    case 1/*OPEN_PAR*/:
+    case 3/*OPEN_BRACE*/:
+    case 5/*OPEN_BRACKET*/:
+	return readList.call(this, token.type);
+    case 8/*QUOTE*/:
+	return readQuote.call(this);
+    case 11/*STRING*/:
+	return sc_jsstring2string(token.val);
+    case 20/*CHAR*/:
+	return new sc_Char(token.val);
+    case 14/*VECTOR_BEGIN*/:
+	return readVector.call(this);
+    case 18/*REFERENCE*/:
+	return readReference.call(this, token.val);
+    case 19/*STORE*/:
+	return storeRefence.call(this, token.val);
+    case 9/*ID*/:
+	return sc_jsstring2symbol(token.val);
+    case 0/*EOF*/:
+    case 12/*NUMBER*/:
+    case 15/*TRUE*/:
+    case 16/*FALSE*/:
+    case 17/*UNSPECIFIED*/:
+	return token.val;
+    default:
+	throw "unexpected token " + token.type + " " + token.val;
+    }
+};
+
+/*** META ((export #t)) */
+function sc_read(port) {
+    if (port === undefined) // we assume the port hasn't been given.
+	port = SC_DEFAULT_IN; // THREAD: shared var...
+    var reader = new sc_Reader(new sc_Tokenizer(port));
+    return reader.read();
+}
+/*** META ((export #t)) */
+function sc_readChar(port) {
+    if (port === undefined) // we assume the port hasn't been given.
+	port = SC_DEFAULT_IN; // THREAD: shared var...
+    var t = port.readChar();
+    return t === SC_EOF_OBJECT? t: new sc_Char(t);
+}
+/*** META ((export #t)) */
+function sc_peekChar(port) {
+    if (port === undefined) // we assume the port hasn't been given.
+	port = SC_DEFAULT_IN; // THREAD: shared var...
+    var t = port.peekChar();
+    return t === SC_EOF_OBJECT? t: new sc_Char(t);
+}
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isCharReady(port) {
+    if (port === undefined) // we assume the port hasn't been given.
+	port = SC_DEFAULT_IN; // THREAD: shared var...
+    return port.isCharReady();
+}
+/*** META ((export #t)
+           (peephole (postfix ".close()")))
+*/
+function sc_closeInputPort(p) {
+    return p.close();
+}
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix " instanceof sc_InputPort")))
+*/
+function sc_isInputPort(o) {
+    return (o instanceof sc_InputPort);
+}
+
+/*** META ((export eof-object?)
+           (type bool)
+           (peephole (postfix " === SC_EOF_OBJECT")))
+*/
+function sc_isEOFObject(o) {
+    return o === SC_EOF_OBJECT;
+}
+
+/*** META ((export #t)
+           (peephole (hole 0 "SC_DEFAULT_IN")))
+*/
+function sc_currentInputPort() {
+    return SC_DEFAULT_IN;
+}
+
+/* ------------ file operations are not supported -----------*/
+/*** META ((export #t)) */
+function sc_callWithInputFile(s, proc) {
+    throw "can't open " + s;
+}
+
+/*** META ((export #t)) */
+function sc_callWithOutputFile(s, proc) {
+    throw "can't open " + s;
+}
+
+/*** META ((export #t)) */
+function sc_withInputFromFile(s, thunk) {
+    throw "can't open " + s;
+}
+
+/*** META ((export #t)) */
+function sc_withOutputToFile(s, thunk) {
+    throw "can't open " + s;
+}
+
+/*** META ((export #t)) */
+function sc_openInputFile(s) {
+    throw "can't open " + s;
+}
+
+/*** META ((export #t)) */
+function sc_openOutputFile(s) {
+    throw "can't open " + s;
+}
+
+/* ----------------------------------------------------------------------------*/
+/*** META ((export #t)) */
+function sc_basename(p) {
+   var i = p.lastIndexOf('/');
+
+   if(i >= 0)
+      return p.substring(i + 1, p.length);
+   else
+      return '';
+}
+
+/*** META ((export #t)) */
+function sc_dirname(p) {
+   var i = p.lastIndexOf('/');
+
+   if(i >= 0)
+      return p.substring(0, i);
+   else
+      return '';
+}
+
+/* ----------------------------------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_withInputFromPort(p, thunk) {
+    try {
+	var tmp = SC_DEFAULT_IN; // THREAD: shared var.
+	SC_DEFAULT_IN = p;
+	return thunk();
+    } finally {
+	SC_DEFAULT_IN = tmp;
+    }
+}
+
+/*** META ((export #t)) */
+function sc_withInputFromString(s, thunk) {
+    return sc_withInputFromPort(new sc_StringInputPort(sc_string2jsstring(s)), thunk);
+}
+
+/*** META ((export #t)) */
+function sc_withOutputToPort(p, thunk) {
+    try {
+	var tmp = SC_DEFAULT_OUT; // THREAD: shared var.
+	SC_DEFAULT_OUT = p;
+	return thunk();
+    } finally {
+	SC_DEFAULT_OUT = tmp;
+    }
+}
+
+/*** META ((export #t)) */
+function sc_withOutputToString(thunk) {
+    var p = new sc_StringOutputPort();
+    sc_withOutputToPort(p, thunk);
+    return p.close();
+}
+
+/*** META ((export #t)) */
+function sc_withOutputToProcedure(proc, thunk) {
+    var t = function(s) { proc(sc_jsstring2string(s)); };
+    return sc_withOutputToPort(new sc_GenericOutputPort(t), thunk);
+}
+
+/*** META ((export #t)
+           (peephole (hole 0 "new sc_StringOutputPort()")))
+*/
+function sc_openOutputString() {
+    return new sc_StringOutputPort();
+}
+
+/*** META ((export #t)) */
+function sc_openInputString(str) {
+    return new sc_StringInputPort(sc_string2jsstring(str));
+}
+
+/* ----------------------------------------------------------------------------*/
+
+function sc_OutputPort() {
+}
+sc_OutputPort.prototype = new sc_Port();
+sc_OutputPort.prototype.appendJSString = function(obj) {
+    /* do nothing */
+}
+sc_OutputPort.prototype.close = function() {
+    /* do nothing */
+}
+
+function sc_StringOutputPort() {
+    this.res = "";
+}
+sc_StringOutputPort.prototype = new sc_OutputPort();
+sc_StringOutputPort.prototype.appendJSString = function(s) {
+    this.res += s;
+}
+sc_StringOutputPort.prototype.close = function() {
+    return sc_jsstring2string(this.res);
+}
+
+/*** META ((export #t)) */
+function sc_getOutputString(sp) {
+    return sc_jsstring2string(sp.res);
+}
+
+
+function sc_ErrorOutputPort() {
+}
+sc_ErrorOutputPort.prototype = new sc_OutputPort();
+sc_ErrorOutputPort.prototype.appendJSString = function(s) {
+    throw "don't write on ErrorPort!";
+}
+sc_ErrorOutputPort.prototype.close = function() {
+    /* do nothing */
+}
+
+function sc_GenericOutputPort(appendJSString, close) {
+    this.appendJSString = appendJSString;
+    if (close)
+	this.close = close;
+}
+sc_GenericOutputPort.prototype = new sc_OutputPort();
+
+/*** META ((export #t)
+           (type bool)
+           (peephole (postfix " instanceof sc_OutputPort")))
+*/
+function sc_isOutputPort(o) {
+    return (o instanceof sc_OutputPort);
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".close()")))
+*/
+function sc_closeOutputPort(p) {
+    return p.close();
+}
+
+/* ------------------ write ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_write(o, p) {
+    if (p === undefined) // we assume not given
+	p = SC_DEFAULT_OUT;
+    p.appendJSString(sc_toWriteString(o));
+}
+
+function sc_toWriteString(o) {
+    if (o === null)
+	return "()";
+    else if (o === true)
+	return "#t";
+    else if (o === false)
+	return "#f";
+    else if (o === undefined)
+	return "#unspecified";
+    else if (typeof o === 'function')
+	return "#<procedure " + sc_hash(o) + ">";
+    else if (o.sc_toWriteString)
+	return o.sc_toWriteString();
+    else
+	return o.toString();
+}
+
+function sc_escapeWriteString(s) {
+    var res = "";
+    var j = 0;
+    for (i = 0; i < s.length; i++) {
+	switch (s.charAt(i)) {
+	case "\0": res += s.substring(j, i) + "\\0"; j = i + 1; break;
+	case "\b": res += s.substring(j, i) + "\\b"; j = i + 1; break;
+	case "\f": res += s.substring(j, i) + "\\f"; j = i + 1; break;
+	case "\n": res += s.substring(j, i) + "\\n"; j = i + 1; break;
+	case "\r": res += s.substring(j, i) + "\\r"; j = i + 1; break;
+	case "\t": res += s.substring(j, i) + "\\t"; j = i + 1; break;
+	case "\v": res += s.substring(j, i) + "\\v"; j = i + 1; break;
+	case '"': res += s.substring(j, i) + '\\"'; j = i + 1; break;
+	case "\\": res += s.substring(j, i) + "\\\\"; j = i + 1; break;
+	default:
+	    var c = s.charAt(i);
+	    if ("\a" !== "a" && c == "\a") {
+		res += s.substring(j, i) + "\\a"; j = i + 1; continue;
+	    }
+	    if ("\v" !== "v" && c == "\v") {
+		res += s.substring(j, i) + "\\v"; j = i + 1; continue;
+	    }
+	    //if (s.charAt(i) < ' ' || s.charCodeAt(i) > 127) {
+	    // CARE: Manuel is this OK with HOP?
+	    if (s.charAt(i) < ' ') {
+		/* non printable character and special chars */
+		res += s.substring(j, i) + "\\x" + s.charCodeAt(i).toString(16);
+		j = i + 1;
+	    }
+	    // else just let i increase...
+	}
+    }
+    res += s.substring(j, i);
+    return res;
+}
+
+/* ------------------ display ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_display(o, p) {
+    if (p === undefined) // we assume not given
+	p = SC_DEFAULT_OUT;
+    p.appendJSString(sc_toDisplayString(o));
+}
+
+function sc_toDisplayString(o) {
+    if (o === null)
+	return "()";
+    else if (o === true)
+	return "#t";
+    else if (o === false)
+	return "#f";
+    else if (o === undefined)
+	return "#unspecified";
+    else if (typeof o === 'function')
+	return "#<procedure " + sc_hash(o) + ">";
+    else if (o.sc_toDisplayString)
+	return o.sc_toDisplayString();
+    else
+	return o.toString();
+}
+
+/* ------------------ newline ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_newline(p) {
+    if (p === undefined) // we assume not given
+	p = SC_DEFAULT_OUT;
+    p.appendJSString("\n");
+}
+
+/* ------------------ write-char ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_writeChar(c, p) {
+    if (p === undefined) // we assume not given
+	p = SC_DEFAULT_OUT;
+    p.appendJSString(c.val);
+}
+
+/* ------------------ write-circle ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_writeCircle(o, p) {
+    if (p === undefined) // we assume not given
+	p = SC_DEFAULT_OUT;
+    p.appendJSString(sc_toWriteCircleString(o));
+}
+
+function sc_toWriteCircleString(o) {
+    var symb = sc_gensym("writeCircle");
+    var nbPointer = new Object();
+    nbPointer.nb = 0;
+    sc_prepWriteCircle(o, symb, nbPointer);
+    return sc_genToWriteCircleString(o, symb);
+}
+
+function sc_prepWriteCircle(o, symb, nbPointer) {
+    // TODO sc_Struct
+    if (o instanceof sc_Pair ||
+	o instanceof sc_Vector) {
+	if (o[symb] !== undefined) {
+	    // not the first visit.
+	    o[symb]++;
+	    // unless there is already a number, assign one.
+	    if (!o[symb + "nb"]) o[symb + "nb"] = nbPointer.nb++;
+	    return;
+	}
+	o[symb] = 0;
+	if (o instanceof sc_Pair) {
+	    sc_prepWriteCircle(o.car, symb, nbPointer);
+	    sc_prepWriteCircle(o.cdr, symb, nbPointer);
+	} else {
+	    for (var i = 0; i < o.length; i++)
+		sc_prepWriteCircle(o[i], symb, nbPointer);
+	}
+    }
+}
+
+function sc_genToWriteCircleString(o, symb) {
+    if (!(o instanceof sc_Pair ||
+	  o instanceof sc_Vector))
+	return sc_toWriteString(o);
+    return o.sc_toWriteCircleString(symb);
+}
+sc_Pair.prototype.sc_toWriteCircleString = function(symb, inList) {
+    if (this[symb + "use"]) { // use-flag is set. Just use it.
+	var nb = this[symb + "nb"];
+	if (this[symb]-- === 0) { // if we are the last use. remove all fields.
+	    delete this[symb];
+	    delete this[symb + "nb"];
+	    delete this[symb + "use"];
+	}
+	if (inList)
+	    return '. #' + nb + '#';
+	else
+	    return '#' + nb + '#';
+    }
+    if (this[symb]-- === 0) { // if we are the last use. remove all fields.
+	delete this[symb];
+	delete this[symb + "nb"];
+	delete this[symb + "use"];
+    }
+
+    var res = "";
+
+    if (this[symb] !== undefined) { // implies > 0
+	this[symb + "use"] = true;
+	if (inList)
+	    res += '. #' + this[symb + "nb"] + '=';
+	else
+	    res += '#' + this[symb + "nb"] + '=';
+	inList = false;
+    }
+
+    if (!inList)
+	res += "(";
+
+    // print car
+    res += sc_genToWriteCircleString(this.car, symb);
+
+    if (sc_isPair(this.cdr)) {
+	res += " " + this.cdr.sc_toWriteCircleString(symb, true);
+    } else if (this.cdr !== null) {
+	res += " . " + sc_genToWriteCircleString(this.cdr, symb);
+    }
+    if (!inList)
+	res += ")";
+    return res;
+};
+sc_Vector.prototype.sc_toWriteCircleString = function(symb) {
+    if (this[symb + "use"]) { // use-flag is set. Just use it.
+	var nb = this[symb + "nb"];
+	if (this[symb]-- === 0) { // if we are the last use. remove all fields.
+	    delete this[symb];
+	    delete this[symb + "nb"];
+	    delete this[symb + "use"];
+	}
+	return '#' + nb + '#';
+    }
+    if (this[symb]-- === 0) { // if we are the last use. remove all fields.
+	delete this[symb];
+	delete this[symb + "nb"];
+	delete this[symb + "use"];
+    }
+
+    var res = "";
+    if (this[symb] !== undefined) { // implies > 0
+	this[symb + "use"] = true;
+	res += '#' + this[symb + "nb"] + '=';
+    }
+    res += "#(";
+    for (var i = 0; i < this.length; i++) {
+	res += sc_genToWriteCircleString(this[i], symb);
+	if (i < this.length - 1) res += " ";
+    }
+    res += ")";
+    return res;
+};
+
+
+/* ------------------ print ---------------------------------------------------*/
+
+/*** META ((export #t)) */
+function sc_print(s) {
+    if (arguments.length === 1) {
+	sc_display(s);
+	sc_newline();
+    }
+    else {
+	for (var i = 0; i < arguments.length; i++)
+	    sc_display(arguments[i]);
+	sc_newline();
+    }
+}
+
+/* ------------------ format ---------------------------------------------------*/
+/*** META ((export #t)) */
+function sc_format(s, args) {
+   var len = s.length;
+   var p = new sc_StringOutputPort();
+   var i = 0, j = 1;
+
+   while( i < len ) {
+      var i2 = s.indexOf("~", i);
+
+      if (i2 == -1) {
+	  p.appendJSString( s.substring( i, len ) );
+	  return p.close();
+      } else {
+	 if (i2 > i) {
+	    if (i2 == (len - 1)) {
+		p.appendJSString(s.substring(i, len));
+		return p.close();
+	    } else {
+	       p.appendJSString(s.substring(i, i2));
+	       i = i2;
+	    }
+	 }
+
+	 switch(s.charCodeAt(i2 + 1)) {
+	    case 65:
+	    case 97:
+	       // a
+	       sc_display(arguments[j], p);
+	       i += 2; j++;
+	       break;
+
+	    case 83:
+	    case 115:
+	       // s
+	       sc_write(arguments[j], p);
+	       i += 2; j++;
+	       break;
+
+	    case 86:
+	    case 118:
+	       // v
+	       sc_display(arguments[j], p);
+	       p.appendJSString("\n");
+	       i += 2; j++;
+	       break;
+
+	    case 67:
+	    case 99:
+	       // c
+	       p.appendJSString(String.fromCharCode(arguments[j]));
+	       i += 2; j++;
+	       break;
+
+	    case 88:
+	    case 120:
+	       // x
+	       p.appendJSString(arguments[j].toString(6));
+	       i += 2; j++;
+	       break;
+
+	    case 79:
+	    case 111:
+	       // o
+	       p.appendJSString(arguments[j].toString(8));
+	       i += 2; j++;
+	       break;
+
+	    case 66:
+	    case 98:
+	       // b
+	       p.appendJSString(arguments[j].toString(2));
+	       i += 2; j++;
+	       break;
+
+	    case 37:
+	    case 110:
+	       // %, n
+	       p.appendJSString("\n");
+	       i += 2; break;
+
+	    case 114:
+	       // r
+	       p.appendJSString("\r");
+	       i += 2; break;
+
+	    case 126:
+	       // ~
+	       p.appendJSString("~");
+	       i += 2; break;
+
+	    default:
+	       sc_error( "format: illegal ~"
+			 + String.fromCharCode(s.charCodeAt(i2 + 1))
+			 + " sequence" );
+	       return "";
+	 }
+      }
+   }
+
+   return p.close();
+}
+
+/* ------------------ global ports ---------------------------------------------------*/
+
+var SC_DEFAULT_IN = new sc_ErrorInputPort();
+var SC_DEFAULT_OUT = new sc_ErrorOutputPort();
+var SC_ERROR_OUT = new sc_ErrorOutputPort();
+
+var sc_SYMBOL_PREFIX = "\u1E9C";
+var sc_KEYWORD_PREFIX = "\u1E9D";
+
+/*** META ((export #t)
+           (peephole (id))) */
+function sc_jsstring2string(s) {
+    return s;
+}
+
+/*** META ((export #t)
+           (peephole (prefix "'\\u1E9C' +")))
+*/
+function sc_jsstring2symbol(s) {
+    return sc_SYMBOL_PREFIX + s;
+}
+
+/*** META ((export #t)
+           (peephole (id)))
+*/
+function sc_string2jsstring(s) {
+    return s;
+}
+
+/*** META ((export #t)
+           (peephole (symbol2jsstring_immutable)))
+*/
+function sc_symbol2jsstring(s) {
+    return s.slice(1);
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".slice(1)")))
+*/
+function sc_keyword2jsstring(k) {
+    return k.slice(1);
+}
+
+/*** META ((export #t)
+           (peephole (prefix "'\\u1E9D' +")))
+*/
+function sc_jsstring2keyword(s) {
+    return sc_KEYWORD_PREFIX + s;
+}
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isKeyword(s) {
+    return (typeof s === "string") &&
+	(s.charAt(0) === sc_KEYWORD_PREFIX);
+}
+
+
+/*** META ((export #t)) */
+var sc_gensym = function() {
+    var counter = 1000;
+    return function(sym) {
+	counter++;
+	if (!sym) sym = sc_SYMBOL_PREFIX;
+	return sym + "s" + counter + "~" + "^sC-GeNsYm ";
+    };
+}();
+
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isEqual(o1, o2) {
+    return ((o1 === o2) ||
+	    (sc_isPair(o1) && sc_isPair(o2)
+	     && sc_isPairEqual(o1, o2, sc_isEqual)) ||
+	    (sc_isVector(o1) && sc_isVector(o2)
+	     && sc_isVectorEqual(o1, o2, sc_isEqual)));
+}
+
+/*** META ((export number->symbol integer->symbol)) */
+function sc_number2symbol(x, radix) {
+    return sc_SYMBOL_PREFIX + sc_number2jsstring(x, radix);
+}
+
+/*** META ((export number->string integer->string)) */
+var sc_number2string = sc_number2jsstring;
+
+/*** META ((export #t)) */
+function sc_symbol2number(s, radix) {
+    return sc_jsstring2number(s.slice(1), radix);
+}
+
+/*** META ((export #t)) */
+var sc_string2number = sc_jsstring2number;
+
+/*** META ((export #t)
+           (peephole (prefix "+" s)))
+           ;; peephole will only apply if no radix is given.
+*/
+function sc_string2integer(s, radix) {
+    if (!radix) return +s;
+    return parseInt(s, radix);
+}
+
+/*** META ((export #t)
+           (peephole (prefix "+")))
+*/
+function sc_string2real(s) {
+    return +s;
+}
+
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isSymbol(s) {
+    return (typeof s === "string") &&
+	(s.charAt(0) === sc_SYMBOL_PREFIX);
+}
+
+/*** META ((export #t)
+           (peephole (symbol2string_immutable)))
+*/
+function sc_symbol2string(s) {
+    return s.slice(1);
+}
+
+/*** META ((export #t)
+           (peephole (prefix "'\\u1E9C' +")))
+*/
+function sc_string2symbol(s) {
+    return sc_SYMBOL_PREFIX + s;
+}
+
+/*** META ((export symbol-append)
+           (peephole (symbolAppend_immutable)))
+*/
+function sc_symbolAppend() {
+    var res = sc_SYMBOL_PREFIX;
+    for (var i = 0; i < arguments.length; i++)
+	res += arguments[i].slice(1);
+    return res;
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".val")))
+*/
+function sc_char2string(c) { return c.val; }
+
+/*** META ((export #t)
+           (peephole (hole 1 "'\\u1E9C' + " c ".val")))
+*/
+function sc_char2symbol(c) { return sc_SYMBOL_PREFIX + c.val; }
+
+/*** META ((export #t)
+           (type bool))
+*/
+function sc_isString(s) {
+    return (typeof s === "string") &&
+	(s.charAt(0) !== sc_SYMBOL_PREFIX);
+}
+
+/*** META ((export #t)) */
+var sc_makeString = sc_makejsString;
+
+
+/*** META ((export #t)) */
+function sc_string() {
+    for (var i = 0; i < arguments.length; i++)
+	arguments[i] = arguments[i].val;
+    return "".concat.apply("", arguments);
+}
+
+/*** META ((export #t)
+           (peephole (postfix ".length")))
+*/
+function sc_stringLength(s) { return s.length; }
+
+/*** META ((export #t)) */
+function sc_stringRef(s, k) {
+    return new sc_Char(s.charAt(k));
+}
+
+/* there's no stringSet in the immutable version
+function sc_stringSet(s, k, c)
+*/
+
+
+/*** META ((export string=?)
+	   (type bool)
+           (peephole (hole 2 str1 " === " str2)))
+*/
+function sc_isStringEqual(s1, s2) {
+    return s1 === s2;
+}
+/*** META ((export string<?)
+	   (type bool)
+           (peephole (hole 2 str1 " < " str2)))
+*/
+function sc_isStringLess(s1, s2) {
+    return s1 < s2;
+}
+/*** META ((export string>?)
+	   (type bool)
+           (peephole (hole 2 str1 " > " str2)))
+*/
+function sc_isStringGreater(s1, s2) {
+    return s1 > s2;
+}
+/*** META ((export string<=?)
+	   (type bool)
+           (peephole (hole 2 str1 " <= " str2)))
+*/
+function sc_isStringLessEqual(s1, s2) {
+    return s1 <= s2;
+}
+/*** META ((export string>=?)
+	   (type bool)
+           (peephole (hole 2 str1 " >= " str2)))
+*/
+function sc_isStringGreaterEqual(s1, s2) {
+    return s1 >= s2;
+}
+/*** META ((export string-ci=?)
+	   (type bool)
+           (peephole (hole 2 str1 ".toLowerCase() === " str2 ".toLowerCase()")))
+*/
+function sc_isStringCIEqual(s1, s2) {
+    return s1.toLowerCase() === s2.toLowerCase();
+}
+/*** META ((export string-ci<?)
+	   (type bool)
+           (peephole (hole 2 str1 ".toLowerCase() < " str2 ".toLowerCase()")))
+*/
+function sc_isStringCILess(s1, s2) {
+    return s1.toLowerCase() < s2.toLowerCase();
+}
+/*** META ((export string-ci>?)
+	   (type bool)
+           (peephole (hole 2 str1 ".toLowerCase() > " str2 ".toLowerCase()")))
+*/
+function sc_isStringCIGreater(s1, s2) {
+    return s1.toLowerCase() > s2.toLowerCase();
+}
+/*** META ((export string-ci<=?)
+	   (type bool)
+           (peephole (hole 2 str1 ".toLowerCase() <= " str2 ".toLowerCase()")))
+*/
+function sc_isStringCILessEqual(s1, s2) {
+    return s1.toLowerCase() <= s2.toLowerCase();
+}
+/*** META ((export string-ci>=?)
+	   (type bool)
+           (peephole (hole 2 str1 ".toLowerCase() >= " str2 ".toLowerCase()")))
+*/
+function sc_isStringCIGreaterEqual(s1, s2) {
+    return s1.toLowerCase() >= s2.toLowerCase();
+}
+
+/*** META ((export #t)
+           (peephole (hole 3 s ".substring(" start ", " end ")")))
+*/
+function sc_substring(s, start, end) {
+    return s.substring(start, end);
+}
+
+/*** META ((export #t))
+*/
+function sc_isSubstring_at(s1, s2, i) {
+    return s2 == s1.substring(i, i+ s2.length);
+}
+
+/*** META ((export #t)
+           (peephole (infix 0 #f "+" "''")))
+*/
+function sc_stringAppend() {
+    return "".concat.apply("", arguments);
+}
+
+/*** META ((export #t)) */
+var sc_string2list = sc_jsstring2list;
+
+/*** META ((export #t)) */
+var sc_list2string = sc_list2jsstring;
+
+/*** META ((export #t)
+           (peephole (id)))
+*/
+function sc_stringCopy(s) {
+    return s;
+}
+
+/* there's no string-fill in the immutable version
+function sc_stringFill(s, c)
+*/
+
+/*** META ((export #t)
+           (peephole (postfix ".slice(1)")))
+*/
+function sc_keyword2string(o) {
+    return o.slice(1);
+}
+
+/*** META ((export #t)
+           (peephole (prefix "'\\u1E9D' +")))
+*/
+function sc_string2keyword(o) {
+    return sc_KEYWORD_PREFIX + o;
+}
+
+String.prototype.sc_toDisplayString = function() {
+    if (this.charAt(0) === sc_SYMBOL_PREFIX)
+	// TODO: care for symbols with spaces (escape-chars symbols).
+	return this.slice(1);
+    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
+	return ":" + this.slice(1);
+    else
+	return this.toString();
+};
+
+String.prototype.sc_toWriteString = function() {
+    if (this.charAt(0) === sc_SYMBOL_PREFIX)
+	// TODO: care for symbols with spaces (escape-chars symbols).
+	return this.slice(1);
+    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
+	return ":" + this.slice(1);
+    else
+	return '"' + sc_escapeWriteString(this) + '"';
+};
+/* Exported Variables */
+var BgL_testzd2boyerzd2;
+var BgL_nboyerzd2benchmarkzd2;
+var BgL_setupzd2boyerzd2;
+/* End Exports */
+
+var translate_term_nboyer;
+var translate_args_nboyer;
+var untranslate_term_nboyer;
+var BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer;
+var BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer;
+var translate_alist_nboyer;
+var apply_subst_nboyer;
+var apply_subst_lst_nboyer;
+var tautologyp_nboyer;
+var if_constructor_nboyer;
+var rewrite_count_nboyer;
+var rewrite_nboyer;
+var rewrite_args_nboyer;
+var unify_subst_nboyer;
+var one_way_unify1_nboyer;
+var false_term_nboyer;
+var true_term_nboyer;
+var trans_of_implies1_nboyer;
+var is_term_equal_nboyer;
+var is_term_member_nboyer;
+var const_nboyer;
+var sc_const_3_nboyer;
+var sc_const_4_nboyer;
+{
+    (sc_const_4_nboyer = (new sc_Pair("\u1E9Cimplies",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cu",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cu",(new sc_Pair("\u1E9Cw",null)))))),null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cw",null)))))),null)))))));
+    (sc_const_3_nboyer = sc_list((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccompile",(new sc_Pair("\u1E9Cform",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Ccodegen",(new sc_Pair((new sc_Pair("\u1E9Coptimize",(new sc_Pair("\u1E9Cform",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ceqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreaterp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clesseqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatereqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cboolean",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ciff",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ceven1",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Codd",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccountps-",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cpred",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccountps-loop",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cpred",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfact-",(new sc_Pair("\u1E9Ci",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfact-loop",(new sc_Pair("\u1E9Ci",(new sc_Pair((1),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdivides",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassume-true",(new sc_Pair("\u1E9Cvar",(new sc_Pair("\u1E9Calist",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cvar",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))),(new sc_Pair("\u1E9Calist",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassume-false",(new sc_Pair("\u1E9Cvar",(new sc_Pair("\u1E9Calist",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cvar",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))),(new sc_Pair("\u1E9Calist",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctautology-checker",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ctautologyp",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfalsify",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfalsify1",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cprime",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))),null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cprime1",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cx",null)))),null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair("\u1E9Cp",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))))),(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cb",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cc",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cplus-fringe",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Ca",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cpds",(new sc_Pair("\u1E9Cenvrn",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cpds",(new sc_Pair("\u1E9Cenvrn",null)))))))),(new sc_Pair("\u1E9Cenvrn",null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmc-flatten",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cb",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Cintersect",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ck",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Ck",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ck",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair("\u1E9Ck",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Csort-lp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus1",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair("\u1E9Ci",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cbase",null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ci",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cj",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cj",(new sc_Pair((1),null)))))),null)))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Ci",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus",(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Cbase",null)))))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Ca",null)))),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cw",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Cx",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cz",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cvalue",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cvalue",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnlistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csamefringe",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((1),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((1),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cz",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cw",(new sc_Pair((1),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatereqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((1),null)))))),(new sc_Pair(sc_list("\u1E9Cand", (new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))), (new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))), (new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Ca",null)))), (new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cb",null)))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cl",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair("\u1E9Cl",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdsort",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx1",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx2",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx3",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx4",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx5",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx6",(new sc_Pair("\u1E9Cx7",null)))))),null)))))),null)))))),null)))))),null)))))),null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((6),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cx7",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((2),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((2),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Cy",(new sc_Pair((2),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csigma",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Ci",null)))),null)))))),(new sc_Pair((2),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cz",null)))),null)))))),null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ci",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair("\u1E9Ca",null)))),null)))),(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair("\u1E9Cb",null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),(new sc_Pair("\u1E9Cz",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cassignedp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cb",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair((new sc_Pair("\u1E9Ccdr",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccdr",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cget",(new sc_Pair("\u1E9Cj",(new sc_Pair((new sc_Pair("\u1E9Cset",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cval",(new sc_Pair("\u1E9Cmem",null)))))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Ceqp",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair("\u1E9Cval",(new sc_Pair((new sc_Pair("\u1E9Cget",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Cmem",null)))))),null)))))))),null))))))));
+    (const_nboyer = (new sc_Pair((new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cc",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cd",null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cu",(new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cb",null)))),null)))))),null)))))))),null)))))))))));
+    BgL_nboyerzd2benchmarkzd2 = function() {
+        var args = null;
+        for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) {
+            args = sc_cons(arguments[sc_tmp], args);
+        }
+        var n;
+        return ((n = ((args === null)?(0):(args.car))), (BgL_setupzd2boyerzd2()), (BgL_runzd2benchmarkzd2(("nboyer"+(sc_number2string(n))), (1), function() {
+            return (BgL_testzd2boyerzd2(n));
+        }, function(rewrites) {
+            if ((sc_isNumber(rewrites)))
+                switch (n) {
+                case (0):
+                    return (rewrites===(95024));
+                    break;
+                case (1):
+                    return (rewrites===(591777));
+                    break;
+                case (2):
+                    return (rewrites===(1813975));
+                    break;
+                case (3):
+                    return (rewrites===(5375678));
+                    break;
+                case (4):
+                    return (rewrites===(16445406));
+                    break;
+                case (5):
+                    return (rewrites===(51507739));
+                    break;
+                default:
+                    return true;
+                    break;
+                }
+            else
+                return false;
+        })));
+    };
+    BgL_setupzd2boyerzd2 = function() {
+        return true;
+    };
+    BgL_testzd2boyerzd2 = function() {
+        return true;
+    };
+    translate_term_nboyer = function(term) {
+        var lst;
+        return (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), ((lst = (term.cdr)), ((lst === null)?null:(new sc_Pair((translate_term_nboyer((lst.car))), (translate_args_nboyer((lst.cdr))))))))));
+    };
+    translate_args_nboyer = function(lst) {
+        var sc_lst_5;
+        var term;
+        return ((lst === null)?null:(new sc_Pair(((term = (lst.car)), (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr))))))), ((sc_lst_5 = (lst.cdr)), ((sc_lst_5 === null)?null:(new sc_Pair((translate_term_nboyer((sc_lst_5.car))), (translate_args_nboyer((sc_lst_5.cdr))))))))));
+    };
+    untranslate_term_nboyer = function(term) {
+        var optrOpnd;
+        var tail1131;
+        var L1127;
+        var falseHead1130;
+        var symbol_record;
+        if (!(term instanceof sc_Pair))
+            return term;
+        else
+            {
+                (falseHead1130 = (new sc_Pair(null, null)));
+                (L1127 = (term.cdr));
+                (tail1131 = falseHead1130);
+                while (!(L1127 === null)) {
+                    {
+                        (tail1131.cdr = (new sc_Pair((untranslate_term_nboyer((L1127.car))), null)));
+                        (tail1131 = (tail1131.cdr));
+                        (L1127 = (L1127.cdr));
+                    }
+                }
+                (optrOpnd = (falseHead1130.cdr));
+                return (new sc_Pair(((symbol_record = (term.car)), (symbol_record[(0)])), optrOpnd));
+            }
+    };
+    BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer = function(sym) {
+        var r;
+        var x;
+        return ((x = (sc_assq(sym, BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer))), ((x!== false)?(x.cdr):((r = [sym, null]), (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = (new sc_Pair((new sc_Pair(sym, r)), BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer))), r)));
+    };
+    (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null);
+    translate_alist_nboyer = function(alist) {
+        var sc_alist_6;
+        var term;
+        return ((alist === null)?null:(new sc_Pair((new sc_Pair((alist.car.car), ((term = (alist.car.cdr)), (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr))))))))), ((sc_alist_6 = (alist.cdr)), ((sc_alist_6 === null)?null:(new sc_Pair((new sc_Pair((sc_alist_6.car.car), (translate_term_nboyer((sc_alist_6.car.cdr))))), (translate_alist_nboyer((sc_alist_6.cdr))))))))));
+    };
+    apply_subst_nboyer = function(alist, term) {
+        var lst;
+        var temp_temp;
+        return (!(term instanceof sc_Pair)?((temp_temp = (sc_assq(term, alist))), ((temp_temp!== false)?(temp_temp.cdr):term)):(new sc_Pair((term.car), ((lst = (term.cdr)), ((lst === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (lst.car))), (apply_subst_lst_nboyer(alist, (lst.cdr))))))))));
+    };
+    apply_subst_lst_nboyer = function(alist, lst) {
+        var sc_lst_7;
+        return ((lst === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (lst.car))), ((sc_lst_7 = (lst.cdr)), ((sc_lst_7 === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (sc_lst_7.car))), (apply_subst_lst_nboyer(alist, (sc_lst_7.cdr))))))))));
+    };
+    tautologyp_nboyer = function(sc_x_11, true_lst, false_lst) {
+        var tmp1125;
+        var x;
+        var tmp1126;
+        var sc_x_8;
+        var sc_tmp1125_9;
+        var sc_tmp1126_10;
+        var sc_x_11;
+        var true_lst;
+        var false_lst;
+        while (true) {
+            if ((((sc_tmp1126_10 = (is_term_equal_nboyer(sc_x_11, true_term_nboyer))), ((sc_tmp1126_10!== false)?sc_tmp1126_10:(is_term_member_nboyer(sc_x_11, true_lst))))!== false))
+                return true;
+            else
+                if ((((sc_tmp1125_9 = (is_term_equal_nboyer(sc_x_11, false_term_nboyer))), ((sc_tmp1125_9!== false)?sc_tmp1125_9:(is_term_member_nboyer(sc_x_11, false_lst))))!== false))
+                    return false;
+                else
+                    if (!(sc_x_11 instanceof sc_Pair))
+                        return false;
+                    else
+                        if (((sc_x_11.car)===if_constructor_nboyer))
+                            if ((((sc_x_8 = (sc_x_11.cdr.car)), (tmp1126 = (is_term_equal_nboyer(sc_x_8, true_term_nboyer))), ((tmp1126!== false)?tmp1126:(is_term_member_nboyer(sc_x_8, true_lst))))!== false))
+                                (sc_x_11 = (sc_x_11.cdr.cdr.car));
+                            else
+                                if ((((x = (sc_x_11.cdr.car)), (tmp1125 = (is_term_equal_nboyer(x, false_term_nboyer))), ((tmp1125!== false)?tmp1125:(is_term_member_nboyer(x, false_lst))))!== false))
+                                    (sc_x_11 = (sc_x_11.cdr.cdr.cdr.car));
+                                else
+                                    if (((tautologyp_nboyer((sc_x_11.cdr.cdr.car), (new sc_Pair((sc_x_11.cdr.car), true_lst)), false_lst))!== false))
+                                        {
+                                            (false_lst = (new sc_Pair((sc_x_11.cdr.car), false_lst)));
+                                            (sc_x_11 = (sc_x_11.cdr.cdr.cdr.car));
+                                        }
+                                    else
+                                        return false;
+                        else
+                            return false;
+        }
+    };
+    (if_constructor_nboyer = "\u1E9C*");
+    (rewrite_count_nboyer = (0));
+    rewrite_nboyer = function(term) {
+        var term2;
+        var sc_term_12;
+        var lst;
+        var symbol_record;
+        var sc_lst_13;
+        {
+            (++rewrite_count_nboyer);
+            if (!(term instanceof sc_Pair))
+                return term;
+            else
+                {
+                    (sc_term_12 = (new sc_Pair((term.car), ((sc_lst_13 = (term.cdr)), ((sc_lst_13 === null)?null:(new sc_Pair((rewrite_nboyer((sc_lst_13.car))), (rewrite_args_nboyer((sc_lst_13.cdr))))))))));
+                    (lst = ((symbol_record = (term.car)), (symbol_record[(1)])));
+                    while (true) {
+                        if ((lst === null))
+                            return sc_term_12;
+                        else
+                            if ((((term2 = ((lst.car).cdr.car)), (unify_subst_nboyer = null), (one_way_unify1_nboyer(sc_term_12, term2)))!== false))
+                                return (rewrite_nboyer((apply_subst_nboyer(unify_subst_nboyer, ((lst.car).cdr.cdr.car)))));
+                            else
+                                (lst = (lst.cdr));
+                    }
+                }
+        }
+    };
+    rewrite_args_nboyer = function(lst) {
+        var sc_lst_14;
+        return ((lst === null)?null:(new sc_Pair((rewrite_nboyer((lst.car))), ((sc_lst_14 = (lst.cdr)), ((sc_lst_14 === null)?null:(new sc_Pair((rewrite_nboyer((sc_lst_14.car))), (rewrite_args_nboyer((sc_lst_14.cdr))))))))));
+    };
+    (unify_subst_nboyer = "\u1E9C*");
+    one_way_unify1_nboyer = function(term1, term2) {
+        var lst1;
+        var lst2;
+        var temp_temp;
+        if (!(term2 instanceof sc_Pair))
+            {
+                (temp_temp = (sc_assq(term2, unify_subst_nboyer)));
+                if ((temp_temp!== false))
+                    return (is_term_equal_nboyer(term1, (temp_temp.cdr)));
+                else
+                    if ((sc_isNumber(term2)))
+                        return (sc_isEqual(term1, term2));
+                    else
+                        {
+                            (unify_subst_nboyer = (new sc_Pair((new sc_Pair(term2, term1)), unify_subst_nboyer)));
+                            return true;
+                        }
+            }
+        else
+            if (!(term1 instanceof sc_Pair))
+                return false;
+            else
+                if (((term1.car)===(term2.car)))
+                    {
+                        (lst1 = (term1.cdr));
+                        (lst2 = (term2.cdr));
+                        while (true) {
+                            if ((lst1 === null))
+                                return (lst2 === null);
+                            else
+                                if ((lst2 === null))
+                                    return false;
+                                else
+                                    if (((one_way_unify1_nboyer((lst1.car), (lst2.car)))!== false))
+                                        {
+                                            (lst1 = (lst1.cdr));
+                                            (lst2 = (lst2.cdr));
+                                        }
+                                    else
+                                        return false;
+                        }
+                    }
+                else
+                    return false;
+    };
+    (false_term_nboyer = "\u1E9C*");
+    (true_term_nboyer = "\u1E9C*");
+    trans_of_implies1_nboyer = function(n) {
+        var sc_n_15;
+        return ((sc_isEqual(n, (1)))?(sc_list("\u1E9Cimplies", (0), (1))):(sc_list("\u1E9Cand", (sc_list("\u1E9Cimplies", (n-(1)), n)), ((sc_n_15 = (n-(1))), ((sc_isEqual(sc_n_15, (1)))?(sc_list("\u1E9Cimplies", (0), (1))):(sc_list("\u1E9Cand", (sc_list("\u1E9Cimplies", (sc_n_15-(1)), sc_n_15)), (trans_of_implies1_nboyer((sc_n_15-(1)))))))))));
+    };
+    is_term_equal_nboyer = function(x, y) {
+        var lst1;
+        var lst2;
+        var r2;
+        var r1;
+        if ((x instanceof sc_Pair))
+            if ((y instanceof sc_Pair))
+                if ((((r1 = (x.car)), (r2 = (y.car)), (r1===r2))!== false))
+                    {
+                        (lst1 = (x.cdr));
+                        (lst2 = (y.cdr));
+                        while (true) {
+                            if ((lst1 === null))
+                                return (lst2 === null);
+                            else
+                                if ((lst2 === null))
+                                    return false;
+                                else
+                                    if (((is_term_equal_nboyer((lst1.car), (lst2.car)))!== false))
+                                        {
+                                            (lst1 = (lst1.cdr));
+                                            (lst2 = (lst2.cdr));
+                                        }
+                                    else
+                                        return false;
+                        }
+                    }
+                else
+                    return false;
+            else
+                return false;
+        else
+            return (sc_isEqual(x, y));
+    };
+    is_term_member_nboyer = function(x, lst) {
+        var x;
+        var lst;
+        while (true) {
+            if ((lst === null))
+                return false;
+            else
+                if (((is_term_equal_nboyer(x, (lst.car)))!== false))
+                    return true;
+                else
+                    (lst = (lst.cdr));
+        }
+    };
+    BgL_setupzd2boyerzd2 = function() {
+        var symbol_record;
+        var value;
+        var BgL_sc_symbolzd2record_16zd2;
+        var sym;
+        var sc_sym_17;
+        var term;
+        var lst;
+        var sc_term_18;
+        var sc_term_19;
+        {
+            (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null);
+            (if_constructor_nboyer = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer("\u1E9Cif")));
+            (false_term_nboyer = ((sc_term_19 = (new sc_Pair("\u1E9Cf",null))), (!(sc_term_19 instanceof sc_Pair)?sc_term_19:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_19.car))), (translate_args_nboyer((sc_term_19.cdr))))))));
+            (true_term_nboyer = ((sc_term_18 = (new sc_Pair("\u1E9Ct",null))), (!(sc_term_18 instanceof sc_Pair)?sc_term_18:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_18.car))), (translate_args_nboyer((sc_term_18.cdr))))))));
+            (lst = sc_const_3_nboyer);
+            while (!(lst === null)) {
+                {
+                    (term = (lst.car));
+                    if (((term instanceof sc_Pair)&&(((term.car)==="\u1E9Cequal")&&((term.cdr.car) instanceof sc_Pair))))
+                        {
+                            (sc_sym_17 = ((term.cdr.car).car));
+                            (value = (new sc_Pair((!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr)))))), ((sym = ((term.cdr.car).car)), (BgL_sc_symbolzd2record_16zd2 = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sym))), (BgL_sc_symbolzd2record_16zd2[(1)])))));
+                            (symbol_record = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_sym_17)));
+                            (symbol_record[(1)] = value);
+                        }
+                    else
+                        (sc_error("ADD-LEMMA did not like term:  ", term));
+                    (lst = (lst.cdr));
+                }
+            }
+            return true;
+        }
+    };
+    BgL_testzd2boyerzd2 = function(n) {
+        var optrOpnd;
+        var term;
+        var sc_n_20;
+        var answer;
+        var sc_term_21;
+        var sc_term_22;
+        {
+            (rewrite_count_nboyer = (0));
+            (term = sc_const_4_nboyer);
+            (sc_n_20 = n);
+            while (!(sc_n_20=== 0)) {
+                {
+                    (term = (sc_list("\u1E9Cor", term, (new sc_Pair("\u1E9Cf",null)))));
+                    (--sc_n_20);
+                }
+            }
+            (sc_term_22 = term);
+            if (!(sc_term_22 instanceof sc_Pair))
+                (optrOpnd = sc_term_22);
+            else
+                (optrOpnd = (new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_22.car))), (translate_args_nboyer((sc_term_22.cdr))))));
+            (sc_term_21 = (apply_subst_nboyer(((const_nboyer === null)?null:(new sc_Pair((new sc_Pair((const_nboyer.car.car), (translate_term_nboyer((const_nboyer.car.cdr))))), (translate_alist_nboyer((const_nboyer.cdr)))))), optrOpnd)));
+            (answer = (tautologyp_nboyer((rewrite_nboyer(sc_term_21)), null, null)));
+            (sc_write(rewrite_count_nboyer));
+            (sc_display(" rewrites"));
+            (sc_newline());
+            if ((answer!== false))
+                return rewrite_count_nboyer;
+            else
+                return false;
+        }
+    };
+}
+/* Exported Variables */
+var BgL_parsezd2ze3nbzd2treesze3;
+var BgL_earleyzd2benchmarkzd2;
+var BgL_parsezd2ze3parsedzf3zc2;
+var test;
+var BgL_parsezd2ze3treesz31;
+var BgL_makezd2parserzd2;
+/* End Exports */
+
+var const_earley;
+{
+    (const_earley = (new sc_Pair((new sc_Pair("\u1E9Cs",(new sc_Pair((new sc_Pair("\u1E9Ca",null)),(new sc_Pair((new sc_Pair("\u1E9Cs",(new sc_Pair("\u1E9Cs",null)))),null)))))),null)));
+    BgL_makezd2parserzd2 = function(grammar, lexer) {
+        var i;
+        var parser_descr;
+        var def_loop;
+        var nb_nts;
+        var names;
+        var steps;
+        var predictors;
+        var enders;
+        var starters;
+        var nts;
+        var sc_names_1;
+        var sc_steps_2;
+        var sc_predictors_3;
+        var sc_enders_4;
+        var sc_starters_5;
+        var nb_confs;
+        var BgL_sc_defzd2loop_6zd2;
+        var BgL_sc_nbzd2nts_7zd2;
+        var sc_nts_8;
+        var BgL_sc_defzd2loop_9zd2;
+        var ind;
+        {
+            ind = function(nt, sc_nts_10) {
+                var i;
+                {
+                    (i = ((sc_nts_10.length)-(1)));
+                    while (true) {
+                        if ((i>=(0)))
+                            if ((sc_isEqual((sc_nts_10[i]), nt)))
+                                return i;
+                            else
+                                (--i);
+                        else
+                            return false;
+                    }
+                }
+            };
+            (sc_nts_8 = ((BgL_sc_defzd2loop_9zd2 = function(defs, sc_nts_11) {
+                var rule_loop;
+                var head;
+                var def;
+                return ((defs instanceof sc_Pair)?((def = (defs.car)), (head = (def.car)), (rule_loop = function(rules, sc_nts_12) {
+                    var nt;
+                    var l;
+                    var sc_nts_13;
+                    var rule;
+                    if ((rules instanceof sc_Pair))
+                        {
+                            (rule = (rules.car));
+                            (l = rule);
+                            (sc_nts_13 = sc_nts_12);
+                            while ((l instanceof sc_Pair)) {
+                                {
+                                    (nt = (l.car));
+                                    (l = (l.cdr));
+                                    (sc_nts_13 = (((sc_member(nt, sc_nts_13))!== false)?sc_nts_13:(new sc_Pair(nt, sc_nts_13))));
+                                }
+                            }
+                            return (rule_loop((rules.cdr), sc_nts_13));
+                        }
+                    else
+                        return (BgL_sc_defzd2loop_9zd2((defs.cdr), sc_nts_12));
+                }), (rule_loop((def.cdr), (((sc_member(head, sc_nts_11))!== false)?sc_nts_11:(new sc_Pair(head, sc_nts_11)))))):(sc_list2vector((sc_reverse(sc_nts_11)))));
+            }), (BgL_sc_defzd2loop_9zd2(grammar, null))));
+            (BgL_sc_nbzd2nts_7zd2 = (sc_nts_8.length));
+            (nb_confs = (((BgL_sc_defzd2loop_6zd2 = function(defs, BgL_sc_nbzd2confs_14zd2) {
+                var rule_loop;
+                var def;
+                return ((defs instanceof sc_Pair)?((def = (defs.car)), (rule_loop = function(rules, BgL_sc_nbzd2confs_15zd2) {
+                    var l;
+                    var BgL_sc_nbzd2confs_16zd2;
+                    var rule;
+                    if ((rules instanceof sc_Pair))
+                        {
+                            (rule = (rules.car));
+                            (l = rule);
+                            (BgL_sc_nbzd2confs_16zd2 = BgL_sc_nbzd2confs_15zd2);
+                            while ((l instanceof sc_Pair)) {
+                                {
+                                    (l = (l.cdr));
+                                    (++BgL_sc_nbzd2confs_16zd2);
+                                }
+                            }
+                            return (rule_loop((rules.cdr), (BgL_sc_nbzd2confs_16zd2+(1))));
+                        }
+                    else
+                        return (BgL_sc_defzd2loop_6zd2((defs.cdr), BgL_sc_nbzd2confs_15zd2));
+                }), (rule_loop((def.cdr), BgL_sc_nbzd2confs_14zd2))):BgL_sc_nbzd2confs_14zd2);
+            }), (BgL_sc_defzd2loop_6zd2(grammar, (0))))+BgL_sc_nbzd2nts_7zd2));
+            (sc_starters_5 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
+            (sc_enders_4 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
+            (sc_predictors_3 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
+            (sc_steps_2 = (sc_makeVector(nb_confs, false)));
+            (sc_names_1 = (sc_makeVector(nb_confs, false)));
+            (nts = sc_nts_8);
+            (starters = sc_starters_5);
+            (enders = sc_enders_4);
+            (predictors = sc_predictors_3);
+            (steps = sc_steps_2);
+            (names = sc_names_1);
+            (nb_nts = (sc_nts_8.length));
+            (i = (nb_nts-(1)));
+            while ((i>=(0))) {
+                {
+                    (sc_steps_2[i] = (i-nb_nts));
+                    (sc_names_1[i] = (sc_list((sc_nts_8[i]), (0))));
+                    (sc_enders_4[i] = (sc_list(i)));
+                    (--i);
+                }
+            }
+            def_loop = function(defs, conf) {
+                var rule_loop;
+                var head;
+                var def;
+                return ((defs instanceof sc_Pair)?((def = (defs.car)), (head = (def.car)), (rule_loop = function(rules, conf, rule_num) {
+                    var i;
+                    var sc_i_17;
+                    var nt;
+                    var l;
+                    var sc_conf_18;
+                    var sc_i_19;
+                    var rule;
+                    if ((rules instanceof sc_Pair))
+                        {
+                            (rule = (rules.car));
+                            (names[conf] = (sc_list(head, rule_num)));
+                            (sc_i_19 = (ind(head, nts)));
+                            (starters[sc_i_19] = (new sc_Pair(conf, (starters[sc_i_19]))));
+                            (l = rule);
+                            (sc_conf_18 = conf);
+                            while ((l instanceof sc_Pair)) {
+                                {
+                                    (nt = (l.car));
+                                    (steps[sc_conf_18] = (ind(nt, nts)));
+                                    (sc_i_17 = (ind(nt, nts)));
+                                    (predictors[sc_i_17] = (new sc_Pair(sc_conf_18, (predictors[sc_i_17]))));
+                                    (l = (l.cdr));
+                                    (++sc_conf_18);
+                                }
+                            }
+                            (steps[sc_conf_18] = ((ind(head, nts))-nb_nts));
+                            (i = (ind(head, nts)));
+                            (enders[i] = (new sc_Pair(sc_conf_18, (enders[i]))));
+                            return (rule_loop((rules.cdr), (sc_conf_18+(1)), (rule_num+(1))));
+                        }
+                    else
+                        return (def_loop((defs.cdr), conf));
+                }), (rule_loop((def.cdr), conf, (1)))):undefined);
+            };
+            (def_loop(grammar, (sc_nts_8.length)));
+            (parser_descr = [lexer, sc_nts_8, sc_starters_5, sc_enders_4, sc_predictors_3, sc_steps_2, sc_names_1]);
+            return function(input) {
+                var optrOpnd;
+                var sc_optrOpnd_20;
+                var sc_optrOpnd_21;
+                var sc_optrOpnd_22;
+                var loop1;
+                var BgL_sc_stateza2_23za2;
+                var toks;
+                var BgL_sc_nbzd2nts_24zd2;
+                var sc_steps_25;
+                var sc_enders_26;
+                var state_num;
+                var BgL_sc_statesza2_27za2;
+                var states;
+                var i;
+                var conf;
+                var l;
+                var tok_nts;
+                var sc_i_28;
+                var sc_i_29;
+                var l1;
+                var l2;
+                var tok;
+                var tail1129;
+                var L1125;
+                var goal_enders;
+                var BgL_sc_statesza2_30za2;
+                var BgL_sc_nbzd2nts_31zd2;
+                var BgL_sc_nbzd2confs_32zd2;
+                var nb_toks;
+                var goal_starters;
+                var sc_states_33;
+                var BgL_sc_nbzd2confs_34zd2;
+                var BgL_sc_nbzd2toks_35zd2;
+                var sc_toks_36;
+                var falseHead1128;
+                var sc_names_37;
+                var sc_steps_38;
+                var sc_predictors_39;
+                var sc_enders_40;
+                var sc_starters_41;
+                var sc_nts_42;
+                var lexer;
+                var sc_ind_43;
+                var make_states;
+                var BgL_sc_confzd2setzd2getza2_44za2;
+                var conf_set_merge_new_bang;
+                var conf_set_adjoin;
+                var BgL_sc_confzd2setzd2adjoinza2_45za2;
+                var BgL_sc_confzd2setzd2adjoinza2za2_46z00;
+                var conf_set_union;
+                var forw;
+                var is_parsed;
+                var deriv_trees;
+                var BgL_sc_derivzd2treesza2_47z70;
+                var nb_deriv_trees;
+                var BgL_sc_nbzd2derivzd2treesza2_48za2;
+                {
+                    sc_ind_43 = function(nt, sc_nts_49) {
+                        var i;
+                        {
+                            (i = ((sc_nts_49.length)-(1)));
+                            while (true) {
+                                if ((i>=(0)))
+                                    if ((sc_isEqual((sc_nts_49[i]), nt)))
+                                        return i;
+                                    else
+                                        (--i);
+                                else
+                                    return false;
+                            }
+                        }
+                    };
+                    make_states = function(BgL_sc_nbzd2toks_50zd2, BgL_sc_nbzd2confs_51zd2) {
+                        var v;
+                        var i;
+                        var sc_states_52;
+                        {
+                            (sc_states_52 = (sc_makeVector((BgL_sc_nbzd2toks_50zd2+(1)), false)));
+                            (i = BgL_sc_nbzd2toks_50zd2);
+                            while ((i>=(0))) {
+                                {
+                                    (v = (sc_makeVector((BgL_sc_nbzd2confs_51zd2+(1)), false)));
+                                    (v[(0)] = (-1));
+                                    (sc_states_52[i] = v);
+                                    (--i);
+                                }
+                            }
+                            return sc_states_52;
+                        }
+                    };
+                    BgL_sc_confzd2setzd2getza2_44za2 = function(state, BgL_sc_statezd2num_53zd2, sc_conf_54) {
+                        var conf_set;
+                        var BgL_sc_confzd2set_55zd2;
+                        return ((BgL_sc_confzd2set_55zd2 = (state[(sc_conf_54+(1))])), ((BgL_sc_confzd2set_55zd2!== false)?BgL_sc_confzd2set_55zd2:((conf_set = (sc_makeVector((BgL_sc_statezd2num_53zd2+(6)), false))), (conf_set[(1)] = (-3)), (conf_set[(2)] = (-1)), (conf_set[(3)] = (-1)), (conf_set[(4)] = (-1)), (state[(sc_conf_54+(1))] = conf_set), conf_set)));
+                    };
+                    conf_set_merge_new_bang = function(conf_set) {
+                        return ((conf_set[((conf_set[(1)])+(5))] = (conf_set[(4)])), (conf_set[(1)] = (conf_set[(3)])), (conf_set[(3)] = (-1)), (conf_set[(4)] = (-1)));
+                    };
+                    conf_set_adjoin = function(state, conf_set, sc_conf_56, i) {
+                        var tail;
+                        return ((tail = (conf_set[(3)])), (conf_set[(i+(5))] = (-1)), (conf_set[(tail+(5))] = i), (conf_set[(3)] = i), ((tail<(0))?((conf_set[(0)] = (state[(0)])), (state[(0)] = sc_conf_56)):undefined));
+                    };
+                    BgL_sc_confzd2setzd2adjoinza2_45za2 = function(sc_states_57, BgL_sc_statezd2num_58zd2, l, i) {
+                        var conf_set;
+                        var sc_conf_59;
+                        var l1;
+                        var state;
+                        {
+                            (state = (sc_states_57[BgL_sc_statezd2num_58zd2]));
+                            (l1 = l);
+                            while ((l1 instanceof sc_Pair)) {
+                                {
+                                    (sc_conf_59 = (l1.car));
+                                    (conf_set = (BgL_sc_confzd2setzd2getza2_44za2(state, BgL_sc_statezd2num_58zd2, sc_conf_59)));
+                                    if (((conf_set[(i+(5))])=== false))
+                                        {
+                                            (conf_set_adjoin(state, conf_set, sc_conf_59, i));
+                                            (l1 = (l1.cdr));
+                                        }
+                                    else
+                                        (l1 = (l1.cdr));
+                                }
+                            }
+                            return undefined;
+                        }
+                    };
+                    BgL_sc_confzd2setzd2adjoinza2za2_46z00 = function(sc_states_60, BgL_sc_statesza2_61za2, BgL_sc_statezd2num_62zd2, sc_conf_63, i) {
+                        var BgL_sc_confzd2setza2_64z70;
+                        var BgL_sc_stateza2_65za2;
+                        var conf_set;
+                        var state;
+                        return ((state = (sc_states_60[BgL_sc_statezd2num_62zd2])), ((((conf_set = (state[(sc_conf_63+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)?((BgL_sc_stateza2_65za2 = (BgL_sc_statesza2_61za2[BgL_sc_statezd2num_62zd2])), (BgL_sc_confzd2setza2_64z70 = (BgL_sc_confzd2setzd2getza2_44za2(BgL_sc_stateza2_65za2, BgL_sc_statezd2num_62zd2, sc_conf_63))), (((BgL_sc_confzd2setza2_64z70[(i+(5))])=== false)?(conf_set_adjoin(BgL_sc_stateza2_65za2, BgL_sc_confzd2setza2_64z70, sc_conf_63, i)):undefined), true):false));
+                    };
+                    conf_set_union = function(state, conf_set, sc_conf_66, other_set) {
+                        var i;
+                        {
+                            (i = (other_set[(2)]));
+                            while ((i>=(0))) {
+                                if (((conf_set[(i+(5))])=== false))
+                                    {
+                                        (conf_set_adjoin(state, conf_set, sc_conf_66, i));
+                                        (i = (other_set[(i+(5))]));
+                                    }
+                                else
+                                    (i = (other_set[(i+(5))]));
+                            }
+                            return undefined;
+                        }
+                    };
+                    forw = function(sc_states_67, BgL_sc_statezd2num_68zd2, sc_starters_69, sc_enders_70, sc_predictors_71, sc_steps_72, sc_nts_73) {
+                        var next_set;
+                        var next;
+                        var conf_set;
+                        var ender;
+                        var l;
+                        var starter_set;
+                        var starter;
+                        var sc_l_74;
+                        var sc_loop1_75;
+                        var head;
+                        var BgL_sc_confzd2set_76zd2;
+                        var BgL_sc_statezd2num_77zd2;
+                        var state;
+                        var sc_states_78;
+                        var preds;
+                        var BgL_sc_confzd2set_79zd2;
+                        var step;
+                        var sc_conf_80;
+                        var BgL_sc_nbzd2nts_81zd2;
+                        var sc_state_82;
+                        {
+                            (sc_state_82 = (sc_states_67[BgL_sc_statezd2num_68zd2]));
+                            (BgL_sc_nbzd2nts_81zd2 = (sc_nts_73.length));
+                            while (true) {
+                                {
+                                    (sc_conf_80 = (sc_state_82[(0)]));
+                                    if ((sc_conf_80>=(0)))
+                                        {
+                                            (step = (sc_steps_72[sc_conf_80]));
+                                            (BgL_sc_confzd2set_79zd2 = (sc_state_82[(sc_conf_80+(1))]));
+                                            (head = (BgL_sc_confzd2set_79zd2[(4)]));
+                                            (sc_state_82[(0)] = (BgL_sc_confzd2set_79zd2[(0)]));
+                                            (conf_set_merge_new_bang(BgL_sc_confzd2set_79zd2));
+                                            if ((step>=(0)))
+                                                {
+                                                    (sc_l_74 = (sc_starters_69[step]));
+                                                    while ((sc_l_74 instanceof sc_Pair)) {
+                                                        {
+                                                            (starter = (sc_l_74.car));
+                                                            (starter_set = (BgL_sc_confzd2setzd2getza2_44za2(sc_state_82, BgL_sc_statezd2num_68zd2, starter)));
+                                                            if (((starter_set[(BgL_sc_statezd2num_68zd2+(5))])=== false))
+                                                                {
+                                                                    (conf_set_adjoin(sc_state_82, starter_set, starter, BgL_sc_statezd2num_68zd2));
+                                                                    (sc_l_74 = (sc_l_74.cdr));
+                                                                }
+                                                            else
+                                                                (sc_l_74 = (sc_l_74.cdr));
+                                                        }
+                                                    }
+                                                    (l = (sc_enders_70[step]));
+                                                    while ((l instanceof sc_Pair)) {
+                                                        {
+                                                            (ender = (l.car));
+                                                            if ((((conf_set = (sc_state_82[(ender+(1))])), ((conf_set!== false)?(conf_set[(BgL_sc_statezd2num_68zd2+(5))]):false))!== false))
+                                                                {
+                                                                    (next = (sc_conf_80+(1)));
+                                                                    (next_set = (BgL_sc_confzd2setzd2getza2_44za2(sc_state_82, BgL_sc_statezd2num_68zd2, next)));
+                                                                    (conf_set_union(sc_state_82, next_set, next, BgL_sc_confzd2set_79zd2));
+                                                                    (l = (l.cdr));
+                                                                }
+                                                            else
+                                                                (l = (l.cdr));
+                                                        }
+                                                    }
+                                                }
+                                            else
+                                                {
+                                                    (preds = (sc_predictors_71[(step+BgL_sc_nbzd2nts_81zd2)]));
+                                                    (sc_states_78 = sc_states_67);
+                                                    (state = sc_state_82);
+                                                    (BgL_sc_statezd2num_77zd2 = BgL_sc_statezd2num_68zd2);
+                                                    (BgL_sc_confzd2set_76zd2 = BgL_sc_confzd2set_79zd2);
+                                                    sc_loop1_75 = function(l) {
+                                                        var sc_state_83;
+                                                        var BgL_sc_nextzd2set_84zd2;
+                                                        var sc_next_85;
+                                                        var pred_set;
+                                                        var i;
+                                                        var pred;
+                                                        if ((l instanceof sc_Pair))
+                                                            {
+                                                                (pred = (l.car));
+                                                                (i = head);
+                                                                while ((i>=(0))) {
+                                                                    {
+                                                                        (pred_set = ((sc_state_83 = (sc_states_78[i])), (sc_state_83[(pred+(1))])));
+                                                                        if ((pred_set!== false))
+                                                                            {
+                                                                                (sc_next_85 = (pred+(1)));
+                                                                                (BgL_sc_nextzd2set_84zd2 = (BgL_sc_confzd2setzd2getza2_44za2(state, BgL_sc_statezd2num_77zd2, sc_next_85)));
+                                                                                (conf_set_union(state, BgL_sc_nextzd2set_84zd2, sc_next_85, pred_set));
+                                                                            }
+                                                                        (i = (BgL_sc_confzd2set_76zd2[(i+(5))]));
+                                                                    }
+                                                                }
+                                                                return (sc_loop1_75((l.cdr)));
+                                                            }
+                                                        else
+                                                            return undefined;
+                                                    };
+                                                    (sc_loop1_75(preds));
+                                                }
+                                        }
+                                    else
+                                        return undefined;
+                                }
+                            }
+                        }
+                    };
+                    is_parsed = function(nt, i, j, sc_nts_86, sc_enders_87, sc_states_88) {
+                        var conf_set;
+                        var state;
+                        var sc_conf_89;
+                        var l;
+                        var BgL_sc_ntza2_90za2;
+                        {
+                            (BgL_sc_ntza2_90za2 = (sc_ind_43(nt, sc_nts_86)));
+                            if ((BgL_sc_ntza2_90za2!== false))
+                                {
+                                    (sc_nts_86.length);
+                                    (l = (sc_enders_87[BgL_sc_ntza2_90za2]));
+                                    while (true) {
+                                        if ((l instanceof sc_Pair))
+                                            {
+                                                (sc_conf_89 = (l.car));
+                                                if ((((state = (sc_states_88[j])), (conf_set = (state[(sc_conf_89+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
+                                                    return true;
+                                                else
+                                                    (l = (l.cdr));
+                                            }
+                                        else
+                                            return false;
+                                    }
+                                }
+                            else
+                                return false;
+                        }
+                    };
+                    deriv_trees = function(sc_conf_91, i, j, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2) {
+                        var sc_loop1_98;
+                        var prev;
+                        var name;
+                        return ((name = (sc_names_94[sc_conf_91])), ((name!== false)?((sc_conf_91<BgL_sc_nbzd2nts_97zd2)?(sc_list((sc_list(name, ((sc_toks_95[i]).car))))):(sc_list((sc_list(name))))):((prev = (sc_conf_91-(1))), (sc_loop1_98 = function(l1, l2) {
+                            var loop2;
+                            var ender_set;
+                            var state;
+                            var ender;
+                            var l1;
+                            var l2;
+                            while (true) {
+                                if ((l1 instanceof sc_Pair))
+                                    {
+                                        (ender = (l1.car));
+                                        (ender_set = ((state = (sc_states_96[j])), (state[(ender+(1))])));
+                                        if ((ender_set!== false))
+                                            {
+                                                loop2 = function(k, l2) {
+                                                    var loop3;
+                                                    var ender_trees;
+                                                    var prev_trees;
+                                                    var conf_set;
+                                                    var sc_state_99;
+                                                    var k;
+                                                    var l2;
+                                                    while (true) {
+                                                        if ((k>=(0)))
+                                                            if (((k>=i)&&(((sc_state_99 = (sc_states_96[k])), (conf_set = (sc_state_99[(prev+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)))
+                                                                {
+                                                                    (prev_trees = (deriv_trees(prev, i, k, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2)));
+                                                                    (ender_trees = (deriv_trees(ender, k, j, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2)));
+                                                                    loop3 = function(l3, l2) {
+                                                                        var l4;
+                                                                        var sc_l2_100;
+                                                                        var ender_tree;
+                                                                        if ((l3 instanceof sc_Pair))
+                                                                            {
+                                                                                (ender_tree = (sc_list((l3.car))));
+                                                                                (l4 = prev_trees);
+                                                                                (sc_l2_100 = l2);
+                                                                                while ((l4 instanceof sc_Pair)) {
+                                                                                    {
+                                                                                        (sc_l2_100 = (new sc_Pair((sc_append((l4.car), ender_tree)), sc_l2_100)));
+                                                                                        (l4 = (l4.cdr));
+                                                                                    }
+                                                                                }
+                                                                                return (loop3((l3.cdr), sc_l2_100));
+                                                                            }
+                                                                        else
+                                                                            return (loop2((ender_set[(k+(5))]), l2));
+                                                                    };
+                                                                    return (loop3(ender_trees, l2));
+                                                                }
+                                                            else
+                                                                (k = (ender_set[(k+(5))]));
+                                                        else
+                                                            return (sc_loop1_98((l1.cdr), l2));
+                                                    }
+                                                };
+                                                return (loop2((ender_set[(2)]), l2));
+                                            }
+                                        else
+                                            (l1 = (l1.cdr));
+                                    }
+                                else
+                                    return l2;
+                            }
+                        }), (sc_loop1_98((sc_enders_92[(sc_steps_93[prev])]), null)))));
+                    };
+                    BgL_sc_derivzd2treesza2_47z70 = function(nt, i, j, sc_nts_101, sc_enders_102, sc_steps_103, sc_names_104, sc_toks_105, sc_states_106) {
+                        var conf_set;
+                        var state;
+                        var sc_conf_107;
+                        var l;
+                        var trees;
+                        var BgL_sc_nbzd2nts_108zd2;
+                        var BgL_sc_ntza2_109za2;
+                        {
+                            (BgL_sc_ntza2_109za2 = (sc_ind_43(nt, sc_nts_101)));
+                            if ((BgL_sc_ntza2_109za2!== false))
+                                {
+                                    (BgL_sc_nbzd2nts_108zd2 = (sc_nts_101.length));
+                                    (l = (sc_enders_102[BgL_sc_ntza2_109za2]));
+                                    (trees = null);
+                                    while ((l instanceof sc_Pair)) {
+                                        {
+                                            (sc_conf_107 = (l.car));
+                                            if ((((state = (sc_states_106[j])), (conf_set = (state[(sc_conf_107+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
+                                                {
+                                                    (l = (l.cdr));
+                                                    (trees = (sc_append((deriv_trees(sc_conf_107, i, j, sc_enders_102, sc_steps_103, sc_names_104, sc_toks_105, sc_states_106, BgL_sc_nbzd2nts_108zd2)), trees)));
+                                                }
+                                            else
+                                                (l = (l.cdr));
+                                        }
+                                    }
+                                    return trees;
+                                }
+                            else
+                                return false;
+                        }
+                    };
+                    nb_deriv_trees = function(sc_conf_110, i, j, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2) {
+                        var sc_loop1_116;
+                        var tmp1124;
+                        var prev;
+                        return ((prev = (sc_conf_110-(1))), ((((tmp1124 = (sc_conf_110<BgL_sc_nbzd2nts_115zd2)), ((tmp1124!== false)?tmp1124:((sc_steps_112[prev])<(0))))!== false)?(1):((sc_loop1_116 = function(l, sc_n_118) {
+                            var nb_ender_trees;
+                            var nb_prev_trees;
+                            var conf_set;
+                            var state;
+                            var k;
+                            var n;
+                            var ender_set;
+                            var sc_state_117;
+                            var ender;
+                            var l;
+                            var sc_n_118;
+                            while (true) {
+                                if ((l instanceof sc_Pair))
+                                    {
+                                        (ender = (l.car));
+                                        (ender_set = ((sc_state_117 = (sc_states_114[j])), (sc_state_117[(ender+(1))])));
+                                        if ((ender_set!== false))
+                                            {
+                                                (k = (ender_set[(2)]));
+                                                (n = sc_n_118);
+                                                while ((k>=(0))) {
+                                                    if (((k>=i)&&(((state = (sc_states_114[k])), (conf_set = (state[(prev+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)))
+                                                        {
+                                                            (nb_prev_trees = (nb_deriv_trees(prev, i, k, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2)));
+                                                            (nb_ender_trees = (nb_deriv_trees(ender, k, j, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2)));
+                                                            (k = (ender_set[(k+(5))]));
+                                                            (n +=(nb_prev_trees*nb_ender_trees));
+                                                        }
+                                                    else
+                                                        (k = (ender_set[(k+(5))]));
+                                                }
+                                                return (sc_loop1_116((l.cdr), n));
+                                            }
+                                        else
+                                            (l = (l.cdr));
+                                    }
+                                else
+                                    return sc_n_118;
+                            }
+                        }), (sc_loop1_116((sc_enders_111[(sc_steps_112[prev])]), (0))))));
+                    };
+                    BgL_sc_nbzd2derivzd2treesza2_48za2 = function(nt, i, j, sc_nts_119, sc_enders_120, sc_steps_121, sc_toks_122, sc_states_123) {
+                        var conf_set;
+                        var state;
+                        var sc_conf_124;
+                        var l;
+                        var nb_trees;
+                        var BgL_sc_nbzd2nts_125zd2;
+                        var BgL_sc_ntza2_126za2;
+                        {
+                            (BgL_sc_ntza2_126za2 = (sc_ind_43(nt, sc_nts_119)));
+                            if ((BgL_sc_ntza2_126za2!== false))
+                                {
+                                    (BgL_sc_nbzd2nts_125zd2 = (sc_nts_119.length));
+                                    (l = (sc_enders_120[BgL_sc_ntza2_126za2]));
+                                    (nb_trees = (0));
+                                    while ((l instanceof sc_Pair)) {
+                                        {
+                                            (sc_conf_124 = (l.car));
+                                            if ((((state = (sc_states_123[j])), (conf_set = (state[(sc_conf_124+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
+                                                {
+                                                    (l = (l.cdr));
+                                                    (nb_trees = ((nb_deriv_trees(sc_conf_124, i, j, sc_enders_120, sc_steps_121, sc_toks_122, sc_states_123, BgL_sc_nbzd2nts_125zd2))+nb_trees));
+                                                }
+                                            else
+                                                (l = (l.cdr));
+                                        }
+                                    }
+                                    return nb_trees;
+                                }
+                            else
+                                return false;
+                        }
+                    };
+                    (lexer = (parser_descr[(0)]));
+                    (sc_nts_42 = (parser_descr[(1)]));
+                    (sc_starters_41 = (parser_descr[(2)]));
+                    (sc_enders_40 = (parser_descr[(3)]));
+                    (sc_predictors_39 = (parser_descr[(4)]));
+                    (sc_steps_38 = (parser_descr[(5)]));
+                    (sc_names_37 = (parser_descr[(6)]));
+                    (falseHead1128 = (new sc_Pair(null, null)));
+                    (L1125 = (lexer(input)));
+                    (tail1129 = falseHead1128);
+                    while (!(L1125 === null)) {
+                        {
+                            (tok = (L1125.car));
+                            (l1 = (tok.cdr));
+                            (l2 = null);
+                            while ((l1 instanceof sc_Pair)) {
+                                {
+                                    (sc_i_29 = (sc_ind_43((l1.car), sc_nts_42)));
+                                    if ((sc_i_29!== false))
+                                        {
+                                            (l1 = (l1.cdr));
+                                            (l2 = (new sc_Pair(sc_i_29, l2)));
+                                        }
+                                    else
+                                        (l1 = (l1.cdr));
+                                }
+                            }
+                            (sc_optrOpnd_22 = (new sc_Pair((tok.car), (sc_reverse(l2)))));
+                            (sc_optrOpnd_21 = (new sc_Pair(sc_optrOpnd_22, null)));
+                            (tail1129.cdr = sc_optrOpnd_21);
+                            (tail1129 = (tail1129.cdr));
+                            (L1125 = (L1125.cdr));
+                        }
+                    }
+                    (sc_optrOpnd_20 = (falseHead1128.cdr));
+                    (sc_toks_36 = (sc_list2vector(sc_optrOpnd_20)));
+                    (BgL_sc_nbzd2toks_35zd2 = (sc_toks_36.length));
+                    (BgL_sc_nbzd2confs_34zd2 = (sc_steps_38.length));
+                    (sc_states_33 = (make_states(BgL_sc_nbzd2toks_35zd2, BgL_sc_nbzd2confs_34zd2)));
+                    (goal_starters = (sc_starters_41[(0)]));
+                    (BgL_sc_confzd2setzd2adjoinza2_45za2(sc_states_33, (0), goal_starters, (0)));
+                    (forw(sc_states_33, (0), sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_nts_42));
+                    (sc_i_28 = (0));
+                    while ((sc_i_28<BgL_sc_nbzd2toks_35zd2)) {
+                        {
+                            (tok_nts = ((sc_toks_36[sc_i_28]).cdr));
+                            (BgL_sc_confzd2setzd2adjoinza2_45za2(sc_states_33, (sc_i_28+(1)), tok_nts, sc_i_28));
+                            (forw(sc_states_33, (sc_i_28+(1)), sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_nts_42));
+                            (++sc_i_28);
+                        }
+                    }
+                    (nb_toks = (sc_toks_36.length));
+                    (BgL_sc_nbzd2confs_32zd2 = (sc_steps_38.length));
+                    (BgL_sc_nbzd2nts_31zd2 = (sc_nts_42.length));
+                    (BgL_sc_statesza2_30za2 = (make_states(nb_toks, BgL_sc_nbzd2confs_32zd2)));
+                    (goal_enders = (sc_enders_40[(0)]));
+                    (l = goal_enders);
+                    while ((l instanceof sc_Pair)) {
+                        {
+                            (conf = (l.car));
+                            (BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_33, BgL_sc_statesza2_30za2, nb_toks, conf, (0)));
+                            (l = (l.cdr));
+                        }
+                    }
+                    (i = nb_toks);
+                    while ((i>=(0))) {
+                        {
+                            (states = sc_states_33);
+                            (BgL_sc_statesza2_27za2 = BgL_sc_statesza2_30za2);
+                            (state_num = i);
+                            (sc_enders_26 = sc_enders_40);
+                            (sc_steps_25 = sc_steps_38);
+                            (BgL_sc_nbzd2nts_24zd2 = BgL_sc_nbzd2nts_31zd2);
+                            (toks = sc_toks_36);
+                            (BgL_sc_stateza2_23za2 = (BgL_sc_statesza2_30za2[i]));
+                            loop1 = function() {
+                                var sc_loop1_127;
+                                var prev;
+                                var BgL_sc_statesza2_128za2;
+                                var sc_states_129;
+                                var j;
+                                var i;
+                                var sc_i_130;
+                                var head;
+                                var conf_set;
+                                var sc_conf_131;
+                                {
+                                    (sc_conf_131 = (BgL_sc_stateza2_23za2[(0)]));
+                                    if ((sc_conf_131>=(0)))
+                                        {
+                                            (conf_set = (BgL_sc_stateza2_23za2[(sc_conf_131+(1))]));
+                                            (head = (conf_set[(4)]));
+                                            (BgL_sc_stateza2_23za2[(0)] = (conf_set[(0)]));
+                                            (conf_set_merge_new_bang(conf_set));
+                                            (sc_i_130 = head);
+                                            while ((sc_i_130>=(0))) {
+                                                {
+                                                    (i = sc_i_130);
+                                                    (j = state_num);
+                                                    (sc_states_129 = states);
+                                                    (BgL_sc_statesza2_128za2 = BgL_sc_statesza2_27za2);
+                                                    (prev = (sc_conf_131-(1)));
+                                                    if (((sc_conf_131>=BgL_sc_nbzd2nts_24zd2)&&((sc_steps_25[prev])>=(0))))
+                                                        {
+                                                            sc_loop1_127 = function(l) {
+                                                                var k;
+                                                                var ender_set;
+                                                                var state;
+                                                                var ender;
+                                                                var l;
+                                                                while (true) {
+                                                                    if ((l instanceof sc_Pair))
+                                                                        {
+                                                                            (ender = (l.car));
+                                                                            (ender_set = ((state = (sc_states_129[j])), (state[(ender+(1))])));
+                                                                            if ((ender_set!== false))
+                                                                                {
+                                                                                    (k = (ender_set[(2)]));
+                                                                                    while ((k>=(0))) {
+                                                                                        {
+                                                                                            if ((k>=i))
+                                                                                                if (((BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_129, BgL_sc_statesza2_128za2, k, prev, i))!== false))
+                                                                                                    (BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_129, BgL_sc_statesza2_128za2, j, ender, k));
+                                                                                            (k = (ender_set[(k+(5))]));
+                                                                                        }
+                                                                                    }
+                                                                                    return (sc_loop1_127((l.cdr)));
+                                                                                }
+                                                                            else
+                                                                                (l = (l.cdr));
+                                                                        }
+                                                                    else
+                                                                        return undefined;
+                                                                }
+                                                            };
+                                                            (sc_loop1_127((sc_enders_26[(sc_steps_25[prev])])));
+                                                        }
+                                                    (sc_i_130 = (conf_set[(sc_i_130+(5))]));
+                                                }
+                                            }
+                                            return (loop1());
+                                        }
+                                    else
+                                        return undefined;
+                                }
+                            };
+                            (loop1());
+                            (--i);
+                        }
+                    }
+                    (optrOpnd = BgL_sc_statesza2_30za2);
+                    return [sc_nts_42, sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_names_37, sc_toks_36, optrOpnd, is_parsed, BgL_sc_derivzd2treesza2_47z70, BgL_sc_nbzd2derivzd2treesza2_48za2];
+                }
+            };
+        }
+    };
+    BgL_parsezd2ze3parsedzf3zc2 = function(parse, nt, i, j) {
+        var is_parsed;
+        var states;
+        var enders;
+        var nts;
+        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (states = (parse[(7)])), (is_parsed = (parse[(8)])), (is_parsed(nt, i, j, nts, enders, states)));
+    };
+    BgL_parsezd2ze3treesz31 = function(parse, nt, i, j) {
+        var BgL_sc_derivzd2treesza2_132z70;
+        var states;
+        var toks;
+        var names;
+        var steps;
+        var enders;
+        var nts;
+        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (steps = (parse[(4)])), (names = (parse[(5)])), (toks = (parse[(6)])), (states = (parse[(7)])), (BgL_sc_derivzd2treesza2_132z70 = (parse[(9)])), (BgL_sc_derivzd2treesza2_132z70(nt, i, j, nts, enders, steps, names, toks, states)));
+    };
+    BgL_parsezd2ze3nbzd2treesze3 = function(parse, nt, i, j) {
+        var BgL_sc_nbzd2derivzd2treesza2_133za2;
+        var states;
+        var toks;
+        var steps;
+        var enders;
+        var nts;
+        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (steps = (parse[(4)])), (toks = (parse[(6)])), (states = (parse[(7)])), (BgL_sc_nbzd2derivzd2treesza2_133za2 = (parse[(10)])), (BgL_sc_nbzd2derivzd2treesza2_133za2(nt, i, j, nts, enders, steps, toks, states)));
+    };
+    test = function(k) {
+        var x;
+        var p;
+        return ((p = (BgL_makezd2parserzd2(const_earley, function(l) {
+            var sc_x_134;
+            var tail1134;
+            var L1130;
+            var falseHead1133;
+            {
+                (falseHead1133 = (new sc_Pair(null, null)));
+                (tail1134 = falseHead1133);
+                (L1130 = l);
+                while (!(L1130 === null)) {
+                    {
+                        (tail1134.cdr = (new sc_Pair(((sc_x_134 = (L1130.car)), (sc_list(sc_x_134, sc_x_134))), null)));
+                        (tail1134 = (tail1134.cdr));
+                        (L1130 = (L1130.cdr));
+                    }
+                }
+                return (falseHead1133.cdr);
+            }
+        }))), (x = (p((sc_vector2list((sc_makeVector(k, "\u1E9Ca"))))))), (sc_length((BgL_parsezd2ze3treesz31(x, "\u1E9Cs", (0), k)))));
+    };
+    BgL_earleyzd2benchmarkzd2 = function() {
+        var args = null;
+        for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) {
+            args = sc_cons(arguments[sc_tmp], args);
+        }
+        var k;
+        return ((k = ((args === null)?(7):(args.car))), (BgL_runzd2benchmarkzd2("earley", (1), function() {
+            return (test(k));
+        }, function(result) {
+            return ((sc_display(result)), (sc_newline()), result == 132);
+        })));
+    };
+}
+
+
+/************* END OF GENERATED CODE *************/
+// Invoke this function to run a benchmark.
+// The first argument is a string identifying the benchmark.
+// The second argument is the number of times to run the benchmark.
+// The third argument is a function that runs the benchmark.
+// The fourth argument is a unary function that warns if the result
+// returned by the benchmark is incorrect.
+//
+// Example:
+// RunBenchmark("new Array()",
+//              1,
+//              function () { new Array(1000000); }
+//              function (v) {
+//                return (v instanceof Array) && (v.length == 1000000);
+//              });
+
+SC_DEFAULT_OUT = new sc_GenericOutputPort(function(s) {});
+SC_ERROR_OUT = SC_DEFAULT_OUT;
+
+function RunBenchmark(name, count, run, warn) {
+  for (var n = 0; n < count; ++n) {
+    result = run();
+    if (!warn(result)) {
+      throw new Error("Earley or Boyer did incorrect number of rewrites");
+    }
+  }
+}
+
+var BgL_runzd2benchmarkzd2 = RunBenchmark;
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/gbemu.js b/suite/cts/deviceTests/browserbench/assets/octane/gbemu.js
new file mode 100644
index 0000000..5e98592
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/gbemu.js
@@ -0,0 +1,11108 @@
+// Portions copyright 2012 Google, Inc
+
+// Copyright (C) 2010 - 2012 Grant Galitz
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+// The full license is available at http://www.gnu.org/licenses/gpl.html
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+
+// The code has been adapted for use as a benchmark by Google.
+
+var GameboyBenchmark = new BenchmarkSuite('Gameboy', 18000000,
+                                          [new Benchmark('Gameboy',
+                                                         runGameboy,
+                                                         setupGameboy,
+                                                         tearDownGameboy,
+                                                         4)]);
+
+var decoded_gameboy_rom = null;
+
+function setupGameboy() {
+
+  // Check if all the types required by the code are supported.
+  // If not, throw exception and quit.
+  if (!(typeof Uint8Array != "undefined" &&
+      typeof Int8Array != "undefined" &&
+      typeof Float32Array != "undefined" &&
+      typeof Int32Array != "undefined") ) {
+    throw "TypedArrayUnsupported";
+  }
+  decoded_gameboy_rom = base64_decode(gameboy_rom);
+  rom = null;
+}
+
+function runGameboy() {
+  start(new GameBoyCanvas(), decoded_gameboy_rom);
+
+  gameboy.instructions = 0;
+  gameboy.totalInstructions = 250000;
+
+  while (gameboy.instructions <= gameboy.totalInstructions) {
+    gameboy.run();
+    GameBoyAudioNode.run();
+  }
+
+  resetGlobalVariables();
+}
+
+function tearDownGameboy() {
+  decoded_gameboy_rom = null;
+  expectedGameboyStateStr = null;
+}
+
+var expectedGameboyStateStr =
+  '{"registerA":160,"registerB":255,"registerC":255,"registerE":11,' +
+  '"registersHL":51600,"programCounter":24309,"stackPointer":49706,' +
+  '"sumROM":10171578,"sumMemory":3435856,"sumMBCRam":234598,"sumVRam":0}';
+
+// Start of browser emulation.
+
+GameBoyWindow = { };
+
+function GameBoyContext() {
+  this.createBuffer = function() {
+    return new Buffer();
+  }
+  this.createImageData = function (w, h) {
+    var result = {};
+    result.data = new Uint8Array(w * h);
+    return result;
+  }
+  this.putImageData = function (buffer, x, y) {
+    var sum = 0;
+    for (var i = 0; i < buffer.data.length; i++) {
+      sum += i * buffer.data[i];
+      sum = sum % 1000;
+    }
+  }
+  this.drawImage = function () { }
+};
+
+function GameBoyCanvas() {
+  this.getContext = function() {
+    return new GameBoyContext();
+  }
+  this.width = 160;
+  this.height = 144;
+  this.style = { visibility: "visibile" };
+}
+
+function cout(message, colorIndex) {
+}
+
+function clear_terminal() {
+}
+
+var GameBoyAudioNode = {
+  bufferSize : 0,
+  onaudioprocess : null ,
+  connect : function () {},
+  run: function() {
+    var event = {outputBuffer : this.outputBuffer};
+    this.onaudioprocess(event);
+  }
+};
+
+function GameBoyAudioContext () {
+  this.createBufferSource = function() {
+    return { noteOn : function () {}, connect : function() {}};
+  }
+  this.sampleRate = 48000;
+  this.destination = {}
+  this.createBuffer = function (channels, len, sampleRate) {
+    return { gain : 1,
+             numberOfChannels : 1,
+             length : 1,
+             duration : 0.000020833333110203966,
+             sampleRate : 48000}
+  }
+  this.createJavaScriptNode = function (bufferSize, inputChannels, outputChannels) {
+    GameBoyAudioNode.bufferSize = bufferSize;
+    GameBoyAudioNode.outputBuffer = {
+        getChannelData : function (i) {return this.channelData[i];},
+        channelData    : []
+    };
+    for (var i = 0; i < outputChannels; i++) {
+      GameBoyAudioNode.outputBuffer.channelData[i] = new Float32Array(bufferSize);
+    }
+    return GameBoyAudioNode;
+  }
+}
+
+var mock_date_time_counter = 0;
+
+function new_Date() {
+  return {
+    getTime: function() {
+      mock_date_time_counter += 16;
+      return mock_date_time_counter;
+    }
+  };
+}
+
+// End of browser emulation.
+
+// Start of helper functions.
+
+function checkFinalState() {
+  function sum(a) {
+    var result = 0;
+    for (var i = 0; i < a.length; i++) {
+      result += a[i];
+    }
+    return result;
+  }
+  var state = {
+    registerA: gameboy.registerA,
+    registerB: gameboy.registerB,
+    registerC: gameboy.registerC,
+    registerE: gameboy.registerE,
+    registerF: gameboy.registerF,
+    registersHL: gameboy.registersHL,
+    programCounter: gameboy.programCounter,
+    stackPointer: gameboy.stackPointer,
+    sumROM : sum(gameboy.fromTypedArray(gameboy.ROM)),
+    sumMemory: sum(gameboy.fromTypedArray(gameboy.memory)),
+    sumMBCRam: sum(gameboy.fromTypedArray(gameboy.MBCRam)),
+    sumVRam: sum(gameboy.fromTypedArray(gameboy.VRam))
+  }
+  var stateStr = JSON.stringify(state);
+  if (typeof expectedGameboyStateStr != "undefined") {
+    if (stateStr != expectedGameboyStateStr) {
+      alert("Incorrect final state of processor:\n" +
+            " actual   " + stateStr + "\n" +
+            " expected " + expectedGameboyStateStr);
+    }
+  } else {
+    alert(stateStr);
+  }
+}
+
+
+function resetGlobalVariables () {
+  //Audio API Event Handler:
+  audioContextHandle = null;
+  audioNode = null;
+  audioSource = null;
+  launchedContext = false;
+  audioContextSampleBuffer = [];
+  resampled = [];
+  webAudioMinBufferSize = 15000;
+  webAudioMaxBufferSize = 25000;
+  webAudioActualSampleRate = 44100;
+  XAudioJSSampleRate = 0;
+  webAudioMono = false;
+  XAudioJSVolume = 1;
+  resampleControl = null;
+  audioBufferSize = 0;
+  resampleBufferStart = 0;
+  resampleBufferEnd = 0;
+  resampleBufferSize = 2;
+
+  gameboy = null;           //GameBoyCore object.
+  gbRunInterval = null;       //GameBoyCore Timer
+}
+
+
+// End of helper functions.
+
+// Original code from Grant Galitz follows.
+// Modifications by Google are marked in comments.
+
+// Start of js/other/base64.js file.
+
+var toBase64 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+  "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
+  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+" , "/", "="];
+var fromBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+function base64(data) {
+  try {
+    // The following line was modified for benchmarking:
+    var base64 = GameBoyWindow.btoa(data);  //Use this native function when it's available, as it's a magnitude faster than the non-native code below.
+  }
+  catch (error) {
+    //Defaulting to non-native base64 encoding...
+    var base64 = "";
+    var dataLength = data.length;
+    if (dataLength > 0) {
+      var bytes = [0, 0, 0];
+      var index = 0;
+      var remainder = dataLength % 3;
+      while (data.length % 3 > 0) {
+        //Make sure we don't do fuzzy math in the next loop...
+        data[data.length] = " ";
+      }
+      while (index < dataLength) {
+        //Keep this loop small for speed.
+        bytes = [data.charCodeAt(index++) & 0xFF, data.charCodeAt(index++) & 0xFF, data.charCodeAt(index++) & 0xFF];
+        base64 += toBase64[bytes[0] >> 2] + toBase64[((bytes[0] & 0x3) << 4) | (bytes[1] >> 4)] + toBase64[((bytes[1] & 0xF) << 2) | (bytes[2] >> 6)] + toBase64[bytes[2] & 0x3F];
+      }
+      if (remainder > 0) {
+        //Fill in the padding and recalulate the trailing six-bit group...
+        base64[base64.length - 1] = "=";
+        if (remainder == 2) {
+          base64[base64.length - 2] = "=";
+          base64[base64.length - 3] = toBase64[(bytes[0] & 0x3) << 4];
+        }
+        else {
+          base64[base64.length - 2] = toBase64[(bytes[1] & 0xF) << 2];
+        }
+      }
+    }
+  }
+  return base64;
+}
+function base64_decode(data) {
+  try {
+    // The following line was modified for benchmarking:
+    var decode64 = GameBoyWindow.atob(data);  //Use this native function when it's available, as it's a magnitude faster than the non-native code below.
+  }
+  catch (error) {
+    //Defaulting to non-native base64 decoding...
+    var decode64 = "";
+    var dataLength = data.length;
+    if (dataLength > 3 && dataLength % 4 == 0) {
+      var sixbits = [0, 0, 0, 0];  //Declare this out of the loop, to speed up the ops.
+      var index = 0;
+      while (index < dataLength) {
+        //Keep this loop small for speed.
+        sixbits = [fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++))];
+        decode64 += String.fromCharCode((sixbits[0] << 2) | (sixbits[1] >> 4)) + String.fromCharCode(((sixbits[1] & 0x0F) << 4) | (sixbits[2] >> 2)) + String.fromCharCode(((sixbits[2] & 0x03) << 6) | sixbits[3]);
+      }
+      //Check for the '=' character after the loop, so we don't hose it up.
+      if (sixbits[3] >= 0x40) {
+        decode64.length -= 1;
+        if (sixbits[2] >= 0x40) {
+          decode64.length -= 1;
+        }
+      }
+    }
+  }
+  return decode64;
+}
+function to_little_endian_dword(str) {
+  return to_little_endian_word(str) + String.fromCharCode((str >> 16) & 0xFF, (str >> 24) & 0xFF);
+}
+function to_little_endian_word(str) {
+  return to_byte(str) + String.fromCharCode((str >> 8) & 0xFF);
+}
+function to_byte(str) {
+  return String.fromCharCode(str & 0xFF);
+}
+function arrayToBase64(arrayIn) {
+  var binString = "";
+  var length = arrayIn.length;
+  for (var index = 0; index < length; ++index) {
+    if (typeof arrayIn[index] == "number") {
+      binString += String.fromCharCode(arrayIn[index]);
+    }
+  }
+  return base64(binString);
+}
+function base64ToArray(b64String) {
+  var binString = base64_decode(b64String);
+  var outArray = [];
+  var length = binString.length;
+  for (var index = 0; index < length;) {
+    outArray.push(binString.charCodeAt(index++) & 0xFF);
+  }
+  return outArray;
+}
+
+// End of js/other/base64.js file.
+
+// Start of js/other/resampler.js file.
+
+//JavaScript Audio Resampler (c) 2011 - Grant Galitz
+function Resampler(fromSampleRate, toSampleRate, channels, outputBufferSize, noReturn) {
+  this.fromSampleRate = fromSampleRate;
+  this.toSampleRate = toSampleRate;
+  this.channels = channels | 0;
+  this.outputBufferSize = outputBufferSize;
+  this.noReturn = !!noReturn;
+  this.initialize();
+}
+Resampler.prototype.initialize = function () {
+  //Perform some checks:
+  if (this.fromSampleRate > 0 && this.toSampleRate > 0 && this.channels > 0) {
+    if (this.fromSampleRate == this.toSampleRate) {
+      //Setup a resampler bypass:
+      this.resampler = this.bypassResampler;    //Resampler just returns what was passed through.
+      this.ratioWeight = 1;
+    }
+    else {
+      //Setup the interpolation resampler:
+      this.compileInterpolationFunction();
+      this.resampler = this.interpolate;      //Resampler is a custom quality interpolation algorithm.
+      this.ratioWeight = this.fromSampleRate / this.toSampleRate;
+      this.tailExists = false;
+      this.lastWeight = 0;
+      this.initializeBuffers();
+    }
+  }
+  else {
+    throw(new Error("Invalid settings specified for the resampler."));
+  }
+}
+Resampler.prototype.compileInterpolationFunction = function () {
+  var toCompile = "var bufferLength = Math.min(buffer.length, this.outputBufferSize);\
+  if ((bufferLength % " + this.channels + ") == 0) {\
+    if (bufferLength > 0) {\
+      var ratioWeight = this.ratioWeight;\
+      var weight = 0;";
+  for (var channel = 0; channel < this.channels; ++channel) {
+    toCompile += "var output" + channel + " = 0;"
+  }
+  toCompile += "var actualPosition = 0;\
+      var amountToNext = 0;\
+      var alreadyProcessedTail = !this.tailExists;\
+      this.tailExists = false;\
+      var outputBuffer = this.outputBuffer;\
+      var outputOffset = 0;\
+      var currentPosition = 0;\
+      do {\
+        if (alreadyProcessedTail) {\
+          weight = ratioWeight;";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "output" + channel + " = 0;"
+  }
+  toCompile += "}\
+        else {\
+          weight = this.lastWeight;";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "output" + channel + " = this.lastOutput[" + channel + "];"
+  }
+  toCompile += "alreadyProcessedTail = true;\
+        }\
+        while (weight > 0 && actualPosition < bufferLength) {\
+          amountToNext = 1 + actualPosition - currentPosition;\
+          if (weight >= amountToNext) {";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "output" + channel + " += buffer[actualPosition++] * amountToNext;"
+  }
+  toCompile += "currentPosition = actualPosition;\
+            weight -= amountToNext;\
+          }\
+          else {";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "output" + channel + " += buffer[actualPosition" + ((channel > 0) ? (" + " + channel) : "") + "] * weight;"
+  }
+  toCompile += "currentPosition += weight;\
+            weight = 0;\
+            break;\
+          }\
+        }\
+        if (weight == 0) {";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "outputBuffer[outputOffset++] = output" + channel + " / ratioWeight;"
+  }
+  toCompile += "}\
+        else {\
+          this.lastWeight = weight;";
+  for (channel = 0; channel < this.channels; ++channel) {
+    toCompile += "this.lastOutput[" + channel + "] = output" + channel + ";"
+  }
+  toCompile += "this.tailExists = true;\
+          break;\
+        }\
+      } while (actualPosition < bufferLength);\
+      return this.bufferSlice(outputOffset);\
+    }\
+    else {\
+      return (this.noReturn) ? 0 : [];\
+    }\
+  }\
+  else {\
+    throw(new Error(\"Buffer was of incorrect sample length.\"));\
+  }";
+  this.interpolate = Function("buffer", toCompile);
+}
+Resampler.prototype.bypassResampler = function (buffer) {
+  if (this.noReturn) {
+    //Set the buffer passed as our own, as we don't need to resample it:
+    this.outputBuffer = buffer;
+    return buffer.length;
+  }
+  else {
+    //Just return the buffer passsed:
+    return buffer;
+  }
+}
+Resampler.prototype.bufferSlice = function (sliceAmount) {
+  if (this.noReturn) {
+    //If we're going to access the properties directly from this object:
+    return sliceAmount;
+  }
+  else {
+    //Typed array and normal array buffer section referencing:
+    try {
+      return this.outputBuffer.subarray(0, sliceAmount);
+    }
+    catch (error) {
+      try {
+        //Regular array pass:
+        this.outputBuffer.length = sliceAmount;
+        return this.outputBuffer;
+      }
+      catch (error) {
+        //Nightly Firefox 4 used to have the subarray function named as slice:
+        return this.outputBuffer.slice(0, sliceAmount);
+      }
+    }
+  }
+}
+Resampler.prototype.initializeBuffers = function () {
+  //Initialize the internal buffer:
+  try {
+    this.outputBuffer = new Float32Array(this.outputBufferSize);
+    this.lastOutput = new Float32Array(this.channels);
+  }
+  catch (error) {
+    this.outputBuffer = [];
+    this.lastOutput = [];
+  }
+}
+
+// End of js/other/resampler.js file.
+
+// Start of js/other/XAudioServer.js file.
+
+/*Initialize here first:
+  Example:
+    Stereo audio with a sample rate of 70 khz, a minimum buffer of 15000 samples total, a maximum buffer of 25000 samples total and a starting volume level of 1.
+      var parentObj = this;
+      this.audioHandle = new XAudioServer(2, 70000, 15000, 25000, function (sampleCount) {
+        return parentObj.audioUnderRun(sampleCount);
+      }, 1);
+
+  The callback is passed the number of samples requested, while it can return any number of samples it wants back.
+*/
+function XAudioServer(channels, sampleRate, minBufferSize, maxBufferSize, underRunCallback, volume) {
+  this.audioChannels = (channels == 2) ? 2 : 1;
+  webAudioMono = (this.audioChannels == 1);
+  XAudioJSSampleRate = (sampleRate > 0 && sampleRate <= 0xFFFFFF) ? sampleRate : 44100;
+  webAudioMinBufferSize = (minBufferSize >= (samplesPerCallback << 1) && minBufferSize < maxBufferSize) ? (minBufferSize & ((webAudioMono) ? 0xFFFFFFFF : 0xFFFFFFFE)) : (samplesPerCallback << 1);
+  webAudioMaxBufferSize = (Math.floor(maxBufferSize) > webAudioMinBufferSize + this.audioChannels) ? (maxBufferSize & ((webAudioMono) ? 0xFFFFFFFF : 0xFFFFFFFE)) : (minBufferSize << 1);
+  this.underRunCallback = (typeof underRunCallback == "function") ? underRunCallback : function () {};
+  XAudioJSVolume = (volume >= 0 && volume <= 1) ? volume : 1;
+  this.audioType = -1;
+  this.mozAudioTail = [];
+  this.audioHandleMoz = null;
+  this.audioHandleFlash = null;
+  this.flashInitialized = false;
+  this.mozAudioFound = false;
+  this.initializeAudio();
+}
+XAudioServer.prototype.MOZWriteAudio = function (buffer) {
+  //mozAudio:
+  this.MOZWriteAudioNoCallback(buffer);
+  this.MOZExecuteCallback();
+}
+XAudioServer.prototype.MOZWriteAudioNoCallback = function (buffer) {
+  //mozAudio:
+  this.writeMozAudio(buffer);
+}
+XAudioServer.prototype.callbackBasedWriteAudio = function (buffer) {
+  //Callback-centered audio APIs:
+  this.callbackBasedWriteAudioNoCallback(buffer);
+  this.callbackBasedExecuteCallback();
+}
+XAudioServer.prototype.callbackBasedWriteAudioNoCallback = function (buffer) {
+  //Callback-centered audio APIs:
+  var length = buffer.length;
+  for (var bufferCounter = 0; bufferCounter < length && audioBufferSize < webAudioMaxBufferSize;) {
+    audioContextSampleBuffer[audioBufferSize++] = buffer[bufferCounter++];
+  }
+}
+/*Pass your samples into here!
+Pack your samples as a one-dimenional array
+With the channel samplea packed uniformly.
+examples:
+    mono - [left, left, left, left]
+    stereo - [left, right, left, right, left, right, left, right]
+*/
+XAudioServer.prototype.writeAudio = function (buffer) {
+  if (this.audioType == 0) {
+    this.MOZWriteAudio(buffer);
+  }
+  else if (this.audioType == 1) {
+    this.callbackBasedWriteAudio(buffer);
+  }
+  else if (this.audioType == 2) {
+    if (this.checkFlashInit() || launchedContext) {
+      this.callbackBasedWriteAudio(buffer);
+    }
+    else if (this.mozAudioFound) {
+      this.MOZWriteAudio(buffer);
+    }
+  }
+}
+/*Pass your samples into here if you don't want automatic callback calling:
+Pack your samples as a one-dimenional array
+With the channel samplea packed uniformly.
+examples:
+    mono - [left, left, left, left]
+    stereo - [left, right, left, right, left, right, left, right]
+Useful in preventing infinite recursion issues with calling writeAudio inside your callback.
+*/
+XAudioServer.prototype.writeAudioNoCallback = function (buffer) {
+  if (this.audioType == 0) {
+    this.MOZWriteAudioNoCallback(buffer);
+  }
+  else if (this.audioType == 1) {
+    this.callbackBasedWriteAudioNoCallback(buffer);
+  }
+  else if (this.audioType == 2) {
+    if (this.checkFlashInit() || launchedContext) {
+      this.callbackBasedWriteAudioNoCallback(buffer);
+    }
+    else if (this.mozAudioFound) {
+      this.MOZWriteAudioNoCallback(buffer);
+    }
+  }
+}
+//Developer can use this to see how many samples to write (example: minimum buffer allotment minus remaining samples left returned from this function to make sure maximum buffering is done...)
+//If -1 is returned, then that means metric could not be done.
+XAudioServer.prototype.remainingBuffer = function () {
+  if (this.audioType == 0) {
+    //mozAudio:
+    return this.samplesAlreadyWritten - this.audioHandleMoz.mozCurrentSampleOffset();
+  }
+  else if (this.audioType == 1) {
+    //WebKit Audio:
+    return (((resampledSamplesLeft() * resampleControl.ratioWeight) >> (this.audioChannels - 1)) << (this.audioChannels - 1)) + audioBufferSize;
+  }
+  else if (this.audioType == 2) {
+    if (this.checkFlashInit() || launchedContext) {
+      //Webkit Audio / Flash Plugin Audio:
+      return (((resampledSamplesLeft() * resampleControl.ratioWeight) >> (this.audioChannels - 1)) << (this.audioChannels - 1)) + audioBufferSize;
+    }
+    else if (this.mozAudioFound) {
+      //mozAudio:
+      return this.samplesAlreadyWritten - this.audioHandleMoz.mozCurrentSampleOffset();
+    }
+  }
+  //Default return:
+  return 0;
+}
+XAudioServer.prototype.MOZExecuteCallback = function () {
+  //mozAudio:
+  var samplesRequested = webAudioMinBufferSize - this.remainingBuffer();
+  if (samplesRequested > 0) {
+    this.writeMozAudio(this.underRunCallback(samplesRequested));
+  }
+}
+XAudioServer.prototype.callbackBasedExecuteCallback = function () {
+  //WebKit /Flash Audio:
+  var samplesRequested = webAudioMinBufferSize - this.remainingBuffer();
+  if (samplesRequested > 0) {
+    this.callbackBasedWriteAudioNoCallback(this.underRunCallback(samplesRequested));
+  }
+}
+//If you just want your callback called for any possible refill (Execution of callback is still conditional):
+XAudioServer.prototype.executeCallback = function () {
+  if (this.audioType == 0) {
+    this.MOZExecuteCallback();
+  }
+  else if (this.audioType == 1) {
+    this.callbackBasedExecuteCallback();
+  }
+  else if (this.audioType == 2) {
+    if (this.checkFlashInit() || launchedContext) {
+      this.callbackBasedExecuteCallback();
+    }
+    else if (this.mozAudioFound) {
+      this.MOZExecuteCallback();
+    }
+  }
+}
+//DO NOT CALL THIS, the lib calls this internally!
+XAudioServer.prototype.initializeAudio = function () {
+  try {
+    throw (new Error("Select initializeWebAudio case"));  // Line added for benchmarking.
+    this.preInitializeMozAudio();
+    if (navigator.platform == "Linux i686") {
+      //Block out mozaudio usage for Linux Firefox due to moz bugs:
+      throw(new Error(""));
+    }
+    this.initializeMozAudio();
+  }
+  catch (error) {
+    try {
+      this.initializeWebAudio();
+    }
+    catch (error) {
+      try {
+        this.initializeFlashAudio();
+      }
+      catch (error) {
+        throw(new Error("Browser does not support real time audio output."));
+      }
+    }
+  }
+}
+XAudioServer.prototype.preInitializeMozAudio = function () {
+  //mozAudio - Synchronous Audio API
+  this.audioHandleMoz = new Audio();
+  this.audioHandleMoz.mozSetup(this.audioChannels, XAudioJSSampleRate);
+  this.samplesAlreadyWritten = 0;
+  var emptySampleFrame = (this.audioChannels == 2) ? [0, 0] : [0];
+  var prebufferAmount = 0;
+  if (navigator.platform != "MacIntel" && navigator.platform != "MacPPC") {  //Mac OS X doesn't experience this moz-bug!
+    while (this.audioHandleMoz.mozCurrentSampleOffset() == 0) {
+      //Mozilla Audio Bugginess Workaround (Firefox freaks out if we don't give it a prebuffer under certain OSes):
+      prebufferAmount += this.audioHandleMoz.mozWriteAudio(emptySampleFrame);
+    }
+    var samplesToDoubleBuffer = prebufferAmount / this.audioChannels;
+    //Double the prebuffering for windows:
+    for (var index = 0; index < samplesToDoubleBuffer; index++) {
+      this.samplesAlreadyWritten += this.audioHandleMoz.mozWriteAudio(emptySampleFrame);
+    }
+  }
+  this.samplesAlreadyWritten += prebufferAmount;
+  webAudioMinBufferSize += this.samplesAlreadyWritten;
+  this.mozAudioFound = true;
+}
+XAudioServer.prototype.initializeMozAudio = function () {
+  //Fill in our own buffering up to the minimum specified:
+  this.writeMozAudio(getFloat32(webAudioMinBufferSize));
+  this.audioType = 0;
+}
+XAudioServer.prototype.initializeWebAudio = function () {
+  if (launchedContext) {
+    resetCallbackAPIAudioBuffer(webAudioActualSampleRate, samplesPerCallback);
+    this.audioType = 1;
+  }
+  else {
+    throw(new Error(""));
+  }
+}
+XAudioServer.prototype.initializeFlashAudio = function () {
+  var existingFlashload = document.getElementById("XAudioJS");
+  if (existingFlashload == null) {
+    var thisObj = this;
+    var mainContainerNode = document.createElement("div");
+    mainContainerNode.setAttribute("style", "position: fixed; bottom: 0px; right: 0px; margin: 0px; padding: 0px; border: none; width: 8px; height: 8px; overflow: hidden; z-index: -1000; ");
+    var containerNode = document.createElement("div");
+    containerNode.setAttribute("style", "position: static; border: none; width: 0px; height: 0px; visibility: hidden; margin: 8px; padding: 0px;");
+    containerNode.setAttribute("id", "XAudioJS");
+    mainContainerNode.appendChild(containerNode);
+    document.getElementsByTagName("body")[0].appendChild(mainContainerNode);
+    swfobject.embedSWF(
+      "XAudioJS.swf",
+      "XAudioJS",
+      "8",
+      "8",
+      "9.0.0",
+      "",
+      {},
+      {"allowscriptaccess":"always"},
+      {"style":"position: static; visibility: hidden; margin: 8px; padding: 0px; border: none"},
+      function (event) {
+        if (event.success) {
+          thisObj.audioHandleFlash = event.ref;
+        }
+        else {
+          thisObj.audioType = 1;
+        }
+      }
+    );
+  }
+  else {
+    this.audioHandleFlash = existingFlashload;
+  }
+  this.audioType = 2;
+}
+XAudioServer.prototype.changeVolume = function (newVolume) {
+  if (newVolume >= 0 && newVolume <= 1) {
+    XAudioJSVolume = newVolume;
+    if (this.checkFlashInit()) {
+      this.audioHandleFlash.changeVolume(XAudioJSVolume);
+    }
+    if (this.mozAudioFound) {
+      this.audioHandleMoz.volume = XAudioJSVolume;
+    }
+  }
+}
+//Moz Audio Buffer Writing Handler:
+XAudioServer.prototype.writeMozAudio = function (buffer) {
+  var length = this.mozAudioTail.length;
+  if (length > 0) {
+    var samplesAccepted = this.audioHandleMoz.mozWriteAudio(this.mozAudioTail);
+    this.samplesAlreadyWritten += samplesAccepted;
+    this.mozAudioTail.splice(0, samplesAccepted);
+  }
+  length = Math.min(buffer.length, webAudioMaxBufferSize - this.samplesAlreadyWritten + this.audioHandleMoz.mozCurrentSampleOffset());
+  var samplesAccepted = this.audioHandleMoz.mozWriteAudio(buffer);
+  this.samplesAlreadyWritten += samplesAccepted;
+  for (var index = 0; length > samplesAccepted; --length) {
+    //Moz Audio wants us saving the tail:
+    this.mozAudioTail.push(buffer[index++]);
+  }
+}
+//Checks to see if the NPAPI Adobe Flash bridge is ready yet:
+XAudioServer.prototype.checkFlashInit = function () {
+  if (!this.flashInitialized && this.audioHandleFlash && this.audioHandleFlash.initialize) {
+    this.flashInitialized = true;
+    this.audioHandleFlash.initialize(this.audioChannels, XAudioJSVolume);
+    resetCallbackAPIAudioBuffer(44100, samplesPerCallback);
+  }
+  return this.flashInitialized;
+}
+/////////END LIB
+function getFloat32(size) {
+  try {
+    return new Float32Array(size);
+  }
+  catch (error) {
+    return new Array(size);
+  }
+}
+function getFloat32Flat(size) {
+  try {
+    var newBuffer = new Float32Array(size);
+  }
+  catch (error) {
+    var newBuffer = new Array(size);
+    var audioSampleIndice = 0;
+    do {
+      newBuffer[audioSampleIndice] = 0;
+    } while (++audioSampleIndice < size);
+  }
+  return newBuffer;
+}
+//Flash NPAPI Event Handler:
+var samplesPerCallback = 2048;      //Has to be between 2048 and 4096 (If over, then samples are ignored, if under then silence is added).
+var outputConvert = null;
+function audioOutputFlashEvent() {    //The callback that flash calls...
+  resampleRefill();
+  return outputConvert();
+}
+function generateFlashStereoString() {  //Convert the arrays to one long string for speed.
+  var copyBinaryStringLeft = "";
+  var copyBinaryStringRight = "";
+  for (var index = 0; index < samplesPerCallback && resampleBufferStart != resampleBufferEnd; ++index) {
+    //Sanitize the buffer:
+    copyBinaryStringLeft += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
+    copyBinaryStringRight += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
+    if (resampleBufferStart == resampleBufferSize) {
+      resampleBufferStart = 0;
+    }
+  }
+  return copyBinaryStringLeft + copyBinaryStringRight;
+}
+function generateFlashMonoString() {  //Convert the array to one long string for speed.
+  var copyBinaryString = "";
+  for (var index = 0; index < samplesPerCallback && resampleBufferStart != resampleBufferEnd; ++index) {
+    //Sanitize the buffer:
+    copyBinaryString += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
+    if (resampleBufferStart == resampleBufferSize) {
+      resampleBufferStart = 0;
+    }
+  }
+  return copyBinaryString;
+}
+//Audio API Event Handler:
+var audioContextHandle = null;
+var audioNode = null;
+var audioSource = null;
+var launchedContext = false;
+var audioContextSampleBuffer = [];
+var resampled = [];
+var webAudioMinBufferSize = 15000;
+var webAudioMaxBufferSize = 25000;
+var webAudioActualSampleRate = 44100;
+var XAudioJSSampleRate = 0;
+var webAudioMono = false;
+var XAudioJSVolume = 1;
+var resampleControl = null;
+var audioBufferSize = 0;
+var resampleBufferStart = 0;
+var resampleBufferEnd = 0;
+var resampleBufferSize = 2;
+function audioOutputEvent(event) {    //Web Audio API callback...
+  var index = 0;
+  var buffer1 = event.outputBuffer.getChannelData(0);
+  var buffer2 = event.outputBuffer.getChannelData(1);
+  resampleRefill();
+  if (!webAudioMono) {
+    //STEREO:
+    while (index < samplesPerCallback && resampleBufferStart != resampleBufferEnd) {
+      buffer1[index] = resampled[resampleBufferStart++] * XAudioJSVolume;
+      buffer2[index++] = resampled[resampleBufferStart++] * XAudioJSVolume;
+      if (resampleBufferStart == resampleBufferSize) {
+        resampleBufferStart = 0;
+      }
+    }
+  }
+  else {
+    //MONO:
+    while (index < samplesPerCallback && resampleBufferStart != resampleBufferEnd) {
+      buffer2[index] = buffer1[index] = resampled[resampleBufferStart++] * XAudioJSVolume;
+      ++index;
+      if (resampleBufferStart == resampleBufferSize) {
+        resampleBufferStart = 0;
+      }
+    }
+  }
+  //Pad with silence if we're underrunning:
+  while (index < samplesPerCallback) {
+    buffer2[index] = buffer1[index] = 0;
+    ++index;
+  }
+}
+function resampleRefill() {
+  if (audioBufferSize > 0) {
+    //Resample a chunk of audio:
+    var resampleLength = resampleControl.resampler(getBufferSamples());
+    var resampledResult = resampleControl.outputBuffer;
+    for (var index2 = 0; index2 < resampleLength; ++index2) {
+      resampled[resampleBufferEnd++] = resampledResult[index2];
+      if (resampleBufferEnd == resampleBufferSize) {
+        resampleBufferEnd = 0;
+      }
+      if (resampleBufferStart == resampleBufferEnd) {
+        ++resampleBufferStart;
+        if (resampleBufferStart == resampleBufferSize) {
+          resampleBufferStart = 0;
+        }
+      }
+    }
+    audioBufferSize = 0;
+  }
+}
+function resampledSamplesLeft() {
+  return ((resampleBufferStart <= resampleBufferEnd) ? 0 : resampleBufferSize) + resampleBufferEnd - resampleBufferStart;
+}
+function getBufferSamples() {
+  //Typed array and normal array buffer section referencing:
+  try {
+    return audioContextSampleBuffer.subarray(0, audioBufferSize);
+  }
+  catch (error) {
+    try {
+      //Regular array pass:
+      audioContextSampleBuffer.length = audioBufferSize;
+      return audioContextSampleBuffer;
+    }
+    catch (error) {
+      //Nightly Firefox 4 used to have the subarray function named as slice:
+      return audioContextSampleBuffer.slice(0, audioBufferSize);
+    }
+  }
+}
+//Initialize WebKit Audio /Flash Audio Buffer:
+function resetCallbackAPIAudioBuffer(APISampleRate, bufferAlloc) {
+  audioContextSampleBuffer = getFloat32(webAudioMaxBufferSize);
+  audioBufferSize = webAudioMaxBufferSize;
+  resampleBufferStart = 0;
+  resampleBufferEnd = 0;
+  resampleBufferSize = Math.max(webAudioMaxBufferSize * Math.ceil(XAudioJSSampleRate / APISampleRate), samplesPerCallback) << 1;
+  if (webAudioMono) {
+    //MONO Handling:
+    resampled = getFloat32Flat(resampleBufferSize);
+    resampleControl = new Resampler(XAudioJSSampleRate, APISampleRate, 1, resampleBufferSize, true);
+    outputConvert = generateFlashMonoString;
+  }
+  else {
+    //STEREO Handling:
+    resampleBufferSize  <<= 1;
+    resampled = getFloat32Flat(resampleBufferSize);
+    resampleControl = new Resampler(XAudioJSSampleRate, APISampleRate, 2, resampleBufferSize, true);
+    outputConvert = generateFlashStereoString;
+  }
+}
+//Initialize WebKit Audio:
+(function () {
+  if (!launchedContext) {
+    try {
+      // The following line was modified for benchmarking:
+      audioContextHandle = new GameBoyAudioContext();              //Create a system audio context.
+    }
+    catch (error) {
+      try {
+        audioContextHandle = new AudioContext();                //Create a system audio context.
+      }
+      catch (error) {
+        return;
+      }
+    }
+    try {
+      audioSource = audioContextHandle.createBufferSource();            //We need to create a false input to get the chain started.
+      audioSource.loop = false;  //Keep this alive forever (Event handler will know when to ouput.)
+      XAudioJSSampleRate = webAudioActualSampleRate = audioContextHandle.sampleRate;
+      audioSource.buffer = audioContextHandle.createBuffer(1, 1, webAudioActualSampleRate);  //Create a zero'd input buffer for the input to be valid.
+      audioNode = audioContextHandle.createJavaScriptNode(samplesPerCallback, 1, 2);      //Create 2 outputs and ignore the input buffer (Just copy buffer 1 over if mono)
+      audioNode.onaudioprocess = audioOutputEvent;                //Connect the audio processing event to a handling function so we can manipulate output
+      audioSource.connect(audioNode);                        //Send and chain the input to the audio manipulation.
+      audioNode.connect(audioContextHandle.destination);              //Send and chain the output of the audio manipulation to the system audio output.
+      audioSource.noteOn(0);                            //Start the loop!
+    }
+    catch (error) {
+      return;
+    }
+    launchedContext = true;
+  }
+})();
+
+// End of js/other/XAudioServer.js file.
+
+// Start of js/other/resize.js file.
+
+//JavaScript Image Resizer (c) 2012 - Grant Galitz
+function Resize(widthOriginal, heightOriginal, targetWidth, targetHeight, blendAlpha, interpolationPass) {
+  this.widthOriginal = Math.abs(parseInt(widthOriginal) || 0);
+  this.heightOriginal = Math.abs(parseInt(heightOriginal) || 0);
+  this.targetWidth = Math.abs(parseInt(targetWidth) || 0);
+  this.targetHeight = Math.abs(parseInt(targetHeight) || 0);
+  this.colorChannels = (!!blendAlpha) ? 4 : 3;
+  this.interpolationPass = !!interpolationPass;
+  this.targetWidthMultipliedByChannels = this.targetWidth * this.colorChannels;
+  this.originalWidthMultipliedByChannels = this.widthOriginal * this.colorChannels;
+  this.originalHeightMultipliedByChannels = this.heightOriginal * this.colorChannels;
+  this.widthPassResultSize = this.targetWidthMultipliedByChannels * this.heightOriginal;
+  this.finalResultSize = this.targetWidthMultipliedByChannels * this.targetHeight;
+  this.initialize();
+}
+Resize.prototype.initialize = function () {
+  //Perform some checks:
+  if (this.widthOriginal > 0 && this.heightOriginal > 0 && this.targetWidth > 0 && this.targetHeight > 0) {
+    if (this.widthOriginal == this.targetWidth) {
+      //Bypass the width resizer pass:
+      this.resizeWidth = this.bypassResizer;
+    }
+    else {
+      //Setup the width resizer pass:
+      this.ratioWeightWidthPass = this.widthOriginal / this.targetWidth;
+      if (this.ratioWeightWidthPass < 1 && this.interpolationPass) {
+        this.initializeFirstPassBuffers(true);
+        this.resizeWidth = (this.colorChannels == 4) ? this.resizeWidthInterpolatedRGBA : this.resizeWidthInterpolatedRGB;
+      }
+      else {
+        this.initializeFirstPassBuffers(false);
+        this.resizeWidth = (this.colorChannels == 4) ? this.resizeWidthRGBA : this.resizeWidthRGB;
+      }
+    }
+    if (this.heightOriginal == this.targetHeight) {
+      //Bypass the height resizer pass:
+      this.resizeHeight = this.bypassResizer;
+    }
+    else {
+      //Setup the height resizer pass:
+      this.ratioWeightHeightPass = this.heightOriginal / this.targetHeight;
+      if (this.ratioWeightHeightPass < 1 && this.interpolationPass) {
+        this.initializeSecondPassBuffers(true);
+        this.resizeHeight = this.resizeHeightInterpolated;
+      }
+      else {
+        this.initializeSecondPassBuffers(false);
+        this.resizeHeight = (this.colorChannels == 4) ? this.resizeHeightRGBA : this.resizeHeightRGB;
+      }
+    }
+  }
+  else {
+    throw(new Error("Invalid settings specified for the resizer."));
+  }
+}
+Resize.prototype.resizeWidthRGB = function (buffer) {
+  var ratioWeight = this.ratioWeightWidthPass;
+  var weight = 0;
+  var amountToNext = 0;
+  var actualPosition = 0;
+  var currentPosition = 0;
+  var line = 0;
+  var pixelOffset = 0;
+  var outputOffset = 0;
+  var nextLineOffsetOriginalWidth = this.originalWidthMultipliedByChannels - 2;
+  var nextLineOffsetTargetWidth = this.targetWidthMultipliedByChannels - 2;
+  var output = this.outputWidthWorkBench;
+  var outputBuffer = this.widthBuffer;
+  do {
+    for (line = 0; line < this.originalHeightMultipliedByChannels;) {
+      output[line++] = 0;
+      output[line++] = 0;
+      output[line++] = 0;
+    }
+    weight = ratioWeight;
+    do {
+      amountToNext = 1 + actualPosition - currentPosition;
+      if (weight >= amountToNext) {
+        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
+          output[line++] += buffer[pixelOffset++] * amountToNext;
+          output[line++] += buffer[pixelOffset++] * amountToNext;
+          output[line++] += buffer[pixelOffset] * amountToNext;
+        }
+        currentPosition = actualPosition = actualPosition + 3;
+        weight -= amountToNext;
+      }
+      else {
+        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
+          output[line++] += buffer[pixelOffset++] * weight;
+          output[line++] += buffer[pixelOffset++] * weight;
+          output[line++] += buffer[pixelOffset] * weight;
+        }
+        currentPosition += weight;
+        break;
+      }
+    } while (weight > 0 && actualPosition < this.originalWidthMultipliedByChannels);
+    for (line = 0, pixelOffset = outputOffset; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetTargetWidth) {
+      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
+      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
+      outputBuffer[pixelOffset] = output[line++] / ratioWeight;
+    }
+    outputOffset += 3;
+  } while (outputOffset < this.targetWidthMultipliedByChannels);
+  return outputBuffer;
+}
+Resize.prototype.resizeWidthInterpolatedRGB = function (buffer) {
+  var ratioWeight = (this.widthOriginal - 1) / this.targetWidth;
+  var weight = 0;
+  var finalOffset = 0;
+  var pixelOffset = 0;
+  var outputBuffer = this.widthBuffer;
+  for (var targetPosition = 0; targetPosition < this.targetWidthMultipliedByChannels; targetPosition += 3, weight += ratioWeight) {
+    //Calculate weightings:
+    secondWeight = weight % 1;
+    firstWeight = 1 - secondWeight;
+    //Interpolate:
+    for (finalOffset = targetPosition, pixelOffset = Math.floor(weight) * 3; finalOffset < this.widthPassResultSize; pixelOffset += this.originalWidthMultipliedByChannels, finalOffset += this.targetWidthMultipliedByChannels) {
+      outputBuffer[finalOffset] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 3] * secondWeight);
+      outputBuffer[finalOffset + 1] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
+      outputBuffer[finalOffset + 2] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
+    }
+  }
+  return outputBuffer;
+}
+Resize.prototype.resizeWidthRGBA = function (buffer) {
+  var ratioWeight = this.ratioWeightWidthPass;
+  var weight = 0;
+  var amountToNext = 0;
+  var actualPosition = 0;
+  var currentPosition = 0;
+  var line = 0;
+  var pixelOffset = 0;
+  var outputOffset = 0;
+  var nextLineOffsetOriginalWidth = this.originalWidthMultipliedByChannels - 3;
+  var nextLineOffsetTargetWidth = this.targetWidthMultipliedByChannels - 3;
+  var output = this.outputWidthWorkBench;
+  var outputBuffer = this.widthBuffer;
+  do {
+    for (line = 0; line < this.originalHeightMultipliedByChannels;) {
+      output[line++] = 0;
+      output[line++] = 0;
+      output[line++] = 0;
+      output[line++] = 0;
+    }
+    weight = ratioWeight;
+    do {
+      amountToNext = 1 + actualPosition - currentPosition;
+      if (weight >= amountToNext) {
+        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
+          output[line++] += buffer[pixelOffset++] * amountToNext;
+          output[line++] += buffer[pixelOffset++] * amountToNext;
+          output[line++] += buffer[pixelOffset++] * amountToNext;
+          output[line++] += buffer[pixelOffset] * amountToNext;
+        }
+        currentPosition = actualPosition = actualPosition + 4;
+        weight -= amountToNext;
+      }
+      else {
+        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
+          output[line++] += buffer[pixelOffset++] * weight;
+          output[line++] += buffer[pixelOffset++] * weight;
+          output[line++] += buffer[pixelOffset++] * weight;
+          output[line++] += buffer[pixelOffset] * weight;
+        }
+        currentPosition += weight;
+        break;
+      }
+    } while (weight > 0 && actualPosition < this.originalWidthMultipliedByChannels);
+    for (line = 0, pixelOffset = outputOffset; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetTargetWidth) {
+      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
+      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
+      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
+      outputBuffer[pixelOffset] = output[line++] / ratioWeight;
+    }
+    outputOffset += 4;
+  } while (outputOffset < this.targetWidthMultipliedByChannels);
+  return outputBuffer;
+}
+Resize.prototype.resizeWidthInterpolatedRGBA = function (buffer) {
+  var ratioWeight = (this.widthOriginal - 1) / this.targetWidth;
+  var weight = 0;
+  var finalOffset = 0;
+  var pixelOffset = 0;
+  var outputBuffer = this.widthBuffer;
+  for (var targetPosition = 0; targetPosition < this.targetWidthMultipliedByChannels; targetPosition += 4, weight += ratioWeight) {
+    //Calculate weightings:
+    secondWeight = weight % 1;
+    firstWeight = 1 - secondWeight;
+    //Interpolate:
+    for (finalOffset = targetPosition, pixelOffset = Math.floor(weight) * 4; finalOffset < this.widthPassResultSize; pixelOffset += this.originalWidthMultipliedByChannels, finalOffset += this.targetWidthMultipliedByChannels) {
+      outputBuffer[finalOffset] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
+      outputBuffer[finalOffset + 1] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
+      outputBuffer[finalOffset + 2] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 6] * secondWeight);
+      outputBuffer[finalOffset + 3] = (buffer[pixelOffset + 3] * firstWeight) + (buffer[pixelOffset + 7] * secondWeight);
+    }
+  }
+  return outputBuffer;
+}
+Resize.prototype.resizeHeightRGB = function (buffer) {
+  var ratioWeight = this.ratioWeightHeightPass;
+  var weight = 0;
+  var amountToNext = 0;
+  var actualPosition = 0;
+  var currentPosition = 0;
+  var pixelOffset = 0;
+  var outputOffset = 0;
+  var output = this.outputHeightWorkBench;
+  var outputBuffer = this.heightBuffer;
+  do {
+    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+      output[pixelOffset++] = 0;
+      output[pixelOffset++] = 0;
+      output[pixelOffset++] = 0;
+    }
+    weight = ratioWeight;
+    do {
+      amountToNext = 1 + actualPosition - currentPosition;
+      if (weight >= amountToNext) {
+        for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+        }
+        currentPosition = actualPosition;
+        weight -= amountToNext;
+      }
+      else {
+        for (pixelOffset = 0, amountToNext = actualPosition; pixelOffset < this.targetWidthMultipliedByChannels;) {
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+        }
+        currentPosition += weight;
+        break;
+      }
+    } while (weight > 0 && actualPosition < this.widthPassResultSize);
+    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+    }
+  } while (outputOffset < this.finalResultSize);
+  return outputBuffer;
+}
+Resize.prototype.resizeHeightInterpolated = function (buffer) {
+  var ratioWeight = (this.heightOriginal - 1) / this.targetHeight;
+  var weight = 0;
+  var finalOffset = 0;
+  var pixelOffset = 0;
+  var pixelOffsetAccumulated = 0;
+  var pixelOffsetAccumulated2 = 0;
+  var outputBuffer = this.heightBuffer;
+  do {
+    //Calculate weightings:
+    secondWeight = weight % 1;
+    firstWeight = 1 - secondWeight;
+    //Interpolate:
+    pixelOffsetAccumulated = Math.floor(weight) * this.targetWidthMultipliedByChannels;
+    pixelOffsetAccumulated2 = pixelOffsetAccumulated + this.targetWidthMultipliedByChannels;
+    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels; ++pixelOffset) {
+      outputBuffer[finalOffset++] = (buffer[pixelOffsetAccumulated + pixelOffset] * firstWeight) + (buffer[pixelOffsetAccumulated2 + pixelOffset] * secondWeight);
+    }
+    weight += ratioWeight;
+  } while (finalOffset < this.finalResultSize);
+  return outputBuffer;
+}
+Resize.prototype.resizeHeightRGBA = function (buffer) {
+  var ratioWeight = this.ratioWeightHeightPass;
+  var weight = 0;
+  var amountToNext = 0;
+  var actualPosition = 0;
+  var currentPosition = 0;
+  var pixelOffset = 0;
+  var outputOffset = 0;
+  var output = this.outputHeightWorkBench;
+  var outputBuffer = this.heightBuffer;
+  do {
+    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+      output[pixelOffset++] = 0;
+      output[pixelOffset++] = 0;
+      output[pixelOffset++] = 0;
+      output[pixelOffset++] = 0;
+    }
+    weight = ratioWeight;
+    do {
+      amountToNext = 1 + actualPosition - currentPosition;
+      if (weight >= amountToNext) {
+        for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
+        }
+        currentPosition = actualPosition;
+        weight -= amountToNext;
+      }
+      else {
+        for (pixelOffset = 0, amountToNext = actualPosition; pixelOffset < this.targetWidthMultipliedByChannels;) {
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+          output[pixelOffset++] += buffer[amountToNext++] * weight;
+        }
+        currentPosition += weight;
+        break;
+      }
+    } while (weight > 0 && actualPosition < this.widthPassResultSize);
+    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
+    }
+  } while (outputOffset < this.finalResultSize);
+  return outputBuffer;
+}
+Resize.prototype.resizeHeightInterpolatedRGBA = function (buffer) {
+  var ratioWeight = (this.heightOriginal - 1) / this.targetHeight;
+  var weight = 0;
+  var finalOffset = 0;
+  var pixelOffset = 0;
+  var outputBuffer = this.heightBuffer;
+  while (pixelOffset < this.finalResultSize) {
+    //Calculate weightings:
+    secondWeight = weight % 1;
+    firstWeight = 1 - secondWeight;
+    //Interpolate:
+    for (pixelOffset = Math.floor(weight) * 4; pixelOffset < this.targetWidthMultipliedByChannels; pixelOffset += 4) {
+      outputBuffer[finalOffset++] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
+      outputBuffer[finalOffset++] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
+      outputBuffer[finalOffset++] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 6] * secondWeight);
+      outputBuffer[finalOffset++] = (buffer[pixelOffset + 3] * firstWeight) + (buffer[pixelOffset + 7] * secondWeight);
+    }
+    weight += ratioWeight;
+  }
+  return outputBuffer;
+}
+Resize.prototype.resize = function (buffer) {
+  return this.resizeHeight(this.resizeWidth(buffer));
+}
+Resize.prototype.bypassResizer = function (buffer) {
+  //Just return the buffer passsed:
+  return buffer;
+}
+Resize.prototype.initializeFirstPassBuffers = function (BILINEARAlgo) {
+  //Initialize the internal width pass buffers:
+  this.widthBuffer = this.generateFloatBuffer(this.widthPassResultSize);
+  if (!BILINEARAlgo) {
+    this.outputWidthWorkBench = this.generateFloatBuffer(this.originalHeightMultipliedByChannels);
+  }
+}
+Resize.prototype.initializeSecondPassBuffers = function (BILINEARAlgo) {
+  //Initialize the internal height pass buffers:
+  this.heightBuffer = this.generateUint8Buffer(this.finalResultSize);
+  if (!BILINEARAlgo) {
+    this.outputHeightWorkBench = this.generateFloatBuffer(this.targetWidthMultipliedByChannels);
+  }
+}
+Resize.prototype.generateFloatBuffer = function (bufferLength) {
+  //Generate a float32 typed array buffer:
+  try {
+    return new Float32Array(bufferLength);
+  }
+  catch (error) {
+    return [];
+  }
+}
+Resize.prototype.generateUint8Buffer = function (bufferLength) {
+  //Generate a uint8 typed array buffer:
+  try {
+    return this.checkForOperaMathBug(new Uint8Array(bufferLength));
+  }
+  catch (error) {
+    return [];
+  }
+}
+Resize.prototype.checkForOperaMathBug = function (typedArray) {
+  typedArray[0] = -1;
+  typedArray[0] >>= 0;
+  if (typedArray[0] != 0xFF) {
+    return [];
+  }
+  else {
+    return typedArray;
+  }
+}
+
+// End of js/other/resize.js file.
+
+// Start of js/GameBoyCore.js file.
+
+"use strict";
+/*
+ * JavaScript GameBoy Color Emulator
+ * Copyright (C) 2010 - 2012 Grant Galitz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ * The full license is available at http://www.gnu.org/licenses/gpl.html
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+function GameBoyCore(canvas, ROMImage) {
+  //Params, etc...
+  this.canvas = canvas;            //Canvas DOM object for drawing out the graphics to.
+  this.drawContext = null;          // LCD Context
+  this.ROMImage = ROMImage;          //The game's ROM.
+  //CPU Registers and Flags:
+  this.registerA = 0x01;             //Register A (Accumulator)
+  this.FZero = true;               //Register F  - Result was zero
+  this.FSubtract = false;            //Register F  - Subtraction was executed
+  this.FHalfCarry = true;            //Register F  - Half carry or half borrow
+  this.FCarry = true;              //Register F  - Carry or borrow
+  this.registerB = 0x00;            //Register B
+  this.registerC = 0x13;            //Register C
+  this.registerD = 0x00;            //Register D
+  this.registerE = 0xD8;            //Register E
+  this.registersHL = 0x014D;          //Registers H and L combined
+  this.stackPointer = 0xFFFE;          //Stack Pointer
+  this.programCounter = 0x0100;        //Program Counter
+  //Some CPU Emulation State Variables:
+  this.CPUCyclesTotal = 0;          //Relative CPU clocking to speed set, rounded appropriately.
+  this.CPUCyclesTotalBase = 0;        //Relative CPU clocking to speed set base.
+  this.CPUCyclesTotalCurrent = 0;        //Relative CPU clocking to speed set, the directly used value.
+  this.CPUCyclesTotalRoundoff = 0;      //Clocking per iteration rounding catch.
+  this.baseCPUCyclesPerIteration = 0;    //CPU clocks per iteration at 1x speed.
+  this.remainingClocks = 0;          //HALT clocking overrun carry over.
+  this.inBootstrap = true;          //Whether we're in the GBC boot ROM.
+  this.usedBootROM = false;          //Updated upon ROM loading...
+  this.usedGBCBootROM = false;        //Did we boot to the GBC boot ROM?
+  this.halt = false;              //Has the CPU been suspended until the next interrupt?
+  this.skipPCIncrement = false;        //Did we trip the DMG Halt bug?
+  this.stopEmulator = 3;            //Has the emulation been paused or a frame has ended?
+  this.IME = true;              //Are interrupts enabled?
+  this.IRQLineMatched = 0;          //CPU IRQ assertion.
+  this.interruptsRequested = 0;        //IF Register
+  this.interruptsEnabled = 0;          //IE Register
+  this.hdmaRunning = false;          //HDMA Transfer Flag - GBC only
+  this.CPUTicks = 0;              //The number of clock cycles emulated.
+  this.doubleSpeedShifter = 0;        //GBC double speed clocking shifter.
+  this.JoyPad = 0xFF;              //Joypad State (two four-bit states actually)
+  this.CPUStopped = false;          //CPU STOP status.
+  //Main RAM, MBC RAM, GBC Main RAM, VRAM, etc.
+  this.memoryReader = [];            //Array of functions mapped to read back memory
+  this.memoryWriter = [];            //Array of functions mapped to write to memory
+  this.memoryHighReader = [];          //Array of functions mapped to read back 0xFFXX memory
+  this.memoryHighWriter = [];          //Array of functions mapped to write to 0xFFXX memory
+  this.ROM = [];                //The full ROM file dumped to an array.
+  this.memory = [];              //Main Core Memory
+  this.MBCRam = [];              //Switchable RAM (Used by games for more RAM) for the main memory range 0xA000 - 0xC000.
+  this.VRAM = [];                //Extra VRAM bank for GBC.
+  this.GBCMemory = [];            //GBC main RAM Banks
+  this.MBC1Mode = false;            //MBC1 Type (4/32, 16/8)
+  this.MBCRAMBanksEnabled = false;      //MBC RAM Access Control.
+  this.currMBCRAMBank = 0;          //MBC Currently Indexed RAM Bank
+  this.currMBCRAMBankPosition = -0xA000;    //MBC Position Adder;
+  this.cGBC = false;              //GameBoy Color detection.
+  this.gbcRamBank = 1;            //Currently Switched GameBoy Color ram bank
+  this.gbcRamBankPosition = -0xD000;      //GBC RAM offset from address start.
+  this.gbcRamBankPositionECHO = -0xF000;    //GBC RAM (ECHO mirroring) offset from address start.
+  this.RAMBanks = [0, 1, 2, 4, 16];      //Used to map the RAM banks to maximum size the MBC used can do.
+  this.ROMBank1offs = 0;            //Offset of the ROM bank switching.
+  this.currentROMBank = 0;          //The parsed current ROM bank selection.
+  this.cartridgeType = 0;            //Cartridge Type
+  this.name = "";                //Name of the game
+  this.gameCode = "";              //Game code (Suffix for older games)
+  this.fromSaveState = false;          //A boolean to see if this was loaded in as a save state.
+  this.savedStateFileName = "";        //When loaded in as a save state, this will not be empty.
+  this.STATTracker = 0;            //Tracker for STAT triggering.
+  this.modeSTAT = 0;              //The scan line mode (for lines 1-144 it's 2-3-0, for 145-154 it's 1)
+  this.spriteCount = 252;            //Mode 3 extra clocking counter (Depends on how many sprites are on the current line.).
+  this.LYCMatchTriggerSTAT = false;      //Should we trigger an interrupt if LY==LYC?
+  this.mode2TriggerSTAT = false;        //Should we trigger an interrupt if in mode 2?
+  this.mode1TriggerSTAT = false;        //Should we trigger an interrupt if in mode 1?
+  this.mode0TriggerSTAT = false;        //Should we trigger an interrupt if in mode 0?
+  this.LCDisOn = false;            //Is the emulated LCD controller on?
+  this.LINECONTROL = [];            //Array of functions to handle each scan line we do (onscreen + offscreen)
+  this.DISPLAYOFFCONTROL = [function (parentObj) {
+    //Array of line 0 function to handle the LCD controller when it's off (Do nothing!).
+  }];
+  this.LCDCONTROL = null;            //Pointer to either LINECONTROL or DISPLAYOFFCONTROL.
+  this.initializeLCDController();        //Compile the LCD controller functions.
+  //RTC (Real Time Clock for MBC3):
+  this.RTCisLatched = false;
+  this.latchedSeconds = 0;          //RTC latched seconds.
+  this.latchedMinutes = 0;          //RTC latched minutes.
+  this.latchedHours = 0;            //RTC latched hours.
+  this.latchedLDays = 0;            //RTC latched lower 8-bits of the day counter.
+  this.latchedHDays = 0;            //RTC latched high-bit of the day counter.
+  this.RTCSeconds = 0;            //RTC seconds counter.
+  this.RTCMinutes = 0;            //RTC minutes counter.
+  this.RTCHours = 0;              //RTC hours counter.
+  this.RTCDays = 0;              //RTC days counter.
+  this.RTCDayOverFlow = false;        //Did the RTC overflow and wrap the day counter?
+  this.RTCHALT = false;            //Is the RTC allowed to clock up?
+  //Gyro:
+  this.highX = 127;
+  this.lowX = 127;
+  this.highY = 127;
+  this.lowY = 127;
+  //Sound variables:
+  this.audioHandle = null;            //XAudioJS handle
+  this.numSamplesTotal = 0;            //Length of the sound buffers.
+  this.sampleSize = 0;              //Length of the sound buffer for one channel.
+  this.dutyLookup = [                //Map the duty values given to ones we can work with.
+    [false, false, false, false, false, false, false, true],
+    [true, false, false, false, false, false, false, true],
+    [true, false, false, false, false, true, true, true],
+    [false, true, true, true, true, true, true, false]
+  ];
+  this.currentBuffer = [];            //The audio buffer we're working on.
+  this.bufferContainAmount = 0;          //Buffer maintenance metric.
+  this.LSFR15Table = null;
+  this.LSFR7Table = null;
+  this.noiseSampleTable = null;
+  this.initializeAudioStartState();
+  this.soundMasterEnabled = false;      //As its name implies
+  this.channel3PCM = null;          //Channel 3 adjusted sample buffer.
+  //Vin Shit:
+  this.VinLeftChannelMasterVolume = 8;    //Computed post-mixing volume.
+  this.VinRightChannelMasterVolume = 8;    //Computed post-mixing volume.
+  //Channel paths enabled:
+  this.leftChannel1 = false;
+  this.leftChannel2 = false;
+  this.leftChannel3 = false;
+  this.leftChannel4 = false;
+  this.rightChannel1 = false;
+  this.rightChannel2 = false;
+  this.rightChannel3 = false;
+  this.rightChannel4 = false;
+  //Channel output level caches:
+  this.channel1currentSampleLeft = 0;
+  this.channel1currentSampleRight = 0;
+  this.channel2currentSampleLeft = 0;
+  this.channel2currentSampleRight = 0;
+  this.channel3currentSampleLeft = 0;
+  this.channel3currentSampleRight = 0;
+  this.channel4currentSampleLeft = 0;
+  this.channel4currentSampleRight = 0;
+  this.channel1currentSampleLeftSecondary = 0;
+  this.channel1currentSampleRightSecondary = 0;
+  this.channel2currentSampleLeftSecondary = 0;
+  this.channel2currentSampleRightSecondary = 0;
+  this.channel3currentSampleLeftSecondary = 0;
+  this.channel3currentSampleRightSecondary = 0;
+  this.channel4currentSampleLeftSecondary = 0;
+  this.channel4currentSampleRightSecondary = 0;
+  this.channel1currentSampleLeftTrimary = 0;
+  this.channel1currentSampleRightTrimary = 0;
+  this.channel2currentSampleLeftTrimary = 0;
+  this.channel2currentSampleRightTrimary = 0;
+  this.mixerOutputCache = 0;
+  //Pre-multipliers to cache some calculations:
+  this.initializeTiming();
+  this.machineOut = 0;        //Premultiplier for audio samples per instruction.
+  //Audio generation counters:
+  this.audioTicks = 0;        //Used to sample the audio system every x CPU instructions.
+  this.audioIndex = 0;        //Used to keep alignment on audio generation.
+  this.rollover = 0;          //Used to keep alignment on the number of samples to output (Realign from counter alias).
+  //Timing Variables
+  this.emulatorTicks = 0;        //Times for how many instructions to execute before ending the loop.
+  this.DIVTicks = 56;          //DIV Ticks Counter (Invisible lower 8-bit)
+  this.LCDTicks = 60;          //Counter for how many instructions have been executed on a scanline so far.
+  this.timerTicks = 0;        //Counter for the TIMA timer.
+  this.TIMAEnabled = false;      //Is TIMA enabled?
+  this.TACClocker = 1024;        //Timer Max Ticks
+  this.serialTimer = 0;        //Serial IRQ Timer
+  this.serialShiftTimer = 0;      //Serial Transfer Shift Timer
+  this.serialShiftTimerAllocated = 0;  //Serial Transfer Shift Timer Refill
+  this.IRQEnableDelay = 0;      //Are the interrupts on queue to be enabled?
+  var dateVar = new_Date();     // The line is changed for benchmarking.
+  this.lastIteration = dateVar.getTime();//The last time we iterated the main loop.
+  dateVar = new_Date();         // The line is changed for benchmarking.
+  this.firstIteration = dateVar.getTime();
+  this.iterations = 0;
+  this.actualScanLine = 0;      //Actual scan line...
+  this.lastUnrenderedLine = 0;    //Last rendered scan line...
+  this.queuedScanLines = 0;
+  this.totalLinesPassed = 0;
+  this.haltPostClocks = 0;      //Post-Halt clocking.
+  //ROM Cartridge Components:
+  this.cMBC1 = false;          //Does the cartridge use MBC1?
+  this.cMBC2 = false;          //Does the cartridge use MBC2?
+  this.cMBC3 = false;          //Does the cartridge use MBC3?
+  this.cMBC5 = false;          //Does the cartridge use MBC5?
+  this.cMBC7 = false;          //Does the cartridge use MBC7?
+  this.cSRAM = false;          //Does the cartridge use save RAM?
+  this.cMMMO1 = false;        //...
+  this.cRUMBLE = false;        //Does the cartridge use the RUMBLE addressing (modified MBC5)?
+  this.cCamera = false;        //Is the cartridge actually a GameBoy Camera?
+  this.cTAMA5 = false;        //Does the cartridge use TAMA5? (Tamagotchi Cartridge)
+  this.cHuC3 = false;          //Does the cartridge use HuC3 (Hudson Soft / modified MBC3)?
+  this.cHuC1 = false;          //Does the cartridge use HuC1 (Hudson Soft / modified MBC1)?
+  this.cTIMER = false;        //Does the cartridge have an RTC?
+  this.ROMBanks = [          // 1 Bank = 16 KBytes = 256 Kbits
+    2, 4, 8, 16, 32, 64, 128, 256, 512
+  ];
+  this.ROMBanks[0x52] = 72;
+  this.ROMBanks[0x53] = 80;
+  this.ROMBanks[0x54] = 96;
+  this.numRAMBanks = 0;          //How many RAM banks were actually allocated?
+  ////Graphics Variables
+  this.currVRAMBank = 0;          //Current VRAM bank for GBC.
+  this.backgroundX = 0;          //Register SCX (X-Scroll)
+  this.backgroundY = 0;          //Register SCY (Y-Scroll)
+  this.gfxWindowDisplay = false;      //Is the windows enabled?
+  this.gfxSpriteShow = false;        //Are sprites enabled?
+  this.gfxSpriteNormalHeight = true;    //Are we doing 8x8 or 8x16 sprites?
+  this.bgEnabled = true;          //Is the BG enabled?
+  this.BGPriorityEnabled = true;      //Can we flag the BG for priority over sprites?
+  this.gfxWindowCHRBankPosition = 0;    //The current bank of the character map the window uses.
+  this.gfxBackgroundCHRBankPosition = 0;  //The current bank of the character map the BG uses.
+  this.gfxBackgroundBankOffset = 0x80;  //Fast mapping of the tile numbering/
+  this.windowY = 0;            //Current Y offset of the window.
+  this.windowX = 0;            //Current X offset of the window.
+  this.drewBlank = 0;            //To prevent the repeating of drawing a blank screen.
+  this.drewFrame = false;          //Throttle how many draws we can do to once per iteration.
+  this.midScanlineOffset = -1;      //mid-scanline rendering offset.
+  this.pixelEnd = 0;            //track the x-coord limit for line rendering (mid-scanline usage).
+  this.currentX = 0;            //The x-coord we left off at for mid-scanline rendering.
+  //BG Tile Pointer Caches:
+  this.BGCHRBank1 = null;
+  this.BGCHRBank2 = null;
+  this.BGCHRCurrentBank = null;
+  //Tile Data Cache:
+  this.tileCache = null;
+  //Palettes:
+  this.colors = [0xEFFFDE, 0xADD794, 0x529273, 0x183442];      //"Classic" GameBoy palette colors.
+  this.OBJPalette = null;
+  this.BGPalette = null;
+  this.gbcOBJRawPalette = null;
+  this.gbcBGRawPalette = null;
+  this.gbOBJPalette = null;
+  this.gbBGPalette = null;
+  this.gbcOBJPalette = null;
+  this.gbcBGPalette = null;
+  this.gbBGColorizedPalette = null;
+  this.gbOBJColorizedPalette = null;
+  this.cachedBGPaletteConversion = null;
+  this.cachedOBJPaletteConversion = null;
+  this.updateGBBGPalette = this.updateGBRegularBGPalette;
+  this.updateGBOBJPalette = this.updateGBRegularOBJPalette;
+  this.colorizedGBPalettes = false;
+  this.BGLayerRender = null;      //Reference to the BG rendering function.
+  this.WindowLayerRender = null;    //Reference to the window rendering function.
+  this.SpriteLayerRender = null;    //Reference to the OAM rendering function.
+  this.frameBuffer = [];        //The internal frame-buffer.
+  this.swizzledFrame = null;      //The secondary gfx buffer that holds the converted RGBA values.
+  this.canvasBuffer = null;      //imageData handle
+  this.pixelStart = 0;        //Temp variable for holding the current working framebuffer offset.
+  //Variables used for scaling in JS:
+  this.onscreenWidth = this.offscreenWidth = 160;
+  this.onscreenHeight = this.offScreenheight = 144;
+  this.offscreenRGBCount = this.onscreenWidth * this.onscreenHeight * 4;
+  //Initialize the white noise cache tables ahead of time:
+  this.intializeWhiteNoise();
+}
+
+// Start of code changed for benchmarking (removed ROM):
+GameBoyCore.prototype.GBBOOTROM = [];
+GameBoyCore.prototype.GBCBOOTROM = [];
+// End of code changed for benchmarking.
+
+GameBoyCore.prototype.ffxxDump = [  //Dump of the post-BOOT I/O register state (From gambatte):
+  0x0F, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x00, 0xF8,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
+  0x80, 0xBF, 0xF3, 0xFF, 0xBF, 0xFF, 0x3F, 0x00,   0xFF, 0xBF, 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, 0xFF,
+  0xFF, 0x00, 0x00, 0xBF, 0x77, 0xF3, 0xF1, 0xFF,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,   0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
+  0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,   0x00, 0x00, 0x00, 0x00, 0xFF, 0x7E, 0xFF, 0xFE,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,   0xC0, 0xFF, 0xC1, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
+  0xF8, 0xFF, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+  0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B,   0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
+  0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,   0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
+  0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC,   0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
+  0x45, 0xEC, 0x52, 0xFA, 0x08, 0xB7, 0x07, 0x5D,   0x01, 0xFD, 0xC0, 0xFF, 0x08, 0xFC, 0x00, 0xE5,
+  0x0B, 0xF8, 0xC2, 0xCE, 0xF4, 0xF9, 0x0F, 0x7F,   0x45, 0x6D, 0x3D, 0xFE, 0x46, 0x97, 0x33, 0x5E,
+  0x08, 0xEF, 0xF1, 0xFF, 0x86, 0x83, 0x24, 0x74,   0x12, 0xFC, 0x00, 0x9F, 0xB4, 0xB7, 0x06, 0xD5,
+  0xD0, 0x7A, 0x00, 0x9E, 0x04, 0x5F, 0x41, 0x2F,   0x1D, 0x77, 0x36, 0x75, 0x81, 0xAA, 0x70, 0x3A,
+  0x98, 0xD1, 0x71, 0x02, 0x4D, 0x01, 0xC1, 0xFF,   0x0D, 0x00, 0xD3, 0x05, 0xF9, 0x00, 0x0B, 0x00
+];
+GameBoyCore.prototype.OPCODE = [
+  //NOP
+  //#0x00:
+  function (parentObj) {
+    //Do Nothing...
+  },
+  //LD BC, nn
+  //#0x01:
+  function (parentObj) {
+    parentObj.registerC = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.registerB = parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //LD (BC), A
+  //#0x02:
+  function (parentObj) {
+    parentObj.memoryWrite((parentObj.registerB << 8) | parentObj.registerC, parentObj.registerA);
+  },
+  //INC BC
+  //#0x03:
+  function (parentObj) {
+    var temp_var = ((parentObj.registerB << 8) | parentObj.registerC) + 1;
+    parentObj.registerB = (temp_var >> 8) & 0xFF;
+    parentObj.registerC = temp_var & 0xFF;
+  },
+  //INC B
+  //#0x04:
+  function (parentObj) {
+    parentObj.registerB = (parentObj.registerB + 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerB == 0);
+    parentObj.FHalfCarry = ((parentObj.registerB & 0xF) == 0);
+    parentObj.FSubtract = false;
+  },
+  //DEC B
+  //#0x05:
+  function (parentObj) {
+    parentObj.registerB = (parentObj.registerB - 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerB == 0);
+    parentObj.FHalfCarry = ((parentObj.registerB & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+  },
+  //LD B, n
+  //#0x06:
+  function (parentObj) {
+    parentObj.registerB = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //RLCA
+  //#0x07:
+  function (parentObj) {
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | (parentObj.registerA >> 7);
+    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //LD (nn), SP
+  //#0x08:
+  function (parentObj) {
+    var temp_var = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    parentObj.memoryWrite(temp_var, parentObj.stackPointer & 0xFF);
+    parentObj.memoryWrite((temp_var + 1) & 0xFFFF, parentObj.stackPointer >> 8);
+  },
+  //ADD HL, BC
+  //#0x09:
+  function (parentObj) {
+    var dirtySum = parentObj.registersHL + ((parentObj.registerB << 8) | parentObj.registerC);
+    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
+    parentObj.FCarry = (dirtySum > 0xFFFF);
+    parentObj.registersHL = dirtySum & 0xFFFF;
+    parentObj.FSubtract = false;
+  },
+  //LD A, (BC)
+  //#0x0A:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryRead((parentObj.registerB << 8) | parentObj.registerC);
+  },
+  //DEC BC
+  //#0x0B:
+  function (parentObj) {
+    var temp_var = (((parentObj.registerB << 8) | parentObj.registerC) - 1) & 0xFFFF;
+    parentObj.registerB = temp_var >> 8;
+    parentObj.registerC = temp_var & 0xFF;
+  },
+  //INC C
+  //#0x0C:
+  function (parentObj) {
+    parentObj.registerC = (parentObj.registerC + 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerC == 0);
+    parentObj.FHalfCarry = ((parentObj.registerC & 0xF) == 0);
+    parentObj.FSubtract = false;
+  },
+  //DEC C
+  //#0x0D:
+  function (parentObj) {
+    parentObj.registerC = (parentObj.registerC - 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerC == 0);
+    parentObj.FHalfCarry = ((parentObj.registerC & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+  },
+  //LD C, n
+  //#0x0E:
+  function (parentObj) {
+    parentObj.registerC = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //RRCA
+  //#0x0F:
+  function (parentObj) {
+    parentObj.registerA = (parentObj.registerA >> 1) | ((parentObj.registerA & 1) << 7);
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //STOP
+  //#0x10:
+  function (parentObj) {
+    if (parentObj.cGBC) {
+      if ((parentObj.memory[0xFF4D] & 0x01) == 0x01) {    //Speed change requested.
+        if (parentObj.memory[0xFF4D] > 0x7F) {        //Go back to single speed mode.
+          cout("Going into single clock speed mode.", 0);
+          parentObj.doubleSpeedShifter = 0;
+          parentObj.memory[0xFF4D] &= 0x7F;        //Clear the double speed mode flag.
+        }
+        else {                        //Go to double speed mode.
+          cout("Going into double clock speed mode.", 0);
+          parentObj.doubleSpeedShifter = 1;
+          parentObj.memory[0xFF4D] |= 0x80;        //Set the double speed mode flag.
+        }
+        parentObj.memory[0xFF4D] &= 0xFE;          //Reset the request bit.
+      }
+      else {
+        parentObj.handleSTOP();
+      }
+    }
+    else {
+      parentObj.handleSTOP();
+    }
+  },
+  //LD DE, nn
+  //#0x11:
+  function (parentObj) {
+    parentObj.registerE = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.registerD = parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //LD (DE), A
+  //#0x12:
+  function (parentObj) {
+    parentObj.memoryWrite((parentObj.registerD << 8) | parentObj.registerE, parentObj.registerA);
+  },
+  //INC DE
+  //#0x13:
+  function (parentObj) {
+    var temp_var = ((parentObj.registerD << 8) | parentObj.registerE) + 1;
+    parentObj.registerD = (temp_var >> 8) & 0xFF;
+    parentObj.registerE = temp_var & 0xFF;
+  },
+  //INC D
+  //#0x14:
+  function (parentObj) {
+    parentObj.registerD = (parentObj.registerD + 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerD == 0);
+    parentObj.FHalfCarry = ((parentObj.registerD & 0xF) == 0);
+    parentObj.FSubtract = false;
+  },
+  //DEC D
+  //#0x15:
+  function (parentObj) {
+    parentObj.registerD = (parentObj.registerD - 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerD == 0);
+    parentObj.FHalfCarry = ((parentObj.registerD & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+  },
+  //LD D, n
+  //#0x16:
+  function (parentObj) {
+    parentObj.registerD = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //RLA
+  //#0x17:
+  function (parentObj) {
+    var carry_flag = (parentObj.FCarry) ? 1 : 0;
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | carry_flag;
+    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //JR n
+  //#0x18:
+  function (parentObj) {
+    parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
+  },
+  //ADD HL, DE
+  //#0x19:
+  function (parentObj) {
+    var dirtySum = parentObj.registersHL + ((parentObj.registerD << 8) | parentObj.registerE);
+    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
+    parentObj.FCarry = (dirtySum > 0xFFFF);
+    parentObj.registersHL = dirtySum & 0xFFFF;
+    parentObj.FSubtract = false;
+  },
+  //LD A, (DE)
+  //#0x1A:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryRead((parentObj.registerD << 8) | parentObj.registerE);
+  },
+  //DEC DE
+  //#0x1B:
+  function (parentObj) {
+    var temp_var = (((parentObj.registerD << 8) | parentObj.registerE) - 1) & 0xFFFF;
+    parentObj.registerD = temp_var >> 8;
+    parentObj.registerE = temp_var & 0xFF;
+  },
+  //INC E
+  //#0x1C:
+  function (parentObj) {
+    parentObj.registerE = (parentObj.registerE + 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerE == 0);
+    parentObj.FHalfCarry = ((parentObj.registerE & 0xF) == 0);
+    parentObj.FSubtract = false;
+  },
+  //DEC E
+  //#0x1D:
+  function (parentObj) {
+    parentObj.registerE = (parentObj.registerE - 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerE == 0);
+    parentObj.FHalfCarry = ((parentObj.registerE & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+  },
+  //LD E, n
+  //#0x1E:
+  function (parentObj) {
+    parentObj.registerE = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //RRA
+  //#0x1F:
+  function (parentObj) {
+    var carry_flag = (parentObj.FCarry) ? 0x80 : 0;
+    parentObj.FCarry = ((parentObj.registerA & 1) == 1);
+    parentObj.registerA = (parentObj.registerA >> 1) | carry_flag;
+    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //JR NZ, n
+  //#0x20:
+  function (parentObj) {
+    if (!parentObj.FZero) {
+      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    }
+  },
+  //LD HL, nn
+  //#0x21:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //LDI (HL), A
+  //#0x22:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
+    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
+  },
+  //INC HL
+  //#0x23:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
+  },
+  //INC H
+  //#0x24:
+  function (parentObj) {
+    var H = ((parentObj.registersHL >> 8) + 1) & 0xFF;
+    parentObj.FZero = (H == 0);
+    parentObj.FHalfCarry = ((H & 0xF) == 0);
+    parentObj.FSubtract = false;
+    parentObj.registersHL = (H << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //DEC H
+  //#0x25:
+  function (parentObj) {
+    var H = ((parentObj.registersHL >> 8) - 1) & 0xFF;
+    parentObj.FZero = (H == 0);
+    parentObj.FHalfCarry = ((H & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+    parentObj.registersHL = (H << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, n
+  //#0x26:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8) | (parentObj.registersHL & 0xFF);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //DAA
+  //#0x27:
+  function (parentObj) {
+    if (!parentObj.FSubtract) {
+      if (parentObj.FCarry || parentObj.registerA > 0x99) {
+        parentObj.registerA = (parentObj.registerA + 0x60) & 0xFF;
+        parentObj.FCarry = true;
+      }
+      if (parentObj.FHalfCarry || (parentObj.registerA & 0xF) > 0x9) {
+        parentObj.registerA = (parentObj.registerA + 0x06) & 0xFF;
+        parentObj.FHalfCarry = false;
+      }
+    }
+    else if (parentObj.FCarry && parentObj.FHalfCarry) {
+      parentObj.registerA = (parentObj.registerA + 0x9A) & 0xFF;
+      parentObj.FHalfCarry = false;
+    }
+    else if (parentObj.FCarry) {
+      parentObj.registerA = (parentObj.registerA + 0xA0) & 0xFF;
+    }
+    else if (parentObj.FHalfCarry) {
+      parentObj.registerA = (parentObj.registerA + 0xFA) & 0xFF;
+      parentObj.FHalfCarry = false;
+    }
+    parentObj.FZero = (parentObj.registerA == 0);
+  },
+  //JR Z, n
+  //#0x28:
+  function (parentObj) {
+    if (parentObj.FZero) {
+      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    }
+  },
+  //ADD HL, HL
+  //#0x29:
+  function (parentObj) {
+    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > 0x7FF);
+    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
+    parentObj.registersHL = (parentObj.registersHL << 1) & 0xFFFF;
+    parentObj.FSubtract = false;
+  },
+  //LDI A, (HL)
+  //#0x2A:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
+  },
+  //DEC HL
+  //#0x2B:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
+  },
+  //INC L
+  //#0x2C:
+  function (parentObj) {
+    var L = (parentObj.registersHL + 1) & 0xFF;
+    parentObj.FZero = (L == 0);
+    parentObj.FHalfCarry = ((L & 0xF) == 0);
+    parentObj.FSubtract = false;
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | L;
+  },
+  //DEC L
+  //#0x2D:
+  function (parentObj) {
+    var L = (parentObj.registersHL - 1) & 0xFF;
+    parentObj.FZero = (L == 0);
+    parentObj.FHalfCarry = ((L & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | L;
+  },
+  //LD L, n
+  //#0x2E:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //CPL
+  //#0x2F:
+  function (parentObj) {
+    parentObj.registerA ^= 0xFF;
+    parentObj.FSubtract = parentObj.FHalfCarry = true;
+  },
+  //JR NC, n
+  //#0x30:
+  function (parentObj) {
+    if (!parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    }
+  },
+  //LD SP, nn
+  //#0x31:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //LDD (HL), A
+  //#0x32:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
+    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
+  },
+  //INC SP
+  //#0x33:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFFFF;
+  },
+  //INC (HL)
+  //#0x34:
+  function (parentObj) {
+    var temp_var = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) + 1) & 0xFF;
+    parentObj.FZero = (temp_var == 0);
+    parentObj.FHalfCarry = ((temp_var & 0xF) == 0);
+    parentObj.FSubtract = false;
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+  },
+  //DEC (HL)
+  //#0x35:
+  function (parentObj) {
+    var temp_var = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) - 1) & 0xFF;
+    parentObj.FZero = (temp_var == 0);
+    parentObj.FHalfCarry = ((temp_var & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+  },
+  //LD (HL), n
+  //#0x36:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //SCF
+  //#0x37:
+  function (parentObj) {
+    parentObj.FCarry = true;
+    parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //JR C, n
+  //#0x38:
+  function (parentObj) {
+    if (parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    }
+  },
+  //ADD HL, SP
+  //#0x39:
+  function (parentObj) {
+    var dirtySum = parentObj.registersHL + parentObj.stackPointer;
+    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
+    parentObj.FCarry = (dirtySum > 0xFFFF);
+    parentObj.registersHL = dirtySum & 0xFFFF;
+    parentObj.FSubtract = false;
+  },
+  //LDD A, (HL)
+  //#0x3A:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
+  },
+  //DEC SP
+  //#0x3B:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+  },
+  //INC A
+  //#0x3C:
+  function (parentObj) {
+    parentObj.registerA = (parentObj.registerA + 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) == 0);
+    parentObj.FSubtract = false;
+  },
+  //DEC A
+  //#0x3D:
+  function (parentObj) {
+    parentObj.registerA = (parentObj.registerA - 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) == 0xF);
+    parentObj.FSubtract = true;
+  },
+  //LD A, n
+  //#0x3E:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //CCF
+  //#0x3F:
+  function (parentObj) {
+    parentObj.FCarry = !parentObj.FCarry;
+    parentObj.FSubtract = parentObj.FHalfCarry = false;
+  },
+  //LD B, B
+  //#0x40:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD B, C
+  //#0x41:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registerC;
+  },
+  //LD B, D
+  //#0x42:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registerD;
+  },
+  //LD B, E
+  //#0x43:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registerE;
+  },
+  //LD B, H
+  //#0x44:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registersHL >> 8;
+  },
+  //LD B, L
+  //#0x45:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registersHL & 0xFF;
+  },
+  //LD B, (HL)
+  //#0x46:
+  function (parentObj) {
+    parentObj.registerB = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD B, A
+  //#0x47:
+  function (parentObj) {
+    parentObj.registerB = parentObj.registerA;
+  },
+  //LD C, B
+  //#0x48:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registerB;
+  },
+  //LD C, C
+  //#0x49:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD C, D
+  //#0x4A:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registerD;
+  },
+  //LD C, E
+  //#0x4B:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registerE;
+  },
+  //LD C, H
+  //#0x4C:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registersHL >> 8;
+  },
+  //LD C, L
+  //#0x4D:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registersHL & 0xFF;
+  },
+  //LD C, (HL)
+  //#0x4E:
+  function (parentObj) {
+    parentObj.registerC = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD C, A
+  //#0x4F:
+  function (parentObj) {
+    parentObj.registerC = parentObj.registerA;
+  },
+  //LD D, B
+  //#0x50:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registerB;
+  },
+  //LD D, C
+  //#0x51:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registerC;
+  },
+  //LD D, D
+  //#0x52:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD D, E
+  //#0x53:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registerE;
+  },
+  //LD D, H
+  //#0x54:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registersHL >> 8;
+  },
+  //LD D, L
+  //#0x55:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registersHL & 0xFF;
+  },
+  //LD D, (HL)
+  //#0x56:
+  function (parentObj) {
+    parentObj.registerD = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD D, A
+  //#0x57:
+  function (parentObj) {
+    parentObj.registerD = parentObj.registerA;
+  },
+  //LD E, B
+  //#0x58:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registerB;
+  },
+  //LD E, C
+  //#0x59:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registerC;
+  },
+  //LD E, D
+  //#0x5A:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registerD;
+  },
+  //LD E, E
+  //#0x5B:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD E, H
+  //#0x5C:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registersHL >> 8;
+  },
+  //LD E, L
+  //#0x5D:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registersHL & 0xFF;
+  },
+  //LD E, (HL)
+  //#0x5E:
+  function (parentObj) {
+    parentObj.registerE = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD E, A
+  //#0x5F:
+  function (parentObj) {
+    parentObj.registerE = parentObj.registerA;
+  },
+  //LD H, B
+  //#0x60:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registerB << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, C
+  //#0x61:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registerC << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, D
+  //#0x62:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registerD << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, E
+  //#0x63:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registerE << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, H
+  //#0x64:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD H, L
+  //#0x65:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF) * 0x101;
+  },
+  //LD H, (HL)
+  //#0x66:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD H, A
+  //#0x67:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registerA << 8) | (parentObj.registersHL & 0xFF);
+  },
+  //LD L, B
+  //#0x68:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerB;
+  },
+  //LD L, C
+  //#0x69:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerC;
+  },
+  //LD L, D
+  //#0x6A:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerD;
+  },
+  //LD L, E
+  //#0x6B:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerE;
+  },
+  //LD L, H
+  //#0x6C:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | (parentObj.registersHL >> 8);
+  },
+  //LD L, L
+  //#0x6D:
+  function (parentObj) {
+    //Do nothing...
+  },
+  //LD L, (HL)
+  //#0x6E:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD L, A
+  //#0x6F:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerA;
+  },
+  //LD (HL), B
+  //#0x70:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerB);
+  },
+  //LD (HL), C
+  //#0x71:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerC);
+  },
+  //LD (HL), D
+  //#0x72:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerD);
+  },
+  //LD (HL), E
+  //#0x73:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerE);
+  },
+  //LD (HL), H
+  //#0x74:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registersHL >> 8);
+  },
+  //LD (HL), L
+  //#0x75:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registersHL & 0xFF);
+  },
+  //HALT
+  //#0x76:
+  function (parentObj) {
+    //See if there's already an IRQ match:
+    if ((parentObj.interruptsEnabled & parentObj.interruptsRequested & 0x1F) > 0) {
+      if (!parentObj.cGBC && !parentObj.usedBootROM) {
+        //HALT bug in the DMG CPU model (Program Counter fails to increment for one instruction after HALT):
+        parentObj.skipPCIncrement = true;
+      }
+      else {
+        //CGB gets around the HALT PC bug by doubling the hidden NOP.
+        parentObj.CPUTicks += 4;
+      }
+    }
+    else {
+      //CPU is stalled until the next IRQ match:
+      parentObj.calculateHALTPeriod();
+    }
+  },
+  //LD (HL), A
+  //#0x77:
+  function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
+  },
+  //LD A, B
+  //#0x78:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registerB;
+  },
+  //LD A, C
+  //#0x79:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registerC;
+  },
+  //LD A, D
+  //#0x7A:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registerD;
+  },
+  //LD A, E
+  //#0x7B:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registerE;
+  },
+  //LD A, H
+  //#0x7C:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registersHL >> 8;
+  },
+  //LD A, L
+  //#0x7D:
+  function (parentObj) {
+    parentObj.registerA = parentObj.registersHL & 0xFF;
+  },
+  //LD, A, (HL)
+  //#0x7E:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+  },
+  //LD A, A
+  //#0x7F:
+  function (parentObj) {
+    //Do Nothing...
+  },
+  //ADD A, B
+  //#0x80:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerB;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, C
+  //#0x81:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerC;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, D
+  //#0x82:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerD;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, E
+  //#0x83:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerE;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, H
+  //#0x84:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + (parentObj.registersHL >> 8);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, L
+  //#0x85:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, (HL)
+  //#0x86:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADD A, A
+  //#0x87:
+  function (parentObj) {
+    parentObj.FHalfCarry = ((parentObj.registerA & 0x8) == 0x8);
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = (parentObj.registerA << 1) & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, B
+  //#0x88:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerB + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerB & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, C
+  //#0x89:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerC + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerC & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, D
+  //#0x8A:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerD + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerD & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, E
+  //#0x8B:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.registerE + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerE & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, H
+  //#0x8C:
+  function (parentObj) {
+    var tempValue = (parentObj.registersHL >> 8);
+    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, L
+  //#0x8D:
+  function (parentObj) {
+    var tempValue = (parentObj.registersHL & 0xFF);
+    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, (HL)
+  //#0x8E:
+  function (parentObj) {
+    var tempValue = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //ADC A, A
+  //#0x8F:
+  function (parentObj) {
+    //shift left register A one bit for some ops here as an optimization:
+    var dirtySum = (parentObj.registerA << 1) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((((parentObj.registerA << 1) & 0x1E) | ((parentObj.FCarry) ? 1 : 0)) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //SUB A, B
+  //#0x90:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerB;
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, C
+  //#0x91:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerC;
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, D
+  //#0x92:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerD;
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, E
+  //#0x93:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerE;
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, H
+  //#0x94:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - (parentObj.registersHL >> 8);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, L
+  //#0x95:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, (HL)
+  //#0x96:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //SUB A, A
+  //#0x97:
+  function (parentObj) {
+    //number - same number == 0
+    parentObj.registerA = 0;
+    parentObj.FHalfCarry = parentObj.FCarry = false;
+    parentObj.FZero = parentObj.FSubtract = true;
+  },
+  //SBC A, B
+  //#0x98:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerB - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerB & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, C
+  //#0x99:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerC - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerC & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, D
+  //#0x9A:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerD - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerD & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, E
+  //#0x9B:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerE - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerE & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, H
+  //#0x9C:
+  function (parentObj) {
+    var temp_var = parentObj.registersHL >> 8;
+    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, L
+  //#0x9D:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF) - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registersHL & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, (HL)
+  //#0x9E:
+  function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //SBC A, A
+  //#0x9F:
+  function (parentObj) {
+    //Optimized SBC A:
+    if (parentObj.FCarry) {
+      parentObj.FZero = false;
+      parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = true;
+      parentObj.registerA = 0xFF;
+    }
+    else {
+      parentObj.FHalfCarry = parentObj.FCarry = false;
+      parentObj.FSubtract = parentObj.FZero = true;
+      parentObj.registerA = 0;
+    }
+  },
+  //AND B
+  //#0xA0:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.registerB;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND C
+  //#0xA1:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.registerC;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND D
+  //#0xA2:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.registerD;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND E
+  //#0xA3:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.registerE;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND H
+  //#0xA4:
+  function (parentObj) {
+    parentObj.registerA &= (parentObj.registersHL >> 8);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND L
+  //#0xA5:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.registersHL;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND (HL)
+  //#0xA6:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //AND A
+  //#0xA7:
+  function (parentObj) {
+    //number & same number = same number
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //XOR B
+  //#0xA8:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.registerB;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR C
+  //#0xA9:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.registerC;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR D
+  //#0xAA:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.registerD;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR E
+  //#0xAB:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.registerE;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR H
+  //#0xAC:
+  function (parentObj) {
+    parentObj.registerA ^= (parentObj.registersHL >> 8);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR L
+  //#0xAD:
+  function (parentObj) {
+    parentObj.registerA ^= (parentObj.registersHL & 0xFF);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR (HL)
+  //#0xAE:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //XOR A
+  //#0xAF:
+  function (parentObj) {
+    //number ^ same number == 0
+    parentObj.registerA = 0;
+    parentObj.FZero = true;
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //OR B
+  //#0xB0:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.registerB;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR C
+  //#0xB1:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.registerC;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR D
+  //#0xB2:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.registerD;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR E
+  //#0xB3:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.registerE;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR H
+  //#0xB4:
+  function (parentObj) {
+    parentObj.registerA |= (parentObj.registersHL >> 8);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR L
+  //#0xB5:
+  function (parentObj) {
+    parentObj.registerA |= (parentObj.registersHL & 0xFF);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR (HL)
+  //#0xB6:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //OR A
+  //#0xB7:
+  function (parentObj) {
+    //number | same number == same number
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //CP B
+  //#0xB8:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerB;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP C
+  //#0xB9:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerC;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP D
+  //#0xBA:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerD;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP E
+  //#0xBB:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.registerE;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP H
+  //#0xBC:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - (parentObj.registersHL >> 8);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP L
+  //#0xBD:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP (HL)
+  //#0xBE:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //CP A
+  //#0xBF:
+  function (parentObj) {
+    parentObj.FHalfCarry = parentObj.FCarry = false;
+    parentObj.FZero = parentObj.FSubtract = true;
+  },
+  //RET !FZ
+  //#0xC0:
+  function (parentObj) {
+    if (!parentObj.FZero) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+      parentObj.CPUTicks += 12;
+    }
+  },
+  //POP BC
+  //#0xC1:
+  function (parentObj) {
+    parentObj.registerC = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.registerB = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+  },
+  //JP !FZ, nn
+  //#0xC2:
+  function (parentObj) {
+    if (!parentObj.FZero) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //JP nn
+  //#0xC3:
+  function (parentObj) {
+    parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+  },
+  //CALL !FZ, nn
+  //#0xC4:
+  function (parentObj) {
+    if (!parentObj.FZero) {
+      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+      parentObj.programCounter = temp_pc;
+      parentObj.CPUTicks += 12;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //PUSH BC
+  //#0xC5:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerB);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerC);
+  },
+  //ADD, n
+  //#0xC6:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA + parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //RST 0
+  //#0xC7:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0;
+  },
+  //RET FZ
+  //#0xC8:
+  function (parentObj) {
+    if (parentObj.FZero) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+      parentObj.CPUTicks += 12;
+    }
+  },
+  //RET
+  //#0xC9:
+  function (parentObj) {
+    parentObj.programCounter =  (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+  },
+  //JP FZ, nn
+  //#0xCA:
+  function (parentObj) {
+    if (parentObj.FZero) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //Secondary OP Code Set:
+  //#0xCB:
+  function (parentObj) {
+    var opcode = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    //Increment the program counter to the next instruction:
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    //Get how many CPU cycles the current 0xCBXX op code counts for:
+    parentObj.CPUTicks += parentObj.SecondaryTICKTable[opcode];
+    //Execute secondary OP codes for the 0xCB OP code call.
+    parentObj.CBOPCODE[opcode](parentObj);
+  },
+  //CALL FZ, nn
+  //#0xCC:
+  function (parentObj) {
+    if (parentObj.FZero) {
+      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+      parentObj.programCounter = temp_pc;
+      parentObj.CPUTicks += 12;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //CALL nn
+  //#0xCD:
+  function (parentObj) {
+    var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = temp_pc;
+  },
+  //ADC A, n
+  //#0xCE:
+  function (parentObj) {
+    var tempValue = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
+    parentObj.FCarry = (dirtySum > 0xFF);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = false;
+  },
+  //RST 0x8
+  //#0xCF:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x8;
+  },
+  //RET !FC
+  //#0xD0:
+  function (parentObj) {
+    if (!parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+      parentObj.CPUTicks += 12;
+    }
+  },
+  //POP DE
+  //#0xD1:
+  function (parentObj) {
+    parentObj.registerE = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.registerD = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+  },
+  //JP !FC, nn
+  //#0xD2:
+  function (parentObj) {
+    if (!parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //0xD3 - Illegal
+  //#0xD3:
+  function (parentObj) {
+    cout("Illegal op code 0xD3 called, pausing emulation.", 2);
+    pause();
+  },
+  //CALL !FC, nn
+  //#0xD4:
+  function (parentObj) {
+    if (!parentObj.FCarry) {
+      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+      parentObj.programCounter = temp_pc;
+      parentObj.CPUTicks += 12;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //PUSH DE
+  //#0xD5:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerD);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerE);
+  },
+  //SUB A, n
+  //#0xD6:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //RST 0x10
+  //#0xD7:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x10;
+  },
+  //RET FC
+  //#0xD8:
+  function (parentObj) {
+    if (parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+      parentObj.CPUTicks += 12;
+    }
+  },
+  //RETI
+  //#0xD9:
+  function (parentObj) {
+    parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+    //Immediate for HALT:
+    parentObj.IRQEnableDelay = (parentObj.IRQEnableDelay == 2 || parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) == 0x76) ? 1 : 2;
+  },
+  //JP FC, nn
+  //#0xDA:
+  function (parentObj) {
+    if (parentObj.FCarry) {
+      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.CPUTicks += 4;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //0xDB - Illegal
+  //#0xDB:
+  function (parentObj) {
+    cout("Illegal op code 0xDB called, pausing emulation.", 2);
+    pause();
+  },
+  //CALL FC, nn
+  //#0xDC:
+  function (parentObj) {
+    if (parentObj.FCarry) {
+      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+      parentObj.programCounter = temp_pc;
+      parentObj.CPUTicks += 12;
+    }
+    else {
+      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+    }
+  },
+  //0xDD - Illegal
+  //#0xDD:
+  function (parentObj) {
+    cout("Illegal op code 0xDD called, pausing emulation.", 2);
+    pause();
+  },
+  //SBC A, n
+  //#0xDE:
+  function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.registerA = dirtySum & 0xFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = true;
+  },
+  //RST 0x18
+  //#0xDF:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x18;
+  },
+  //LDH (n), A
+  //#0xE0:
+  function (parentObj) {
+    parentObj.memoryHighWrite(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter), parentObj.registerA);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //POP HL
+  //#0xE1:
+  function (parentObj) {
+    parentObj.registersHL = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+  },
+  //LD (0xFF00 + C), A
+  //#0xE2:
+  function (parentObj) {
+    parentObj.memoryHighWriter[parentObj.registerC](parentObj, parentObj.registerC, parentObj.registerA);
+  },
+  //0xE3 - Illegal
+  //#0xE3:
+  function (parentObj) {
+    cout("Illegal op code 0xE3 called, pausing emulation.", 2);
+    pause();
+  },
+  //0xE4 - Illegal
+  //#0xE4:
+  function (parentObj) {
+    cout("Illegal op code 0xE4 called, pausing emulation.", 2);
+    pause();
+  },
+  //PUSH HL
+  //#0xE5:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registersHL >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registersHL & 0xFF);
+  },
+  //AND n
+  //#0xE6:
+  function (parentObj) {
+    parentObj.registerA &= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = parentObj.FCarry = false;
+  },
+  //RST 0x20
+  //#0xE7:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x20;
+  },
+  //ADD SP, n
+  //#0xE8:
+  function (parentObj) {
+    var temp_value2 = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24;
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    var temp_value = (parentObj.stackPointer + temp_value2) & 0xFFFF;
+    temp_value2 = parentObj.stackPointer ^ temp_value2 ^ temp_value;
+    parentObj.stackPointer = temp_value;
+    parentObj.FCarry = ((temp_value2 & 0x100) == 0x100);
+    parentObj.FHalfCarry = ((temp_value2 & 0x10) == 0x10);
+    parentObj.FZero = parentObj.FSubtract = false;
+  },
+  //JP, (HL)
+  //#0xE9:
+  function (parentObj) {
+    parentObj.programCounter = parentObj.registersHL;
+  },
+  //LD n, A
+  //#0xEA:
+  function (parentObj) {
+    parentObj.memoryWrite((parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter), parentObj.registerA);
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //0xEB - Illegal
+  //#0xEB:
+  function (parentObj) {
+    cout("Illegal op code 0xEB called, pausing emulation.", 2);
+    pause();
+  },
+  //0xEC - Illegal
+  //#0xEC:
+  function (parentObj) {
+    cout("Illegal op code 0xEC called, pausing emulation.", 2);
+    pause();
+  },
+  //0xED - Illegal
+  //#0xED:
+  function (parentObj) {
+    cout("Illegal op code 0xED called, pausing emulation.", 2);
+    pause();
+  },
+  //XOR n
+  //#0xEE:
+  function (parentObj) {
+    parentObj.registerA ^= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
+  },
+  //RST 0x28
+  //#0xEF:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x28;
+  },
+  //LDH A, (n)
+  //#0xF0:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryHighRead(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+  },
+  //POP AF
+  //#0xF1:
+  function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
+    parentObj.FZero = (temp_var > 0x7F);
+    parentObj.FSubtract = ((temp_var & 0x40) == 0x40);
+    parentObj.FHalfCarry = ((temp_var & 0x20) == 0x20);
+    parentObj.FCarry = ((temp_var & 0x10) == 0x10);
+    parentObj.registerA = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
+    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
+  },
+  //LD A, (0xFF00 + C)
+  //#0xF2:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryHighReader[parentObj.registerC](parentObj, parentObj.registerC);
+  },
+  //DI
+  //#0xF3:
+  function (parentObj) {
+    parentObj.IME = false;
+    parentObj.IRQEnableDelay = 0;
+  },
+  //0xF4 - Illegal
+  //#0xF4:
+  function (parentObj) {
+    cout("Illegal op code 0xF4 called, pausing emulation.", 2);
+    pause();
+  },
+  //PUSH AF
+  //#0xF5:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerA);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, ((parentObj.FZero) ? 0x80 : 0) | ((parentObj.FSubtract) ? 0x40 : 0) | ((parentObj.FHalfCarry) ? 0x20 : 0) | ((parentObj.FCarry) ? 0x10 : 0));
+  },
+  //OR n
+  //#0xF6:
+  function (parentObj) {
+    parentObj.registerA |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
+  },
+  //RST 0x30
+  //#0xF7:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x30;
+  },
+  //LDHL SP, n
+  //#0xF8:
+  function (parentObj) {
+    var temp_var = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24;
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.registersHL = (parentObj.stackPointer + temp_var) & 0xFFFF;
+    temp_var = parentObj.stackPointer ^ temp_var ^ parentObj.registersHL;
+    parentObj.FCarry = ((temp_var & 0x100) == 0x100);
+    parentObj.FHalfCarry = ((temp_var & 0x10) == 0x10);
+    parentObj.FZero = parentObj.FSubtract = false;
+  },
+  //LD SP, HL
+  //#0xF9:
+  function (parentObj) {
+    parentObj.stackPointer = parentObj.registersHL;
+  },
+  //LD A, (nn)
+  //#0xFA:
+  function (parentObj) {
+    parentObj.registerA = parentObj.memoryRead((parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
+    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
+  },
+  //EI
+  //#0xFB:
+  function (parentObj) {
+    //Immediate for HALT:
+    parentObj.IRQEnableDelay = (parentObj.IRQEnableDelay == 2 || parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) == 0x76) ? 1 : 2;
+  },
+  //0xFC - Illegal
+  //#0xFC:
+  function (parentObj) {
+    cout("Illegal op code 0xFC called, pausing emulation.", 2);
+    pause();
+  },
+  //0xFD - Illegal
+  //#0xFD:
+  function (parentObj) {
+    cout("Illegal op code 0xFD called, pausing emulation.", 2);
+    pause();
+  },
+  //CP n
+  //#0xFE:
+  function (parentObj) {
+    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
+    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
+    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
+    parentObj.FCarry = (dirtySum < 0);
+    parentObj.FZero = (dirtySum == 0);
+    parentObj.FSubtract = true;
+  },
+  //RST 0x38
+  //#0xFF:
+  function (parentObj) {
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
+    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
+    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
+    parentObj.programCounter = 0x38;
+  }
+];
+GameBoyCore.prototype.CBOPCODE = [
+  //RLC B
+  //#0x00:
+  function (parentObj) {
+    parentObj.FCarry = (parentObj.registerB > 0x7F);
+    parentObj.registerB = ((parentObj.registerB << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //RLC C
+  //#0x01:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerC > 0x7F);
+    parentObj.registerC = ((parentObj.registerC << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //RLC D
+  //#0x02:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerD > 0x7F);
+    parentObj.registerD = ((parentObj.registerD << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //RLC E
+  //#0x03:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerE > 0x7F);
+    parentObj.registerE = ((parentObj.registerE << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //RLC H
+  //#0x04:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
+    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | ((parentObj.FCarry) ? 0x100 : 0) | (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //RLC L
+  //#0x05:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x80) == 0x80);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //RLC (HL)
+  //#0x06:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FCarry = (temp_var > 0x7F);
+    temp_var = ((temp_var << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //RLC A
+  //#0x07:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //RRC B
+  //#0x08:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
+    parentObj.registerB = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerB >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //RRC C
+  //#0x09:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
+    parentObj.registerC = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerC >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //RRC D
+  //#0x0A:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
+    parentObj.registerD = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerD >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //RRC E
+  //#0x0B:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
+    parentObj.registerE = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerE >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //RRC H
+  //#0x0C:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
+    parentObj.registersHL = ((parentObj.FCarry) ? 0x8000 : 0) | ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //RRC L
+  //#0x0D:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x01) == 0x01);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.FCarry) ? 0x80 : 0) | ((parentObj.registersHL & 0xFF) >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //RRC (HL)
+  //#0x0E:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
+    temp_var = ((parentObj.FCarry) ? 0x80 : 0) | (temp_var >> 1);
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //RRC A
+  //#0x0F:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
+    parentObj.registerA = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerA >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //RL B
+  //#0x10:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registerB > 0x7F);
+    parentObj.registerB = ((parentObj.registerB << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //RL C
+  //#0x11:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registerC > 0x7F);
+    parentObj.registerC = ((parentObj.registerC << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //RL D
+  //#0x12:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registerD > 0x7F);
+    parentObj.registerD = ((parentObj.registerD << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //RL E
+  //#0x13:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registerE > 0x7F);
+    parentObj.registerE = ((parentObj.registerE << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //RL H
+  //#0x14:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registersHL > 0x7FFF);
+    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | ((parentObj.FCarry) ? 0x100 : 0) | (parentObj.registersHL & 0xFF);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //RL L
+  //#0x15:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registersHL & 0x80) == 0x80);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //RL (HL)
+  //#0x16:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    var newFCarry = (temp_var > 0x7F);
+    temp_var = ((temp_var << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //RL A
+  //#0x17:
+  ,function (parentObj) {
+    var newFCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //RR B
+  //#0x18:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registerB & 0x01) == 0x01);
+    parentObj.registerB = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerB >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //RR C
+  //#0x19:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registerC & 0x01) == 0x01);
+    parentObj.registerC = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerC >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //RR D
+  //#0x1A:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registerD & 0x01) == 0x01);
+    parentObj.registerD = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerD >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //RR E
+  //#0x1B:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registerE & 0x01) == 0x01);
+    parentObj.registerE = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerE >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //RR H
+  //#0x1C:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
+    parentObj.registersHL = ((parentObj.FCarry) ? 0x8000 : 0) | ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //RR L
+  //#0x1D:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registersHL & 0x01) == 0x01);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.FCarry) ? 0x80 : 0) | ((parentObj.registersHL & 0xFF) >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //RR (HL)
+  //#0x1E:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    var newFCarry = ((temp_var & 0x01) == 0x01);
+    temp_var = ((parentObj.FCarry) ? 0x80 : 0) | (temp_var >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //RR A
+  //#0x1F:
+  ,function (parentObj) {
+    var newFCarry = ((parentObj.registerA & 0x01) == 0x01);
+    parentObj.registerA = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerA >> 1);
+    parentObj.FCarry = newFCarry;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //SLA B
+  //#0x20:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerB > 0x7F);
+    parentObj.registerB = (parentObj.registerB << 1) & 0xFF;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //SLA C
+  //#0x21:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerC > 0x7F);
+    parentObj.registerC = (parentObj.registerC << 1) & 0xFF;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //SLA D
+  //#0x22:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerD > 0x7F);
+    parentObj.registerD = (parentObj.registerD << 1) & 0xFF;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //SLA E
+  //#0x23:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerE > 0x7F);
+    parentObj.registerE = (parentObj.registerE << 1) & 0xFF;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //SLA H
+  //#0x24:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
+    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //SLA L
+  //#0x25:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0080) == 0x0080);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //SLA (HL)
+  //#0x26:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FCarry = (temp_var > 0x7F);
+    temp_var = (temp_var << 1) & 0xFF;
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //SLA A
+  //#0x27:
+  ,function (parentObj) {
+    parentObj.FCarry = (parentObj.registerA > 0x7F);
+    parentObj.registerA = (parentObj.registerA << 1) & 0xFF;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //SRA B
+  //#0x28:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
+    parentObj.registerB = (parentObj.registerB & 0x80) | (parentObj.registerB >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //SRA C
+  //#0x29:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
+    parentObj.registerC = (parentObj.registerC & 0x80) | (parentObj.registerC >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //SRA D
+  //#0x2A:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
+    parentObj.registerD = (parentObj.registerD & 0x80) | (parentObj.registerD >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //SRA E
+  //#0x2B:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
+    parentObj.registerE = (parentObj.registerE & 0x80) | (parentObj.registerE >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //SRA H
+  //#0x2C:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
+    parentObj.registersHL = ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0x80FF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //SRA L
+  //#0x2D:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0001) == 0x0001);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF80) | ((parentObj.registersHL & 0xFF) >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //SRA (HL)
+  //#0x2E:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
+    temp_var = (temp_var & 0x80) | (temp_var >> 1);
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var == 0);
+  }
+  //SRA A
+  //#0x2F:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
+    parentObj.registerA = (parentObj.registerA & 0x80) | (parentObj.registerA >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //SWAP B
+  //#0x30:
+  ,function (parentObj) {
+    parentObj.registerB = ((parentObj.registerB & 0xF) << 4) | (parentObj.registerB >> 4);
+    parentObj.FZero = (parentObj.registerB == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP C
+  //#0x31:
+  ,function (parentObj) {
+    parentObj.registerC = ((parentObj.registerC & 0xF) << 4) | (parentObj.registerC >> 4);
+    parentObj.FZero = (parentObj.registerC == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP D
+  //#0x32:
+  ,function (parentObj) {
+    parentObj.registerD = ((parentObj.registerD & 0xF) << 4) | (parentObj.registerD >> 4);
+    parentObj.FZero = (parentObj.registerD == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP E
+  //#0x33:
+  ,function (parentObj) {
+    parentObj.registerE = ((parentObj.registerE & 0xF) << 4) | (parentObj.registerE >> 4);
+    parentObj.FZero = (parentObj.registerE == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP H
+  //#0x34:
+  ,function (parentObj) {
+    parentObj.registersHL = ((parentObj.registersHL & 0xF00) << 4) | ((parentObj.registersHL & 0xF000) >> 4) | (parentObj.registersHL & 0xFF);
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP L
+  //#0x35:
+  ,function (parentObj) {
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL & 0xF) << 4) | ((parentObj.registersHL & 0xF0) >> 4);
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP (HL)
+  //#0x36:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    temp_var = ((temp_var & 0xF) << 4) | (temp_var >> 4);
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
+    parentObj.FZero = (temp_var == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SWAP A
+  //#0x37:
+  ,function (parentObj) {
+    parentObj.registerA = ((parentObj.registerA & 0xF) << 4) | (parentObj.registerA >> 4);
+    parentObj.FZero = (parentObj.registerA == 0);
+    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
+  }
+  //SRL B
+  //#0x38:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
+    parentObj.registerB >>= 1;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerB == 0);
+  }
+  //SRL C
+  //#0x39:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
+    parentObj.registerC >>= 1;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerC == 0);
+  }
+  //SRL D
+  //#0x3A:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
+    parentObj.registerD >>= 1;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerD == 0);
+  }
+  //SRL E
+  //#0x3B:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
+    parentObj.registerE >>= 1;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerE == 0);
+  }
+  //SRL H
+  //#0x3C:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
+    parentObj.registersHL = ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registersHL < 0x100);
+  }
+  //SRL L
+  //#0x3D:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registersHL & 0x0001) == 0x0001);
+    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL & 0xFF) >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
+  }
+  //SRL (HL)
+  //#0x3E:
+  ,function (parentObj) {
+    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
+    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var >> 1);
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (temp_var < 2);
+  }
+  //SRL A
+  //#0x3F:
+  ,function (parentObj) {
+    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
+    parentObj.registerA >>= 1;
+    parentObj.FHalfCarry = parentObj.FSubtract = false;
+    parentObj.FZero = (parentObj.registerA == 0);
+  }
+  //BIT 0, B
+  //#0x40:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x01) == 0);
+  }
+  //BIT 0, C
+  //#0x41:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x01) == 0);
+  }
+  //BIT 0, D
+  //#0x42:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x01) == 0);
+  }
+  //BIT 0, E
+  //#0x43:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x01) == 0);
+  }
+  //BIT 0, H
+  //#0x44:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0100) == 0);
+  }
+  //BIT 0, L
+  //#0x45:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0001) == 0);
+  }
+  //BIT 0, (HL)
+  //#0x46:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x01) == 0);
+  }
+  //BIT 0, A
+  //#0x47:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x01) == 0);
+  }
+  //BIT 1, B
+  //#0x48:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x02) == 0);
+  }
+  //BIT 1, C
+  //#0x49:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x02) == 0);
+  }
+  //BIT 1, D
+  //#0x4A:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x02) == 0);
+  }
+  //BIT 1, E
+  //#0x4B:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x02) == 0);
+  }
+  //BIT 1, H
+  //#0x4C:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0200) == 0);
+  }
+  //BIT 1, L
+  //#0x4D:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0002) == 0);
+  }
+  //BIT 1, (HL)
+  //#0x4E:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x02) == 0);
+  }
+  //BIT 1, A
+  //#0x4F:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x02) == 0);
+  }
+  //BIT 2, B
+  //#0x50:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x04) == 0);
+  }
+  //BIT 2, C
+  //#0x51:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x04) == 0);
+  }
+  //BIT 2, D
+  //#0x52:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x04) == 0);
+  }
+  //BIT 2, E
+  //#0x53:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x04) == 0);
+  }
+  //BIT 2, H
+  //#0x54:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0400) == 0);
+  }
+  //BIT 2, L
+  //#0x55:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0004) == 0);
+  }
+  //BIT 2, (HL)
+  //#0x56:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x04) == 0);
+  }
+  //BIT 2, A
+  //#0x57:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x04) == 0);
+  }
+  //BIT 3, B
+  //#0x58:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x08) == 0);
+  }
+  //BIT 3, C
+  //#0x59:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x08) == 0);
+  }
+  //BIT 3, D
+  //#0x5A:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x08) == 0);
+  }
+  //BIT 3, E
+  //#0x5B:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x08) == 0);
+  }
+  //BIT 3, H
+  //#0x5C:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0800) == 0);
+  }
+  //BIT 3, L
+  //#0x5D:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0008) == 0);
+  }
+  //BIT 3, (HL)
+  //#0x5E:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x08) == 0);
+  }
+  //BIT 3, A
+  //#0x5F:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x08) == 0);
+  }
+  //BIT 4, B
+  //#0x60:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x10) == 0);
+  }
+  //BIT 4, C
+  //#0x61:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x10) == 0);
+  }
+  //BIT 4, D
+  //#0x62:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x10) == 0);
+  }
+  //BIT 4, E
+  //#0x63:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x10) == 0);
+  }
+  //BIT 4, H
+  //#0x64:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x1000) == 0);
+  }
+  //BIT 4, L
+  //#0x65:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0010) == 0);
+  }
+  //BIT 4, (HL)
+  //#0x66:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x10) == 0);
+  }
+  //BIT 4, A
+  //#0x67:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x10) == 0);
+  }
+  //BIT 5, B
+  //#0x68:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x20) == 0);
+  }
+  //BIT 5, C
+  //#0x69:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x20) == 0);
+  }
+  //BIT 5, D
+  //#0x6A:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x20) == 0);
+  }
+  //BIT 5, E
+  //#0x6B:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x20) == 0);
+  }
+  //BIT 5, H
+  //#0x6C:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x2000) == 0);
+  }
+  //BIT 5, L
+  //#0x6D:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0020) == 0);
+  }
+  //BIT 5, (HL)
+  //#0x6E:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x20) == 0);
+  }
+  //BIT 5, A
+  //#0x6F:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x20) == 0);
+  }
+  //BIT 6, B
+  //#0x70:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x40) == 0);
+  }
+  //BIT 6, C
+  //#0x71:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x40) == 0);
+  }
+  //BIT 6, D
+  //#0x72:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x40) == 0);
+  }
+  //BIT 6, E
+  //#0x73:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x40) == 0);
+  }
+  //BIT 6, H
+  //#0x74:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x4000) == 0);
+  }
+  //BIT 6, L
+  //#0x75:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0040) == 0);
+  }
+  //BIT 6, (HL)
+  //#0x76:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x40) == 0);
+  }
+  //BIT 6, A
+  //#0x77:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x40) == 0);
+  }
+  //BIT 7, B
+  //#0x78:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerB & 0x80) == 0);
+  }
+  //BIT 7, C
+  //#0x79:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerC & 0x80) == 0);
+  }
+  //BIT 7, D
+  //#0x7A:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerD & 0x80) == 0);
+  }
+  //BIT 7, E
+  //#0x7B:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerE & 0x80) == 0);
+  }
+  //BIT 7, H
+  //#0x7C:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x8000) == 0);
+  }
+  //BIT 7, L
+  //#0x7D:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registersHL & 0x0080) == 0);
+  }
+  //BIT 7, (HL)
+  //#0x7E:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x80) == 0);
+  }
+  //BIT 7, A
+  //#0x7F:
+  ,function (parentObj) {
+    parentObj.FHalfCarry = true;
+    parentObj.FSubtract = false;
+    parentObj.FZero = ((parentObj.registerA & 0x80) == 0);
+  }
+  //RES 0, B
+  //#0x80:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xFE;
+  }
+  //RES 0, C
+  //#0x81:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xFE;
+  }
+  //RES 0, D
+  //#0x82:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xFE;
+  }
+  //RES 0, E
+  //#0x83:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xFE;
+  }
+  //RES 0, H
+  //#0x84:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFEFF;
+  }
+  //RES 0, L
+  //#0x85:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFFE;
+  }
+  //RES 0, (HL)
+  //#0x86:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFE);
+  }
+  //RES 0, A
+  //#0x87:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xFE;
+  }
+  //RES 1, B
+  //#0x88:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xFD;
+  }
+  //RES 1, C
+  //#0x89:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xFD;
+  }
+  //RES 1, D
+  //#0x8A:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xFD;
+  }
+  //RES 1, E
+  //#0x8B:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xFD;
+  }
+  //RES 1, H
+  //#0x8C:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFDFF;
+  }
+  //RES 1, L
+  //#0x8D:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFFD;
+  }
+  //RES 1, (HL)
+  //#0x8E:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFD);
+  }
+  //RES 1, A
+  //#0x8F:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xFD;
+  }
+  //RES 2, B
+  //#0x90:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xFB;
+  }
+  //RES 2, C
+  //#0x91:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xFB;
+  }
+  //RES 2, D
+  //#0x92:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xFB;
+  }
+  //RES 2, E
+  //#0x93:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xFB;
+  }
+  //RES 2, H
+  //#0x94:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFBFF;
+  }
+  //RES 2, L
+  //#0x95:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFFB;
+  }
+  //RES 2, (HL)
+  //#0x96:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFB);
+  }
+  //RES 2, A
+  //#0x97:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xFB;
+  }
+  //RES 3, B
+  //#0x98:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xF7;
+  }
+  //RES 3, C
+  //#0x99:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xF7;
+  }
+  //RES 3, D
+  //#0x9A:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xF7;
+  }
+  //RES 3, E
+  //#0x9B:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xF7;
+  }
+  //RES 3, H
+  //#0x9C:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xF7FF;
+  }
+  //RES 3, L
+  //#0x9D:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFF7;
+  }
+  //RES 3, (HL)
+  //#0x9E:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xF7);
+  }
+  //RES 3, A
+  //#0x9F:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xF7;
+  }
+  //RES 3, B
+  //#0xA0:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xEF;
+  }
+  //RES 4, C
+  //#0xA1:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xEF;
+  }
+  //RES 4, D
+  //#0xA2:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xEF;
+  }
+  //RES 4, E
+  //#0xA3:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xEF;
+  }
+  //RES 4, H
+  //#0xA4:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xEFFF;
+  }
+  //RES 4, L
+  //#0xA5:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFEF;
+  }
+  //RES 4, (HL)
+  //#0xA6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xEF);
+  }
+  //RES 4, A
+  //#0xA7:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xEF;
+  }
+  //RES 5, B
+  //#0xA8:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xDF;
+  }
+  //RES 5, C
+  //#0xA9:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xDF;
+  }
+  //RES 5, D
+  //#0xAA:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xDF;
+  }
+  //RES 5, E
+  //#0xAB:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xDF;
+  }
+  //RES 5, H
+  //#0xAC:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xDFFF;
+  }
+  //RES 5, L
+  //#0xAD:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFDF;
+  }
+  //RES 5, (HL)
+  //#0xAE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xDF);
+  }
+  //RES 5, A
+  //#0xAF:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xDF;
+  }
+  //RES 6, B
+  //#0xB0:
+  ,function (parentObj) {
+    parentObj.registerB &= 0xBF;
+  }
+  //RES 6, C
+  //#0xB1:
+  ,function (parentObj) {
+    parentObj.registerC &= 0xBF;
+  }
+  //RES 6, D
+  //#0xB2:
+  ,function (parentObj) {
+    parentObj.registerD &= 0xBF;
+  }
+  //RES 6, E
+  //#0xB3:
+  ,function (parentObj) {
+    parentObj.registerE &= 0xBF;
+  }
+  //RES 6, H
+  //#0xB4:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xBFFF;
+  }
+  //RES 6, L
+  //#0xB5:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFFBF;
+  }
+  //RES 6, (HL)
+  //#0xB6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xBF);
+  }
+  //RES 6, A
+  //#0xB7:
+  ,function (parentObj) {
+    parentObj.registerA &= 0xBF;
+  }
+  //RES 7, B
+  //#0xB8:
+  ,function (parentObj) {
+    parentObj.registerB &= 0x7F;
+  }
+  //RES 7, C
+  //#0xB9:
+  ,function (parentObj) {
+    parentObj.registerC &= 0x7F;
+  }
+  //RES 7, D
+  //#0xBA:
+  ,function (parentObj) {
+    parentObj.registerD &= 0x7F;
+  }
+  //RES 7, E
+  //#0xBB:
+  ,function (parentObj) {
+    parentObj.registerE &= 0x7F;
+  }
+  //RES 7, H
+  //#0xBC:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0x7FFF;
+  }
+  //RES 7, L
+  //#0xBD:
+  ,function (parentObj) {
+    parentObj.registersHL &= 0xFF7F;
+  }
+  //RES 7, (HL)
+  //#0xBE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x7F);
+  }
+  //RES 7, A
+  //#0xBF:
+  ,function (parentObj) {
+    parentObj.registerA &= 0x7F;
+  }
+  //SET 0, B
+  //#0xC0:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x01;
+  }
+  //SET 0, C
+  //#0xC1:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x01;
+  }
+  //SET 0, D
+  //#0xC2:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x01;
+  }
+  //SET 0, E
+  //#0xC3:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x01;
+  }
+  //SET 0, H
+  //#0xC4:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x0100;
+  }
+  //SET 0, L
+  //#0xC5:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x01;
+  }
+  //SET 0, (HL)
+  //#0xC6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x01);
+  }
+  //SET 0, A
+  //#0xC7:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x01;
+  }
+  //SET 1, B
+  //#0xC8:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x02;
+  }
+  //SET 1, C
+  //#0xC9:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x02;
+  }
+  //SET 1, D
+  //#0xCA:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x02;
+  }
+  //SET 1, E
+  //#0xCB:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x02;
+  }
+  //SET 1, H
+  //#0xCC:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x0200;
+  }
+  //SET 1, L
+  //#0xCD:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x02;
+  }
+  //SET 1, (HL)
+  //#0xCE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x02);
+  }
+  //SET 1, A
+  //#0xCF:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x02;
+  }
+  //SET 2, B
+  //#0xD0:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x04;
+  }
+  //SET 2, C
+  //#0xD1:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x04;
+  }
+  //SET 2, D
+  //#0xD2:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x04;
+  }
+  //SET 2, E
+  //#0xD3:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x04;
+  }
+  //SET 2, H
+  //#0xD4:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x0400;
+  }
+  //SET 2, L
+  //#0xD5:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x04;
+  }
+  //SET 2, (HL)
+  //#0xD6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x04);
+  }
+  //SET 2, A
+  //#0xD7:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x04;
+  }
+  //SET 3, B
+  //#0xD8:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x08;
+  }
+  //SET 3, C
+  //#0xD9:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x08;
+  }
+  //SET 3, D
+  //#0xDA:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x08;
+  }
+  //SET 3, E
+  //#0xDB:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x08;
+  }
+  //SET 3, H
+  //#0xDC:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x0800;
+  }
+  //SET 3, L
+  //#0xDD:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x08;
+  }
+  //SET 3, (HL)
+  //#0xDE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x08);
+  }
+  //SET 3, A
+  //#0xDF:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x08;
+  }
+  //SET 4, B
+  //#0xE0:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x10;
+  }
+  //SET 4, C
+  //#0xE1:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x10;
+  }
+  //SET 4, D
+  //#0xE2:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x10;
+  }
+  //SET 4, E
+  //#0xE3:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x10;
+  }
+  //SET 4, H
+  //#0xE4:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x1000;
+  }
+  //SET 4, L
+  //#0xE5:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x10;
+  }
+  //SET 4, (HL)
+  //#0xE6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x10);
+  }
+  //SET 4, A
+  //#0xE7:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x10;
+  }
+  //SET 5, B
+  //#0xE8:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x20;
+  }
+  //SET 5, C
+  //#0xE9:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x20;
+  }
+  //SET 5, D
+  //#0xEA:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x20;
+  }
+  //SET 5, E
+  //#0xEB:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x20;
+  }
+  //SET 5, H
+  //#0xEC:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x2000;
+  }
+  //SET 5, L
+  //#0xED:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x20;
+  }
+  //SET 5, (HL)
+  //#0xEE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x20);
+  }
+  //SET 5, A
+  //#0xEF:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x20;
+  }
+  //SET 6, B
+  //#0xF0:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x40;
+  }
+  //SET 6, C
+  //#0xF1:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x40;
+  }
+  //SET 6, D
+  //#0xF2:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x40;
+  }
+  //SET 6, E
+  //#0xF3:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x40;
+  }
+  //SET 6, H
+  //#0xF4:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x4000;
+  }
+  //SET 6, L
+  //#0xF5:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x40;
+  }
+  //SET 6, (HL)
+  //#0xF6:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x40);
+  }
+  //SET 6, A
+  //#0xF7:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x40;
+  }
+  //SET 7, B
+  //#0xF8:
+  ,function (parentObj) {
+    parentObj.registerB |= 0x80;
+  }
+  //SET 7, C
+  //#0xF9:
+  ,function (parentObj) {
+    parentObj.registerC |= 0x80;
+  }
+  //SET 7, D
+  //#0xFA:
+  ,function (parentObj) {
+    parentObj.registerD |= 0x80;
+  }
+  //SET 7, E
+  //#0xFB:
+  ,function (parentObj) {
+    parentObj.registerE |= 0x80;
+  }
+  //SET 7, H
+  //#0xFC:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x8000;
+  }
+  //SET 7, L
+  //#0xFD:
+  ,function (parentObj) {
+    parentObj.registersHL |= 0x80;
+  }
+  //SET 7, (HL)
+  //#0xFE:
+  ,function (parentObj) {
+    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x80);
+  }
+  //SET 7, A
+  //#0xFF:
+  ,function (parentObj) {
+    parentObj.registerA |= 0x80;
+  }
+];
+GameBoyCore.prototype.TICKTable = [    //Number of machine cycles for each instruction:
+/*   0,  1,  2,  3,  4,  5,  6,  7,      8,  9,  A, B,  C,  D, E,  F*/
+     4, 12,  8,  8,  4,  4,  8,  4,     20,  8,  8, 8,  4,  4, 8,  4,  //0
+     4, 12,  8,  8,  4,  4,  8,  4,     12,  8,  8, 8,  4,  4, 8,  4,  //1
+     8, 12,  8,  8,  4,  4,  8,  4,      8,  8,  8, 8,  4,  4, 8,  4,  //2
+     8, 12,  8,  8, 12, 12, 12,  4,      8,  8,  8, 8,  4,  4, 8,  4,  //3
+
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //4
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //5
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //6
+     8,  8,  8,  8,  8,  8,  4,  8,      4,  4,  4, 4,  4,  4, 8,  4,  //7
+
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //8
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //9
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //A
+     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //B
+
+     8, 12, 12, 16, 12, 16,  8, 16,      8, 16, 12, 0, 12, 24, 8, 16,  //C
+     8, 12, 12,  4, 12, 16,  8, 16,      8, 16, 12, 4, 12,  4, 8, 16,  //D
+    12, 12,  8,  4,  4, 16,  8, 16,     16,  4, 16, 4,  4,  4, 8, 16,  //E
+    12, 12,  8,  4,  4, 16,  8, 16,     12,  8, 16, 4,  0,  4, 8, 16   //F
+];
+GameBoyCore.prototype.SecondaryTICKTable = [  //Number of machine cycles for each 0xCBXX instruction:
+/*  0, 1, 2, 3, 4, 5,  6, 7,        8, 9, A, B, C, D,  E, F*/
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //0
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //1
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //2
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //3
+
+    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //4
+    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //5
+    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //6
+    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //7
+
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //8
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //9
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //A
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //B
+
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //C
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //D
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //E
+    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8   //F
+];
+GameBoyCore.prototype.saveSRAMState = function () {
+  if (!this.cBATT || this.MBCRam.length == 0) {
+    //No battery backup...
+    return [];
+  }
+  else {
+    //Return the MBC RAM for backup...
+    return this.fromTypedArray(this.MBCRam);
+  }
+}
+GameBoyCore.prototype.saveRTCState = function () {
+  if (!this.cTIMER) {
+    //No battery backup...
+    return [];
+  }
+  else {
+    //Return the MBC RAM for backup...
+    return [
+      this.lastIteration,
+      this.RTCisLatched,
+      this.latchedSeconds,
+      this.latchedMinutes,
+      this.latchedHours,
+      this.latchedLDays,
+      this.latchedHDays,
+      this.RTCSeconds,
+      this.RTCMinutes,
+      this.RTCHours,
+      this.RTCDays,
+      this.RTCDayOverFlow,
+      this.RTCHALT
+    ];
+  }
+}
+GameBoyCore.prototype.saveState = function () {
+  return [
+    this.fromTypedArray(this.ROM),
+    this.inBootstrap,
+    this.registerA,
+    this.FZero,
+    this.FSubtract,
+    this.FHalfCarry,
+    this.FCarry,
+    this.registerB,
+    this.registerC,
+    this.registerD,
+    this.registerE,
+    this.registersHL,
+    this.stackPointer,
+    this.programCounter,
+    this.halt,
+    this.IME,
+    this.hdmaRunning,
+    this.CPUTicks,
+    this.doubleSpeedShifter,
+    this.fromTypedArray(this.memory),
+    this.fromTypedArray(this.MBCRam),
+    this.fromTypedArray(this.VRAM),
+    this.currVRAMBank,
+    this.fromTypedArray(this.GBCMemory),
+    this.MBC1Mode,
+    this.MBCRAMBanksEnabled,
+    this.currMBCRAMBank,
+    this.currMBCRAMBankPosition,
+    this.cGBC,
+    this.gbcRamBank,
+    this.gbcRamBankPosition,
+    this.ROMBank1offs,
+    this.currentROMBank,
+    this.cartridgeType,
+    this.name,
+    this.gameCode,
+    this.modeSTAT,
+    this.LYCMatchTriggerSTAT,
+    this.mode2TriggerSTAT,
+    this.mode1TriggerSTAT,
+    this.mode0TriggerSTAT,
+    this.LCDisOn,
+    this.gfxWindowCHRBankPosition,
+    this.gfxWindowDisplay,
+    this.gfxSpriteShow,
+    this.gfxSpriteNormalHeight,
+    this.gfxBackgroundCHRBankPosition,
+    this.gfxBackgroundBankOffset,
+    this.TIMAEnabled,
+    this.DIVTicks,
+    this.LCDTicks,
+    this.timerTicks,
+    this.TACClocker,
+    this.serialTimer,
+    this.serialShiftTimer,
+    this.serialShiftTimerAllocated,
+    this.IRQEnableDelay,
+    this.lastIteration,
+    this.cMBC1,
+    this.cMBC2,
+    this.cMBC3,
+    this.cMBC5,
+    this.cMBC7,
+    this.cSRAM,
+    this.cMMMO1,
+    this.cRUMBLE,
+    this.cCamera,
+    this.cTAMA5,
+    this.cHuC3,
+    this.cHuC1,
+    this.drewBlank,
+    this.fromTypedArray(this.frameBuffer),
+    this.bgEnabled,
+    this.BGPriorityEnabled,
+    this.channel1FrequencyTracker,
+    this.channel1FrequencyCounter,
+    this.channel1totalLength,
+    this.channel1envelopeVolume,
+    this.channel1envelopeType,
+    this.channel1envelopeSweeps,
+    this.channel1envelopeSweepsLast,
+    this.channel1consecutive,
+    this.channel1frequency,
+    this.channel1SweepFault,
+    this.channel1ShadowFrequency,
+    this.channel1timeSweep,
+    this.channel1lastTimeSweep,
+    this.channel1numSweep,
+    this.channel1frequencySweepDivider,
+    this.channel1decreaseSweep,
+    this.channel2FrequencyTracker,
+    this.channel2FrequencyCounter,
+    this.channel2totalLength,
+    this.channel2envelopeVolume,
+    this.channel2envelopeType,
+    this.channel2envelopeSweeps,
+    this.channel2envelopeSweepsLast,
+    this.channel2consecutive,
+    this.channel2frequency,
+    this.channel3canPlay,
+    this.channel3totalLength,
+    this.channel3patternType,
+    this.channel3frequency,
+    this.channel3consecutive,
+    this.fromTypedArray(this.channel3PCM),
+    this.channel4FrequencyPeriod,
+    this.channel4lastSampleLookup,
+    this.channel4totalLength,
+    this.channel4envelopeVolume,
+    this.channel4currentVolume,
+    this.channel4envelopeType,
+    this.channel4envelopeSweeps,
+    this.channel4envelopeSweepsLast,
+    this.channel4consecutive,
+    this.channel4BitRange,
+    this.soundMasterEnabled,
+    this.VinLeftChannelMasterVolume,
+    this.VinRightChannelMasterVolume,
+    this.leftChannel1,
+    this.leftChannel2,
+    this.leftChannel3,
+    this.leftChannel4,
+    this.rightChannel1,
+    this.rightChannel2,
+    this.rightChannel3,
+    this.rightChannel4,
+    this.channel1currentSampleLeft,
+    this.channel1currentSampleRight,
+    this.channel2currentSampleLeft,
+    this.channel2currentSampleRight,
+    this.channel3currentSampleLeft,
+    this.channel3currentSampleRight,
+    this.channel4currentSampleLeft,
+    this.channel4currentSampleRight,
+    this.channel1currentSampleLeftSecondary,
+    this.channel1currentSampleRightSecondary,
+    this.channel2currentSampleLeftSecondary,
+    this.channel2currentSampleRightSecondary,
+    this.channel3currentSampleLeftSecondary,
+    this.channel3currentSampleRightSecondary,
+    this.channel4currentSampleLeftSecondary,
+    this.channel4currentSampleRightSecondary,
+    this.channel1currentSampleLeftTrimary,
+    this.channel1currentSampleRightTrimary,
+    this.channel2currentSampleLeftTrimary,
+    this.channel2currentSampleRightTrimary,
+    this.mixerOutputCache,
+    this.channel1DutyTracker,
+    this.channel1CachedDuty,
+    this.channel2DutyTracker,
+    this.channel2CachedDuty,
+    this.channel1Enabled,
+    this.channel2Enabled,
+    this.channel3Enabled,
+    this.channel4Enabled,
+    this.sequencerClocks,
+    this.sequencePosition,
+    this.channel3Counter,
+    this.channel4Counter,
+    this.cachedChannel3Sample,
+    this.cachedChannel4Sample,
+    this.channel3FrequencyPeriod,
+    this.channel3lastSampleLookup,
+    this.actualScanLine,
+    this.lastUnrenderedLine,
+    this.queuedScanLines,
+    this.RTCisLatched,
+    this.latchedSeconds,
+    this.latchedMinutes,
+    this.latchedHours,
+    this.latchedLDays,
+    this.latchedHDays,
+    this.RTCSeconds,
+    this.RTCMinutes,
+    this.RTCHours,
+    this.RTCDays,
+    this.RTCDayOverFlow,
+    this.RTCHALT,
+    this.usedBootROM,
+    this.skipPCIncrement,
+    this.STATTracker,
+    this.gbcRamBankPositionECHO,
+    this.numRAMBanks,
+    this.windowY,
+    this.windowX,
+    this.fromTypedArray(this.gbcOBJRawPalette),
+    this.fromTypedArray(this.gbcBGRawPalette),
+    this.fromTypedArray(this.gbOBJPalette),
+    this.fromTypedArray(this.gbBGPalette),
+    this.fromTypedArray(this.gbcOBJPalette),
+    this.fromTypedArray(this.gbcBGPalette),
+    this.fromTypedArray(this.gbBGColorizedPalette),
+    this.fromTypedArray(this.gbOBJColorizedPalette),
+    this.fromTypedArray(this.cachedBGPaletteConversion),
+    this.fromTypedArray(this.cachedOBJPaletteConversion),
+    this.fromTypedArray(this.BGCHRBank1),
+    this.fromTypedArray(this.BGCHRBank2),
+    this.haltPostClocks,
+    this.interruptsRequested,
+    this.interruptsEnabled,
+    this.remainingClocks,
+    this.colorizedGBPalettes,
+    this.backgroundY,
+    this.backgroundX,
+    this.CPUStopped
+  ];
+}
+GameBoyCore.prototype.returnFromState = function (returnedFrom) {
+  var index = 0;
+  var state = returnedFrom.slice(0);
+  this.ROM = this.toTypedArray(state[index++], "uint8");
+  this.ROMBankEdge = Math.floor(this.ROM.length / 0x4000);
+  this.inBootstrap = state[index++];
+  this.registerA = state[index++];
+  this.FZero = state[index++];
+  this.FSubtract = state[index++];
+  this.FHalfCarry = state[index++];
+  this.FCarry = state[index++];
+  this.registerB = state[index++];
+  this.registerC = state[index++];
+  this.registerD = state[index++];
+  this.registerE = state[index++];
+  this.registersHL = state[index++];
+  this.stackPointer = state[index++];
+  this.programCounter = state[index++];
+  this.halt = state[index++];
+  this.IME = state[index++];
+  this.hdmaRunning = state[index++];
+  this.CPUTicks = state[index++];
+  this.doubleSpeedShifter = state[index++];
+  this.memory = this.toTypedArray(state[index++], "uint8");
+  this.MBCRam = this.toTypedArray(state[index++], "uint8");
+  this.VRAM = this.toTypedArray(state[index++], "uint8");
+  this.currVRAMBank = state[index++];
+  this.GBCMemory = this.toTypedArray(state[index++], "uint8");
+  this.MBC1Mode = state[index++];
+  this.MBCRAMBanksEnabled = state[index++];
+  this.currMBCRAMBank = state[index++];
+  this.currMBCRAMBankPosition = state[index++];
+  this.cGBC = state[index++];
+  this.gbcRamBank = state[index++];
+  this.gbcRamBankPosition = state[index++];
+  this.ROMBank1offs = state[index++];
+  this.currentROMBank = state[index++];
+  this.cartridgeType = state[index++];
+  this.name = state[index++];
+  this.gameCode = state[index++];
+  this.modeSTAT = state[index++];
+  this.LYCMatchTriggerSTAT = state[index++];
+  this.mode2TriggerSTAT = state[index++];
+  this.mode1TriggerSTAT = state[index++];
+  this.mode0TriggerSTAT = state[index++];
+  this.LCDisOn = state[index++];
+  this.gfxWindowCHRBankPosition = state[index++];
+  this.gfxWindowDisplay = state[index++];
+  this.gfxSpriteShow = state[index++];
+  this.gfxSpriteNormalHeight = state[index++];
+  this.gfxBackgroundCHRBankPosition = state[index++];
+  this.gfxBackgroundBankOffset = state[index++];
+  this.TIMAEnabled = state[index++];
+  this.DIVTicks = state[index++];
+  this.LCDTicks = state[index++];
+  this.timerTicks = state[index++];
+  this.TACClocker = state[index++];
+  this.serialTimer = state[index++];
+  this.serialShiftTimer = state[index++];
+  this.serialShiftTimerAllocated = state[index++];
+  this.IRQEnableDelay = state[index++];
+  this.lastIteration = state[index++];
+  this.cMBC1 = state[index++];
+  this.cMBC2 = state[index++];
+  this.cMBC3 = state[index++];
+  this.cMBC5 = state[index++];
+  this.cMBC7 = state[index++];
+  this.cSRAM = state[index++];
+  this.cMMMO1 = state[index++];
+  this.cRUMBLE = state[index++];
+  this.cCamera = state[index++];
+  this.cTAMA5 = state[index++];
+  this.cHuC3 = state[index++];
+  this.cHuC1 = state[index++];
+  this.drewBlank = state[index++];
+  this.frameBuffer = this.toTypedArray(state[index++], "int32");
+  this.bgEnabled = state[index++];
+  this.BGPriorityEnabled = state[index++];
+  this.channel1FrequencyTracker = state[index++];
+  this.channel1FrequencyCounter = state[index++];
+  this.channel1totalLength = state[index++];
+  this.channel1envelopeVolume = state[index++];
+  this.channel1envelopeType = state[index++];
+  this.channel1envelopeSweeps = state[index++];
+  this.channel1envelopeSweepsLast = state[index++];
+  this.channel1consecutive = state[index++];
+  this.channel1frequency = state[index++];
+  this.channel1SweepFault = state[index++];
+  this.channel1ShadowFrequency = state[index++];
+  this.channel1timeSweep = state[index++];
+  this.channel1lastTimeSweep = state[index++];
+  this.channel1numSweep = state[index++];
+  this.channel1frequencySweepDivider = state[index++];
+  this.channel1decreaseSweep = state[index++];
+  this.channel2FrequencyTracker = state[index++];
+  this.channel2FrequencyCounter = state[index++];
+  this.channel2totalLength = state[index++];
+  this.channel2envelopeVolume = state[index++];
+  this.channel2envelopeType = state[index++];
+  this.channel2envelopeSweeps = state[index++];
+  this.channel2envelopeSweepsLast = state[index++];
+  this.channel2consecutive = state[index++];
+  this.channel2frequency = state[index++];
+  this.channel3canPlay = state[index++];
+  this.channel3totalLength = state[index++];
+  this.channel3patternType = state[index++];
+  this.channel3frequency = state[index++];
+  this.channel3consecutive = state[index++];
+  this.channel3PCM = this.toTypedArray(state[index++], "int8");
+  this.channel4FrequencyPeriod = state[index++];
+  this.channel4lastSampleLookup = state[index++];
+  this.channel4totalLength = state[index++];
+  this.channel4envelopeVolume = state[index++];
+  this.channel4currentVolume = state[index++];
+  this.channel4envelopeType = state[index++];
+  this.channel4envelopeSweeps = state[index++];
+  this.channel4envelopeSweepsLast = state[index++];
+  this.channel4consecutive = state[index++];
+  this.channel4BitRange = state[index++];
+  this.soundMasterEnabled = state[index++];
+  this.VinLeftChannelMasterVolume = state[index++];
+  this.VinRightChannelMasterVolume = state[index++];
+  this.leftChannel1 = state[index++];
+  this.leftChannel2 = state[index++];
+  this.leftChannel3 = state[index++];
+  this.leftChannel4 = state[index++];
+  this.rightChannel1 = state[index++];
+  this.rightChannel2 = state[index++];
+  this.rightChannel3 = state[index++];
+  this.rightChannel4 = state[index++];
+  this.channel1currentSampleLeft = state[index++];
+  this.channel1currentSampleRight = state[index++];
+  this.channel2currentSampleLeft = state[index++];
+  this.channel2currentSampleRight = state[index++];
+  this.channel3currentSampleLeft = state[index++];
+  this.channel3currentSampleRight = state[index++];
+  this.channel4currentSampleLeft = state[index++];
+  this.channel4currentSampleRight = state[index++];
+  this.channel1currentSampleLeftSecondary = state[index++];
+  this.channel1currentSampleRightSecondary = state[index++];
+  this.channel2currentSampleLeftSecondary = state[index++];
+  this.channel2currentSampleRightSecondary = state[index++];
+  this.channel3currentSampleLeftSecondary = state[index++];
+  this.channel3currentSampleRightSecondary = state[index++];
+  this.channel4currentSampleLeftSecondary = state[index++];
+  this.channel4currentSampleRightSecondary = state[index++];
+  this.channel1currentSampleLeftTrimary = state[index++];
+  this.channel1currentSampleRightTrimary = state[index++];
+  this.channel2currentSampleLeftTrimary = state[index++];
+  this.channel2currentSampleRightTrimary = state[index++];
+  this.mixerOutputCache = state[index++];
+  this.channel1DutyTracker = state[index++];
+  this.channel1CachedDuty = state[index++];
+  this.channel2DutyTracker = state[index++];
+  this.channel2CachedDuty = state[index++];
+  this.channel1Enabled = state[index++];
+  this.channel2Enabled = state[index++];
+  this.channel3Enabled = state[index++];
+  this.channel4Enabled = state[index++];
+  this.sequencerClocks = state[index++];
+  this.sequencePosition = state[index++];
+  this.channel3Counter = state[index++];
+  this.channel4Counter = state[index++];
+  this.cachedChannel3Sample = state[index++];
+  this.cachedChannel4Sample = state[index++];
+  this.channel3FrequencyPeriod = state[index++];
+  this.channel3lastSampleLookup = state[index++];
+  this.actualScanLine = state[index++];
+  this.lastUnrenderedLine = state[index++];
+  this.queuedScanLines = state[index++];
+  this.RTCisLatched = state[index++];
+  this.latchedSeconds = state[index++];
+  this.latchedMinutes = state[index++];
+  this.latchedHours = state[index++];
+  this.latchedLDays = state[index++];
+  this.latchedHDays = state[index++];
+  this.RTCSeconds = state[index++];
+  this.RTCMinutes = state[index++];
+  this.RTCHours = state[index++];
+  this.RTCDays = state[index++];
+  this.RTCDayOverFlow = state[index++];
+  this.RTCHALT = state[index++];
+  this.usedBootROM = state[index++];
+  this.skipPCIncrement = state[index++];
+  this.STATTracker = state[index++];
+  this.gbcRamBankPositionECHO = state[index++];
+  this.numRAMBanks = state[index++];
+  this.windowY = state[index++];
+  this.windowX = state[index++];
+  this.gbcOBJRawPalette = this.toTypedArray(state[index++], "uint8");
+  this.gbcBGRawPalette = this.toTypedArray(state[index++], "uint8");
+  this.gbOBJPalette = this.toTypedArray(state[index++], "int32");
+  this.gbBGPalette = this.toTypedArray(state[index++], "int32");
+  this.gbcOBJPalette = this.toTypedArray(state[index++], "int32");
+  this.gbcBGPalette = this.toTypedArray(state[index++], "int32");
+  this.gbBGColorizedPalette = this.toTypedArray(state[index++], "int32");
+  this.gbOBJColorizedPalette = this.toTypedArray(state[index++], "int32");
+  this.cachedBGPaletteConversion = this.toTypedArray(state[index++], "int32");
+  this.cachedOBJPaletteConversion = this.toTypedArray(state[index++], "int32");
+  this.BGCHRBank1 = this.toTypedArray(state[index++], "uint8");
+  this.BGCHRBank2 = this.toTypedArray(state[index++], "uint8");
+  this.haltPostClocks = state[index++];
+  this.interruptsRequested = state[index++];
+  this.interruptsEnabled = state[index++];
+  this.checkIRQMatching();
+  this.remainingClocks = state[index++];
+  this.colorizedGBPalettes = state[index++];
+  this.backgroundY = state[index++];
+  this.backgroundX = state[index++];
+  this.CPUStopped = state[index];
+  this.fromSaveState = true;
+  this.TICKTable = this.toTypedArray(this.TICKTable, "uint8");
+  this.SecondaryTICKTable = this.toTypedArray(this.SecondaryTICKTable, "uint8");
+  this.initializeReferencesFromSaveState();
+  this.memoryReadJumpCompile();
+  this.memoryWriteJumpCompile();
+  this.initLCD();
+  this.initSound();
+  this.noiseSampleTable = (this.channel4BitRange == 0x7FFF) ? this.LSFR15Table : this.LSFR7Table;
+  this.channel4VolumeShifter = (this.channel4BitRange == 0x7FFF) ? 15 : 7;
+}
+GameBoyCore.prototype.returnFromRTCState = function () {
+  if (typeof this.openRTC == "function" && this.cTIMER) {
+    var rtcData = this.openRTC(this.name);
+    var index = 0;
+    this.lastIteration = rtcData[index++];
+    this.RTCisLatched = rtcData[index++];
+    this.latchedSeconds = rtcData[index++];
+    this.latchedMinutes = rtcData[index++];
+    this.latchedHours = rtcData[index++];
+    this.latchedLDays = rtcData[index++];
+    this.latchedHDays = rtcData[index++];
+    this.RTCSeconds = rtcData[index++];
+    this.RTCMinutes = rtcData[index++];
+    this.RTCHours = rtcData[index++];
+    this.RTCDays = rtcData[index++];
+    this.RTCDayOverFlow = rtcData[index++];
+    this.RTCHALT = rtcData[index];
+  }
+}
+
+GameBoyCore.prototype.start = function () {
+  this.initMemory();  //Write the startup memory.
+  this.ROMLoad();    //Load the ROM into memory and get cartridge information from it.
+  this.initLCD();    //Initialize the graphics.
+  this.initSound();  //Sound object initialization.
+  this.run();      //Start the emulation.
+}
+GameBoyCore.prototype.initMemory = function () {
+  //Initialize the RAM:
+  this.memory = this.getTypedArray(0x10000, 0, "uint8");
+  this.frameBuffer = this.getTypedArray(23040, 0xF8F8F8, "int32");
+  this.BGCHRBank1 = this.getTypedArray(0x800, 0, "uint8");
+  this.TICKTable = this.toTypedArray(this.TICKTable, "uint8");
+  this.SecondaryTICKTable = this.toTypedArray(this.SecondaryTICKTable, "uint8");
+  this.channel3PCM = this.getTypedArray(0x20, 0, "int8");
+}
+GameBoyCore.prototype.generateCacheArray = function (tileAmount) {
+  var tileArray = [];
+  var tileNumber = 0;
+  while (tileNumber < tileAmount) {
+    tileArray[tileNumber++] = this.getTypedArray(64, 0, "uint8");
+  }
+  return tileArray;
+}
+GameBoyCore.prototype.initSkipBootstrap = function () {
+  //Fill in the boot ROM set register values
+  //Default values to the GB boot ROM values, then fill in the GBC boot ROM values after ROM loading
+  var index = 0xFF;
+  while (index >= 0) {
+    if (index >= 0x30 && index < 0x40) {
+      this.memoryWrite(0xFF00 | index, this.ffxxDump[index]);
+    }
+    else {
+      switch (index) {
+        case 0x00:
+        case 0x01:
+        case 0x02:
+        case 0x05:
+        case 0x07:
+        case 0x0F:
+        case 0xFF:
+          this.memoryWrite(0xFF00 | index, this.ffxxDump[index]);
+          break;
+        default:
+          this.memory[0xFF00 | index] = this.ffxxDump[index];
+      }
+    }
+    --index;
+  }
+  if (this.cGBC) {
+    this.memory[0xFF6C] = 0xFE;
+    this.memory[0xFF74] = 0xFE;
+  }
+  else {
+    this.memory[0xFF48] = 0xFF;
+    this.memory[0xFF49] = 0xFF;
+    this.memory[0xFF6C] = 0xFF;
+    this.memory[0xFF74] = 0xFF;
+  }
+  //Start as an unset device:
+  cout("Starting without the GBC boot ROM.", 0);
+  this.registerA = (this.cGBC) ? 0x11 : 0x1;
+  this.registerB = 0;
+  this.registerC = 0x13;
+  this.registerD = 0;
+  this.registerE = 0xD8;
+  this.FZero = true;
+  this.FSubtract = false;
+  this.FHalfCarry = true;
+  this.FCarry = true;
+  this.registersHL = 0x014D;
+  this.LCDCONTROL = this.LINECONTROL;
+  this.IME = false;
+  this.IRQLineMatched = 0;
+  this.interruptsRequested = 225;
+  this.interruptsEnabled = 0;
+  this.hdmaRunning = false;
+  this.CPUTicks = 12;
+  this.STATTracker = 0;
+  this.modeSTAT = 1;
+  this.spriteCount = 252;
+  this.LYCMatchTriggerSTAT = false;
+  this.mode2TriggerSTAT = false;
+  this.mode1TriggerSTAT = false;
+  this.mode0TriggerSTAT = false;
+  this.LCDisOn = true;
+  this.channel1FrequencyTracker = 0x2000;
+  this.channel1DutyTracker = 0;
+  this.channel1CachedDuty = this.dutyLookup[2];
+  this.channel1totalLength = 0;
+  this.channel1envelopeVolume = 0;
+  this.channel1envelopeType = false;
+  this.channel1envelopeSweeps = 0;
+  this.channel1envelopeSweepsLast = 0;
+  this.channel1consecutive = true;
+  this.channel1frequency = 1985;
+  this.channel1SweepFault = true;
+  this.channel1ShadowFrequency = 1985;
+  this.channel1timeSweep = 1;
+  this.channel1lastTimeSweep = 0;
+  this.channel1numSweep = 0;
+  this.channel1frequencySweepDivider = 0;
+  this.channel1decreaseSweep = false;
+  this.channel2FrequencyTracker = 0x2000;
+  this.channel2DutyTracker = 0;
+  this.channel2CachedDuty = this.dutyLookup[2];
+  this.channel2totalLength = 0;
+  this.channel2envelopeVolume = 0;
+  this.channel2envelopeType = false;
+  this.channel2envelopeSweeps = 0;
+  this.channel2envelopeSweepsLast = 0;
+  this.channel2consecutive = true;
+  this.channel2frequency = 0;
+  this.channel3canPlay = false;
+  this.channel3totalLength = 0;
+  this.channel3patternType = 4;
+  this.channel3frequency = 0;
+  this.channel3consecutive = true;
+  this.channel3Counter = 0x418;
+  this.channel4FrequencyPeriod = 8;
+  this.channel4totalLength = 0;
+  this.channel4envelopeVolume = 0;
+  this.channel4currentVolume = 0;
+  this.channel4envelopeType = false;
+  this.channel4envelopeSweeps = 0;
+  this.channel4envelopeSweepsLast = 0;
+  this.channel4consecutive = true;
+  this.channel4BitRange = 0x7FFF;
+  this.channel4VolumeShifter = 15;
+  this.channel1FrequencyCounter = 0x200;
+  this.channel2FrequencyCounter = 0x200;
+  this.channel3Counter = 0x800;
+  this.channel3FrequencyPeriod = 0x800;
+  this.channel3lastSampleLookup = 0;
+  this.channel4lastSampleLookup = 0;
+  this.VinLeftChannelMasterVolume = 1;
+  this.VinRightChannelMasterVolume = 1;
+  this.soundMasterEnabled = true;
+  this.leftChannel1 = true;
+  this.leftChannel2 = true;
+  this.leftChannel3 = true;
+  this.leftChannel4 = true;
+  this.rightChannel1 = true;
+  this.rightChannel2 = true;
+  this.rightChannel3 = false;
+  this.rightChannel4 = false;
+  this.DIVTicks = 27044;
+  this.LCDTicks = 160;
+  this.timerTicks = 0;
+  this.TIMAEnabled = false;
+  this.TACClocker = 1024;
+  this.serialTimer = 0;
+  this.serialShiftTimer = 0;
+  this.serialShiftTimerAllocated = 0;
+  this.IRQEnableDelay = 0;
+  this.actualScanLine = 144;
+  this.lastUnrenderedLine = 0;
+  this.gfxWindowDisplay = false;
+  this.gfxSpriteShow = false;
+  this.gfxSpriteNormalHeight = true;
+  this.bgEnabled = true;
+  this.BGPriorityEnabled = true;
+  this.gfxWindowCHRBankPosition = 0;
+  this.gfxBackgroundCHRBankPosition = 0;
+  this.gfxBackgroundBankOffset = 0;
+  this.windowY = 0;
+  this.windowX = 0;
+  this.drewBlank = 0;
+  this.midScanlineOffset = -1;
+  this.currentX = 0;
+}
+GameBoyCore.prototype.initBootstrap = function () {
+  //Start as an unset device:
+  cout("Starting the selected boot ROM.", 0);
+  this.programCounter = 0;
+  this.stackPointer = 0;
+  this.IME = false;
+  this.LCDTicks = 0;
+  this.DIVTicks = 0;
+  this.registerA = 0;
+  this.registerB = 0;
+  this.registerC = 0;
+  this.registerD = 0;
+  this.registerE = 0;
+  this.FZero = this.FSubtract = this.FHalfCarry = this.FCarry = false;
+  this.registersHL = 0;
+  this.leftChannel1 = false;
+  this.leftChannel2 = false;
+  this.leftChannel3 = false;
+  this.leftChannel4 = false;
+  this.rightChannel1 = false;
+  this.rightChannel2 = false;
+  this.rightChannel3 = false;
+  this.rightChannel4 = false;
+  this.channel2frequency = this.channel1frequency = 0;
+  this.channel4consecutive = this.channel2consecutive = this.channel1consecutive = false;
+  this.VinLeftChannelMasterVolume = 8;
+  this.VinRightChannelMasterVolume = 8;
+  this.memory[0xFF00] = 0xF;  //Set the joypad state.
+}
+GameBoyCore.prototype.ROMLoad = function () {
+  //Load the first two ROM banks (0x0000 - 0x7FFF) into regular gameboy memory:
+  this.ROM = [];
+  this.usedBootROM = settings[1];
+  var maxLength = this.ROMImage.length;
+  if (maxLength < 0x4000) {
+    throw(new Error("ROM image size too small."));
+  }
+  this.ROM = this.getTypedArray(maxLength, 0, "uint8");
+  var romIndex = 0;
+  if (this.usedBootROM) {
+    if (!settings[11]) {
+      //Patch in the GBC boot ROM into the memory map:
+      for (; romIndex < 0x100; ++romIndex) {
+        this.memory[romIndex] = this.GBCBOOTROM[romIndex];                      //Load in the GameBoy Color BOOT ROM.
+        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
+      }
+      for (; romIndex < 0x200; ++romIndex) {
+        this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
+      }
+      for (; romIndex < 0x900; ++romIndex) {
+        this.memory[romIndex] = this.GBCBOOTROM[romIndex - 0x100];                  //Load in the GameBoy Color BOOT ROM.
+        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
+      }
+      this.usedGBCBootROM = true;
+    }
+    else {
+      //Patch in the GBC boot ROM into the memory map:
+      for (; romIndex < 0x100; ++romIndex) {
+        this.memory[romIndex] = this.GBBOOTROM[romIndex];                      //Load in the GameBoy Color BOOT ROM.
+        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
+      }
+    }
+    for (; romIndex < 0x4000; ++romIndex) {
+      this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
+    }
+  }
+  else {
+    //Don't load in the boot ROM:
+    for (; romIndex < 0x4000; ++romIndex) {
+      this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
+    }
+  }
+  //Finish the decoding of the ROM binary:
+  for (; romIndex < maxLength; ++romIndex) {
+    this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);
+  }
+  this.ROMBankEdge = Math.floor(this.ROM.length / 0x4000);
+  //Set up the emulator for the cartidge specifics:
+  this.interpretCartridge();
+  //Check for IRQ matching upon initialization:
+  this.checkIRQMatching();
+}
+GameBoyCore.prototype.getROMImage = function () {
+  //Return the binary version of the ROM image currently running:
+  if (this.ROMImage.length > 0) {
+    return this.ROMImage.length;
+  }
+  var length = this.ROM.length;
+  for (var index = 0; index < length; index++) {
+    this.ROMImage += String.fromCharCode(this.ROM[index]);
+  }
+  return this.ROMImage;
+}
+GameBoyCore.prototype.interpretCartridge = function () {
+  // ROM name
+  for (var index = 0x134; index < 0x13F; index++) {
+    if (this.ROMImage.charCodeAt(index) > 0) {
+      this.name += this.ROMImage[index];
+    }
+  }
+  // ROM game code (for newer games)
+  for (var index = 0x13F; index < 0x143; index++) {
+    if (this.ROMImage.charCodeAt(index) > 0) {
+      this.gameCode += this.ROMImage[index];
+    }
+  }
+  cout("Game Title: " + this.name + "[" + this.gameCode + "][" + this.ROMImage[0x143] + "]", 0);
+  cout("Game Code: " + this.gameCode, 0);
+  // Cartridge type
+  this.cartridgeType = this.ROM[0x147];
+  cout("Cartridge type #" + this.cartridgeType, 0);
+  //Map out ROM cartridge sub-types.
+  var MBCType = "";
+  switch (this.cartridgeType) {
+    case 0x00:
+      //ROM w/o bank switching
+      if (!settings[9]) {
+        MBCType = "ROM";
+        break;
+      }
+    case 0x01:
+      this.cMBC1 = true;
+      MBCType = "MBC1";
+      break;
+    case 0x02:
+      this.cMBC1 = true;
+      this.cSRAM = true;
+      MBCType = "MBC1 + SRAM";
+      break;
+    case 0x03:
+      this.cMBC1 = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "MBC1 + SRAM + BATT";
+      break;
+    case 0x05:
+      this.cMBC2 = true;
+      MBCType = "MBC2";
+      break;
+    case 0x06:
+      this.cMBC2 = true;
+      this.cBATT = true;
+      MBCType = "MBC2 + BATT";
+      break;
+    case 0x08:
+      this.cSRAM = true;
+      MBCType = "ROM + SRAM";
+      break;
+    case 0x09:
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "ROM + SRAM + BATT";
+      break;
+    case 0x0B:
+      this.cMMMO1 = true;
+      MBCType = "MMMO1";
+      break;
+    case 0x0C:
+      this.cMMMO1 = true;
+      this.cSRAM = true;
+      MBCType = "MMMO1 + SRAM";
+      break;
+    case 0x0D:
+      this.cMMMO1 = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "MMMO1 + SRAM + BATT";
+      break;
+    case 0x0F:
+      this.cMBC3 = true;
+      this.cTIMER = true;
+      this.cBATT = true;
+      MBCType = "MBC3 + TIMER + BATT";
+      break;
+    case 0x10:
+      this.cMBC3 = true;
+      this.cTIMER = true;
+      this.cBATT = true;
+      this.cSRAM = true;
+      MBCType = "MBC3 + TIMER + BATT + SRAM";
+      break;
+    case 0x11:
+      this.cMBC3 = true;
+      MBCType = "MBC3";
+      break;
+    case 0x12:
+      this.cMBC3 = true;
+      this.cSRAM = true;
+      MBCType = "MBC3 + SRAM";
+      break;
+    case 0x13:
+      this.cMBC3 = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "MBC3 + SRAM + BATT";
+      break;
+    case 0x19:
+      this.cMBC5 = true;
+      MBCType = "MBC5";
+      break;
+    case 0x1A:
+      this.cMBC5 = true;
+      this.cSRAM = true;
+      MBCType = "MBC5 + SRAM";
+      break;
+    case 0x1B:
+      this.cMBC5 = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "MBC5 + SRAM + BATT";
+      break;
+    case 0x1C:
+      this.cRUMBLE = true;
+      MBCType = "RUMBLE";
+      break;
+    case 0x1D:
+      this.cRUMBLE = true;
+      this.cSRAM = true;
+      MBCType = "RUMBLE + SRAM";
+      break;
+    case 0x1E:
+      this.cRUMBLE = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "RUMBLE + SRAM + BATT";
+      break;
+    case 0x1F:
+      this.cCamera = true;
+      MBCType = "GameBoy Camera";
+      break;
+    case 0x22:
+      this.cMBC7 = true;
+      this.cSRAM = true;
+      this.cBATT = true;
+      MBCType = "MBC7 + SRAM + BATT";
+      break;
+    case 0xFD:
+      this.cTAMA5 = true;
+      MBCType = "TAMA5";
+      break;
+    case 0xFE:
+      this.cHuC3 = true;
+      MBCType = "HuC3";
+      break;
+    case 0xFF:
+      this.cHuC1 = true;
+      MBCType = "HuC1";
+      break;
+    default:
+      MBCType = "Unknown";
+      cout("Cartridge type is unknown.", 2);
+      pause();
+  }
+  cout("Cartridge Type: " + MBCType + ".", 0);
+  // ROM and RAM banks
+  this.numROMBanks = this.ROMBanks[this.ROM[0x148]];
+  cout(this.numROMBanks + " ROM banks.", 0);
+  switch (this.RAMBanks[this.ROM[0x149]]) {
+    case 0:
+      cout("No RAM banking requested for allocation or MBC is of type 2.", 0);
+      break;
+    case 2:
+      cout("1 RAM bank requested for allocation.", 0);
+      break;
+    case 3:
+      cout("4 RAM banks requested for allocation.", 0);
+      break;
+    case 4:
+      cout("16 RAM banks requested for allocation.", 0);
+      break;
+    default:
+      cout("RAM bank amount requested is unknown, will use maximum allowed by specified MBC type.", 0);
+  }
+  //Check the GB/GBC mode byte:
+  if (!this.usedBootROM) {
+    switch (this.ROM[0x143]) {
+      case 0x00:  //Only GB mode
+        this.cGBC = false;
+        cout("Only GB mode detected.", 0);
+        break;
+      case 0x32:  //Exception to the GBC identifying code:
+        if (!settings[2] && this.name + this.gameCode + this.ROM[0x143] == "Game and Watch 50") {
+          this.cGBC = true;
+          cout("Created a boot exception for Game and Watch Gallery 2 (GBC ID byte is wrong on the cartridge).", 1);
+        }
+        else {
+          this.cGBC = false;
+        }
+        break;
+      case 0x80:  //Both GB + GBC modes
+        this.cGBC = !settings[2];
+        cout("GB and GBC mode detected.", 0);
+        break;
+      case 0xC0:  //Only GBC mode
+        this.cGBC = true;
+        cout("Only GBC mode detected.", 0);
+        break;
+      default:
+        this.cGBC = false;
+        cout("Unknown GameBoy game type code #" + this.ROM[0x143] + ", defaulting to GB mode (Old games don't have a type code).", 1);
+    }
+    this.inBootstrap = false;
+    this.setupRAM();  //CPU/(V)RAM initialization.
+    this.initSkipBootstrap();
+    this.initializeAudioStartState(); // Line added for benchmarking.
+  }
+  else {
+    this.cGBC = this.usedGBCBootROM;  //Allow the GBC boot ROM to run in GBC mode...
+    this.setupRAM();  //CPU/(V)RAM initialization.
+    this.initBootstrap();
+  }
+  this.initializeModeSpecificArrays();
+  //License Code Lookup:
+  var cOldLicense = this.ROM[0x14B];
+  var cNewLicense = (this.ROM[0x144] & 0xFF00) | (this.ROM[0x145] & 0xFF);
+  if (cOldLicense != 0x33) {
+    //Old Style License Header
+    cout("Old style license code: " + cOldLicense, 0);
+  }
+  else {
+    //New Style License Header
+    cout("New style license code: " + cNewLicense, 0);
+  }
+  this.ROMImage = "";  //Memory consumption reduction.
+}
+GameBoyCore.prototype.disableBootROM = function () {
+  //Remove any traces of the boot ROM from ROM memory.
+  for (var index = 0; index < 0x100; ++index) {
+    this.memory[index] = this.ROM[index];  //Replace the GameBoy or GameBoy Color boot ROM with the game ROM.
+  }
+  if (this.usedGBCBootROM) {
+    //Remove any traces of the boot ROM from ROM memory.
+    for (index = 0x200; index < 0x900; ++index) {
+      this.memory[index] = this.ROM[index];  //Replace the GameBoy Color boot ROM with the game ROM.
+    }
+    if (!this.cGBC) {
+      //Clean up the post-boot (GB mode only) state:
+      this.GBCtoGBModeAdjust();
+    }
+    else {
+      this.recompileBootIOWriteHandling();
+    }
+  }
+  else {
+    this.recompileBootIOWriteHandling();
+  }
+}
+GameBoyCore.prototype.initializeTiming = function () {
+  //Emulator Timing:
+  this.baseCPUCyclesPerIteration = 0x80000 / 0x7D * settings[6];
+  this.CPUCyclesTotalRoundoff = this.baseCPUCyclesPerIteration % 4;
+  this.CPUCyclesTotalBase = this.CPUCyclesTotal = (this.baseCPUCyclesPerIteration - this.CPUCyclesTotalRoundoff) | 0;
+  this.CPUCyclesTotalCurrent = 0;
+}
+GameBoyCore.prototype.setupRAM = function () {
+  //Setup the auxilliary/switchable RAM:
+  if (this.cMBC2) {
+    this.numRAMBanks = 1 / 16;
+  }
+  else if (this.cMBC1 || this.cRUMBLE || this.cMBC3 || this.cHuC3) {
+    this.numRAMBanks = 4;
+  }
+  else if (this.cMBC5) {
+    this.numRAMBanks = 16;
+  }
+  else if (this.cSRAM) {
+    this.numRAMBanks = 1;
+  }
+  if (this.numRAMBanks > 0) {
+    if (!this.MBCRAMUtilized()) {
+      //For ROM and unknown MBC cartridges using the external RAM:
+      this.MBCRAMBanksEnabled = true;
+    }
+    //Switched RAM Used
+    var MBCRam = (typeof this.openMBC == "function") ? this.openMBC(this.name) : [];
+    if (MBCRam.length > 0) {
+      //Flash the SRAM into memory:
+      this.MBCRam = this.toTypedArray(MBCRam, "uint8");
+    }
+    else {
+      this.MBCRam = this.getTypedArray(this.numRAMBanks * 0x2000, 0, "uint8");
+    }
+  }
+  cout("Actual bytes of MBC RAM allocated: " + (this.numRAMBanks * 0x2000), 0);
+  this.returnFromRTCState();
+  //Setup the RAM for GBC mode.
+  if (this.cGBC) {
+    this.VRAM = this.getTypedArray(0x2000, 0, "uint8");
+    this.GBCMemory = this.getTypedArray(0x7000, 0, "uint8");
+  }
+  this.memoryReadJumpCompile();
+  this.memoryWriteJumpCompile();
+}
+GameBoyCore.prototype.MBCRAMUtilized = function () {
+  return this.cMBC1 || this.cMBC2 || this.cMBC3 || this.cMBC5 || this.cMBC7 || this.cRUMBLE;
+}
+GameBoyCore.prototype.recomputeDimension = function () {
+  initNewCanvas();
+  //Cache some dimension info:
+  this.onscreenWidth = this.canvas.width;
+  this.onscreenHeight = this.canvas.height;
+  // The following line was modified for benchmarking:
+  if (GameBoyWindow && GameBoyWindow.mozRequestAnimationFrame) {
+    //Firefox slowness hack:
+    this.canvas.width = this.onscreenWidth = (!settings[12]) ? 160 : this.canvas.width;
+    this.canvas.height = this.onscreenHeight = (!settings[12]) ? 144 : this.canvas.height;
+  }
+  else {
+    this.onscreenWidth = this.canvas.width;
+    this.onscreenHeight = this.canvas.height;
+  }
+  this.offscreenWidth = (!settings[12]) ? 160 : this.canvas.width;
+  this.offscreenHeight = (!settings[12]) ? 144 : this.canvas.height;
+  this.offscreenRGBCount = this.offscreenWidth * this.offscreenHeight * 4;
+}
+GameBoyCore.prototype.initLCD = function () {
+  this.recomputeDimension();
+  if (this.offscreenRGBCount != 92160) {
+    //Only create the resizer handle if we need it:
+    this.compileResizeFrameBufferFunction();
+  }
+  else {
+    //Resizer not needed:
+    this.resizer = null;
+  }
+  try {
+    this.canvasOffscreen = new GameBoyCanvas();  // Line modified for benchmarking.
+    this.canvasOffscreen.width = this.offscreenWidth;
+    this.canvasOffscreen.height = this.offscreenHeight;
+    this.drawContextOffscreen = this.canvasOffscreen.getContext("2d");
+    this.drawContextOnscreen = this.canvas.getContext("2d");
+    //Get a CanvasPixelArray buffer:
+    try {
+      this.canvasBuffer = this.drawContextOffscreen.createImageData(this.offscreenWidth, this.offscreenHeight);
+    }
+    catch (error) {
+      cout("Falling back to the getImageData initialization (Error \"" + error.message + "\").", 1);
+      this.canvasBuffer = this.drawContextOffscreen.getImageData(0, 0, this.offscreenWidth, this.offscreenHeight);
+    }
+    var index = this.offscreenRGBCount;
+    while (index > 0) {
+      this.canvasBuffer.data[index -= 4] = 0xF8;
+      this.canvasBuffer.data[index + 1] = 0xF8;
+      this.canvasBuffer.data[index + 2] = 0xF8;
+      this.canvasBuffer.data[index + 3] = 0xFF;
+    }
+    this.graphicsBlit();
+    this.canvas.style.visibility = "visible";
+    if (this.swizzledFrame == null) {
+      this.swizzledFrame = this.getTypedArray(69120, 0xFF, "uint8");
+    }
+    //Test the draw system and browser vblank latching:
+    this.drewFrame = true;                    //Copy the latest graphics to buffer.
+    this.requestDraw();
+  }
+  catch (error) {
+    throw(new Error("HTML5 Canvas support required: " + error.message + "file: " + error.fileName + ", line: " + error.lineNumber));
+  }
+}
+GameBoyCore.prototype.graphicsBlit = function () {
+  if (this.offscreenWidth == this.onscreenWidth && this.offscreenHeight == this.onscreenHeight) {
+    this.drawContextOnscreen.putImageData(this.canvasBuffer, 0, 0);
+  }
+  else {
+    this.drawContextOffscreen.putImageData(this.canvasBuffer, 0, 0);
+    this.drawContextOnscreen.drawImage(this.canvasOffscreen, 0, 0, this.onscreenWidth, this.onscreenHeight);
+  }
+}
+GameBoyCore.prototype.JoyPadEvent = function (key, down) {
+  if (down) {
+    this.JoyPad &= 0xFF ^ (1 << key);
+    if (!this.cGBC && (!this.usedBootROM || !this.usedGBCBootROM)) {
+      this.interruptsRequested |= 0x10;  //A real GBC doesn't set this!
+      this.remainingClocks = 0;
+      this.checkIRQMatching();
+    }
+  }
+  else {
+    this.JoyPad |= (1 << key);
+  }
+  this.memory[0xFF00] = (this.memory[0xFF00] & 0x30) + ((((this.memory[0xFF00] & 0x20) == 0) ? (this.JoyPad >> 4) : 0xF) & (((this.memory[0xFF00] & 0x10) == 0) ? (this.JoyPad & 0xF) : 0xF));
+  this.CPUStopped = false;
+}
+GameBoyCore.prototype.GyroEvent = function (x, y) {
+  x *= -100;
+  x += 2047;
+  this.highX = x >> 8;
+  this.lowX = x & 0xFF;
+  y *= -100;
+  y += 2047;
+  this.highY = y >> 8;
+  this.lowY = y & 0xFF;
+}
+GameBoyCore.prototype.initSound = function () {
+  this.sampleSize = 0x400000 / 1000 * settings[6];
+  this.machineOut = settings[13];
+  if (settings[0]) {
+    try {
+      var parentObj = this;
+      this.audioHandle = new XAudioServer(2, 0x400000 / settings[13], 0, Math.max(this.sampleSize * settings[8] / settings[13], 8192) << 1, null, settings[14]);
+      this.initAudioBuffer();
+    }
+    catch (error) {
+      cout("Audio system cannot run: " + error.message, 2);
+      settings[0] = false;
+    }
+  }
+  else if (this.audioHandle) {
+    //Mute the audio output, as it has an immediate silencing effect:
+    try {
+      this.audioHandle.changeVolume(0);
+    }
+    catch (error) { }
+  }
+}
+GameBoyCore.prototype.changeVolume = function () {
+  if (settings[0] && this.audioHandle) {
+    try {
+      this.audioHandle.changeVolume(settings[14]);
+    }
+    catch (error) { }
+  }
+}
+GameBoyCore.prototype.initAudioBuffer = function () {
+  this.audioIndex = 0;
+  this.bufferContainAmount = Math.max(this.sampleSize * settings[7] / settings[13], 4096) << 1;
+  this.numSamplesTotal = (this.sampleSize - (this.sampleSize % settings[13])) | 0;
+  this.currentBuffer = this.getTypedArray(this.numSamplesTotal, 0xF0F0, "int32");
+  this.secondaryBuffer = this.getTypedArray((this.numSamplesTotal << 1) / settings[13], 0, "float32");
+}
+GameBoyCore.prototype.intializeWhiteNoise = function () {
+  //Noise Sample Tables:
+  var randomFactor = 1;
+  //15-bit LSFR Cache Generation:
+  this.LSFR15Table = this.getTypedArray(0x80000, 0, "int8");
+  var LSFR = 0x7FFF;  //Seed value has all its bits set.
+  var LSFRShifted = 0x3FFF;
+  for (var index = 0; index < 0x8000; ++index) {
+    //Normalize the last LSFR value for usage:
+    randomFactor = 1 - (LSFR & 1);  //Docs say it's the inverse.
+    //Cache the different volume level results:
+    this.LSFR15Table[0x08000 | index] = randomFactor;
+    this.LSFR15Table[0x10000 | index] = randomFactor * 0x2;
+    this.LSFR15Table[0x18000 | index] = randomFactor * 0x3;
+    this.LSFR15Table[0x20000 | index] = randomFactor * 0x4;
+    this.LSFR15Table[0x28000 | index] = randomFactor * 0x5;
+    this.LSFR15Table[0x30000 | index] = randomFactor * 0x6;
+    this.LSFR15Table[0x38000 | index] = randomFactor * 0x7;
+    this.LSFR15Table[0x40000 | index] = randomFactor * 0x8;
+    this.LSFR15Table[0x48000 | index] = randomFactor * 0x9;
+    this.LSFR15Table[0x50000 | index] = randomFactor * 0xA;
+    this.LSFR15Table[0x58000 | index] = randomFactor * 0xB;
+    this.LSFR15Table[0x60000 | index] = randomFactor * 0xC;
+    this.LSFR15Table[0x68000 | index] = randomFactor * 0xD;
+    this.LSFR15Table[0x70000 | index] = randomFactor * 0xE;
+    this.LSFR15Table[0x78000 | index] = randomFactor * 0xF;
+    //Recompute the LSFR algorithm:
+    LSFRShifted = LSFR >> 1;
+    LSFR = LSFRShifted | (((LSFRShifted ^ LSFR) & 0x1) << 14);
+  }
+  //7-bit LSFR Cache Generation:
+  this.LSFR7Table = this.getTypedArray(0x800, 0, "int8");
+  LSFR = 0x7F;  //Seed value has all its bits set.
+  for (index = 0; index < 0x80; ++index) {
+    //Normalize the last LSFR value for usage:
+    randomFactor = 1 - (LSFR & 1);  //Docs say it's the inverse.
+    //Cache the different volume level results:
+    this.LSFR7Table[0x080 | index] = randomFactor;
+    this.LSFR7Table[0x100 | index] = randomFactor * 0x2;
+    this.LSFR7Table[0x180 | index] = randomFactor * 0x3;
+    this.LSFR7Table[0x200 | index] = randomFactor * 0x4;
+    this.LSFR7Table[0x280 | index] = randomFactor * 0x5;
+    this.LSFR7Table[0x300 | index] = randomFactor * 0x6;
+    this.LSFR7Table[0x380 | index] = randomFactor * 0x7;
+    this.LSFR7Table[0x400 | index] = randomFactor * 0x8;
+    this.LSFR7Table[0x480 | index] = randomFactor * 0x9;
+    this.LSFR7Table[0x500 | index] = randomFactor * 0xA;
+    this.LSFR7Table[0x580 | index] = randomFactor * 0xB;
+    this.LSFR7Table[0x600 | index] = randomFactor * 0xC;
+    this.LSFR7Table[0x680 | index] = randomFactor * 0xD;
+    this.LSFR7Table[0x700 | index] = randomFactor * 0xE;
+    this.LSFR7Table[0x780 | index] = randomFactor * 0xF;
+    //Recompute the LSFR algorithm:
+    LSFRShifted = LSFR >> 1;
+    LSFR = LSFRShifted | (((LSFRShifted ^ LSFR) & 0x1) << 6);
+  }
+  if (!this.noiseSampleTable && this.memory.length == 0x10000) {
+    //If enabling audio for the first time after a game is already running, set up the internal table reference:
+    this.noiseSampleTable = ((this.memory[0xFF22] & 0x8) == 0x8) ? this.LSFR7Table : this.LSFR15Table;
+  }
+}
+GameBoyCore.prototype.audioUnderrunAdjustment = function () {
+  if (settings[0]) {
+    var underrunAmount = this.bufferContainAmount - this.audioHandle.remainingBuffer();
+    if (underrunAmount > 0) {
+      this.CPUCyclesTotalCurrent += (underrunAmount >> 1) * this.machineOut;
+      this.recalculateIterationClockLimit();
+    }
+  }
+}
+GameBoyCore.prototype.initializeAudioStartState = function () {
+  this.channel1FrequencyTracker = 0x2000;
+  this.channel1DutyTracker = 0;
+  this.channel1CachedDuty = this.dutyLookup[2];
+  this.channel1totalLength = 0;
+  this.channel1envelopeVolume = 0;
+  this.channel1envelopeType = false;
+  this.channel1envelopeSweeps = 0;
+  this.channel1envelopeSweepsLast = 0;
+  this.channel1consecutive = true;
+  this.channel1frequency = 0;
+  this.channel1SweepFault = false;
+  this.channel1ShadowFrequency = 0;
+  this.channel1timeSweep = 1;
+  this.channel1lastTimeSweep = 0;
+  this.channel1numSweep = 0;
+  this.channel1frequencySweepDivider = 0;
+  this.channel1decreaseSweep = false;
+  this.channel2FrequencyTracker = 0x2000;
+  this.channel2DutyTracker = 0;
+  this.channel2CachedDuty = this.dutyLookup[2];
+  this.channel2totalLength = 0;
+  this.channel2envelopeVolume = 0;
+  this.channel2envelopeType = false;
+  this.channel2envelopeSweeps = 0;
+  this.channel2envelopeSweepsLast = 0;
+  this.channel2consecutive = true;
+  this.channel2frequency = 0;
+  this.channel3canPlay = false;
+  this.channel3totalLength = 0;
+  this.channel3patternType = 4;
+  this.channel3frequency = 0;
+  this.channel3consecutive = true;
+  this.channel3Counter = 0x800;
+  this.channel4FrequencyPeriod = 8;
+  this.channel4totalLength = 0;
+  this.channel4envelopeVolume = 0;
+  this.channel4currentVolume = 0;
+  this.channel4envelopeType = false;
+  this.channel4envelopeSweeps = 0;
+  this.channel4envelopeSweepsLast = 0;
+  this.channel4consecutive = true;
+  this.channel4BitRange = 0x7FFF;
+  this.noiseSampleTable = this.LSFR15Table;
+  this.channel4VolumeShifter = 15;
+  this.channel1FrequencyCounter = 0x2000;
+  this.channel2FrequencyCounter = 0x2000;
+  this.channel3Counter = 0x800;
+  this.channel3FrequencyPeriod = 0x800;
+  this.channel3lastSampleLookup = 0;
+  this.channel4lastSampleLookup = 0;
+  this.VinLeftChannelMasterVolume = 8;
+  this.VinRightChannelMasterVolume = 8;
+  this.mixerOutputCache = 0;
+  this.sequencerClocks = 0x2000;
+  this.sequencePosition = 0;
+  this.channel4FrequencyPeriod = 8;
+  this.channel4Counter = 8;
+  this.cachedChannel3Sample = 0;
+  this.cachedChannel4Sample = 0;
+  this.channel1Enabled = false;
+  this.channel2Enabled = false;
+  this.channel3Enabled = false;
+  this.channel4Enabled = false;
+  this.channel1canPlay = false;
+  this.channel2canPlay = false;
+  this.channel4canPlay = false;
+  this.channel1OutputLevelCache();
+  this.channel2OutputLevelCache();
+  this.channel3OutputLevelCache();
+  this.channel4OutputLevelCache();
+}
+GameBoyCore.prototype.outputAudio = function () {
+  var sampleFactor = 0;
+  var dirtySample = 0;
+  var averageL = 0;
+  var averageR = 0;
+  var destinationPosition = 0;
+  var divisor1 = settings[13];
+  var divisor2 = divisor1 * 0xF0;
+  for (var sourcePosition = 0; sourcePosition < this.numSamplesTotal;) {
+    for (sampleFactor = averageL = averageR = 0; sampleFactor < divisor1; ++sampleFactor) {
+      dirtySample = this.currentBuffer[sourcePosition++];
+      averageL += dirtySample >> 9;
+      averageR += dirtySample & 0x1FF;
+    }
+    this.secondaryBuffer[destinationPosition++] = averageL / divisor2 - 1;
+    this.secondaryBuffer[destinationPosition++] = averageR / divisor2 - 1;
+  }
+  this.audioHandle.writeAudioNoCallback(this.secondaryBuffer);
+}
+//Below are the audio generation functions timed against the CPU:
+GameBoyCore.prototype.generateAudio = function (numSamples) {
+  if (this.soundMasterEnabled && !this.CPUStopped) {
+    for (var samplesToGenerate = 0; numSamples > 0;) {
+      samplesToGenerate = (numSamples < this.sequencerClocks) ? numSamples : this.sequencerClocks;
+      this.sequencerClocks -= samplesToGenerate;
+      numSamples -= samplesToGenerate;
+      while (--samplesToGenerate > -1) {
+        this.computeAudioChannels();
+        this.currentBuffer[this.audioIndex++] = this.mixerOutputCache;
+        if (this.audioIndex == this.numSamplesTotal) {
+          this.audioIndex = 0;
+          this.outputAudio();
+        }
+      }
+      if (this.sequencerClocks == 0) {
+        this.audioComputeSequencer();
+        this.sequencerClocks = 0x2000;
+      }
+    }
+  }
+  else {
+    //SILENT OUTPUT:
+    while (--numSamples > -1) {
+      this.currentBuffer[this.audioIndex++] = 0xF0F0;
+      if (this.audioIndex == this.numSamplesTotal) {
+        this.audioIndex = 0;
+        this.outputAudio();
+      }
+    }
+  }
+}
+//Generate audio, but don't actually output it (Used for when sound is disabled by user/browser):
+GameBoyCore.prototype.generateAudioFake = function (numSamples) {
+  if (this.soundMasterEnabled && !this.CPUStopped) {
+    while (--numSamples > -1) {
+      this.computeAudioChannels();
+      if (--this.sequencerClocks == 0) {
+        this.audioComputeSequencer();
+        this.sequencerClocks = 0x2000;
+      }
+    }
+  }
+}
+GameBoyCore.prototype.audioJIT = function () {
+  //Audio Sample Generation Timing:
+  if (settings[0]) {
+    this.generateAudio(this.audioTicks);
+  }
+  else {
+    this.generateAudioFake(this.audioTicks);
+  }
+  this.audioTicks = 0;
+}
+GameBoyCore.prototype.audioComputeSequencer = function () {
+  switch (this.sequencePosition++) {
+    case 0:
+      this.clockAudioLength();
+      break;
+    case 2:
+      this.clockAudioLength();
+      this.clockAudioSweep();
+      break;
+    case 4:
+      this.clockAudioLength();
+      break;
+    case 6:
+      this.clockAudioLength();
+      this.clockAudioSweep();
+      break;
+    case 7:
+      this.clockAudioEnvelope();
+      this.sequencePosition = 0;
+  }
+}
+GameBoyCore.prototype.clockAudioLength = function () {
+  //Channel 1:
+  if (this.channel1totalLength > 1) {
+    --this.channel1totalLength;
+  }
+  else if (this.channel1totalLength == 1) {
+    this.channel1totalLength = 0;
+    this.channel1EnableCheck();
+    this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
+  }
+  //Channel 2:
+  if (this.channel2totalLength > 1) {
+    --this.channel2totalLength;
+  }
+  else if (this.channel2totalLength == 1) {
+    this.channel2totalLength = 0;
+    this.channel2EnableCheck();
+    this.memory[0xFF26] &= 0xFD;  //Channel #2 On Flag Off
+  }
+  //Channel 3:
+  if (this.channel3totalLength > 1) {
+    --this.channel3totalLength;
+  }
+  else if (this.channel3totalLength == 1) {
+    this.channel3totalLength = 0;
+    this.channel3EnableCheck();
+    this.memory[0xFF26] &= 0xFB;  //Channel #3 On Flag Off
+  }
+  //Channel 4:
+  if (this.channel4totalLength > 1) {
+    --this.channel4totalLength;
+  }
+  else if (this.channel4totalLength == 1) {
+    this.channel4totalLength = 0;
+    this.channel4EnableCheck();
+    this.memory[0xFF26] &= 0xF7;  //Channel #4 On Flag Off
+  }
+}
+GameBoyCore.prototype.clockAudioSweep = function () {
+  //Channel 1:
+  if (!this.channel1SweepFault && this.channel1timeSweep > 0) {
+    if (--this.channel1timeSweep == 0) {
+      this.runAudioSweep();
+    }
+  }
+}
+GameBoyCore.prototype.runAudioSweep = function () {
+  //Channel 1:
+  if (this.channel1lastTimeSweep > 0) {
+    if (this.channel1frequencySweepDivider > 0) {
+      if (this.channel1numSweep > 0) {
+        --this.channel1numSweep;
+        if (this.channel1decreaseSweep) {
+          this.channel1ShadowFrequency -= this.channel1ShadowFrequency >> this.channel1frequencySweepDivider;
+          this.channel1frequency = this.channel1ShadowFrequency & 0x7FF;
+          this.channel1FrequencyTracker = (0x800 - this.channel1frequency) << 2;
+        }
+        else {
+          this.channel1ShadowFrequency += this.channel1ShadowFrequency >> this.channel1frequencySweepDivider;
+          this.channel1frequency = this.channel1ShadowFrequency;
+          if (this.channel1ShadowFrequency <= 0x7FF) {
+            this.channel1FrequencyTracker = (0x800 - this.channel1frequency) << 2;
+            //Run overflow check twice:
+            if ((this.channel1ShadowFrequency + (this.channel1ShadowFrequency >> this.channel1frequencySweepDivider)) > 0x7FF) {
+              this.channel1SweepFault = true;
+              this.channel1EnableCheck();
+              this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
+            }
+          }
+          else {
+            this.channel1frequency &= 0x7FF;
+            this.channel1SweepFault = true;
+            this.channel1EnableCheck();
+            this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
+          }
+        }
+      }
+      this.channel1timeSweep = this.channel1lastTimeSweep;
+    }
+    else {
+      //Channel has sweep disabled and timer becomes a length counter:
+      this.channel1SweepFault = true;
+      this.channel1EnableCheck();
+    }
+  }
+}
+GameBoyCore.prototype.clockAudioEnvelope = function () {
+  //Channel 1:
+  if (this.channel1envelopeSweepsLast > -1) {
+    if (this.channel1envelopeSweeps > 0) {
+      --this.channel1envelopeSweeps;
+    }
+    else {
+      if (!this.channel1envelopeType) {
+        if (this.channel1envelopeVolume > 0) {
+          --this.channel1envelopeVolume;
+          this.channel1envelopeSweeps = this.channel1envelopeSweepsLast;
+          this.channel1OutputLevelCache();
+        }
+        else {
+          this.channel1envelopeSweepsLast = -1;
+        }
+      }
+      else if (this.channel1envelopeVolume < 0xF) {
+        ++this.channel1envelopeVolume;
+        this.channel1envelopeSweeps = this.channel1envelopeSweepsLast;
+        this.channel1OutputLevelCache();
+      }
+      else {
+        this.channel1envelopeSweepsLast = -1;
+      }
+    }
+  }
+  //Channel 2:
+  if (this.channel2envelopeSweepsLast > -1) {
+    if (this.channel2envelopeSweeps > 0) {
+      --this.channel2envelopeSweeps;
+    }
+    else {
+      if (!this.channel2envelopeType) {
+        if (this.channel2envelopeVolume > 0) {
+          --this.channel2envelopeVolume;
+          this.channel2envelopeSweeps = this.channel2envelopeSweepsLast;
+          this.channel2OutputLevelCache();
+        }
+        else {
+          this.channel2envelopeSweepsLast = -1;
+        }
+      }
+      else if (this.channel2envelopeVolume < 0xF) {
+        ++this.channel2envelopeVolume;
+        this.channel2envelopeSweeps = this.channel2envelopeSweepsLast;
+        this.channel2OutputLevelCache();
+      }
+      else {
+        this.channel2envelopeSweepsLast = -1;
+      }
+    }
+  }
+  //Channel 4:
+  if (this.channel4envelopeSweepsLast > -1) {
+    if (this.channel4envelopeSweeps > 0) {
+      --this.channel4envelopeSweeps;
+    }
+    else {
+      if (!this.channel4envelopeType) {
+        if (this.channel4envelopeVolume > 0) {
+          this.channel4currentVolume = --this.channel4envelopeVolume << this.channel4VolumeShifter;
+          this.channel4envelopeSweeps = this.channel4envelopeSweepsLast;
+          this.channel4UpdateCache();
+        }
+        else {
+          this.channel4envelopeSweepsLast = -1;
+        }
+      }
+      else if (this.channel4envelopeVolume < 0xF) {
+        this.channel4currentVolume = ++this.channel4envelopeVolume << this.channel4VolumeShifter;
+        this.channel4envelopeSweeps = this.channel4envelopeSweepsLast;
+        this.channel4UpdateCache();
+      }
+      else {
+        this.channel4envelopeSweepsLast = -1;
+      }
+    }
+  }
+}
+GameBoyCore.prototype.computeAudioChannels = function () {
+  //Channel 1 counter:
+  if (--this.channel1FrequencyCounter == 0) {
+    this.channel1FrequencyCounter = this.channel1FrequencyTracker;
+    this.channel1DutyTracker = (this.channel1DutyTracker + 1) & 0x7;
+    this.channel1OutputLevelTrimaryCache();
+  }
+  //Channel 2 counter:
+  if (--this.channel2FrequencyCounter == 0) {
+    this.channel2FrequencyCounter = this.channel2FrequencyTracker;
+    this.channel2DutyTracker = (this.channel2DutyTracker + 1) & 0x7;
+    this.channel2OutputLevelTrimaryCache();
+  }
+  //Channel 3 counter:
+  if (--this.channel3Counter == 0) {
+    if (this.channel3canPlay) {
+      this.channel3lastSampleLookup = (this.channel3lastSampleLookup + 1) & 0x1F;
+    }
+    this.channel3Counter = this.channel3FrequencyPeriod;
+    this.channel3UpdateCache();
+  }
+  //Channel 4 counter:
+  if (--this.channel4Counter == 0) {
+    this.channel4lastSampleLookup = (this.channel4lastSampleLookup + 1) & this.channel4BitRange;
+    this.channel4Counter = this.channel4FrequencyPeriod;
+    this.channel4UpdateCache();
+  }
+}
+GameBoyCore.prototype.channel1EnableCheck = function () {
+  this.channel1Enabled = ((this.channel1consecutive || this.channel1totalLength > 0) && !this.channel1SweepFault && this.channel1canPlay);
+  this.channel1OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel1VolumeEnableCheck = function () {
+  this.channel1canPlay = (this.memory[0xFF12] > 7);
+  this.channel1EnableCheck();
+  this.channel1OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel1OutputLevelCache = function () {
+  this.channel1currentSampleLeft = (this.leftChannel1) ? this.channel1envelopeVolume : 0;
+  this.channel1currentSampleRight = (this.rightChannel1) ? this.channel1envelopeVolume : 0;
+  this.channel1OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel1OutputLevelSecondaryCache = function () {
+  if (this.channel1Enabled) {
+    this.channel1currentSampleLeftSecondary = this.channel1currentSampleLeft;
+    this.channel1currentSampleRightSecondary = this.channel1currentSampleRight;
+  }
+  else {
+    this.channel1currentSampleLeftSecondary = 0;
+    this.channel1currentSampleRightSecondary = 0;
+  }
+  this.channel1OutputLevelTrimaryCache();
+}
+GameBoyCore.prototype.channel1OutputLevelTrimaryCache = function () {
+  if (this.channel1CachedDuty[this.channel1DutyTracker]) {
+    this.channel1currentSampleLeftTrimary = this.channel1currentSampleLeftSecondary;
+    this.channel1currentSampleRightTrimary = this.channel1currentSampleRightSecondary;
+  }
+  else {
+    this.channel1currentSampleLeftTrimary = 0;
+    this.channel1currentSampleRightTrimary = 0;
+  }
+  this.mixerOutputLevelCache();
+}
+GameBoyCore.prototype.channel2EnableCheck = function () {
+  this.channel2Enabled = ((this.channel2consecutive || this.channel2totalLength > 0) && this.channel2canPlay);
+  this.channel2OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel2VolumeEnableCheck = function () {
+  this.channel2canPlay = (this.memory[0xFF17] > 7);
+  this.channel2EnableCheck();
+  this.channel2OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel2OutputLevelCache = function () {
+  this.channel2currentSampleLeft = (this.leftChannel2) ? this.channel2envelopeVolume : 0;
+  this.channel2currentSampleRight = (this.rightChannel2) ? this.channel2envelopeVolume : 0;
+  this.channel2OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel2OutputLevelSecondaryCache = function () {
+  if (this.channel2Enabled) {
+    this.channel2currentSampleLeftSecondary = this.channel2currentSampleLeft;
+    this.channel2currentSampleRightSecondary = this.channel2currentSampleRight;
+  }
+  else {
+    this.channel2currentSampleLeftSecondary = 0;
+    this.channel2currentSampleRightSecondary = 0;
+  }
+  this.channel2OutputLevelTrimaryCache();
+}
+GameBoyCore.prototype.channel2OutputLevelTrimaryCache = function () {
+  if (this.channel2CachedDuty[this.channel2DutyTracker]) {
+    this.channel2currentSampleLeftTrimary = this.channel2currentSampleLeftSecondary;
+    this.channel2currentSampleRightTrimary = this.channel2currentSampleRightSecondary;
+  }
+  else {
+    this.channel2currentSampleLeftTrimary = 0;
+    this.channel2currentSampleRightTrimary = 0;
+  }
+  this.mixerOutputLevelCache();
+}
+GameBoyCore.prototype.channel3EnableCheck = function () {
+  this.channel3Enabled = (/*this.channel3canPlay && */(this.channel3consecutive || this.channel3totalLength > 0));
+  this.channel3OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel3OutputLevelCache = function () {
+  this.channel3currentSampleLeft = (this.leftChannel3) ? this.cachedChannel3Sample : 0;
+  this.channel3currentSampleRight = (this.rightChannel3) ? this.cachedChannel3Sample : 0;
+  this.channel3OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel3OutputLevelSecondaryCache = function () {
+  if (this.channel3Enabled) {
+    this.channel3currentSampleLeftSecondary = this.channel3currentSampleLeft;
+    this.channel3currentSampleRightSecondary = this.channel3currentSampleRight;
+  }
+  else {
+    this.channel3currentSampleLeftSecondary = 0;
+    this.channel3currentSampleRightSecondary = 0;
+  }
+  this.mixerOutputLevelCache();
+}
+GameBoyCore.prototype.channel4EnableCheck = function () {
+  this.channel4Enabled = ((this.channel4consecutive || this.channel4totalLength > 0) && this.channel4canPlay);
+  this.channel4OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel4VolumeEnableCheck = function () {
+  this.channel4canPlay = (this.memory[0xFF21] > 7);
+  this.channel4EnableCheck();
+  this.channel4OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel4OutputLevelCache = function () {
+  this.channel4currentSampleLeft = (this.leftChannel4) ? this.cachedChannel4Sample : 0;
+  this.channel4currentSampleRight = (this.rightChannel4) ? this.cachedChannel4Sample : 0;
+  this.channel4OutputLevelSecondaryCache();
+}
+GameBoyCore.prototype.channel4OutputLevelSecondaryCache = function () {
+  if (this.channel4Enabled) {
+    this.channel4currentSampleLeftSecondary = this.channel4currentSampleLeft;
+    this.channel4currentSampleRightSecondary = this.channel4currentSampleRight;
+  }
+  else {
+    this.channel4currentSampleLeftSecondary = 0;
+    this.channel4currentSampleRightSecondary = 0;
+  }
+  this.mixerOutputLevelCache();
+}
+GameBoyCore.prototype.mixerOutputLevelCache = function () {
+  this.mixerOutputCache = ((((this.channel1currentSampleLeftTrimary + this.channel2currentSampleLeftTrimary + this.channel3currentSampleLeftSecondary + this.channel4currentSampleLeftSecondary) * this.VinLeftChannelMasterVolume) << 9) +
+  ((this.channel1currentSampleRightTrimary + this.channel2currentSampleRightTrimary + this.channel3currentSampleRightSecondary + this.channel4currentSampleRightSecondary) * this.VinRightChannelMasterVolume));
+}
+GameBoyCore.prototype.channel3UpdateCache = function () {
+  this.cachedChannel3Sample = this.channel3PCM[this.channel3lastSampleLookup] >> this.channel3patternType;
+  this.channel3OutputLevelCache();
+}
+GameBoyCore.prototype.channel3WriteRAM = function (address, data) {
+  if (this.channel3canPlay) {
+    this.audioJIT();
+    //address = this.channel3lastSampleLookup >> 1;
+  }
+  this.memory[0xFF30 | address] = data;
+  address <<= 1;
+  this.channel3PCM[address] = data >> 4;
+  this.channel3PCM[address | 1] = data & 0xF;
+}
+GameBoyCore.prototype.channel4UpdateCache = function () {
+  this.cachedChannel4Sample = this.noiseSampleTable[this.channel4currentVolume | this.channel4lastSampleLookup];
+  this.channel4OutputLevelCache();
+}
+GameBoyCore.prototype.run = function () {
+  //The preprocessing before the actual iteration loop:
+  if ((this.stopEmulator & 2) == 0) {
+    if ((this.stopEmulator & 1) == 1) {
+      if (!this.CPUStopped) {
+        this.stopEmulator = 0;
+        this.drewFrame = false;
+        this.audioUnderrunAdjustment();
+        this.clockUpdate();      //RTC clocking.
+        if (!this.halt) {
+          this.executeIteration();
+        }
+        else {            //Finish the HALT rundown execution.
+          this.CPUTicks = 0;
+          this.calculateHALTPeriod();
+          if (this.halt) {
+            this.updateCoreFull();
+          }
+          else {
+            this.executeIteration();
+          }
+        }
+        //Request the graphics target to be updated:
+        this.requestDraw();
+      }
+      else {
+        this.audioUnderrunAdjustment();
+        this.audioTicks += this.CPUCyclesTotal;
+        this.audioJIT();
+        this.stopEmulator |= 1;      //End current loop.
+      }
+    }
+    else {    //We can only get here if there was an internal error, but the loop was restarted.
+      cout("Iterator restarted a faulted core.", 2);
+      pause();
+    }
+  }
+}
+
+GameBoyCore.prototype.executeIteration = function () {
+  //Iterate the interpreter loop:
+  var opcodeToExecute = 0;
+  var timedTicks = 0;
+  while (this.stopEmulator == 0) {
+    //Interrupt Arming:
+    switch (this.IRQEnableDelay) {
+      case 1:
+        this.IME = true;
+        this.checkIRQMatching();
+      case 2:
+        --this.IRQEnableDelay;
+    }
+    //Is an IRQ set to fire?:
+    if (this.IRQLineMatched > 0) {
+      //IME is true and and interrupt was matched:
+      this.launchIRQ();
+    }
+    //Fetch the current opcode:
+    opcodeToExecute = this.memoryReader[this.programCounter](this, this.programCounter);
+    //Increment the program counter to the next instruction:
+    this.programCounter = (this.programCounter + 1) & 0xFFFF;
+    //Check for the program counter quirk:
+    if (this.skipPCIncrement) {
+      this.programCounter = (this.programCounter - 1) & 0xFFFF;
+      this.skipPCIncrement = false;
+    }
+    //Get how many CPU cycles the current instruction counts for:
+    this.CPUTicks = this.TICKTable[opcodeToExecute];
+    //Execute the current instruction:
+    this.OPCODE[opcodeToExecute](this);
+    //Update the state (Inlined updateCoreFull manually here):
+    //Update the clocking for the LCD emulation:
+    this.LCDTicks += this.CPUTicks >> this.doubleSpeedShifter;  //LCD Timing
+    this.LCDCONTROL[this.actualScanLine](this);          //Scan Line and STAT Mode Control
+    //Single-speed relative timing for A/V emulation:
+    timedTicks = this.CPUTicks >> this.doubleSpeedShifter;    //CPU clocking can be updated from the LCD handling.
+    this.audioTicks += timedTicks;                //Audio Timing
+    this.emulatorTicks += timedTicks;              //Emulator Timing
+    //CPU Timers:
+    this.DIVTicks += this.CPUTicks;                //DIV Timing
+    if (this.TIMAEnabled) {                    //TIMA Timing
+      this.timerTicks += this.CPUTicks;
+      while (this.timerTicks >= this.TACClocker) {
+        this.timerTicks -= this.TACClocker;
+        if (++this.memory[0xFF05] == 0x100) {
+          this.memory[0xFF05] = this.memory[0xFF06];
+          this.interruptsRequested |= 0x4;
+          this.checkIRQMatching();
+        }
+      }
+    }
+    if (this.serialTimer > 0) {                    //Serial Timing
+      //IRQ Counter:
+      this.serialTimer -= this.CPUTicks;
+      if (this.serialTimer <= 0) {
+        this.interruptsRequested |= 0x8;
+        this.checkIRQMatching();
+      }
+      //Bit Shit Counter:
+      this.serialShiftTimer -= this.CPUTicks;
+      if (this.serialShiftTimer <= 0) {
+        this.serialShiftTimer = this.serialShiftTimerAllocated;
+        this.memory[0xFF01] = ((this.memory[0xFF01] << 1) & 0xFE) | 0x01;  //We could shift in actual link data here if we were to implement such!!!
+      }
+    }
+    //End of iteration routine:
+    if (this.emulatorTicks >= this.CPUCyclesTotal) {
+      this.iterationEndRoutine();
+    }
+    // Start of code added for benchmarking:
+    this.instructions += 1;
+    if (this.instructions > this.totalInstructions) {
+      this.iterationEndRoutine();
+      this.stopEmulator |= 2;
+      checkFinalState();
+    }
+    // End of code added for benchmarking.
+  }
+}
+GameBoyCore.prototype.iterationEndRoutine = function () {
+  if ((this.stopEmulator & 0x1) == 0) {
+    this.audioJIT();  //Make sure we at least output once per iteration.
+    //Update DIV Alignment (Integer overflow safety):
+    this.memory[0xFF04] = (this.memory[0xFF04] + (this.DIVTicks >> 8)) & 0xFF;
+    this.DIVTicks &= 0xFF;
+    //Update emulator flags:
+    this.stopEmulator |= 1;      //End current loop.
+    this.emulatorTicks -= this.CPUCyclesTotal;
+    this.CPUCyclesTotalCurrent += this.CPUCyclesTotalRoundoff;
+    this.recalculateIterationClockLimit();
+  }
+}
+GameBoyCore.prototype.handleSTOP = function () {
+  this.CPUStopped = true;            //Stop CPU until joypad input changes.
+  this.iterationEndRoutine();
+  if (this.emulatorTicks < 0) {
+    this.audioTicks -= this.emulatorTicks;
+    this.audioJIT();
+  }
+}
+GameBoyCore.prototype.recalculateIterationClockLimit = function () {
+  var endModulus = this.CPUCyclesTotalCurrent % 4;
+  this.CPUCyclesTotal = this.CPUCyclesTotalBase + this.CPUCyclesTotalCurrent - endModulus;
+  this.CPUCyclesTotalCurrent = endModulus;
+}
+GameBoyCore.prototype.scanLineMode2 = function () {  //OAM Search Period
+  if (this.STATTracker != 1) {
+    if (this.mode2TriggerSTAT) {
+      this.interruptsRequested |= 0x2;
+      this.checkIRQMatching();
+    }
+    this.STATTracker = 1;
+    this.modeSTAT = 2;
+  }
+}
+GameBoyCore.prototype.scanLineMode3 = function () {  //Scan Line Drawing Period
+  if (this.modeSTAT != 3) {
+    if (this.STATTracker == 0 && this.mode2TriggerSTAT) {
+      this.interruptsRequested |= 0x2;
+      this.checkIRQMatching();
+    }
+    this.STATTracker = 1;
+    this.modeSTAT = 3;
+  }
+}
+GameBoyCore.prototype.scanLineMode0 = function () {  //Horizontal Blanking Period
+  if (this.modeSTAT != 0) {
+    if (this.STATTracker != 2) {
+      if (this.STATTracker == 0) {
+        if (this.mode2TriggerSTAT) {
+          this.interruptsRequested |= 0x2;
+          this.checkIRQMatching();
+        }
+        this.modeSTAT = 3;
+      }
+      this.incrementScanLineQueue();
+      this.updateSpriteCount(this.actualScanLine);
+      this.STATTracker = 2;
+    }
+    if (this.LCDTicks >= this.spriteCount) {
+      if (this.hdmaRunning) {
+        this.executeHDMA();
+      }
+      if (this.mode0TriggerSTAT) {
+        this.interruptsRequested |= 0x2;
+        this.checkIRQMatching();
+      }
+      this.STATTracker = 3;
+      this.modeSTAT = 0;
+    }
+  }
+}
+GameBoyCore.prototype.clocksUntilLYCMatch = function () {
+  if (this.memory[0xFF45] != 0) {
+    if (this.memory[0xFF45] > this.actualScanLine) {
+      return 456 * (this.memory[0xFF45] - this.actualScanLine);
+    }
+    return 456 * (154 - this.actualScanLine + this.memory[0xFF45]);
+  }
+  return (456 * ((this.actualScanLine == 153 && this.memory[0xFF44] == 0) ? 154 : (153 - this.actualScanLine))) + 8;
+}
+GameBoyCore.prototype.clocksUntilMode0 = function () {
+  switch (this.modeSTAT) {
+    case 0:
+      if (this.actualScanLine == 143) {
+        this.updateSpriteCount(0);
+        return this.spriteCount + 5016;
+      }
+      this.updateSpriteCount(this.actualScanLine + 1);
+      return this.spriteCount + 456;
+    case 2:
+    case 3:
+      this.updateSpriteCount(this.actualScanLine);
+      return this.spriteCount;
+    case 1:
+      this.updateSpriteCount(0);
+      return this.spriteCount + (456 * (154 - this.actualScanLine));
+  }
+}
+GameBoyCore.prototype.updateSpriteCount = function (line) {
+  this.spriteCount = 252;
+  if (this.cGBC && this.gfxSpriteShow) {                    //Is the window enabled and are we in CGB mode?
+    var lineAdjusted = line + 0x10;
+    var yoffset = 0;
+    var yCap = (this.gfxSpriteNormalHeight) ? 0x8 : 0x10;
+    for (var OAMAddress = 0xFE00; OAMAddress < 0xFEA0 && this.spriteCount < 312; OAMAddress += 4) {
+      yoffset = lineAdjusted - this.memory[OAMAddress];
+      if (yoffset > -1 && yoffset < yCap) {
+        this.spriteCount += 6;
+      }
+    }
+  }
+}
+GameBoyCore.prototype.matchLYC = function () {  //LYC Register Compare
+  if (this.memory[0xFF44] == this.memory[0xFF45]) {
+    this.memory[0xFF41] |= 0x04;
+    if (this.LYCMatchTriggerSTAT) {
+      this.interruptsRequested |= 0x2;
+      this.checkIRQMatching();
+    }
+  }
+  else {
+    this.memory[0xFF41] &= 0x7B;
+  }
+}
+GameBoyCore.prototype.updateCore = function () {
+  //Update the clocking for the LCD emulation:
+  this.LCDTicks += this.CPUTicks >> this.doubleSpeedShifter;  //LCD Timing
+  this.LCDCONTROL[this.actualScanLine](this);          //Scan Line and STAT Mode Control
+  //Single-speed relative timing for A/V emulation:
+  var timedTicks = this.CPUTicks >> this.doubleSpeedShifter;  //CPU clocking can be updated from the LCD handling.
+  this.audioTicks += timedTicks;                //Audio Timing
+  this.emulatorTicks += timedTicks;              //Emulator Timing
+  //CPU Timers:
+  this.DIVTicks += this.CPUTicks;                //DIV Timing
+  if (this.TIMAEnabled) {                    //TIMA Timing
+    this.timerTicks += this.CPUTicks;
+    while (this.timerTicks >= this.TACClocker) {
+      this.timerTicks -= this.TACClocker;
+      if (++this.memory[0xFF05] == 0x100) {
+        this.memory[0xFF05] = this.memory[0xFF06];
+        this.interruptsRequested |= 0x4;
+        this.checkIRQMatching();
+      }
+    }
+  }
+  if (this.serialTimer > 0) {                    //Serial Timing
+    //IRQ Counter:
+    this.serialTimer -= this.CPUTicks;
+    if (this.serialTimer <= 0) {
+      this.interruptsRequested |= 0x8;
+      this.checkIRQMatching();
+    }
+    //Bit Shit Counter:
+    this.serialShiftTimer -= this.CPUTicks;
+    if (this.serialShiftTimer <= 0) {
+      this.serialShiftTimer = this.serialShiftTimerAllocated;
+      this.memory[0xFF01] = ((this.memory[0xFF01] << 1) & 0xFE) | 0x01;  //We could shift in actual link data here if we were to implement such!!!
+    }
+  }
+}
+GameBoyCore.prototype.updateCoreFull = function () {
+  //Update the state machine:
+  this.updateCore();
+  //End of iteration routine:
+  if (this.emulatorTicks >= this.CPUCyclesTotal) {
+    this.iterationEndRoutine();
+  }
+}
+GameBoyCore.prototype.initializeLCDController = function () {
+  //Display on hanlding:
+  var line = 0;
+  while (line < 154) {
+    if (line < 143) {
+      //We're on a normal scan line:
+      this.LINECONTROL[line] = function (parentObj) {
+        if (parentObj.LCDTicks < 80) {
+          parentObj.scanLineMode2();
+        }
+        else if (parentObj.LCDTicks < 252) {
+          parentObj.scanLineMode3();
+        }
+        else if (parentObj.LCDTicks < 456) {
+          parentObj.scanLineMode0();
+        }
+        else {
+          //We're on a new scan line:
+          parentObj.LCDTicks -= 456;
+          if (parentObj.STATTracker != 3) {
+            //Make sure the mode 0 handler was run at least once per scan line:
+            if (parentObj.STATTracker != 2) {
+              if (parentObj.STATTracker == 0 && parentObj.mode2TriggerSTAT) {
+                parentObj.interruptsRequested |= 0x2;
+              }
+              parentObj.incrementScanLineQueue();
+            }
+            if (parentObj.hdmaRunning) {
+              parentObj.executeHDMA();
+            }
+            if (parentObj.mode0TriggerSTAT) {
+              parentObj.interruptsRequested |= 0x2;
+            }
+          }
+          //Update the scanline registers and assert the LYC counter:
+          parentObj.actualScanLine = ++parentObj.memory[0xFF44];
+          //Perform a LYC counter assert:
+          if (parentObj.actualScanLine == parentObj.memory[0xFF45]) {
+            parentObj.memory[0xFF41] |= 0x04;
+            if (parentObj.LYCMatchTriggerSTAT) {
+              parentObj.interruptsRequested |= 0x2;
+            }
+          }
+          else {
+            parentObj.memory[0xFF41] &= 0x7B;
+          }
+          parentObj.checkIRQMatching();
+          //Reset our mode contingency variables:
+          parentObj.STATTracker = 0;
+          parentObj.modeSTAT = 2;
+          parentObj.LINECONTROL[parentObj.actualScanLine](parentObj);  //Scan Line and STAT Mode Control.
+        }
+      }
+    }
+    else if (line == 143) {
+      //We're on the last visible scan line of the LCD screen:
+      this.LINECONTROL[143] = function (parentObj) {
+        if (parentObj.LCDTicks < 80) {
+          parentObj.scanLineMode2();
+        }
+        else if (parentObj.LCDTicks < 252) {
+          parentObj.scanLineMode3();
+        }
+        else if (parentObj.LCDTicks < 456) {
+          parentObj.scanLineMode0();
+        }
+        else {
+          //Starting V-Blank:
+          //Just finished the last visible scan line:
+          parentObj.LCDTicks -= 456;
+          if (parentObj.STATTracker != 3) {
+            //Make sure the mode 0 handler was run at least once per scan line:
+            if (parentObj.STATTracker != 2) {
+              if (parentObj.STATTracker == 0 && parentObj.mode2TriggerSTAT) {
+                parentObj.interruptsRequested |= 0x2;
+              }
+              parentObj.incrementScanLineQueue();
+            }
+            if (parentObj.hdmaRunning) {
+              parentObj.executeHDMA();
+            }
+            if (parentObj.mode0TriggerSTAT) {
+              parentObj.interruptsRequested |= 0x2;
+            }
+          }
+          //Update the scanline registers and assert the LYC counter:
+          parentObj.actualScanLine = parentObj.memory[0xFF44] = 144;
+          //Perform a LYC counter assert:
+          if (parentObj.memory[0xFF45] == 144) {
+            parentObj.memory[0xFF41] |= 0x04;
+            if (parentObj.LYCMatchTriggerSTAT) {
+              parentObj.interruptsRequested |= 0x2;
+            }
+          }
+          else {
+            parentObj.memory[0xFF41] &= 0x7B;
+          }
+          //Reset our mode contingency variables:
+          parentObj.STATTracker = 0;
+          //Update our state for v-blank:
+          parentObj.modeSTAT = 1;
+          parentObj.interruptsRequested |= (parentObj.mode1TriggerSTAT) ? 0x3 : 0x1;
+          parentObj.checkIRQMatching();
+          //Attempt to blit out to our canvas:
+          if (parentObj.drewBlank == 0) {
+            //Ensure JIT framing alignment:
+            if (parentObj.totalLinesPassed < 144 || (parentObj.totalLinesPassed == 144 && parentObj.midScanlineOffset > -1)) {
+              //Make sure our gfx are up-to-date:
+              parentObj.graphicsJITVBlank();
+              //Draw the frame:
+              parentObj.prepareFrame();
+            }
+          }
+          else {
+            //LCD off takes at least 2 frames:
+            --parentObj.drewBlank;
+          }
+          parentObj.LINECONTROL[144](parentObj);  //Scan Line and STAT Mode Control.
+        }
+      }
+    }
+    else if (line < 153) {
+      //In VBlank
+      this.LINECONTROL[line] = function (parentObj) {
+        if (parentObj.LCDTicks >= 456) {
+          //We're on a new scan line:
+          parentObj.LCDTicks -= 456;
+          parentObj.actualScanLine = ++parentObj.memory[0xFF44];
+          //Perform a LYC counter assert:
+          if (parentObj.actualScanLine == parentObj.memory[0xFF45]) {
+            parentObj.memory[0xFF41] |= 0x04;
+            if (parentObj.LYCMatchTriggerSTAT) {
+              parentObj.interruptsRequested |= 0x2;
+              parentObj.checkIRQMatching();
+            }
+          }
+          else {
+            parentObj.memory[0xFF41] &= 0x7B;
+          }
+          parentObj.LINECONTROL[parentObj.actualScanLine](parentObj);  //Scan Line and STAT Mode Control.
+        }
+      }
+    }
+    else {
+      //VBlank Ending (We're on the last actual scan line)
+      this.LINECONTROL[153] = function (parentObj) {
+        if (parentObj.LCDTicks >= 8) {
+          if (parentObj.STATTracker != 4 && parentObj.memory[0xFF44] == 153) {
+            parentObj.memory[0xFF44] = 0;  //LY register resets to 0 early.
+            //Perform a LYC counter assert:
+            if (parentObj.memory[0xFF45] == 0) {
+              parentObj.memory[0xFF41] |= 0x04;
+              if (parentObj.LYCMatchTriggerSTAT) {
+                parentObj.interruptsRequested |= 0x2;
+                parentObj.checkIRQMatching();
+              }
+            }
+            else {
+              parentObj.memory[0xFF41] &= 0x7B;
+            }
+            parentObj.STATTracker = 4;
+          }
+          if (parentObj.LCDTicks >= 456) {
+            //We reset back to the beginning:
+            parentObj.LCDTicks -= 456;
+            parentObj.STATTracker = parentObj.actualScanLine = 0;
+            parentObj.LINECONTROL[0](parentObj);  //Scan Line and STAT Mode Control.
+          }
+        }
+      }
+    }
+    ++line;
+  }
+}
+GameBoyCore.prototype.DisplayShowOff = function () {
+  if (this.drewBlank == 0) {
+    //Output a blank screen to the output framebuffer:
+    this.clearFrameBuffer();
+    this.drewFrame = true;
+  }
+  this.drewBlank = 2;
+}
+GameBoyCore.prototype.executeHDMA = function () {
+  this.DMAWrite(1);
+  if (this.halt) {
+    if ((this.LCDTicks - this.spriteCount) < ((4 >> this.doubleSpeedShifter) | 0x20)) {
+      //HALT clocking correction:
+      this.CPUTicks = 4 + ((0x20 + this.spriteCount) << this.doubleSpeedShifter);
+      this.LCDTicks = this.spriteCount + ((4 >> this.doubleSpeedShifter) | 0x20);
+    }
+  }
+  else {
+    this.LCDTicks += (4 >> this.doubleSpeedShifter) | 0x20;      //LCD Timing Update For HDMA.
+  }
+  if (this.memory[0xFF55] == 0) {
+    this.hdmaRunning = false;
+    this.memory[0xFF55] = 0xFF;  //Transfer completed ("Hidden last step," since some ROMs don't imply this, but most do).
+  }
+  else {
+    --this.memory[0xFF55];
+  }
+}
+GameBoyCore.prototype.clockUpdate = function () {
+  if (this.cTIMER) {
+    var dateObj = new_Date(); // The line is changed for benchmarking.
+    var newTime = dateObj.getTime();
+    var timeElapsed = newTime - this.lastIteration;  //Get the numnber of milliseconds since this last executed.
+    this.lastIteration = newTime;
+    if (this.cTIMER && !this.RTCHALT) {
+      //Update the MBC3 RTC:
+      this.RTCSeconds += timeElapsed / 1000;
+      while (this.RTCSeconds >= 60) {  //System can stutter, so the seconds difference can get large, thus the "while".
+        this.RTCSeconds -= 60;
+        ++this.RTCMinutes;
+        if (this.RTCMinutes >= 60) {
+          this.RTCMinutes -= 60;
+          ++this.RTCHours;
+          if (this.RTCHours >= 24) {
+            this.RTCHours -= 24
+            ++this.RTCDays;
+            if (this.RTCDays >= 512) {
+              this.RTCDays -= 512;
+              this.RTCDayOverFlow = true;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+GameBoyCore.prototype.prepareFrame = function () {
+  //Copy the internal frame buffer to the output buffer:
+  this.swizzleFrameBuffer();
+  this.drewFrame = true;
+}
+GameBoyCore.prototype.requestDraw = function () {
+  if (this.drewFrame) {
+    this.dispatchDraw();
+  }
+}
+GameBoyCore.prototype.dispatchDraw = function () {
+  var canvasRGBALength = this.offscreenRGBCount;
+  if (canvasRGBALength > 0) {
+    //We actually updated the graphics internally, so copy out:
+    var frameBuffer = (canvasRGBALength == 92160) ? this.swizzledFrame : this.resizeFrameBuffer();
+    var canvasData = this.canvasBuffer.data;
+    var bufferIndex = 0;
+    for (var canvasIndex = 0; canvasIndex < canvasRGBALength; ++canvasIndex) {
+      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
+      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
+      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
+    }
+    this.graphicsBlit();
+  }
+}
+GameBoyCore.prototype.swizzleFrameBuffer = function () {
+  //Convert our dirty 24-bit (24-bit, with internal render flags above it) framebuffer to an 8-bit buffer with separate indices for the RGB channels:
+  var frameBuffer = this.frameBuffer;
+  var swizzledFrame = this.swizzledFrame;
+  var bufferIndex = 0;
+  for (var canvasIndex = 0; canvasIndex < 69120;) {
+    swizzledFrame[canvasIndex++] = (frameBuffer[bufferIndex] >> 16) & 0xFF;    //Red
+    swizzledFrame[canvasIndex++] = (frameBuffer[bufferIndex] >> 8) & 0xFF;    //Green
+    swizzledFrame[canvasIndex++] = frameBuffer[bufferIndex++] & 0xFF;      //Blue
+  }
+}
+GameBoyCore.prototype.clearFrameBuffer = function () {
+  var bufferIndex = 0;
+  var frameBuffer = this.swizzledFrame;
+  if (this.cGBC || this.colorizedGBPalettes) {
+    while (bufferIndex < 69120) {
+      frameBuffer[bufferIndex++] = 248;
+    }
+  }
+  else {
+    while (bufferIndex < 69120) {
+      frameBuffer[bufferIndex++] = 239;
+      frameBuffer[bufferIndex++] = 255;
+      frameBuffer[bufferIndex++] = 222;
+    }
+  }
+}
+GameBoyCore.prototype.resizeFrameBuffer = function () {
+  //Return a reference to the generated resized framebuffer:
+  return this.resizer.resize(this.swizzledFrame);
+}
+GameBoyCore.prototype.compileResizeFrameBufferFunction = function () {
+  if (this.offscreenRGBCount > 0) {
+    this.resizer = new Resize(160, 144, this.offscreenWidth, this.offscreenHeight, false, true);
+  }
+}
+GameBoyCore.prototype.renderScanLine = function (scanlineToRender) {
+  this.pixelStart = scanlineToRender * 160;
+  if (this.bgEnabled) {
+    this.pixelEnd = 160;
+    this.BGLayerRender(scanlineToRender);
+    this.WindowLayerRender(scanlineToRender);
+  }
+  else {
+    var pixelLine = (scanlineToRender + 1) * 160;
+    var defaultColor = (this.cGBC || this.colorizedGBPalettes) ? 0xF8F8F8 : 0xEFFFDE;
+    for (var pixelPosition = (scanlineToRender * 160) + this.currentX; pixelPosition < pixelLine; pixelPosition++) {
+      this.frameBuffer[pixelPosition] = defaultColor;
+    }
+  }
+  this.SpriteLayerRender(scanlineToRender);
+  this.currentX = 0;
+  this.midScanlineOffset = -1;
+}
+GameBoyCore.prototype.renderMidScanLine = function () {
+  if (this.actualScanLine < 144 && this.modeSTAT == 3) {
+    //TODO: Get this accurate:
+    if (this.midScanlineOffset == -1) {
+      this.midScanlineOffset = this.backgroundX & 0x7;
+    }
+    if (this.LCDTicks >= 82) {
+      this.pixelEnd = this.LCDTicks - 74;
+      this.pixelEnd = Math.min(this.pixelEnd - this.midScanlineOffset - (this.pixelEnd % 0x8), 160);
+      if (this.bgEnabled) {
+        this.pixelStart = this.lastUnrenderedLine * 160;
+        this.BGLayerRender(this.lastUnrenderedLine);
+        this.WindowLayerRender(this.lastUnrenderedLine);
+        //TODO: Do midscanline JIT for sprites...
+      }
+      else {
+        var pixelLine = (this.lastUnrenderedLine * 160) + this.pixelEnd;
+        var defaultColor = (this.cGBC || this.colorizedGBPalettes) ? 0xF8F8F8 : 0xEFFFDE;
+        for (var pixelPosition = (this.lastUnrenderedLine * 160) + this.currentX; pixelPosition < pixelLine; pixelPosition++) {
+          this.frameBuffer[pixelPosition] = defaultColor;
+        }
+      }
+      this.currentX = this.pixelEnd;
+    }
+  }
+}
+GameBoyCore.prototype.initializeModeSpecificArrays = function () {
+  this.LCDCONTROL = (this.LCDisOn) ? this.LINECONTROL : this.DISPLAYOFFCONTROL;
+  if (this.cGBC) {
+    this.gbcOBJRawPalette = this.getTypedArray(0x40, 0, "uint8");
+    this.gbcBGRawPalette = this.getTypedArray(0x40, 0, "uint8");
+    this.gbcOBJPalette = this.getTypedArray(0x20, 0x1000000, "int32");
+    this.gbcBGPalette = this.getTypedArray(0x40, 0, "int32");
+    this.BGCHRBank2 = this.getTypedArray(0x800, 0, "uint8");
+    this.BGCHRCurrentBank = (this.currVRAMBank > 0) ? this.BGCHRBank2 : this.BGCHRBank1;
+    this.tileCache = this.generateCacheArray(0xF80);
+  }
+  else {
+    this.gbOBJPalette = this.getTypedArray(8, 0, "int32");
+    this.gbBGPalette = this.getTypedArray(4, 0, "int32");
+    this.BGPalette = this.gbBGPalette;
+    this.OBJPalette = this.gbOBJPalette;
+    this.tileCache = this.generateCacheArray(0x700);
+    this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
+    this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
+  }
+  this.renderPathBuild();
+}
+GameBoyCore.prototype.GBCtoGBModeAdjust = function () {
+  cout("Stepping down from GBC mode.", 0);
+  this.VRAM = this.GBCMemory = this.BGCHRCurrentBank = this.BGCHRBank2 = null;
+  this.tileCache.length = 0x700;
+  if (settings[4]) {
+    this.gbBGColorizedPalette = this.getTypedArray(4, 0, "int32");
+    this.gbOBJColorizedPalette = this.getTypedArray(8, 0, "int32");
+    this.cachedBGPaletteConversion = this.getTypedArray(4, 0, "int32");
+    this.cachedOBJPaletteConversion = this.getTypedArray(8, 0, "int32");
+    this.BGPalette = this.gbBGColorizedPalette;
+    this.OBJPalette = this.gbOBJColorizedPalette;
+    this.gbOBJPalette = this.gbBGPalette = null;
+    this.getGBCColor();
+  }
+  else {
+    this.gbOBJPalette = this.getTypedArray(8, 0, "int32");
+    this.gbBGPalette = this.getTypedArray(4, 0, "int32");
+    this.BGPalette = this.gbBGPalette;
+    this.OBJPalette = this.gbOBJPalette;
+  }
+  this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
+  this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
+  this.renderPathBuild();
+  this.memoryReadJumpCompile();
+  this.memoryWriteJumpCompile();
+}
+GameBoyCore.prototype.renderPathBuild = function () {
+  if (!this.cGBC) {
+    this.BGLayerRender = this.BGGBLayerRender;
+    this.WindowLayerRender = this.WindowGBLayerRender;
+    this.SpriteLayerRender = this.SpriteGBLayerRender;
+  }
+  else {
+    this.priorityFlaggingPathRebuild();
+    this.SpriteLayerRender = this.SpriteGBCLayerRender;
+  }
+}
+GameBoyCore.prototype.priorityFlaggingPathRebuild = function () {
+  if (this.BGPriorityEnabled) {
+    this.BGLayerRender = this.BGGBCLayerRender;
+    this.WindowLayerRender = this.WindowGBCLayerRender;
+  }
+  else {
+    this.BGLayerRender = this.BGGBCLayerRenderNoPriorityFlagging;
+    this.WindowLayerRender = this.WindowGBCLayerRenderNoPriorityFlagging;
+  }
+}
+GameBoyCore.prototype.initializeReferencesFromSaveState = function () {
+  this.LCDCONTROL = (this.LCDisOn) ? this.LINECONTROL : this.DISPLAYOFFCONTROL;
+  var tileIndex = 0;
+  if (!this.cGBC) {
+    if (this.colorizedGBPalettes) {
+      this.BGPalette = this.gbBGColorizedPalette;
+      this.OBJPalette = this.gbOBJColorizedPalette;
+      this.updateGBBGPalette = this.updateGBColorizedBGPalette;
+      this.updateGBOBJPalette = this.updateGBColorizedOBJPalette;
+
+    }
+    else {
+      this.BGPalette = this.gbBGPalette;
+      this.OBJPalette = this.gbOBJPalette;
+    }
+    this.tileCache = this.generateCacheArray(0x700);
+    for (tileIndex = 0x8000; tileIndex < 0x9000; tileIndex += 2) {
+      this.generateGBOAMTileLine(tileIndex);
+    }
+    for (tileIndex = 0x9000; tileIndex < 0x9800; tileIndex += 2) {
+      this.generateGBTileLine(tileIndex);
+    }
+    this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
+    this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
+  }
+  else {
+    this.BGCHRCurrentBank = (this.currVRAMBank > 0) ? this.BGCHRBank2 : this.BGCHRBank1;
+    this.tileCache = this.generateCacheArray(0xF80);
+    for (; tileIndex < 0x1800; tileIndex += 0x10) {
+      this.generateGBCTileBank1(tileIndex);
+      this.generateGBCTileBank2(tileIndex);
+    }
+  }
+  this.renderPathBuild();
+}
+GameBoyCore.prototype.RGBTint = function (value) {
+  //Adjustment for the GBC's tinting (According to Gambatte):
+  var r = value & 0x1F;
+  var g = (value >> 5) & 0x1F;
+  var b = (value >> 10) & 0x1F;
+  return ((r * 13 + g * 2 + b) >> 1) << 16 | (g * 3 + b) << 9 | (r * 3 + g * 2 + b * 11) >> 1;
+}
+GameBoyCore.prototype.getGBCColor = function () {
+  //GBC Colorization of DMG ROMs:
+  //BG
+  for (var counter = 0; counter < 4; counter++) {
+    var adjustedIndex = counter << 1;
+    //BG
+    this.cachedBGPaletteConversion[counter] = this.RGBTint((this.gbcBGRawPalette[adjustedIndex | 1] << 8) | this.gbcBGRawPalette[adjustedIndex]);
+    //OBJ 1
+    this.cachedOBJPaletteConversion[counter] = this.RGBTint((this.gbcOBJRawPalette[adjustedIndex | 1] << 8) | this.gbcOBJRawPalette[adjustedIndex]);
+  }
+  //OBJ 2
+  for (counter = 4; counter < 8; counter++) {
+    adjustedIndex = counter << 1;
+    this.cachedOBJPaletteConversion[counter] = this.RGBTint((this.gbcOBJRawPalette[adjustedIndex | 1] << 8) | this.gbcOBJRawPalette[adjustedIndex]);
+  }
+  //Update the palette entries:
+  this.updateGBBGPalette = this.updateGBColorizedBGPalette;
+  this.updateGBOBJPalette = this.updateGBColorizedOBJPalette;
+  this.updateGBBGPalette(this.memory[0xFF47]);
+  this.updateGBOBJPalette(0, this.memory[0xFF48]);
+  this.updateGBOBJPalette(1, this.memory[0xFF49]);
+  this.colorizedGBPalettes = true;
+}
+GameBoyCore.prototype.updateGBRegularBGPalette = function (data) {
+  this.gbBGPalette[0] = this.colors[data & 0x03] | 0x2000000;
+  this.gbBGPalette[1] = this.colors[(data >> 2) & 0x03];
+  this.gbBGPalette[2] = this.colors[(data >> 4) & 0x03];
+  this.gbBGPalette[3] = this.colors[data >> 6];
+}
+GameBoyCore.prototype.updateGBColorizedBGPalette = function (data) {
+  //GB colorization:
+  this.gbBGColorizedPalette[0] = this.cachedBGPaletteConversion[data & 0x03] | 0x2000000;
+  this.gbBGColorizedPalette[1] = this.cachedBGPaletteConversion[(data >> 2) & 0x03];
+  this.gbBGColorizedPalette[2] = this.cachedBGPaletteConversion[(data >> 4) & 0x03];
+  this.gbBGColorizedPalette[3] = this.cachedBGPaletteConversion[data >> 6];
+}
+GameBoyCore.prototype.updateGBRegularOBJPalette = function (index, data) {
+  this.gbOBJPalette[index | 1] = this.colors[(data >> 2) & 0x03];
+  this.gbOBJPalette[index | 2] = this.colors[(data >> 4) & 0x03];
+  this.gbOBJPalette[index | 3] = this.colors[data >> 6];
+}
+GameBoyCore.prototype.updateGBColorizedOBJPalette = function (index, data) {
+  //GB colorization:
+  this.gbOBJColorizedPalette[index | 1] = this.cachedOBJPaletteConversion[index | ((data >> 2) & 0x03)];
+  this.gbOBJColorizedPalette[index | 2] = this.cachedOBJPaletteConversion[index | ((data >> 4) & 0x03)];
+  this.gbOBJColorizedPalette[index | 3] = this.cachedOBJPaletteConversion[index | (data >> 6)];
+}
+GameBoyCore.prototype.updateGBCBGPalette = function (index, data) {
+  if (this.gbcBGRawPalette[index] != data) {
+    this.midScanLineJIT();
+    //Update the color palette for BG tiles since it changed:
+    this.gbcBGRawPalette[index] = data;
+    if ((index & 0x06) == 0) {
+      //Palette 0 (Special tile Priority stuff)
+      data = 0x2000000 | this.RGBTint((this.gbcBGRawPalette[index | 1] << 8) | this.gbcBGRawPalette[index & 0x3E]);
+      index >>= 1;
+      this.gbcBGPalette[index] = data;
+      this.gbcBGPalette[0x20 | index] = 0x1000000 | data;
+    }
+    else {
+      //Regular Palettes (No special crap)
+      data = this.RGBTint((this.gbcBGRawPalette[index | 1] << 8) | this.gbcBGRawPalette[index & 0x3E]);
+      index >>= 1;
+      this.gbcBGPalette[index] = data;
+      this.gbcBGPalette[0x20 | index] = 0x1000000 | data;
+    }
+  }
+}
+GameBoyCore.prototype.updateGBCOBJPalette = function (index, data) {
+  if (this.gbcOBJRawPalette[index] != data) {
+    //Update the color palette for OBJ tiles since it changed:
+    this.gbcOBJRawPalette[index] = data;
+    if ((index & 0x06) > 0) {
+      //Regular Palettes (No special crap)
+      this.midScanLineJIT();
+      this.gbcOBJPalette[index >> 1] = 0x1000000 | this.RGBTint((this.gbcOBJRawPalette[index | 1] << 8) | this.gbcOBJRawPalette[index & 0x3E]);
+    }
+  }
+}
+GameBoyCore.prototype.BGGBLayerRender = function (scanlineToRender) {
+  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
+  var tileYLine = (scrollYAdjusted & 7) << 3;
+  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
+  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
+  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
+  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
+  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
+  var chrCode = this.BGCHRBank1[tileNumber];
+  if (chrCode < this.gfxBackgroundBankOffset) {
+    chrCode |= 0x100;
+  }
+  var tile = this.tileCache[chrCode];
+  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[tileYLine | texel++]];
+  }
+  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
+  scrollXAdjusted += scrollXAdjustedAligned << 3;
+  scrollXAdjustedAligned += tileNumber;
+  while (tileNumber < scrollXAdjustedAligned) {
+    chrCode = this.BGCHRBank1[++tileNumber];
+    if (chrCode < this.gfxBackgroundBankOffset) {
+      chrCode |= 0x100;
+    }
+    tile = this.tileCache[chrCode];
+    texel = tileYLine;
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
+  }
+  if (pixelPosition < pixelPositionEnd) {
+    if (scrollXAdjusted < 0x100) {
+      chrCode = this.BGCHRBank1[++tileNumber];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      tile = this.tileCache[chrCode];
+      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+        this.frameBuffer[pixelPosition++] = this.BGPalette[tile[++texel]];
+      }
+    }
+    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
+    while (tileYDown < scrollXAdjustedAligned) {
+      chrCode = this.BGCHRBank1[tileYDown++];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      tile = this.tileCache[chrCode];
+      texel = tileYLine;
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
+    }
+    if (pixelPosition < pixelPositionEnd) {
+      chrCode = this.BGCHRBank1[tileYDown];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      tile = this.tileCache[chrCode];
+      switch (pixelPositionEnd - pixelPosition) {
+        case 7:
+          this.frameBuffer[pixelPosition + 6] = this.BGPalette[tile[tileYLine | 6]];
+        case 6:
+          this.frameBuffer[pixelPosition + 5] = this.BGPalette[tile[tileYLine | 5]];
+        case 5:
+          this.frameBuffer[pixelPosition + 4] = this.BGPalette[tile[tileYLine | 4]];
+        case 4:
+          this.frameBuffer[pixelPosition + 3] = this.BGPalette[tile[tileYLine | 3]];
+        case 3:
+          this.frameBuffer[pixelPosition + 2] = this.BGPalette[tile[tileYLine | 2]];
+        case 2:
+          this.frameBuffer[pixelPosition + 1] = this.BGPalette[tile[tileYLine | 1]];
+        case 1:
+          this.frameBuffer[pixelPosition] = this.BGPalette[tile[tileYLine]];
+      }
+    }
+  }
+}
+GameBoyCore.prototype.BGGBCLayerRender = function (scanlineToRender) {
+  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
+  var tileYLine = (scrollYAdjusted & 7) << 3;
+  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
+  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
+  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
+  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
+  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
+  var chrCode = this.BGCHRBank1[tileNumber];
+  if (chrCode < this.gfxBackgroundBankOffset) {
+    chrCode |= 0x100;
+  }
+  var attrCode = this.BGCHRBank2[tileNumber];
+  var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+  var palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
+  }
+  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
+  scrollXAdjusted += scrollXAdjustedAligned << 3;
+  scrollXAdjustedAligned += tileNumber;
+  while (tileNumber < scrollXAdjustedAligned) {
+    chrCode = this.BGCHRBank1[++tileNumber];
+    if (chrCode < this.gfxBackgroundBankOffset) {
+      chrCode |= 0x100;
+    }
+    attrCode = this.BGCHRBank2[tileNumber];
+    tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+    palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+    texel = tileYLine;
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+  }
+  if (pixelPosition < pixelPositionEnd) {
+    if (scrollXAdjusted < 0x100) {
+      chrCode = this.BGCHRBank1[++tileNumber];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileNumber];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+        this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[++texel]];
+      }
+    }
+    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
+    while (tileYDown < scrollXAdjustedAligned) {
+      chrCode = this.BGCHRBank1[tileYDown];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileYDown++];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+      texel = tileYLine;
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+    }
+    if (pixelPosition < pixelPositionEnd) {
+      chrCode = this.BGCHRBank1[tileYDown];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileYDown];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+      switch (pixelPositionEnd - pixelPosition) {
+        case 7:
+          this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
+        case 6:
+          this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
+        case 5:
+          this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
+        case 4:
+          this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
+        case 3:
+          this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
+        case 2:
+          this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
+        case 1:
+          this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
+      }
+    }
+  }
+}
+GameBoyCore.prototype.BGGBCLayerRenderNoPriorityFlagging = function (scanlineToRender) {
+  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
+  var tileYLine = (scrollYAdjusted & 7) << 3;
+  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
+  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
+  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
+  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
+  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
+  var chrCode = this.BGCHRBank1[tileNumber];
+  if (chrCode < this.gfxBackgroundBankOffset) {
+    chrCode |= 0x100;
+  }
+  var attrCode = this.BGCHRBank2[tileNumber];
+  var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+  var palette = (attrCode & 0x7) << 2;
+  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
+  }
+  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
+  scrollXAdjusted += scrollXAdjustedAligned << 3;
+  scrollXAdjustedAligned += tileNumber;
+  while (tileNumber < scrollXAdjustedAligned) {
+    chrCode = this.BGCHRBank1[++tileNumber];
+    if (chrCode < this.gfxBackgroundBankOffset) {
+      chrCode |= 0x100;
+    }
+    attrCode = this.BGCHRBank2[tileNumber];
+    tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+    palette = (attrCode & 0x7) << 2;
+    texel = tileYLine;
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+  }
+  if (pixelPosition < pixelPositionEnd) {
+    if (scrollXAdjusted < 0x100) {
+      chrCode = this.BGCHRBank1[++tileNumber];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileNumber];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = (attrCode & 0x7) << 2;
+      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
+        this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[++texel]];
+      }
+    }
+    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
+    while (tileYDown < scrollXAdjustedAligned) {
+      chrCode = this.BGCHRBank1[tileYDown];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileYDown++];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = (attrCode & 0x7) << 2;
+      texel = tileYLine;
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+    }
+    if (pixelPosition < pixelPositionEnd) {
+      chrCode = this.BGCHRBank1[tileYDown];
+      if (chrCode < this.gfxBackgroundBankOffset) {
+        chrCode |= 0x100;
+      }
+      attrCode = this.BGCHRBank2[tileYDown];
+      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+      palette = (attrCode & 0x7) << 2;
+      switch (pixelPositionEnd - pixelPosition) {
+        case 7:
+          this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
+        case 6:
+          this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
+        case 5:
+          this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
+        case 4:
+          this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
+        case 3:
+          this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
+        case 2:
+          this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
+        case 1:
+          this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
+      }
+    }
+  }
+}
+GameBoyCore.prototype.WindowGBLayerRender = function (scanlineToRender) {
+  if (this.gfxWindowDisplay) {                  //Is the window enabled?
+    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
+    if (scrollYAdjusted >= 0) {
+      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
+      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
+      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
+      if (pixelPosition < pixelPositionEnd) {
+        var tileYLine = (scrollYAdjusted & 0x7) << 3;
+        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
+        var chrCode = this.BGCHRBank1[tileNumber];
+        if (chrCode < this.gfxBackgroundBankOffset) {
+          chrCode |= 0x100;
+        }
+        var tile = this.tileCache[chrCode];
+        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
+        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
+        while (texel < scrollXRangeAdjusted) {
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[tileYLine | texel++]];
+        }
+        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
+        while (tileNumber < scrollXRangeAdjusted) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          tile = this.tileCache[chrCode];
+          texel = tileYLine;
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
+        }
+        if (pixelPosition < pixelPositionEnd) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          tile = this.tileCache[chrCode];
+          switch (pixelPositionEnd - pixelPosition) {
+            case 7:
+              this.frameBuffer[pixelPosition + 6] = this.BGPalette[tile[tileYLine | 6]];
+            case 6:
+              this.frameBuffer[pixelPosition + 5] = this.BGPalette[tile[tileYLine | 5]];
+            case 5:
+              this.frameBuffer[pixelPosition + 4] = this.BGPalette[tile[tileYLine | 4]];
+            case 4:
+              this.frameBuffer[pixelPosition + 3] = this.BGPalette[tile[tileYLine | 3]];
+            case 3:
+              this.frameBuffer[pixelPosition + 2] = this.BGPalette[tile[tileYLine | 2]];
+            case 2:
+              this.frameBuffer[pixelPosition + 1] = this.BGPalette[tile[tileYLine | 1]];
+            case 1:
+              this.frameBuffer[pixelPosition] = this.BGPalette[tile[tileYLine]];
+          }
+        }
+      }
+    }
+  }
+}
+GameBoyCore.prototype.WindowGBCLayerRender = function (scanlineToRender) {
+  if (this.gfxWindowDisplay) {                  //Is the window enabled?
+    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
+    if (scrollYAdjusted >= 0) {
+      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
+      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
+      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
+      if (pixelPosition < pixelPositionEnd) {
+        var tileYLine = (scrollYAdjusted & 0x7) << 3;
+        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
+        var chrCode = this.BGCHRBank1[tileNumber];
+        if (chrCode < this.gfxBackgroundBankOffset) {
+          chrCode |= 0x100;
+        }
+        var attrCode = this.BGCHRBank2[tileNumber];
+        var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+        var palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
+        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
+        while (texel < scrollXRangeAdjusted) {
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
+        }
+        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
+        while (tileNumber < scrollXRangeAdjusted) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          attrCode = this.BGCHRBank2[tileNumber];
+          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+          palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+          texel = tileYLine;
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+        }
+        if (pixelPosition < pixelPositionEnd) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          attrCode = this.BGCHRBank2[tileNumber];
+          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+          palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
+          switch (pixelPositionEnd - pixelPosition) {
+            case 7:
+              this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
+            case 6:
+              this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
+            case 5:
+              this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
+            case 4:
+              this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
+            case 3:
+              this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
+            case 2:
+              this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
+            case 1:
+              this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
+          }
+        }
+      }
+    }
+  }
+}
+GameBoyCore.prototype.WindowGBCLayerRenderNoPriorityFlagging = function (scanlineToRender) {
+  if (this.gfxWindowDisplay) {                  //Is the window enabled?
+    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
+    if (scrollYAdjusted >= 0) {
+      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
+      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
+      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
+      if (pixelPosition < pixelPositionEnd) {
+        var tileYLine = (scrollYAdjusted & 0x7) << 3;
+        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
+        var chrCode = this.BGCHRBank1[tileNumber];
+        if (chrCode < this.gfxBackgroundBankOffset) {
+          chrCode |= 0x100;
+        }
+        var attrCode = this.BGCHRBank2[tileNumber];
+        var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+        var palette = (attrCode & 0x7) << 2;
+        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
+        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
+        while (texel < scrollXRangeAdjusted) {
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
+        }
+        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
+        while (tileNumber < scrollXRangeAdjusted) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          attrCode = this.BGCHRBank2[tileNumber];
+          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+          palette = (attrCode & 0x7) << 2;
+          texel = tileYLine;
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
+          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
+        }
+        if (pixelPosition < pixelPositionEnd) {
+          chrCode = this.BGCHRBank1[++tileNumber];
+          if (chrCode < this.gfxBackgroundBankOffset) {
+            chrCode |= 0x100;
+          }
+          attrCode = this.BGCHRBank2[tileNumber];
+          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
+          palette = (attrCode & 0x7) << 2;
+          switch (pixelPositionEnd - pixelPosition) {
+            case 7:
+              this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
+            case 6:
+              this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
+            case 5:
+              this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
+            case 4:
+              this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
+            case 3:
+              this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
+            case 2:
+              this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
+            case 1:
+              this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
+          }
+        }
+      }
+    }
+  }
+}
+GameBoyCore.prototype.SpriteGBLayerRender = function (scanlineToRender) {
+  if (this.gfxSpriteShow) {                    //Are sprites enabled?
+    var lineAdjusted = scanlineToRender + 0x10;
+    var OAMAddress = 0xFE00;
+    var yoffset = 0;
+    var xcoord = 1;
+    var xCoordStart = 0;
+    var xCoordEnd = 0;
+    var attrCode = 0;
+    var palette = 0;
+    var tile = null;
+    var data = 0;
+    var spriteCount = 0;
+    var length = 0;
+    var currentPixel = 0;
+    var linePixel = 0;
+    //Clear our x-coord sort buffer:
+    while (xcoord < 168) {
+      this.sortBuffer[xcoord++] = 0xFF;
+    }
+    if (this.gfxSpriteNormalHeight) {
+      //Draw the visible sprites:
+      for (var length = this.findLowestSpriteDrawable(lineAdjusted, 0x7); spriteCount < length; ++spriteCount) {
+        OAMAddress = this.OAMAddressCache[spriteCount];
+        yoffset = (lineAdjusted - this.memory[OAMAddress]) << 3;
+        attrCode = this.memory[OAMAddress | 3];
+        palette = (attrCode & 0x10) >> 2;
+        tile = this.tileCache[((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2]];
+        linePixel = xCoordStart = this.memory[OAMAddress | 1];
+        xCoordEnd = Math.min(168 - linePixel, 8);
+        xcoord = (linePixel > 7) ? 0 : (8 - linePixel);
+        for (currentPixel = this.pixelStart + ((linePixel > 8) ? (linePixel - 8) : 0); xcoord < xCoordEnd; ++xcoord, ++currentPixel, ++linePixel) {
+          if (this.sortBuffer[linePixel] > xCoordStart) {
+            if (this.frameBuffer[currentPixel] >= 0x2000000) {
+              data = tile[yoffset | xcoord];
+              if (data > 0) {
+                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
+                this.sortBuffer[linePixel] = xCoordStart;
+              }
+            }
+            else if (this.frameBuffer[currentPixel] < 0x1000000) {
+              data = tile[yoffset | xcoord];
+              if (data > 0 && attrCode < 0x80) {
+                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
+                this.sortBuffer[linePixel] = xCoordStart;
+              }
+            }
+          }
+        }
+      }
+    }
+    else {
+      //Draw the visible sprites:
+      for (var length = this.findLowestSpriteDrawable(lineAdjusted, 0xF); spriteCount < length; ++spriteCount) {
+        OAMAddress = this.OAMAddressCache[spriteCount];
+        yoffset = (lineAdjusted - this.memory[OAMAddress]) << 3;
+        attrCode = this.memory[OAMAddress | 3];
+        palette = (attrCode & 0x10) >> 2;
+        if ((attrCode & 0x40) == (0x40 & yoffset)) {
+          tile = this.tileCache[((attrCode & 0x60) << 4) | (this.memory[OAMAddress | 0x2] & 0xFE)];
+        }
+        else {
+          tile = this.tileCache[((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2] | 1];
+        }
+        yoffset &= 0x3F;
+        linePixel = xCoordStart = this.memory[OAMAddress | 1];
+        xCoordEnd = Math.min(168 - linePixel, 8);
+        xcoord = (linePixel > 7) ? 0 : (8 - linePixel);
+        for (currentPixel = this.pixelStart + ((linePixel > 8) ? (linePixel - 8) : 0); xcoord < xCoordEnd; ++xcoord, ++currentPixel, ++linePixel) {
+          if (this.sortBuffer[linePixel] > xCoordStart) {
+            if (this.frameBuffer[currentPixel] >= 0x2000000) {
+              data = tile[yoffset | xcoord];
+              if (data > 0) {
+                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
+                this.sortBuffer[linePixel] = xCoordStart;
+              }
+            }
+            else if (this.frameBuffer[currentPixel] < 0x1000000) {
+              data = tile[yoffset | xcoord];
+              if (data > 0 && attrCode < 0x80) {
+                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
+                this.sortBuffer[linePixel] = xCoordStart;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+GameBoyCore.prototype.findLowestSpriteDrawable = function (scanlineToRender, drawableRange) {
+  var address = 0xFE00;
+  var spriteCount = 0;
+  var diff = 0;
+  while (address < 0xFEA0 && spriteCount < 10) {
+    diff = scanlineToRender - this.memory[address];
+    if ((diff & drawableRange) == diff) {
+      this.OAMAddressCache[spriteCount++] = address;
+    }
+    address += 4;
+  }
+  return spriteCount;
+}
+GameBoyCore.prototype.SpriteGBCLayerRender = function (scanlineToRender) {
+  if (this.gfxSpriteShow) {                    //Are sprites enabled?
+    var OAMAddress = 0xFE00;
+    var lineAdjusted = scanlineToRender + 0x10;
+    var yoffset = 0;
+    var xcoord = 0;
+    var endX = 0;
+    var xCounter = 0;
+    var attrCode = 0;
+    var palette = 0;
+    var tile = null;
+    var data = 0;
+    var currentPixel = 0;
+    var spriteCount = 0;
+    if (this.gfxSpriteNormalHeight) {
+      for (; OAMAddress < 0xFEA0 && spriteCount < 10; OAMAddress += 4) {
+        yoffset = lineAdjusted - this.memory[OAMAddress];
+        if ((yoffset & 0x7) == yoffset) {
+          xcoord = this.memory[OAMAddress | 1] - 8;
+          endX = Math.min(160, xcoord + 8);
+          attrCode = this.memory[OAMAddress | 3];
+          palette = (attrCode & 7) << 2;
+          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | this.memory[OAMAddress | 2]];
+          xCounter = (xcoord > 0) ? xcoord : 0;
+          xcoord -= yoffset << 3;
+          for (currentPixel = this.pixelStart + xCounter; xCounter < endX; ++xCounter, ++currentPixel) {
+            if (this.frameBuffer[currentPixel] >= 0x2000000) {
+              data = tile[xCounter - xcoord];
+              if (data > 0) {
+                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
+              }
+            }
+            else if (this.frameBuffer[currentPixel] < 0x1000000) {
+              data = tile[xCounter - xcoord];
+              if (data > 0 && attrCode < 0x80) {    //Don't optimize for attrCode, as LICM-capable JITs should optimize its checks.
+                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
+              }
+            }
+          }
+          ++spriteCount;
+        }
+      }
+    }
+    else {
+      for (; OAMAddress < 0xFEA0 && spriteCount < 10; OAMAddress += 4) {
+        yoffset = lineAdjusted - this.memory[OAMAddress];
+        if ((yoffset & 0xF) == yoffset) {
+          xcoord = this.memory[OAMAddress | 1] - 8;
+          endX = Math.min(160, xcoord + 8);
+          attrCode = this.memory[OAMAddress | 3];
+          palette = (attrCode & 7) << 2;
+          if ((attrCode & 0x40) == (0x40 & (yoffset << 3))) {
+            tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | (this.memory[OAMAddress | 0x2] & 0xFE)];
+          }
+          else {
+            tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2] | 1];
+          }
+          xCounter = (xcoord > 0) ? xcoord : 0;
+          xcoord -= (yoffset & 0x7) << 3;
+          for (currentPixel = this.pixelStart + xCounter; xCounter < endX; ++xCounter, ++currentPixel) {
+            if (this.frameBuffer[currentPixel] >= 0x2000000) {
+              data = tile[xCounter - xcoord];
+              if (data > 0) {
+                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
+              }
+            }
+            else if (this.frameBuffer[currentPixel] < 0x1000000) {
+              data = tile[xCounter - xcoord];
+              if (data > 0 && attrCode < 0x80) {    //Don't optimize for attrCode, as LICM-capable JITs should optimize its checks.
+                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
+              }
+            }
+          }
+          ++spriteCount;
+        }
+      }
+    }
+  }
+}
+//Generate only a single tile line for the GB tile cache mode:
+GameBoyCore.prototype.generateGBTileLine = function (address) {
+  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
+  var tileBlock = this.tileCache[(address & 0x1FF0) >> 4];
+  address = (address & 0xE) << 2;
+  tileBlock[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+  tileBlock[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+  tileBlock[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+  tileBlock[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+  tileBlock[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+  tileBlock[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+  tileBlock[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+  tileBlock[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+}
+//Generate only a single tile line for the GBC tile cache mode (Bank 1):
+GameBoyCore.prototype.generateGBCTileLineBank1 = function (address) {
+  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
+  address &= 0x1FFE;
+  var tileBlock1 = this.tileCache[address >> 4];
+  var tileBlock2 = this.tileCache[0x200 | (address >> 4)];
+  var tileBlock3 = this.tileCache[0x400 | (address >> 4)];
+  var tileBlock4 = this.tileCache[0x600 | (address >> 4)];
+  address = (address & 0xE) << 2;
+  var addressFlipped = 0x38 - address;
+  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+}
+//Generate all the flip combinations for a full GBC VRAM bank 1 tile:
+GameBoyCore.prototype.generateGBCTileBank1 = function (vramAddress) {
+  var address = vramAddress >> 4;
+  var tileBlock1 = this.tileCache[address];
+  var tileBlock2 = this.tileCache[0x200 | address];
+  var tileBlock3 = this.tileCache[0x400 | address];
+  var tileBlock4 = this.tileCache[0x600 | address];
+  var lineCopy = 0;
+  vramAddress |= 0x8000;
+  address = 0;
+  var addressFlipped = 56;
+  do {
+    lineCopy = (this.memory[0x1 | vramAddress] << 8) | this.memory[vramAddress];
+    tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+    tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+    tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+    tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+    tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+    tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+    tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+    tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+    address += 8;
+    addressFlipped -= 8;
+    vramAddress += 2;
+  } while (addressFlipped > -1);
+}
+//Generate only a single tile line for the GBC tile cache mode (Bank 2):
+GameBoyCore.prototype.generateGBCTileLineBank2 = function (address) {
+  var lineCopy = (this.VRAM[0x1 | address] << 8) | this.VRAM[0x1FFE & address];
+  var tileBlock1 = this.tileCache[0x800 | (address >> 4)];
+  var tileBlock2 = this.tileCache[0xA00 | (address >> 4)];
+  var tileBlock3 = this.tileCache[0xC00 | (address >> 4)];
+  var tileBlock4 = this.tileCache[0xE00 | (address >> 4)];
+  address = (address & 0xE) << 2;
+  var addressFlipped = 0x38 - address;
+  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+}
+//Generate all the flip combinations for a full GBC VRAM bank 2 tile:
+GameBoyCore.prototype.generateGBCTileBank2 = function (vramAddress) {
+  var address = vramAddress >> 4;
+  var tileBlock1 = this.tileCache[0x800 | address];
+  var tileBlock2 = this.tileCache[0xA00 | address];
+  var tileBlock3 = this.tileCache[0xC00 | address];
+  var tileBlock4 = this.tileCache[0xE00 | address];
+  var lineCopy = 0;
+  address = 0;
+  var addressFlipped = 56;
+  do {
+    lineCopy = (this.VRAM[0x1 | vramAddress] << 8) | this.VRAM[vramAddress];
+    tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+    tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+    tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+    tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+    tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+    tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+    tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+    tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+    address += 8;
+    addressFlipped -= 8;
+    vramAddress += 2;
+  } while (addressFlipped > -1);
+}
+//Generate only a single tile line for the GB tile cache mode (OAM accessible range):
+GameBoyCore.prototype.generateGBOAMTileLine = function (address) {
+  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
+  address &= 0x1FFE;
+  var tileBlock1 = this.tileCache[address >> 4];
+  var tileBlock2 = this.tileCache[0x200 | (address >> 4)];
+  var tileBlock3 = this.tileCache[0x400 | (address >> 4)];
+  var tileBlock4 = this.tileCache[0x600 | (address >> 4)];
+  address = (address & 0xE) << 2;
+  var addressFlipped = 0x38 - address;
+  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
+  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
+  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
+  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
+  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
+  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
+  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
+  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
+}
+GameBoyCore.prototype.graphicsJIT = function () {
+  if (this.LCDisOn) {
+    this.totalLinesPassed = 0;      //Mark frame for ensuring a JIT pass for the next framebuffer output.
+    this.graphicsJITScanlineGroup();
+  }
+}
+GameBoyCore.prototype.graphicsJITVBlank = function () {
+  //JIT the graphics to v-blank framing:
+  this.totalLinesPassed += this.queuedScanLines;
+  this.graphicsJITScanlineGroup();
+}
+GameBoyCore.prototype.graphicsJITScanlineGroup = function () {
+  //Normal rendering JIT, where we try to do groups of scanlines at once:
+  while (this.queuedScanLines > 0) {
+    this.renderScanLine(this.lastUnrenderedLine);
+    if (this.lastUnrenderedLine < 143) {
+      ++this.lastUnrenderedLine;
+    }
+    else {
+      this.lastUnrenderedLine = 0;
+    }
+    --this.queuedScanLines;
+  }
+}
+GameBoyCore.prototype.incrementScanLineQueue = function () {
+  if (this.queuedScanLines < 144) {
+    ++this.queuedScanLines;
+  }
+  else {
+    this.currentX = 0;
+    this.midScanlineOffset = -1;
+    if (this.lastUnrenderedLine < 143) {
+      ++this.lastUnrenderedLine;
+    }
+    else {
+      this.lastUnrenderedLine = 0;
+    }
+  }
+}
+GameBoyCore.prototype.midScanLineJIT = function () {
+  this.graphicsJIT();
+  this.renderMidScanLine();
+}
+//Check for the highest priority IRQ to fire:
+GameBoyCore.prototype.launchIRQ = function () {
+  var bitShift = 0;
+  var testbit = 1;
+  do {
+    //Check to see if an interrupt is enabled AND requested.
+    if ((testbit & this.IRQLineMatched) == testbit) {
+      this.IME = false;            //Reset the interrupt enabling.
+      this.interruptsRequested -= testbit;  //Reset the interrupt request.
+      this.IRQLineMatched = 0;        //Reset the IRQ assertion.
+      //Interrupts have a certain clock cycle length:
+      this.CPUTicks = 20;
+      //Set the stack pointer to the current program counter value:
+      this.stackPointer = (this.stackPointer - 1) & 0xFFFF;
+      this.memoryWriter[this.stackPointer](this, this.stackPointer, this.programCounter >> 8);
+      this.stackPointer = (this.stackPointer - 1) & 0xFFFF;
+      this.memoryWriter[this.stackPointer](this, this.stackPointer, this.programCounter & 0xFF);
+      //Set the program counter to the interrupt's address:
+      this.programCounter = 0x40 | (bitShift << 3);
+      //Clock the core for mid-instruction updates:
+      this.updateCore();
+      return;                  //We only want the highest priority interrupt.
+    }
+    testbit = 1 << ++bitShift;
+  } while (bitShift < 5);
+}
+/*
+  Check for IRQs to be fired while not in HALT:
+*/
+GameBoyCore.prototype.checkIRQMatching = function () {
+  if (this.IME) {
+    this.IRQLineMatched = this.interruptsEnabled & this.interruptsRequested & 0x1F;
+  }
+}
+/*
+  Handle the HALT opcode by predicting all IRQ cases correctly,
+  then selecting the next closest IRQ firing from the prediction to
+  clock up to. This prevents hacky looping that doesn't predict, but
+  instead just clocks through the core update procedure by one which
+  is very slow. Not many emulators do this because they have to cover
+  all the IRQ prediction cases and they usually get them wrong.
+*/
+GameBoyCore.prototype.calculateHALTPeriod = function () {
+  //Initialize our variables and start our prediction:
+  if (!this.halt) {
+    this.halt = true;
+    var currentClocks = -1;
+    var temp_var = 0;
+    if (this.LCDisOn) {
+      //If the LCD is enabled, then predict the LCD IRQs enabled:
+      if ((this.interruptsEnabled & 0x1) == 0x1) {
+        currentClocks = ((456 * (((this.modeSTAT == 1) ? 298 : 144) - this.actualScanLine)) - this.LCDTicks) << this.doubleSpeedShifter;
+      }
+      if ((this.interruptsEnabled & 0x2) == 0x2) {
+        if (this.mode0TriggerSTAT) {
+          temp_var = (this.clocksUntilMode0() - this.LCDTicks) << this.doubleSpeedShifter;
+          if (temp_var <= currentClocks || currentClocks == -1) {
+            currentClocks = temp_var;
+          }
+        }
+        if (this.mode1TriggerSTAT && (this.interruptsEnabled & 0x1) == 0) {
+          temp_var = ((456 * (((this.modeSTAT == 1) ? 298 : 144) - this.actualScanLine)) - this.LCDTicks) << this.doubleSpeedShifter;
+          if (temp_var <= currentClocks || currentClocks == -1) {
+            currentClocks = temp_var;
+          }
+        }
+        if (this.mode2TriggerSTAT) {
+          temp_var = (((this.actualScanLine >= 143) ? (456 * (154 - this.actualScanLine)) : 456) - this.LCDTicks) << this.doubleSpeedShifter;
+          if (temp_var <= currentClocks || currentClocks == -1) {
+            currentClocks = temp_var;
+          }
+        }
+        if (this.LYCMatchTriggerSTAT && this.memory[0xFF45] <= 153) {
+          temp_var = (this.clocksUntilLYCMatch() - this.LCDTicks) << this.doubleSpeedShifter;
+          if (temp_var <= currentClocks || currentClocks == -1) {
+            currentClocks = temp_var;
+          }
+        }
+      }
+    }
+    if (this.TIMAEnabled && (this.interruptsEnabled & 0x4) == 0x4) {
+      //CPU timer IRQ prediction:
+      temp_var = ((0x100 - this.memory[0xFF05]) * this.TACClocker) - this.timerTicks;
+      if (temp_var <= currentClocks || currentClocks == -1) {
+        currentClocks = temp_var;
+      }
+    }
+    if (this.serialTimer > 0 && (this.interruptsEnabled & 0x8) == 0x8) {
+      //Serial IRQ prediction:
+      if (this.serialTimer <= currentClocks || currentClocks == -1) {
+        currentClocks = this.serialTimer;
+      }
+    }
+  }
+  else {
+    var currentClocks = this.remainingClocks;
+  }
+  var maxClocks = (this.CPUCyclesTotal - this.emulatorTicks) << this.doubleSpeedShifter;
+  if (currentClocks >= 0) {
+    if (currentClocks <= maxClocks) {
+      //Exit out of HALT normally:
+      this.CPUTicks = Math.max(currentClocks, this.CPUTicks);
+      this.updateCoreFull();
+      this.halt = false;
+      this.CPUTicks = 0;
+    }
+    else {
+      //Still in HALT, clock only up to the clocks specified per iteration:
+      this.CPUTicks = Math.max(maxClocks, this.CPUTicks);
+      this.remainingClocks = currentClocks - this.CPUTicks;
+    }
+  }
+  else {
+    //Still in HALT, clock only up to the clocks specified per iteration:
+    //Will stay in HALT forever (Stuck in HALT forever), but the APU and LCD are still clocked, so don't pause:
+    this.CPUTicks += maxClocks;
+  }
+}
+//Memory Reading:
+GameBoyCore.prototype.memoryRead = function (address) {
+  //Act as a wrapper for reading the returns from the compiled jumps to memory.
+  return this.memoryReader[address](this, address);  //This seems to be faster than the usual if/else.
+}
+GameBoyCore.prototype.memoryHighRead = function (address) {
+  //Act as a wrapper for reading the returns from the compiled jumps to memory.
+  return this.memoryHighReader[address](this, address);  //This seems to be faster than the usual if/else.
+}
+GameBoyCore.prototype.memoryReadJumpCompile = function () {
+  //Faster in some browsers, since we are doing less conditionals overall by implementing them in advance.
+  for (var index = 0x0000; index <= 0xFFFF; index++) {
+    if (index < 0x4000) {
+      this.memoryReader[index] = this.memoryReadNormal;
+    }
+    else if (index < 0x8000) {
+      this.memoryReader[index] = this.memoryReadROM;
+    }
+    else if (index < 0x9800) {
+      this.memoryReader[index] = (this.cGBC) ? this.VRAMDATAReadCGBCPU : this.VRAMDATAReadDMGCPU;
+    }
+    else if (index < 0xA000) {
+      this.memoryReader[index] = (this.cGBC) ? this.VRAMCHRReadCGBCPU : this.VRAMCHRReadDMGCPU;
+    }
+    else if (index >= 0xA000 && index < 0xC000) {
+      if ((this.numRAMBanks == 1 / 16 && index < 0xA200) || this.numRAMBanks >= 1) {
+        if (this.cMBC7) {
+          this.memoryReader[index] = this.memoryReadMBC7;
+        }
+        else if (!this.cMBC3) {
+          this.memoryReader[index] = this.memoryReadMBC;
+        }
+        else {
+          //MBC3 RTC + RAM:
+          this.memoryReader[index] = this.memoryReadMBC3;
+        }
+      }
+      else {
+        this.memoryReader[index] = this.memoryReadBAD;
+      }
+    }
+    else if (index >= 0xC000 && index < 0xE000) {
+      if (!this.cGBC || index < 0xD000) {
+        this.memoryReader[index] = this.memoryReadNormal;
+      }
+      else {
+        this.memoryReader[index] = this.memoryReadGBCMemory;
+      }
+    }
+    else if (index >= 0xE000 && index < 0xFE00) {
+      if (!this.cGBC || index < 0xF000) {
+        this.memoryReader[index] = this.memoryReadECHONormal;
+      }
+      else {
+        this.memoryReader[index] = this.memoryReadECHOGBCMemory;
+      }
+    }
+    else if (index < 0xFEA0) {
+      this.memoryReader[index] = this.memoryReadOAM;
+    }
+    else if (this.cGBC && index >= 0xFEA0 && index < 0xFF00) {
+      this.memoryReader[index] = this.memoryReadNormal;
+    }
+    else if (index >= 0xFF00) {
+      switch (index) {
+        case 0xFF00:
+          //JOYPAD:
+          this.memoryHighReader[0] = this.memoryReader[0xFF00] = function (parentObj, address) {
+            return 0xC0 | parentObj.memory[0xFF00];  //Top nibble returns as set.
+          }
+          break;
+        case 0xFF01:
+          //SB
+          this.memoryHighReader[0x01] = this.memoryReader[0xFF01] = function (parentObj, address) {
+            return (parentObj.memory[0xFF02] < 0x80) ? parentObj.memory[0xFF01] : 0xFF;
+          }
+          break;
+        case 0xFF02:
+          //SC
+          if (this.cGBC) {
+            this.memoryHighReader[0x02] = this.memoryReader[0xFF02] = function (parentObj, address) {
+              return ((parentObj.serialTimer <= 0) ? 0x7C : 0xFC) | parentObj.memory[0xFF02];
+            }
+          }
+          else {
+            this.memoryHighReader[0x02] = this.memoryReader[0xFF02] = function (parentObj, address) {
+              return ((parentObj.serialTimer <= 0) ? 0x7E : 0xFE) | parentObj.memory[0xFF02];
+            }
+          }
+          break;
+        case 0xFF04:
+          //DIV
+          this.memoryHighReader[0x04] = this.memoryReader[0xFF04] = function (parentObj, address) {
+            parentObj.memory[0xFF04] = (parentObj.memory[0xFF04] + (parentObj.DIVTicks >> 8)) & 0xFF;
+            parentObj.DIVTicks &= 0xFF;
+            return parentObj.memory[0xFF04];
+
+          }
+          break;
+        case 0xFF07:
+          this.memoryHighReader[0x07] = this.memoryReader[0xFF07] = function (parentObj, address) {
+            return 0xF8 | parentObj.memory[0xFF07];
+          }
+          break;
+        case 0xFF0F:
+          //IF
+          this.memoryHighReader[0x0F] = this.memoryReader[0xFF0F] = function (parentObj, address) {
+            return 0xE0 | parentObj.interruptsRequested;
+          }
+          break;
+        case 0xFF10:
+          this.memoryHighReader[0x10] = this.memoryReader[0xFF10] = function (parentObj, address) {
+            return 0x80 | parentObj.memory[0xFF10];
+          }
+          break;
+        case 0xFF11:
+          this.memoryHighReader[0x11] = this.memoryReader[0xFF11] = function (parentObj, address) {
+            return 0x3F | parentObj.memory[0xFF11];
+          }
+          break;
+        case 0xFF13:
+          this.memoryHighReader[0x13] = this.memoryReader[0xFF13] = this.memoryReadBAD;
+          break;
+        case 0xFF14:
+          this.memoryHighReader[0x14] = this.memoryReader[0xFF14] = function (parentObj, address) {
+            return 0xBF | parentObj.memory[0xFF14];
+          }
+          break;
+        case 0xFF16:
+          this.memoryHighReader[0x16] = this.memoryReader[0xFF16] = function (parentObj, address) {
+            return 0x3F | parentObj.memory[0xFF16];
+          }
+          break;
+        case 0xFF18:
+          this.memoryHighReader[0x18] = this.memoryReader[0xFF18] = this.memoryReadBAD;
+          break;
+        case 0xFF19:
+          this.memoryHighReader[0x19] = this.memoryReader[0xFF19] = function (parentObj, address) {
+            return 0xBF | parentObj.memory[0xFF19];
+          }
+          break;
+        case 0xFF1A:
+          this.memoryHighReader[0x1A] = this.memoryReader[0xFF1A] = function (parentObj, address) {
+            return 0x7F | parentObj.memory[0xFF1A];
+          }
+          break;
+        case 0xFF1B:
+          this.memoryHighReader[0x1B] = this.memoryReader[0xFF1B] = this.memoryReadBAD;
+          break;
+        case 0xFF1C:
+          this.memoryHighReader[0x1C] = this.memoryReader[0xFF1C] = function (parentObj, address) {
+            return 0x9F | parentObj.memory[0xFF1C];
+          }
+          break;
+        case 0xFF1D:
+          this.memoryHighReader[0x1D] = this.memoryReader[0xFF1D] = function (parentObj, address) {
+            return 0xFF;
+          }
+          break;
+        case 0xFF1E:
+          this.memoryHighReader[0x1E] = this.memoryReader[0xFF1E] = function (parentObj, address) {
+            return 0xBF | parentObj.memory[0xFF1E];
+          }
+          break;
+        case 0xFF1F:
+        case 0xFF20:
+          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = this.memoryReadBAD;
+          break;
+        case 0xFF23:
+          this.memoryHighReader[0x23] = this.memoryReader[0xFF23] = function (parentObj, address) {
+            return 0xBF | parentObj.memory[0xFF23];
+          }
+          break;
+        case 0xFF26:
+          this.memoryHighReader[0x26] = this.memoryReader[0xFF26] = function (parentObj, address) {
+            parentObj.audioJIT();
+            return 0x70 | parentObj.memory[0xFF26];
+          }
+          break;
+        case 0xFF27:
+        case 0xFF28:
+        case 0xFF29:
+        case 0xFF2A:
+        case 0xFF2B:
+        case 0xFF2C:
+        case 0xFF2D:
+        case 0xFF2E:
+        case 0xFF2F:
+          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = this.memoryReadBAD;
+          break;
+        case 0xFF30:
+        case 0xFF31:
+        case 0xFF32:
+        case 0xFF33:
+        case 0xFF34:
+        case 0xFF35:
+        case 0xFF36:
+        case 0xFF37:
+        case 0xFF38:
+        case 0xFF39:
+        case 0xFF3A:
+        case 0xFF3B:
+        case 0xFF3C:
+        case 0xFF3D:
+        case 0xFF3E:
+        case 0xFF3F:
+          this.memoryReader[index] = function (parentObj, address) {
+            return (parentObj.channel3canPlay) ? parentObj.memory[0xFF00 | (parentObj.channel3lastSampleLookup >> 1)] : parentObj.memory[address];
+          }
+          this.memoryHighReader[index & 0xFF] = function (parentObj, address) {
+            return (parentObj.channel3canPlay) ? parentObj.memory[0xFF00 | (parentObj.channel3lastSampleLookup >> 1)] : parentObj.memory[0xFF00 | address];
+          }
+          break;
+        case 0xFF41:
+          this.memoryHighReader[0x41] = this.memoryReader[0xFF41] = function (parentObj, address) {
+            return 0x80 | parentObj.memory[0xFF41] | parentObj.modeSTAT;
+          }
+          break;
+        case 0xFF42:
+          this.memoryHighReader[0x42] = this.memoryReader[0xFF42] = function (parentObj, address) {
+            return parentObj.backgroundY;
+          }
+          break;
+        case 0xFF43:
+          this.memoryHighReader[0x43] = this.memoryReader[0xFF43] = function (parentObj, address) {
+            return parentObj.backgroundX;
+          }
+          break;
+        case 0xFF44:
+          this.memoryHighReader[0x44] = this.memoryReader[0xFF44] = function (parentObj, address) {
+            return ((parentObj.LCDisOn) ? parentObj.memory[0xFF44] : 0);
+          }
+          break;
+        case 0xFF4A:
+          //WY
+          this.memoryHighReader[0x4A] = this.memoryReader[0xFF4A] = function (parentObj, address) {
+            return parentObj.windowY;
+          }
+          break;
+        case 0xFF4F:
+          this.memoryHighReader[0x4F] = this.memoryReader[0xFF4F] = function (parentObj, address) {
+            return parentObj.currVRAMBank;
+          }
+          break;
+        case 0xFF55:
+          if (this.cGBC) {
+            this.memoryHighReader[0x55] = this.memoryReader[0xFF55] = function (parentObj, address) {
+              if (!parentObj.LCDisOn && parentObj.hdmaRunning) {  //Undocumented behavior alert: HDMA becomes GDMA when LCD is off (Worms Armageddon Fix).
+                //DMA
+                parentObj.DMAWrite((parentObj.memory[0xFF55] & 0x7F) + 1);
+                parentObj.memory[0xFF55] = 0xFF;  //Transfer completed.
+                parentObj.hdmaRunning = false;
+              }
+              return parentObj.memory[0xFF55];
+            }
+          }
+          else {
+            this.memoryReader[0xFF55] = this.memoryReadNormal;
+            this.memoryHighReader[0x55] = this.memoryHighReadNormal;
+          }
+          break;
+        case 0xFF56:
+          if (this.cGBC) {
+            this.memoryHighReader[0x56] = this.memoryReader[0xFF56] = function (parentObj, address) {
+              //Return IR "not connected" status:
+              return 0x3C | ((parentObj.memory[0xFF56] >= 0xC0) ? (0x2 | (parentObj.memory[0xFF56] & 0xC1)) : (parentObj.memory[0xFF56] & 0xC3));
+            }
+          }
+          else {
+            this.memoryReader[0xFF56] = this.memoryReadNormal;
+            this.memoryHighReader[0x56] = this.memoryHighReadNormal;
+          }
+          break;
+        case 0xFF6C:
+          if (this.cGBC) {
+            this.memoryHighReader[0x6C] = this.memoryReader[0xFF6C] = function (parentObj, address) {
+              return 0xFE | parentObj.memory[0xFF6C];
+            }
+          }
+          else {
+            this.memoryHighReader[0x6C] = this.memoryReader[0xFF6C] = this.memoryReadBAD;
+          }
+          break;
+        case 0xFF70:
+          if (this.cGBC) {
+            //SVBK
+            this.memoryHighReader[0x70] = this.memoryReader[0xFF70] = function (parentObj, address) {
+              return 0x40 | parentObj.memory[0xFF70];
+            }
+          }
+          else {
+            this.memoryHighReader[0x70] = this.memoryReader[0xFF70] = this.memoryReadBAD;
+          }
+          break;
+        case 0xFF75:
+          this.memoryHighReader[0x75] = this.memoryReader[0xFF75] = function (parentObj, address) {
+            return 0x8F | parentObj.memory[0xFF75];
+          }
+          break;
+        case 0xFF76:
+        case 0xFF77:
+          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = function (parentObj, address) {
+            return 0;
+          }
+          break;
+        case 0xFFFF:
+          //IE
+          this.memoryHighReader[0xFF] = this.memoryReader[0xFFFF] = function (parentObj, address) {
+            return parentObj.interruptsEnabled;
+          }
+          break;
+        default:
+          this.memoryReader[index] = this.memoryReadNormal;
+          this.memoryHighReader[index & 0xFF] = this.memoryHighReadNormal;
+      }
+    }
+    else {
+      this.memoryReader[index] = this.memoryReadBAD;
+    }
+  }
+}
+GameBoyCore.prototype.memoryReadNormal = function (parentObj, address) {
+  return parentObj.memory[address];
+}
+GameBoyCore.prototype.memoryHighReadNormal = function (parentObj, address) {
+  return parentObj.memory[0xFF00 | address];
+}
+GameBoyCore.prototype.memoryReadROM = function (parentObj, address) {
+  return parentObj.ROM[parentObj.currentROMBank + address];
+}
+GameBoyCore.prototype.memoryReadMBC = function (parentObj, address) {
+  //Switchable RAM
+  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
+    return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
+  }
+  //cout("Reading from disabled RAM.", 1);
+  return 0xFF;
+}
+GameBoyCore.prototype.memoryReadMBC7 = function (parentObj, address) {
+  //Switchable RAM
+  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
+    switch (address) {
+      case 0xA000:
+      case 0xA060:
+      case 0xA070:
+        return 0;
+      case 0xA080:
+        //TODO: Gyro Control Register
+        return 0;
+      case 0xA050:
+        //Y High Byte
+        return parentObj.highY;
+      case 0xA040:
+        //Y Low Byte
+        return parentObj.lowY;
+      case 0xA030:
+        //X High Byte
+        return parentObj.highX;
+      case 0xA020:
+        //X Low Byte:
+        return parentObj.lowX;
+      default:
+        return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
+    }
+  }
+  //cout("Reading from disabled RAM.", 1);
+  return 0xFF;
+}
+GameBoyCore.prototype.memoryReadMBC3 = function (parentObj, address) {
+  //Switchable RAM
+  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
+    switch (parentObj.currMBCRAMBank) {
+      case 0x00:
+      case 0x01:
+      case 0x02:
+      case 0x03:
+        return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
+        break;
+      case 0x08:
+        return parentObj.latchedSeconds;
+        break;
+      case 0x09:
+        return parentObj.latchedMinutes;
+        break;
+      case 0x0A:
+        return parentObj.latchedHours;
+        break;
+      case 0x0B:
+        return parentObj.latchedLDays;
+        break;
+      case 0x0C:
+        return (((parentObj.RTCDayOverFlow) ? 0x80 : 0) + ((parentObj.RTCHALT) ? 0x40 : 0)) + parentObj.latchedHDays;
+    }
+  }
+  //cout("Reading from invalid or disabled RAM.", 1);
+  return 0xFF;
+}
+GameBoyCore.prototype.memoryReadGBCMemory = function (parentObj, address) {
+  return parentObj.GBCMemory[address + parentObj.gbcRamBankPosition];
+}
+GameBoyCore.prototype.memoryReadOAM = function (parentObj, address) {
+  return (parentObj.modeSTAT > 1) ?  0xFF : parentObj.memory[address];
+}
+GameBoyCore.prototype.memoryReadECHOGBCMemory = function (parentObj, address) {
+  return parentObj.GBCMemory[address + parentObj.gbcRamBankPositionECHO];
+}
+GameBoyCore.prototype.memoryReadECHONormal = function (parentObj, address) {
+  return parentObj.memory[address - 0x2000];
+}
+GameBoyCore.prototype.memoryReadBAD = function (parentObj, address) {
+  return 0xFF;
+}
+GameBoyCore.prototype.VRAMDATAReadCGBCPU = function (parentObj, address) {
+  //CPU Side Reading The VRAM (Optimized for GameBoy Color)
+  return (parentObj.modeSTAT > 2) ? 0xFF : ((parentObj.currVRAMBank == 0) ? parentObj.memory[address] : parentObj.VRAM[address & 0x1FFF]);
+}
+GameBoyCore.prototype.VRAMDATAReadDMGCPU = function (parentObj, address) {
+  //CPU Side Reading The VRAM (Optimized for classic GameBoy)
+  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.memory[address];
+}
+GameBoyCore.prototype.VRAMCHRReadCGBCPU = function (parentObj, address) {
+  //CPU Side Reading the Character Data Map:
+  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.BGCHRCurrentBank[address & 0x7FF];
+}
+GameBoyCore.prototype.VRAMCHRReadDMGCPU = function (parentObj, address) {
+  //CPU Side Reading the Character Data Map:
+  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.BGCHRBank1[address & 0x7FF];
+}
+GameBoyCore.prototype.setCurrentMBC1ROMBank = function () {
+  //Read the cartridge ROM data from RAM memory:
+  switch (this.ROMBank1offs) {
+    case 0x00:
+    case 0x20:
+    case 0x40:
+    case 0x60:
+      //Bank calls for 0x00, 0x20, 0x40, and 0x60 are really for 0x01, 0x21, 0x41, and 0x61.
+      this.currentROMBank = (this.ROMBank1offs % this.ROMBankEdge) << 14;
+      break;
+    default:
+      this.currentROMBank = ((this.ROMBank1offs % this.ROMBankEdge) - 1) << 14;
+  }
+}
+GameBoyCore.prototype.setCurrentMBC2AND3ROMBank = function () {
+  //Read the cartridge ROM data from RAM memory:
+  //Only map bank 0 to bank 1 here (MBC2 is like MBC1, but can only do 16 banks, so only the bank 0 quirk appears for MBC2):
+  this.currentROMBank = Math.max((this.ROMBank1offs % this.ROMBankEdge) - 1, 0) << 14;
+}
+GameBoyCore.prototype.setCurrentMBC5ROMBank = function () {
+  //Read the cartridge ROM data from RAM memory:
+  this.currentROMBank = ((this.ROMBank1offs % this.ROMBankEdge) - 1) << 14;
+}
+//Memory Writing:
+GameBoyCore.prototype.memoryWrite = function (address, data) {
+  //Act as a wrapper for writing by compiled jumps to specific memory writing functions.
+  this.memoryWriter[address](this, address, data);
+}
+//0xFFXX fast path:
+GameBoyCore.prototype.memoryHighWrite = function (address, data) {
+  //Act as a wrapper for writing by compiled jumps to specific memory writing functions.
+  this.memoryHighWriter[address](this, address, data);
+}
+GameBoyCore.prototype.memoryWriteJumpCompile = function () {
+  //Faster in some browsers, since we are doing less conditionals overall by implementing them in advance.
+  for (var index = 0x0000; index <= 0xFFFF; index++) {
+    if (index < 0x8000) {
+      if (this.cMBC1) {
+        if (index < 0x2000) {
+          this.memoryWriter[index] = this.MBCWriteEnable;
+        }
+        else if (index < 0x4000) {
+          this.memoryWriter[index] = this.MBC1WriteROMBank;
+        }
+        else if (index < 0x6000) {
+          this.memoryWriter[index] = this.MBC1WriteRAMBank;
+        }
+        else {
+          this.memoryWriter[index] = this.MBC1WriteType;
+        }
+      }
+      else if (this.cMBC2) {
+        if (index < 0x1000) {
+          this.memoryWriter[index] = this.MBCWriteEnable;
+        }
+        else if (index >= 0x2100 && index < 0x2200) {
+          this.memoryWriter[index] = this.MBC2WriteROMBank;
+        }
+        else {
+          this.memoryWriter[index] = this.cartIgnoreWrite;
+        }
+      }
+      else if (this.cMBC3) {
+        if (index < 0x2000) {
+          this.memoryWriter[index] = this.MBCWriteEnable;
+        }
+        else if (index < 0x4000) {
+          this.memoryWriter[index] = this.MBC3WriteROMBank;
+        }
+        else if (index < 0x6000) {
+          this.memoryWriter[index] = this.MBC3WriteRAMBank;
+        }
+        else {
+          this.memoryWriter[index] = this.MBC3WriteRTCLatch;
+        }
+      }
+      else if (this.cMBC5 || this.cRUMBLE || this.cMBC7) {
+        if (index < 0x2000) {
+          this.memoryWriter[index] = this.MBCWriteEnable;
+        }
+        else if (index < 0x3000) {
+          this.memoryWriter[index] = this.MBC5WriteROMBankLow;
+        }
+        else if (index < 0x4000) {
+          this.memoryWriter[index] = this.MBC5WriteROMBankHigh;
+        }
+        else if (index < 0x6000) {
+          this.memoryWriter[index] = (this.cRUMBLE) ? this.RUMBLEWriteRAMBank : this.MBC5WriteRAMBank;
+        }
+        else {
+          this.memoryWriter[index] = this.cartIgnoreWrite;
+        }
+      }
+      else if (this.cHuC3) {
+        if (index < 0x2000) {
+          this.memoryWriter[index] = this.MBCWriteEnable;
+        }
+        else if (index < 0x4000) {
+          this.memoryWriter[index] = this.MBC3WriteROMBank;
+        }
+        else if (index < 0x6000) {
+          this.memoryWriter[index] = this.HuC3WriteRAMBank;
+        }
+        else {
+          this.memoryWriter[index] = this.cartIgnoreWrite;
+        }
+      }
+      else {
+        this.memoryWriter[index] = this.cartIgnoreWrite;
+      }
+    }
+    else if (index < 0x9000) {
+      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCDATAWrite : this.VRAMGBDATAWrite;
+    }
+    else if (index < 0x9800) {
+      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCDATAWrite : this.VRAMGBDATAUpperWrite;
+    }
+    else if (index < 0xA000) {
+      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCCHRMAPWrite : this.VRAMGBCHRMAPWrite;
+    }
+    else if (index < 0xC000) {
+      if ((this.numRAMBanks == 1 / 16 && index < 0xA200) || this.numRAMBanks >= 1) {
+        if (!this.cMBC3) {
+          this.memoryWriter[index] = this.memoryWriteMBCRAM;
+        }
+        else {
+          //MBC3 RTC + RAM:
+          this.memoryWriter[index] = this.memoryWriteMBC3RAM;
+        }
+      }
+      else {
+        this.memoryWriter[index] = this.cartIgnoreWrite;
+      }
+    }
+    else if (index < 0xE000) {
+      if (this.cGBC && index >= 0xD000) {
+        this.memoryWriter[index] = this.memoryWriteGBCRAM;
+      }
+      else {
+        this.memoryWriter[index] = this.memoryWriteNormal;
+      }
+    }
+    else if (index < 0xFE00) {
+      if (this.cGBC && index >= 0xF000) {
+        this.memoryWriter[index] = this.memoryWriteECHOGBCRAM;
+      }
+      else {
+        this.memoryWriter[index] = this.memoryWriteECHONormal;
+      }
+    }
+    else if (index <= 0xFEA0) {
+      this.memoryWriter[index] = this.memoryWriteOAMRAM;
+    }
+    else if (index < 0xFF00) {
+      if (this.cGBC) {                      //Only GBC has access to this RAM.
+        this.memoryWriter[index] = this.memoryWriteNormal;
+      }
+      else {
+        this.memoryWriter[index] = this.cartIgnoreWrite;
+      }
+    }
+    else {
+      //Start the I/O initialization by filling in the slots as normal memory:
+      this.memoryWriter[index] = this.memoryWriteNormal;
+      this.memoryHighWriter[index & 0xFF] = this.memoryHighWriteNormal;
+    }
+  }
+  this.registerWriteJumpCompile();        //Compile the I/O write functions separately...
+}
+GameBoyCore.prototype.MBCWriteEnable = function (parentObj, address, data) {
+  //MBC RAM Bank Enable/Disable:
+  parentObj.MBCRAMBanksEnabled = ((data & 0x0F) == 0x0A);  //If lower nibble is 0x0A, then enable, otherwise disable.
+}
+GameBoyCore.prototype.MBC1WriteROMBank = function (parentObj, address, data) {
+  //MBC1 ROM bank switching:
+  parentObj.ROMBank1offs = (parentObj.ROMBank1offs & 0x60) | (data & 0x1F);
+  parentObj.setCurrentMBC1ROMBank();
+}
+GameBoyCore.prototype.MBC1WriteRAMBank = function (parentObj, address, data) {
+  //MBC1 RAM bank switching
+  if (parentObj.MBC1Mode) {
+    //4/32 Mode
+    parentObj.currMBCRAMBank = data & 0x03;
+    parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
+  }
+  else {
+    //16/8 Mode
+    parentObj.ROMBank1offs = ((data & 0x03) << 5) | (parentObj.ROMBank1offs & 0x1F);
+    parentObj.setCurrentMBC1ROMBank();
+  }
+}
+GameBoyCore.prototype.MBC1WriteType = function (parentObj, address, data) {
+  //MBC1 mode setting:
+  parentObj.MBC1Mode = ((data & 0x1) == 0x1);
+  if (parentObj.MBC1Mode) {
+    parentObj.ROMBank1offs &= 0x1F;
+    parentObj.setCurrentMBC1ROMBank();
+  }
+  else {
+    parentObj.currMBCRAMBank = 0;
+    parentObj.currMBCRAMBankPosition = -0xA000;
+  }
+}
+GameBoyCore.prototype.MBC2WriteROMBank = function (parentObj, address, data) {
+  //MBC2 ROM bank switching:
+  parentObj.ROMBank1offs = data & 0x0F;
+  parentObj.setCurrentMBC2AND3ROMBank();
+}
+GameBoyCore.prototype.MBC3WriteROMBank = function (parentObj, address, data) {
+  //MBC3 ROM bank switching:
+  parentObj.ROMBank1offs = data & 0x7F;
+  parentObj.setCurrentMBC2AND3ROMBank();
+}
+GameBoyCore.prototype.MBC3WriteRAMBank = function (parentObj, address, data) {
+  parentObj.currMBCRAMBank = data;
+  if (data < 4) {
+    //MBC3 RAM bank switching
+    parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
+  }
+}
+GameBoyCore.prototype.MBC3WriteRTCLatch = function (parentObj, address, data) {
+  if (data == 0) {
+    parentObj.RTCisLatched = false;
+  }
+  else if (!parentObj.RTCisLatched) {
+    //Copy over the current RTC time for reading.
+    parentObj.RTCisLatched = true;
+    parentObj.latchedSeconds = parentObj.RTCSeconds | 0;
+    parentObj.latchedMinutes = parentObj.RTCMinutes;
+    parentObj.latchedHours = parentObj.RTCHours;
+    parentObj.latchedLDays = (parentObj.RTCDays & 0xFF);
+    parentObj.latchedHDays = parentObj.RTCDays >> 8;
+  }
+}
+GameBoyCore.prototype.MBC5WriteROMBankLow = function (parentObj, address, data) {
+  //MBC5 ROM bank switching:
+  parentObj.ROMBank1offs = (parentObj.ROMBank1offs & 0x100) | data;
+  parentObj.setCurrentMBC5ROMBank();
+}
+GameBoyCore.prototype.MBC5WriteROMBankHigh = function (parentObj, address, data) {
+  //MBC5 ROM bank switching (by least significant bit):
+  parentObj.ROMBank1offs  = ((data & 0x01) << 8) | (parentObj.ROMBank1offs & 0xFF);
+  parentObj.setCurrentMBC5ROMBank();
+}
+GameBoyCore.prototype.MBC5WriteRAMBank = function (parentObj, address, data) {
+  //MBC5 RAM bank switching
+  parentObj.currMBCRAMBank = data & 0xF;
+  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
+}
+GameBoyCore.prototype.RUMBLEWriteRAMBank = function (parentObj, address, data) {
+  //MBC5 RAM bank switching
+  //Like MBC5, but bit 3 of the lower nibble is used for rumbling and bit 2 is ignored.
+  parentObj.currMBCRAMBank = data & 0x03;
+  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
+}
+GameBoyCore.prototype.HuC3WriteRAMBank = function (parentObj, address, data) {
+  //HuC3 RAM bank switching
+  parentObj.currMBCRAMBank = data & 0x03;
+  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
+}
+GameBoyCore.prototype.cartIgnoreWrite = function (parentObj, address, data) {
+  //We might have encountered illegal RAM writing or such, so just do nothing...
+}
+GameBoyCore.prototype.memoryWriteNormal = function (parentObj, address, data) {
+  parentObj.memory[address] = data;
+}
+GameBoyCore.prototype.memoryHighWriteNormal = function (parentObj, address, data) {
+  parentObj.memory[0xFF00 | address] = data;
+}
+GameBoyCore.prototype.memoryWriteMBCRAM = function (parentObj, address, data) {
+  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
+    parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition] = data;
+  }
+}
+GameBoyCore.prototype.memoryWriteMBC3RAM = function (parentObj, address, data) {
+  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
+    switch (parentObj.currMBCRAMBank) {
+      case 0x00:
+      case 0x01:
+      case 0x02:
+      case 0x03:
+        parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition] = data;
+        break;
+      case 0x08:
+        if (data < 60) {
+          parentObj.RTCSeconds = data;
+        }
+        else {
+          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
+        }
+        break;
+      case 0x09:
+        if (data < 60) {
+          parentObj.RTCMinutes = data;
+        }
+        else {
+          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
+        }
+        break;
+      case 0x0A:
+        if (data < 24) {
+          parentObj.RTCHours = data;
+        }
+        else {
+          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
+        }
+        break;
+      case 0x0B:
+        parentObj.RTCDays = (data & 0xFF) | (parentObj.RTCDays & 0x100);
+        break;
+      case 0x0C:
+        parentObj.RTCDayOverFlow = (data > 0x7F);
+        parentObj.RTCHalt = (data & 0x40) == 0x40;
+        parentObj.RTCDays = ((data & 0x1) << 8) | (parentObj.RTCDays & 0xFF);
+        break;
+      default:
+        cout("Invalid MBC3 bank address selected: " + parentObj.currMBCRAMBank, 0);
+    }
+  }
+}
+GameBoyCore.prototype.memoryWriteGBCRAM = function (parentObj, address, data) {
+  parentObj.GBCMemory[address + parentObj.gbcRamBankPosition] = data;
+}
+GameBoyCore.prototype.memoryWriteOAMRAM = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 2) {    //OAM RAM cannot be written to in mode 2 & 3
+    if (parentObj.memory[address] != data) {
+      parentObj.graphicsJIT();
+      parentObj.memory[address] = data;
+    }
+  }
+}
+GameBoyCore.prototype.memoryWriteECHOGBCRAM = function (parentObj, address, data) {
+  parentObj.GBCMemory[address + parentObj.gbcRamBankPositionECHO] = data;
+}
+GameBoyCore.prototype.memoryWriteECHONormal = function (parentObj, address, data) {
+  parentObj.memory[address - 0x2000] = data;
+}
+GameBoyCore.prototype.VRAMGBDATAWrite = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
+    if (parentObj.memory[address] != data) {
+      //JIT the graphics render queue:
+      parentObj.graphicsJIT();
+      parentObj.memory[address] = data;
+      parentObj.generateGBOAMTileLine(address);
+    }
+  }
+}
+GameBoyCore.prototype.VRAMGBDATAUpperWrite = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
+    if (parentObj.memory[address] != data) {
+      //JIT the graphics render queue:
+      parentObj.graphicsJIT();
+      parentObj.memory[address] = data;
+      parentObj.generateGBTileLine(address);
+    }
+  }
+}
+GameBoyCore.prototype.VRAMGBCDATAWrite = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
+    if (parentObj.currVRAMBank == 0) {
+      if (parentObj.memory[address] != data) {
+        //JIT the graphics render queue:
+        parentObj.graphicsJIT();
+        parentObj.memory[address] = data;
+        parentObj.generateGBCTileLineBank1(address);
+      }
+    }
+    else {
+      address &= 0x1FFF;
+      if (parentObj.VRAM[address] != data) {
+        //JIT the graphics render queue:
+        parentObj.graphicsJIT();
+        parentObj.VRAM[address] = data;
+        parentObj.generateGBCTileLineBank2(address);
+      }
+    }
+  }
+}
+GameBoyCore.prototype.VRAMGBCHRMAPWrite = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
+    address &= 0x7FF;
+    if (parentObj.BGCHRBank1[address] != data) {
+      //JIT the graphics render queue:
+      parentObj.graphicsJIT();
+      parentObj.BGCHRBank1[address] = data;
+    }
+  }
+}
+GameBoyCore.prototype.VRAMGBCCHRMAPWrite = function (parentObj, address, data) {
+  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
+    address &= 0x7FF;
+    if (parentObj.BGCHRCurrentBank[address] != data) {
+      //JIT the graphics render queue:
+      parentObj.graphicsJIT();
+      parentObj.BGCHRCurrentBank[address] = data;
+    }
+  }
+}
+GameBoyCore.prototype.DMAWrite = function (tilesToTransfer) {
+  if (!this.halt) {
+    //Clock the CPU for the DMA transfer (CPU is halted during the transfer):
+    this.CPUTicks += 4 | ((tilesToTransfer << 5) << this.doubleSpeedShifter);
+  }
+  //Source address of the transfer:
+  var source = (this.memory[0xFF51] << 8) | this.memory[0xFF52];
+  //Destination address in the VRAM memory range:
+  var destination = (this.memory[0xFF53] << 8) | this.memory[0xFF54];
+  //Creating some references:
+  var memoryReader = this.memoryReader;
+  //JIT the graphics render queue:
+  this.graphicsJIT();
+  var memory = this.memory;
+  //Determining which bank we're working on so we can optimize:
+  if (this.currVRAMBank == 0) {
+    //DMA transfer for VRAM bank 0:
+    do {
+      if (destination < 0x1800) {
+        memory[0x8000 | destination] = memoryReader[source](this, source++);
+        memory[0x8001 | destination] = memoryReader[source](this, source++);
+        memory[0x8002 | destination] = memoryReader[source](this, source++);
+        memory[0x8003 | destination] = memoryReader[source](this, source++);
+        memory[0x8004 | destination] = memoryReader[source](this, source++);
+        memory[0x8005 | destination] = memoryReader[source](this, source++);
+        memory[0x8006 | destination] = memoryReader[source](this, source++);
+        memory[0x8007 | destination] = memoryReader[source](this, source++);
+        memory[0x8008 | destination] = memoryReader[source](this, source++);
+        memory[0x8009 | destination] = memoryReader[source](this, source++);
+        memory[0x800A | destination] = memoryReader[source](this, source++);
+        memory[0x800B | destination] = memoryReader[source](this, source++);
+        memory[0x800C | destination] = memoryReader[source](this, source++);
+        memory[0x800D | destination] = memoryReader[source](this, source++);
+        memory[0x800E | destination] = memoryReader[source](this, source++);
+        memory[0x800F | destination] = memoryReader[source](this, source++);
+        this.generateGBCTileBank1(destination);
+        destination += 0x10;
+      }
+      else {
+        destination &= 0x7F0;
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
+        destination = (destination + 0x1800) & 0x1FF0;
+      }
+      source &= 0xFFF0;
+      --tilesToTransfer;
+    } while (tilesToTransfer > 0);
+  }
+  else {
+    var VRAM = this.VRAM;
+    //DMA transfer for VRAM bank 1:
+    do {
+      if (destination < 0x1800) {
+        VRAM[destination] = memoryReader[source](this, source++);
+        VRAM[destination | 0x1] = memoryReader[source](this, source++);
+        VRAM[destination | 0x2] = memoryReader[source](this, source++);
+        VRAM[destination | 0x3] = memoryReader[source](this, source++);
+        VRAM[destination | 0x4] = memoryReader[source](this, source++);
+        VRAM[destination | 0x5] = memoryReader[source](this, source++);
+        VRAM[destination | 0x6] = memoryReader[source](this, source++);
+        VRAM[destination | 0x7] = memoryReader[source](this, source++);
+        VRAM[destination | 0x8] = memoryReader[source](this, source++);
+        VRAM[destination | 0x9] = memoryReader[source](this, source++);
+        VRAM[destination | 0xA] = memoryReader[source](this, source++);
+        VRAM[destination | 0xB] = memoryReader[source](this, source++);
+        VRAM[destination | 0xC] = memoryReader[source](this, source++);
+        VRAM[destination | 0xD] = memoryReader[source](this, source++);
+        VRAM[destination | 0xE] = memoryReader[source](this, source++);
+        VRAM[destination | 0xF] = memoryReader[source](this, source++);
+        this.generateGBCTileBank2(destination);
+        destination += 0x10;
+      }
+      else {
+        destination &= 0x7F0;
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
+        destination = (destination + 0x1800) & 0x1FF0;
+      }
+      source &= 0xFFF0;
+      --tilesToTransfer;
+    } while (tilesToTransfer > 0);
+  }
+  //Update the HDMA registers to their next addresses:
+  memory[0xFF51] = source >> 8;
+  memory[0xFF52] = source & 0xF0;
+  memory[0xFF53] = destination >> 8;
+  memory[0xFF54] = destination & 0xF0;
+}
+GameBoyCore.prototype.registerWriteJumpCompile = function () {
+  //I/O Registers (GB + GBC):
+  //JoyPad
+  this.memoryHighWriter[0] = this.memoryWriter[0xFF00] = function (parentObj, address, data) {
+    parentObj.memory[0xFF00] = (data & 0x30) | ((((data & 0x20) == 0) ? (parentObj.JoyPad >> 4) : 0xF) & (((data & 0x10) == 0) ? (parentObj.JoyPad & 0xF) : 0xF));
+  }
+  //SB (Serial Transfer Data)
+  this.memoryHighWriter[0x1] = this.memoryWriter[0xFF01] = function (parentObj, address, data) {
+    if (parentObj.memory[0xFF02] < 0x80) {  //Cannot write while a serial transfer is active.
+      parentObj.memory[0xFF01] = data;
+    }
+  }
+  //DIV
+  this.memoryHighWriter[0x4] = this.memoryWriter[0xFF04] = function (parentObj, address, data) {
+    parentObj.DIVTicks &= 0xFF;  //Update DIV for realignment.
+    parentObj.memory[0xFF04] = 0;
+  }
+  //TIMA
+  this.memoryHighWriter[0x5] = this.memoryWriter[0xFF05] = function (parentObj, address, data) {
+    parentObj.memory[0xFF05] = data;
+  }
+  //TMA
+  this.memoryHighWriter[0x6] = this.memoryWriter[0xFF06] = function (parentObj, address, data) {
+    parentObj.memory[0xFF06] = data;
+  }
+  //TAC
+  this.memoryHighWriter[0x7] = this.memoryWriter[0xFF07] = function (parentObj, address, data) {
+    parentObj.memory[0xFF07] = data & 0x07;
+    parentObj.TIMAEnabled = (data & 0x04) == 0x04;
+    parentObj.TACClocker = Math.pow(4, ((data & 0x3) != 0) ? (data & 0x3) : 4) << 2;  //TODO: Find a way to not make a conditional in here...
+  }
+  //IF (Interrupt Request)
+  this.memoryHighWriter[0xF] = this.memoryWriter[0xFF0F] = function (parentObj, address, data) {
+    parentObj.interruptsRequested = data;
+    parentObj.checkIRQMatching();
+  }
+  this.memoryHighWriter[0x10] = this.memoryWriter[0xFF10] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (parentObj.channel1decreaseSweep && (data & 0x08) == 0) {
+        if (parentObj.channel1numSweep != parentObj.channel1frequencySweepDivider) {
+          parentObj.channel1SweepFault = true;
+        }
+      }
+      parentObj.channel1lastTimeSweep = (data & 0x70) >> 4;
+      parentObj.channel1frequencySweepDivider = data & 0x07;
+      parentObj.channel1decreaseSweep = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF10] = data;
+      parentObj.channel1EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x11] = this.memoryWriter[0xFF11] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
+      if (parentObj.soundMasterEnabled) {
+        parentObj.audioJIT();
+      }
+      else {
+        data &= 0x3F;
+      }
+      parentObj.channel1CachedDuty = parentObj.dutyLookup[data >> 6];
+      parentObj.channel1totalLength = 0x40 - (data & 0x3F);
+      parentObj.memory[0xFF11] = data & 0xC0;
+      parentObj.channel1EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x12] = this.memoryWriter[0xFF12] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (parentObj.channel1Enabled && parentObj.channel1envelopeSweeps == 0) {
+        //Zombie Volume PAPU Bug:
+        if (((parentObj.memory[0xFF12] ^ data) & 0x8) == 0x8) {
+          if ((parentObj.memory[0xFF12] & 0x8) == 0) {
+            if ((parentObj.memory[0xFF12] & 0x7) == 0x7) {
+              parentObj.channel1envelopeVolume += 2;
+            }
+            else {
+              ++parentObj.channel1envelopeVolume;
+            }
+          }
+          parentObj.channel1envelopeVolume = (16 - parentObj.channel1envelopeVolume) & 0xF;
+        }
+        else if ((parentObj.memory[0xFF12] & 0xF) == 0x8) {
+          parentObj.channel1envelopeVolume = (1 + parentObj.channel1envelopeVolume) & 0xF;
+        }
+        parentObj.channel1OutputLevelCache();
+      }
+      parentObj.channel1envelopeType = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF12] = data;
+      parentObj.channel1VolumeEnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x13] = this.memoryWriter[0xFF13] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.channel1frequency = (parentObj.channel1frequency & 0x700) | data;
+      parentObj.channel1FrequencyTracker = (0x800 - parentObj.channel1frequency) << 2;
+      parentObj.memory[0xFF13] = data;
+    }
+  }
+  this.memoryHighWriter[0x14] = this.memoryWriter[0xFF14] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.channel1consecutive = ((data & 0x40) == 0x0);
+      parentObj.channel1frequency = ((data & 0x7) << 8) | (parentObj.channel1frequency & 0xFF);
+      parentObj.channel1FrequencyTracker = (0x800 - parentObj.channel1frequency) << 2;
+      if (data > 0x7F) {
+        //Reload 0xFF10:
+        parentObj.channel1timeSweep = parentObj.channel1lastTimeSweep;
+        parentObj.channel1numSweep = parentObj.channel1frequencySweepDivider;
+        //Reload 0xFF12:
+        var nr12 = parentObj.memory[0xFF12];
+        parentObj.channel1envelopeVolume = nr12 >> 4;
+        parentObj.channel1OutputLevelCache();
+        parentObj.channel1envelopeSweepsLast = (nr12 & 0x7) - 1;
+        if (parentObj.channel1totalLength == 0) {
+          parentObj.channel1totalLength = 0x40;
+        }
+        if (parentObj.channel1lastTimeSweep > 0 || parentObj.channel1frequencySweepDivider > 0) {
+          parentObj.memory[0xFF26] |= 0x1;
+        }
+        else {
+          parentObj.memory[0xFF26] &= 0xFE;
+        }
+        if ((data & 0x40) == 0x40) {
+          parentObj.memory[0xFF26] |= 0x1;
+        }
+        parentObj.channel1ShadowFrequency = parentObj.channel1frequency;
+        //Reset frequency overflow check + frequency sweep type check:
+        parentObj.channel1SweepFault = false;
+        //Supposed to run immediately:
+        parentObj.runAudioSweep();
+      }
+      parentObj.channel1EnableCheck();
+      parentObj.memory[0xFF14] = data & 0x40;
+    }
+  }
+  this.memoryHighWriter[0x16] = this.memoryWriter[0xFF16] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
+      if (parentObj.soundMasterEnabled) {
+        parentObj.audioJIT();
+      }
+      else {
+        data &= 0x3F;
+      }
+      parentObj.channel2CachedDuty = parentObj.dutyLookup[data >> 6];
+      parentObj.channel2totalLength = 0x40 - (data & 0x3F);
+      parentObj.memory[0xFF16] = data & 0xC0;
+      parentObj.channel2EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x17] = this.memoryWriter[0xFF17] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (parentObj.channel2Enabled && parentObj.channel2envelopeSweeps == 0) {
+        //Zombie Volume PAPU Bug:
+        if (((parentObj.memory[0xFF17] ^ data) & 0x8) == 0x8) {
+          if ((parentObj.memory[0xFF17] & 0x8) == 0) {
+            if ((parentObj.memory[0xFF17] & 0x7) == 0x7) {
+              parentObj.channel2envelopeVolume += 2;
+            }
+            else {
+              ++parentObj.channel2envelopeVolume;
+            }
+          }
+          parentObj.channel2envelopeVolume = (16 - parentObj.channel2envelopeVolume) & 0xF;
+        }
+        else if ((parentObj.memory[0xFF17] & 0xF) == 0x8) {
+          parentObj.channel2envelopeVolume = (1 + parentObj.channel2envelopeVolume) & 0xF;
+        }
+        parentObj.channel2OutputLevelCache();
+      }
+      parentObj.channel2envelopeType = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF17] = data;
+      parentObj.channel2VolumeEnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x18] = this.memoryWriter[0xFF18] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.channel2frequency = (parentObj.channel2frequency & 0x700) | data;
+      parentObj.channel2FrequencyTracker = (0x800 - parentObj.channel2frequency) << 2;
+      parentObj.memory[0xFF18] = data;
+    }
+  }
+  this.memoryHighWriter[0x19] = this.memoryWriter[0xFF19] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (data > 0x7F) {
+        //Reload 0xFF17:
+        var nr22 = parentObj.memory[0xFF17];
+        parentObj.channel2envelopeVolume = nr22 >> 4;
+        parentObj.channel2OutputLevelCache();
+        parentObj.channel2envelopeSweepsLast = (nr22 & 0x7) - 1;
+        if (parentObj.channel2totalLength == 0) {
+          parentObj.channel2totalLength = 0x40;
+        }
+        if ((data & 0x40) == 0x40) {
+          parentObj.memory[0xFF26] |= 0x2;
+        }
+      }
+      parentObj.channel2consecutive = ((data & 0x40) == 0x0);
+      parentObj.channel2frequency = ((data & 0x7) << 8) | (parentObj.channel2frequency & 0xFF);
+      parentObj.channel2FrequencyTracker = (0x800 - parentObj.channel2frequency) << 2;
+      parentObj.memory[0xFF19] = data & 0x40;
+      parentObj.channel2EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x1A] = this.memoryWriter[0xFF1A] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (!parentObj.channel3canPlay && data >= 0x80) {
+        parentObj.channel3lastSampleLookup = 0;
+        parentObj.channel3UpdateCache();
+      }
+      parentObj.channel3canPlay = (data > 0x7F);
+      if (parentObj.channel3canPlay && parentObj.memory[0xFF1A] > 0x7F && !parentObj.channel3consecutive) {
+        parentObj.memory[0xFF26] |= 0x4;
+      }
+      parentObj.memory[0xFF1A] = data & 0x80;
+      //parentObj.channel3EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x1B] = this.memoryWriter[0xFF1B] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
+      if (parentObj.soundMasterEnabled) {
+        parentObj.audioJIT();
+      }
+      parentObj.channel3totalLength = 0x100 - data;
+      parentObj.memory[0xFF1B] = data;
+      parentObj.channel3EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x1C] = this.memoryWriter[0xFF1C] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      data &= 0x60;
+      parentObj.memory[0xFF1C] = data;
+      parentObj.channel3patternType = (data == 0) ? 4 : ((data >> 5) - 1);
+    }
+  }
+  this.memoryHighWriter[0x1D] = this.memoryWriter[0xFF1D] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.channel3frequency = (parentObj.channel3frequency & 0x700) | data;
+      parentObj.channel3FrequencyPeriod = (0x800 - parentObj.channel3frequency) << 1;
+      parentObj.memory[0xFF1D] = data;
+    }
+  }
+  this.memoryHighWriter[0x1E] = this.memoryWriter[0xFF1E] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (data > 0x7F) {
+        if (parentObj.channel3totalLength == 0) {
+          parentObj.channel3totalLength = 0x100;
+        }
+        parentObj.channel3lastSampleLookup = 0;
+        if ((data & 0x40) == 0x40) {
+          parentObj.memory[0xFF26] |= 0x4;
+        }
+      }
+      parentObj.channel3consecutive = ((data & 0x40) == 0x0);
+      parentObj.channel3frequency = ((data & 0x7) << 8) | (parentObj.channel3frequency & 0xFF);
+      parentObj.channel3FrequencyPeriod = (0x800 - parentObj.channel3frequency) << 1;
+      parentObj.memory[0xFF1E] = data & 0x40;
+      parentObj.channel3EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x20] = this.memoryWriter[0xFF20] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
+      if (parentObj.soundMasterEnabled) {
+        parentObj.audioJIT();
+      }
+      parentObj.channel4totalLength = 0x40 - (data & 0x3F);
+      parentObj.memory[0xFF20] = data | 0xC0;
+      parentObj.channel4EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x21] = this.memoryWriter[0xFF21] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      if (parentObj.channel4Enabled && parentObj.channel4envelopeSweeps == 0) {
+        //Zombie Volume PAPU Bug:
+        if (((parentObj.memory[0xFF21] ^ data) & 0x8) == 0x8) {
+          if ((parentObj.memory[0xFF21] & 0x8) == 0) {
+            if ((parentObj.memory[0xFF21] & 0x7) == 0x7) {
+              parentObj.channel4envelopeVolume += 2;
+            }
+            else {
+              ++parentObj.channel4envelopeVolume;
+            }
+          }
+          parentObj.channel4envelopeVolume = (16 - parentObj.channel4envelopeVolume) & 0xF;
+        }
+        else if ((parentObj.memory[0xFF21] & 0xF) == 0x8) {
+          parentObj.channel4envelopeVolume = (1 + parentObj.channel4envelopeVolume) & 0xF;
+        }
+        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
+      }
+      parentObj.channel4envelopeType = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF21] = data;
+      parentObj.channel4UpdateCache();
+      parentObj.channel4VolumeEnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x22] = this.memoryWriter[0xFF22] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.channel4FrequencyPeriod = Math.max((data & 0x7) << 4, 8) << (data >> 4);
+      var bitWidth = (data & 0x8);
+      if ((bitWidth == 0x8 && parentObj.channel4BitRange == 0x7FFF) || (bitWidth == 0 && parentObj.channel4BitRange == 0x7F)) {
+        parentObj.channel4lastSampleLookup = 0;
+        parentObj.channel4BitRange = (bitWidth == 0x8) ? 0x7F : 0x7FFF;
+        parentObj.channel4VolumeShifter = (bitWidth == 0x8) ? 7 : 15;
+        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
+        parentObj.noiseSampleTable = (bitWidth == 0x8) ? parentObj.LSFR7Table : parentObj.LSFR15Table;
+      }
+      parentObj.memory[0xFF22] = data;
+      parentObj.channel4UpdateCache();
+    }
+  }
+  this.memoryHighWriter[0x23] = this.memoryWriter[0xFF23] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled) {
+      parentObj.audioJIT();
+      parentObj.memory[0xFF23] = data;
+      parentObj.channel4consecutive = ((data & 0x40) == 0x0);
+      if (data > 0x7F) {
+        var nr42 = parentObj.memory[0xFF21];
+        parentObj.channel4envelopeVolume = nr42 >> 4;
+        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
+        parentObj.channel4envelopeSweepsLast = (nr42 & 0x7) - 1;
+        if (parentObj.channel4totalLength == 0) {
+          parentObj.channel4totalLength = 0x40;
+        }
+        if ((data & 0x40) == 0x40) {
+          parentObj.memory[0xFF26] |= 0x8;
+        }
+      }
+      parentObj.channel4EnableCheck();
+    }
+  }
+  this.memoryHighWriter[0x24] = this.memoryWriter[0xFF24] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled && parentObj.memory[0xFF24] != data) {
+      parentObj.audioJIT();
+      parentObj.memory[0xFF24] = data;
+      parentObj.VinLeftChannelMasterVolume = ((data >> 4) & 0x07) + 1;
+      parentObj.VinRightChannelMasterVolume = (data & 0x07) + 1;
+      parentObj.mixerOutputLevelCache();
+    }
+  }
+  this.memoryHighWriter[0x25] = this.memoryWriter[0xFF25] = function (parentObj, address, data) {
+    if (parentObj.soundMasterEnabled && parentObj.memory[0xFF25] != data) {
+      parentObj.audioJIT();
+      parentObj.memory[0xFF25] = data;
+      parentObj.rightChannel1 = ((data & 0x01) == 0x01);
+      parentObj.rightChannel2 = ((data & 0x02) == 0x02);
+      parentObj.rightChannel3 = ((data & 0x04) == 0x04);
+      parentObj.rightChannel4 = ((data & 0x08) == 0x08);
+      parentObj.leftChannel1 = ((data & 0x10) == 0x10);
+      parentObj.leftChannel2 = ((data & 0x20) == 0x20);
+      parentObj.leftChannel3 = ((data & 0x40) == 0x40);
+      parentObj.leftChannel4 = (data > 0x7F);
+      parentObj.channel1OutputLevelCache();
+      parentObj.channel2OutputLevelCache();
+      parentObj.channel3OutputLevelCache();
+      parentObj.channel4OutputLevelCache();
+    }
+  }
+  this.memoryHighWriter[0x26] = this.memoryWriter[0xFF26] = function (parentObj, address, data) {
+    parentObj.audioJIT();
+    if (!parentObj.soundMasterEnabled && data > 0x7F) {
+      parentObj.memory[0xFF26] = 0x80;
+      parentObj.soundMasterEnabled = true;
+      parentObj.initializeAudioStartState();
+    }
+    else if (parentObj.soundMasterEnabled && data < 0x80) {
+      parentObj.memory[0xFF26] = 0;
+      parentObj.soundMasterEnabled = false;
+      //GBDev wiki says the registers are written with zeros on power off:
+      for (var index = 0xFF10; index < 0xFF26; index++) {
+        parentObj.memoryWriter[index](parentObj, index, 0);
+      }
+    }
+  }
+  //0xFF27 to 0xFF2F don't do anything...
+  this.memoryHighWriter[0x27] = this.memoryWriter[0xFF27] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x28] = this.memoryWriter[0xFF28] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x29] = this.memoryWriter[0xFF29] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2A] = this.memoryWriter[0xFF2A] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2B] = this.memoryWriter[0xFF2B] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2C] = this.memoryWriter[0xFF2C] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2D] = this.memoryWriter[0xFF2D] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2E] = this.memoryWriter[0xFF2E] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x2F] = this.memoryWriter[0xFF2F] = this.cartIgnoreWrite;
+  //WAVE PCM RAM:
+  this.memoryHighWriter[0x30] = this.memoryWriter[0xFF30] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0, data);
+  }
+  this.memoryHighWriter[0x31] = this.memoryWriter[0xFF31] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x1, data);
+  }
+  this.memoryHighWriter[0x32] = this.memoryWriter[0xFF32] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x2, data);
+  }
+  this.memoryHighWriter[0x33] = this.memoryWriter[0xFF33] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x3, data);
+  }
+  this.memoryHighWriter[0x34] = this.memoryWriter[0xFF34] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x4, data);
+  }
+  this.memoryHighWriter[0x35] = this.memoryWriter[0xFF35] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x5, data);
+  }
+  this.memoryHighWriter[0x36] = this.memoryWriter[0xFF36] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x6, data);
+  }
+  this.memoryHighWriter[0x37] = this.memoryWriter[0xFF37] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x7, data);
+  }
+  this.memoryHighWriter[0x38] = this.memoryWriter[0xFF38] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x8, data);
+  }
+  this.memoryHighWriter[0x39] = this.memoryWriter[0xFF39] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0x9, data);
+  }
+  this.memoryHighWriter[0x3A] = this.memoryWriter[0xFF3A] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xA, data);
+  }
+  this.memoryHighWriter[0x3B] = this.memoryWriter[0xFF3B] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xB, data);
+  }
+  this.memoryHighWriter[0x3C] = this.memoryWriter[0xFF3C] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xC, data);
+  }
+  this.memoryHighWriter[0x3D] = this.memoryWriter[0xFF3D] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xD, data);
+  }
+  this.memoryHighWriter[0x3E] = this.memoryWriter[0xFF3E] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xE, data);
+  }
+  this.memoryHighWriter[0x3F] = this.memoryWriter[0xFF3F] = function (parentObj, address, data) {
+    parentObj.channel3WriteRAM(0xF, data);
+  }
+  //SCY
+  this.memoryHighWriter[0x42] = this.memoryWriter[0xFF42] = function (parentObj, address, data) {
+    if (parentObj.backgroundY != data) {
+      parentObj.midScanLineJIT();
+      parentObj.backgroundY = data;
+    }
+  }
+  //SCX
+  this.memoryHighWriter[0x43] = this.memoryWriter[0xFF43] = function (parentObj, address, data) {
+    if (parentObj.backgroundX != data) {
+      parentObj.midScanLineJIT();
+      parentObj.backgroundX = data;
+    }
+  }
+  //LY
+  this.memoryHighWriter[0x44] = this.memoryWriter[0xFF44] = function (parentObj, address, data) {
+    //Read Only:
+    if (parentObj.LCDisOn) {
+      //Gambatte says to do this:
+      parentObj.modeSTAT = 2;
+      parentObj.midScanlineOffset = -1;
+      parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.LCDTicks = parentObj.STATTracker = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
+    }
+  }
+  //LYC
+  this.memoryHighWriter[0x45] = this.memoryWriter[0xFF45] = function (parentObj, address, data) {
+    if (parentObj.memory[0xFF45] != data) {
+      parentObj.memory[0xFF45] = data;
+      if (parentObj.LCDisOn) {
+        parentObj.matchLYC();  //Get the compare of the first scan line.
+      }
+    }
+  }
+  //WY
+  this.memoryHighWriter[0x4A] = this.memoryWriter[0xFF4A] = function (parentObj, address, data) {
+    if (parentObj.windowY != data) {
+      parentObj.midScanLineJIT();
+      parentObj.windowY = data;
+    }
+  }
+  //WX
+  this.memoryHighWriter[0x4B] = this.memoryWriter[0xFF4B] = function (parentObj, address, data) {
+    if (parentObj.memory[0xFF4B] != data) {
+      parentObj.midScanLineJIT();
+      parentObj.memory[0xFF4B] = data;
+      parentObj.windowX = data - 7;
+    }
+  }
+  this.memoryHighWriter[0x72] = this.memoryWriter[0xFF72] = function (parentObj, address, data) {
+    parentObj.memory[0xFF72] = data;
+  }
+  this.memoryHighWriter[0x73] = this.memoryWriter[0xFF73] = function (parentObj, address, data) {
+    parentObj.memory[0xFF73] = data;
+  }
+  this.memoryHighWriter[0x75] = this.memoryWriter[0xFF75] = function (parentObj, address, data) {
+    parentObj.memory[0xFF75] = data;
+  }
+  this.memoryHighWriter[0x76] = this.memoryWriter[0xFF76] = this.cartIgnoreWrite;
+  this.memoryHighWriter[0x77] = this.memoryWriter[0xFF77] = this.cartIgnoreWrite;
+  //IE (Interrupt Enable)
+  this.memoryHighWriter[0xFF] = this.memoryWriter[0xFFFF] = function (parentObj, address, data) {
+    parentObj.interruptsEnabled = data;
+    parentObj.checkIRQMatching();
+  }
+  this.recompileModelSpecificIOWriteHandling();
+  this.recompileBootIOWriteHandling();
+}
+GameBoyCore.prototype.recompileModelSpecificIOWriteHandling = function () {
+  if (this.cGBC) {
+    //GameBoy Color Specific I/O:
+    //SC (Serial Transfer Control Register)
+    this.memoryHighWriter[0x2] = this.memoryWriter[0xFF02] = function (parentObj, address, data) {
+      if (((data & 0x1) == 0x1)) {
+        //Internal clock:
+        parentObj.memory[0xFF02] = (data & 0x7F);
+        parentObj.serialTimer = ((data & 0x2) == 0) ? 4096 : 128;  //Set the Serial IRQ counter.
+        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = ((data & 0x2) == 0) ? 512 : 16;  //Set the transfer data shift counter.
+      }
+      else {
+        //External clock:
+        parentObj.memory[0xFF02] = data;
+        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = parentObj.serialTimer = 0;  //Zero the timers, since we're emulating as if nothing is connected.
+      }
+    }
+    this.memoryHighWriter[0x40] = this.memoryWriter[0xFF40] = function (parentObj, address, data) {
+      if (parentObj.memory[0xFF40] != data) {
+        parentObj.midScanLineJIT();
+        var temp_var = (data > 0x7F);
+        if (temp_var != parentObj.LCDisOn) {
+          //When the display mode changes...
+          parentObj.LCDisOn = temp_var;
+          parentObj.memory[0xFF41] &= 0x78;
+          parentObj.midScanlineOffset = -1;
+          parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.STATTracker = parentObj.LCDTicks = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
+          if (parentObj.LCDisOn) {
+            parentObj.modeSTAT = 2;
+            parentObj.matchLYC();  //Get the compare of the first scan line.
+            parentObj.LCDCONTROL = parentObj.LINECONTROL;
+          }
+          else {
+            parentObj.modeSTAT = 0;
+            parentObj.LCDCONTROL = parentObj.DISPLAYOFFCONTROL;
+            parentObj.DisplayShowOff();
+          }
+          parentObj.interruptsRequested &= 0xFD;
+        }
+        parentObj.gfxWindowCHRBankPosition = ((data & 0x40) == 0x40) ? 0x400 : 0;
+        parentObj.gfxWindowDisplay = ((data & 0x20) == 0x20);
+        parentObj.gfxBackgroundBankOffset = ((data & 0x10) == 0x10) ? 0 : 0x80;
+        parentObj.gfxBackgroundCHRBankPosition = ((data & 0x08) == 0x08) ? 0x400 : 0;
+        parentObj.gfxSpriteNormalHeight = ((data & 0x04) == 0);
+        parentObj.gfxSpriteShow = ((data & 0x02) == 0x02);
+        parentObj.BGPriorityEnabled = ((data & 0x01) == 0x01);
+        parentObj.priorityFlaggingPathRebuild();  //Special case the priority flagging as an optimization.
+        parentObj.memory[0xFF40] = data;
+      }
+    }
+    this.memoryHighWriter[0x41] = this.memoryWriter[0xFF41] = function (parentObj, address, data) {
+      parentObj.LYCMatchTriggerSTAT = ((data & 0x40) == 0x40);
+      parentObj.mode2TriggerSTAT = ((data & 0x20) == 0x20);
+      parentObj.mode1TriggerSTAT = ((data & 0x10) == 0x10);
+      parentObj.mode0TriggerSTAT = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF41] = data & 0x78;
+    }
+    this.memoryHighWriter[0x46] = this.memoryWriter[0xFF46] = function (parentObj, address, data) {
+      parentObj.memory[0xFF46] = data;
+      if (data < 0xE0) {
+        data <<= 8;
+        address = 0xFE00;
+        var stat = parentObj.modeSTAT;
+        parentObj.modeSTAT = 0;
+        var newData = 0;
+        do {
+          newData = parentObj.memoryReader[data](parentObj, data++);
+          if (newData != parentObj.memory[address]) {
+            //JIT the graphics render queue:
+            parentObj.modeSTAT = stat;
+            parentObj.graphicsJIT();
+            parentObj.modeSTAT = 0;
+            parentObj.memory[address++] = newData;
+            break;
+          }
+        } while (++address < 0xFEA0);
+        if (address < 0xFEA0) {
+          do {
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+          } while (address < 0xFEA0);
+        }
+        parentObj.modeSTAT = stat;
+      }
+    }
+    //KEY1
+    this.memoryHighWriter[0x4D] = this.memoryWriter[0xFF4D] = function (parentObj, address, data) {
+      parentObj.memory[0xFF4D] = (data & 0x7F) | (parentObj.memory[0xFF4D] & 0x80);
+    }
+    this.memoryHighWriter[0x4F] = this.memoryWriter[0xFF4F] = function (parentObj, address, data) {
+      parentObj.currVRAMBank = data & 0x01;
+      if (parentObj.currVRAMBank > 0) {
+        parentObj.BGCHRCurrentBank = parentObj.BGCHRBank2;
+      }
+      else {
+        parentObj.BGCHRCurrentBank = parentObj.BGCHRBank1;
+      }
+      //Only writable by GBC.
+    }
+    this.memoryHighWriter[0x51] = this.memoryWriter[0xFF51] = function (parentObj, address, data) {
+      if (!parentObj.hdmaRunning) {
+        parentObj.memory[0xFF51] = data;
+      }
+    }
+    this.memoryHighWriter[0x52] = this.memoryWriter[0xFF52] = function (parentObj, address, data) {
+      if (!parentObj.hdmaRunning) {
+        parentObj.memory[0xFF52] = data & 0xF0;
+      }
+    }
+    this.memoryHighWriter[0x53] = this.memoryWriter[0xFF53] = function (parentObj, address, data) {
+      if (!parentObj.hdmaRunning) {
+        parentObj.memory[0xFF53] = data & 0x1F;
+      }
+    }
+    this.memoryHighWriter[0x54] = this.memoryWriter[0xFF54] = function (parentObj, address, data) {
+      if (!parentObj.hdmaRunning) {
+        parentObj.memory[0xFF54] = data & 0xF0;
+      }
+    }
+    this.memoryHighWriter[0x55] = this.memoryWriter[0xFF55] = function (parentObj, address, data) {
+      if (!parentObj.hdmaRunning) {
+        if ((data & 0x80) == 0) {
+          //DMA
+          parentObj.DMAWrite((data & 0x7F) + 1);
+          parentObj.memory[0xFF55] = 0xFF;  //Transfer completed.
+        }
+        else {
+          //H-Blank DMA
+          parentObj.hdmaRunning = true;
+          parentObj.memory[0xFF55] = data & 0x7F;
+        }
+      }
+      else if ((data & 0x80) == 0) {
+        //Stop H-Blank DMA
+        parentObj.hdmaRunning = false;
+        parentObj.memory[0xFF55] |= 0x80;
+      }
+      else {
+        parentObj.memory[0xFF55] = data & 0x7F;
+      }
+    }
+    this.memoryHighWriter[0x68] = this.memoryWriter[0xFF68] = function (parentObj, address, data) {
+      parentObj.memory[0xFF69] = parentObj.gbcBGRawPalette[data & 0x3F];
+      parentObj.memory[0xFF68] = data;
+    }
+    this.memoryHighWriter[0x69] = this.memoryWriter[0xFF69] = function (parentObj, address, data) {
+      parentObj.updateGBCBGPalette(parentObj.memory[0xFF68] & 0x3F, data);
+      if (parentObj.memory[0xFF68] > 0x7F) { // high bit = autoincrement
+        var next = ((parentObj.memory[0xFF68] + 1) & 0x3F);
+        parentObj.memory[0xFF68] = (next | 0x80);
+        parentObj.memory[0xFF69] = parentObj.gbcBGRawPalette[next];
+      }
+      else {
+        parentObj.memory[0xFF69] = data;
+      }
+    }
+    this.memoryHighWriter[0x6A] = this.memoryWriter[0xFF6A] = function (parentObj, address, data) {
+      parentObj.memory[0xFF6B] = parentObj.gbcOBJRawPalette[data & 0x3F];
+      parentObj.memory[0xFF6A] = data;
+    }
+    this.memoryHighWriter[0x6B] = this.memoryWriter[0xFF6B] = function (parentObj, address, data) {
+      parentObj.updateGBCOBJPalette(parentObj.memory[0xFF6A] & 0x3F, data);
+      if (parentObj.memory[0xFF6A] > 0x7F) { // high bit = autoincrement
+        var next = ((parentObj.memory[0xFF6A] + 1) & 0x3F);
+        parentObj.memory[0xFF6A] = (next | 0x80);
+        parentObj.memory[0xFF6B] = parentObj.gbcOBJRawPalette[next];
+      }
+      else {
+        parentObj.memory[0xFF6B] = data;
+      }
+    }
+    //SVBK
+    this.memoryHighWriter[0x70] = this.memoryWriter[0xFF70] = function (parentObj, address, data) {
+      var addressCheck = (parentObj.memory[0xFF51] << 8) | parentObj.memory[0xFF52];  //Cannot change the RAM bank while WRAM is the source of a running HDMA.
+      if (!parentObj.hdmaRunning || addressCheck < 0xD000 || addressCheck >= 0xE000) {
+        parentObj.gbcRamBank = Math.max(data & 0x07, 1);  //Bank range is from 1-7
+        parentObj.gbcRamBankPosition = ((parentObj.gbcRamBank - 1) << 12) - 0xD000;
+        parentObj.gbcRamBankPositionECHO = parentObj.gbcRamBankPosition - 0x2000;
+      }
+      parentObj.memory[0xFF70] = data;  //Bit 6 cannot be written to.
+    }
+    this.memoryHighWriter[0x74] = this.memoryWriter[0xFF74] = function (parentObj, address, data) {
+      parentObj.memory[0xFF74] = data;
+    }
+  }
+  else {
+    //Fill in the GameBoy Color I/O registers as normal RAM for GameBoy compatibility:
+    //SC (Serial Transfer Control Register)
+    this.memoryHighWriter[0x2] = this.memoryWriter[0xFF02] = function (parentObj, address, data) {
+      if (((data & 0x1) == 0x1)) {
+        //Internal clock:
+        parentObj.memory[0xFF02] = (data & 0x7F);
+        parentObj.serialTimer = 4096;  //Set the Serial IRQ counter.
+        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = 512;  //Set the transfer data shift counter.
+      }
+      else {
+        //External clock:
+        parentObj.memory[0xFF02] = data;
+        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = parentObj.serialTimer = 0;  //Zero the timers, since we're emulating as if nothing is connected.
+      }
+    }
+    this.memoryHighWriter[0x40] = this.memoryWriter[0xFF40] = function (parentObj, address, data) {
+      if (parentObj.memory[0xFF40] != data) {
+        parentObj.midScanLineJIT();
+        var temp_var = (data > 0x7F);
+        if (temp_var != parentObj.LCDisOn) {
+          //When the display mode changes...
+          parentObj.LCDisOn = temp_var;
+          parentObj.memory[0xFF41] &= 0x78;
+          parentObj.midScanlineOffset = -1;
+          parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.STATTracker = parentObj.LCDTicks = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
+          if (parentObj.LCDisOn) {
+            parentObj.modeSTAT = 2;
+            parentObj.matchLYC();  //Get the compare of the first scan line.
+            parentObj.LCDCONTROL = parentObj.LINECONTROL;
+          }
+          else {
+            parentObj.modeSTAT = 0;
+            parentObj.LCDCONTROL = parentObj.DISPLAYOFFCONTROL;
+            parentObj.DisplayShowOff();
+          }
+          parentObj.interruptsRequested &= 0xFD;
+        }
+        parentObj.gfxWindowCHRBankPosition = ((data & 0x40) == 0x40) ? 0x400 : 0;
+        parentObj.gfxWindowDisplay = (data & 0x20) == 0x20;
+        parentObj.gfxBackgroundBankOffset = ((data & 0x10) == 0x10) ? 0 : 0x80;
+        parentObj.gfxBackgroundCHRBankPosition = ((data & 0x08) == 0x08) ? 0x400 : 0;
+        parentObj.gfxSpriteNormalHeight = ((data & 0x04) == 0);
+        parentObj.gfxSpriteShow = (data & 0x02) == 0x02;
+        parentObj.bgEnabled = ((data & 0x01) == 0x01);
+        parentObj.memory[0xFF40] = data;
+      }
+    }
+    this.memoryHighWriter[0x41] = this.memoryWriter[0xFF41] = function (parentObj, address, data) {
+      parentObj.LYCMatchTriggerSTAT = ((data & 0x40) == 0x40);
+      parentObj.mode2TriggerSTAT = ((data & 0x20) == 0x20);
+      parentObj.mode1TriggerSTAT = ((data & 0x10) == 0x10);
+      parentObj.mode0TriggerSTAT = ((data & 0x08) == 0x08);
+      parentObj.memory[0xFF41] = data & 0x78;
+      if ((!parentObj.usedBootROM || !parentObj.usedGBCBootROM) && parentObj.LCDisOn && parentObj.modeSTAT < 2) {
+        parentObj.interruptsRequested |= 0x2;
+        parentObj.checkIRQMatching();
+      }
+    }
+    this.memoryHighWriter[0x46] = this.memoryWriter[0xFF46] = function (parentObj, address, data) {
+      parentObj.memory[0xFF46] = data;
+      if (data > 0x7F && data < 0xE0) {  //DMG cannot DMA from the ROM banks.
+        data <<= 8;
+        address = 0xFE00;
+        var stat = parentObj.modeSTAT;
+        parentObj.modeSTAT = 0;
+        var newData = 0;
+        do {
+          newData = parentObj.memoryReader[data](parentObj, data++);
+          if (newData != parentObj.memory[address]) {
+            //JIT the graphics render queue:
+            parentObj.modeSTAT = stat;
+            parentObj.graphicsJIT();
+            parentObj.modeSTAT = 0;
+            parentObj.memory[address++] = newData;
+            break;
+          }
+        } while (++address < 0xFEA0);
+        if (address < 0xFEA0) {
+          do {
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
+          } while (address < 0xFEA0);
+        }
+        parentObj.modeSTAT = stat;
+      }
+    }
+    this.memoryHighWriter[0x47] = this.memoryWriter[0xFF47] = function (parentObj, address, data) {
+      if (parentObj.memory[0xFF47] != data) {
+        parentObj.midScanLineJIT();
+        parentObj.updateGBBGPalette(data);
+        parentObj.memory[0xFF47] = data;
+      }
+    }
+    this.memoryHighWriter[0x48] = this.memoryWriter[0xFF48] = function (parentObj, address, data) {
+      if (parentObj.memory[0xFF48] != data) {
+        parentObj.midScanLineJIT();
+        parentObj.updateGBOBJPalette(0, data);
+        parentObj.memory[0xFF48] = data;
+      }
+    }
+    this.memoryHighWriter[0x49] = this.memoryWriter[0xFF49] = function (parentObj, address, data) {
+      if (parentObj.memory[0xFF49] != data) {
+        parentObj.midScanLineJIT();
+        parentObj.updateGBOBJPalette(4, data);
+        parentObj.memory[0xFF49] = data;
+      }
+    }
+    this.memoryHighWriter[0x4D] = this.memoryWriter[0xFF4D] = function (parentObj, address, data) {
+      parentObj.memory[0xFF4D] = data;
+    }
+    this.memoryHighWriter[0x4F] = this.memoryWriter[0xFF4F] = this.cartIgnoreWrite;  //Not writable in DMG mode.
+    this.memoryHighWriter[0x55] = this.memoryWriter[0xFF55] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x68] = this.memoryWriter[0xFF68] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x69] = this.memoryWriter[0xFF69] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x6A] = this.memoryWriter[0xFF6A] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x6B] = this.memoryWriter[0xFF6B] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x6C] = this.memoryWriter[0xFF6C] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x70] = this.memoryWriter[0xFF70] = this.cartIgnoreWrite;
+    this.memoryHighWriter[0x74] = this.memoryWriter[0xFF74] = this.cartIgnoreWrite;
+  }
+}
+GameBoyCore.prototype.recompileBootIOWriteHandling = function () {
+  //Boot I/O Registers:
+  if (this.inBootstrap) {
+    this.memoryHighWriter[0x50] = this.memoryWriter[0xFF50] = function (parentObj, address, data) {
+      cout("Boot ROM reads blocked: Bootstrap process has ended.", 0);
+      parentObj.inBootstrap = false;
+      parentObj.disableBootROM();      //Fill in the boot ROM ranges with ROM  bank 0 ROM ranges
+      parentObj.memory[0xFF50] = data;  //Bits are sustained in memory?
+    }
+    if (this.cGBC) {
+      this.memoryHighWriter[0x6C] = this.memoryWriter[0xFF6C] = function (parentObj, address, data) {
+        if (parentObj.inBootstrap) {
+          parentObj.cGBC = ((data & 0x1) == 0);
+          //Exception to the GBC identifying code:
+          if (parentObj.name + parentObj.gameCode + parentObj.ROM[0x143] == "Game and Watch 50") {
+            parentObj.cGBC = true;
+            cout("Created a boot exception for Game and Watch Gallery 2 (GBC ID byte is wrong on the cartridge).", 1);
+          }
+          cout("Booted to GBC Mode: " + parentObj.cGBC, 0);
+        }
+        parentObj.memory[0xFF6C] = data;
+      }
+    }
+  }
+  else {
+    //Lockout the ROMs from accessing the BOOT ROM control register:
+    this.memoryHighWriter[0x50] = this.memoryWriter[0xFF50] = this.cartIgnoreWrite;
+  }
+}
+//Helper Functions
+GameBoyCore.prototype.toTypedArray = function (baseArray, memtype) {
+  try {
+    // The following line was modified for benchmarking:
+    if (settings[5] || (memtype != "float32" && GameBoyWindow.opera && this.checkForOperaMathBug())) {
+      return baseArray;
+    }
+    if (!baseArray || !baseArray.length) {
+      return [];
+    }
+    var length = baseArray.length;
+    switch (memtype) {
+      case "uint8":
+        var typedArrayTemp = new Uint8Array(length);
+        break;
+      case "int8":
+        var typedArrayTemp = new Int8Array(length);
+        break;
+      case "int32":
+        var typedArrayTemp = new Int32Array(length);
+        break;
+      case "float32":
+        var typedArrayTemp = new Float32Array(length);
+    }
+    for (var index = 0; index < length; index++) {
+      typedArrayTemp[index] = baseArray[index];
+    }
+    return typedArrayTemp;
+  }
+  catch (error) {
+    cout("Could not convert an array to a typed array: " + error.message, 1);
+    return baseArray;
+  }
+}
+GameBoyCore.prototype.fromTypedArray = function (baseArray) {
+  try {
+    if (!baseArray || !baseArray.length) {
+      return [];
+    }
+    var arrayTemp = [];
+    for (var index = 0; index < baseArray.length; ++index) {
+      arrayTemp[index] = baseArray[index];
+    }
+    return arrayTemp;
+  }
+  catch (error) {
+    cout("Conversion from a typed array failed: " + error.message, 1);
+    return baseArray;
+  }
+}
+GameBoyCore.prototype.getTypedArray = function (length, defaultValue, numberType) {
+  try {
+    if (settings[5]) {
+      throw(new Error(""));
+    }
+    // The following line was modified for benchmarking:
+    if (numberType != "float32" && GameBoyWindow.opera && this.checkForOperaMathBug()) {
+      //Caught Opera breaking typed array math:
+      throw(new Error(""));
+    }
+    switch (numberType) {
+      case "int8":
+        var arrayHandle = new Int8Array(length);
+        break;
+      case "uint8":
+        var arrayHandle = new Uint8Array(length);
+        break;
+      case "int32":
+        var arrayHandle = new Int32Array(length);
+        break;
+      case "float32":
+        var arrayHandle = new Float32Array(length);
+    }
+    if (defaultValue != 0) {
+      var index = 0;
+      while (index < length) {
+        arrayHandle[index++] = defaultValue;
+      }
+    }
+  }
+  catch (error) {
+    cout("Could not convert an array to a typed array: " + error.message, 1);
+    var arrayHandle = [];
+    var index = 0;
+    while (index < length) {
+      arrayHandle[index++] = defaultValue;
+    }
+  }
+  return arrayHandle;
+}
+GameBoyCore.prototype.checkForOperaMathBug = function () {
+  var testTypedArray = new Uint8Array(1);
+  testTypedArray[0] = -1;
+  testTypedArray[0] >>= 0;
+  if (testTypedArray[0] != 0xFF) {
+    cout("Detected faulty math by your browser.", 2);
+    return true;
+  }
+  else {
+    return false;
+  }
+}
+
+// End of js/GameBoyCore.js file.
+
+// Start of js/GameBoyIO.js file.
+
+"use strict";
+var gameboy = null;            //GameBoyCore object.
+var gbRunInterval = null;        //GameBoyCore Timer
+var settings = [            //Some settings.
+  true,                 //Turn on sound.
+  false,                //Boot with boot ROM first? (set to false for benchmarking)
+  false,                //Give priority to GameBoy mode
+  [39, 37, 38, 40, 88, 90, 16, 13],  //Keyboard button map.
+  true,                //Colorize GB mode?
+  false,                //Disallow typed arrays?
+  4,                  //Interval for the emulator loop.
+  15,                  //Audio buffer minimum span amount over x interpreter iterations.
+  30,                  //Audio buffer maximum span amount over x interpreter iterations.
+  false,                //Override to allow for MBC1 instead of ROM only (compatibility for broken 3rd-party cartridges).
+  false,                //Override MBC RAM disabling and always allow reading and writing to the banks.
+  false,                //Use the GameBoy boot ROM instead of the GameBoy Color boot ROM.
+  false,                //Scale the canvas in JS, or let the browser scale the canvas?
+  0x10,                //Internal audio buffer pre-interpolation factor.
+  1                  //Volume level set.
+];
+function start(canvas, ROM) {
+  clearLastEmulation();
+  autoSave();  //If we are about to load a new game, then save the last one...
+  gameboy = new GameBoyCore(canvas, ROM);
+  gameboy.openMBC = openSRAM;
+  gameboy.openRTC = openRTC;
+  gameboy.start();
+  run();
+}
+function run() {
+  if (GameBoyEmulatorInitialized()) {
+    if (!GameBoyEmulatorPlaying()) {
+      gameboy.stopEmulator &= 1;
+      cout("Starting the iterator.", 0);
+      var dateObj = new_Date();  // The line is changed for benchmarking.
+      gameboy.firstIteration = dateObj.getTime();
+      gameboy.iterations = 0;
+      // The following lines are commented out for benchmarking.
+      // gbRunInterval = setInterval(function () {
+      //  if (!document.hidden && !document.msHidden && !document.mozHidden && !document.webkitHidden) {
+      //    gameboy.run();
+      // }
+      // }, settings[6]);
+    }
+    else {
+      cout("The GameBoy core is already running.", 1);
+    }
+  }
+  else {
+    cout("GameBoy core cannot run while it has not been initialized.", 1);
+  }
+}
+function pause() {
+  if (GameBoyEmulatorInitialized()) {
+    if (GameBoyEmulatorPlaying()) {
+      clearLastEmulation();
+    }
+    else {
+      cout("GameBoy core has already been paused.", 1);
+    }
+  }
+  else {
+    cout("GameBoy core cannot be paused while it has not been initialized.", 1);
+  }
+}
+function clearLastEmulation() {
+  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
+    clearInterval(gbRunInterval);
+    gameboy.stopEmulator |= 2;
+    cout("The previous emulation has been cleared.", 0);
+  }
+  else {
+    cout("No previous emulation was found to be cleared.", 0);
+  }
+}
+function save() {
+  if (GameBoyEmulatorInitialized()) {
+    try {
+      var state_suffix = 0;
+      while (findValue("FREEZE_" + gameboy.name + "_" + state_suffix) != null) {
+        state_suffix++;
+      }
+      setValue("FREEZE_" + gameboy.name + "_" + state_suffix, gameboy.saveState());
+      cout("Saved the current state as: FREEZE_" + gameboy.name + "_" + state_suffix, 0);
+    }
+    catch (error) {
+      cout("Could not save the current emulation state(\"" + error.message + "\").", 2);
+    }
+  }
+  else {
+    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
+  }
+}
+function saveSRAM() {
+  if (GameBoyEmulatorInitialized()) {
+    if (gameboy.cBATT) {
+      try {
+        var sram = gameboy.saveSRAMState();
+        if (sram.length > 0) {
+          cout("Saving the SRAM...", 0);
+          if (findValue("SRAM_" + gameboy.name) != null) {
+            //Remove the outdated storage format save:
+            cout("Deleting the old SRAM save due to outdated format.", 0);
+            deleteValue("SRAM_" + gameboy.name);
+          }
+          setValue("B64_SRAM_" + gameboy.name, arrayToBase64(sram));
+        }
+        else {
+          cout("SRAM could not be saved because it was empty.", 1);
+        }
+      }
+      catch (error) {
+        cout("Could not save the current emulation state(\"" + error.message + "\").", 2);
+      }
+    }
+    else {
+      cout("Cannot save a game that does not have battery backed SRAM specified.", 1);
+    }
+    saveRTC();
+  }
+  else {
+    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
+  }
+}
+function saveRTC() {  //Execute this when SRAM is being saved as well.
+  if (GameBoyEmulatorInitialized()) {
+    if (gameboy.cTIMER) {
+      try {
+        cout("Saving the RTC...", 0);
+        setValue("RTC_" + gameboy.name, gameboy.saveRTCState());
+      }
+      catch (error) {
+        cout("Could not save the RTC of the current emulation state(\"" + error.message + "\").", 2);
+      }
+    }
+  }
+  else {
+    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
+  }
+}
+function autoSave() {
+  if (GameBoyEmulatorInitialized()) {
+    cout("Automatically saving the SRAM.", 0);
+    saveSRAM();
+    saveRTC();
+  }
+}
+function openSRAM(filename) {
+  try {
+    if (findValue("B64_SRAM_" + filename) != null) {
+      cout("Found a previous SRAM state (Will attempt to load).", 0);
+      return base64ToArray(findValue("B64_SRAM_" + filename));
+    }
+    else if (findValue("SRAM_" + filename) != null) {
+      cout("Found a previous SRAM state (Will attempt to load).", 0);
+      return findValue("SRAM_" + filename);
+    }
+    else {
+      cout("Could not find any previous SRAM copy for the current ROM.", 0);
+    }
+  }
+  catch (error) {
+    cout("Could not open the  SRAM of the saved emulation state.", 2);
+  }
+  return [];
+}
+function openRTC(filename) {
+  try {
+    if (findValue("RTC_" + filename) != null) {
+      cout("Found a previous RTC state (Will attempt to load).", 0);
+      return findValue("RTC_" + filename);
+    }
+    else {
+      cout("Could not find any previous RTC copy for the current ROM.", 0);
+    }
+  }
+  catch (error) {
+    cout("Could not open the RTC data of the saved emulation state.", 2);
+  }
+  return [];
+}
+function openState(filename, canvas) {
+  try {
+    if (findValue(filename) != null) {
+      try {
+        clearLastEmulation();
+        cout("Attempting to run a saved emulation state.", 0);
+        gameboy = new GameBoyCore(canvas, "");
+        gameboy.savedStateFileName = filename;
+        gameboy.returnFromState(findValue(filename));
+        run();
+      }
+      catch (error) {
+        alert(error.message + " file: " + error.fileName + " line: " + error.lineNumber);
+      }
+    }
+    else {
+      cout("Could not find the save state " + filename + "\".", 2);
+    }
+  }
+  catch (error) {
+    cout("Could not open the saved emulation state.", 2);
+  }
+}
+function import_save(blobData) {
+  blobData = decodeBlob(blobData);
+  if (blobData && blobData.blobs) {
+    if (blobData.blobs.length > 0) {
+      for (var index = 0; index < blobData.blobs.length; ++index) {
+        cout("Importing blob \"" + blobData.blobs[index].blobID + "\"", 0);
+        if (blobData.blobs[index].blobContent) {
+          if (blobData.blobs[index].blobID.substring(0, 5) == "SRAM_") {
+            setValue("B64_" + blobData.blobs[index].blobID, base64(blobData.blobs[index].blobContent));
+          }
+          else {
+            setValue(blobData.blobs[index].blobID, JSON.parse(blobData.blobs[index].blobContent));
+          }
+        }
+        else if (blobData.blobs[index].blobID) {
+          cout("Save file imported had blob \"" + blobData.blobs[index].blobID + "\" with no blob data interpretable.", 2);
+        }
+        else {
+          cout("Blob chunk information missing completely.", 2);
+        }
+      }
+    }
+    else {
+      cout("Could not decode the imported file.", 2);
+    }
+  }
+  else {
+    cout("Could not decode the imported file.", 2);
+  }
+}
+function generateBlob(keyName, encodedData) {
+  //Append the file format prefix:
+  var saveString = "EMULATOR_DATA";
+  var consoleID = "GameBoy";
+  //Figure out the length:
+  var totalLength = (saveString.length + 4 + (1 + consoleID.length)) + ((1 + keyName.length) + (4 + encodedData.length));
+  //Append the total length in bytes:
+  saveString += to_little_endian_dword(totalLength);
+  //Append the console ID text's length:
+  saveString += to_byte(consoleID.length);
+  //Append the console ID text:
+  saveString += consoleID;
+  //Append the blob ID:
+  saveString += to_byte(keyName.length);
+  saveString += keyName;
+  //Now append the save data:
+  saveString += to_little_endian_dword(encodedData.length);
+  saveString += encodedData;
+  return saveString;
+}
+function generateMultiBlob(blobPairs) {
+  var consoleID = "GameBoy";
+  //Figure out the initial length:
+  var totalLength = 13 + 4 + 1 + consoleID.length;
+  //Append the console ID text's length:
+  var saveString = to_byte(consoleID.length);
+  //Append the console ID text:
+  saveString += consoleID;
+  var keyName = "";
+  var encodedData = "";
+  //Now append all the blobs:
+  for (var index = 0; index < blobPairs.length; ++index) {
+    keyName = blobPairs[index][0];
+    encodedData = blobPairs[index][1];
+    //Append the blob ID:
+    saveString += to_byte(keyName.length);
+    saveString += keyName;
+    //Now append the save data:
+    saveString += to_little_endian_dword(encodedData.length);
+    saveString += encodedData;
+    //Update the total length:
+    totalLength += 1 + keyName.length + 4 + encodedData.length;
+  }
+  //Now add the prefix:
+  saveString = "EMULATOR_DATA" + to_little_endian_dword(totalLength) + saveString;
+  return saveString;
+}
+function decodeBlob(blobData) {
+  /*Format is as follows:
+    - 13 byte string "EMULATOR_DATA"
+    - 4 byte total size (including these 4 bytes).
+    - 1 byte Console type ID length
+    - Console type ID text of 8 bit size
+    blobs {
+      - 1 byte blob ID length
+      - blob ID text (Used to say what the data is (SRAM/freeze state/etc...))
+      - 4 byte blob length
+      - blob length of 32 bit size
+    }
+  */
+  var length = blobData.length;
+  var blobProperties = {};
+  blobProperties.consoleID = null;
+  var blobsCount = -1;
+  blobProperties.blobs = [];
+  if (length > 17) {
+    if (blobData.substring(0, 13) == "EMULATOR_DATA") {
+      var length = Math.min(((blobData.charCodeAt(16) & 0xFF) << 24) | ((blobData.charCodeAt(15) & 0xFF) << 16) | ((blobData.charCodeAt(14) & 0xFF) << 8) | (blobData.charCodeAt(13) & 0xFF), length);
+      var consoleIDLength = blobData.charCodeAt(17) & 0xFF;
+      if (length > 17 + consoleIDLength) {
+        blobProperties.consoleID = blobData.substring(18, 18 + consoleIDLength);
+        var blobIDLength = 0;
+        var blobLength = 0;
+        for (var index = 18 + consoleIDLength; index < length;) {
+          blobIDLength = blobData.charCodeAt(index++) & 0xFF;
+          if (index + blobIDLength < length) {
+            blobProperties.blobs[++blobsCount] = {};
+            blobProperties.blobs[blobsCount].blobID = blobData.substring(index, index + blobIDLength);
+            index += blobIDLength;
+            if (index + 4 < length) {
+              blobLength = ((blobData.charCodeAt(index + 3) & 0xFF) << 24) | ((blobData.charCodeAt(index + 2) & 0xFF) << 16) | ((blobData.charCodeAt(index + 1) & 0xFF) << 8) | (blobData.charCodeAt(index) & 0xFF);
+              index += 4;
+              if (index + blobLength <= length) {
+                blobProperties.blobs[blobsCount].blobContent =  blobData.substring(index, index + blobLength);
+                index += blobLength;
+              }
+              else {
+                cout("Blob length check failed, blob determined to be incomplete.", 2);
+                break;
+              }
+            }
+            else {
+              cout("Blob was incomplete, bailing out.", 2);
+              break;
+            }
+          }
+          else {
+            cout("Blob was incomplete, bailing out.", 2);
+            break;
+          }
+        }
+      }
+    }
+  }
+  return blobProperties;
+}
+function matchKey(key) {  //Maps a keyboard key to a gameboy key.
+  //Order: Right, Left, Up, Down, A, B, Select, Start
+  for (var index = 0; index < settings[3].length; index++) {
+    if (settings[3][index] == key) {
+      return index;
+    }
+  }
+  return -1;
+}
+function GameBoyEmulatorInitialized() {
+  return (typeof gameboy == "object" && gameboy != null);
+}
+function GameBoyEmulatorPlaying() {
+  return ((gameboy.stopEmulator & 2) == 0);
+}
+function GameBoyKeyDown(e) {
+  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
+    var keycode = matchKey(e.keyCode);
+    if (keycode >= 0 && keycode < 8) {
+      gameboy.JoyPadEvent(keycode, true);
+      try {
+        e.preventDefault();
+      }
+      catch (error) { }
+    }
+  }
+}
+function GameBoyKeyUp(e) {
+  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
+    var keycode = matchKey(e.keyCode);
+    if (keycode >= 0 && keycode < 8) {
+      gameboy.JoyPadEvent(keycode, false);
+      try {
+        e.preventDefault();
+      }
+      catch (error) { }
+    }
+  }
+}
+function GameBoyGyroSignalHandler(e) {
+  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
+    if (e.gamma || e.beta) {
+      gameboy.GyroEvent(e.gamma * Math.PI / 180, e.beta * Math.PI / 180);
+    }
+    else {
+      gameboy.GyroEvent(e.x, e.y);
+    }
+    try {
+      e.preventDefault();
+    }
+    catch (error) { }
+  }
+}
+//The emulator will call this to sort out the canvas properties for (re)initialization.
+function initNewCanvas() {
+  if (GameBoyEmulatorInitialized()) {
+    gameboy.canvas.width = gameboy.canvas.clientWidth;
+    gameboy.canvas.height = gameboy.canvas.clientHeight;
+  }
+}
+//Call this when resizing the canvas:
+function initNewCanvasSize() {
+  if (GameBoyEmulatorInitialized()) {
+    if (!settings[12]) {
+      if (gameboy.onscreenWidth != 160 || gameboy.onscreenHeight != 144) {
+        gameboy.initLCD();
+      }
+    }
+    else {
+      if (gameboy.onscreenWidth != gameboy.canvas.clientWidth || gameboy.onscreenHeight != gameboy.canvas.clientHeight) {
+        gameboy.initLCD();
+      }
+    }
+  }
+}
+
+// End of js/GameBoyIO.js file.
+
+// Start of realtime.js file.
+// ROM code from Public Domain LPC2000 Demo "realtime" by AGO.
+
+gameboy_rom='r+BPyZiEZwA+AeBPySAobeEq6gAgKlYj5WJv6SRmZjjhKuXqACDJ/////////////////////////////////xgHZwCYhGcA2fX6/3/1xdXlIRPKNgHN9f/h0cHx6gAg+hLKtyAC8cnwgLcoF/CC7hjgUT6Q4FOv4FLgVOCAPv/gVfHZ8IG3IALx2fBA7gjgQA8PD+YB7gHgT/CC4FHuEOCCPojgU6/gUuBU4IE+/uBV4ID6NMs86jTL8dkKCgoKbWFkZSBieSBhZ28uIGVtYWlsOmdvYnV6b3ZAeWFob28uY29tCnVybDogc3BlY2N5LmRhLnJ1CgoKCv///////wDDSgnO7WZmzA0ACwNzAIMADAANAAgRH4iJAA7czG7m3d3Zmbu7Z2NuDuzM3dyZn7u5Mz5BR08nUyBSRUFMVElNRSCAAAAAAgEDADMBSTQeIUD/y37I8P/1y4fg//BE/pEg+su+8eD/yT7A4EY+KD0g/cnF1eWvEQPK1RITEhMGAyEAyuXFTgYAIWAMCQkqEhMqEhPB4SMFIOrhrwYIzYsU4dHByf////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAgMFBggJCwwOEBETFBYXGBobHR4fISIjJSYnKSorLC0uLzAxMjM0NTY3ODg5Ojo7PDw9PT4+Pj8/Pz9AQEBAQEBAQEBAPz8/Pz4+PT08PDs7Ojk5ODc2NTU0MzIxMC8uLCsqKSgmJSQjISAfHRwaGRcWFRMSEA8NCwoIBwUEAgH//fz6+ff29PPx8O7t6+ro5+Xk4uHg3t3c2tnY19bU09LR0M/OzczLysnJyMfGxsXFxMPDw8LCwcHBwcDAwMDAwMDAwMDBwcHBwsLDw8PExcXGxsfIycnKy8zNzs/Q0dLT1NXX2Nna3N3e4OHi5OXn6Onr7O7v8fL09vf5+vz9AAEECRAZJDFAUWR5kKnE4QAhRGmQueQRQHGk2RBJhMEAQYTJEFmk8UCR5DmQ6UShAGHEKZD5ZNFAsSSZEIkEgQCBBIkQmSSxQNFk+ZApxGEAoUTpkDnkkUDxpFkQyYRBAMGESRDZpHFAEeS5kGlEIQDhxKmQeWRRQDEkGRAJBAEAAQQJEBkkMUBRZHmQqcThACFEaZC55BFAcaTZEEmEwQBBhMkQWaTxQJHkOZDpRKEAYcQpkPlk0UCxJJkQiQSBAIEEiRCZJLFA0WT5kCnEYQChROmQOeSRQPGkWRDJhEEAwYRJENmkcUAR5LmQaUQhAOHEqZB5ZFFAMSQZEAkEAQAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAgICAgIDAwMDBAQEBAUFBQUGBgYHBwcICAkJCQoKCgsLDAwNDQ4ODw8QEBEREhITExQUFRUWFxcYGRkaGhscHB0eHh8gISEiIyQkJSYnJygpKisrLC0uLzAxMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1FSU1RVVldZWltcXV9gYWJkZWZnaWprbG5vcHJzdHZ3eXp7fX5/gYKEhYeIiouNjpCRk5SWl5manJ2foKKkpaepqqytr7GytLa3ubu9vsDCxMXHycvMztDS1NXX2dvd3+Hi5Obo6uzu8PL09vj6/P4A//z38Ofcz8CvnIdwVzwfAN+8l3BHHO/Aj1wn8Ld8PwC/fDfwp1wPwG8cx3AXvF8AnzzXcAecL8BP3Gfwd/x/AH/8d/Bn3E/AL5wHcNc8nwBfvBdwxxxvwA9cp/A3fL8AP3y38Cdcj8DvHEdwl7zfAB88V3CHnK/Az9zn8Pf8/wD//Pfw59zPwK+ch3BXPB8A37yXcEcc78CPXCfwt3w/AL98N/CnXA/AbxzHcBe8XwCfPNdwB5wvwE/cZ/B3/H8Af/x38GfcT8AvnAdw1zyfAF+8F3DHHG/AD1yn8Dd8vwA/fLfwJ1yPwO8cR3CXvN8AHzxXcIecr8DP3Ofw9/z/AP/////////////////////+/v7+/v79/f39/fz8/Pz8+/v7+vr6+vn5+fj4+Pf39/b29fX19PTz8/Ly8fHw8PDv7u7t7ezs6+vq6uno6Ofn5uXl5OPj4uHh4N/e3t3c3Nva2djY19bV1NTT0tHQz8/OzczLysnIx8bFxMPCwcDAvr28u7q5uLe2tbSzsrGwr62sq6qpqKalpKOioJ+enZyamZiWlZSTkZCPjYyLiYiHhYSCgYB+fXt6eHd1dHJxcG5sa2loZmVjYmBfXVtaWFdVU1JQTk1LSUhGREJBPz08Ojg2NDMxLy0rKigmJCIgHx0bGRcVExEPDQsJBwUDAf9/Px8PBwMBgEAgEAgEAgEAAQEBAQEBAQEBAQEA//////////////+AEAcAAQABAAEBAAEBAAEA/wD//wD//wD/AP+AKwcBAAEAAQD/AP8A/wD/AP8A/wABAAEAAQCARgcBAQEBAQD//////////////wABAQEBAQGAYQf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+AwODw+Pz+/xEAwAGxwj4E9cU+BfUKbwMKZ37+gCALI34LAiN+AwILGOsahhIDHBwcHPE9IN7BIRAAGVRdPgX1Cm8DCmcalhIjfAILfQIDAx0dHR3xPSDnIRgAGVRd8T0grskRAcAB6cI+BPUKbwMKZ37+gCALI34LAiN+AwILGOs+CvUahhIcHBwc8T0g9CN8Agt9AgMD8T0g0MkgIEZJTExFRCAgIFBPTFlHT05TIEhFTElDT1BURVJJTiBBQ1RJT04gIQDADgpwLHQsGhPWICI2ACwNIPE+oOoQyngBCQDlYmsJVF3hDMYKR3AsdCwaG9YgIjYALA0g8a/qEcrJ+hDK/jDI1gTqEMpHPqCQ/lA4Aj5QDgAM1ggw+3ghAcARBAB3xggZDSD5+hHKg+oRykf+UDgCPlAOAAzWCDD7eC4td9YIGQ0g+ckh9grzMf/PzVABr+Am4P/gD+BD4EL2SOBFPkDgQT4E4AfN9RM+CuoAAA4HeeBwJqCvIstsKPsNIPIh/v8yy30g+wEKABH1/yFpAc3kE+cCAVYAEQDBIVt2zeQTrwYYIWsOzYsUIYsOzaQUxwGwAxEAgCGhF8XlzeQT4cERAIjN5BMhAJgRAwABYMDHcc9yIwUg+BQdIPHN9RMhuxUGAc2WE82JEz5E4EGv4EU+A+D/+z4B6hLK4E0QAAB4zccTBSD6zZATxwEACFkhAIhzIwt4sSD5IQDHPv9FdyRwJCJ3JXclcCwg8x5/IQCYx3PPNgDL1DYIx3PLlCPLVCjuPoABDxARIAAhIpjF5XfL1HfLlDwZDSD1POEswQUg7D486jPLr+o0yz3qL8s+oOCCPgLqG8vNiRM+ROBBr+BFPgPg/68+ACEXyyI+CiI+IHev6h7L4ITgluodyz4B6h/L6g/D6g3KBlARnAjNxAjNcwsBLAHFzTsLzQAJwQt4sSDzzZATxwEACFkhAIhzIwt4sSD5zfUTeQYQIYMOzYsUPv/qKcsGgBGwCM3ECM2JEwEsAcXNbAzNAAnBC3ixIPOv6hLKzZATPpDgU/PHAbADEQCIIaEXzeQTzfUTIQIWBgHNlhPNiRM+ROBBr+BFPgPg//sY/j4D6gAgzcRGBgMhF8t+gCJ+gDwifoB3zckP+jDLb/oxy2fNtgs+AeCB8IG3IPv6Dcq3KAPNcwHJ+h3LBgARTg2Hb2AZKmZvTgkq4ItfKjzgjD1PKuCNe4eHg0cRAMUqEhwFIPp5h4eBRxEAxCoSHAUg+n3qMMt86jHLyfCL4I7wjOCP8I3gkBEAw9XlzcoQ4dHwpeaAEhwBAwAJ8JA94JAg6CEAxQYPKk+gXxq3IB95yzegXxq3IBYqT6BfGrcgD3nLN6BfGrcgBiwsLBhHLOXNyhDwlrcoKwYB8KXGP0/LfygBBcXwpMY/Vx4AzZMOe8H18KPGP1ceAM2TDsHhJCJwGAzhJPCjxj8i8KTGPyIsJRbDBg/wjj3gjsLiCz4C6gAgw1JhfBjcHwAL7mpIYL9vBgMhF8t+gCJ+gDwifoB3zckPIcsNEQDGzf4MI+U+A+oAICEgy83+DPocy9YIb+ocy82vYAYDESDLIWIOxeXVzcoQ4fCjxhQi8KQiNg8jVF3hIyMjwQUg5M3ERsE+AeoAIAr+/ygiEQDGbyYAKRnlAwoDbyYAKRleI1bhKmZvxc0xHMwAQMEY2T4B4IHwgbcg+8l+PMjl1c3KEAYB8KVPy38oAQXF8KTLf/UoAi88Vx4AzZMO8XsgAi88xn/B9fCjy3/1KAIvPFceAM2TDvF7KAIvPMZ/wdESE3gSE+EjIyMYsFANAgAIDAYCRCgoFANEKAAUE0QAABQSRAAoFAJVKCjsA1UoAOwTVQAA7BJVACjsAAAEBQAAAAEFAAEBAwIGAQEDBwYCAgAHAwICAAcEAwMBAgYDAwEFBgQEAAECBAQAAwIFBQQFBgUFBAcGMgAAzgAAADIAAM4AAAAyAADOKAAAHhEAChEAAAAACu8AHu8AFAAKFAD2FAAPCgAF6AAC4gAQ3gAQ4gD+CgD74g4C3Q4C4QAC4vIC3fIC4AAM4PsM4PsQ4/sJ3fsJ/wABAQICAwMEBAUFAAAGAQYCBgMGBAYFBgAHAQcCBwMHBAcFBwYICQoKCwsMDA0NDgoPDxAQEQoSEhMTERQVFRYVFxUYCBkIGggb/yAAD/AbD/DlD/9//3+XEQAAAGD/f5cRAAAYAP9/lxEAAIB8lxH/f/9/QHz/f18IAADLI8sSeC9HeS9PAyEAAH2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEssoyxkJ0BPJ+hfLJgJvfuCcLzzgnn3GQG9+4Jvgn6/gmOCZ4JrgneChPkDgl/oYy29OfcZAb0bFeOCgeeCizdMQ8KPgpvCk4KnwpeCsr+Cg4KI+QOChzdMQ8KPgp/Ck4KrwpeCtwXkvPOCgr+CheOCizdMQ8KPgmfCk4JzwpeCf8Kbgl/Cp4JrwrOCd8KfgmPCq4JvwreCe+hnLJgJvTn3GQG9GxXjgoHkvPOChr+CizdMQ8KPgpvCk4KnwpeCswXngoHjgoa/gos3TEPCj4KfwpOCq8KXgra/goOChPkDgos3TEPCj4JnwpOCc8KXgn/Cm4JfwqeCa8KzgnfCn4JjwquCb8K3gnskq4KAq4KEq4KLwl1/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8Jhf8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CZX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KPwml/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8Jtf8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CcX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KTwnV/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8J5f8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CfX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KXJ9T6D4EDxyfWv4EDxyfXF1eXHKv7/KFD+FiAaTiMqh4eHVF1vJgApKXgGmAlHelRne11vGNzGYBLPeBIcGNN2ACETyjQ1KPc1yfvFBmR2AAUg+8HJ+3YABSD7yfXF1eUqEhMLeLEg+OHRwfHJxeUBAKAhAMDNAxThwcnF5XEjBSD74cHJxdXlAQCAIZXKzQMU4dHBycXV5a/qFcuwIAwaEyIaEzIEDXjqFcvlxRq+EyAPIxq+IAkTIw0gCMHhGBkrGyMjBSDmecFPBBoTIhoTIiEVyzThDSDS+hXL4dHBydVfzXIUuzD60cnF9cH6FMrLD6mAR/CLkR+AR/AFqOoUysHJ9cXltxcXF/aA4Ggq4GkFIPo+5OBH4cHxyfXF5bcXFxf2gOBqKuBrBSD6PuTgSOBJ4cHxyT4Q4ADwAC/LN+bwRz4g4ADwAC/mD7DqFsvJzyEAgK8GIE8+CCINIPwFIPnHIQCABiBPIg0g/AUg+cnFzQMVSs0eFcHJxc0RFUjNGRVLzSMVwcnFBgHNKxXBycUGABj2xQYDGPHFBgLNKxXByfXlh4eAJsBvceHxyfXlh4cmwG9GI04jXiNW4fHJ9cXV5eCDKjzK8BPWIF/wg835FF95xghPezwY6PXF1eXF1c13FdHBex4FIS3LGNUBKssR8NjNlRURGPzNlRURnP/NlRUR9v/NlRUR//8+LzwZOPwCA3ovV3svXxMZyTAwRlBT/zAwUE5UU/8wMExJTkVT/xYFB1dFTENPTUUgVE8WBQgtUkVBTFRJTUUtFgAJREVNTyBNQURFIEVTUEVDSUFMTFkWAQpGT1IgTENQJzIwMDAgUEFSVFn/FgAAR1JFRVRJTlg6ICAgICAgICAgICAWAAFEU0MsUEFOLFNBQixGQVRBTElUWRYAAkpFRkYgRlJPSFdFSU4sSUNBUlVTFgADRE9YLFFVQU5HLEFCWVNTICAgICAWAAQgICAgICAgICAgICAgICAgICAgIBYABUNSRURJVFM6ICAgICAgICAgICAgFgAGQUxMIEdGWCZDT0RFIEJZIEFHTyAWAAdIRUxJQ09QVEVSIDNEIE1PREVMIBYACENSRUFURUQgQlkgQlVTWSAgICAgFgAJICAgICAgICAgICAgICAgICAgICAWAApVU0VEIFNPRlRXQVJFOiAgICAgIBYAC1JHQkRTLE5PJENBU0gsRkFSICAgFgAMICAgICAgICAgICAgICAgICAgICAWAA1DT05UQUNUOiAgICAgICAgICAgIBYADkdPQlVaT1ZAWUFIT08uQ09NICAgFgAPSFRUUDovL1NQRUNDWS5EQS5SVSAWABAgICAgICAgICAgICAgICAgICAgIBYAEVNFRSBZT1UgT04gR0JERVYyMDAw/wAAAAAAAAAAAAAAAAAAAAAICBwUHBQ4KDgoMDBwUCAgKCh8VHxUKCgAAAAAAAAAABQUPip/QT4qfFT+gnxUKCgICDw0fkL8rP6Cfmr8hHhYJCR+Wn5SPCR4SPyU/LRISBgYPCR+Wjwkflr8tH5KNDQQEDgocFAgIAAAAAAAAAAABAQOChwUOCg4KDgoHBQICBAQOCgcFBwUHBQ4KHBQICAAABQUPio8NH5CPCx8VCgoAAAICBwUPDR+QjwsOCgQEAAAAAAAAAAAEBA4KHBQcFAAAAAAAAB8fP6CfHwAAAAAAAAAAAAAAAAwMHhIeEgwMAQEDgoeEjwkeEjwkOCgQEAYGDwkflr+qv6q/LR4SDAwGBg8JHxUPDQ4KHxs/oJ8fBwcPiJ+Wjw0eEj8vP6CfHwcHD4iflo8NE5K/LR4SDAwJCR+Wn5afFT8tP6CfGwQEBwcPiJ8XPyEfnr8tHhIMDAYGDwkeFj8pP66/LR4SDAwPDx+Qv66XFQ4KHBQcFAgIBwcPiJ+Wjwkflr8tPiIcHAcHD4iflr+sn5KfHT4iHBwAAAAAAgIHBQICBAQOCgQEAAACAgcFAgIEBA4KDgocFAAAAAAHBQ4KHBQcFA4KAAAAAAAADw8fkJ8fPyEeHgAAAAAAAA4KBwUHBQ4KHBQAAAYGDwkflr8tHhoEBA4KBAQHBw+In5a/rL8pPi4+IhwcBwcPiJ+Wv66/oL+uvy0SEg4OHxEflr8pP6a/LT4iHBwHBw+In5a5qbgoP6y/IxwcDAweEh8VH5a7qr+uvyEeHgcHD4ifFx8RHhY/Lz+gnx8HBw+Inxc/IT4uOCg4KBAQBwcPiJ+Wvy8/qL+uvyEeHgkJH5a/rr+gv66/LT8tEhIPDx+QjwsOChwUHhY/IR4eDw8fkI+Og4KXFT8tHhIMDAkJH5afFR+Qv66/LT8tEhIICBwUHBQ4KDkpP66fEQ4OCgofFR+Qv6q/rr8tPy0SEgkJH5a/pr+qv6y7qr8tEhIHBw+In5a7qruqvy0+IhwcBwcPiJ+Wv66/IT4uOCgQEAcHD4iflr+uv6q/LT+inZ2HBw+In5a/LT4iPy0/LRISBwcPiJ8XP6Cfnr8tPiIcHB8fP6CfGw4KHBQcFBwUCAgJCR+Wn5a7qruqvy0eEgwMERE7qruqnxUfFR4SHBQICAkJH5aflr+uv6q/KR8VCgoJCR+WnxUOCg8JH5a/LRISCQkflr8tPy0eEhwUHBQICA8PH5C/LT46Dwsflr8hHh4HBw+IjwsOChwUHhYfEQ4OEBA4KDwkHhIPCQeEg4KBAQ4OHxEPDQcFDgoeGj4iHBwGBg8JH5a7qpERAAAAAAAAAAAAAAAAAAAAAB8fP6CfHx81rdPfJJne5X1MAIvPEevyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxnLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEeRcvT/F5MAIvPIVvJrcBAAA+t7zLEbrLED6/vcsRu8sQPj+8P8sRuj/LEL0/yxG7P8sQeLHIeKHAebcgB3xiV31rX3jLH9L/HD5AlU97lW96lPUwAi88R6/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYV5Fy9P8XkwAi88hGcuQMMxHMsf0pcdPkCUT3qUZ3uV9TACLzxHr8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhHkXL0/xeTACLzyFbyZAwzEcyx/SoRt91r9PfZNvepT1MAIvPEevyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxnLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFeRcvT/F5MAIvPIRnLr/DMRz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3q8MAVUZ3tdb3u90pdAfZNPepRfkTA+V3nLPy88g+CDPn+R5YdPbyYARCkpKQkBkVIJweV41kAXb3nWQB8fH+YPZ/CChGd55gcGB/YITwpP8INHLMl5S1+RV3nLPy88g+CDPneR5YdPbyYARCkpKQkBklsJweV41kAXb3nWQB8fH+YPZ/CChGd55gcGB/YITwpP8INHLMmVT3qUX5EwPld5yz8vPIPggz5/keWHT28mAEQpKSkJAR9BCcHleNZAF2951kAfHx/mD2fwgoRneeYHBgf2CE8KT/CDRyzJeUtfkVd5yz8vPIPggz53keWHT28mAEQpKSkJASBKCcHleNZAF2951kAfHx/mD2fwgoRneeYHBgf2CE8KT/CDRyzJfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkyX6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALMl+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASXJfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsyf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wHRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyIxDsrh+eEWwxgNIf3Er+oLyuoMyiwsLPCPPcjgj14sGrcqKPDGeeCT+g3Ktygm+gvKPP4DIAI+AeoLyiAH+gzKPOoMyvoMyl8WyvCT1nkSe8bH4JMqTypHKuUmxl+Hh4M8PG8qX1Z5h4eBPDxveE4sh4eARjw8bypmb3y6OAViV31rX3y4OAVgR31pT3q4OAVQR3tZT3iU4JR8h+CV5dXFr+CSzUpifeCS0eHVzUpi0eE+AeCSzUpi8JRfPniTZy5Hr8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdxkBnCA7KMQDC5fCVb8l7vTBVfZNPepRfkTAkV3nLPy88Rz5/kU3Fh09vJgBEKSkJAfdiCcHlJsLwkm94BoDJeUtfkVd5yz8vPEc+d5FNxYdPbyYARCkpCQH4ZwnB5SbC8JJveAaAyZVPepRfkTAkV3nLPy88Rz5/kU3Fh09vJgBEKSkJAalsCcHlJsLwkm94BoDJeUtfkVd5yz8vPEc+d5FNxYdPbyYARCkpCQGqcQnB5SbC8JJveAaAyYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNyXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDcmDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDMlxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggzJxg+Hh+oawXovpl96obMiei+mX3qgszIkeRgAInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQW/8n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+qqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINnMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBCqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlUC4XIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7LCwly2XIJGjJycnJydE+t5LI4IXmB8RSRPCFHx8focjlzTJE4XkicCwicCwicCwicCwicCwicCwicCwicCzJ+ABUXWhHeZAfyx1nATNZCfCCMQCv/qAoAzEAvwH/AOlHPgeQVF1HDjOvyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxlHIbRXCeViaz7/AQ8Ayfoay2/6G8uFZ/4UIAU+/y0YBtbsIAU8LOoby3zqGsvNr2AhlEbNyhDwpMagV/Cjxn9f1SGXRs3KEPCkxqBn8KPGf2/RzTEcKAsf2hhZH9oYWcPERny6OAViV31rX+XNmkbh1Xu90sxFe9ZA4Ih9k0884Il6lF/ghjzgij2RMGvgh3nLPy88g+CF8IIBDwBvVHzWQBfLN6GFZ3rmBxdvGAjwij3KAETgivCJX/CGV/CFGASCHSgLy38g+Ffwh4LghR3NYkUY2nvgifCIg1/l5gf2CG8mB1Z7aB8fHx/LHR/LHeYDxkBnrx7/6XnghpPgh3vLPy88geCF8IIBDwBvVHzWQBfLN6GFZ3rmBxdv8Ilf8IZX8IXLfyAHV/CHgh0YAYLghc1iRfCKPcoAROCKGN171kDgiHuVTzzgiXqUX+CGPOCKPZEwa+CHecs/LzyD4IXwggEPAG9UfNZAF8s3oYVneuYHF28YCPCKPcoAROCK8Ilf8IZX8IUYBIIdKAvLfyD4V/CHguCFHc0qRhjae+CJ8IiTX+XmB/YQbyYHVntoHx8fH8sdH8sd5gPGQGc+/1jpeeCGk+CHe8s/LzyB4IXwggEPAG9UfNZAF8s3oYVneuYHF2/wiV/whlfwhct/IAdX8IeCHRgBguCFzSpG8Io9ygBE4IoY3UYAALoAAHzWQMhPHx8f5h9HeeYHKAsE/gUwBvUhylblBT4PkCHJRoRn5fCCZ69vyfCCZ69vIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIsnxAQ8APcqEVz0odj0oOj0idwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkid8kicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAloyfgAVF3wgjEAr/6gKAMxAL8B/wDFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcVia/nJJgJ+4JovPOCYfcZAb37gl+Cbr+CZ4JzgneCePkDgn8n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Aw==';
+
+// End of realtime.js file.
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-114-precomposed.png b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-114-precomposed.png
new file mode 100644
index 0000000..1cf1cbd
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-114-precomposed.png
Binary files differ
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-144-precomposed.png b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-144-precomposed.png
new file mode 100644
index 0000000..b791e90
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-144-precomposed.png
Binary files differ
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-57-precomposed.png b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-57-precomposed.png
new file mode 100644
index 0000000..af5458b
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-57-precomposed.png
Binary files differ
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-72-precomposed.png b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-72-precomposed.png
new file mode 100644
index 0000000..e5529b9
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/ico/apple-touch-icon-72-precomposed.png
Binary files differ
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/ico/favicon.ico b/suite/cts/deviceTests/browserbench/assets/octane/ico/favicon.ico
new file mode 100644
index 0000000..8a05c14
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/ico/favicon.ico
Binary files differ
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/index.html b/suite/cts/deviceTests/browserbench/assets/octane/index.html
new file mode 100644
index 0000000..228d1a9
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/index.html
@@ -0,0 +1,392 @@
+<!DOCTYPE html>
+<!-- Copyright 2012 the Octane project authors. Scroll to the end for full license -->
+<html lang="en">
+<head>
+<meta http-equiv="X-UA-Compatible" value="IE=edge"/>
+<meta charset="utf-8"/>
+<title>Octane JavaScript Benchmark</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta http-equiv="Content-Script-Type" content="text/javascript">
+<meta name="description"
+  content="Octane JavaScript Benchmark - the Javascript benchmark for the modern web">
+<meta name="author" content="Octane Team Google">
+<!-- twitter bootstrap code -->
+<script src="js/jquery.js"></script>
+<script src="js/bootstrap-transition.js"></script>
+<script src="js/bootstrap-collapse.js"></script>
+<!-- Octane benchmark code -->
+<!-- CTS -->
+<script type="text/javascript" src="cts_report.js"></script>
+<script type="text/javascript" src="base.js"></script>
+<script type="text/javascript" src="richards.js"></script>
+<script type="text/javascript" src="deltablue.js"></script>
+<script type="text/javascript" src="crypto.js"></script>
+<script type="text/javascript" src="raytrace.js"></script>
+<script type="text/javascript" src="earley-boyer.js"></script>
+<script type="text/javascript" src="regexp.js"></script>
+<script type="text/javascript" src="splay.js"></script>
+<script type="text/javascript" src="navier-stokes.js"></script>
+<script type="text/javascript" src="pdfjs.js"></script>
+<script type="text/javascript" src="mandreel.js"></script>
+<script type="text/javascript" src="gbemu.js"></script>
+<script type="text/javascript" src="code-load.js"></script>
+<script type="text/javascript" src="box2d.js"></script>
+
+<script type="text/javascript">
+  var completed = 0;
+  var benchmarks = BenchmarkSuite.CountBenchmarks();
+  var success = true;
+
+  function ShowBox(name) {
+    var box = document.getElementById("Box-" + name);
+    box.style.visibility = 'visible';
+    var bar = document.getElementById("progress-bar").style.width = ""
+        + ((++completed) / benchmarks) * 100 + "%";
+  }
+
+  function AddResult(name, result) {
+    //CTS
+    CtsReport(name, result, false);
+    var box = document.getElementById("Result-" + name);
+    box.innerHTML = result;
+  }
+
+  function AddError(name, error) {
+    console.log(error);
+    if (error == "TypedArrayUnsupported") {
+      AddResult(name, '<b>Unsupported<\/b>');
+    } else {
+      AddResult(name, '<b>Error</b>');
+    }
+    success = false;
+  }
+
+  function AddScore(score) {
+    var status = document.getElementById("main-banner");
+    if (success) {
+      status.innerHTML = "Octane Score: " + score;
+    } else {
+      status.innerHTML = "Octane Score (incomplete): " + score;
+    }
+    //CTS
+    CtsReport("Octane Score" + (success ? " " : "(incomplete)"), score, true);
+    document.getElementById("progress-bar-container").style.visibility = 'hidden';
+    document.getElementById("bottom-text").style.visibility = 'visible';
+    document.getElementById("inside-anchor").removeChild(document.getElementById("bar-appendix"));
+  }
+
+  function Run() {
+    document.getElementById("main-banner").innerHTML = "Running Octane...";
+    // append the progress bar elements..
+    document.getElementById("bar-appendix").innerHTML = "<br/><div class=\"progress progress-striped\" id=\"progress-bar-container\" style=\"visibility:hidden\"><div class=\"bar\"style=\"width: 0%;\" id=\"progress-bar\"></div></div>";
+    var anchor = document.getElementById("run-octane");
+    var parent = document.getElementById("main-container");
+    parent.appendChild(document.getElementById("inside-anchor"));
+    parent.removeChild(anchor);
+
+    document.getElementById("startup-text").innerHTML="";
+
+    document.getElementById("progress-bar-container").style.visibility = 'visible';
+
+    BenchmarkSuite.RunSuites({
+      NotifyStart : ShowBox,
+      NotifyError : AddError,
+      NotifyResult : AddResult,
+      NotifyScore : AddScore
+    });
+  }
+
+  function CheckCompatibility() {
+    // If no Typed Arrays support, show warning label.
+    var hasTypedArrays = typeof Uint8Array != "undefined"
+        && typeof Float64Array != "undefined"
+        && typeof (new Uint8Array(0)).subarray != "undefined";
+
+    if (!hasTypedArrays) {
+      console.log("Typed Arrays not supported");
+      document.getElementById("alertbox").style.display="block";
+    }
+    if (window.document.URL.indexOf('auto=1') >= 0)
+      Run();
+  }
+
+  function Load() {
+    setTimeout(CheckCompatibility, 200);
+  }
+</script>
+<!-- end Octane benchmark code -->
+
+<!-- Le styles -->
+<link href="css/bootstrap.css" rel="stylesheet">
+<style>
+body {
+  padding-top: 60px;
+  /* 60px to make the container go all the way to the bottom of the topbar */
+}
+</style>
+<link href="css/bootstrap-responsive.css" rel="stylesheet">
+
+<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+<!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+<![endif]-->
+
+<!-- Le fav and touch icons -->
+<!-- TODO update icons -->
+<link rel="shortcut icon" href="ico/favicon.ico">
+<link rel="apple-touch-icon-precomposed" sizes="144x144"
+  href="ico/apple-touch-icon-144-precomposed.png">
+<link rel="apple-touch-icon-precomposed" sizes="114x114"
+  href="ico/apple-touch-icon-114-precomposed.png">
+<link rel="apple-touch-icon-precomposed" sizes="72x72"
+  href="ico/apple-touch-icon-72-precomposed.png">
+<link rel="apple-touch-icon-precomposed"
+  href="ico/apple-touch-icon-57-precomposed.png">
+</head>
+
+<body onLoad="Load()">
+
+  <div class="navbar navbar-fixed-top">
+    <div class="navbar-inner">
+
+      <div class="container">
+
+        <a class="brand" href="#">Octane v1</a>
+       
+        <!--/.nav-collapse -->
+      </div>
+
+    </div>
+  </div>
+
+  <div class="container">
+    <div class="alert" style="display:none" id="alertbox">
+       <strong>Warning</strong> This JavaScript engine does not support Typed Arrays. You might want to run the <a href="http://v8.googlecode.com/svn/data/benchmarks/v7/run.html">V8 benchmark v7</a> instead.
+    </div>
+    <div id="main-container">
+    <a id="run-octane" href="javascript:Run()">
+      <div class="hero-unit" id="inside-anchor">
+        <h1 align="center" id="main-banner">Start Octane</h1>
+        <div id="bar-appendix"></div>
+      </div>
+    </a>
+    </div>
+
+    <div id="startup-text" style="color:white;" align="center">
+      Welcome to Octane, a JavaScript benchmark for the modern web. For more accurate results, <a href="http://developers.google.com/octane/benchmark">start the browser anew</a> before running the test. Refer to the <a href="http://developers.google.com/octane">documentation</a> for more information on Octane.
+    </div>
+
+    <div class="header"></div>
+
+    <div class="content">
+      <div class="row">
+        <div class="span3">
+          <!-- TODO STE change all links from staging to devsite -->
+          <div class="box" id="Box-Richards" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#richards"
+              target="_blank" style="float:left; color:#994520">Richards</a>
+   
+            <span class="p-result" id="Result-Richards" style="float:right">...</span>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Core
+              language features</span>
+          </div>
+
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-DeltaBlue" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#deltablue"
+              target="_blank" style="float:left; color:#994520">Deltablue</a>
+           
+            <p class="p-result" id="Result-DeltaBlue" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Core
+              language features</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-Crypto" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#crypto"
+              target="_blank" style="float:left; color:#994520">Crypto</a>
+           
+            <p class="p-result" id="Result-Crypto" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Bit &
+              Math operations</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-RayTrace" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#raytrace"
+              target="_blank" style="float:left; color:#994520">Raytrace</a>
+   
+            <p class="p-result" id="Result-RayTrace" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Core
+              language features</span>
+          </div>
+        </div>
+
+      </div>
+      <!-- /row -->
+
+      <div class="row">
+
+        <div class="span3">
+          <div class="box" id="Box-EarleyBoyer" style="visibility: hidden;">
+            <a
+              href="http://developers.google.com/octane/benchmark#earleyboyer"
+              target="_blank" style="float:left; color:#994520">EarleyBoyer</a>
+           
+            <p class="p-result" id="Result-EarleyBoyer" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Memory
+              & GC</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-RegExp" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#regexp"
+              target="_blank" style="float:left; color:#994520">Regexp</a>
+           
+            <p class="p-result" id="Result-RegExp" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Strings
+              & arrays</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-Splay" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#splay"
+              target="_blank" style="float:left; color:#994520">Splay</a>
+           
+            <p class="p-result" id="Result-Splay" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Memory
+              & GC</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-NavierStokes" style="visibility: hidden;">
+            <a
+              href="http://developers.google.com/octane/benchmark#navierstokes"
+              target="_blank" style="float:left; color:#994520">NavierStokes</a>
+           
+            <p class="p-result" id="Result-NavierStokes" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Strings
+              & arrays</span>
+          </div>
+        </div>
+
+      </div>
+      <!-- /row -->
+
+      <div class="row">
+        <div class="span3">
+          <div class="box" id="Box-PdfJS" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#pdfjs"
+              target="_blank" style="float:left; color:#994520">pdf.js</a>
+           
+            <p class="p-result" id="Result-PdfJS" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Strings
+              & arrays</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-Mandreel" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#mandreel"
+              target="_blank" style="float:left; color:#994520">Mandreel</a>
+           
+            <p class="p-result" id="Result-Mandreel" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Virtual
+              machine</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-Gameboy" style="visibility: hidden;">
+            <a
+              href="http://developers.google.com/octane/benchmark#gameboyemulator"
+              target="_blank" style="float:left; color:#994520">GB Emulator</a>
+           
+            <p class="p-result" id="Result-Gameboy" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Virtual
+              machine</span>
+          </div>
+        </div>
+        <div class="span3">
+          <div class="box" id="Box-CodeLoad" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#codeload"
+              target="_blank" style="float:left; color:#994520">CodeLoad</a>
+           
+            <p class="p-result" id="Result-CodeLoad" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Loading
+              & Parsing</span>
+          </div>
+        </div>
+
+      </div>
+      <!-- /row -->
+
+      <div class="row">
+        <div class="span3">
+          <div class="box" id="Box-Box2D" style="visibility: hidden;">
+            <a href="http://developers.google.com/octane/benchmark#box2d"
+              target="_blank" style="float:left; color:#994520">Box2DWeb</a>
+           
+            <p class="p-result" id="Result-Box2D" style="float:right">...</p>
+            <span class="label-simple"
+              style="position: absolute; bottom: 3px; left: 3px;">Bit &
+              Math operations</span>
+          </div>
+        </div>
+
+      </div>
+      <!-- /row -->
+
+    </div>
+    <!-- /content -->
+
+    <div id="bottom-text" style="color:white; visibility:hidden" align="center">
+      <br></br>
+       The final score is the <a href="http://en.wikipedia.org/wiki/Geometric_mean#Properties">geometric mean</a> of the single scores. We suggest to restart the browser before repeating the test.
+    </div>
+
+  </div>
+  <!-- /container -->
+
+</body>
+</html>
+
+<!--
+// Copyright 2012 the Octane project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-collapse.js b/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-collapse.js
new file mode 100644
index 0000000..fbc915b
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-collapse.js
@@ -0,0 +1,157 @@
+/* =============================================================
+ * bootstrap-collapse.js v2.0.4
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSIBLE PLUGIN DEFINITION
+  * ============================== */
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSIBLE DATA-API
+  * ==================== */
+
+  $(function () {
+    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
+      var $this = $(this), href
+        , target = $this.attr('data-target')
+          || e.preventDefault()
+          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+        , option = $(target).data('collapse') ? 'toggle' : $this.data()
+      $(target).collapse(option)
+    })
+  })
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-transition.js b/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-transition.js
new file mode 100644
index 0000000..5341826
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/js/bootstrap-transition.js
@@ -0,0 +1,61 @@
+/* ===================================================
+ * bootstrap-transition.js v2.0.4
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  $(function () {
+
+    "use strict"; // jshint ;_;
+
+
+    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+     * ======================================================= */
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd'
+            ,  'msTransition'     : 'MSTransitionEnd'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/js/jquery.js b/suite/cts/deviceTests/browserbench/assets/octane/js/jquery.js
new file mode 100644
index 0000000..00c4e23
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/js/jquery.js
@@ -0,0 +1,9252 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.1",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!memory;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( window.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.style.width = "2px";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = marginDiv = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			conMarginTop, ptlm, vb, style, html,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";
+		vb = "visibility:hidden;border:0;";
+		style = "style='" + ptlm + "border:5px solid #000;padding:0;'";
+		html = "<div " + style + "><div></div></div>" +
+			"<table " + style + " cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Figure out if the W3C box model works as expected
+		div.innerHTML = "";
+		div.style.width = div.style.paddingLeft = "1px";
+		jQuery.boxModel = support.boxModel = div.offsetWidth === 2;
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "";
+			div.innerHTML = "<div style='width:4px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+		}
+
+		div.style.cssText = ptlm + vb;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		body.removeChild( container );
+		div  = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, attr, name,
+			data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+					attr = this[0].attributes;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+					jQuery._data( this[0], "parsedAttrs", true );
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var self = jQuery( this ),
+					args = [ parts[0], value ];
+
+				self.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					jQuery.attr( elem, name, "" );
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( rboolean.test( name ) && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /\bhover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+				selMatch = {};
+				matches = [];
+				jqcur[0] = cur;
+				for ( i = 0; i < delegateCount; i++ ) {
+					handleObj = handlers[ i ];
+					sel = handleObj.selector;
+
+					if ( selMatch[ sel ] === undefined ) {
+						selMatch[ sel ] = (
+							handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+						);
+					}
+					if ( selMatch[ sel ] ) {
+						matches.push( handleObj );
+					}
+				}
+				if ( matches.length ) {
+					handlerQueue.push({ elem: cur, matches: matches });
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						// If form was submitted by the user, bubble the event up the tree
+						if ( this.parentNode && !event.isTrigger ) {
+							jQuery.event.simulate( "submit", this.parentNode, event, true );
+						}
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) {
+				// ( types-Object, data )
+				data = selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on.call( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2012, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+
+		var cur = a.nextSibling;
+		}
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || !rnoshimcache.test( "<" + elem.nodeName ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret === null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight,
+		i = 0,
+		len = which.length;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i++ ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i++ ) {
+			val += parseFloat( jQuery.css( elem, "padding" + which[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + which[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+	jQuery.fx.step[ prop ] = function( fx ) {
+		jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+	};
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNumeric( ret ) ? ret : orig;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/mandreel.js b/suite/cts/deviceTests/browserbench/assets/octane/mandreel.js
new file mode 100644
index 0000000..b5f3d05
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/mandreel.js
@@ -0,0 +1,277377 @@
+// Portions copyright 2012 Google, Inc.
+// Copyright 2012 Onan Games. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+var MandreelBenchmark = new BenchmarkSuite('Mandreel', 14000000,
+                                            [new Benchmark('Mandreel',
+                                                           runMandreel,
+                                                           setupMandreel,
+                                                           tearDownMandreel,
+                                                           4)]);
+
+function setupMandreel() {
+
+  // Check for Typed Arrays support, throw error if not.
+  if (!(typeof Uint8Array != "undefined" &&
+    typeof Float64Array != "undefined" &&
+    typeof (new Uint8Array(0)).subarray != "undefined")) {
+      throw "TypedArrayUnsupported";
+  }
+
+  my_old_constructors = mandreel_call_constructors;
+  mandreel_call_constructors = my_mandreel_call_constructors;
+  startApp();
+  _mandreelAppAudioReady();
+}
+
+function runMandreel() {
+  Mandreel_currentTime = 0;
+  var sp = g_stack_pointer+800*1024;
+  for (var i=0;i<mandreel_total_memory/4;i++) {
+    heap32[i] = my_heap32[i];
+  }
+  tlsf_ptr = 0;
+  heapNewPos = my_heapNewPos;
+  my_old_constructors(llvm_2E_global_ctors,5,sp);
+  heapU32[sp>>2] = 640;
+  heapU32[(sp+4)>>2] = 480;
+  __mandreel_internal_SetResolution(sp);
+  __mandreel_internal_init(g_stack_pointer+800*1024);
+  __init(g_stack_pointer+800*1024);
+  for (var i = 0; i < 20; i++) {
+    render();
+    Mandreel_flushTimeouts();
+  }
+  Mandreel_checkState();
+}
+
+function tearDownMandreel() {
+  my_old_constructors = null;
+  my_heap = null;
+  my_heap8 = null;
+  my_heap32 = null;
+
+  heap = null;
+  heap8 = null;
+  heapU8 = null;
+  heap16 = null;
+  heapU16 = null;
+  heap32 = null;
+  heapU32 = null;
+  heapFloat = null;
+  heapDouble = null;
+  mandreelAppUsePackAsyncTexture = null;
+}
+
+// Mocks for browser functions.
+
+function Mandreel_setTimeout(cmd, delay) {
+  timeouts.push(cmd);
+}
+
+function Mandreel_flushTimeouts() {
+  while (Mandreel_timeouts.length != 0) {
+    var next = Mandreel_timeouts.pop();
+    eval(next);
+  }
+}
+
+Mandreel_timeouts = new Array();
+
+Mandreel_XMLHttpRequest = function() {
+  this.open = function(type, url, some_bool) {
+    this.url = url;
+  }
+  this.overrideMimeType = function() {
+  }
+  this.send = function() {
+    this.response = null;
+    this.readyState = 4;
+    this.status = 0;
+    this.onreadystatechange();
+  }
+};
+
+function Mandreel_Element(type) {
+  this.element_type = type;
+  this.insertBefore = function() {
+  }
+}
+
+
+function Mandreel_Context() {
+}
+
+function Mandreel_Canvas() {
+}
+
+function Mandreel_CanvasDiv() {
+}
+
+Mandreel_document = {
+  createElement : function(element_type) {
+    var element = new Mandreel_Element(element_type);
+    element.parentNode = new Mandreel_Element("dummy_parent");
+    return element;
+  },
+  getElementById : function(name) {
+    if (name === "canvas") {
+      return new Mandreel_Canvas();
+    } else if (name === "canvasDiv") {
+      return new Mandreel_CanvasDiv();
+    } else {
+      return undefined;
+    }
+  },
+  getElementsByTagName : function(element) {
+    if (element === "script") {
+      return new Array(new this.createElement(element));
+    }
+  }
+
+};
+
+Mandreel_window = {
+  WebGLRenderingContext: {},
+  Float64Array: Float64Array,
+  Float32Array: Float32Array,
+  Int32Array: Int32Array,
+  Uint32Array: Uint32Array,
+  Int16Array: Int16Array,
+  Uint16Array: Uint16Array,
+  Int8Array: Int8Array,
+  Uint8Array: Uint8Array,
+  setTimeout: Mandreel_setTimeout,
+  addEventListener : function () {},
+  document: Mandreel_document
+};
+
+function dump(x) { }
+
+alert = typeof alert != "undefined" ? alert : function(x) {
+  print(x);
+}
+
+var my_old_constructors;
+var my_heap;
+var my_heap8;
+var my_heap32;
+var my_heapNewPos;
+
+function my_mandreel_call_constructors(_ptr, size,stackPos) {
+  my_heapNewPos = heapNewPos;
+  my_heap = new ArrayBuffer(mandreel_total_memory);
+  my_heap8 = new Int8Array(my_heap);
+  my_heap32 = new Int32Array(my_heap);
+  for (var i=0;i<mandreel_total_memory/4;i++) {
+    my_heap32[i] = heap32[i];
+  }
+  my_old_constructors(_ptr,size,stackPos);
+}
+
+
+var Mandreel_currentTime = 0;
+
+function Date_now() {
+   Mandreel_currentTime += 16;
+   return Mandreel_currentTime;
+}
+
+function Mandreel_checkState() {
+  var sum = 0;
+  for (var i = 0; i < heap32.length; i += 100) {
+    sum = (sum * 3 + heap32[i]) & 0xFFFFFF;
+  }
+  if (sum != 8001026) {
+    alert("Check sum mismatch: expected ???, actual " + sum);
+  }
+}
+
+// Original Mandreel code follows.
+// Modifications for benchmarking are marked in comments.
+
+// Start of js/main.js file:
+
+////////////////////////////////////////////
+function startApp(_platform)
+{
+	// Start mandreel
+	var params =
+	{
+		platform : _platform,
+		width : 1024,
+		height : 768,
+		webglCanvas : "canvas",
+		flashCanvas : "FlashDiv",
+		workingFolderFlash : "data/as3/",
+		workingFolderWebgl : "data/js/",
+		swfFlash : "mandreel.swf",
+		log : true
+	};
+	mandreelAppStart(appStartState,params);
+}
+
+////////////////////////////////////////////
+function appStartState(state,param)
+{
+	// mandreel.js program is been loaded
+	if ( state == "loadingScript" )
+	{
+	}
+
+	// mandreel.js program has been loaded
+	if ( state == "scriptLoaded" )
+	{
+	}
+
+	// loading pack data file
+	if (state == "loadingData")
+	{
+		// param bytes loaded
+	}
+
+	// Audio system is been started
+	if ( state == "loadingAudio" )
+	{
+	}
+
+	// Audio system is ready and the default audio preloading has been done
+	if ( state == "audioLoaded" )
+	{
+	}
+
+
+
+	// Mandreel has been started, render will start automatically
+	if ( state == "ready" )
+	{
+		// Hide loading image
+		var canvasElement = Mandreel_document.getElementById('loading');
+		if ( canvasElement != null )
+			canvasElement.style.visibility = "hidden";
+	}
+
+	// An error has been produced during the start process and the app must quit
+	if ( state == "error" )
+	{
+		if ( param == "webgl_not_found" )
+		{
+			window.location = "http://get.webgl.org";
+			return;
+		}
+		alert(param);
+	}
+}
+
+// End of js/main.js file.
+
+// Start of js/mandreelapp.js file.
+
+var mandreelAppMandreelJs = "mandreel.js";
+var mandreelAppMandreelJsCompressed = false;
+var mandreelAppWorkingFolder = "data/js/";
+var mandreelAppLog = false;
+var mandreelAppLocalHost = "http://localhost";
+var mandreelAppReadDataFromLocalHost = false;
+var mandreelAppReadMandreelJsFromLocalHost = false;
+var mandreelAppHostedAudioServer = null;
+var mandreelAppHostedAudioUrl = null;
+var mandrelCurrentFatVersion = "1.4";
+var mandreelAppPlatform = "webgl";
+var mandreelAppCanvasWidth = 1024;
+var mandreelAppCanvasHeight = 768;
+var mandreelAppWidthSrc = 1024;
+var mandreelAppHeightSrc = 768;
+var mandreelAppCanvasName = "canvas";
+var mandreelAppCanvasDiv = "canvasDiv";
+var mandreelAppUseFlashSockets = false;
+var mandreelAppUsePackAsyncTexture = new Array();
+//var mandreelBufferPackAsyncTexture = null;
+var mandreelAppForceFocus = true;
+var _imandreel_pause_game = false;
+
+/* The following code was removed for benchmarking:
+navigator.pointer = navigator.pointer || navigator.webkitPointer || navigator.mozPointer || null;*/
+
+/* The following code was removed for benchmarking:
+ if (!Date_now) {
+   Date_now = function() {
+     return +new Date();
+   };
+ };*/
+
+////////////////////////////////////////////
+
+if (Mandreel_window["console"])
+{
+	if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ if ( mandreelAppLog ) console.log(str) };
+}
+else
+{
+	if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ };
+}
+
+/* The following code is removed for benchmarking:
+var mandreel_BrowserDetect = {
+	init: function () {
+		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
+		this.version = this.searchVersion(navigator.userAgent)
+			|| this.searchVersion(navigator.appVersion)
+			|| "an unknown version";
+		this.OS = this.searchString(this.dataOS) || "an unknown OS";
+	},
+	searchString: function (data) {
+		for (var i=0;i<data.length;i++)	{
+			var dataString = data[i].string;
+			var dataProp = data[i].prop;
+			this.versionSearchString = data[i].versionSearch || data[i].identity;
+			if (dataString) {
+				if (dataString.indexOf(data[i].subString) != -1)
+					return data[i].identity;
+			}
+			else if (dataProp)
+				return data[i].identity;
+		}
+	},
+	searchVersion: function (dataString) {
+		var index = dataString.indexOf(this.versionSearchString);
+		if (index == -1) return;
+		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
+	},
+	dataBrowser: [
+		{
+			string: navigator.userAgent,
+			subString: "Chrome",
+			identity: "Chrome"
+		},
+		{ 	string: navigator.userAgent,
+			subString: "OmniWeb",
+			versionSearch: "OmniWeb/",
+			identity: "OmniWeb"
+		},
+		{
+			string: navigator.vendor,
+			subString: "Apple",
+			identity: "Safari",
+			versionSearch: "Version"
+		},
+		{
+			prop: window.opera,
+			identity: "Opera",
+			versionSearch: "Version"
+		},
+		{
+			string: navigator.vendor,
+			subString: "iCab",
+			identity: "iCab"
+		},
+		{
+			string: navigator.vendor,
+			subString: "KDE",
+			identity: "Konqueror"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "Firefox",
+			identity: "Firefox"
+		},
+		{
+			string: navigator.vendor,
+			subString: "Camino",
+			identity: "Camino"
+		},
+		{		// for newer Netscapes (6+)
+			string: navigator.userAgent,
+			subString: "Netscape",
+			identity: "Netscape"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "MSIE",
+			identity: "Explorer",
+			versionSearch: "MSIE"
+		},
+		{
+			string: navigator.userAgent,
+			subString: "Gecko",
+			identity: "Mozilla",
+			versionSearch: "rv"
+		},
+		{ 		// for older Netscapes (4-)
+			string: navigator.userAgent,
+			subString: "Mozilla",
+			identity: "Netscape",
+			versionSearch: "Mozilla"
+		}
+	],
+	dataOS : [
+		{
+			string: navigator.platform,
+			subString: "Win",
+			identity: "Windows"
+		},
+		{
+			string: navigator.platform,
+			subString: "Mac",
+			identity: "Mac"
+		},
+		{
+			   string: navigator.userAgent,
+			   subString: "iPhone",
+			   identity: "iPhone/iPod"
+	    },
+		{
+			string: navigator.platform,
+			subString: "Linux",
+			identity: "Linux"
+		}
+	]
+
+};
+mandreel_BrowserDetect.init(); */
+
+////////////////////////////////////////////
+var mandreel_packfiledata_name = null;
+var mandreel_packfiledata_compressed = false;
+var mandreel_packfiledata_size = 0;
+var mandreel_total_packtexture_size = 0;
+var mandreel_total_pogfile_size = 0;
+var mandreel_loaded_packtexture_size = 0;
+var mandreel_jslzma_size = 0;
+var mandreel_swf_size = 0;
+
+var mandreelJsScriptLoaded_loaded = false;
+
+var mandreel_swf_last_total_size = 0;
+function mandreel_swf_size_updated(str)
+{
+	var params = str.split(',');
+	if ( mandreel_swf_size == 0 )
+	{
+		mandreel_swf_last_loaded_size = 0;
+	}
+	mandreel_swf_size = parseInt(params[0]);
+	var loaded = parseInt(params[1]);
+	var delta_size = loaded - mandreel_swf_last_loaded_size;
+	mandreel_swf_last_loaded_size = loaded;
+
+	var percentage = ((100*loaded)/mandreel_swf_size)|0;
+	if (percentage>100)
+		percentage = 100;
+
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
+
+	imandreel_update_load(delta_size,0);
+}
+
+function mandreel_swf_size_loaded(str)
+{
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("scriptLoaded","");
+}
+
+function mandreelNextDecompress(mandreel_result_lzma)
+{
+
+	if ( mandreelAppStartStateFunc )
+	{
+		var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
+
+		var percentage;
+
+		if (totalBytesLeft == 0)
+			percentage = 0;
+		else
+			percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
+
+		mandreelAppStartStateFunc("uncompressingDataUpdate",percentage);
+	}
+
+	var old_result = mandreel_result_lzma;
+	mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
+
+	if (mandreel_result_lzma == null)
+	{
+		//setTimeout(mandreelLoadScript,10,old_result.my_outStream.data);
+
+		//mandreel_fs_saveFile('data.bin', old_result.my_outStream.arrayBuffer);
+		//callback(old_result.my_outStream.arrayBuffer);
+		//alert('done');
+		mandreelLoadPackData(old_result.my_outStream.arrayBuffer,true);
+	}
+	else
+	{
+		Mandreel_setTimeout(mandreelNextDecompress,10,mandreel_result_lzma);
+	}
+
+
+}
+
+function mandreel_load_packfile(array_buffer)
+{
+	if (array_buffer)
+	{
+		mandreelLoadPackData(array_buffer,false);
+		return;
+	}
+
+	var working_folder = mandreelAppWorkingFolder;
+	if ( mandreelAppReadDataFromLocalHost )
+		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
+	var packdata_request = new XMLHttpRequest();
+	var url = working_folder+mandreel_packfiledata_name;
+
+	packdata_request.open("GET", url, true);
+
+	if("responseType" in packdata_request)
+		packdata_request.responseType="arraybuffer";
+	else
+		packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
+
+	var last_loaded_size = 0;
+
+	packdata_request.onreadystatechange = function()
+	{
+		if (packdata_request.readyState != 4) return;
+
+		if (packdata_request.status == 200)
+		{
+			var buffer;
+			if (packdata_request.responseType=="arraybuffer")
+				buffer=packdata_request.response;
+			else if (packdata_request.mozResponseArrayBuffer != null)
+				buffer = packdata_request.mozResponseArrayBuffer;
+			else
+				buffer=packdata_request.response;
+
+			if (mandreel_packfiledata_compressed)
+			{
+				var inStream = {
+				  data: new Uint8Array(buffer),
+				  offset: 0,
+				  readByte: function(){
+					return this.data[this.offset ++];
+				  }
+				};
+
+				var outStream = {
+				  data: null,
+				  offset: 0,
+				  binary_mode : true,
+				  writeByte: function(value){
+					this.data[this.offset ++] = value;
+				  }
+				};
+
+
+				var result = LZMA.decompress2(inStream,inStream,outStream,null);
+
+				if (result == null)
+					mandreelLoadPackData(outStream.arrayBuffer,true);
+				else
+					Mandreel_setTimeout(mandreelNextDecompress,10,result);
+			}
+			else
+				mandreelLoadPackData(buffer,true);
+		}
+		else
+		{
+			if ( mandreelAppStartStateFunc )
+				mandreelAppStartStateFunc("error","can't load packfile data");
+		}
+	}
+	packdata_request.onprogress = function(e)
+	{
+		var delta_size = e.loaded - last_loaded_size;
+		last_loaded_size = e.loaded;
+		var percentage = ((100*e.loaded)/mandreel_packfiledata_size)|0;
+
+
+		imandreel_update_load(delta_size,0);
+
+		if (percentage>100)
+			percentage = 100;
+
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingData",percentage);
+	}
+
+	packdata_request.send();
+}
+
+function mandreelJsScriptLoaded()
+{
+	if (mandreelJsScriptLoaded_loaded)
+		return;
+
+	if (typeof(mandreel_cache_files)=="undefined")
+	{
+		Mandreel_setTimeout(mandreelJsScriptLoaded,10);
+		return;
+	}
+
+	mandreelJsScriptLoaded_loaded = true;
+
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("scriptLoaded","");
+
+	if (mandreel_packfiledata_name)
+	{
+
+		mandreel_fs_load_binary(mandreel_packfiledata_name, mandreel_load_packfile);
+
+
+	}
+	else
+	{
+		mandreelCacheMandreelFat();
+		imandreelJsScriptLoaded();
+	}
+}
+
+function imandreelLoadAudio()
+{
+	g_mandreel_working_folder = mandreelAppWorkingFolder;
+	if ( mandreelAppReadDataFromLocalHost )
+		g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
+
+	// load audio
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("loadingAudio","");
+	mandreel_start_audio(mandreelAppHostedAudioServer,mandreelAppHostedAudioUrl,_mandreelAppAudioReady);
+}
+
+var _mandreel_currentPackTexture = '';
+
+function imandreel_packasynctexture_loaded(buffer,save_file)
+{
+	if (save_file)
+		mandreel_fs_saveFile(_mandreel_currentPackTexture,buffer);
+
+	//mandreelBufferPackAsyncTexture = buffer;
+	Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = buffer;
+
+	imandreelLoadNextTexturePack();
+}
+
+var mandreel_update_total_size = 0;
+
+function imandreel_update_load(size, total)
+{
+	if (total == 0)
+		total = mandreel_packfiledata_size + mandreel_total_packtexture_size + mandreel_total_pogfile_size + mandreel_jslzma_size + mandreel_swf_size;
+
+
+	mandreel_update_total_size+=size;
+
+	var percentage = ((100*mandreel_update_total_size)/total)|0;
+
+	if (percentage>100)
+		percentage = 100;
+	if (mandreelAppStartStateFunc)
+		mandreelAppStartStateFunc("loadingProgress",percentage);
+
+}
+
+
+function imandreel_packasynctexture_load(array_buffer)
+{
+	if (array_buffer)
+	{
+		imandreel_packasynctexture_loaded(array_buffer, false);
+		return;
+	}
+
+
+	var working_folder = mandreelAppWorkingFolder;
+	if ( mandreelAppReadDataFromLocalHost )
+		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
+	var packdata_request = new XMLHttpRequest();
+	var url = working_folder+_mandreel_currentPackTexture;
+
+	packdata_request.open("GET", url, true);
+
+	if("responseType" in packdata_request)
+		packdata_request.responseType="arraybuffer";
+	else
+		packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
+
+	var last_loaded_size = 0;
+
+	packdata_request.onreadystatechange = function()
+	{
+		if (packdata_request.readyState != 4) return;
+
+		if (packdata_request.status == 200)
+		{
+			var buffer;
+			if (packdata_request.responseType=="arraybuffer")
+				buffer=packdata_request.response;
+			else if (packdata_request.mozResponseArrayBuffer != null)
+				buffer = packdata_request.mozResponseArrayBuffer;
+			else
+				buffer=packdata_request.response;
+
+			imandreel_packasynctexture_loaded(buffer, true);
+		}
+		else
+		{
+			if ( mandreelAppStartStateFunc )
+				mandreelAppStartStateFunc("error","can't load textureasync pack data");
+		}
+	}
+	packdata_request.onprogress = function(e)
+	{
+		var delta_size = e.loaded - last_loaded_size;
+		last_loaded_size = e.loaded;
+		mandreel_loaded_packtexture_size+=delta_size;
+
+		imandreel_update_load(delta_size,0);
+
+		var percentage = ((100*mandreel_loaded_packtexture_size)/mandreel_total_packtexture_size)|0;
+
+		if (percentage>100)
+			percentage = 100;
+
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
+	}
+
+	packdata_request.send();
+
+}
+
+function imandreelLoadNextTexturePack()
+{
+	if (mandreelAppUsePackAsyncTexture.length)
+	{
+		_mandreel_currentPackTexture = mandreelAppUsePackAsyncTexture.pop();
+		mandreel_fs_load_binary(_mandreel_currentPackTexture, imandreel_packasynctexture_load);
+	}
+	else
+		imandreelLoadAudio();
+}
+
+function imandreelJsScriptLoaded()
+{
+	imandreelLoadNextTexturePack();
+}
+
+////////////////////////////////////////////
+
+function mandreelDecompressJSReady(code, save_file)
+{
+	if (save_file)
+		mandreel_fs_saveFile(mandreelAppMandreelJs + ".lzma", code);
+
+	var ga = Mandreel_document.createElement('script');
+	ga.type = "text/javascript";
+	ga.text = code;
+	var s = Mandreel_document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+	s.parentNode.removeChild(ga);
+	mandreelJsScriptLoaded();
+}
+
+function mandreelNextDecompressJS(mandreel_result_lzma)
+{
+
+	if ( mandreelAppStartStateFunc )
+	{
+		var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
+
+		var percentage;
+
+		if (totalBytesLeft == 0)
+			percentage = 0;
+		else
+			percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
+
+		mandreelAppStartStateFunc("uncompressingScriptUpdate",percentage);
+	}
+
+	var old_result = mandreel_result_lzma;
+	mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
+
+	if (mandreel_result_lzma == null)
+	{
+		mandreelDecompressJSReady(old_result.my_outStream.data,true);
+	}
+	else
+	{
+		Mandreel_setTimeout(mandreelNextDecompressJS,10,mandreel_result_lzma);
+	}
+
+
+}
+
+function mandreel_load_compressed_js(code_js)
+{
+	if (code_js)
+	{
+		mandreelDecompressJSReady(code_js,false);
+		return;
+	}
+	 var xmlhttp_get = new XMLHttpRequest();
+
+	 var url = mandreelAppMandreelJs + ".lzma";
+	 if ( mandreelAppReadMandreelJsFromLocalHost )
+		url = mandreelAppLocalHost+"/"+url;
+
+	 xmlhttp_get.open('GET',url);
+
+
+	if("responseType" in xmlhttp_get)
+		xmlhttp_get.responseType="arraybuffer";
+	else
+		xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');
+
+	var last_loaded_size = 0;
+
+	xmlhttp_get.onreadystatechange = function()
+	{
+		if (xmlhttp_get.readyState==4)
+		{
+			if (xmlhttp_get.status==200 || xmlhttp_get.status==0)
+			{
+
+				var inStream = {
+				  data: new Uint8Array(xmlhttp_get.response),
+				  offset: 0,
+				  readByte: function(){
+					return this.data[this.offset ++];
+				  }
+				};
+
+				var outStream = {
+				  data: new String(""),
+				  offset: 0,
+				  binary_mode : false,
+				  writeByte: function(value){
+					this.data+=String.fromCharCode(value);
+				  }
+				};
+
+
+				var result = LZMA.decompress2(inStream,inStream,outStream,null);
+				if (result == null)
+					mandreelDecompressJSReady(outStream.data,true);
+				else
+					Mandreel_setTimeout(mandreelNextDecompressJS,10,result);
+			}
+			else
+			{
+				alert('error ' + xmlhttp_get.status);
+			}
+		}
+
+	}
+
+	xmlhttp_get.onprogress = function(e)
+	{
+		var delta_size = e.loaded - last_loaded_size;
+		last_loaded_size = e.loaded;
+
+		var percentage = ((100*e.loaded)/e.total)|0;
+
+		mandreel_jslzma_size = e.total;
+
+		imandreel_update_load(delta_size,0);
+
+		if (percentage>100)
+			percentage = 100;
+
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
+	}
+
+	xmlhttp_get.send();
+
+}
+
+function mandreelLoadMandreelJsScript()
+{
+	if (mandreelAppMandreelJsCompressed)
+	{
+		mandreel_fs_load_text(mandreelAppMandreelJs + ".lzma", mandreel_load_compressed_js);
+
+	}
+	else
+	{
+		var ga = Mandreel_document.createElement('script');
+		ga.type = 'text/javascript';
+		ga.async = true;
+		ga.onload = ga.onreadystatechange = mandreelJsScriptLoaded;
+		var url = mandreelAppMandreelJs;
+		if ( mandreelAppReadMandreelJsFromLocalHost )
+			ga.src = mandreelAppLocalHost+"/"+url;
+		else
+			ga.src = url;
+		var s = Mandreel_document.getElementsByTagName('script')[0];
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingScript","");
+		s.parentNode.insertBefore(ga, s);
+	}
+}
+
+////////////////////////////////////////////
+function mandreelFatLoaded()
+{
+	if ( mandreelAppPlatform == "nacl" )
+	{
+		g_mandreel_working_folder = mandreelAppWorkingFolder;
+		if ( mandreelAppReadDataFromLocalHost )
+			g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
+
+		// load audio
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingAudio","");
+		_mandreelAppAudioReady();
+	}
+	else
+		mandreelLoadMandreelJsScript();
+}
+
+var mandreelFatData = "";
+var mandreelFatPreloadRequest = 0;
+////////////////////////////////////////////
+
+function mandreel_chanka_fixfile(fileName)
+{
+	var fileNameNoExt = fileName.toLowerCase();
+	fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");
+
+	fileNameNoExt =  fileNameNoExt.substr(1);
+
+	var new_fileName = '';
+
+	for(var j = 0; j < fileNameNoExt.length; j++)
+	{
+		var data = fileNameNoExt.charCodeAt(j);
+
+		if (data != 13)
+		{
+			 var t = String.fromCharCode(data);
+			 new_fileName+=t;
+		}
+	}
+
+	return 	new_fileName;
+}
+
+function mandreel_removecr(my_string)
+{
+	var new_string = '';
+	for(var j = 0; j < my_string.length; j++)
+	{
+		var data = my_string.charCodeAt(j);
+
+		if (data != 13)
+		{
+			 var t = String.fromCharCode(data);
+			 new_string+=t;
+		}
+	}
+
+	return 	new_string;
+}
+
+function mandreelCacheMandreelFat()
+{
+	var array_mandreel_fat = new ArrayBuffer(mandreelFatData.length+1);
+
+
+	{
+		var j;
+		var len = mandreelFatData.length;
+		var data_char;
+
+		var my_bytes = new Uint8Array(array_mandreel_fat);
+
+		for(j = 0; j < len; j++)
+		{
+			data_char = mandreelFatData.charCodeAt(j);
+
+			my_bytes[j] = data_char;
+		}
+		my_bytes[j] = 0;
+	}
+
+
+	mandreel_cache_files['mandreel.fat'] = array_mandreel_fat;
+}
+
+function mandreelLoadPackData(data, save_pack)
+{
+	var files = mandreelFatData.split('\n');
+
+	var current_dir = '';
+	var current_offset = 0;
+
+	if (save_pack)
+		mandreel_fs_saveFile(mandreel_packfiledata_name,data);
+
+
+	for (var i=0;i<files.length;++i)
+	{
+		var file_data = files[i].split(',');
+
+		if (file_data[0] == 'dir')
+		{
+			current_dir = file_data[1];
+			//current_dir = current_dir.substr(0,current_dir.lengh-1);
+		}
+		else if (file_data[0] == 'file')
+		{
+			var file_name = current_dir + file_data[1];
+			file_name = mandreel_chanka_fixfile(file_name) ;
+			//dump('new file ' + file_name + ' ' + current_offset);
+			//dump(file_name);
+			var file_size = parseInt(file_data[2]);
+
+			var my_array = new ArrayBuffer(file_size);
+
+			var my_bytes = new Uint8Array(my_array);
+
+			var data_bytes = new Uint8Array(data,current_offset,file_size);
+
+			my_bytes.set(data_bytes);
+
+			mandreel_cache_files[file_name] = my_array;
+
+
+			current_offset+=file_size;
+
+
+		}
+	}
+
+
+
+	g_mandreel_datafiles_sufix = '';
+	mandreelCacheMandreelFat();
+
+	imandreelJsScriptLoaded();
+}
+
+var preCreatedWebAudioContext = null;
+
+function mandreelLoadFat()
+{
+	mandreelFatPreloadRequest = new Mandreel_XMLHttpRequest();
+	var working_folder = mandreelAppWorkingFolder;
+	if ( mandreelAppReadDataFromLocalHost )
+		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
+	var url = working_folder+"mandreel.fat.dat";
+	if ( mandreelAppPlatform == "nacl" )
+		url = working_folder+"mandreel.fat";
+	mandreelFatPreloadRequest.open("GET", url, true);
+	mandreelFatPreloadRequest.onreadystatechange = function()
+	{
+		if (mandreelFatPreloadRequest.readyState != 4) return;
+		if ( mandreelFatPreloadRequest.status != 404 && mandreelFatPreloadRequest.response != null )
+		{
+			mandreelFatData = mandreelFatPreloadRequest.response;
+		}
+		if ( mandreelFatData == "" )
+		{
+			dump("error loading mandreel.fat file, Maybe the working folder is not correctly set???");
+		}
+
+		var packfiledata = null;
+		var compressed = false;
+		var packfiledata_size = 0;
+		var total_packtexture_size = 0;
+		var pogsize = 0;
+
+		// Check version
+		var FatLines = mandreelFatData.split('\n');
+		for ( var i=0;i<FatLines.length;++i )
+		{
+			var line = mandreel_removecr(FatLines[i]);
+			var params = line.split(',');
+			if ( params[0] == "version" )
+			{
+				if ( params[1] != mandrelCurrentFatVersion )
+					dump("warning: mandreel.fat version number is ("+params[1]+") and it should be ("+mandrelCurrentFatVersion+")");
+
+			}
+			else if ( params[0] == "platform" && params[1] != "js" && (mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas")  )
+				dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (js)");
+			else if ( params[0] == "platform" && params[1] != "nacl" && mandreelAppPlatform == "nacl"  )
+				dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (nacl)");
+			else if (params[0] == 'packdata')
+			{
+				packfiledata = params[1];
+				compressed = params[2].charAt(0) == '1';
+				packfiledata_size =  parseInt(params[3], 10);
+			}
+			else if (params[0] == 'flashsockets')
+			{
+				mandreelAppUseFlashSockets = true;
+			}
+			else if (params[0] == 'packtexture')
+			{
+				var filename = params[1];
+				var size_packtexture = parseInt(params[3], 10);
+				total_packtexture_size+=size_packtexture;
+				mandreelAppUsePackAsyncTexture.push(filename);
+			}
+			else if (params[0] == 'audiopreloadfile')
+			{
+				pogsize = parseInt(params[2],10);
+			}
+			else if (params[0] == 'audiodriver' && params[1] == 'webaudio')
+			{
+				try	{ preCreatedWebAudioContext = new webkitAudioContext(); } catch(err) { preCreatedWebAudioContext = null; }
+			}
+		}
+
+		if ( preCreatedWebAudioContext != null )
+			mandreel_total_pogfile_size = pogsize;
+		mandreel_packfiledata_name = packfiledata;
+		mandreel_packfiledata_compressed = compressed;
+		mandreel_packfiledata_size = packfiledata_size;
+		mandreel_total_packtexture_size = total_packtexture_size;
+		mandreelFatLoaded();
+	}
+	mandreelFatPreloadRequest.send();
+}
+
+var mandreelAppStartStateFunc = 0;
+var mandreelDisableSpaceKey = true;
+////////////////////////////////////////////
+function mandreelAppStart(startStateFunc,params)
+{
+	mandreelAppStartStateFunc = startStateFunc;
+
+
+
+
+	if ( typeof(params.log) != 'undefined' )
+		mandreelAppLog = params.log;
+
+	if ( typeof(params.platform) != 'undefined' )
+		mandreelAppPlatform = params.platform;
+
+	if (typeof(params.mandreelJSCompressed) != 'undefined' )
+		mandreelAppMandreelJsCompressed = params.mandreelJSCompressed;
+
+
+/*	 The following code is removed for benchmarking:
+	if ((mandreel_BrowserDetect.browser == 'Chrome' || mandreel_BrowserDetect.browser == 'Safari') && mandreel_BrowserDetect.OS == 'Mac' && mandreelAppPlatform == "flash")
+		mandreelDisableSpaceKey = false; */
+
+	if ( mandreelAppPlatform != "webgl" && mandreelAppPlatform != "flash" && mandreelAppPlatform != "nacl" && mandreelAppPlatform != "canvas" && mandreelAppPlatform != "plugin")
+	{
+		mandreelAppStartStateFunc("error",'platform ('+mandreelAppPlatform+') not supported');
+		return;
+	}
+
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		mandreelAppWorkingFolder = "data/js/";
+		if ( typeof(params.workingFolderWebgl) != 'undefined' )
+			mandreelAppWorkingFolder = params.workingFolderWebgl;
+		// Check Float64Array availability
+		if ( !Mandreel_window["Float64Array"] )
+		{
+			mandreelAppStartStateFunc("error",'Browser unsupported: Float64Array not available');
+			return;
+		}
+
+		var flashElement = Mandreel_document.getElementById('FlashWrapper');
+		if ( flashElement != null )
+		{
+			flashElement.style.visibility = "hidden";
+			flashElement.style.width = "0px";
+			flashElement.style.height = "0px";
+		}
+		var flashElement = Mandreel_document.getElementById('FlashDiv');
+		if ( flashElement != null )
+		{
+			flashElement.style.visibility = "hidden";
+			flashElement.style.width = "0px";
+			flashElement.style.height = "0px";
+		}
+
+		// Setup WebGL
+		if ( typeof(params.webglCanvas) == 'undefined' )
+		{
+			mandreelAppStartStateFunc("error",'canvas parameter not found');
+			return;
+		}
+		var canvas = Mandreel_document.getElementById(params.webglCanvas);
+		if ( canvas == null )
+		{
+			mandreelAppStartStateFunc("error",'canvas object ('+params.webglCanvas+') not found');
+			return;
+		}
+		if ( params.width != null )
+		{
+			canvas.width = params.width;
+			mandreelAppWidthSrc = params.width;
+		}
+		if ( params.height != null )
+		{
+			canvas.height = params.height;
+			mandreelAppHeightSrc = params.height;
+		}
+		if ( mandreelAppPlatform == "webgl" )
+		{
+			// The following code is removed for benchmarking:
+			// imandreel_gl = WebGLUtils.setupWebGL(canvas,{premultipliedAlpha:false,alpha:false});
+			// if (imandreel_gl == null)
+			// {
+			//	mandreelAppStartStateFunc("error","webgl_not_found");
+			//	return;
+			// }
+		}
+
+		if ( mandreelAppPlatform == "canvas" )
+		{
+			imandreel_ctx_canvas = canvas.getContext('2d');
+			if ( imandreel_ctx_canvas == null )
+			{
+				mandreelAppStartStateFunc("error","canvas context 2d not found");
+				return;
+			}
+		}
+
+		if (params.cache != null)
+		{
+			//alert( params.cache.size + params.cache.url);
+			mandreel_fs_init(function() { if ( mandreelAppStartStateFunc )
+				mandreelAppStartStateFunc("loadingFat","");
+			mandreelLoadFat();}, params.cache.size,params.cache.url);
+		}
+		else
+		{
+			// load Fat
+			if ( mandreelAppStartStateFunc )
+				mandreelAppStartStateFunc("loadingFat","");
+			mandreelLoadFat();
+		}
+	}
+
+	if ( mandreelAppPlatform == "flash" )
+	{
+		mandreelAppWorkingFolder = "data/as3/";
+		if ( typeof(params.workingFolderFlash) != 'undefined' )
+			mandreelAppWorkingFolder = params.workingFolderFlash;
+		if (!swfobject.hasFlashPlayerVersion('11.2.0'))
+		{
+			mandreelAppStartStateFunc("error","flash 11 not found");
+			return;
+		}
+
+		if ( typeof(params.flashCanvas) == 'undefined' )
+		{
+			mandreelAppStartStateFunc("error",'canvas parameter not found');
+			return;
+		}
+
+		if ( true ) // hide webgl canvas
+		{
+			var canvas = Mandreel_document.getElementById(mandreelAppCanvasDiv);
+			if ( canvas != null )
+			{
+				canvas.style.visibility = "hidden";
+				canvas.style.width = "0px";
+				canvas.style.height = "0px";
+			}
+		}
+
+		if ( params.width != null )
+		{
+			mandreelAppCanvasWidth = params.width;
+		}
+		if ( params.height != null )
+		{
+			mandreelAppCanvasHeight = params.height;
+		}
+
+		mandreelAppCanvasDiv = params.flashCanvas;
+
+		try
+		{
+			var mandreelSocketsSwf = "mandreel.swf";
+			if ( typeof(params.swfFlash) != 'undefined' )
+				mandreelSocketsSwf = params.swfFlash;
+
+			var my_flashvars = "workingFolder=" + encodeURIComponent(mandreelAppWorkingFolder);
+			if ( typeof(params.log) != 'undefined' && params.log == true)
+			  my_flashvars += "&log=true"
+			my_flashvars += "&width=" + params.width;
+			my_flashvars += "&height=" + params.height;
+			my_flashvars += "&swfloader=" + mandreelSocketsSwf;
+
+			if (typeof(params.restore_context) != 'undefined' && params.restore_context == true)
+				my_flashvars += "&restore_context=1";
+
+			if (typeof(params.antialiasing) != 'undefined')
+				my_flashvars += "&antialiasing=" + params.antialiasing;
+
+			if (typeof(params.right_click_enable) != 'undefined' && params.right_click_enable == true)
+				my_flashvars += "&right_click=1";
+
+			if (typeof(params.disable_depth) != 'undefined' && params.disable_depth == true)
+				my_flashvars += "&disable_depth=1";
+
+			var swfname = "mandreelloader.swf";
+			if ( typeof(params.swfPreloader) != 'undefined' && params.swfPreloader == false)
+				swfname = mandreelSocketsSwf;
+
+			var swf = swfobject.createSWF({ data:swfname, width:"100%", height:"100%" }, { menu:"false",allowScriptAccess:"always",allowFullScreen:"true",wmode:"direct",scale:"noscale",salign :"tl",bgcolor:"#000000",flashvars:my_flashvars}, params.flashCanvas);
+			if ( !swf )
+			{
+				mandreelAppStartStateFunc("error","error loading " + swfname);
+				return;
+			}
+			else
+			{
+				if ( mandreelAppStartStateFunc )
+					mandreelAppStartStateFunc("loadingScript","");
+			}
+		}
+		catch(err)
+		{
+			mandreelAppStartStateFunc("error","exception " + err + " while loading " + mandreelSocketsSwf);
+			return;
+		}
+
+		appStartState('loadingScript');
+	}
+
+	if ( mandreelAppPlatform == "nacl" )
+	{
+		mandreelAppWorkingFolder = "data/nacl/";
+
+		// load Fat
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingFat","");
+		mandreelLoadFat();
+
+	}
+
+	if ( mandreelAppPlatform == "plugin" )
+	{
+		mandreelInitPluginPlatform(params);
+	}
+}
+
+
+////////////////////////////////////////////
+function MandreelAudioStartedNacl()
+{
+	var helloWorldModule = null;
+	helloWorldModule = Mandreel_document.getElementById('hello_world');
+	helloWorldModule.postMessage('init');
+	var flashElement = Mandreel_document.getElementById('FlashWrapper');
+	if ( flashElement != null )
+		flashElement.style.visibility = "hidden";
+	mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
+}
+
+////////////////////////////////////////////
+function _mandreelAppStartReady()
+{
+	if ( mandreelAppPlatform == "nacl" )
+	{
+		wa_initWebAudio();
+		mandreel_webAudio_PreloadAssets();
+	}
+	else
+	{
+		if ( mandreelAppStartStateFunc )
+		{
+			mandreelAppStartRenderWebGL();
+			mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
+		}
+	}
+}
+////////////////////////////////////////////
+function _mandreelAppAudioReady()
+{
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("audioLoaded","");
+
+	if ( mandreelAppUseFlashSockets )
+		mandreel_flash_sockets_load_flash(_mandreelAppStartReady);
+	else
+		_mandreelAppStartReady();
+}
+
+////////////////////////////////////////////
+function mandreelAppInit()
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		global_init(g_stack_pointer+800*1024);
+
+		//Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = mandreelBufferPackAsyncTexture;
+		//mandreelBufferPackAsyncTexture = null;
+		var sp = g_stack_pointer+800*1024;
+		heapU32[sp>>2] = mandreelAppCanvasWidth;
+		heapU32[(sp+4)>>2] = mandreelAppCanvasHeight;
+		__mandreel_internal_SetResolution(sp);
+		__mandreel_internal_init(g_stack_pointer+800*1024);
+		__init(g_stack_pointer+800*1024);
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppDraw(elapsed)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		if ( mandreelAppPlatform == "canvas" && imandreel_ctx_canvas != null )
+		{
+			var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
+			imandreel_ctx_canvas.clearRect(0,0,canvas.width,canvas.height);
+		}
+		var sp = g_stack_pointer+800*1024;
+		__mandreel_internal_preupdate(sp);
+		heapU32[sp>>2] = elapsed;
+		__draw(sp);
+		__mandreel_internal_update(sp);
+		__mandreel_process_async_calls();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppMouseWheel(delta)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = delta;
+		__mouseWheelDelta(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppMouseMove(x,y)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = x;
+		heap32[(i7+4)>>2] = y;
+		__mouseMove(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppResize(x,y)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = x;
+		heap32[(i7+4)>>2] = y;
+		__resize(i7);
+		heap32[(i7+0)>>2] = x;
+		heap32[(i7+4)>>2] = y;
+		__mandreel_internal_SetResolution(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppMouseButton(down,x,y)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = down;
+		heap32[(i7+4)>>2] = x;
+		heap32[(i7+8)>>2] = y;
+		__mouseButton(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppMouseDblClick(x,y)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = x;
+		heap32[(i7+4)>>2] = y;
+		__mouseDoubleClick(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppKeyEvent(down,keyId)
+{
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		var i7 = MandreelLockFrame();
+		heap32[(i7+0)>>2] = down;
+		heap32[(i7+4)>>2] = keyId;
+		__keyEvent(i7);
+		MandreelUnlockFrame();
+	}
+}
+
+////////////////////////////////////////////
+function mandreelAppGetPlatform()
+{
+	return mandreelAppPlatform;
+}
+
+////////////////////////////////////////////
+function mandreelAppGetElementAbsolutePos(elementName)
+{
+	var element = Mandreel_document.getElementById(elementName);
+	var res = new Object();
+	res.x = 0; res.y = 0;
+	if (element !== null)
+	{
+		if (element.getBoundingClientRect)
+		{
+			var viewportElement = Mandreel_document.documentElement;
+			var box = element.getBoundingClientRect();
+			var scrollLeft = viewportElement.scrollLeft;
+			var scrollTop = viewportElement.scrollTop;
+			res.x = box.left + scrollLeft;
+			res.y = box.top + scrollTop;
+		}
+		else
+		{ //for old browsers
+			res.x = element.offsetLeft;
+			res.y = element.offsetTop;
+			var parentNode = element.parentNode;
+			var borderWidth = null;
+			while (offsetParent != null)
+			{
+				res.x += offsetParent.offsetLeft;
+				res.y += offsetParent.offsetTop;
+				var parentTagName = offsetParent.tagName.toLowerCase();
+				if ((__isIEOld && parentTagName != "table") ||
+					((__isFireFoxNew || __isChrome) &&
+						parentTagName == "td"))
+				{
+					borderWidth = kGetBorderWidth(offsetParent);
+					res.x += borderWidth.left;
+					res.y += borderWidth.top;
+				}
+
+				if (offsetParent != Mandreel_document.body &&
+				offsetParent != Mandreel_document.documentElement)
+				{
+					res.x -= offsetParent.scrollLeft;
+					res.y -= offsetParent.scrollTop;
+				}
+
+				//next lines are necessary to fix the problem
+				//with offsetParent
+				if (!__isIE && !__isOperaOld || __isIENew)
+				{
+					while (offsetParent != parentNode &&
+						parentNode !== null) {
+						res.x -= parentNode.scrollLeft;
+						res.y -= parentNode.scrollTop;
+						if (__isFireFoxOld || __isWebKit)
+						{
+						    borderWidth =
+						     kGetBorderWidth(parentNode);
+						    res.x += borderWidth.left;
+						    res.y += borderWidth.top;
+						}
+						parentNode = parentNode.parentNode;
+					}
+				}
+
+				parentNode = offsetParent.parentNode;
+				offsetParent = offsetParent.offsetParent;
+			}
+		}
+	}
+	return res;
+}
+function __getIEVersion()
+{
+	var rv = -1; // Return value assumes failure.
+	if (navigator.appName == 'Microsoft Internet Explorer')
+	{
+		var ua = navigator.userAgent;
+		var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
+		if (re.exec(ua) != null)
+			rv = parseFloat(RegExp.$1);
+	}
+	return rv;
+}
+function __getOperaVersion()
+{
+	var rv = 0; // Default value
+	if (Mandreel_window.opera)
+	{
+		var sver = Mandreel_window.opera.version();
+		rv = parseFloat(sver);
+	}
+	return rv;
+}
+/* The following code was removed for benchmarking:
+var __userAgent = navigator.userAgent;
+var __isIE =  navigator.appVersion.match(/MSIE/) != null;
+var __IEVersion = __getIEVersion();
+var __isIENew = __isIE && __IEVersion >= 8;
+var __isIEOld = __isIE && !__isIENew;
+var __isFireFox = __userAgent.match(/firefox/i) != null;
+var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || (__userAgent.match(/firefox\/1./i) != null));
+var __isFireFoxNew = __isFireFox && !__isFireFoxOld;
+var __isWebKit =  navigator.appVersion.match(/WebKit/) != null;
+var __isChrome =  navigator.appVersion.match(/Chrome/) != null;
+var __isOpera =  Mandreel_window.opera != null;
+var __operaVersion = __getOperaVersion();
+var __isOperaOld = __isOpera && (__operaVersion < 10); */
+function __parseBorderWidth(width)
+{
+	var res = 0;
+	if (typeof(width) == "string" && width != null && width != "" )
+	{
+		var p = width.indexOf("px");
+		if (p >= 0)
+		{
+			res = parseInt(width.substring(0, p));
+		}
+		else
+		{
+			//do not know how to calculate other values (such as 0.5em or 0.1cm) correctly now so just set the width to 1 pixel
+			res = 1;
+		}
+	}
+	return res;
+}
+function __getBorderWidth(element)
+{
+	var res = new Object();
+	res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
+	if (Mandreel_window.getComputedStyle)
+	{
+		//for Firefox
+		var elStyle = Mandreel_window.getComputedStyle(element, null);
+		res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));
+		res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));
+		res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));
+		res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));
+	}
+	else
+	{
+		//for other browsers
+		res.left = __parseBorderWidth(element.style.borderLeftWidth);
+		res.top = __parseBorderWidth(element.style.borderTopWidth);
+		res.right = __parseBorderWidth(element.style.borderRightWidth);
+		res.bottom = __parseBorderWidth(element.style.borderBottomWidth);
+	}
+	return res;
+}
+
+
+////////////////////////////////////////////
+// WebGL
+////////////////////////////////////////////
+	var imandreel_gl = null;
+	var imandreel_ctx_canvas = null;
+	var imandreel_is_ready = 0;
+	var imandreel_oldTime = Date_now();
+
+	function mandreel_wheel(event) { imandreel_onMouseWheel(event);event.preventDefault(); event.returnValue=false; }
+
+	////////////////////////////////////////////
+	function mandreelAppStartRenderWebGL()
+	{
+/* The following code was removed for benchmarking:
+		var canvas = document.getElementById(mandreelAppCanvasName);
+
+		mandreelAppCanvasWidth = canvas.width;
+		mandreelAppCanvasHeight = canvas.height;
+
+		// Register event handlers
+		if(window.addEventListener){ window.addEventListener('DOMMouseScroll',mandreel_wheel,false); }  window.onmousewheel=document.onmousewheel=mandreel_wheel;
+
+		window.addEventListener('mousedown',imandreel_onMouseDown,false);
+		window.addEventListener('mouseup',imandreel_onMouseUp,false);
+		window.addEventListener('mousemove',imandreel_onMouseMove,false);
+		window.addEventListener('dblclick',imandreel_onMouseDblClick,false);
+
+		document.body.oncontextmenu = function() { return false;};
+
+		var canvasDiv = document.getElementById(mandreelAppCanvasDiv);
+		canvasDiv.addEventListener('keydown',imandreel_onKeyDown,false);
+		canvasDiv.addEventListener('keyup',imandreel_onKeyUp,false);
+		canvasDiv.focus();*/
+
+		// Call mandreel app init funtion (__init())
+		mandreelAppInit();
+
+		// Start rendering
+		imandreel_is_ready = 1;
+		//imandreel_render();
+	}
+
+	////////////////////////////////////////////
+	function imandreel_render()
+	{
+		if( ABORT )
+			return;
+
+		var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
+		WebGLUtils.requestAnimationFrame(canvas, imandreel_render);
+
+
+		// Reshape
+		if (canvas.clientWidth != mandreelAppCanvasWidth || canvas.clientHeight != mandreelAppCanvasHeight)
+		{
+			mandreelAppCanvasWidth = canvas.clientWidth;
+			mandreelAppCanvasHeight = canvas.clientHeight;
+			imandreel_gl.viewport(0, 0, mandreelAppCanvasWidth, mandreelAppCanvasHeight);
+		}
+
+		// Set the focus to the canvas div
+		if (mandreelAppForceFocus)
+		{
+			var canvasDiv = Mandreel_document.getElementById(mandreelAppCanvasDiv);
+			canvasDiv.focus();
+		}
+
+		// Call mandreel app draw funtion (__draw())
+		var nowTime = Date_now();
+		if (!g_mandreel_frame_locked)
+		{
+			g_mandreel_frame_inframe = true;
+			if (!_imandreel_pause_game)
+				mandreelAppDraw(nowTime-imandreel_oldTime);
+			g_mandreel_frame_inframe = false;
+		}
+		imandreel_oldTime = nowTime;
+	}
+
+	function render()
+	{
+		// Call mandreel app draw funtion (__draw())
+		var nowTime = Date_now();
+		if (!g_mandreel_frame_locked)
+		{
+			g_mandreel_frame_inframe = true;
+			if (!_imandreel_pause_game)
+				mandreelAppDraw(nowTime-imandreel_oldTime);
+			g_mandreel_frame_inframe = false;
+		}
+		imandreel_oldTime = nowTime;
+	}
+
+	var imandreel_last_movex = 0;
+	var imandreel_last_movey = 0;
+
+	////////////////////////////////////////////
+	function imandreel_onMouseMove(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
+		var setX = e.clientX - pos.x;
+		var setY = e.clientY - pos.y;
+
+		  if(navigator.pointer && navigator.pointer.isLocked) {
+            var deltaX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
+            var deltaY = event.movementY || event.webkitMovementY || event.mozMovementX || 0;
+
+			setX = imandreel_last_movex+deltaX;
+			setY = imandreel_last_movey+deltaY;
+			}
+
+
+		imandreel_last_movex = setX;
+		imandreel_last_movey = setY;
+		mandreelAppMouseMove(setX,setY);
+	}
+
+	////////////////////////////////////////////
+	function imandreel_onMouseDblClick(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
+		var setX = e.clientX - pos.x;
+		var setY = e.clientY - pos.y;
+		mandreelAppMouseDblClick(setX,setY);
+	}
+
+	////////////////////////////////////////////
+	var mandreel_mouse_down = false;
+	var mandreel_rmouse_down = false;
+	function imandreel_onMouseDown(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var rightclick;
+		if (!e) var e = Mandreel_window.event;
+		if (e.which) rightclick = (e.which == 3);
+		else if (e.button) rightclick = (e.button == 2);
+
+		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
+		var setX = e.clientX - pos.x;
+		var setY = e.clientY - pos.y;
+
+		if (!rightclick)
+		{
+			if (mandreel_mouse_down)
+				return;
+
+			mandreel_mouse_down = true;
+			mandreelAppMouseButton(1,setX,setY);
+		}
+		else
+		{
+			if (mandreel_rmouse_down)
+				return;
+
+			mandreel_rmouse_down = true;
+			mandreelAppMouseButton(3,setX,setY);
+		}
+	}
+
+	////////////////////////////////////////////
+	function imandreel_onMouseUp(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var rightclick;
+		if (!e) var e = Mandreel_window.event;
+		if (e.which) rightclick = (e.which == 3);
+		else if (e.button) rightclick = (e.button == 2);
+
+		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
+		var setX = e.clientX - pos.x;
+		var setY = e.clientY - pos.y;
+
+
+		if (!rightclick)
+		{
+			if (mandreel_mouse_down == false)
+				return;
+
+			mandreel_mouse_down = false;
+			mandreelAppMouseButton(0,setX,setY);
+		}
+		else
+		{
+			if (mandreel_rmouse_down == false)
+				return;
+
+			mandreel_rmouse_down = false;
+			mandreelAppMouseButton(2,setX,setY);
+		}
+	}
+
+	////////////////////////////////////////////
+	function imandreel_onMouseWheel(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		mandreelAppMouseWheel(e.wheelDelta);
+	}
+
+	////////////////////////////////////////////
+	function imandreel_onKeyUp(e)
+	{
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var KeyID = e.keyCode;
+		mandreelAppKeyEvent(0,KeyID);
+	}
+
+	////////////////////////////////////////////
+	Mandreel_window.onkeydown = function(e)
+	{
+		if (mandreelDisableSpaceKey == false && e.keyCode == 32)
+			return;
+		return !(e.keyCode == 32 || e.keyCode == 9);
+	};
+
+	////////////////////////////////////////////
+	function imandreel_onKeyDown(e)
+	{
+		if (e.which === 8) // disable back button on browser
+        {
+	        e.preventDefault();
+	    }
+		if (!imandreel_is_ready)
+			return;
+
+		if (_imandreel_pause_game)
+			return;
+
+		var KeyID = e.keyCode;
+		mandreelAppKeyEvent(1,KeyID);
+	}
+
+
+////////////////////////////////////////////
+// Flash
+////////////////////////////////////////////
+
+(function(){
+		try {
+			// Disabling SWFObject's Autohide feature
+			if (typeof swfobject.switchOffAutoHideShow === "function") {
+				swfobject.switchOffAutoHideShow();
+			}
+		} catch(e) {}
+	})();
+
+var imandreel_flash_global_sp = 0;
+var imandreel_flash_global_sp2 = 0;
+var imandreel_flash_current_sp = 0;
+
+function MandreelInterSwfLoaded2()
+{
+}
+function MandreelInterSwfLoaded()
+{
+	appStartState('scriptLoaded');
+	var flashMovie = swfobject.getObjectById(mandreelAppCanvasDiv)
+	dump(flashMovie.width);
+	flashMovie.MandreelInit();
+
+	imandreel_flash_global_sp = MandreelInterGetSWF().MandreelInterGetGlobalStack();
+	imandreel_flash_global_sp2 = MandreelInterGetSWF().MandreelInterGetGlobalStack2();
+	if ( mandreelAppStartStateFunc )
+		mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
+}
+
+
+
+var g_mandreel_swf = null;
+
+function MandreelInterGetSWF()
+{
+	if (g_mandreel_swf)
+		return g_mandreel_swf;
+
+	g_mandreel_swf = swfobject.getObjectById(mandreelAppCanvasDiv)
+	return g_mandreel_swf;
+}
+
+function MandreelInterWriteInt(ptr, value)
+{
+	MandreelInterGetSWF().MandreelInterWriteInt(ptr,value);
+}
+
+function MandreelInterWriteFloat(ptr, value)
+{
+	MandreelInterGetSWF().MandreelInterWriteFloat(ptr,value);
+}
+
+function MandreelInterWriteString(ptr, value)
+{
+	MandreelInterGetSWF().MandreelInterWriteString(ptr,value);
+}
+
+function MandreelInterWriteWString(ptr, value)
+{
+	MandreelInterGetSWF().MandreelInterWriteWString(ptr,value);
+}
+
+function MandreelInterCallFunctionRaw(sp, func_name, returnType)
+{
+	return MandreelInterGetSWF().MandreelInterCallFunctionRaw(sp,func_name,returnType);
+}
+
+
+function assert(condition, _text) {
+//console.assert(condition, _text);
+    if (!condition) {
+      var text = "Assertion failed: " + _text;
+      alert(text + ':\n' + (new Error).stack);
+      ABORT = true;
+      throw "Assertion: " + text;
+    }
+  }
+
+
+
+function MandreelLockFrame()
+{
+	MandreelInterGetSWF().MandreelLockFrame();
+
+	imandreel_flash_current_sp += 300*1024;
+
+	assert(imandreel_flash_current_sp<1024*1024);
+
+	return imandreel_flash_current_sp;
+}
+
+function MandreelPause()
+{
+	MandreelInterGetSWF().MandreelPause();
+}
+
+function MandreelResume()
+{
+	MandreelInterGetSWF().MandreelResume();
+}
+
+
+function MandreelUnlockFrame()
+{
+	imandreel_flash_current_sp -= 300*1024;
+	MandreelInterGetSWF().MandreelUnlockFrame();
+}
+
+
+
+function MandreelInterCallFunctionAsync(func_name,param)
+{
+	return MandreelInterGetSWF().MandreelInterCallFunctionAsync(func_name, param);
+}
+
+
+function MandreelInterCallFunction(returnType,func_name)
+{
+	var size_params = 0;
+
+	var i;
+	var num_params = (arguments.length-2)/2;
+	num_params|=0;
+	for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				size_arg = 4;
+				break;
+			case 'float':
+				size_arg = 4;
+				break;
+			case 'string':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
+				break;
+			case 'wstring':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
+				break;
+			default:
+				assert(false);
+		}
+
+		size_params += size_arg;
+	}
+
+	// stack always 8 byte aligned
+	size_params=((size_params+7)& 0xfffffff8);
+
+	var sp = 0;
+
+	if (i<(arguments.length))
+		sp = arguments[i];
+	else
+	{
+		assert(false);
+	}
+
+
+	sp-=size_params;
+
+	MandreelLockFrame();
+
+	var offset = 0;
+	var ptr_data = num_params*4+sp;
+    for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				MandreelInterWriteInt((sp+offset),arguments[i+1]);
+				break;
+			case 'float':
+				MandreelInterWriteFloat((sp+offset),arguments[i+1]);
+				break;
+			case 'string':
+				{
+					MandreelInterWriteInt((sp+offset),ptr_data);
+					var string = arguments[i+1];
+					MandreelInterWriteString(ptr_data,string);
+
+					ptr_data += ((string.length + 4) & 0xfffffffc);
+				}
+				break;
+			case 'wstring':
+				{
+					MandreelInterWriteInt((sp+offset),ptr_data);
+					var string = arguments[i+1];
+					MandreelInterWriteWString(ptr_data,string);
+
+					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
+				}
+				break;
+			default:
+				assert(false);
+		}
+		offset+=4;
+	}
+
+	return_value = MandreelInterCallFunctionRaw(sp, func_name, returnType);
+
+	MandreelUnlockFrame();
+
+	if (returnType == 'int')
+		return parseInt(return_value);
+	else if (returnType == 'float')
+		return parseFloat(return_value);
+
+	return;
+}
+
+
+
+// file system
+
+var g_mandreel_timestamp_fs = 0;
+var g_mandreel_fs = null;
+
+function onMandreelQuotaOk(fs)
+{
+	g_mandreel_fs = fs;
+	dump('onMandreelQuotaOk');
+}
+
+
+function MandreelFsErrorHandler(e) {
+  var msg = '';
+
+  switch (e.code) {
+    case FileError.QUOTA_EXCEEDED_ERR:
+      msg = 'QUOTA_EXCEEDED_ERR';
+      break;
+    case FileError.NOT_FOUND_ERR:
+      msg = 'NOT_FOUND_ERR';
+      break;
+    case FileError.SECURITY_ERR:
+      msg = 'SECURITY_ERR';
+      break;
+    case FileError.INVALID_MODIFICATION_ERR:
+      msg = 'INVALID_MODIFICATION_ERR';
+      break;
+    case FileError.INVALID_STATE_ERR:
+      msg = 'INVALID_STATE_ERR';
+      break;
+    default:
+      msg = 'Unknown Error';
+      break;
+  };
+
+  dump('Error: ' + msg);
+  dump(e);
+}
+
+var indexedDB = Mandreel_window.indexedDB || Mandreel_window.webkitIndexedDB ||
+                Mandreel_window.mozIndexedDB;
+
+if ('webkitIndexedDB' in Mandreel_window) {
+  Mandreel_window.IDBTransaction = Mandreel_window.webkitIDBTransaction;
+  Mandreel_window.IDBKeyRange = Mandreel_window.webkitIDBKeyRange;
+}
+
+
+var mandreel_indexedDB = {};
+mandreel_indexedDB.db = null;
+mandreel_indexedDB.callback_init = false;
+
+mandreel_indexedDB.onerror = function(e) {
+  dump(e);
+};
+
+mandreel_indexedDB.init = function(callback)
+{
+ try {
+	var request = indexedDB.open('my_cache', 2);
+
+	request.onerror = function(event) {
+		callback(false);
+		};
+	request.onupgradeneeded = function(event) {
+	dump('onupgradeneeded\n');
+	mandreel_indexedDB.db = event.target.result;
+    var db = mandreel_indexedDB.db;
+	var objectStore = db.createObjectStore("cache",{keyPath: "fileName"});
+	}
+
+  request.onsuccess = function(event) {
+  dump('onsuccess\n');
+    mandreel_indexedDB.db = event.target.result;
+    	callback(true);
+
+  };
+  }
+  catch(e)
+  {
+	callback(false);
+  }
+
+}
+
+function mandreel_fs_init(callback, size_bytes, url_time)
+{
+
+	g_mandreel_timestamp_fs = 99999999999999;
+
+
+
+
+	var aux = null;
+	try	{ aux = webkitStorageInfo; } catch(err) { aux = null; }
+	if (aux == null)
+	{
+		//callback(false);
+
+		var time_request = new XMLHttpRequest();
+	time_request.open('GET',url_time);
+	time_request.onreadystatechange = function()
+	{
+		if (time_request.readyState==4)
+		{
+			if (time_request.status==200 || time_request.status==0)
+			{
+
+				if (time_request.responseText)
+				{
+					g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
+					dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
+				}
+			}
+
+			mandreel_indexedDB.init(callback);
+		}
+	}
+	time_request.send();
+
+
+		return;
+	}
+
+	webkitStorageInfo.requestQuota(
+		webkitStorageInfo.PERSISTENT ,   // or PERSISTENT
+		size_bytes,
+		function(bytes) {  dump('request quota succeed');},
+		function () { dump('request quota failed');} );
+
+
+//	g_mandreel_timestamp_fs =0;
+
+	var time_request = new XMLHttpRequest();
+	time_request.open('GET',url_time);
+	time_request.onreadystatechange = function()
+	{
+		if (time_request.readyState==4)
+		{
+			if (time_request.status==200 || time_request.status==0)
+			{
+
+				if (time_request.responseText)
+				{
+					g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
+					dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
+				}
+			}
+
+			var my_requestFileSystem  = Mandreel_window.requestFileSystem || Mandreel_window.webkitRequestFileSystem;
+
+			my_requestFileSystem(Mandreel_window.PERSISTENT, size_bytes,
+				function(result)
+				{
+					onMandreelQuotaOk(result);
+
+
+					if (callback)
+						Mandreel_setTimeout(callback, 100, true);
+				} , function(e) { MandreelFsErrorHandler(e); if (callback) callback(false); } );
+		}
+	}
+	time_request.send();
+}
+
+
+mandreel_indexedDB.load = function(file_name, callback)
+{
+	var db = mandreel_indexedDB.db;
+	var trans = db.transaction(["cache"]);
+	var store = trans.objectStore("cache");
+
+	var key = file_name;
+
+	 var getReq = store.get(key);
+	   getReq.onsuccess = function (ev) {
+			if (getReq.result)
+	{
+	dump('chanka ' + g_mandreel_timestamp_fs + ' ' + getReq.result.timeStamp + '\n');
+				if (getReq.result.timeStamp>=g_mandreel_timestamp_fs)
+					callback(getReq.result.data);
+				else
+					callback(null);
+			}
+			else
+				callback(null);
+	   }
+	   getReq.onerror = function (ev) {
+		   console.log("index.get failed. Error: " + ev.message);
+	   }
+}
+
+function mandreel_fs_get_url(file_name, callback)
+{
+	if (mandreel_indexedDB.db)
+	{
+		callback(null);
+		return;
+	}
+
+
+	if (g_mandreel_fs == null)
+	{
+		callback(null);
+		return;
+	}
+
+	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
+
+	fileEntry.getMetadata(function(metaData){
+	var my_seconds = metaData.modificationTime.getTime()/1000;
+
+	if (g_mandreel_timestamp_fs>my_seconds)
+	{
+		callback(null);
+	}
+	else
+	{
+		//alert('mandreel_fscachefile2');
+
+
+		if (Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
+			callback(fileEntry.toURL());
+		else
+			callback(null);
+
+	}
+
+
+		}, MandreelFsErrorHandler);
+
+
+  }, function(error) {callback(null);});
+
+	 return;
+
+}
+
+function mandreel_fs_load_binary(file_name, callback)
+ {
+	if (mandreel_indexedDB.db)
+	{
+		mandreel_indexedDB.load(file_name,callback);
+		return;
+	}
+
+
+	if (g_mandreel_fs == null)
+	{
+		callback(null);
+		return;
+	}
+
+
+	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
+
+	fileEntry.getMetadata(function(metaData){
+	var my_seconds = metaData.modificationTime.getTime()/1000;
+
+	if (g_mandreel_timestamp_fs>my_seconds)
+	{
+		dump('mandreel_fscachefile1');
+		Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
+		fileEntry.remove(function() {
+				callback(null);
+			}, MandreelFsErrorHandler);
+
+	}
+	else
+	{
+		//alert('mandreel_fscachefile2');
+		dump('mandreel_fscachefile2 ' + my_seconds);
+
+		fileEntry.file(function(file) {
+
+				var reader = new FileReader();
+
+
+			   reader.onloadend = function(e) {
+
+				   if (this.result.byteLength && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
+				   {
+						dump('mandreel_fs_loadFile ' + file_name);
+						callback(this.result);
+					}
+					else
+						callback(null);
+
+			   };
+
+
+				 reader.readAsArrayBuffer(file);
+
+
+			}, MandreelFsErrorHandler);
+
+	}
+
+
+		}, MandreelFsErrorHandler);
+
+
+  }, function(error) {dump('mandreel_fscachefile3');	callback(null);});
+
+	 return;
+ }
+
+
+ mandreel_indexedDB.save = function(file_name, data)
+{
+	var db = mandreel_indexedDB.db;
+
+
+  var trans = db.transaction(["cache"], IDBTransaction.READ_WRITE);
+  var store = trans.objectStore("cache");
+  var request = store.put({
+    "data": data,
+	"timeStamp" : Date_now()/1000,
+    "fileName" : file_name
+  });
+
+  request.onsuccess = function(e) {
+    // Re-render all the todo's
+   // html5rocks.indexedDB.getAllTodoItems();
+   dump('mandreel_indexedDB.save ok ');
+  };
+
+  request.onerror = function(e) {
+    dump('mandreel_indexedDB.save onerror ' + file_name);
+	dump(e);
+  };
+}
+
+function mandreel_fs_get_key(name)
+{
+	return 'mandreel_fs_' + name;
+}
+
+function mandreel_is_filesystem()
+{
+	if (mandreel_indexedDB.db)
+		return false;
+
+	if (!g_mandreel_fs)
+		return false;
+
+	return true;
+}
+
+function mandreel_is_indexeddb()
+{
+	if (mandreel_indexedDB.db)
+		return true;
+
+	return false;
+}
+
+ function mandreel_fs_saveFile(name, my_arrayBuffer)
+{
+	if (mandreel_indexedDB.db)
+	{
+		mandreel_indexedDB.save(name,my_arrayBuffer);
+		return;
+	}
+
+	if (!g_mandreel_fs)
+		return;
+
+	Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(name));
+	g_mandreel_fs.root.getFile(name, {create: true}, function(fileEntry) {
+
+    // Create a FileWriter object for our FileEntry (log.txt).
+    fileEntry.createWriter(function(fileWriter) {
+
+      fileWriter.onwriteend = function(e) {
+		Mandreel_window.localStorage.setItem(mandreel_fs_get_key(name),'valid');
+        dump('Write completed.');
+      };
+
+      fileWriter.onerror = function(e) {
+        dump('Write failed: ' + e.toString());
+      };
+
+	  var my_BlobBuilder = Mandreel_window.MozBlobBuilder || Mandreel_window.WebKitBlobBuilder || Mandreel_window.BlobBuilder;
+
+	  var bb = new my_BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
+      bb.append(my_arrayBuffer);
+      fileWriter.write(bb.getBlob('text/plain'));
+
+
+
+    }, MandreelFsErrorHandler);
+
+  }, MandreelFsErrorHandler);
+}
+
+
+function mandreel_fs_load_text(file_name, callback)
+ {
+
+	if (mandreel_indexedDB.db)
+	{
+		mandreel_indexedDB.load(file_name,callback);
+		return;
+	}
+
+	if (g_mandreel_fs == null)
+	{
+		callback(null);
+		return;
+	}
+
+
+	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
+
+	fileEntry.getMetadata(function(metaData){
+	var my_seconds = metaData.modificationTime.getTime()/1000;
+
+	if (g_mandreel_timestamp_fs>my_seconds)
+	{
+		dump('mandreel_fscachefile1');
+		Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
+		fileEntry.remove(function() {
+				callback(null);
+			}, MandreelFsErrorHandler);
+
+	}
+	else
+	{
+		//alert('mandreel_fscachefile2');
+		dump('mandreel_fscachefile2 ' + my_seconds);
+
+		fileEntry.file(function(file) {
+
+				var reader = new FileReader();
+
+
+			   reader.onloadend = function(e) {
+
+
+				   if (this.result.length && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
+				   {
+						dump('mandreel_fs_loadFile ' + file_name);
+						callback(this.result);
+					}
+					else
+						callback(null);
+
+			   };
+
+
+				 reader.readAsText(file);
+
+
+			}, MandreelFsErrorHandler);
+
+	}
+
+
+		}, MandreelFsErrorHandler);
+
+
+  }, function(error) {dump('mandreel_fscachefile3');	callback(null);});
+
+	 return;
+ }
+
+
+ // full screen
+
+
+/* The following code was removed for benchmarking:
+ var __screen = screen; */
+
+	try
+	{
+	(function(global) {
+    "use strict";
+	var elementPrototype = (global.HTMLElement || global.Element)["prototype"];
+
+	 // document.isFullScreen
+    if(!Mandreel_document.hasOwnProperty("fullscreenEnabled")) {
+        var getter = (function() {
+            // These are the functions that match the spec, and should be preferred
+            if("webkitIsFullScreen" in Mandreel_document) {
+                return function() { return Mandreel_document.webkitIsFullScreen; }
+            }
+            if("mozFullScreen" in Mandreel_document) {
+                return function() { return Mandreel_document.mozFullScreen; }
+            }
+            return function() { return false }; // not supported, never fullscreen
+        })();
+
+        Object.defineProperty(Mandreel_document, "fullscreenEnabled", {
+            enumerable: true, configurable: false, writeable: false,
+            get: getter
+        });
+    }
+
+    if(!Mandreel_document.hasOwnProperty("fullscreenElement")) {
+        var getter = (function() {
+            // These are the functions that match the spec, and should be preferred
+            if("webkitFullscreenElement" in Mandreel_document) {
+                return function() { return Mandreel_document.webkitFullscreenElement; }
+            }
+            if("mozFullscreenElemen" in Mandreel_document) {
+                return function() { return Mandreel_document.mozFullscreenElemen; }
+            }
+            return function() { return null }; // not supported
+        })();
+
+        Object.defineProperty(Mandreel_document, "fullscreenElement", {
+            enumerable: true, configurable: false, writeable: false,
+            get: getter
+        });
+    }
+
+    // Document event: fullscreenchange
+    function fullscreenchange(oldEvent) {
+        var newEvent = Mandreel_document.createEvent("CustomEvent");
+        newEvent.initCustomEvent("fullscreenchange", true, false, null);
+        // TODO: Any need for variable copy?
+        Mandreel_document.dispatchEvent(newEvent);
+    }
+    Mandreel_document.addEventListener("webkitfullscreenchange", fullscreenchange, false);
+    Mandreel_document.addEventListener("mozfullscreenchange", fullscreenchange, false);
+
+    // Document event: fullscreenerror
+    function fullscreenerror(oldEvent) {
+        var newEvent = Mandreel_document.createEvent("CustomEvent");
+        newEvent.initCustomEvent("fullscreenerror", true, false, null);
+        // TODO: Any need for variable copy?
+        Mandreel_document.dispatchEvent(newEvent);
+    }
+    Mandreel_document.addEventListener("webkitfullscreenerror", fullscreenerror, false);
+    Mandreel_document.addEventListener("mozfullscreenerror", fullscreenerror, false);
+
+    // element.requestFullScreen
+    if(!elementPrototype.requestFullScreen) {
+        elementPrototype.requestFullScreen = (function() {
+            if(elementPrototype.webkitRequestFullScreen) {
+                return function() {
+                    this.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+                }
+            }
+
+            return  elementPrototype.mozRequestFullScreen    ||
+                    function(){ /* unsupported, fail silently */ };
+        })();
+    }
+
+    // document.cancelFullscreen
+    if(!Mandreel_document.cancelFullScreen) {
+        Mandreel_document.cancelFullScreen = (function() {
+            return  Mandreel_document.webkitCancelFullScreen ||
+                    Mandreel_document.mozCancelFullScreen ||
+                    function(){ /* unsupported, fail silently */ };
+        })();
+    }
+	})((typeof(exports) != 'undefined') ? global : Mandreel_window);
+	}
+	catch(e)
+	{
+	}
+
+
+try
+	{
+var __onErrorFullscreen = function() {
+  dump("Mouse lock was not successful.");
+};
+
+Mandreel_document.addEventListener('fullscreenchange', function(e) {
+
+var width;
+var height;
+ var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
+ if(Mandreel_document.fullscreenEnabled) {
+
+
+            width = __screen.width;
+            height = __screen.height;
+
+        } else {
+            width = mandreelAppWidthSrc;
+            height = mandreelAppHeightSrc;
+        }
+
+		canvas.width = width;
+		canvas.height = height;
+		mandreelAppResize(width, height);
+
+  if (Mandreel_document.fullscreenEnabled && navigator.pointer) {
+    navigator.pointer.lock(Mandreel_document.body, function() {
+      // Locked and ready to play.
+    }, __onErrorFullscreen);
+  }
+}, false);
+
+}
+catch(e)
+{
+}
+
+
+
+function mandreelAppFullscreen(enable)
+{
+	var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
+	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
+	{
+		if (canvas)
+		{
+			if (enable)
+				canvas.requestFullScreen();
+			else
+				Mandreel_document.cancelFullScreen();
+		}
+	}
+}
+
+
+function mandreelAppDisableForceFocus()
+{
+	mandreelAppForceFocus = false;
+}
+
+function mandreelAppEnableForceFocus()
+{
+	mandreelAppForceFocus = true;
+}
+
+var imandreel_base64 = {};
+imandreel_base64.PADCHAR = '=';
+imandreel_base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+imandreel_base64.makeDOMException = function() {
+    // sadly in FF,Safari,Chrome you can't make a DOMException
+    var e, tmp;
+
+    try {
+        return new DOMException(DOMException.INVALID_CHARACTER_ERR);
+    } catch (tmp) {
+        // not available, just passback a duck-typed equiv
+        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error
+        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error/prototype
+        var ex = new Error("DOM Exception 5");
+
+        // ex.number and ex.description is IE-specific.
+        ex.code = ex.number = 5;
+        ex.name = ex.description = "INVALID_CHARACTER_ERR";
+
+        // Safari/Chrome output format
+        ex.toString = function() { return 'Error: ' + ex.name + ': ' + ex.message; };
+        return ex;
+    }
+}
+
+imandreel_base64.getbyte64 = function(s,i) {
+    // This is oddly fast, except on Chrome/V8.
+    //  Minimal or no improvement in performance by using a
+    //   object with properties mapping chars to value (eg. 'A': 0)
+    var idx = imandreel_base64.ALPHA.indexOf(s.charAt(i));
+    if (idx === -1) {
+        throw imandreel_base64.makeDOMException();
+    }
+    return idx;
+}
+
+imandreel_base64.decode = function(s) {
+    // convert to string
+    s = '' + s;
+    var getbyte64 = imandreel_base64.getbyte64;
+    var pads, i, b10;
+    var imax = s.length
+    if (imax === 0) {
+        return s;
+    }
+
+    if (imax % 4 !== 0) {
+        throw imandreel_base64.makeDOMException();
+    }
+
+    pads = 0
+    if (s.charAt(imax - 1) === imandreel_base64.PADCHAR) {
+        pads = 1;
+        if (s.charAt(imax - 2) === imandreel_base64.PADCHAR) {
+            pads = 2;
+        }
+        // either way, we want to ignore this last block
+        imax -= 4;
+    }
+
+    var x = [];
+    for (i = 0; i < imax; i += 4) {
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) |
+            (getbyte64(s,i+2) << 6) | getbyte64(s,i+3);
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff));
+    }
+
+    switch (pads) {
+    case 1:
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | (getbyte64(s,i+2) << 6);
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff));
+        break;
+    case 2:
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12);
+        x.push(String.fromCharCode(b10 >> 16));
+        break;
+    }
+    return x.join('');
+}
+
+if (!Mandreel_window.atob) {
+Mandreel_window.atob = function(a) { return  imandreel_base64.decode(a); }
+}
+
+
+function imandreel_interop_callbridge(new_method, sp)
+{
+
+	var n = new Array();
+
+	for( var i = 2; i < arguments.length; i++ )
+	{
+
+		if (typeof arguments[i] == 'string')
+			n.push(atob(arguments[i]));
+		else
+			n.push(arguments[i]);
+	}
+
+	var total_args = arguments.length-2;
+
+	switch(total_args)
+	{
+		case 0:
+			return Mandreel_window[new_method](sp);
+		case 1:
+			return Mandreel_window[new_method](sp, n[0]);
+		case 2:
+			return Mandreel_window[new_method](sp, n[0], n[1]);
+		case 3:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2]);
+		case 4:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3]);
+		case 5:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4]);
+		case 6:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5]);
+		case 7:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6]);
+		case 8:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
+		case 9:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8]);
+		case 10:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9]);
+		case 11:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10]);
+		case 12:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11]);
+		case 13:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12]);
+		case 14:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13]);
+		case 15:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13], n[14]);
+		case 16:
+			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13], n[14], n[15]);
+		break;
+	}
+
+}
+function imandreel_as3_dump(param)
+{
+	dump(atob(param));
+}
+
+
+var mandreel_embed_plugin;
+
+function PluginMandreelInterWriteInt(ptr, value)
+{
+	mandreel_embed_plugin.MandreelInterCalls("WriteInt", ptr,value);
+}
+
+function PluginMandreelInterWriteFloat(ptr, value)
+{
+	mandreel_embed_plugin.MandreelInterCalls("WriteFloat", ptr,value);
+}
+
+function PluginMandreelInterWriteString(ptr, value)
+{
+	mandreel_embed_plugin.MandreelInterCalls("WriteString", ptr,value);
+}
+
+function PluginMandreelInterWriteWString(ptr, value)
+{
+	mandreel_embed_plugin.MandreelInterCalls("WriteWString", ptr,value);
+}
+
+var mandreel_plugin_current_sp = 0;
+
+function PluginMandreelLockFrame()
+{
+	var result = mandreel_embed_plugin.MandreelInterCalls("LockFrame");
+
+	mandreel_plugin_current_sp+=300*1024;
+
+	assert(mandreel_plugin_current_sp<1024*1024);
+
+	return result+mandreel_plugin_current_sp;
+}
+
+function PluginMandreelPause()
+{
+	mandreel_embed_plugin.MandreelInterCalls("Pause");
+}
+
+function PluginMandreelResume()
+{
+	mandreel_embed_plugin.MandreelInterCalls("Resume");
+}
+
+
+function PluginMandreelUnlockFrame()
+{
+	mandreel_embed_plugin.MandreelInterCalls("UnlockFrame");
+
+	mandreel_plugin_current_sp-=300*1024;
+}
+
+function PluginMandreelInterCallFunction()
+{
+	var total_args = arguments.length;
+
+	switch(total_args)
+	{
+		case 0:
+			return mandreel_embed_plugin.MandreelInterCallFunction();
+		case 1:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0]);
+		case 2:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1]);
+		case 3:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2]);
+		case 4:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3]);
+		case 5:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
+		case 6:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
+		case 7:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
+		case 8:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
+		case 9:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]);
+		case 10:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]);
+		case 11:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10]);
+		case 12:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11]);
+		case 13:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12]);
+		case 14:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13]);
+		case 15:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13], arguments[14]);
+		case 16:
+			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13], arguments[14], arguments[15]);
+		break;
+	}
+}
+
+function mandreel_plugin_draw()
+{
+	var canvas = Mandreel_document.getElementById('canvasDiv');
+	WebGLUtils.requestAnimationFrame(canvas, mandreel_plugin_draw);
+	mandreel_embed_plugin.MandreelInterCalls("AppDraw");
+
+}
+
+function mandreelInitPluginPlatform(params)
+{
+
+	if ( params.width != null )
+		mandreelAppWidthSrc = params.width;
+
+	if ( params.height != null )
+		mandreelAppHeightSrc = params.height;
+
+
+	mandreel_embed_plugin = Mandreel_document.createElement('embed');
+	mandreel_embed_plugin.setAttribute('width',mandreelAppWidthSrc);
+	mandreel_embed_plugin.setAttribute('height',mandreelAppHeightSrc);
+	mandreel_embed_plugin.setAttribute('type',"application/halfbrick-npruntime-scriptable-plugin");
+
+	var div = Mandreel_document.getElementById('canvasDiv');
+
+
+	var oChild=div.firstChild;
+
+	div.replaceChild(mandreel_embed_plugin, oChild);
+
+	var flashElement = Mandreel_document.getElementById('FlashWrapper');
+	if ( flashElement != null )
+	{
+		flashElement.style.visibility = "hidden";
+		flashElement.style.width = "0px";
+		flashElement.style.height = "0px";
+	}
+
+
+
+
+
+	Mandreel_window.MandreelInterWriteInt     = PluginMandreelInterWriteInt;
+	Mandreel_window.MandreelInterWriteFloat   = PluginMandreelInterWriteInt;
+	Mandreel_window.MandreelInterWriteString  = PluginMandreelInterWriteString;
+	Mandreel_window.MandreelInterWriteWString = PluginMandreelInterWriteWString;
+	Mandreel_window.MandreelLockFrame         = PluginMandreelLockFrame;
+	Mandreel_window.MandreelUnlockFrame       = PluginMandreelUnlockFrame;
+	Mandreel_window.MandreelInterCallFunction = PluginMandreelInterCallFunction;
+	Mandreel_window.MandreelPause 			 = PluginMandreelPause;
+	Mandreel_window.MandreelResume 			 = PluginMandreelResume;
+
+	Mandreel_setTimeout(function () {
+
+	if ( typeof(params.pluginSolutionName) != 'undefined' )
+		mandreel_embed_plugin.init(params.pluginDLL, params.pluginWorkingFolder,params.pluginSolutionName);
+	else
+		mandreel_embed_plugin.init(params.pluginDLL, params.pluginWorkingFolder);
+
+
+	mandreelAppStartStateFunc("ready",mandreelAppWidthSrc,mandreelAppHeightSrc);
+
+	Mandreel_setTimeout("mandreel_plugin_draw()", 16);
+	}, 100);
+
+}
+
+
+function MandreelInterSwfProgress(mode, percentage, bytes, totalbytes)
+{
+	imandreel_update_load(bytes, totalbytes);
+	if (mode == 'files')
+	{
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingData",percentage);
+	}
+	else if (mode == 'audio')
+	{
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingAudioUpdate",percentage);
+	}
+	else if (mode == 'textureasync')
+	{
+		if ( mandreelAppStartStateFunc )
+			mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
+	}
+
+}
+
+function MandreelInterSwfCheckMethod(method)
+{
+	if (typeof(Mandreel_window[method])=="undefined")
+		return 0;
+	else
+		return 1;
+}
+
+// End of js/mandreelapp.js file.
+
+// Start of mandreel.js file.
+
+var mandreel_total_memory = 15908864;
+var mandreel_stack_memory = 1048576;
+var mandreel_heap_memory = 13591752; //init_memory = 744248
+/////////////////////////////////////////////
+// Heap
+/////////////////////////////////////////////
+var heap;
+var heap8;
+var heapU8;
+var heap16;
+var heapU16;
+var heap32;
+var heapU32;
+var heapFloat;
+var heapDouble;
+var heapNewPos = 512;
+
+var ABORT = false;
+
+var g_mandreel_cache_files = false;
+
+
+var g_mandreel_frame_locked = false;
+var g_mandreel_frame_inframe = false;
+
+var mandreel_cache_files = [];
+var g_mandreel_working_folder = 'DataPC/';
+var g_mandreel_datafiles_sufix = '.dat';
+var __FUNCTION_TABLE__ = [];
+var mandreel_pos_function_table = 1;
+function register_delegate(ptr_func)
+{
+	var functionId = mandreel_pos_function_table;
+	__FUNCTION_TABLE__[functionId] = ptr_func;
+
+	mandreel_pos_function_table++;
+	return functionId*4;
+}
+
+
+var g_addr_emit = 0;
+function emit_start(addr)
+{
+	g_addr_emit = addr;
+}
+
+function emit_8(data)
+{
+	heapU8[g_addr_emit] = data;
+	g_addr_emit++;
+}
+
+function emit_16(data)
+{
+	heapU16[g_addr_emit>>1] = data;
+	g_addr_emit+=2;
+}
+
+function emit_32(data)
+{
+	heapU32[g_addr_emit>>2] = data;
+	g_addr_emit+=4;
+}
+
+function emit_fill(data, size)
+{
+	var j;
+	for (j=0;j<size;j++)
+	{
+		heapU8[g_addr_emit] = data;
+		g_addr_emit++;
+	}
+}
+
+function emit_string(v)
+{
+	var j;
+	var len = v.length;
+	var data;
+
+	for(j = 0; j < len; j++)
+	{
+		data = v.charCodeAt(j);
+
+		heapU8[g_addr_emit] = data;
+		g_addr_emit++;
+	}
+}
+
+
+
+
+
+var g_stack_pointer = Malloc(mandreel_stack_memory);
+
+function assert_unalign()
+{
+	dump("fatal error: unaligned memory access detected!!!!");
+	assert(false);
+}
+
+function _assert(sp)
+{
+	var p0 = heap32[sp>>2];sp+=4;
+  var p1 = heap32[sp>>2];sp+=4;
+  var line = heap32[sp>>2];sp+=4;
+	var name = get_string_from_ptr(p0);
+	var file = get_string_from_ptr(p1);
+	assert(false, name + file + ' ' + line);
+}
+__cxa_pure_virtual.__index__ = 0;
+function __cxa_pure_virtual()
+{
+	assert(0);
+}
+
+// operator delete[]
+function _ZdaPv(sp)
+{
+	free(sp);
+}
+
+// operator delete
+function _ZdlPv(sp)
+{
+	free(sp);
+}
+
+// operator new[](unsigned int)
+function _Znaj(sp)
+{
+	malloc(sp);
+}
+// operator new[](unsigned int)
+function _Znwj(sp)
+{
+	malloc(sp);
+}
+
+function abort(sp)
+{
+	assert(0);
+}
+
+var r_g0 = 0;
+var r_g1 = 0;
+var f_g0 = 0;
+
+//isFinite(aux)
+//isNaN(aux)
+
+var tlsf_ptr = 0;
+
+
+function initHeap()
+{
+	heap = new ArrayBuffer(mandreel_total_memory);
+	heap8 = new Int8Array(heap);
+	heapU8 = new Uint8Array(heap);
+	heap16 = new Int16Array(heap);
+	heapU16 = new Uint16Array(heap);
+	heap32 = new Int32Array(heap);
+	heapU32 = new Uint32Array(heap);
+	heapFloat = new Float32Array(heap);
+	heapDouble = new Float64Array(heap);
+
+
+	for (var i=0;i<mandreel_total_memory/4;i++)
+	{
+		heapU32[i] = 0;
+	}
+}
+
+function Malloc(bytes)
+{
+	if ( heap == undefined )
+	{
+		//initHeap();
+	}
+	var newOffset = heapNewPos;
+	// Always 32 bit aligned
+	heapNewPos += ((bytes + 3) & 0xfffffffc);
+
+	if (heapNewPos>mandreel_total_memory)
+	{
+		assert(false);
+	}
+
+	return newOffset;
+}
+
+function assert(condition, _text) {
+//console.assert(condition, _text);
+    if (!condition) {
+      var text = "Assertion failed: " + _text;
+      alert(text + ':\n' + (new Error).stack);
+      ABORT = true;
+      throw "Assertion: " + text;
+    }
+  }
+
+  function my_assert(sp)
+  {
+	var p0 = heap32[sp>>2];sp+=4;
+  var p1 = heap32[sp>>2];sp+=4;
+	//var name = get_string_from_ptr(p1);
+
+	assert(false, 'hola');
+  }
+
+  function WriteHeapDouble(addr, value)
+  {
+  //assert((addr&7)==0);
+	heapDouble[addr>>3] = value;
+  }
+
+    function WriteHeapU64(addr, value)
+  {
+	heap32[addr>>2] = value.l;
+	heap32[(addr>>2)+1] = value.h;
+  }
+
+
+var arg_test_local = Malloc(8);
+function my_arg_test(sp)
+{
+	var ptr = heapU32[sp>>2];
+	var size = heapU32[(sp+4)>>2];
+
+	var arg = heapU32[ptr>>2];
+
+
+	if (size == 4)
+	{
+	heap32[ptr>>2] = arg+4;
+
+	arg = heap32[arg>>2];
+
+	heap32[arg_test_local>>2] = arg;
+
+	//dump('my_arg_test ' + arg + ' ' + ptr + '\n');
+
+	}
+	else
+	{
+		arg = (arg+7) & ~7;
+
+		heap32[ptr>>2] = arg+8;
+
+	//assert((arg&7)==0);
+	var value0 = heap32[arg>>2];
+	var value1 = heap32[(arg+4)>>2];
+	//arg = llvm_readDouble(arg);
+
+	//assert((arg_test_local&7)==0);
+
+	heap32[arg_test_local>>2] = value0;
+	heap32[(arg_test_local+4)>>2] = value1;
+
+	//llvm_writeDouble(arg_test_local,arg);
+
+	//dump('my_arg_test ' + arg + ' ' + ptr + '\n');
+
+
+	}
+
+
+
+
+	r_g0 = arg_test_local;
+}
+
+
+
+
+
+
+function uint(value) {
+    if (value >= 0) return value;
+    return 4294967296 + value;
+  }
+
+
+
+function puts(sp)
+{
+	var addr = heapU32[sp>>2];
+
+	var name = get_string_from_ptr(addr);
+
+	name+='\n';
+
+	dump(name);
+
+}
+
+function _Z11print_valued(_stack_pos, value)
+{
+	dump(value);
+	dump('\n');
+}
+
+function _Z11print_labelPKc(_stack_pos, addr)
+{
+	puts(_stack_pos,addr);
+	dump('\n');
+}
+
+
+
+
+function gettimeofday(sp)
+  {
+  var ptr = heap32[sp>>2];
+  var time_ms = Date_now();
+	heap32[ptr>>2] = time_ms/1000;
+	heap32[(ptr>>2)+1] = (time_ms%1000)*1000;
+	r_g0 = 0;
+  }
+
+
+  function free(sp)
+  {
+	var ptr = heapU32[sp>>2];
+  	sp-=8;
+
+	heap32[(sp)>>2] = tlsf_ptr;
+	heap32[(sp+4)>>2] = ptr;
+	tlsf_free(sp);
+  }
+
+  function malloc_size(sp)
+  {
+  var ptr = heapU32[sp>>2];
+
+	sp-=4;
+
+	heap32[(sp)>>2] = ptr;
+	tlsf_block_size(sp);
+  }
+
+
+  function realloc(sp)
+  {
+	var ptr = heapU32[sp>>2];
+	var size = heapU32[(sp+4)>>2];
+
+	//assert(ptr == 0);
+
+	sp-=12;
+
+	//dump('realloc ' + sp + ' ' + ptr + ' ' + size + '\n');
+
+	heap32[(sp)>>2] = tlsf_ptr;
+	heap32[(sp+4)>>2] = ptr;
+	heap32[(sp+8)>>2] = size;
+	tlsf_realloc(sp);
+
+	//dump('return ' + r_g0 + '\n');
+  }
+
+  var llvm_double_addr = Malloc(8);
+
+  function llvm_writeDouble(addr,src)
+  {
+  //assert((llvm_double_addr&7)==0);
+	heapDouble[llvm_double_addr>>3] = src;
+
+	//assert((addr&7)==0);
+
+	var val0 = heap32[(llvm_double_addr)>>2];
+	var val1 = heap32[(llvm_double_addr+4)>>2];
+
+	heap32[(addr)>>2] = val0;
+	heap32[(addr+4)>>2] = val1;
+  }
+
+  function llvm_readDouble(addr)
+  {
+  	//assert((addr&7)==0);
+
+	var val0 = heap32[(addr)>>2];
+	var val1 = heap32[(addr+4)>>2];
+
+	heap32[(llvm_double_addr)>>2] = val0;
+	heap32[(llvm_double_addr+4)>>2] = val1;
+
+
+//	assert((llvm_double_addr&7)==0);
+	var result = heapDouble[llvm_double_addr>>3];
+
+
+	return result;
+
+  }
+
+  function llvm_move_double(addr_dst, addr_src)
+  {
+
+	var val0 = heapU32[(addr_src)>>2];
+	var val1 = heapU32[(addr_src+4)>>2];
+
+	heapU32[(addr_dst)>>2] = val0;
+	heapU32[(addr_dst+4)>>2] = val1;
+
+  }
+
+  function llvm_move_float(addr_dst, addr_src)
+  {
+	heapU32[(addr_dst)] = heapU32[(addr_src)];
+  }
+
+  function malloc(sp)
+  {
+	var size = heapU32[sp>>2];
+
+	if (size == 0)
+	{
+		size = 4;
+	}
+
+
+	if (tlsf_ptr == 0)
+	{
+		var addr = Malloc(mandreel_heap_memory);
+
+		sp-=8;
+		heap32[(sp)>>2] = addr;
+		heap32[(sp+4)>>2] = mandreel_heap_memory;
+		tlsf_create(sp);
+		tlsf_ptr = r_g0;
+	}
+
+	sp-=8;
+
+	heap32[(sp)>>2] = tlsf_ptr;
+	heap32[(sp+4)>>2] = size;
+	tlsf_malloc(sp);
+
+	if (r_g0 == 0)
+	{
+		dump('malloc failed ' + size + '\n');
+		assert(false);
+	}
+  }
+
+
+   function log10f(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.log(value)/Math.LN10;
+  }
+
+   function log10(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.log(value)/Math.LN10;
+  }
+
+function logf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.log(value);
+  }
+
+  function log(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.log(value);
+  }
+
+
+
+  function cosf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.cos(value);
+	//assert (isNaN(f_g0) == false);
+  }
+
+  function acosf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.acos(value);
+  }
+
+  function asinf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.asin(value);
+  }
+
+  function asin(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.asin(value);
+  }
+
+  function acos(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.acos(value);
+  }
+
+  function floor(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.floor(value);
+  }
+
+  function floorf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.floor(value);
+  }
+
+  function round(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.round(value);
+  }
+
+  function roundf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.round(value);
+  }
+
+  function ceilf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.ceil(value);
+  }
+
+  function ceil(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.ceil(value);
+  }
+
+
+  function exp2(sp)
+  {
+  var value = heapDouble[sp>>3];
+
+	f_g0 = Math.pow(2,value);
+  }
+
+  function exp2f(sp)
+  {
+  var value = heapFloat[sp>>2];
+
+	f_g0 = Math.pow(2,value);
+  }
+
+
+
+  function pow(sp)
+  {
+  var value = heapDouble[sp>>3];
+  var value2 = heapDouble[(sp+8)>>3];
+	f_g0 = Math.pow(value,value2);
+  }
+
+  function powf(sp)
+  {
+  var value = heapFloat[sp>>2];
+  var value2 = heapFloat[(sp+4)>>2];
+	f_g0 = Math.pow(value,value2);
+  }
+
+  function cos(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.cos(value);
+	//assert (isNaN(f_g0) == false);
+  }
+
+  function tan(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.tan(value);
+	//assert (isNaN(f_g0) == false);
+  }
+
+   function sinf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.sin(value);
+
+	//assert (isNaN(f_g0) == false);
+  }
+
+  function expf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.exp(value);
+  }
+
+  function exp(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.exp(value);
+  }
+
+  function tanf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.tan(value);
+  }
+
+ function atanf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.atan(value);
+  }
+
+  function atan(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.atan(value);
+  }
+
+  function abs(sp)
+  {
+  var value = heap32[sp>>2];
+  if (value<0)
+  r_g0 = -value;
+  else
+  r_g0 = value;
+  }
+
+  function sin(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.sin(value);
+  }
+
+  function sqrtf(sp)
+  {
+  var value = heapFloat[sp>>2];
+	f_g0 = Math.sqrt(value);
+  }
+
+  function sqrt(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.sqrt(value);
+  }
+
+  function fmod(sp)
+  {
+  var value = heapDouble[sp>>3];sp+=8;
+  var value2 = heapDouble[sp>>3];
+	f_g0 = value % value2;
+  }
+
+   function fmodf(sp)
+  {
+  var value = heapFloat[sp>>2];sp+=4;
+  var value2 = heapFloat[sp>>2];
+	f_g0 = value % value2;
+  }
+
+
+  function atan2f(sp)
+  {
+  var x = heapFloat[sp>>2];sp+=4;
+  var y = heapFloat[sp>>2];
+	f_g0 = Math.atan2(x,y);
+  }
+
+  function atan2(sp)
+  {
+  var x = heapDouble[sp>>3];
+  var y = heapDouble[(sp+8)>>3];
+	f_g0 = Math.atan2(x,y);
+  }
+
+  function fabs(sp)
+  {
+  var value = heapDouble[sp>>3];
+	f_g0 = Math.abs(value);
+  }
+
+
+  function _Z18OutputDebugStringAPKc(sp)
+  {
+  puts(sp);
+
+  }
+
+
+  function getenv(sp)
+  {
+  r_g0 = 0;
+  }
+
+
+  function mandreel_fcmp_ord(X, Y)
+  {
+	return (X == X && Y == Y);
+  }
+
+  function mandreel_fcmp_uno(X, Y)
+{
+
+        return (X != X || Y != Y);
+}
+
+var llvm_errno = Malloc(4);
+function _errno(sp)
+{
+	r_g0 = llvm_errno;
+}
+
+
+
+
+if (!Mandreel_window["dump"])
+	Mandreel_window["dump"] = function dump(str){console.log(str)} ;
+
+
+
+
+  function get_string_from_ptr(ptr)
+  {
+	var ret = "";
+
+	if (ptr == 0)
+		return ret;
+
+	var i = 0;
+	while (1) {
+  //    if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
+	if (heapU8[ptr + i] == 0)
+		break;
+
+      var t = String.fromCharCode(heapU8[ptr + i]);
+      ret += t;
+      i += 1;
+    }
+
+	return ret;
+  }
+
+  function fill_ptr_from_string(ptr, v)
+  {
+	var j;
+	var len = v.length;
+	var data;
+
+  	for(j = 0; j < len; j++)
+	{
+		data = v.charCodeAt(j);
+
+		heapU8[ptr] = data;
+		ptr++;
+	}
+		heapU8[ptr] = 0;
+	}
+
+  var file_ids = [];
+  var current_file_id = 20;
+
+  function create_file_id(buffer)
+  {
+	this.buffer = buffer;
+	this.offset = 0;
+	this.byteArray = new Uint8Array(buffer);
+  }
+
+  function mandreel_rewind(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+
+  file_ids[file_id].offset = 0;
+
+	r_g0 = 0;
+
+	//return 0;
+  }
+
+
+  function mandreel_fseek(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+  var pos = heap32[sp>>2];sp+=4;
+  var type = heap32[sp>>2];sp+=4;
+
+	if (type == 2)
+	{
+		file_ids[file_id].offset = file_ids[file_id].buffer.byteLength + pos;
+	}
+	else if (type == 1)
+	{
+		file_ids[file_id].offset = file_ids[file_id].offset + pos;
+
+	}
+	else if (type == 0)
+	{
+		file_ids[file_id].offset = pos;
+
+	}
+
+	r_g0 = 0;
+
+	//return 0;
+  }
+
+  function mandreel_fclose(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+
+	file_ids[file_id] = null;
+	r_g0 = 0;
+	//return 0;
+  }
+
+
+
+  function mandreel_feof(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+
+  var offset = file_ids[file_id].offset;
+  var total = file_ids[file_id].buffer.byteLength;
+
+  if (offset>=total)
+  r_g0 = 1;
+  else
+  r_g0 = 0;
+
+  }
+
+  function mandreel_getc(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+
+
+  var offset = file_ids[file_id].offset;
+
+
+	var buffer = file_ids[file_id].buffer;
+
+	var byteArray = file_ids[file_id].byteArray;
+
+	var total = 1;
+
+	var result;
+
+	if ((offset+total)>buffer.byteLength)
+	{
+		result = -1;
+	}
+	else
+	{
+		result = byteArray[offset];
+		file_ids[file_id].offset+=total;
+	}
+
+	r_g0 = result;
+  }
+
+
+
+  function mandreel_fread(sp)
+  {
+  var ptr = heap32[sp>>2];sp+=4;
+  var size = heap32[sp>>2];sp+=4;
+  var count = heap32[sp>>2];sp+=4;
+  var file_id = heap32[sp>>2];sp+=4;
+
+  var offset = file_ids[file_id].offset;
+
+  //dump('fread ' + ptr + ' ' + size + ' ' + count + ' ' + file_id + ' ' + offset + '\n');
+
+	var buffer = file_ids[file_id].buffer;
+
+	var total = size*count;
+
+	if ((offset+total)>buffer.byteLength)
+		total = buffer.byteLength-offset;
+
+	var byteArray = file_ids[file_id].byteArray;
+
+
+	var sub_array = byteArray.subarray(offset, offset+total);
+
+	heapU8.set(sub_array,ptr);
+
+
+	//heapU8.set(byteArray, ptr);
+	//for (var i=0;i<total;++i)
+	//{
+//		heapU8[ptr+i] = byteArray[i+offset];
+//	}
+
+
+	file_ids[file_id].offset+=total;
+
+	r_g0 = total/size;
+	//return total;
+  }
+
+  function mandreel_ftell(sp)
+  {
+  var file_id = heap32[sp>>2];sp+=4;
+
+	var value = file_ids[file_id].offset;
+	//dump('offset ftell ' + value + '\n');
+	r_g0 = value;
+	//return value;
+  }
+
+  function _Z30mandreel_fopen_enable_checkfatb(sp)
+  {
+  }
+
+  function mandreel_ungetc(sp)
+  {
+	var my_char = heap32[sp>>2];sp+=4;
+	var file_id = heap32[sp>>2];sp+=4;
+
+	var offset = file_ids[file_id].offset-1;
+
+	var byteArray = file_ids[file_id].byteArray;
+
+	assert(byteArray[offset] == my_char);
+
+	file_ids[file_id].offset = offset;
+
+	return my_char;
+  }
+  function mandreel_fopen(sp)
+  {
+  var ptr_name = heap32[sp>>2];sp+=4;
+  var ptr_flags = heap32[sp>>2];sp+=4;
+
+
+	var name = get_string_from_ptr(ptr_name);
+	var flags = get_string_from_ptr(ptr_flags);
+	//dump('fopen\n');
+	//dump(name);
+	//dump('\n');
+	//dump(flags);
+	//dump('\n');
+
+	var buffer;
+
+	var full_name;
+
+	name = name.toLowerCase();
+
+	name = name.replace(/\\/g,"/");
+
+	full_name	= g_mandreel_working_folder + name + g_mandreel_datafiles_sufix;
+
+
+	buffer =mandreel_cache_files[name];
+
+	if (buffer == null)
+	{
+	r_g0 = 0;
+	return;
+	}
+
+
+
+	//dump('\nopening file ' + full_name + ' ' + buffer.byteLength + '\n');
+
+
+	file_ids[current_file_id] = new create_file_id(buffer);
+
+	var old_id = current_file_id;
+	current_file_id++;
+
+	r_g0 = old_id;
+	//return old_id;
+  }
+
+  function llvm_store_unalign32_float(addr, value)
+  {
+	heapFloat[0] = value;
+	var data = heap32[0];
+	heap8[addr] = data&0xff;
+	heap8[addr+1] = (data>>>8)&0xff;
+	heap8[addr+2] = (data>>>16)&0xff;
+	heap8[addr+3] = (data>>>24)&0xff;
+  }
+  function llvm_store_unalign32(addr, value)
+  {
+	heap8[addr] = value&0xff;
+	heap8[addr+1] = (value>>>8)&0xff;
+	heap8[addr+2] = (value>>>16)&0xff;
+	heap8[addr+3] = (value>>>24)&0xff;
+  }
+
+  function llvm_read_unalign32(addr)
+  {
+	var value;
+	value = heapU8[addr];
+	value |= heapU8[addr+1]<<8;
+	value |= heapU8[addr+2]<<16;
+	value |= heapU8[addr+3]<<24;
+	return value;
+  }
+
+  function llvm_read_unalign32_float(addr)
+  {
+	var value;
+	value = heapU8[addr];
+	value |= heapU8[addr+1]<<8;
+	value |= heapU8[addr+2]<<16;
+	value |= heapU8[addr+3]<<24;
+
+	heap32[0] = value;
+	return  heapFloat[0];
+  }
+
+  function mandreel_getlocalstorage()
+  {
+	return Mandreel_window.localStorage;
+	//return Mandreel_window.sessionStorage;
+  }
+
+  function mandreel_openls(sp)
+  {
+	var ptr_name = heap32[sp>>2];sp+=4;
+
+	var key = get_string_from_ptr(ptr_name);
+
+	var my_localStorage = mandreel_getlocalstorage();
+
+	var value = my_localStorage.getItem(key);
+
+	if (value == null)
+	{
+		r_g0 = -1;
+		return;
+	}
+
+
+	var length = my_localStorage.getItem(key + '_size');
+
+	if (length == null)
+	{
+		r_g0 = -1;
+		return;
+	}
+
+
+
+
+	dump('mandreel_openls ' + key + ' return ' + length);
+
+
+	r_g0 = parseInt(length);
+
+
+
+	return;
+
+  }
+
+  function mandreel_readls(sp)
+  {
+	var ptr_name = heap32[sp>>2];sp+=4;
+	var data_dst = heap32[sp>>2];sp+=4;
+	var data_len = heap32[sp>>2];sp+=4;
+
+	var key = get_string_from_ptr(ptr_name);
+
+	var my_localStorage = mandreel_getlocalstorage();
+
+	var value = my_localStorage.getItem(key);
+
+	var data = JSON.parse(value);
+
+
+	for (var i=0;i<data_len;++i)
+	{
+		heapU8[data_dst+i] = data[i];
+	}
+
+	r_g0 =  data_len;
+	return;
+
+}
+
+function mandreel_removels(sp)
+ {
+ var ptr_name_a = heap32[sp>>2];sp+=4;
+ var key_a = get_string_from_ptr(ptr_name_a);
+
+ var my_localStorage = mandreel_getlocalstorage();
+
+	my_localStorage.removeItem(key_a);
+	my_localStorage.removeItem(key_a + '_size');
+	r_g0 = 0;
+
+ }
+
+
+function mandreel_renamels(sp)
+ {
+ var ptr_name_a = heap32[sp>>2];sp+=4;
+  var ptr_name_b = heap32[sp>>2];sp+=4;
+
+  var key_a = get_string_from_ptr(ptr_name_a);
+  var key_b = get_string_from_ptr(ptr_name_b);
+
+  var my_localStorage = mandreel_getlocalstorage();
+
+
+  var value = my_localStorage.getItem(key_a);
+  var value2 = my_localStorage.getItem(key_a + '_size');
+
+  if (value != null && value2 != null)
+  {
+	my_localStorage.setItem(key_b, value);
+	my_localStorage.setItem(key_b + '_size', value2);
+
+	my_localStorage.removeItem(key_a);
+	my_localStorage.removeItem(key_a + '_size');
+
+
+	r_g0 = 0;
+}
+else
+ r_g0 = -1;
+ }
+
+function mandreel_writels(sp)
+  {
+	var ptr_name = heap32[sp>>2];sp+=4;
+	var data_src = heap32[sp>>2];sp+=4;
+	var data_len = heap32[sp>>2];sp+=4;
+
+	var key = get_string_from_ptr(ptr_name);
+
+
+
+	var data = new Uint8Array(heap,data_src,data_len);
+
+	var value = JSON.stringify(data);
+
+	var my_localStorage = mandreel_getlocalstorage();
+
+	try
+	{
+		my_localStorage.setItem(key, value);
+	} catch(e)
+	{
+		dump('error saving ' + key);
+		dump(e.message);
+		r_g0 =  0;
+		return;
+	}
+
+	try
+	{
+		my_localStorage.setItem(key + '_size', data_len);
+	} catch(e)
+	{
+		dump('error saving ' + key);
+		dump(e.message);
+		r_g0 =  0;
+		return;
+	}
+
+
+	r_g0 =  data_len;
+	return;
+
+}
+
+function mandreel_call_constructors(_ptr, size,stackPos)
+{
+var ptr = _ptr;
+
+ptr = ptr >> 2;
+
+for (var i=0;i<size;++i)
+{
+
+
+var tag = heap32[ptr];
+var ptr_id = heap32[ptr+1];
+
+__FUNCTION_TABLE__[(ptr_id)>>2](stackPos);
+
+ptr+=2;
+
+}
+}
+
+function get_string_from_wptr(ptr)
+  {
+	var ret = "";
+
+	if (ptr == 0)
+		return ret;
+
+	assert((ptr&1)==0);
+	ptr>>=1;
+	var i = 0;
+	while (1) {
+  //    if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
+	if (heapU16[ptr + i] == 0)
+		break;
+
+      var t = String.fromCharCode(heapU16[ptr + i]);
+     // if (t == "\0") { break; } else {}
+      ret += t;
+      i += 1;
+    }
+
+	return ret;
+  }
+
+  function fill_wptr_from_string(ptr, v)
+  {
+	var j;
+	var len = v.length;
+	var data;
+
+	assert((ptr&1)==0);
+	ptr>>=1;
+
+  	for(j = 0; j < len; j++)
+	{
+		data = v.charCodeAt(j);
+
+		heapU16[ptr] = data;
+		ptr++;
+	}
+		heapU16[ptr] = 0;
+	}
+
+function mandreelInterGetParams(sp)
+{
+	var params = [];
+
+	var offset = 0;
+	for (i=1;i<arguments.length;++i)
+	{
+		var type = arguments[i];
+
+		switch(type)
+		{
+			case 'int':
+				params[i-1] = heap32[(sp+offset)>>2];
+				break;
+			case 'float':
+				params[i-1] = heapFloat[(sp+offset)>>2];
+				break;
+			case 'string':
+				params[i-1] = get_string_from_ptr(heap32[(sp+offset)>>2]);
+				break;
+			default:
+				assert(false);
+		}
+		offset+=4;
+	}
+
+	return params;
+}
+
+function mandreelInterRetParam(type, value)
+{
+	switch(type)
+	{
+		case 'int':
+			r_g0 = value;
+			break;
+		case 'float':
+			f_g0 = value;
+			break;
+		default:
+			assert(false);
+	}
+
+	return 0;
+}
+
+function MandreelInterGetFunctionPtr(value)
+{
+	return __FUNCTION_TABLE__[value >> 2];
+}
+
+
+function MandreelInterCallFunction(returnType,func_name)
+{
+	var size_params = 0;
+
+	var i;
+	var num_params = (arguments.length-2)/2;
+	num_params|=0;
+	for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				size_arg = 4;
+				break;
+			case 'float':
+				size_arg = 4;
+				break;
+			case 'string':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
+				break;
+			case 'wstring':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
+				break;
+			default:
+				assert(false);
+		}
+
+		size_params += size_arg;
+	}
+
+	// stack always 8 byte aligned
+	size_params=((size_params+7)& 0xfffffff8);
+
+	var sp = 0;
+
+	if (i<(arguments.length))
+		sp = arguments[i];
+	else
+	{
+		assert(false,"MandreelInterCallFunction missing stack pointer paramenter");
+		//assert(g_mandreel_frame_locked == true);
+		//sp = g_stack_pointer+800*1024;
+	}
+
+	sp-=size_params;
+
+	var offset = 0;
+	var ptr_data = num_params*4+sp;
+    for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				heap32[(sp+offset)>>2] = arguments[i+1];
+				break;
+			case 'float':
+				heapFloat[(sp+offset)>>2] = arguments[i+1];
+				break;
+			case 'string':
+				{
+					heap32[(sp+offset)>>2] = ptr_data;
+					var string = arguments[i+1];
+					fill_ptr_from_string(ptr_data,string);
+
+					ptr_data += ((string.length + 4) & 0xfffffffc);
+				}
+				break;
+			case 'wstring':
+				{
+					MandreelInterWriteInt((sp+offset),ptr_data);
+					var string = arguments[i+1];
+					MandreelInterWriteWString(ptr_data,string);
+
+					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
+				}
+				break;
+			default:
+				assert(false);
+		}
+		offset+=4;
+	}
+
+	Mandreel_window[func_name](sp);
+
+	if (returnType == 'int')
+		return r_g0;
+	else if (returnType == 'float')
+		return f_g0;
+	else
+	{
+		assert(returnType == 'void');
+		return;
+	}
+}
+
+
+function MandreelInterCallFunctionPtr(returnType,func_ptr)
+{
+	var size_params = 0;
+
+	var i;
+	var num_params = (arguments.length-2)/2;
+	num_params|=0;
+	for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				size_arg = 4;
+				break;
+			case 'float':
+				size_arg = 4;
+				break;
+			case 'string':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
+				break;
+			case 'wstring':
+				size_arg = 4;
+				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
+				break;
+			default:
+				assert(false);
+		}
+
+		size_params += size_arg;
+	}
+
+	// stack always 8 byte aligned
+	size_params=((size_params+7)& 0xfffffff8);
+
+	var sp = 0;
+
+	if (i<(arguments.length))
+		sp = arguments[i];
+	else
+	{
+		assert(false);
+		//assert(g_mandreel_frame_locked == true);
+		//sp = g_stack_pointer+800*1024;
+	}
+
+	sp-=size_params;
+
+	var offset = 0;
+	var ptr_data = num_params*4+sp;
+    for (i=2;i<num_params*2+2;i+=2)
+	{
+		var type = arguments[i];
+
+		var size_arg = 0;
+		switch(type)
+		{
+			case 'int':
+				heap32[(sp+offset)>>2] = arguments[i+1];
+				break;
+			case 'float':
+				heapFloat[(sp+offset)>>2] = arguments[i+1];
+				break;
+			case 'string':
+				{
+					heap32[(sp+offset)>>2] = ptr_data;
+					var string = arguments[i+1];
+					fill_ptr_from_string(ptr_data,string);
+
+					ptr_data += ((string.length + 4) & 0xfffffffc);
+				}
+				break;
+			case 'wstring':
+				{
+					MandreelInterWriteInt((sp+offset),ptr_data);
+					var string = arguments[i+1];
+					MandreelInterWriteWString(ptr_data,string);
+
+					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
+				}
+				break;
+			default:
+				assert(false);
+		}
+		offset+=4;
+	}
+
+	__FUNCTION_TABLE__[(func_ptr)>>2](sp);
+
+	if (returnType == 'int')
+		return r_g0;
+	else if (returnType == 'float')
+		return f_g0;
+	else
+	{
+		assert(returnType == 'void');
+		return;
+	}
+}
+
+
+var MANDREEL_HTTP_REQUEST_MODE_GET = 0;
+var MANDREEL_HTTP_REQUEST_MODE_POST = 1;
+var MANDREEL_HTTP_REQUEST_MODE_PUT = 2;
+
+var MANDREEL_HTTP_REQUEST_STATUS_ERROR = 0;
+var MANDREEL_HTTP_REQUEST_STATUS_BUSY = 1;
+var MANDREEL_HTTP_REQUEST_STATUS_FINISHED = 2;
+var MANDREEL_HTTP_REQUEST_STATUS_INIT = 3;
+
+
+var mandreel_js_mapping_ids = [];
+var mandreel_js_mapping_ids_free = [];
+
+
+function Mandreel_HttpRequest_Create(sp)
+{
+	var ptr_url = heap32[sp>>2];sp+=4;
+	var type = heap32[sp>>2];sp+=4;
+
+
+	var url = get_string_from_ptr(ptr_url);
+
+
+	var str_type = 'GET';
+	if (type == MANDREEL_HTTP_REQUEST_MODE_GET)
+		str_type = 'GET';
+	else if (type == MANDREEL_HTTP_REQUEST_MODE_PUT)
+		str_type = 'PUT';
+	else if (type == MANDREEL_HTTP_REQUEST_MODE_POST)
+		str_type = 'POST';
+
+	var xmlhttp_get = new XMLHttpRequest();
+	xmlhttp_get.open(str_type,url);
+
+	if("responseType" in xmlhttp_get)
+		xmlhttp_get.responseType="arraybuffer";
+    else
+	{
+		xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');
+	}
+
+	if (mandreel_js_mapping_ids_free.length == 0)
+		mandreel_js_mapping_ids_free.push(mandreel_js_mapping_ids.length);
+
+	var new_id = mandreel_js_mapping_ids_free.pop();
+
+	var my_state = {
+	buffer : null,
+	httpRequest : xmlhttp_get,
+	status : MANDREEL_HTTP_REQUEST_STATUS_INIT,
+	offset_read : 0
+  };
+
+
+
+	mandreel_js_mapping_ids[new_id] = my_state;
+
+	r_g0 = new_id+1;
+}
+
+function Mandreel_HttpRequest_Send(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var ptr_data = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+	var data;
+
+	if (ptr_data)
+		data = get_string_from_ptr(ptr_data);
+	else
+		data = null;
+
+	var my_state = mandreel_js_mapping_ids[id];
+
+
+	my_state.status = MANDREEL_HTTP_REQUEST_STATUS_BUSY;
+
+	my_state.httpRequest.onreadystatechange = function()
+	{
+		if (my_state.httpRequest.readyState==4)
+		{
+			if (my_state.httpRequest.status==200)
+			{
+				var buffer;
+
+				if (my_state.httpRequest.responseType=="arraybuffer")
+					buffer=my_state.httpRequest.response;
+				else if (my_state.httpRequest.mozResponseArrayBuffer != null)
+					buffer = my_state.httpRequest.mozResponseArrayBuffer;
+				else
+					buffer=my_state.httpRequest.response;
+
+				my_state.status = MANDREEL_HTTP_REQUEST_STATUS_FINISHED;
+				my_state.buffer =  new Uint8Array(buffer);
+				//alert(my_state.buffer.length);
+
+				//alert(mandreel_js_mapping_ids[id].buffer);
+
+			}
+			else
+				my_state.status = MANDREEL_HTTP_REQUEST_STATUS_ERROR;
+		}
+	}
+
+	my_state.httpRequest.send(data);
+}
+
+
+function Mandreel_HttpRequest_Status(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+
+	r_g0 = mandreel_js_mapping_ids[id].status;
+}
+
+function Mandreel_HttpRequest_Read(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+	var size = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+	var remaining_bytes =  mandreel_js_mapping_ids[id].buffer.length - mandreel_js_mapping_ids[id].offset_read;
+
+	if (size>remaining_bytes)
+		size = remaining_bytes;
+
+	var sub_array = mandreel_js_mapping_ids[id].buffer.subarray(mandreel_js_mapping_ids[id].offset_read, mandreel_js_mapping_ids[id].offset_read+size);
+	heapU8.set(sub_array,ptr);
+
+	mandreel_js_mapping_ids[id].offset_read+=size;
+
+	r_g0 = size;
+}
+
+function Mandreel_HttpRequest_BytesAvalable(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+
+	if (mandreel_js_mapping_ids[id].buffer)
+		r_g0 = mandreel_js_mapping_ids[id].buffer.length - mandreel_js_mapping_ids[id].offset_read;
+	else
+		r_g0 = 0;
+}
+
+function Mandreel_HttpRequest_Close(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+	mandreel_js_mapping_ids[id] = null;
+	mandreel_js_mapping_ids_free.push(id);
+}
+
+function Mandreel_HttpRequest_SetRequestHeader(sp)
+{
+	var _id = heap32[sp>>2];sp+=4;
+	var ptr_a = heap32[sp>>2];sp+=4;
+	var ptr_b = heap32[sp>>2];sp+=4;
+	var id = _id-1;
+
+	var str_a = get_string_from_ptr(ptr_a);
+	var str_b = get_string_from_ptr(ptr_b);
+
+	var my_state = mandreel_js_mapping_ids[id];
+
+	my_state.httpRequest.setRequestHeader(str_a, str_b);
+}
+
+
+var Mandreel_TextureAsync_textures = 0;
+var Mandreel_TextureAsync_textures_loaded = 0;
+
+var Mandreel_TextureAsync_PackBufferData = new Array();
+
+function Mandreel_TextureAsync_SetData(sp)
+{
+	var texture_id = heap32[sp>>2];sp+=4;
+
+	var tex = array_ids_ogl[texture_id];
+
+	if ( mandreelAppPlatform != "canvas" )
+	{
+		imandreel_gl.texImage2D(imandreel_gl.TEXTURE_2D, 0, imandreel_gl.RGBA, imandreel_gl.RGBA, imandreel_gl.UNSIGNED_BYTE, tex.image);
+		tex.image = null;
+	}
+}
+
+function Mandreel_TextureAsync_CheckPending(sp)
+{
+	r_g0 = Mandreel_TextureAsync_textures - Mandreel_TextureAsync_textures_loaded;
+}
+
+function Mandreel_TextureAsync_GetProperties(sp)
+{
+	var texture_id = heap32[sp>>2];sp+=4;
+	var ptr_width = heap32[sp>>2];sp+=4;
+	var ptr_height = heap32[sp>>2];sp+=4;
+
+	var tex = array_ids_ogl[texture_id];
+
+	if (tex == null || tex.mandreel_width == undefined)
+		r_g0 = 0;
+	else
+	{
+		heap32[ptr_width>>2] = tex.mandreel_width;
+		heap32[ptr_height>>2] = tex.mandreel_height;
+		r_g0 = 1;
+	}
+}
+
+function mandreel_arrayBufferDataUri(offset, size, buffer) {
+var bytes = new Uint8Array(buffer,offset,size)
+   var ascii = '';
+   for (var i=0; i<bytes.length; i++)
+     ascii += String.fromCharCode(bytes[i]);
+   var base64 = btoa(ascii);
+
+  if (/^\x89PNG/.test(ascii))
+    return 'data:image/png;base64,'+base64;
+  else
+    return 'data:image/jpeg;base64,'+base64;
+  }
+
+ function mandreel_texture_async_fix_name(name)
+{
+	var ascii = '';
+
+	var j;
+	var len = name.length;
+
+
+	for(j = 0; j < len; j++)
+	{
+		var my_char = name[j];
+
+		if (my_char == '/')
+			my_char = '_';
+
+		ascii+=my_char;
+
+	}
+
+   return ascii;
+}
+
+
+
+function Mandreel_TextureAsync_Load(sp)
+{
+	var ptr_name = heap32[sp>>2];sp+=4;
+	var texture_id = heap32[sp>>2];sp+=4;
+
+	var name = get_string_from_ptr(ptr_name);
+
+	var nameSrc = name;
+
+	name = name.toLowerCase();
+
+
+	var full_name	= g_mandreel_working_folder + name;
+
+	var image  = new Image();
+
+
+	Mandreel_TextureAsync_textures++;
+
+	var imgURL = null;
+
+
+
+
+	image.onerror = function() {
+          dump('error loading texture ' + image.src + '\n');
+		  Mandreel_TextureAsync_textures_loaded++;
+      }
+	image.onload = function()
+	{
+		if (imgURL)
+		{
+			var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
+			URL.revokeObjectURL(imgURL);
+		}
+		if ( mandreelAppPlatform == "canvas" )
+		{
+			array_ids_ogl[texture_id] = image;
+			Mandreel_TextureAsync_textures_loaded++;
+		}
+		else
+		{
+			var tex = array_ids_ogl[texture_id];
+			if (tex)
+			{
+				tex.image = image;
+				tex.mandreel_width = image.width;
+				tex.mandreel_height = image.height;
+				Mandreel_TextureAsync_textures_loaded++;
+
+				var sp = MandreelLockFrame();
+				MandreelInterCallFunction('void',"Mandreel_TextureAsync_Loaded",'int',texture_id,'int',image.width,'int',image.height, sp);
+				MandreelUnlockFrame();
+		}
+			else
+			{
+				dump('texture not valid ' + texture_id + ' ' + name + '\n');
+				Mandreel_TextureAsync_textures_loaded++;
+			}
+		}
+
+
+	}
+
+	var new_sp = sp-4096;
+
+	var packfile = new_sp + 2048;
+	var offset_ptr = new_sp + 2048+1024;
+	var size_ptr = new_sp + 2048+1024+4;
+
+	fill_ptr_from_string(new_sp + 1024,name);
+
+	heap32[(new_sp)>>2] = new_sp + 1024;
+	heap32[(new_sp+4)>>2] = offset_ptr;
+	heap32[(new_sp+8)>>2] = size_ptr;
+	heap32[(new_sp+12)>>2] = packfile;
+	iMandreel_TextureAsync_GetPackOffset(new_sp);
+
+
+	var image_src;
+
+	var image_src_valid = true;
+
+	if (r_g0)
+	{
+		var packfilename = get_string_from_ptr(packfile);
+		image_src = mandreel_arrayBufferDataUri(heap32[offset_ptr>>2],heap32[size_ptr>>2],Mandreel_TextureAsync_PackBufferData[packfilename]);
+	}
+	else
+	{
+
+		if (nameSrc.search('http:') != -1 || nameSrc.search('https:') != -1)
+		{
+			image.crossOrigin = 'anonymous'; // no credentials flag. Same as
+			image_src = nameSrc;
+		}
+		else
+		{
+			if (mandreel_is_filesystem())
+			{
+				image_src_valid = false;
+
+				var new_name = mandreel_texture_async_fix_name(full_name);
+				mandreel_fs_get_url(new_name, function Mandreel_TextureAsync_Load_FS(data) {
+					if (data)
+					{
+						image.src = data;
+					}
+					else
+					{
+						var packdata_request = new XMLHttpRequest();
+
+						packdata_request.open("GET", full_name, true);
+
+						if("responseType" in packdata_request)
+							packdata_request.responseType="arraybuffer";
+						else
+							packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
+
+						packdata_request.onreadystatechange = function()
+						{
+							if (packdata_request.readyState != 4) return;
+
+							if (packdata_request.status == 200)
+							{
+								var buffer;
+								if (packdata_request.responseType=="arraybuffer")
+									buffer=packdata_request.response;
+								else if (packdata_request.mozResponseArrayBuffer != null)
+									buffer = packdata_request.mozResponseArrayBuffer;
+								else
+									buffer=packdata_request.response;
+
+								mandreel_fs_saveFile(new_name, buffer);
+
+								var uri = mandreel_arrayBufferDataUri(0,buffer.byteLength,buffer);
+
+								image.src = uri;
+
+							}
+							else
+							{
+
+								Mandreel_TextureAsync_textures_loaded++;
+
+							}
+						}
+
+						packdata_request.send();
+
+					}
+				}
+				);
+			}
+			else if (mandreel_is_indexeddb())
+			{
+				image_src_valid = false;
+
+				var new_name = mandreel_texture_async_fix_name(full_name);
+				mandreel_indexedDB.load(new_name,function Mandreel_TextureAsync_Load_IDB(data) {
+					if (data)
+					{
+						 var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
+
+
+						// Create and revoke ObjectURL
+						imgURL = URL.createObjectURL(data);
+
+						image.src = imgURL;
+					}
+					else
+					{
+						var packdata_request = new XMLHttpRequest();
+
+						packdata_request.open("GET", full_name, true);
+
+						 packdata_request.responseType = "blob";
+
+
+
+						packdata_request.onreadystatechange = function()
+						{
+							if (packdata_request.readyState != 4) return;
+
+							if (packdata_request.status == 200)
+							{
+								var buffer=packdata_request.response;
+
+								 var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
+
+								// Create and revoke ObjectURL
+								imgURL = URL.createObjectURL(buffer);
+
+								image.src = imgURL;
+
+								mandreel_fs_saveFile(new_name, buffer);
+
+							}
+							else
+							{
+
+								Mandreel_TextureAsync_textures_loaded++;
+
+							}
+						}
+
+						packdata_request.send();
+					}
+
+				}
+				);
+			}
+			else
+				image_src = full_name;
+		}
+	}
+
+
+	if (image_src_valid)
+	{
+		setTimeout( function Mandreel_TextureAsync_Load_callback() {
+						image.src = image_src;
+					}, 1);
+	}
+}
+
+
+
+function __sandbox_OutputDebugString(sp)
+{
+	puts(sp);
+}
+
+
+
+
+var MANDREELCALLJS_TYPE_RETURN_VOID = 0;
+var MANDREELCALLJS_TYPE_INT = 1;
+var MANDREELCALLJS_TYPE_FLOAT =  2;
+var MANDREELCALLJS_TYPE_STRING =  3;
+var MANDREELCALLJS_TYPE_RETURN_INT =  4;
+var MANDREELCALLJS_TYPE_RETURN_FLOAT =  5;
+
+function MandreelInterWriteString(ptr, value)
+{
+	fill_ptr_from_string(ptr,value);
+}
+
+function MandreelInterWriteWString(ptr, value)
+{
+	fill_wptr_from_string(ptr, value);
+}
+
+function MandreelInterWriteFloat(ptr, value)
+{
+	heapFloat[ptr>>2] = value;
+}
+
+function MandreelPause()
+{
+	_imandreel_pause_game = true;
+}
+
+function MandreelResume()
+{
+	_imandreel_pause_game = false;
+}
+
+
+function MandreelLockFrame()
+{
+	assert(g_mandreel_frame_inframe == false, "calling lockframe during render frame");
+	assert(g_mandreel_frame_locked == false, "calling lockframe twice");
+	g_mandreel_frame_locked = true;
+
+	return g_stack_pointer+800*1024;
+}
+
+function MandreelUnlockFrame()
+{
+	assert(g_mandreel_frame_inframe == false);
+	g_mandreel_frame_locked = false;
+}
+
+
+function MandreelInterWriteInt(ptr, value)
+{
+	heap32[ptr>>2] = value;
+}
+
+function MandreelInterStringFromWPtr(ptr)
+{
+	return get_string_from_wptr(ptr);
+}
+
+function MandreelInterStringFromPtr(ptr)
+{
+	return get_string_from_ptr(ptr);
+}
+
+function mandreel_my_call_external_array(method, params)
+{
+	var result
+	var resultString;
+	try
+	{
+		switch(params.length)
+		{
+			case 1:
+				resultString = Mandreel_window[method](params[0]);
+				break;
+			case 2:
+				resultString = Mandreel_window[method](params[0],params[1]);
+				break;
+			case 3:
+				resultString = Mandreel_window[method](params[0],params[1],params[2]);
+				break;
+			case 4:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3]);
+				break;
+			case 5:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4]);
+				break;
+			case 6:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5]);
+				break;
+			case 7:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6]);
+				break;
+			case 8:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]);
+				break;
+			case 9:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]);
+				break;
+			case 10:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]);
+				break;
+			case 11:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]);
+				break;
+			case 12:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]);
+				break;
+			case 13:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]);
+				break;
+			case 14:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]);
+				break;
+			case 15:
+				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]);
+				break;
+			default:
+				assert(false);
+		}
+		result = 0;
+	} catch(e) { dump('error calling ' + method + '\n'); dump(e); result = 1;}
+
+	return [result,resultString];
+}
+
+
+function Mandreel_InterJS_Call(sp)
+{
+	var new_sp = sp;
+	var method_ptr = heap32[sp>>2];sp+=4;
+	var method = get_string_from_ptr(method_ptr);
+
+	var params = new Array();
+
+
+	params.push(new_sp);
+
+	var var_int;
+	var var_string;
+	var var_double;
+
+	var return_type;
+	var return_ptr;
+	while (true)
+	{
+		var my_type = heap32[sp>>2];sp+=4;
+
+
+		if (my_type == MANDREELCALLJS_TYPE_RETURN_VOID)
+		{
+			return_type = my_type;
+			break;
+		}
+		else if (my_type == MANDREELCALLJS_TYPE_INT)
+		{
+			var_int = heap32[sp>>2];
+
+			params.push(var_int);
+			sp+=4;
+		}
+		else if (my_type == MANDREELCALLJS_TYPE_FLOAT)
+		{
+			sp = (sp+7) & ~7;
+
+			var_double = llvm_readDouble(sp);
+
+			params.push(var_double);
+			sp+=8;
+		}
+		else if (my_type == MANDREELCALLJS_TYPE_STRING)
+		{
+			var_int = heap32[sp>>2];
+			var_string = get_string_from_ptr(var_int);
+
+			params.push(var_string);
+			sp+=4;
+		}
+		else if (my_type == MANDREELCALLJS_TYPE_RETURN_INT)
+		{
+			return_type = my_type;
+			return_ptr = heap32[sp>>2];
+			break;
+		}
+		else if (my_type == MANDREELCALLJS_TYPE_RETURN_FLOAT)
+		{
+			return_type = my_type;
+			return_ptr = heap32[sp>>2];
+			break;
+		}
+		else
+		{
+			assert(false, "invalid arguments calling Mandreel_InterJS_Call");
+		}
+	}
+
+	var result = mandreel_my_call_external_array(method,params);
+
+	r_g0 = result[0];
+
+
+	if (r_g0 == 0)
+	{
+		if (return_type == MANDREELCALLJS_TYPE_RETURN_INT)
+		{
+			heap32[return_ptr>>2] = result[1];
+		}
+		else if (return_type == MANDREELCALLJS_TYPE_RETURN_FLOAT)
+		{
+			heapFloat[return_ptr>>2] = result[1];
+		}
+
+	}
+}
+
+function iMandreelRegisterExternalCallback()
+{
+}
+
+function __mandreel_internal_CreateWindow()
+{
+}
+
+var __mandreel_async_calls_mandreel = [];
+var __mandreel_async_calls_js = [];
+
+
+function Mandreel_InterJS_AsyncCall(sp)
+{
+	var method_ptr = heap32[sp>>2];sp+=4;
+	var _func_name = get_string_from_ptr(method_ptr);
+	var param_ptr = heap32[sp>>2];sp+=4;
+	var _param = get_string_from_ptr(param_ptr);
+
+	__mandreel_async_calls_js.push({func_name:_func_name,param:_param});
+}
+
+
+
+
+function MandreelInterCallFunctionAsync(_func_name, _param)
+{
+	__mandreel_async_calls_mandreel.push({func_name:_func_name,param:_param});
+
+
+}
+
+function __mandreel_process_async_calls()
+{
+	if (__mandreel_async_calls_mandreel.length)
+	{
+		var temp_list = __mandreel_async_calls_mandreel.slice(0);
+
+		__mandreel_async_calls_mandreel = [];
+
+		for (var i=0;i<temp_list.length;++i)
+		{
+			var param = temp_list[i].param;
+			var func_name = temp_list[i].func_name;
+
+			var size = ((param.length + 1)+7)&0xFFFFFFF8;
+
+			var sp = g_stack_pointer+800*1024;
+
+			var str_ptr = sp - size;
+			fill_ptr_from_string(str_ptr,param);
+
+			sp = str_ptr - 4;
+			heap32[sp>>2] = str_ptr;
+
+			Mandreel_window[func_name](sp);
+		}
+	}
+
+	if (__mandreel_async_calls_js.length)
+	{
+		var temp_list = __mandreel_async_calls_js.slice(0);
+
+		__mandreel_async_calls_js = [];
+
+		for (var i=0;i<temp_list.length;++i)
+		{
+			var param = temp_list[i].param;
+			var func_name = temp_list[i].func_name;
+
+			Mandreel_window[func_name](param);
+
+		}
+	}
+}
+
+function mandreel_internal_isCanvas(sp)
+{
+	if ( mandreelAppPlatform == "canvas" )
+		r_g0 = 1;
+	else
+		r_g0 = 0;
+}
+
+function Mandreel_Device_SetFullScreen(sp)
+{
+	var enable = heap32[sp>>2];sp+=4;
+	mandreelAppFullscreen(enable);
+}
+
+var array_ids_ogl = [];
+
+var max_ogl_id = 8192;
+
+var array_ids_ogl_enable = [];
+var g_current_program_id = 0;
+
+
+var uniformArrays2 = [];
+var uniformArrays3 = [];
+var uniformArrays4 = [];
+var uniformArraysCreated = 0;
+var mandreel_draw_enable = true;
+
+
+if (typeof imandreel_gl=="undefined")
+{
+	alert('using old template, update code');
+}
+
+function myglCreateUniformArrays()
+{
+	if ( uniformArraysCreated == 0 )
+	{
+		for(var i=0; i<256;i++ )
+		{
+			uniformArrays2[i] = new Float32Array(i*2);
+			uniformArrays3[i] = new Float32Array(i*3);
+			uniformArrays4[i] = new Float32Array(i*4);
+		}
+		uniformArraysCreated = 1;
+	}
+}
+
+var my_super_id = 1;
+function myglNewSlot()
+{
+	//var id = array_ids_ogl_enable.pop();
+	var id = my_super_id;
+	my_super_id++;
+	return id;
+}
+
+function myglFreeSlot(id)
+{
+	//array_ids_ogl_enable.push(id);
+}
+
+
+function myglCreateProgram(sp)
+{
+	var id = myglNewSlot();
+	var program = imandreel_gl.createProgram();
+
+	program.uniform_locations_current_id = 0;
+	program.array_uniform_locations = [];
+
+	array_ids_ogl[id] = program;
+
+
+	r_g0 = id;
+}
+
+function myglCreateShader(sp)
+{
+	var type = heap32[sp>>2];sp+=4;
+	var id = myglNewSlot();
+
+	array_ids_ogl[id] = imandreel_gl.createShader(type);
+
+	r_g0 = id;
+}
+
+function myglAttachShader(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var shader_id = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.attachShader(array_ids_ogl[program_id], array_ids_ogl[shader_id]);
+}
+
+function myglBindAttribLocation(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var index = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var string = get_string_from_ptr(ptr_string);
+
+	imandreel_gl.bindAttribLocation(array_ids_ogl[program_id], index, string);
+}
+
+function myglLinkProgram(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.linkProgram(array_ids_ogl[program_id]);
+}
+
+function myglShaderSource(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var shader = array_ids_ogl[id];
+
+	var shader_code = get_string_from_ptr(ptr_string);
+
+	//dump(shader_code);
+
+
+	imandreel_gl.shaderSource(shader, shader_code);
+}
+
+
+function myglDrawArrays(sp)
+{
+	var mode = heap32[sp>>2];sp+=4;
+	var first = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+
+	if (mandreel_draw_enable)
+		imandreel_gl.drawArrays(mode, first, count);
+
+
+	//dump('draw arrays ' + mode + ' ' + first + ' ' + count + '\n');
+ }
+
+function myglDrawElements(sp)
+{
+	var mode = heapU32[sp>>2]; sp+=4;
+	var count = heapU32[sp>>2]; sp+=4;
+	var type = heapU32[sp>>2]; sp+=4;
+	var offset = heapU32[sp>>2]; sp+=4;
+
+
+	if (mandreel_draw_enable)
+		imandreel_gl.drawElements(mode, count, type, offset);
+
+
+
+}
+
+function myglCreateTexture(sp)
+{
+	var id = myglNewSlot();
+	array_ids_ogl[id] = imandreel_gl.createTexture();
+
+	r_g0 = id;
+}
+
+function myglCreateRenderBuffer(sp) {
+	var id = myglNewSlot();
+    array_ids_ogl[id] = imandreel_gl.createRenderbuffer();
+
+    r_g0 = id;
+}
+
+function myglCreateFrameBuffer(sp) {
+	var id = myglNewSlot();
+    array_ids_ogl[id] = imandreel_gl.createFramebuffer();
+
+    r_g0 = id;
+}
+
+function myglBindFramebuffer(sp)
+{
+    var target = heap32[sp >> 2]; sp += 4;
+    var framebuffer_id = heap32[sp >> 2]; sp += 4;
+
+	if (framebuffer_id != 0)
+	{
+		var framebuffer = array_ids_ogl[framebuffer_id];
+		imandreel_gl.bindFramebuffer(target,framebuffer);
+	}
+	else
+		imandreel_gl.bindFramebuffer(target,null);
+
+}
+
+function myglBindRenderbuffer(sp)
+{
+    var target = heap32[sp >> 2]; sp += 4;
+    var renderbuffer_id = heap32[sp >> 2]; sp += 4;
+
+    var renderbuffer = array_ids_ogl[renderbuffer_id];
+
+    imandreel_gl.bindRenderbuffer(target,renderbuffer);
+
+}
+
+
+function myglRenderbufferStorage(sp) {
+    var target = heap32[sp >> 2]; sp += 4;
+    var internalformat = heap32[sp >> 2]; sp += 4;
+    var witdth = heap32[sp >> 2]; sp += 4;
+    var height = heap32[sp >> 2]; sp += 4;
+
+    imandreel_gl.renderbufferStorage(target, internalformat, witdth, height);
+
+}
+
+function myglFramebufferRenderbuffer (sp)
+{
+  var target = heap32[sp>>2];sp+=4;
+  var attachment = heap32[sp>>2];sp+=4;
+  var renderbuffertarget = heap32[sp>>2];sp+=4;
+  var renderbuffer_id = heap32[sp>>2];sp+=4;
+
+    var renderbuffer = array_ids_ogl[renderbuffer_id];
+
+    imandreel_gl.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
+
+}
+
+function myglFramebufferTexture2D (sp)
+{
+  var target = heap32[sp>>2];sp+=4;
+  var attachment = heap32[sp>>2];sp+=4;
+  var textarget = heap32[sp>>2];sp+=4;
+  var texture_id = heap32[sp>>2];sp+=4;
+  var level = heap32[sp>>2];sp+=4;
+
+  var texture = array_ids_ogl[texture_id];
+
+  imandreel_gl.framebufferTexture2D(target, attachment, textarget, texture, level);
+
+
+}
+
+function myglTexImage2D(sp)
+ {
+  var target = heap32[sp>>2];sp+=4;
+  var level = heap32[sp>>2];sp+=4;
+  var internalFormat = heap32[sp>>2];sp+=4;
+  var width = heap32[sp>>2];sp+=4;
+  var height = heap32[sp>>2];sp+=4;
+  var border = heap32[sp>>2];sp+=4;
+  var format = heap32[sp>>2];sp+=4;
+  var type = heap32[sp>>2];sp+=4;
+  var data = heap32[sp>>2];sp+=4;
+
+  if (level>0 && target==imandreel_gl.TEXTURE_2D)
+	return;
+
+   if (data == 0)
+  {
+	//imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, null);
+	var buffer;
+	var bufferView;
+
+	if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
+    {
+		buffer = new ArrayBuffer(width*height*2);
+		bufferView = new Uint16Array(buffer);
+	}
+	else
+	{
+		var size;
+		if (format == imandreel_gl.LUMINANCE)
+			size = width*height;
+		else if (format == imandreel_gl.RGB)
+			size = width*height*3;
+		else if (format == imandreel_gl.RGBA)
+			size = width*height*4;
+		else if (format == imandreel_gl.ALPHA)
+			size = width*height;
+		else if (format == imandreel_gl.LUMINANCE_ALPHA)
+			size = width*height*2;
+
+		buffer = new ArrayBuffer(size);
+		bufferView = new Uint8Array(buffer);
+	}
+
+	imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, bufferView);
+	return;
+  }
+
+
+  	var bufferView;
+   if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
+   {
+		bufferView = new Uint16Array(heap,data,width*height);
+	}
+	else if (type == imandreel_gl.UNSIGNED_BYTE)
+	{
+		if (format == imandreel_gl.LUMINANCE)
+			bufferView = new Uint8Array(heap,data,width*height);
+		else if (format == imandreel_gl.RGB)
+			bufferView = new Uint8Array(heap,data,width*height*3);
+		else if (format == imandreel_gl.RGBA)
+			bufferView = new Uint8Array(heap,data,width*height*4);
+		else if (format == imandreel_gl.ALPHA)
+			bufferView = new Uint8Array(heap,data,width*height);
+		else if (format == imandreel_gl.LUMINANCE_ALPHA)
+			bufferView = new Uint8Array(heap,data,width*height*2);
+		else
+		{
+			dump('format unknown ' + format + '\n');
+			assert(false);
+		}
+	}
+	else
+	{
+	dump('type unknown ' + type + '\n');
+		assert(false);
+	}
+
+  imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, bufferView);
+  if ((width&(width-1))==0 && (height&(height-1))==0)
+  {
+    if (target==imandreel_gl.TEXTURE_2D)
+	imandreel_gl.generateMipmap(target);
+}
+ }
+  function myglStencilFunc(sp)
+  {
+  var func = heap32[sp>>2];sp+=4;
+  var ref = heap32[sp>>2];sp+=4;
+  var mask = heap32[sp>>2];sp+=4;
+
+  imandreel_gl.stencilFunc(func, ref, mask);
+  }
+
+  function myglStencilFuncSeparate(sp)
+  {
+  var face = heap32[sp>>2];sp+=4;
+  var func = heap32[sp>>2];sp+=4;
+  var ref = heap32[sp>>2];sp+=4;
+  var mask = heap32[sp>>2];sp+=4;
+
+  imandreel_gl.stencilFuncSeparate(face,func,ref,mask);
+  }
+
+  function myglStencilMaskSeparate(sp)
+  {
+  var face = heap32[sp>>2];sp+=4;
+   var mask = heap32[sp>>2];sp+=4;
+
+   imandreel_gl.stencilMaskSeparate(face,mask);
+  }
+
+  function myglStencilMask(sp)
+  {
+   var mask = heap32[sp>>2];sp+=4;
+
+   imandreel_gl.stencilMask(mask);
+  }
+  function myglStencilOp (sp)
+  {
+   var fail = heap32[sp>>2];sp+=4;
+  var zfail = heap32[sp>>2];sp+=4;
+   var zpass = heap32[sp>>2];sp+=4;
+
+  imandreel_gl.stencilOp(fail, zfail, zpass);
+  }
+
+  function myglStencilOpSeparate (sp)
+  {
+  var face = heap32[sp>>2];sp+=4;
+   var fail = heap32[sp>>2];sp+=4;
+  var zfail = heap32[sp>>2];sp+=4;
+   var zpass = heap32[sp>>2];sp+=4;
+
+  imandreel_gl.stencilOpSeparate(face, fail, zfail, zpass);
+  }
+
+ function myglTexSubImage2D(sp)
+ {
+  var target = heap32[sp>>2];sp+=4;
+  var level = heap32[sp>>2];sp+=4;
+  var xoffset = heap32[sp>>2];sp+=4;
+  var yoffset = heap32[sp>>2];sp+=4;
+  var width = heap32[sp>>2];sp+=4;
+  var height = heap32[sp>>2];sp+=4;
+  var format = heap32[sp>>2];sp+=4;
+  var type = heap32[sp>>2];sp+=4;
+  var data = heap32[sp>>2];sp+=4;
+
+
+
+  	var bufferView;
+   if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
+   {
+		bufferView = new Uint16Array(heap,data,width*height);
+	}
+	else if (type == imandreel_gl.UNSIGNED_BYTE)
+	{
+		if (format == imandreel_gl.LUMINANCE)
+			bufferView = new Uint8Array(heap,data,width*height);
+		else if (format == imandreel_gl.RGB)
+			bufferView = new Uint8Array(heap,data,width*height*3);
+		else if (format == imandreel_gl.RGBA)
+			bufferView = new Uint8Array(heap,data,width*height*4);
+		else if (format == imandreel_gl.ALPHA)
+			bufferView = new Uint8Array(heap,data,width*height);
+	}
+
+  imandreel_gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, bufferView);
+ }
+
+
+  function myglCreateBuffer(sp)
+{
+	var id = myglNewSlot();
+	array_ids_ogl[id] = imandreel_gl.createBuffer();
+
+	r_g0 = id;
+}
+
+var glBufferDataArray = [];
+
+function myglBufferData(sp)
+{
+	var target = heapU32[sp>>2]; sp+=4;
+	var size = heapU32[sp>>2]; sp+=4;
+	var data = heapU32[sp>>2]; sp+=4;
+	var usage = heapU32[sp>>2]; sp+=4;
+
+	if (data == 0)
+		imandreel_gl.bufferData(target, size, usage);
+	else
+	{
+		if (usage == imandreel_gl.STATIC_DRAW || true)
+		{
+			var buffer_data = new Int8Array(heap, data, size);
+			imandreel_gl.bufferData(target, buffer_data, usage);
+		}
+		else
+		{
+			var new_size = size/4;
+			var buffer_data = glBufferDataArray[new_size];
+
+			if (buffer_data == null)
+			{
+				buffer_data =  new Int32Array(new_size);
+				glBufferDataArray[new_size] = buffer_data;
+			}
+
+			var new_data = data>>2;
+
+			for ( var i = 0 ; i < new_size ; ++i )
+			{
+				buffer_data[i] = heap32[new_data+i];
+			}
+
+			imandreel_gl.bufferData(target, buffer_data, usage);
+		}
+	}
+}
+
+function myglBufferSubData(sp)
+{
+	var target = heapU32[sp>>2]; sp+=4;
+	var offset = heapU32[sp>>2]; sp+=4;
+	var size = heapU32[sp>>2]; sp+=4;
+	var data = heapU32[sp>>2]; sp+=4;
+
+
+	var buffer_data = new Int8Array(heap, data, size);
+	imandreel_gl.bufferSubData(target, offset, buffer_data);
+
+//	dump('buffer sub data ' + offset + ' ' + size + ' ' + data + '\n')
+
+}
+
+
+function myglBindBuffer(sp)
+{
+	var target = heapU32[sp>>2]; sp+=4;
+	var id = heapU32[sp>>2]; sp+=4;
+
+	imandreel_gl.bindBuffer(target, array_ids_ogl[id]);
+}
+
+
+function myglUseProgram(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+
+	g_current_program_id = program_id;
+
+	imandreel_gl.useProgram(array_ids_ogl[program_id]);
+
+}
+
+function myglDisableVertexAttribArray(sp)
+{
+	var idx = heapU32[sp>>2];sp+=4;
+	imandreel_gl.disableVertexAttribArray(idx);
+}
+function myglEnableVertexAttribArray(sp)
+{
+	var idx = heapU32[sp>>2];sp+=4;
+	imandreel_gl.enableVertexAttribArray(idx);
+}
+
+function myglVertexAttribPointer(sp)
+{
+	var idx = heapU32[sp>>2];sp+=4;
+	var size = heapU32[sp>>2];sp+=4;
+	var type = heapU32[sp>>2];sp+=4;
+	var normalized = heapU32[sp>>2];sp+=4;
+	var stride = heapU32[sp>>2];sp+=4;
+	var ptr = heapU32[sp>>2];sp+=4;
+
+	//dump(idx + ' ' + size + ' ' + type + ' ' + normalized + ' ' + stride + ' ' + ptr + '\n');
+
+
+	imandreel_gl.vertexAttribPointer(idx, size, type, normalized, stride, ptr);
+}
+
+function myglPolygonOffset(sp)
+{
+	var factor = heapFloat[sp>>2]; sp+=4;
+	var units = heapFloat[sp>>2]; sp+=4;
+	imandreel_gl.polygonOffset(factor, units);
+}
+
+function myglEnable(sp)
+ {
+	var value = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.enable(value);
+  }
+
+function myglDisable(sp)
+ {
+	var value = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.disable(value);
+  }
+
+  function myglDepthFunc(sp)
+  {
+	var func = heapU32[sp>>2];sp+=4;
+
+	imandreel_gl.depthFunc(func);
+
+  }
+
+  function myglGenerateMipmap(sp)
+  {
+	var texture_type = heap32[sp>>2];sp+=4;
+	imandreel_gl.generateMipmap(texture_type);
+  }
+
+  function myglPixelStorei (sp)
+  {
+	var pname = heap32[sp>>2];sp+=4;
+	var param = heap32[sp>>2];sp+=4;
+	imandreel_gl.pixelStorei(pname,param);
+  }
+
+
+  function myglBindTexture(sp)
+  {
+  var texture_type = heap32[sp>>2];sp+=4;
+  var texture_id = heap32[sp>>2];sp+=4;
+
+if (texture_id == 0)
+{
+	imandreel_gl.bindTexture(texture_type, null);
+}
+else
+{
+	var tex = array_ids_ogl[texture_id];
+	imandreel_gl.bindTexture(texture_type, tex);
+	}
+
+  }
+
+  function myglActiveTexture(sp)
+{
+	var param = heapU32[sp>>2];sp+=4;
+	imandreel_gl.activeTexture(param);
+}
+
+function myglCompileShader(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+
+	var shader = array_ids_ogl[id];
+
+	imandreel_gl.compileShader(shader);
+}
+
+function myglGetUniformLocation(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var string = get_string_from_ptr(ptr_string);
+	var program = array_ids_ogl[program_id];
+	var result = imandreel_gl.getUniformLocation(program, string);
+
+	if (result != null)
+	{
+		program.array_uniform_locations[program.uniform_locations_current_id] = result;
+		r_g0 = program.uniform_locations_current_id;
+		program.uniform_locations_current_id++;
+	}
+	else
+		r_g0 = -1;
+}
+
+function myglIsEnabled(sp)
+{
+	var cap = heap32[sp>>2];sp+=4;
+
+	r_g0 = imandreel_gl.isEnabled(cap);
+}
+
+
+function myglUniform1i(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var value = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform1i(uniform_value, value);
+}
+
+function myglUniform2i(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heap32[sp>>2];sp+=4;
+	var y = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform2i(uniform_value, x,y);
+}
+
+function myglUniform3i(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heap32[sp>>2];sp+=4;
+	var y = heap32[sp>>2];sp+=4;
+	var z = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform3i(uniform_value, x,y,z);
+}
+
+function myglUniform4i(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heap32[sp>>2];sp+=4;
+	var y = heap32[sp>>2];sp+=4;
+	var z = heap32[sp>>2];sp+=4;
+	var w = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform4i(uniform_value, x,y,z,w);
+}
+
+function myglUniform1f(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var value = heapFloat[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform1f(uniform_value, value);
+}
+
+function myglUniform3f(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+	var z = heapFloat[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform3f(uniform_value, x,y,z);
+}
+
+function myglUniform2f(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform2f(uniform_value, x,y);
+}
+
+
+function myglUniform4f(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+	var z = heapFloat[sp>>2];sp+=4;
+	var w = heapFloat[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+
+	imandreel_gl.uniform4f(uniform_value, x,y,z,w);
+}
+
+function myglUniform1fv(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count;
+	var bufferView = new Float32Array(new_count);
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heapFloat[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform1fv(uniform_value, bufferView);
+
+
+}
+
+function myglUniform1iv(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count;
+	var bufferView = new Int32Array(new_count);
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heap32[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform1iv(uniform_value, bufferView);
+}
+
+function myglUniform2iv(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count*2;
+	var bufferView = new Int32Array(new_count);
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heap32[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform2iv(uniform_value, bufferView);
+}
+
+function myglUniform3iv(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count*3;
+	var bufferView = new Int32Array(new_count);
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heap32[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform3iv(uniform_value, bufferView);
+}
+
+function myglUniform4iv(sp)
+{
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count*4;
+	var bufferView = new Int32Array(new_count);
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heap32[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform4iv(uniform_value, bufferView);
+}
+
+
+
+function myglUniform3fv(sp)
+{
+	myglCreateUniformArrays();
+
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+	var new_data = data>>2;
+	var new_count = count*3;
+	var bufferView = uniformArrays3[count];
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heapFloat[new_data+i];
+	}
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform3fv(uniform_value, bufferView);
+}
+
+function myglUniform2fv(sp)
+{
+	myglCreateUniformArrays();
+
+    var index = heap32[sp >> 2]; sp += 4;
+    var count = heap32[sp >> 2]; sp += 4;
+    var data = heap32[sp >> 2]; sp += 4;
+
+	var new_data = data>>2;
+	var new_count = count*2;
+	var bufferView = uniformArrays2[count];
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heapFloat[new_data+i];
+	}
+
+
+	var program = array_ids_ogl[g_current_program_id];
+    var uniform_value = program.array_uniform_locations[index];
+    imandreel_gl.uniform2fv(uniform_value, bufferView);
+}
+
+
+function myglUniform4fv(sp)
+{
+	myglCreateUniformArrays();
+
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var data = heap32[sp>>2];sp+=4;
+
+
+	var new_data = data>>2;
+	var new_count = count*4;
+	var bufferView = uniformArrays4[count];
+
+	for ( var i = 0 ; i < new_count ; ++i )
+	{
+		bufferView[i] = heapFloat[new_data+i];
+	}
+
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+	imandreel_gl.uniform4fv(uniform_value, bufferView);
+}
+
+
+function myglUniformMatrix4fv(sp)
+{
+	myglCreateUniformArrays();
+
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var transpose = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+
+	//var buffer_data = new Float32Array(heap, ptr, count*16);
+	for ( var i = 0 ; i < count*16 ; ++i )
+	{
+		uniformArrays4[count*4][i] = heapFloat[(ptr>>2)+i];
+	}
+
+	//imandreel_gl.uniformMatrix4fv(uniform_value, transpose, buffer_data);
+	//imandreel_gl.uniformMatrix4fv(uniform_value, transpose, heapFloat.subarray(ptr/4,(ptr/4)+(count*16)));
+	imandreel_gl.uniformMatrix4fv(uniform_value, transpose, uniformArrays4[count*4]);
+}
+
+function myglUniformMatrix3fv(sp)
+{
+	myglCreateUniformArrays();
+
+	var index = heap32[sp>>2];sp+=4;
+	var count = heap32[sp>>2];sp+=4;
+	var transpose = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[g_current_program_id];
+	var uniform_value = program.array_uniform_locations[index];
+
+	//var buffer_data = new Float32Array(heap, ptr, count*9);
+	for ( var i = 0 ; i < count*9 ; ++i )
+	{
+		uniformArrays3[count*3][i] = heapFloat[(ptr>>2)+i];
+	}
+
+	//imandreel_gl.uniformMatrix3fv(uniform_value, transpose, buffer_data);
+	//imandreel_gl.uniformMatrix3fv(uniform_value, transpose, heapFloat.subarray(ptr/4,(ptr/4)+(count*9)));
+	imandreel_gl.uniformMatrix3fv(uniform_value, transpose, uniformArrays3[count*3]);
+}
+
+
+
+function myglValidateProgram(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.validateProgram(array_ids_ogl[program_id]);
+}
+
+function myglGetAttribLocation(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var string = get_string_from_ptr(ptr_string);
+	var result = imandreel_gl.getAttribLocation(array_ids_ogl[program_id], string);
+
+	r_g0 = result;
+}
+
+function myglGetProgramInfoLogLength(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+
+	var info_log = imandreel_gl.getProgramInfoLog(array_ids_ogl[program_id]);
+
+	if (info_log)
+		r_g0 = info_log.length+1;
+	else
+		r_g0 = 0;
+}
+
+
+function myglGetProgramInfoLog(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var info_log = imandreel_gl.getProgramInfoLog(array_ids_ogl[program_id]);
+
+	fill_ptr_from_string(ptr_string, info_log);
+}
+
+function myglGetShaderInfoLogLength(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+
+	var info_log = imandreel_gl.getShaderInfoLog(array_ids_ogl[program_id]);
+
+	if (info_log)
+		r_g0 = info_log.length+1;
+	else
+		r_g0 = 0;
+}
+
+function myglGetShaderInfoLog(sp)
+{
+	var program_id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+
+	var info_log = imandreel_gl.getShaderInfoLog(array_ids_ogl[program_id]);
+
+	fill_ptr_from_string(ptr_string, info_log);
+}
+
+function myglViewport(sp) {
+    var x = heap32[sp >> 2]; sp += 4;
+    var y = heap32[sp >> 2]; sp += 4;
+    var width = heap32[sp >> 2]; sp += 4;
+    var height = heap32[sp >> 2]; sp += 4;
+
+    imandreel_gl.viewport(x,y,width,height);
+
+}
+
+function myglScissor(sp)
+{
+    var x = heap32[sp >> 2]; sp += 4;
+    var y = heap32[sp >> 2]; sp += 4;
+    var width = heap32[sp >> 2]; sp += 4;
+    var height = heap32[sp >> 2]; sp += 4;
+
+    imandreel_gl.scissor(x,y,width,height);
+}
+
+
+
+function myglClearColor(sp)
+{
+  var r = heapFloat[sp>>2];sp+=4;
+  var g = heapFloat[sp>>2];sp+=4;
+  var b = heapFloat[sp>>2];sp+=4;
+  var a = heapFloat[sp>>2];sp+=4;
+
+  imandreel_gl.clearColor(r,g,b,a);
+
+
+}
+
+function myglClearStencil(sp)
+{
+	var stencil = heap32[sp>>2];sp+=4;
+	imandreel_gl.clearStencil(stencil);
+}
+
+
+function myglClearDepthf(sp)
+{
+	var depth = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.clearDepth(depth);
+}
+
+function myglClear(sp)
+  {
+  var mask = heap32[sp>>2];sp+=4;
+
+
+  //dump('clear ' + mask + '\n');
+	if (mandreel_draw_enable)
+		imandreel_gl.clear(mask);
+  }
+
+  function myglGetError(sp)
+  {
+//	r_g0 = imandreel_gl.getError();
+	r_g0 = 0;
+  }
+
+  function myglGetProgramParameter(sp)
+  {
+	var program_id = heap32[sp>>2];sp+=4;
+	var pname = heap32[sp>>2];sp+=4;
+
+	r_g0 = imandreel_gl.getProgramParameter(array_ids_ogl[program_id], pname);
+  }
+
+  function myglGetActiveAttrib (sp)
+  {
+	var program_id = heap32[sp>>2];sp+=4;
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+
+	 var result = imandreel_gl.getActiveAttrib(array_ids_ogl[program_id], index);
+
+	 if (result != null)
+	 {
+		heap32[(ptr)>>2] = result.size;
+		heap32[(ptr+4)>>2] = result.type;
+		fill_ptr_from_string(ptr+8, result.name);
+		r_g0 = 0;
+	}
+	else
+	   r_g0 = 1;
+  }
+
+    function myglGetActiveUniform (sp)
+  {
+	var program_id = heap32[sp>>2];sp+=4;
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+
+	 var result = imandreel_gl.getActiveUniform(array_ids_ogl[program_id], index);
+
+	 if (result != null)
+	 {
+		heap32[(ptr)>>2] = result.size;
+		heap32[(ptr+4)>>2] = result.type;
+		fill_ptr_from_string(ptr+8, result.name);
+		r_g0 = 0;
+	}
+	else
+	   r_g0 = 1;
+  }
+
+  function myglTexParameterf (sp)
+  {
+	var target = heap32[sp>>2];sp+=4;
+	var pname = heap32[sp>>2];sp+=4;
+	var value = heapFloat[sp>>2];sp+=4;
+
+	imandreel_gl.texParameterf(target,pname,value);
+}
+
+function myglTexParameteri (sp)
+  {
+	var target = heap32[sp>>2];sp+=4;
+	var pname = heap32[sp>>2];sp+=4;
+	var value = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.texParameteri(target,pname,value);
+}
+
+function myglCullFace (sp)
+ {
+	var mode = heap32[sp>>2];sp+=4;
+	imandreel_gl.cullFace(mode);
+ }
+
+ function myglDepthMask (sp)
+ {
+	var flag = heap32[sp>>2];sp+=4;
+	imandreel_gl.depthMask(flag);
+ }
+
+ function myglDepthRangef (sp)
+ {
+	var zNear = heapFloat[sp>>2];sp+=4;
+	var zFar = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.depthRange(zNear, zFar);
+ }
+
+function myglFrontFace (sp)
+ {
+	var mode = heap32[sp>>2];sp+=4;
+	imandreel_gl.frontFace(mode);
+ }
+
+ function myglBlendFunc (sp)
+ {
+	var sfactor = heap32[sp>>2];sp+=4;
+	var dfactor = heap32[sp>>2];sp+=4;
+	imandreel_gl.blendFunc(sfactor,dfactor);
+ }
+
+ function myglBlendColor(sp)
+ {
+	var red = heapFloat[sp>>2];sp+=4;
+	var green = heapFloat[sp>>2];sp+=4;
+	var blue = heapFloat[sp>>2];sp+=4;
+	var alpha = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.blendColor(red,green,blue,alpha);
+ }
+
+ function myglBlendEquation(sp)
+ {
+	var mode = heap32[sp>>2];sp+=4;
+	imandreel_gl.blendEquation(mode);
+ }
+
+ function myglBlendEquationSeparate(sp)
+ {
+	var modeRGB = heap32[sp>>2];sp+=4;
+	var modeAlpha = heap32[sp>>2];sp+=4;
+	imandreel_gl.blendEquationSeparate(modeRGB,modeAlpha);
+ }
+
+ function myglBlendFuncSeparate(sp)
+ {
+	var srcRGB = heap32[sp>>2];sp+=4;
+	var dstRGB = heap32[sp>>2];sp+=4;
+	var srcAlpha = heap32[sp>>2];sp+=4;
+	var dstAlpha = heap32[sp>>2];sp+=4;
+
+	imandreel_gl.blendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha);
+ }
+
+
+ function myglColorMask (sp)
+ {
+	var red = heap32[sp>>2];sp+=4;
+	var green = heap32[sp>>2];sp+=4;
+	var blue = heap32[sp>>2];sp+=4;
+	var alpha = heap32[sp>>2];sp+=4;
+	imandreel_gl.colorMask(red,green,blue,alpha);
+ }
+
+ function removeByElement(arrayName,arrayElement)
+ {
+    for(var i=0; i<arrayName.length;i++ )
+     {
+        if(arrayName[i]==arrayElement)
+		{
+            arrayName.splice(i,1);
+			return;
+		}
+      }
+  }
+
+
+ function mygetParameter(sp)
+ {
+	var pname = heap32[sp>>2];sp+=4;
+	r_g0 = imandreel_gl.getParameter(pname);
+ }
+
+
+ function mygetProgramParameter(sp)
+ {
+ 	var program_id = heap32[sp>>2];sp+=4;
+	var pname = heap32[sp>>2];sp+=4;
+	r_g0 = imandreel_gl.getProgramParameter(array_ids_ogl[program_id], pname);
+ }
+
+ function mygetShaderParameter(sp)
+ {
+ 	var shader_id = heap32[sp>>2];sp+=4;
+	var pname = heap32[sp>>2];sp+=4;
+	r_g0 = imandreel_gl.getShaderParameter(array_ids_ogl[shader_id], pname);
+ }
+
+ function myglVertexAttrib1f(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.vertexAttrib1f(index,x);
+ }
+
+  function myglVertexAttrib2f(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.vertexAttrib2f(index,x,y);
+ }
+
+  function myglVertexAttrib3f(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+	var z = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.vertexAttrib3f(index,x,y,z);
+ }
+
+  function myglVertexAttrib4f(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var x = heapFloat[sp>>2];sp+=4;
+	var y = heapFloat[sp>>2];sp+=4;
+	var z = heapFloat[sp>>2];sp+=4;
+	var w = heapFloat[sp>>2];sp+=4;
+	imandreel_gl.vertexAttrib4f(index,x,y,z,w);
+ }
+
+ function myglVertexAttrib1fv(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+	var x = heap32[ptr>>2];ptr+=4;
+	imandreel_gl.vertexAttrib1f(index,x);
+ }
+
+ function myglVertexAttrib2fv(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+	var x = heap32[ptr>>2];ptr+=4;
+	var y = heap32[ptr>>2];ptr+=4;
+
+	imandreel_gl.vertexAttrib2f(index,x,y);
+ }
+
+ function myglVertexAttrib3fv(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+	var x = heap32[ptr>>2];ptr+=4;
+	var y = heap32[ptr>>2];ptr+=4;
+	var z = heap32[ptr>>2];ptr+=4;
+
+	imandreel_gl.vertexAttrib3f(index,x,y,z);
+ }
+
+ function myglVertexAttrib4fv(sp)
+ {
+	var index = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+	var x = heap32[ptr>>2];ptr+=4;
+	var y = heap32[ptr>>2];ptr+=4;
+	var z = heap32[ptr>>2];ptr+=4;
+	var w = heap32[ptr>>2];ptr+=4;
+
+	imandreel_gl.vertexAttrib4f(index,x,y,z,w);
+ }
+
+
+ function myglDeleteTexture (sp)
+ {
+
+	var texture_id = heap32[sp>>2];sp+=4;
+
+	var texture = array_ids_ogl[texture_id];
+
+	imandreel_gl.deleteTexture(texture);
+
+	array_ids_ogl[texture_id] = null;
+
+	myglFreeSlot(texture_id);
+ }
+
+ function myglDeleteBuffer (sp)
+ {
+
+	var buffer_id = heap32[sp>>2];sp+=4;
+
+	var buffer = array_ids_ogl[buffer_id];
+
+	imandreel_gl.deleteBuffer(buffer);
+
+	array_ids_ogl[buffer_id] = null;
+
+	myglFreeSlot(buffer_id);
+ }
+
+ function myglDeleteFrameBuffer (sp)
+ {
+	var framebuffer_id = heap32[sp>>2];sp+=4;
+
+	var framebuffer = array_ids_ogl[framebuffer_id];
+
+	imandreel_gl.deleteFramebuffer(framebuffer);
+
+	array_ids_ogl[framebuffer_id] = null;
+
+	myglFreeSlot(framebuffer_id);
+ }
+
+
+ function myglDeleteProgram (sp)
+ {
+	var program_id = heap32[sp>>2];sp+=4;
+
+	var program = array_ids_ogl[program_id];
+
+	imandreel_gl.deleteProgram(program);
+
+	array_ids_ogl[program_id] = null;
+
+	myglFreeSlot(program_id);
+ }
+
+ function myglDeleteRenderBuffer (sp)
+ {
+	var renderbuffer_id = heap32[sp>>2];sp+=4;
+
+	var renderbuffer = array_ids_ogl[renderbuffer_id];
+
+	imandreel_gl.deleteRenderbuffer(renderbuffer);
+
+	array_ids_ogl[renderbuffer_id] = null;
+
+	myglFreeSlot(renderbuffer_id);
+ }
+
+ function myglDeleteShader (sp)
+ {
+	var shader_id = heap32[sp>>2];sp+=4;
+
+	var shader = array_ids_ogl[shader_id];
+
+	imandreel_gl.deleteShader(shader);
+
+	array_ids_ogl[shader_id] = null;
+
+	myglFreeSlot(shader_id);
+ }
+
+ function myglInit(sp)
+ {
+
+	for (var i=0;i<max_ogl_id;++i)
+	{
+		array_ids_ogl_enable.push(i+1);
+	}
+ }
+
+ function myglReadPixels(sp)
+ {
+  var x = heap32[sp>>2];sp+=4;
+  var y = heap32[sp>>2];sp+=4;
+  var width = heap32[sp>>2];sp+=4;
+  var height = heap32[sp>>2];sp+=4;
+  var format = heap32[sp>>2];sp+=4;
+  var type = heap32[sp>>2];sp+=4;
+  var pixels = heap32[sp>>2];sp+=4;
+
+	var bufferView = new Uint8Array(heap,pixels,width*height*4);
+  imandreel_gl.readPixels(x,y,width,height,format,type,bufferView);
+}
+
+function mandreel_internal_DrawSprite(sp)
+{
+	if ( imandreel_ctx_canvas == null )
+	{
+		console.log("Mandreel_2D_DrawSprite error: canvas context is null");
+		return;
+	}
+
+	var hw_id = heap32[sp>>2]; sp+=4;
+	var u0 = heapFloat[sp>>2]; sp+=4;
+	var u1 = heapFloat[sp>>2]; sp+=4;
+	var v0 = heapFloat[sp>>2]; sp+=4;
+	var v1 = heapFloat[sp>>2]; sp+=4;
+	//var x = heapFloat[sp>>2]; sp+=4;
+	//var y = heapFloat[sp>>2]; sp+=4;
+	var sx = heapFloat[sp>>2]; sp+=4;
+	var sy = heapFloat[sp>>2]; sp+=4;
+	//var rot = heapFloat[sp>>2]; sp+=4;
+	var m11 = heapFloat[sp>>2]; sp+=4;
+	var m12 = heapFloat[sp>>2]; sp+=4;
+	var m21 = heapFloat[sp>>2]; sp+=4;
+	var m22 = heapFloat[sp>>2]; sp+=4;
+	var tx = heapFloat[sp>>2]; sp+=4;
+	var ty = heapFloat[sp>>2]; sp+=4;
+	var color = heap32[sp>>2]; sp+=4;
+
+	//ctx_canvas.fillStyle="#FF0000";
+	//ctx_canvas.fillRect(tx,ty,sx,sy);
+	var texture = array_ids_ogl[hw_id];
+
+	if ( texture == null )
+	{
+		console.log("Mandreel_2D_DrawSprite error: texture invalid ("+hw_id+") or loading yet...");
+		return;
+	}
+
+	var width = (u1-u0)*texture.width;
+	var height = (v1-v0)*texture.height;
+
+	if (width == 0)
+		return;
+	if (height == 0)
+		return;
+
+	var x_offset = u0*texture.width;
+	var y_offset = v0*texture.height;
+
+	//dump(x_offset + ' ' + y_offset + ' ' + texture.width + ' ' + texture.height + ' ' + x + ' ' +y + ' ' + width + ' ' + height + '\n');
+
+	x_offset = x_offset % texture.width;
+	y_offset = y_offset % texture.height;
+
+	var scale_x, scale_y;
+	if (sx<0)
+		scale_x = -1;
+	else
+		scale_x = 1;
+	if (sy<0)
+		scale_y = -1;
+	else
+		scale_y = 1;
+
+	var simple_draw = false;//scale_x == 1 && scale_y == 1 && rot == 0;
+	var x_pos = (0.5*sx + tx/* + 240*/);
+	var y_pos = (/*320*/ + ((0.5*sy + ty) /*+ 160*/));
+	var new_sx = sx;
+	var new_sy = sy;
+
+	imandreel_ctx_canvas.globalAlpha = (color>>>24)/255;
+
+	if (!simple_draw)
+	{
+		imandreel_ctx_canvas.save()
+		/*ctx_canvas.translate(x_pos + new_sx/2, y_pos + new_sy/2)
+		ctx_canvas.rotate(-rot*Math.PI/180);
+		ctx_canvas.scale(scale_x, scale_y);
+		ctx_canvas.translate(-(x_pos + new_sx/2), -(y_pos + new_sy/2))*/
+		imandreel_ctx_canvas.setTransform(m11,m12,m21,m22,tx,ty);
+	}
+
+	/*if (x_offset<0 || y_offset<0 || (x_offset+width)>texture.width || (y_offset+height)>texture.height)
+	{
+		dump(x_offset + ' ' + y_offset + ' ' + texture.width + ' ' + texture.height + ' ' + x + ' ' +y + ' ' + width + ' ' + height + '\n');
+	}*/
+
+	if (new_sx<0)
+	{
+		x_pos += new_sx;
+		new_sx = -new_sx;
+	}
+	if (new_sy<0)
+	{
+		y_pos += new_sy;
+		new_sy = -new_sy;
+	}
+
+	//ctx_canvas.drawImage(texture,x_offset,y_offset, width, height, x_pos, y_pos , new_sx, new_sy);
+	imandreel_ctx_canvas.drawImage(texture,x_offset,y_offset, width, height, 0,0, 1,1);
+
+	if (!simple_draw)
+		imandreel_ctx_canvas.restore()
+}
+
+function mandreel_internal_UpdateTexture(sp)
+{
+	if ( imandreel_ctx_canvas == null )
+	{
+		console.log("Mandreel_2D_UpdateTexture error: canvas context is null");
+		return;
+	}
+
+	var hw_id = heap32[sp>>2]; sp+=4;
+	var dataptr = heap32[sp>>2]; sp+=4;
+	var width = heap32[sp>>2]; sp+=4;
+	var height = heap32[sp>>2]; sp+=4;
+
+	var imageData = imandreel_ctx_canvas.getImageData(0,0,width,height);
+	var data = imageData.data;
+	for (var y = 0; y < (height*width*4); ++y)
+	{
+		data[y] = heapU8[dataptr + y];
+	}
+	imandreel_ctx_canvas.putImageData(imageData,0,0);
+
+	var dataurl = imandreel_ctx_canvas.canvas.toDataURL();
+
+	var image = new Image();
+	image.onerror = function()
+	{
+		dump('error updating texture '+hw_id+'\n');
+    }
+	image.onload = function()
+	{
+		//dump('texture '+hw_id+' updated\n'+'width '+image.width+' height '+image.height);
+		array_ids_ogl[hw_id] = image;
+	}
+	image.src = dataurl;
+}
+
+function mandreel_internal_WriteFramebuffer(sp)
+{
+	if ( imandreel_ctx_canvas == null )
+	{
+		console.log("Mandreel_2D_UpdateTexture error: canvas context is null");
+		return;
+	}
+
+	var dataptr = heap32[sp>>2]; sp+=4;
+	var width = heap32[sp>>2]; sp+=4;
+	var height = heap32[sp>>2]; sp+=4;
+
+	var imageData = imandreel_ctx_canvas.getImageData(0,0,width,height);
+	if ( imageData != null )
+	{
+		var data = imageData.data;
+		if ( data != null )
+		{
+			var size = (height*width*4);
+			if ( typeof imageData.data.set != "undefined" )
+			{
+				var sub = heapU8.subarray(dataptr,dataptr+size);
+				imageData.data.set(sub);
+			}
+			else
+			{
+				for (var y = 0; y < size; ++y)
+				{
+					data[y] = heapU8[dataptr + y];
+				}
+			}
+
+			imandreel_ctx_canvas.putImageData(imageData,0,0);
+		}
+		else
+		{
+			dump("WriteFramebuffer canvas data null");
+		}
+	}
+	else
+	{
+		dump("WriteFramebuffer canvas imageData null");
+	}
+}
+var mandreel_audio_init = null_mandreel_audio;
+var mandreel_audio_end = null_mandreel_audio;
+var mandreel_audio_update = null_mandreel_audio;
+var mandreel_audio_createBuffer = null_mandreel_audio;
+var mandreel_audio_playChannel = null_mandreel_audio;
+var mandreel_audio_stopChannel = null_mandreel_audio;
+var mandreel_audio_setChannelVolume = null_mandreel_audio;
+var mandreel_audio_setChannelPan = null_mandreel_audio;
+var mandreel_audio_setChannelPitch = null_mandreel_audio;
+var mandreel_audio_playMusic = null_mandreel_audio;
+var mandreel_audio_stopMusic = null_mandreel_audio;
+var mandreel_audio_useMusicFunctions = _mandreel_audio_useMusicFunctions;
+var mandreel_audio_checkBuffersPending = null_mandreel_audio;
+var mandreel_audio_setMusicVol = null_mandreel_audio;
+
+var mandreel_audio_startedFunction = 0;
+
+var MandreelAudioDriver = "null";
+
+function mandreel_start_audio(audioServer, audioUrl,startedFunction)
+{
+	mandreel_audio_startedFunction = startedFunction;
+
+	// Check audio driver data availability
+	var webAudioDataAvailable = false;
+	var flashAudioDataAvailable = false;
+	var flashLiteAudioDataAvailable = false;
+	var audiotagsDataAvailable = false;
+	var FatLines = mandreelFatData.split('\n');
+	for ( var i=0;i<FatLines.length;++i )
+	{
+		var params = FatLines[i].split(',');
+		if ( params[0] == "audiodriver" )
+		{
+			var data = params[1];
+			data = data.replace('\r','');
+			if ( data == "webaudio" )
+				webAudioDataAvailable = true;
+			else if ( data == "flash" )
+				flashAudioDataAvailable = true;
+			else if ( data == "flashlite" )
+				flashLiteAudioDataAvailable = true;
+			else if ( data == "audiotag" )
+				audiotagsDataAvailable = true;
+		}
+	}
+
+
+	// Init audio driver
+	{
+		// webaudio
+		if ( webAudioDataAvailable && MandreelAudioDriver == "null" )
+		{
+			try	{ webAudioContext = new webkitAudioContext(); } catch(err) { webAudioContext = 0; }
+			if ( webAudioContext )
+			{
+				wa_MainAudioDriver();
+				MandreelAudioDriver = "webAudio";
+			}
+		}
+		// flash
+		if ( flashAudioDataAvailable && MandreelAudioDriver == "null" )
+		{
+			MandreelAudioDriver = "flash";
+			if ( audioServer == null )
+			{
+				audioServer = "";
+				audioUrl = "";
+			}
+			fl_MainAudioDriver(audioServer,audioUrl);
+		}
+		// flashlite
+		if ( flashLiteAudioDataAvailable && MandreelAudioDriver == "null" )
+		{
+			MandreelAudioDriver = "flashlite";
+			mandreel_flashaudio_lite = true;
+			fl_MainAudioDriver("","");
+		}
+		// audiotags
+		if ( audiotagsDataAvailable && MandreelAudioDriver == "null" )
+		{
+			MandreelAudioDriver = "audiotag";
+			at_MainAudioDriver();
+		}
+		// null
+		if ( MandreelAudioDriver == "null" )
+		{
+			null_MainAudioDriver();
+		}
+	}
+	dump("AudioDriver ("+MandreelAudioDriver+")");
+}
+
+function mandreel_audio_isLogEnabled(sp)
+{
+	r_g0 = 0;
+}
+
+function _mandreel_audio_useMusicFunctions(sp)
+{
+	r_g0 = 0;
+}
+
+function MandreelAudioStarted()
+{
+	setTimeout(mandreel_audio_startedFunction, 10);
+}
+
+
+function mandreel_audio_getAudioDriverName(sp)
+{
+	var name_ptr = heap32[sp>>2];sp+=4;
+	fill_ptr_from_string(name_ptr, MandreelAudioDriver);
+}
+var webAudioUseMusicFunctions = true;
+
+function wa_mandreel_audio_init(sp)
+{
+}
+
+function wa_mandreel_audio_end(sp)
+{
+}
+
+function wa_mandreel_audio_update(sp)
+{
+}
+
+function wa_mandreel_audio_checkBuffersPending(sp)
+{
+	r_g0 = wa_imp_mandreel_audio_checkBuffersPending();
+}
+
+function wa_mandreel_audio_createBuffer(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var maxChannels = heap32[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	wa_imp_mandreel_audio_createBuffer(fileName);
+
+	r_g0 = 0;
+}
+
+function wa_mandreel_audio_playChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+	var loop = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	wa_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch);
+	r_g0 = 0;
+}
+
+function wa_mandreel_audio_stopChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var index = heapFloat[sp>>2];sp+=4;
+	wa_imp_mandreel_audio_stopChannel(channel);
+}
+
+function wa_mandreel_audio_setChannelVolume(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+	wa_imp_mandreel_audio_setChannelVolume(channel,vol);
+}
+
+function wa_mandreel_audio_setChannelPan(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pan = heapFloat[sp>>2];sp+=4;
+	wa_imp_mandreel_audio_setChannelPan(channel,pan);
+}
+
+function wa_mandreel_audio_setChannelPitch(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	wa_imp_mandreel_audio_setChannelPitch(channel,pitch);
+}
+
+function wa_mandreel_audio_useMusicFunctions(sp)
+{
+	r_g0 = webAudioUseMusicFunctions ? 1 : 0;
+}
+
+function wa_mandreel_audio_playMusic(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	wa_imp_mandreel_audio_playMusic(fileName);
+}
+
+function wa_mandreel_audio_stopMusic(sp)
+{
+	wa_imp_mandreel_audio_stopMusic();
+}
+
+function wa_mandreel_audio_setMusicVol(sp)
+{
+	var vol = heapFloat[sp>>2];sp+=4;
+	wa_imp_mandreel_audio_setMusicVol(vol);
+}
+
+function wa_MainAudioDriver()
+{
+	mandreel_audio_init = wa_mandreel_audio_init;
+	mandreel_audio_end = wa_mandreel_audio_end;
+	mandreel_audio_update = wa_mandreel_audio_update;
+	mandreel_audio_createBuffer = wa_mandreel_audio_createBuffer;
+	mandreel_audio_playChannel = wa_mandreel_audio_playChannel;
+	mandreel_audio_stopChannel = wa_mandreel_audio_stopChannel;
+	mandreel_audio_setChannelVolume = wa_mandreel_audio_setChannelVolume;
+	mandreel_audio_setChannelPan = wa_mandreel_audio_setChannelPan;
+	mandreel_audio_setChannelPitch = wa_mandreel_audio_setChannelPitch;
+	mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
+	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
+	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
+	mandreel_audio_checkBuffersPending = wa_mandreel_audio_checkBuffersPending;
+	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
+
+	setTimeout("mandreel_webAudio_PreloadAssets()", 10);
+}
+
+
+var webAudioBuffers = new Array();
+var webAudioChannels = new Array(32);
+var webAudioGain = new Array(32);
+var webAudioContext = 0;
+
+
+function wa_initWebAudio()
+{
+	if ( preCreatedWebAudioContext != null )
+	{
+		webAudioContext = preCreatedWebAudioContext;
+	}
+	else
+	{
+		try	{ webAudioContext = new webkitAudioContext(); } catch(err) { webAudioContext = 0; }
+	}
+}
+
+function wa_imp_callfunction(params)
+{
+	if ( params[0] == "#MandreelAudio" )
+	{
+		if ( params[1] == "playChannel" )
+			wa_imp_mandreel_audio_playChannel(params[2],params[3],params[4],params[5],params[6],params[7]);
+		else if ( params[1] == "stopChannel" )
+			wa_imp_mandreel_audio_stopChannel(params[2]);
+		else if ( params[1] == "setChannelVol" )
+			wa_imp_mandreel_audio_setChannelVol(params[2],params[3]);
+		else if ( params[1] == "setChannelPan" )
+			wa_imp_mandreel_audio_setChannelPan(params[2],params[3]);
+		else if ( params[1] == "playMusic" )
+			wa_imp_mandreel_audio_playMusic(params[2]);
+		else if ( params[1] == "stopMusic" )
+			wa_imp_mandreel_audio_stopMusic(params[2]);
+		else if ( params[1] == "setMusicVol" )
+			wa_imp_mandreel_audio_setMusicVol(params[2]);
+
+		return true;
+	}
+	return false;
+}
+
+function wa_getFileNameNoExt(fileName)
+{
+	var fileNameNoExt = fileName.toLowerCase();
+	var indexDot = fileNameNoExt.lastIndexOf('.');
+	if ( indexDot != -1 )
+		fileNameNoExt = fileNameNoExt.substr(0,indexDot);
+	fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");
+	if ( fileNameNoExt.length > 0 )
+	{
+		if ( fileNameNoExt.charAt(0) == "/" )
+		{
+			if (fileNameNoExt.length > 1 )
+				fileNameNoExt = fileNameNoExt.substr(1,fileNameNoExt.length-1);
+			else
+				fileNameNoExt = "";
+		}
+	}
+	return fileNameNoExt;
+}
+
+var wa_mandreel_cache_audio_files = false;
+var wa_mandreel_cache_audio_files_path = '';
+
+function mandreel_webAudio_reloadfile(fileName,callback)
+{
+	var fileNameNoExt = wa_getFileNameNoExt(fileName);
+	var url = wa_mandreel_cache_audio_files_path+fileNameNoExt+".ogg";
+	dump("webAudio: loading buffer ("+fileName+") url("+url+")");
+	var request = new XMLHttpRequest();
+	request.open("GET", url, true);
+	request.responseType = "arraybuffer";
+	request.onreadystatechange = function()
+	{
+		if (request.readyState == 4)
+		{
+
+			if (request.status == 404) callback(null);
+
+			callback(request.response);
+
+		}
+	}
+	request.send();
+}
+
+Mandreel_window.BlobBuilder = Mandreel_window.MozBlobBuilder || Mandreel_window.WebKitBlobBuilder || Mandreel_window.BlobBuilder;
+
+function mandreel_webaudio_saveFile(name, my_arrayBuffer)
+{
+	dump('mandreel_webaudio_saveFile ' + name);
+	g_mandreel_fs.root.getFile(name, {create: true}, function(fileEntry) {
+
+    // Create a FileWriter object for our FileEntry (log.txt).
+    fileEntry.createWriter(function(fileWriter) {
+
+      fileWriter.onwriteend = function(e) {
+        dump('Write completed.');
+      };
+
+      fileWriter.onerror = function(e) {
+        dump('Write failed: ' + e.toString());
+      };
+
+	  var bb = new Mandreel_window.BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
+      bb.append(my_arrayBuffer);
+      fileWriter.write(bb.getBlob('text/plain'));
+
+
+
+    }, function(e) { dump('error 1 mandreel_webaudio_saveFile ' + name);MandreelFsErrorHandler(e) });
+
+  }, function(e) { dump('error 2 mandreel_webaudio_saveFile ' + name);MandreelFsErrorHandler(e) });
+}
+
+function mandreel_webaudio_loadFile(name, callback, callback2)
+{
+	g_mandreel_fs.root.getFile(name, {}, function(fileEntry) {
+
+	fileEntry.file(function(file) {
+
+		var reader = new FileReader();
+
+
+       reader.onloadend = function(e) {
+
+	   dump('mandreel_fs_loadFile ' + name);
+	   if (this.result.byteLength)
+		callback(this.result);
+	   else
+	   callback2(this.result);
+
+       };
+
+
+	   	reader.readAsArrayBuffer(file);
+
+
+
+	}, function(e) { dump('error 1 webaudio_loadFile ' + name);MandreelFsErrorHandler(e) } );
+
+  }, function(e) { dump('error 2 webaudio_loadFile ' + name);MandreelFsErrorHandler(e) } );
+}
+
+
+function mandreel_webAudio_cacheFile(fileName, callback)
+{
+	if (!g_mandreel_fs)
+	{
+		mandreel_webAudio_reloadfile(fileName, callback);
+
+		return;
+	}
+	fileName = fileName.toLowerCase();
+
+	fileName = fileName.replace(/\\/g,"/");
+
+	if (fileName[0] == '/')
+		fileName = fileName.substring(1);
+
+	dump('chanka name ' + fileName);
+
+	g_mandreel_fs.root.getFile(fileName, {}, function(fileEntry) {
+
+	fileEntry.getMetadata(function(metaData){
+	var my_seconds = metaData.modificationTime.getTime()/1000;
+
+	if (g_mandreel_timestamp_fs>my_seconds)
+	{
+		dump('mandreel_webAudio_cacheFile1 ');
+		fileEntry.remove(function() {
+				mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );
+			}, function(e) { dump('error 1 mandreel_webAudio_cacheFile ' + fileName);MandreelFsErrorHandler(e); mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );});
+
+	}
+	else
+	{
+		//alert('mandreel_fscachefile2');
+		dump('mandreel_webAudio_cacheFile2');
+		mandreel_webaudio_loadFile(fileName, function(response) { callback(response);  } ,
+		function() {
+				mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );
+			}
+		);
+
+
+
+	}
+
+
+		}, function(e) { dump('error 2 mandreel_webAudio_cacheFile ' + fileName);MandreelFsErrorHandler(e) });
+
+
+  }, function(error) {dump('mandreel_webAudio_cacheFile3');	mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); });});
+}
+
+function mandreel_webAudio_queueLoadBuffer(fileName, callback)
+{
+	//dump("mandreel_webAudio_queueLoadBuffer "+fileName);
+	if ( webAudioContext )
+	{
+		var fileNameNoExt = wa_getFileNameNoExt(fileName);
+		var buffer = webAudioBuffers[fileNameNoExt];
+		if ( buffer == null && buffer != "invalid" )
+		{
+			if ( fileNameNoExt != "" )
+			{
+				if (wa_mandreel_cache_audio_files == true)
+				{
+					webAudioBuffers[fileNameNoExt] = "invalid";
+
+					mandreel_webAudio_cacheFile(fileName, function(response) {
+
+						if (callback != null)
+							callback();
+
+						if ( response != null )
+							webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(response, false);
+						else
+							webAudioBuffers[fileNameNoExt] = "invalid";
+					} );
+					return;
+				}
+
+				var url = g_mandreel_working_folder+fileNameNoExt+".ogg";
+				dump("webAudio: loading buffer ("+fileName+") url("+url+")");
+				webAudioBuffers[fileNameNoExt] = "invalid";
+				var request = new XMLHttpRequest();
+				request.open("GET", url, true);
+				request.responseType = "arraybuffer";
+				request.onreadystatechange = function()
+				{
+					if (request.readyState == 4)
+					{
+						if (callback != null)
+							callback();
+
+						if (request.status == 404) return;
+						//dump("webAudio: loaded buffer "+request.status);
+						if ( request.response != null )
+							webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(request.response, false);
+						else
+							webAudioBuffers[fileNameNoExt] = "invalid";
+					}
+				}
+				request.send();
+			}
+			else
+				webAudioBuffers[fileNameNoExt] = "invalid";
+		}
+	}
+}
+
+var webAudioPreloadAudioFiles = new Array();
+var webAudioPreloadBytes = null;
+var webAudioPreloadCurrentFile = 0;
+var webAudioPreloadAsync = false;
+
+function webAudioParsePreloadFile(response)
+{
+	var pos = 4;
+	var bytes = new Uint8Array(response);
+	var i = 0;
+	if ( webAudioPreloadAsync )
+		webAudioPreloadBytes = bytes;
+	while ( pos < bytes.byteLength )
+	{
+		// filename
+		var fileName = "";
+		while ( bytes[pos] != 0 )
+		{
+			fileName += String.fromCharCode(bytes[pos]);
+			pos++;
+		}
+		pos++;
+		// filesize
+		var filesize = bytes[pos] | (bytes[pos+1]<<8) | (bytes[pos+2]<<16) | (bytes[pos+3]<<24);
+		pos += 4;
+
+		// contents
+		var fileNameNoExt = wa_getFileNameNoExt(fileName);
+		if ( webAudioPreloadAsync )
+		{
+			var audioFile =
+			{
+				fileName : fileNameNoExt,
+				fileSize : filesize,
+				position : pos
+			};
+			webAudioPreloadAudioFiles[i] = audioFile;
+		}
+		else
+		{
+			var bufferdata = new Uint8Array(filesize);
+			bufferdata.set(bytes.subarray(pos,pos+filesize));
+			webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(bufferdata.buffer, false);
+			dump("preload audio file ("+fileName+")");
+		}
+
+		pos += filesize;
+		i++;
+	}
+	if ( webAudioPreloadAsync )
+	{
+		dump("started preloading audio files async");
+		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
+	}
+}
+
+function mandreel_webAudio_preloadNextAudioFile()
+{
+	if ( webAudioPreloadAudioFiles.length > webAudioPreloadCurrentFile )
+	{
+		var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
+		if ( audioFile.fileName == null )
+		{
+			webAudioPreloadCurrentFile++;
+			setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
+		}
+		else
+		{
+			var bufferdata = new Uint8Array(audioFile.fileSize);
+			bufferdata.set(webAudioPreloadBytes.subarray(audioFile.position,audioFile.position+audioFile.fileSize));
+			dump("async preload audio file ("+audioFile.fileName+")");
+			webAudioContext.decodeAudioData(bufferdata.buffer,mandreel_webAudio_preloadNextAudioFileOK,mandreel_webAudio_preloadNextAudioFileError);
+		}
+	}
+	else
+	{
+		webAudioPreloadAudioFiles = null;
+		webAudioPreloadBytes = null;
+		dump("finished preloading audio files async");
+	}
+}
+
+function mandreel_webAudio_preloadNextAudioFileOK(audioBuffer)
+{
+	var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
+	webAudioPreloadCurrentFile++;
+	if ( audioFile.fileName != null )
+	{
+		webAudioBuffers[audioFile.fileName] = audioBuffer;
+		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
+	}
+}
+
+function mandreel_webAudio_preloadNextAudioFileError()
+{
+	var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
+	webAudioPreloadCurrentFile++;
+	if ( audioFile.fileName != null )
+		dump("FAILED async preload audio file ("+audioFile.fileName+")");
+	setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
+}
+
+function mandreel_webAudio_queueLoadPackedBuffers(fileName, callback)
+{
+	if ( webAudioContext )
+	{
+		// TODO
+		/*if (wa_mandreel_cache_audio_files == true)
+		{
+			webAudioBuffers[fileNameNoExt] = "invalid";
+
+			mandreel_webAudio_cacheFile(fileName, function(response) {
+
+				if (callback != null)
+					callback();
+
+				if ( response != null )
+					webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(response, true);
+				else
+					webAudioBuffers[fileNameNoExt] = "invalid";
+			} );
+			return;
+		}*/
+
+		mandreel_fs_load_binary(fileName, function mandreel_webAudio_queueLoadPackedBuffers_cb(data){
+
+		if (data)
+		{
+			if (callback != null)
+				callback();
+			webAudioParsePreloadFile(data);
+		}
+		else
+		{
+			var url = g_mandreel_working_folder+fileName;
+			dump("webAudio: loading preload buffers ("+fileName+") url("+url+")");
+			var request = new XMLHttpRequest();
+			request.open("GET", url, true);
+			request.responseType = "arraybuffer";
+			var last_loaded_size = 0;
+			request.onreadystatechange = function()
+			{
+				if (request.readyState == 4)
+				{
+					if (callback != null)
+						callback();
+
+					if (request.status == 404)
+						return;
+					if ( request.response != null )
+					{
+						mandreel_fs_saveFile(fileName, request.response);
+						webAudioParsePreloadFile(request.response);
+					}
+				}
+			}
+			request.onprogress = function(e)
+			{
+				var delta_size = e.loaded - last_loaded_size;
+				last_loaded_size = e.loaded;
+
+				imandreel_update_load(delta_size,0);
+
+				var percentage = ((100*e.loaded)/mandreel_total_pogfile_size)|0;
+
+				if (percentage>100)
+					percentage = 100;
+
+				if ( mandreelAppStartStateFunc )
+					mandreelAppStartStateFunc("loadingAudioUpdate",percentage);
+			}
+			request.send();
+		}
+		});
+	}
+}
+
+
+
+var wa_mandreel_audio_buffers_num = 0;
+var wa_mandreel_audio_buffers_loaded = 0;
+
+function wa_imp_mandreel_audio_checkBuffersPending()
+{
+	return wa_mandreel_audio_buffers_num - wa_mandreel_audio_buffers_loaded;
+}
+
+function wa_imp_mandreel_audio_createBuffer(fileName)
+{
+	if ( webAudioContext )
+	{
+		var fileNameNoExt = wa_getFileNameNoExt(fileName);
+		var buffer = webAudioBuffers[fileNameNoExt];
+		if ( buffer == null && buffer != "invalid" )
+		{
+			wa_mandreel_audio_buffers_num++;
+			mandreel_webAudio_queueLoadBuffer(fileName, function () {wa_mandreel_audio_buffers_loaded++;});
+		}
+	}
+}
+
+function wa_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch)
+{
+	if ( webAudioContext )
+	{
+		var fileNameNoExt = wa_getFileNameNoExt(fileName);
+		var buffer = webAudioBuffers[fileNameNoExt];
+		if ( buffer == null || buffer == "invalid" )
+		{
+			if ( webAudioPreloadAudioFiles != null )
+			{
+				var i = 0;
+				while ( i < webAudioPreloadAudioFiles.length )
+				{
+					var audioFile = webAudioPreloadAudioFiles[i];
+					if ( audioFile.fileName == fileNameNoExt )
+					{
+						var bufferdata = new Uint8Array(audioFile.fileSize);
+						bufferdata.set(webAudioPreloadBytes.subarray(audioFile.position,audioFile.position+audioFile.fileSize));
+						webAudioBuffers[audioFile.fileName] = webAudioContext.createBuffer(bufferdata.buffer, false);
+						dump("**** preload audio file ("+audioFile.fileName+"), forced by playChannel");
+						audioFile.fileName = null;
+						i = webAudioPreloadAudioFiles.length;
+					}
+					else
+					{
+						++i;
+					}
+				}
+			}
+		}
+		if ( buffer == null || buffer == "invalid" )
+		{
+			mandreel_webAudio_queueLoadBuffer(fileName);
+			buffer = webAudioBuffers[fileNameNoExt];
+		}
+		if ( buffer != null && buffer != "invalid" )
+		{
+			var chn = webAudioContext.createBufferSource();
+			var gain = webAudioContext.createGainNode();
+			if ( chn && gain )
+			{
+				webAudioChannels[channel] = chn;
+				webAudioGain[channel] = gain;
+				chn.buffer = buffer;
+				chn.connect(gain);
+				gain.connect(webAudioContext.destination);
+				var bLoop = loop != 0;
+				chn.loop = bLoop;
+				gain.gain.value = vol;
+				chn.playbackRate.value = pitch;
+				chn.noteOn(0);
+				//dump("webAudio: PlayChannel "+channel+" "+fileName+" "+vol+" "+bLoop+" "+pitch);
+			}
+		}
+	}
+}
+
+function wa_imp_mandreel_audio_stopChannel(channel)
+{
+	if ( webAudioContext )
+	{
+		var chn = webAudioChannels[channel];
+		if ( chn != null )
+		{
+			//dump("webAudio: StopChannel "+channel);
+			chn.noteOff(0);
+			webAudioChannels[channel] = null;
+			webAudioGain[channel] = null;
+		}
+	}
+}
+
+function wa_imp_mandreel_audio_setChannelVolume(channel,vol)
+{
+	if ( webAudioContext )
+	{
+		var gain = webAudioGain[channel];
+		if ( gain != null )
+			gain.gain.value = vol;
+	}
+}
+
+function wa_imp_mandreel_audio_setChannelPan(channel,pan)
+{
+	if ( webAudioContext )
+	{
+	}
+}
+
+function wa_imp_mandreel_audio_setChannelPitch(channel,pitch)
+{
+	if ( webAudioContext )
+	{
+		var chn = webAudioChannels[channel];
+		if ( chn != null )
+		{
+			chn.playbackRate.value = pitch;
+		}
+	}
+}
+
+var mwebAudioPreloadState = "start";
+//var mwebAudioPreloadRequest = 0;
+var mwebAudioPreloadAssets = 0;
+var mwebAudioCurrentPreloadAsset = 0;
+var mwebAudioAsyncFiles = '';
+var mwebListAudioAsyncFiles ='';
+var mwebListAudioAsyncFilesPos = 0;
+var mwebTotalPreloadingFiles = 0;
+var mwebCurrentPreloadingFiles = 0;
+function mwebCallbackAsync()
+{
+	mwebListAudioAsyncFilesPos++;
+	if ( mwebListAudioAsyncFilesPos >= mwebListAudioAsyncFiles.length )
+	{
+		mwebListAudioAsyncFiles = null;
+		mwebAudioAsyncFiles = null;
+		return;
+	}
+
+	setTimeout("mandreel_webAudio_queueLoadBuffer(mwebListAudioAsyncFiles[mwebListAudioAsyncFilesPos], mwebCallbackAsync);",10);
+}
+
+function mwebCallbackAsyncPreload()
+{
+	mwebCurrentPreloadingFiles++;
+}
+
+function mandreel_webAudio_PreloadAssets()
+{
+	/*if ( mwebAudioPreloadState == "start" )
+	{
+		//dump("webaudio start");
+			mwebAudioPreloadRequest = new XMLHttpRequest();
+			var url = g_mandreel_working_folder+"mandreel.fat.dat";
+			mwebAudioPreloadRequest.open("GET", url, true);
+			mwebAudioPreloadRequest.onreadystatechange = function()
+			{
+				if (mwebAudioPreloadRequest.readyState != 4) return;
+				if ( mwebAudioPreloadRequest.status != 404 && mwebAudioPreloadRequest.response != null )
+					mwebAudioPreloadState = "parseFat";
+				else
+				{
+					mwebAudioPreloadState = "done";
+					dump("error pre-loading audio assets, status("+mwebAudioPreloadRequest.status+")");
+				}
+			}
+			mwebAudioPreloadState = "loadingFat";
+			mwebAudioPreloadRequest.send();
+	}
+	else if ( mwebAudioPreloadState == "parseFat" )*/
+	if ( mwebAudioPreloadState == "start" )
+	{
+		//mwebAudioPreloadAssets = mwebAudioPreloadRequest.response.split('\n');
+		//mwebAudioPreloadRequest = 0;
+		mwebAudioPreloadAssets = mandreelFatData.split('\n');
+		mwebAudioCurrentPreloadAsset = 0;
+		mwebAudioPreloadState = "preloading";
+	}
+	else if ( mwebAudioPreloadState == "preloading" )
+	{
+		//dump("webaudio preloading");
+		var queued = false;
+		while ( !queued && mwebAudioPreloadState != "done" )
+		{
+			if ( mwebAudioCurrentPreloadAsset < mwebAudioPreloadAssets.length )
+			{
+				var params = mwebAudioPreloadAssets[mwebAudioCurrentPreloadAsset].split(',');
+				if ( params[0] == "audiofile" && params[1])
+				{
+					var sync_load = true;
+					if (params[2] && (params[2]&1) == 0)
+						sync_load = false;
+
+					if (sync_load)
+					{
+						mandreel_webAudio_queueLoadBuffer(params[1],mwebCallbackAsyncPreload);
+						mwebTotalPreloadingFiles++;
+						queued = true;
+					}
+
+				}
+				else if ( params[0] == "audiopreloadfile" )
+				{
+					mandreel_webAudio_queueLoadPackedBuffers(params[1],mwebCallbackAsyncPreload);
+					var size_pog_file = parseInt(params[2], 10);
+					mandreel_total_pogfile_size = size_pog_file;
+					mwebTotalPreloadingFiles++;
+					queued = true;
+				}
+				else if ( params[0] == "audiopreloadasync" )
+				{
+					webAudioPreloadAsync = true;
+				}
+				mwebAudioCurrentPreloadAsset++;
+			}
+			else
+				queued = true;
+
+			if ( mwebAudioCurrentPreloadAsset >= mwebAudioPreloadAssets.length )
+			{
+				if (mwebCurrentPreloadingFiles == mwebTotalPreloadingFiles)
+				{
+					mwebAudioPreloadState = "done";
+					mwebAudioPreloadAssets = 0;
+				}
+			}
+		}
+	}
+
+	if ( mwebAudioPreloadState == "done" )
+	{
+		if ( mandreelAppPlatform == "nacl" )
+			setTimeout("MandreelAudioStartedNacl()", 10);
+		else
+			setTimeout("MandreelAudioStarted()", 10);
+	}
+	else
+		setTimeout("mandreel_webAudio_PreloadAssets()", 10);
+}
+
+var wa_mandreelMusicElement = null;
+var wa_mandreelMusicElementFilename = "";
+var wa_mandreelMusicElementVolume = 1.0;
+function wa_imp_mandreel_audio_playMusic(fileName)
+{
+	var fileNameNoExt = wa_getFileNameNoExt(fileName);
+	var fileNameFull = g_mandreel_working_folder + fileNameNoExt + ".ogg";
+
+	if ( wa_mandreelMusicElementFilename != fileNameFull )
+	{
+		wa_imp_mandreel_audio_stopMusic(0);
+		var audio = document.createElement("audio");
+		var type = fileNameFull.slice(fileNameFull.lastIndexOf(".")+1);
+		switch(type){
+			case "mp3" : type = "mpeg"; break;
+			case "ogg" : type = "ogg"; break;
+			case "wav" : type = "wav"; break;
+			default : throw("'" + fileNameFull + "' is not a recognized audio file");
+		}
+
+		// set correct id for lookup, loading method and data types
+		audio.setAttribute("type", "audio/" + type);
+		var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
+		if ( is_chrome )
+			audio.setAttribute("loop", "loop");
+		else
+			audio.addEventListener('ended', function(){this.currentTime = 0;}, false);
+		audio.volume = wa_mandreelMusicElementVolume;
+		audio.setAttribute("autoplay", "true");
+		audio.setAttribute("src", fileNameFull);
+
+
+		// include into list and document
+		document.body.appendChild(audio);
+		wa_mandreelMusicElement = audio;
+		wa_mandreelMusicElementFilename = fileNameFull;
+	}
+}
+
+function wa_imp_mandreel_audio_stopMusic()
+{
+	if ( wa_mandreelMusicElement != null )
+	{
+		document.body.removeChild(wa_mandreelMusicElement);
+		wa_mandreelMusicElement = null;
+		wa_mandreelMusicElementFilename = "";
+	}
+}
+
+function wa_imp_mandreel_audio_setMusicVol(vol)
+{
+	wa_mandreelMusicElementVolume = vol;
+	if ( wa_mandreelMusicElement != null )
+	{
+		wa_mandreelMusicElement.volume = wa_mandreelMusicElementVolume;
+	}
+}
+
+var mandreel_audio_stream_func_ptr = 0;
+function mandreel_audio_stream_process(e)
+{
+	var l = e.outputBuffer.getChannelData(0);
+	var l2 = e.outputBuffer.getChannelData(1);
+	var n = e.outputBuffer.length;
+
+	var offset2 = 0;
+	var inc = 44.1 / 48.0;
+	while ( n > 0 )
+	{
+		var n2 = ((n*inc)|0)/4;
+		if ( n2 > 1024 )
+			n2 = 1024;
+
+		var sp = g_stack_pointer+100*1024;
+		var ptr = g_stack_pointer+200*1024;
+		var _sp = sp>>2;
+		heap32[_sp]=ptr;
+		heap32[_sp+1]=n2*4;
+		__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
+
+		var offset = ptr>>2;
+		var size = n2*4;
+		/*for (var i=0;i<size;++i)
+		{
+			l[i+offset2] = heapFloat[offset+(i*2)];
+			l2[i+offset2] = heapFloat[offset+(i*2)+1];
+		}*/
+		var i = 0;
+		var j = 0;
+		while ( i < size )
+		{
+			l[j+offset2] = heapFloat[offset+((i|0)*2)];
+			l2[j+offset2] = heapFloat[offset+((i|0)*2)+1];
+			i += inc;
+			j++;
+		}
+
+		//offset2 += n2*4;
+		//n -= n2*4;
+		offset2 += j;
+		n -= j;
+	}
+}
+
+function mandreel_Audio_requestSoundData(soundData)
+{
+	var n = soundData.length/2;
+	var offset2 = 0;
+	while ( n > 0 )
+	{
+		var n2 = n;
+		if ( n2 > 1024 )
+			n2 = 1024;
+		var sp = g_stack_pointer+100*1024;
+		var ptr = g_stack_pointer+200*1024;
+		var _sp = sp>>2;
+		heap32[_sp]=ptr;
+		heap32[_sp+1]=n2;
+		__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
+
+		var offset = ptr>>2;
+		var size = n2*2;
+		var buf = heapFloat.subarray(offset,offset+size);
+		soundData.set(buf,offset2);
+		/*for (var i=0; i<size; i++)
+		  soundData[i+offset2] = heapFloat[offset+i];*/
+		offset2 += n2*2;
+		n -= n2;
+	}
+ }
+
+var __Mandreel_Audio_CreateStream_created = false;
+function Mandreel_Audio_CreateStream(sp)
+{
+	if ( !__Mandreel_Audio_CreateStream_created )
+	{
+		if (webAudioContext)
+		{
+			mandreel_audio_stream_func_ptr = heap32[sp>>2];
+			var source =  webAudioContext.createJavaScriptNode(1024*4, 0, 2);
+			source.connect(webAudioContext.destination);
+			source.onaudioprocess = mandreel_audio_stream_process;
+		}
+		else
+		{
+			mandreel_audio_stream_func_ptr = heap32[sp>>2];
+			AudioDataDestination(44100,mandreel_Audio_requestSoundData);
+		}
+		__Mandreel_Audio_CreateStream_created = true;
+	}
+}
+function mandreel_webAudio_dummyStream()
+{
+	var sp = g_stack_pointer+100*1024;
+	var ptr = g_stack_pointer+200*1024;
+	var _sp = sp>>2;
+	heap32[_sp]=ptr;
+	heap32[_sp+1]=4096;
+	__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
+	setTimeout("mandreel_webAudio_dummyStream()",10);
+}
+
+function AudioDataDestination(sampleRate, readFn)
+{
+	// Initialize the audio output.
+	var audio = new Audio();
+	if ( audio.mozSetup == null )
+	{
+		setTimeout("mandreel_webAudio_dummyStream()",10);
+		return;
+	}
+	audio.mozSetup(2, sampleRate);
+
+	var currentWritePosition = 0;
+	var prebufferSize = sampleRate / 2; // buffer 500ms
+	var tail = null, tailPosition;
+
+	// The function called with regular interval to populate
+	// the audio output buffer.
+	setInterval(function() {
+	  var written;
+	  // Check if some data was not written in previous attempts.
+	  if(tail) {
+		written = audio.mozWriteAudio(tail.subarray(tailPosition));
+		currentWritePosition += written;
+		tailPosition += written;
+		if(tailPosition < tail.length) {
+		  // Not all the data was written, saving the tail...
+		  return; // ... and exit the function.
+		}
+		tail = null;
+	  }
+
+	  // Check if we need add some data to the audio output.
+	  var currentPosition = audio.mozCurrentSampleOffset();
+	  var available = currentPosition + prebufferSize - currentWritePosition;
+	  if(available > 0) {
+		// Request some sound data from the callback function.
+		var soundData = new Float32Array(available);
+		readFn(soundData);
+
+		// Writting the data.
+		written = audio.mozWriteAudio(soundData);
+		if(written < soundData.length) {
+		  // Not all the data was written, saving the tail.
+		  tail = soundData;
+		  tailPosition = written;
+		}
+		currentWritePosition += written;
+	  }
+	}, 100);
+}
+var mandreel_flashaudio_server = "";
+var mandreel_flashaudio_lite = false;
+var mandreel_flashaudio_musicaudiotag = true;
+
+function as3Error(str)
+{
+	var params = str.split(' ');
+	if ( params[0] == "createdBuffer" )
+		mandreel_audio_flash_lastBufferCreatedSwf = parseInt(params[1]);
+	dump("as3Log: "+str);
+}
+
+function mandreel_audio_getFlashMovieObject(movieName)
+{
+	if (Mandreel_window.document[movieName])
+	{
+		return Mandreel_window.document[movieName];
+	}
+	if (navigator.appName.indexOf("Microsoft Internet")==-1)
+	{
+		if (document.embeds && document.embeds[movieName])
+			return document.embeds[movieName];
+	}
+	else
+	{
+		return document.getElementById(movieName);
+	}
+}
+
+function mandreel_sendmsg_flash(msg)
+{
+	if ( mandreel_flashaudio_server != "" )
+	{
+		var iframeWin = document.getElementById("ninja-iframe").contentWindow;
+		iframeWin.postMessage(msg,mandreel_flashaudio_server);
+	}
+	else
+	{
+		var flashMovie=mandreel_audio_getFlashMovieObject("FlashDivAudio");
+		if ( flashMovie != null )
+			flashMovie.receiveMessage(msg);
+		else
+			dump("error: flashMovie not found");
+	}
+}
+
+function fl_mandreel_audio_init(sp)
+{
+	mandreel_sendmsg_flash("init "+g_mandreel_working_folder);
+}
+
+function fl_mandreel_audio_end(sp)
+{
+}
+
+function fl_mandreel_audio_update(sp)
+{
+}
+
+function mandreel_flashaudiolite_createBuffer(fileName)
+{
+	mandreel_audio_flash_lastBufferCreated++;
+	mandreel_sendmsg_flash("createBuffer "+wa_getFileNameNoExt(fileName)+" "+mandreel_audio_flash_lastBufferCreated);
+}
+
+var mandreel_audio_flash_lastBufferCreated = 0;
+function fl_mandreel_audio_createBuffer(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	mandreel_flashaudiolite_createBuffer(fileName);
+}
+
+function fl_internal_mandreel_audio_checkBuffersPending()
+{
+	return mandreel_flashaudio_lite && (mandreel_audio_flash_lastBufferCreatedSwf != mandreel_audio_flash_lastBufferCreated);
+}
+
+var mandreel_audio_flash_lastBufferCreatedSwf = 0;
+function fl_mandreel_audio_checkBuffersPending(sp)
+{
+	r_g0 = 0;
+	if ( fl_internal_mandreel_audio_checkBuffersPending() )
+		r_g0 = 1;
+	dump("fl_mandreel_audio_checkBuffersPending ("+r_g0+") ("+mandreel_audio_flash_lastBufferCreatedSwf+") ("+mandreel_audio_flash_lastBufferCreated+")");
+}
+
+
+function fl_mandreel_audio_playChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+	var loop = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	mandreel_sendmsg_flash("playChannel "+fileName+" "+channel+" "+loop+" "+vol+" "+pitch);
+	r_g0 = 0;
+}
+
+function fl_mandreel_audio_stopChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var index = heapFloat[sp>>2];sp+=4;
+
+	mandreel_sendmsg_flash("stopChannel "+channel);
+}
+
+function fl_mandreel_audio_setChannelVolume(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+
+	mandreel_sendmsg_flash("setChannelVolume "+channel+" "+vol);
+}
+
+function fl_mandreel_audio_setChannelPan(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pan = heapFloat[sp>>2];sp+=4;
+	mandreel_sendmsg_flash("setChannelPan "+channel+" "+pan);
+}
+
+function fl_mandreel_audio_setChannelPitch(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	mandreel_sendmsg_flash("setChannelPitch "+channel+" "+pitch);
+}
+
+
+function mandreel_audio_load_flash()
+{
+	var failed = "";
+
+
+	try
+	{
+		var mandreelAudioSwf = g_mandreel_working_folder+"mandreelaudio.swf";
+		if ( mandreel_flashaudio_lite )
+			mandreelAudioSwf = g_mandreel_working_folder+"mandreelaudiolite.swf";
+		var swf = swfobject.createSWF({ data:mandreelAudioSwf, width:"0", height:"0", allowScriptAccess:"always" }, { menu:"false" }, "FlashDivAudio");
+		if ( !swf )
+			failed  = "swfobject.js not avaiable or Unable to open "+mandreelAudioSwf;
+	}
+	catch(err)
+	{
+		failed  = err;
+	}
+
+	if (failed == "" && !swfobject.hasFlashPlayerVersion("9.0.0"))
+		failed = "flash player not found";
+
+	if ( failed != "" )
+	{
+		dump("Failed to create flash audio driver ("+failed+"). Null driver will be used.");
+		MandreelAudioDriver = "null";
+		null_MainAudioDriver();
+	}
+}
+
+function fl_MainAudioDriver(audioServer, audioUrl)
+{
+	mandreel_flashaudio_server = audioServer;
+	if ( mandreel_flashaudio_lite )
+		mandreel_flashaudio_server = "";
+	if ( mandreel_flashaudio_server != "" )
+	{
+		Mandreel_window.addEventListener("message", receiveMessage2, false);
+		var el = document.createElement("iframe");
+		el.setAttribute('id', 'ninja-iframe');
+		el.setAttribute('width', '0');
+		el.setAttribute('height', '0');
+		el.setAttribute('frameborder', '0');
+		document.body.appendChild(el);
+		el.onerror = function(message) { alert(message); };
+		el.setAttribute('src', audioServer+audioUrl+"/MandreelAudio.html");
+		setTimeout("CheckNinjaFrameReady()", 1000);
+	}
+	else
+	{
+		setTimeout("mandreel_audio_load_flash()", 10);
+	}
+}
+var ninjaLoaded = false;
+function CheckNinjaFrameReady()
+{
+	try
+	{
+		mandreel_sendmsg_flash("loadFlash");
+	}
+	catch(err)
+	{
+	}
+	if ( !ninjaLoaded )
+		setTimeout("CheckNinjaFrameReady()", 1000);
+}
+
+function fl_map_mandreel_audio_functions()
+{
+	mandreel_audio_init = fl_mandreel_audio_init;
+	mandreel_audio_end = fl_mandreel_audio_end;
+	mandreel_audio_update = fl_mandreel_audio_update;
+	mandreel_audio_createBuffer = fl_mandreel_audio_createBuffer;
+	mandreel_audio_playChannel = fl_mandreel_audio_playChannel;
+	mandreel_audio_stopChannel = fl_mandreel_audio_stopChannel;
+	mandreel_audio_setChannelVolume = fl_mandreel_audio_setChannelVolume;
+	mandreel_audio_setChannelPan = fl_mandreel_audio_setChannelPan;
+	mandreel_audio_setChannelPitch = fl_mandreel_audio_setChannelPitch;
+	if ( mandreel_flashaudio_musicaudiotag )
+	{
+		mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
+		mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
+		mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
+		mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
+	}
+	else
+		dump("WARNING: flash music functions not supported");
+	mandreel_audio_checkBuffersPending = fl_mandreel_audio_checkBuffersPending;
+}
+
+function receiveMessage2(event)
+{
+	ninjaLoaded = true;
+	fl_map_mandreel_audio_functions();
+	setTimeout("MandreelAudioStarted()", 10);
+}
+
+function mandreel_flashlite_checkPreloadFinished()
+{
+	if ( !fl_internal_mandreel_audio_checkBuffersPending() )
+		MandreelAudioStarted();
+	else
+		setTimeout("mandreel_flashlite_checkPreloadFinished()", 10);
+}
+
+function mandreel_flashlite_startPreload()
+{
+	mandreel_sendmsg_flash("init "+g_mandreel_working_folder);
+	// preload sounds
+	var FatLines = mandreelFatData.split('\n');
+	for ( var i=0;i<FatLines.length;++i )
+	{
+		var params = FatLines[i].replace('\r','').split(',');
+		if ( params[0] == "audiofile" && params[1] )
+		{
+			var sync_load = true;
+			if (params[2] && (params[2]&1) == 0)
+				sync_load = false;
+
+			if (sync_load)
+			{
+
+				mandreel_flashaudiolite_createBuffer(params[1]);
+			}
+		}
+	}
+	setTimeout("mandreel_flashlite_checkPreloadFinished()", 10);
+}
+
+function flashReady()
+{
+	fl_map_mandreel_audio_functions();
+	setTimeout("mandreel_flashlite_startPreload()",10);
+}
+
+function null_mandreel_audio(sp)
+{
+	r_g0 = 0;
+}
+
+function null_MainAudioDriver()
+{
+	mandreel_audio_init = null_mandreel_audio;
+	mandreel_audio_end = null_mandreel_audio;
+	mandreel_audio_update = null_mandreel_audio;
+	mandreel_audio_createBuffer = null_mandreel_audio;
+	mandreel_audio_playChannel = null_mandreel_audio;
+	mandreel_audio_stopChannel = null_mandreel_audio;
+	mandreel_audio_setChannelVolume = null_mandreel_audio;
+	mandreel_audio_setChannelPan = null_mandreel_audio;
+	mandreel_audio_setChannelPitch = null_mandreel_audio;
+	mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
+	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
+	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
+	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
+	setTimeout("MandreelAudioStarted()", 10);
+}
+function at_mandreel_audio_init(sp)
+{
+}
+
+function at_mandreel_audio_end(sp)
+{
+}
+
+function at_mandreel_audio_update(sp)
+{
+	for ( i = 0 ; i < 32 ; ++i )
+	{
+		var end = maudioChannelEnd[i];
+		if ( end != null )
+		{
+			var sound = maudiotagChannels[i];
+			if ( sound != null )
+			{
+				if ( sound.currentTime > end )
+				{
+					sound.pause();
+					maudioChannelEnd[i] = null;
+				}
+			}
+		}
+	}
+}
+
+function at_mandreel_audio_checkBuffersPending(sp)
+{
+	r_g0 = 0;//wa_imp_mandreel_audio_checkBuffersPending();
+}
+
+function at_mandreel_audio_createBuffer(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var maxChannels = heap32[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	//wa_imp_mandreel_audio_createBuffer(fileName);
+
+	r_g0 = 0;
+}
+
+function at_mandreel_audio_playChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+	var loop = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
+	at_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch);
+	r_g0 = 0;
+}
+
+function at_mandreel_audio_stopChannel(sp)
+{
+	var ptr_fileName = heap32[sp>>2];sp+=4;
+	var channel = heap32[sp>>2];sp+=4;
+	var index = heapFloat[sp>>2];sp+=4;
+	at_imp_mandreel_audio_stopChannel(channel);
+}
+
+function at_mandreel_audio_setChannelVolume(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var vol = heapFloat[sp>>2];sp+=4;
+	//wa_imp_mandreel_audio_setChannelVolume(channel,vol);
+}
+
+function at_mandreel_audio_setChannelPan(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pan = heapFloat[sp>>2];sp+=4;
+	//wa_imp_mandreel_audio_setChannelPan(channel,pan);
+}
+
+function at_mandreel_audio_setChannelPitch(sp)
+{
+	var channel = heap32[sp>>2];sp+=4;
+	var pitch = heapFloat[sp>>2];sp+=4;
+	//wa_imp_mandreel_audio_setChannelPitch(channel,pitch);
+}
+
+function at_mandreel_audio_useMusicFunctions(sp)
+{
+	r_g0 = 1;
+}
+
+function at_MainAudioDriver()
+{
+	mandreel_audio_init = at_mandreel_audio_init;
+	mandreel_audio_end = at_mandreel_audio_end;
+	mandreel_audio_update = at_mandreel_audio_update;
+	mandreel_audio_createBuffer = at_mandreel_audio_createBuffer;
+	mandreel_audio_playChannel = at_mandreel_audio_playChannel;
+	mandreel_audio_stopChannel = at_mandreel_audio_stopChannel;
+	mandreel_audio_setChannelVolume = at_mandreel_audio_setChannelVolume;
+	mandreel_audio_setChannelPan = at_mandreel_audio_setChannelPan;
+	mandreel_audio_setChannelPitch = at_mandreel_audio_setChannelPitch;
+	mandreel_audio_useMusicFunctions = at_mandreel_audio_useMusicFunctions;
+	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
+	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
+	mandreel_audio_checkBuffersPending = at_mandreel_audio_checkBuffersPending;
+	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
+
+	setTimeout("mandreel_audiotag_PreloadAssets()", 10);
+}
+
+var maudiotagPreloadState = "start";
+var maudiotagPreloadAssets = 0;
+var maudiotagCurrentPreloadAsset = 0;
+var maudiotagPreloadAsync = false;
+var maudiotagDurations = Array();
+var maudiotagChannelsCreated = 0;
+var maudiotagChannels = Array();
+var maudiotagChannelsLoaded = Array();
+var maudiotagAudioSpriteFound = false;
+var maudiotagAvailableChannels = new Array();
+var maudioSecondsPos = new Array();
+var maudioChannelEnd = new Array();
+
+function mandreel_audiotag_PreloadAssets()
+{
+	if ( maudiotagPreloadState == "start" )
+	{
+		maudiotagPreloadAssets = mandreelFatData.split('\n');
+		maudiotagCurrentPreloadAsset = 0;
+		maudiotagPreloadState = "preloading";
+	}
+	else if ( maudiotagPreloadState == "preloading" )
+	{
+		var queued = false;
+		while ( !queued && maudiotagPreloadState != "done" )
+		{
+			if ( maudiotagCurrentPreloadAsset < maudiotagPreloadAssets.length )
+			{
+				var params = maudiotagPreloadAssets[maudiotagCurrentPreloadAsset].split(',');
+				if ( params[0] == "audiofile" && params[1])
+				{
+					var duration = params[3];
+					var fileNameNoExt = wa_getFileNameNoExt(params[1]);
+					maudiotagDurations[fileNameNoExt] = duration|0;
+					dump("audiotag duration ("+params[1]+") "+duration);
+				}
+				else if ( params[0] == "audiotagfile" )
+				{
+					var type = params[1];
+					var filesize = params[3];
+					var numsounds = params[4];
+					var at = new Audio();
+					if ( !maudiotagAudioSpriteFound && at.canPlayType && at.canPlayType("audio/"+type) != "" )
+					{
+						maudiotagLoadPackFile(params[2],filesize,numsounds,type);
+						maudiotagAudioSpriteFound = true;
+						queued = true;
+					}
+				}
+				else if ( params[0] == "audiopreloadasync" )
+				{
+					maudiotagPreloadAsync = true;
+				}
+				maudiotagCurrentPreloadAsset++;
+			}
+			else
+				queued = true;
+
+			if ( maudiotagCurrentPreloadAsset >= maudiotagPreloadAssets.length )
+			{
+				maudiotagPreloadState = "done";
+				maudiotagPreloadAssets = 0;
+			}
+		}
+	}
+
+	if ( maudiotagPreloadState == "done" )
+	{
+		setTimeout("MandreelAudioStarted()", 10);
+	}
+	else
+		setTimeout("mandreel_audiotag_PreloadAssets()", 10);
+}
+
+function maudiotagLoadPackFile(filename,filesize,numsounds,atype)
+{
+	dump("audiotag packfile ("+filename+") ("+filesize+") ("+numsounds+")");
+	var url = g_mandreel_working_folder+filename;
+	dump("audiotag: loading packed data ("+filename+") url("+url+")");
+	var request = new XMLHttpRequest();
+	request.open("GET", url, true);
+	request.responseType = "arraybuffer";
+	request.onreadystatechange = function()
+	{
+		if (request.readyState == 4)
+		{
+			if (request.status == 404)
+				return;
+			if ( request.response != null )
+				audiotagParsePreloadFile(request.response,numsounds,atype);
+		}
+	}
+	request.send();
+}
+
+function audiotagParsePreloadFile(response,numsounds,atype)
+{
+	var pos = 0;
+	var bytes = new Uint8Array(response);
+	var i = 0;
+	if ( webAudioPreloadAsync )
+		webAudioPreloadBytes = bytes;
+	var secondsPos = 0.0;
+	while ( pos < bytes.byteLength && i < numsounds)
+	{
+		// filename
+		var fileName = "";
+		while ( bytes[pos] != 0 )
+		{
+			fileName += String.fromCharCode(bytes[pos]);
+			pos++;
+		}
+		pos++;
+		// filesize
+		var filesize = bytes[pos] | (bytes[pos+1]<<8) | (bytes[pos+2]<<16) | (bytes[pos+3]<<24);
+		pos += 4;
+		var fileNameNoExt = wa_getFileNameNoExt(fileName);
+		var duration = maudiotagDurations[fileNameNoExt];
+		dump("afile ("+fileName+") duration("+duration+") posseconds("+secondsPos+")");
+		maudioSecondsPos[fileNameNoExt] = secondsPos;
+		secondsPos += duration / 1000.0;
+		secondsPos += 0.25;
+		dump("second "+i+" "+secondsPos);
+
+		i++;
+	}
+
+	// contents
+	var contentSize = bytes.byteLength - pos;
+	var bufferdata = new Uint8Array(contentSize);
+	bufferdata.set(bytes.subarray(pos,pos+contentSize));
+	var ascii = '';
+	for (var i=0; i<bufferdata.length; i++)
+		ascii += String.fromCharCode(bufferdata[i]);
+	var base64 = btoa(ascii);
+	audiotagAudioSprite = "data:audio/"+atype+";base64," + base64;
+
+	if ( webAudioPreloadAsync )
+	{
+		dump("started preloading audio files async");
+		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
+	}
+
+	audiotagCreateChannel(0);
+}
+
+function audiotagCreateChannel(index)
+{
+	console.log("audiotagCreateChannel "+index);
+	var sound = new Audio();
+	sound.addEventListener("canplaythrough",function()
+	{
+		if ( maudiotagChannelsLoaded[index] == null )
+		{
+			maudiotagChannelsLoaded[index] = sound;
+			maudiotagAvailableChannels.push(sound);
+			console.log("************** loaded channel "+index);
+			if ( index < 8 )
+				setTimeout("audiotagCreateChannel("+index+"+1)", 10);
+		}
+	}, false);
+	sound.addEventListener("error",function()
+	{
+		console.log("************** error loading channel "+index);
+	}, false);
+	//sound.src = "data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAABFAAA0igAHDBERFhsbHyIiJioqLTE1NTk8PEBEREpPT1JWWlpeYmJmaWltcXF1eXl8gISEh4yMj5OTl5qanqGlpamsrK+ysra5ub3AwMTHysrN0NDU19fa3t7h5Ofn6+7u8vX1+fv7/f8AAAA5TEFNRTMuOThyAqUAAAAALjQAABRAJAXKQgAAQAAANIqLReuqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//uAxAAACgjJYRQhAAN1ru+3N6ADNAEAASM2QkOAABKvqQjEIQjSE+pyEJ/5znoc5znP//QgAAEachCN85/oQDB9QIAg8oCEHAQcXfKBjEAIS4IAgclAQBA5BAMZQEHfgmD4fwf5HQ6HQ6HY7HQ7GQrDQPvZToNx37zcYsbgZnqEkTWnZsm+DxpKLDUMfs3A4zHKdzz8+wAWXmmL1KaHf35z0oOjnISA5pYpJmW9w/woDIDpmTxpDRYGwmDH/rUv97+xaWZ9eZkqAiZl+xsj8pszk1ZtY73/+UhDNvTHmxgMROhU0DBzwRq/MQ1Jbn///l4FEGHFFYIElBkORAUcAEZYRjfrSuiv1rWf6/e///Z8mnLXAgFiMOwakw0OepsaDVS5RdrxqT///////8hys3t58nrFS3lWt6/uXec73+46u0oA4ZEXCYUYY+p6C4/B89FZVEYXJqaW+eGCSYJfJOnpq7WadTtuzhoUjsP/+2DEFQOPrW1oPYMAAecorQmDIaE0qGThDsZRhGCCZyF03ZkXKRPVQEMTdeftOw84ncZ4XR/ZoO3JoyPFVtHePkemlrf5f740VGbMspMynd2NrG/h8//u58dsf2jWLnygUiASkXwFfQAw7MEGiSdlDDj7wJCnkpYu+0iqRU2SIo3RAkznFnYGqMYXMtXGhsYWLKMZzg4NSb1Jepcx7ohTx6PUlnSLHuY4vRK3VtWOymoix0TSesWjbseTdsYnvHf0v/Ks8NI0+O+Ge/Z4xkpZ/1rQS4QMHvMPSieYYfONUp/9VQBOCRaIS9okqeKzDCwz2wA0pok7D0mlEAxaelsP1uRm4hT/+2DEEQOQ5XtkLCRz2h00bImEjjlpio6TEqIL4ikSEeJRY1GhlJzTySOlrtqTXhIeh5vmvJqpiXFikoyd4tXBbGHzyo6hae6OHIxuoRjkJWu+okBoZoEDZvFrFN5LiAyxW9TEnnbyz/H/erAb3Ok2y9BVcOnGOv1kzQEgZxr0spQBWdNNJtvXQak+7mL2yf92oalcRhf0oCLJoWidC+awoNrOuFDy2UYNkk+X1a3VBuuTU604pNtS082afizat2f7nunbfdAnawhbPRmEEk5BKECSI7QPXcneTeHfYcEeUrhB0ReamhSlihEAA2DNS+LCVT8zyyPk7m1ml9iLJT5RfWoABPT/+2DEAYAO0V9oTBhvSckr7ejzDaFQT7CIuu6UuevrnRqQWnrosaeHIHIghzTLiApnBWKBykEGRpeaek5WfbQUGm4HvmEc0Z1cNji/jZ03yrg3dGpBRMPChoDGxkHJHP7VZTvlNkkJWY4SOeaqpKaEcrGeaOZFjmOK2LrMLo3/rolzs58SeHt/wAEwAASk5VsmKoQpfyl60V7xyRN9YRKhDS5djhmMfOuYFuxqX1zVE5QQourDCCMeGIHAIIUbK7yOTsRCQZHMruhiQ6ubRh3gIpxYGwfA+/SXh1Viy23s9cxzoKluDQyU+GSomumKPZMdvcKttEc5lxwsFgJAEElytfKhnMr/+2DEBQANdX9u7CRnyay0L7TDDHyX4Oe3pdCccMm/2jMqn6UihdVNPrGTu/Bj9Q3PQETiWC9S8qqOeSsLMp8BQQRIyZGPw2Ps9eVdSt+n+adikmCZSatTjtnZVhEcMzIoiCjdUztJftuGf+IcKZ/6jZjP+wMK6AwjI62203Lw5K7jYUcvoY0QuV6WVTGpKZEs2rKAmBHBArQ8zhvcKbPnoh/+ikScXJArWnwz0dRH02ADU83GEKXl9LQihFi4CPca2wmlvSyLvlVzdBi6p7pDrF7FQmbwjrv8MptOSnNYpWYKAQQQS3MVRtHIskSAIxmUqsMDbMzsMz+Ni4Ffzvr5Q9yTSQj/+0DEEYAKzMty55higVaSr3RgjgSW/8JJAbI8zlbL/t2+fNvGY4PAb3QOFQvSZoLuDsswgQShTAEXHWaY4JEgipiC1WKKOXUAMGOMtMpJOa0oG2pD4UpRq0awhk4dx07DMuCOEpePVSlwuybfziMR1YtHAB8NLRSswL0EVQk9rzoiPCrQbW4qJDYFc6RPsaskKrp1KS90BHdklWipyRV/jqVF0xGGVFm2s3wcwJl9iheX1CGxlP/7QMQMAAqVAYEklG6xVp4syYMNoFoBztJLiJErk7s7/ft/L6IUjCstJlNDOLTdacOt8LO8N/PmVLTiVF8UbwKJnIRTZHo6OsibDzCcv5F7U1AADT5grCxWpvZNskfeQ3o/g3KD5kMyRY7D1zEBZmvbnG7attnJEJGyJAw8pOUUioM3JxtTvZQhc/Sp7L9/Tzm/5+qHPmMKA6WFTryqnsjHP3SP6HWFqgIAAJJSTcH0nhFugclK//tAxAcBCsyvdUWEsNlDDO1M8wzgFJ121UStsnY5UgwO1jgVbsqChv1zojMpnddXBB27nidTTezt9utjvF2+1xUPI/Ey0X9uwe7XVbfR//+tI+W1Jwmcz9Qs/3b/gABKdodQEmZN1hwSr4WFFECvsmmpI4e5kjZKXVCXwRegXNTUxg4dDjow9OCc3JvDgsMvc5wGhRx59hDPA/QUNrr2R7C9am9r3ukxrJGc7Kal1QAAVJQIJCz/+1DEA4OKwPVoZ6RowUoWbIWGGOqbqsvVUvK6OV7AWklGA+pJ7Gw4ca1RiBPhqRr2HF4D8OjfMtXi5wtOwoXW1rfSEe+r2FCXH82z8zbufoKMwSD5wMGb6nuVm6fP3veVEYrpOCSJeL3jTiPov2HAJG0MZ0b1+4SW3YGG/HkPnllc8HPrdH/9CoZM1r6snzmMxGn6WfXz7ua/X/p9JtRzBsA0rFiibYj1jRSHKg0LOGxUkzv/+PUAAaCx0Aa2HcdVkRWwH1qaQeNn33jQOkWL//tAxAyACrRrZEwwxRFULG2o9JQowvUkzUH+pKox7BX+mE4aMztJ5bLGCZsBgpkiCyRSLBsXDzhAVJLP8zWOEbC735yposneBlNZ5LLMkvt4oAECgJJbu59jTGmHsHaGFNsY/kD7qQjkS5Gs6CBju7XoJK5N3I+7I9OyWVevVHnuOyt1S7dEWR1f+nCLyvIrIdWtQyk0zNejsiWIm2nv0sUa5tj/R1IAEAykii7wAQbhWMVBhxz/+0DEB4AKiG1xRhkAIVcULqTEDGaoGHbV4Xj9pl06dhBFNDriPVZrtHz0y7DhFQmfLAYTGL0HQyhOswFXtn4uJA0TFjbU3vCWHzJNQ6H16rRhY0SNUMvu8KuBRVYWUXCpwnvmKF2V6OCa+4xBi0yfQTXPjLrjfR0XhWBi97JhmvImhlbC3oFngKAZUnElyw0xaUOlzDQQNKBQEQKJGr4dULSJux1q3SRR5mjQH5vA6AEVG2q3I//7UMQDAAqw7YejDE/xTKzvKICLFmnKCn338dXIS04/UQUr/QREYmhCdS0v0iFGhKVEZ56wzPlYRdGK2OxfeuP+zpfdW22X7AwcQH4kFEGy4pdFRj1vNAYRUsESwpLqeBfSnyiAgeqKSJBUBUChJdReku5OStSYuNo3r4iXjboq+YVCuxmhyugjzIlbR6QrpXYXZidV9tqm7bWshCyl2O0zOo+/W/6nptP/7vkzAxrGqYAj+moJOJUFyRySySSOTP0NVxWTey+N2SzvTNz0b8b/+0DEDAAKpPWLowR4cVYiLA2DCbBMcCju992OtVI9P6eYSAVCsPDMOS5/qYpE9HLWGXKebH+uZ/qVBgDDRMNeAQyHBVr7t5hjP6QggRIZ7KcSgAEByF7QCVC1nTXajAXjiGcennLpq54XiiEz19DZx1Plm59L+9rmLfLsxPH7KyXRLuw70Itl/VV2X2foqUR/7XMDU2bUrM3EkDIaOYSKBpTP9ZV//1oAkoCCii5hbhGVWlD7qv/7QMQHAAp1NWtHmEbhOxEsTYSIcHonOiRI/atyhLVmNyqKuPt1Oz76Gal6mWZLiyqnoyNq6Kyu6m1WNuQtqzU6cHFHHKrWDqOjtVddjI/fcLaKfwPFTlN1P1AAFJ2gZJIAs3QJCIrgqJmVig/PNUabt5iyI7shRZgA2H7nc3WVv28thQLlVHCwcuCwFpIhfBNpEyTFVwKbJGzYGkYJM7aECVhL7+o+v/1VAQWYVUbGsl033UaF//tQxAYAixlpcSeMR/FeoexNgwkoEPUwTQlyR7yAARPpSHdyD7JYvBIX0z5UI4YgUFsxWYLzbIiaWa97AyuqJ3S3MO0EIaRilYMioZz1pQhL2mBIyKqshdPulW7ikY3q9aU7uD6oiLejkTgeBpfEaUzIuBnKdXuupcw1NdVCWDPaqb4oh20tXdlkZzXn3dpqsWqrWnroR3vdt7pYyoU45TujlTUUbFaALO3tGLpHzqYmKHCZ87y+yJ3KFD+tJtNOUPnhqUpmVk5ZLRt1j3VhEf/7UMQLAA0JaXlGFG8xoy2t6PMVfk0plEVrRyKjwmm6mKsc0HjnlzGO26EwoVnz0+DmCE21DBxd288LT+w9kdX5V6sDyc2ACBDmp5a1PPdkKhxnyHT73kWrcrrRTigOCjXE4vPR7YeAAWcpIkJQiWt3EpIu7t+a4ce3hRyEvn5xl2TU3YlPLMumKKmM1+Ue06Z3pPGLRhA97OqlEzOVmuwwY8lkbdGPs8utGrUYjkKgwxzOUJHVjiSNrVyvInZEsW3TTVdZGDxRxRRiGyQ5nBv/+2DEAAAOXT9vRiTB8aAs65z0jSgUKtyU0inA/MQ3azBbVKY6QFrPSI1gRdH+4JpZLwkcrK5e58ry6+5Vr35Vq3KoYZRwHtHxzrhGj7mKqzQJrO940WkVMc7wb1LfZz5t6/QzLHPnnzkv7J539vpaVN0Gd0LnaCNB8AsJhYRpvDoSZMpx/QwaAEApN3csIrwaRwHqziRqYl5/MmxEGjceGpD8J3rAwG663CuwpeQ6RhwitkVBK0D75hB7BQOuctyvacP4ouiEi0WZ5E3wZq3ND3NqUUgLRdqvod6DM6X+MnV+UtmIz//+TL+wh7tDfyUAoEKWgEAlAn5a9EkjnLaTPoQFZqr/+2DECoMM+WlcbBkJ4bUiak2UjbiCpVzs2UqxZsbtdrKOUzO+3TPbip6yaP+rhdbH1RFT3E/XeQ6FqhHE33jY+4Z/nnhuP6oIlea+tZaraCO6uri7ipifRUSe0/+q5hv3slTrEfmPoAAALsILTzDf5hsOOwFh2FCEZ6cIqrO0+OJNACEo3Fd0mAMhMja9FGVyBAZ65P6pJN+yykaj53njcXnoUlJIOKPkOExjtkvDIKHVGQ5iz8wyLXaedY5NjHJzhqxgnJWlE6yTnZFI0PVZQHvDKRUJpWOOuSSOWnFDZ9CgfJfVaB+mbSzG9zPSRrNQ+GHqlRLcoDRCoUBq2RX6Zcc2hsf/+0DEGAAMVTF/pIzVsYImq52EmGSh3MGANrxh2JPvBC5sZAlp6+a3yRAZ6gyVeI/u81hNX2Zu+mtTb+UtIbS0qwDhpm63/0AhCJJLgCl0Dk9lNxQXBGzJl1CO06ZcjHWy2XTa2VlRUlpI3906cx2aNZo1859dr/s4hWpy7crXzMb7O3219Zvl3mu2/czfv3t9IApxJKW8k/md5RTZ3/fuzu7dmXgdi3WqCcdktstsku1KCrwzUf/7UMQGgAsVN4WjGGPxXyautGGb1qsjAsRbKxruCj80UsQ2vLwAE/ChFSsEHY/nwb/woievMiDEf6u9p0s+nhXRxZF95k2ZmQAGYJu+Yy0hieg3lP+lsXyAhlELzHYBuKglOJuNNtJOAAgBJ0FqQBBGEZnnUgkZvVdmZ/mtHP3ePxvL1SX78ZTtvaf8ycvXiw+/H/w3/LfI/py9K00o5K38yhcchUr6XtJVvdxWdzlp9yZ1qDAcTfPVAABYlJJShiJO2M+XUsVH7VyKNTqmLbb/+0DEC4AKmRNjR5ip0Vam7ajDDD5SgUhRxz0rlIvk/e6R6E0Uotm86XdXUVI+5sg5LyjVsm1lP9dP++owHGkGM7KJIgprGuIsYdQGQUEQfO7IBBFbtJIoqAVBKAVHxBsmxHR6qtFK1b4MXJFbQDQ4LZHyK7RQhAsvzjn+vST6XmbFHVAcQX2WTIR1GUPI3/uxGRuC9Vzpsdmfhy/nSAz6P0yE1zz+gWJKACQSU7gfMF8E82sstv/7UMQGgAtlEVbsJGlBYCet6PQNvlNDDKiT/KlFBJExEihdVd9MTRpLhH6s87wdkbKQlM28sHkacu3mfDiFOajGakZ+QRzMicfZgRlkSqeZBBZg0U/VmJ/cGakUnlh2BHr9d4qNXpppJQEUlnCE0XgS3vnsSV6F130dxidKq6RmM6LPVbt44+5OmbRZyQpXSFOTN+b7GeVcly3kM7WwWiAIQCEjFHRiL9vbuXDlrfSbv/8hqrsARYQ3jxFVBGFtqZsCJVrjiaHnOoMt+qtrLzP/+0DECgALCTNpJ5ir8V+mbGTxlnble8QU2f4Dx3ELd6Qc/zfelQ7X1HNVCIZTrLoitiREMUhSse7K2VRIyFKrbVJlERwSDgyxkYcVF0Exd5MpNUezRV7WeggAVmVRwFcBuQ9qvZdWcrSeDNet64p6b+GsvQK4CiCzB61ygzo1wfPW3gcfy5FCCj3DQw9PN/KjE9LWPmr4ilvYy37gdms+dlTRDKjd4qisrxgfEods5gwqATVZVf/7UMQCAArVM2MnjQ/xR6KspJMM/0oHAjWLLFAQ20HWojbW+aM8U4RHBRBGuCYEhYW1KqeU8YjpXyrZd65FISloCTdGGNn/d/2n/bXPd3Wk/9nBUPnHDKWDR8XbFDCDGlb59o+IgepAASLNSliMDI+GG1SaZ2gAcLQrXXievH5yMsnu3Ik50kkcUhMXghfnIcMGe28D9HPXuwUjp51Ppl/H7x34+Ween+4IUB5tmcBXmzCCbmuMvfgDujAEaSSSKgMwZRKOosc1VCDiRTVCTjP/+0DECwAKuTVnR6RgcWAmbSjDIC9RxP1zFDgLtAyubnkky6n32yLh1xYcJVBVZQyFL0EwY3POBCBJMs+VEO+6f+oci9uERfeBf//44B6ow4lBHxWwCZaym0jICsLCgVacE7XsCYuylheYelWUq9cbGk+qio0bo9lBmYhm5TlMslXcgek3umWtw1ObxdIiXGvf2Puf+fib+ix4S72eNLT4vYWENmGTeMbjn/KlmgRVWKlbAZJuQP/7UMQEgArJNWEnjLPxXKYtKMMgH4s8efDDaDBg/5ixrX3bP1BFh1WwsL4cPy4hkNbwNLh4Vy+wnoCCQ7nTgLpH1FJTM+KGMlK0cZmHh5TCn2BwdxhdnLvuoTRVWmrN1MEqgVdrTbSTgFQzLhDQzlUli4YLjWSnWoxJvUnDi8VrjersRj7xm2Zpxc8jRNb90ww+/bh7FemTmSF4/vmuKdJitV47iObYqCw4SXqma4t5qm2nle4qOcjTdQBpraSSMgFhLI9fbfq/FWNjHv2O/bb/+0DECwAKkTVpRgjT8VQia6WHoAauT4wqpQEAO4x0IZnM6F2qrVfqVvorC1VqMEAlu7FCkIrU6/Oqt9CN8yQwySviU0aXkywrCkZdn3w8t5pHEIABAJWUkHlh0ClYwQs0aZAhjXH3Ewhsz3KFy8JAioUZcNNRjBl38ySc+l3i8U1Q4+vadnehptJc8TpMa8Tj7rhc2u/2u655JHEsrO9+PnsZiLRIXt6VBumtJtJOApdJWJR7B//7QMQGgApFNWdHmGf5YaItNJMh3yRBqMIEkn2PnrJ+pTdQ/kHnUBnJoUsaIECnzp3rvHZKWc1Wgm35Dxh8i/sLTgYh4SkV6ZEWTZOTNsRLfOi0+z8iks1Bc4BDSacabbUgBvAy9tvbJQEtFJrkrgzsa7wogFI10HGHWhX35BtPMztJnPFJvf42YLJ6uYiwl1Xn9rf+2kiedZNqI7/q1rlFCAOj1MRJmkdLnERET+n7nYClAIQw//tQxAGCCsD3UqwlAvFNompFgyE2ok/uTNcYJjqYVQWKUYoiUHAJixBU35R60nOVU30P6IHIsJ3BL1xcx47+3gsoypi+zhWuElBWB9ot/xVFNh04/ZoX04uqaBMcbJsiMDjWHz4nn+k1jVAoqXJUmxSUPnGb0D0hqgfHWTnG1oleTupqraymueBuVr7mrTom/Ymvvs9z1n61luazDhU8jimhKd+LgiKGb19wWzdWNCi1T1Pc6Q0IHp1vXWoAIKck/BvmgTNb0aTrd5pESpabkf/7QMQKAApo8U7sjK2BU6KsaMGifloZiaHCgT40DAzGcKDp4xBcol7HrcSuseyahzshlcBrysSgk2r1KKnKhJ2u+6uqKvsZeqACB1g6FUHRUMO+6oEar0201GAaAeP2DJ+1aZD6w29u+y78e05Irjw1fx+B2IwQAEKbwGLvKXc6TeKIfh2FNaoM5g2MC3V5GbN4w5Bsv5y39KAEFxdDu1jPT5xKLO8gW8fVAAAJJQQEMtWdnL9W//tAxAYCCpUVUS0gT/ldnmkNthjZIlUnaeG7nI5LsqtWtaHI+6DYc2ySpJaXWuKp2Fj2xxtVrXMqRNXTKUFzChi2W5QdvBNVM9u115kHBvt2RnuhQoN0ehiP9XBq2AknMAYpNGTEqmjkNhSShhMYrAdLR8E3NmSAtLrTvKM3GY9RIVW19f2lnd4c4gpnfv/A3/L1zGm+74/Lbdm7ZbTN79nG/azzqr78/q6be+BBRaFXvv/ACgD/+1DEAIIKrRVZLCTBsVqiqI2jIeAFbqqcBCVjQkcjOrIiOScUCilTHDohtN0QHOJ+cwxXpNe7EMY9xc9Sc43/ukd+us1WKhnk6GFbPxRp7z2f8xzJ+v91Ctjv/9rP7s0lBu/PLS396xlBFpOgAoAddoMDpM/TdKZUxMAqxl6YnZduGYxGbPL7GIhQ47jnxMUDZJJVXkWhM1NLosebvPCdF078LF32K91tAiLEJxt7dVCr8f/dzU/QUmu+P26+6NUFEN4AU0OFgLmoSXiZTNNT//tAxAgACqEVQmykq4Ffoquo8yG2UUnmkTQFnx2QaBBJEbUJmF0ibG9QwWSWr7Tr6WK7YwQYzr2FbFdHRbI/oPLIx0LFipXk6IVFf0xY7rwUejPJLlalxx0qAC6tONtMA5SYqCDSXMeDqFBRhbmkxCzao7Hu55svitIPsIq6ZxaBo8u9MHB578tRZHtDQYXI2XurwANttRRimz5DwTd28ZNK1pH31stKOMVVuV+av9hhsCSTJwD/+1DEAgAKwPlEbI0zyV2f6eWRmX/3+N2lSKRzBZIxd321pZRXfu1D9apailmks5b1ShnSqzwItoZCqAcOkh0UPJ/rqW/Pift8AjypDgJidTe2ijk0HKGhF2lPIgYIbfrE5Fl5r0H7ABQYWZgNqMQmwRInJlfYjFpdHLRAgMGESxPSDOihxuNClBk1M6a5Wiv69nlsPaWZZSMI1tO/hDwRgoJlx1MiRnah8yuv3jpx9ztWPJdDH1v2NqLGcDVklQAFeKTSUAMoEoHOjJwgifjN//tAxAiCCp0VV0wZA/lsImgNpiD1oGOg0/5u0NSk4bGfKww+44Ni2Ksme+W+T7i5JO9pOg85ut9omqW4qlTrv5RvkbWPt1+EU6Y0lh5kWlprCXeciBE0vEQBRKgB6F4CviUJWpe6kVBXEDR85N2TZEceHjZFRttt67HVe/zzBsUlaKQMqZhpqBG6MiZGWfV1DzY6n2jqTLRZmLV6mLpKn7i4F6rRuJeVjrMBcnKz8c/c48dMABD/+1DEAQAK+QFPLCTF+U6WZ02zDdgcqqwI3s0Ij3oIkDBjS6NpSSuaS1s8q2lhORoZPl/P1ZJrhqan8tZi8ufn/W37aUfasyHkvkNvaxsZU5jatqnuVS2SQxf/3rjtsoCzHp75cwgqmyuncAJUlAOKNzFCoWTBZaRUL/MUjCBsanoadBypuanXHJpjUjGBRRJZp0ZBROVV+tRgYVS9YnMuNIXzNhA08paZkJrwhQuljJgJPWKB4fjxWJRCE+utFQAirKB3rFoigBi72KKtfZpE//tAxAiCChjVQsykafFTFeaNt40xLD4th43M00oYihvyUQvarZHVz1Q4VajV5XPMwiwh/1gslMJgzDoXcF0HTZDhsENvLXfDJwUYxriUDmT5l/RYSABlwAOYmQqkmBg4GNAsGp5Bgo3QLBqbxdyUhij+cj9UROV2wQ2PbDdhIY/jYi0S3g3gmYvajI0KeN+Dm15fh5BFRSVc63fIgGPuLKHZalYCO6mdoOUAILbsABu5RnOhd5T/+0DEBgIJhL8+7TBnUVgWZk3MoDjJn9di0NpwKnBWE84SXWHyQ/r72XO0HAXmVfhAjjbmAggFVjHMoS4ARmJQ4Rm+X4mHvMcSEQTscUEcB9CEOsI0AF3YAGXLeYcP52RiSCNQGRECSOsuUOas7SmqlzPGav/BXXjik+H+HIKbD2Q9VVFCBAFcY8NjM27S6Pvs2lrs3i0uFSLh+1Oi/VZpFGNMrBLOZ5RcyMQqACdAAOmWPPlOwv/7QMQFAgpssyxtMG8JUZhmHaSOSPMwXJrgiDExM0J0wYIkApfpETKRTCV9p0QOAVUWBKsHIlkAwQCGY3jJ6gqwwRJfznXamZZmAlb7qh3yI8ODfriPk+o2F2CpfH4BALnoAPx+OmzMszX0HKhpiYQUBh7E2QL8V63JcixJlH51HfizXX1tU08o4IoH1E4KKH07z2Kkjlc4cOHVIAcpul38j/3IqRhgZiDCQviBnPQdOu+mADmo//tAxAGCCmSzLm2kbsE1GGddphiyAMZZDhbFkgOPlPpZJzDQOu0RgaBbWW5l7kFFTKONniRoiiekINBkxLRcsHyx1HKANVnEIcHfUU5d6WvmAw4ZvtkVzLWmwURB3MUeeqxM+7SUFOWAA3bs9AIt4BQLIlvC4Mi2VlDrZILKmR+VG4jX1qR5C0dB2pdFVpQva76xTvT9Cu9osfq8qYb0yezuu/uMdNinvnx8udsDwI+zxNUFXfD/+0DEAYMJYLMybbBswUSX5c22DagAFyBpY+mWrxhZaVc6ETFGl08UXKwCYYXjEVhXYrvfEdI/id4YQVhMEHvcEdRfAm6eCN2EthmzVlVKtuh+OUXYMLGGsKzUYq0BS+AA/0vNjNTLWJLwaAEqgEDEwHIC9kCOShyQUYkOQVjiOyYyJ1CbQpQYdoncXQyzfupf2VOnQ5Hgx5m0W0TGX+SyGvqpEj0gMPbacMEQdRQqBU/AAPecDf/7QMQDgwoIwS5tsG1JNhdljbYJ4WiYwJECDkEBSJAOHZMttPttX7Z7DLExSAIceNVzBW7YTrMNFKL22U97QPxLJYctbHIwNkpTw5fDaaBw1BG9qDJoRIIYkdVqQTFBUmAAOzhykiM1Lh5ISgSHMTCQMJpPrdZ1D69m8h2EqOvuO4LvSSbpROIqb2IH4Ngeu3W9KJPwiAnuw6GBBUaQtjPJs6tXfOyQdkoC4lIG8AOU/jTEI5IN//tAxAUDCTCVLE2kbxk2j6TNzCRxKqHHkeUBay2JJBvczBWyIpiQKpGLBkhLmQ8bgHxaC62xOroEcYnmviTdvunWHvSygnmXowvYGZxUAmga3cu/MAOQAA4KxTFjMEjSCicisanG1Js66oWOytu8BJ7I4v5FmgtycZXk5YoOCA3bQoPitEmeapQobr0+v9qPdv+1eVFpOqTkquvtbv31+GOu1QCnAADtRVMUOUzcBDI44AZZm8r/+zDECYIKJHckbmUDyRwVpx2mGN9QESCJIGKcVSwiBToIjZpcCF7CaVqMxTxeQp2ALALFKeEoaB4RRhiBid24ZS+dPefJzydMzFU++nhJxJP+iayXGwADllB5qRG1RJArgXyvwWGK59GkQHUxMTMLhcJsZUastOC/Tf/4s8cQ001DMzBIXkogTl+E61/M5qcan2y/JsyOWMajKgD/+zDEAIBISIVLrCTH+QuP5c28GC0BDE3JdaAATILYttbu1srFrEJrscMAWhxKoTZ6cqSVbGSSCjdn2k2uSwhFVmsjjGTMTeBliVv9gkXAGRMu1f/Lg4KWnLoIk1gtAsFgyVygwUQ6bM4/FKZ1m4iAgMAgUwMVJEmmz6xfMJM3ZF+Ufz3m1WZDybpeWMT4j2+u+OvuxmLvml1VADj/+0DEAQMI/FEibmUhyVETY83cIHnAANoYoylIgxU63lOmfm0wNcBQwAnJoLBlvGKKDOe5S75toLYZlsoBgFAkaKG0S9KKyRvdqMOhesadwNNJthPrUPvR3922AZEAAY5TaCEFM6CjMQw3AwBBhENOEueONAUltI1AYScTDK7J3oYQ0V3nQ3A6nIfBwHAYCEVD84MOUNCsSNg/Raq49bFSGqWds2aeqWDqgY8VDsz9qgLAA2jh4//7QMQDAwnsfxxO6MXJMI/kDcygeDgV0zfBUeGsMBcwpC44zYUBBmUVLNuJKxoQoKgSi7DmR3ptX7sOVHKdmKkJa3sfukVjao3gZRmsDPNRmsV/pB87MX8nkRV03pugKRgAH1h2ZLFA0vjBIdHlhFSxtEcwBEP23ayrVHVBGnMrhiTtdl9PFZTkqqCKFHiQaOKIIpBg5e9jpfqHheIH2xrHgcYcAgrgvrVc+gAAgSYnLGAAB4mY//swxAWACLCHO6ywxfkbjuSNthkZg0ZUi97wVRnpCHOJhJEh1drR1ynUKpEZ0Zl140f8MpMZhsyhplPZ6NuMXemWbckcNLwSazA8CH69/6Be1AANwLD9kAvAJAqw6dKV6XaaiM4KGYDxOHFoNDcsCGWF5E4EJI6CXtwmNnyQr8xXyMmMWNZ1mI82VXLka2IqQhbfsfvSlQuQA8k7//tAxAKDCaRrGE5lg4k2kONJ3SQ4xLxGoBOZ8AI6CZkJtnCZ5MSPIMvSLByAqQgpfjTwqqwKxNzgUXLScHpmc8XmUXv+xp+/l4Gf5qGN263hpQHkRj5VH7/39f79g/ABz2yxhiHJs+pqDCNqS4BDmRIN+VQMaXOgLR1EIB4FkIfylMpl73guFQRA8M4SkM3EkoQ8Qr1s+3ubl2xcPCoyq8l3txvDqXhQc+mpACEs0AAeSDoGyJn/+0DEBYJI+IUi7jzHaSuQ4oncsGiMTCMQoDkRS25fIkQGA/TkGw8W1EX9HM7KkJGDuJ0kbK1AkXn16CFo28ckVHdu3vpQlGOUed6Wa9PbLudsHT2FWzSQFzNUCAMCxzan+4YQqRyZQJNRdWQMGkwBeBR1RB0SUIo4llgXiITxgOKeGB012Djjj5621dg/tr0GW3bUm+1tm45acStaAGpdGAAaxfERmd0POoow4vyxAHRIfLI0Av/7MMQMgggQaybt4YChMw1iidykeGPlkNAbghZYZejZ22cx2bq9tnustgtbsn6NecCJ54eCciNSaoenToBoADU6HzWkdDLQNgAIxuDl1RQ8BSC9BokMSKwUEpKEGKP8wpl6OFG20acKWPe86GaNNAmOyWz2tLXwzGalng/pCBM2Bi8rE9YiJ+xyKhuQA/acDBIZMkjEw6IgG6dJiv/7MMQJAwjEbRZOZSOBHo0iid0wKKpmEGgEOEozxcucx4axkjCWhQK0x1nzWNiEkWYe1K5N5F9ptw93mS2t7muLBWKwBnXir/UPgAHChzGsyMG8OHjmjV0HbSKSZ4YW1HBCA6HEvUGELB/OggEQCyglFgrkgYnLBbVtxKObddmC1/rHzP7bGng2DATW8iE//6YGAAM/c7MXT/GgIP/7QMQFg0nwaxBO5SPBLAuiSdwYeMGhOFUDH/EiCdEILDGZ1QwKtAUYEAl3UqUi0x3XSwlsFzz0OEIUAaaISAI04xKKcq9vqV577sOmp8PERD+39//7f/2eoGTbGTDAoojEkHgEJZ5MWAlsAyh1SXaglkxQADCSTaGxhdynUMxV7I1EJVI/I5a6l0Zdl/KaekIhwqMQEBoqwZL3Pb/////////+6h9AA8Mdkw3Kow2JMxDEwwBA//swxAiCSMBrEk7lg0EMDSLZ3LAshwC0GtCGBiIFNRNNIouq/SwDVVWkcJFSxoOLauKmQ3XT/xduRbamR413s2fiGgUJNJD9lWkK+HKorGF5mhTEAxkRpqhGIdbe9Vagla1YvGD0SFwUFM3RoR1el1l2pSGsLNWsSTvy99vot+i8kOB0gRiwT1YtbfsoAAAAAgkjAAB6LNGViYcf//swxAeCSRxrF65lIYkxDWHF3CRypEkRRCSBjpIqO6u91WYMuXyt1gELiYCkjMcjAHBEKiQ0CMY6nCKOsS7ZSnRnOEWOVkBz0w3UufZH0mMa5zM5VkMTCPMeRSMpQxhq8Nfh5dC74gFAreCKLxZq/DgQ5doGBVombOHRdEpCcqq5wdls+8hvx0hdoImT7CSqtfxF9P9nb/q///XV//tAxAACychPDk7pIcENCeHV3Jg4GgADkOnDHgMj/STUCRUABVBiBRn2RMaSLgoLgy1zDSIKyh2mIsrfeJwkgGlVzPYacxO24WicCgwRg2NKCHRNJ/Rvd8q51H7rv/6v/+n6QnnSng52T5HAI4skQMroBZSF6mDS00gYC1sMBpG71HmkLV9880ACsutaMVeQmZATUmxwqwUQl5ER3f/////9GBf9fvUAAAl4AA7XJw03CAy6Daf/+zDEB4JIrF8PLuUhgRkNYdnMIHDUCLkgIIOnJji7zYWYqTYUv2Lwa7TZkBlD4noHhNEgMG4EMVc+XP+T+k8sFiYSZCbA2Hr9aaEhPg9RlDI5JFAsEJQLeHFAoIt9CJmLYJIlyz+HZNTuZAkzDtPJlAMzDQ/pOT5NkdVe6LvD7kjD6FSRL//////q/r6f/1eQaj5AAKymYkEocAn/+0DEBQNI6F0OTukhQSoMIYnMmHCaJWLQC14oDARtHJXz7MwWd79MCADQKhQEVGloiD6y+SVtw3wI5VHHtvYSKixCTsFBdSX////7//935X9zR0PR9Y1sNwNBSgYHEMIhQASDk3LUNQNfdHBZbOY3YfGBJdFsQAD0QdGdcqNNfzPZTRvLsBigw4kc15f9Hu42i/9fV/t7f/d7uzhGYA5QTcwJB85PTGAHlTseEbaOKnTxLvn2TP/7MMQMg0k0Zwou5MHRKg0hSd0YMEgbeOJp/pPD9Hwmfg+BZb0ZeXs7CzrpmZ20+VXcnvei7vpFv9qf/sv+izWxCvo/20roPgWZBlUbhQHyFKIoQDWYNxLmuS3rMLKeLbvC7IWE4tEyiCFz3fliL+ZT/Phu6QpCQSC6bI1Hr/09FFKLLuP/1I+zq6T73X9Py9UALUgAe82GmSZiyv/7QMQFgklIOQzN5MGBN4bhSbykKKHOyWlTfAwkbUqg94Iu4bLIw8DbD4CUmq7GnicEAWFmpDkChMOjzo4GSA1gu0WYBjikft/6un/1/o39F77e+hZDZj04wLPMEchCPl6sjAgBQEwN+YmvBxaUBRsUIKFdZuqsh954WLlV3gdhkXfHrF1Jj1u1uusFiiU1/kndSW3fWnr2nEWbEI6b61MFdKoAbUAAfChHevBsG8wYpeURSQbZ//swxAmCyIA1DM3hIMELi2FBvIw4wFlROygCwYM5SPVrpkCmwyokZIiQ0YQwksiJmqc9i1zH4p6vXPf0dHu/Zb7NlXq2aDzCoxVVMTY9TSIllKvChxlT1xrUESW9JZu/Zj/cMFA3VR5mRL0sGw20aBlmwMgghALv7Gt/9m7/ovq2Xf1r+28ZZ9MZAANHxTDlIWCKHUPCxVWF7ToJ//tAxAmDSmwrCE3h4IEkDeEJvBQoRI0DLViebmFUs7a8Ax4iZBfAhEakAkyQ0qDzWGCQaYm1pmKSTsa2voFd7C59NNcczoUxl5lLmr6YpbQ2S9iGLUUhr9QauLniwHGoOhwWQoK5kFwBLYYktdsPBAVTVDKuTfO53YjXIl3S4vUhqS9XPX2JurasU+6pl70i3jmHEPSjc30+a9F9Y3JqZQADlG0x5LQAI4KrssSoQEgyQGgaGxD/+zDEC4NJdHMITaRnARULYMmmDOCspDmloyhzQ96zWWlQYjM3TnlHhQGGWlZQoh0pOXsnUUInfQ+UehNbVrFn6l00UXs7/5zqWSh9TokeIliKCgaerGHvGRPNX0nrMs8is9cjVle7tElMOJwdWi0jlg6IwMaLB4KAdpJpze3wJVK7CUbW0xv//V/0Ju/o2xjEFiqXKIb6K8SGkYT/+0DEBoNKDEEEDTBmwS2QIIW3oFBKb6J5fNIW6VBhKX6CzIEBxABBQ8aBIc4mYEYaHBNUcYFgCGRY4liwHGKSlAVl3rbIkaEE7uw9Zc+511r2rQunR7WdXjcJtliCroK5IIohxDn+YDymsKmmsZF7vWN6i3OlxUebCPUWrTVZeYl1mPFmLPrLARTj1sLNUYW7ih+XsNDWvucCB1v91nZdt/0/oUAOdeC0iQMDN0XvDSVzr1ZoFf/7QMQJAko0ZwItmGiBMJRgWaYYSCKSNP5JQWsYWlWoCXEPj+muEUWOCAwMlYjWWEQ8cTEjECQxMvSfLJ1HWHjTklUy4Xfimp86QbwlI4vvs09er1hak+0kRExoGsriy+LyBJg5wk2DZlVWbi7EeCzabvJ5IV0q1I3T9fIedIn4Rfy3MTTwxvt1refeGI0WaRdS9+V2Jo2fFF7P0v3Zj9mlOKkBQ9mzuCLZAF5iibnjhBTIWkIS//tAxAqDygx0/g0wwwEyCd9BlhiQiTSyC9cimcnE0SbtiDvMvOu23layJQHRC8JqRCRsBzKxjAdHUiyBIfONSWqKtlkVbV7RSjT23apX6m3DZCZqAtNRi8GFV4shUW3oHESCqLCZxVwTKgwk0kkdj6mAwqyChgMJOkQMfEJ5oTOPlCKhaksNBO0e/ELiiJYclNa9+y7b3V7OtPb/1CAMMEooCVMbJgMgk4dPkoVYIUQpk9zS01v/+yDEDINJzG74LCRjwIIE3ISTGBUFVVlJloCUOOVnmMHEC0sgwEBwcJRw41CjQVFSoSSxgNXLKqktCjSpo09t6NvUmxTa/+/o/awKlCaC0SQKKAiaC1JInGlgaoMShu//qmWCagxYJKX/+0xBTUUzLjk4LjJVVVVVVVVVVVVVVVVV//sQxAuDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDENQPAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";
+	sound.src = audiotagAudioSprite;
+	sound.load();
+	console.log("--audiotagCreateChannel "+index);
+}
+
+function at_imp_mandreel_audio_playChannel(filename,channel,vol,loop,pitch)
+{
+	at_imp_mandreel_audio_stopChannel(channel);
+	var fileNameNoExt = wa_getFileNameNoExt(filename);
+	var time = maudioSecondsPos[fileNameNoExt];
+	if ( time != null )
+	{
+		console.log("play "+fileNameNoExt+" "+time);
+		if ( maudiotagAvailableChannels.length > 0 )
+		{
+			var sound = maudiotagAvailableChannels.pop();
+			var duration = maudiotagDurations[fileNameNoExt];
+			sound.currentTime = time;
+			console.log("OK "+sound.currentTime);
+			sound.play();
+			maudiotagChannels[channel] = sound;
+			maudioChannelEnd[channel] = time+(duration/1000.0);
+		}
+	}
+	else
+	{
+		console.log("not found play "+fileNameNoExt);
+	}
+}
+
+function at_imp_mandreel_audio_stopChannel(channel)
+{
+	var sound = maudiotagChannels[channel];
+	if ( sound != null )
+	{
+		sound.pause();
+		maudiotagAvailableChannels.push(sound);
+		maudiotagChannels[channel] = null;
+	}
+}
+
+var mandreel_flash_socket_callback = null
+
+function mandreel_flash_sockets_load_flash(callback)
+{
+	mandreel_flash_socket_callback = callback;
+	var failed = "";
+	try
+	{
+		var mandreelSocketsSwf = g_mandreel_working_folder+"mandreelflashsockets.swf";
+		var swf = swfobject.createSWF({ data:mandreelSocketsSwf, width:"0", height:"0", allowScriptAccess:"always" }, { menu:"false" }, "FlashDivSockets");
+		if ( !swf )
+			failed  = "Unable to open MandreelFlashSockets.swf";
+	}
+	catch(err)
+	{
+		failed  = err;
+	}
+}
+
+var js_mandreel_flash_socket_swf_loaded = false;
+
+function js_mandreel_flash_socket_ready()
+{
+	js_mandreel_flash_socket_swf_loaded = true;
+	if (mandreel_flash_socket_callback)
+		mandreel_flash_socket_callback();
+}
+
+
+function Mandreel_Socket_InitLibrary(sp)
+{
+	//mandreel_flash_sockets_load_flash();
+}
+
+
+function mandreel_flash_sockets_getFlashMovieObject(movieName)
+{
+	if (Mandreel_window.document[movieName])
+	{
+		return Mandreel_window.document[movieName];
+	}
+	if (navigator.appName.indexOf("Microsoft Internet")==-1)
+	{
+		if (document.embeds && document.embeds[movieName])
+			return document.embeds[movieName];
+	}
+	else
+	{
+		return document.getElementById(movieName);
+	}
+}
+
+function js_mandreel_flash_socket_onError(message)
+{
+	var id = parseInt(message);
+
+	var sp = g_stack_pointer+512*1024;
+
+	dump('on error ' + id);
+
+	heap32[sp>>2] = id;
+	mandreel_flash_tcp_onError(sp);
+
+}
+function js_mandreel_flash_socket_onConnect(message)
+{
+	var id = parseInt(message);
+
+	var sp = g_stack_pointer+512*1024;
+
+	dump('connected ' + id);
+
+	heap32[sp>>2] = id;
+	mandreel_flash_tcp_onConnect(sp);
+}
+
+function js_mandreel_flash_tcp_receive_callbak(message)
+{
+	var strings = message.split(' ');
+
+	var id = parseInt(strings[0]);
+	var data = strings[1];
+
+	var sp = g_stack_pointer+512*1024;
+
+	var data_ptr = sp + 1024;
+	fill_ptr_from_string(data_ptr,data);
+
+	heap32[sp>>2] = id;
+	heap32[(sp+4)>>2] = data_ptr;
+	mandreel_flash_tcp_receive_callbak(sp);
+}
+
+function js_mandreel_flash_tcp_update(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+	var size = heap32[sp>>2];sp+=4;
+
+	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
+	flashMovie.receiveMessage("receive " + id + " " + size);
+}
+
+function js_mandreel_flash_tcp_create(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+
+	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
+	flashMovie.receiveMessage("create " + id);
+}
+
+function js_mandreel_flash_tcp_connectTo(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+	var ptr_string = heap32[sp>>2];sp+=4;
+	var port = heap32[sp>>2];sp+=4;
+
+	var server_name = get_string_from_ptr(ptr_string);
+
+	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
+	flashMovie.receiveMessage("connect " + id + " " + server_name + " " + port);
+}
+
+function js_mandreel_flash_tcp_close(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+
+
+	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
+	flashMovie.receiveMessage("close " + id);
+	dump("js_mandreel_flash_tcp_close " + id);
+}
+function js_mandreel_flash_tcp_write(sp)
+{
+	var id = heap32[sp>>2];sp+=4;
+	var ptr = heap32[sp>>2];sp+=4;
+
+	var message = get_string_from_ptr(ptr);
+
+	dump('js_mandreel_flash_tcp_write ' + message);
+
+	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
+	r_g0 = flashMovie.receiveMessage("send " + id + " " + message);
+}
+
+
+
+function js_mandreel_flash_tcp_dump(msg)
+{
+	dump(msg);
+}
+
+function _GLOBAL__I_Landscape02Vtx(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZL10raycastBar;
+	heap32[(g0)] = 8;
+	r0 = r0 >> 2;
+	_Znwj(i7);
+	heap32[(r0+10006)] = r_g0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	heap32[(r0+10001)] = 0;
+	heap32[(r0+10005)] = 0;
+	heap32[(r0+10004)] = 9999;
+	heap32[(r0+10003)] = 0;
+	heap32[(r0+10002)] = 0;
+	return;
+}
+
+function _GLOBAL__D_Landscape02Vtx(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZL10raycastBar;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+10006)];
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN15DemoApplication6myinitEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15DemoApplication16getDynamicsWorldEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU16[(r0+14)>>1];
+	r3 = heapU16[(r1+4)>>1];
+	r2 = r2 & r3;
+	r2 = r2 & 65535;
+	if(r2 ==0) //_LBB4_2
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r1 = heapU16[(r1+6)>>1];
+	r0 = heapU16[(r0+12)>>1];
+	r0 = r1 & r0;
+	r0 = r0 & 65535;
+	r1 = 0;
+	r0 = r0 != r1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN16btCollisionWorld24ClosestRayResultCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld24ClosestRayResultCallbackE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btCollisionWorld24ClosestRayResultCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld24ClosestRayResultCallbackE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btCollisionWorld24ClosestRayResultCallback15addSingleResultERNS_14LocalRayResultEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp)];
+	f0 = heapFloat[(r0+6)];
+	r1 = r1 >> 2;
+	f1 = heapFloat[(r1+1)];
+	if(f0 <=f1) //_LBB7_2
+{
+	r2 = heap32[(fp+2)];
+	heapFloat[(r1+1)] = f0;
+	r3 = heap32[(r0)];
+	heap32[(r1+2)] = r3;
+	if(r2 ==0) //_LBB7_4
+{
+	r2 = r3 >> 2;
+	f0 = heapFloat[(r0+2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r0+3)];
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r0+4)];
+	f7 = heapFloat[(r2+3)];
+	f8 = heapFloat[(r2+9)];
+	f9 = heapFloat[(r2+10)];
+	f10 = heapFloat[(r2+11)];
+	f11 = heapFloat[(r2+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f11*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f10*f6;
+	f3 = f4+f5;
+	heapFloat[(r1+13)] = f1;
+	f0 = f0+f2;
+	heapFloat[(r1+14)] = f3;
+	heapFloat[(r1+15)] = f0;
+	heap32[(r1+16)] = 0;
+}
+else{
+	heap32[(r1+13)] = heap32[(r0+2)];
+	heap32[(r1+14)] = heap32[(r0+3)];
+	heap32[(r1+15)] = heap32[(r0+4)];
+	heap32[(r1+16)] = heap32[(r0+5)];
+}
+	f0 =                         1;
+	f1 = heapFloat[(r0+6)];
+	f2 = heapFloat[(r1+9)];
+	f3 = heapFloat[(r1+5)];
+	f0 = f0-f1;
+	f3 = f3*f0;
+	f2 = f2*f1;
+	f2 = f3+f2;
+	heapFloat[(r1+17)] = f2;
+	f2 = heapFloat[(r1+6)];
+	f3 = heapFloat[(r1+10)];
+	f2 = f2*f0;
+	f3 = f3*f1;
+	f2 = f2+f3;
+	heapFloat[(r1+18)] = f2;
+	f2 = heapFloat[(r1+7)];
+	f3 = heapFloat[(r1+11)];
+	f0 = f2*f0;
+	f1 = f3*f1;
+	f0 = f0+f1;
+	heapFloat[(r1+19)] = f0;
+	f0 = heapFloat[(r0+6)];
+	f_g0 = f0;
+	return;
+}
+else{
+	r0 = _2E_str3;
+	r1 = _2E_str4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 250;
+	_assert(i7);
+}
+}
+
+function _ZN20btDefaultMotionStateD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btDefaultMotionState;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN20btDefaultMotionStateD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btDefaultMotionState;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK20btDefaultMotionState17getWorldTransformER11btTransform(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+17)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+21)];
+	f3 = heapFloat[(r0+5)];
+	f4 = heapFloat[(r0+2)];
+	f5 = heapFloat[(r0+6)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r0+25)];
+	f9 = heapFloat[(r0+9)];
+	f10 = heapFloat[(r0+18)];
+	f11 = heapFloat[(r0+22)];
+	f12 = heapFloat[(r0+19)];
+	f13 = heapFloat[(r0+13)];
+	f14 = heapFloat[(r0+3)];
+	f15 = heapFloat[(r0+23)];
+	f16 = heapFloat[(r0+30)];
+	f17 = heapFloat[(r0+14)];
+	f18 = heapFloat[(r0+7)];
+	r1 = heap32[(fp+1)];
+	f19 = heapFloat[(r0+26)];
+	f20 = heapFloat[(r0+31)];
+	f21 = heapFloat[(r0+27)];
+	f22 = heapFloat[(r0+15)];
+	f23 = heapFloat[(r0+11)];
+	f24 = heapFloat[(r0+10)];
+	f25 = heapFloat[(r0+29)];
+	f26 = f4*f0;
+	f27 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	r0 = r1 >> 2;
+	f28 = f14*f0;
+	f29 = f18*f2;
+	f26 = f26+f27;
+	f27 = f24*f8;
+	f6 = f6+f7;
+	f7 = f28+f29;
+	f28 = f23*f8;
+	f26 = f26+f27;
+	heapFloat[(r0)] = f6;
+	f6 = f1*f10;
+	f27 = f3*f11;
+	f7 = f7+f28;
+	heapFloat[(r0+1)] = f26;
+	heapFloat[(r0+2)] = f7;
+	f7 = f4*f10;
+	f26 = f5*f11;
+	f6 = f6+f27;
+	f27 = f9*f19;
+	f28 = f14*f10;
+	f29 = f18*f11;
+	f7 = f7+f26;
+	f26 = f24*f19;
+	f6 = f6+f27;
+	heap32[(r0+3)] = 0;
+	f27 = f28+f29;
+	f28 = f23*f19;
+	f7 = f7+f26;
+	heapFloat[(r0+4)] = f6;
+	f1 = f1*f12;
+	f3 = f3*f15;
+	f6 = f27+f28;
+	heapFloat[(r0+5)] = f7;
+	heapFloat[(r0+6)] = f6;
+	f4 = f4*f12;
+	f5 = f5*f15;
+	f1 = f1+f3;
+	f3 = f9*f21;
+	f6 = -f25;
+	f7 = f14*f12;
+	f9 = f18*f15;
+	f4 = f4+f5;
+	f5 = f24*f21;
+	f1 = f1+f3;
+	heap32[(r0+7)] = 0;
+	f3 = f0*f13;
+	f14 = f2*f17;
+	f0 = f0*f6;
+	f2 = f2*f16;
+	f7 = f7+f9;
+	f9 = f23*f21;
+	f4 = f4+f5;
+	heapFloat[(r0+8)] = f1;
+	f1 = f10*f13;
+	f5 = f11*f17;
+	f10 = f10*f6;
+	f11 = f11*f16;
+	f3 = f3+f14;
+	f14 = f8*f22;
+	f0 = f0-f2;
+	f2 = f8*f20;
+	f7 = f7+f9;
+	heapFloat[(r0+9)] = f4;
+	heapFloat[(r0+10)] = f7;
+	f4 = f12*f13;
+	f7 = f15*f17;
+	f6 = f12*f6;
+	f8 = f15*f16;
+	f1 = f1+f5;
+	f5 = f19*f22;
+	f9 = f10-f11;
+	f10 = f19*f20;
+	f3 = f3+f14;
+	f0 = f0-f2;
+	f2 = f4+f7;
+	f4 = f21*f22;
+	f6 = f6-f8;
+	f7 = f21*f20;
+	f1 = f1+f5;
+	f5 = f9-f10;
+	f0 = f3+f0;
+	heap32[(r0+11)] = 0;
+	f2 = f2+f4;
+	f3 = f6-f7;
+	f1 = f1+f5;
+	heapFloat[(r0+12)] = f0;
+	f0 = f2+f3;
+	heapFloat[(r0+13)] = f1;
+	heapFloat[(r0+14)] = f0;
+	heap32[(r0+15)] = 0;
+	return;
+}
+
+function _ZN20btDefaultMotionState17setWorldTransformERK11btTransform(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r0+17)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r0+21)];
+	f4 = heapFloat[(r0+18)];
+	f5 = heapFloat[(r0+22)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r1+2)];
+	f9 = heapFloat[(r0+25)];
+	f10 = heapFloat[(r1+8)];
+	f11 = heapFloat[(r0+29)];
+	f12 = heapFloat[(r1+4)];
+	f13 = heapFloat[(r0+19)];
+	f14 = heapFloat[(r1+9)];
+	f15 = heapFloat[(r0+30)];
+	f16 = heapFloat[(r1+5)];
+	f17 = heapFloat[(r0+23)];
+	f18 = heapFloat[(r1+10)];
+	f19 = heapFloat[(r0+31)];
+	f20 = heapFloat[(r1+6)];
+	f21 = heapFloat[(r0+27)];
+	f22 = heapFloat[(r0+26)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r1+14)];
+	f26 = heapFloat[(r1+13)];
+	f27 = heapFloat[(r1+12)];
+	f28 = f13*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(r0+1)] = f6;
+	f6 = f1*f12;
+	f24 = f3*f16;
+	f7 = f7+f28;
+	heapFloat[(r0+2)] = f23;
+	heapFloat[(r0+3)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f9*f20;
+	f28 = f13*f12;
+	f29 = f17*f16;
+	f7 = f7+f23;
+	f23 = f22*f20;
+	f6 = f6+f24;
+	heap32[(r0+4)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f20;
+	f7 = f7+f23;
+	heapFloat[(r0+5)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f14;
+	f6 = f24+f28;
+	heapFloat[(r0+6)] = f7;
+	heapFloat[(r0+7)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f1 = f1+f3;
+	f3 = f9*f18;
+	f6 = f13*f10;
+	f7 = f17*f14;
+	f4 = f4+f5;
+	f5 = f22*f18;
+	f1 = f1+f3;
+	heap32[(r0+8)] = 0;
+	f0 = f0*f11;
+	f2 = f2*f15;
+	f3 = f6+f7;
+	f6 = f21*f18;
+	f4 = f4+f5;
+	heapFloat[(r0+9)] = f1;
+	f1 = f12*f11;
+	f5 = f16*f15;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r0+10)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r0+11)] = f3;
+	f2 = f10*f11;
+	f3 = f14*f15;
+	f1 = f1+f5;
+	f4 = f20*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f18*f19;
+	f0 = f0+f27;
+	heap32[(r0+12)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r0+13)] = f0;
+	f0 = f2+f25;
+	heapFloat[(r0+14)] = f1;
+	heapFloat[(r0+15)] = f0;
+	heap32[(r0+16)] = 0;
+	return;
+}
+
+function _ZN17btTypedConstraint21setupSolverConstraintER20btAlignedObjectArrayI18btSolverConstraintEiif(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN17btTypedConstraint23solveConstraintObsoleteER11btRigidBodyS1_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN13BenchmarkDemo15displayCallbackEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN13BenchmarkDemo11exitPhysicsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+9)];
+if(!(r1 <1)) //_LBB15_5
+{
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+11)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+if(!(r2 ==0)) //_LBB15_4
+{
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+1)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+9)];
+	if(r2 >r1) //_LBB15_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r1 = heap32[(r0+1)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2+2)];
+	r3 = (r2 + -1)|0;
+_9: do {
+if(!(r3 <0)) //_LBB15_16
+{
+	r3 = 1;
+	r2 = (r3 - r2)|0;
+_11: while(true){
+	r3 = r1 >> 2;
+	r3 = heap32[(r3+4)];
+	r4 = r2 << 2;
+	r3 = (r3 - r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = heapU8[r3+232];
+	r4 = r4 & 2;
+if(!(r4 ==0)) //_LBB15_9
+{
+	if(r3 !=0) //_LBB15_10
+{
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+118)];
+if(!(r4 ==0)) //_LBB15_9
+{
+	r1 = r4 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+1)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = heap32[(r0+1)];
+}
+}
+}
+	r4 = r1 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+9)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	if(r3 !=0) //_LBB15_15
+{
+	r1 = r3 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+2)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	if(r2 ==0) //_LBB15_16
+{
+break _9;
+}
+else{
+	r2 = (r2 + 1)|0;
+	r1 = heap32[(r0+1)];
+continue _11;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r0+4)];
+_23: do {
+if(!(r1 <1)) //_LBB15_21
+{
+	r1 = 0;
+_25: while(true){
+	r2 = heap32[(r0+6)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+if(!(r2 ==0)) //_LBB15_20
+{
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+1)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+4)];
+	if(r2 >r1) //_LBB15_18
+{
+continue _25;
+}
+else{
+break _23;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r0+1)];
+if(!(r1 ==0)) //_LBB15_23
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r1 = heap32[(r0+15)];
+if(!(r1 ==0)) //_LBB15_25
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r1 = heap32[(r0+13)];
+if(!(r1 ==0)) //_LBB15_27
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r1 = heap32[(r0+14)];
+if(!(r1 ==0)) //_LBB15_29
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r0 = heap32[(r0+16)];
+if(!(r0 ==0)) //_LBB15_31
+{
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	return;
+}
+
+function _ZN7RagDollD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV7RagDoll;
+	r2 = 0;
+	r3 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r3)] = r1;
+	r1 = r2;
+_1: while(true){
+	r4 = heap32[(r3+1)];
+	r5 = r1 << 2;
+	r6 = r4 >> 2;
+	r5 = (r0 - r5)|0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+14)];
+	r7 = heap32[(r5+24)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r4 = heap32[(r5+24)];
+if(!(r4 ==0)) //_LBB16_3
+{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+1)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r4 = (r2 - r1)|0;
+	r4 = r4 << 2;
+	r4 = (r0 + r4)|0;
+	r1 = (r1 + -1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4+24)] = 0;
+	if(r1 !=-10) //_LBB16_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	r1 = 2;
+_7: while(true){
+	r2 = heap32[(r3+1)];
+	r4 = r2 >> 2;
+	r5 = r1 << 2;
+	r4 = heap32[(r4)];
+	r5 = (r0 + r5)|0;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r4 = heap32[(r4+21)];
+	r6 = heap32[(r5+11)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r2 = heap32[(r5+11)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+118)];
+	if(r4 !=0) //_LBB16_7
+{
+	r2 = r4 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r5+11)];
+}
+if(!(r2 ==0)) //_LBB16_10
+{
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	heap32[(r5+11)] = 0;
+	r2 = heap32[(r5)];
+if(!(r2 ==0)) //_LBB16_12
+{
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	heap32[(r5)] = 0;
+	if(r1 !=13) //_LBB16_5
+{
+continue _7;
+}
+else{
+break _7;
+}
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN7RagDollD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV7RagDoll;
+	r2 = 0;
+	r3 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r3)] = r1;
+	r1 = r2;
+_1: while(true){
+	r4 = heap32[(r3+1)];
+	r5 = r1 << 2;
+	r6 = r4 >> 2;
+	r5 = (r0 - r5)|0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+14)];
+	r7 = heap32[(r5+24)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r4 = heap32[(r5+24)];
+if(!(r4 ==0)) //_LBB17_3
+{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+1)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r4 = (r2 - r1)|0;
+	r4 = r4 << 2;
+	r4 = (r0 + r4)|0;
+	r1 = (r1 + -1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4+24)] = 0;
+	if(r1 !=-10) //_LBB17_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	r1 = 2;
+_7: while(true){
+	r2 = heap32[(r3+1)];
+	r4 = r2 >> 2;
+	r5 = r1 << 2;
+	r4 = heap32[(r4)];
+	r5 = (r0 + r5)|0;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r4 = heap32[(r4+21)];
+	r6 = heap32[(r5+11)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r2 = heap32[(r5+11)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+118)];
+	if(r4 !=0) //_LBB17_7
+{
+	r2 = r4 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r5+11)];
+}
+if(!(r2 ==0)) //_LBB17_10
+{
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	heap32[(r5+11)] = 0;
+	r2 = heap32[(r5)];
+if(!(r2 ==0)) //_LBB17_12
+{
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	heap32[(r5)] = 0;
+	if(r1 !=13) //_LBB17_5
+{
+continue _7;
+}
+else{
+break _7;
+}
+}
+	return;
+}
+
+function _ZN13BenchmarkDemoD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13BenchmarkDemo;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemo11exitPhysicsEv(i7);
+	r1 = heap32[(r2+11)];
+if(!(r1 ==0)) //_LBB18_4
+{
+	r3 = heapU8[r0+48];
+if(!(r3 ==0)) //_LBB18_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	r1 = 1;
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+6)];
+if(!(r3 ==0)) //_LBB18_8
+{
+	r4 = heapU8[r0+28];
+if(!(r4 ==0)) //_LBB18_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+6)] = 0;
+}
+	heap8[r0+28] = r1;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN15DemoApplication20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -168;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 ==0)) //_LBB19_3
+{
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+1)];
+if(!(r1 !=35)) //_LBB19_3
+{
+	r0 = _2E_str5;
+	r1 = _2E_str6;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1297;
+	_assert(i7);
+}
+}
+	f0 = heapFloat[(fp+1)];
+	r1 = sp + -152;
+	r2 = r1 >> 2;
+	heap32[(fp+-38)] = 0;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	f1 =                         0;
+	heap32[(r2+3)] = 0;
+if(!(f0 ==f1)) //_LBB19_5
+{
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+8)];
+	heap32[(g0)] = r0;
+	heapFloat[(g0+1)] = f0;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r1 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	heap32[(r4)] = r5;
+	heap32[(g0)] = 627;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB19_7
+{
+	r5 = 0;
+	r6 = (r4 + 4)|0;
+	r5 = (r5 - r6)|0;
+	r5 = r5 & 15;
+	r5 = (r4 + r5)|0;
+	r6 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+	r4 = r6;
+}
+	r5 = r4 >> 2;
+	heap32[(r5+41)] = 1065353216;
+	heap32[(r5+42)] = 1065353216;
+	heap32[(r5+43)] = 1065353216;
+	heap32[(r5+44)] = 0;
+	heap32[(r5+45)] = 0;
+	heap32[(r5+46)] = 1566444395;
+	heap32[(r5+47)] = 0;
+	heap32[(r5+48)] = 0;
+	heap32[(r5+49)] = 0;
+	heap32[(r5+50)] = 0;
+	heap32[(r5+51)] = 1;
+	heap32[(r5+52)] = -1;
+	heap32[(r5+53)] = -1;
+	heap32[(r5+54)] = 1;
+	heap32[(r5+55)] = 0;
+	heap32[(r5+56)] = 1056964608;
+	heap32[(r5+57)] = 0;
+	heap32[(r5+58)] = 1;
+	heap32[(r5+59)] = 0;
+	heap32[(r5+60)] = 1065353216;
+	heap32[(r5+61)] = 0;
+	heap32[(r5+62)] = 0;
+	heap32[(r5+63)] = 0;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap32[(r5+4)] = 0;
+	heap32[(r5+5)] = 0;
+	heap32[(r5+6)] = 1065353216;
+	heap32[(r5+7)] = 0;
+	heap32[(r5+8)] = 0;
+	heap32[(r5+9)] = 0;
+	heap32[(r5+10)] = 0;
+	heap32[(r5+11)] = 1065353216;
+	heap32[(r5+12)] = 0;
+	heap32[(r5+13)] = 0;
+	heap32[(r5+14)] = 0;
+	r6 = _ZTV11btRigidBody;
+	heap32[(r5+15)] = 0;
+	r6 = (r6 + 8)|0;
+	heap32[(r5+16)] = 0;
+	r7 = 1;
+	heap32[(r5)] = r6;
+	heap8[r4+492] = r7;
+	heap32[(r5+122)] = 0;
+	heap32[(r5+120)] = 0;
+	r6 = sp + -136;
+	heap32[(r5+121)] = 0;
+	r7 = r6 >> 2;
+	heapFloat[(fp+-34)] = f0;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+18)] = r0;
+	heap32[(r7+19)] = heap32[(fp+-38)];
+	heap32[(r7+20)] = heap32[(r2+1)];
+	heap32[(r7+21)] = heap32[(r2+2)];
+	heap32[(r7+22)] = heap32[(r2+3)];
+	heap32[(r7+23)] = 0;
+	heap32[(r7+24)] = 0;
+	heap32[(r7+25)] = 1056964608;
+	heap32[(r7+26)] = 0;
+	heap32[(r7+27)] = 1061997773;
+	r0 = 0;
+	heap32[(r7+28)] = 1065353216;
+	heap8[sp+-20] = r0;
+	heap32[(r7+30)] = 1000593162;
+	heap32[(r7+31)] = 1008981770;
+	heap32[(r7+32)] = 1008981770;
+	heap32[(r7+33)] = 1008981770;
+	heap32[(r7+2)] = 1065353216;
+	heap32[(r7+3)] = 0;
+	heap32[(r7+4)] = 0;
+	heap32[(r7+5)] = 0;
+	heap32[(r7+6)] = 0;
+	heap32[(r7+7)] = 1065353216;
+	heap32[(r7+8)] = 0;
+	heap32[(r7+9)] = 0;
+	heap32[(r7+10)] = 0;
+	heap32[(r7+11)] = 0;
+	heap32[(r7+12)] = 1065353216;
+	heap32[(r7+13)] = 0;
+	heap32[(r7+14)] = 0;
+	heap32[(r7+15)] = 0;
+	heap32[(r7+16)] = 0;
+	heap32[(r7+17)] = 0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	r0 = r3 >> 2;
+	heap32[(r5+1)] = heap32[(r0)];
+	heap32[(r5+2)] = heap32[(r0+1)];
+	heap32[(r5+3)] = heap32[(r0+2)];
+	heap32[(r5+4)] = heap32[(r0+3)];
+	heap32[(r5+5)] = heap32[(r0+4)];
+	heap32[(r5+6)] = heap32[(r0+5)];
+	heap32[(r5+7)] = heap32[(r0+6)];
+	heap32[(r5+8)] = heap32[(r0+7)];
+	heap32[(r5+9)] = heap32[(r0+8)];
+	heap32[(r5+10)] = heap32[(r0+9)];
+	heap32[(r5+11)] = heap32[(r0+10)];
+	heap32[(r5+12)] = heap32[(r0+11)];
+	heap32[(r5+13)] = heap32[(r0+12)];
+	heap32[(r5+14)] = heap32[(r0+13)];
+	heap32[(r5+15)] = heap32[(r0+14)];
+	r1 = r1 >> 2;
+	heap32[(r5+16)] = heap32[(r0+15)];
+	heap32[(r5+46)] = heap32[(r1+2)];
+	r0 = heap32[(r1+1)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+20)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r_g0 = r4;
+	return;
+}
+
+function _ZN13BenchmarkDemoD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13BenchmarkDemo;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemo11exitPhysicsEv(i7);
+	r1 = heap32[(r2+11)];
+if(!(r1 ==0)) //_LBB20_4
+{
+	r3 = heapU8[r0+48];
+if(!(r3 ==0)) //_LBB20_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	r1 = 1;
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+6)];
+if(!(r3 ==0)) //_LBB20_8
+{
+	r4 = heapU8[r0+28];
+if(!(r4 ==0)) //_LBB20_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+6)] = 0;
+}
+	heap8[r0+28] = r1;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 0;
+	return;
+}
+
+function _ZN13BenchmarkDemo20clientMoveAndDisplayEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -128;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+if(!(r1 ==0)) //_LBB21_2
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 1015580809;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = 1015580809;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r0+1)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r1 = heap32[(r0+17)];
+if(!(r1 !=7)) //_LBB21_10
+{
+	r1 = _ZL10raycastBar;
+	r2 = r1 >> 2;
+	r0 = heap32[(r0+1)];
+	r3 = heap32[(r2+10006)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	r3 = 0;
+	gettimeofday(i7);
+_6: while(true){
+	r4 = sp + -96;
+	r5 = r4 >> 2;
+	heap32[(r5+1)] = 1065353216;
+	r6 = 1;
+	heap32[(r5+2)] = 0;
+	r7 = -1;
+	heap16[(sp+-84)>>1] = r6;
+	r6 = _ZTVN16btCollisionWorld24ClosestRayResultCallbackE;
+	heap16[(sp+-82)>>1] = r7;
+	r7 = (r1 + r3)|0;
+	r6 = (r6 + 8)|0;
+	heap32[(r5+4)] = 0;
+	r8 = r7 >> 2;
+	heap32[(fp+-24)] = r6;
+	heap32[(r5+5)] = heap32[(r8)];
+	heap32[(r5+6)] = heap32[(r8+1)];
+	heap32[(r5+7)] = heap32[(r8+2)];
+	heap32[(r5+8)] = heap32[(r8+3)];
+	heap32[(r5+9)] = heap32[(r8+2000)];
+	heap32[(r5+10)] = heap32[(r8+2001)];
+	heap32[(r5+11)] = heap32[(r8+2002)];
+	r9 = r0 >> 2;
+	heap32[(r5+12)] = heap32[(r8+2003)];
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+7)];
+	r10 = (r7 + 8000)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r4 = heap32[(r5+2)];
+	if(r4 ==0) //_LBB21_6
+{
+	r4 = r7 >> 2;
+	r5 = r7 >> 2;
+	r9 = r7 >> 2;
+	r10 = r7 >> 2;
+	heap32[(r4+6000)] = heap32[(r5+2000)];
+	r4 = r7 >> 2;
+	r5 = r7 >> 2;
+	heap32[(r9+6001)] = heap32[(r10+2001)];
+	r9 = r7 >> 2;
+	r10 = r7 >> 2;
+	heap32[(r4+6002)] = heap32[(r5+2002)];
+	r4 = r7 >> 2;
+	heap32[(r9+6003)] = heap32[(r10+2003)];
+	r5 = r7 >> 2;
+	heap32[(r4+8000)] = 1065353216;
+	r4 = r7 >> 2;
+	heap32[(r5+8001)] = 0;
+	heap32[(r4+8002)] = 0;
+	heap32[(r8+8003)] = 0;
+}
+else{
+	r4 = r7 >> 2;
+	r9 = r7 >> 2;
+	heap32[(r4+6000)] = heap32[(r5+17)];
+	r4 = r7 >> 2;
+	heap32[(r9+6001)] = heap32[(r5+18)];
+	r9 = r7 >> 2;
+	heap32[(r4+6002)] = heap32[(r5+19)];
+	heap32[(r9+6003)] = heap32[(r5+20)];
+	f0 = heapFloat[(r5+13)];
+	r4 = r7 >> 2;
+	heapFloat[(r4+8000)] = f0;
+	f1 = heapFloat[(r5+14)];
+	r9 = r7 >> 2;
+	heapFloat[(r9+8001)] = f1;
+	f2 = heapFloat[(r5+15)];
+	r7 = r7 >> 2;
+	f0 = f0*f0;
+	f1 = f1*f1;
+	heapFloat[(r7+8002)] = f2;
+	heap32[(r8+8003)] = heap32[(r5+16)];
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r4+8000)];
+	f1 = f1*f0;
+	heapFloat[(r4+8000)] = f1;
+	f1 = heapFloat[(r9+8001)];
+	f1 = f1*f0;
+	heapFloat[(r9+8001)] = f1;
+	f1 = heapFloat[(r7+8002)];
+	f0 = f1*f0;
+	heapFloat[(r7+8002)] = f0;
+}
+	r3 = (r3 + 16)|0;
+	heap32[(fp+-24)] = r6;
+if(!(r3 !=8000)) //_LBB21_4
+{
+break _6;
+}
+}
+	r0 = heap32[(r2+10001)];
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	r3 = heap32[(r2+10006)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 - r5)|0;
+	r1 = (r1 / 1000)|0;
+	r3 = (r3 * 1000)|0;
+	r1 = (r1 + r3)|0;
+	r0 = (r1 + r0)|0;
+	heap32[(r2+10001)] = r0;
+	r1 = heap32[(r2+10000)];
+	r1 = (r1 + 1)|0;
+	heap32[(r2+10000)] = r1;
+if(!(r1 <51)) //_LBB21_10
+{
+	r3 = heap32[(r2+10004)];
+	r3 = r0 < r3 ? r0 : r3;
+	heap32[(r2+10004)] = r3;
+	r4 = heap32[(r2+10005)];
+	r4 = r0 > r4 ? r0 : r4;
+	heap32[(r2+10005)] = r4;
+	r5 = heap32[(r2+10002)];
+	r5 = (r0 + r5)|0;
+	heap32[(r2+10002)] = r5;
+	r6 = heap32[(r2+10003)];
+	r6 = (r6 + 1)|0;
+	f0 = r5; //fitos r5, f0
+	f1 = r6; //fitos r6, f1
+	f0 = f0/f1;
+	heap32[(r2+10003)] = r6;
+	r5 = _2E_str7;
+	r1 = (r1 * 500)|0;
+	f0 = f0; //fstod f0, f0
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	llvm_writeDouble((i7+24),f0);
+	printf(i7);
+	heap32[(r2+10001)] = 0;
+	heap32[(r2+10000)] = 0;
+}
+}
+	return;
+}
+
+function _ZN13BenchmarkDemo10createWallERK9btVector3iS2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -96;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	f0 = heapFloat[(r0+2)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1)] = r2;
+	heap32[(g0)] = 71;
+	malloc(i7);
+	r1 = r_g0;
+	r2 = heap32[(fp)];
+	if(r1 !=0) //_LBB22_2
+{
+	r3 = 0;
+	r4 = (r1 + 4)|0;
+	r3 = (r3 - r4)|0;
+	r3 = r3 & 15;
+	r3 = (r1 + r3)|0;
+	r4 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r1;
+	r1 = r4;
+}
+	r3 = r1 >> 2;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 1065353216;
+	heap32[(r3+4)] = 1065353216;
+	heap32[(r3+5)] = 1065353216;
+	r4 = _ZTV10btBoxShape;
+	heap32[(r3+6)] = 0;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+11)] = 1025758986;
+	heap32[(r3)] = r4;
+	f3 =     -0.039999999105930328;
+	f2 = f2+f3;
+	heap32[(r3+1)] = 0;
+	f1 = f1+f3;
+	heapFloat[(r3+7)] = f2;
+	f0 = f0+f3;
+	heapFloat[(r3+8)] = f1;
+	heapFloat[(r3+9)] = f0;
+	r4 = sp + -16;
+	heap32[(r3+10)] = 0;
+	r3 = r4 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r4;
+	_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3(i7);
+	f4 = heapFloat[(r0+1)];
+	f0 = heapFloat[(r0+2)];
+	r0 = sp + -80;
+	r3 = r0 >> 2;
+	heap32[(fp+-20)] = 1065353216;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = 1065353216;
+	heap32[(r3+6)] = 0;
+	heap32[(r3+7)] = 0;
+	heap32[(r3+8)] = 0;
+	heap32[(r3+9)] = 0;
+	heap32[(r3+10)] = 1065353216;
+	heap32[(r3+11)] = 0;
+	f1 = f0+f0;
+	f2 =                       -12;
+	heap32[(r3+12)] = 0;
+	heap32[(r3+13)] = 0;
+	f2 = f1*f2;
+	f3 =                       0.5;
+	f3 = f2*f3;
+	f2 = f4+f4;
+	r5 = 12;
+	heap32[(r3+14)] = 0;
+	heap32[(r3+15)] = 0;
+_4: while(true){
+if(!(r5 <1)) //_LBB22_4
+{
+	r4 = 0;
+_8: while(true){
+	r6 = r2 >> 2;
+	f5 = r4; //fitos r4, f5
+	f6 =                         0;
+	f7 = heapFloat[(r6)];
+	f8 = heapFloat[(r6+2)];
+	f9 = heapFloat[(r6+1)];
+	f5 = f5*f1;
+	f6 = f7+f6;
+	f5 = f5+f3;
+	f7 = f9+f4;
+	heapFloat[(r3+12)] = f6;
+	f5 = f8+f5;
+	heapFloat[(r3+13)] = f7;
+	r6 = _ZL14benchmarkDemo4;
+	heapFloat[(r3+14)] = f5;
+	r7 = r6 >> 2;
+	heap32[(r3+15)] = 0;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r1;
+	r4 = (r4 + 1)|0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	if(r5 !=r4) //_LBB22_3
+{
+continue _8;
+}
+else{
+break _8;
+}
+}
+}
+	r5 = (r5 + -1)|0;
+	f4 = f4+f2;
+	f3 = f3+f0;
+	if(r5 ==0) //_LBB22_8
+{
+break _4;
+}
+else{
+continue _4;
+}
+}
+	return;
+}
+
+function _ZN13BenchmarkDemo19createLargeMeshBodyEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+var __label__ = 0;
+	i7 = sp + -80;var g0 = i7>>2; // save stack
+	r0 = sp + -64;
+	r1 = r0 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+5)] = 1065353216;
+	heap32[(r1+6)] = 0;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+8)] = 0;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+10)] = 1065353216;
+	heap32[(r1+11)] = 0;
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = 0;
+	r2 = 0;
+	heap32[(r1+14)] = 0;
+	heap32[(r1+15)] = 0;
+_1: while(true){
+	r3 = gNumAlignedAllocs;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r5 = (r4 + 1)|0;
+	heap32[(r3)] = r5;
+	heap32[(g0)] = 103;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB23_3
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+	r6 = r5 >> 2;
+	heap32[(r6+1)] = 1065353216;
+	heap32[(r6+2)] = 1065353216;
+	r7 = _ZTV26btTriangleIndexVertexArray;
+	heap32[(r6+3)] = 1065353216;
+	r7 = (r7 + 8)|0;
+	heap32[(r6+4)] = 0;
+	r8 = 1;
+	heap32[(r6)] = r7;
+	heap8[r5+36] = r8;
+	heap32[(r6+8)] = 0;
+	heap32[(r6+6)] = 0;
+	r7 = LandscapeVtx;
+	r9 = r2 << 2;
+	r10 = LandscapeVtxCount;
+	r11 = LandscapeIdx;
+	r12 = LandscapeIdxCount;
+	r7 = (r7 + r9)|0;
+	r10 = (r10 + r9)|0;
+	r11 = (r11 + r9)|0;
+	r9 = (r12 + r9)|0;
+	heap32[(r6+7)] = 0;
+	r7 = r7 >> 2;
+	heap32[(r6+12)] = 0;
+	r10 = r10 >> 2;
+	r11 = r11 >> 2;
+	r9 = r9 >> 2;
+	r7 = heap32[(r7)];
+	r10 = heap32[(r10)];
+	r11 = heap32[(r11)];
+	r9 = heap32[(r9)];
+	r12 = (r4 + 2)|0;
+	heap32[(r3)] = r12;
+	heap32[(g0)] = 51;
+	malloc(i7);
+	r12 = r_g0;
+	r9 = (r9 / 3)|0;
+	if(r12 !=0) //_LBB23_6
+{
+	r13 = 0;
+	r14 = (r12 + 4)|0;
+	r13 = (r13 - r14)|0;
+	r13 = r13 & 15;
+	r13 = (r12 + r13)|0;
+	r14 = (r13 + 4)|0;
+	r13 = r13 >> 2;
+	heap32[(r13)] = r12;
+	r12 = r14;
+}
+	heap8[r5+36] = r8;
+	heap32[(r6+8)] = r12;
+	heap32[(r6+7)] = 1;
+	r13 = heap32[(r6+6)];
+	r13 = r13 << 5;
+	r12 = (r12 + r13)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = r9;
+	heap32[(r12+1)] = r11;
+	heap32[(r12+2)] = 6;
+	heap32[(r12+3)] = r10;
+	heap32[(r12+4)] = r7;
+	heap32[(r12+5)] = 12;
+	heap32[(r12+6)] = 3;
+	heap32[(r12+7)] = 0;
+	r7 = heap32[(r6+6)];
+	r9 = (r7 + 1)|0;
+	heap32[(r6+6)] = r9;
+	r7 = r7 << 5;
+	r9 = heap32[(r6+8)];
+	r7 = (r9 + r7)|0;
+	r7 = r7 >> 2;
+	r4 = (r4 + 3)|0;
+	heap32[(r7+6)] = 3;
+	heap32[(r3)] = r4;
+	heap32[(g0)] = 95;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB23_9
+{
+	r4 = 0;
+	r7 = (r3 + 4)|0;
+	r4 = (r4 - r7)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r7 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r7;
+}
+	r4 = r3 >> 2;
+	r7 = _ZTV19btTriangleMeshShape;
+	heap32[(r4+2)] = 0;
+	r7 = (r7 + 8)|0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4)] = r7;
+	heap32[(r4+12)] = r5;
+	heap32[(r4+1)] = 21;
+	r7 = heap32[(r6)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+10)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r_g0;
+	if(r7 ==0) //_LBB23_12
+{
+	heap32[(g0)] = r3;
+	_ZN19btTriangleMeshShape15recalcLocalAabbEv(i7);
+}
+else{
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+12)];
+	r7 = (r3 + 16)|0;
+	r9 = (r3 + 32)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r9;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+	r5 = _ZTV22btBvhTriangleMeshShape;
+	r5 = (r5 + 8)|0;
+	heap32[(r4)] = r5;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	r5 = 0;
+	heap8[r3+60] = r8;
+	heap8[r3+61] = r5;
+	heap32[(r4+1)] = 21;
+	heap32[(g0)] = r3;
+	_ZN22btBvhTriangleMeshShape17buildOptimizedBvhEv(i7);
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = -1043857408;
+	r4 = _ZL14benchmarkDemo4;
+	heap32[(r1+14)] = 0;
+	r5 = r4 >> 2;
+	heap32[(r1+15)] = 0;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r2 = (r2 + 1)|0;
+	r3 = r_g0 >> 2;
+	heap32[(r3+56)] = 1063675494;
+	if(r2 !=8) //_LBB23_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	return;
+}
+
+function _ZN13BenchmarkDemo11createTest6Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	heap32[(g0)] = 127;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB24_2
+{
+	r1 = 0;
+	r2 = (r0 + 4)|0;
+	r1 = (r1 - r2)|0;
+	r1 = r1 & 15;
+	r1 = (r0 + r1)|0;
+	r2 = (r1 + 4)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	r0 = r2;
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	r1 = 0;
+	_ZN17btConvexHullShapeC1EPKfii(i7);
+_4: while(true){
+	r2 = (r1 * -3)|0;
+	r3 = _ZL7TaruVtx;
+	r2 = r2 << 2;
+	r2 = (r3 + r2)|0;
+	r3 = sp + -96;
+	r2 = r2 >> 2;
+	r4 = r3 >> 2;
+	heap32[(fp+-24)] = heap32[(r2)];
+	heap32[(r4+1)] = heap32[(r2+1)];
+	heap32[(r4+2)] = heap32[(r2+2)];
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	r1 = (r1 + -1)|0;
+	_ZN17btConvexHullShape8addPointERK9btVector3(i7);
+	if(r1 ==-43) //_LBB24_10
+{
+break _4;
+}
+else{
+continue _4;
+}
+}
+	r1 = sp + -64;
+	r2 = r1 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 1065353216;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 1065353216;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	heap32[(r2+14)] = 0;
+	r3 = sp + -80;
+	heap32[(r2+15)] = 0;
+	r4 = r3 >> 2;
+	heap32[(fp+-20)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	r5 = r0 >> 2;
+	heap32[(r4+3)] = 0;
+	r4 = heap32[(r5)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+8)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r3;
+	r3 = 10;
+	f0 =                        20;
+	f1 =                         2;
+	f2 =                       -25;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r7 = _ZL14benchmarkDemo4;
+_7: while(true){
+	f3 =                         3;
+	f4 =                        25;
+	f5 = f1+f3;
+	f4 = f0+f4;
+	r4 = 0;
+	r5 = r4;
+_9: while(true){
+	f6 = r5; //fitos r5, f6
+	f6 = f6*f5;
+	f6 = f6+f2;
+	f7 =                         5;
+	f6 = f6*f7;
+	f8 =                         0;
+	f6 = f6+f8;
+	r6 = r4;
+_11: while(true){
+	f9 = r6; //fitos r6, f9
+	f9 = f9*f5;
+	f9 = f9+f2;
+	f9 = f9*f7;
+	f9 = f9+f8;
+	heapFloat[(r2+12)] = f9;
+	heapFloat[(r2+13)] = f4;
+	heapFloat[(r2+14)] = f6;
+	r8 = r7 >> 2;
+	heap32[(r2+15)] = 0;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r0;
+	r6 = (r6 + 1)|0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	if(r6 !=10) //_LBB24_7
+{
+continue _11;
+}
+else{
+break _11;
+}
+}
+	r5 = (r5 + 1)|0;
+	if(r5 !=10) //_LBB24_6
+{
+continue _9;
+}
+else{
+break _9;
+}
+}
+	f4 =        1.1000000238418579;
+	f5 =      -0.05000000074505806;
+	f4 = f1*f4;
+	f1 = f1*f5;
+	f5 =                         9;
+	f3 = f4+f3;
+	f1 = f1*f5;
+	r3 = (r3 + -1)|0;
+	f0 = f0+f3;
+	f2 = f1+f2;
+	f1 = f4;
+	if(r3 ==0) //_LBB24_11
+{
+break _7;
+}
+else{
+continue _7;
+}
+}
+	_ZN13BenchmarkDemo19createLargeMeshBodyEv(i7);
+	return;
+}
+
+function _ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -168;var g0 = i7>>2; // save stack
+	r0 = sp + -16;
+	r1 = r0 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r1+1)] = 0;
+	r2 = heap32[(fp+2)];
+	heap32[(r1+2)] = 0;
+	r3 = r2 >> 2;
+	heap32[(r1+3)] = 0;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+8)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r0;
+	r0 = _ZGVZN11btTransform11getIdentityEvE17identityTransform;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = heapU8[r0];
+if(!(r3 !=0)) //_LBB25_4
+{
+	r3 = _ZGVZN11btMatrix3x311getIdentityEvE14identityMatrix;
+	r4 = heapU8[r3];
+if(!(r4 !=0)) //_LBB25_3
+{
+	r4 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_0_2E_0_2E_0;
+	r5 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_1_2E_0_2E_1;
+	r4 = r4 >> 2;
+	r6 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_2_2E_0_2E_2;
+	r5 = r5 >> 2;
+	heap32[(r4)] = 1065353216;
+	r4 = r6 >> 2;
+	heap32[(r5)] = 1065353216;
+	r5 = 1;
+	heap32[(r4)] = 1065353216;
+	heap8[r3] = r5;
+}
+	r3 = _ZZN11btTransform11getIdentityEvE17identityTransform;
+	r4 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_0_2E_0_2E_0;
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	heap32[(r3)] = heap32[(r4)];
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	r4 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_1_2E_0_2E_1;
+	heap32[(r3+3)] = 0;
+	r4 = r4 >> 2;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = heap32[(r4)];
+	heap32[(r3+6)] = 0;
+	heap32[(r3+7)] = 0;
+	r4 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_2_2E_0_2E_2;
+	heap32[(r3+8)] = 0;
+	r4 = r4 >> 2;
+	heap32[(r3+9)] = 0;
+	heap32[(r3+10)] = heap32[(r4)];
+	heap32[(r3+11)] = 0;
+	heap32[(r3+12)] = 0;
+	heap32[(r3+13)] = 0;
+	heap32[(r3+14)] = 0;
+	r4 = 1;
+	heap32[(r3+15)] = 0;
+	heap8[r0] = r4;
+}
+	r0 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	heap32[(g0)] = 200;
+	r4 = _ZTV20btDefaultMotionState;
+	_Znwj(i7);
+	r6 = r_g0 >> 2;
+	r4 = (r4 + 8)|0;
+	r3 = r3 >> 2;
+	heap32[(r6)] = r4;
+	heap32[(r6+1)] = heap32[(r3)];
+	heap32[(r6+2)] = heap32[(r3+1)];
+	heap32[(r6+3)] = heap32[(r3+2)];
+	heap32[(r6+4)] = heap32[(r3+3)];
+	heap32[(r6+5)] = heap32[(r3+4)];
+	heap32[(r6+6)] = heap32[(r3+5)];
+	heap32[(r6+7)] = heap32[(r3+6)];
+	heap32[(r6+8)] = heap32[(r3+7)];
+	heap32[(r6+9)] = heap32[(r3+8)];
+	heap32[(r6+10)] = heap32[(r3+9)];
+	heap32[(r6+11)] = heap32[(r3+10)];
+	heap32[(r6+12)] = heap32[(r3+11)];
+	heap32[(r6+13)] = heap32[(r3+12)];
+	heap32[(r6+14)] = heap32[(r3+13)];
+	r4 = _ZZN11btTransform11getIdentityEvE17identityTransform;
+	heap32[(r6+15)] = heap32[(r3+14)];
+	r4 = r4 >> 2;
+	heap32[(r6+16)] = heap32[(r3+15)];
+	heap32[(r6+17)] = heap32[(r4)];
+	heap32[(r6+18)] = heap32[(r4+1)];
+	heap32[(r6+19)] = heap32[(r4+2)];
+	heap32[(r6+20)] = heap32[(r4+3)];
+	heap32[(r6+21)] = heap32[(r4+4)];
+	heap32[(r6+22)] = heap32[(r4+5)];
+	heap32[(r6+23)] = heap32[(r4+6)];
+	heap32[(r6+24)] = heap32[(r4+7)];
+	heap32[(r6+25)] = heap32[(r4+8)];
+	heap32[(r6+26)] = heap32[(r4+9)];
+	heap32[(r6+27)] = heap32[(r4+10)];
+	heap32[(r6+28)] = heap32[(r4+11)];
+	heap32[(r6+29)] = heap32[(r4+12)];
+	heap32[(r6+30)] = heap32[(r4+13)];
+	heap32[(r6+31)] = heap32[(r4+14)];
+	heap32[(r6+32)] = heap32[(r4+15)];
+	heap32[(r6+33)] = heap32[(r3)];
+	heap32[(r6+34)] = heap32[(r3+1)];
+	heap32[(r6+35)] = heap32[(r3+2)];
+	heap32[(r6+36)] = heap32[(r3+3)];
+	heap32[(r6+37)] = heap32[(r3+4)];
+	heap32[(r6+38)] = heap32[(r3+5)];
+	heap32[(r6+39)] = heap32[(r3+6)];
+	heap32[(r6+40)] = heap32[(r3+7)];
+	heap32[(r6+41)] = heap32[(r3+8)];
+	heap32[(r6+42)] = heap32[(r3+9)];
+	heap32[(r6+43)] = heap32[(r3+10)];
+	heap32[(r6+44)] = heap32[(r3+11)];
+	heap32[(r6+45)] = heap32[(r3+12)];
+	heap32[(r6+46)] = heap32[(r3+13)];
+	heap32[(r6+47)] = heap32[(r3+14)];
+	heap32[(r6+48)] = heap32[(r3+15)];
+	r3 = sp + -152;
+	heap32[(r6+49)] = 0;
+	r4 = r3 >> 2;
+	heap32[(fp+-38)] = 1065353216;
+	heap32[(r4+1)] = r_g0;
+	heap32[(r4+18)] = r2;
+	heap32[(r4+19)] = heap32[(fp+-4)];
+	heap32[(r4+20)] = heap32[(r1+1)];
+	heap32[(r4+21)] = heap32[(r1+2)];
+	heap32[(r4+22)] = heap32[(r1+3)];
+	heap32[(r4+23)] = 0;
+	heap32[(r4+24)] = 0;
+	heap32[(r4+25)] = 1056964608;
+	heap32[(r4+26)] = 0;
+	heap32[(r4+27)] = 1061997773;
+	r1 = 0;
+	heap32[(r4+28)] = 1065353216;
+	heap8[sp+-36] = r1;
+	heap32[(r4+30)] = 1000593162;
+	heap32[(r4+31)] = 1008981770;
+	heap32[(r4+32)] = 1008981770;
+	heap32[(r4+33)] = 1008981770;
+	heap32[(r4+2)] = 1065353216;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = 0;
+	heap32[(r4+7)] = 1065353216;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 0;
+	heap32[(r4+11)] = 0;
+	heap32[(r4+12)] = 1065353216;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	heap32[(r4+15)] = 0;
+	r2 = gNumAlignedAllocs;
+	heap32[(r4+16)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r4+17)] = 0;
+	r4 = heap32[(r2)];
+	r4 = (r4 + 1)|0;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 627;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB25_6
+{
+	r4 = (r2 + 4)|0;
+	r1 = (r1 - r4)|0;
+	r1 = r1 & 15;
+	r1 = (r2 + r1)|0;
+	r4 = (r1 + 4)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r2;
+	r2 = r4;
+}
+	r1 = r2 >> 2;
+	heap32[(r1+41)] = 1065353216;
+	heap32[(r1+42)] = 1065353216;
+	heap32[(r1+43)] = 1065353216;
+	heap32[(r1+44)] = 0;
+	heap32[(r1+45)] = 0;
+	heap32[(r1+46)] = 1566444395;
+	heap32[(r1+47)] = 0;
+	heap32[(r1+48)] = 0;
+	heap32[(r1+49)] = 0;
+	heap32[(r1+50)] = 0;
+	heap32[(r1+51)] = 1;
+	heap32[(r1+52)] = -1;
+	heap32[(r1+53)] = -1;
+	heap32[(r1+54)] = 1;
+	heap32[(r1+55)] = 0;
+	heap32[(r1+56)] = 1056964608;
+	heap32[(r1+57)] = 0;
+	heap32[(r1+58)] = 1;
+	heap32[(r1+59)] = 0;
+	heap32[(r1+60)] = 1065353216;
+	heap32[(r1+61)] = 0;
+	heap32[(r1+62)] = 0;
+	heap32[(r1+63)] = 0;
+	heap32[(r1+1)] = 1065353216;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+5)] = 0;
+	heap32[(r1+6)] = 1065353216;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+8)] = 0;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+10)] = 0;
+	heap32[(r1+11)] = 1065353216;
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = 0;
+	heap32[(r1+14)] = 0;
+	r4 = _ZTV11btRigidBody;
+	heap32[(r1+15)] = 0;
+	r4 = (r4 + 8)|0;
+	heap32[(r1+16)] = 0;
+	r5 = 1;
+	heap32[(r1)] = r4;
+	heap8[r2+492] = r5;
+	heap32[(r1+122)] = 0;
+	heap32[(r1+120)] = 0;
+	heap32[(r1+121)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+20)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r_g0 = r2;
+	return;
+}
+
+function _ZN13BenchmarkDemo11initPhysicsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+var __label__ = 0;
+	i7 = sp + -41432;var g0 = i7>>2; // save stack
+	heap32[(g0)] = 88;
+	_Znwj(i7);
+	r0 = r_g0;
+	r1 = _ZTV31btDefaultCollisionConfiguration;
+	r2 = gNumAlignedAllocs;
+	r3 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r2 = r2 >> 2;
+	heap32[(r3)] = r1;
+	r1 = heap32[(r2)];
+	r3 = (r1 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 379;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_2
+{
+	r4 = 0;
+	r5 = (r3 + 4)|0;
+	r4 = (r4 - r5)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r5 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r5;
+}
+	r4 = r3 >> 2;
+	heap32[(r4+77)] = 953267991;
+	r4 = heapU8[r3+332];
+	r4 = r4 & 240;
+	r5 = r0 >> 2;
+	heap8[r3+332] = r4;
+	r4 = (r1 + 2)|0;
+	heap32[(r5+8)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 23;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_5
+{
+	r4 = 0;
+	r6 = (r3 + 4)|0;
+	r4 = (r4 - r6)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTV30btGjkEpaPenetrationDepthSolver;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 3)|0;
+	heap32[(r5+9)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 43;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB26_8
+{
+	r3 = 0;
+	r6 = (r4 + 4)|0;
+	r3 = (r3 - r6)|0;
+	r3 = r3 & 15;
+	r3 = (r4 + r3)|0;
+	r6 = r3 >> 2;
+	heap32[(r6)] = r4;
+	r4 = (r3 + 4)|0;
+	r3 = heap32[(r5+9)];
+}
+	r6 = _ZTVN23btConvexConvexAlgorithm10CreateFuncE;
+	r7 = heap32[(r5+8)];
+	r8 = 0;
+	r9 = r4 >> 2;
+	r6 = (r6 + 8)|0;
+	heap8[r4+4] = r8;
+	heap32[(r9)] = r6;
+	heap32[(r9+4)] = 0;
+	heap32[(r9+5)] = 3;
+	heap32[(r9+3)] = r7;
+	heap32[(r9+2)] = r3;
+	r3 = (r1 + 4)|0;
+	heap32[(r5+10)] = r4;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_11
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN33btConvexConcaveCollisionAlgorithm10CreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 5)|0;
+	heap32[(r5+11)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_14
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 6)|0;
+	heap32[(r5+12)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_17
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN28btCompoundCollisionAlgorithm10CreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 7)|0;
+	heap32[(r5+13)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_20
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN28btCompoundCollisionAlgorithm17SwappedCreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 8)|0;
+	heap32[(r5+14)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_23
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN16btEmptyAlgorithm10CreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 9)|0;
+	heap32[(r5+15)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_26
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN32btSphereSphereCollisionAlgorithm10CreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = (r1 + 10)|0;
+	heap32[(r5+16)] = r3;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_29
+{
+	r4 = (r3 + 4)|0;
+	r4 = (r8 - r4)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r6 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r6;
+}
+	r4 = _ZTVN34btSphereTriangleCollisionAlgorithm10CreateFuncE;
+	r6 = r3 >> 2;
+	r4 = (r4 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r6 = (r1 + 11)|0;
+	heap32[(r5+18)] = r3;
+	heap32[(r2)] = r6;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_32
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = r3 >> 2;
+	heap8[r3+4] = r8;
+	heap32[(r6)] = r4;
+	r4 = 1;
+	heap32[(r5+19)] = r3;
+	r6 = (r1 + 12)|0;
+	heap8[r3+4] = r4;
+	heap32[(r2)] = r6;
+	heap32[(g0)] = 27;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_35
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = _ZTVN26btBoxBoxCollisionAlgorithm10CreateFuncE;
+	r7 = r3 >> 2;
+	r6 = (r6 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r7)] = r6;
+	r6 = (r1 + 13)|0;
+	heap32[(r5+17)] = r3;
+	heap32[(r2)] = r6;
+	heap32[(g0)] = 35;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_38
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = _ZTVN31btConvexPlaneCollisionAlgorithm10CreateFuncE;
+	r7 = r3 >> 2;
+	r6 = (r6 + 8)|0;
+	heap8[r3+4] = r8;
+	heap32[(r7)] = r6;
+	heap32[(r7+2)] = 1;
+	heap32[(r7+3)] = 1;
+	r7 = (r1 + 14)|0;
+	heap32[(r5+21)] = r3;
+	heap32[(r2)] = r7;
+	heap32[(g0)] = 35;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_41
+{
+	r7 = (r3 + 4)|0;
+	r7 = (r8 - r7)|0;
+	r7 = r7 & 15;
+	r7 = (r3 + r7)|0;
+	r9 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r3;
+	r3 = r9;
+}
+	r7 = r3 >> 2;
+	heap8[r3+4] = r8;
+	heap32[(r7)] = r6;
+	heap32[(r7+2)] = 1;
+	heap32[(r7+3)] = 1;
+	heap32[(r5+20)] = r3;
+	heap8[r3+4] = r4;
+	r3 = (r1 + 15)|0;
+	heap8[r0+12] = r4;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 39;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_44
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = r3 >> 2;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+3)] = 0;
+	heap8[r3+16] = r8;
+	heap32[(r6)] = 0;
+	r7 = (r1 + 16)|0;
+	heap32[(r6+2)] = 0;
+	heap32[(r2)] = r7;
+	heap32[(g0)] = 19;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB26_47
+{
+	r9 = (r7 + 4)|0;
+	r9 = (r8 - r9)|0;
+	r9 = r9 & 15;
+	r9 = (r7 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r7;
+	r7 = r10;
+}
+	heap32[(r6)] = r7;
+	heap32[(r6+1)] = 0;
+	heap32[(r5+2)] = r3;
+	r3 = (r1 + 17)|0;
+	heap8[r0+20] = r4;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 39;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_50
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = r3 >> 2;
+	heap32[(r6)] = 1140;
+	r7 = (r1 + 18)|0;
+	heap32[(r6+1)] = 4096;
+	heap32[(r2)] = r7;
+	heap32[(g0)] = 4669459;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB26_53
+{
+	r9 = (r7 + 4)|0;
+	r9 = (r8 - r9)|0;
+	r9 = r9 & 15;
+	r9 = (r7 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r7;
+	r7 = r10;
+}
+	heap32[(r6+4)] = r7;
+	r9 = 4095;
+	r10 = 1140;
+	heap32[(r6+3)] = r7;
+	heap32[(r6+2)] = 4096;
+	r11 = r7;
+_55: while(true){
+	r7 = r7 >> 2;
+	r10 = (r11 + r10)|0;
+	heap32[(r7)] = r10;
+	r10 = heap32[(r6)];
+	r7 = (r11 + r10)|0;
+	r9 = (r9 + -1)|0;
+	r11 = r7;
+	if(r9 !=0) //_LBB26_55
+{
+continue _55;
+}
+else{
+break _55;
+}
+}
+	r6 = r7 >> 2;
+	heap32[(r6)] = 0;
+	heap32[(r5+4)] = r3;
+	r3 = (r1 + 19)|0;
+	heap8[r0+28] = r4;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 39;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_58
+{
+	r6 = (r3 + 4)|0;
+	r6 = (r8 - r6)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r7;
+}
+	r6 = r3 >> 2;
+	heap32[(r6)] = 80;
+	r1 = (r1 + 20)|0;
+	heap32[(r6+1)] = 4096;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = 327699;
+	malloc(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB26_61
+{
+	r7 = (r1 + 4)|0;
+	r7 = (r8 - r7)|0;
+	r7 = r7 & 15;
+	r7 = (r1 + r7)|0;
+	r9 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r1;
+	r1 = r9;
+}
+	heap32[(r6+4)] = r1;
+	r7 = 4095;
+	r9 = 80;
+	heap32[(r6+3)] = r1;
+	heap32[(r6+2)] = 4096;
+	r10 = r1;
+_64: while(true){
+	r1 = r1 >> 2;
+	r9 = (r10 + r9)|0;
+	heap32[(r1)] = r9;
+	r9 = heap32[(r6)];
+	r1 = (r10 + r9)|0;
+	r7 = (r7 + -1)|0;
+	r10 = r1;
+	if(r7 !=0) //_LBB26_63
+{
+continue _64;
+}
+else{
+break _64;
+}
+}
+	r1 = r1 >> 2;
+	r6 = _ZL14benchmarkDemo4;
+	heap32[(r1)] = 0;
+	r1 = r6 >> 2;
+	heap32[(r5+6)] = r3;
+	heap32[(r1+16)] = r0;
+	heap32[(g0)] = 5388;
+	_Znwj(i7);
+	r0 = r_g0;
+	r3 = _ZTV21btCollisionDispatcher;
+	r5 = heap32[(r1+16)];
+	r3 = (r3 + 8)|0;
+	r7 = r0 >> 2;
+	heap32[(r7)] = r3;
+	heap32[(r7+1)] = 2;
+	heap8[r0+24] = r4;
+	heap32[(r7+5)] = 0;
+	r3 = _ZTV16btManifoldResult;
+	heap32[(r7+3)] = 0;
+	r3 = (r3 + 8)|0;
+	heap32[(r7+4)] = 0;
+	heap32[(r7+7)] = r3;
+	r3 = _ZN21btCollisionDispatcher19defaultNearCallbackER16btBroadphasePairRS_RK16btDispatcherInfo__index__;
+	heap32[(r7+1346)] = r5;
+	heap32[(r7+47)] = r3;
+	r3 = r5 >> 2;
+	r9 = heap32[(r3)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+3)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	heap32[(r7+48)] = r_g0;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r5 = (r0 + 200)|0;
+	heap32[(r7+49)] = r_g0;
+_67: while(true){
+	if(r8 >35) //_LBB26_72
+{
+__label__ = 52;
+break _67;
+}
+else{
+	r3 = 0;
+_70: while(true){
+	if(r3 <36) //_LBB26_65
+{
+	r7 = r0 >> 2;
+	r7 = heap32[(r7+1346)];
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+5)];
+	r10 = r3 << 2;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r3;
+	r7 = (r5 + r10)|0;
+	r7 = r7 >> 2;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r9 = r_g0;
+	heap32[(r7)] = r9;
+	if(r9 !=0) //_LBB26_67
+{
+	r3 = (r3 + 1)|0;
+}
+else{
+__label__ = 46;
+break _67;
+}
+}
+else{
+break _70;
+}
+}
+	r8 = (r8 + 1)|0;
+	r5 = (r5 + 144)|0;
+continue _67;
+}
+}
+switch(__label__ ){//multiple entries
+case 52:
+	heap32[(r1+14)] = r0;
+	heap32[(g0)] = 76;
+	_Znwj(i7);
+	r0 = r_g0;
+	heap32[(g0)] = r0;
+	_ZN28btHashedOverlappingPairCacheC1Ev(i7);
+	r3 = heap32[(r2)];
+	r5 = (r3 + 1)|0;
+	heap32[(r2)] = r5;
+	heap32[(g0)] = 135;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB26_74
+{
+	r8 = 0;
+	r9 = (r7 + 4)|0;
+	r8 = (r8 - r9)|0;
+	r8 = r8 & 15;
+	r8 = (r7 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r7;
+	r7 = r9;
+}
+	r8 = _ZTV20btAxisSweep3InternalItE;
+	r9 = r7 >> 2;
+	r8 = (r8 + 8)|0;
+	r10 = -2;
+	heap32[(r9)] = r8;
+	r8 = -1;
+	heap16[(r7+4)>>1] = r10;
+	heap16[(r7+6)>>1] = r8;
+	heap32[(r9+23)] = r0;
+	r8 = 0;
+	heap32[(r9+24)] = 0;
+	heap8[r7+100] = r8;
+	heap32[(r9+26)] = 0;
+	heap32[(r9+27)] = 0;
+	if(r0 ==0) //_LBB26_77
+{
+	r5 = (r3 + 2)|0;
+	heap32[(r2)] = r5;
+	heap32[(g0)] = 95;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB26_79
+{
+	r0 = 0;
+	r3 = (r5 + 4)|0;
+	r0 = (r0 - r3)|0;
+	r0 = r0 & 15;
+	r0 = (r5 + r0)|0;
+	r3 = (r0 + 4)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r5;
+	r5 = r3;
+}
+	heap32[(g0)] = r5;
+	_ZN28btHashedOverlappingPairCacheC1Ev(i7);
+	heap32[(r9+23)] = r5;
+	heap8[r7+100] = r4;
+	r5 = heap32[(r2)];
+}
+	r0 = (r5 + 1)|0;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = 43;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_83
+{
+	r3 = (r0 + 4)|0;
+	r3 = (r8 - r3)|0;
+	r3 = r3 & 15;
+	r3 = (r0 + r3)|0;
+	r10 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r0;
+	r0 = r10;
+}
+	r3 = _ZTV15btNullPairCache;
+	r10 = r0 >> 2;
+	r3 = (r3 + 8)|0;
+	heap32[(r10)] = r3;
+	heap8[r0+20] = r4;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	r3 = (r5 + 2)|0;
+	heap32[(r9+28)] = r0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 175;
+	malloc(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB26_86
+{
+	r11 = (r10 + 4)|0;
+	r11 = (r8 - r11)|0;
+	r11 = r11 & 15;
+	r11 = (r10 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r10;
+	r10 = r12;
+}
+	r11 = _ZTV16btDbvtBroadphase;
+	r12 = r10 >> 2;
+	r11 = (r11 + 8)|0;
+	heap32[(r12)] = r11;
+_92: while(true){
+	r11 = (r10 + r8)|0;
+	r13 = r11 >> 2;
+	heap8[r11+40] = r4;
+	heap32[(r13+9)] = 0;
+	heap32[(r13+7)] = 0;
+	heap32[(r13+8)] = 0;
+	heap32[(r13+1)] = 0;
+	heap32[(r13+2)] = 0;
+	heap32[(r13+3)] = -1;
+	r8 = (r8 + 40)|0;
+	heap32[(r13+4)] = 0;
+	heap32[(r13+5)] = 0;
+	if(r8 !=80) //_LBB26_88
+{
+continue _92;
+}
+else{
+break _92;
+}
+}
+	r8 = 0;
+	r11 = r0 == r8;
+	heap8[r10+153] = r8;
+	r11 = r11 & 1;
+	heap8[r10+154] = r4;
+	heap8[r10+152] = r11;
+	heap32[(r12+25)] = 0;
+	heap32[(r12+26)] = 0;
+	heap32[(r12+31)] = 0;
+	heap32[(r12+27)] = 1;
+	heap32[(r12+28)] = 0;
+	heap32[(r12+29)] = 10;
+	heap32[(r12+30)] = 1;
+	heap32[(r12+32)] = 0;
+	heap32[(r12+33)] = 0;
+	heap32[(r12+34)] = 0;
+	if(r0 ==0) //_LBB26_91
+{
+	r0 = (r5 + 3)|0;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = 95;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_93
+{
+	r3 = 0;
+	r5 = (r0 + 4)|0;
+	r3 = (r3 - r5)|0;
+	r3 = r3 & 15;
+	r3 = (r0 + r3)|0;
+	r5 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r0;
+	r0 = r5;
+}
+	heap32[(g0)] = r0;
+	_ZN28btHashedOverlappingPairCacheC1Ev(i7);
+	r3 = heap32[(r2)];
+}
+	heap32[(r12+24)] = r0;
+	heap32[(r12+37)] = 0;
+	heap32[(r12+35)] = 0;
+	heap32[(r12+36)] = 0;
+	heap32[(r12+21)] = 0;
+	heap32[(r12+22)] = 0;
+	heap32[(r12+23)] = 0;
+	heap32[(r9+27)] = r10;
+	heap8[r10+153] = r4;
+	heap32[(r9+2)] = -998637568;
+	heap32[(r9+3)] = -998637568;
+	heap32[(r9+4)] = -998637568;
+	heap32[(r9+5)] = 0;
+	heap32[(r9+6)] = 1148846080;
+	heap32[(r9+7)] = 1148846080;
+	heap32[(r9+8)] = 1148846080;
+	heap32[(r9+9)] = 0;
+	r0 = heapU16[(r7+6)>>1];
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      2000;
+	f0 = f0/f1;
+	heapFloat[(r9+10)] = f0;
+	heapFloat[(r9+11)] = f0;
+	heapFloat[(r9+12)] = f0;
+	r0 = (r3 + 1)|0;
+	heap32[(r9+13)] = 0;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = 224083;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_97
+{
+	r5 = (r0 + 4)|0;
+	r5 = (r8 - r5)|0;
+	r5 = r5 & 15;
+	r5 = (r0 + r5)|0;
+	r10 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r0;
+	r0 = r10;
+}
+_103: while(true){
+	r5 = r8 << 6;
+	r5 = (r0 - r5)|0;
+	r5 = r5 >> 2;
+	r8 = (r8 + -1)|0;
+	heap32[(r5)] = 0;
+	heap32[(r5+2)] = 0;
+	if(r8 !=-3501) //_LBB26_98
+{
+continue _103;
+}
+else{
+break _103;
+}
+}
+	r5 = 3501;
+	heap32[(r9+15)] = r0;
+	r8 = 0;
+	heap16[(r7+58)>>1] = r5;
+	r5 = -112;
+	r10 = 2;
+	heap16[(r7+56)>>1] = r8;
+	heap16[(r7+64)>>1] = r4;
+_106: while(true){
+	r0 = (r0 - r5)|0;
+	heap16[(r0)>>1] = r10;
+	r5 = (r5 + -64)|0;
+	r0 = heap32[(r9+15)];
+	r10 = (r10 + 1)|0;
+	if(r5 !=-224112) //_LBB26_100
+{
+continue _106;
+}
+else{
+break _106;
+}
+}
+	r3 = (r3 + 2)|0;
+	heap16[(r0+224048)>>1] = r8;
+_109: while(true){
+	r0 = (r3 + r8)|0;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = 28027;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_104
+{
+	r5 = 0;
+	r10 = (r0 + 4)|0;
+	r5 = (r5 - r10)|0;
+	r5 = r5 & 15;
+	r5 = (r0 + r5)|0;
+	r10 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r0;
+	r0 = r10;
+}
+	r5 = r8 << 2;
+	r5 = (r7 + r5)|0;
+	r5 = r5 >> 2;
+	r8 = (r8 + 1)|0;
+	heap32[(r5+20)] = r0;
+	heap32[(r5+17)] = r0;
+	if(r8 !=3) //_LBB26_102
+{
+continue _109;
+}
+else{
+break _109;
+}
+}
+	r0 = heap32[(r9+15)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	r0 = heap32[(r9+15)];
+	r3 = 0;
+	heap16[(r0+48)>>1] = r3;
+	r0 = heap32[(r9+15)];
+	heap16[(r0+54)>>1] = r4;
+	r0 = heap32[(r9+17)];
+	heap16[(r0)>>1] = r3;
+	r0 = heap32[(r9+17)];
+	heap16[(r0+2)>>1] = r3;
+	r0 = heap32[(r9+17)];
+	r5 = heapU16[(r7+6)>>1];
+	heap16[(r0+4)>>1] = r5;
+	r0 = heap32[(r9+17)];
+	heap16[(r0+6)>>1] = r3;
+	r0 = heap32[(r9+15)];
+	heap16[(r0+50)>>1] = r3;
+	r0 = heap32[(r9+15)];
+	heap16[(r0+56)>>1] = r4;
+	r0 = heap32[(r9+18)];
+	heap16[(r0)>>1] = r3;
+	r0 = heap32[(r9+18)];
+	heap16[(r0+2)>>1] = r3;
+	r0 = heap32[(r9+18)];
+	r5 = heapU16[(r7+6)>>1];
+	heap16[(r0+4)>>1] = r5;
+	r0 = heap32[(r9+18)];
+	heap16[(r0+6)>>1] = r3;
+	r0 = heap32[(r9+15)];
+	heap16[(r0+52)>>1] = r3;
+	r0 = heap32[(r9+15)];
+	heap16[(r0+58)>>1] = r4;
+	r0 = heap32[(r9+19)];
+	heap16[(r0)>>1] = r3;
+	r0 = heap32[(r9+19)];
+	heap16[(r0+2)>>1] = r3;
+	r0 = heap32[(r9+19)];
+	r5 = heapU16[(r7+6)>>1];
+	heap16[(r0+4)>>1] = r5;
+	r0 = heap32[(r9+19)];
+	r5 = _ZTV12btAxisSweep3;
+	r5 = (r5 + 8)|0;
+	heap16[(r0+6)>>1] = r3;
+	heap32[(r9)] = r5;
+	heap32[(r1+13)] = r7;
+	heap32[(g0)] = 128;
+	r0 = _ZTV35btSequentialImpulseConstraintSolver;
+	_Znwj(i7);
+	r7 = r_g0 >> 2;
+	r0 = (r0 + 8)|0;
+	heap32[(r7)] = r0;
+	heap8[r_g0+20] = r4;
+	heap32[(r7+4)] = 0;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	heap8[r_g0+40] = r4;
+	heap32[(r7+9)] = 0;
+	heap32[(r7+7)] = 0;
+	heap32[(r7+8)] = 0;
+	heap8[r_g0+60] = r4;
+	heap32[(r7+14)] = 0;
+	heap32[(r7+12)] = 0;
+	heap32[(r7+13)] = 0;
+	heap8[r_g0+80] = r4;
+	heap32[(r7+19)] = 0;
+	heap32[(r7+17)] = 0;
+	heap32[(r7+18)] = 0;
+	heap8[r_g0+100] = r4;
+	heap32[(r7+24)] = 0;
+	heap32[(r7+22)] = 0;
+	heap32[(r7+23)] = 0;
+	heap8[r_g0+120] = r4;
+	heap32[(r7+29)] = 0;
+	heap32[(r7+27)] = 0;
+	heap32[(r7+28)] = 0;
+	heap32[(r7+31)] = 0;
+	heap32[(r1+15)] = r_g0;
+	heap32[(g0)] = 272;
+	_Znwj(i7);
+	r5 = r_g0;
+	r7 = heap32[(r1+16)];
+	r8 = _ZTV16btCollisionWorld;
+	r9 = heap32[(r1+15)];
+	r10 = heap32[(r1+13)];
+	r11 = heap32[(r1+14)];
+	r8 = (r8 + 8)|0;
+	r12 = r5 >> 2;
+	heap32[(r12)] = r8;
+	heap8[r5+20] = r4;
+	heap32[(r12+4)] = 0;
+	heap32[(r12+2)] = 0;
+	heap32[(r12+3)] = 0;
+	heap32[(r12+6)] = r11;
+	heap32[(r12+7)] = 0;
+	heap32[(r12+8)] = 0;
+	heap32[(r12+9)] = 1;
+	heap32[(r12+10)] = 1065353216;
+	heap8[r5+44] = r3;
+	heap32[(r12+12)] = 0;
+	heap8[r5+52] = r3;
+	heap8[r5+53] = r4;
+	heap8[r5+54] = r4;
+	heap32[(r12+14)] = 1025758986;
+	heap8[r5+60] = r3;
+	heap32[(r12+16)] = 0;
+	heap8[r5+68] = r3;
+	heap32[(r12+18)] = 0;
+	heap32[(r12+20)] = r10;
+	heap32[(r12+21)] = 0;
+	r8 = r7 >> 2;
+	heap8[r5+88] = r4;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r7;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	heap32[(r12+19)] = r_g0;
+	heap32[(r12+18)] = r_g0;
+	heap32[(r12+23)] = 0;
+	heap32[(r12+24)] = 0;
+	heap32[(r12+25)] = 0;
+	heap32[(r12+26)] = 1058642330;
+	heap32[(r12+27)] = 1065353216;
+	heap32[(r12+28)] = 1050253722;
+	heap32[(r12+30)] = 0;
+	heap32[(r12+32)] = 1101004800;
+	heap32[(r12+31)] = 10;
+	heap32[(r12+34)] = 1045220557;
+	heap32[(r12+35)] = 1036831949;
+	heap32[(r12+36)] = 0;
+	heap32[(r12+33)] = 1065353216;
+	heap32[(r12+37)] = 0;
+	heap32[(r12+38)] = -1130113270;
+	heap32[(r12+39)] = 0;
+	heap32[(r12+40)] = 1062836634;
+	heap32[(r12+41)] = 260;
+	r7 = _ZTV23btDiscreteDynamicsWorld;
+	heap32[(r12+42)] = 2;
+	r7 = (r7 + 8)|0;
+	heap32[(r12+43)] = 128;
+	heap32[(r12)] = r7;
+	heap32[(r12+44)] = r9;
+	heap8[r5+200] = r4;
+	heap32[(r12+49)] = 0;
+	heap32[(r12+47)] = 0;
+	heap32[(r12+48)] = 0;
+	heap8[r5+220] = r4;
+	heap32[(r12+54)] = 0;
+	heap32[(r12+52)] = 0;
+	heap32[(r12+53)] = 0;
+	heap32[(r12+56)] = 0;
+	heap32[(r12+57)] = -1054867456;
+	heap32[(r12+58)] = 0;
+	heap32[(r12+59)] = 0;
+	heap32[(r12+60)] = 0;
+	heap8[r5+246] = r3;
+	heap8[r5+264] = r4;
+	heap32[(r12+65)] = 0;
+	heap32[(r12+63)] = 0;
+	heap32[(r12+64)] = 0;
+	heap32[(r12+67)] = 0;
+	if(r9 !=0) //_LBB26_111
+{
+	heap8[r5+245] = r3;
+	r7 = heap32[(r2)];
+}
+else{
+	r7 = heap32[(r2)];
+	r7 = (r7 + 1)|0;
+	heap32[(r2)] = r7;
+	heap32[(g0)] = 147;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB26_109
+{
+	r9 = 0;
+	r10 = (r8 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r8 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = r10;
+}
+	r9 = r8 >> 2;
+	heap32[(r9)] = r0;
+	heap8[r8+20] = r4;
+	heap32[(r9+4)] = 0;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 0;
+	heap8[r8+40] = r4;
+	heap32[(r9+9)] = 0;
+	heap32[(r9+7)] = 0;
+	heap32[(r9+8)] = 0;
+	heap8[r8+60] = r4;
+	heap32[(r9+14)] = 0;
+	heap32[(r9+12)] = 0;
+	heap32[(r9+13)] = 0;
+	heap8[r8+80] = r4;
+	heap32[(r9+19)] = 0;
+	heap32[(r9+17)] = 0;
+	heap32[(r9+18)] = 0;
+	heap8[r8+100] = r4;
+	heap32[(r9+24)] = 0;
+	heap32[(r9+22)] = 0;
+	heap32[(r9+23)] = 0;
+	heap8[r8+120] = r4;
+	heap32[(r9+29)] = 0;
+	heap32[(r9+27)] = 0;
+	heap32[(r9+28)] = 0;
+	r0 = r5 >> 2;
+	heap32[(r9+31)] = 0;
+	heap32[(r0+44)] = r8;
+	heap8[r5+245] = r4;
+}
+	r0 = (r7 + 1)|0;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = 87;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_114
+{
+	r7 = (r0 + 4)|0;
+	r7 = (r3 - r7)|0;
+	r7 = r7 & 15;
+	r7 = (r0 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r0;
+	r0 = r8;
+}
+	r7 = _ZTV25btSimulationIslandManager;
+	r8 = r0 >> 2;
+	r7 = (r7 + 8)|0;
+	heap32[(r8)] = r7;
+	heap8[r0+20] = r4;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	heap8[r0+40] = r4;
+	heap32[(r8+9)] = 0;
+	heap32[(r8+7)] = 0;
+	heap32[(r8+8)] = 0;
+	heap8[r0+60] = r4;
+	heap32[(r8+14)] = 0;
+	heap32[(r8+12)] = 0;
+	heap32[(r8+13)] = 0;
+	r7 = r5 >> 2;
+	heap8[r0+64] = r4;
+	heap32[(r7+45)] = r0;
+	heap8[r5+244] = r4;
+	heap32[(r1+1)] = r5;
+	r0 = heap32[(r7+41)];
+	r0 = r0 | 32;
+	heap32[(r7+41)] = r0;
+	heap32[(r7+31)] = 5;
+	heap32[(r1+2)] = 0;
+	r0 = heap32[(r1+1)];
+	r5 = r0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+17)];
+	r7 = sp + -41280;
+	r8 = r7 >> 2;
+	heap32[(fp+-10320)] = 0;
+	heap32[(r8+1)] = -1054867456;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = heap32[(r1+17)];
+	if(r0 <5) //_LBB26_117
+{
+	r0 = heap32[(r2)];
+	r5 = (r0 + 1)|0;
+	heap32[(r2)] = r5;
+	heap32[(g0)] = 71;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB26_119
+{
+	r7 = 0;
+	r8 = (r5 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r5 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r5;
+	r5 = r8;
+}
+	r7 = r5 >> 2;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 1065353216;
+	heap32[(r7+4)] = 1065353216;
+	heap32[(r7+5)] = 1065353216;
+	r8 = _ZTV10btBoxShape;
+	heap32[(r7+6)] = 0;
+	r8 = (r8 + 8)|0;
+	heap32[(r7+11)] = 1025758986;
+	heap32[(r7)] = r8;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+7)] = 1132066243;
+	heap32[(r7+8)] = 1112004362;
+	heap32[(r7+9)] = 1132066243;
+	heap32[(r7+10)] = 0;
+	r7 = heap32[(r1+5)];
+	r8 = heap32[(r1+4)];
+	if(r7 ==r8) //_LBB26_122
+{
+	r9 = r8 << 1;
+	r9 = r8 == 0 ? r4 : r9;
+if(!(r7 >=r9)) //_LBB26_121
+{
+	if(r9 !=0) //_LBB26_125
+{
+	r7 = r9 << 2;
+	r0 = (r0 + 2)|0;
+	r7 = r7 | 3;
+	heap32[(r2)] = r0;
+	r0 = (r7 + 16)|0;
+	heap32[(g0)] = r0;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB26_127
+{
+	r7 = 0;
+	r10 = (r0 + 4)|0;
+	r7 = (r7 - r10)|0;
+	r7 = r7 & 15;
+	r7 = (r0 + r7)|0;
+	r10 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r0;
+	r0 = r10;
+}
+}
+else{
+	r0 = 0;
+}
+_138: do {
+	if(r8 <1) //_LBB26_130
+{
+	r10 = heap32[(r1+6)];
+}
+else{
+	r7 = 0;
+_141: while(true){
+	r10 = heap32[(r1+6)];
+	r11 = r7 << 2;
+	r12 = (r10 + r11)|0;
+	r12 = r12 >> 2;
+	r11 = (r0 + r11)|0;
+	r12 = heap32[(r12)];
+	r7 = (r7 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r12;
+if(!(r8 !=r7)) //_LBB26_131
+{
+break _138;
+}
+}
+}
+} while(0);
+	if(r10 !=0) //_LBB26_134
+{
+	r7 = heapU8[r6+28];
+	if(r7 !=0) //_LBB26_136
+{
+	r8 = gNumAlignedFree;
+	r8 = r8 >> 2;
+	r7 = heap32[(r8)];
+	r7 = (r7 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r8)] = r7;
+	r8 = heap32[(r10+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+	r8 = heap32[(r1+4)];
+}
+	heap32[(r1+6)] = 0;
+}
+	heap8[r6+28] = r4;
+	heap32[(r1+6)] = r0;
+	heap32[(r1+5)] = r9;
+}
+}
+	r0 = r8 << 2;
+	r7 = heap32[(r1+6)];
+	r0 = (r7 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r5;
+	r0 = heap32[(r1+4)];
+	r0 = (r0 + 1)|0;
+	r7 = _ZGVZN11btTransform11getIdentityEvE17identityTransform;
+	heap32[(r1+4)] = r0;
+	r0 = heapU8[r7];
+if(!(r0 !=0)) //_LBB26_143
+{
+	r0 = _ZGVZN11btMatrix3x311getIdentityEvE14identityMatrix;
+	r8 = heapU8[r0];
+if(!(r8 !=0)) //_LBB26_142
+{
+	r8 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_0_2E_0_2E_0;
+	r9 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_1_2E_0_2E_1;
+	r8 = r8 >> 2;
+	r10 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_2_2E_0_2E_2;
+	r9 = r9 >> 2;
+	heap32[(r8)] = 1065353216;
+	r8 = r10 >> 2;
+	heap32[(r9)] = 1065353216;
+	heap32[(r8)] = 1065353216;
+	heap8[r0] = r4;
+}
+	r0 = _ZZN11btTransform11getIdentityEvE17identityTransform;
+	r8 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_0_2E_0_2E_0;
+	r0 = r0 >> 2;
+	r8 = r8 >> 2;
+	heap32[(r0)] = heap32[(r8)];
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	r8 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_1_2E_0_2E_1;
+	heap32[(r0+3)] = 0;
+	r8 = r8 >> 2;
+	heap32[(r0+4)] = 0;
+	heap32[(r0+5)] = heap32[(r8)];
+	heap32[(r0+6)] = 0;
+	heap32[(r0+7)] = 0;
+	r8 = _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_2_2E_0_2E_2;
+	heap32[(r0+8)] = 0;
+	r8 = r8 >> 2;
+	heap32[(r0+9)] = 0;
+	heap32[(r0+10)] = heap32[(r8)];
+	heap32[(r0+11)] = 0;
+	heap32[(r0+12)] = 0;
+	heap32[(r0+13)] = 0;
+	heap32[(r0+14)] = 0;
+	heap32[(r0+15)] = 0;
+	heap8[r7] = r4;
+}
+	heap32[(g0)] = 200;
+	r0 = _ZTV20btDefaultMotionState;
+	_Znwj(i7);
+	r8 = r_g0 >> 2;
+	r0 = (r0 + 8)|0;
+	heap32[(r8)] = r0;
+	heap32[(r8+1)] = 1065353216;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+5)] = 0;
+	heap32[(r8+6)] = 1065353216;
+	heap32[(r8+7)] = 0;
+	heap32[(r8+8)] = 0;
+	heap32[(r8+9)] = 0;
+	heap32[(r8+10)] = 0;
+	heap32[(r8+11)] = 1065353216;
+	heap32[(r8+12)] = 0;
+	heap32[(r8+13)] = 0;
+	heap32[(r8+14)] = -1035468800;
+	r0 = _ZZN11btTransform11getIdentityEvE17identityTransform;
+	heap32[(r8+15)] = 0;
+	r0 = r0 >> 2;
+	heap32[(r8+16)] = 0;
+	heap32[(r8+17)] = heap32[(r0)];
+	heap32[(r8+18)] = heap32[(r0+1)];
+	heap32[(r8+19)] = heap32[(r0+2)];
+	heap32[(r8+20)] = heap32[(r0+3)];
+	heap32[(r8+21)] = heap32[(r0+4)];
+	heap32[(r8+22)] = heap32[(r0+5)];
+	heap32[(r8+23)] = heap32[(r0+6)];
+	heap32[(r8+24)] = heap32[(r0+7)];
+	heap32[(r8+25)] = heap32[(r0+8)];
+	heap32[(r8+26)] = heap32[(r0+9)];
+	heap32[(r8+27)] = heap32[(r0+10)];
+	heap32[(r8+28)] = heap32[(r0+11)];
+	heap32[(r8+29)] = heap32[(r0+12)];
+	heap32[(r8+30)] = heap32[(r0+13)];
+	heap32[(r8+31)] = heap32[(r0+14)];
+	heap32[(r8+32)] = heap32[(r0+15)];
+	heap32[(r8+33)] = 1065353216;
+	heap32[(r8+34)] = 0;
+	heap32[(r8+35)] = 0;
+	heap32[(r8+36)] = 0;
+	heap32[(r8+37)] = 0;
+	heap32[(r8+38)] = 1065353216;
+	heap32[(r8+39)] = 0;
+	heap32[(r8+40)] = 0;
+	heap32[(r8+41)] = 0;
+	heap32[(r8+42)] = 0;
+	heap32[(r8+43)] = 1065353216;
+	heap32[(r8+44)] = 0;
+	heap32[(r8+45)] = 0;
+	heap32[(r8+46)] = -1035468800;
+	heap32[(r8+47)] = 0;
+	heap32[(r8+48)] = 0;
+	r0 = sp + -41416;
+	heap32[(r8+49)] = 0;
+	r8 = r0 >> 2;
+	heap32[(fp+-10354)] = 0;
+	heap32[(r8+1)] = r_g0;
+	heap32[(r8+18)] = r5;
+	heap32[(r8+19)] = 0;
+	heap32[(r8+20)] = 0;
+	heap32[(r8+21)] = 0;
+	heap32[(r8+22)] = 0;
+	heap32[(r8+23)] = 0;
+	heap32[(r8+24)] = 0;
+	heap32[(r8+25)] = 1056964608;
+	heap32[(r8+26)] = 0;
+	heap32[(r8+27)] = 1061997773;
+	r5 = 0;
+	heap32[(r8+28)] = 1065353216;
+	heap8[sp+-41300] = r5;
+	heap32[(r8+30)] = 1000593162;
+	heap32[(r8+31)] = 1008981770;
+	heap32[(r8+32)] = 1008981770;
+	heap32[(r8+33)] = 1008981770;
+	heap32[(r8+2)] = 1065353216;
+	heap32[(r8+3)] = 0;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+5)] = 0;
+	heap32[(r8+6)] = 0;
+	heap32[(r8+7)] = 1065353216;
+	heap32[(r8+8)] = 0;
+	heap32[(r8+9)] = 0;
+	heap32[(r8+10)] = 0;
+	heap32[(r8+11)] = 0;
+	heap32[(r8+12)] = 1065353216;
+	heap32[(r8+13)] = 0;
+	heap32[(r8+14)] = 0;
+	heap32[(r8+15)] = 0;
+	heap32[(r8+16)] = 0;
+	heap32[(r8+17)] = 0;
+	r7 = heap32[(r2)];
+	r7 = (r7 + 1)|0;
+	heap32[(r2)] = r7;
+	heap32[(g0)] = 627;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB26_145
+{
+	r8 = (r7 + 4)|0;
+	r5 = (r5 - r8)|0;
+	r5 = r5 & 15;
+	r5 = (r7 + r5)|0;
+	r8 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r7;
+	r7 = r8;
+}
+	r5 = r7 >> 2;
+	heap32[(r5+41)] = 1065353216;
+	heap32[(r5+42)] = 1065353216;
+	heap32[(r5+43)] = 1065353216;
+	heap32[(r5+44)] = 0;
+	heap32[(r5+45)] = 0;
+	heap32[(r5+46)] = 1566444395;
+	heap32[(r5+47)] = 0;
+	heap32[(r5+48)] = 0;
+	heap32[(r5+49)] = 0;
+	heap32[(r5+50)] = 0;
+	heap32[(r5+51)] = 1;
+	heap32[(r5+52)] = -1;
+	heap32[(r5+53)] = -1;
+	heap32[(r5+54)] = 1;
+	heap32[(r5+55)] = 0;
+	heap32[(r5+56)] = 1056964608;
+	heap32[(r5+57)] = 0;
+	heap32[(r5+58)] = 1;
+	heap32[(r5+59)] = 0;
+	heap32[(r5+60)] = 1065353216;
+	heap32[(r5+61)] = 0;
+	heap32[(r5+62)] = 0;
+	heap32[(r5+63)] = 0;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap32[(r5+4)] = 0;
+	heap32[(r5+5)] = 0;
+	heap32[(r5+6)] = 1065353216;
+	heap32[(r5+7)] = 0;
+	heap32[(r5+8)] = 0;
+	heap32[(r5+9)] = 0;
+	heap32[(r5+10)] = 0;
+	heap32[(r5+11)] = 1065353216;
+	heap32[(r5+12)] = 0;
+	heap32[(r5+13)] = 0;
+	heap32[(r5+14)] = 0;
+	r8 = _ZTV11btRigidBody;
+	heap32[(r5+15)] = 0;
+	r8 = (r8 + 8)|0;
+	heap32[(r5+16)] = 0;
+	heap32[(r5)] = r8;
+	heap8[r7+492] = r4;
+	heap32[(r5+122)] = 0;
+	heap32[(r5+120)] = 0;
+	heap32[(r5+121)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r0;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	r0 = heap32[(r1+1)];
+	r5 = r0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+20)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = heap32[(r1+17)];
+}
+_161: do {
+	if(r0 >3) //_LBB26_151
+{
+	if(r0 >5) //_LBB26_154
+{
+	if(r0 ==6) //_LBB26_325
+{
+	_ZN13BenchmarkDemo11createTest6Ev(i7);
+	return;
+}
+else{
+	if(r0 ==7) //_LBB26_326
+{
+	_ZN13BenchmarkDemo11createTest6Ev(i7);
+	r0 = sp + -41264;
+	heap32[(g0)] = 8;
+	r1 = r0 >> 2;
+	_Znwj(i7);
+	heap32[(r1+10006)] = r_g0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	heap32[(r1+10000)] = 0;
+	heap32[(r1+10001)] = 0;
+	heap32[(r1+10005)] = 0;
+	heap32[(r1+10004)] = 9999;
+	heap32[(r1+10003)] = 0;
+	heap32[(r1+10002)] = 0;
+	heap32[(r1+10007)] = 1092616192;
+	heap32[(r1+10008)] = 0;
+	heap32[(r1+10009)] = 0;
+	heap32[(r1+10010)] = 1112014848;
+	heap32[(r1+10011)] = 1065353216;
+	f3 =                         0;
+_169: while(true){
+	f0 = r3; //fitos r3, f0
+	f1 =      0.025132741779088974;
+	f0 = f0*f1;
+	f1 =                       0.5;
+	f0 = f0*f1;
+	heapFloat[(g0)] = f0;
+	sinf(i7);
+	f2 =                         1;
+	f1 = f_g0/f2;
+	f2 = f1*f3;
+	heapFloat[(g0)] = f0;
+	cosf(i7);
+	f4 = -f2;
+	f5 = f_g0*f3;
+	f6 = f2*f3;
+	f7 = f4-f2;
+	f8 = f_g0+f2;
+	f8 = f8-f6;
+	f7 = f7-f6;
+	f9 = f5+f2;
+	f9 = f9-f6;
+	f5 = f5+f6;
+	f6 = f7*f4;
+	f10 = f8*f_g0;
+	f5 = f5-f1;
+	f11 = f9*f_g0;
+	f7 = f7*f1;
+	f10 = f6+f10;
+	f4 = f9*f4;
+	r2 = r3 << 4;
+	f0 = f5*f_g0;
+	f7 = f11-f7;
+	f9 = f5*f2;
+	f10 = f10+f4;
+	f5 = f5*f1;
+	r2 = (r0 + r2)|0;
+	f0 = f6+f0;
+	f1 = f8*f1;
+	f6 = f7-f9;
+	f2 = f8*f2;
+	f5 = f10+f5;
+	f7 =                      2500;
+	f0 = f0-f1;
+	f1 = f6+f2;
+	r2 = r2 >> 2;
+	f2 = f5*f7;
+	f0 = f0-f4;
+	f1 = f1*f7;
+	heapFloat[(r2+4000)] = f2;
+	f0 = f0*f7;
+	heapFloat[(r2+4001)] = f1;
+	heapFloat[(r2+4002)] = f0;
+	heap32[(r2+4003)] = 0;
+	f1 = heapFloat[(r1+10008)];
+	heapFloat[(r2)] = f1;
+	heap32[(r2+1)] = 1112014848;
+	heap32[(r2+2)] = 0;
+	f1 = f1+f2;
+	heap32[(r2+3)] = 0;
+	f0 = f0+f3;
+	heapFloat[(r2+2000)] = f1;
+	heapFloat[(r2+2002)] = f0;
+	heap32[(r2+2003)] = 0;
+	heap32[(r2+2001)] = -998637568;
+	heap32[(r2+8000)] = 1065353216;
+	heap32[(r2+8001)] = 0;
+	r3 = (r3 + 1)|0;
+	heap32[(r2+8002)] = 0;
+	heap32[(r2+8003)] = 0;
+if(!(r3 !=500)) //_LBB26_327
+{
+break _169;
+}
+}
+	r2 = _ZL10raycastBar;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 8000;
+	memcpy(i7);
+	r3 = (r2 + 8000)|0;
+	r4 = (r0 + 8000)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 8000;
+	memcpy(i7);
+	r3 = (r2 + 16000)|0;
+	r4 = (r0 + 16000)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 8000;
+	memcpy(i7);
+	r3 = (r2 + 24000)|0;
+	r4 = (r0 + 24000)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 8000;
+	memcpy(i7);
+	r3 = (r2 + 32000)|0;
+	r0 = (r0 + 32000)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 8000;
+	memcpy(i7);
+	r0 = r2 >> 2;
+	r2 = heap32[(r1+10000)];
+	heap32[(r0+10000)] = r2;
+	r2 = heap32[(r1+10001)];
+	heap32[(r0+10001)] = r2;
+	r2 = heap32[(r1+10002)];
+	heap32[(r0+10002)] = r2;
+	r2 = heap32[(r1+10003)];
+	heap32[(r0+10003)] = r2;
+	r2 = heap32[(r1+10004)];
+	heap32[(r0+10004)] = r2;
+	r2 = heap32[(r1+10005)];
+	heap32[(r0+10005)] = r2;
+	r2 = heap32[(r1+10006)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r0+10006)];
+	r4 = heap32[(r2+1)];
+	r2 = heap32[(r2)];
+	r3 = r3 >> 2;
+	heap32[(r3)] = r2;
+	heap32[(r3+1)] = r4;
+	heap32[(r0+10007)] = heap32[(r1+10007)];
+	heap32[(r0+10008)] = heap32[(r1+10008)];
+	heap32[(r0+10009)] = heap32[(r1+10009)];
+	heap32[(r0+10010)] = heap32[(r1+10010)];
+	heap32[(r0+10011)] = heap32[(r1+10011)];
+	r0 = heap32[(r1+10006)];
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+else{
+break _161;
+}
+}
+}
+else{
+	if(r0 ==4) //_LBB26_291
+{
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 127;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB26_293
+{
+	r3 = 0;
+	r4 = (r2 + 4)|0;
+	r3 = (r3 - r4)|0;
+	r3 = r3 & 15;
+	r3 = (r2 + r3)|0;
+	r4 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r2;
+	r2 = r4;
+}
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	r3 = r2 >> 2;
+	_ZN17btConvexHullShapeC1EPKfii(i7);
+	r4 = heap32[(r3)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+6)];
+	r0 = sp + -96;
+	r5 = r0 >> 2;
+	heap32[(fp+-24)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	heap32[(r5+3)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	r0 = 0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+_178: while(true){
+	r4 = (r0 * -3)|0;
+	r5 = _ZL7TaruVtx;
+	r4 = r4 << 2;
+	r4 = (r5 + r4)|0;
+	r5 = sp + -80;
+	r4 = r4 >> 2;
+	r7 = r5 >> 2;
+	heap32[(fp+-20)] = heap32[(r4)];
+	heap32[(r7+1)] = heap32[(r4+1)];
+	heap32[(r7+2)] = heap32[(r4+2)];
+	heap32[(r7+3)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r5;
+	r0 = (r0 + -1)|0;
+	_ZN17btConvexHullShape8addPointERK9btVector3(i7);
+	if(r0 ==-43) //_LBB26_301
+{
+break _178;
+}
+}
+	r4 = sp + -160;
+	r0 = r4 >> 2;
+	heap32[(fp+-40)] = 1065353216;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	heap32[(r0+4)] = 0;
+	heap32[(r0+5)] = 1065353216;
+	heap32[(r0+6)] = 0;
+	heap32[(r0+7)] = 0;
+	heap32[(r0+8)] = 0;
+	heap32[(r0+9)] = 0;
+	heap32[(r0+10)] = 1065353216;
+	heap32[(r0+11)] = 0;
+	heap32[(r0+12)] = 0;
+	heap32[(r0+13)] = 0;
+	heap32[(r0+14)] = 0;
+	r5 = sp + -176;
+	heap32[(r0+15)] = 0;
+	r7 = r5 >> 2;
+	heap32[(fp+-44)] = 0;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r7 = heap32[(r3+8)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r5;
+	r3 = 15;
+	f0 =                         3;
+	f2 =                       -18;
+	f3 =                       1.5;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	f1 = f0;
+_181: while(true){
+	f4 = f3+f0;
+	r5 = 0;
+	r7 = r5;
+_183: while(true){
+	f5 = r7; //fitos r7, f5
+	f5 = f5*f4;
+	f5 = f5+f2;
+	r8 = r5;
+_185: while(true){
+	f6 = r8; //fitos r8, f6
+	f6 = f6*f4;
+	f6 = f6+f2;
+	heapFloat[(r0+12)] = f6;
+	heapFloat[(r0+13)] = f1;
+	heapFloat[(r0+14)] = f5;
+	heap32[(r0+15)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	r8 = (r8 + 1)|0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+if(!(r8 !=8)) //_LBB26_298
+{
+break _185;
+}
+}
+	r7 = (r7 + 1)|0;
+if(!(r7 !=8)) //_LBB26_297
+{
+break _183;
+}
+}
+	f4 =        1.0099999904632568;
+	f5 =      -0.05000000074505806;
+	f4 = f3*f4;
+	f6 =                         3;
+	f3 = f3*f5;
+	f5 =                         7;
+	f6 = f4+f6;
+	f3 = f3*f5;
+	r3 = (r3 + -1)|0;
+	f1 = f1+f6;
+	f2 = f3+f2;
+	f3 = f4;
+	if(r3 ==0) //_LBB26_165
+{
+break _161;
+}
+else{
+continue _181;
+}
+}
+}
+else{
+	if(r0 ==5) //_LBB26_302
+{
+	r3 = 10;
+	f0 =                        20;
+	f1 =                         2;
+	f2 =                       -25;
+_191: while(true){
+	f3 =                         3;
+	f4 =                        25;
+	f5 = f1+f3;
+	f4 = f0+f4;
+	r0 = 0;
+	r5 = r0;
+_193: while(true){
+	f6 = r5; //fitos r5, f6
+	f6 = f6*f5;
+	f6 = f6+f2;
+	f7 =                         5;
+	f6 = f6*f7;
+	f8 =                         0;
+	f6 = f6+f8;
+	r7 = r0;
+_195: while(true){
+	r8 = _ZL8nextRand;
+	r8 = r8 >> 2;
+	r9 = heap32[(r8)];
+	r9 = (r9 * 214013)|0;
+	r9 = (r9 + 2531011)|0;
+	r10 = sp + -64;
+	heap32[(r8)] = r9;
+	r8 = r10 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r8+1)] = 0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+5)] = 1065353216;
+	heap32[(r8+6)] = 0;
+	heap32[(r8+7)] = 0;
+	f9 = r7; //fitos r7, f9
+	heap32[(r8+8)] = 0;
+	f9 = f9*f5;
+	heap32[(r8+9)] = 0;
+	f9 = f9+f2;
+	heap32[(r8+10)] = 1065353216;
+	f9 = f9*f7;
+	f9 = f9+f8;
+	heap32[(r8+11)] = 0;
+	r9 = r9 >>> 16;
+	heapFloat[(r8+12)] = f9;
+	r9 = r9 & 32767;
+	heapFloat[(r8+13)] = f4;
+	r9 = Math.floor(uint(r9) % uint(9));
+	heapFloat[(r8+14)] = f6;
+	heap32[(r8+15)] = 0;
+if(!(uint(r9) >uint(8))) //_LBB26_321
+{
+	r8 = r4 << r9;
+	r11 = r8 & 7;
+	if(r11 !=0) //_LBB26_309
+{
+	r8 = heap32[(r2)];
+	r8 = (r8 + 1)|0;
+	heap32[(r2)] = r8;
+	r9 = (r9 + 1)|0;
+	f9 = r9; //fitos r9, f9
+	f10 =                       0.5;
+	heap32[(g0)] = 71;
+	f9 = f9*f10;
+	f10 =                       1.5;
+	malloc(i7);
+	r9 = r_g0;
+	f10 = f9*f10;
+	if(r9 !=0) //_LBB26_311
+{
+	r8 = 0;
+	r11 = (r9 + 4)|0;
+	r8 = (r8 - r11)|0;
+	r8 = r8 & 15;
+	r8 = (r9 + r8)|0;
+	r11 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r9;
+	r9 = r11;
+}
+	r8 = r9 >> 2;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 1065353216;
+	heap32[(r8+4)] = 1065353216;
+	heap32[(r8+5)] = 1065353216;
+	r11 = _ZTV10btBoxShape;
+	heap32[(r8+6)] = 0;
+	r11 = (r11 + 8)|0;
+	heap32[(r8+11)] = 1025758986;
+	heap32[(r8)] = r11;
+	f11 =     -0.039999999105930328;
+	f10 = f10+f11;
+	heap32[(r8+1)] = 0;
+	heapFloat[(r8+7)] = f10;
+	heapFloat[(r8+8)] = f10;
+	heapFloat[(r8+9)] = f10;
+	heap32[(r8+10)] = 0;
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r6;
+	heapFloat[(g0+1)] = f9;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+else{
+	r11 = r8 & 56;
+	if(r11 !=0) //_LBB26_313
+{
+	r8 = heap32[(r2)];
+	r8 = (r8 + 1)|0;
+	heap32[(r2)] = r8;
+	r9 = (r9 + -2)|0;
+	heap32[(g0)] = 71;
+	f9 = r9; //fitos r9, f9
+	f10 =                       0.5;
+	malloc(i7);
+	r9 = r_g0;
+	f9 = f9*f10;
+	if(r9 !=0) //_LBB26_315
+{
+	r8 = 0;
+	r11 = (r9 + 4)|0;
+	r8 = (r8 - r11)|0;
+	r8 = r8 & 15;
+	r8 = (r9 + r8)|0;
+	r11 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r9;
+	r9 = r11;
+}
+	r8 = r9 >> 2;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 1065353216;
+	heap32[(r8+4)] = 1065353216;
+	r11 = _ZTV13btSphereShape;
+	heap32[(r8+5)] = 1065353216;
+	r11 = (r11 + 8)|0;
+	heap32[(r8+6)] = 0;
+	heap32[(r8)] = r11;
+	f10 =                       1.5;
+	f10 = f9*f10;
+	heap32[(r8+1)] = 8;
+	heapFloat[(r8+7)] = f10;
+	heapFloat[(r8+11)] = f10;
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r6;
+	heapFloat[(g0+1)] = f9;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+else{
+	r8 = r8 & 448;
+	if(r8 !=0) //_LBB26_317
+{
+	r8 = heap32[(r2)];
+	r8 = (r8 + 1)|0;
+	heap32[(r2)] = r8;
+	r8 = (r9 + -5)|0;
+	heap32[(g0)] = 75;
+	f9 = r8; //fitos r8, f9
+	f10 =                       0.5;
+	malloc(i7);
+	r8 = r_g0;
+	f9 = f9*f10;
+	if(r8 !=0) //_LBB26_319
+{
+	r9 = 0;
+	r11 = (r8 + 4)|0;
+	r9 = (r9 - r11)|0;
+	r9 = r9 & 15;
+	r9 = (r8 + r9)|0;
+	r11 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = r11;
+}
+	r9 = r8 >> 2;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 1065353216;
+	heap32[(r9+4)] = 1065353216;
+	heap32[(r9+5)] = 1065353216;
+	r11 = _ZTV14btCapsuleShape;
+	heap32[(r9+6)] = 0;
+	r11 = (r11 + 8)|0;
+	heap32[(r9+11)] = 1025758986;
+	heap32[(r9)] = r11;
+	heap32[(r9+1)] = 10;
+	heap32[(r9+13)] = 1;
+	f11 = f9+f9;
+	f10 = f11*f10;
+	heapFloat[(r9+7)] = f9;
+	heapFloat[(r9+8)] = f10;
+	heapFloat[(r9+9)] = f9;
+	heap32[(r9+10)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+2)];
+	heap32[(g0)] = r6;
+	heapFloat[(g0+1)] = f9;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+}
+}
+}
+	r7 = (r7 + 1)|0;
+if(!(r7 !=10)) //_LBB26_305
+{
+break _195;
+}
+}
+	r5 = (r5 + 1)|0;
+if(!(r5 !=10)) //_LBB26_304
+{
+break _193;
+}
+}
+	f4 =        1.1000000238418579;
+	f5 =      -0.05000000074505806;
+	f4 = f1*f4;
+	f1 = f1*f5;
+	f5 =                         9;
+	f3 = f4+f3;
+	f1 = f1*f5;
+	r3 = (r3 + -1)|0;
+	f0 = f0+f3;
+	f2 = f1+f2;
+	f1 = f4;
+if(!(r3 !=0)) //_LBB26_303
+{
+break _191;
+}
+}
+	_ZN13BenchmarkDemo19createLargeMeshBodyEv(i7);
+	return;
+}
+else{
+break _161;
+}
+}
+}
+}
+else{
+	if(r0 ==1) //_LBB26_156
+{
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 71;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB26_158
+{
+	r3 = 0;
+	r4 = (r2 + 4)|0;
+	r3 = (r3 - r4)|0;
+	r3 = r3 & 15;
+	r3 = (r2 + r3)|0;
+	r4 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r2;
+	r2 = r4;
+}
+	r3 = r2 >> 2;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 1065353216;
+	heap32[(r3+4)] = 1065353216;
+	heap32[(r3+5)] = 1065353216;
+	r4 = _ZTV10btBoxShape;
+	heap32[(r3+6)] = 0;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+11)] = 1025758986;
+	heap32[(r3)] = r4;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+7)] = 1064682127;
+	heap32[(r3+8)] = 1064682127;
+	heap32[(r3+9)] = 1064682127;
+	r4 = sp + -1152;
+	heap32[(r3+10)] = 0;
+	r3 = r4 >> 2;
+	heap32[(fp+-288)] = 0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 1073741824;
+	heap32[(g0+2)] = r4;
+	_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3(i7);
+	r3 = sp + -1216;
+	r4 = r3 >> 2;
+	heap32[(fp+-304)] = 1065353216;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 1065353216;
+	heap32[(r4+6)] = 0;
+	heap32[(r4+7)] = 0;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 1065353216;
+	heap32[(r4+11)] = 0;
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = 0;
+	r0 = 47;
+	f0 =                       -12;
+	f1 =                         2;
+	heap32[(r4+14)] = 0;
+	heap32[(r4+15)] = 0;
+_225: while(true){
+	r5 = 0;
+	r7 = r5;
+_227: while(true){
+	f2 = r7; //fitos r7, f2
+	f3 =                         3;
+	f2 = f2*f3;
+	f2 = f2+f0;
+	r8 = r5;
+_229: while(true){
+	f4 = r8; //fitos r8, f4
+	f4 = f4*f3;
+	f4 = f4+f0;
+	heapFloat[(r4+12)] = f4;
+	heapFloat[(r4+13)] = f1;
+	heapFloat[(r4+14)] = f2;
+	heap32[(r4+15)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 1073741824;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r2;
+	r8 = (r8 + 1)|0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+if(!(r8 !=8)) //_LBB26_161
+{
+break _229;
+}
+}
+	r7 = (r7 + 1)|0;
+if(!(r7 !=8)) //_LBB26_160
+{
+break _227;
+}
+}
+	f2 =      -0.34999999403953552;
+	r0 = (r0 + -1)|0;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	if(r0 ==0) //_LBB26_165
+{
+break _161;
+}
+else{
+continue _225;
+}
+}
+}
+else{
+	if(r0 ==2) //_LBB26_166
+{
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 71;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB26_168
+{
+	r4 = 0;
+	r0 = (r3 + 4)|0;
+	r4 = (r4 - r0)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r0 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r0;
+}
+	r4 = r3 >> 2;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 1065353216;
+	heap32[(r4+4)] = 1065353216;
+	heap32[(r4+5)] = 1065353216;
+	r0 = _ZTV10btBoxShape;
+	heap32[(r4+6)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r4+11)] = 1025758986;
+	heap32[(r4)] = r0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+7)] = 1064682127;
+	heap32[(r4+8)] = 1064682127;
+	heap32[(r4+9)] = 1064682127;
+	r5 = sp + -1024;
+	heap32[(r4+10)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-256)] = 1065353216;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 1065353216;
+	heap32[(r4+6)] = 0;
+	heap32[(r4+7)] = 0;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 1065353216;
+	heap32[(r4+11)] = 0;
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	r7 = sp + -1040;
+	heap32[(r4+15)] = 0;
+	r8 = r7 >> 2;
+	heap32[(fp+-260)] = 0;
+	heap32[(r8+1)] = 0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r7;
+	r7 = 12;
+	f0 =       -12.240598678588867;
+	f1 =                         1;
+	_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3(i7);
+	f2 = f0;
+	f8 =                       -20;
+_239: while(true){
+if(!(r7 <1)) //_LBB26_173
+{
+	f4 =                         0;
+	f3 = f1+f4;
+	r8 = 0;
+	r9 = r8;
+_243: while(true){
+	f5 = r9; //fitos r9, f5
+	f6 =        2.0400998592376709;
+	f5 = f5*f6;
+	f5 = f5+f0;
+	f5 = f5+f4;
+	r10 = r8;
+_245: while(true){
+	f7 = r10; //fitos r10, f7
+	f7 = f7*f6;
+	f7 = f7+f2;
+	f7 = f7+f8;
+	heapFloat[(r4+12)] = f7;
+	heapFloat[(r4+13)] = f3;
+	heapFloat[(r4+14)] = f5;
+	heap32[(r4+15)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r3;
+	r10 = (r10 + 1)|0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+if(!(r7 !=r10)) //_LBB26_171
+{
+break _245;
+}
+}
+	r9 = (r9 + 1)|0;
+if(!(r7 !=r9)) //_LBB26_170
+{
+break _243;
+}
+}
+}
+	f3 =        2.0400998592376709;
+	f4 =        1.0199999809265137;
+	r7 = (r7 + -1)|0;
+	f1 = f1+f3;
+	f0 = f0+f4;
+	f2 = f2+f4;
+	if(r7 ==0) //_LBB26_176
+{
+break _239;
+}
+}
+	r3 = sp + -1136;
+	r4 = r3 >> 2;
+	heap32[(fp+-284)] = 1065353216;
+	heap32[(r4+1)] = 1065353216;
+	heap32[(r4+2)] = 1065353216;
+	r5 = sp + -1120;
+	heap32[(r4+3)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-280)] = -1073741824;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	r3 = sp + -1104;
+	_ZN13BenchmarkDemo10createWallERK9btVector3iS2_(i7);
+	r4 = r3 >> 2;
+	heap32[(fp+-276)] = 1065353216;
+	heap32[(r4+1)] = 1065353216;
+	heap32[(r4+2)] = 1065353216;
+	r5 = sp + -1088;
+	heap32[(r4+3)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-272)] = 1082130432;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	r3 = sp + -1072;
+	_ZN13BenchmarkDemo10createWallERK9btVector3iS2_(i7);
+	r4 = r3 >> 2;
+	heap32[(fp+-268)] = 1065353216;
+	heap32[(r4+1)] = 1065353216;
+	heap32[(r4+2)] = 1065353216;
+	r5 = sp + -1056;
+	heap32[(r4+3)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-264)] = 1092616192;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	_ZN13BenchmarkDemo10createWallERK9btVector3iS2_(i7);
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(g0)] = 71;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB26_178
+{
+	r3 = 0;
+	r4 = (r2 + 4)|0;
+	r3 = (r3 - r4)|0;
+	r3 = r3 & 15;
+	r3 = (r2 + r3)|0;
+	r4 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r2;
+	r2 = r4;
+}
+	r3 = r2 >> 2;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 1065353216;
+	heap32[(r3+4)] = 1065353216;
+	heap32[(r3+5)] = 1065353216;
+	heap32[(r3+6)] = 0;
+	heap32[(r3+11)] = 1025758986;
+	heap32[(r3)] = r0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+7)] = 1064682127;
+	heap32[(r3+8)] = 1064682127;
+	heap32[(r3+9)] = 1064682127;
+	r4 = sp + -944;
+	heap32[(r3+10)] = 0;
+	r3 = r4 >> 2;
+	heap32[(fp+-236)] = 1065353216;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = 1065353216;
+	heap32[(r3+6)] = 0;
+	heap32[(r3+7)] = 0;
+	heap32[(r3+8)] = 0;
+	heap32[(r3+9)] = 0;
+	heap32[(r3+10)] = 1065353216;
+	heap32[(r3+11)] = 0;
+	heap32[(r3+12)] = 0;
+	heap32[(r3+13)] = 0;
+	heap32[(r3+14)] = 0;
+	r0 = sp + -960;
+	heap32[(r3+15)] = 0;
+	r5 = r0 >> 2;
+	heap32[(fp+-240)] = 0;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r0;
+	r0 = 8;
+	f0 =                         1;
+	f1 =                         0;
+	_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3(i7);
+	f2 = f1;
+	f3 = f0;
+	f4 = f1;
+_253: while(true){
+	r5 = 24;
+_255: while(true){
+	f5 =        9.9312677383422852;
+	f6 =                         0;
+	f7 = f3*f0;
+	f8 = f4*f6;
+	f9 = f3*f5;
+	f10 = f1*f6;
+	f7 = f8+f7;
+	f11 = f2*f5;
+	f9 = f10+f9;
+	f12 = f2*f0;
+	f13 = f1*f0;
+	f14 = f2*f6;
+	f7 = f7+f11;
+	f9 = f9-f12;
+	f11 = f13+f14;
+	f12 = f4*f5;
+	f5 = f1*f5;
+	f13 = f4*f0;
+	f11 = f11-f12;
+	f12 = f4*f4;
+	f15 = f3*f3;
+	f16 = f4*f7;
+	f17 = f1*f9;
+	f5 = f5+f13;
+	f13 = f3*f6;
+	f5 = f5-f13;
+	f12 = f12+f15;
+	f15 = f2*f2;
+	f18 = f3*f7;
+	f19 = f1*f11;
+	f16 = f16+f17;
+	f17 = f2*f11;
+	f12 = f12+f15;
+	f15 = f1*f1;
+	f7 = f2*f7;
+	f20 = f1*f5;
+	f18 = f18+f19;
+	f19 = f4*f5;
+	f16 = f16-f17;
+	f5 = f3*f5;
+	f17 =                         2;
+	f12 = f12+f15;
+	f7 = f7+f20;
+	f15 = f3*f9;
+	f18 = f18-f19;
+	f9 = f2*f9;
+	f5 = f16+f5;
+	f16 =                        25;
+	f12 = f17/f12;
+	f9 = f18+f9;
+	f5 = f5+f16;
+	f7 = f7-f15;
+	f11 = f4*f11;
+	f15 = f2*f12;
+	f16 = f3*f12;
+	f7 = f7+f11;
+	f9 = f9+f6;
+	heapFloat[(r3+12)] = f5;
+	f5 = f3*f16;
+	f11 = f2*f15;
+	f7 = f7+f6;
+	heapFloat[(r3+13)] = f9;
+	heapFloat[(r3+14)] = f7;
+	f7 =                         1;
+	f9 = f5+f11;
+	f18 = f4*f16;
+	f19 = f1*f15;
+	f9 = f7-f9;
+	heap32[(r3+15)] = 0;
+	f20 = f4*f15;
+	f16 = f1*f16;
+	f21 = f18-f19;
+	heapFloat[(fp+-236)] = f9;
+	f9 = f4*f12;
+	f12 = f20+f16;
+	heapFloat[(r3+1)] = f21;
+	f21 = f4*f9;
+	heapFloat[(r3+2)] = f12;
+	f11 = f21+f11;
+	f12 = f18+f19;
+	heap32[(r3+3)] = 0;
+	f15 = f3*f15;
+	f9 = f1*f9;
+	f11 = f7-f11;
+	heapFloat[(r3+4)] = f12;
+	f12 = f15-f9;
+	heapFloat[(r3+5)] = f11;
+	heapFloat[(r3+6)] = f12;
+	f11 = f20-f16;
+	heap32[(r3+7)] = 0;
+	f5 = f21+f5;
+	f9 = f15+f9;
+	heapFloat[(r3+8)] = f11;
+	f5 = f7-f5;
+	heapFloat[(r3+9)] = f9;
+	heapFloat[(r3+10)] = f5;
+	heap32[(r3+11)] = 0;
+	r7 = heap32[(r1)];
+	r7 = r7 >> 2;
+	f5 =       0.99144488573074341;
+	f7 =       0.13052619993686676;
+	r7 = heap32[(r7+2)];
+	f9 = f1*f5;
+	f11 = f2*f5;
+	f12 = f4*f5;
+	f1 = f1*f7;
+	f5 = f3*f5;
+	f1 = f1+f5;
+	f5 = f10+f12;
+	f9 = f9-f8;
+	f3 = f3*f7;
+	f10 = f10+f11;
+	f4 = f4*f7;
+	f3 = f9-f3;
+	f4 = f10+f4;
+	f9 = f1+f14;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 1065353216;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	f5 = f5+f13;
+	f7 = f2*f7;
+	r5 = (r5 + -1)|0;
+	f1 = f3-f14;
+	f2 = f4-f13;
+	f3 = f9-f8;
+	f4 = f5-f7;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+if(!(r5 !=0)) //_LBB26_180
+{
+break _255;
+}
+}
+	f5 =       0.99785894155502319;
+	f7 =      0.065403133630752563;
+	f8 = f4*f5;
+	f9 = f1*f6;
+	f10 = f2*f5;
+	f11 = f1*f7;
+	f12 = f3*f5;
+	f1 = f1*f5;
+	f5 = f4*f6;
+	f8 = f9+f8;
+	f13 = f3*f6;
+	f11 = f11+f12;
+	f6 = f2*f6;
+	f9 = f9+f10;
+	f4 = f4*f7;
+	f1 = f1-f5;
+	f3 = f3*f7;
+	f10 = f11+f6;
+	f9 = f9+f4;
+	f1 = f1-f3;
+	f3 = f8+f13;
+	f2 = f2*f7;
+	r0 = (r0 + -1)|0;
+	f4 = f3-f2;
+	f3 = f10-f5;
+	f2 = f9-f13;
+	f1 = f1-f6;
+	f0 = f0+f17;
+	if(r0 ==0) //_LBB26_165
+{
+break _161;
+}
+else{
+continue _253;
+}
+}
+}
+else{
+	if(r0 ==3) //_LBB26_183
+{
+	r3 = -16;
+	r0 = 16;
+	f0 =                         0;
+	f1 =                         1;
+	f2 = f0;
+_260: while(true){
+	f3 = r3; //fitos r3, f3
+	f4 =                         6;
+	f3 = f3*f4;
+	f5 =                       0.5;
+	f6 =                       3.5;
+	f7 =        4.2000002861022949;
+	f8 =        5.5999999046325684;
+	f9 =        2.2749998569488525;
+	f10 =       0.69999998807907104;
+	f11 =        5.0750002861022949;
+	f3 = f3*f5;
+	f5 = f2+f0;
+	f6 = f1+f6;
+	f7 = f1+f7;
+	f8 = f1+f8;
+	f9 = f1+f9;
+	f10 = f1+f10;
+	f11 = f1+f11;
+	r5 = 0;
+_262: while(true){
+	heap32[(g0)] = 136;
+	_Znwj(i7);
+	r7 = r_g0;
+	r8 = _ZTV7RagDoll;
+	r9 = r7 >> 2;
+	r10 = heap32[(r1+1)];
+	r8 = (r8 + 8)|0;
+	heap32[(r9)] = r8;
+	heap32[(r9+1)] = r10;
+	r8 = heap32[(r2)];
+	r9 = (r8 + 1)|0;
+	heap32[(r2)] = r9;
+	f12 = r5; //fitos r5, f12
+	heap32[(g0)] = 75;
+	f12 = f12*f4;
+	malloc(i7);
+	r9 = r_g0;
+	f12 = f12+f3;
+	if(r9 !=0) //_LBB26_187
+{
+	r10 = 0;
+	r11 = (r9 + 4)|0;
+	r10 = (r10 - r11)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r11 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r11;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	r11 = _ZTV14btCapsuleShape;
+	heap32[(r10+6)] = 0;
+	r11 = (r11 + 8)|0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1057384039;
+	heap32[(r10+8)] = 1051931443;
+	heap32[(r10+9)] = 1057384039;
+	r12 = r7 >> 2;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 2)|0;
+	heap32[(r12+2)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_190
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1057384039;
+	heap32[(r10+8)] = 1056629064;
+	heap32[(r10+9)] = 1057384039;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 3)|0;
+	heap32[(r12+3)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_193
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1051931443;
+	heap32[(r10+8)] = 1035154227;
+	heap32[(r10+9)] = 1051931443;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 4)|0;
+	heap32[(r12+4)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_196
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1048240456;
+	heap32[(r10+8)] = 1061788057;
+	heap32[(r10+9)] = 1048240456;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 5)|0;
+	heap32[(r12+5)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_199
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1043542835;
+	heap32[(r10+8)] = 1059439248;
+	heap32[(r10+9)] = 1043542835;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 6)|0;
+	heap32[(r12+6)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_202
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1048240456;
+	heap32[(r10+8)] = 1061788057;
+	heap32[(r10+9)] = 1048240456;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 7)|0;
+	heap32[(r12+7)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_205
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1043542835;
+	heap32[(r10+8)] = 1059439248;
+	heap32[(r10+9)] = 1043542835;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 8)|0;
+	heap32[(r12+8)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_208
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1043542835;
+	heap32[(r10+8)] = 1058264843;
+	heap32[(r10+9)] = 1043542835;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 9)|0;
+	heap32[(r12+9)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_211
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1041194025;
+	heap32[(r10+8)] = 1054867456;
+	heap32[(r10+9)] = 1041194025;
+	heap32[(r10+10)] = 0;
+	r10 = (r8 + 10)|0;
+	heap32[(r12+10)] = r9;
+	heap32[(r2)] = r10;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB26_214
+{
+	r10 = 0;
+	r13 = (r9 + 4)|0;
+	r10 = (r10 - r13)|0;
+	r10 = r10 & 15;
+	r10 = (r9 + r10)|0;
+	r13 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r9;
+	r9 = r13;
+}
+	r10 = r9 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+11)] = 1025758986;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = 10;
+	heap32[(r10+13)] = 1;
+	heap32[(r10+7)] = 1043542835;
+	heap32[(r10+8)] = 1058264843;
+	heap32[(r10+9)] = 1043542835;
+	heap32[(r10+10)] = 0;
+	r8 = (r8 + 11)|0;
+	heap32[(r12+11)] = r9;
+	heap32[(r2)] = r8;
+	heap32[(g0)] = 75;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB26_217
+{
+	r9 = 0;
+	r10 = (r8 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r8 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = r10;
+}
+	r9 = r8 >> 2;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 1065353216;
+	heap32[(r9+4)] = 1065353216;
+	heap32[(r9+5)] = 1065353216;
+	heap32[(r9+6)] = 0;
+	heap32[(r9+11)] = 1025758986;
+	heap32[(r9)] = r11;
+	heap32[(r9+1)] = 10;
+	heap32[(r9+13)] = 1;
+	heap32[(r9+7)] = 1041194025;
+	heap32[(r9+8)] = 1054867456;
+	heap32[(r9+9)] = 1041194025;
+	heap32[(r9+10)] = 0;
+	heap32[(r12+12)] = r8;
+	r8 = heap32[(r12+2)];
+	r9 = sp + -880;
+	r10 = r9 >> 2;
+	heap32[(fp+-220)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	heap32[(r10+10)] = 1065353216;
+	f13 =                         0;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f6;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+13)] = r_g0;
+	r8 = heap32[(r12+3)];
+	r9 = sp + -816;
+	r10 = r9 >> 2;
+	heap32[(fp+-204)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	heap32[(r10+10)] = 1065353216;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f7;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+14)] = r_g0;
+	r8 = heap32[(r12+4)];
+	r9 = sp + -752;
+	r10 = r9 >> 2;
+	heap32[(fp+-188)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	heap32[(r10+10)] = 1065353216;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f8;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+15)] = r_g0;
+	r8 = heap32[(r12+5)];
+	r9 = sp + -688;
+	r10 = r9 >> 2;
+	heap32[(fp+-172)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	f13 =      -0.62999999523162842;
+	heap32[(r10+10)] = 1065353216;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f9;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+16)] = r_g0;
+	r8 = heap32[(r12+6)];
+	r9 = sp + -624;
+	r10 = r9 >> 2;
+	heap32[(fp+-156)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	heap32[(r10+10)] = 1065353216;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f10;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+17)] = r_g0;
+	r8 = heap32[(r12+7)];
+	r9 = sp + -560;
+	r10 = r9 >> 2;
+	heap32[(fp+-140)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	f13 =       0.62999999523162842;
+	heap32[(r10+10)] = 1065353216;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f9;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+18)] = r_g0;
+	r8 = heap32[(r12+8)];
+	r9 = sp + -496;
+	r10 = r9 >> 2;
+	heap32[(fp+-124)] = 1065353216;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	heap32[(r10+10)] = 1065353216;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f10;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+19)] = r_g0;
+	r8 = heap32[(r12+9)];
+	r9 = sp + -432;
+	r10 = r9 >> 2;
+	heap32[(fp+-108)] = -1287930578;
+	heap32[(r10+1)] = -1082130432;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = -1287930578;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	f13 =       -1.2250000238418579;
+	heap32[(r10+10)] = 1065353216;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f11;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+20)] = r_g0;
+	r8 = heap32[(r12+10)];
+	r9 = sp + -368;
+	r10 = r9 >> 2;
+	heap32[(fp+-92)] = -1287930578;
+	heap32[(r10+1)] = -1082130432;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = -1287930578;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = 0;
+	heap32[(r10+9)] = 0;
+	f13 =       -2.4500000476837158;
+	heap32[(r10+10)] = 1065353216;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f11;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+21)] = r_g0;
+	r8 = heap32[(r12+11)];
+	r9 = sp + -304;
+	r10 = r9 >> 2;
+	heap32[(fp+-76)] = -1287930578;
+	heap32[(r10+1)] = 1065353216;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = -1082130432;
+	heap32[(r10+5)] = -1287930578;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = -2147483648;
+	heap32[(r10+9)] = 0;
+	f13 =        1.2250000238418579;
+	heap32[(r10+10)] = 1065353216;
+	f13 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f13;
+	heapFloat[(r10+13)] = f11;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	heap32[(r12+22)] = r_g0;
+	r8 = heap32[(r12+12)];
+	r9 = sp + -240;
+	r10 = r9 >> 2;
+	heap32[(fp+-60)] = -1287930578;
+	heap32[(r10+1)] = 1065353216;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = -1082130432;
+	heap32[(r10+5)] = -1287930578;
+	heap32[(r10+6)] = 0;
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = -2147483648;
+	heap32[(r10+9)] = 0;
+	f13 =        2.4500000476837158;
+	heap32[(r10+10)] = 1065353216;
+	f12 = f12+f13;
+	heap32[(r10+11)] = 0;
+	heapFloat[(r10+12)] = f12;
+	heapFloat[(r10+13)] = f11;
+	heapFloat[(r10+14)] = f5;
+	heap32[(r10+15)] = 0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	_ZN7RagDoll20localCreateRigidBodyEfRK11btTransformP16btCollisionShape(i7);
+	r9 = 0;
+	heap32[(r12+23)] = r_g0;
+_297: while(true){
+	r8 = r9 << 2;
+	r8 = (r7 - r8)|0;
+	r8 = r8 >> 2;
+	r10 = heap32[(r8+13)];
+	r10 = r10 >> 2;
+	heap32[(r10+109)] = 1028443341;
+	heap32[(r10+110)] = 1062836634;
+	r10 = heap32[(r8+13)];
+	r10 = r10 >> 2;
+	heap32[(r10+55)] = 1061997773;
+	r8 = heap32[(r8+13)];
+	r8 = r8 >> 2;
+	r9 = (r9 + -1)|0;
+	heap32[(r8+116)] = 1070386381;
+	heap32[(r8+117)] = 1075838976;
+if(!(r9 !=-11)) //_LBB26_219
+{
+break _297;
+}
+}
+	heap32[(g0)] = 748;
+	_Znwj(i7);
+	r8 = r_g0;
+	r9 = heap32[(r12+14)];
+	r10 = heap32[(r12+13)];
+	r11 = r8 >> 2;
+	heap32[(r11+1)] = 4;
+	heap32[(r11+2)] = -1;
+	r13 = 0;
+	heap32[(r11+3)] = -1;
+	heap8[r8+16] = r13;
+	heap32[(r11+5)] = r10;
+	heap32[(r11+6)] = r9;
+	r9 = _ZTV17btHingeConstraint;
+	heap32[(r11+7)] = 0;
+	r9 = (r9 + 8)|0;
+	heap32[(r11+8)] = 1050253722;
+	heap32[(r11)] = r9;
+	heap32[(r11+135)] = -1287930578;
+	heap32[(r11+136)] = 0;
+	heap32[(r11+137)] = 1065353216;
+	heap32[(r11+138)] = 0;
+	heap32[(r11+139)] = -2147483648;
+	heap32[(r11+140)] = 1065353216;
+	heap32[(r11+141)] = 0;
+	heap32[(r11+142)] = 0;
+	heap32[(r11+143)] = -1082130432;
+	heap32[(r11+144)] = -2147483648;
+	heap32[(r11+145)] = -1287930578;
+	heap32[(r11+146)] = 0;
+	heap32[(r11+147)] = 0;
+	heap32[(r11+148)] = 1057384039;
+	heap32[(r11+149)] = 0;
+	heap32[(r11+150)] = 0;
+	heap32[(r11+151)] = -1287930578;
+	heap32[(r11+152)] = 0;
+	heap32[(r11+153)] = 1065353216;
+	heap32[(r11+154)] = 0;
+	heap32[(r11+155)] = -2147483648;
+	heap32[(r11+156)] = 1065353216;
+	heap32[(r11+157)] = 0;
+	heap32[(r11+158)] = 0;
+	heap32[(r11+159)] = -1082130432;
+	heap32[(r11+160)] = -2147483648;
+	heap32[(r11+161)] = -1287930578;
+	heap32[(r11+162)] = 0;
+	heap32[(r11+163)] = 0;
+	heap32[(r11+164)] = -1090099609;
+	heap32[(r11+165)] = 0;
+	heap32[(r11+166)] = 0;
+	heap8[r8+720] = r13;
+	heap8[r8+721] = r13;
+	heap8[r8+723] = r13;
+	heap8[r8+724] = r4;
+	heap8[r8+725] = r13;
+	heap32[(r11+183)] = 0;
+	heap32[(r11+172)] = 1065353216;
+	heap32[(r11+173)] = -1082130432;
+	heap32[(r11+170)] = 1050253722;
+	heap32[(r11+171)] = 1065353216;
+	heap32[(r11+169)] = 1063675494;
+	heap8[r8+722] = r13;
+	heap32[(r11+179)] = 1065353216;
+	heap32[(g0)] = -1085730853;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	f13 =       -3.1415927410125732;
+	if(f12 >=f13) //_LBB26_222
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_224
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	r10 = r8 >> 2;
+	heapFloat[(r10+172)] = f12;
+	heap32[(g0)] = 1070141403;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_227
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_229
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	heapFloat[(r10+173)] = f12;
+	heap32[(r10+169)] = 1063675494;
+	heap32[(r10+170)] = 1050253722;
+	heap32[(r10+171)] = 1065353216;
+	heap32[(r12+24)] = r8;
+	r10 = heap32[(r12+1)];
+	r11 = r10 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+13)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(g0)] = 596;
+	_Znwj(i7);
+	r10 = heap32[(r12+15)];
+	r11 = heap32[(r12+14)];
+	r14 = r_g0 >> 2;
+	heap32[(r14+1)] = 5;
+	heap32[(r14+2)] = -1;
+	heap32[(r14+3)] = -1;
+	heap8[r_g0+16] = r13;
+	heap32[(r14+5)] = r11;
+	heap32[(r14+6)] = r10;
+	heap32[(r14+7)] = 0;
+	r10 = _ZTV21btConeTwistConstraint;
+	heap32[(r14+8)] = 1050253722;
+	r10 = (r10 + 8)|0;
+	heap32[(r14)] = r10;
+	heap32[(r14+72)] = -1287930578;
+	heap32[(r14+73)] = -1082130432;
+	heap32[(r14+74)] = 0;
+	heap32[(r14+75)] = 0;
+	heap32[(r14+76)] = 1065353216;
+	heap32[(r14+77)] = -1287930578;
+	heap32[(r14+78)] = 0;
+	heap32[(r14+79)] = 0;
+	heap32[(r14+80)] = -2147483648;
+	heap32[(r14+81)] = 0;
+	heap32[(r14+82)] = 1065353216;
+	heap32[(r14+83)] = 0;
+	heap32[(r14+84)] = 0;
+	heap32[(r14+85)] = 1065772647;
+	heap32[(r14+86)] = 0;
+	heap32[(r14+87)] = 0;
+	heap32[(r14+88)] = -1287930578;
+	heap32[(r14+89)] = -1082130432;
+	heap32[(r14+90)] = 0;
+	heap32[(r14+91)] = 0;
+	heap32[(r14+92)] = 1065353216;
+	heap32[(r14+93)] = -1287930578;
+	heap32[(r14+94)] = 0;
+	heap32[(r14+95)] = 0;
+	heap32[(r14+96)] = -2147483648;
+	heap32[(r14+97)] = 0;
+	heap32[(r14+98)] = 1065353216;
+	heap32[(r14+99)] = 0;
+	heap32[(r14+100)] = 0;
+	heap32[(r14+101)] = -1090854584;
+	heap32[(r14+102)] = 0;
+	heap32[(r14+103)] = 0;
+	heap8[r_g0+540] = r13;
+	heap32[(r14+128)] = 0;
+	heap32[(r14+140)] = -1082130432;
+	heap32[(r14+107)] = 1008981770;
+	heap32[(r14+111)] = 1028443341;
+	heap32[(r14+145)] = 0;
+	heap32[(r14+146)] = 0;
+	heap32[(r14+147)] = 1060320051;
+	heap32[(r14+148)] = 0;
+	heap32[(r14+108)] = 1061752795;
+	heap32[(r14+109)] = 1061752795;
+	heap32[(r14+110)] = 1070141403;
+	heap32[(r14+104)] = 1065353216;
+	heap32[(r14+105)] = 1050253722;
+	heap32[(r14+106)] = 1065353216;
+	heap32[(r12+25)] = r_g0;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 596;
+	_Znwj(i7);
+	r11 = heap32[(r12+16)];
+	r14 = heap32[(r12+13)];
+	r15 = r_g0 >> 2;
+	heap32[(r15+1)] = 5;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r_g0+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r10;
+	heap32[(r15+72)] = -1087044364;
+	heap32[(r15+73)] = -1087044366;
+	heap32[(r15+74)] = 0;
+	heap32[(r15+75)] = 0;
+	heap32[(r15+76)] = 1060439282;
+	heap32[(r15+77)] = -1087044364;
+	heap32[(r15+78)] = 0;
+	heap32[(r15+79)] = 0;
+	heap32[(r15+80)] = -2147483648;
+	heap32[(r15+81)] = 0;
+	heap32[(r15+82)] = 1065353216;
+	heap32[(r15+83)] = 0;
+	heap32[(r15+84)] = -1088338002;
+	heap32[(r15+85)] = -1095552205;
+	heap32[(r15+86)] = 0;
+	heap32[(r15+87)] = 0;
+	heap32[(r15+88)] = -1087044364;
+	heap32[(r15+89)] = -1087044366;
+	heap32[(r15+90)] = 0;
+	heap32[(r15+91)] = 0;
+	heap32[(r15+92)] = 1060439282;
+	heap32[(r15+93)] = -1087044364;
+	heap32[(r15+94)] = 0;
+	heap32[(r15+95)] = 0;
+	heap32[(r15+96)] = -2147483648;
+	heap32[(r15+97)] = 0;
+	heap32[(r15+98)] = 1065353216;
+	heap32[(r15+99)] = 0;
+	heap32[(r15+100)] = 0;
+	heap32[(r15+101)] = 1061788057;
+	heap32[(r15+102)] = 0;
+	heap32[(r15+103)] = 0;
+	heap8[r_g0+540] = r13;
+	heap32[(r15+128)] = 0;
+	heap32[(r15+140)] = -1082130432;
+	heap32[(r15+107)] = 1008981770;
+	heap32[(r15+111)] = 1028443341;
+	heap32[(r15+145)] = 0;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 1060320051;
+	heap32[(r15+148)] = 0;
+	heap32[(r15+108)] = 1061752795;
+	heap32[(r15+109)] = 1061752795;
+	heap32[(r15+110)] = 0;
+	heap32[(r15+104)] = 1065353216;
+	heap32[(r15+105)] = 1050253722;
+	heap32[(r15+106)] = 1065353216;
+	heap32[(r12+26)] = r_g0;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 748;
+	_Znwj(i7);
+	r8 = r_g0;
+	r11 = heap32[(r12+17)];
+	r14 = heap32[(r12+16)];
+	r15 = r8 >> 2;
+	heap32[(r15+1)] = 4;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r8+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r9;
+	heap32[(r15+135)] = -1287930578;
+	heap32[(r15+136)] = 0;
+	heap32[(r15+137)] = 1065353216;
+	heap32[(r15+138)] = 0;
+	heap32[(r15+139)] = -2147483648;
+	heap32[(r15+140)] = 1065353216;
+	heap32[(r15+141)] = 0;
+	heap32[(r15+142)] = 0;
+	heap32[(r15+143)] = -1082130432;
+	heap32[(r15+144)] = -2147483648;
+	heap32[(r15+145)] = -1287930578;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 0;
+	heap32[(r15+148)] = -1085695591;
+	heap32[(r15+149)] = 0;
+	heap32[(r15+150)] = 0;
+	heap32[(r15+151)] = -1287930578;
+	heap32[(r15+152)] = 0;
+	heap32[(r15+153)] = 1065353216;
+	heap32[(r15+154)] = 0;
+	heap32[(r15+155)] = -2147483648;
+	heap32[(r15+156)] = 1065353216;
+	heap32[(r15+157)] = 0;
+	heap32[(r15+158)] = 0;
+	heap32[(r15+159)] = -1082130432;
+	heap32[(r15+160)] = -2147483648;
+	heap32[(r15+161)] = -1287930578;
+	heap32[(r15+162)] = 0;
+	heap32[(r15+163)] = 0;
+	heap32[(r15+164)] = 1059439248;
+	heap32[(r15+165)] = 0;
+	heap32[(r15+166)] = 0;
+	heap8[r8+720] = r13;
+	heap8[r8+721] = r13;
+	heap8[r8+723] = r13;
+	heap8[r8+724] = r4;
+	heap8[r8+725] = r13;
+	heap32[(r15+183)] = 0;
+	heap32[(r15+172)] = 1065353216;
+	heap32[(r15+173)] = -1082130432;
+	heap32[(r15+170)] = 1050253722;
+	heap32[(r15+171)] = 1065353216;
+	heap32[(r15+169)] = 1063675494;
+	heap8[r8+722] = r13;
+	heap32[(r15+179)] = 1065353216;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_232
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_234
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	r11 = r8 >> 2;
+	heapFloat[(r11+172)] = f12;
+	heap32[(g0)] = 1070141403;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_237
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_239
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	heapFloat[(r11+173)] = f12;
+	heap32[(r11+169)] = 1063675494;
+	heap32[(r11+170)] = 1050253722;
+	heap32[(r11+171)] = 1065353216;
+	heap32[(r12+27)] = r8;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 596;
+	_Znwj(i7);
+	r11 = heap32[(r12+18)];
+	r14 = heap32[(r12+13)];
+	r15 = r_g0 >> 2;
+	heap32[(r15+1)] = 5;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r_g0+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r10;
+	heap32[(r15+72)] = 1060439283;
+	heap32[(r15+73)] = -1087044365;
+	heap32[(r15+74)] = 0;
+	heap32[(r15+75)] = 0;
+	heap32[(r15+76)] = 1060439283;
+	heap32[(r15+77)] = 1060439283;
+	heap32[(r15+78)] = 0;
+	heap32[(r15+79)] = 0;
+	heap32[(r15+80)] = -2147483648;
+	heap32[(r15+81)] = 0;
+	heap32[(r15+82)] = 1065353216;
+	heap32[(r15+83)] = 0;
+	heap32[(r15+84)] = 1059145646;
+	heap32[(r15+85)] = -1095552205;
+	heap32[(r15+86)] = 0;
+	heap32[(r15+87)] = 0;
+	heap32[(r15+88)] = 1060439283;
+	heap32[(r15+89)] = -1087044365;
+	heap32[(r15+90)] = 0;
+	heap32[(r15+91)] = 0;
+	heap32[(r15+92)] = 1060439283;
+	heap32[(r15+93)] = 1060439283;
+	heap32[(r15+94)] = 0;
+	heap32[(r15+95)] = 0;
+	heap32[(r15+96)] = -2147483648;
+	heap32[(r15+97)] = 0;
+	heap32[(r15+98)] = 1065353216;
+	heap32[(r15+99)] = 0;
+	heap32[(r15+100)] = 0;
+	heap32[(r15+101)] = 1061788057;
+	heap32[(r15+102)] = 0;
+	heap32[(r15+103)] = 0;
+	heap8[r_g0+540] = r13;
+	heap32[(r15+128)] = 0;
+	heap32[(r15+140)] = -1082130432;
+	heap32[(r15+107)] = 1008981770;
+	heap32[(r15+111)] = 1028443341;
+	heap32[(r15+145)] = 0;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 1060320051;
+	heap32[(r15+148)] = 0;
+	heap32[(r15+108)] = 1061752795;
+	heap32[(r15+109)] = 1061752795;
+	heap32[(r15+110)] = 0;
+	heap32[(r15+104)] = 1065353216;
+	heap32[(r15+105)] = 1050253722;
+	heap32[(r15+106)] = 1065353216;
+	heap32[(r12+28)] = r_g0;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 748;
+	_Znwj(i7);
+	r8 = r_g0;
+	r11 = heap32[(r12+19)];
+	r14 = heap32[(r12+18)];
+	r15 = r8 >> 2;
+	heap32[(r15+1)] = 4;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r8+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r9;
+	heap32[(r15+135)] = -1287930578;
+	heap32[(r15+136)] = 0;
+	heap32[(r15+137)] = 1065353216;
+	heap32[(r15+138)] = 0;
+	heap32[(r15+139)] = -2147483648;
+	heap32[(r15+140)] = 1065353216;
+	heap32[(r15+141)] = 0;
+	heap32[(r15+142)] = 0;
+	heap32[(r15+143)] = -1082130432;
+	heap32[(r15+144)] = -2147483648;
+	heap32[(r15+145)] = -1287930578;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 0;
+	heap32[(r15+148)] = -1085695591;
+	heap32[(r15+149)] = 0;
+	heap32[(r15+150)] = 0;
+	heap32[(r15+151)] = -1287930578;
+	heap32[(r15+152)] = 0;
+	heap32[(r15+153)] = 1065353216;
+	heap32[(r15+154)] = 0;
+	heap32[(r15+155)] = -2147483648;
+	heap32[(r15+156)] = 1065353216;
+	heap32[(r15+157)] = 0;
+	heap32[(r15+158)] = 0;
+	heap32[(r15+159)] = -1082130432;
+	heap32[(r15+160)] = -2147483648;
+	heap32[(r15+161)] = -1287930578;
+	heap32[(r15+162)] = 0;
+	heap32[(r15+163)] = 0;
+	heap32[(r15+164)] = 1059439248;
+	heap32[(r15+165)] = 0;
+	heap32[(r15+166)] = 0;
+	heap8[r8+720] = r13;
+	heap8[r8+721] = r13;
+	heap8[r8+723] = r13;
+	heap8[r8+724] = r4;
+	heap8[r8+725] = r13;
+	heap32[(r15+183)] = 0;
+	heap32[(r15+172)] = 1065353216;
+	heap32[(r15+173)] = -1082130432;
+	heap32[(r15+170)] = 1050253722;
+	heap32[(r15+171)] = 1065353216;
+	heap32[(r15+169)] = 1063675494;
+	heap8[r8+722] = r13;
+	heap32[(r15+179)] = 1065353216;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_242
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_244
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	r11 = r8 >> 2;
+	heapFloat[(r11+172)] = f12;
+	heap32[(g0)] = 1070141403;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_247
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_249
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	heapFloat[(r11+173)] = f12;
+	heap32[(r11+169)] = 1063675494;
+	heap32[(r11+170)] = 1050253722;
+	heap32[(r11+171)] = 1065353216;
+	heap32[(r12+29)] = r8;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 596;
+	_Znwj(i7);
+	r11 = heap32[(r12+20)];
+	r14 = heap32[(r12+14)];
+	r15 = r_g0 >> 2;
+	heap32[(r15+1)] = 5;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r_g0+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r10;
+	heap32[(r15+72)] = -1082130432;
+	heap32[(r15+73)] = 867941678;
+	heap32[(r15+74)] = -2147483648;
+	heap32[(r15+75)] = 0;
+	heap32[(r15+76)] = -1279541970;
+	heap32[(r15+77)] = -1082130432;
+	heap32[(r15+78)] = 0;
+	heap32[(r15+79)] = 0;
+	heap32[(r15+80)] = -2147483648;
+	heap32[(r15+81)] = 0;
+	heap32[(r15+82)] = 1065353216;
+	heap32[(r15+83)] = 0;
+	heap32[(r15+84)] = -1087163597;
+	heap32[(r15+85)] = 1057384039;
+	heap32[(r15+86)] = 0;
+	heap32[(r15+87)] = 0;
+	heap32[(r15+88)] = -1287930578;
+	heap32[(r15+89)] = -1082130432;
+	heap32[(r15+90)] = 0;
+	heap32[(r15+91)] = 0;
+	heap32[(r15+92)] = 1065353216;
+	heap32[(r15+93)] = -1287930578;
+	heap32[(r15+94)] = 0;
+	heap32[(r15+95)] = 0;
+	heap32[(r15+96)] = -2147483648;
+	heap32[(r15+97)] = 0;
+	heap32[(r15+98)] = 1065353216;
+	heap32[(r15+99)] = 0;
+	heap32[(r15+100)] = 0;
+	heap32[(r15+101)] = -1088338002;
+	heap32[(r15+102)] = 0;
+	heap32[(r15+103)] = 0;
+	heap8[r_g0+540] = r13;
+	heap32[(r15+128)] = 0;
+	heap32[(r15+140)] = -1082130432;
+	heap32[(r15+107)] = 1008981770;
+	heap32[(r15+111)] = 1028443341;
+	heap32[(r15+145)] = 0;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 1060320051;
+	heap32[(r15+148)] = 0;
+	heap32[(r15+108)] = 1070141403;
+	heap32[(r15+109)] = 1070141403;
+	heap32[(r15+110)] = 0;
+	heap32[(r15+104)] = 1065353216;
+	heap32[(r15+105)] = 1050253722;
+	heap32[(r15+106)] = 1065353216;
+	heap32[(r12+30)] = r_g0;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 748;
+	_Znwj(i7);
+	r8 = r_g0;
+	r11 = heap32[(r12+21)];
+	r14 = heap32[(r12+20)];
+	r15 = r8 >> 2;
+	heap32[(r15+1)] = 4;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r8+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r9;
+	heap32[(r15+135)] = -1287930578;
+	heap32[(r15+136)] = 0;
+	heap32[(r15+137)] = 1065353216;
+	heap32[(r15+138)] = 0;
+	heap32[(r15+139)] = -2147483648;
+	heap32[(r15+140)] = 1065353216;
+	heap32[(r15+141)] = 0;
+	heap32[(r15+142)] = 0;
+	heap32[(r15+143)] = -1082130432;
+	heap32[(r15+144)] = -2147483648;
+	heap32[(r15+145)] = -1287930578;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 0;
+	heap32[(r15+148)] = 1059145646;
+	heap32[(r15+149)] = 0;
+	heap32[(r15+150)] = 0;
+	heap32[(r15+151)] = -1287930578;
+	heap32[(r15+152)] = 0;
+	heap32[(r15+153)] = 1065353216;
+	heap32[(r15+154)] = 0;
+	heap32[(r15+155)] = -2147483648;
+	heap32[(r15+156)] = 1065353216;
+	heap32[(r15+157)] = 0;
+	heap32[(r15+158)] = 0;
+	heap32[(r15+159)] = -1082130432;
+	heap32[(r15+160)] = -2147483648;
+	heap32[(r15+161)] = -1287930578;
+	heap32[(r15+162)] = 0;
+	heap32[(r15+163)] = 0;
+	heap32[(r15+164)] = -1090854584;
+	heap32[(r15+165)] = 0;
+	heap32[(r15+166)] = 0;
+	heap8[r8+720] = r13;
+	heap8[r8+721] = r13;
+	heap8[r8+723] = r13;
+	heap8[r8+724] = r4;
+	heap8[r8+725] = r13;
+	heap32[(r15+183)] = 0;
+	heap32[(r15+172)] = 1065353216;
+	heap32[(r15+173)] = -1082130432;
+	heap32[(r15+170)] = 1050253722;
+	heap32[(r15+171)] = 1065353216;
+	heap32[(r15+169)] = 1063675494;
+	heap8[r8+722] = r13;
+	heap32[(r15+179)] = 1065353216;
+	heap32[(g0)] = -1077342245;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_252
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_254
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	r11 = r8 >> 2;
+	heapFloat[(r11+172)] = f12;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_257
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_259
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	heapFloat[(r11+173)] = f12;
+	heap32[(r11+169)] = 1063675494;
+	heap32[(r11+170)] = 1050253722;
+	heap32[(r11+171)] = 1065353216;
+	heap32[(r12+31)] = r8;
+	r11 = heap32[(r12+1)];
+	r14 = r11 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+13)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heap32[(g0)] = 596;
+	_Znwj(i7);
+	r11 = heap32[(r12+22)];
+	r14 = heap32[(r12+14)];
+	r15 = r_g0 >> 2;
+	heap32[(r15+1)] = 5;
+	heap32[(r15+2)] = -1;
+	heap32[(r15+3)] = -1;
+	heap8[r_g0+16] = r13;
+	heap32[(r15+5)] = r14;
+	heap32[(r15+6)] = r11;
+	heap32[(r15+7)] = 0;
+	heap32[(r15+8)] = 1050253722;
+	heap32[(r15)] = r10;
+	heap32[(r15+72)] = 1065353216;
+	heap32[(r15+73)] = 0;
+	heap32[(r15+74)] = 0;
+	heap32[(r15+75)] = 0;
+	heap32[(r15+76)] = 0;
+	heap32[(r15+77)] = 1065353216;
+	heap32[(r15+78)] = 0;
+	heap32[(r15+79)] = 0;
+	heap32[(r15+80)] = -2147483648;
+	heap32[(r15+81)] = 0;
+	heap32[(r15+82)] = 1065353216;
+	heap32[(r15+83)] = 0;
+	heap32[(r15+84)] = 1060320051;
+	heap32[(r15+85)] = 1057384039;
+	heap32[(r15+86)] = 0;
+	heap32[(r15+87)] = 0;
+	heap32[(r15+88)] = -1287930578;
+	heap32[(r15+89)] = -1082130432;
+	heap32[(r15+90)] = 0;
+	heap32[(r15+91)] = 0;
+	heap32[(r15+92)] = 1065353216;
+	heap32[(r15+93)] = -1287930578;
+	heap32[(r15+94)] = 0;
+	heap32[(r15+95)] = 0;
+	heap32[(r15+96)] = -2147483648;
+	heap32[(r15+97)] = 0;
+	heap32[(r15+98)] = 1065353216;
+	heap32[(r15+99)] = 0;
+	heap32[(r15+100)] = 0;
+	heap32[(r15+101)] = -1088338002;
+	heap32[(r15+102)] = 0;
+	heap32[(r15+103)] = 0;
+	heap8[r_g0+540] = r13;
+	heap32[(r15+128)] = 0;
+	heap32[(r15+140)] = -1082130432;
+	heap32[(r15+107)] = 1008981770;
+	heap32[(r15+111)] = 1028443341;
+	heap32[(r15+145)] = 0;
+	heap32[(r15+146)] = 0;
+	heap32[(r15+147)] = 1060320051;
+	heap32[(r15+148)] = 0;
+	heap32[(r15+108)] = 1070141403;
+	heap32[(r15+109)] = 1070141403;
+	heap32[(r15+110)] = 0;
+	heap32[(r15+104)] = 1065353216;
+	heap32[(r15+105)] = 1050253722;
+	heap32[(r15+106)] = 1065353216;
+	heap32[(r12+32)] = r_g0;
+	r10 = heap32[(r12+1)];
+	r11 = r10 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+13)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(g0)] = 748;
+	_Znwj(i7);
+	r8 = r_g0;
+	r10 = heap32[(r12+23)];
+	r11 = heap32[(r12+22)];
+	r14 = r8 >> 2;
+	heap32[(r14+1)] = 4;
+	heap32[(r14+2)] = -1;
+	heap32[(r14+3)] = -1;
+	heap8[r8+16] = r13;
+	heap32[(r14+5)] = r11;
+	heap32[(r14+6)] = r10;
+	heap32[(r14+7)] = 0;
+	heap32[(r14+8)] = 1050253722;
+	heap32[(r14)] = r9;
+	heap32[(r14+135)] = -1287930578;
+	heap32[(r14+136)] = 0;
+	heap32[(r14+137)] = 1065353216;
+	heap32[(r14+138)] = 0;
+	heap32[(r14+139)] = -2147483648;
+	heap32[(r14+140)] = 1065353216;
+	heap32[(r14+141)] = 0;
+	heap32[(r14+142)] = 0;
+	heap32[(r14+143)] = -1082130432;
+	heap32[(r14+144)] = -2147483648;
+	heap32[(r14+145)] = -1287930578;
+	heap32[(r14+146)] = 0;
+	heap32[(r14+147)] = 0;
+	heap32[(r14+148)] = 1059145646;
+	heap32[(r14+149)] = 0;
+	heap32[(r14+150)] = 0;
+	heap32[(r14+151)] = -1287930578;
+	heap32[(r14+152)] = 0;
+	heap32[(r14+153)] = 1065353216;
+	heap32[(r14+154)] = 0;
+	heap32[(r14+155)] = -2147483648;
+	heap32[(r14+156)] = 1065353216;
+	heap32[(r14+157)] = 0;
+	heap32[(r14+158)] = 0;
+	heap32[(r14+159)] = -1082130432;
+	heap32[(r14+160)] = -2147483648;
+	heap32[(r14+161)] = -1287930578;
+	heap32[(r14+162)] = 0;
+	heap32[(r14+163)] = 0;
+	heap32[(r14+164)] = -1090854584;
+	heap32[(r14+165)] = 0;
+	heap32[(r14+166)] = 0;
+	heap8[r8+720] = r13;
+	heap8[r8+721] = r13;
+	heap8[r8+723] = r13;
+	heap8[r8+724] = r4;
+	heap8[r8+725] = r13;
+	heap32[(r14+183)] = 0;
+	heap32[(r14+172)] = 1065353216;
+	heap32[(r14+173)] = -1082130432;
+	heap32[(r14+170)] = 1050253722;
+	heap32[(r14+171)] = 1065353216;
+	heap32[(r14+169)] = 1063675494;
+	heap8[r8+722] = r13;
+	heap32[(r14+179)] = 1065353216;
+	heap32[(g0)] = -1077342245;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_262
+{
+	f14 =        3.1415927410125732;
+	if(f12 >f14) //_LBB26_264
+{
+	f14 =       -6.2831854820251465;
+	f12 = f12+f14;
+}
+}
+else{
+	f14 =        6.2831854820251465;
+	f12 = f12+f14;
+}
+	r9 = r8 >> 2;
+	heapFloat[(r9+172)] = f12;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f12 = f_g0;
+	if(f12 >=f13) //_LBB26_267
+{
+	f13 =        3.1415927410125732;
+	if(f12 >f13) //_LBB26_269
+{
+	f13 =       -6.2831854820251465;
+	f12 = f12+f13;
+}
+}
+else{
+	f13 =        6.2831854820251465;
+	f12 = f12+f13;
+}
+	heapFloat[(r9+173)] = f12;
+	heap32[(r9+169)] = 1063675494;
+	heap32[(r9+170)] = 1050253722;
+	heap32[(r9+171)] = 1065353216;
+	heap32[(r12+33)] = r8;
+	r9 = heap32[(r12+1)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+13)];
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r8 = heap32[(r1+10)];
+	r9 = heap32[(r1+9)];
+	if(r8 ==r9) //_LBB26_272
+{
+	r10 = r9 << 1;
+	r10 = r9 == 0 ? r4 : r10;
+if(!(r8 >=r10)) //_LBB26_271
+{
+	if(r10 !=0) //_LBB26_275
+{
+	r8 = heap32[(r2)];
+	r11 = r10 << 2;
+	r8 = (r8 + 1)|0;
+	r11 = r11 | 3;
+	heap32[(r2)] = r8;
+	r8 = (r11 + 16)|0;
+	heap32[(g0)] = r8;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB26_277
+{
+	r11 = (r8 + 4)|0;
+	r11 = (r13 - r11)|0;
+	r11 = r11 & 15;
+	r11 = (r8 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r8;
+	r8 = r12;
+}
+}
+else{
+	r8 = 0;
+}
+_358: do {
+	if(r9 <1) //_LBB26_280
+{
+	r11 = heap32[(r1+11)];
+}
+else{
+_360: while(true){
+	r11 = heap32[(r1+11)];
+	r12 = r13 << 2;
+	r14 = (r11 + r12)|0;
+	r14 = r14 >> 2;
+	r12 = (r8 + r12)|0;
+	r14 = heap32[(r14)];
+	r13 = (r13 + 1)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = r14;
+if(!(r9 !=r13)) //_LBB26_281
+{
+break _358;
+}
+}
+}
+} while(0);
+	if(r11 !=0) //_LBB26_284
+{
+	r12 = heapU8[r6+48];
+	if(r12 !=0) //_LBB26_286
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r12 = heap32[(r9)];
+	r12 = (r12 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r9)] = r12;
+	r9 = heap32[(r11+-1)];
+	heap32[(g0)] = r9;
+	free(i7);
+	r9 = heap32[(r1+9)];
+}
+	heap32[(r1+11)] = 0;
+}
+	heap8[r6+48] = r4;
+	heap32[(r1+11)] = r8;
+	heap32[(r1+10)] = r10;
+}
+}
+	r8 = r9 << 2;
+	r9 = heap32[(r1+11)];
+	r8 = (r9 + r8)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r7;
+	r7 = heap32[(r1+9)];
+	r5 = (r5 + 1)|0;
+	r7 = (r7 + 1)|0;
+	heap32[(r1+9)] = r7;
+if(!(r0 !=r5)) //_LBB26_185
+{
+break _262;
+}
+}
+	f3 =                         7;
+	f4 =                        -2;
+	r0 = (r0 + -1)|0;
+	f1 = f1+f3;
+	f2 = f2+f4;
+	r3 = (r3 + 1)|0;
+	if(r0 ==0) //_LBB26_165
+{
+break _161;
+}
+else{
+continue _260;
+}
+}
+}
+}
+}
+}
+} while(0);
+	return;
+break;
+case 46:
+	r0 = _2E_str674;
+	r1 = _2E_str573;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 53;
+	_assert(i7);
+break;
+}
+}
+
+function _GLOBAL__D__Z6mymainiPPc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZL14benchmarkDemo4;
+	r1 = _ZTV13BenchmarkDemo;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemo11exitPhysicsEv(i7);
+	r1 = heap32[(r2+11)];
+if(!(r1 ==0)) //_LBB27_4
+{
+	r3 = heapU8[r0+48];
+if(!(r3 ==0)) //_LBB27_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	r1 = 1;
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+6)];
+if(!(r3 ==0)) //_LBB27_8
+{
+	r4 = heapU8[r0+28];
+if(!(r4 ==0)) //_LBB27_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+6)] = 0;
+}
+	heap8[r0+28] = r1;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 0;
+	return;
+}
+
+function _ZN14BenchmarkDemo4D1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14BenchmarkDemo4;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemoD2Ev(i7);
+	return;
+}
+
+function _ZN14BenchmarkDemo4D0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14BenchmarkDemo4;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemoD2Ev(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function __draw(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZL14benchmarkDemo4;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemo20clientMoveAndDisplayEv(i7);
+	return;
+}
+
+function _ZN13BenchmarkDemoD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13BenchmarkDemo;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN13BenchmarkDemo11exitPhysicsEv(i7);
+	r1 = heap32[(r2+11)];
+if(!(r1 ==0)) //_LBB31_4
+{
+	r3 = heapU8[r0+48];
+if(!(r3 ==0)) //_LBB31_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	r1 = 1;
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+6)];
+if(!(r3 ==0)) //_LBB31_8
+{
+	r4 = heapU8[r0+28];
+if(!(r4 ==0)) //_LBB31_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+6)] = 0;
+}
+	heap8[r0+28] = r1;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 0;
+	return;
+}
+
+function __init(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = gDisableDeactivation;
+	r1 = 1;
+	heap8[r0] = r1;
+	_ZN13BenchmarkDemo11initPhysicsEv(i7);
+	return;
+}
+
+function _ZN15btNullPairCache23getOverlappingPairArrayEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = (r0 + 4)|0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK15btNullPairCache22getNumOverlappingPairsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache8findPairEP17btBroadphaseProxyS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache18hasDeferredRemovalEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache18addOverlappingPairEP17btBroadphaseProxyS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache20sortOverlappingPairsEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btNullPairCache26getOverlappingPairArrayPtrEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btNullPairCache26getOverlappingPairArrayPtrEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btNullPairCacheD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV15btNullPairCache;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+4)];
+if(!(r1 ==0)) //_LBB48_4
+{
+	r3 = heapU8[r0+20];
+if(!(r3 ==0)) //_LBB48_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	r1 = 1;
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	return;
+}
+
+function _ZN15btNullPairCacheD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV15btNullPairCache;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+4)];
+if(!(r1 ==0)) //_LBB49_4
+{
+	r3 = heapU8[r0+20];
+if(!(r3 ==0)) //_LBB49_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	r1 = 1;
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK20btAxisSweep3InternalItE7getAabbEP17btBroadphaseProxyR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r1)] = heap32[(r0+4)];
+	heap32[(r1+1)] = heap32[(r0+5)];
+	r2 = heap32[(fp+3)];
+	heap32[(r1+2)] = heap32[(r0+6)];
+	r2 = r2 >> 2;
+	heap32[(r1+3)] = heap32[(r0+7)];
+	heap32[(r2)] = heap32[(r0+8)];
+	heap32[(r2+1)] = heap32[(r0+9)];
+	heap32[(r2+2)] = heap32[(r0+10)];
+	heap32[(r2+3)] = heap32[(r0+11)];
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE23getOverlappingPairCacheEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+23)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK20btAxisSweep3InternalItE23getOverlappingPairCacheEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+23)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK20btAxisSweep3InternalItE17getBroadphaseAabbER9btVector3S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r1)] = heap32[(r0+2)];
+	heap32[(r1+1)] = heap32[(r0+3)];
+	r2 = heap32[(fp+2)];
+	heap32[(r1+2)] = heap32[(r0+4)];
+	r2 = r2 >> 2;
+	heap32[(r1+3)] = heap32[(r0+5)];
+	heap32[(r2)] = heap32[(r0+6)];
+	heap32[(r2+1)] = heap32[(r0+7)];
+	heap32[(r2+2)] = heap32[(r0+8)];
+	heap32[(r2+3)] = heap32[(r0+9)];
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE9resetPoolEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU16[(r0+56)>>1];
+if(!(r1 !=0)) //_LBB54_6
+{
+	r1 = 1;
+	heap16[(r0+64)>>1] = r1;
+	r2 = heapU16[(r0+58)>>1];
+	if(uint(r2) >uint(1)) //_LBB54_3
+{
+	r3 = 2;
+_5: while(true){
+	r2 = r1 & 65535;
+	r4 = r0 >> 2;
+	r2 = r2 << 6;
+	r4 = heap32[(r4+15)];
+	r2 = (r4 + r2)|0;
+	heap16[(r2+48)>>1] = r3;
+	r1 = (r1 + 1)|0;
+	r2 = heapU16[(r0+58)>>1];
+	r3 = (r3 + 1)|0;
+	r4 = r1 & 65535;
+if(!(uint(r2) >uint(r4))) //_LBB54_4
+{
+break _5;
+}
+}
+}
+	r1 = r2 & 65535;
+	r0 = r0 >> 2;
+	r1 = r1 << 6;
+	r0 = heap32[(r0+15)];
+	r0 = (r1 + r0)|0;
+	r1 = 0;
+	heap16[(r0+-16)>>1] = r1;
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE10printStatsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE8aabbTestERK9btVector3S3_R24btBroadphaseAabbCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+27)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	if(r2 !=0) //_LBB56_2
+{
+	r0 = r2 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+else{
+	r2 = heapU16[(r0+56)>>1];
+	r2 = r2 << 1;
+	r2 = r2 | 1;
+if(!(r2 ==1)) //_LBB56_18
+{
+	r2 = 1;
+	r6 = 2;
+_6: while(true){
+	r7 = r6;
+	r6 = r2 & 65535;
+	r8 = heap32[(r1+17)];
+	r6 = r6 << 2;
+	r9 = heapU8[r8+r6];
+	r9 = r9 & 1;
+if(!(r9 ==0)) //_LBB56_17
+{
+	r6 = (r8 + r6)|0;
+	r6 = heapU16[(r6+2)>>1];
+	r8 = heap32[(r1+15)];
+	r6 = r6 << 6;
+	r6 = (r8 + r6)|0;
+	r8 = r3 >> 2;
+	r9 = r6 >> 2;
+	f0 = heapFloat[(r8)];
+	f1 = heapFloat[(r9+8)];
+	if(f0 >f1) //_LBB56_8
+{
+__label__ = 8;
+}
+else{
+	r10 = r4 >> 2;
+	f0 = heapFloat[(r10)];
+	f1 = heapFloat[(r9+4)];
+	if(f0 <f1) //_LBB56_8
+{
+__label__ = 8;
+}
+else{
+	r10 = 1;
+__label__ = 9;
+}
+}
+if (__label__ == 8){
+	r10 = 0;
+}
+	f0 = heapFloat[(r8+2)];
+	f1 = heapFloat[(r9+10)];
+	if(f0 >f1) //_LBB56_12
+{
+__label__ = 11;
+}
+else{
+	r11 = r4 >> 2;
+	f0 = heapFloat[(r11+2)];
+	f1 = heapFloat[(r9+6)];
+	if(f0 <f1) //_LBB56_12
+{
+__label__ = 11;
+}
+else{
+__label__ = 12;
+}
+}
+if (__label__ == 11){
+	r10 = 0;
+}
+	f0 = heapFloat[(r8+1)];
+	f1 = heapFloat[(r9+9)];
+if(!(f0 >f1)) //_LBB56_17
+{
+	r8 = r4 >> 2;
+	f0 = heapFloat[(r8+1)];
+	f1 = heapFloat[(r9+5)];
+if(!(f0 <f1)) //_LBB56_17
+{
+	r8 = r10 & 255;
+if(!(r8 ==0)) //_LBB56_17
+{
+	r8 = r5 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+}
+}
+}
+	r8 = heapU16[(r0+56)>>1];
+	r6 = (r7 + 1)|0;
+	r2 = (r2 + 1)|0;
+	r8 = r8 << 1;
+	r7 = r7 & 65535;
+	r8 = r8 | 1;
+if(!(uint(r7) <uint(r8))) //_LBB56_4
+{
+break _6;
+}
+}
+}
+	return;
+}
+}
+
+function _ZN20btAxisSweep3InternalItE7rayTestERK9btVector3S3_R23btBroadphaseRayCallbackS3_S3_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+27)];
+	r3 = heap32[(fp+3)];
+	if(r2 !=0) //_LBB57_2
+{
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r6 = r2 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+6)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	return;
+}
+else{
+	r2 = heapU16[(r0+56)>>1];
+	r2 = r2 << 1;
+	r2 = r2 | 1;
+if(!(r2 ==1)) //_LBB57_7
+{
+	r2 = 1;
+	r4 = 2;
+_6: while(true){
+	r5 = r2 & 65535;
+	r6 = heap32[(r1+17)];
+	r5 = r5 << 2;
+	r7 = heapU8[r6+r5];
+	r7 = r7 & 1;
+if(!(r7 ==0)) //_LBB57_6
+{
+	r7 = r3 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r5 = (r6 + r5)|0;
+	r5 = heapU16[(r5+2)>>1];
+	r6 = heap32[(r7+2)];
+	r7 = heap32[(r1+15)];
+	r5 = r5 << 6;
+	r5 = (r7 + r5)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+	r5 = heapU16[(r0+56)>>1];
+	r6 = (r4 + 1)|0;
+	r2 = (r2 + 1)|0;
+	r5 = r5 << 1;
+	r7 = r4 & 65535;
+	r5 = r5 | 1;
+	r4 = r6;
+if(!(uint(r7) <uint(r5))) //_LBB57_4
+{
+break _6;
+}
+}
+}
+	return;
+}
+}
+
+function _ZNK20btAxisSweep3InternalItE8quantizeEPtRK9btVector3i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(fp+2)];
+	f1 = heapFloat[(r1+2)];
+	f2 = heapFloat[(fp+4)];
+	f3 = heapFloat[(r1+4)];
+	f4 = heapFloat[(fp+3)];
+	f5 = heapFloat[(r1+3)];
+	f0 = f0-f1;
+	f1 = heapFloat[(r1+10)];
+	f2 = f2-f3;
+	f3 = heapFloat[(r1+12)];
+	f4 = f4-f5;
+	f5 = heapFloat[(r1+11)];
+	f0 = f0*f1;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+5)];
+	f1 = f2*f3;
+	f2 = f4*f5;
+	f3 =                         0;
+	if(f0 >f3) //_LBB58_2
+{
+	r3 = heapU16[(r0+6)>>1];
+	f4 = r3; //fitos r3, f4
+	if(f0 <f4) //_LBB58_4
+{
+	r3 = heapU16[(r0+4)>>1];
+	r4 = Math.floor(f0);
+	r3 = r3 & r4;
+	r3 = r3 | r2;
+}
+else{
+	r4 = heapU16[(r0+4)>>1];
+	r3 = r4 & r3;
+	r3 = r3 | r2;
+}
+}
+else{
+	r3 = r2;
+}
+	heap16[(r1)>>1] = r3;
+	if(f2 >f3) //_LBB58_7
+{
+	r3 = heapU16[(r0+6)>>1];
+	f0 = r3; //fitos r3, f0
+	if(f2 <f0) //_LBB58_9
+{
+	r3 = heapU16[(r0+4)>>1];
+	r4 = Math.floor(f2);
+	r3 = r3 & r4;
+	r3 = r3 | r2;
+}
+else{
+	r4 = heapU16[(r0+4)>>1];
+	r3 = r4 & r3;
+	r3 = r3 | r2;
+}
+}
+else{
+	r3 = r2;
+}
+	heap16[(r1+2)>>1] = r3;
+	if(f1 >f3) //_LBB58_12
+{
+	r3 = heapU16[(r0+6)>>1];
+	f0 = r3; //fitos r3, f0
+	if(f1 <f0) //_LBB58_14
+{
+	r0 = heapU16[(r0+4)>>1];
+	r3 = Math.floor(f1);
+	r0 = r0 & r3;
+	r2 = r0 | r2;
+}
+else{
+	r0 = heapU16[(r0+4)>>1];
+	r0 = r0 & r3;
+	r2 = r0 | r2;
+}
+}
+	heap16[(r1+4)>>1] = r2;
+	return;
+}
+
+function _ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = (r0 + r1)|0;
+	r3 = r2 >>> 31;
+	r4 = heap32[(fp)];
+	r2 = (r2 + r3)|0;
+	r3 = r4 >> 2;
+	r2 = r2 & 536870910;
+	r5 = heap32[(r3+3)];
+	r2 = r2 << 3;
+	r2 = (r5 + r2)|0;
+	r2 = r2 >> 2;
+	r5 = heap32[(r2)];
+	r6 = heap32[(r2+1)];
+	r2 = heap32[(r2+2)];
+	r7 = r1;
+	r8 = r0;
+_1: while(true){
+	r9 = heap32[(r3+3)];
+	r10 = r7 << 4;
+	r10 = (r9 + r10)|0;
+	r11 = 0;
+_3: while(true){
+	r12 = r11 << 4;
+	r12 = (r10 + r12)|0;
+	r12 = r12 >> 2;
+	r13 = r11 << 2;
+	r14 = heap32[(r12)];
+	if(r14 !=0) //_LBB59_5
+{
+	r15 = r14 >> 2;
+	r15 = heap32[(r15+3)];
+}
+else{
+	r15 = -1;
+}
+	if(r5 !=0) //_LBB59_8
+{
+	r16 = r5 >> 2;
+	r16 = heap32[(r16+3)];
+}
+else{
+	r16 = -1;
+}
+	r17 = r13 << 2;
+	r17 = (r10 + r17)|0;
+	r17 = r17 >> 2;
+	r17 = heap32[(r17+1)];
+	if(r17 !=0) //_LBB59_11
+{
+	r18 = r17 >> 2;
+	r18 = heap32[(r18+3)];
+}
+else{
+	r18 = -1;
+}
+	if(r6 !=0) //_LBB59_14
+{
+	r19 = r6 >> 2;
+	r19 = heap32[(r19+3)];
+}
+else{
+	r19 = -1;
+}
+_21: do {
+if(!(r15 >r16)) //_LBB59_2
+{
+if(!(r14 !=r5)) //_LBB59_18
+{
+	if(r18 >r19) //_LBB59_2
+{
+break _21;
+}
+}
+	if(r14 !=r5) //_LBB59_22
+{
+break _3;
+}
+else{
+	if(r17 !=r6) //_LBB59_22
+{
+break _3;
+}
+else{
+	r15 = r13 << 2;
+	r15 = (r10 + r15)|0;
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+2)];
+if(!(uint(r15) >uint(r2))) //_LBB59_2
+{
+break _3;
+}
+}
+}
+}
+} while(0);
+	r11 = (r11 + 1)|0;
+continue _3;
+}
+	r18 = r8 << 4;
+	r15 = (r7 + r11)|0;
+	r9 = (r9 + r18)|0;
+	r16 = 0;
+_30: while(true){
+	r19 = r16 << 2;
+	if(r5 !=0) //_LBB59_25
+{
+	r20 = r5 >> 2;
+	r20 = heap32[(r20+3)];
+}
+else{
+	r20 = -1;
+}
+	r21 = r19 << 2;
+	r21 = (r9 + r21)|0;
+	r21 = r21 >> 2;
+	r21 = heap32[(r21)];
+	if(r21 !=0) //_LBB59_28
+{
+	r22 = r21 >> 2;
+	r22 = heap32[(r22+3)];
+}
+else{
+	r22 = -1;
+}
+	if(r6 !=0) //_LBB59_31
+{
+	r23 = r6 >> 2;
+	r23 = heap32[(r23+3)];
+}
+else{
+	r23 = -1;
+}
+	r24 = r19 << 2;
+	r24 = (r9 + r24)|0;
+	r24 = r24 >> 2;
+	r24 = heap32[(r24+1)];
+	if(r24 !=0) //_LBB59_34
+{
+	r25 = r24 >> 2;
+	r25 = heap32[(r25+3)];
+}
+else{
+	r25 = -1;
+}
+_48: do {
+if(!(r20 >r22)) //_LBB59_21
+{
+if(!(r5 !=r21)) //_LBB59_38
+{
+	if(r23 >r25) //_LBB59_21
+{
+break _48;
+}
+}
+	if(r5 !=r21) //_LBB59_41
+{
+break _30;
+}
+else{
+	if(r6 !=r24) //_LBB59_41
+{
+break _30;
+}
+else{
+	r20 = r19 << 2;
+	r20 = (r9 + r20)|0;
+	r20 = r20 >> 2;
+	r20 = heap32[(r20+2)];
+if(!(uint(r2) >uint(r20))) //_LBB59_21
+{
+break _30;
+}
+}
+}
+}
+} while(0);
+	r16 = (r16 + -1)|0;
+continue _30;
+}
+	r20 = (r8 + r16)|0;
+	if(r15 <=r20) //_LBB59_43
+{
+	r13 = r13 << 2;
+	r10 = (r10 + r13)|0;
+	r10 = r10 >> 2;
+	r13 = heap32[(r12+3)];
+	r15 = heap32[(r10+2)];
+	r19 = r19 << 2;
+	r19 = (r9 + r19)|0;
+	heap32[(r10)] = r21;
+	r20 = r16 << 4;
+	r19 = r19 >> 2;
+	heap32[(r10+1)] = r24;
+	r19 = heap32[(r19+2)];
+	r9 = (r9 + r20)|0;
+	r9 = r9 >> 2;
+	heap32[(r10+2)] = r19;
+	r9 = heap32[(r9+3)];
+	heap32[(r12+3)] = r9;
+	r9 = heap32[(r3+3)];
+	r9 = (r9 + r18)|0;
+	r9 = (r9 + r20)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r14;
+	r7 = (r7 + r11)|0;
+	r8 = (r8 + r16)|0;
+	heap32[(r9+1)] = r17;
+	r7 = (r7 + 1)|0;
+	r8 = (r8 + -1)|0;
+	heap32[(r9+2)] = r15;
+	heap32[(r9+3)] = r13;
+}
+else{
+	r7 = r15;
+	r8 = r20;
+}
+	if(r7 <=r8) //_LBB59_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+if(!(r8 <=r1)) //_LBB59_47
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r8;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+}
+if(!(r7 >=r0)) //_LBB59_49
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r0;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 << 2;
+	r2 = (r1 + r2)|0;
+	r3 = heap32[(fp+2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+17)];
+	r3 = r3 << 2;
+	r4 = (r2 + r3)|0;
+	r2 = heapU16[(r2+r3)>>1];
+	r3 = heapU16[(r4+-4)>>1];
+if(!(uint(r2) >=uint(r3))) //_LBB60_14
+{
+	r1 = r1 >> 2;
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(r1+15)];
+	r5 = heapU16[(r4+2)>>1];
+	r6 = 1;
+	r7 = r6 << r0;
+	r7 = r7 & 3;
+	r6 = r6 << r7;
+	r5 = r5 << 6;
+	r5 = (r3 + r5)|0;
+	r6 = r6 & 3;
+	r0 = r0 << 1;
+	r8 = (r5 + 48)|0;
+	r7 = r7 << 1;
+	r9 = (r5 + 54)|0;
+	r6 = r6 << 1;
+	r10 = (r8 + r0)|0;
+	r11 = (r9 + r7)|0;
+	r12 = (r8 + r7)|0;
+	r9 = (r9 + r6)|0;
+	r8 = (r8 + r6)|0;
+	r4 = (r4 + 2)|0;
+_3: while(true){
+	r13 = heapU8[r4+-6];
+	r14 = heapU16[(r4+-4)>>1];
+	r13 = r13 & 1;
+	if(r13 ==0) //_LBB60_11
+{
+	r13 = r14 << 6;
+	r3 = (r3 + r13)|0;
+	r3 = (r3 + r0)|0;
+	r13 = heapU16[(r3+48)>>1];
+	r13 = (r13 + 1)|0;
+	heap16[(r3+48)>>1] = r13;
+}
+else{
+if(!(r2 ==0)) //_LBB60_10
+{
+	r13 = r14 << 6;
+	r13 = (r3 + r13)|0;
+	r15 = (r13 + r7)|0;
+	r16 = heapU16[(r11)>>1];
+	r17 = heapU16[(r15+48)>>1];
+if(!(uint(r16) <uint(r17))) //_LBB60_10
+{
+	r15 = heapU16[(r15+54)>>1];
+	r16 = heapU16[(r12)>>1];
+if(!(uint(r15) <uint(r16))) //_LBB60_10
+{
+	r15 = (r13 + r6)|0;
+	r16 = heapU16[(r9)>>1];
+	r17 = heapU16[(r15+48)>>1];
+if(!(uint(r16) <uint(r17))) //_LBB60_10
+{
+	r15 = heapU16[(r15+54)>>1];
+	r16 = heapU16[(r8)>>1];
+if(!(uint(r15) <uint(r16))) //_LBB60_10
+{
+	r15 = heap32[(r1+23)];
+	r16 = r15 >> 2;
+	r16 = heap32[(r16)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+2)];
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r13;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+	r15 = heap32[(r1+24)];
+if(!(r15 ==0)) //_LBB60_10
+{
+	r16 = r15 >> 2;
+	r16 = heap32[(r16)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+2)];
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r13;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+}
+}
+}
+}
+}
+}
+	r14 = r14 << 6;
+	r3 = (r3 + r14)|0;
+	r3 = (r3 + r0)|0;
+	r14 = heapU16[(r3+54)>>1];
+	r14 = (r14 + 1)|0;
+	heap16[(r3+54)>>1] = r14;
+}
+	r3 = heapU16[(r10)>>1];
+	r3 = (r3 + -1)|0;
+	heap16[(r10)>>1] = r3;
+	r3 = heapU16[(r4+-2)>>1];
+	r13 = heapU16[(r4)>>1];
+	r14 = heapU16[(r4+-4)>>1];
+	r15 = heapU16[(r4+-6)>>1];
+	heap16[(r4+-2)>>1] = r15;
+	heap16[(r4)>>1] = r14;
+	heap16[(r4+-6)>>1] = r3;
+	heap16[(r4+-4)>>1] = r13;
+	r13 = heapU16[(r4+-10)>>1];
+	if(uint(r3) >=uint(r13)) //_LBB60_14
+{
+break _3;
+}
+else{
+	r3 = heap32[(r1+15)];
+	r4 = (r4 + -4)|0;
+continue _3;
+}
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE9sortMaxUpEitP12btDispatcherb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 << 2;
+	r2 = (r1 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = heap32[(fp+2)];
+	r4 = 1;
+	r2 = heap32[(r2+17)];
+	r3 = r3 << 2;
+	r2 = (r2 + r3)|0;
+	r3 = r4 << r0;
+	r3 = r3 & 3;
+	r1 = r1 >> 2;
+	r5 = heapU16[(r2+2)>>1];
+	r4 = r4 << r3;
+	r6 = heap32[(r1+15)];
+	r5 = r5 << 6;
+	r4 = r4 & 3;
+	r5 = (r6 + r5)|0;
+	r3 = r3 << 1;
+	r6 = (r5 + 48)|0;
+	r4 = r4 << 1;
+	r5 = (r5 + 54)|0;
+	r0 = r0 << 1;
+	r7 = heap32[(fp+3)];
+	r8 = (r5 + r3)|0;
+	r9 = (r6 + r3)|0;
+	r10 = (r5 + r4)|0;
+	r6 = (r6 + r4)|0;
+	r5 = (r5 + r0)|0;
+	r2 = (r2 + 4)|0;
+_1: while(true){
+	r11 = heapU16[(r2+2)>>1];
+	if(r11 ==0) //_LBB61_14
+{
+break _1;
+}
+else{
+	r12 = heapU16[(r2)>>1];
+	r13 = heapU16[(r2+-4)>>1];
+	if(uint(r13) >=uint(r12)) //_LBB61_1
+{
+	r13 = heap32[(r1+15)];
+	r11 = r11 & 65535;
+	r12 = r12 & 1;
+	if(r12 != 0) //_LBB61_10
+{
+	r11 = r11 << 6;
+	r11 = (r13 + r11)|0;
+	r11 = (r11 + r0)|0;
+	r12 = heapU16[(r11+54)>>1];
+	r12 = (r12 + -1)|0;
+	heap16[(r11+54)>>1] = r12;
+}
+else{
+if(!(r7 ==0)) //_LBB61_9
+{
+	r12 = r11 << 6;
+	r12 = (r13 + r12)|0;
+	r14 = (r12 + r3)|0;
+	r15 = heapU16[(r8)>>1];
+	r16 = heapU16[(r14+48)>>1];
+if(!(uint(r15) <uint(r16))) //_LBB61_9
+{
+	r14 = heapU16[(r14+54)>>1];
+	r15 = heapU16[(r9)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB61_9
+{
+	r14 = (r12 + r4)|0;
+	r15 = heapU16[(r10)>>1];
+	r16 = heapU16[(r14+48)>>1];
+if(!(uint(r15) <uint(r16))) //_LBB61_9
+{
+	r14 = heapU16[(r14+54)>>1];
+	r15 = heapU16[(r6)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB61_9
+{
+	r14 = heap32[(r1+23)];
+	r15 = r14 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r16 = heapU16[(r2+-2)>>1];
+	r15 = heap32[(r15+2)];
+	r16 = r16 << 6;
+	r16 = (r13 + r16)|0;
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r16;
+	heap32[(g0+2)] = r12;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	r14 = heap32[(r1+24)];
+if(!(r14 ==0)) //_LBB61_9
+{
+	r15 = r14 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+2)];
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r16;
+	heap32[(g0+2)] = r12;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+}
+}
+}
+}
+}
+}
+	r11 = r11 << 6;
+	r11 = (r13 + r11)|0;
+	r11 = (r11 + r0)|0;
+	r12 = heapU16[(r11+48)>>1];
+	r12 = (r12 + -1)|0;
+	heap16[(r11+48)>>1] = r12;
+}
+	r11 = heapU16[(r5)>>1];
+	r11 = (r11 + 1)|0;
+	heap16[(r5)>>1] = r11;
+	r11 = heapU16[(r2+-2)>>1];
+	r12 = heapU16[(r2+-4)>>1];
+	r13 = heapU16[(r2+2)>>1];
+	r14 = heapU16[(r2)>>1];
+	heap16[(r2+-4)>>1] = r14;
+	heap16[(r2+-2)>>1] = r13;
+	r13 = (r2 + 4)|0;
+	heap16[(r2)>>1] = r12;
+	heap16[(r2+2)>>1] = r11;
+	r2 = r13;
+continue _1;
+}
+else{
+break _1;
+}
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE9sortMinUpEitP12btDispatcherb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 << 2;
+	r2 = (r1 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = heap32[(fp+2)];
+	r2 = heap32[(r2+17)];
+	r3 = r3 << 2;
+	r2 = (r2 + r3)|0;
+	r1 = r1 >> 2;
+	r3 = heapU16[(r2+2)>>1];
+	r4 = 1;
+	r5 = r4 << r0;
+	r6 = heap32[(r1+15)];
+	r3 = r3 << 6;
+	r5 = r5 & 3;
+	r3 = (r6 + r3)|0;
+	r0 = r0 << 1;
+	r3 = (r3 + r0)|0;
+	r4 = r4 << r5;
+	r6 = heap32[(fp+3)];
+	r7 = heap32[(fp+4)];
+	r3 = (r3 + 48)|0;
+	r4 = r4 & 3;
+	r2 = (r2 + 4)|0;
+_1: while(true){
+	r8 = heapU16[(r2+2)>>1];
+	if(r8 ==0) //_LBB62_14
+{
+break _1;
+}
+else{
+	r9 = heapU16[(r2)>>1];
+	r10 = heapU16[(r2+-4)>>1];
+	if(uint(r10) >=uint(r9)) //_LBB62_1
+{
+	r10 = heap32[(r1+15)];
+	r8 = r8 & 65535;
+	r9 = r9 & 1;
+	if(r9 ==0) //_LBB62_10
+{
+	r8 = r8 << 6;
+	r8 = (r10 + r8)|0;
+	r8 = (r8 + r0)|0;
+	r9 = heapU16[(r8+48)>>1];
+	r9 = (r9 + -1)|0;
+	heap16[(r8+48)>>1] = r9;
+}
+else{
+if(!(r7 ==0)) //_LBB62_9
+{
+	r9 = heapU16[(r2+-2)>>1];
+	r9 = r9 << 6;
+	r11 = r8 << 6;
+	r9 = (r10 + r9)|0;
+	r12 = r5 << 1;
+	r11 = (r10 + r11)|0;
+	r13 = (r9 + r12)|0;
+	r12 = (r11 + r12)|0;
+	r14 = heapU16[(r13+54)>>1];
+	r15 = heapU16[(r12+48)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB62_9
+{
+	r12 = heapU16[(r12+54)>>1];
+	r13 = heapU16[(r13+48)>>1];
+if(!(uint(r12) <uint(r13))) //_LBB62_9
+{
+	r12 = r4 << 1;
+	r13 = (r9 + r12)|0;
+	r12 = (r11 + r12)|0;
+	r14 = heapU16[(r13+54)>>1];
+	r15 = heapU16[(r12+48)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB62_9
+{
+	r12 = heapU16[(r12+54)>>1];
+	r13 = heapU16[(r13+48)>>1];
+if(!(uint(r12) <uint(r13))) //_LBB62_9
+{
+	r12 = heap32[(r1+23)];
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r12 = heap32[(r1+24)];
+if(!(r12 ==0)) //_LBB62_9
+{
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+}
+}
+}
+}
+}
+}
+	r8 = r8 << 6;
+	r8 = (r10 + r8)|0;
+	r8 = (r8 + r0)|0;
+	r9 = heapU16[(r8+54)>>1];
+	r9 = (r9 + -1)|0;
+	heap16[(r8+54)>>1] = r9;
+}
+	r8 = heapU16[(r3)>>1];
+	r8 = (r8 + 1)|0;
+	heap16[(r3)>>1] = r8;
+	r8 = heapU16[(r2+-2)>>1];
+	r9 = heapU16[(r2+-4)>>1];
+	r10 = heapU16[(r2+2)>>1];
+	r11 = heapU16[(r2)>>1];
+	heap16[(r2+-4)>>1] = r11;
+	heap16[(r2+-2)>>1] = r10;
+	r10 = (r2 + 4)|0;
+	heap16[(r2)>>1] = r9;
+	heap16[(r2+2)>>1] = r8;
+	r2 = r10;
+continue _1;
+}
+else{
+break _1;
+}
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 << 2;
+	r2 = (r1 + r2)|0;
+	r3 = heap32[(fp+2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+17)];
+	r4 = r3 << 2;
+	r5 = (r2 + r4)|0;
+	r4 = heapU16[(r2+r4)>>1];
+	r6 = heapU16[(r5+-4)>>1];
+if(!(uint(r4) >=uint(r6))) //_LBB63_14
+{
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+3)];
+	r6 = heap32[(fp+4)];
+	r7 = heap32[(r1+15)];
+	r3 = r3 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = heapU16[(r2+2)>>1];
+	r3 = 1;
+	r8 = r3 << r0;
+	r2 = r2 << 6;
+	r8 = r8 & 3;
+	r2 = (r7 + r2)|0;
+	r0 = r0 << 1;
+	r3 = r3 << r8;
+	r2 = (r2 + r0)|0;
+	r3 = r3 & 3;
+	r2 = (r2 + 54)|0;
+	r5 = (r5 + 2)|0;
+_3: while(true){
+	r9 = heapU8[r5+-6];
+	r10 = heapU16[(r5+-4)>>1];
+	r9 = r9 & 1;
+	if(r9 != 0) //_LBB63_11
+{
+	r9 = r10 << 6;
+	r7 = (r7 + r9)|0;
+	r7 = (r7 + r0)|0;
+	r9 = heapU16[(r7+54)>>1];
+	r9 = (r9 + 1)|0;
+	heap16[(r7+54)>>1] = r9;
+}
+else{
+if(!(r6 ==0)) //_LBB63_10
+{
+	r9 = heapU16[(r5)>>1];
+	r9 = r9 << 6;
+	r11 = r10 << 6;
+	r9 = (r7 + r9)|0;
+	r12 = r8 << 1;
+	r11 = (r7 + r11)|0;
+	r13 = (r9 + r12)|0;
+	r12 = (r11 + r12)|0;
+	r14 = heapU16[(r13+54)>>1];
+	r15 = heapU16[(r12+48)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB63_10
+{
+	r12 = heapU16[(r12+54)>>1];
+	r13 = heapU16[(r13+48)>>1];
+if(!(uint(r12) <uint(r13))) //_LBB63_10
+{
+	r12 = r3 << 1;
+	r13 = (r9 + r12)|0;
+	r12 = (r11 + r12)|0;
+	r14 = heapU16[(r13+54)>>1];
+	r15 = heapU16[(r12+48)>>1];
+if(!(uint(r14) <uint(r15))) //_LBB63_10
+{
+	r12 = heapU16[(r12+54)>>1];
+	r13 = heapU16[(r13+48)>>1];
+if(!(uint(r12) <uint(r13))) //_LBB63_10
+{
+	r12 = heap32[(r1+23)];
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r12 = heap32[(r1+24)];
+if(!(r12 ==0)) //_LBB63_10
+{
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+}
+}
+}
+}
+}
+}
+	r10 = r10 << 6;
+	r7 = (r7 + r10)|0;
+	r7 = (r7 + r0)|0;
+	r10 = heapU16[(r7+48)>>1];
+	r10 = (r10 + 1)|0;
+	heap16[(r7+48)>>1] = r10;
+}
+	r7 = heapU16[(r2)>>1];
+	r7 = (r7 + -1)|0;
+	heap16[(r2)>>1] = r7;
+	r7 = heapU16[(r5+-2)>>1];
+	r9 = heapU16[(r5)>>1];
+	r10 = heapU16[(r5+-4)>>1];
+	r11 = heapU16[(r5+-6)>>1];
+	heap16[(r5+-2)>>1] = r11;
+	heap16[(r5)>>1] = r10;
+	heap16[(r5+-6)>>1] = r7;
+	heap16[(r5+-4)>>1] = r9;
+	r9 = heapU16[(r5+-10)>>1];
+	if(uint(r7) >=uint(r9)) //_LBB63_14
+{
+break _3;
+}
+else{
+	r7 = heap32[(r1+15)];
+	r5 = (r5 + -4)|0;
+continue _3;
+}
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE7setAabbEP17btBroadphaseProxyRK9btVector3S5_P12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r3 = r1 >> 2;
+	heap32[(r3+4)] = heap32[(r2)];
+	heap32[(r3+5)] = heap32[(r2+1)];
+	r4 = heap32[(fp+3)];
+	heap32[(r3+6)] = heap32[(r2+2)];
+	heap32[(r3+7)] = heap32[(r2+3)];
+	r5 = r4 >> 2;
+	heap32[(r3+8)] = heap32[(r5)];
+	heap32[(r3+9)] = heap32[(r5+1)];
+	r6 = heap32[(fp)];
+	heap32[(r3+10)] = heap32[(r5+2)];
+	heap32[(r3+11)] = heap32[(r5+3)];
+	r7 = r6 >> 2;
+	r1 = heapU16[(r1+12)>>1];
+	r8 = heap32[(r7+15)];
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r2+2)];
+	r2 = sp + -6;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r2;
+	heapFloat[(g0+2)] = f0;
+	heapFloat[(g0+3)] = f1;
+	heapFloat[(g0+4)] = f2;
+	heap32[(g0+5)] = 0;
+	_ZNK20btAxisSweep3InternalItE8quantizeEPtRK9btVector3i(i7);
+	f0 = heapFloat[(r5)];
+	f1 = heapFloat[(r5+1)];
+	f2 = heapFloat[(r5+2)];
+	r1 = r1 << 6;
+	r5 = sp + -12;
+	r1 = (r8 + r1)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	heapFloat[(g0+2)] = f0;
+	heapFloat[(g0+3)] = f1;
+	heapFloat[(g0+4)] = f2;
+	heap32[(g0+5)] = 1;
+	r8 = heap32[(fp+4)];
+	r1 = (r1 + 48)|0;
+	r9 = 0;
+	_ZNK20btAxisSweep3InternalItE8quantizeEPtRK9btVector3i(i7);
+	r10 = r9;
+_1: while(true){
+	r11 = r9 << 2;
+	r12 = r9 << 1;
+	r13 = (r1 - r12)|0;
+	r11 = (r6 - r11)|0;
+	r14 = heapU16[(r13)>>1];
+	r13 = heapU16[(r13+6)>>1];
+	r11 = r11 >> 2;
+	r15 = (r2 - r12)|0;
+	r12 = (r5 - r12)|0;
+	r16 = heap32[(r11+17)];
+	r17 = r14 << 2;
+	r18 = r13 << 2;
+	r15 = heapU16[(r15)>>1];
+	r19 = heapU16[(r16+r17)>>1];
+	r20 = heapU16[(r16+r18)>>1];
+	r12 = heapU16[(r12)>>1];
+	heap16[(r16+r17)>>1] = r15;
+	r11 = heap32[(r11+17)];
+	r15 = (r15 - r19)|0;
+	heap16[(r11+r18)>>1] = r12;
+if(!(r15 >-1)) //_LBB64_3
+{
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = 1;
+	_ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb(i7);
+}
+	r11 = (r12 - r20)|0;
+if(!(r11 <1)) //_LBB64_5
+{
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = 1;
+	_ZN20btAxisSweep3InternalItE9sortMaxUpEitP12btDispatcherb(i7);
+}
+if(!(r15 <1)) //_LBB64_7
+{
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r8;
+	heap32[(g0+4)] = 1;
+	_ZN20btAxisSweep3InternalItE9sortMinUpEitP12btDispatcherb(i7);
+}
+if(!(r11 >-1)) //_LBB64_9
+{
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r8;
+	heap32[(g0+4)] = 1;
+	_ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb(i7);
+}
+	r9 = (r9 + -1)|0;
+	r10 = (r10 + 1)|0;
+	if(r9 !=-3) //_LBB64_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	r1 = heap32[(r7+27)];
+if(!(r1 ==0)) //_LBB64_12
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = heap32[(r3+15)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r8;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE12destroyProxyEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+27)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+if(!(r2 ==0)) //_LBB65_2
+{
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r6 = r3 >> 2;
+	r5 = heap32[(r5+3)];
+	r6 = heap32[(r6+15)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r2 = heap32[(r1+23)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+3)];
+	r6 = heap32[(r1+15)];
+	r5 = heap32[(r5+14)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r2 = r_g0;
+if(!(r2 !=0)) //_LBB65_4
+{
+	r2 = heap32[(r1+23)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	r7 = r3 & 65535;
+	r7 = r7 << 6;
+	r7 = (r6 + r7)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r2 = heap32[(r1+15)];
+	r5 = heapU16[(r0+56)>>1];
+	r7 = heapU16[(r2+54)>>1];
+	r7 = (r7 + -2)|0;
+	heap16[(r2+54)>>1] = r7;
+	r2 = heap32[(r1+15)];
+	r7 = heapU16[(r2+56)>>1];
+	r7 = (r7 + -2)|0;
+	r8 = r3 & 65535;
+	heap16[(r2+56)>>1] = r7;
+	r2 = heap32[(r1+15)];
+	r7 = r8 << 6;
+	r9 = heapU16[(r2+58)>>1];
+	r6 = (r6 + r7)|0;
+	r5 = r5 << 1;
+	r6 = (r6 + 54)|0;
+	r10 = 0;
+	r9 = (r9 + -2)|0;
+	heap16[(r2+58)>>1] = r9;
+	r2 = r10;
+_7: while(true){
+	r9 = r2 << 2;
+	r9 = (r0 + r9)|0;
+	r9 = r9 >> 2;
+	r11 = heapU16[(r6)>>1];
+	r12 = heapU16[(r0+6)>>1];
+	r9 = heap32[(r9+17)];
+	r13 = r11 << 2;
+	heap16[(r9+r13)>>1] = r12;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = 0;
+	_ZN20btAxisSweep3InternalItE9sortMaxUpEitP12btDispatcherb(i7);
+	r11 = heapU16[(r6+-6)>>1];
+	r12 = heapU16[(r0+6)>>1];
+	r13 = r11 << 2;
+	heap16[(r9+r13)>>1] = r12;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = 0;
+	r11 = r5 << 2;
+	_ZN20btAxisSweep3InternalItE9sortMinUpEitP12btDispatcherb(i7);
+	r9 = (r9 + r11)|0;
+	heap16[(r9+-2)>>1] = r10;
+	r11 = heapU16[(r0+6)>>1];
+	r2 = (r2 + 1)|0;
+	r6 = (r6 + 2)|0;
+	heap16[(r9+-4)>>1] = r11;
+	if(r2 !=3) //_LBB65_5
+{
+continue _7;
+}
+else{
+break _7;
+}
+}
+if(!(r8 ==0)) //_LBB65_8
+{
+	r2 = heapU16[(r0+58)>>1];
+	if(uint(r2) >uint(r8)) //_LBB65_9
+{
+	r1 = heap32[(r1+15)];
+	r2 = heapU16[(r0+64)>>1];
+	r1 = (r1 + r7)|0;
+	heap16[(r1+48)>>1] = r2;
+	heap16[(r0+64)>>1] = r3;
+	r1 = heapU16[(r0+56)>>1];
+	r1 = (r1 + -1)|0;
+	heap16[(r0+56)>>1] = r1;
+	return;
+}
+}
+	r0 = _2E_str11;
+	r1 = _2E_str112;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 495;
+	_assert(i7);
+}
+
+function _ZN20btAxisSweep3InternalItE11createProxyERK9btVector3S3_iPvssP12btDispatcherS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r1+2)];
+	r1 = heap32[(fp)];
+	r2 = sp + -6;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heapFloat[(g0+2)] = f0;
+	heapFloat[(g0+3)] = f1;
+	heapFloat[(g0+4)] = f2;
+	heap32[(g0+5)] = 0;
+	r2 = heap32[(fp+2)];
+	_ZNK20btAxisSweep3InternalItE8quantizeEPtRK9btVector3i(i7);
+	r3 = r2 >> 2;
+	f0 = heapFloat[(r3)];
+	f1 = heapFloat[(r3+1)];
+	f2 = heapFloat[(r3+2)];
+	r3 = sp + -12;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heapFloat[(g0+2)] = f0;
+	heapFloat[(g0+3)] = f1;
+	heapFloat[(g0+4)] = f2;
+	heap32[(g0+5)] = 1;
+	_ZNK20btAxisSweep3InternalItE8quantizeEPtRK9btVector3i(i7);
+	r3 = heapU16[(r1+64)>>1];
+	if(r3 !=0) //_LBB66_2
+{
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r6 = heap32[(fp+6)];
+	r7 = heap32[(fp+7)];
+	r8 = heap32[(fp+8)];
+	r9 = r1 >> 2;
+	r10 = r3 << 6;
+	r11 = heap32[(r9+15)];
+	r10 = (r11 + r10)|0;
+	r11 = heapU16[(r10+48)>>1];
+	heap16[(r1+64)>>1] = r11;
+	r11 = heapU16[(r1+56)>>1];
+	r11 = (r11 + 1)|0;
+	r12 = r10 >> 2;
+	heap16[(r1+56)>>1] = r11;
+	heap32[(r12+3)] = r3;
+	heap32[(r12)] = r4;
+	heap16[(r10+4)>>1] = r5;
+	heap16[(r10+6)>>1] = r6;
+	heap32[(r12+2)] = r8;
+	r8 = heap32[(r9+15)];
+	r11 = heapU16[(r1+56)>>1];
+	r11 = r11 << 1;
+	r12 = heapU16[(r8+54)>>1];
+	r13 = r11 & 65534;
+	r12 = (r12 + 2)|0;
+	r14 = (r13 + -1)|0;
+	heap16[(r8+54)>>1] = r12;
+	r8 = r14 << 2;
+	r12 = heap32[(r9+17)];
+	r14 = (r12 + r8)|0;
+	r15 = r13 | 1;
+	r14 = heapU16[(r14+2)>>1];
+	r16 = heapU16[(r12+r8)>>1];
+	r15 = r15 << 2;
+	r17 = (r12 + r15)|0;
+	heap16[(r12+r15)>>1] = r16;
+	heap16[(r17+2)>>1] = r14;
+	r12 = heap32[(r9+17)];
+	r14 = heapU16[(sp+-6)>>1];
+	heap16[(r12+r8)>>1] = r14;
+	r12 = heap32[(r9+17)];
+	r12 = (r12 + r8)|0;
+	heap16[(r12+2)>>1] = r3;
+	r12 = heap32[(r9+17)];
+	r14 = heapU16[(sp+-12)>>1];
+	r13 = r13 << 2;
+	heap16[(r12+r13)>>1] = r14;
+	r12 = heap32[(r9+17)];
+	r12 = (r12 + r13)|0;
+	r14 = (r11 + -1)|0;
+	heap16[(r12+2)>>1] = r3;
+	heap16[(r10+48)>>1] = r14;
+	heap16[(r10+54)>>1] = r11;
+	r12 = heap32[(r9+15)];
+	r16 = heapU16[(r12+56)>>1];
+	r16 = (r16 + 2)|0;
+	heap16[(r12+56)>>1] = r16;
+	r12 = heap32[(r9+18)];
+	r16 = (r12 + r8)|0;
+	r16 = heapU16[(r16+2)>>1];
+	r17 = heapU16[(r12+r8)>>1];
+	r18 = (r12 + r15)|0;
+	heap16[(r12+r15)>>1] = r17;
+	heap16[(r18+2)>>1] = r16;
+	r12 = heap32[(r9+18)];
+	r16 = heapU16[(sp+-4)>>1];
+	heap16[(r12+r8)>>1] = r16;
+	r12 = heap32[(r9+18)];
+	r12 = (r12 + r8)|0;
+	heap16[(r12+2)>>1] = r3;
+	r12 = heap32[(r9+18)];
+	r16 = heapU16[(sp+-10)>>1];
+	heap16[(r12+r13)>>1] = r16;
+	r12 = heap32[(r9+18)];
+	r12 = (r12 + r13)|0;
+	heap16[(r12+2)>>1] = r3;
+	heap16[(r10+50)>>1] = r14;
+	heap16[(r10+56)>>1] = r11;
+	r12 = heap32[(r9+15)];
+	r16 = heapU16[(r12+58)>>1];
+	r16 = (r16 + 2)|0;
+	heap16[(r12+58)>>1] = r16;
+	r12 = heap32[(r9+19)];
+	r16 = (r12 + r8)|0;
+	r16 = heapU16[(r16+2)>>1];
+	r17 = heapU16[(r12+r8)>>1];
+	r18 = (r12 + r15)|0;
+	heap16[(r12+r15)>>1] = r17;
+	heap16[(r18+2)>>1] = r16;
+	r12 = heap32[(r9+19)];
+	r15 = heapU16[(sp+-2)>>1];
+	heap16[(r12+r8)>>1] = r15;
+	r12 = heap32[(r9+19)];
+	r8 = (r12 + r8)|0;
+	heap16[(r8+2)>>1] = r3;
+	r8 = heap32[(r9+19)];
+	r12 = heapU16[(sp+-8)>>1];
+	heap16[(r8+r13)>>1] = r12;
+	r8 = heap32[(r9+19)];
+	r8 = (r8 + r13)|0;
+	heap16[(r8+2)>>1] = r3;
+	heap16[(r10+52)>>1] = r14;
+	heap16[(r10+58)>>1] = r11;
+	r8 = heapU16[(r10+48)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = 0;
+	_ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb(i7);
+	r8 = heapU16[(r10+54)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = 0;
+	_ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb(i7);
+	r8 = heapU16[(r10+50)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 1;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = 0;
+	_ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb(i7);
+	r8 = heapU16[(r10+56)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 1;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = 0;
+	_ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb(i7);
+	r8 = heapU16[(r10+52)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 2;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = 1;
+	_ZN20btAxisSweep3InternalItE11sortMinDownEitP12btDispatcherb(i7);
+	r8 = heapU16[(r10+58)>>1];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 2;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = 1;
+	_ZN20btAxisSweep3InternalItE11sortMaxDownEitP12btDispatcherb(i7);
+	r1 = heap32[(r9+27)];
+	r8 = heap32[(r9+15)];
+if(!(r1 ==0)) //_LBB66_4
+{
+	r9 = heap32[(fp+3)];
+	r10 = r1 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	r11 = r3 << 6;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r6;
+	heap32[(g0+7)] = r7;
+	heap32[(g0+8)] = 0;
+	r0 = (r8 + r11)|0;
+	r0 = r0 >> 2;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	heap32[(r0+15)] = r_g0;
+}
+	r0 = r3 << 6;
+	r0 = (r8 + r0)|0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = _2E_str213;
+	r1 = _2E_str112;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 483;
+	_assert(i7);
+}
+}
+
+function _ZN20btAlignedObjectArrayI16btBroadphasePairE6resizeEiRKS0_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(fp+1)];
+_1: do {
+if(!(r2 >r3)) //_LBB67_20
+{
+if(!(r2 >=r3)) //_LBB67_20
+{
+	r4 = heap32[(r1+2)];
+if(!(r4 >=r3)) //_LBB67_18
+{
+	if(r3 !=0) //_LBB67_5
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = r3 << 4;
+	r5 = (r5 + 1)|0;
+	r6 = r6 | 3;
+	heap32[(r4)] = r5;
+	r4 = (r6 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB67_7
+{
+	r5 = 0;
+	r6 = (r4 + 4)|0;
+	r5 = (r5 - r6)|0;
+	r5 = r5 & 15;
+	r5 = (r4 + r5)|0;
+	r6 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+	r4 = r6;
+}
+}
+else{
+	r4 = 0;
+}
+	r5 = (r0 + 12)|0;
+	if(r2 <1) //_LBB67_10
+{
+	r6 = r5 >> 2;
+	r8 = heap32[(r6)];
+}
+else{
+	r6 = 0;
+	r7 = (r6 - r2)|0;
+_14: while(true){
+	r8 = r5 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r6 << 4;
+	r10 = (r8 - r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r4 - r9)|0;
+	r11 = heap32[(r10)];
+	r9 = r9 >> 2;
+	heap32[(r9)] = r11;
+	r11 = heap32[(r10+1)];
+	heap32[(r9+1)] = r11;
+	r11 = heap32[(r10+2)];
+	heap32[(r9+2)] = r11;
+	r10 = heap32[(r10+3)];
+	r6 = (r6 + -1)|0;
+	heap32[(r9+3)] = r10;
+if(!(r7 !=r6)) //_LBB67_11
+{
+break _14;
+}
+}
+	r5 = (r0 + 12)|0;
+}
+if(!(r8 ==0)) //_LBB67_17
+{
+	r6 = heapU8[r0+16];
+if(!(r6 ==0)) //_LBB67_16
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r6)] = r7;
+	r6 = heap32[(r8+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	r6 = r5 >> 2;
+	heap32[(r6)] = 0;
+}
+	r6 = 1;
+	r5 = r5 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r5)] = r4;
+	heap32[(r1+2)] = r3;
+	if(r2 >=r3) //_LBB67_20
+{
+break _1;
+}
+}
+	r0 = heap32[(fp+2)];
+_25: while(true){
+	r4 = r0 >> 2;
+	r5 = r2 << 4;
+	r6 = heap32[(r1+3)];
+	r5 = (r6 + r5)|0;
+	r6 = heap32[(r4)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r6;
+	r6 = heap32[(r4+1)];
+	heap32[(r5+1)] = r6;
+	r6 = heap32[(r4+2)];
+	heap32[(r5+2)] = r6;
+	r4 = heap32[(r4+3)];
+	r2 = (r2 + 1)|0;
+	heap32[(r5+3)] = r4;
+	if(r3 !=r2) //_LBB67_19
+{
+continue _25;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	heap32[(r1+1)] = r3;
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItE25calculateOverlappingPairsEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+23)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+14)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+if(!(r1 ==0)) //_LBB68_22
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+23)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0;
+	r3 = r2 >> 2;
+	r3 = heap32[(r3+1)];
+	if(r3 >1) //_LBB68_3
+{
+	r3 = (r3 + -1)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r3;
+	r3 = r2 >> 2;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+	r3 = heap32[(r3+1)];
+}
+	r4 = sp + -32;
+	r5 = r4 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	r5 = heap32[(r0+26)];
+	r3 = (r3 - r5)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	r3 = 0;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE6resizeEiRKS0_(i7);
+	heap32[(r0+26)] = 0;
+	r4 = r3;
+	r5 = r3;
+	r6 = r3;
+	r7 = r3;
+_6: while(true){
+	r8 = r2 >> 2;
+	r9 = heap32[(r8+1)];
+	if(r9 >r7) //_LBB68_5
+{
+	r8 = heap32[(r8+3)];
+	r9 = r7 << 4;
+	r9 = (r8 + r9)|0;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r11 = r7 << 2;
+	r12 = heap32[(r9+1)];
+	if(r10 !=r5) //_LBB68_7
+{
+__label__ = 6;
+}
+else{
+	if(r12 ==r6) //_LBB68_13
+{
+	r4 = heap32[(r9+2)];
+	if(r4 ==0) //_LBB68_15
+{
+__label__ = 13;
+}
+else{
+__label__ = 12;
+break _6;
+}
+}
+else{
+__label__ = 6;
+}
+}
+if (__label__ == 6){
+	r5 = (r12 + 54)|0;
+	r6 = (r10 + 48)|0;
+	r9 = 0;
+_14: while(true){
+	if(r9 <3) //_LBB68_8
+{
+	r13 = heapU16[(r6+6)>>1];
+	r14 = heapU16[(r5+-6)>>1];
+	if(uint(r13) <uint(r14)) //_LBB68_15
+{
+__label__ = 13;
+break _14;
+}
+else{
+	r13 = heapU16[(r5)>>1];
+	r14 = heapU16[(r6)>>1];
+	if(uint(r13) <uint(r14)) //_LBB68_15
+{
+__label__ = 13;
+break _14;
+}
+else{
+	r9 = (r9 + 1)|0;
+	r5 = (r5 + 2)|0;
+	r6 = (r6 + 2)|0;
+}
+}
+}
+else{
+__label__ = 14;
+break _14;
+}
+}
+}
+if (__label__ == 13){
+	r4 = heap32[(r0+23)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+8)];
+	r6 = (r8 + r3)|0;
+	r9 = r11 << 2;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r1;
+	r4 = (r8 + r9)|0;
+	r4 = r4 >> 2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(r4)] = 0;
+	heap32[(r4+1)] = 0;
+	r4 = heap32[(r0+26)];
+	r4 = (r4 + 1)|0;
+	r5 = gOverlappingPairs;
+	r5 = r5 >> 2;
+	heap32[(r0+26)] = r4;
+	r6 = heap32[(r5)];
+	r6 = (r6 + -1)|0;
+	heap32[(r5)] = r6;
+}
+	r7 = (r7 + 1)|0;
+	r3 = (r3 + 16)|0;
+	r5 = r10;
+	r6 = r12;
+}
+else{
+__label__ = 16;
+break _6;
+}
+}
+switch(__label__ ){//multiple entries
+case 16:
+	if(r9 >1) //_LBB68_20
+{
+	r4 = (r9 + -1)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r4;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+	r9 = heap32[(r8+1)];
+	r4 = heap32[(r0+26)];
+}
+	r1 = sp + -16;
+	r3 = r1 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	r3 = (r9 - r4)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE6resizeEiRKS0_(i7);
+	heap32[(r0+26)] = 0;
+break;
+case 12:
+	r8 = _2E_str314;
+	r0 = _2E_str112;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 687;
+	_assert(i7);
+break;
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItED2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btAxisSweep3InternalItE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+27)];
+if(!(r1 ==0)) //_LBB69_5
+{
+	r1 = heap32[(r2+28)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+28)];
+if(!(r1 ==0)) //_LBB69_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+27)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+27)];
+if(!(r1 ==0)) //_LBB69_5
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = 0;
+_8: while(true){
+	r3 = r1 << 2;
+	r3 = (r0 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+22)];
+if(!(r3 ==0)) //_LBB69_8
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	r1 = (r1 + -1)|0;
+	if(r1 !=-3) //_LBB69_6
+{
+continue _8;
+}
+else{
+break _8;
+}
+}
+	r1 = heap32[(r2+15)];
+if(!(r1 ==0)) //_LBB69_11
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r0 = heapU8[r0+100];
+if(!(r0 ==0)) //_LBB69_14
+{
+	r0 = heap32[(r2+23)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+23)];
+if(!(r0 ==0)) //_LBB69_14
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItED1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN20btAxisSweep3InternalItED2Ev(i7);
+	return;
+}
+
+function _ZN20btAxisSweep3InternalItED0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btAxisSweep3InternalItE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+27)];
+if(!(r1 ==0)) //_LBB71_5
+{
+	r1 = heap32[(r2+28)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+28)];
+if(!(r1 ==0)) //_LBB71_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+27)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+27)];
+if(!(r1 ==0)) //_LBB71_5
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = 0;
+_8: while(true){
+	r3 = r1 << 2;
+	r3 = (r0 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+22)];
+if(!(r3 ==0)) //_LBB71_8
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	r1 = (r1 + -1)|0;
+	if(r1 !=-3) //_LBB71_6
+{
+continue _8;
+}
+else{
+break _8;
+}
+}
+	r1 = heap32[(r2+15)];
+if(!(r1 ==0)) //_LBB71_11
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r0 = heapU8[r0+100];
+if(!(r0 ==0)) //_LBB71_14
+{
+	r0 = heap32[(r2+23)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+23)];
+if(!(r0 ==0)) //_LBB71_14
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+	return;
+}
+
+function _ZN12btAxisSweep3D0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btAxisSweep3;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN20btAxisSweep3InternalItED2Ev(i7);
+if(!(r0 ==0)) //_LBB72_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN12btAxisSweep3D1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btAxisSweep3;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN20btAxisSweep3InternalItED2Ev(i7);
+	return;
+}
+
+function _ZN20btCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btCollisionAlgorithm;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN20btCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20btCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN6btDbvt8ICollide7DescentEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZL10insertleafP6btDbvtP10btDbvtNodeS2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+	if(r2 !=0) //_LBB80_2
+{
+	r2 = heap32[(fp+1)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3+10)];
+	if(r3 !=0) //_LBB80_4
+{
+	r4 = r1 >> 2;
+	f0 = heapFloat[(r4+2)];
+	f1 = heapFloat[(r4+6)];
+	f2 = heapFloat[(r4+1)];
+	f3 = heapFloat[(r4+5)];
+	f4 = heapFloat[(r4)];
+	f5 = heapFloat[(r4+4)];
+	f0 = f0+f1;
+	f1 = f2+f3;
+	f2 = f4+f5;
+_5: while(true){
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+9)];
+	r4 = r4 >> 2;
+	f3 = heapFloat[(r4)];
+	f4 = heapFloat[(r4+4)];
+	f5 = heapFloat[(r4+2)];
+	f6 = heapFloat[(r4+6)];
+	f7 = heapFloat[(r4+1)];
+	f8 = heapFloat[(r4+5)];
+	f3 = f3+f4;
+	f4 = f5+f6;
+	f5 = f7+f8;
+	f3 = f2-f3;
+	f4 = f0-f4;
+	f5 = f1-f5;
+	f6 =                         0;
+	if(f3 <f6) //_LBB80_7
+{
+	f3 = -f3;
+}
+	if(f5 <f6) //_LBB80_10
+{
+	f5 = -f5;
+}
+	f3 = f3+f5;
+	if(f4 <f6) //_LBB80_13
+{
+	f4 = -f4;
+}
+	r3 = r3 >> 2;
+	f5 = heapFloat[(r3)];
+	f7 = heapFloat[(r3+4)];
+	f8 = heapFloat[(r3+2)];
+	f9 = heapFloat[(r3+6)];
+	f10 = heapFloat[(r3+1)];
+	f11 = heapFloat[(r3+5)];
+	f5 = f5+f7;
+	f7 = f8+f9;
+	f8 = f10+f11;
+	f5 = f2-f5;
+	f3 = f3+f4;
+	f4 = f0-f7;
+	f7 = f1-f8;
+	if(f5 <f6) //_LBB80_16
+{
+	f5 = -f5;
+}
+	if(f7 <f6) //_LBB80_19
+{
+	f7 = -f7;
+}
+	f5 = f5+f7;
+	if(f4 <f6) //_LBB80_22
+{
+	f4 = -f4;
+}
+	f4 = f5+f4;
+	r3 = f3 >= f4;
+	r3 = r3 & 1;
+	r3 = r3 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+9)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3+10)];
+if(!(r3 !=0)) //_LBB80_5
+{
+break _5;
+}
+}
+}
+	r3 = r2 >> 2;
+	r4 = heap32[(r0+1)];
+	r5 = heap32[(r3+8)];
+	if(r4 ==0) //_LBB80_26
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r6 = heap32[(r4)];
+	r6 = (r6 + 1)|0;
+	heap32[(r4)] = r6;
+	heap32[(g0)] = 63;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB80_28
+{
+	r6 = 0;
+	r7 = (r4 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r4 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r4;
+	r4 = r7;
+}
+}
+else{
+	heap32[(r0+1)] = 0;
+}
+	r6 = r4 >> 2;
+	heap32[(r6+8)] = r5;
+	heap32[(r6+9)] = 0;
+	heap32[(r6+10)] = 0;
+	r7 = r1 >> 2;
+	f0 = heapFloat[(r7)];
+	f1 = heapFloat[(r3)];
+	f0 = f0 < f1 ? f0 : f1;
+	heapFloat[(r6)] = f0;
+	f0 = heapFloat[(r7+4)];
+	f1 = heapFloat[(r3+4)];
+	f0 = f0 > f1 ? f0 : f1;
+	heapFloat[(r6+4)] = f0;
+	f0 = heapFloat[(r7+1)];
+	f1 = heapFloat[(r3+1)];
+	f0 = f0 < f1 ? f0 : f1;
+	heapFloat[(r6+1)] = f0;
+	f0 = heapFloat[(r7+5)];
+	f1 = heapFloat[(r3+5)];
+	f0 = f0 > f1 ? f0 : f1;
+	heapFloat[(r6+5)] = f0;
+	f0 = heapFloat[(r7+2)];
+	f1 = heapFloat[(r3+2)];
+	f0 = f0 < f1 ? f0 : f1;
+	heapFloat[(r6+2)] = f0;
+	f0 = heapFloat[(r7+6)];
+	f1 = heapFloat[(r3+6)];
+	f0 = f0 > f1 ? f0 : f1;
+	heapFloat[(r6+6)] = f0;
+_31: do {
+	if(r5 ==0) //_LBB80_38
+{
+	heap32[(r6+9)] = r2;
+	heap32[(r3+8)] = r4;
+	heap32[(r6+10)] = r1;
+	heap32[(r7+8)] = r4;
+	heap32[(r0)] = r4;
+}
+else{
+	r0 = heap32[(r3+8)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+10)];
+	r0 = r0 == r2;
+	r0 = r0 & 1;
+	r0 = r0 << 2;
+	r0 = (r5 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0+9)] = r4;
+	heap32[(r6+9)] = r2;
+	heap32[(r3+8)] = r4;
+	heap32[(r6+10)] = r1;
+	heap32[(r7+8)] = r4;
+	f0 = heapFloat[(r6)];
+_34: while(true){
+	r0 = r5;
+	r1 = r0 >> 2;
+	f1 = heapFloat[(r1)];
+if(!(f1 >f0)) //_LBB80_37
+{
+	r2 = r4 >> 2;
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r2+1)];
+if(!(f0 >f1)) //_LBB80_37
+{
+	f0 = heapFloat[(r1+2)];
+	f1 = heapFloat[(r2+2)];
+if(!(f0 >f1)) //_LBB80_37
+{
+	f0 = heapFloat[(r1+4)];
+	f1 = heapFloat[(r2+4)];
+if(!(f0 <f1)) //_LBB80_37
+{
+	f0 = heapFloat[(r1+5)];
+	f1 = heapFloat[(r2+5)];
+if(!(f0 <f1)) //_LBB80_37
+{
+	f0 = heapFloat[(r1+6)];
+	f1 = heapFloat[(r2+6)];
+	if(f0 >=f1) //_LBB80_39
+{
+break _31;
+}
+}
+}
+}
+}
+}
+	r2 = heap32[(r1+10)];
+	r3 = heap32[(r1+9)];
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3)];
+	f1 = heapFloat[(r2)];
+	f0 = f0 < f1 ? f0 : f1;
+	heapFloat[(r1)] = f0;
+	f1 = heapFloat[(r3+4)];
+	f2 = heapFloat[(r2+4)];
+	f1 = f1 > f2 ? f1 : f2;
+	heapFloat[(r1+4)] = f1;
+	f1 = heapFloat[(r3+1)];
+	f2 = heapFloat[(r2+1)];
+	f1 = f1 < f2 ? f1 : f2;
+	heapFloat[(r1+1)] = f1;
+	f1 = heapFloat[(r3+5)];
+	f2 = heapFloat[(r2+5)];
+	f1 = f1 > f2 ? f1 : f2;
+	heapFloat[(r1+5)] = f1;
+	f1 = heapFloat[(r3+2)];
+	f2 = heapFloat[(r2+2)];
+	f1 = f1 < f2 ? f1 : f2;
+	heapFloat[(r1+2)] = f1;
+	f1 = heapFloat[(r3+6)];
+	f2 = heapFloat[(r2+6)];
+	f1 = f1 > f2 ? f1 : f2;
+	heapFloat[(r1+6)] = f1;
+	r5 = heap32[(r1+8)];
+	r4 = r0;
+	if(r5 ==0) //_LBB80_39
+{
+break _31;
+}
+}
+}
+} while(0);
+	return;
+}
+else{
+	r2 = r1 >> 2;
+	heap32[(r0)] = r1;
+	heap32[(r2+8)] = 0;
+	return;
+}
+}
+
+function _ZL10removeleafP6btDbvtP10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+	if(r2 !=r1) //_LBB81_2
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2+8)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+10)];
+	r1 = r4 != r1;
+	r1 = r1 & 1;
+	r1 = r1 << 2;
+	r1 = (r2 + r1)|0;
+	r1 = r1 >> 2;
+	r3 = heap32[(r3+8)];
+	r1 = heap32[(r1+9)];
+_3: do {
+	if(r3 ==0) //_LBB81_11
+{
+	r3 = r1 >> 2;
+	heap32[(r0)] = r1;
+	heap32[(r3+8)] = 0;
+	r3 = heap32[(r0+1)];
+if(!(r3 ==0)) //_LBB81_13
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r4 = heap32[(r1)];
+	r4 = (r4 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r1)] = r4;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r0+1)] = r2;
+	r3 = heap32[(r0)];
+}
+else{
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+10)];
+	r4 = r4 == r2;
+	r4 = r4 & 1;
+	r4 = r4 << 2;
+	r4 = (r3 + r4)|0;
+	r4 = r4 >> 2;
+	r5 = r1 >> 2;
+	heap32[(r4+9)] = r1;
+	heap32[(r5+8)] = r3;
+	r1 = heap32[(r0+1)];
+if(!(r1 ==0)) //_LBB81_5
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r0+1)] = r2;
+_12: while(true){
+	if(r3 !=0) //_LBB81_6
+{
+	r1 = r3 >> 2;
+	r2 = heap32[(r1+10)];
+	r4 = heap32[(r1+9)];
+	r2 = r2 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r1+6)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r1+2)];
+	f4 = heapFloat[(r1+4)];
+	f5 = heapFloat[(r1+5)];
+	f6 = heapFloat[(r4)];
+	f7 = heapFloat[(r2)];
+	f6 = f6 < f7 ? f6 : f7;
+	heapFloat[(r1)] = f6;
+	f7 = heapFloat[(r4+4)];
+	f8 = heapFloat[(r2+4)];
+	f7 = f7 > f8 ? f7 : f8;
+	heapFloat[(r1+4)] = f7;
+	f8 = heapFloat[(r4+1)];
+	f9 = heapFloat[(r2+1)];
+	f8 = f8 < f9 ? f8 : f9;
+	heapFloat[(r1+1)] = f8;
+	f9 = heapFloat[(r4+5)];
+	f10 = heapFloat[(r2+5)];
+	f9 = f9 > f10 ? f9 : f10;
+	heapFloat[(r1+5)] = f9;
+	f10 = heapFloat[(r4+2)];
+	f11 = heapFloat[(r2+2)];
+	f10 = f10 < f11 ? f10 : f11;
+	heapFloat[(r1+2)] = f10;
+	f11 = heapFloat[(r4+6)];
+	f12 = heapFloat[(r2+6)];
+	f11 = f11 > f12 ? f11 : f12;
+	heapFloat[(r1+6)] = f11;
+if(!(f0 !=f11)) //_LBB81_8
+{
+	r2 = f1 == f6;
+	r4 = f2 == f8;
+	r2 = r2 & r4;
+	r4 = f3 == f10;
+	r2 = r2 & r4;
+	r4 = f4 == f7;
+	r2 = r2 & r4;
+	r4 = f5 == f9;
+	r2 = r2 & r4;
+	if(r2 != 0) //_LBB81_14
+{
+break _3;
+}
+}
+	r3 = heap32[(r1+8)];
+}
+else{
+break _12;
+}
+}
+	r0 = heap32[(r0)];
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r_g0 = r3;
+	return;
+}
+else{
+	heap32[(r0)] = 0;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN6btDbvt6updateEP10btDbvtNodeR12btDbvtAabbMmRK9btVector3f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	f0 = heapFloat[(r0)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+3)];
+	f1 = heapFloat[(fp+4)];
+	r4 = r1 >> 2;
+	f2 = heapFloat[(r4)];
+	if(f2 <=f0) //_LBB82_2
+{
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r4+1)];
+	if(f3 <=f2) //_LBB82_4
+{
+	f3 = heapFloat[(r4+2)];
+	f4 = heapFloat[(r0+2)];
+if(!(f3 >f4)) //_LBB82_3
+{
+	f3 = heapFloat[(r4+4)];
+	f4 = heapFloat[(r0+4)];
+if(!(f3 <f4)) //_LBB82_3
+{
+	f3 = heapFloat[(r4+5)];
+	f4 = heapFloat[(r0+5)];
+if(!(f3 <f4)) //_LBB82_3
+{
+	f3 = heapFloat[(r4+6)];
+	f4 = heapFloat[(r0+6)];
+if(!(f3 <f4)) //_LBB82_3
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+}
+}
+}
+}
+else{
+	f2 = heapFloat[(r0+1)];
+}
+	f0 = f0-f1;
+	f2 = f2-f1;
+	heapFloat[(r0)] = f0;
+	heapFloat[(r0+1)] = f2;
+	f3 = heapFloat[(r0+2)];
+	f3 = f3-f1;
+	heapFloat[(r0+2)] = f3;
+	f4 = heapFloat[(r0+4)];
+	f4 = f4+f1;
+	heapFloat[(r0+4)] = f4;
+	f5 = heapFloat[(r0+5)];
+	f5 = f5+f1;
+	heapFloat[(r0+5)] = f5;
+	f6 = heapFloat[(r0+6)];
+	f1 = f6+f1;
+	r3 = r3 >> 2;
+	heapFloat[(r0+6)] = f1;
+	f6 = heapFloat[(r3)];
+	f7 =                         0;
+	if(f6 <=f7) //_LBB82_10
+{
+	f0 = f0+f6;
+	heapFloat[(r0)] = f0;
+}
+else{
+	f0 = f4+f6;
+	heapFloat[(r0+4)] = f0;
+}
+	f0 = heapFloat[(r3+1)];
+	if(f0 <=f7) //_LBB82_13
+{
+	f0 = f2+f0;
+	heapFloat[(r0+1)] = f0;
+}
+else{
+	f0 = f5+f0;
+	heapFloat[(r0+5)] = f0;
+}
+	f0 = heapFloat[(r3+2)];
+	if(f0 <=f7) //_LBB82_16
+{
+	f0 = f3+f0;
+	heapFloat[(r0+2)] = f0;
+}
+else{
+	f0 = f1+f0;
+	heapFloat[(r0+6)] = f0;
+}
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r3 = r_g0;
+_22: do {
+	if(r3 !=0) //_LBB82_19
+{
+	r5 = r2 >> 2;
+	r6 = heap32[(r5+2)];
+	if(r6 <0) //_LBB82_24
+{
+	r5 = heap32[(r5)];
+}
+else{
+	r7 = -1;
+_27: while(true){
+	r5 = r3;
+	r7 = (r7 + 1)|0;
+	if(r6 >r7) //_LBB82_23
+{
+	r3 = r5 >> 2;
+	r3 = heap32[(r3+8)];
+	if(r3 ==0) //_LBB82_22
+{
+break _22;
+}
+else{
+continue _27;
+}
+}
+else{
+break _22;
+}
+}
+}
+}
+else{
+	r5 = 0;
+}
+} while(0);
+	heap32[(r4)] = heap32[(r0)];
+	heap32[(r4+1)] = heap32[(r0+1)];
+	heap32[(r4+2)] = heap32[(r0+2)];
+	heap32[(r4+3)] = heap32[(r0+3)];
+	heap32[(r4+4)] = heap32[(r0+4)];
+	heap32[(r4+5)] = heap32[(r0+5)];
+	heap32[(r4+6)] = heap32[(r0+6)];
+	heap32[(r4+7)] = heap32[(r0+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r1;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZL17recursedeletenodeP6btDbvtP10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+10)];
+if(!(r3 ==0)) //_LBB83_2
+{
+	r3 = heap32[(r2+9)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+	r2 = heap32[(r2+10)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+}
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+if(!(r2 !=r0)) //_LBB83_4
+{
+	heap32[(r1)] = 0;
+}
+	r2 = heap32[(r1+1)];
+if(!(r2 ==0)) //_LBB83_6
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r2 = r2 >> 2;
+	heap32[(r3)] = r4;
+	r2 = heap32[(r2+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+}
+	heap32[(r1+1)] = r0;
+	return;
+}
+
+function _ZN6btDbvt19optimizeIncrementalEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	if(r0 <0) //_LBB84_2
+{
+	r0 = r1 >> 2;
+	r0 = heap32[(r0+3)];
+}
+	r2 = r1 >> 2;
+	r3 = heap32[(r2)];
+_4: do {
+if(!(r3 ==0)) //_LBB84_20
+{
+if(!(r0 <1)) //_LBB84_20
+{
+_6: while(true){
+	r3 = 0;
+	r4 = r1;
+_8: while(true){
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+10)];
+	if(r6 !=0) //_LBB84_6
+{
+	r6 = heap32[(r5+8)];
+	if(uint(r6) >uint(r4)) //_LBB84_8
+{
+	r7 = r6 >> 2;
+	r8 = heap32[(r7+10)];
+	r8 = r8 == r4;
+	r8 = r8 & 1;
+	r9 = (r6 + 36)|0;
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r11 = heap32[(r11)];
+	if(r11 ==r4) //_LBB84_10
+{
+	r8 = r8 ^ 1;
+	r8 = r8 << 2;
+	r9 = (r9 + r8)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r11 = heap32[(r7+8)];
+	if(r11 ==0) //_LBB84_12
+{
+	heap32[(r2)] = r4;
+}
+else{
+	r12 = r11 >> 2;
+	r12 = heap32[(r12+10)];
+	r12 = r12 == r6;
+	r12 = r12 & 1;
+	r12 = r12 << 2;
+	r12 = (r11 + r12)|0;
+	r12 = r12 >> 2;
+	heap32[(r12+9)] = r4;
+}
+	r12 = r9 >> 2;
+	heap32[(r12+8)] = r4;
+	heap32[(r7+8)] = r4;
+	heap32[(r5+8)] = r11;
+	r11 = heap32[(r5+9)];
+	heap32[(r7+9)] = r11;
+	r11 = heap32[(r5+10)];
+	heap32[(r7+10)] = r11;
+	r11 = heap32[(r5+9)];
+	r11 = r11 >> 2;
+	heap32[(r11+8)] = r6;
+	r11 = heap32[(r5+10)];
+	r4 = (r4 + 36)|0;
+	r10 = (r4 + r10)|0;
+	r11 = r11 >> 2;
+	r4 = (r4 + r8)|0;
+	r8 = r10 >> 2;
+	heap32[(r11+8)] = r6;
+	r4 = r4 >> 2;
+	heap32[(r8)] = r6;
+	heap32[(r4)] = r9;
+	f0 = heapFloat[(r7+7)];
+	f1 = heapFloat[(r7+6)];
+	f2 = heapFloat[(r7+5)];
+	f3 = heapFloat[(r7+4)];
+	f4 = heapFloat[(r7+3)];
+	f5 = heapFloat[(r7+2)];
+	f6 = heapFloat[(r7+1)];
+	f7 = heapFloat[(r7)];
+	heap32[(r7)] = heap32[(r5)];
+	heap32[(r7+1)] = heap32[(r5+1)];
+	heap32[(r7+2)] = heap32[(r5+2)];
+	heap32[(r7+3)] = heap32[(r5+3)];
+	heap32[(r7+4)] = heap32[(r5+4)];
+	heap32[(r7+5)] = heap32[(r5+5)];
+	heap32[(r7+6)] = heap32[(r5+6)];
+	heap32[(r7+7)] = heap32[(r5+7)];
+	heapFloat[(r5)] = f7;
+	heapFloat[(r5+1)] = f6;
+	heapFloat[(r5+2)] = f5;
+	heapFloat[(r5+3)] = f4;
+	heapFloat[(r5+4)] = f3;
+	heapFloat[(r5+5)] = f2;
+	heapFloat[(r5+6)] = f1;
+	heapFloat[(r5+7)] = f0;
+}
+else{
+break _6;
+}
+}
+else{
+	r6 = r4;
+}
+	r4 = heap32[(r2+4)];
+	r4 = r4 >>> r3;
+	r4 = r4 & 1;
+	r4 = r4 << 2;
+	r4 = (r6 + r4)|0;
+	r3 = (r3 + 1)|0;
+	r4 = (r4 + 36)|0;
+	r3 = r3 & 31;
+}
+else{
+break _8;
+}
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB84_18
+{
+	r3 = heap32[(r2)];
+}
+else{
+	r3 = 0;
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r3 = heap32[(r2+4)];
+	r0 = (r0 + -1)|0;
+	r3 = (r3 + 1)|0;
+	heap32[(r2+4)] = r3;
+if(!(r0 !=0)) //_LBB84_5
+{
+break _4;
+}
+}
+	r4 = _2E_str22;
+	r0 = _2E_str1118;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 379;
+	_assert(i7);
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN18btDbvtTreeColliderD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btDbvtTreeCollider;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN18btDbvtTreeColliderD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btDbvtTreeCollider;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNodeS2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+if(!(r0 ==r1)) //_LBB87_2
+{
+	r2 = heap32[(fp)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+24)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	r4 = heap32[(r4+2)];
+	r1 = heap32[(r1+9)];
+	r0 = heap32[(r0+9)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = heap32[(r2+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+30)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0+30)] = r1;
+}
+	return;
+}
+
+function _ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r1 = heap32[(r1+2)];
+	r2 = r2 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(r2+2)];
+	r1 = heap32[(r1+12)];
+	r3 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZNK16btDbvtBroadphase7getAabbEP17btBroadphaseProxyR9btVector3S3_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r1)] = heap32[(r0+4)];
+	heap32[(r1+1)] = heap32[(r0+5)];
+	r2 = heap32[(fp+3)];
+	heap32[(r1+2)] = heap32[(r0+6)];
+	r2 = r2 >> 2;
+	heap32[(r1+3)] = heap32[(r0+7)];
+	heap32[(r2)] = heap32[(r0+8)];
+	heap32[(r2+1)] = heap32[(r0+9)];
+	heap32[(r2+2)] = heap32[(r0+10)];
+	heap32[(r2+3)] = heap32[(r0+11)];
+	return;
+}
+
+function _ZN19BroadphaseRayTesterD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV19BroadphaseRayTester;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN19BroadphaseRayTesterD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV19BroadphaseRayTester;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN19BroadphaseRayTester7ProcessEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	r1 = heap32[(r1+2)];
+	r2 = heap32[(r2+9)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN20BroadphaseAabbTesterD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20BroadphaseAabbTester;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN20BroadphaseAabbTesterD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV20BroadphaseAabbTester;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN20BroadphaseAabbTester7ProcessEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	r1 = heap32[(r1+2)];
+	r2 = heap32[(r2+9)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN16btDbvtBroadphase23getOverlappingPairCacheEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+24)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btDbvtBroadphase23getOverlappingPairCacheEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+24)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btDbvtBroadphase17getBroadphaseAabbER9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r0 = heap32[(r0+11)];
+	if(r1 ==0) //_LBB98_4
+{
+	if(r0 !=0) //_LBB98_6
+{
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f2 = heapFloat[(r0+1)];
+	f4 = heapFloat[(r0+2)];
+	f6 = heapFloat[(r0+3)];
+	f1 = heapFloat[(r0+4)];
+	f3 = heapFloat[(r0+5)];
+	f5 = heapFloat[(r0+6)];
+	f7 = heapFloat[(r0+7)];
+}
+else{
+	f6 =                         0;
+	f4 = f6;
+	f2 = f6;
+	f0 = f6;
+	f1 = f6;
+	f3 = f6;
+	f5 = f6;
+	f7 = f6;
+}
+}
+else{
+	if(r0 ==0) //_LBB98_3
+{
+	r0 = r1 >> 2;
+	f0 = heapFloat[(r0)];
+	f2 = heapFloat[(r0+1)];
+	f4 = heapFloat[(r0+2)];
+	f6 = heapFloat[(r0+3)];
+	f1 = heapFloat[(r0+4)];
+	f3 = heapFloat[(r0+5)];
+	f5 = heapFloat[(r0+6)];
+	f7 = heapFloat[(r0+7)];
+}
+else{
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r0)];
+	f2 = heapFloat[(r1+4)];
+	f3 = heapFloat[(r0+4)];
+	f4 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r0+1)];
+	f6 = heapFloat[(r1+5)];
+	f7 = heapFloat[(r0+5)];
+	f8 = heapFloat[(r1+2)];
+	f9 = heapFloat[(r0+2)];
+	f10 = heapFloat[(r1+6)];
+	f11 = heapFloat[(r0+6)];
+	f0 = f0 < f1 ? f0 : f1;
+	f1 = f2 > f3 ? f2 : f3;
+	f2 = f4 < f5 ? f4 : f5;
+	f3 = f6 > f7 ? f6 : f7;
+	f4 = f8 < f9 ? f8 : f9;
+	f5 = f10 > f11 ? f10 : f11;
+}
+}
+	r0 = r2 >> 2;
+	heapFloat[(r0)] = f0;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f4;
+	r1 = r3 >> 2;
+	heapFloat[(r0+3)] = f6;
+	heapFloat[(r1)] = f1;
+	heapFloat[(r1+1)] = f3;
+	heapFloat[(r1+2)] = f5;
+	heapFloat[(r1+3)] = f7;
+	return;
+}
+
+function _ZN16btDbvtBroadphase10printStatsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btDbvtBroadphase9resetPoolEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = 0;
+	r3 = heap32[(r1+14)];
+	r4 = heap32[(r1+4)];
+	r3 = (r2 - r3)|0;
+if(!(r4 !=r3)) //_LBB100_18
+{
+	r3 = heap32[(r1+1)];
+if(!(r3 ==0)) //_LBB100_3
+{
+	r4 = (r0 + 4)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+}
+	r3 = heap32[(r1+2)];
+if(!(r3 ==0)) //_LBB100_5
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = -1;
+	r3 = heap32[(r1+9)];
+if(!(r3 ==0)) //_LBB100_9
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB100_8
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+9)] = 0;
+}
+	r3 = 1;
+	heap8[r0+40] = r3;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+8)] = 0;
+	heap32[(r1+5)] = 0;
+	r4 = heap32[(r1+11)];
+if(!(r4 ==0)) //_LBB100_11
+{
+	r5 = (r0 + 44)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+}
+	r4 = heap32[(r1+12)];
+if(!(r4 ==0)) //_LBB100_13
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r6 = (r6 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r5)] = r6;
+	r4 = heap32[(r4+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = -1;
+	r4 = heap32[(r1+19)];
+if(!(r4 ==0)) //_LBB100_17
+{
+	r5 = heapU8[r0+80];
+if(!(r5 ==0)) //_LBB100_16
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r6 = (r6 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r5)] = r6;
+	r4 = heap32[(r4+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	heap32[(r1+19)] = 0;
+}
+	heap8[r0+80] = r3;
+	heap32[(r1+19)] = 0;
+	heap32[(r1+17)] = 0;
+	heap32[(r1+18)] = 0;
+	heap32[(r1+15)] = 0;
+	heap8[r0+153] = r2;
+	heap8[r0+154] = r3;
+	heap32[(r1+26)] = 0;
+	heap32[(r1+31)] = 0;
+	heap32[(r1+27)] = 1;
+	heap32[(r1+28)] = 0;
+	heap32[(r1+29)] = 10;
+	heap32[(r1+30)] = 1;
+	heap32[(r1+32)] = 0;
+	heap32[(r1+33)] = 0;
+	heap32[(r1+34)] = 0;
+	heap32[(r1+37)] = 0;
+	heap32[(r1+35)] = 0;
+	heap32[(r1+36)] = 0;
+	heap32[(r1+21)] = 0;
+	heap32[(r1+22)] = 0;
+	heap32[(r1+23)] = 0;
+}
+	return;
+}
+
+function _ZN6btDbvt24collideTTpersistentStackEPK10btDbvtNodeS2_RNS_8ICollideE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+_1: do {
+if(!(r0 ==0)) //_LBB101_57
+{
+	r1 = heap32[(fp+2)];
+if(!(r1 ==0)) //_LBB101_57
+{
+	r2 = heap32[(fp)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+6)];
+if(!(r4 >127)) //_LBB101_17
+{
+	r5 = heap32[(r3+7)];
+if(!(r5 >127)) //_LBB101_17
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r6 = (r6 + 1)|0;
+	heap32[(r5)] = r6;
+	heap32[(g0)] = 1043;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB101_6
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+	r6 = (r2 + 32)|0;
+	if(r4 <1) //_LBB101_9
+{
+	r4 = r6 >> 2;
+	r8 = heap32[(r4)];
+}
+else{
+	r7 = 0;
+_13: while(true){
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r7 << 3;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r5 + r9)|0;
+	r11 = heap32[(r10+1)];
+	r10 = heap32[(r10)];
+	r9 = r9 >> 2;
+	r7 = (r7 + 1)|0;
+	heap32[(r9)] = r10;
+	heap32[(r9+1)] = r11;
+if(!(r4 !=r7)) //_LBB101_10
+{
+break _13;
+}
+}
+	r6 = (r2 + 32)|0;
+}
+if(!(r8 ==0)) //_LBB101_16
+{
+	r4 = heapU8[r2+36];
+if(!(r4 ==0)) //_LBB101_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r7 = heap32[(r4)];
+	r7 = (r7 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r4)] = r7;
+	r4 = heap32[(r8+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r6 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r6 = r6 >> 2;
+	heap8[r2+36] = r4;
+	heap32[(r6)] = r5;
+	heap32[(r3+7)] = 128;
+}
+}
+	r4 = heap32[(fp+3)];
+	heap32[(r3+6)] = 128;
+	r5 = heap32[(r3+8)];
+	r5 = r5 >> 2;
+	r6 = 1;
+	r7 = 124;
+	heap32[(r5)] = r0;
+	heap32[(r5+1)] = r1;
+_24: while(true){
+	r0 = r6;
+	r6 = (r0 + -1)|0;
+	r1 = heap32[(r3+8)];
+	r5 = r6 << 3;
+	r5 = (r1 + r5)|0;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r5 = heap32[(r5+1)];
+	if(r6 >r7) //_LBB101_20
+{
+	r7 = heap32[(r3+6)];
+	r9 = r7 << 1;
+_28: do {
+if(!(r7 >r9)) //_LBB101_38
+{
+if(!(r7 >=r9)) //_LBB101_38
+{
+	r10 = heap32[(r3+7)];
+	if(r10 <r9) //_LBB101_24
+{
+	if(r9 !=0) //_LBB101_26
+{
+	r10 = gNumAlignedAllocs;
+	r10 = r10 >> 2;
+	r11 = heap32[(r10)];
+	r12 = r7 << 4;
+	r11 = (r11 + 1)|0;
+	r12 = r12 | 3;
+	heap32[(r10)] = r11;
+	r10 = (r12 + 16)|0;
+	heap32[(g0)] = r10;
+	malloc(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB101_28
+{
+	r11 = 0;
+	r12 = (r10 + 4)|0;
+	r11 = (r11 - r12)|0;
+	r11 = r11 & 15;
+	r11 = (r10 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r10;
+	r10 = r12;
+}
+}
+else{
+	r10 = 0;
+}
+if(!(r7 <1)) //_LBB101_32
+{
+	r11 = (r1 + 4)|0;
+	r12 = (r10 + 4)|0;
+	r13 = r7;
+_40: while(true){
+	r14 = r11 >> 2;
+	r15 = heap32[(r14)];
+	r14 = heap32[(r14+-1)];
+	r16 = r12 >> 2;
+	r13 = (r13 + -1)|0;
+	r11 = (r11 + 8)|0;
+	r12 = (r12 + 8)|0;
+	heap32[(r16+-1)] = r14;
+	heap32[(r16)] = r15;
+if(!(r13 !=0)) //_LBB101_31
+{
+break _40;
+}
+}
+}
+if(!(r1 ==0)) //_LBB101_36
+{
+	r11 = heapU8[r2+36];
+if(!(r11 ==0)) //_LBB101_35
+{
+	r11 = gNumAlignedFree;
+	r11 = r11 >> 2;
+	r12 = heap32[(r11)];
+	r12 = (r12 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r11)] = r12;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r3+8)] = 0;
+}
+	r1 = 1;
+	heap8[r2+36] = r1;
+	heap32[(r3+8)] = r10;
+	heap32[(r3+7)] = r9;
+if(!(r7 <r9)) //_LBB101_23
+{
+break _28;
+}
+}
+_49: while(true){
+	r7 = (r7 + -1)|0;
+if(!(r7 !=0)) //_LBB101_37
+{
+break _28;
+}
+}
+}
+}
+} while(0);
+	r7 = (r9 + -4)|0;
+	heap32[(r3+6)] = r9;
+}
+	if(r8 !=r5) //_LBB101_43
+{
+	r1 = r8 >> 2;
+	r9 = r5 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r9+4)];
+if(!(f0 >f1)) //_LBB101_41
+{
+	f0 = heapFloat[(r1+4)];
+	f1 = heapFloat[(r9)];
+if(!(f0 <f1)) //_LBB101_41
+{
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r9+5)];
+if(!(f0 >f1)) //_LBB101_41
+{
+	f0 = heapFloat[(r1+5)];
+	f1 = heapFloat[(r9+1)];
+if(!(f0 <f1)) //_LBB101_41
+{
+	f0 = heapFloat[(r1+2)];
+	f1 = heapFloat[(r9+6)];
+if(!(f0 >f1)) //_LBB101_41
+{
+	f0 = heapFloat[(r1+6)];
+	f1 = heapFloat[(r9+2)];
+if(!(f0 <f1)) //_LBB101_41
+{
+	r10 = heap32[(r9+10)];
+	r11 = heap32[(r1+10)];
+	if(r11 ==0) //_LBB101_53
+{
+	if(r10 ==0) //_LBB101_55
+{
+	r0 = r4 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+else{
+	r5 = r0 << 3;
+	r6 = heap32[(r3+8)];
+	r6 = (r6 + r5)|0;
+	r1 = heap32[(r9+9)];
+	r6 = r6 >> 2;
+	heap32[(r6+-2)] = r8;
+	heap32[(r6+-1)] = r1;
+	r6 = heap32[(r3+8)];
+	r5 = (r6 + r5)|0;
+	r1 = heap32[(r9+10)];
+	r5 = r5 >> 2;
+	r6 = (r0 + 1)|0;
+	heap32[(r5)] = r8;
+	heap32[(r5+1)] = r1;
+}
+}
+else{
+	r6 = heap32[(r3+8)];
+	if(r10 ==0) //_LBB101_52
+{
+	r8 = r0 << 3;
+	r6 = (r6 + r8)|0;
+	r6 = r6 >> 2;
+	r9 = heap32[(r1+9)];
+	heap32[(r6+-2)] = r9;
+	heap32[(r6+-1)] = r5;
+	r6 = heap32[(r3+8)];
+	r6 = (r6 + r8)|0;
+	r8 = heap32[(r1+10)];
+	r9 = r6 >> 2;
+	r6 = (r0 + 1)|0;
+	heap32[(r9)] = r8;
+	heap32[(r9+1)] = r5;
+}
+else{
+	r5 = r0 << 3;
+	r6 = (r6 + r5)|0;
+	r8 = heap32[(r9+9)];
+	r10 = heap32[(r1+9)];
+	r6 = r6 >> 2;
+	heap32[(r6+-2)] = r10;
+	heap32[(r6+-1)] = r8;
+	r6 = heap32[(r3+8)];
+	r6 = (r6 + r5)|0;
+	r8 = heap32[(r9+9)];
+	r10 = heap32[(r1+10)];
+	r6 = r6 >> 2;
+	heap32[(r6)] = r10;
+	heap32[(r6+1)] = r8;
+	r6 = heap32[(r3+8)];
+	r6 = (r5 + r6)|0;
+	r8 = heap32[(r9+10)];
+	r10 = heap32[(r1+9)];
+	r6 = r6 >> 2;
+	heap32[(r6+2)] = r10;
+	heap32[(r6+3)] = r8;
+	r6 = heap32[(r3+8)];
+	r6 = (r5 + r6)|0;
+	r5 = heap32[(r9+10)];
+	r1 = heap32[(r1+10)];
+	r8 = r6 >> 2;
+	r6 = (r0 + 3)|0;
+	heap32[(r8+4)] = r1;
+	heap32[(r8+5)] = r5;
+}
+}
+}
+}
+}
+}
+}
+}
+}
+else{
+	r5 = r8 >> 2;
+	r8 = heap32[(r5+10)];
+	if(r8 !=0) //_LBB101_42
+{
+	r6 = r0 << 3;
+	r8 = heap32[(r3+8)];
+	r8 = (r8 + r6)|0;
+	r1 = heap32[(r5+9)];
+	r8 = r8 >> 2;
+	heap32[(r8+-2)] = r1;
+	heap32[(r8+-1)] = r1;
+	r8 = heap32[(r3+8)];
+	r8 = (r8 + r6)|0;
+	r1 = heap32[(r5+10)];
+	r8 = r8 >> 2;
+	heap32[(r8)] = r1;
+	heap32[(r8+1)] = r1;
+	r8 = heap32[(r3+8)];
+	r6 = (r6 + r8)|0;
+	r8 = heap32[(r5+10)];
+	r5 = heap32[(r5+9)];
+	r1 = r6 >> 2;
+	r6 = (r0 + 2)|0;
+	heap32[(r1+2)] = r5;
+	heap32[(r1+3)] = r8;
+}
+}
+	if(r6 !=0) //_LBB101_18
+{
+continue _24;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB102_46
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = gNumAlignedAllocs;
+	r1 = r1 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r1+2)];
+	f3 = heapFloat[(r1+4)];
+	f4 = heapFloat[(r1+5)];
+	f5 = heapFloat[(r1+6)];
+	r1 = (r4 + 1)|0;
+	heap32[(r3)] = r1;
+	heap32[(g0)] = 275;
+	malloc(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB102_3
+{
+	r4 = 0;
+	r5 = (r1 + 4)|0;
+	r4 = (r4 - r5)|0;
+	r4 = r4 & 15;
+	r4 = (r1 + r4)|0;
+	r5 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r1;
+	r1 = r5;
+}
+	r4 = 1;
+	r5 = 64;
+	r6 = r1 >> 2;
+	heap32[(r6)] = r0;
+_6: while(true){
+	r0 = r4;
+	r4 = (r0 + -1)|0;
+	r6 = r4 << 2;
+	r6 = (r1 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r7 = r6 >> 2;
+	f6 = heapFloat[(r7)];
+	if(f6 <=f3) //_LBB102_7
+{
+	f6 = heapFloat[(r7+4)];
+if(!(f6 <f0)) //_LBB102_6
+{
+	f6 = heapFloat[(r7+1)];
+if(!(f6 >f4)) //_LBB102_6
+{
+	f6 = heapFloat[(r7+5)];
+if(!(f6 <f1)) //_LBB102_6
+{
+	f6 = heapFloat[(r7+2)];
+if(!(f6 >f5)) //_LBB102_6
+{
+	f6 = heapFloat[(r7+6)];
+if(!(f6 <f2)) //_LBB102_6
+{
+	r8 = heap32[(r7+10)];
+	if(r8 ==0) //_LBB102_42
+{
+	r0 = r2 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+else{
+	r6 = heap32[(r7+9)];
+	if(r5 ==r4) //_LBB102_15
+{
+	r8 = 1;
+	r9 = r4 << 1;
+	r8 = r4 == 0 ? r8 : r9;
+if(!(r5 >=r8)) //_LBB102_14
+{
+	if(r8 !=0) //_LBB102_18
+{
+	r5 = heap32[(r3)];
+	r9 = r8 << 2;
+	r5 = (r5 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r3)] = r5;
+	r5 = (r9 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB102_20
+{
+	r5 = 0;
+	r10 = (r9 + 4)|0;
+	r5 = (r5 - r10)|0;
+	r5 = r5 & 15;
+	r5 = (r9 + r5)|0;
+	r10 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r9;
+	r9 = r10;
+}
+}
+else{
+	r9 = 0;
+}
+if(!(r4 <1)) //_LBB102_24
+{
+	r4 = (r0 + -1)|0;
+	r5 = r1;
+	r10 = r9;
+_28: while(true){
+	r11 = r5 >> 2;
+	r4 = (r4 + -1)|0;
+	r12 = (r10 + 4)|0;
+	r5 = (r5 + 4)|0;
+	r10 = r10 >> 2;
+	r11 = heap32[(r11)];
+	heap32[(r10)] = r11;
+	r10 = r12;
+if(!(r4 !=0)) //_LBB102_23
+{
+break _28;
+}
+}
+}
+	if(r1 !=0) //_LBB102_26
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r5 = r8;
+	r1 = r9;
+}
+else{
+	r5 = r8;
+	r1 = r9;
+}
+}
+}
+	r4 = r0 << 2;
+	r8 = (r1 + r4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+-1)] = r6;
+	r6 = heap32[(r7+10)];
+	if(r5 ==r0) //_LBB102_29
+{
+	r7 = 1;
+	r8 = r0 << 1;
+	r7 = r0 == 0 ? r7 : r8;
+if(!(r5 >=r7)) //_LBB102_28
+{
+	if(r7 !=0) //_LBB102_32
+{
+	r5 = heap32[(r3)];
+	r8 = r7 << 2;
+	r5 = (r5 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r3)] = r5;
+	r5 = (r8 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB102_34
+{
+	r5 = 0;
+	r9 = (r8 + 4)|0;
+	r5 = (r5 - r9)|0;
+	r5 = r5 & 15;
+	r5 = (r8 + r5)|0;
+	r9 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r8;
+	r8 = r9;
+}
+}
+else{
+	r8 = 0;
+}
+_43: do {
+if(!(r0 <1)) //_LBB102_38
+{
+	r5 = r1;
+	r9 = r8;
+	r10 = r0;
+_45: while(true){
+	r11 = r5 >> 2;
+	r10 = (r10 + -1)|0;
+	r12 = (r9 + 4)|0;
+	r5 = (r5 + 4)|0;
+	r9 = r9 >> 2;
+	r11 = heap32[(r11)];
+	heap32[(r9)] = r11;
+	r9 = r12;
+if(!(r10 !=0)) //_LBB102_37
+{
+break _43;
+}
+}
+}
+} while(0);
+	if(r1 !=0) //_LBB102_40
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r9 = heap32[(r5)];
+	r9 = (r9 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r5)] = r9;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r5 = r7;
+	r1 = r8;
+}
+else{
+	r5 = r7;
+	r1 = r8;
+}
+}
+}
+	r7 = (r1 + r4)|0;
+	r4 = (r0 + 1)|0;
+	r0 = r7 >> 2;
+	heap32[(r0)] = r6;
+}
+}
+}
+}
+}
+}
+}
+if(!(r4 >0)) //_LBB102_5
+{
+break _6;
+}
+}
+if(!(r1 ==0)) //_LBB102_46
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+	r2 = (r2 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r1+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	return;
+}
+
+function _ZN16btDbvtBroadphase8aabbTestERK9btVector3S2_R24btBroadphaseAabbCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = _ZTV20BroadphaseAabbTester;
+	r1 = sp + -8;
+	r0 = (r0 + 8)|0;
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	r4 = heap32[(fp+3)];
+	heap32[(fp+-2)] = r0;
+	r0 = sp + -40;
+	r2 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r3 = r0 >> 2;
+	heap32[(fp+-10)] = heap32[(r2)];
+	heap32[(r3+1)] = heap32[(r2+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(r3+2)] = heap32[(r2+2)];
+	r4 = r4 >> 2;
+	heap32[(r3+3)] = heap32[(r2+3)];
+	heap32[(r3+4)] = heap32[(r4)];
+	heap32[(r3+5)] = heap32[(r4+1)];
+	r2 = heap32[(fp)];
+	heap32[(r3+6)] = heap32[(r4+2)];
+	r2 = r2 >> 2;
+	heap32[(r3+7)] = heap32[(r4+3)];
+	r3 = heap32[(r2+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	_ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(i7);
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	_ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(i7);
+	return;
+}
+
+function _ZN16btDbvtBroadphase11createProxyERK9btVector3S2_iPvssP12btDispatcherS3_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = (r1 + 1)|0;
+	heap32[(r0)] = r2;
+	heap32[(g0)] = 83;
+	malloc(i7);
+	r2 = r_g0;
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r6 = heap32[(fp+4)];
+	r7 = heap32[(fp+5)];
+	r8 = heap32[(fp+6)];
+	if(r2 !=0) //_LBB104_2
+{
+	r9 = 0;
+	r10 = (r2 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r2 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r2;
+	r2 = r10;
+}
+	r9 = r2 >> 2;
+	heap32[(r9)] = r6;
+	heap16[(r2+4)>>1] = r7;
+	r4 = r4 >> 2;
+	heap16[(r2+6)>>1] = r8;
+	f0 = heapFloat[(r4)];
+	heapFloat[(r9+4)] = f0;
+	f1 = heapFloat[(r4+1)];
+	heapFloat[(r9+5)] = f1;
+	f2 = heapFloat[(r4+2)];
+	heapFloat[(r9+6)] = f2;
+	f3 = heapFloat[(r4+3)];
+	r4 = r5 >> 2;
+	heapFloat[(r9+7)] = f3;
+	f4 = heapFloat[(r4)];
+	heapFloat[(r9+8)] = f4;
+	f5 = heapFloat[(r4+1)];
+	heapFloat[(r9+9)] = f5;
+	f6 = heapFloat[(r4+2)];
+	heapFloat[(r9+10)] = f6;
+	f7 = heapFloat[(r4+3)];
+	heapFloat[(r9+11)] = f7;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+14)] = 0;
+	r4 = sp + -32;
+	heap32[(r9+13)] = 0;
+	r5 = r4 >> 2;
+	heapFloat[(fp+-8)] = f0;
+	heapFloat[(r5+1)] = f1;
+	heapFloat[(r5+2)] = f2;
+	heapFloat[(r5+3)] = f3;
+	heapFloat[(r5+4)] = f4;
+	heapFloat[(r5+5)] = f5;
+	heapFloat[(r5+6)] = f6;
+	r6 = r3 >> 2;
+	heapFloat[(r5+7)] = f7;
+	r5 = heap32[(r6+26)];
+	heap32[(r9+15)] = r5;
+	r5 = heap32[(r6+37)];
+	r5 = (r5 + 1)|0;
+	heap32[(r6+37)] = r5;
+	heap32[(r9+3)] = r5;
+	r5 = heap32[(r6+2)];
+	r7 = (r3 + 4)|0;
+	if(r5 ==0) //_LBB104_5
+{
+	r5 = (r1 + 2)|0;
+	heap32[(r0)] = r5;
+	heap32[(g0)] = 63;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB104_7
+{
+	r0 = 0;
+	r1 = (r5 + 4)|0;
+	r0 = (r0 - r1)|0;
+	r0 = r0 & 15;
+	r0 = (r5 + r0)|0;
+	r1 = (r0 + 4)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r5;
+	r5 = r1;
+}
+}
+else{
+	heap32[(r6+2)] = 0;
+}
+	r0 = r5 >> 2;
+	heap32[(r0+8)] = 0;
+	heap32[(r0+9)] = r2;
+	heap32[(r0+10)] = 0;
+	heapFloat[(r0)] = f0;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f2;
+	heapFloat[(r0+3)] = f3;
+	heapFloat[(r0+4)] = f4;
+	heapFloat[(r0+5)] = f5;
+	heapFloat[(r0+6)] = f6;
+	heapFloat[(r0+7)] = f7;
+	r0 = heap32[(r6+1)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r5;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r0 = heap32[(r6+4)];
+	r0 = (r0 + 1)|0;
+	heap32[(r6+4)] = r0;
+	heap32[(r9+12)] = r5;
+	r0 = heap32[(r6+26)];
+	r0 = r0 << 2;
+	r0 = (r3 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r9+13)] = 0;
+	r1 = heap32[(r0+21)];
+	heap32[(r9+14)] = r1;
+if(!(r1 ==0)) //_LBB104_10
+{
+	r1 = r1 >> 2;
+	heap32[(r1+13)] = r2;
+}
+	heap32[(r0+21)] = r2;
+	r0 = heapU8[r3+153];
+if(!(r0 !=0)) //_LBB104_12
+{
+	r0 = _ZTV18btDbvtTreeCollider;
+	r0 = (r0 + 8)|0;
+	r1 = sp + -48;
+	r5 = r1 >> 2;
+	heap32[(fp+-12)] = r0;
+	heap32[(r5+1)] = r3;
+	heap32[(r5+2)] = r2;
+	r3 = heap32[(r6+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	_ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(i7);
+	r3 = heap32[(r6+11)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	_ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(i7);
+	heap32[(fp+-12)] = r0;
+}
+	r_g0 = r2;
+	return;
+}
+
+function _ZNK6btDbvt15rayTestInternalEPK10btDbvtNodeRK9btVector3S5_S5_PjfS5_S5_RNS_8ICollideE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB105_43
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	f0 = heapFloat[(fp+4)];
+	r4 = heap32[(fp+5)];
+	r5 = heap32[(fp+6)];
+	r6 = heap32[(fp+7)];
+	r7 = gNumAlignedAllocs;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r8 = (r8 + 1)|0;
+	heap32[(r7)] = r8;
+	heap32[(g0)] = 531;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB105_3
+{
+	r9 = 0;
+	r10 = (r8 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r8 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = r10;
+}
+	r9 = 0;
+_6: while(true){
+	r10 = r9 << 2;
+	r10 = (r8 + r10)|0;
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = 0;
+if(!(r9 !=128)) //_LBB105_5
+{
+break _6;
+}
+}
+	r9 = 128;
+	r10 = 1;
+	r11 = 126;
+	r12 = r8 >> 2;
+	heap32[(r12)] = r0;
+	r0 = r9;
+	r12 = r10;
+_9: while(true){
+	r13 = r12;
+	r12 = (r13 + -1)|0;
+	r14 = r12 << 2;
+	r14 = (r8 + r14)|0;
+	r14 = r14 >> 2;
+	r14 = heap32[(r14)];
+	r15 = r14 >> 2;
+	r16 = r5 >> 2;
+	f1 = heapFloat[(r15+2)];
+	f2 = heapFloat[(r16+2)];
+	f3 = heapFloat[(r15+1)];
+	f4 = heapFloat[(r16+1)];
+	f5 = heapFloat[(r15)];
+	f6 = heapFloat[(r16)];
+	r16 = sp + -32;
+	f5 = f5-f6;
+	r17 = r16 >> 2;
+	f3 = f3-f4;
+	heapFloat[(fp+-8)] = f5;
+	f1 = f1-f2;
+	heapFloat[(r17+1)] = f3;
+	heapFloat[(r17+2)] = f1;
+	heap32[(r17+3)] = 0;
+	r18 = r4 >> 2;
+	f1 = heapFloat[(r15+6)];
+	f2 = heapFloat[(r18+2)];
+	f3 = heapFloat[(r15+5)];
+	f4 = heapFloat[(r18+1)];
+	f5 = heapFloat[(r15+4)];
+	f6 = heapFloat[(r18)];
+	f5 = f5-f6;
+	f3 = f3-f4;
+	heapFloat[(r17+4)] = f5;
+	f1 = f1-f2;
+	heapFloat[(r17+5)] = f3;
+	heapFloat[(r17+6)] = f1;
+	r18 = r3 >> 2;
+	heap32[(r17+7)] = 0;
+	r17 = heap32[(r18)];
+	r19 = heap32[(r18+1)];
+	r20 = (r10 - r19)|0;
+	r21 = r17 << 4;
+	r20 = r20 << 4;
+	r21 = (r16 + r21)|0;
+	r20 = (r16 + r20)|0;
+	r22 = r1 >> 2;
+	r21 = r21 >> 2;
+	r20 = r20 >> 2;
+	r23 = r2 >> 2;
+	f1 = heapFloat[(r21)];
+	f2 = heapFloat[(r22)];
+	f3 = heapFloat[(r20+1)];
+	f4 = heapFloat[(r22+1)];
+	f1 = f1-f2;
+	f5 = heapFloat[(r23)];
+	f3 = f3-f4;
+	f6 = heapFloat[(r23+1)];
+	f1 = f1*f5;
+	f3 = f3*f6;
+if(!(f1 >f3)) //_LBB105_9
+{
+	r17 = (r10 - r17)|0;
+	r17 = r17 << 4;
+	r19 = r19 << 4;
+	r17 = (r16 + r17)|0;
+	r19 = (r16 + r19)|0;
+	r17 = r17 >> 2;
+	r19 = r19 >> 2;
+	f7 = heapFloat[(r17)];
+	f8 = heapFloat[(r19+1)];
+	f2 = f7-f2;
+	f4 = f8-f4;
+	f2 = f2*f5;
+	f4 = f4*f6;
+	if(f4 <=f2) //_LBB105_10
+{
+	r17 = heap32[(r18+2)];
+	r18 = 1;
+	r18 = (r18 - r17)|0;
+	r18 = r18 << 4;
+	r18 = (r16 + r18)|0;
+	r18 = r18 >> 2;
+	f5 = heapFloat[(r18+2)];
+	f6 = heapFloat[(r22+2)];
+	f5 = f5-f6;
+	f7 = heapFloat[(r23+2)];
+	f1 = f1 < f4 ? f4 : f1;
+	f4 = f5*f7;
+if(!(f1 >f4)) //_LBB105_9
+{
+	r17 = r17 << 4;
+	r16 = (r16 + r17)|0;
+	r16 = r16 >> 2;
+	f5 = heapFloat[(r16+2)];
+	f5 = f5-f6;
+	f2 = f3 < f2 ? f3 : f2;
+	f3 = f5*f7;
+if(!(f3 >f2)) //_LBB105_9
+{
+	f1 = f1 < f3 ? f3 : f1;
+if(!(f1 >=f0)) //_LBB105_9
+{
+	f1 = f4 < f2 ? f4 : f2;
+	f2 =                         0;
+if(!(f1 <=f2)) //_LBB105_9
+{
+	r16 = heap32[(r15+10)];
+	if(r16 ==0) //_LBB105_39
+{
+	r13 = r6 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r14;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+}
+else{
+	if(r12 >r11) //_LBB105_17
+{
+	r14 = r0 << 1;
+_23: do {
+	if(r0 <=r14) //_LBB105_19
+{
+if(!(r0 >=r14)) //_LBB105_18
+{
+	if(r9 <r14) //_LBB105_22
+{
+	if(r14 !=0) //_LBB105_24
+{
+	r9 = heap32[(r7)];
+	r11 = r0 << 3;
+	r9 = (r9 + 1)|0;
+	r11 = r11 | 3;
+	heap32[(r7)] = r9;
+	r9 = (r11 + 16)|0;
+	heap32[(g0)] = r9;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB105_26
+{
+	r11 = 0;
+	r12 = (r9 + 4)|0;
+	r11 = (r11 - r12)|0;
+	r11 = r11 & 15;
+	r11 = (r9 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r9;
+	r9 = r12;
+}
+}
+else{
+	r9 = 0;
+}
+if(!(r0 <1)) //_LBB105_30
+{
+	r11 = r8;
+	r12 = r9;
+	r16 = r0;
+_35: while(true){
+	r17 = r11 >> 2;
+	r16 = (r16 + -1)|0;
+	r18 = (r12 + 4)|0;
+	r11 = (r11 + 4)|0;
+	r12 = r12 >> 2;
+	r17 = heap32[(r17)];
+	heap32[(r12)] = r17;
+	r12 = r18;
+if(!(r16 !=0)) //_LBB105_29
+{
+break _35;
+}
+}
+}
+if(!(r8 ==0)) //_LBB105_32
+{
+	r11 = gNumAlignedFree;
+	r11 = r11 >> 2;
+	r12 = heap32[(r11)];
+	r12 = (r12 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r11)] = r12;
+	r8 = heap32[(r8+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+}
+	if(r0 <r14) //_LBB105_34
+{
+	r8 = r9;
+	r9 = r14;
+}
+else{
+	r8 = r9;
+	r9 = r14;
+break _23;
+}
+}
+	r11 = r0;
+_45: while(true){
+	r12 = r0 << 2;
+	r12 = (r8 + r12)|0;
+	r11 = (r11 + -1)|0;
+	r0 = (r0 + 1)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = 0;
+if(!(r11 !=0)) //_LBB105_36
+{
+break _23;
+}
+}
+}
+}
+} while(0);
+	r11 = (r14 + -2)|0;
+}
+else{
+	r14 = r0;
+}
+	r0 = r13 << 2;
+	r0 = (r8 + r0)|0;
+	r0 = r0 >> 2;
+	r12 = heap32[(r15+9)];
+	heap32[(r0+-1)] = r12;
+	r15 = heap32[(r15+10)];
+	r12 = (r13 + 1)|0;
+	heap32[(r0)] = r15;
+	r0 = r14;
+}
+}
+}
+}
+}
+}
+}
+if(!(r12 !=0)) //_LBB105_7
+{
+break _9;
+}
+}
+if(!(r8 ==0)) //_LBB105_43
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r8 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	return;
+}
+
+function _ZN16btDbvtBroadphase7rayTestERK9btVector3S2_R23btBroadphaseRayCallbackS2_S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = _ZTV19BroadphaseRayTester;
+	r1 = sp + -8;
+	r0 = (r0 + 8)|0;
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp)];
+	r4 = r1 >> 2;
+	heap32[(fp+-2)] = r0;
+	heap32[(r4+1)] = r2;
+	r0 = r2 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r0+8)];
+	r4 = heap32[(r3+1)];
+	r5 = heap32[(fp+1)];
+	r6 = (r2 + 4)|0;
+	r2 = (r2 + 20)|0;
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+5)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r2;
+	heapFloat[(g0+4)] = f0;
+	heap32[(g0+5)] = r7;
+	heap32[(g0+6)] = r8;
+	heap32[(g0+7)] = r1;
+	_ZNK6btDbvt15rayTestInternalEPK10btDbvtNodeRK9btVector3S5_S5_PjfS5_S5_RNS_8ICollideE(i7);
+	f0 = heapFloat[(r0+8)];
+	r0 = heap32[(r3+11)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r2;
+	heapFloat[(g0+4)] = f0;
+	heap32[(g0+5)] = r7;
+	heap32[(g0+6)] = r8;
+	heap32[(g0+7)] = r1;
+	_ZNK6btDbvt15rayTestInternalEPK10btDbvtNodeRK9btVector3S5_S5_PjfS5_S5_RNS_8ICollideE(i7);
+	return;
+}
+
+function _ZN16btDbvtBroadphase12destroyProxyEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(r1+12)];
+	r5 = heap32[(r1+15)];
+	if(r5 !=2) //_LBB107_4
+{
+	r5 = (r2 + 4)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	r5 = r2 >> 2;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r6 = heap32[(r5+2)];
+if(!(r6 ==0)) //_LBB107_6
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r8 = (r8 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r7)] = r8;
+	r6 = heap32[(r6+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	heap32[(r5+2)] = r4;
+	r4 = heap32[(r5+4)];
+	r4 = (r4 + -1)|0;
+	heap32[(r5+4)] = r4;
+}
+else{
+	r5 = (r2 + 44)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	r5 = r2 >> 2;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r6 = heap32[(r5+12)];
+if(!(r6 ==0)) //_LBB107_3
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r8 = (r8 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r7)] = r8;
+	r6 = heap32[(r6+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	heap32[(r5+12)] = r4;
+	r4 = heap32[(r5+14)];
+	r4 = (r4 + -1)|0;
+	heap32[(r5+14)] = r4;
+}
+	r4 = heap32[(r1+13)];
+	r5 = heap32[(r1+14)];
+	if(r4 ==0) //_LBB107_9
+{
+	r4 = heap32[(r1+15)];
+	r4 = r4 << 2;
+	r4 = (r2 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4+21)] = r5;
+}
+else{
+	r4 = r4 >> 2;
+	heap32[(r4+14)] = r5;
+}
+	r4 = heap32[(r1+14)];
+if(!(r4 ==0)) //_LBB107_12
+{
+	r4 = r4 >> 2;
+	r5 = heap32[(r1+13)];
+	heap32[(r4+13)] = r5;
+}
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+24)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+if(!(r0 ==0)) //_LBB107_14
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r3 = heap32[(r0)];
+	r3 = (r3 + 1)|0;
+	heap32[(r0)] = r3;
+	r0 = heap32[(r1+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = 1;
+	heap8[r2+154] = r0;
+	return;
+}
+
+function _ZN16btDbvtBroadphase25calculateOverlappingPairsEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+4)];
+	r3 = heap32[(r1+28)];
+	r2 = (r3 * r2)|0;
+	r2 = (r2 / 100)|0;
+	r3 = (r0 + 4)|0;
+	r2 = (r2 + 1)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	_ZN6btDbvt19optimizeIncrementalEi(i7);
+	r2 = heap32[(r1+31)];
+if(!(r2 ==0)) //_LBB108_2
+{
+	r2 = heap32[(r1+14)];
+	r4 = heap32[(r1+27)];
+	r2 = (r4 * r2)|0;
+	r4 = (r2 / 100)|0;
+	r5 = (r0 + 44)|0;
+	r4 = (r4 + 1)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	_ZN6btDbvt19optimizeIncrementalEi(i7);
+	r2 = (r2 / -100)|0;
+	r4 = heap32[(r1+31)];
+	r2 = (r2 + r4)|0;
+	r2 = (r2 + -1)|0;
+	r4 = 0;
+	r2 = r2 < 0 ? r4 : r2;
+	heap32[(r1+31)] = r2;
+}
+	r2 = heap32[(r1+26)];
+	r2 = (r2 + 1)|0;
+	r4 = r2 >>> 31;
+	r4 = (r2 + r4)|0;
+	r4 = r4 & -2;
+	r2 = (r2 - r4)|0;
+	r4 = r2 << 2;
+	r4 = (r0 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r1+26)] = r2;
+	r2 = heap32[(r4+21)];
+if(!(r2 ==0)) //_LBB108_20
+{
+	r4 = (r0 + 44)|0;
+_6: while(true){
+	r5 = r2 >> 2;
+	r6 = heap32[(r5+13)];
+	r7 = heap32[(r5+14)];
+	if(r6 ==0) //_LBB108_6
+{
+	r6 = heap32[(r5+15)];
+	r6 = r6 << 2;
+	r6 = (r0 + r6)|0;
+	r6 = r6 >> 2;
+	heap32[(r6+21)] = r7;
+}
+else{
+	r6 = r6 >> 2;
+	heap32[(r6+14)] = r7;
+}
+	r6 = heap32[(r5+14)];
+if(!(r6 ==0)) //_LBB108_9
+{
+	r6 = r6 >> 2;
+	r8 = heap32[(r5+13)];
+	heap32[(r6+13)] = r8;
+}
+	heap32[(r5+13)] = 0;
+	r6 = heap32[(r1+23)];
+	heap32[(r5+14)] = r6;
+	r6 = heap32[(r1+23)];
+if(!(r6 ==0)) //_LBB108_11
+{
+	r6 = r6 >> 2;
+	heap32[(r6+13)] = r2;
+}
+	heap32[(r1+23)] = r2;
+	r6 = heap32[(r5+12)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r8 = heap32[(r1+2)];
+if(!(r8 ==0)) //_LBB108_13
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r10 = (r10 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r9)] = r10;
+	r8 = heap32[(r8+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+}
+	heap32[(r1+2)] = r6;
+	r6 = heap32[(r1+4)];
+	r6 = (r6 + -1)|0;
+	heap32[(r1+4)] = r6;
+	r6 = heap32[(r1+12)];
+	f0 = heapFloat[(r5+4)];
+	f1 = heapFloat[(r5+5)];
+	f2 = heapFloat[(r5+6)];
+	f3 = heapFloat[(r5+7)];
+	f4 = heapFloat[(r5+8)];
+	f5 = heapFloat[(r5+9)];
+	f6 = heapFloat[(r5+10)];
+	f7 = heapFloat[(r5+11)];
+	if(r6 ==0) //_LBB108_15
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r8 = heap32[(r6)];
+	r8 = (r8 + 1)|0;
+	heap32[(r6)] = r8;
+	heap32[(g0)] = 63;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB108_17
+{
+	r8 = 0;
+	r9 = (r6 + 4)|0;
+	r8 = (r8 - r9)|0;
+	r8 = r8 & 15;
+	r8 = (r6 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r6;
+	r6 = r9;
+}
+}
+else{
+	heap32[(r1+12)] = 0;
+}
+	r8 = r6 >> 2;
+	heap32[(r8+8)] = 0;
+	heap32[(r8+9)] = r2;
+	heap32[(r8+10)] = 0;
+	heapFloat[(r8)] = f0;
+	heapFloat[(r8+1)] = f1;
+	heapFloat[(r8+2)] = f2;
+	heapFloat[(r8+3)] = f3;
+	heapFloat[(r8+4)] = f4;
+	heapFloat[(r8+5)] = f5;
+	heapFloat[(r8+6)] = f6;
+	heapFloat[(r8+7)] = f7;
+	r2 = heap32[(r1+11)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r6;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r2 = heap32[(r1+14)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+14)] = r2;
+	heap32[(r5+12)] = r6;
+	heap32[(r5+15)] = 2;
+	r2 = r7;
+if(!(r7 !=0)) //_LBB108_4
+{
+break _6;
+}
+}
+	r2 = heap32[(r1+14)];
+	r4 = 1;
+	heap32[(r1+31)] = r2;
+	heap8[r0+154] = r4;
+}
+	r2 = _ZTV18btDbvtTreeCollider;
+	r4 = sp + -32;
+	r2 = (r2 + 8)|0;
+	r5 = r4 >> 2;
+	heap32[(fp+-8)] = r2;
+	heap32[(r5+1)] = r0;
+	r5 = heapU8[r0+153];
+if(!(r5 ==0)) //_LBB108_23
+{
+	r5 = heap32[(r1+11)];
+	r6 = heap32[(r1+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r4;
+	_ZN6btDbvt24collideTTpersistentStackEPK10btDbvtNodeS2_RNS_8ICollideE(i7);
+	r5 = heapU8[r0+153];
+if(!(r5 ==0)) //_LBB108_23
+{
+	r5 = heap32[(r1+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r4;
+	_ZN6btDbvt24collideTTpersistentStackEPK10btDbvtNodeS2_RNS_8ICollideE(i7);
+}
+}
+	r3 = heap32[(fp+1)];
+	heap32[(fp+-8)] = r2;
+	r2 = heapU8[r0+154];
+_32: do {
+if(!(r2 ==0)) //_LBB108_40
+{
+	r2 = heap32[(r1+24)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r2 = r_g0;
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+1)];
+if(!(r4 <1)) //_LBB108_40
+{
+	r5 = heap32[(r1+29)];
+	r5 = (r5 * r4)|0;
+	r6 = heap32[(r1+30)];
+	r5 = (r5 / 100)|0;
+	r5 = r6 > r5 ? r6 : r5;
+	r5 = r4 < r5 ? r4 : r5;
+	if(r5 >0) //_LBB108_27
+{
+	r4 = 0;
+_37: while(true){
+	r6 = r2 >> 2;
+	r7 = heap32[(r1+36)];
+	r7 = (r7 + r4)|0;
+	r8 = heap32[(r6+1)];
+	r7 = (r7 % r8)|0;
+	r8 = heap32[(r6+3)];
+	r7 = r7 << 4;
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7+1)];
+	r7 = heap32[(r7)];
+	r9 = r8 >> 2;
+	r10 = r7 >> 2;
+	r9 = heap32[(r9+12)];
+	r10 = heap32[(r10+12)];
+	r10 = r10 >> 2;
+	r9 = r9 >> 2;
+	f0 = heapFloat[(r10)];
+	f1 = heapFloat[(r9+4)];
+	if(f0 >f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+	f0 = heapFloat[(r10+4)];
+	f1 = heapFloat[(r9)];
+	if(f0 <f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+	f0 = heapFloat[(r10+1)];
+	f1 = heapFloat[(r9+5)];
+	if(f0 >f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+	f0 = heapFloat[(r10+5)];
+	f1 = heapFloat[(r9+1)];
+	if(f0 <f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+	f0 = heapFloat[(r10+2)];
+	f1 = heapFloat[(r9+6)];
+	if(f0 >f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+	f0 = heapFloat[(r10+6)];
+	f1 = heapFloat[(r9+2)];
+	if(f0 <f1) //_LBB108_35
+{
+__label__ = 32;
+}
+else{
+__label__ = 33;
+}
+}
+}
+}
+}
+}
+if (__label__ == 32){
+	r9 = heap32[(r1+24)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+3)];
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r3;
+	r5 = (r5 + -1)|0;
+	r4 = (r4 + -1)|0;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+}
+	r4 = (r4 + 1)|0;
+if(!(r4 <r5)) //_LBB108_28
+{
+break _37;
+}
+}
+	r4 = heap32[(r6+1)];
+	if(r4 <1) //_LBB108_39
+{
+	heap32[(r1+36)] = 0;
+break _32;
+}
+}
+	r2 = heap32[(r1+36)];
+	r2 = (r2 + r5)|0;
+	r2 = (r2 % r4)|0;
+	heap32[(r1+36)] = r2;
+}
+}
+} while(0);
+	r2 = heap32[(r1+35)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+35)] = r2;
+	r2 = 0;
+	heap32[(r1+30)] = 1;
+	heap8[r0+154] = r2;
+	r0 = heap32[(r1+32)];
+	if(r0 ==0) //_LBB108_42
+{
+	heap32[(r1+34)] = 0;
+	r4 = heap32[(r1+33)];
+}
+else{
+	r4 = heap32[(r1+33)];
+	f0 = uint(r4); //fuitos r4, f0
+	f1 = uint(r0); //fuitos r0, f1
+	f0 = f0/f1;
+	heapFloat[(r1+34)] = f0;
+}
+	r4 = r4 >>> 1;
+	r0 = r0 >>> 1;
+	heap32[(r1+33)] = r4;
+	heap32[(r1+32)] = r0;
+	r0 = heap32[(r1+24)];
+	r4 = r0 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+14)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB108_65
+{
+	r0 = heap32[(r1+24)];
+	r4 = r0 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = r_g0;
+	r4 = r0 >> 2;
+	r4 = heap32[(r4+1)];
+if(!(r4 <2)) //_LBB108_46
+{
+	r4 = (r4 + -1)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r4;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+}
+	r4 = r2;
+	r5 = r2;
+	r6 = r2;
+	r7 = r2;
+_61: while(true){
+	r8 = r0 >> 2;
+	r9 = heap32[(r8+1)];
+	if(r9 >r7) //_LBB108_47
+{
+	r8 = heap32[(r8+3)];
+	r9 = r7 << 4;
+	r9 = (r8 + r9)|0;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r11 = r7 << 2;
+	r12 = heap32[(r9+1)];
+	if(r10 !=r4) //_LBB108_49
+{
+__label__ = 46;
+}
+else{
+	if(r12 ==r5) //_LBB108_56
+{
+	r4 = heap32[(r9+2)];
+	if(r4 ==0) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+__label__ = 53;
+break _61;
+}
+}
+else{
+__label__ = 46;
+}
+}
+if (__label__ == 46){
+	r4 = r12 >> 2;
+	r5 = r10 >> 2;
+	r4 = heap32[(r4+12)];
+	r5 = heap32[(r5+12)];
+	r5 = r5 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r5)];
+	f1 = heapFloat[(r4+4)];
+	if(f0 >f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+	f0 = heapFloat[(r5+4)];
+	f1 = heapFloat[(r4)];
+	if(f0 <f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+	f0 = heapFloat[(r5+1)];
+	f1 = heapFloat[(r4+5)];
+	if(f0 >f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+	f0 = heapFloat[(r5+5)];
+	f1 = heapFloat[(r4+1)];
+	if(f0 <f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+	f0 = heapFloat[(r5+2)];
+	f1 = heapFloat[(r4+6)];
+	if(f0 >f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+	f0 = heapFloat[(r5+6)];
+	f1 = heapFloat[(r4+2)];
+	if(f0 <f1) //_LBB108_58
+{
+__label__ = 54;
+}
+else{
+__label__ = 55;
+}
+}
+}
+}
+}
+}
+}
+if (__label__ == 54){
+	r4 = heap32[(r1+24)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+8)];
+	r9 = (r8 + r2)|0;
+	r11 = r11 << 2;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r3;
+	r4 = (r8 + r11)|0;
+	r4 = r4 >> 2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r6 = (r6 + 1)|0;
+	heap32[(r4)] = 0;
+	heap32[(r4+1)] = 0;
+}
+	r7 = (r7 + 1)|0;
+	r2 = (r2 + 16)|0;
+	r4 = r10;
+	r5 = r12;
+}
+else{
+__label__ = 57;
+break _61;
+}
+}
+switch(__label__ ){//multiple entries
+case 57:
+	if(r9 >1) //_LBB108_63
+{
+	r9 = (r9 + -1)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r9;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+	r9 = heap32[(r8+1)];
+}
+	r1 = sp + -16;
+	r2 = r1 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	r2 = (r9 - r6)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE6resizeEiRKS0_(i7);
+break;
+case 53:
+	r8 = _2E_str314;
+	r0 = _2E_str18;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 469;
+	_assert(i7);
+break;
+}
+}
+	return;
+}
+
+function _ZN16btDbvtBroadphase7setAabbEP17btBroadphaseProxyRK9btVector3S4_P12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+var __label__ = 0;
+	i7 = sp + -88;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	r1 = sp + -32;
+	heapFloat[(fp+-8)] = f0;
+	f1 = heapFloat[(r0+1)];
+	r2 = r1 >> 2;
+	heapFloat[(r2+1)] = f1;
+	f2 = heapFloat[(r0+2)];
+	heapFloat[(r2+2)] = f2;
+	f3 = heapFloat[(r0+3)];
+	r3 = heap32[(fp+3)];
+	r3 = r3 >> 2;
+	heapFloat[(r2+3)] = f3;
+	f4 = heapFloat[(r3)];
+	heapFloat[(r2+4)] = f4;
+	f5 = heapFloat[(r3+1)];
+	heapFloat[(r2+5)] = f5;
+	f6 = heapFloat[(r3+2)];
+	heapFloat[(r2+6)] = f6;
+	f7 = heapFloat[(r3+3)];
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp)];
+	r6 = r4 >> 2;
+	heapFloat[(r2+7)] = f7;
+	r7 = heap32[(r6+15)];
+_1: do {
+	if(r7 !=2) //_LBB109_9
+{
+	r2 = r5 >> 2;
+	r8 = heap32[(r2+32)];
+	r8 = (r8 + 1)|0;
+	heap32[(r2+32)] = r8;
+	r8 = heap32[(r6+12)];
+	r7 = r8 >> 2;
+	f8 = heapFloat[(r7)];
+if(!(f8 >f4)) //_LBB109_24
+{
+	f8 = heapFloat[(r7+4)];
+if(!(f8 <f0)) //_LBB109_24
+{
+	f8 = heapFloat[(r7+1)];
+if(!(f8 >f5)) //_LBB109_24
+{
+	f8 = heapFloat[(r7+5)];
+if(!(f8 <f1)) //_LBB109_24
+{
+	f8 = heapFloat[(r7+2)];
+if(!(f8 >f6)) //_LBB109_24
+{
+	f8 = heapFloat[(r7+6)];
+if(!(f8 <f2)) //_LBB109_24
+{
+	f0 = heapFloat[(r6+4)];
+	f1 = heapFloat[(r6+8)];
+	f1 = f1-f0;
+	f2 =                       0.5;
+	f3 = heapFloat[(r6+5)];
+	f4 = heapFloat[(r6+9)];
+	f4 = f4-f3;
+	f5 = heapFloat[(r0+1)];
+	f6 = heapFloat[(r0)];
+	f1 = f1*f2;
+	f7 = heapFloat[(r2+25)];
+	f8 = heapFloat[(r0+2)];
+	f9 = heapFloat[(r6+6)];
+	f10 = heapFloat[(r6+10)];
+	r7 = sp + -48;
+	f10 = f10-f9;
+	f4 = f4*f2;
+	f1 = f1*f7;
+	f2 = f10*f2;
+	f4 = f4*f7;
+	r9 = r7 >> 2;
+	heapFloat[(fp+-12)] = f1;
+	f2 = f2*f7;
+	heapFloat[(r9+1)] = f4;
+	heapFloat[(r9+2)] = f2;
+	heap32[(r9+3)] = 0;
+	f0 = f6-f0;
+	f6 =                         0;
+if(!(f0 >=f6)) //_LBB109_17
+{
+	f0 = -f1;
+	heapFloat[(fp+-12)] = f0;
+}
+	f0 = f5-f3;
+if(!(f0 >=f6)) //_LBB109_19
+{
+	f0 = -f4;
+	heapFloat[(r9+1)] = f0;
+}
+	f0 = f8-f9;
+if(!(f0 >=f6)) //_LBB109_21
+{
+	f0 = -f2;
+	heapFloat[(r9+2)] = f0;
+}
+	r9 = (r5 + 4)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = 1028443341;
+	_ZN6btDbvt6updateEP10btDbvtNodeR12btDbvtAabbMmRK9btVector3f(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB109_23
+{
+	r7 = heap32[(r2+33)];
+	r8 = 1;
+	r7 = (r7 + 1)|0;
+	heap32[(r2+33)] = r7;
+break _1;
+}
+else{
+	r8 = 0;
+break _1;
+}
+}
+}
+}
+}
+}
+}
+	r1 = (r5 + 4)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r8;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r9 = r_g0;
+_23: do {
+	if(r9 !=0) //_LBB109_26
+{
+	r11 = heap32[(r2+3)];
+	if(r11 <0) //_LBB109_31
+{
+	r10 = heap32[(r2+1)];
+}
+else{
+	r12 = -1;
+_28: while(true){
+	r10 = r9;
+	r12 = (r12 + 1)|0;
+	if(r11 >r12) //_LBB109_30
+{
+	r9 = r10 >> 2;
+	r9 = heap32[(r9+8)];
+	if(r9 ==0) //_LBB109_29
+{
+break _23;
+}
+}
+else{
+break _23;
+}
+}
+}
+}
+else{
+	r10 = 0;
+}
+} while(0);
+	heapFloat[(r7)] = f0;
+	heapFloat[(r7+1)] = f1;
+	heapFloat[(r7+2)] = f2;
+	heapFloat[(r7+3)] = f3;
+	heapFloat[(r7+4)] = f4;
+	heapFloat[(r7+5)] = f5;
+	heapFloat[(r7+6)] = f6;
+	heapFloat[(r7+7)] = f7;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r8;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r1 = heap32[(r2+33)];
+	r8 = 1;
+	r1 = (r1 + 1)|0;
+	heap32[(r2+33)] = r1;
+}
+else{
+	r1 = heap32[(r6+12)];
+	r7 = (r5 + 44)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r1;
+	r7 = r5 >> 2;
+	_ZL10removeleafP6btDbvtP10btDbvtNode(i7);
+	r8 = heap32[(r7+12)];
+if(!(r8 ==0)) //_LBB109_3
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r10 = (r10 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r9)] = r10;
+	r8 = heap32[(r8+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+}
+	heap32[(r7+12)] = r1;
+	r1 = heap32[(r7+14)];
+	r1 = (r1 + -1)|0;
+	heap32[(r7+14)] = r1;
+	r1 = heap32[(r7+2)];
+	r8 = (r5 + 4)|0;
+	if(r1 ==0) //_LBB109_5
+{
+	r1 = gNumAlignedAllocs;
+	r1 = r1 >> 2;
+	r9 = heap32[(r1)];
+	r9 = (r9 + 1)|0;
+	heap32[(r1)] = r9;
+	heap32[(g0)] = 63;
+	malloc(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB109_7
+{
+	r9 = 0;
+	r10 = (r1 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r1 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r1;
+	r1 = r10;
+}
+}
+else{
+	heap32[(r7+2)] = 0;
+}
+	r9 = r1 >> 2;
+	heap32[(r9+8)] = 0;
+	heap32[(r9+9)] = r4;
+	heap32[(r9+10)] = 0;
+	heap32[(r9)] = heap32[(fp+-8)];
+	heap32[(r9+1)] = heap32[(r2+1)];
+	heap32[(r9+2)] = heap32[(r2+2)];
+	heap32[(r9+3)] = heap32[(r2+3)];
+	heapFloat[(r9+4)] = f4;
+	heapFloat[(r9+5)] = f5;
+	heapFloat[(r9+6)] = f6;
+	heapFloat[(r9+7)] = f7;
+	r2 = heap32[(r7+1)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	_ZL10insertleafP6btDbvtP10btDbvtNodeS2_(i7);
+	r2 = heap32[(r7+4)];
+	r2 = (r2 + 1)|0;
+	r8 = 1;
+	heap32[(r7+4)] = r2;
+	heap32[(r6+12)] = r1;
+}
+} while(0);
+	r1 = heap32[(r6+13)];
+	r2 = heap32[(r6+14)];
+	if(r1 ==0) //_LBB109_35
+{
+	r1 = heap32[(r6+15)];
+	r1 = r1 << 2;
+	r1 = (r5 + r1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1+21)] = r2;
+}
+else{
+	r1 = r1 >> 2;
+	heap32[(r1+14)] = r2;
+}
+	r1 = heap32[(r6+14)];
+if(!(r1 ==0)) //_LBB109_38
+{
+	r1 = r1 >> 2;
+	r2 = heap32[(r6+13)];
+	heap32[(r1+13)] = r2;
+}
+	heap32[(r6+4)] = heap32[(r0)];
+	heap32[(r6+5)] = heap32[(r0+1)];
+	heap32[(r6+6)] = heap32[(r0+2)];
+	heap32[(r6+7)] = heap32[(r0+3)];
+	heap32[(r6+8)] = heap32[(r3)];
+	heap32[(r6+9)] = heap32[(r3+1)];
+	heap32[(r6+10)] = heap32[(r3+2)];
+	r0 = r5 >> 2;
+	heap32[(r6+11)] = heap32[(r3+3)];
+	r1 = heap32[(r0+26)];
+	heap32[(r6+15)] = r1;
+	r1 = heap32[(r0+26)];
+	r1 = r1 << 2;
+	r1 = (r5 + r1)|0;
+	r1 = r1 >> 2;
+	heap32[(r6+13)] = 0;
+	r2 = heap32[(r1+21)];
+	heap32[(r6+14)] = r2;
+	r2 = heap32[(r1+21)];
+if(!(r2 ==0)) //_LBB109_40
+{
+	r2 = r2 >> 2;
+	heap32[(r2+13)] = r4;
+}
+	r2 = r8 & 1;
+	heap32[(r1+21)] = r4;
+if(!(r2 ==0)) //_LBB109_43
+{
+	r1 = 1;
+	heap8[r5+154] = r1;
+	r1 = heapU8[r5+153];
+if(!(r1 !=0)) //_LBB109_43
+{
+	r1 = _ZTV18btDbvtTreeCollider;
+	r2 = sp + -64;
+	r1 = (r1 + 8)|0;
+	r3 = r2 >> 2;
+	heap32[(fp+-16)] = r1;
+	heap32[(r3+1)] = r5;
+	r1 = heap32[(r6+12)];
+	r3 = heap32[(r0+11)];
+	r4 = (r5 + 44)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r2;
+	_ZN6btDbvt24collideTTpersistentStackEPK10btDbvtNodeS2_RNS_8ICollideE(i7);
+	r1 = heap32[(r6+12)];
+	r0 = heap32[(r0+1)];
+	r3 = (r5 + 4)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r2;
+	_ZN6btDbvt24collideTTpersistentStackEPK10btDbvtNodeS2_RNS_8ICollideE(i7);
+}
+}
+	return;
+}
+
+function _ZN16btDbvtBroadphaseD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btDbvtBroadphase;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+152];
+if(!(r1 ==0)) //_LBB110_3
+{
+	r1 = heap32[(r2+24)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+24)];
+if(!(r1 ==0)) //_LBB110_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r3;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = (r0 + 4)|0;
+if(!(r1 ==0)) //_LBB110_15
+{
+	r2 = (r1 + 80)|0;
+if(!(r2 ==r1)) //_LBB110_15
+{
+	r1 = (r0 + 44)|0;
+	r2 = 0;
+_8: while(true){
+	r3 = (r0 + r2)|0;
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+11)];
+if(!(r5 ==0)) //_LBB110_8
+{
+	r6 = (r1 + r2)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+}
+	r5 = heap32[(r4+12)];
+if(!(r5 ==0)) //_LBB110_10
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r6)] = r7;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = -1;
+	r5 = heap32[(r4+19)];
+if(!(r5 ==0)) //_LBB110_14
+{
+	r6 = heapU8[r3+80];
+if(!(r6 ==0)) //_LBB110_13
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r6)] = r7;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r4+19)] = 0;
+}
+	r5 = 1;
+	heap32[(r4+15)] = 0;
+	heap8[r3+80] = r5;
+	heap32[(r4+19)] = 0;
+	r2 = (r2 + -40)|0;
+	heap32[(r4+17)] = 0;
+	heap32[(r4+18)] = 0;
+	if(r2 !=-80) //_LBB110_6
+{
+continue _8;
+}
+else{
+break _8;
+}
+}
+}
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btDbvtBroadphaseD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btDbvtBroadphase;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+152];
+if(!(r1 ==0)) //_LBB111_3
+{
+	r1 = heap32[(r2+24)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+24)];
+if(!(r1 ==0)) //_LBB111_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r3;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = (r0 + 4)|0;
+if(!(r1 ==0)) //_LBB111_15
+{
+	r2 = (r1 + 80)|0;
+if(!(r2 ==r1)) //_LBB111_15
+{
+	r1 = (r0 + 44)|0;
+	r2 = 0;
+_8: while(true){
+	r3 = (r0 + r2)|0;
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+11)];
+if(!(r5 ==0)) //_LBB111_8
+{
+	r6 = (r1 + r2)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	_ZL17recursedeletenodeP6btDbvtP10btDbvtNode(i7);
+}
+	r5 = heap32[(r4+12)];
+if(!(r5 ==0)) //_LBB111_10
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r6)] = r7;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = -1;
+	r5 = heap32[(r4+19)];
+if(!(r5 ==0)) //_LBB111_14
+{
+	r6 = heapU8[r3+80];
+if(!(r6 ==0)) //_LBB111_13
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r6)] = r7;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r4+19)] = 0;
+}
+	r5 = 1;
+	heap32[(r4+15)] = 0;
+	heap8[r3+80] = r5;
+	heap32[(r4+19)] = 0;
+	r2 = (r2 + -40)|0;
+	heap32[(r4+17)] = 0;
+	heap32[(r4+18)] = 0;
+	if(r2 !=-80) //_LBB111_6
+{
+continue _8;
+}
+else{
+break _8;
+}
+}
+}
+}
+	return;
+}
+
+function _ZN12btDispatcherD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btDispatcher;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN12btDispatcherD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btDispatcher;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+60];
+	if(r1 !=0) //_LBB114_2
+{
+	r1 = heap32[(fp+2)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1)];
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0+5)];
+	if(f0 <=f1) //_LBB114_4
+{
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r0+6)];
+	if(f1 <=f2) //_LBB114_6
+{
+	f2 = heapFloat[(r1+2)];
+	f3 = heapFloat[(r0+7)];
+	if(f2 <=f3) //_LBB114_8
+{
+	f3 = heapFloat[(r0+1)];
+	if(f0 >=f3) //_LBB114_10
+{
+	f4 = heapFloat[(r0+2)];
+	if(f1 >=f4) //_LBB114_12
+{
+	f5 = heapFloat[(r0+3)];
+	if(f2 >=f5) //_LBB114_14
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+3)];
+	f2 = f2-f5;
+	f5 = heapFloat[(r0+11)];
+	f1 = f1-f4;
+	f4 = heapFloat[(r0+10)];
+	f0 = f0-f3;
+	f3 = heapFloat[(r0+9)];
+	f2 = f2*f5;
+	f1 = f1*f4;
+	f0 = f0*f3;
+	if(r2 ==0) //_LBB114_16
+{
+	r0 = Math.floor(f0);
+	r2 = Math.floor(f1);
+	r0 = r0 & 65534;
+	r3 = Math.floor(f2);
+	r2 = r2 & 65534;
+	heap16[(r1)>>1] = r0;
+	r0 = r3 & 65534;
+}
+else{
+	f3 =                         1;
+	f0 = f0+f3;
+	f1 = f1+f3;
+	r0 = Math.floor(f0);
+	f0 = f2+f3;
+	r2 = Math.floor(f1);
+	r0 = r0 | 1;
+	r3 = Math.floor(f0);
+	r2 = r2 | 1;
+	heap16[(r1)>>1] = r0;
+	r0 = r3 | 1;
+}
+	heap16[(r1+2)>>1] = r2;
+	heap16[(r1+4)>>1] = r0;
+	return;
+}
+else{
+	r0 = _2E_str9;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 361;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str820;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 360;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str717;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 359;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str616;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 357;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str515;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 356;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str414;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 355;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str212;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 353;
+	_assert(i7);
+}
+}
+
+function _ZN20btAlignedObjectArrayI18btQuantizedBvhNodeE7reserveEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+2)];
+if(!(r3 >=r1)) //_LBB115_16
+{
+	if(r1 !=0) //_LBB115_3
+{
+	r3 = gNumAlignedAllocs;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r5 = r1 << 4;
+	r4 = (r4 + 1)|0;
+	r5 = r5 | 3;
+	heap32[(r3)] = r4;
+	r3 = (r5 + 16)|0;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB115_5
+{
+	r4 = 0;
+	r5 = (r3 + 4)|0;
+	r4 = (r4 - r5)|0;
+	r4 = r4 & 15;
+	r4 = (r3 + r4)|0;
+	r5 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = r5;
+}
+}
+else{
+	r3 = 0;
+}
+	r4 = heap32[(r2+1)];
+	r5 = (r0 + 12)|0;
+	if(r4 <1) //_LBB115_8
+{
+	r4 = r5 >> 2;
+	r7 = heap32[(r4)];
+}
+else{
+	r6 = 0;
+_11: while(true){
+	r7 = r5 >> 2;
+	r7 = heap32[(r7)];
+	r8 = r6 << 4;
+	r9 = heapU16[(r7+r8)>>1];
+	r10 = (r7 + r8)|0;
+	heap16[(r3+r8)>>1] = r9;
+	r8 = (r3 + r8)|0;
+	r9 = heapU16[(r10+2)>>1];
+	heap16[(r8+2)>>1] = r9;
+	r9 = heapU16[(r10+4)>>1];
+	heap16[(r8+4)>>1] = r9;
+	r9 = heapU16[(r10+6)>>1];
+	heap16[(r8+6)>>1] = r9;
+	r9 = heapU16[(r10+8)>>1];
+	heap16[(r8+8)>>1] = r9;
+	r9 = heapU16[(r10+10)>>1];
+	r10 = r10 >> 2;
+	heap16[(r8+10)>>1] = r9;
+	r6 = (r6 + 1)|0;
+	r8 = r8 >> 2;
+	r9 = heap32[(r10+3)];
+	heap32[(r8+3)] = r9;
+if(!(r4 !=r6)) //_LBB115_9
+{
+break _11;
+}
+}
+	r5 = (r0 + 12)|0;
+}
+if(!(r7 ==0)) //_LBB115_15
+{
+	r4 = heapU8[r0+16];
+if(!(r4 ==0)) //_LBB115_14
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r6 = heap32[(r4)];
+	r6 = (r6 + 1)|0;
+	r7 = r7 >> 2;
+	heap32[(r4)] = r6;
+	r4 = heap32[(r7+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r5 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r5 = r5 >> 2;
+	heap8[r0+16] = r4;
+	heap32[(r5)] = r3;
+	heap32[(r2+2)] = r1;
+}
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache23getOverlappingPairArrayEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = (r0 + 4)|0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	heap32[(r0+6)] = r1;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache18hasDeferredRemovalEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	heap32[(r0+18)] = r1;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+if(!(r1 ==0)) //_LBB120_2
+{
+	r2 = heap32[(fp+2)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = r2 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+13)];
+	r3 = heap32[(r0+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	heap32[(r0+2)] = 0;
+}
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallback14processOverlapER16btBroadphasePair(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+1)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3)];
+	if(r4 ==r2) //_LBB123_2
+{
+__label__ = 2;
+}
+else{
+	r3 = heap32[(r3+1)];
+	if(r3 !=r2) //_LBB123_3
+{
+__label__ = 3;
+}
+else{
+__label__ = 2;
+}
+}
+if (__label__ == 2){
+	r2 = heap32[(r0+2)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+8)];
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallback14processOverlapER16btBroadphasePair(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r0 = heap32[(r0+1)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	if(r2 ==r0) //_LBB126_2
+{
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r1 = heap32[(r1+1)];
+	r0 = r1 == r0;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK28btHashedOverlappingPairCache22getNumOverlappingPairsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = 0;
+	r4 = r3;
+_1: while(true){
+	r5 = r4 << 2;
+_3: while(true){
+	r6 = r0 >> 2;
+	r7 = heap32[(r6+2)];
+	if(r7 >r4) //_LBB130_1
+{
+	r7 = r1 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r8 = heap32[(r6+4)];
+	r7 = heap32[(r7+2)];
+	r9 = (r8 + r3)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r9;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r_g0;
+	if(r7 ==0) //_LBB130_3
+{
+break _3;
+}
+else{
+	r7 = r5 << 2;
+	r6 = heap32[(r6)];
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+	r8 = heap32[(r7+1)];
+	r7 = heap32[(r7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r2;
+	r7 = gOverlappingPairs;
+	r7 = r7 >> 2;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(r7)];
+	r6 = (r6 + -1)|0;
+	heap32[(r7)] = r6;
+continue _3;
+}
+}
+else{
+break _1;
+}
+}
+	r4 = (r4 + 1)|0;
+	r3 = (r3 + 16)|0;
+continue _1;
+}
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = _ZTVZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback;
+	r1 = sp + -8;
+	r0 = (r0 + 8)|0;
+	r2 = heap32[(fp)];
+	r3 = r1 >> 2;
+	r4 = heap32[(fp+1)];
+	heap32[(fp+-2)] = r0;
+	r0 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+12)];
+	r3 = heap32[(fp+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = _ZTVZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback;
+	r1 = sp + -16;
+	r0 = (r0 + 8)|0;
+	r2 = r1 >> 2;
+	r3 = heap32[(fp+1)];
+	heap32[(fp+-4)] = r0;
+	r0 = heap32[(fp)];
+	heap32[(r2+1)] = r3;
+	r3 = heap32[(fp+2)];
+	heap32[(r2+2)] = r0;
+	r4 = r0 >> 2;
+	heap32[(r2+3)] = r3;
+	r2 = heap32[(r4)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCacheD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btHashedOverlappingPairCache;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+16)];
+if(!(r1 ==0)) //_LBB133_4
+{
+	r3 = heapU8[r0+68];
+if(!(r3 ==0)) //_LBB133_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+16)] = 0;
+}
+	r1 = 1;
+	heap8[r0+68] = r1;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 0;
+	r3 = heap32[(r2+11)];
+if(!(r3 ==0)) //_LBB133_8
+{
+	r4 = heapU8[r0+48];
+if(!(r4 ==0)) //_LBB133_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB133_12
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB133_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCacheD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btHashedOverlappingPairCache;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+16)];
+if(!(r1 ==0)) //_LBB134_4
+{
+	r3 = heapU8[r0+68];
+if(!(r3 ==0)) //_LBB134_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+16)] = 0;
+}
+	r1 = 1;
+	heap8[r0+68] = r1;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 0;
+	r3 = heap32[(r2+11)];
+if(!(r3 ==0)) //_LBB134_8
+{
+	r4 = heapU8[r0+48];
+if(!(r4 ==0)) //_LBB134_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB134_12
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB134_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache18addOverlappingPairEP17btBroadphaseProxyS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = gAddedPairs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp)];
+	r1 = (r1 + 1)|0;
+	r3 = r2 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r3+6)];
+	r1 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	if(r0 ==0) //_LBB135_2
+{
+	r0 = heapU16[(r4+6)>>1];
+	r5 = heapU16[(r1+4)>>1];
+	r0 = r0 & r5;
+	r0 = r0 & 65535;
+	if(r0 ==0) //_LBB135_25
+{
+__label__ = 23;
+}
+else{
+	r0 = heapU16[(r1+6)>>1];
+	r5 = heapU16[(r4+4)>>1];
+	r0 = r0 & r5;
+	r0 = r0 & 65535;
+	r5 = 0;
+	r0 = r0 != r5;
+	r0 = r0 & 1;
+__label__ = 4;
+}
+}
+else{
+	r5 = r0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = r_g0;
+__label__ = 4;
+}
+if (__label__ == 4){
+	r0 = r0 & 255;
+if(!(r0 ==0)) //_LBB135_25
+{
+	r0 = r1 >> 2;
+	r5 = r4 >> 2;
+	r0 = heap32[(r0+3)];
+	r5 = heap32[(r5+3)];
+	r6 = r0 > r5 ? r1 : r4;
+	r0 = r0 > r5 ? r4 : r1;
+	r1 = r6 >> 2;
+	r4 = heap32[(r1+3)];
+	r5 = r0 >> 2;
+	r7 = heap32[(r5+3)];
+	r8 = r4 << 16;
+	r8 = r8 | r7;
+	r9 = r8 << 15;
+	r9 = r9 ^ -1;
+	r8 = (r8 + r9)|0;
+	r9 = r8 >> 10;
+	r8 = r9 ^ r8;
+	r8 = (r8 * 9)|0;
+	r9 = r8 >> 6;
+	r8 = r9 ^ r8;
+	r9 = r8 << 11;
+	r9 = r9 ^ -1;
+	r8 = (r8 + r9)|0;
+	r9 = heap32[(r3+3)];
+	r10 = r8 >> 16;
+	r8 = r10 ^ r8;
+	r10 = (r9 + -1)|0;
+	r10 = r8 & r10;
+	r11 = heap32[(r3+11)];
+	r12 = r10 << 2;
+	r11 = (r11 + r12)|0;
+_8: while(true){
+	r11 = r11 >> 2;
+	r11 = heap32[(r11)];
+	if(r11 ==-1) //_LBB135_14
+{
+__label__ = 13;
+break _8;
+}
+else{
+	r12 = heap32[(r3+4)];
+	r13 = r11 << 4;
+	r12 = (r12 + r13)|0;
+	r13 = r12 >> 2;
+	r14 = heap32[(r13)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+3)];
+if(!(r14 !=r7)) //_LBB135_6
+{
+	r13 = heap32[(r13+1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+3)];
+if(!(r13 !=r4)) //_LBB135_6
+{
+__label__ = 10;
+break _8;
+}
+}
+	r12 = heap32[(r3+16)];
+	r11 = r11 << 2;
+	r11 = (r12 + r11)|0;
+}
+}
+_14: do {
+switch(__label__ ){//multiple entries
+case 13:
+	r4 = heap32[(r3+2)];
+__label__ = 14;
+break _14;
+break;
+case 10:
+	r4 = heap32[(r3+2)];
+	if(r4 >r11) //_LBB135_12
+{
+	if(r12 !=0) //_LBB135_24
+{
+__label__ = 22;
+}
+else{
+__label__ = 14;
+}
+}
+else{
+	r0 = _2E_str222;
+	r1 = _2E_str323;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 250;
+	_assert(i7);
+}
+break;
+}
+} while(0);
+if (__label__ == 14){
+	r12 = (r2 + 4)|0;
+	heap32[(g0)] = r12;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE21expandNonInitializingEv(i7);
+	r12 = r_g0;
+	r7 = heap32[(r3+18)];
+if(!(r7 ==0)) //_LBB135_17
+{
+	r11 = r7 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+2)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r6;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+}
+	r7 = heap32[(r3+3)];
+	if(r9 <r7) //_LBB135_19
+{
+	heap32[(g0)] = r2;
+	_ZN28btHashedOverlappingPairCache10growTablesEv(i7);
+	r10 = heap32[(r3+3)];
+	r10 = (r10 + -1)|0;
+	r10 = r10 & r8;
+}
+	r2 = heap32[(r5+3)];
+	r1 = heap32[(r1+3)];
+	if(r2 >=r1) //_LBB135_22
+{
+	r1 = r12 >> 2;
+	heap32[(r1)] = r6;
+	heap32[(r1+1)] = r0;
+}
+else{
+	r1 = r12 >> 2;
+	heap32[(r1)] = r0;
+	heap32[(r1+1)] = r6;
+}
+	r0 = r12 >> 2;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	r0 = r10 << 2;
+	r1 = heap32[(r3+11)];
+	r1 = (r1 + r0)|0;
+	r1 = r1 >> 2;
+	r2 = r4 << 2;
+	r5 = heap32[(r3+16)];
+	r2 = (r5 + r2)|0;
+	r1 = heap32[(r1)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r3+11)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r4;
+}
+	r_g0 = r12;
+	return;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = gRemovePairs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+1)];
+	r1 = (r1 + 1)|0;
+	r4 = r3 >> 2;
+	heap32[(r0)] = r1;
+	r0 = r2 >> 2;
+	r1 = heap32[(r4+3)];
+	r0 = heap32[(r0+3)];
+	r4 = r1 > r0 ? r3 : r2;
+	r0 = r1 > r0 ? r2 : r3;
+	r1 = r4 >> 2;
+	r1 = heap32[(r1+3)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2+3)];
+	r3 = r1 << 16;
+	r3 = r3 | r2;
+	r5 = r3 << 15;
+	r5 = r5 ^ -1;
+	r3 = (r3 + r5)|0;
+	r5 = r3 >> 10;
+	r3 = r5 ^ r3;
+	r3 = (r3 * 9)|0;
+	r5 = r3 >> 6;
+	r3 = r5 ^ r3;
+	r5 = r3 << 11;
+	r6 = heap32[(fp)];
+	r5 = r5 ^ -1;
+	r7 = r6 >> 2;
+	r3 = (r3 + r5)|0;
+	r5 = r3 >> 16;
+	r8 = heap32[(r7+3)];
+	r3 = r5 ^ r3;
+	r5 = (r8 + -1)|0;
+	r3 = r3 & r5;
+	r5 = heap32[(r7+11)];
+	r3 = r3 << 2;
+	r8 = heap32[(fp+3)];
+	r5 = (r5 + r3)|0;
+_1: while(true){
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	if(r5 ==-1) //_LBB136_35
+{
+__label__ = 33;
+break _1;
+}
+else{
+	r9 = heap32[(r7+4)];
+	r10 = r5 << 4;
+	r9 = (r9 + r10)|0;
+	r10 = r9 >> 2;
+	r11 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+3)];
+if(!(r11 !=r2)) //_LBB136_1
+{
+	r11 = heap32[(r10+1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+3)];
+if(!(r11 !=r1)) //_LBB136_1
+{
+__label__ = 5;
+break _1;
+}
+}
+	r9 = heap32[(r7+16)];
+	r5 = r5 << 2;
+	r5 = (r9 + r5)|0;
+continue _1;
+}
+}
+if (__label__ == 5){
+	r11 = heap32[(r7+2)];
+	if(r11 >r5) //_LBB136_7
+{
+if(!(r9 ==0)) //_LBB136_35
+{
+	r5 = heap32[(r7)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+8)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = heap32[(r10)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	if(r5 ==r2) //_LBB136_10
+{
+	r2 = heap32[(r10+1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	if(r2 ==r1) //_LBB136_12
+{
+	r1 = heap32[(r7+4)];
+	r1 = (r9 - r1)|0;
+	r1 = r1 >> 4;
+	r2 = heap32[(r7+2)];
+	if(r2 >r1) //_LBB136_14
+{
+	r2 = heap32[(r7+11)];
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	if(r3 ==-1) //_LBB136_17
+{
+	r0 = _2E_str727;
+	r1 = _2E_str121;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 304;
+	_assert(i7);
+}
+else{
+	r5 = heap32[(r10+3)];
+	r6 = heap32[(r7+16)];
+	if(r3 ==r1) //_LBB136_21
+{
+__label__ = 20;
+}
+else{
+_22: while(true){
+	r9 = r3;
+	r3 = r9 << 2;
+	r3 = (r6 + r3)|0;
+	r10 = r3 >> 2;
+	r3 = heap32[(r10)];
+if(!(r3 !=r1)) //_LBB136_18
+{
+break _22;
+}
+}
+	if(r9 ==-1) //_LBB136_21
+{
+__label__ = 20;
+}
+else{
+	r2 = r1 << 2;
+	r2 = (r6 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	heap32[(r10)] = r2;
+__label__ = 21;
+}
+}
+if (__label__ == 20){
+	r3 = r1 << 2;
+	r3 = (r6 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(r2)] = r3;
+}
+	r2 = heap32[(r7+2)];
+	r3 = heap32[(r7+18)];
+if(!(r3 ==0)) //_LBB136_24
+{
+	r6 = r3 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+	r0 = (r2 + -1)|0;
+	if(r0 !=r1) //_LBB136_26
+{
+	r3 = heap32[(r7+4)];
+	r4 = r2 << 4;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r6 = heap32[(r3+-3)];
+	r3 = heap32[(r3+-4)];
+	r6 = r6 >> 2;
+	r3 = r3 >> 2;
+	r6 = heap32[(r6+3)];
+	r3 = heap32[(r3+3)];
+	r6 = r6 << 16;
+	r3 = r3 | r6;
+	r6 = r3 << 15;
+	r6 = r6 ^ -1;
+	r3 = (r3 + r6)|0;
+	r6 = r3 >> 10;
+	r3 = r6 ^ r3;
+	r3 = (r3 * 9)|0;
+	r6 = r3 >> 6;
+	r3 = r6 ^ r3;
+	r6 = r3 << 11;
+	r6 = r6 ^ -1;
+	r3 = (r3 + r6)|0;
+	r6 = r3 >> 16;
+	r8 = heap32[(r7+3)];
+	r3 = r6 ^ r3;
+	r6 = (r8 + -1)|0;
+	r3 = r3 & r6;
+	r6 = heap32[(r7+11)];
+	r3 = r3 << 2;
+	r6 = (r6 + r3)|0;
+	r6 = r6 >> 2;
+	r8 = heap32[(r6)];
+	if(r8 ==-1) //_LBB136_29
+{
+	r0 = _2E_str727;
+	r1 = _2E_str121;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 345;
+	_assert(i7);
+}
+else{
+	r9 = heap32[(r7+16)];
+	if(r8 ==r0) //_LBB136_33
+{
+__label__ = 31;
+}
+else{
+_38: while(true){
+	r10 = r8;
+	r8 = r10 << 2;
+	r8 = (r9 + r8)|0;
+	r11 = r8 >> 2;
+	r8 = heap32[(r11)];
+if(!(r8 !=r0)) //_LBB136_30
+{
+break _38;
+}
+}
+	if(r10 ==-1) //_LBB136_33
+{
+__label__ = 31;
+}
+else{
+	r2 = r2 << 2;
+	r2 = (r9 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+-1)];
+	heap32[(r11)] = r2;
+__label__ = 32;
+}
+}
+if (__label__ == 31){
+	r0 = r2 << 2;
+	r0 = (r9 + r0)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+-1)];
+	heap32[(r6)] = r0;
+}
+	r0 = heap32[(r7+4)];
+	r2 = (r0 + r4)|0;
+	r4 = r1 << 4;
+	r2 = r2 >> 2;
+	r0 = (r0 + r4)|0;
+	r4 = heap32[(r2+-4)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = r4;
+	r4 = heap32[(r2+-3)];
+	heap32[(r0+1)] = r4;
+	r4 = heap32[(r2+-2)];
+	heap32[(r0+2)] = r4;
+	r2 = heap32[(r2+-1)];
+	heap32[(r0+3)] = r2;
+	r0 = heap32[(r7+11)];
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	r2 = r1 << 2;
+	r4 = heap32[(r7+16)];
+	r2 = (r4 + r2)|0;
+	r0 = heap32[(r0)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r0;
+	r0 = heap32[(r7+11)];
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r1;
+}
+}
+	r0 = heap32[(r7+2)];
+	r0 = (r0 + -1)|0;
+	heap32[(r7+2)] = r0;
+	r_g0 = r5;
+	return;
+}
+}
+else{
+	r0 = _2E_str626;
+	r1 = _2E_str121;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 300;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str525;
+	r3 = _2E_str121;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 297;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str424;
+	r1 = _2E_str121;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 296;
+	_assert(i7);
+}
+}
+}
+else{
+	r0 = _2E_str222;
+	r1 = _2E_str323;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 250;
+	_assert(i7);
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache8findPairEP17btBroadphaseProxyS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = gFindPairs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r1 = (r1 + 1)|0;
+	r4 = r2 >> 2;
+	heap32[(r0)] = r1;
+	r0 = r3 >> 2;
+	r1 = heap32[(r4+3)];
+	r0 = heap32[(r0+3)];
+	r4 = r1 > r0 ? r2 : r3;
+	r0 = r1 > r0 ? r3 : r2;
+	r1 = r4 >> 2;
+	r1 = heap32[(r1+3)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	r2 = r1 << 16;
+	r2 = r2 | r0;
+	r3 = r2 << 15;
+	r3 = r3 ^ -1;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >> 10;
+	r2 = r3 ^ r2;
+	r2 = (r2 * 9)|0;
+	r3 = r2 >> 6;
+	r2 = r3 ^ r2;
+	r3 = r2 << 11;
+	r4 = heap32[(fp)];
+	r3 = r3 ^ -1;
+	r4 = r4 >> 2;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >> 16;
+	r5 = heap32[(r4+3)];
+	r2 = r3 ^ r2;
+	r3 = (r5 + -1)|0;
+	r2 = r2 & r3;
+	r3 = heap32[(r4+9)];
+_1: do {
+if(!(r3 <=r2)) //_LBB137_9
+{
+	r3 = heap32[(r4+11)];
+	r2 = r2 << 2;
+	r2 = (r3 + r2)|0;
+_3: while(true){
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	if(r2 ==-1) //_LBB137_9
+{
+break _1;
+}
+else{
+	r3 = heap32[(r4+4)];
+	r5 = r2 << 4;
+	r3 = (r3 + r5)|0;
+	r5 = r3 >> 2;
+	r6 = heap32[(r5)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+if(!(r6 !=r0)) //_LBB137_2
+{
+	r5 = heap32[(r5+1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+if(!(r5 !=r1)) //_LBB137_2
+{
+break _3;
+}
+}
+	r3 = heap32[(r4+16)];
+	r2 = r2 << 2;
+	r2 = (r3 + r2)|0;
+}
+}
+	r0 = heap32[(r4+2)];
+	if(r0 >r2) //_LBB137_8
+{
+	r_g0 = r3;
+	return;
+}
+else{
+	r3 = _2E_str222;
+	r0 = _2E_str121;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 165;
+	_assert(i7);
+}
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache20sortOverlappingPairsEP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = sp + -24;
+	r1 = 1;
+	r2 = r0 >> 2;
+	heap8[sp+-8] = r1;
+	heap32[(r2+3)] = 0;
+	r3 = heap32[(fp)];
+	heap32[(r2+1)] = 0;
+	r4 = r3 >> 2;
+	heap32[(r2+2)] = 0;
+	r5 = heap32[(r4+2)];
+_1: do {
+	if(r5 >0) //_LBB138_2
+{
+	r6 = heap32[(fp+1)];
+	r7 = 0;
+	r5 = r7;
+_3: while(true){
+	r8 = heap32[(r4+4)];
+	if(r7 ==r5) //_LBB138_5
+{
+	r9 = 1;
+	r10 = r5 << 1;
+	r10 = r5 == 0 ? r9 : r10;
+if(!(r7 >=r10)) //_LBB138_4
+{
+	if(r10 !=0) //_LBB138_8
+{
+	r7 = gNumAlignedAllocs;
+	r7 = r7 >> 2;
+	r11 = heap32[(r7)];
+	r12 = r10 << 4;
+	r11 = (r11 + 1)|0;
+	r12 = r12 | 3;
+	heap32[(r7)] = r11;
+	r7 = (r12 + 16)|0;
+	heap32[(g0)] = r7;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB138_10
+{
+	r11 = 0;
+	r12 = (r7 + 4)|0;
+	r11 = (r11 - r12)|0;
+	r11 = r11 & 15;
+	r11 = (r7 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r7;
+	r7 = r12;
+}
+}
+else{
+	r7 = 0;
+}
+	if(r5 <1) //_LBB138_13
+{
+	r13 = heap32[(r2+3)];
+}
+else{
+	r11 = 0;
+	r12 = (r11 - r5)|0;
+_16: while(true){
+	r13 = heap32[(r2+3)];
+	r14 = r11 << 4;
+	r15 = (r13 - r14)|0;
+	r15 = r15 >> 2;
+	r14 = (r7 - r14)|0;
+	r16 = heap32[(r15)];
+	r14 = r14 >> 2;
+	heap32[(r14)] = r16;
+	r16 = heap32[(r15+1)];
+	heap32[(r14+1)] = r16;
+	r16 = heap32[(r15+2)];
+	heap32[(r14+2)] = r16;
+	r15 = heap32[(r15+3)];
+	r11 = (r11 + -1)|0;
+	heap32[(r14+3)] = r15;
+if(!(r12 !=r11)) //_LBB138_14
+{
+break _16;
+}
+}
+}
+	if(r13 !=0) //_LBB138_17
+{
+	r11 = heapU8[sp+-8];
+	if(r11 !=0) //_LBB138_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r11 = heap32[(r5)];
+	r11 = (r11 + 1)|0;
+	r12 = r13 >> 2;
+	heap32[(r5)] = r11;
+	r5 = heap32[(r12+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r2+1)];
+}
+	heap32[(r2+3)] = 0;
+}
+	heap8[sp+-8] = r9;
+	heap32[(r2+3)] = r7;
+	heap32[(r2+2)] = r10;
+}
+}
+	r7 = r1 << 4;
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r5 = r5 << 4;
+	r8 = heap32[(r2+3)];
+	r5 = (r8 + r5)|0;
+	r8 = heap32[(r7+-4)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r8;
+	r8 = heap32[(r7+-3)];
+	heap32[(r5+1)] = r8;
+	r8 = heap32[(r7+-2)];
+	heap32[(r5+2)] = r8;
+	r7 = heap32[(r7+-1)];
+	heap32[(r5+3)] = r7;
+	r5 = heap32[(r2+1)];
+	r5 = (r5 + 1)|0;
+	heap32[(r2+1)] = r5;
+	r7 = heap32[(r4+2)];
+	if(r7 <=r1) //_LBB138_24
+{
+break _3;
+}
+else{
+	r7 = heap32[(r2+2)];
+	r1 = (r1 + 1)|0;
+}
+}
+	if(r5 >0) //_LBB138_26
+{
+	r1 = 0;
+_29: while(true){
+	r5 = heap32[(r2+3)];
+	r7 = r1 << 4;
+	r8 = heap32[(r4)];
+	r5 = (r5 + r7)|0;
+	r5 = r5 >> 2;
+	r7 = r8 >> 2;
+	r7 = heap32[(r7+3)];
+	r8 = heap32[(r5+1)];
+	r5 = heap32[(r5)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r5 = heap32[(r2+1)];
+	r1 = (r1 + 1)|0;
+	if(r5 >r1) //_LBB138_27
+{
+continue _29;
+}
+else{
+break _1;
+}
+}
+}
+}
+else{
+	r5 = 0;
+}
+} while(0);
+	r1 = heap32[(r4+14)];
+	if(r1 >0) //_LBB138_30
+{
+	r5 = 0;
+_35: while(true){
+	r1 = r5 << 2;
+	r6 = heap32[(r4+16)];
+	r1 = (r6 + r1)|0;
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = -1;
+	r1 = heap32[(r4+14)];
+if(!(r1 >r5)) //_LBB138_31
+{
+break _35;
+}
+}
+	r5 = heap32[(r2+1)];
+}
+	if(r5 >1) //_LBB138_35
+{
+	r5 = (r5 + -1)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r5;
+	_ZN20btAlignedObjectArrayI16btBroadphasePairE17quickSortInternalI29btBroadphasePairSortPredicateEEvT_ii(i7);
+	r5 = heap32[(r2+1)];
+}
+_42: do {
+if(!(r5 <1)) //_LBB138_39
+{
+	r0 = 0;
+_44: while(true){
+	r1 = heap32[(r2+3)];
+	r5 = r0 << 4;
+	r6 = heap32[(r4)];
+	r1 = (r1 + r5)|0;
+	r1 = r1 >> 2;
+	r5 = r6 >> 2;
+	r5 = heap32[(r5+2)];
+	r6 = heap32[(r1+1)];
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	r0 = (r0 + 1)|0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r1 = heap32[(r2+1)];
+	if(r1 >r0) //_LBB138_38
+{
+continue _44;
+}
+else{
+break _42;
+}
+}
+}
+} while(0);
+	r0 = heap32[(r2+3)];
+if(!(r0 ==0)) //_LBB138_42
+{
+	r1 = heapU8[sp+-8];
+if(!(r1 ==0)) //_LBB138_42
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	return;
+}
+
+function _ZN20btAlignedObjectArrayI16btBroadphasePairE21expandNonInitializingEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+2)];
+	r3 = heap32[(r1+1)];
+	if(r2 ==r3) //_LBB139_2
+{
+	r4 = 1;
+	r5 = r3 << 1;
+	r5 = r3 == 0 ? r4 : r5;
+	if(r2 >=r5) //_LBB139_1
+{
+__label__ = 1;
+}
+else{
+	if(r5 !=0) //_LBB139_5
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r6 = heap32[(r2)];
+	r7 = r5 << 4;
+	r6 = (r6 + 1)|0;
+	r7 = r7 | 3;
+	heap32[(r2)] = r6;
+	r2 = (r7 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB139_7
+{
+	r2 = 0;
+	r7 = (r6 + 4)|0;
+	r2 = (r2 - r7)|0;
+	r2 = r2 & 15;
+	r2 = (r6 + r2)|0;
+	r7 = (r2 + 4)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r6;
+	r6 = r7;
+}
+}
+else{
+	r6 = 0;
+}
+	r7 = (r0 + 12)|0;
+	if(r3 <1) //_LBB139_10
+{
+	r2 = r7 >> 2;
+	r9 = heap32[(r2)];
+}
+else{
+	r2 = 0;
+	r8 = (r2 - r3)|0;
+_12: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r2 << 4;
+	r11 = (r9 - r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r6 - r10)|0;
+	r12 = heap32[(r11)];
+	r10 = r10 >> 2;
+	heap32[(r10)] = r12;
+	r12 = heap32[(r11+1)];
+	heap32[(r10+1)] = r12;
+	r12 = heap32[(r11+2)];
+	heap32[(r10+2)] = r12;
+	r11 = heap32[(r11+3)];
+	r2 = (r2 + -1)|0;
+	heap32[(r10+3)] = r11;
+if(!(r8 !=r2)) //_LBB139_11
+{
+break _12;
+}
+}
+	r7 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB139_15
+{
+	r2 = heapU8[r0+16];
+	if(r2 !=0) //_LBB139_17
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r8 = heap32[(r2)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r2)] = r8;
+	r2 = heap32[(r9+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+	r2 = heap32[(r1+1)];
+}
+else{
+	r2 = r3;
+}
+	r8 = r7 >> 2;
+	heap32[(r8)] = 0;
+}
+else{
+	r2 = r3;
+}
+	r7 = r7 >> 2;
+	heap8[r0+16] = r4;
+	heap32[(r7)] = r6;
+	heap32[(r1+2)] = r5;
+__label__ = 19;
+}
+}
+else{
+__label__ = 1;
+}
+if (__label__ == 1){
+	r2 = r3;
+}
+	r0 = (r2 + 1)|0;
+	heap32[(r1+1)] = r0;
+	r0 = heap32[(r1+3)];
+	r1 = r3 << 4;
+	r0 = (r0 + r1)|0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCache10growTablesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+9)];
+	r3 = heap32[(r1+3)];
+_1: do {
+if(!(r2 >=r3)) //_LBB140_48
+{
+_3: do {
+if(!(r2 >r3)) //_LBB140_20
+{
+	r4 = heap32[(r1+10)];
+if(!(r4 >=r3)) //_LBB140_18
+{
+	if(r3 !=0) //_LBB140_5
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = r3 << 2;
+	r5 = (r5 + 1)|0;
+	r6 = r6 | 3;
+	heap32[(r4)] = r5;
+	r4 = (r6 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB140_7
+{
+	r5 = 0;
+	r6 = (r4 + 4)|0;
+	r5 = (r5 - r6)|0;
+	r5 = r5 & 15;
+	r5 = (r4 + r5)|0;
+	r6 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+	r4 = r6;
+}
+}
+else{
+	r4 = 0;
+}
+	r5 = (r0 + 44)|0;
+	if(r2 <1) //_LBB140_10
+{
+	r6 = r5 >> 2;
+	r7 = heap32[(r6)];
+}
+else{
+	r6 = 0;
+_15: while(true){
+	r7 = r5 >> 2;
+	r7 = heap32[(r7)];
+	r8 = r6 << 2;
+	r9 = (r7 + r8)|0;
+	r9 = r9 >> 2;
+	r8 = (r4 + r8)|0;
+	r9 = heap32[(r9)];
+	r6 = (r6 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r9;
+if(!(r2 !=r6)) //_LBB140_11
+{
+break _15;
+}
+}
+	r5 = (r0 + 44)|0;
+}
+if(!(r7 ==0)) //_LBB140_17
+{
+	r6 = heapU8[r0+48];
+if(!(r6 ==0)) //_LBB140_16
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r8 = heap32[(r6)];
+	r8 = (r8 + 1)|0;
+	r7 = r7 >> 2;
+	heap32[(r6)] = r8;
+	r6 = heap32[(r7+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	r6 = r5 >> 2;
+	heap32[(r6)] = 0;
+}
+	r6 = 1;
+	r5 = r5 >> 2;
+	heap8[r0+48] = r6;
+	heap32[(r5)] = r4;
+	heap32[(r1+10)] = r3;
+}
+	r4 = r2;
+_26: while(true){
+	r5 = r4 << 2;
+	r6 = heap32[(r1+11)];
+	r5 = (r6 + r5)|0;
+	r4 = (r4 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = 0;
+if(!(r3 !=r4)) //_LBB140_19
+{
+break _3;
+}
+}
+}
+} while(0);
+	heap32[(r1+9)] = r3;
+	r4 = heap32[(r1+14)];
+_29: do {
+if(!(r4 >r3)) //_LBB140_39
+{
+if(!(r4 >=r3)) //_LBB140_39
+{
+	r5 = heap32[(r1+15)];
+if(!(r5 >=r3)) //_LBB140_38
+{
+	if(r3 !=0) //_LBB140_25
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r7 = r3 << 2;
+	r6 = (r6 + 1)|0;
+	r7 = r7 | 3;
+	heap32[(r5)] = r6;
+	r5 = (r7 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB140_27
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+}
+else{
+	r5 = 0;
+}
+	r6 = (r0 + 64)|0;
+	if(r4 <1) //_LBB140_30
+{
+	r7 = r6 >> 2;
+	r8 = heap32[(r7)];
+}
+else{
+	r7 = 0;
+_42: while(true){
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r7 << 2;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r5 + r9)|0;
+	r10 = heap32[(r10)];
+	r7 = (r7 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r10;
+if(!(r4 !=r7)) //_LBB140_31
+{
+break _42;
+}
+}
+	r6 = (r0 + 64)|0;
+}
+if(!(r8 ==0)) //_LBB140_37
+{
+	r7 = heapU8[r0+68];
+if(!(r7 ==0)) //_LBB140_36
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r9 = heap32[(r7)];
+	r9 = (r9 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r7)] = r9;
+	r7 = heap32[(r8+-1)];
+	heap32[(g0)] = r7;
+	free(i7);
+}
+	r7 = r6 >> 2;
+	heap32[(r7)] = 0;
+}
+	r7 = 1;
+	r6 = r6 >> 2;
+	heap8[r0+68] = r7;
+	heap32[(r6)] = r5;
+	heap32[(r1+15)] = r3;
+	if(r4 >=r3) //_LBB140_39
+{
+break _29;
+}
+}
+_52: while(true){
+	r0 = r4 << 2;
+	r5 = heap32[(r1+16)];
+	r0 = (r5 + r0)|0;
+	r4 = (r4 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+if(!(r3 !=r4)) //_LBB140_38
+{
+break _29;
+}
+}
+}
+}
+} while(0);
+	heap32[(r1+14)] = r3;
+_55: do {
+if(!(r3 <1)) //_LBB140_45
+{
+	r0 = 0;
+_57: while(true){
+	r4 = r0 << 2;
+	r5 = heap32[(r1+11)];
+	r4 = (r5 + r4)|0;
+	r0 = (r0 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = -1;
+if(!(r3 !=r0)) //_LBB140_41
+{
+break _57;
+}
+}
+if(!(r3 <1)) //_LBB140_45
+{
+	r0 = 0;
+_61: while(true){
+	r4 = r0 << 2;
+	r5 = heap32[(r1+16)];
+	r4 = (r5 + r4)|0;
+	r0 = (r0 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = -1;
+if(!(r3 !=r0)) //_LBB140_44
+{
+break _55;
+}
+}
+}
+}
+} while(0);
+if(!(r2 <1)) //_LBB140_48
+{
+	r0 = 0;
+_65: while(true){
+	r3 = heap32[(r1+4)];
+	r4 = r0 << 4;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3+1)];
+	r3 = heap32[(r3)];
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r4+3)];
+	r4 = r4 << 16;
+	r3 = heap32[(r3+3)];
+	r3 = r4 | r3;
+	r4 = r3 << 15;
+	r4 = r4 ^ -1;
+	r3 = (r3 + r4)|0;
+	r4 = r3 >> 10;
+	r3 = r4 ^ r3;
+	r3 = (r3 * 9)|0;
+	r4 = r3 >> 6;
+	r3 = r4 ^ r3;
+	r4 = r3 << 11;
+	r4 = r4 ^ -1;
+	r3 = (r3 + r4)|0;
+	r4 = r3 >> 16;
+	r5 = heap32[(r1+3)];
+	r3 = r4 ^ r3;
+	r4 = (r5 + -1)|0;
+	r3 = r3 & r4;
+	r3 = r3 << 2;
+	r4 = heap32[(r1+11)];
+	r4 = (r4 + r3)|0;
+	r4 = r4 >> 2;
+	r5 = r0 << 2;
+	r6 = heap32[(r1+16)];
+	r5 = (r6 + r5)|0;
+	r4 = heap32[(r4)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+	r4 = heap32[(r1+11)];
+	r3 = (r4 + r3)|0;
+	r4 = (r0 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r0;
+	r0 = r4;
+	if(r2 !=r4) //_LBB140_47
+{
+continue _65;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN28btHashedOverlappingPairCacheC1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btHashedOverlappingPairCache;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r3 = 1;
+	heap32[(r2)] = r1;
+	heap8[r0+20] = r3;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	r1 = 0;
+	heap32[(r2+6)] = 0;
+	heap8[r0+28] = r1;
+	heap8[r0+48] = r3;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	heap8[r0+68] = r3;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+14)] = 0;
+	r4 = gNumAlignedAllocs;
+	heap32[(r2+15)] = 0;
+	r4 = r4 >> 2;
+	heap32[(r2+18)] = 0;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	heap32[(r4)] = r5;
+	heap32[(g0)] = 51;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB141_2
+{
+	r5 = (r4 + 4)|0;
+	r1 = (r1 - r5)|0;
+	r1 = r1 & 15;
+	r1 = (r4 + r1)|0;
+	r5 = (r1 + 4)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r4;
+	r4 = r5;
+}
+	heap8[r0+20] = r3;
+	heap32[(r2+4)] = r4;
+	heap32[(r2+3)] = 2;
+	heap32[(g0)] = r0;
+	_ZN28btHashedOverlappingPairCache10growTablesEv(i7);
+	return;
+}
+
+function _ZNK14btQuantizedBvh31calculateSerializeBufferSizeNewEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 84;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK14btQuantizedBvh9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r2 = r1 >> 2;
+	heap32[(r0+4)] = heap32[(r2+5)];
+	heap32[(r0+5)] = heap32[(r2+6)];
+	heap32[(r0+6)] = heap32[(r2+7)];
+	heap32[(r0+7)] = heap32[(r2+8)];
+	heap32[(r0)] = heap32[(r2+1)];
+	heap32[(r0+1)] = heap32[(r2+2)];
+	heap32[(r0+2)] = heap32[(r2+3)];
+	heap32[(r0+3)] = heap32[(r2+4)];
+	heap32[(r0+8)] = heap32[(r2+9)];
+	heap32[(r0+9)] = heap32[(r2+10)];
+	heap32[(r0+10)] = heap32[(r2+11)];
+	heap32[(r0+11)] = heap32[(r2+12)];
+	r3 = heap32[(r2+14)];
+	heap32[(r0+12)] = r3;
+	r1 = heapU8[r1+60];
+	heap32[(r0+13)] = r1;
+	r1 = heap32[(r2+22)];
+	r3 = heap32[(fp+2)];
+	heap32[(r0+14)] = r1;
+	r1 = heap32[(r2+22)];
+	if(r1 !=0) //_LBB143_2
+{
+	r1 = r3 >> 2;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	r5 = heap32[(r2+24)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	heap32[(r0+16)] = r4;
+if(!(r4 ==0)) //_LBB143_7
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r5 = heap32[(r2+22)];
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 48;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+if(!(r5 <1)) //_LBB143_6
+{
+	r6 = r4 >> 2;
+	r7 = 0;
+	r6 = heap32[(r6+2)];
+	r5 = (r7 - r5)|0;
+_6: while(true){
+	r8 = (r7 * -12)|0;
+	r8 = r8 << 2;
+	r9 = r7 << 6;
+	r10 = heap32[(r2+24)];
+	r8 = (r6 + r8)|0;
+	r10 = (r10 - r9)|0;
+	r8 = r8 >> 2;
+	r10 = r10 >> 2;
+	heap32[(r8+4)] = heap32[(r10+4)];
+	heap32[(r8+5)] = heap32[(r10+5)];
+	heap32[(r8+6)] = heap32[(r10+6)];
+	heap32[(r8+7)] = heap32[(r10+7)];
+	r10 = heap32[(r2+24)];
+	r10 = (r10 - r9)|0;
+	r10 = r10 >> 2;
+	heap32[(r8)] = heap32[(r10)];
+	heap32[(r8+1)] = heap32[(r10+1)];
+	heap32[(r8+2)] = heap32[(r10+2)];
+	heap32[(r8+3)] = heap32[(r10+3)];
+	r10 = heap32[(r2+24)];
+	r10 = (r10 - r9)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+8)];
+	heap32[(r8+8)] = r10;
+	r10 = heap32[(r2+24)];
+	r10 = (r10 - r9)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+9)];
+	heap32[(r8+9)] = r10;
+	r10 = heap32[(r2+24)];
+	r9 = (r10 - r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+10)];
+	r7 = (r7 + -1)|0;
+	heap32[(r8+10)] = r9;
+if(!(r5 !=r7)) //_LBB143_5
+{
+break _6;
+}
+}
+}
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	r5 = heap32[(r2+24)];
+	r6 = _2E_str32;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+}
+else{
+	heap32[(r0+16)] = 0;
+}
+	r1 = heap32[(r2+32)];
+	heap32[(r0+15)] = r1;
+	r1 = heap32[(r2+32)];
+	if(r1 !=0) //_LBB143_9
+{
+	r1 = r3 >> 2;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	r5 = heap32[(r2+34)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	heap32[(r0+17)] = r4;
+if(!(r4 ==0)) //_LBB143_14
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r5 = heap32[(r2+32)];
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 16;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+_14: do {
+if(!(r5 <1)) //_LBB143_13
+{
+	r6 = r4 >> 2;
+	r7 = 0;
+	r6 = heap32[(r6+2)];
+	r5 = (r7 - r5)|0;
+_16: while(true){
+	r8 = r7 << 4;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = r9 >> 2;
+	r10 = (r6 - r8)|0;
+	r9 = heap32[(r9+3)];
+	r11 = r10 >> 2;
+	heap32[(r11+3)] = r9;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = heapU16[(r9+6)>>1];
+	heap16[(r10+6)>>1] = r9;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = heapU16[(r9+8)>>1];
+	heap16[(r10+8)>>1] = r9;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = heapU16[(r9+10)>>1];
+	heap16[(r10+10)>>1] = r9;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = heapU16[(r9)>>1];
+	heap16[(r10)>>1] = r9;
+	r9 = heap32[(r2+34)];
+	r9 = (r9 - r8)|0;
+	r9 = heapU16[(r9+2)>>1];
+	heap16[(r10+2)>>1] = r9;
+	r9 = heap32[(r2+34)];
+	r8 = (r9 - r8)|0;
+	r8 = heapU16[(r8+4)>>1];
+	r7 = (r7 + -1)|0;
+	heap16[(r10+4)>>1] = r8;
+if(!(r5 !=r7)) //_LBB143_12
+{
+break _14;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	r5 = heap32[(r2+34)];
+	r6 = _2E_str133;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+}
+else{
+	heap32[(r0+17)] = 0;
+}
+	r1 = heap32[(r2+36)];
+	heap32[(r0+19)] = r1;
+	r1 = heap32[(r2+38)];
+	heap32[(r0+20)] = r1;
+	r1 = heap32[(r2+38)];
+	if(r1 !=0) //_LBB143_16
+{
+	r1 = r3 >> 2;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	r5 = heap32[(r2+40)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	heap32[(r0+18)] = r4;
+if(!(r4 ==0)) //_LBB143_21
+{
+	r0 = heap32[(r1)];
+	r0 = r0 >> 2;
+	r4 = heap32[(r2+38)];
+	r0 = heap32[(r0+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 20;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = r_g0;
+_24: do {
+if(!(r4 <1)) //_LBB143_20
+{
+	r5 = r0 >> 2;
+	r6 = 0;
+	r5 = heap32[(r5+2)];
+	r4 = (r6 - r4)|0;
+_26: while(true){
+	r7 = r6 << 5;
+	r8 = heap32[(r2+40)];
+	r9 = (r6 * -10)|0;
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8+6)>>1];
+	r9 = r9 << 1;
+	r9 = (r5 + r9)|0;
+	heap16[(r9+14)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8+8)>>1];
+	heap16[(r9+16)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8+10)>>1];
+	heap16[(r9+18)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8)>>1];
+	heap16[(r9+8)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8+2)>>1];
+	heap16[(r9+10)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r8 = (r8 - r7)|0;
+	r8 = heapU16[(r8+4)>>1];
+	heap16[(r9+12)>>1] = r8;
+	r8 = heap32[(r2+40)];
+	r9 = (r6 * -5)|0;
+	r8 = (r8 - r7)|0;
+	r9 = r9 << 2;
+	r8 = r8 >> 2;
+	r9 = (r5 + r9)|0;
+	r8 = heap32[(r8+3)];
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = heap32[(r2+40)];
+	r7 = (r8 - r7)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+4)];
+	r6 = (r6 + -1)|0;
+	heap32[(r9+1)] = r7;
+if(!(r4 !=r6)) //_LBB143_19
+{
+break _24;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	r2 = heap32[(r2+40)];
+	r4 = _2E_str234;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+}
+else{
+	heap32[(r0+18)] = 0;
+}
+	r0 = _2E_str335;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN14btQuantizedBvhD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN14btQuantizedBvhD2Ev(i7);
+	return;
+}
+
+function _ZN14btQuantizedBvhD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btQuantizedBvh;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+40)];
+if(!(r1 ==0)) //_LBB145_4
+{
+	r3 = heapU8[r0+164];
+if(!(r3 ==0)) //_LBB145_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+40)] = 0;
+}
+	r1 = 1;
+	heap8[r0+164] = r1;
+	heap32[(r2+40)] = 0;
+	heap32[(r2+38)] = 0;
+	heap32[(r2+39)] = 0;
+	r3 = heap32[(r2+34)];
+if(!(r3 ==0)) //_LBB145_8
+{
+	r4 = heapU8[r0+140];
+if(!(r4 ==0)) //_LBB145_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+34)] = 0;
+}
+	heap8[r0+140] = r1;
+	heap32[(r2+34)] = 0;
+	heap32[(r2+32)] = 0;
+	heap32[(r2+33)] = 0;
+	r3 = heap32[(r2+29)];
+if(!(r3 ==0)) //_LBB145_12
+{
+	r4 = heapU8[r0+120];
+if(!(r4 ==0)) //_LBB145_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+29)] = 0;
+}
+	heap8[r0+120] = r1;
+	heap32[(r2+29)] = 0;
+	heap32[(r2+27)] = 0;
+	heap32[(r2+28)] = 0;
+	r3 = heap32[(r2+24)];
+if(!(r3 ==0)) //_LBB145_16
+{
+	r4 = heapU8[r0+100];
+if(!(r4 ==0)) //_LBB145_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+24)] = 0;
+}
+	heap8[r0+100] = r1;
+	heap32[(r2+24)] = 0;
+	heap32[(r2+22)] = 0;
+	heap32[(r2+23)] = 0;
+	r3 = heap32[(r2+19)];
+if(!(r3 ==0)) //_LBB145_20
+{
+	r4 = heapU8[r0+80];
+if(!(r4 ==0)) //_LBB145_19
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+19)] = 0;
+}
+	heap8[r0+80] = r1;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+17)] = 0;
+	heap32[(r2+18)] = 0;
+if(!(r0 ==0)) //_LBB145_22
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZNK14btQuantizedBvh9serializeEPvjb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+38)];
+	r3 = heap32[(r1+42)];
+	if(r3 ==r2) //_LBB146_2
+{
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+3)];
+	r5 = _ZTV14btQuantizedBvh;
+	r6 = r3 >> 2;
+	r5 = (r5 + 8)|0;
+	heap32[(r1+42)] = r2;
+	heap32[(r6)] = r5;
+	r2 = 0;
+	heap32[(r6+13)] = 277;
+	r5 = 1;
+	heap8[r3+60] = r2;
+	heap8[r3+80] = r5;
+	heap32[(r6+19)] = 0;
+	heap32[(r6+17)] = 0;
+	heap32[(r6+18)] = 0;
+	heap8[r3+100] = r5;
+	heap32[(r6+24)] = 0;
+	heap32[(r6+22)] = 0;
+	heap32[(r6+23)] = 0;
+	heap8[r3+120] = r5;
+	heap32[(r6+29)] = 0;
+	heap32[(r6+27)] = 0;
+	heap32[(r6+28)] = 0;
+	heap8[r3+140] = r5;
+	heap32[(r6+34)] = 0;
+	heap32[(r6+32)] = 0;
+	heap32[(r6+33)] = 0;
+	heap32[(r6+36)] = 0;
+	heap8[r3+164] = r5;
+	heap32[(r6+40)] = 0;
+	heap32[(r6+38)] = 0;
+	heap32[(r6+39)] = 0;
+	heap32[(r6+42)] = 0;
+	heap32[(r6+1)] = -8388609;
+	heap32[(r6+2)] = -8388609;
+	heap32[(r6+3)] = -8388609;
+	heap32[(r6+4)] = 0;
+	heap32[(r6+5)] = 2139095039;
+	heap32[(r6+6)] = 2139095039;
+	heap32[(r6+7)] = 2139095039;
+	heap32[(r6+8)] = 0;
+	r7 = heap32[(r1+14)];
+	if(r4 ==0) //_LBB146_4
+{
+	heap32[(r6+14)] = r7;
+	heap32[(r6+1)] = heap32[(r1+1)];
+	heap32[(r6+2)] = heap32[(r1+2)];
+	heap32[(r6+3)] = heap32[(r1+3)];
+	heap32[(r6+4)] = heap32[(r1+4)];
+	heap32[(r6+5)] = heap32[(r1+5)];
+	heap32[(r6+6)] = heap32[(r1+6)];
+	heap32[(r6+7)] = heap32[(r1+7)];
+	heap32[(r6+8)] = heap32[(r1+8)];
+	heap32[(r6+9)] = heap32[(r1+9)];
+	heap32[(r6+10)] = heap32[(r1+10)];
+	heap32[(r6+11)] = heap32[(r1+11)];
+	heap32[(r6+12)] = heap32[(r1+12)];
+	r7 = heap32[(r1+36)];
+	heap32[(r6+36)] = r7;
+	r7 = heap32[(r1+42)];
+}
+else{
+	r8 = r7 << 8;
+	r9 = r7 >>> 8;
+	r10 = r7 << 24;
+	r8 = r8 & 16711680;
+	r9 = r9 & 65280;
+	r7 = r7 >>> 24;
+	r8 = r10 | r8;
+	r7 = r9 | r7;
+	r7 = r8 | r7;
+	heap32[(r6+14)] = r7;
+	r7 = heapU8[r0+7];
+	heap8[r3+4] = r7;
+	r7 = heapU8[r0+6];
+	heap8[r3+5] = r7;
+	r7 = heapU8[r0+5];
+	heap8[r3+6] = r7;
+	r7 = heapU8[r0+4];
+	heap8[r3+7] = r7;
+	r7 = heapU8[r0+11];
+	heap8[r3+8] = r7;
+	r7 = heapU8[r0+10];
+	heap8[r3+9] = r7;
+	r7 = heapU8[r0+9];
+	heap8[r3+10] = r7;
+	r7 = heapU8[r0+8];
+	heap8[r3+11] = r7;
+	r7 = heapU8[r0+15];
+	heap8[r3+12] = r7;
+	r7 = heapU8[r0+14];
+	heap8[r3+13] = r7;
+	r7 = heapU8[r0+13];
+	heap8[r3+14] = r7;
+	r7 = heapU8[r0+12];
+	heap8[r3+15] = r7;
+	r7 = heapU8[r0+19];
+	heap8[r3+16] = r7;
+	r7 = heapU8[r0+18];
+	heap8[r3+17] = r7;
+	r7 = heapU8[r0+17];
+	heap8[r3+18] = r7;
+	r7 = heapU8[r0+16];
+	heap8[r3+19] = r7;
+	r7 = heapU8[r0+23];
+	heap8[r3+20] = r7;
+	r7 = heapU8[r0+22];
+	heap8[r3+21] = r7;
+	r7 = heapU8[r0+21];
+	heap8[r3+22] = r7;
+	r7 = heapU8[r0+20];
+	heap8[r3+23] = r7;
+	r7 = heapU8[r0+27];
+	heap8[r3+24] = r7;
+	r7 = heapU8[r0+26];
+	heap8[r3+25] = r7;
+	r7 = heapU8[r0+25];
+	heap8[r3+26] = r7;
+	r7 = heapU8[r0+24];
+	heap8[r3+27] = r7;
+	r7 = heapU8[r0+31];
+	heap8[r3+28] = r7;
+	r7 = heapU8[r0+30];
+	heap8[r3+29] = r7;
+	r7 = heapU8[r0+29];
+	heap8[r3+30] = r7;
+	r7 = heapU8[r0+28];
+	heap8[r3+31] = r7;
+	r7 = heapU8[r0+35];
+	heap8[r3+32] = r7;
+	r7 = heapU8[r0+34];
+	heap8[r3+33] = r7;
+	r7 = heapU8[r0+33];
+	heap8[r3+34] = r7;
+	r7 = heapU8[r0+32];
+	heap8[r3+35] = r7;
+	r7 = heapU8[r0+39];
+	heap8[r3+36] = r7;
+	r7 = heapU8[r0+38];
+	heap8[r3+37] = r7;
+	r7 = heapU8[r0+37];
+	heap8[r3+38] = r7;
+	r7 = heapU8[r0+36];
+	heap8[r3+39] = r7;
+	r7 = heapU8[r0+43];
+	heap8[r3+40] = r7;
+	r7 = heapU8[r0+42];
+	heap8[r3+41] = r7;
+	r7 = heapU8[r0+41];
+	heap8[r3+42] = r7;
+	r7 = heapU8[r0+40];
+	heap8[r3+43] = r7;
+	r7 = heapU8[r0+47];
+	heap8[r3+44] = r7;
+	r7 = heapU8[r0+46];
+	heap8[r3+45] = r7;
+	r7 = heapU8[r0+45];
+	heap8[r3+46] = r7;
+	r7 = heapU8[r0+44];
+	heap8[r3+47] = r7;
+	r7 = heapU8[r0+51];
+	heap8[r3+48] = r7;
+	r7 = heapU8[r0+50];
+	heap8[r3+49] = r7;
+	r7 = heapU8[r0+49];
+	heap8[r3+50] = r7;
+	r7 = heapU8[r0+48];
+	heap8[r3+51] = r7;
+	r7 = heap32[(r1+36)];
+	r8 = r7 << 8;
+	r9 = r7 >>> 8;
+	r10 = r7 << 24;
+	r8 = r8 & 16711680;
+	r9 = r9 & 65280;
+	r7 = r7 >>> 24;
+	r8 = r10 | r8;
+	r7 = r9 | r7;
+	r7 = r8 | r7;
+	heap32[(r6+36)] = r7;
+	r7 = heap32[(r1+42)];
+	r8 = r7 << 8;
+	r9 = r7 >>> 8;
+	r10 = r7 << 24;
+	r8 = r8 & 16711680;
+	r9 = r9 & 65280;
+	r7 = r7 >>> 24;
+	r8 = r10 | r8;
+	r7 = r9 | r7;
+	r7 = r8 | r7;
+}
+	heap32[(r6+42)] = r7;
+	r7 = heapU8[r0+60];
+	heap8[r3+60] = r7;
+	r7 = (r3 + 172)|0;
+	r8 = heap32[(r1+14)];
+	r0 = heapU8[r0+60];
+	if(r0 ==0) //_LBB146_20
+{
+	r0 = 0;
+	heap8[r3+100] = r0;
+	heap32[(r6+24)] = r7;
+	heap32[(r6+22)] = r8;
+	heap32[(r6+23)] = r8;
+_9: do {
+	if(r4 !=0) //_LBB146_22
+{
+if(!(r8 <1)) //_LBB146_29
+{
+	r5 = (r5 - r8)|0;
+_12: while(true){
+	r2 = r0 << 6;
+	r9 = heap32[(r1+24)];
+	r9 = (r9 - r2)|0;
+	r10 = heapU8[r9+3];
+	r7 = (r7 - r2)|0;
+	heap8[r7] = r10;
+	r10 = heapU8[r9+2];
+	heap8[r7+1] = r10;
+	r10 = heapU8[r9+1];
+	heap8[r7+2] = r10;
+	r10 = heapU8[r9];
+	heap8[r7+3] = r10;
+	r10 = heapU8[r9+7];
+	heap8[r7+4] = r10;
+	r10 = heapU8[r9+6];
+	heap8[r7+5] = r10;
+	r10 = heapU8[r9+5];
+	heap8[r7+6] = r10;
+	r10 = heapU8[r9+4];
+	heap8[r7+7] = r10;
+	r10 = heapU8[r9+11];
+	heap8[r7+8] = r10;
+	r10 = heapU8[r9+10];
+	heap8[r7+9] = r10;
+	r10 = heapU8[r9+9];
+	heap8[r7+10] = r10;
+	r10 = heapU8[r9+8];
+	heap8[r7+11] = r10;
+	r10 = heapU8[r9+15];
+	heap8[r7+12] = r10;
+	r10 = heapU8[r9+14];
+	heap8[r7+13] = r10;
+	r10 = heapU8[r9+13];
+	heap8[r7+14] = r10;
+	r9 = heapU8[r9+12];
+	heap8[r7+15] = r9;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+24)];
+	r10 = heapU8[r7+19];
+	r9 = (r9 - r2)|0;
+	heap8[r9+16] = r10;
+	r10 = heapU8[r7+18];
+	heap8[r9+17] = r10;
+	r10 = heapU8[r7+17];
+	heap8[r9+18] = r10;
+	r10 = heapU8[r7+16];
+	heap8[r9+19] = r10;
+	r10 = heapU8[r7+23];
+	heap8[r9+20] = r10;
+	r10 = heapU8[r7+22];
+	heap8[r9+21] = r10;
+	r10 = heapU8[r7+21];
+	heap8[r9+22] = r10;
+	r10 = heapU8[r7+20];
+	heap8[r9+23] = r10;
+	r10 = heapU8[r7+27];
+	heap8[r9+24] = r10;
+	r10 = heapU8[r7+26];
+	heap8[r9+25] = r10;
+	r10 = heapU8[r7+25];
+	heap8[r9+26] = r10;
+	r10 = heapU8[r7+24];
+	heap8[r9+27] = r10;
+	r10 = heapU8[r7+31];
+	heap8[r9+28] = r10;
+	r10 = heapU8[r7+30];
+	heap8[r9+29] = r10;
+	r10 = heapU8[r7+29];
+	heap8[r9+30] = r10;
+	r7 = heapU8[r7+28];
+	heap8[r9+31] = r7;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+8)];
+	r9 = r7 << 8;
+	r10 = r7 >>> 8;
+	r11 = heap32[(r6+24)];
+	r12 = r7 << 24;
+	r9 = r9 & 16711680;
+	r10 = r10 & 65280;
+	r7 = r7 >>> 24;
+	r11 = (r11 - r2)|0;
+	r9 = r12 | r9;
+	r7 = r10 | r7;
+	r10 = r11 >> 2;
+	r7 = r9 | r7;
+	heap32[(r10+8)] = r7;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+9)];
+	r9 = r7 << 8;
+	r10 = r7 >>> 8;
+	r11 = heap32[(r6+24)];
+	r12 = r7 << 24;
+	r9 = r9 & 16711680;
+	r10 = r10 & 65280;
+	r7 = r7 >>> 24;
+	r11 = (r11 - r2)|0;
+	r9 = r12 | r9;
+	r7 = r10 | r7;
+	r10 = r11 >> 2;
+	r7 = r9 | r7;
+	heap32[(r10+9)] = r7;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+10)];
+	r9 = r7 << 8;
+	r10 = r7 >>> 8;
+	r11 = heap32[(r6+24)];
+	r12 = r7 << 24;
+	r9 = r9 & 16711680;
+	r10 = r10 & 65280;
+	r7 = r7 >>> 24;
+	r2 = (r11 - r2)|0;
+	r9 = r12 | r9;
+	r7 = r10 | r7;
+	r2 = r2 >> 2;
+	r7 = r9 | r7;
+	heap32[(r2+10)] = r7;
+	if(r5 ==r0) //_LBB146_29
+{
+break _9;
+}
+else{
+	r7 = heap32[(r6+24)];
+	r0 = (r0 + -1)|0;
+}
+}
+}
+}
+else{
+	if(r8 >0) //_LBB146_26
+{
+	r5 = (r5 - r8)|0;
+	r0 = 0;
+_17: while(true){
+	r2 = r0 << 6;
+	r9 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r9 = (r9 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = r9 >> 2;
+	heap32[(r7)] = heap32[(r9)];
+	heap32[(r7+1)] = heap32[(r9+1)];
+	heap32[(r7+2)] = heap32[(r9+2)];
+	heap32[(r7+3)] = heap32[(r9+3)];
+	r7 = heap32[(r6+24)];
+	r9 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r9 = (r9 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = r9 >> 2;
+	heap32[(r7+4)] = heap32[(r9+4)];
+	heap32[(r7+5)] = heap32[(r9+5)];
+	heap32[(r7+6)] = heap32[(r9+6)];
+	heap32[(r7+7)] = heap32[(r9+7)];
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = heap32[(r6+24)];
+	r9 = (r9 - r2)|0;
+	r7 = heap32[(r7+8)];
+	r9 = r9 >> 2;
+	heap32[(r9+8)] = r7;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = heap32[(r6+24)];
+	r9 = (r9 - r2)|0;
+	r7 = heap32[(r7+9)];
+	r9 = r9 >> 2;
+	heap32[(r9+9)] = r7;
+	r7 = heap32[(r1+24)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = heap32[(r6+24)];
+	r2 = (r9 - r2)|0;
+	r7 = heap32[(r7+10)];
+	r2 = r2 >> 2;
+	heap32[(r2+10)] = r7;
+	if(r5 ==r0) //_LBB146_29
+{
+break _9;
+}
+else{
+	r7 = heap32[(r6+24)];
+	r0 = (r0 + -1)|0;
+}
+}
+}
+}
+} while(0);
+	r5 = heap32[(r6+24)];
+if(!(r5 ==0)) //_LBB146_33
+{
+	r0 = heapU8[r3+100];
+if(!(r0 ==0)) //_LBB146_32
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+	r2 = (r2 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r0)] = r2;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r6+24)] = 0;
+}
+	r5 = r8 << 6;
+	r0 = 0;
+	heap8[r3+100] = r0;
+	heap32[(r6+24)] = 0;
+	heap32[(r6+22)] = 0;
+	heap32[(r6+23)] = 0;
+}
+else{
+	heap8[r3+140] = r2;
+	heap32[(r6+34)] = r7;
+	heap32[(r6+32)] = r8;
+	heap32[(r6+33)] = r8;
+_28: do {
+	if(r4 !=0) //_LBB146_8
+{
+if(!(r8 <1)) //_LBB146_15
+{
+	r5 = (r5 - r8)|0;
+_31: while(true){
+	r0 = heap32[(r1+34)];
+	r9 = r2 << 4;
+	r0 = (r0 - r9)|0;
+	r0 = heapU16[(r0)>>1];
+	r10 = r0 << 8;
+	r0 = r0 << 24;
+	r10 = r10 & 16711680;
+	r0 = r0 | r10;
+	r7 = (r7 - r9)|0;
+	r0 = r0 >>> 16;
+	heap16[(r7)>>1] = r0;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = heapU16[(r7+2)>>1];
+	r0 = r7 << 8;
+	r7 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = heap32[(r6+34)];
+	r7 = r7 | r0;
+	r0 = (r10 - r9)|0;
+	r7 = r7 >>> 16;
+	heap16[(r0+2)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = heapU16[(r7+4)>>1];
+	r0 = r7 << 8;
+	r7 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = heap32[(r6+34)];
+	r7 = r7 | r0;
+	r0 = (r10 - r9)|0;
+	r7 = r7 >>> 16;
+	heap16[(r0+4)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = heapU16[(r7+6)>>1];
+	r0 = r7 << 8;
+	r7 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = heap32[(r6+34)];
+	r7 = r7 | r0;
+	r0 = (r10 - r9)|0;
+	r7 = r7 >>> 16;
+	heap16[(r0+6)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = heapU16[(r7+8)>>1];
+	r0 = r7 << 8;
+	r7 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = heap32[(r6+34)];
+	r7 = r7 | r0;
+	r0 = (r10 - r9)|0;
+	r7 = r7 >>> 16;
+	heap16[(r0+8)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = heapU16[(r7+10)>>1];
+	r0 = r7 << 8;
+	r7 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = heap32[(r6+34)];
+	r7 = r7 | r0;
+	r0 = (r10 - r9)|0;
+	r7 = r7 >>> 16;
+	heap16[(r0+10)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r9)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+3)];
+	r0 = r7 << 8;
+	r10 = r7 >>> 8;
+	r11 = heap32[(r6+34)];
+	r12 = r7 << 24;
+	r0 = r0 & 16711680;
+	r10 = r10 & 65280;
+	r7 = r7 >>> 24;
+	r9 = (r11 - r9)|0;
+	r0 = r12 | r0;
+	r7 = r10 | r7;
+	r9 = r9 >> 2;
+	r7 = r0 | r7;
+	heap32[(r9+3)] = r7;
+	if(r5 ==r2) //_LBB146_15
+{
+break _28;
+}
+else{
+	r7 = heap32[(r6+34)];
+	r2 = (r2 + -1)|0;
+}
+}
+}
+}
+else{
+	if(r8 >0) //_LBB146_12
+{
+	r5 = (r5 - r8)|0;
+	r0 = 0;
+_36: while(true){
+	r2 = r0 << 4;
+	r9 = heap32[(r1+34)];
+	r9 = (r9 - r2)|0;
+	r9 = heapU16[(r9)>>1];
+	r7 = (r7 - r2)|0;
+	heap16[(r7)>>1] = r9;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+34)];
+	r7 = heapU16[(r7+2)>>1];
+	r9 = (r9 - r2)|0;
+	heap16[(r9+2)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+34)];
+	r7 = heapU16[(r7+4)>>1];
+	r9 = (r9 - r2)|0;
+	heap16[(r9+4)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+34)];
+	r7 = heapU16[(r7+6)>>1];
+	r9 = (r9 - r2)|0;
+	heap16[(r9+6)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+34)];
+	r7 = heapU16[(r7+8)>>1];
+	r9 = (r9 - r2)|0;
+	heap16[(r9+8)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r9 = heap32[(r6+34)];
+	r7 = heapU16[(r7+10)>>1];
+	r9 = (r9 - r2)|0;
+	heap16[(r9+10)>>1] = r7;
+	r7 = heap32[(r1+34)];
+	r7 = (r7 - r2)|0;
+	r7 = r7 >> 2;
+	r9 = heap32[(r6+34)];
+	r2 = (r9 - r2)|0;
+	r7 = heap32[(r7+3)];
+	r2 = r2 >> 2;
+	heap32[(r2+3)] = r7;
+	if(r5 ==r0) //_LBB146_15
+{
+break _28;
+}
+else{
+	r7 = heap32[(r6+34)];
+	r0 = (r0 + -1)|0;
+}
+}
+}
+}
+} while(0);
+	r5 = heap32[(r6+34)];
+if(!(r5 ==0)) //_LBB146_19
+{
+	r7 = heapU8[r3+140];
+if(!(r7 ==0)) //_LBB146_18
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r0 = heap32[(r7)];
+	r0 = (r0 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r7)] = r0;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r6+34)] = 0;
+}
+	r5 = r8 << 4;
+	r7 = 0;
+	heap8[r3+140] = r7;
+	heap32[(r6+34)] = 0;
+	heap32[(r6+32)] = 0;
+	heap32[(r6+33)] = 0;
+}
+	r0 = heap32[(r6+40)];
+	r2 = heap32[(r1+42)];
+if(!(r0 ==0)) //_LBB146_38
+{
+	r7 = heapU8[r3+164];
+if(!(r7 ==0)) //_LBB146_37
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r8 = (r8 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r7)] = r8;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	heap32[(r6+40)] = 0;
+}
+	r0 = (r5 + r3)|0;
+	r0 = (r0 + 172)|0;
+	r5 = 0;
+	heap8[r3+164] = r5;
+	heap32[(r6+40)] = r0;
+	heap32[(r6+38)] = r2;
+	heap32[(r6+39)] = r2;
+	r2 = heap32[(r1+42)];
+_53: do {
+	if(r4 !=0) //_LBB146_40
+{
+if(!(r2 <1)) //_LBB146_46
+{
+__label__ = 41; //SET chanka
+_55: while(true){
+	r2 = r5 << 5;
+	r4 = heap32[(r1+40)];
+	r4 = heapU16[(r4+r2)>>1];
+	r7 = r4 << 8;
+	r4 = r4 << 24;
+	r7 = r7 & 16711680;
+	r4 = r4 | r7;
+	r4 = r4 >>> 16;
+	heap16[(r0+r2)>>1] = r4;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = heapU16[(r0+2)>>1];
+	r4 = r0 << 8;
+	r0 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = heap32[(r6+40)];
+	r0 = r0 | r4;
+	r4 = (r7 + r2)|0;
+	r0 = r0 >>> 16;
+	heap16[(r4+2)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = heapU16[(r0+4)>>1];
+	r4 = r0 << 8;
+	r0 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = heap32[(r6+40)];
+	r0 = r0 | r4;
+	r4 = (r7 + r2)|0;
+	r0 = r0 >>> 16;
+	heap16[(r4+4)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = heapU16[(r0+6)>>1];
+	r4 = r0 << 8;
+	r0 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = heap32[(r6+40)];
+	r0 = r0 | r4;
+	r4 = (r7 + r2)|0;
+	r0 = r0 >>> 16;
+	heap16[(r4+6)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = heapU16[(r0+8)>>1];
+	r4 = r0 << 8;
+	r0 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = heap32[(r6+40)];
+	r0 = r0 | r4;
+	r4 = (r7 + r2)|0;
+	r0 = r0 >>> 16;
+	heap16[(r4+8)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = heapU16[(r0+10)>>1];
+	r4 = r0 << 8;
+	r0 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = heap32[(r6+40)];
+	r0 = r0 | r4;
+	r4 = (r7 + r2)|0;
+	r0 = r0 >>> 16;
+	heap16[(r4+10)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	r4 = r0 << 8;
+	r7 = r0 >>> 8;
+	r8 = heap32[(r6+40)];
+	r9 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = r7 & 65280;
+	r0 = r0 >>> 24;
+	r8 = (r8 + r2)|0;
+	r4 = r9 | r4;
+	r0 = r7 | r0;
+	r7 = r8 >> 2;
+	r0 = r4 | r0;
+	heap32[(r7+3)] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r2)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r4 = r0 << 8;
+	r7 = r0 >>> 8;
+	r8 = heap32[(r6+40)];
+	r9 = r0 << 24;
+	r4 = r4 & 16711680;
+	r7 = r7 & 65280;
+	r0 = r0 >>> 24;
+	r2 = (r8 + r2)|0;
+	r4 = r9 | r4;
+	r0 = r7 | r0;
+	r5 = (r5 + 1)|0;
+	r2 = r2 >> 2;
+	r0 = r4 | r0;
+	heap32[(r2+4)] = r0;
+	r0 = heap32[(r1+42)];
+	if(r0 <=r5) //_LBB146_46
+{
+break _53;
+}
+else{
+	r0 = heap32[(r6+40)];
+}
+}
+}
+}
+else{
+	if(r2 >0) //_LBB146_43
+{
+	r2 = 0;
+_60: while(true){
+	r4 = r2 << 5;
+	r5 = heap32[(r1+40)];
+	r5 = heapU16[(r5+r4)>>1];
+	heap16[(r0+r4)>>1] = r5;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r5 = heap32[(r6+40)];
+	r0 = heapU16[(r0+2)>>1];
+	r5 = (r5 + r4)|0;
+	heap16[(r5+2)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r5 = heap32[(r6+40)];
+	r0 = heapU16[(r0+4)>>1];
+	r5 = (r5 + r4)|0;
+	heap16[(r5+4)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r5 = heap32[(r6+40)];
+	r0 = heapU16[(r0+6)>>1];
+	r5 = (r5 + r4)|0;
+	heap16[(r5+6)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r5 = heap32[(r6+40)];
+	r0 = heapU16[(r0+8)>>1];
+	r5 = (r5 + r4)|0;
+	heap16[(r5+8)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r5 = heap32[(r6+40)];
+	r0 = heapU16[(r0+10)>>1];
+	r5 = (r5 + r4)|0;
+	heap16[(r5+10)>>1] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r0 = r0 >> 2;
+	r5 = heap32[(r6+40)];
+	r5 = (r5 + r4)|0;
+	r0 = heap32[(r0+3)];
+	r5 = r5 >> 2;
+	heap32[(r5+3)] = r0;
+	r0 = heap32[(r1+40)];
+	r0 = (r0 + r4)|0;
+	r0 = r0 >> 2;
+	r5 = heap32[(r6+40)];
+	r5 = (r5 + r4)|0;
+	r0 = heap32[(r0+4)];
+	r5 = r5 >> 2;
+	heap32[(r5+4)] = r0;
+	r0 = heap32[(r6+40)];
+	r0 = (r0 + r4)|0;
+	r0 = r0 >> 2;
+	heap32[(r0+5)] = 0;
+	r0 = heap32[(r6+40)];
+	r0 = (r0 + r4)|0;
+	r0 = r0 >> 2;
+	heap32[(r0+6)] = 0;
+	r0 = heap32[(r6+40)];
+	r0 = (r0 + r4)|0;
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0+7)] = 0;
+	r0 = heap32[(r1+42)];
+	if(r0 <=r2) //_LBB146_46
+{
+break _53;
+}
+else{
+	r0 = heap32[(r6+40)];
+}
+}
+}
+}
+} while(0);
+	r0 = heap32[(r6+40)];
+if(!(r0 ==0)) //_LBB146_50
+{
+	r1 = heapU8[r3+164];
+if(!(r1 ==0)) //_LBB146_49
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	heap32[(r6+40)] = 0;
+}
+	r0 = 0;
+	heap8[r3+164] = r0;
+	heap32[(r6+40)] = 0;
+	heap32[(r6+38)] = 0;
+	heap32[(r6+39)] = 0;
+	heap32[(r6)] = 0;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = _2E_str638;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 847;
+	_assert(i7);
+}
+}
+
+function _ZN14btQuantizedBvh16deSerializeFloatER23btQuantizedBvhFloatData(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r1 = r1 >> 2;
+	r2 = r0 >> 2;
+	heap32[(r2+5)] = heap32[(r1+4)];
+	heap32[(r2+6)] = heap32[(r1+5)];
+	heap32[(r2+7)] = heap32[(r1+6)];
+	heap32[(r2+8)] = heap32[(r1+7)];
+	heap32[(r2+1)] = heap32[(r1)];
+	heap32[(r2+2)] = heap32[(r1+1)];
+	heap32[(r2+3)] = heap32[(r1+2)];
+	heap32[(r2+4)] = heap32[(r1+3)];
+	heap32[(r2+9)] = heap32[(r1+8)];
+	heap32[(r2+10)] = heap32[(r1+9)];
+	heap32[(r2+11)] = heap32[(r1+10)];
+	heap32[(r2+12)] = heap32[(r1+11)];
+	r3 = heap32[(r1+12)];
+	heap32[(r2+14)] = r3;
+	r3 = 0;
+	r4 = heap32[(r1+13)];
+	r4 = r4 != r3;
+	r4 = r4 & 1;
+	heap8[r0+60] = r4;
+	r4 = heap32[(r2+22)];
+	r5 = heap32[(r1+14)];
+if(!(r4 >=r5)) //_LBB147_17
+{
+	r6 = heap32[(r2+23)];
+if(!(r6 >=r5)) //_LBB147_17
+{
+	if(r5 !=0) //_LBB147_4
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r8 = r5 << 6;
+	heap32[(r6)] = r7;
+	r6 = r8 | 19;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB147_6
+{
+	r7 = 0;
+	r8 = (r6 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r6 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r6;
+	r6 = r8;
+}
+}
+else{
+	r6 = 0;
+}
+	r7 = (r0 + 96)|0;
+	if(r4 <1) //_LBB147_9
+{
+	r4 = r7 >> 2;
+	r9 = heap32[(r4)];
+}
+else{
+	r8 = 0;
+_12: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = (r6 + r8)|0;
+	r11 = (r9 + r8)|0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = 64;
+	r4 = (r4 + -1)|0;
+	r8 = (r8 + 64)|0;
+	memcpy(i7);
+if(!(r4 !=0)) //_LBB147_10
+{
+break _12;
+}
+}
+	r7 = (r0 + 96)|0;
+}
+if(!(r9 ==0)) //_LBB147_16
+{
+	r4 = heapU8[r0+100];
+if(!(r4 ==0)) //_LBB147_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r8 = heap32[(r4)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r4)] = r8;
+	r4 = heap32[(r9+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r7 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r7 = r7 >> 2;
+	heap8[r0+100] = r4;
+	heap32[(r7)] = r6;
+	heap32[(r2+23)] = r5;
+}
+}
+	heap32[(r2+22)] = r5;
+_23: do {
+if(!(r5 <1)) //_LBB147_20
+{
+	r4 = 0;
+	r6 = heap32[(r1+16)];
+	r5 = (r4 - r5)|0;
+_25: while(true){
+	r7 = (r4 * -12)|0;
+	r7 = r7 << 2;
+	r8 = r4 << 6;
+	r9 = heap32[(r2+24)];
+	r7 = (r6 + r7)|0;
+	r9 = (r9 - r8)|0;
+	r7 = r7 >> 2;
+	r9 = r9 >> 2;
+	heap32[(r9+4)] = heap32[(r7+4)];
+	heap32[(r9+5)] = heap32[(r7+5)];
+	heap32[(r9+6)] = heap32[(r7+6)];
+	heap32[(r9+7)] = heap32[(r7+7)];
+	r9 = heap32[(r2+24)];
+	r9 = (r9 - r8)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = heap32[(r7)];
+	heap32[(r9+1)] = heap32[(r7+1)];
+	heap32[(r9+2)] = heap32[(r7+2)];
+	heap32[(r9+3)] = heap32[(r7+3)];
+	r9 = heap32[(r2+24)];
+	r9 = (r9 - r8)|0;
+	r10 = heap32[(r7+8)];
+	r9 = r9 >> 2;
+	heap32[(r9+8)] = r10;
+	r9 = heap32[(r2+24)];
+	r9 = (r9 - r8)|0;
+	r10 = heap32[(r7+9)];
+	r9 = r9 >> 2;
+	heap32[(r9+9)] = r10;
+	r9 = heap32[(r2+24)];
+	r8 = (r9 - r8)|0;
+	r7 = heap32[(r7+10)];
+	r4 = (r4 + -1)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+10)] = r7;
+	if(r5 !=r4) //_LBB147_19
+{
+continue _25;
+}
+else{
+break _23;
+}
+}
+}
+} while(0);
+	r4 = heap32[(r2+32)];
+	r5 = heap32[(r1+15)];
+_28: do {
+if(!(r4 >=r5)) //_LBB147_23
+{
+	r6 = (r0 + 124)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	r6 = (r5 - r4)|0;
+	r4 = r4 << 4;
+	_ZN20btAlignedObjectArrayI18btQuantizedBvhNodeE7reserveEi(i7);
+_30: while(true){
+	r7 = heap32[(r2+34)];
+	r7 = (r7 + r4)|0;
+	r7 = r7 >> 2;
+	r6 = (r6 + -1)|0;
+	r4 = (r4 + 16)|0;
+	heap32[(r7)] = 0;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	if(r6 !=0) //_LBB147_22
+{
+continue _30;
+}
+else{
+break _28;
+}
+}
+}
+} while(0);
+	heap32[(r2+32)] = r5;
+_33: do {
+if(!(r5 <1)) //_LBB147_26
+{
+	r4 = 0;
+	r6 = heap32[(r1+17)];
+	r5 = (r4 - r5)|0;
+_35: while(true){
+	r7 = r4 << 4;
+	r8 = (r6 - r7)|0;
+	r9 = r8 >> 2;
+	r10 = heap32[(r2+34)];
+	r10 = (r10 - r7)|0;
+	r9 = heap32[(r9+3)];
+	r10 = r10 >> 2;
+	heap32[(r10+3)] = r9;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+6)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+6)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+8)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+8)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+10)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+10)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+2)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+2)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r8 = heapU16[(r8+4)>>1];
+	r4 = (r4 + -1)|0;
+	r7 = (r9 - r7)|0;
+	heap16[(r7+4)>>1] = r8;
+	if(r5 !=r4) //_LBB147_25
+{
+continue _35;
+}
+else{
+break _33;
+}
+}
+}
+} while(0);
+	r4 = heap32[(r1+19)];
+	heap32[(r2+36)] = r4;
+	r4 = heap32[(r2+38)];
+	r5 = heap32[(r1+20)];
+if(!(r4 >=r5)) //_LBB147_43
+{
+	r6 = heap32[(r2+39)];
+if(!(r6 >=r5)) //_LBB147_43
+{
+	if(r5 !=0) //_LBB147_30
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r8 = r5 << 5;
+	heap32[(r6)] = r7;
+	r6 = r8 | 19;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB147_32
+{
+	r7 = 0;
+	r8 = (r6 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r6 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r6;
+	r6 = r8;
+}
+}
+else{
+	r6 = 0;
+}
+	r7 = (r0 + 160)|0;
+	if(r4 <1) //_LBB147_35
+{
+	r4 = r7 >> 2;
+	r9 = heap32[(r4)];
+}
+else{
+	r8 = 0;
+_49: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = (r9 + r8)|0;
+	r10 = r10 >> 2;
+	r11 = (r6 + r8)|0;
+	r4 = (r4 + -1)|0;
+	r8 = (r8 + 32)|0;
+	r12 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r13 = heap32[(r10+1)];
+	r14 = heap32[(r10+2)];
+	r15 = heap32[(r10+3)];
+	r16 = heap32[(r10+4)];
+	r17 = heap32[(r10+5)];
+	r18 = heap32[(r10+6)];
+	r10 = heap32[(r10+7)];
+	heap32[(r11)] = r12;
+	heap32[(r11+1)] = r13;
+	heap32[(r11+2)] = r14;
+	heap32[(r11+3)] = r15;
+	heap32[(r11+4)] = r16;
+	heap32[(r11+5)] = r17;
+	heap32[(r11+6)] = r18;
+	heap32[(r11+7)] = r10;
+if(!(r4 !=0)) //_LBB147_36
+{
+break _49;
+}
+}
+	r7 = (r0 + 160)|0;
+}
+if(!(r9 ==0)) //_LBB147_42
+{
+	r4 = heapU8[r0+164];
+if(!(r4 ==0)) //_LBB147_41
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r8 = heap32[(r4)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r4)] = r8;
+	r4 = heap32[(r9+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r7 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r7 = r7 >> 2;
+	heap8[r0+164] = r4;
+	heap32[(r7)] = r6;
+	heap32[(r2+39)] = r5;
+}
+}
+	heap32[(r2+38)] = r5;
+_60: do {
+if(!(r5 <1)) //_LBB147_46
+{
+	r0 = heap32[(r1+18)];
+	r1 = (r3 - r5)|0;
+_62: while(true){
+	r4 = (r3 * -10)|0;
+	r4 = r4 << 1;
+	r4 = (r0 + r4)|0;
+	r5 = r3 << 5;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+14)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+6)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+16)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+8)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+18)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+10)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+8)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+10)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+2)>>1] = r7;
+	r6 = (r3 * -5)|0;
+	r7 = heap32[(r2+40)];
+	r4 = heapU16[(r4+12)>>1];
+	r6 = r6 << 2;
+	r7 = (r7 - r5)|0;
+	r6 = (r0 + r6)|0;
+	heap16[(r7+4)>>1] = r4;
+	r4 = r6 >> 2;
+	r6 = heap32[(r2+40)];
+	r6 = (r6 - r5)|0;
+	r7 = heap32[(r4)];
+	r6 = r6 >> 2;
+	heap32[(r6+3)] = r7;
+	r6 = heap32[(r2+40)];
+	r5 = (r6 - r5)|0;
+	r4 = heap32[(r4+1)];
+	r3 = (r3 + -1)|0;
+	r5 = r5 >> 2;
+	heap32[(r5+4)] = r4;
+	if(r1 !=r3) //_LBB147_45
+{
+continue _62;
+}
+else{
+break _60;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN14btQuantizedBvh17deSerializeDoubleER24btQuantizedBvhDoubleData(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	f0 = llvm_readDouble((r0+32));
+	r2 = r1 >> 2;
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+5)] = f0;
+	f0 = llvm_readDouble((r0+40));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+6)] = f0;
+	f0 = llvm_readDouble((r0+48));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+7)] = f0;
+	f0 = llvm_readDouble((r0+56));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+8)] = f0;
+	f0 = llvm_readDouble((r0));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+1)] = f0;
+	f0 = llvm_readDouble((r0+8));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+2)] = f0;
+	f0 = llvm_readDouble((r0+16));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+3)] = f0;
+	f0 = llvm_readDouble((r0+24));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+4)] = f0;
+	f0 = llvm_readDouble((r0+64));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+9)] = f0;
+	f0 = llvm_readDouble((r0+72));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+10)] = f0;
+	f0 = llvm_readDouble((r0+80));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r2+11)] = f0;
+	f0 = llvm_readDouble((r0+88));
+	f0 = f0; //fdtos f0, f0
+	r0 = r0 >> 2;
+	heapFloat[(r2+12)] = f0;
+	r3 = heap32[(r0+24)];
+	heap32[(r2+14)] = r3;
+	r3 = 0;
+	r4 = heap32[(r0+25)];
+	r4 = r4 != r3;
+	r4 = r4 & 1;
+	heap8[r1+60] = r4;
+	r4 = heap32[(r2+22)];
+	r5 = heap32[(r0+26)];
+if(!(r4 >=r5)) //_LBB148_17
+{
+	r6 = heap32[(r2+23)];
+if(!(r6 >=r5)) //_LBB148_17
+{
+	if(r5 !=0) //_LBB148_4
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r8 = r5 << 6;
+	heap32[(r6)] = r7;
+	r6 = r8 | 19;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB148_6
+{
+	r7 = 0;
+	r8 = (r6 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r6 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r6;
+	r6 = r8;
+}
+}
+else{
+	r6 = 0;
+}
+	r7 = (r1 + 96)|0;
+	if(r4 <1) //_LBB148_9
+{
+	r4 = r7 >> 2;
+	r9 = heap32[(r4)];
+}
+else{
+	r8 = 0;
+_12: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = (r6 + r8)|0;
+	r11 = (r9 + r8)|0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = 64;
+	r4 = (r4 + -1)|0;
+	r8 = (r8 + 64)|0;
+	memcpy(i7);
+if(!(r4 !=0)) //_LBB148_10
+{
+break _12;
+}
+}
+	r7 = (r1 + 96)|0;
+}
+if(!(r9 ==0)) //_LBB148_16
+{
+	r4 = heapU8[r1+100];
+if(!(r4 ==0)) //_LBB148_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r8 = heap32[(r4)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r4)] = r8;
+	r4 = heap32[(r9+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r7 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r7 = r7 >> 2;
+	heap8[r1+100] = r4;
+	heap32[(r7)] = r6;
+	heap32[(r2+23)] = r5;
+}
+}
+	heap32[(r2+22)] = r5;
+_23: do {
+if(!(r5 <1)) //_LBB148_20
+{
+	r4 = 0;
+	r6 = heap32[(r0+28)];
+	r5 = (r4 - r5)|0;
+_25: while(true){
+	r7 = (r4 * -10)|0;
+	r7 = r7 << 3;
+	r8 = (r6 + r7)|0;
+	r9 = r4 << 6;
+	r10 = heap32[(r2+24)];
+	f0 = llvm_readDouble((r8+32));
+	r10 = (r10 - r9)|0;
+	r10 = r10 >> 2;
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r10+4)] = f0;
+	f0 = llvm_readDouble((r8+40));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r10+5)] = f0;
+	f0 = llvm_readDouble((r8+48));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r10+6)] = f0;
+	f0 = llvm_readDouble((r8+56));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r10+7)] = f0;
+	r10 = heap32[(r2+24)];
+	f0 = llvm_readDouble((r6+r7));
+	r7 = (r10 - r9)|0;
+	r7 = r7 >> 2;
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r7)] = f0;
+	f0 = llvm_readDouble((r8+8));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r7+1)] = f0;
+	f0 = llvm_readDouble((r8+16));
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r7+2)] = f0;
+	r10 = (r4 * -20)|0;
+	f0 = llvm_readDouble((r8+24));
+	r8 = r10 << 2;
+	f0 = f0; //fdtos f0, f0
+	r8 = (r6 + r8)|0;
+	heapFloat[(r7+3)] = f0;
+	r7 = r8 >> 2;
+	r8 = heap32[(r2+24)];
+	r8 = (r8 - r9)|0;
+	r10 = heap32[(r7+16)];
+	r8 = r8 >> 2;
+	heap32[(r8+8)] = r10;
+	r8 = heap32[(r2+24)];
+	r8 = (r8 - r9)|0;
+	r10 = heap32[(r7+17)];
+	r8 = r8 >> 2;
+	heap32[(r8+9)] = r10;
+	r8 = heap32[(r2+24)];
+	r8 = (r8 - r9)|0;
+	r7 = heap32[(r7+18)];
+	r4 = (r4 + -1)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+10)] = r7;
+	if(r5 !=r4) //_LBB148_19
+{
+continue _25;
+}
+else{
+break _23;
+}
+}
+}
+} while(0);
+	r4 = heap32[(r2+32)];
+	r5 = heap32[(r0+27)];
+_28: do {
+if(!(r4 >=r5)) //_LBB148_23
+{
+	r6 = (r1 + 124)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	r6 = (r5 - r4)|0;
+	r4 = r4 << 4;
+	_ZN20btAlignedObjectArrayI18btQuantizedBvhNodeE7reserveEi(i7);
+_30: while(true){
+	r7 = heap32[(r2+34)];
+	r7 = (r7 + r4)|0;
+	r7 = r7 >> 2;
+	r6 = (r6 + -1)|0;
+	r4 = (r4 + 16)|0;
+	heap32[(r7)] = 0;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	if(r6 !=0) //_LBB148_22
+{
+continue _30;
+}
+else{
+break _28;
+}
+}
+}
+} while(0);
+	heap32[(r2+32)] = r5;
+_33: do {
+if(!(r5 <1)) //_LBB148_26
+{
+	r4 = 0;
+	r6 = heap32[(r0+29)];
+	r5 = (r4 - r5)|0;
+_35: while(true){
+	r7 = r4 << 4;
+	r8 = (r6 - r7)|0;
+	r9 = r8 >> 2;
+	r10 = heap32[(r2+34)];
+	r10 = (r10 - r7)|0;
+	r9 = heap32[(r9+3)];
+	r10 = r10 >> 2;
+	heap32[(r10+3)] = r9;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+6)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+6)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+8)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+8)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+10)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+10)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r10 = heapU16[(r8+2)>>1];
+	r9 = (r9 - r7)|0;
+	heap16[(r9+2)>>1] = r10;
+	r9 = heap32[(r2+34)];
+	r8 = heapU16[(r8+4)>>1];
+	r4 = (r4 + -1)|0;
+	r7 = (r9 - r7)|0;
+	heap16[(r7+4)>>1] = r8;
+	if(r5 !=r4) //_LBB148_25
+{
+continue _35;
+}
+else{
+break _33;
+}
+}
+}
+} while(0);
+	r4 = heap32[(r0+30)];
+	heap32[(r2+36)] = r4;
+	r4 = heap32[(r2+38)];
+	r5 = heap32[(r0+31)];
+if(!(r4 >=r5)) //_LBB148_43
+{
+	r6 = heap32[(r2+39)];
+if(!(r6 >=r5)) //_LBB148_43
+{
+	if(r5 !=0) //_LBB148_30
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r8 = r5 << 5;
+	heap32[(r6)] = r7;
+	r6 = r8 | 19;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB148_32
+{
+	r7 = 0;
+	r8 = (r6 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r6 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r6;
+	r6 = r8;
+}
+}
+else{
+	r6 = 0;
+}
+	r7 = (r1 + 160)|0;
+	if(r4 <1) //_LBB148_35
+{
+	r4 = r7 >> 2;
+	r9 = heap32[(r4)];
+}
+else{
+	r8 = 0;
+_49: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = (r9 + r8)|0;
+	r10 = r10 >> 2;
+	r11 = (r6 + r8)|0;
+	r4 = (r4 + -1)|0;
+	r8 = (r8 + 32)|0;
+	r12 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r13 = heap32[(r10+1)];
+	r14 = heap32[(r10+2)];
+	r15 = heap32[(r10+3)];
+	r16 = heap32[(r10+4)];
+	r17 = heap32[(r10+5)];
+	r18 = heap32[(r10+6)];
+	r10 = heap32[(r10+7)];
+	heap32[(r11)] = r12;
+	heap32[(r11+1)] = r13;
+	heap32[(r11+2)] = r14;
+	heap32[(r11+3)] = r15;
+	heap32[(r11+4)] = r16;
+	heap32[(r11+5)] = r17;
+	heap32[(r11+6)] = r18;
+	heap32[(r11+7)] = r10;
+if(!(r4 !=0)) //_LBB148_36
+{
+break _49;
+}
+}
+	r7 = (r1 + 160)|0;
+}
+if(!(r9 ==0)) //_LBB148_42
+{
+	r4 = heapU8[r1+164];
+if(!(r4 ==0)) //_LBB148_41
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r8 = heap32[(r4)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r4)] = r8;
+	r4 = heap32[(r9+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r4 = r7 >> 2;
+	heap32[(r4)] = 0;
+}
+	r4 = 1;
+	r7 = r7 >> 2;
+	heap8[r1+164] = r4;
+	heap32[(r7)] = r6;
+	heap32[(r2+39)] = r5;
+}
+}
+	heap32[(r2+38)] = r5;
+_60: do {
+if(!(r5 <1)) //_LBB148_46
+{
+	r0 = heap32[(r0+32)];
+	r1 = (r3 - r5)|0;
+_62: while(true){
+	r4 = (r3 * -10)|0;
+	r4 = r4 << 1;
+	r4 = (r0 + r4)|0;
+	r5 = r3 << 5;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+14)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+6)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+16)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+8)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+18)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+10)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+8)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6)>>1] = r7;
+	r6 = heap32[(r2+40)];
+	r7 = heapU16[(r4+10)>>1];
+	r6 = (r6 - r5)|0;
+	heap16[(r6+2)>>1] = r7;
+	r6 = (r3 * -5)|0;
+	r7 = heap32[(r2+40)];
+	r4 = heapU16[(r4+12)>>1];
+	r6 = r6 << 2;
+	r7 = (r7 - r5)|0;
+	r6 = (r0 + r6)|0;
+	heap16[(r7+4)>>1] = r4;
+	r4 = r6 >> 2;
+	r6 = heap32[(r2+40)];
+	r6 = (r6 - r5)|0;
+	r7 = heap32[(r4)];
+	r6 = r6 >> 2;
+	heap32[(r6+3)] = r7;
+	r6 = heap32[(r2+40)];
+	r5 = (r6 - r5)|0;
+	r4 = heap32[(r4+1)];
+	r3 = (r3 + -1)|0;
+	r5 = r5 >> 2;
+	heap32[(r5+4)] = r4;
+	if(r1 !=r3) //_LBB148_45
+{
+continue _62;
+}
+else{
+break _60;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN14btQuantizedBvhD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btQuantizedBvh;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+40)];
+if(!(r1 ==0)) //_LBB149_4
+{
+	r3 = heapU8[r0+164];
+if(!(r3 ==0)) //_LBB149_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+40)] = 0;
+}
+	r1 = 1;
+	heap8[r0+164] = r1;
+	heap32[(r2+40)] = 0;
+	heap32[(r2+38)] = 0;
+	heap32[(r2+39)] = 0;
+	r3 = heap32[(r2+34)];
+if(!(r3 ==0)) //_LBB149_8
+{
+	r4 = heapU8[r0+140];
+if(!(r4 ==0)) //_LBB149_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+34)] = 0;
+}
+	heap8[r0+140] = r1;
+	heap32[(r2+34)] = 0;
+	heap32[(r2+32)] = 0;
+	heap32[(r2+33)] = 0;
+	r3 = heap32[(r2+29)];
+if(!(r3 ==0)) //_LBB149_12
+{
+	r4 = heapU8[r0+120];
+if(!(r4 ==0)) //_LBB149_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+29)] = 0;
+}
+	heap8[r0+120] = r1;
+	heap32[(r2+29)] = 0;
+	heap32[(r2+27)] = 0;
+	heap32[(r2+28)] = 0;
+	r3 = heap32[(r2+24)];
+if(!(r3 ==0)) //_LBB149_16
+{
+	r4 = heapU8[r0+100];
+if(!(r4 ==0)) //_LBB149_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+24)] = 0;
+}
+	heap8[r0+100] = r1;
+	heap32[(r2+24)] = 0;
+	heap32[(r2+22)] = 0;
+	heap32[(r2+23)] = 0;
+	r3 = heap32[(r2+19)];
+if(!(r3 ==0)) //_LBB149_20
+{
+	r4 = heapU8[r0+80];
+if(!(r4 ==0)) //_LBB149_19
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+19)] = 0;
+}
+	heap8[r0+80] = r1;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+17)] = 0;
+	heap32[(r2+18)] = 0;
+	return;
+}
+
+function _ZNK14btQuantizedBvh26walkStacklessQuantizedTreeEP21btNodeOverlapCallbackPtS2_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+60];
+	if(r1 !=0) //_LBB150_2
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+34)];
+	r6 = r4 << 4;
+	r7 = (r5 - r4)|0;
+	r0 = (r0 + r6)|0;
+	r6 = 0;
+_3: while(true){
+	if(r4 <r5) //_LBB150_3
+{
+	if(r6 <r7) //_LBB150_5
+{
+	r8 = heapU16[(r2)>>1];
+	r9 = heapU16[(r0+6)>>1];
+	r10 = heapU16[(r3)>>1];
+	r11 = heapU16[(r0)>>1];
+	r8 = uint(r8) > uint(r9);
+	r9 = uint(r10) < uint(r11);
+	r10 = heapU16[(r2+4)>>1];
+	r11 = heapU16[(r0+10)>>1];
+	r8 = r8 | r9;
+	r9 = uint(r10) > uint(r11);
+	r10 = heapU16[(r3+4)>>1];
+	r11 = heapU16[(r0+4)>>1];
+	r8 = r8 | r9;
+	r9 = uint(r10) < uint(r11);
+	r10 = heapU16[(r2+2)>>1];
+	r11 = heapU16[(r0+8)>>1];
+	r8 = r8 | r9;
+	r9 = uint(r10) > uint(r11);
+	r10 = heapU16[(r3+2)>>1];
+	r11 = heapU16[(r0+2)>>1];
+	r12 = r0 >> 2;
+	r8 = r8 | r9;
+	r9 = uint(r10) < uint(r11);
+	r10 = heap32[(r12+3)];
+	r6 = (r6 + 1)|0;
+	r8 = r8 | r9;
+	if(r10 <0) //_LBB150_10
+{
+__label__ = 10;
+}
+else{
+	if(r8 != 0) //_LBB150_10
+{
+__label__ = 10;
+}
+else{
+	if(r10 >-1) //_LBB150_9
+{
+	r8 = r1 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r12 = r10 >> 21;
+	r10 = r10 & 2097151;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+__label__ = 11;
+}
+else{
+__label__ = 8;
+break _3;
+}
+}
+}
+if (__label__ == 10){
+	r9 = 0;
+	r9 = r10 < r9;
+	r8 = r9 & r8;
+	if(r8 != 0) //_LBB150_12
+{
+	r8 = heap32[(r12+3)];
+	if(r8 <0) //_LBB150_14
+{
+	r9 = r8 << 4;
+	r0 = (r0 - r9)|0;
+	r4 = (r4 - r8)|0;
+continue _3;
+}
+else{
+__label__ = 13;
+break _3;
+}
+}
+}
+	r0 = (r0 + 16)|0;
+	r4 = (r4 + 1)|0;
+}
+else{
+__label__ = 4;
+break _3;
+}
+}
+else{
+__label__ = 16;
+break _3;
+}
+}
+switch(__label__ ){//multiple entries
+case 16:
+	r0 = maxIterations;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+if(!(r1 >=r6)) //_LBB150_18
+{
+	heap32[(r0)] = r6;
+}
+	return;
+break;
+case 13:
+	r0 = _2E_str941;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 75;
+	_assert(i7);
+break;
+case 8:
+	r0 = _2E_str739;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 80;
+	_assert(i7);
+break;
+case 4:
+	r0 = _2E_str1143;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 703;
+	_assert(i7);
+break;
+}
+}
+else{
+	r0 = _2E_str212;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 669;
+	_assert(i7);
+}
+}
+
+function _ZNK14btQuantizedBvh17quantizeWithClampEPtRK9btVector3i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+60];
+	if(r1 !=0) //_LBB151_2
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2)];
+	r4 = sp + -16;
+	heapFloat[(fp+-4)] = f0;
+	f1 = heapFloat[(r2+1)];
+	r5 = r4 >> 2;
+	heapFloat[(r5+1)] = f1;
+	f2 = heapFloat[(r2+2)];
+	heapFloat[(r5+2)] = f2;
+	f3 = heapFloat[(r2+3)];
+	r2 = r0 >> 2;
+	heapFloat[(r5+3)] = f3;
+	f4 = heapFloat[(r2+1)];
+	if(f0 <f4) //_LBB151_4
+{
+	heapFloat[(fp+-4)] = f4;
+	f0 = f4;
+}
+	f4 = heapFloat[(r2+2)];
+	if(f1 <f4) //_LBB151_7
+{
+	heapFloat[(r5+1)] = f4;
+	f1 = f4;
+}
+	f4 = heapFloat[(r2+3)];
+	if(f2 <f4) //_LBB151_10
+{
+	heapFloat[(r5+2)] = f4;
+	f2 = f4;
+}
+	f4 = heapFloat[(r2+4)];
+	if(f3 <f4) //_LBB151_13
+{
+	heapFloat[(r5+3)] = f4;
+	f3 = f4;
+}
+	f4 = heapFloat[(r2+5)];
+if(!(f4 >=f0)) //_LBB151_16
+{
+	heapFloat[(fp+-4)] = f4;
+}
+	f0 = heapFloat[(r2+6)];
+if(!(f0 >=f1)) //_LBB151_18
+{
+	heapFloat[(r5+1)] = f0;
+}
+	f0 = heapFloat[(r2+7)];
+if(!(f0 >=f2)) //_LBB151_20
+{
+	heapFloat[(r5+2)] = f0;
+}
+	f0 = heapFloat[(r2+8)];
+if(!(f0 >=f3)) //_LBB151_22
+{
+	heapFloat[(r5+3)] = f0;
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	return;
+}
+else{
+	r0 = _2E_str212;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 420;
+	_assert(i7);
+}
+}
+
+function _ZNK14btQuantizedBvh42walkRecursiveQuantizedTreeAgainstQueryAabbEPK18btQuantizedBvhNodeP21btNodeOverlapCallbackPtS5_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+4)];
+_1: while(true){
+	r5 = heapU8[r0+60];
+	if(r5 !=0) //_LBB152_3
+{
+	r5 = heapU16[(r3)>>1];
+	r6 = heapU16[(r1+6)>>1];
+	if(uint(r5) >uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = heapU16[(r4)>>1];
+	r6 = heapU16[(r1)>>1];
+	r5 = r5 & 65535;
+	r6 = r6 & 65535;
+	if(uint(r5) <uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = heapU16[(r3+4)>>1];
+	r6 = heapU16[(r1+10)>>1];
+	r5 = r5 & 65535;
+	r6 = r6 & 65535;
+	if(uint(r5) >uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = heapU16[(r4+4)>>1];
+	r6 = heapU16[(r1+4)>>1];
+	r5 = r5 & 65535;
+	r6 = r6 & 65535;
+	if(uint(r5) <uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = heapU16[(r3+2)>>1];
+	r6 = heapU16[(r1+8)>>1];
+	r5 = r5 & 65535;
+	r6 = r6 & 65535;
+	if(uint(r5) >uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = heapU16[(r4+2)>>1];
+	r6 = heapU16[(r1+2)>>1];
+	r5 = r5 & 65535;
+	r6 = r6 & 65535;
+	if(uint(r5) <uint(r6)) //_LBB152_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	r5 = r1 >> 2;
+	r6 = heap32[(r5+3)];
+	if(r6 <0) //_LBB152_11
+{
+	r6 = (r1 + 16)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	_ZNK14btQuantizedBvh42walkRecursiveQuantizedTreeAgainstQueryAabbEPK18btQuantizedBvhNodeP21btNodeOverlapCallbackPtS5_(i7);
+	r5 = heap32[(r5+7)];
+	if(r5 <0) //_LBB152_13
+{
+	r6 = 1;
+	r5 = (r6 - r5)|0;
+	r5 = r5 << 4;
+	r1 = (r1 + r5)|0;
+continue _1;
+}
+else{
+	r1 = (r1 + 32)|0;
+continue _1;
+}
+}
+else{
+__label__ = 10;
+break _1;
+}
+}
+}
+}
+}
+}
+}
+}
+else{
+__label__ = 2;
+break _1;
+}
+}
+switch(__label__ ){//multiple entries
+case 14:
+	return;
+break;
+case 2:
+	r0 = _2E_str212;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 419;
+	_assert(i7);
+break;
+case 10:
+	r0 = r2 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	r1 = r6 >> 21;
+	r3 = r6 & 2097151;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+break;
+}
+}
+
+function _ZNK14btQuantizedBvh26reportAabbOverlappingNodexEP21btNodeOverlapCallbackRK9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heapU8[r0+60];
+_1: do {
+	if(r4 ==0) //_LBB153_20
+{
+	r0 = r0 >> 2;
+	r4 = heap32[(r0+24)];
+	r5 = 0;
+	r6 = r5;
+_3: while(true){
+	r7 = heap32[(r0+14)];
+	if(r7 >r5) //_LBB153_21
+{
+	if(r7 >r6) //_LBB153_23
+{
+	r7 = r2 >> 2;
+	r8 = r4 >> 2;
+	r6 = (r6 + 1)|0;
+	f0 = heapFloat[(r7)];
+	f1 = heapFloat[(r8+4)];
+	if(f0 >f1) //_LBB153_26
+{
+__label__ = 26;
+}
+else{
+	r9 = r3 >> 2;
+	f0 = heapFloat[(r9)];
+	f1 = heapFloat[(r8)];
+	if(f0 <f1) //_LBB153_26
+{
+__label__ = 26;
+}
+else{
+	r9 = 1;
+__label__ = 27;
+}
+}
+if (__label__ == 26){
+	r9 = 0;
+}
+	f0 = heapFloat[(r7+2)];
+	f1 = heapFloat[(r8+6)];
+	if(f0 >f1) //_LBB153_30
+{
+__label__ = 29;
+}
+else{
+	r10 = r3 >> 2;
+	f0 = heapFloat[(r10+2)];
+	f1 = heapFloat[(r8+2)];
+	if(f0 <f1) //_LBB153_30
+{
+__label__ = 29;
+}
+else{
+__label__ = 30;
+}
+}
+if (__label__ == 29){
+	r9 = 0;
+}
+	f0 = heapFloat[(r7+1)];
+	f1 = heapFloat[(r8+5)];
+	if(f0 <=f1) //_LBB153_33
+{
+	r7 = r3 >> 2;
+	f0 = heapFloat[(r7+1)];
+	f1 = heapFloat[(r8+1)];
+	r7 = 0;
+	r10 = heap32[(r8+8)];
+	r11 = -1;
+	r9 = f0 < f1 ? r7 : r9;
+	r7 = r10 == r11;
+	r12 = r9 & 255;
+if(!(r12 ==0)) //_LBB153_35
+{
+	r10 = r10 != r11;
+	r10 = r10 & 1;
+	if(r10 ==0) //_LBB153_36
+{
+	r10 = r1 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	r11 = heap32[(r8+10)];
+	r12 = heap32[(r8+9)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+}
+}
+}
+else{
+	r7 = heap32[(r8+8)];
+	r9 = -1;
+	r7 = r7 == r9;
+	r9 = 0;
+}
+	r9 = r9 & 255;
+if(!(r9 !=0)) //_LBB153_39
+{
+	r7 = r7 & 1;
+	if(r7 ==0) //_LBB153_40
+{
+	r7 = heap32[(r8+8)];
+	r8 = r7 << 6;
+	r4 = (r4 + r8)|0;
+	r5 = (r7 + r5)|0;
+continue _3;
+}
+}
+	r4 = (r4 + 64)|0;
+	r5 = (r5 + 1)|0;
+}
+else{
+__label__ = 22;
+break _3;
+}
+}
+else{
+__label__ = 40;
+break _3;
+}
+}
+switch(__label__ ){//multiple entries
+case 40:
+	r0 = maxIterations;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	if(r1 >=r6) //_LBB153_17
+{
+break _1;
+}
+else{
+	heap32[(r0)] = r6;
+	return;
+}
+break;
+case 22:
+	r0 = _2E_str1921;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 367;
+	_assert(i7);
+break;
+}
+}
+else{
+	r4 = sp + -6;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = 0;
+	_ZNK14btQuantizedBvh17quantizeWithClampEPtRK9btVector3i(i7);
+	r2 = sp + -12;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = 1;
+	r3 = r0 >> 2;
+	_ZNK14btQuantizedBvh17quantizeWithClampEPtRK9btVector3i(i7);
+	r5 = heap32[(r3+36)];
+	if(r5 ==2) //_LBB153_18
+{
+	r3 = heap32[(r3+34)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r2;
+	_ZNK14btQuantizedBvh42walkRecursiveQuantizedTreeAgainstQueryAabbEPK18btQuantizedBvhNodeP21btNodeOverlapCallbackPtS5_(i7);
+	return;
+}
+else{
+	if(r5 ==1) //_LBB153_5
+{
+	r5 = heapU8[r0+60];
+	if(r5 ==0) //_LBB153_7
+{
+	r2 = _2E_str212;
+	r3 = _2E_str537;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 735;
+	_assert(i7);
+}
+else{
+	r5 = heap32[(r3+38)];
+	if(r5 >0) //_LBB153_8
+{
+	r5 = 0;
+_42: while(true){
+	r6 = heap32[(r3+40)];
+	r7 = r5 << 5;
+	r8 = (r6 + r7)|0;
+	r9 = heapU16[(sp+-6)>>1];
+	r10 = heapU16[(r8+6)>>1];
+if(!(uint(r9) >uint(r10))) //_LBB153_16
+{
+	r9 = heapU16[(sp+-12)>>1];
+	r6 = heapU16[(r6+r7)>>1];
+	r7 = r9 & 65535;
+	r6 = r6 & 65535;
+if(!(uint(r7) <uint(r6))) //_LBB153_16
+{
+	r6 = heapU16[(sp+-2)>>1];
+	r7 = heapU16[(r8+10)>>1];
+	r6 = r6 & 65535;
+	r7 = r7 & 65535;
+if(!(uint(r6) >uint(r7))) //_LBB153_16
+{
+	r6 = heapU16[(sp+-8)>>1];
+	r7 = heapU16[(r8+4)>>1];
+	r6 = r6 & 65535;
+	r7 = r7 & 65535;
+if(!(uint(r6) <uint(r7))) //_LBB153_16
+{
+	r6 = heapU16[(sp+-4)>>1];
+	r7 = heapU16[(r8+8)>>1];
+	r6 = r6 & 65535;
+	r7 = r7 & 65535;
+if(!(uint(r6) >uint(r7))) //_LBB153_16
+{
+	r6 = heapU16[(sp+-10)>>1];
+	r7 = heapU16[(r8+2)>>1];
+	r6 = r6 & 65535;
+	r7 = r7 & 65535;
+if(!(uint(r6) <uint(r7))) //_LBB153_16
+{
+	r6 = r8 >> 2;
+	r7 = heap32[(r6+3)];
+	r6 = heap32[(r6+4)];
+	r6 = (r6 + r7)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r6;
+	_ZNK14btQuantizedBvh26walkStacklessQuantizedTreeEP21btNodeOverlapCallbackPtS2_ii(i7);
+}
+}
+}
+}
+}
+}
+	r5 = (r5 + 1)|0;
+	r6 = heap32[(r3+38)];
+	if(r6 >r5) //_LBB153_9
+{
+continue _42;
+}
+else{
+break _1;
+}
+}
+}
+else{
+break _1;
+}
+}
+}
+else{
+	if(r5 !=0) //_LBB153_19
+{
+	r0 = _2E_str10;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 341;
+	_assert(i7);
+}
+else{
+	r3 = heap32[(r3+14)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = 0;
+	heap32[(g0+5)] = r3;
+	_ZNK14btQuantizedBvh26walkStacklessQuantizedTreeEP21btNodeOverlapCallbackPtS2_ii(i7);
+	return;
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN14btQuantizedBvh9buildTreeEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r2 = (r1 - r0)|0;
+	if(r2 >0) //_LBB154_2
+{
+	r3 = heap32[(fp)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+14)];
+	if(r2 !=1) //_LBB154_7
+{
+_5: do {
+	if(r0 <r1) //_LBB154_9
+{
+	r6 = heapU8[r3+60];
+	f1 =                         0;
+	r7 = r0;
+	f2 = f1;
+	f3 = f1;
+_7: while(true){
+	r8 = r6 & 255;
+	if(r8 ==0) //_LBB154_12
+{
+	r9 = heap32[(r4+19)];
+	r10 = r7 << 6;
+	r9 = (r9 + r10)|0;
+	r9 = r9 >> 2;
+	f0 = heapFloat[(r9)];
+	f5 = heapFloat[(r9+1)];
+	f8 = heapFloat[(r9+2)];
+	f4 = heapFloat[(r9+4)];
+	f6 = heapFloat[(r9+5)];
+	f7 = heapFloat[(r9+6)];
+}
+else{
+	r9 = heap32[(r4+29)];
+	r10 = r7 << 4;
+	r11 = (r9 + r10)|0;
+	r9 = heapU16[(r9+r10)>>1];
+	r10 = heapU16[(r11+2)>>1];
+	r12 = heapU16[(r11+4)>>1];
+	r13 = heapU16[(r11+6)>>1];
+	r14 = heapU16[(r11+8)>>1];
+	r11 = heapU16[(r11+10)>>1];
+	f0 = uint(r9); //fuitos r9, f0
+	f4 = heapFloat[(r4+9)];
+	f5 = uint(r13); //fuitos r13, f5
+	f6 = uint(r10); //fuitos r10, f6
+	f7 = heapFloat[(r4+10)];
+	f8 = uint(r14); //fuitos r14, f8
+	f9 = uint(r12); //fuitos r12, f9
+	f10 = heapFloat[(r4+11)];
+	f11 = uint(r11); //fuitos r11, f11
+	f0 = f0/f4;
+	f12 = heapFloat[(r4+1)];
+	f4 = f5/f4;
+	f5 = f6/f7;
+	f6 = heapFloat[(r4+2)];
+	f7 = f8/f7;
+	f8 = f9/f10;
+	f9 = heapFloat[(r4+3)];
+	f10 = f11/f10;
+	f0 = f0+f12;
+	f5 = f5+f6;
+	f8 = f8+f9;
+	f4 = f4+f12;
+	f6 = f7+f6;
+	f7 = f10+f9;
+}
+	f0 = f4+f0;
+	f4 =                       0.5;
+	f5 = f6+f5;
+	f6 = f7+f8;
+	f0 = f0*f4;
+	f5 = f5*f4;
+	f6 = f6*f4;
+	r7 = (r7 + 1)|0;
+	f3 = f3+f0;
+	f2 = f2+f5;
+	f1 = f1+f6;
+if(!(r1 !=r7)) //_LBB154_10
+{
+break _7;
+}
+}
+	f0 = r2; //fitos r2, f0
+	if(r0 <r1) //_LBB154_16
+{
+	f5 =                         1;
+	f5 = f5/f0;
+	f6 = f3*f5;
+	f7 = f2*f5;
+	f5 = f1*f5;
+	f1 =                         0;
+	r6 = r0;
+	f2 = f1;
+	f3 = f1;
+_16: while(true){
+	if(r8 ==0) //_LBB154_19
+{
+	r7 = heap32[(r4+19)];
+	r9 = r6 << 6;
+	r7 = (r7 + r9)|0;
+	r7 = r7 >> 2;
+	f8 = heapFloat[(r7)];
+	f10 = heapFloat[(r7+1)];
+	f13 = heapFloat[(r7+2)];
+	f9 = heapFloat[(r7+4)];
+	f11 = heapFloat[(r7+5)];
+	f12 = heapFloat[(r7+6)];
+}
+else{
+	r7 = heap32[(r4+29)];
+	r9 = r6 << 4;
+	r10 = (r7 + r9)|0;
+	r7 = heapU16[(r7+r9)>>1];
+	r9 = heapU16[(r10+2)>>1];
+	r11 = heapU16[(r10+4)>>1];
+	r12 = heapU16[(r10+6)>>1];
+	r13 = heapU16[(r10+8)>>1];
+	r10 = heapU16[(r10+10)>>1];
+	f8 = uint(r7); //fuitos r7, f8
+	f9 = heapFloat[(r4+9)];
+	f10 = uint(r12); //fuitos r12, f10
+	f11 = uint(r9); //fuitos r9, f11
+	f12 = heapFloat[(r4+10)];
+	f13 = uint(r13); //fuitos r13, f13
+	f14 = uint(r11); //fuitos r11, f14
+	f15 = heapFloat[(r4+11)];
+	f16 = uint(r10); //fuitos r10, f16
+	f8 = f8/f9;
+	f17 = heapFloat[(r4+1)];
+	f9 = f10/f9;
+	f10 = f11/f12;
+	f11 = heapFloat[(r4+2)];
+	f12 = f13/f12;
+	f13 = f14/f15;
+	f14 = heapFloat[(r4+3)];
+	f15 = f16/f15;
+	f8 = f8+f17;
+	f10 = f10+f11;
+	f13 = f13+f14;
+	f9 = f9+f17;
+	f11 = f12+f11;
+	f12 = f15+f14;
+}
+	f8 = f9+f8;
+	f9 = f11+f10;
+	f10 = f12+f13;
+	f8 = f8*f4;
+	f9 = f9*f4;
+	f10 = f10*f4;
+	f8 = f8-f6;
+	f9 = f9-f7;
+	f10 = f10-f5;
+	f8 = f8*f8;
+	f9 = f9*f9;
+	f10 = f10*f10;
+	r6 = (r6 + 1)|0;
+	f3 = f3+f8;
+	f2 = f2+f9;
+	f1 = f1+f10;
+if(!(r1 !=r6)) //_LBB154_17
+{
+break _5;
+}
+}
+}
+else{
+	f1 =                         0;
+	f2 = f1;
+	f3 = f1;
+}
+}
+else{
+	f0 = r2; //fitos r2, f0
+	f1 =                         0;
+	f2 = f1;
+	f3 = f1;
+}
+} while(0);
+	f4 =                        -1;
+	f5 =                         1;
+	f0 = f0+f4;
+	f0 = f5/f0;
+	f3 = f3*f0;
+	f2 = f2*f0;
+	f0 = f1*f0;
+	if(f3 >=f2) //_LBB154_23
+{
+	r6 = 2;
+	r7 = 0;
+	r6 = f3 < f0 ? r6 : r7;
+}
+else{
+	r6 = 2;
+	r7 = 1;
+	r6 = f2 < f0 ? r6 : r7;
+}
+	r7 = sp + -32;
+	r8 = r7 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r8+1)] = 0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	if(r0 <r1) //_LBB154_26
+{
+	r9 = heapU8[r3+60];
+	f0 =                         0;
+	r10 = r0;
+	f1 = f0;
+	f2 = f0;
+_31: while(true){
+	r11 = r9 & 255;
+	if(r11 ==0) //_LBB154_29
+{
+	r11 = heap32[(r4+19)];
+	r12 = r10 << 6;
+	r11 = (r11 + r12)|0;
+	r11 = r11 >> 2;
+	f3 = heapFloat[(r11)];
+	f6 = heapFloat[(r11+1)];
+	f9 = heapFloat[(r11+2)];
+	f4 = heapFloat[(r11+4)];
+	f7 = heapFloat[(r11+5)];
+	f8 = heapFloat[(r11+6)];
+}
+else{
+	r11 = heap32[(r4+29)];
+	r12 = r10 << 4;
+	r13 = (r11 + r12)|0;
+	r11 = heapU16[(r11+r12)>>1];
+	r12 = heapU16[(r13+2)>>1];
+	r14 = heapU16[(r13+4)>>1];
+	r15 = heapU16[(r13+6)>>1];
+	r16 = heapU16[(r13+8)>>1];
+	r13 = heapU16[(r13+10)>>1];
+	f3 = uint(r11); //fuitos r11, f3
+	f4 = heapFloat[(r4+9)];
+	f6 = uint(r15); //fuitos r15, f6
+	f7 = uint(r12); //fuitos r12, f7
+	f8 = heapFloat[(r4+10)];
+	f9 = uint(r16); //fuitos r16, f9
+	f10 = uint(r14); //fuitos r14, f10
+	f11 = heapFloat[(r4+11)];
+	f12 = uint(r13); //fuitos r13, f12
+	f3 = f3/f4;
+	f13 = heapFloat[(r4+1)];
+	f4 = f6/f4;
+	f6 = f7/f8;
+	f7 = heapFloat[(r4+2)];
+	f8 = f9/f8;
+	f9 = f10/f11;
+	f10 = heapFloat[(r4+3)];
+	f11 = f12/f11;
+	f3 = f3+f13;
+	f6 = f6+f7;
+	f9 = f9+f10;
+	f4 = f4+f13;
+	f7 = f8+f7;
+	f8 = f11+f10;
+}
+	f3 = f4+f3;
+	f4 =                       0.5;
+	f6 = f7+f6;
+	f7 = f8+f9;
+	f3 = f3*f4;
+	f6 = f6*f4;
+	f4 = f7*f4;
+	r10 = (r10 + 1)|0;
+	f2 = f2+f3;
+	f1 = f1+f6;
+	f0 = f0+f4;
+if(!(r1 !=r10)) //_LBB154_27
+{
+break _31;
+}
+}
+	heapFloat[(r8+2)] = f0;
+	heapFloat[(r8+1)] = f1;
+	heapFloat[(fp+-8)] = f2;
+}
+else{
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+}
+	f3 = r2; //fitos r2, f3
+	f3 = f5/f3;
+	f2 = f2*f3;
+	f1 = f1*f3;
+	heapFloat[(fp+-8)] = f2;
+	f0 = f0*f3;
+	heapFloat[(r8+1)] = f1;
+	heapFloat[(r8+2)] = f0;
+_40: do {
+	if(r0 <r1) //_LBB154_34
+{
+	r8 = r6 << 2;
+	r6 = (r7 + r8)|0;
+	r6 = r6 >> 2;
+	f0 = heapFloat[(r6)];
+	r6 = r0 << 4;
+	r7 = (r0 - r1)|0;
+	r9 = r0 << 6;
+	r10 = r6 | 12;
+	r11 = 0;
+	r12 = r9;
+	r6 = r0;
+_42: while(true){
+	r13 = heapU8[r3+60];
+	if(r13 ==0) //_LBB154_37
+{
+	r14 = r11 << 4;
+	r15 = heap32[(r4+19)];
+	r15 = (r15 + r9)|0;
+	r14 = r14 << 2;
+	r14 = (r15 - r14)|0;
+	r14 = r14 >> 2;
+	f1 = heapFloat[(r14)];
+	f3 = heapFloat[(r14+1)];
+	f6 = heapFloat[(r14+2)];
+	f2 = heapFloat[(r14+4)];
+	f4 = heapFloat[(r14+5)];
+	f5 = heapFloat[(r14+6)];
+}
+else{
+	r14 = heap32[(r4+29)];
+	r14 = (r14 + r10)|0;
+	r15 = r11 << 4;
+	r14 = (r14 - r15)|0;
+	r15 = heapU16[(r14+-12)>>1];
+	r16 = heapU16[(r14+-10)>>1];
+	r17 = heapU16[(r14+-8)>>1];
+	r18 = heapU16[(r14+-6)>>1];
+	r19 = heapU16[(r14+-4)>>1];
+	r14 = heapU16[(r14+-2)>>1];
+	f1 = uint(r15); //fuitos r15, f1
+	f2 = heapFloat[(r4+9)];
+	f3 = uint(r18); //fuitos r18, f3
+	f4 = uint(r16); //fuitos r16, f4
+	f5 = heapFloat[(r4+10)];
+	f6 = uint(r19); //fuitos r19, f6
+	f7 = uint(r17); //fuitos r17, f7
+	f8 = heapFloat[(r4+11)];
+	f9 = uint(r14); //fuitos r14, f9
+	f1 = f1/f2;
+	f10 = heapFloat[(r4+1)];
+	f2 = f3/f2;
+	f3 = f4/f5;
+	f4 = heapFloat[(r4+2)];
+	f5 = f6/f5;
+	f6 = f7/f8;
+	f7 = heapFloat[(r4+3)];
+	f8 = f9/f8;
+	f1 = f1+f10;
+	f3 = f3+f4;
+	f6 = f6+f7;
+	f2 = f2+f10;
+	f4 = f5+f4;
+	f5 = f8+f7;
+}
+	f1 = f2+f1;
+	f2 =                       0.5;
+	r14 = sp + -48;
+	f3 = f4+f3;
+	f1 = f1*f2;
+	f4 = f5+f6;
+	r15 = r14 >> 2;
+	f3 = f3*f2;
+	heapFloat[(fp+-12)] = f1;
+	f1 = f4*f2;
+	heapFloat[(r15+1)] = f3;
+	r14 = (r14 + r8)|0;
+	heapFloat[(r15+2)] = f1;
+	r14 = r14 >> 2;
+	heap32[(r15+3)] = 0;
+	f1 = heapFloat[(r14)];
+	if(f1 >f0) //_LBB154_40
+{
+	if(r13 ==0) //_LBB154_42
+{
+	r13 = r11 << 4;
+	r14 = heap32[(r4+19)];
+	r15 = (r14 + r9)|0;
+	r13 = r13 << 2;
+	r13 = (r15 - r13)|0;
+	r13 = r13 >> 2;
+	r15 = heap32[(r13+15)];
+	r16 = heap32[(r13+14)];
+	r17 = heap32[(r13+13)];
+	r18 = heap32[(r13+12)];
+	r19 = heap32[(r13+11)];
+	r20 = heap32[(r13+10)];
+	r21 = heap32[(r13+9)];
+	r22 = heap32[(r13+8)];
+	f1 = heapFloat[(r13+7)];
+	f2 = heapFloat[(r13+6)];
+	f3 = heapFloat[(r13+5)];
+	f4 = heapFloat[(r13+4)];
+	f5 = heapFloat[(r13+3)];
+	f6 = heapFloat[(r13+2)];
+	f7 = heapFloat[(r13+1)];
+	f8 = heapFloat[(r13)];
+	r13 = r6 << 6;
+	r23 = (r14 + r12)|0;
+	r14 = (r14 + r13)|0;
+	heap32[(g0)] = r23;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = 64;
+	memcpy(i7);
+	r14 = heap32[(r4+19)];
+	r13 = (r14 + r13)|0;
+	r13 = r13 >> 2;
+	heapFloat[(r13)] = f8;
+	heapFloat[(r13+1)] = f7;
+	heapFloat[(r13+2)] = f6;
+	heapFloat[(r13+3)] = f5;
+	heapFloat[(r13+4)] = f4;
+	heapFloat[(r13+5)] = f3;
+	heapFloat[(r13+6)] = f2;
+	heapFloat[(r13+7)] = f1;
+	heap32[(r13+8)] = r22;
+	heap32[(r13+9)] = r21;
+	heap32[(r13+10)] = r20;
+	heap32[(r13+11)] = r19;
+	heap32[(r13+12)] = r18;
+	heap32[(r13+13)] = r17;
+	heap32[(r13+14)] = r16;
+	heap32[(r13+15)] = r15;
+}
+else{
+	r13 = heap32[(r4+29)];
+	r14 = (r13 + r10)|0;
+	r15 = r11 << 4;
+	r14 = (r14 - r15)|0;
+	r15 = r6 << 4;
+	r16 = r14 >> 2;
+	r17 = heap32[(r16)];
+	r18 = heapU16[(r14+-2)>>1];
+	r19 = heapU16[(r14+-4)>>1];
+	r20 = heapU16[(r14+-6)>>1];
+	r21 = heapU16[(r14+-8)>>1];
+	r22 = heapU16[(r14+-10)>>1];
+	r23 = heapU16[(r13+r15)>>1];
+	r24 = heapU16[(r14+-12)>>1];
+	r13 = (r13 + r15)|0;
+	heap16[(r14+-12)>>1] = r23;
+	r23 = heapU16[(r13+2)>>1];
+	heap16[(r14+-10)>>1] = r23;
+	r23 = heapU16[(r13+4)>>1];
+	heap16[(r14+-8)>>1] = r23;
+	r23 = heapU16[(r13+6)>>1];
+	heap16[(r14+-6)>>1] = r23;
+	r23 = heapU16[(r13+8)>>1];
+	heap16[(r14+-4)>>1] = r23;
+	r23 = heapU16[(r13+10)>>1];
+	r13 = r13 >> 2;
+	heap16[(r14+-2)>>1] = r23;
+	r13 = heap32[(r13+3)];
+	heap32[(r16)] = r13;
+	r13 = heap32[(r4+29)];
+	r14 = (r13 + r15)|0;
+	heap16[(r13+r15)>>1] = r24;
+	heap16[(r14+2)>>1] = r22;
+	heap16[(r14+4)>>1] = r21;
+	heap16[(r14+6)>>1] = r20;
+	heap16[(r14+8)>>1] = r19;
+	r13 = r14 >> 2;
+	heap16[(r14+10)>>1] = r18;
+	heap32[(r13+3)] = r17;
+}
+	r6 = (r6 + 1)|0;
+}
+	r11 = (r11 + -1)|0;
+	r12 = (r12 + 64)|0;
+if(!(r7 !=r11)) //_LBB154_35
+{
+break _40;
+}
+}
+}
+else{
+	r6 = r0;
+}
+} while(0);
+	r7 = (r2 / 3)|0;
+	r8 = (r7 + r0)|0;
+	if(r8 >=r6) //_LBB154_48
+{
+__label__ = 46;
+}
+else{
+	r8 = (r1 + -1)|0;
+	r7 = (r8 - r7)|0;
+	if(r7 <=r6) //_LBB154_48
+{
+__label__ = 46;
+}
+else{
+__label__ = 47;
+}
+}
+if (__label__ == 46){
+	r6 = r2 >> 1;
+	r6 = (r6 + r0)|0;
+}
+if(!(r6 ==r0)) //_LBB154_51
+{
+	if(r6 !=r1) //_LBB154_52
+{
+	r2 = heap32[(r4+14)];
+	heap32[(fp+-21)] = r2;
+	r2 = heapU8[r3+60];
+	if(r2 ==0) //_LBB154_54
+{
+	r2 = heap32[(fp+-21)];
+	r2 = r2 << 6;
+	r7 = heap32[(r4+24)];
+	r2 = (r7 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r4+5)];
+	heap32[(r2+1)] = heap32[(r4+6)];
+	heap32[(r2+2)] = heap32[(r4+7)];
+	heap32[(r2+3)] = heap32[(r4+8)];
+}
+else{
+	r2 = heap32[(r4+34)];
+	r7 = heap32[(fp+-21)];
+	r7 = r7 << 4;
+	r2 = (r2 + r7)|0;
+	r7 = (r3 + 20)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = 0;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+}
+	r2 = heap32[(r4+14)];
+	r7 = heapU8[r3+60];
+	if(r7 ==0) //_LBB154_57
+{
+	r2 = r2 << 6;
+	r7 = heap32[(r4+24)];
+	r2 = (r7 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2+4)] = heap32[(r4+1)];
+	heap32[(r2+5)] = heap32[(r4+2)];
+	heap32[(r2+6)] = heap32[(r4+3)];
+	heap32[(r2+7)] = heap32[(r4+4)];
+}
+else{
+	r7 = heap32[(r4+34)];
+	r2 = r2 << 4;
+	r2 = (r7 + r2)|0;
+	r2 = (r2 + 6)|0;
+	r7 = (r3 + 4)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = 1;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+}
+_73: do {
+if(!(r0 >=r1)) //_LBB154_95
+{
+	r2 = r0;
+_75: while(true){
+	r7 = heapU8[r3+60];
+_77: do {
+	if(r7 ==0) //_LBB154_69
+{
+	r7 = heap32[(r4+19)];
+	r8 = r2 << 6;
+	r7 = (r7 + r8)|0;
+	r7 = r7 >> 2;
+	f0 = heapFloat[(r7+4)];
+	r8 = sp + -80;
+	heapFloat[(fp+-20)] = f0;
+	f1 = heapFloat[(r7+5)];
+	r8 = r8 >> 2;
+	heapFloat[(r8+1)] = f1;
+	f2 = heapFloat[(r7+6)];
+	heapFloat[(r8+2)] = f2;
+	f3 = heapFloat[(r7+7)];
+	heapFloat[(r8+3)] = f3;
+	f4 = heapFloat[(r7)];
+	r8 = sp + -64;
+	heapFloat[(fp+-16)] = f4;
+	f5 = heapFloat[(r7+1)];
+	r8 = r8 >> 2;
+	heapFloat[(r8+1)] = f5;
+	f6 = heapFloat[(r7+2)];
+	heapFloat[(r8+2)] = f6;
+	f7 = heapFloat[(r7+3)];
+	heapFloat[(r8+3)] = f7;
+	r7 = heap32[(r4+14)];
+	r8 = heap32[(r4+24)];
+	r7 = r7 << 6;
+	r8 = (r8 + r7)|0;
+	r8 = r8 >> 2;
+	f8 = heapFloat[(r8)];
+if(!(f4 >=f8)) //_LBB154_71
+{
+	heapFloat[(r8)] = f4;
+}
+	f4 = heapFloat[(r8+1)];
+if(!(f5 >=f4)) //_LBB154_73
+{
+	heapFloat[(r8+1)] = f5;
+}
+	f4 = heapFloat[(r8+2)];
+if(!(f6 >=f4)) //_LBB154_75
+{
+	heapFloat[(r8+2)] = f6;
+}
+	f4 = heapFloat[(r8+3)];
+if(!(f7 >=f4)) //_LBB154_77
+{
+	heapFloat[(r8+3)] = f7;
+}
+	r8 = heap32[(r4+24)];
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	f4 = heapFloat[(r7+4)];
+if(!(f4 >=f0)) //_LBB154_79
+{
+	heapFloat[(r7+4)] = f0;
+}
+	f0 = heapFloat[(r7+5)];
+if(!(f0 >=f1)) //_LBB154_81
+{
+	heapFloat[(r7+5)] = f1;
+}
+	f0 = heapFloat[(r7+6)];
+if(!(f0 >=f2)) //_LBB154_83
+{
+	heapFloat[(r7+6)] = f2;
+}
+	f0 = heapFloat[(r7+7)];
+	if(f0 >=f3) //_LBB154_94
+{
+break _77;
+}
+else{
+	heapFloat[(r7+7)] = f3;
+}
+}
+else{
+	r7 = heap32[(r4+29)];
+	r8 = r2 << 4;
+	r9 = (r7 + r8)|0;
+	r10 = sp + -80;
+	r11 = heapU16[(r9+10)>>1];
+	r12 = heapU16[(r9+8)>>1];
+	r13 = heapU16[(r9+6)>>1];
+	f0 = heapFloat[(r4+11)];
+	f1 = heapFloat[(r4+10)];
+	f2 = heapFloat[(r4+9)];
+	r14 = r10 >> 2;
+	f3 = uint(r13); //fuitos r13, f3
+	heap32[(r14+3)] = 0;
+	f3 = f3/f2;
+	f4 = heapFloat[(r4+1)];
+	f3 = f3+f4;
+	f5 = uint(r12); //fuitos r12, f5
+	heapFloat[(fp+-20)] = f3;
+	f3 = f5/f1;
+	f5 = heapFloat[(r4+2)];
+	f3 = f3+f5;
+	f6 = uint(r11); //fuitos r11, f6
+	heapFloat[(r14+1)] = f3;
+	f3 = f6/f0;
+	f6 = heapFloat[(r4+3)];
+	f3 = f3+f6;
+	heapFloat[(r14+2)] = f3;
+	r7 = heapU16[(r7+r8)>>1];
+	r8 = sp + -64;
+	f3 = uint(r7); //fuitos r7, f3
+	r7 = heapU16[(r9+4)>>1];
+	r9 = heapU16[(r9+2)>>1];
+	f7 = uint(r9); //fuitos r9, f7
+	f2 = f3/f2;
+	r9 = r8 >> 2;
+	f3 = uint(r7); //fuitos r7, f3
+	f1 = f7/f1;
+	f2 = f2+f4;
+	heap32[(r9+3)] = 0;
+	f0 = f3/f0;
+	f1 = f1+f5;
+	heapFloat[(fp+-16)] = f2;
+	f0 = f0+f6;
+	heapFloat[(r9+1)] = f1;
+	heapFloat[(r9+2)] = f0;
+	r7 = heap32[(r4+14)];
+	r9 = sp + -6;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = 0;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r8 = sp + -12;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = 1;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r8 = heapU16[(sp+-6)>>1];
+	r9 = heap32[(r4+34)];
+	r7 = r7 << 4;
+	r10 = heapU16[(r9+r7)>>1];
+	if(uint(r10) >uint(r8)) //_LBB154_63
+{
+	heap16[(r9+r7)>>1] = r8;
+	r9 = heap32[(r4+34)];
+}
+	r8 = (r9 + r7)|0;
+	r10 = heapU16[(sp+-12)>>1];
+	r11 = heapU16[(r8+6)>>1];
+	if(uint(r11) <uint(r10)) //_LBB154_66
+{
+	heap16[(r8+6)>>1] = r10;
+	r9 = heap32[(r4+34)];
+}
+	r8 = (r9 + r7)|0;
+	r10 = heapU16[(sp+-4)>>1];
+	r11 = heapU16[(r8+2)>>1];
+	if(uint(r11) >uint(r10)) //_LBB154_89
+{
+	heap16[(r8+2)>>1] = r10;
+	r9 = heap32[(r4+34)];
+}
+	r8 = (r9 + r7)|0;
+	r10 = heapU16[(sp+-10)>>1];
+	r11 = heapU16[(r8+8)>>1];
+	if(uint(r11) <uint(r10)) //_LBB154_90
+{
+	heap16[(r8+8)>>1] = r10;
+	r9 = heap32[(r4+34)];
+}
+	r8 = (r9 + r7)|0;
+	r10 = heapU16[(sp+-2)>>1];
+	r11 = heapU16[(r8+4)>>1];
+	if(uint(r11) >uint(r10)) //_LBB154_92
+{
+	heap16[(r8+4)>>1] = r10;
+	r9 = heap32[(r4+34)];
+}
+	r7 = (r9 + r7)|0;
+	r8 = heapU16[(sp+-8)>>1];
+	r9 = heapU16[(r7+10)>>1];
+	if(uint(r9) <uint(r8)) //_LBB154_93
+{
+	heap16[(r7+10)>>1] = r8;
+}
+}
+} while(0);
+	r2 = (r2 + 1)|0;
+if(!(r1 !=r2)) //_LBB154_60
+{
+break _73;
+}
+}
+}
+} while(0);
+	r2 = heap32[(r4+14)];
+	r7 = (r2 + 1)|0;
+	heap32[(r4+14)] = r7;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r6;
+	_ZN14btQuantizedBvh9buildTreeEii(i7);
+	r0 = heap32[(r4+14)];
+	heap32[(fp+-23)] = r0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r1;
+	_ZN14btQuantizedBvh9buildTreeEii(i7);
+	r0 = heap32[(r4+14)];
+	r0 = (r0 - r5)|0;
+	heap32[(fp+-22)] = r0;
+	r0 = heapU8[r3+60];
+_120: do {
+if(!(r0 ==0)) //_LBB154_143
+{
+	r0 = heap32[(fp+-22)];
+	r0 = r0 << 4;
+if(!(r0 <2049)) //_LBB154_142
+{
+	r0 = heap32[(r4+34)];
+	r1 = heap32[(fp+-23)];
+	r1 = r1 << 4;
+	heap32[(fp+-24)] = r1;
+	r2 = r2 << 4;
+	r1 = (r0 + r1)|0;
+	r2 = (r0 + r2)|0;
+	r5 = r1 >> 2;
+	r6 = r2 >> 2;
+	r5 = heap32[(r5+3)];
+	r8 = 0;
+	r6 = heap32[(r6+7)];
+	r9 = 1;
+	r10 = (r8 - r6)|0;
+	r6 = r6 < 0 ? r10 : r9;
+	r10 = r6 << 4;
+if(!(r10 >2048)) //_LBB154_119
+{
+	r10 = heap32[(r4+39)];
+	r11 = heap32[(r4+38)];
+	if(r10 ==r11) //_LBB154_100
+{
+	r12 = r11 << 1;
+	r12 = r11 == 0 ? r9 : r12;
+	if(r10 >=r12) //_LBB154_99
+{
+__label__ = 92;
+}
+else{
+	if(r12 !=0) //_LBB154_103
+{
+	r10 = gNumAlignedAllocs;
+	r10 = r10 >> 2;
+	r13 = heap32[(r10)];
+	r13 = (r13 + 1)|0;
+	r14 = r12 << 5;
+	heap32[(r10)] = r13;
+	r10 = r14 | 19;
+	heap32[(g0)] = r10;
+	malloc(i7);
+	r13 = r_g0;
+	if(r13 !=0) //_LBB154_105
+{
+	r10 = 0;
+	r14 = (r13 + 4)|0;
+	r10 = (r10 - r14)|0;
+	r10 = r10 & 15;
+	r10 = (r13 + r10)|0;
+	r14 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r13;
+	r13 = r14;
+}
+}
+else{
+	r13 = 0;
+}
+	r14 = (r3 + 160)|0;
+	if(r11 <1) //_LBB154_108
+{
+	r10 = r14 >> 2;
+	r16 = heap32[(r10)];
+}
+else{
+	r10 = 0;
+	r15 = r11;
+_137: while(true){
+	r16 = r14 >> 2;
+	r16 = heap32[(r16)];
+	r17 = (r16 + r10)|0;
+	r17 = r17 >> 2;
+	r18 = (r13 + r10)|0;
+	r15 = (r15 + -1)|0;
+	r10 = (r10 + 32)|0;
+	r19 = heap32[(r17)];
+	r18 = r18 >> 2;
+	r20 = heap32[(r17+1)];
+	r21 = heap32[(r17+2)];
+	r22 = heap32[(r17+3)];
+	r23 = heap32[(r17+4)];
+	r24 = heap32[(r17+5)];
+	r25 = heap32[(r17+6)];
+	r17 = heap32[(r17+7)];
+	heap32[(r18)] = r19;
+	heap32[(r18+1)] = r20;
+	heap32[(r18+2)] = r21;
+	heap32[(r18+3)] = r22;
+	heap32[(r18+4)] = r23;
+	heap32[(r18+5)] = r24;
+	heap32[(r18+6)] = r25;
+	heap32[(r18+7)] = r17;
+if(!(r15 !=0)) //_LBB154_109
+{
+break _137;
+}
+}
+	r14 = (r3 + 160)|0;
+}
+	if(r16 !=0) //_LBB154_113
+{
+	r10 = heapU8[r3+164];
+	if(r10 !=0) //_LBB154_115
+{
+	r10 = gNumAlignedFree;
+	r10 = r10 >> 2;
+	r15 = heap32[(r10)];
+	r15 = (r15 + 1)|0;
+	r16 = r16 >> 2;
+	heap32[(r10)] = r15;
+	r10 = heap32[(r16+-1)];
+	heap32[(g0)] = r10;
+	free(i7);
+	r10 = heap32[(r4+38)];
+}
+else{
+	r10 = r11;
+}
+	r15 = r14 >> 2;
+	heap32[(r15)] = 0;
+}
+else{
+	r10 = r11;
+}
+	r14 = r14 >> 2;
+	heap8[r3+164] = r9;
+	heap32[(r14)] = r13;
+	heap32[(r4+39)] = r12;
+__label__ = 110;
+}
+}
+else{
+__label__ = 92;
+}
+if (__label__ == 92){
+	r10 = r11;
+}
+	r10 = (r10 + 1)|0;
+	heap32[(r4+38)] = r10;
+	r10 = heap32[(r4+40)];
+	r12 = heapU16[(r2+16)>>1];
+	r11 = r11 << 5;
+	heap16[(r10+r11)>>1] = r12;
+	r10 = (r10 + r11)|0;
+	r11 = heapU16[(r2+18)>>1];
+	heap16[(r10+2)>>1] = r11;
+	r11 = heapU16[(r2+20)>>1];
+	heap16[(r10+4)>>1] = r11;
+	r11 = heapU16[(r2+22)>>1];
+	heap16[(r10+6)>>1] = r11;
+	r11 = heapU16[(r2+24)>>1];
+	heap16[(r10+8)>>1] = r11;
+	r2 = heapU16[(r2+26)>>1];
+	r11 = r10 >> 2;
+	heap16[(r10+10)>>1] = r2;
+	heap32[(r11+3)] = r7;
+	heap32[(r11+4)] = r6;
+}
+	r2 = (r8 - r5)|0;
+	r2 = r5 < 0 ? r2 : r9;
+	r5 = r2 << 4;
+if(!(r5 >2048)) //_LBB154_141
+{
+	r5 = heap32[(r4+39)];
+	r6 = heap32[(r4+38)];
+	if(r5 ==r6) //_LBB154_122
+{
+	r7 = r6 << 1;
+	r7 = r6 == 0 ? r9 : r7;
+	if(r5 >=r7) //_LBB154_121
+{
+__label__ = 113;
+}
+else{
+	if(r7 !=0) //_LBB154_125
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r10 = heap32[(r5)];
+	r10 = (r10 + 1)|0;
+	r11 = r7 << 5;
+	heap32[(r5)] = r10;
+	r5 = r11 | 19;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB154_127
+{
+	r5 = (r10 + 4)|0;
+	r5 = (r8 - r5)|0;
+	r5 = r5 & 15;
+	r5 = (r10 + r5)|0;
+	r11 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r10;
+	r10 = r11;
+}
+}
+else{
+	r10 = 0;
+}
+	r11 = (r3 + 160)|0;
+	if(r6 <1) //_LBB154_130
+{
+	r5 = r11 >> 2;
+	r12 = heap32[(r5)];
+}
+else{
+	r5 = r6;
+_166: while(true){
+	r12 = r11 >> 2;
+	r12 = heap32[(r12)];
+	r13 = (r12 + r8)|0;
+	r13 = r13 >> 2;
+	r14 = (r10 + r8)|0;
+	r5 = (r5 + -1)|0;
+	r8 = (r8 + 32)|0;
+	r15 = heap32[(r13)];
+	r14 = r14 >> 2;
+	r16 = heap32[(r13+1)];
+	r17 = heap32[(r13+2)];
+	r18 = heap32[(r13+3)];
+	r19 = heap32[(r13+4)];
+	r20 = heap32[(r13+5)];
+	r21 = heap32[(r13+6)];
+	r13 = heap32[(r13+7)];
+	heap32[(r14)] = r15;
+	heap32[(r14+1)] = r16;
+	heap32[(r14+2)] = r17;
+	heap32[(r14+3)] = r18;
+	heap32[(r14+4)] = r19;
+	heap32[(r14+5)] = r20;
+	heap32[(r14+6)] = r21;
+	heap32[(r14+7)] = r13;
+if(!(r5 !=0)) //_LBB154_131
+{
+break _166;
+}
+}
+	r11 = (r3 + 160)|0;
+}
+	if(r12 !=0) //_LBB154_135
+{
+	r5 = heapU8[r3+164];
+	if(r5 !=0) //_LBB154_137
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r12 = r12 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r12+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r4+38)];
+}
+else{
+	r5 = r6;
+}
+	r8 = r11 >> 2;
+	heap32[(r8)] = 0;
+}
+else{
+	r5 = r6;
+}
+	r8 = r11 >> 2;
+	heap8[r3+164] = r9;
+	heap32[(r8)] = r10;
+	heap32[(r4+39)] = r7;
+__label__ = 131;
+}
+}
+else{
+__label__ = 113;
+}
+if (__label__ == 113){
+	r5 = r6;
+}
+	r5 = (r5 + 1)|0;
+	heap32[(r4+38)] = r5;
+	r5 = heap32[(r4+40)];
+	r7 = heap32[(fp+-24)];
+	r0 = heapU16[(r0+r7)>>1];
+	r6 = r6 << 5;
+	heap16[(r5+r6)>>1] = r0;
+	r0 = (r5 + r6)|0;
+	r5 = heapU16[(r1+2)>>1];
+	heap16[(r0+2)>>1] = r5;
+	r5 = heapU16[(r1+4)>>1];
+	heap16[(r0+4)>>1] = r5;
+	r5 = heapU16[(r1+6)>>1];
+	heap16[(r0+6)>>1] = r5;
+	r5 = heapU16[(r1+8)>>1];
+	heap16[(r0+8)>>1] = r5;
+	r1 = heapU16[(r1+10)>>1];
+	r5 = r0 >> 2;
+	heap16[(r0+10)>>1] = r1;
+	r0 = heap32[(fp+-23)];
+	heap32[(r5+3)] = r0;
+	heap32[(r5+4)] = r2;
+}
+	r0 = heap32[(r4+38)];
+	heap32[(r4+42)] = r0;
+	r0 = heapU8[r3+60];
+	if(r0 ==0) //_LBB154_143
+{
+break _120;
+}
+}
+	r0 = heap32[(fp+-21)];
+	r0 = r0 << 4;
+	r4 = heap32[(r4+34)];
+	r4 = (r4 + r0)|0;
+	r0 = 0;
+	r4 = r4 >> 2;
+	r1 = heap32[(fp+-22)];
+	r0 = (r0 - r1)|0;
+	heap32[(r4+3)] = r0;
+	return;
+}
+} while(0);
+	r0 = heap32[(fp+-21)];
+	r0 = r0 << 6;
+	r1 = heap32[(r4+24)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+-22)];
+	heap32[(r0+8)] = r1;
+	return;
+}
+}
+	r0 = _2E_str21;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 278;
+	_assert(i7);
+}
+else{
+	r1 = heapU8[r3+60];
+	if(r1 ==0) //_LBB154_5
+{
+	r1 = heap32[(r4+24)];
+	r2 = heap32[(r4+19)];
+	r3 = r5 << 6;
+	r0 = r0 << 6;
+	r1 = (r1 + r3)|0;
+	r0 = (r2 + r0)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 64;
+	memcpy(i7);
+}
+else{
+	r0 = r0 << 4;
+	r1 = heap32[(r4+29)];
+	r2 = heap32[(r4+34)];
+	r3 = heapU16[(r1+r0)>>1];
+	r5 = r5 << 4;
+	r0 = (r1 + r0)|0;
+	heap16[(r2+r5)>>1] = r3;
+	r1 = (r2 + r5)|0;
+	r2 = heapU16[(r0+2)>>1];
+	heap16[(r1+2)>>1] = r2;
+	r2 = heapU16[(r0+4)>>1];
+	heap16[(r1+4)>>1] = r2;
+	r2 = heapU16[(r0+6)>>1];
+	heap16[(r1+6)>>1] = r2;
+	r2 = heapU16[(r0+8)>>1];
+	heap16[(r1+8)>>1] = r2;
+	r2 = heapU16[(r0+10)>>1];
+	r0 = r0 >> 2;
+	heap16[(r1+10)>>1] = r2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0+3)];
+	heap32[(r1+3)] = r0;
+}
+	r0 = heap32[(r4+14)];
+	r0 = (r0 + 1)|0;
+	heap32[(r4+14)] = r0;
+	return;
+}
+}
+else{
+	r0 = _2E_str2246;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 127;
+	_assert(i7);
+}
+}
+
+function _ZNK14btQuantizedBvh36walkStacklessQuantizedTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+var __label__ = 0;
+	i7 = sp + -96;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+60];
+	if(r1 !=0) //_LBB155_2
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r6 = heap32[(fp+6)];
+	r3 = r3 >> 2;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r3)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r2+1)];
+	f0 = f0-f1;
+	r7 = r0 >> 2;
+	f1 = f2-f3;
+	f2 = heapFloat[(r3+2)];
+	f3 = heapFloat[(r2+2)];
+	r8 = heap32[(r7+34)];
+	f2 = f2-f3;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f4 =                         1;
+	f3 = f4/f_g0;
+	f5 = heapFloat[(r3)];
+	f6 = heapFloat[(r2)];
+	f7 = heapFloat[(r3+1)];
+	f8 = heapFloat[(r2+1)];
+	f0 = f0*f3;
+	f9 = f5-f6;
+	f1 = f1*f3;
+	f10 = f7-f8;
+	f11 = heapFloat[(r3+2)];
+	f12 = heapFloat[(r2+2)];
+	f2 = f2*f3;
+	f3 = f11-f12;
+	f9 = f0*f9;
+	f10 = f1*f10;
+	f9 = f9+f10;
+	f3 = f2*f3;
+	f3 = f9+f3;
+	f9 =                         0;
+	if(f0 !=f9) //_LBB155_4
+{
+	f0 = f4/f0;
+}
+else{
+	f0 =        999999984306749440;
+}
+	if(f1 !=f9) //_LBB155_7
+{
+	f1 = f4/f1;
+}
+else{
+	f1 =        999999984306749440;
+}
+	if(f2 !=f9) //_LBB155_10
+{
+	f2 = f4/f2;
+}
+else{
+	f2 =        999999984306749440;
+}
+	r9 = heapU8[r0+60];
+	if(r9 !=0) //_LBB155_13
+{
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r9 = f0 < f9;
+	r10 = f1 < f9;
+	r11 = f2 < f9;
+	f4 = heapFloat[(r2+3)];
+	f10 = heapFloat[(r3+3)];
+	f13 = f5 < f6 ? f5 : f6;
+	f14 = heapFloat[(r4)];
+	f15 = f7 < f8 ? f7 : f8;
+	f16 = heapFloat[(r4+1)];
+	f17 = f11 < f12 ? f11 : f12;
+	f18 = heapFloat[(r4+2)];
+	f5 = f6 < f5 ? f5 : f6;
+	f6 = heapFloat[(r5)];
+	f7 = f8 < f7 ? f7 : f8;
+	f8 = heapFloat[(r5+1)];
+	f11 = f12 < f11 ? f11 : f12;
+	f12 = heapFloat[(r5+2)];
+	r3 = r9 & 1;
+	r9 = r10 & 1;
+	r10 = r11 & 1;
+	f19 = f10 < f4 ? f10 : f4;
+	f4 = f4 < f10 ? f10 : f4;
+	f10 = f13+f14;
+	f13 = f15+f16;
+	f14 = f17+f18;
+	f5 = f5+f6;
+	f6 = f7+f8;
+	f7 = f11+f12;
+	r11 = sp + -16;
+	r12 = r11 >> 2;
+	heapFloat[(fp+-4)] = f10;
+	heapFloat[(r12+1)] = f13;
+	heapFloat[(r12+2)] = f14;
+	heapFloat[(r12+3)] = f19;
+	f8 = heapFloat[(r7+1)];
+	if(f10 <f8) //_LBB155_15
+{
+	heapFloat[(fp+-4)] = f8;
+	f10 = f8;
+}
+	f8 = heapFloat[(r7+2)];
+	if(f13 <f8) //_LBB155_18
+{
+	heapFloat[(r12+1)] = f8;
+	f13 = f8;
+}
+	f8 = heapFloat[(r7+3)];
+	if(f14 <f8) //_LBB155_21
+{
+	heapFloat[(r12+2)] = f8;
+	f14 = f8;
+}
+	f8 = heapFloat[(r7+4)];
+	if(f19 <f8) //_LBB155_24
+{
+	heapFloat[(r12+3)] = f8;
+	f19 = f8;
+}
+	f8 = heapFloat[(r7+5)];
+if(!(f8 >=f10)) //_LBB155_27
+{
+	heapFloat[(fp+-4)] = f8;
+}
+	f8 = heapFloat[(r7+6)];
+if(!(f8 >=f13)) //_LBB155_29
+{
+	heapFloat[(r12+1)] = f8;
+}
+	f8 = heapFloat[(r7+7)];
+if(!(f8 >=f14)) //_LBB155_31
+{
+	heapFloat[(r12+2)] = f8;
+}
+	f8 = heapFloat[(r7+8)];
+if(!(f8 >=f19)) //_LBB155_33
+{
+	heapFloat[(r12+3)] = f8;
+}
+	r12 = sp + -38;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = 0;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r11 = heapU8[r0+60];
+	if(r11 !=0) //_LBB155_35
+{
+	r11 = sp + -32;
+	r12 = r11 >> 2;
+	heapFloat[(fp+-8)] = f5;
+	heapFloat[(r12+1)] = f6;
+	heapFloat[(r12+2)] = f7;
+	heapFloat[(r12+3)] = f4;
+	f8 = heapFloat[(r7+1)];
+	if(f5 <f8) //_LBB155_37
+{
+	heapFloat[(fp+-8)] = f8;
+	f5 = f8;
+}
+	f8 = heapFloat[(r7+2)];
+	if(f6 <f8) //_LBB155_40
+{
+	heapFloat[(r12+1)] = f8;
+	f6 = f8;
+}
+	f8 = heapFloat[(r7+3)];
+	if(f7 <f8) //_LBB155_43
+{
+	heapFloat[(r12+2)] = f8;
+	f7 = f8;
+}
+	f8 = heapFloat[(r7+4)];
+	if(f4 <f8) //_LBB155_46
+{
+	heapFloat[(r12+3)] = f8;
+	f4 = f8;
+}
+	f8 = heapFloat[(r7+5)];
+if(!(f8 >=f5)) //_LBB155_49
+{
+	heapFloat[(fp+-8)] = f8;
+}
+	f5 = heapFloat[(r7+6)];
+if(!(f5 >=f6)) //_LBB155_51
+{
+	heapFloat[(r12+1)] = f5;
+}
+	f5 = heapFloat[(r7+7)];
+if(!(f5 >=f7)) //_LBB155_53
+{
+	heapFloat[(r12+2)] = f5;
+}
+	f5 = heapFloat[(r7+8)];
+if(!(f5 >=f4)) //_LBB155_55
+{
+	heapFloat[(r12+3)] = f5;
+}
+	r12 = sp + -44;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = 1;
+	r0 = r3 ^ 1;
+	r11 = r9 ^ 1;
+	r12 = r10 ^ 1;
+	r13 = 0;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r14 = r13;
+_66: while(true){
+	if(r13 <r6) //_LBB155_56
+{
+	if(r14 <r6) //_LBB155_58
+{
+	r15 = r8 >> 2;
+	r16 = heap32[(r15+3)];
+	r14 = (r14 + 1)|0;
+	r16 = r16 >>> 31;
+	r17 = heapU16[(sp+-38)>>1];
+	r18 = heapU16[(r8+6)>>1];
+	if(uint(r17) >uint(r18)) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r17 = heapU16[(r8)>>1];
+	r18 = heapU16[(sp+-44)>>1];
+	r18 = r18 & 65535;
+	r17 = r17 & 65535;
+	if(uint(r18) <uint(r17)) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r18 = heapU16[(sp+-34)>>1];
+	r19 = heapU16[(r8+10)>>1];
+	r18 = r18 & 65535;
+	r19 = r19 & 65535;
+	if(uint(r18) >uint(r19)) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r18 = heapU16[(r8+4)>>1];
+	r19 = heapU16[(sp+-40)>>1];
+	r19 = r19 & 65535;
+	r18 = r18 & 65535;
+	if(uint(r19) <uint(r18)) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r19 = heapU16[(sp+-36)>>1];
+	r20 = heapU16[(r8+8)>>1];
+	r19 = r19 & 65535;
+	r20 = r20 & 65535;
+	if(uint(r19) >uint(r20)) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r19 = heapU16[(r8+2)>>1];
+	r20 = heapU16[(sp+-42)>>1];
+	r20 = r20 & 65535;
+	r19 = r19 & 65535;
+	if(uint(r20) >=uint(r19)) //_LBB155_65
+{
+	f4 = uint(r17); //fuitos r17, f4
+	f5 = heapFloat[(r7+9)];
+	f6 = uint(r19); //fuitos r19, f6
+	f7 = heapFloat[(r7+10)];
+	f4 = f4/f5;
+	f8 = heapFloat[(r7+1)];
+	f10 = heapFloat[(r7+11)];
+	f11 = heapFloat[(r7+2)];
+	f12 = heapFloat[(r7+3)];
+	r17 = sp + -80;
+	f13 = uint(r18); //fuitos r18, f13
+	f6 = f6/f7;
+	f4 = f4+f8;
+	f13 = f13/f10;
+	r18 = r17 >> 2;
+	f6 = f6+f11;
+	heapFloat[(fp+-20)] = f4;
+	f13 = f13+f12;
+	heapFloat[(r18+1)] = f6;
+	heapFloat[(r18+2)] = f13;
+	heap32[(r18+3)] = 0;
+	r19 = heapU16[(r8+10)>>1];
+	r20 = heapU16[(r8+8)>>1];
+	r21 = heapU16[(r8+6)>>1];
+	heap32[(r18+7)] = 0;
+	f14 = heapFloat[(r5)];
+	f4 = f4-f14;
+	heapFloat[(fp+-20)] = f4;
+	f4 = heapFloat[(r5+1)];
+	f4 = f6-f4;
+	heapFloat[(r18+1)] = f4;
+	f4 = heapFloat[(r5+2)];
+	f6 = uint(r21); //fuitos r21, f6
+	f4 = f13-f4;
+	f5 = f6/f5;
+	heapFloat[(r18+2)] = f4;
+	f4 = f5+f8;
+	f5 = heapFloat[(r4)];
+	f6 = uint(r20); //fuitos r20, f6
+	f4 = f4-f5;
+	f5 = f6/f7;
+	heapFloat[(r18+4)] = f4;
+	f4 = f5+f11;
+	f5 = heapFloat[(r4+1)];
+	f6 = uint(r19); //fuitos r19, f6
+	f4 = f4-f5;
+	f5 = f6/f10;
+	heapFloat[(r18+5)] = f4;
+	r19 = r3 << 4;
+	r20 = r11 << 4;
+	f4 = f5+f12;
+	f5 = heapFloat[(r4+2)];
+	r19 = (r17 + r19)|0;
+	r20 = (r17 + r20)|0;
+	f4 = f4-f5;
+	r19 = r19 >> 2;
+	heapFloat[(r18+6)] = f4;
+	r18 = r20 >> 2;
+	f4 = heapFloat[(r19)];
+	f5 = heapFloat[(r2)];
+	f6 = heapFloat[(r18+1)];
+	f7 = heapFloat[(r2+1)];
+	f4 = f4-f5;
+	f6 = f6-f7;
+	f4 = f4*f0;
+	f6 = f6*f1;
+	if(f4 >f6) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r18 = r0 << 4;
+	r19 = r9 << 4;
+	r18 = (r17 + r18)|0;
+	r19 = (r17 + r19)|0;
+	r18 = r18 >> 2;
+	r19 = r19 >> 2;
+	f8 = heapFloat[(r18)];
+	f10 = heapFloat[(r19+1)];
+	f5 = f8-f5;
+	f7 = f10-f7;
+	f5 = f5*f0;
+	f7 = f7*f1;
+	if(f7 >f5) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r18 = r12 << 4;
+	r18 = (r17 + r18)|0;
+	r18 = r18 >> 2;
+	f8 = heapFloat[(r18+2)];
+	f10 = heapFloat[(r2+2)];
+	f8 = f8-f10;
+	f4 = f4 < f7 ? f7 : f4;
+	f7 = f8*f2;
+	if(f4 >f7) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	r18 = r10 << 4;
+	r17 = (r17 + r18)|0;
+	r17 = r17 >> 2;
+	f8 = heapFloat[(r17+2)];
+	f8 = f8-f10;
+	f5 = f6 < f5 ? f6 : f5;
+	f6 = f8*f2;
+	if(f6 >f5) //_LBB155_64
+{
+__label__ = 55;
+}
+else{
+	f4 = f4 < f6 ? f6 : f4;
+	f5 = f7 < f5 ? f7 : f5;
+	r17 = f4 >= f3;
+	r18 = f5 <= f9;
+	r17 = r17 | r18;
+	r18 = r17 & 1;
+	r17 = r18 ^ 1;
+	if(r16 != 0) //_LBB155_71
+{
+__label__ = 65;
+}
+else{
+	if(r18 ==0) //_LBB155_72
+{
+	r18 = heap32[(r15+3)];
+	if(r18 >-1) //_LBB155_74
+{
+	r19 = r1 >> 2;
+	r19 = heap32[(r19)];
+	r19 = r19 >> 2;
+	r19 = heap32[(r19+2)];
+	r20 = r18 >> 21;
+	r18 = r18 & 2097151;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r20;
+	heap32[(g0+2)] = r18;
+	__FUNCTION_TABLE__[(r19)>>2](i7);
+__label__ = 65;
+}
+else{
+__label__ = 63;
+break _66;
+}
+}
+else{
+__label__ = 65;
+}
+}
+}
+}
+}
+}
+}
+else{
+__label__ = 55;
+}
+}
+}
+}
+}
+}
+if (__label__ == 55){
+	r17 = 0;
+}
+if(!(r17 !=0)) //_LBB155_77
+{
+	if(r16 != 0) //_LBB155_78
+{
+	r15 = heap32[(r15+3)];
+	if(r15 <0) //_LBB155_80
+{
+	r16 = r15 << 4;
+	r8 = (r8 - r16)|0;
+	r13 = (r13 - r15)|0;
+continue _66;
+}
+else{
+__label__ = 69;
+break _66;
+}
+}
+}
+	r8 = (r8 + 16)|0;
+	r13 = (r13 + 1)|0;
+}
+else{
+__label__ = 48;
+break _66;
+}
+}
+else{
+__label__ = 72;
+break _66;
+}
+}
+switch(__label__ ){//multiple entries
+case 72:
+	r0 = maxIterations;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+if(!(r1 >=r14)) //_LBB155_84
+{
+	heap32[(r0)] = r14;
+}
+	return;
+break;
+case 69:
+	r0 = _2E_str941;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 75;
+	_assert(i7);
+break;
+case 63:
+	r0 = _2E_str739;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 80;
+	_assert(i7);
+break;
+case 48:
+	r0 = _2E_str1143;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 606;
+	_assert(i7);
+break;
+}
+}
+}
+	r0 = _2E_str212;
+	r1 = _2E_str313;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 420;
+	_assert(i7);
+}
+else{
+	r0 = _2E_str212;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 543;
+	_assert(i7);
+}
+}
+
+function _ZNK14btQuantizedBvh27walkStacklessTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+60];
+	if(r1 ==0) //_LBB156_2
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r3 = r3 >> 2;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r3)];
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r2+1)];
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	f4 = f1-f0;
+	r0 = r0 >> 2;
+	f5 = f2-f3;
+	f6 = heapFloat[(r3+2)];
+	f7 = heapFloat[(r2+2)];
+	r6 = heap32[(r0+24)];
+	f8 = f6-f7;
+	f9 = f4*f4;
+	f10 = f5*f5;
+	f11 = heapFloat[(r4)];
+	f12 = heapFloat[(r4+1)];
+	f13 = heapFloat[(r4+2)];
+	f14 = heapFloat[(r5)];
+	f15 = heapFloat[(r5+1)];
+	f16 = heapFloat[(r5+2)];
+	f9 = f9+f10;
+	f10 = f8*f8;
+	f9 = f9+f10;
+	heapFloat[(g0)] = f9;
+	sqrtf(i7);
+	f10 =                         1;
+	f9 = f10/f_g0;
+	f17 = heapFloat[(r3)];
+	f18 = heapFloat[(r2)];
+	f19 = heapFloat[(r3+1)];
+	f20 = heapFloat[(r2+1)];
+	f4 = f4*f9;
+	f17 = f17-f18;
+	f5 = f5*f9;
+	f18 = f19-f20;
+	f19 = heapFloat[(r3+2)];
+	f20 = heapFloat[(r2+2)];
+	f8 = f8*f9;
+	f9 = f19-f20;
+	f17 = f4*f17;
+	f18 = f5*f18;
+	f19 = f1 < f0 ? f1 : f0;
+	f20 = f2 < f3 ? f2 : f3;
+	f21 = f6 < f7 ? f6 : f7;
+	f0 = f0 < f1 ? f1 : f0;
+	f1 = f3 < f2 ? f2 : f3;
+	f2 = f7 < f6 ? f6 : f7;
+	f3 = f17+f18;
+	f6 = f8*f9;
+	f7 = f19+f11;
+	f9 = f20+f12;
+	f11 = f21+f13;
+	f0 = f0+f14;
+	f1 = f1+f15;
+	f2 = f2+f16;
+	f3 = f3+f6;
+	f6 =                         0;
+	if(f4 !=f6) //_LBB156_4
+{
+	f4 = f10/f4;
+}
+else{
+	f4 =        999999984306749440;
+}
+	if(f5 !=f6) //_LBB156_7
+{
+	f5 = f10/f5;
+}
+else{
+	f5 =        999999984306749440;
+}
+	if(f8 !=f6) //_LBB156_10
+{
+	f8 = f10/f8;
+}
+else{
+	f8 =        999999984306749440;
+}
+	r3 = f4 < f6;
+	r7 = f5 < f6;
+	r8 = f8 < f6;
+	r3 = r3 & 1;
+	r7 = r7 & 1;
+	r8 = r8 & 1;
+	r9 = r3 ^ 1;
+	r10 = r7 ^ 1;
+	r11 = r8 ^ 1;
+	r12 = 0;
+	r13 = r12;
+_15: while(true){
+	r14 = heap32[(r0+14)];
+	if(r14 >r12) //_LBB156_12
+{
+	if(r14 >r13) //_LBB156_14
+{
+	r14 = r6 >> 2;
+	f10 = heapFloat[(r14)];
+	r15 = sp + -32;
+	heapFloat[(fp+-8)] = f10;
+	r16 = r15 >> 2;
+	f12 = heapFloat[(r14+1)];
+	heapFloat[(r16+1)] = f12;
+	f13 = heapFloat[(r14+2)];
+	heapFloat[(r16+2)] = f13;
+	heap32[(r16+3)] = heap32[(r14+3)];
+	f14 = heapFloat[(r14+4)];
+	heapFloat[(r16+4)] = f14;
+	f15 = heapFloat[(r14+5)];
+	heapFloat[(r16+5)] = f15;
+	f16 = heapFloat[(r14+6)];
+	heapFloat[(r16+6)] = f16;
+	heap32[(r16+7)] = heap32[(r14+7)];
+	f17 = heapFloat[(r5)];
+	f10 = f10-f17;
+	heapFloat[(fp+-8)] = f10;
+	f10 = heapFloat[(r5+1)];
+	f10 = f12-f10;
+	heapFloat[(r16+1)] = f10;
+	f10 = heapFloat[(r5+2)];
+	f10 = f13-f10;
+	heapFloat[(r16+2)] = f10;
+	f10 = heapFloat[(r4)];
+	f10 = f14-f10;
+	heapFloat[(r16+4)] = f10;
+	f10 = heapFloat[(r4+1)];
+	f10 = f15-f10;
+	heapFloat[(r16+5)] = f10;
+	f10 = heapFloat[(r4+2)];
+	r13 = (r13 + 1)|0;
+	f10 = f16-f10;
+	heapFloat[(r16+6)] = f10;
+	f10 = heapFloat[(r14+4)];
+	if(f7 >f10) //_LBB156_17
+{
+__label__ = 17;
+}
+else{
+	f10 = heapFloat[(r14)];
+	if(f0 <f10) //_LBB156_17
+{
+__label__ = 17;
+}
+else{
+	r16 = 1;
+__label__ = 18;
+}
+}
+if (__label__ == 17){
+	r16 = 0;
+}
+	f10 = heapFloat[(r14+6)];
+	if(f11 >f10) //_LBB156_21
+{
+__label__ = 20;
+}
+else{
+	f10 = heapFloat[(r14+2)];
+	if(f2 <f10) //_LBB156_21
+{
+__label__ = 20;
+}
+else{
+__label__ = 21;
+}
+}
+if (__label__ == 20){
+	r16 = 0;
+}
+	f10 = heapFloat[(r14+5)];
+	if(f9 >f10) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	f10 = heapFloat[(r14+1)];
+	if(f1 <f10) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	r16 = r16 & 255;
+	if(r16 ==0) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	r16 = r3 << 4;
+	r17 = r10 << 4;
+	r16 = (r15 + r16)|0;
+	r17 = (r15 + r17)|0;
+	r16 = r16 >> 2;
+	r17 = r17 >> 2;
+	f10 = heapFloat[(r16)];
+	f12 = heapFloat[(r2)];
+	f13 = heapFloat[(r17+1)];
+	f14 = heapFloat[(r2+1)];
+	f10 = f10-f12;
+	f13 = f13-f14;
+	f10 = f10*f4;
+	f13 = f13*f5;
+	if(f10 >f13) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	r16 = r9 << 4;
+	r17 = r7 << 4;
+	r16 = (r15 + r16)|0;
+	r17 = (r15 + r17)|0;
+	r16 = r16 >> 2;
+	r17 = r17 >> 2;
+	f15 = heapFloat[(r16)];
+	f16 = heapFloat[(r17+1)];
+	f12 = f15-f12;
+	f14 = f16-f14;
+	f12 = f12*f4;
+	f14 = f14*f5;
+	if(f14 >f12) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	r16 = r11 << 4;
+	r16 = (r15 + r16)|0;
+	r16 = r16 >> 2;
+	f15 = heapFloat[(r16+2)];
+	f16 = heapFloat[(r2+2)];
+	f15 = f15-f16;
+	f10 = f10 < f14 ? f14 : f10;
+	f14 = f15*f8;
+	if(f10 >f14) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	r16 = r8 << 4;
+	r15 = (r15 + r16)|0;
+	r15 = r15 >> 2;
+	f15 = heapFloat[(r15+2)];
+	f15 = f15-f16;
+	f12 = f13 < f12 ? f13 : f12;
+	f13 = f15*f8;
+	if(f13 >f12) //_LBB156_32
+{
+__label__ = 30;
+}
+else{
+	f10 = f10 < f13 ? f13 : f10;
+	f12 = f14 < f12 ? f14 : f12;
+	r15 = f10 >= f3;
+	r16 = f12 <= f6;
+	r15 = r15 | r16;
+	r16 = r15 & 1;
+	r17 = heap32[(r14+8)];
+	r18 = -1;
+	r16 = r16 ^ 1;
+	r19 = r17 == r18;
+	if(r15 != 0) //_LBB156_31
+{
+__label__ = 32;
+}
+else{
+	r15 = r17 != r18;
+	r15 = r15 & 1;
+	if(r15 ==0) //_LBB156_33
+{
+	r15 = r1 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+2)];
+	r17 = heap32[(r14+10)];
+	r18 = heap32[(r14+9)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r18;
+	heap32[(g0+2)] = r17;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+__label__ = 32;
+}
+else{
+__label__ = 32;
+}
+}
+}
+}
+}
+}
+}
+}
+}
+if (__label__ == 30){
+	r16 = heap32[(r14+8)];
+	r19 = -1;
+	r19 = r16 == r19;
+	r16 = 0;
+}
+if(!(r16 !=0)) //_LBB156_36
+{
+	r15 = r19 & 1;
+	if(r15 ==0) //_LBB156_37
+{
+	r14 = heap32[(r14+8)];
+	r15 = r14 << 6;
+	r6 = (r6 + r15)|0;
+	r12 = (r14 + r12)|0;
+continue _15;
+}
+}
+	r6 = (r6 + 64)|0;
+	r12 = (r12 + 1)|0;
+}
+else{
+__label__ = 13;
+break _15;
+}
+}
+else{
+__label__ = 37;
+break _15;
+}
+}
+switch(__label__ ){//multiple entries
+case 37:
+	r0 = maxIterations;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+if(!(r1 >=r13)) //_LBB156_41
+{
+	heap32[(r0)] = r13;
+}
+	return;
+break;
+case 13:
+	r0 = _2E_str1921;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 490;
+	_assert(i7);
+break;
+}
+}
+else{
+	r0 = _2E_str1844;
+	r1 = _2E_str537;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 451;
+	_assert(i7);
+}
+}
+
+function _ZN30btActivatingCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN30btActivatingCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB160_23
+{
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB160_23
+{
+	r0 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB160_4
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB160_3
+{
+	if(r7 !=0) //_LBB160_7
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r4;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB160_9
+{
+	r4 = 0;
+	r8 = (r2 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r2 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r4 = (r0 + 12)|0;
+	if(r5 <1) //_LBB160_12
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_15: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB160_13
+{
+break _15;
+}
+}
+	r4 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB160_17
+{
+	r8 = heapU8[r0+16];
+	if(r8 !=0) //_LBB160_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r4)] = r2;
+	heap32[(r3+2)] = r7;
+	r2 = heap32[(r1+3)];
+}
+}
+	r0 = r5 << 2;
+	r1 = heap32[(r3+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+}
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -176;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+3)];
+if(!(r1 ==0)) //_LBB161_8
+{
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	r5 = heap32[(fp+4)];
+	r3 = r3 >> 2;
+	r2 = r2 >> 2;
+	r6 = heap32[(r3+48)];
+	r7 = heap32[(r2+48)];
+	r8 = sp + -136;
+	r9 = r5 >> 2;
+	r10 = r8 >> 2;
+	heap32[(r9+1)] = r1;
+	heap32[(r10+33)] = 0;
+	heap32[(r10+32)] = 1566444395;
+	heap32[(fp+-34)] = heap32[(r2+1)];
+	heap32[(r10+1)] = heap32[(r2+2)];
+	heap32[(r10+2)] = heap32[(r2+3)];
+	heap32[(r10+3)] = heap32[(r2+4)];
+	heap32[(r10+4)] = heap32[(r2+5)];
+	heap32[(r10+5)] = heap32[(r2+6)];
+	heap32[(r10+6)] = heap32[(r2+7)];
+	heap32[(r10+7)] = heap32[(r2+8)];
+	heap32[(r10+8)] = heap32[(r2+9)];
+	heap32[(r10+9)] = heap32[(r2+10)];
+	heap32[(r10+10)] = heap32[(r2+11)];
+	heap32[(r10+11)] = heap32[(r2+12)];
+	heap32[(r10+12)] = heap32[(r2+13)];
+	heap32[(r10+13)] = heap32[(r2+14)];
+	heap32[(r10+14)] = heap32[(r2+15)];
+	heap32[(r10+15)] = heap32[(r2+16)];
+	heap32[(r10+16)] = heap32[(r3+1)];
+	heap32[(r10+17)] = heap32[(r3+2)];
+	heap32[(r10+18)] = heap32[(r3+3)];
+	heap32[(r10+19)] = heap32[(r3+4)];
+	heap32[(r10+20)] = heap32[(r3+5)];
+	heap32[(r10+21)] = heap32[(r3+6)];
+	heap32[(r10+22)] = heap32[(r3+7)];
+	heap32[(r10+23)] = heap32[(r3+8)];
+	heap32[(r10+24)] = heap32[(r3+9)];
+	heap32[(r10+25)] = heap32[(r3+10)];
+	heap32[(r10+26)] = heap32[(r3+11)];
+	heap32[(r10+27)] = heap32[(r3+12)];
+	heap32[(r10+28)] = heap32[(r3+13)];
+	heap32[(r10+29)] = heap32[(r3+14)];
+	r1 = _ZTV16btBoxBoxDetector;
+	heap32[(r10+30)] = heap32[(r3+15)];
+	r2 = sp + -152;
+	r1 = (r1 + 8)|0;
+	heap32[(r10+31)] = heap32[(r3+16)];
+	r3 = r2 >> 2;
+	heap32[(fp+-38)] = r1;
+	heap32[(r3+1)] = r7;
+	r1 = r4 >> 2;
+	heap32[(r3+2)] = r6;
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = 0;
+	_ZN16btBoxBoxDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB161_8
+{
+	r0 = heap32[(r9+1)];
+	if(r0 !=0) //_LBB161_4
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+if(!(r2 ==0)) //_LBB161_8
+{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r9+34)];
+	if(r1 ==r2) //_LBB161_7
+{
+	r1 = (r5 + 8)|0;
+	r2 = (r5 + 72)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+else{
+	r1 = (r5 + 72)|0;
+	r5 = (r5 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r5;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r5 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+}
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV26btBoxBoxCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+8];
+if(!(r1 ==0)) //_LBB162_3
+{
+	r1 = heap32[(r2+3)];
+if(!(r1 ==0)) //_LBB162_3
+{
+	r3 = heap32[(r2+1)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+}
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV26btBoxBoxCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB163_3
+{
+	r0 = heap32[(r2+3)];
+if(!(r0 ==0)) //_LBB163_3
+{
+	r1 = heap32[(r2+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	r0 = _ZTV30btActivatingCollisionAlgorithm;
+	r0 = (r0 + 8)|0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZN16btBoxBoxDetectorD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btBoxBoxDetector;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btBoxBoxDetectorD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btBoxBoxDetector;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btBoxBoxDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -808;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = sp + -640;
+	heap32[(fp+-160)] = heap32[(r1)];
+	r3 = sp + -688;
+	heap32[(fp+-172)] = heap32[(r1+16)];
+	r4 = r2 >> 2;
+	r5 = r3 >> 2;
+	heap32[(r4+1)] = heap32[(r1+1)];
+	heap32[(r5+1)] = heap32[(r1+17)];
+	heap32[(r4+2)] = heap32[(r1+2)];
+	heap32[(r5+2)] = heap32[(r1+18)];
+	heap32[(r4+4)] = heap32[(r1+4)];
+	heap32[(r5+4)] = heap32[(r1+20)];
+	heap32[(r4+5)] = heap32[(r1+5)];
+	heap32[(r5+5)] = heap32[(r1+21)];
+	heap32[(r4+6)] = heap32[(r1+6)];
+	heap32[(r5+6)] = heap32[(r1+22)];
+	heap32[(r4+8)] = heap32[(r1+8)];
+	heap32[(r5+8)] = heap32[(r1+24)];
+	heap32[(r4+9)] = heap32[(r1+9)];
+	heap32[(r5+9)] = heap32[(r1+25)];
+	r6 = heap32[(fp)];
+	heap32[(r4+10)] = heap32[(r1+10)];
+	r6 = r6 >> 2;
+	heap32[(r5+10)] = heap32[(r1+26)];
+	r7 = heap32[(r6+2)];
+	r8 = r7 >> 2;
+	r9 = heap32[(r8)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+11)];
+	f0 = heapFloat[(r8+7)];
+	f1 = heapFloat[(r8+8)];
+	f2 = heapFloat[(r8+9)];
+	heap32[(g0)] = r7;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	f3 = f_g0;
+	r9 = heap32[(r8)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+11)];
+	heap32[(g0)] = r7;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	f4 = f_g0;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+11)];
+	heap32[(g0)] = r7;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f5 = f_g0;
+	r6 = heap32[(r6+1)];
+	r7 = r6 >> 2;
+	r8 = heap32[(r7)];
+	r8 = r8 >> 2;
+	f6 = heapFloat[(r7+8)];
+	r8 = heap32[(r8+11)];
+	f7 = heapFloat[(r7+9)];
+	f8 = heapFloat[(r7+7)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f9 = f_g0;
+	r8 = heap32[(r7)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+11)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f10 = f_g0;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+11)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	f8 = f8+f_g0;
+	f6 = f6+f10;
+	f8 = f8+f8;
+	f10 =                       0.5;
+	heapFloat[(fp+-187)] = f10;
+	f11 = heapFloat[(r1+30)];
+	f12 = heapFloat[(r1+14)];
+	f13 = heapFloat[(r1+29)];
+	f14 = heapFloat[(r1+13)];
+	f15 = heapFloat[(r1+28)];
+	f16 = heapFloat[(r1+12)];
+	f17 = heapFloat[(fp+-160)];
+	f18 = heapFloat[(r4+4)];
+	f19 = heapFloat[(r4+8)];
+	f20 = heapFloat[(r4+1)];
+	f21 = heapFloat[(r4+5)];
+	f22 = heapFloat[(r4+9)];
+	f23 = heapFloat[(r4+2)];
+	f24 = heapFloat[(r4+6)];
+	f25 = heapFloat[(r4+10)];
+	r4 = sp + -236;
+	f7 = f7+f9;
+	f6 = f6+f6;
+	f8 = f8*f10;
+	heapFloat[(fp+-179)] = f8;
+	f0 = f0+f5;
+	f5 = f7+f7;
+	f6 = f6*f10;
+	heapFloat[(fp+-178)] = f6;
+	r6 = r4 >> 2;
+	heapFloat[(fp+-59)] = f8;
+	f1 = f1+f4;
+	f0 = f0+f0;
+	f4 = f5*f10;
+	heapFloat[(fp+-177)] = f4;
+	heapFloat[(r6+1)] = f6;
+	r7 = sp + -248;
+	heap32[(fp+-186)] = r7;
+	f2 = f2+f3;
+	f1 = f1+f1;
+	f0 = f0*f10;
+	heapFloat[(fp+-181)] = f0;
+	heapFloat[(r6+2)] = f4;
+	f2 = f2+f2;
+	f1 = f1*f10;
+	heapFloat[(fp+-182)] = f1;
+	r6 = r7 >> 2;
+	heapFloat[(fp+-62)] = f0;
+	f0 = f2*f10;
+	heapFloat[(fp+-180)] = f0;
+	heapFloat[(r6+1)] = f1;
+	heapFloat[(r6+2)] = f0;
+	f0 = f15-f16;
+	heapFloat[(fp+-183)] = f0;
+	f1 = f13-f14;
+	heapFloat[(fp+-184)] = f1;
+	f2 = heapFloat[(fp+-172)];
+	heapFloat[(fp+-194)] = f2;
+	f3 = heapFloat[(r5+4)];
+	heapFloat[(fp+-195)] = f3;
+	f4 = heapFloat[(r5+1)];
+	heapFloat[(fp+-191)] = f4;
+	f5 = heapFloat[(r5+5)];
+	heapFloat[(fp+-192)] = f5;
+	f6 = heapFloat[(r5+2)];
+	heapFloat[(fp+-188)] = f6;
+	f7 = heapFloat[(r5+6)];
+	heapFloat[(fp+-189)] = f7;
+	f8 = f11-f12;
+	heapFloat[(fp+-185)] = f8;
+	f9 = heapFloat[(r5+8)];
+	heapFloat[(fp+-196)] = f9;
+	f10 = heapFloat[(r5+9)];
+	heapFloat[(fp+-193)] = f10;
+	f11 = heapFloat[(r5+10)];
+	heapFloat[(fp+-190)] = f11;
+	f12 = f17*f2;
+	f13 = f18*f3;
+	f14 = f17*f0;
+	f15 = f18*f1;
+	f16 = f20*f0;
+	f26 = f21*f1;
+	f0 = f23*f0;
+	heapFloat[(fp+-198)] = f0;
+	f1 = f24*f1;
+	f27 = f17*f4;
+	f28 = f18*f5;
+	f17 = f17*f6;
+	f18 = f18*f7;
+	f29 = f20*f2;
+	f30 = f21*f3;
+	f0 = f20*f4;
+	heapFloat[(fp+-197)] = f0;
+	f0 = f21*f5;
+	f20 = f20*f6;
+	f21 = f21*f7;
+	f2 = f23*f2;
+	f3 = f24*f3;
+	f4 = f23*f4;
+	f5 = f24*f5;
+	f6 = f23*f6;
+	f7 = f24*f7;
+	f12 = f12+f13;
+	f13 = f19*f9;
+	f14 = f14+f15;
+	f15 = f19*f8;
+	f16 = f16+f26;
+	f23 = f22*f8;
+	f24 = heapFloat[(fp+-198)];
+	f1 = f24+f1;
+	f8 = f25*f8;
+	f24 = f27+f28;
+	f26 = f19*f10;
+	f17 = f17+f18;
+	f18 = f19*f11;
+	f19 = f29+f30;
+	f27 = f22*f9;
+	f28 = heapFloat[(fp+-197)];
+	f0 = f28+f0;
+	f28 = f22*f10;
+	f20 = f20+f21;
+	f21 = f22*f11;
+	f2 = f2+f3;
+	f3 = f25*f9;
+	f4 = f4+f5;
+	f5 = f25*f10;
+	f6 = f6+f7;
+	f7 = f25*f11;
+	f9 = f12+f13;
+	r5 = heap32[(fp+2)];
+	r6 = (r2 + 4)|0;
+	r7 = (r3 + 4)|0;
+	r8 = (r2 + 8)|0;
+	r9 = (r3 + 8)|0;
+	r10 = (r0 + 112)|0;
+	r0 = (r0 + 48)|0;
+	f10 = f14+f15;
+	f11 = f16+f23;
+	f1 = f1+f8;
+	f8 = f24+f26;
+	f12 = f17+f18;
+	f13 = f19+f27;
+	f0 = f0+f28;
+	f14 = f20+f21;
+	f2 = f2+f3;
+	f3 = f4+f5;
+	f4 = f6+f7;
+	f5 =                         0;
+	if(f9 <f5) //_LBB166_2
+{
+	f6 = -f9;
+}
+else{
+	f6 = f9;
+}
+	if(f8 <f5) //_LBB166_5
+{
+	f7 = -f8;
+}
+else{
+	f7 = f8;
+}
+	if(f12 <f5) //_LBB166_8
+{
+	f15 = -f12;
+}
+else{
+	f15 = f12;
+}
+	if(f13 <f5) //_LBB166_11
+{
+	f16 = -f13;
+}
+else{
+	f16 = f13;
+}
+	if(f0 <f5) //_LBB166_14
+{
+	f17 = -f0;
+}
+else{
+	f17 = f0;
+}
+	if(f14 <f5) //_LBB166_17
+{
+	f18 = -f14;
+}
+else{
+	f18 = f14;
+}
+	if(f2 <f5) //_LBB166_20
+{
+	f19 = -f2;
+}
+else{
+	f19 = f2;
+}
+	if(f3 <f5) //_LBB166_23
+{
+	f20 = -f3;
+}
+else{
+	f20 = f3;
+}
+	if(f4 <f5) //_LBB166_26
+{
+	f21 = -f4;
+}
+else{
+	f21 = f4;
+}
+	if(f10 <f5) //_LBB166_29
+{
+	f22 = -f10;
+}
+else{
+	f22 = f10;
+}
+	f23 = heapFloat[(fp+-181)];
+	f23 = f23*f6;
+	f24 = heapFloat[(fp+-179)];
+	f23 = f24+f23;
+	f24 = heapFloat[(fp+-182)];
+	f24 = f24*f7;
+	f23 = f23+f24;
+	f24 = heapFloat[(fp+-180)];
+	f24 = f24*f15;
+	f23 = f23+f24;
+	f22 = f22-f23;
+_41: do {
+if(!(f22 >f5)) //_LBB166_268
+{
+	f23 =  -3.4028234663852886e+038;
+	if(f22 >f23) //_LBB166_33
+{
+	f23 =                         0;
+	r11 = f10 < f23;
+	r13 = sp + -640;
+	r11 = r11 & 1;
+	r12 = 1;
+	f23 = f22;
+}
+else{
+	r11 = 0;
+	r12 = r11;
+	r13 = r11;
+}
+	if(f11 <f5) //_LBB166_36
+{
+	f22 = -f11;
+}
+else{
+	f22 = f11;
+}
+	f24 = heapFloat[(fp+-181)];
+	f24 = f24*f16;
+	f25 = heapFloat[(fp+-178)];
+	f24 = f25+f24;
+	f25 = heapFloat[(fp+-182)];
+	f25 = f25*f17;
+	f24 = f24+f25;
+	f25 = heapFloat[(fp+-180)];
+	f25 = f25*f18;
+	f24 = f24+f25;
+	f22 = f22-f24;
+if(!(f22 >f5)) //_LBB166_268
+{
+	if(f22 >f23) //_LBB166_40
+{
+	f23 =                         0;
+	r11 = f11 < f23;
+	r11 = r11 & 1;
+	r12 = 2;
+	f23 = f22;
+	r13 = r6;
+}
+	if(f1 <f5) //_LBB166_43
+{
+	f22 = -f1;
+}
+else{
+	f22 = f1;
+}
+	f24 = heapFloat[(fp+-181)];
+	f24 = f24*f19;
+	f25 = heapFloat[(fp+-177)];
+	f24 = f25+f24;
+	f25 = heapFloat[(fp+-182)];
+	f25 = f25*f20;
+	f24 = f24+f25;
+	f25 = heapFloat[(fp+-180)];
+	f25 = f25*f21;
+	f24 = f24+f25;
+	f22 = f22-f24;
+if(!(f22 >f5)) //_LBB166_268
+{
+	if(f22 >f23) //_LBB166_47
+{
+	f23 =                         0;
+	r11 = f1 < f23;
+	r11 = r11 & 1;
+	r12 = 3;
+	f23 = f22;
+	r13 = r8;
+}
+	f24 = heapFloat[(fp+-183)];
+	f22 = heapFloat[(fp+-194)];
+	f22 = f22*f24;
+	f25 = heapFloat[(fp+-184)];
+	f24 = heapFloat[(fp+-195)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	f25 = heapFloat[(fp+-185)];
+	f24 = heapFloat[(fp+-196)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	if(f22 <f5) //_LBB166_50
+{
+	f24 = -f22;
+}
+else{
+	f24 = f22;
+}
+	f25 = heapFloat[(fp+-179)];
+	f25 = f25*f6;
+	f26 = heapFloat[(fp+-178)];
+	f26 = f26*f16;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-177)];
+	f26 = f26*f19;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-181)];
+	f25 = f25+f26;
+	f24 = f24-f25;
+if(!(f24 >f5)) //_LBB166_268
+{
+	if(f24 >f23) //_LBB166_54
+{
+	f23 =                         0;
+	r11 = f22 < f23;
+	r13 = sp + -688;
+	r11 = r11 & 1;
+	r12 = 4;
+	f23 = f24;
+}
+	f24 = heapFloat[(fp+-183)];
+	f22 = heapFloat[(fp+-191)];
+	f22 = f22*f24;
+	f25 = heapFloat[(fp+-184)];
+	f24 = heapFloat[(fp+-192)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	f25 = heapFloat[(fp+-185)];
+	f24 = heapFloat[(fp+-193)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	if(f22 <f5) //_LBB166_57
+{
+	f24 = -f22;
+}
+else{
+	f24 = f22;
+}
+	f25 = heapFloat[(fp+-179)];
+	f25 = f25*f7;
+	f26 = heapFloat[(fp+-178)];
+	f26 = f26*f17;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-177)];
+	f26 = f26*f20;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-182)];
+	f25 = f25+f26;
+	f24 = f24-f25;
+if(!(f24 >f5)) //_LBB166_268
+{
+	if(f24 >f23) //_LBB166_61
+{
+	f23 =                         0;
+	r11 = f22 < f23;
+	r11 = r11 & 1;
+	r12 = 5;
+	f23 = f24;
+	r13 = r7;
+}
+	f24 = heapFloat[(fp+-183)];
+	f22 = heapFloat[(fp+-188)];
+	f22 = f22*f24;
+	f25 = heapFloat[(fp+-184)];
+	f24 = heapFloat[(fp+-189)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	f25 = heapFloat[(fp+-185)];
+	f24 = heapFloat[(fp+-190)];
+	f24 = f24*f25;
+	f22 = f22+f24;
+	if(f22 <f5) //_LBB166_64
+{
+	f24 = -f22;
+}
+else{
+	f24 = f22;
+}
+	f25 = heapFloat[(fp+-179)];
+	f25 = f25*f15;
+	f26 = heapFloat[(fp+-178)];
+	f26 = f26*f18;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-177)];
+	f26 = f26*f21;
+	f25 = f25+f26;
+	f26 = heapFloat[(fp+-180)];
+	f25 = f25+f26;
+	f24 = f24-f25;
+if(!(f24 >f5)) //_LBB166_268
+{
+	if(f24 >f23) //_LBB166_68
+{
+	f23 =                         0;
+	r11 = f22 < f23;
+	r11 = r11 & 1;
+	r12 = 6;
+	f23 = f24;
+	r13 = r9;
+}
+	f22 = f1*f13;
+	f24 = f11*f2;
+	f25 =   9.9999997473787516e-006;
+	f22 = f22-f24;
+	f6 = f6+f25;
+	f7 = f7+f25;
+	f15 = f15+f25;
+	heapFloat[(fp+-183)] = f15;
+	f15 = f16+f25;
+	f16 = f17+f25;
+	f17 = f18+f25;
+	f18 = f19+f25;
+	heapFloat[(fp+-184)] = f18;
+	f18 = f20+f25;
+	heapFloat[(fp+-185)] = f18;
+	f18 = f21+f25;
+	if(f22 <f5) //_LBB166_71
+{
+	f19 = -f22;
+}
+else{
+	f19 = f22;
+}
+	f21 = heapFloat[(fp+-184)];
+	f20 = heapFloat[(fp+-178)];
+	f20 = f20*f21;
+	f21 = heapFloat[(fp+-177)];
+	f21 = f21*f15;
+	f20 = f20+f21;
+	f24 = heapFloat[(fp+-183)];
+	f21 = heapFloat[(fp+-182)];
+	f21 = f21*f24;
+	f20 = f20+f21;
+	f21 = heapFloat[(fp+-180)];
+	f21 = f21*f7;
+	f20 = f20+f21;
+	f19 = f19-f20;
+	f20 =   1.1920928955078125e-007;
+if(!(f19 >f20)) //_LBB166_268
+{
+	f21 = f2*f2;
+	f21 = f21+f5;
+	f24 = f13*f13;
+	heapFloat[(fp+-188)] = f24;
+	f24 = f21+f24;
+	heapFloat[(g0)] = f24;
+	sqrtf(i7);
+	f24 = f_g0;
+	if(f24 >f20) //_LBB166_75
+{
+	f25 = f19/f24;
+	f19 =        1.0499999523162842;
+	f19 = f25*f19;
+	if(f19 <=f23) //_LBB166_74
+{
+__label__ = 69;
+}
+else{
+	f19 =                         0;
+	f23 = -f2;
+	r11 = f22 < f19;
+	f19 = f19/f24;
+	f22 = f23/f24;
+	f24 = f13/f24;
+	r11 = r11 & 1;
+	r12 = 7;
+	r13 = 0;
+	f23 = f25;
+__label__ = 72;
+}
+}
+else{
+__label__ = 69;
+}
+if (__label__ == 69){
+	f19 = f5;
+	f22 = f5;
+	f24 = f5;
+}
+	f25 = f1*f0;
+	f26 = f11*f3;
+	f25 = f25-f26;
+	if(f25 <f5) //_LBB166_79
+{
+	f5 = -f25;
+}
+else{
+	f5 = f25;
+}
+	f27 = heapFloat[(fp+-185)];
+	f26 = heapFloat[(fp+-178)];
+	f26 = f26*f27;
+	f27 = heapFloat[(fp+-177)];
+	f27 = f27*f16;
+	f26 = f26+f27;
+	f28 = heapFloat[(fp+-183)];
+	f27 = heapFloat[(fp+-181)];
+	f27 = f27*f28;
+	f26 = f26+f27;
+	f27 = heapFloat[(fp+-180)];
+	f27 = f27*f6;
+	f26 = f26+f27;
+	f5 = f5-f26;
+if(!(f5 >f20)) //_LBB166_268
+{
+	f26 = f3*f3;
+	f27 =                         0;
+	f26 = f26+f27;
+	f28 = f0*f0;
+	heapFloat[(fp+-189)] = f28;
+	f28 = f26+f28;
+	heapFloat[(g0)] = f28;
+	sqrtf(i7);
+	f28 = f_g0;
+	if(f28 >f20) //_LBB166_83
+{
+	f5 = f5/f28;
+	f29 =        1.0499999523162842;
+	f29 = f5*f29;
+if(!(f29 <=f23)) //_LBB166_82
+{
+	f19 =                         0;
+	f22 = -f3;
+	r11 = f25 < f19;
+	f19 = f19/f28;
+	f22 = f22/f28;
+	f24 = f0/f28;
+	r11 = r11 & 1;
+	r12 = 8;
+	r13 = 0;
+	f23 = f5;
+}
+}
+	f5 = f1*f14;
+	f25 = f11*f4;
+	f5 = f5-f25;
+	if(f5 <f27) //_LBB166_87
+{
+	f25 = -f5;
+}
+else{
+	f25 = f5;
+}
+	f28 = heapFloat[(fp+-178)];
+	f28 = f28*f18;
+	f29 = heapFloat[(fp+-177)];
+	f29 = f29*f17;
+	f28 = f28+f29;
+	f29 = heapFloat[(fp+-181)];
+	f29 = f29*f7;
+	f28 = f28+f29;
+	f29 = heapFloat[(fp+-182)];
+	f29 = f29*f6;
+	f28 = f28+f29;
+	f25 = f25-f28;
+if(!(f25 >f20)) //_LBB166_268
+{
+	f28 = f4*f4;
+	f28 = f28+f27;
+	f29 = f14*f14;
+	heapFloat[(fp+-190)] = f29;
+	f29 = f28+f29;
+	heapFloat[(g0)] = f29;
+	sqrtf(i7);
+	f29 = f_g0;
+	if(f29 >f20) //_LBB166_91
+{
+	f25 = f25/f29;
+	f30 =        1.0499999523162842;
+	f30 = f25*f30;
+if(!(f30 <=f23)) //_LBB166_90
+{
+	f19 =                         0;
+	f22 = -f4;
+	r11 = f5 < f19;
+	f19 = f19/f29;
+	f22 = f22/f29;
+	f24 = f14/f29;
+	r11 = r11 & 1;
+	r12 = 9;
+	r13 = 0;
+	f23 = f25;
+}
+}
+	f5 = f10*f2;
+	f25 = f1*f9;
+	f5 = f5-f25;
+	if(f5 <f27) //_LBB166_95
+{
+	f25 = -f5;
+}
+else{
+	f25 = f5;
+}
+	f30 = heapFloat[(fp+-184)];
+	f29 = heapFloat[(fp+-179)];
+	f29 = f29*f30;
+	f30 = heapFloat[(fp+-177)];
+	f30 = f30*f6;
+	f29 = f29+f30;
+	f30 = heapFloat[(fp+-182)];
+	f30 = f30*f17;
+	f29 = f29+f30;
+	f30 = heapFloat[(fp+-180)];
+	f30 = f30*f16;
+	f29 = f29+f30;
+	f25 = f25-f29;
+if(!(f25 >f20)) //_LBB166_268
+{
+	f29 = f9*f9;
+	f21 = f21+f29;
+	heapFloat[(g0)] = f21;
+	sqrtf(i7);
+	f21 = f_g0;
+	if(f21 >f20) //_LBB166_99
+{
+	f25 = f25/f21;
+	f30 =        1.0499999523162842;
+	f30 = f25*f30;
+if(!(f30 <=f23)) //_LBB166_98
+{
+	f22 =                         0;
+	f23 = -f9;
+	r11 = f5 < f22;
+	f19 = f2/f21;
+	f22 = f22/f21;
+	f24 = f23/f21;
+	r11 = r11 & 1;
+	r12 = 10;
+	r13 = 0;
+	f23 = f25;
+}
+}
+	f2 = f10*f3;
+	f5 = f1*f8;
+	f2 = f2-f5;
+	if(f2 <f27) //_LBB166_103
+{
+	f5 = -f2;
+}
+else{
+	f5 = f2;
+}
+	f25 = heapFloat[(fp+-185)];
+	f21 = heapFloat[(fp+-179)];
+	f21 = f21*f25;
+	f25 = heapFloat[(fp+-177)];
+	f25 = f25*f7;
+	f21 = f21+f25;
+	f25 = heapFloat[(fp+-181)];
+	f25 = f25*f17;
+	f21 = f21+f25;
+	f25 = heapFloat[(fp+-180)];
+	f25 = f25*f15;
+	f21 = f21+f25;
+	f5 = f5-f21;
+if(!(f5 >f20)) //_LBB166_268
+{
+	f21 = f8*f8;
+	f25 = f26+f21;
+	heapFloat[(g0)] = f25;
+	sqrtf(i7);
+	f25 = f_g0;
+	if(f25 >f20) //_LBB166_107
+{
+	f5 = f5/f25;
+	f26 =        1.0499999523162842;
+	f26 = f5*f26;
+if(!(f26 <=f23)) //_LBB166_106
+{
+	f22 =                         0;
+	f23 = -f8;
+	r11 = f2 < f22;
+	f19 = f3/f25;
+	f22 = f22/f25;
+	f24 = f23/f25;
+	r11 = r11 & 1;
+	r12 = 11;
+	r13 = 0;
+	f23 = f5;
+}
+}
+	f2 = f10*f4;
+	f1 = f1*f12;
+	f1 = f2-f1;
+	if(f1 <f27) //_LBB166_111
+{
+	f2 = -f1;
+}
+else{
+	f2 = f1;
+}
+	f3 = heapFloat[(fp+-179)];
+	f3 = f3*f18;
+	f25 = heapFloat[(fp+-183)];
+	f5 = heapFloat[(fp+-177)];
+	f5 = f5*f25;
+	f3 = f3+f5;
+	f5 = heapFloat[(fp+-181)];
+	f5 = f5*f16;
+	f3 = f3+f5;
+	f5 = heapFloat[(fp+-182)];
+	f5 = f5*f15;
+	f3 = f3+f5;
+	f2 = f2-f3;
+if(!(f2 >f20)) //_LBB166_268
+{
+	f3 = f12*f12;
+	f5 = f28+f3;
+	heapFloat[(g0)] = f5;
+	sqrtf(i7);
+	f5 = f_g0;
+	if(f5 >f20) //_LBB166_115
+{
+	f2 = f2/f5;
+	f25 =        1.0499999523162842;
+	f25 = f2*f25;
+if(!(f25 <=f23)) //_LBB166_114
+{
+	f22 =                         0;
+	f23 = -f12;
+	r11 = f1 < f22;
+	f19 = f4/f5;
+	f22 = f22/f5;
+	f24 = f23/f5;
+	r11 = r11 & 1;
+	r12 = 12;
+	r13 = 0;
+	f23 = f2;
+}
+}
+	f1 = f11*f9;
+	f2 = f10*f13;
+	f1 = f1-f2;
+	if(f1 <f27) //_LBB166_119
+{
+	f2 = -f1;
+}
+else{
+	f2 = f1;
+}
+	f4 = heapFloat[(fp+-179)];
+	f4 = f4*f15;
+	f5 = heapFloat[(fp+-178)];
+	f5 = f5*f6;
+	f4 = f4+f5;
+	f5 = heapFloat[(fp+-182)];
+	f5 = f5*f18;
+	f4 = f4+f5;
+	f6 = heapFloat[(fp+-185)];
+	f5 = heapFloat[(fp+-180)];
+	f5 = f5*f6;
+	f4 = f4+f5;
+	f2 = f2-f4;
+if(!(f2 >f20)) //_LBB166_268
+{
+	f4 = heapFloat[(fp+-188)];
+	f4 = f4+f29;
+	f4 = f4+f27;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	if(f4 >f20) //_LBB166_123
+{
+	f2 = f2/f4;
+	f5 =        1.0499999523162842;
+	f5 = f2*f5;
+if(!(f5 <=f23)) //_LBB166_122
+{
+	f23 =                         0;
+	f19 = -f13;
+	r11 = f1 < f23;
+	f19 = f19/f4;
+	f22 = f9/f4;
+	f24 = f23/f4;
+	r11 = r11 & 1;
+	r12 = 13;
+	r13 = 0;
+	f23 = f2;
+}
+}
+	f1 = f11*f8;
+	f2 = f10*f0;
+	f1 = f1-f2;
+	if(f1 <f27) //_LBB166_127
+{
+	f2 = -f1;
+}
+else{
+	f2 = f1;
+}
+	f4 = heapFloat[(fp+-179)];
+	f4 = f4*f16;
+	f5 = heapFloat[(fp+-178)];
+	f5 = f5*f7;
+	f4 = f4+f5;
+	f5 = heapFloat[(fp+-181)];
+	f5 = f5*f18;
+	f4 = f4+f5;
+	f6 = heapFloat[(fp+-184)];
+	f5 = heapFloat[(fp+-180)];
+	f5 = f5*f6;
+	f4 = f4+f5;
+	f2 = f2-f4;
+if(!(f2 >f20)) //_LBB166_268
+{
+	f4 = heapFloat[(fp+-189)];
+	f4 = f4+f21;
+	f4 = f4+f27;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	if(f4 >f20) //_LBB166_131
+{
+	f2 = f2/f4;
+	f5 =        1.0499999523162842;
+	f5 = f2*f5;
+if(!(f5 <=f23)) //_LBB166_130
+{
+	f23 =                         0;
+	f19 = -f0;
+	r11 = f1 < f23;
+	f19 = f19/f4;
+	f22 = f8/f4;
+	f24 = f23/f4;
+	r11 = r11 & 1;
+	r12 = 14;
+	r13 = 0;
+	f23 = f2;
+}
+}
+	f0 = f11*f12;
+	f1 = f10*f14;
+	f0 = f0-f1;
+	if(f0 <f27) //_LBB166_135
+{
+	f1 = -f0;
+}
+else{
+	f1 = f0;
+}
+	f2 = heapFloat[(fp+-179)];
+	f2 = f2*f17;
+	f5 = heapFloat[(fp+-183)];
+	f4 = heapFloat[(fp+-178)];
+	f4 = f4*f5;
+	f2 = f2+f4;
+	f5 = heapFloat[(fp+-185)];
+	f4 = heapFloat[(fp+-181)];
+	f4 = f4*f5;
+	f2 = f2+f4;
+	f5 = heapFloat[(fp+-184)];
+	f4 = heapFloat[(fp+-182)];
+	f4 = f4*f5;
+	f2 = f2+f4;
+	f1 = f1-f2;
+if(!(f1 >f20)) //_LBB166_268
+{
+	f2 = heapFloat[(fp+-190)];
+	f2 = f2+f3;
+	f2 = f2+f27;
+	heapFloat[(g0)] = f2;
+	sqrtf(i7);
+	f2 = f_g0;
+	if(f2 <=f20) //_LBB166_140
+{
+__label__ = 128;
+}
+else{
+	f1 = f1/f2;
+	heapFloat[(fp+-183)] = f1;
+	f3 =        1.0499999523162842;
+	f1 = f1*f3;
+	if(f1 <=f23) //_LBB166_140
+{
+__label__ = 128;
+}
+else{
+	f23 =                         0;
+	f19 = -f14;
+	r11 = f0 < f23;
+	f19 = f19/f2;
+	f22 = f12/f2;
+	f24 = f23/f2;
+	r11 = r11 & 1;
+	r13 = sp + -704;
+	r12 = 15;
+__label__ = 132;
+}
+}
+if (__label__ == 128){
+	if(r12 ==0) //_LBB166_268
+{
+break _41;
+}
+else{
+	if(r13 !=0) //_LBB166_143
+{
+	r13 = r13 >> 2;
+	f0 = heapFloat[(r13)];
+	r6 = sp + -704;
+	heapFloat[(fp+-176)] = f0;
+	f1 = heapFloat[(r13+4)];
+	r6 = r6 >> 2;
+	heapFloat[(r6+1)] = f1;
+	f19 = heapFloat[(r13+8)];
+	heapFloat[(r6+2)] = f19;
+	heapFloat[(fp+-183)] = f23;
+__label__ = 133;
+}
+else{
+	r13 = sp + -704;
+	heapFloat[(fp+-183)] = f23;
+__label__ = 132;
+}
+}
+}
+if (__label__ == 132){
+	r6 = sp + -640;
+	r6 = r6 >> 2;
+	f0 = heapFloat[(fp+-160)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r6+2)];
+	f0 = f0*f19;
+	f1 = f1*f22;
+	f0 = f0+f1;
+	f1 = f2*f24;
+	f0 = f0+f1;
+	r7 = r13 >> 2;
+	heapFloat[(r7)] = f0;
+	f1 = heapFloat[(r6+4)];
+	f2 = heapFloat[(r6+5)];
+	f3 = heapFloat[(r6+6)];
+	f1 = f1*f19;
+	f2 = f2*f22;
+	r7 = sp + -704;
+	f1 = f1+f2;
+	f2 = f3*f24;
+	f1 = f1+f2;
+	r7 = r7 >> 2;
+	heapFloat[(r7+1)] = f1;
+	f2 = heapFloat[(r6+8)];
+	f3 = heapFloat[(r6+9)];
+	f4 = heapFloat[(r6+10)];
+	f19 = f2*f19;
+	f2 = f3*f22;
+	f19 = f19+f2;
+	f2 = f4*f24;
+	f19 = f19+f2;
+	heapFloat[(r7+2)] = f19;
+}
+	if(r11 !=0) //_LBB166_147
+{
+	f0 = -f0;
+	r6 = sp + -704;
+	f1 = -f1;
+	r6 = r6 >> 2;
+	heapFloat[(fp+-176)] = f0;
+	f19 = -f19;
+	heapFloat[(r6+1)] = f1;
+	heapFloat[(r6+2)] = f19;
+}
+	if(r12 <7) //_LBB166_153
+{
+	if(r12 >3) //_LBB166_155
+{
+	f0 = -f0;
+	f1 = -f1;
+	f19 = -f19;
+	r1 = r0;
+	r0 = r10;
+}
+else{
+	r3 = sp + -640;
+	r2 = sp + -688;
+	r4 = sp + -236;
+	heap32[(fp+-186)] = r4;
+	r4 = sp + -248;
+	r1 = r10;
+}
+	r6 = r2 >> 2;
+	f2 = heapFloat[(r6)];
+	f3 = heapFloat[(r6+4)];
+	f4 = heapFloat[(r6+8)];
+	f2 = f2*f0;
+	f3 = f3*f1;
+	f2 = f2+f3;
+	f3 = f4*f19;
+	f2 = f2+f3;
+	heapFloat[(fp+-66)] = f2;
+	f3 = heapFloat[(r6+1)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+9)];
+	f3 = f3*f0;
+	f4 = f4*f1;
+	r7 = sp + -264;
+	f3 = f3+f4;
+	f4 = f5*f19;
+	f3 = f3+f4;
+	r8 = r7 >> 2;
+	heapFloat[(r8+1)] = f3;
+	f4 = heapFloat[(r6+2)];
+	f5 = heapFloat[(r6+6)];
+	f6 = heapFloat[(r6+10)];
+	f4 = f4*f0;
+	f5 = f5*f1;
+	f4 = f4+f5;
+	f5 = f6*f19;
+	f4 = f4+f5;
+	heapFloat[(r8+2)] = f4;
+	if(f2 <f27) //_LBB166_158
+{
+	f2 = -f2;
+}
+	if(f3 <f27) //_LBB166_161
+{
+	f3 = -f3;
+}
+	if(f4 <f27) //_LBB166_164
+{
+	f4 = -f4;
+}
+	if(f3 <=f2) //_LBB166_169
+{
+	if(f2 <=f4) //_LBB166_171
+{
+	r6 = 2;
+	r8 = 0;
+	r9 = 1;
+}
+else{
+	r6 = 0;
+	r8 = 1;
+	r9 = 2;
+}
+}
+else{
+	if(f3 <=f4) //_LBB166_168
+{
+	r6 = 2;
+	r8 = 0;
+	r9 = 1;
+}
+else{
+	r6 = 1;
+	r8 = 0;
+	r9 = 2;
+}
+}
+	r10 = r6 << 2;
+	r11 = (r4 + r10)|0;
+	r13 = (r2 + r10)|0;
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	r11 = r11 >> 2;
+	r13 = r13 >> 2;
+	f2 = heapFloat[(r11)];
+	f3 = heapFloat[(r13)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r0)];
+	r7 = (r7 + r10)|0;
+	f4 = f4-f5;
+	f3 = f2*f3;
+	r7 = r7 >> 2;
+	f5 = heapFloat[(r7)];
+	if(f5 <f27) //_LBB166_174
+{
+	r7 = r6 | 4;
+	r6 = r6 | 8;
+	r7 = r7 << 2;
+	r6 = r6 << 2;
+	r7 = (r2 + r7)|0;
+	r6 = (r2 + r6)|0;
+	r7 = r7 >> 2;
+	r6 = r6 >> 2;
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r0+1)];
+	f7 = heapFloat[(r7)];
+	f8 = heapFloat[(r6)];
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r0+2)];
+	f5 = f5-f6;
+	f6 = f2*f7;
+	f7 = f9-f10;
+	f2 = f2*f8;
+	f3 = f4+f3;
+	f4 = f5+f6;
+	f2 = f7+f2;
+}
+else{
+	r7 = r6 | 4;
+	r6 = r6 | 8;
+	r7 = r7 << 2;
+	r6 = r6 << 2;
+	r7 = (r2 + r7)|0;
+	r6 = (r2 + r6)|0;
+	r7 = r7 >> 2;
+	r6 = r6 >> 2;
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r0+1)];
+	f7 = heapFloat[(r7)];
+	f8 = heapFloat[(r6)];
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r0+2)];
+	f5 = f5-f6;
+	f6 = f2*f7;
+	f7 = f9-f10;
+	f2 = f2*f8;
+	f3 = f4-f3;
+	f4 = f5-f6;
+	f2 = f7-f2;
+}
+	r1 = -1;
+	r6 = -4;
+	r6 = r12 < 4 ? r1 : r6;
+	r6 = (r6 + r12)|0;
+	if(r6 ==1) //_LBB166_178
+{
+	r7 = 0;
+	r10 = 2;
+}
+else{
+	if(r6 !=0) //_LBB166_179
+{
+	r7 = 0;
+	r10 = 1;
+}
+else{
+	r7 = 1;
+	r10 = 2;
+}
+}
+	r11 = r8 | 4;
+	r13 = r7 | 4;
+	r14 = r8 | 8;
+	r15 = r9 | 4;
+	r16 = r7 | 8;
+	r17 = r10 | 4;
+	r7 = r7 << 2;
+	r13 = r13 << 2;
+	r11 = r11 << 2;
+	r8 = r8 << 2;
+	r18 = r9 | 8;
+	r19 = (r3 + r7)|0;
+	r13 = (r3 + r13)|0;
+	r16 = r16 << 2;
+	r20 = r10 << 2;
+	r17 = r17 << 2;
+	r10 = r10 | 8;
+	r21 = (r2 + r8)|0;
+	r11 = (r2 + r11)|0;
+	r14 = r14 << 2;
+	r15 = r15 << 2;
+	r9 = r9 << 2;
+	r19 = r19 >> 2;
+	r13 = r13 >> 2;
+	r16 = (r3 + r16)|0;
+	r22 = (r3 + r20)|0;
+	r17 = (r3 + r17)|0;
+	r10 = r10 << 2;
+	r21 = r21 >> 2;
+	heap32[(fp+-178)] = r21;
+	r11 = r11 >> 2;
+	heap32[(fp+-177)] = r11;
+	r14 = (r2 + r14)|0;
+	r23 = (r2 + r9)|0;
+	r15 = (r2 + r15)|0;
+	r18 = r18 << 2;
+	r16 = r16 >> 2;
+	r22 = r22 >> 2;
+	r17 = r17 >> 2;
+	r3 = (r3 + r10)|0;
+	r10 = r14 >> 2;
+	heap32[(fp+-179)] = r10;
+	r14 = r23 >> 2;
+	heap32[(fp+-180)] = r14;
+	r15 = r15 >> 2;
+	r2 = (r2 + r18)|0;
+	f5 = heapFloat[(r19)];
+	f6 = heapFloat[(r21)];
+	f7 = heapFloat[(r13)];
+	f8 = heapFloat[(r11)];
+	f9 = heapFloat[(r22)];
+	f10 = heapFloat[(r14)];
+	f11 = heapFloat[(r17)];
+	f12 = heapFloat[(r15)];
+	r3 = r3 >> 2;
+	r2 = r2 >> 2;
+	r8 = (r4 + r8)|0;
+	f13 = f5*f6;
+	f14 = f7*f8;
+	f15 = heapFloat[(r16)];
+	f16 = heapFloat[(r10)];
+	f17 = heapFloat[(r3)];
+	f18 = heapFloat[(r2)];
+	r3 = r8 >> 2;
+	r4 = (r4 + r9)|0;
+	f6 = f9*f6;
+	f8 = f11*f8;
+	f21 = f3*f5;
+	f22 = f4*f7;
+	f13 = f13+f14;
+	f14 = f15*f16;
+	f5 = f5*f10;
+	f7 = f7*f12;
+	f13 = f13+f14;
+	f14 = heapFloat[(r3)];
+	r3 = r4 >> 2;
+	f23 = f3*f9;
+	f24 = f4*f11;
+	f6 = f6+f8;
+	f8 = f17*f16;
+	f9 = f9*f10;
+	f10 = f11*f12;
+	f11 = f21+f22;
+	f12 = f2*f15;
+	f5 = f5+f7;
+	f7 = f15*f18;
+	f6 = f6+f8;
+	f8 = f11+f12;
+	f11 = f14*f13;
+	f5 = f5+f7;
+	f7 = heapFloat[(r3)];
+	f12 = f23+f24;
+	f15 = f2*f17;
+	f9 = f9+f10;
+	f10 = f17*f18;
+	f9 = f9+f10;
+	f10 = f12+f15;
+	f12 = f14*f6;
+	f14 = f8-f11;
+	f15 = f7*f5;
+	r3 = sp + -296;
+	f16 = f10-f12;
+	f7 = f7*f9;
+	f17 = f14-f15;
+	r4 = r3 >> 2;
+	f18 = f16-f7;
+	heapFloat[(fp+-74)] = f17;
+	f14 = f14+f15;
+	heapFloat[(r4+1)] = f18;
+	f11 = f8+f11;
+	f16 = f16+f7;
+	heapFloat[(r4+2)] = f14;
+	f12 = f10+f12;
+	f14 = f11+f15;
+	heapFloat[(r4+3)] = f16;
+	f16 = f12+f7;
+	heapFloat[(r4+4)] = f14;
+	f11 = f11-f15;
+	heapFloat[(r4+5)] = f16;
+	r8 = heap32[(fp+-186)];
+	r7 = (r8 + r7)|0;
+	f7 = f12-f7;
+	heapFloat[(r4+6)] = f11;
+	r9 = sp + -304;
+	r8 = (r8 + r20)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r4+7)] = f7;
+	r4 = sp + -368;
+	r10 = 0;
+	r11 = 4;
+	r13 = r9 >> 2;
+	r8 = r8 >> 2;
+	heap32[(fp+-76)] = heap32[(r7)];
+	heap32[(r13+1)] = heap32[(r8)];
+	r7 = r10;
+_217: while(true){
+	if(r7 <2) //_LBB166_199
+{
+	r18 = 0;
+	r17 = (r18 - r7)|0;
+	r14 = r1;
+	r8 = r4;
+_220: while(true){
+	r4 = r8;
+	if(r14 >1) //_LBB166_196
+{
+break _220;
+}
+else{
+	f7 = r14; //fitos r14, f7
+	r16 = (r3 + 8)|0;
+	r8 = r18;
+	r10 = r18;
+	r13 = r4;
+_223: while(true){
+	if(r11 >0) //_LBB166_181
+{
+	r19 = (r3 + r8)|0;
+	r20 = (r16 + r8)|0;
+	r21 = r7 << 2;
+	r22 = (r9 + r21)|0;
+	r23 = (r19 + r21)|0;
+	r22 = r22 >> 2;
+	r23 = r23 >> 2;
+	f11 = heapFloat[(r22)];
+	f12 = heapFloat[(r23)];
+	f14 = f7*f12;
+	if(f14 <f11) //_LBB166_183
+{
+	r24 = r13 >> 2;
+	r25 = r19 >> 2;
+	r10 = (r10 + 1)|0;
+	heap32[(r24)] = heap32[(r25)];
+	heap32[(r24+1)] = heap32[(r25+1)];
+	r24 = r10 & 8;
+	if(r24 ==0) //_LBB166_185
+{
+	r13 = (r13 + 8)|0;
+	f12 = heapFloat[(r23)];
+	f11 = heapFloat[(r22)];
+}
+else{
+__label__ = 179;
+break _217;
+}
+}
+	r20 = r11 > 1 ? r20 : r3;
+	r23 = (r20 + r21)|0;
+	r23 = r23 >> 2;
+	f14 = heapFloat[(r23)];
+	f15 = f7*f12;
+	f16 = f7*f14;
+	r23 = f15 < f11;
+	r24 = f16 < f11;
+	r23 = r23 ^ r24;
+	if(r23 != 0) //_LBB166_188
+{
+	r23 = r17 << 2;
+	r19 = (r19 + r23)|0;
+	r20 = (r20 + r23)|0;
+	r19 = r19 >> 2;
+	r20 = r20 >> 2;
+	f15 = heapFloat[(r19+1)];
+	f16 = heapFloat[(r20+1)];
+	f11 = f7*f11;
+	f16 = f16-f15;
+	f14 = f14-f12;
+	f14 = f16/f14;
+	f11 = f11-f12;
+	r19 = (r13 + r23)|0;
+	f11 = f14*f11;
+	r19 = r19 >> 2;
+	f11 = f15+f11;
+	heapFloat[(r19+1)] = f11;
+	r19 = (r13 + r21)|0;
+	f11 = heapFloat[(r22)];
+	r10 = (r10 + 1)|0;
+	r19 = r19 >> 2;
+	f11 = f7*f11;
+	heapFloat[(r19)] = f11;
+	r19 = r10 & 8;
+	if(r19 ==0) //_LBB166_190
+{
+	r13 = (r13 + 8)|0;
+}
+else{
+__label__ = 179;
+break _217;
+}
+}
+	r11 = (r11 + -1)|0;
+	r8 = (r8 + 8)|0;
+}
+else{
+break _223;
+}
+}
+	r3 = sp + -368;
+	r8 = sp + -128;
+	r8 = r4 == r3 ? r8 : r3;
+	r14 = (r14 + 2)|0;
+	r3 = r4;
+	r11 = r10;
+}
+}
+	r7 = (r7 + 1)|0;
+}
+else{
+__label__ = 177;
+break _217;
+}
+}
+if (__label__ == 177){
+	r4 = r3;
+}
+	r1 = sp + -368;
+if(!(r4 ==r1)) //_LBB166_202
+{
+	r3 = r10 << 3;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r3;
+	memcpy(i7);
+}
+	if(r10 <1) //_LBB166_268
+{
+break _41;
+}
+else{
+	f7 = f13*f9;
+	f11 = f5*f6;
+	f12 =                         1;
+	f7 = f7-f11;
+	r3 = r6 << 2;
+	f7 = f12/f7;
+	r4 = heap32[(fp+-186)];
+	r3 = (r4 + r3)|0;
+	f6 = f6*f7;
+	r3 = r3 >> 2;
+	f11 = f13*f7;
+	f5 = f5*f7;
+	f7 = f9*f7;
+	f6 = -f6;
+	f9 = heapFloat[(r3)];
+	r3 = heap32[(fp+-178)];
+	f13 = heapFloat[(r3)];
+	r3 = heap32[(fp+-180)];
+	f14 = heapFloat[(r3)];
+	r3 = heap32[(fp+-177)];
+	f15 = heapFloat[(r3)];
+	f16 = heapFloat[(r15)];
+	r3 = heap32[(fp+-179)];
+	f17 = heapFloat[(r3)];
+	f18 = heapFloat[(r2)];
+	r2 = (r1 + 4)|0;
+	r3 = 0;
+_243: while(true){
+	r4 = r2 >> 2;
+	f21 = heapFloat[(r4+-1)];
+	f22 = heapFloat[(r4)];
+	f23 = f21-f8;
+	f24 = f22-f10;
+	f25 = f23*f7;
+	f26 = f24*f5;
+	f25 = f25-f26;
+	f23 = f23*f6;
+	f24 = f24*f11;
+	r4 = (r3 * 3)|0;
+	f26 = f15*f25;
+	f23 = f23+f24;
+	f24 = f13*f25;
+	r6 = sp + -464;
+	r4 = r4 << 2;
+	f25 = f17*f25;
+	f26 = f4+f26;
+	f28 = f16*f23;
+	f24 = f3+f24;
+	f29 = f14*f23;
+	r4 = (r6 + r4)|0;
+	f24 = f24+f29;
+	f26 = f26+f28;
+	f25 = f2+f25;
+	f23 = f18*f23;
+	f28 = f0*f24;
+	f29 = f1*f26;
+	f23 = f25+f23;
+	r4 = r4 >> 2;
+	heapFloat[(r4)] = f24;
+	f24 = f28+f29;
+	f25 = f19*f23;
+	r7 = sp + -496;
+	r8 = r3 << 2;
+	r8 = (r7 + r8)|0;
+	heapFloat[(r4+1)] = f26;
+	f24 = f24+f25;
+	f24 = f9-f24;
+	r8 = r8 >> 2;
+	heapFloat[(r4+2)] = f23;
+	heapFloat[(r8)] = f24;
+	if(f24 >=f27) //_LBB166_206
+{
+	r4 = r3 << 3;
+	r8 = r4 | 4;
+	r4 = (r1 + r4)|0;
+	r8 = (r1 + r8)|0;
+	r4 = r4 >> 2;
+	r3 = (r3 + 1)|0;
+	r8 = r8 >> 2;
+	heapFloat[(r4)] = f21;
+	heapFloat[(r8)] = f22;
+}
+	r10 = (r10 + -1)|0;
+	r2 = (r2 + 8)|0;
+if(!(r10 !=0)) //_LBB166_204
+{
+break _243;
+}
+}
+	if(r3 <1) //_LBB166_268
+{
+break _41;
+}
+else{
+	r2 = 4;
+	r2 = r3 < 4 ? r3 : r2;
+	r4 = 1;
+	r8 = r2 < 1 ? r4 : r2;
+	if(r3 >r8) //_LBB166_215
+{
+_252: do {
+	if(r3 >1) //_LBB166_217
+{
+	f0 = heapFloat[(fp+-124)];
+	r9 = 1;
+	r7 = 0;
+_254: while(true){
+	r10 = sp + -496;
+	r11 = r9 << 2;
+	r10 = (r10 + r11)|0;
+	r10 = r10 >> 2;
+	f1 = heapFloat[(r10)];
+	r10 = (r9 + 1)|0;
+	r7 = f1 > f0 ? r9 : r7;
+	f0 = f1 > f0 ? f1 : f0;
+	r9 = r10;
+if(!(r3 !=r10)) //_LBB166_218
+{
+break _252;
+}
+}
+}
+else{
+	r7 = 0;
+}
+} while(0);
+_258: do {
+	if(r3 ==1) //_LBB166_224
+{
+	r9 = r1 >> 2;
+	f0 = heapFloat[(fp+-92)];
+	f1 = heapFloat[(r9+1)];
+__label__ = 214;
+break _258;
+}
+else{
+	if(r3 ==2) //_LBB166_225
+{
+	r9 = r1 >> 2;
+	f0 = heapFloat[(fp+-92)];
+	f1 = heapFloat[(r9+2)];
+	f2 = heapFloat[(r9+1)];
+	f12 = heapFloat[(r9+3)];
+	f0 = f0+f1;
+	f1 = f2+f12;
+	f2 = heapFloat[(fp+-187)];
+	f0 = f0*f2;
+	f1 = f1*f2;
+__label__ = 214;
+break _258;
+}
+else{
+	r9 = (r3 + -1)|0;
+_264: do {
+	if(r9 >0) //_LBB166_223
+{
+	r10 = (r1 + 8)|0;
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+_266: while(true){
+	r11 = r10 >> 2;
+	f3 = heapFloat[(r11+-2)];
+	f4 = heapFloat[(r11+1)];
+	f5 = heapFloat[(r11)];
+	f6 = heapFloat[(r11+-1)];
+	f7 = f3*f4;
+	f8 = f5*f6;
+	f3 = f3+f5;
+	f5 = f7-f8;
+	f4 = f6+f4;
+	f3 = f3*f5;
+	f4 = f4*f5;
+	r9 = (r9 + -1)|0;
+	f2 = f2+f5;
+	f1 = f3+f1;
+	f0 = f4+f0;
+	r10 = (r10 + 8)|0;
+if(!(r9 !=0)) //_LBB166_226
+{
+break _264;
+}
+}
+}
+else{
+	f0 = f27;
+	f1 = f27;
+	f2 = f27;
+}
+} while(0);
+	r9 = r3 << 3;
+	r9 = (r9 + r1)|0;
+	r9 = r9 >> 2;
+	r10 = r1 >> 2;
+	f3 = heapFloat[(r9+-2)];
+	f4 = heapFloat[(r10+1)];
+	f5 = heapFloat[(fp+-92)];
+	f6 = heapFloat[(r9+-1)];
+	f7 = f3*f4;
+	f8 = f5*f6;
+	f7 = f7-f8;
+	f2 = f2+f7;
+	if(f2 <f27) //_LBB166_229
+{
+	f8 = -f2;
+}
+else{
+	f8 = f2;
+}
+	if(f8 >f20) //_LBB166_232
+{
+	f8 =                         3;
+	f2 = f2*f8;
+	f2 = f12/f2;
+}
+else{
+	f2 =        999999984306749440;
+}
+	if(r3 >0) //_LBB166_235
+{
+	f3 = f3+f5;
+	f4 = f6+f4;
+	f3 = f3*f7;
+	f4 = f4*f7;
+	f1 = f3+f1;
+	f3 = f4+f0;
+	f0 = f1*f2;
+	f1 = f3*f2;
+__label__ = 214;
+}
+else{
+	r1 = 0;
+__label__ = 219;
+}
+}
+}
+} while(0);
+if (__label__ == 214){
+	r1 = (r1 + 4)|0;
+	r9 = sp + -32;
+	r10 = r3;
+_283: while(true){
+	r11 = r1 >> 2;
+	f2 = heapFloat[(r11+-1)];
+	f3 = heapFloat[(r11)];
+	f3 = f3-f1;
+	f2 = f2-f0;
+	heapFloat[(g0)] = f3;
+	heapFloat[(g0+1)] = f2;
+	r10 = (r10 + -1)|0;
+	r1 = (r1 + 8)|0;
+	r11 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	atan2f(i7);
+	heapFloat[(r9)] = f_g0;
+	r9 = r11;
+if(!(r10 !=0)) //_LBB166_237
+{
+break _283;
+}
+}
+	r1 = sp + -64;
+	r9 = r3;
+_286: while(true){
+	r9 = (r9 + -1)|0;
+	r10 = (r1 + 4)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = 1;
+	r1 = r10;
+if(!(r9 !=0)) //_LBB166_239
+{
+break _286;
+}
+}
+	r1 = 1;
+}
+	r9 = sp + -64;
+	r10 = r7 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	f0 =        6.2831854820251465;
+	f1 = r8; //fitos r8, f1
+	f1 = f0/f1;
+	heap32[(r11)] = 0;
+	heap32[(fp+-144)] = r7;
+	f6 =                         0;
+_290: while(true){
+	if(r4 <r8) //_LBB166_242
+{
+	r11 = sp + -32;
+	r13 = (r11 + r10)|0;
+	r13 = r13 >> 2;
+	f2 = r4; //fitos r4, f2
+	f2 = f2*f1;
+	f3 = heapFloat[(r13)];
+	f2 = f2+f3;
+	f3 =        3.1415927410125732;
+	if(f2 >f3) //_LBB166_244
+{
+	f4 =       -6.2831854820251465;
+	f2 = f2+f4;
+}
+	r13 = sp + -576;
+	r14 = r4 << 2;
+	r13 = (r13 + r14)|0;
+	r13 = r13 >> 2;
+	r14 = r1 & 1;
+	heap32[(r13)] = r7;
+	if(r14 ==0) //_LBB166_259
+{
+__label__ = 233;
+break _290;
+}
+else{
+	f4 =                1000000000;
+	r14 = 0;
+	r15 = r7;
+_297: while(true){
+	r16 = r14 << 2;
+	r17 = (r9 + r16)|0;
+	r17 = r17 >> 2;
+	r17 = heap32[(r17)];
+	if(r17 !=0) //_LBB166_249
+{
+	r16 = (r11 + r16)|0;
+	r16 = r16 >> 2;
+	f5 = heapFloat[(r16)];
+	f5 = f5-f2;
+	if(f5 <f6) //_LBB166_251
+{
+	f5 = -f5;
+}
+	if(f5 >f3) //_LBB166_254
+{
+	f5 = f0-f5;
+}
+if(!(f5 >=f4)) //_LBB166_248
+{
+	heap32[(r13)] = r14;
+	r15 = r14;
+	f4 = f5;
+}
+}
+	r14 = (r14 + 1)|0;
+if(!(r3 !=r14)) //_LBB166_247
+{
+break _297;
+}
+}
+	if(r15 !=r7) //_LBB166_260
+{
+	r11 = r15 << 2;
+	r11 = (r9 + r11)|0;
+	r4 = (r4 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = 0;
+}
+else{
+__label__ = 233;
+break _290;
+}
+}
+}
+else{
+__label__ = 236;
+break _290;
+}
+}
+switch(__label__ ){//multiple entries
+case 233:
+	r0 = _2E_str65;
+	r1 = _2E_str166;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 248;
+	_assert(i7);
+break;
+case 236:
+	if(r8 >0) //_LBB166_267
+{
+	r1 = 0;
+_315: while(true){
+	r3 = sp + -576;
+	r4 = r1 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = (r3 * 3)|0;
+	r4 = r4 << 2;
+	r4 = (r6 + r4)|0;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r4)];
+	f1 = heapFloat[(r0)];
+	f0 = f0+f1;
+	heapFloat[(fp+-148)] = f0;
+	r7 = sp + -592;
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(r0+1)];
+	f1 = f1+f2;
+	r8 = r7 >> 2;
+	heapFloat[(r8+1)] = f1;
+	f2 = heapFloat[(r4+2)];
+	f3 = heapFloat[(r0+2)];
+	f2 = f2+f3;
+	r4 = sp + -496;
+	r3 = r3 << 2;
+	r3 = (r4 + r3)|0;
+	r4 = r5 >> 2;
+	heapFloat[(r8+2)] = f2;
+	r4 = heap32[(r4)];
+	r3 = r3 >> 2;
+	r8 = sp + -704;
+	f3 = heapFloat[(r3)];
+	r3 = r4 >> 2;
+	r4 = r8 >> 2;
+	r3 = heap32[(r3+4)];
+	f4 = -f3;
+	f5 = heapFloat[(r4+2)];
+	if(r12 >3) //_LBB166_265
+{
+	f6 = heapFloat[(fp+-176)];
+	f7 = heapFloat[(r4+1)];
+	f8 = f6*f3;
+	r4 = sp + -160;
+	f9 = f7*f3;
+	f0 = f0-f8;
+	r7 = r4 >> 2;
+	f3 = f5*f3;
+	f1 = f1-f9;
+	heapFloat[(fp+-40)] = f0;
+	f0 = f2-f3;
+	heapFloat[(r7+1)] = f1;
+	heapFloat[(r7+2)] = f0;
+	r8 = sp + -144;
+	f0 = -f6;
+	heap32[(r7+3)] = 0;
+	r7 = r8 >> 2;
+	f1 = -f7;
+	heapFloat[(fp+-36)] = f0;
+	f0 = -f5;
+	heapFloat[(r7+1)] = f1;
+	heapFloat[(r7+2)] = f0;
+	heap32[(r7+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r4;
+	heapFloat[(g0+3)] = f4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+else{
+	f0 = heapFloat[(r4+1)];
+	f1 = heapFloat[(fp+-176)];
+	r4 = sp + -176;
+	f1 = -f1;
+	r8 = r4 >> 2;
+	f0 = -f0;
+	heapFloat[(fp+-44)] = f1;
+	f1 = -f5;
+	heapFloat[(r8+1)] = f0;
+	heapFloat[(r8+2)] = f1;
+	heap32[(r8+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	heapFloat[(g0+3)] = f4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	if(r1 >=r2) //_LBB166_268
+{
+break _41;
+}
+else{
+continue _315;
+}
+}
+}
+else{
+break _41;
+}
+break;
+}
+}
+else{
+	if(r12 <4) //_LBB166_212
+{
+	r1 = (r6 + 8)|0;
+	r2 = sp + -496;
+_324: while(true){
+	r4 = r1 >> 2;
+	f12 = heapFloat[(r4+-2)];
+	f20 = heapFloat[(r0)];
+	f12 = f12+f20;
+	heapFloat[(fp+-132)] = f12;
+	r6 = sp + -528;
+	f12 = heapFloat[(r4+-1)];
+	f20 = heapFloat[(r0+1)];
+	r7 = r6 >> 2;
+	f12 = f12+f20;
+	heapFloat[(r7+1)] = f12;
+	f12 = heapFloat[(r4)];
+	f20 = heapFloat[(r0+2)];
+	f12 = f12+f20;
+	heapFloat[(r7+2)] = f12;
+	r4 = r5 >> 2;
+	r4 = heap32[(r4)];
+	r7 = sp + -704;
+	r7 = r7 >> 2;
+	r4 = r4 >> 2;
+	r8 = r2 >> 2;
+	f12 = heapFloat[(r8)];
+	f20 = heapFloat[(r7+2)];
+	f27 = heapFloat[(r7+1)];
+	f0 = heapFloat[(fp+-176)];
+	r4 = heap32[(r4+4)];
+	r7 = sp + -208;
+	f0 = -f0;
+	r8 = r7 >> 2;
+	f27 = -f27;
+	heapFloat[(fp+-52)] = f0;
+	f20 = -f20;
+	heapFloat[(r8+1)] = f27;
+	heapFloat[(r8+2)] = f20;
+	heap32[(r8+3)] = 0;
+	f12 = -f12;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r6;
+	heapFloat[(g0+3)] = f12;
+	r3 = (r3 + -1)|0;
+	r2 = (r2 + 4)|0;
+	r1 = (r1 + 12)|0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	if(r3 ==0) //_LBB166_268
+{
+break _41;
+}
+else{
+continue _324;
+}
+}
+}
+else{
+	r1 = (r6 + 8)|0;
+_327: while(true){
+	r2 = r7 >> 2;
+	r4 = r1 >> 2;
+	f12 = heapFloat[(r2)];
+	f20 = heapFloat[(fp+-176)];
+	f27 = heapFloat[(r4+-2)];
+	f0 = heapFloat[(r0)];
+	f27 = f27+f0;
+	f0 = f20*f12;
+	r2 = sp + -704;
+	f27 = f27-f0;
+	heapFloat[(fp+-136)] = f27;
+	r2 = r2 >> 2;
+	f27 = heapFloat[(r2+1)];
+	f0 = heapFloat[(r4+-1)];
+	f1 = heapFloat[(r0+1)];
+	r6 = sp + -544;
+	f0 = f0+f1;
+	f1 = f27*f12;
+	r8 = r6 >> 2;
+	f0 = f0-f1;
+	heapFloat[(r8+1)] = f0;
+	f0 = heapFloat[(r2+2)];
+	f1 = heapFloat[(r4)];
+	f2 = heapFloat[(r0+2)];
+	f1 = f1+f2;
+	f2 = f0*f12;
+	f1 = f1-f2;
+	r2 = r5 >> 2;
+	heapFloat[(r8+2)] = f1;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r4 = sp + -192;
+	f20 = -f20;
+	r8 = r4 >> 2;
+	f27 = -f27;
+	heapFloat[(fp+-48)] = f20;
+	f20 = -f0;
+	heapFloat[(r8+1)] = f27;
+	heapFloat[(r8+2)] = f20;
+	heap32[(r8+3)] = 0;
+	f12 = -f12;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	heapFloat[(g0+3)] = f12;
+	r3 = (r3 + -1)|0;
+	r7 = (r7 + 4)|0;
+	r1 = (r1 + 12)|0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	if(r3 ==0) //_LBB166_268
+{
+break _41;
+}
+else{
+continue _327;
+}
+}
+}
+}
+}
+}
+}
+else{
+	r0 = sp + -688;
+	r2 = r0 >> 2;
+	f20 = heapFloat[(fp+-172)];
+	f27 = heapFloat[(r2+4)];
+	f2 = heapFloat[(r2+5)];
+	f3 = heapFloat[(r2+1)];
+	f4 = f0*f20;
+	f5 = f1*f27;
+	f6 = heapFloat[(r2+8)];
+	f7 = heapFloat[(r2+9)];
+	f8 = heapFloat[(r2+6)];
+	f9 = heapFloat[(r2+2)];
+	f4 = f4+f5;
+	f5 = f19*f6;
+	f10 = f0*f3;
+	f11 = f1*f2;
+	f12 = heapFloat[(r2+10)];
+	f4 = f4+f5;
+	f5 = f10+f11;
+	f10 = f19*f7;
+	f11 = f0*f9;
+	f13 = f1*f8;
+	f14 =                         0;
+	f15 =                        -1;
+	f16 =                         1;
+	f5 = f5+f10;
+	f4 = f4 > f14 ? f15 : f16;
+	f10 = f11+f13;
+	f11 = f19*f12;
+	f13 = heapFloat[(fp+-181)];
+	f4 = f13*f4;
+	f10 = f10+f11;
+	f5 = f5 > f14 ? f15 : f16;
+	f11 = heapFloat[(fp+-182)];
+	f5 = f11*f5;
+	r2 = sp + -640;
+	f20 = f4*f20;
+	f11 = heapFloat[(r1+28)];
+	f10 = f10 > f14 ? f15 : f16;
+	r3 = r2 >> 2;
+	f13 = heapFloat[(fp+-180)];
+	f10 = f13*f10;
+	f27 = f4*f27;
+	f13 = heapFloat[(r1+29)];
+	f20 = f11+f20;
+	f3 = f5*f3;
+	r4 = (r12 + -7)|0;
+	f11 = heapFloat[(r3+4)];
+	f17 = heapFloat[(fp+-160)];
+	f18 = heapFloat[(r3+8)];
+	f21 = heapFloat[(r3+5)];
+	f22 = heapFloat[(r3+1)];
+	f23 = heapFloat[(r3+9)];
+	f24 = heapFloat[(r3+6)];
+	f25 = heapFloat[(r3+2)];
+	f26 = heapFloat[(r3+10)];
+	f4 = f4*f6;
+	f6 = heapFloat[(r1+30)];
+	f27 = f13+f27;
+	f2 = f5*f2;
+	f20 = f20+f3;
+	f3 = f10*f9;
+	f9 = heapFloat[(r1+12)];
+	heapFloat[(fp+-182)] = f9;
+	f9 = heapFloat[(r1+13)];
+	heapFloat[(fp+-181)] = f9;
+	f9 = heapFloat[(r1+14)];
+	heapFloat[(fp+-180)] = f9;
+	r3 = (r4 / 3)|0;
+	r4 = (r4 % 3)|0;
+	r10 = sp + -512;
+	f20 = f20+f3;
+	f3 = f6+f4;
+	f4 = f5*f7;
+	f27 = f27+f2;
+	f2 = f10*f8;
+	r3 = r3 << 2;
+	r4 = r4 << 2;
+	f27 = f27+f2;
+	r12 = r10 >> 2;
+	heapFloat[(fp+-128)] = f20;
+	f2 = f3+f4;
+	f3 = f10*f12;
+	r2 = (r2 + r3)|0;
+	r0 = (r0 + r4)|0;
+	f2 = f2+f3;
+	heapFloat[(r12+1)] = f27;
+	r2 = r2 >> 2;
+	heapFloat[(r12+2)] = f2;
+	r0 = r0 >> 2;
+	f3 = heapFloat[(r2)];
+	f4 = heapFloat[(r0)];
+	f5 = heapFloat[(r2+4)];
+	f6 = heapFloat[(r0+4)];
+	f7 = heapFloat[(r2+8)];
+	f8 = heapFloat[(r0+8)];
+	f9 = f3*f4;
+	f10 = f5*f6;
+	f9 = f9+f10;
+	f10 = f7*f8;
+	f9 = f9+f10;
+	f10 = f9*f9;
+	f10 = f16-f10;
+	f12 =   9.9999997473787516e-005;
+	if(f10 >f12) //_LBB166_151
+{
+	f12 = f0*f17;
+	f13 = f1*f11;
+	f12 = f12+f13;
+	f13 = f19*f18;
+	f28 = f0*f22;
+	f29 = f1*f21;
+	f12 = f12+f13;
+	f13 = f28+f29;
+	f28 = f19*f23;
+	f29 = f0*f25;
+	f30 = f1*f24;
+	f13 = f13+f28;
+	f12 = f12 > f14 ? f16 : f15;
+	f28 = f29+f30;
+	f29 = f19*f26;
+	f30 = heapFloat[(fp+-179)];
+	f12 = f30*f12;
+	f28 = f28+f29;
+	f13 = f13 > f14 ? f16 : f15;
+	f29 = heapFloat[(fp+-178)];
+	f13 = f29*f13;
+	f17 = f12*f17;
+	f11 = f12*f11;
+	f12 = f12*f18;
+	f14 = f28 > f14 ? f16 : f15;
+	f15 = heapFloat[(fp+-177)];
+	f14 = f15*f14;
+	f15 = heapFloat[(fp+-182)];
+	f15 = f15+f17;
+	f17 = f13*f22;
+	f18 = heapFloat[(fp+-181)];
+	f11 = f18+f11;
+	f18 = f13*f21;
+	f21 = heapFloat[(fp+-180)];
+	f12 = f21+f12;
+	f13 = f13*f23;
+	f15 = f15+f17;
+	f17 = f14*f25;
+	f11 = f11+f18;
+	f18 = f14*f24;
+	f12 = f12+f13;
+	f14 = f14*f26;
+	f13 = f15+f17;
+	f11 = f11+f18;
+	f14 = f12+f14;
+	f12 = f20-f13;
+	f11 = f27-f11;
+	f14 = f2-f14;
+	f3 = f3*f12;
+	f5 = f5*f11;
+	f3 = f3+f5;
+	f5 = f7*f14;
+	f7 = f4*f12;
+	f11 = f6*f11;
+	f3 = f3+f5;
+	f5 = f7+f11;
+	f14 = f8*f14;
+	f3 = f9*f3;
+	f14 = f5+f14;
+	f14 = f3-f14;
+	f3 = f16/f10;
+	f14 = f14*f3;
+}
+	f3 = f4*f14;
+	f20 = f20+f3;
+	f3 = f6*f14;
+	f4 = f8*f14;
+	f27 = f27+f3;
+	heapFloat[(fp+-128)] = f20;
+	f20 = f2+f4;
+	heapFloat[(r12+1)] = f27;
+	r0 = r5 >> 2;
+	heapFloat[(r12+2)] = f20;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r2 = sp + -224;
+	f0 = -f0;
+	r3 = r2 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-56)] = f0;
+	f0 = -f19;
+	heapFloat[(r3+1)] = f1;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r10;
+	f0 = heapFloat[(fp+-183)];
+	heapFloat[(g0+3)] = f0;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN21btCollisionDispatcher13findAlgorithmEP17btCollisionObjectS1_P20btPersistentManifold(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(fp+3)];
+	heap32[(fp+-2)] = r1;
+	r5 = heap32[(fp+2)];
+	r6 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r3 = heap32[(r6+48)];
+	r4 = r5 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r4+48)];
+	r3 = heap32[(r3+1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	r3 = (r3 * 144)|0;
+	r1 = (r1 + r3)|0;
+	r3 = r4 << 2;
+	r1 = (r1 + r3)|0;
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+50)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+
+function _ZN21btCollisionDispatcher13needsResponseEP17btCollisionObjectS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+51)];
+	r1 = r0 & 4;
+if(!(r1 !=0)) //_LBB168_4
+{
+	r1 = heap32[(fp+2)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+51)];
+	r2 = r1 & 4;
+if(!(r2 !=0)) //_LBB168_4
+{
+	r0 = r0 & 3;
+	if(r0 ==0) //_LBB168_5
+{
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = r1 & 3;
+	r1 = 0;
+	r0 = r0 == r1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN23btCollisionPairCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btCollisionPairCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN23btCollisionPairCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btCollisionPairCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btCollisionPairCallback14processOverlapER16btBroadphasePair(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2+47)];
+	r0 = heap32[(r0+1)];
+	r3 = heap32[(fp+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher25dispatchAllCollisionPairsEP22btOverlappingPairCacheRK16btDispatcherInfoP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = _ZTV23btCollisionPairCallback;
+	r1 = sp + -16;
+	r0 = (r0 + 8)|0;
+	r2 = r1 >> 2;
+	r3 = heap32[(fp+2)];
+	heap32[(fp+-4)] = r0;
+	r0 = heap32[(fp+1)];
+	r4 = heap32[(fp)];
+	heap32[(r2+1)] = r3;
+	r3 = r0 >> 2;
+	heap32[(r2+2)] = r4;
+	r2 = heap32[(r3)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZNK21btCollisionDispatcher15getNumManifoldsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher26getInternalManifoldPointerEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher26getManifoldByIndexInternalEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r0 = heap32[(r0+5)];
+	r1 = r1 << 2;
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher22freeCollisionAlgorithmEPv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+if(!(r0 ==0)) //_LBB176_5
+{
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+48)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1+4)];
+if(!(uint(r2) >uint(r0))) //_LBB176_4
+{
+	r3 = heap32[(r1)];
+	r4 = heap32[(r1+1)];
+	r3 = (r3 * r4)|0;
+	r2 = (r2 + r3)|0;
+if(!(uint(r2) <=uint(r0))) //_LBB176_4
+{
+	r2 = r0 >> 2;
+	r3 = heap32[(r1+3)];
+	heap32[(r2)] = r3;
+	heap32[(r1+3)] = r0;
+	r0 = heap32[(r1+2)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1+2)] = r0;
+	return;
+}
+}
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN21btCollisionDispatcher15releaseManifoldEP20btPersistentManifold(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = gNumManifold;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp)];
+	r1 = (r1 + -1)|0;
+	r3 = r2 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r3)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	r1 = heap32[(fp+1)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = r1 >> 2;
+	r2 = heap32[(r3+3)];
+	r4 = heap32[(r0+284)];
+	if(r2 >r4) //_LBB177_2
+{
+	r2 = (r2 + -1)|0;
+	r5 = r4 << 2;
+	r6 = heap32[(r3+5)];
+	r2 = r2 << 2;
+	r7 = (r6 + r5)|0;
+	r6 = (r6 + r2)|0;
+	r7 = r7 >> 2;
+	r6 = r6 >> 2;
+	r8 = heap32[(r7)];
+	r6 = heap32[(r6)];
+	heap32[(r7)] = r6;
+	r6 = heap32[(r3+5)];
+	r2 = (r6 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r8;
+	r2 = heap32[(r3+5)];
+	r2 = (r2 + r5)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	heap32[(r2+284)] = r4;
+	r2 = heap32[(r3+3)];
+	r2 = (r2 + -1)|0;
+	heap32[(r3+3)] = r2;
+if(!(r1 ==0)) //_LBB177_7
+{
+	r2 = heap32[(r3+49)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+4)];
+if(!(uint(r3) >uint(r1))) //_LBB177_6
+{
+	r4 = heap32[(r2)];
+	r5 = heap32[(r2+1)];
+	r4 = (r4 * r5)|0;
+	r3 = (r3 + r4)|0;
+if(!(uint(r3) <=uint(r1))) //_LBB177_6
+{
+	r3 = heap32[(r2+3)];
+	heap32[(r0)] = r3;
+	heap32[(r2+3)] = r1;
+	r0 = heap32[(r2+2)];
+	r0 = (r0 + 1)|0;
+	heap32[(r2+2)] = r0;
+	return;
+}
+}
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+else{
+	r0 = _2E_str472;
+	r1 = _2E_str573;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 120;
+	_assert(i7);
+}
+}
+
+function _ZN21btCollisionDispatcherD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btCollisionDispatcher;
+	r2 = _ZTV16btManifoldResult;
+	r3 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r1;
+	heap32[(r3+7)] = r2;
+	r1 = heap32[(r3+5)];
+if(!(r1 ==0)) //_LBB178_4
+{
+	r2 = heapU8[r0+24];
+if(!(r2 ==0)) //_LBB178_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r3+5)] = 0;
+}
+	r1 = 1;
+	heap8[r0+24] = r1;
+	heap32[(r3+5)] = 0;
+	r0 = _ZTV12btDispatcher;
+	heap32[(r3+3)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3)] = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcherD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btCollisionDispatcher;
+	r2 = _ZTV16btManifoldResult;
+	r3 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r1;
+	heap32[(r3+7)] = r2;
+	r1 = heap32[(r3+5)];
+if(!(r1 ==0)) //_LBB179_4
+{
+	r2 = heapU8[r0+24];
+if(!(r2 ==0)) //_LBB179_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r3+5)] = 0;
+}
+	r1 = 1;
+	heap8[r0+24] = r1;
+	heap32[(r3+5)] = 0;
+	r1 = _ZTV12btDispatcher;
+	heap32[(r3+3)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN21btCollisionDispatcher14getNewManifoldEPvS0_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = gNumManifold;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(r0)] = r1;
+	r0 = heapU8[r2+4];
+	r0 = r0 & 2;
+	if(r0 !=0) //_LBB180_2
+{
+	r0 = r4 >> 2;
+	r0 = heap32[(r0+48)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 1017370378;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f_g0;
+	r0 = r3 >> 2;
+	heapFloat[(fp+-2)] = f0;
+	r0 = heap32[(r0+48)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 1017370378;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = sp + -4;
+	r1 = sp + -8;
+	r0 = f_g0 < f0 ? r0 : r1;
+	heapFloat[(fp+-1)] = f_g0;
+}
+else{
+	r0 = gContactBreakingThreshold;
+}
+	r1 = r2 >> 2;
+	r5 = heap32[(r1+49)];
+	r6 = r3 >> 2;
+	r7 = r4 >> 2;
+	r5 = r5 >> 2;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r6+46)];
+	f1 = heapFloat[(r7+46)];
+	r6 = heap32[(r5+2)];
+	f2 = heapFloat[(r0)];
+	f0 = f0 < f1 ? f0 : f1;
+_5: do {
+	if(r6 ==0) //_LBB180_9
+{
+	r0 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r5 = heap32[(r0)];
+	r5 = (r5 + 1)|0;
+	heap32[(r0)] = r5;
+	heap32[(g0)] = 1159;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB180_11
+{
+	r5 = 0;
+	r6 = (r0 + 4)|0;
+	r5 = (r5 - r6)|0;
+	r5 = r5 & 15;
+	r5 = (r0 + r5)|0;
+	r6 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r0;
+	r0 = r6;
+}
+else{
+break _5;
+}
+}
+else{
+	r0 = heap32[(r5)];
+	if(r0 >1139) //_LBB180_6
+{
+	if(r6 >0) //_LBB180_8
+{
+	r0 = heap32[(r5+3)];
+	r7 = r0 >> 2;
+	r7 = heap32[(r7)];
+	r6 = (r6 + -1)|0;
+	heap32[(r5+3)] = r7;
+	heap32[(r5+2)] = r6;
+}
+else{
+	r1 = _2E_str371;
+	r2 = _2E_str169;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 70;
+	_assert(i7);
+}
+}
+else{
+	r1 = _2E_str270;
+	r2 = _2E_str169;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 69;
+	_assert(i7);
+}
+}
+} while(0);
+	r5 = r0 >> 2;
+	heap32[(r5)] = 1;
+	heap32[(r5+28)] = 0;
+	r6 = 0;
+	heap32[(r5+29)] = 0;
+	heap8[r0+120] = r6;
+	heap32[(r5+31)] = 0;
+	heap32[(r5+32)] = 0;
+	heap32[(r5+33)] = 0;
+	heap32[(r5+34)] = 0;
+	heap32[(r5+35)] = 0;
+	heap32[(r5+36)] = 0;
+	heap32[(r5+37)] = 0;
+	heap32[(r5+97)] = 0;
+	heap32[(r5+98)] = 0;
+	heap8[r0+396] = r6;
+	heap32[(r5+100)] = 0;
+	heap32[(r5+101)] = 0;
+	heap32[(r5+102)] = 0;
+	heap32[(r5+103)] = 0;
+	heap32[(r5+104)] = 0;
+	heap32[(r5+105)] = 0;
+	heap32[(r5+106)] = 0;
+	heap32[(r5+166)] = 0;
+	heap32[(r5+167)] = 0;
+	heap8[r0+672] = r6;
+	heap32[(r5+169)] = 0;
+	heap32[(r5+170)] = 0;
+	heap32[(r5+171)] = 0;
+	heap32[(r5+172)] = 0;
+	heap32[(r5+173)] = 0;
+	heap32[(r5+174)] = 0;
+	heap32[(r5+175)] = 0;
+	heap32[(r5+235)] = 0;
+	heap32[(r5+236)] = 0;
+	heap8[r0+948] = r6;
+	heap32[(r5+238)] = 0;
+	heap32[(r5+239)] = 0;
+	heap32[(r5+240)] = 0;
+	heap32[(r5+241)] = 0;
+	heap32[(r5+242)] = 0;
+	heap32[(r5+243)] = 0;
+	heap32[(r5+244)] = 0;
+	heap32[(r5+277)] = r3;
+	heap32[(r5+278)] = r4;
+	heap32[(r5+279)] = 0;
+	heapFloat[(r5+280)] = f2;
+	heapFloat[(r5+281)] = f0;
+	r3 = heap32[(r1+3)];
+	heap32[(r5+284)] = r3;
+	r3 = heap32[(r1+4)];
+	r4 = heap32[(r1+3)];
+	if(r3 ==r4) //_LBB180_14
+{
+	r5 = 1;
+	r7 = r4 << 1;
+	r7 = r4 == 0 ? r5 : r7;
+if(!(r3 >=r7)) //_LBB180_13
+{
+	if(r7 !=0) //_LBB180_17
+{
+	r3 = gNumAlignedAllocs;
+	r3 = r3 >> 2;
+	r8 = heap32[(r3)];
+	r9 = r7 << 2;
+	r8 = (r8 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r3)] = r8;
+	r3 = (r9 + 16)|0;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB180_19
+{
+	r8 = (r3 + 4)|0;
+	r8 = (r6 - r8)|0;
+	r8 = r8 & 15;
+	r8 = (r3 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r3;
+	r3 = r9;
+}
+}
+else{
+	r3 = 0;
+}
+	r8 = (r2 + 20)|0;
+	if(r4 <1) //_LBB180_22
+{
+	r6 = r8 >> 2;
+	r9 = heap32[(r6)];
+}
+else{
+_26: while(true){
+	r9 = r8 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r6 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r3 + r10)|0;
+	r11 = heap32[(r11)];
+	r6 = (r6 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r4 !=r6)) //_LBB180_23
+{
+break _26;
+}
+}
+	r8 = (r2 + 20)|0;
+}
+	if(r9 !=0) //_LBB180_27
+{
+	r6 = heapU8[r2+24];
+	if(r6 !=0) //_LBB180_29
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r6 = heap32[(r4)];
+	r6 = (r6 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r4)] = r6;
+	r4 = heap32[(r9+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+	r4 = heap32[(r1+3)];
+}
+	r6 = r8 >> 2;
+	heap32[(r6)] = 0;
+}
+	r6 = r8 >> 2;
+	heap8[r2+24] = r5;
+	heap32[(r6)] = r3;
+	heap32[(r1+4)] = r7;
+}
+}
+	r2 = r4 << 2;
+	r3 = heap32[(r1+5)];
+	r2 = (r3 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r0;
+	r2 = heap32[(r1+3)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+3)] = r2;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher13clearManifoldEP20btPersistentManifold(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+279)];
+if(!(r1 <1)) //_LBB181_3
+{
+	r2 = 0;
+_3: while(true){
+	r2 = (r2 + 1)|0;
+	if(r1 >r2) //_LBB181_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	heap32[(r0+279)] = 0;
+	return;
+}
+
+function _ZN21btCollisionDispatcher14needsCollisionEP17btCollisionObjectS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	if(r0 !=0) //_LBB182_2
+{
+	r1 = heap32[(fp+2)];
+	if(r1 !=0) //_LBB182_4
+{
+	r2 = heap32[(fp)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+1)];
+	r4 = r3 & 1;
+if(!(r4 != 0)) //_LBB182_8
+{
+	r4 = heapU8[r0+204];
+	r4 = r4 & 3;
+if(!(r4 ==0)) //_LBB182_8
+{
+	r4 = heapU8[r1+204];
+	r4 = r4 & 3;
+if(!(r4 ==0)) //_LBB182_8
+{
+	r3 = r3 | 1;
+	heap32[(r2+1)] = r3;
+	r2 = _2E_str977;
+	heap32[(g0)] = r2;
+	printf(i7);
+}
+}
+}
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+54)];
+	if(r3 ==2) //_LBB182_10
+{
+__label__ = 10;
+}
+else{
+	if(r3 !=5) //_LBB182_12
+{
+__label__ = 12;
+}
+else{
+__label__ = 10;
+}
+}
+_12: do {
+if (__label__ == 10){
+	r3 = r1 >> 2;
+	r3 = heap32[(r3+54)];
+if(!(r3 ==2)) //_LBB182_16
+{
+if(!(r3 ==5)) //_LBB182_16
+{
+break _12;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r3 = heap32[(r2+63)];
+	if(r3 !=0) //_LBB182_14
+{
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	r0 = 0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r_g0 == r0;
+}
+else{
+	r0 = 0;
+}
+	r0 = r0 & 1;
+	r0 = r0 ^ 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = _2E_str876;
+	r1 = _2E_str573;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 167;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str775;
+	r1 = _2E_str573;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 166;
+	_assert(i7);
+}
+}
+
+function _ZN21btCollisionDispatcher26allocateCollisionAlgorithmEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+48)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+	r2 = heap32[(fp+1)];
+	if(r1 ==0) //_LBB183_7
+{
+	r0 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = (r2 + 19)|0;
+	heap32[(g0)] = r0;
+	malloc(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB183_9
+{
+	r1 = 0;
+	r2 = (r0 + 4)|0;
+	r1 = (r1 - r2)|0;
+	r1 = r1 & 15;
+	r1 = (r0 + r1)|0;
+	r2 = r1 >> 2;
+	heap32[(r2)] = r0;
+	r0 = (r1 + 4)|0;
+}
+	r_g0 = r0;
+	return;
+}
+else{
+if(!(r2 ==0)) //_LBB183_4
+{
+	r3 = heap32[(r0)];
+if(!(r3 >=r2)) //_LBB183_4
+{
+	r0 = _2E_str270;
+	r1 = _2E_str169;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 69;
+	_assert(i7);
+}
+}
+	if(r1 >0) //_LBB183_6
+{
+	r2 = heap32[(r0+3)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r1 = (r1 + -1)|0;
+	heap32[(r0+3)] = r3;
+	heap32[(r0+2)] = r1;
+	r_g0 = r2;
+	return;
+}
+else{
+	r0 = _2E_str371;
+	r1 = _2E_str169;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 70;
+	_assert(i7);
+}
+}
+}
+
+function _ZN21btCollisionDispatcher19defaultNearCallbackER16btBroadphasePairRS_RK16btDispatcherInfo(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -184;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = r0 >> 2;
+	r3 = heap32[(r2)];
+	r4 = heap32[(r1)];
+	r5 = heap32[(r1+1)];
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r4 = heap32[(r4)];
+	r5 = heap32[(r5)];
+	r3 = heap32[(r3+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0;
+_1: do {
+if(!(r3 ==0)) //_LBB184_8
+{
+	r3 = heap32[(fp+2)];
+	r6 = heap32[(r1+2)];
+	if(r6 ==0) //_LBB184_3
+{
+	r6 = heap32[(r2)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = 0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0;
+	heap32[(r1+2)] = r6;
+	if(r6 ==0) //_LBB184_8
+{
+break _1;
+}
+}
+	r0 = _ZTV16btManifoldResult;
+	r1 = sp + -160;
+	r0 = (r0 + 8)|0;
+	r2 = r1 >> 2;
+	heap32[(fp+-40)] = r0;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+34)] = r4;
+	r0 = r4 >> 2;
+	heap32[(r2+35)] = r5;
+	heap32[(r2+2)] = heap32[(r0+1)];
+	heap32[(r2+3)] = heap32[(r0+2)];
+	heap32[(r2+4)] = heap32[(r0+3)];
+	heap32[(r2+5)] = heap32[(r0+4)];
+	heap32[(r2+6)] = heap32[(r0+5)];
+	heap32[(r2+7)] = heap32[(r0+6)];
+	heap32[(r2+8)] = heap32[(r0+7)];
+	heap32[(r2+9)] = heap32[(r0+8)];
+	heap32[(r2+10)] = heap32[(r0+9)];
+	heap32[(r2+11)] = heap32[(r0+10)];
+	heap32[(r2+12)] = heap32[(r0+11)];
+	heap32[(r2+13)] = heap32[(r0+12)];
+	heap32[(r2+14)] = heap32[(r0+13)];
+	heap32[(r2+15)] = heap32[(r0+14)];
+	heap32[(r2+16)] = heap32[(r0+15)];
+	r7 = r5 >> 2;
+	heap32[(r2+17)] = heap32[(r0+16)];
+	heap32[(r2+18)] = heap32[(r7+1)];
+	heap32[(r2+19)] = heap32[(r7+2)];
+	heap32[(r2+20)] = heap32[(r7+3)];
+	heap32[(r2+21)] = heap32[(r7+4)];
+	heap32[(r2+22)] = heap32[(r7+5)];
+	heap32[(r2+23)] = heap32[(r7+6)];
+	heap32[(r2+24)] = heap32[(r7+7)];
+	heap32[(r2+25)] = heap32[(r7+8)];
+	heap32[(r2+26)] = heap32[(r7+9)];
+	heap32[(r2+27)] = heap32[(r7+10)];
+	heap32[(r2+28)] = heap32[(r7+11)];
+	heap32[(r2+29)] = heap32[(r7+12)];
+	heap32[(r2+30)] = heap32[(r7+13)];
+	heap32[(r2+31)] = heap32[(r7+14)];
+	heap32[(r2+32)] = heap32[(r7+15)];
+	r0 = r6 >> 2;
+	heap32[(r2+33)] = heap32[(r7+16)];
+	r0 = heap32[(r0)];
+	r2 = r3 >> 2;
+	r7 = heap32[(r2+2)];
+	if(r7 !=1) //_LBB184_6
+{
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r1;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	f0 = f_g0;
+	f1 = heapFloat[(r2+3)];
+if(!(f1 <=f0)) //_LBB184_8
+{
+	heapFloat[(r2+3)] = f0;
+}
+}
+else{
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r1;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN17btCollisionObject24checkCollideWithOverrideEPS_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN17btCollisionObject17setCollisionShapeEP16btCollisionShape(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	heap32[(r0+48)] = r1;
+	heap32[(r0+50)] = r1;
+	return;
+}
+
+function _ZNK17btCollisionObject28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 248;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN17btCollisionObjectD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btCollisionObject;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN17btCollisionObjectD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btCollisionObject;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB189_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZNK17btCollisionObject9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r1+4)] = heap32[(r2+1)];
+	heap32[(r1+5)] = heap32[(r2+2)];
+	heap32[(r1+6)] = heap32[(r2+3)];
+	heap32[(r1+7)] = heap32[(r2+4)];
+	heap32[(r1+8)] = heap32[(r2+5)];
+	heap32[(r1+9)] = heap32[(r2+6)];
+	heap32[(r1+10)] = heap32[(r2+7)];
+	heap32[(r1+11)] = heap32[(r2+8)];
+	heap32[(r1+12)] = heap32[(r2+9)];
+	heap32[(r1+13)] = heap32[(r2+10)];
+	heap32[(r1+14)] = heap32[(r2+11)];
+	heap32[(r1+15)] = heap32[(r2+12)];
+	heap32[(r1+16)] = heap32[(r2+13)];
+	heap32[(r1+17)] = heap32[(r2+14)];
+	heap32[(r1+18)] = heap32[(r2+15)];
+	heap32[(r1+19)] = heap32[(r2+16)];
+	heap32[(r1+20)] = heap32[(r2+17)];
+	heap32[(r1+21)] = heap32[(r2+18)];
+	heap32[(r1+22)] = heap32[(r2+19)];
+	heap32[(r1+23)] = heap32[(r2+20)];
+	heap32[(r1+24)] = heap32[(r2+21)];
+	heap32[(r1+25)] = heap32[(r2+22)];
+	heap32[(r1+26)] = heap32[(r2+23)];
+	heap32[(r1+27)] = heap32[(r2+24)];
+	heap32[(r1+28)] = heap32[(r2+25)];
+	heap32[(r1+29)] = heap32[(r2+26)];
+	heap32[(r1+30)] = heap32[(r2+27)];
+	heap32[(r1+31)] = heap32[(r2+28)];
+	heap32[(r1+32)] = heap32[(r2+29)];
+	heap32[(r1+33)] = heap32[(r2+30)];
+	heap32[(r1+34)] = heap32[(r2+31)];
+	heap32[(r1+35)] = heap32[(r2+32)];
+	heap32[(r1+36)] = heap32[(r2+33)];
+	heap32[(r1+37)] = heap32[(r2+34)];
+	heap32[(r1+38)] = heap32[(r2+35)];
+	heap32[(r1+39)] = heap32[(r2+36)];
+	heap32[(r1+40)] = heap32[(r2+37)];
+	heap32[(r1+41)] = heap32[(r2+38)];
+	heap32[(r1+42)] = heap32[(r2+39)];
+	heap32[(r1+43)] = heap32[(r2+40)];
+	heap32[(r1+44)] = heap32[(r2+41)];
+	heap32[(r1+45)] = heap32[(r2+42)];
+	heap32[(r1+46)] = heap32[(r2+43)];
+	heap32[(r1+47)] = heap32[(r2+44)];
+	r3 = heap32[(r2+45)];
+	heap32[(r1+55)] = r3;
+	r3 = heap32[(fp+2)];
+	heap32[(r1+48)] = heap32[(r2+46)];
+	heap32[(r1)] = 0;
+	r4 = r3 >> 2;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+7)];
+	r6 = heap32[(r2+48)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(r1+1)] = r_g0;
+	heap32[(r1+2)] = 0;
+	r5 = heap32[(r2+51)];
+	heap32[(r1+56)] = r5;
+	r5 = heap32[(r2+52)];
+	heap32[(r1+57)] = r5;
+	r5 = heap32[(r2+53)];
+	heap32[(r1+58)] = r5;
+	r5 = heap32[(r2+54)];
+	heap32[(r1+59)] = r5;
+	r5 = heap32[(r2+54)];
+	heap32[(r1+59)] = r5;
+	heap32[(r1+49)] = heap32[(r2+55)];
+	heap32[(r1+50)] = heap32[(r2+56)];
+	heap32[(r1+51)] = heap32[(r2+57)];
+	r5 = heap32[(r2+58)];
+	heap32[(r1+60)] = r5;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+10)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = r_g0;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+7)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = r_g0;
+	heap32[(r1+3)] = r5;
+if(!(r5 ==0)) //_LBB190_2
+{
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+12)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	heap32[(r1+52)] = heap32[(r2+60)];
+	heap32[(r1+53)] = heap32[(r2+61)];
+	heap32[(r1+54)] = heap32[(r2+62)];
+	heap32[(r1+54)] = heap32[(r2+62)];
+	r0 = heap32[(r2+63)];
+	heap32[(r1+61)] = r0;
+	r0 = _2E_str78;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btCollisionObject21serializeSingleObjectEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	r3 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r4 = r3 >> 2;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r2 = r_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r5 = r2 >> 2;
+	r1 = heap32[(r1+5)];
+	r5 = heap32[(r5+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+5)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1245859651;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	return;
+}
+
+function _ZN16btManifoldResult20setShapeIdentifiersAEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(r0+36)] = r1;
+	heap32[(r0+38)] = r2;
+	return;
+}
+
+function _ZN16btManifoldResult20setShapeIdentifiersBEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(r0+37)] = r1;
+	heap32[(r0+39)] = r2;
+	return;
+}
+
+function _ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	heap32[(r0+21)] = r1;
+	return;
+}
+
+function _ZN16btCollisionWorld14getDebugDrawerEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+21)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btCollisionWorld20ConvexResultCallback14needsCollisionEP17btBroadphaseProxy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU16[(r0+10)>>1];
+	r3 = heapU16[(r1+4)>>1];
+	r2 = r2 & r3;
+	r2 = r2 & 65535;
+	if(r2 ==0) //_LBB196_2
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r1 = heapU16[(r1+6)>>1];
+	r0 = heapU16[(r0+8)>>1];
+	r0 = r1 & r0;
+	r0 = r0 & 65535;
+	r1 = 0;
+	r0 = r0 != r1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN12btConvexCast10CastResult9DebugDrawEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN12btConvexCast10CastResult15drawCoordSystemERK11btTransform(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN12btConvexCast10CastResultD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN12btConvexCast10CastResultE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN12btConvexCast10CastResultD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN12btConvexCast10CastResultE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitERK9btVector3fii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp+3)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp)];
+	r4 = r0 >> 2;
+	r5 = heap32[(fp+4)];
+	heap32[(fp+-2)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r4+1)] = r5;
+	r2 = r3 >> 2;
+	r3 = heap32[(r2+12)];
+	f0 = heapFloat[(r2+22)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r2+18)];
+	f3 = heapFloat[(r2+14)];
+	f4 = heapFloat[(r2+23)];
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r2+19)];
+	f7 = heapFloat[(r2+15)];
+	f8 = heapFloat[(r2+24)];
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r2+20)];
+	f11 = heapFloat[(r2+16)];
+	r1 = sp + -40;
+	f3 = f3*f1;
+	f7 = f7*f5;
+	r4 = r1 >> 2;
+	heap32[(fp+-10)] = r3;
+	f2 = f2*f1;
+	f6 = f6*f5;
+	f3 = f3+f7;
+	f7 = f11*f9;
+	f0 = f0*f1;
+	f1 = f4*f5;
+	f2 = f2+f6;
+	f4 = f10*f9;
+	f3 = f3+f7;
+	heap32[(r4+1)] = r0;
+	f0 = f0+f1;
+	f1 = f8*f9;
+	f2 = f2+f4;
+	heapFloat[(r4+2)] = f3;
+	f0 = f0+f1;
+	heapFloat[(r4+3)] = f2;
+	heapFloat[(r4+4)] = f0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = heap32[(fp+2)];
+	r0 = heap32[(r2+11)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitE_0RK9btVector3fii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp+3)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp)];
+	r4 = r0 >> 2;
+	r5 = heap32[(fp+4)];
+	heap32[(fp+-2)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r4+1)] = r5;
+	r2 = r3 >> 2;
+	r3 = heap32[(r2+12)];
+	f0 = heapFloat[(r2+22)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r2+18)];
+	f3 = heapFloat[(r2+14)];
+	f4 = heapFloat[(r2+23)];
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r2+19)];
+	f7 = heapFloat[(r2+15)];
+	f8 = heapFloat[(r2+24)];
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r2+20)];
+	f11 = heapFloat[(r2+16)];
+	r1 = sp + -40;
+	f3 = f3*f1;
+	f7 = f7*f5;
+	r4 = r1 >> 2;
+	heap32[(fp+-10)] = r3;
+	f2 = f2*f1;
+	f6 = f6*f5;
+	f3 = f3+f7;
+	f7 = f11*f9;
+	f0 = f0*f1;
+	f1 = f4*f5;
+	f2 = f2+f6;
+	f4 = f10*f9;
+	f3 = f3+f7;
+	heap32[(r4+1)] = r0;
+	f0 = f0+f1;
+	f1 = f8*f9;
+	f2 = f2+f4;
+	heapFloat[(r4+2)] = f3;
+	f0 = f0+f1;
+	heapFloat[(r4+3)] = f2;
+	heapFloat[(r4+4)] = f0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = heap32[(fp+2)];
+	r0 = heap32[(r2+11)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder215addSingleResultERNS_14LocalRayResultEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = sp + -8;
+	r0 = r0 >> 2;
+	heap32[(fp+-2)] = -1;
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r0+6)];
+	r5 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r3 = heap32[(r5+1)];
+if(!(r3 !=0)) //_LBB205_2
+{
+	heap32[(r5+1)] = r1;
+}
+	r1 = heap32[(fp+2)];
+	r3 = heap32[(r0+5)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+3)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = heap32[(r0+5)];
+	r1 = r1 >> 2;
+	heap32[(r0+1)] = heap32[(r1+1)];
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitERK9btVector3SG_fii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -72;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp)];
+	r3 = r0 >> 2;
+	r4 = heap32[(fp+5)];
+	heap32[(fp+-2)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r2 = heap32[(r1+52)];
+	f0 = heapFloat[(fp+3)];
+	r3 = r2 >> 2;
+	f1 = heapFloat[(r3+1)];
+	if(f1 <f0) //_LBB206_2
+{
+	f_g0 = f0;
+	return;
+}
+else{
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r1 = heap32[(r1+53)];
+	r6 = sp + -56;
+	r7 = r6 >> 2;
+	heap32[(fp+-14)] = r1;
+	r1 = r4 >> 2;
+	heap32[(r7+1)] = r0;
+	heap32[(r7+2)] = heap32[(r1)];
+	heap32[(r7+3)] = heap32[(r1+1)];
+	heap32[(r7+4)] = heap32[(r1+2)];
+	r0 = r5 >> 2;
+	heap32[(r7+5)] = heap32[(r1+3)];
+	heap32[(r7+6)] = heap32[(r0)];
+	heap32[(r7+7)] = heap32[(r0+1)];
+	heap32[(r7+8)] = heap32[(r0+2)];
+	heap32[(r7+9)] = heap32[(r0+3)];
+	heapFloat[(r7+10)] = f0;
+	r0 = heap32[(r3)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitE_0RK9btVector3SG_fii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -72;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp)];
+	r3 = r0 >> 2;
+	r4 = heap32[(fp+5)];
+	heap32[(fp+-2)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r2 = heap32[(r1+52)];
+	f0 = heapFloat[(fp+3)];
+	r3 = r2 >> 2;
+	f1 = heapFloat[(r3+1)];
+	if(f1 <f0) //_LBB207_2
+{
+	f_g0 = f0;
+	return;
+}
+else{
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r1 = heap32[(r1+53)];
+	r6 = sp + -56;
+	r7 = r6 >> 2;
+	heap32[(fp+-14)] = r1;
+	r1 = r4 >> 2;
+	heap32[(r7+1)] = r0;
+	heap32[(r7+2)] = heap32[(r1)];
+	heap32[(r7+3)] = heap32[(r1+1)];
+	heap32[(r7+4)] = heap32[(r1+2)];
+	r0 = r5 >> 2;
+	heap32[(r7+5)] = heap32[(r1+3)];
+	heap32[(r7+6)] = heap32[(r0)];
+	heap32[(r7+7)] = heap32[(r0+1)];
+	heap32[(r7+8)] = heap32[(r0+2)];
+	heap32[(r7+9)] = heap32[(r0+3)];
+	heapFloat[(r7+10)] = f0;
+	r0 = heap32[(r3)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 0;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+}
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdder15addSingleResultERNS_17LocalConvexResultEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = sp + -8;
+	r0 = r0 >> 2;
+	heap32[(fp+-2)] = -1;
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r0+4)];
+	r5 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	r3 = heap32[(r5+1)];
+if(!(r3 !=0)) //_LBB210_2
+{
+	heap32[(r5+1)] = r1;
+}
+	r1 = heap32[(fp+2)];
+	r3 = heap32[(r0+3)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+3)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = heap32[(r0+3)];
+	r1 = r1 >> 2;
+	heap32[(r0+1)] = heap32[(r1+1)];
+	return;
+}
+
+function _ZN17DebugDrawcallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _ZTV17DebugDrawcallback;
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = (r0 + 8)|0;
+	r3 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = (r0 + 32)|0;
+	heap32[(r1)] = r2;
+	r2 = _ZTV18btTriangleCallback;
+	r3 = (r3 + 8)|0;
+	heap32[(r1+1)] = r0;
+	r0 = (r2 + 8)|0;
+	heap32[(r1+1)] = r3;
+	heap32[(r1)] = r0;
+	return;
+}
+
+function _ZN17DebugDrawcallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZTV17DebugDrawcallback;
+	r1 = heap32[(fp)];
+	r2 = r1 >> 2;
+	r3 = (r0 + 8)|0;
+	r4 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = (r0 + 32)|0;
+	heap32[(r2)] = r3;
+	r3 = _ZTV18btTriangleCallback;
+	r4 = (r4 + 8)|0;
+	heap32[(r2+1)] = r0;
+	r0 = (r3 + 8)|0;
+	heap32[(r2+1)] = r4;
+	heap32[(r2)] = r0;
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN17DebugDrawcallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r2+7)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r2+8)];
+	f4 = heapFloat[(r2+11)];
+	f5 = heapFloat[(r2+12)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r1+2)];
+	f9 = heapFloat[(r2+9)];
+	f10 = heapFloat[(r2+15)];
+	f11 = heapFloat[(r2+16)];
+	f12 = heapFloat[(r2+13)];
+	f13 = f4*f0;
+	f14 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f15 = heapFloat[(r2+17)];
+	f0 = f10*f0;
+	f2 = f11*f2;
+	f13 = f13+f14;
+	f14 = f12*f8;
+	f6 = f6+f7;
+	f7 = heapFloat[(r2+19)];
+	f16 = heapFloat[(r2+21)];
+	f17 = heapFloat[(r2+20)];
+	r3 = sp + -32;
+	f13 = f13+f14;
+	f0 = f0+f2;
+	f2 = f15*f8;
+	f6 = f6+f7;
+	f0 = f0+f2;
+	r4 = r3 >> 2;
+	f2 = f13+f17;
+	heapFloat[(fp+-8)] = f6;
+	f0 = f0+f16;
+	heapFloat[(r4+1)] = f2;
+	heapFloat[(r4+2)] = f0;
+	heap32[(r4+3)] = 0;
+	f8 = heapFloat[(r1+4)];
+	f13 = heapFloat[(r1+5)];
+	f14 = heapFloat[(r1+6)];
+	f18 = f1*f8;
+	f19 = f3*f13;
+	f20 = f4*f8;
+	f21 = f5*f13;
+	f18 = f18+f19;
+	f19 = f9*f14;
+	f18 = f18+f19;
+	f8 = f10*f8;
+	f13 = f11*f13;
+	f19 = f20+f21;
+	f20 = f12*f14;
+	f18 = f18+f7;
+	r4 = sp + -48;
+	f19 = f19+f20;
+	f8 = f8+f13;
+	f13 = f15*f14;
+	f14 = f19+f17;
+	f8 = f8+f13;
+	r5 = r4 >> 2;
+	heapFloat[(fp+-12)] = f18;
+	f8 = f8+f16;
+	heapFloat[(r5+1)] = f14;
+	heapFloat[(r5+2)] = f8;
+	heap32[(r5+3)] = 0;
+	f13 = heapFloat[(r1+8)];
+	f19 = heapFloat[(r1+9)];
+	f20 = heapFloat[(r1+10)];
+	f1 = f1*f13;
+	f3 = f3*f19;
+	f4 = f4*f13;
+	f5 = f5*f19;
+	f1 = f1+f3;
+	f3 = f9*f20;
+	f1 = f1+f3;
+	f3 = f10*f13;
+	f9 = f11*f19;
+	f4 = f4+f5;
+	f5 = f12*f20;
+	r1 = sp + -64;
+	f4 = f4+f5;
+	f1 = f1+f7;
+	f3 = f3+f9;
+	f5 = f15*f20;
+	f3 = f3+f5;
+	f4 = f4+f17;
+	r5 = r1 >> 2;
+	heapFloat[(fp+-16)] = f1;
+	f5 = f6+f18;
+	f3 = f3+f16;
+	heapFloat[(r5+1)] = f4;
+	f7 = f2+f14;
+	heapFloat[(r5+2)] = f3;
+	f5 = f5+f1;
+	f9 =        0.3333333432674408;
+	r6 = sp + -80;
+	f10 = f0+f8;
+	f7 = f7+f4;
+	f8 = f8-f0;
+	f4 = f4-f2;
+	f11 = f18-f6;
+	f0 = f3-f0;
+	f2 = f14-f2;
+	f1 = f1-f6;
+	f5 = f5*f9;
+	heap32[(r5+3)] = 0;
+	f3 = f10+f3;
+	f6 = f2*f0;
+	f10 = f8*f4;
+	f8 = f8*f1;
+	f0 = f11*f0;
+	r5 = r6 >> 2;
+	f7 = f7*f9;
+	heapFloat[(fp+-20)] = f5;
+	f5 = f6-f10;
+	f0 = f8-f0;
+	f4 = f11*f4;
+	f1 = f2*f1;
+	f2 = f3*f9;
+	heapFloat[(r5+1)] = f7;
+	f1 = f4-f1;
+	heapFloat[(r5+2)] = f2;
+	f2 = f5*f5;
+	f3 = f0*f0;
+	heap32[(r5+3)] = 0;
+	f2 = f2+f3;
+	f3 = f1*f1;
+	f2 = f2+f3;
+	heapFloat[(g0)] = f2;
+	r7 = sp + -96;
+	sqrtf(i7);
+	r8 = r7 >> 2;
+	heap32[(fp+-24)] = 1065353216;
+	heap32[(r8+1)] = 1065353216;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 0;
+	r8 = heap32[(r2+2)];
+	r9 = r8 >> 2;
+	f3 =                         1;
+	r9 = heap32[(r9)];
+	f2 = f3/f_g0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+2)];
+	f3 = f5*f2;
+	f4 = heapFloat[(fp+-20)];
+	f5 = heapFloat[(r5+2)];
+	f6 = heapFloat[(r5+1)];
+	r5 = sp + -16;
+	f0 = f0*f2;
+	f3 = f4+f3;
+	f1 = f1*f2;
+	r10 = r5 >> 2;
+	f0 = f6+f0;
+	heapFloat[(fp+-4)] = f3;
+	f1 = f5+f1;
+	heapFloat[(r10+1)] = f0;
+	heapFloat[(r10+2)] = f1;
+	heap32[(r10+3)] = 0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r7;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r5 = heap32[(r2+2)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	r0 = (r0 + 12)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = heap32[(r2+2)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r2 = heap32[(r2+2)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	return;
+}
+
+function _ZN17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+2)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZThn4_N17DebugDrawcallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _ZTV17DebugDrawcallback;
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = (r0 + 8)|0;
+	r3 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = (r0 + 32)|0;
+	heap32[(r1+-1)] = r2;
+	r2 = _ZTV18btTriangleCallback;
+	r3 = (r3 + 8)|0;
+	heap32[(r1)] = r0;
+	r0 = (r2 + 8)|0;
+	heap32[(r1)] = r3;
+	heap32[(r1+-1)] = r0;
+	return;
+}
+
+function _ZThn4_N17DebugDrawcallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17DebugDrawcallback;
+	r2 = r0 >> 2;
+	r3 = (r1 + 8)|0;
+	r4 = _ZTV31btInternalTriangleIndexCallback;
+	r1 = (r1 + 32)|0;
+	heap32[(r2+-1)] = r3;
+	r3 = _ZTV18btTriangleCallback;
+	r4 = (r4 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = (r3 + 8)|0;
+	heap32[(r2)] = r4;
+	heap32[(r2+-1)] = r1;
+	r0 = (r0 + -4)|0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZThn4_N17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+-1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+2)];
+	r0 = (r0 + -4)|0;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN16btCollisionWorldD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorldD2Ev(i7);
+	return;
+}
+
+function _ZN16btCollisionWorldD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btCollisionWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+4)];
+	r3 = heap32[(r2+2)];
+	if(r3 >0) //_LBB219_2
+{
+	r3 = 0;
+_3: while(true){
+	r4 = r3 << 2;
+	r1 = (r1 + r4)|0;
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r4 = heap32[(r1+47)];
+if(!(r4 ==0)) //_LBB219_5
+{
+	r5 = heap32[(r2+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+10)];
+	r7 = heap32[(r2+6)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = heap32[(r2+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+	r7 = heap32[(r2+6)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	heap32[(r1+47)] = 0;
+}
+	r3 = (r3 + 1)|0;
+	r1 = heap32[(r2+4)];
+	r4 = heap32[(r2+2)];
+	if(r4 >r3) //_LBB219_3
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+if(!(r1 ==0)) //_LBB219_10
+{
+	r3 = heapU8[r0+20];
+if(!(r3 ==0)) //_LBB219_9
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	r1 = 1;
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btCollisionWorld11updateAabbsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = _2E_str1998;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+2)];
+if(!(r2 <1)) //_LBB220_14
+{
+	r2 = 0;
+_3: while(true){
+	r3 = heap32[(r0+4)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r3)];
+	r4 = heapU8[r1+88];
+	if(r4 !=0) //_LBB220_5
+{
+__label__ = 5;
+}
+else{
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+54)];
+	if(r4 ==2) //_LBB220_13
+{
+__label__ = 13;
+}
+else{
+	if(r4 ==5) //_LBB220_13
+{
+__label__ = 13;
+}
+else{
+__label__ = 5;
+}
+}
+}
+_8: do {
+if (__label__ == 5){
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+48)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	r7 = sp + -40;
+	r8 = sp + -24;
+	r9 = (r3 + 4)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	f0 =     -0.019999999552965164;
+	f1 = heapFloat[(fp+-6)];
+	f1 = f1+f0;
+	r5 = r8 >> 2;
+	heapFloat[(fp+-6)] = f1;
+	f2 = heapFloat[(r5+1)];
+	f2 = f2+f0;
+	heapFloat[(r5+1)] = f2;
+	f3 = heapFloat[(r5+2)];
+	f0 = f3+f0;
+	heapFloat[(r5+2)] = f0;
+	f3 =      0.019999999552965164;
+	f4 = heapFloat[(fp+-10)];
+	f4 = f4+f3;
+	r5 = r7 >> 2;
+	heapFloat[(fp+-10)] = f4;
+	f5 = heapFloat[(r5+1)];
+	f5 = f5+f3;
+	heapFloat[(r5+1)] = f5;
+	f6 = heapFloat[(r5+2)];
+	f3 = f6+f3;
+	heapFloat[(r5+2)] = f3;
+	r5 = heap32[(r0+20)];
+	r3 = heapU8[r3+204];
+	r3 = r3 & 1;
+if(!(r3 != 0)) //_LBB220_10
+{
+	f1 = f4-f1;
+	f2 = f5-f2;
+	f0 = f3-f0;
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	f1 =              999999995904;
+if(!(f0 <f1)) //_LBB220_10
+{
+	r5 = heap32[(r4+54)];
+	r5 = (r5 + -4)|0;
+if(!(uint(r5) <uint(2))) //_LBB220_9
+{
+	heap32[(r4+54)] = 5;
+}
+	r4 = _ZZN16btCollisionWorld16updateSingleAabbEP17btCollisionObjectE8reportMe_2E_b;
+	r5 = heapU8[r4];
+	if(r5 != 0) //_LBB220_13
+{
+break _8;
+}
+else{
+	r3 = heap32[(r0+21)];
+	if(r3 ==0) //_LBB220_13
+{
+break _8;
+}
+else{
+	r5 = 1;
+	r6 = r3 >> 2;
+	heap8[r4] = r5;
+	r4 = heap32[(r6)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+9)];
+	r5 = _2E_str1594;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = heap32[(r0+21)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+9)];
+	r5 = _2E_str1695;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = heap32[(r0+21)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+9)];
+	r5 = _2E_str1796;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = heap32[(r0+21)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+9)];
+	r5 = _2E_str1897;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+break _8;
+}
+}
+}
+}
+	r3 = r5 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	r6 = heap32[(r0+6)];
+	r4 = heap32[(r4+47)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+} while(0);
+	r3 = heap32[(r0+2)];
+	if(r3 >r2) //_LBB220_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_21: do {
+if(!(r3 !=0)) //_LBB220_20
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB220_17
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB220_20
+{
+break _21;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN16btCollisionWorld14debugDrawWorldEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -104;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+_1: do {
+if(!(r2 ==0)) //_LBB221_10
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0 & 8;
+if(!(r2 ==0)) //_LBB221_10
+{
+	r2 = heap32[(r1+6)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+9)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0;
+	r3 = sp + -16;
+	r4 = r3 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r4+1)] = 0;
+	r5 = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+_4: while(true){
+	if(r5 <r2) //_LBB221_3
+{
+	r4 = heap32[(r1+6)];
+	r6 = r4 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+10)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r4 = r_g0;
+	r6 = r4 >> 2;
+	r6 = heap32[(r6+279)];
+	r7 = 36;
+	r8 = 68;
+	r9 = 0;
+_7: while(true){
+	if(r9 <r6) //_LBB221_4
+{
+	r10 = r4 >> 2;
+	r10 = heap32[(r10+279)];
+	if(r10 >r9) //_LBB221_6
+{
+	r10 = (r9 * 69)|0;
+	r11 = (r4 + r7)|0;
+	r12 = (r4 + r8)|0;
+	r13 = heap32[(r1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r14 = r_g0 >> 2;
+	r15 = r10 << 2;
+	r10 = r10 << 2;
+	r14 = heap32[(r14)];
+	r15 = (r4 + r15)|0;
+	r10 = (r4 + r10)|0;
+	r14 = r14 >> 2;
+	r15 = r15 >> 2;
+	r10 = r10 >> 2;
+	r14 = heap32[(r14+8)];
+	r15 = heap32[(r15+37)];
+	f0 = heapFloat[(r10+21)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r12;
+	heapFloat[(g0+3)] = f0;
+	heap32[(g0+4)] = r15;
+	heap32[(g0+5)] = r3;
+	r9 = (r9 + 1)|0;
+	r8 = (r8 + 276)|0;
+	r7 = (r7 + 276)|0;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+}
+else{
+break _4;
+}
+}
+else{
+break _7;
+}
+}
+	r5 = (r5 + 1)|0;
+}
+else{
+break _1;
+}
+}
+	r0 = _2E_str382;
+	r1 = _2E_str483;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 122;
+	_assert(i7);
+}
+}
+} while(0);
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+_14: do {
+if(!(r2 ==0)) //_LBB221_13
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0 & 3;
+if(!(r2 ==0)) //_LBB221_13
+{
+	r2 = heap32[(r1+2)];
+	if(r2 >0) //_LBB221_14
+{
+	r2 = 0;
+_18: while(true){
+	r3 = heap32[(r1+4)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = heapU8[r3+204];
+	r4 = r4 & 32;
+if(!(r4 !=0)) //_LBB221_34
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+if(!(r4 ==0)) //_LBB221_31
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r4 = r_g0 & 1;
+if(!(r4 ==0)) //_LBB221_31
+{
+	r4 = sp + -32;
+	r5 = r4 >> 2;
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	r6 = r3 >> 2;
+	heap32[(r5+3)] = 0;
+	r7 = heap32[(r6+54)];
+_25: do {
+	if(r7 >2) //_LBB221_21
+{
+	if(r7 ==3) //_LBB221_26
+{
+	heap32[(fp+-8)] = 0;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	heap32[(r5+3)] = 0;
+__label__ = 30;
+break _25;
+}
+else{
+	if(r7 ==4) //_LBB221_27
+{
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+__label__ = 30;
+break _25;
+}
+else{
+	if(r7 ==5) //_LBB221_28
+{
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+__label__ = 30;
+break _25;
+}
+else{
+__label__ = 29;
+break _25;
+}
+}
+}
+}
+else{
+	if(r7 ==1) //_LBB221_24
+{
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	heap32[(r5+3)] = 0;
+__label__ = 30;
+}
+else{
+	if(r7 ==2) //_LBB221_25
+{
+	heap32[(fp+-8)] = 0;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+__label__ = 30;
+}
+else{
+__label__ = 29;
+}
+}
+}
+} while(0);
+if (__label__ == 29){
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+}
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+6)];
+	r6 = heap32[(r6+48)];
+	r7 = (r3 + 4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+}
+	r4 = heap32[(r1+21)];
+if(!(r4 ==0)) //_LBB221_34
+{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+12)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r4 = r_g0 & 2;
+if(!(r4 ==0)) //_LBB221_34
+{
+	r4 = sp + -80;
+	r5 = r4 >> 2;
+	heap32[(fp+-20)] = 1065353216;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	r6 = r3 >> 2;
+	heap32[(r5+3)] = 0;
+	r5 = heap32[(r6+48)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	r3 = (r3 + 4)|0;
+	r7 = sp + -48;
+	r8 = sp + -64;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r3 = heap32[(r1+21)];
+	r5 = r3 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+13)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+}
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r1+2)];
+	if(r3 >r2) //_LBB221_15
+{
+continue _18;
+}
+else{
+break _14;
+}
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + -1376;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+14)];
+	r4 = heap32[(fp+1)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 1065353216;
+	r2 = heap32[(fp+2)];
+	r5 = r2 >> 2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = heap32[(r5+1)];
+	r6 = heap32[(fp+3)];
+_1: do {
+	if(r3 >10) //_LBB222_6
+{
+	if(r3 >27) //_LBB222_9
+{
+	if(r3 ==28) //_LBB222_23
+{
+	f0 = heapFloat[(r5+14)];
+	f1 = heapFloat[(r5+13)];
+	f2 = heapFloat[(r5+16)];
+	f3 = heapFloat[(r5+12)];
+	f4 = f0*f2;
+	f5 = f1*f2;
+	f2 = f3*f2;
+	f6 =                         0;
+	if(f0 <f6) //_LBB222_25
+{
+	f7 = -f0;
+}
+else{
+	f7 = f0;
+}
+	f8 =       0.70710676908493042;
+	if(f7 <=f8) //_LBB222_28
+{
+	f0 = f3*f3;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f3 =                         1;
+	f7 = heapFloat[(r5+13)];
+	f9 = heapFloat[(r5+14)];
+	f10 = f3/f_g0;
+	f1 = heapFloat[(r5+12)];
+	f3 = -f7;
+	f8 = f1*f10;
+	f1 = -f9;
+	f11 = f10*f3;
+	f12 =                       100;
+	f1 = f8*f1;
+	f3 = f9*f11;
+	f7 = f0*f10;
+	f0 = f11*f12;
+}
+else{
+	f1 = f1*f1;
+	f3 = f0*f0;
+	f1 = f1+f3;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f6 = heapFloat[(r5+14)];
+	f0 =                         1;
+	f7 = heapFloat[(r5+12)];
+	f3 = f0/f_g0;
+	f6 = -f6;
+	f0 = heapFloat[(r5+13)];
+	f8 = f3*f6;
+	f6 = -f7;
+	f0 = f0*f3;
+	f9 =                       100;
+	f1 = f1*f3;
+	f3 = f0*f6;
+	f7 = f7*f8;
+	f6 = f0*f9;
+	f0 =                         0;
+}
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	f9 =                       100;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r4 >> 2;
+	f8 = f8*f9;
+	r4 = r_g0 >> 2;
+	f10 = f2-f0;
+	f11 = heapFloat[(r3)];
+	f12 = f5-f8;
+	f13 = heapFloat[(r3+1)];
+	r4 = heap32[(r4)];
+	f14 = heapFloat[(r3+4)];
+	f15 = heapFloat[(r3+5)];
+	f16 = f11*f10;
+	f17 = f13*f12;
+	f18 = f4-f6;
+	f19 = heapFloat[(r3+2)];
+	r4 = r4 >> 2;
+	f20 = heapFloat[(r3+8)];
+	f21 = heapFloat[(r3+9)];
+	f22 = heapFloat[(r3+6)];
+	f23 = f14*f10;
+	f24 = f15*f12;
+	f16 = f16+f17;
+	f17 = f19*f18;
+	f25 = heapFloat[(r3+10)];
+	r4 = heap32[(r4+2)];
+	f10 = f20*f10;
+	f12 = f21*f12;
+	f23 = f23+f24;
+	f24 = f22*f18;
+	f16 = f16+f17;
+	f17 = heapFloat[(r3+12)];
+	f26 = heapFloat[(r3+14)];
+	f27 = heapFloat[(r3+13)];
+	f0 = f2+f0;
+	f8 = f5+f8;
+	r5 = sp + -64;
+	f23 = f23+f24;
+	f10 = f10+f12;
+	f12 = f25*f18;
+	f16 = f16+f17;
+	f6 = f4+f6;
+	f10 = f10+f12;
+	f11 = f11*f0;
+	f12 = f13*f8;
+	r7 = r5 >> 2;
+	f13 = f23+f27;
+	heapFloat[(fp+-16)] = f16;
+	f14 = f14*f0;
+	f15 = f15*f8;
+	f11 = f11+f12;
+	f12 = f19*f6;
+	f10 = f10+f26;
+	heapFloat[(r7+1)] = f13;
+	f11 = f11+f12;
+	heapFloat[(r7+2)] = f10;
+	f0 = f20*f0;
+	f8 = f21*f8;
+	f10 = f14+f15;
+	f12 = f22*f6;
+	r8 = sp + -48;
+	f10 = f10+f12;
+	f0 = f0+f8;
+	f6 = f25*f6;
+	f8 = f11+f17;
+	heap32[(r7+3)] = 0;
+	f0 = f0+f6;
+	r7 = r8 >> 2;
+	f6 = f10+f27;
+	heapFloat[(fp+-12)] = f8;
+	f0 = f0+f26;
+	heapFloat[(r7+1)] = f6;
+	heapFloat[(r7+2)] = f0;
+	heap32[(r7+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f1*f9;
+	f1 = f3*f9;
+	f3 = f7*f9;
+	r1 = r_g0 >> 2;
+	f6 = f2-f0;
+	f7 = heapFloat[(r3)];
+	f8 = f5-f1;
+	f9 = heapFloat[(r3+1)];
+	r1 = heap32[(r1)];
+	f10 = heapFloat[(r3+4)];
+	f11 = heapFloat[(r3+5)];
+	f12 = f7*f6;
+	f13 = f9*f8;
+	f14 = f4-f3;
+	f15 = heapFloat[(r3+2)];
+	r1 = r1 >> 2;
+	f16 = heapFloat[(r3+8)];
+	f17 = heapFloat[(r3+9)];
+	f18 = heapFloat[(r3+6)];
+	f19 = f10*f6;
+	f20 = f11*f8;
+	f12 = f12+f13;
+	f13 = f15*f14;
+	f21 = heapFloat[(r3+10)];
+	r1 = heap32[(r1+2)];
+	f6 = f16*f6;
+	f8 = f17*f8;
+	f19 = f19+f20;
+	f20 = f18*f14;
+	f12 = f12+f13;
+	f13 = heapFloat[(r3+12)];
+	f22 = heapFloat[(r3+14)];
+	f23 = heapFloat[(r3+13)];
+	f0 = f2+f0;
+	f1 = f5+f1;
+	r2 = sp + -32;
+	f2 = f19+f20;
+	f5 = f6+f8;
+	f6 = f21*f14;
+	f8 = f12+f13;
+	f3 = f4+f3;
+	f4 = f5+f6;
+	f5 = f7*f0;
+	f6 = f9*f1;
+	r3 = r2 >> 2;
+	f2 = f2+f23;
+	heapFloat[(fp+-8)] = f8;
+	f7 = f10*f0;
+	f8 = f11*f1;
+	f5 = f5+f6;
+	f6 = f15*f3;
+	f4 = f4+f22;
+	heapFloat[(r3+1)] = f2;
+	f2 = f5+f6;
+	heapFloat[(r3+2)] = f4;
+	f0 = f16*f0;
+	f1 = f17*f1;
+	f4 = f7+f8;
+	f5 = f18*f3;
+	r4 = sp + -16;
+	f4 = f4+f5;
+	f0 = f0+f1;
+	f1 = f21*f3;
+	f2 = f2+f13;
+	heap32[(r3+3)] = 0;
+	f0 = f0+f1;
+	r3 = r4 >> 2;
+	f1 = f4+f23;
+	heapFloat[(fp+-4)] = f2;
+	f0 = f0+f22;
+	heapFloat[(r3+1)] = f1;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+__label__ = 30;
+break _1;
+}
+else{
+	if(r3 !=31) //_LBB222_32
+{
+__label__ = 32;
+break _1;
+}
+else{
+	r2 = heap32[(r5+4)];
+	r3 = (r2 + -1)|0;
+	if(r3 <0) //_LBB222_42
+{
+__label__ = 40;
+break _1;
+}
+else{
+	r3 = 1;
+	r2 = (r3 - r2)|0;
+_18: while(true){
+	r3 = r2;
+	r2 = (r3 * -20)|0;
+	r7 = heap32[(r5+6)];
+	r2 = r2 << 2;
+	r2 = (r7 + r2)|0;
+	r2 = r2 >> 2;
+	r7 = r4 >> 2;
+	r8 = heap32[(r1)];
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r7)];
+	f2 = heapFloat[(r2+4)];
+	f3 = heapFloat[(r7+1)];
+	r8 = r8 >> 2;
+	f4 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2+5)];
+	f6 = f0*f1;
+	f7 = f2*f3;
+	f8 = heapFloat[(r2+8)];
+	f9 = heapFloat[(r7+2)];
+	f10 = heapFloat[(r7+8)];
+	f11 = heapFloat[(r2+2)];
+	f12 = heapFloat[(r7+4)];
+	f13 = heapFloat[(r2+12)];
+	f14 = heapFloat[(r7+9)];
+	f15 = heapFloat[(r2+6)];
+	f16 = heapFloat[(r7+5)];
+	f17 = heapFloat[(r2+13)];
+	f18 = heapFloat[(r2+9)];
+	f19 = heapFloat[(r7+10)];
+	f20 = heapFloat[(r2+10)];
+	f21 = heapFloat[(r7+6)];
+	f22 = heapFloat[(r2+14)];
+	r8 = heap32[(r8+6)];
+	f23 = f4*f1;
+	f24 = f5*f3;
+	f6 = f6+f7;
+	f7 = f8*f9;
+	r2 = heap32[(r2+16)];
+	f25 = heapFloat[(r7+14)];
+	f26 = heapFloat[(r7+13)];
+	f27 = heapFloat[(r7+12)];
+	r7 = sp + -688;
+	f28 = f11*f1;
+	f29 = f15*f3;
+	f23 = f23+f24;
+	f24 = f18*f9;
+	f6 = f6+f7;
+	r9 = r7 >> 2;
+	f7 = f28+f29;
+	f28 = f20*f9;
+	f23 = f23+f24;
+	heapFloat[(fp+-172)] = f6;
+	f6 = f0*f12;
+	f24 = f2*f16;
+	f7 = f7+f28;
+	heapFloat[(r9+1)] = f23;
+	heapFloat[(r9+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f8*f21;
+	f28 = f11*f12;
+	f29 = f15*f16;
+	f7 = f7+f23;
+	f23 = f18*f21;
+	f6 = f6+f24;
+	heap32[(r9+3)] = 0;
+	f24 = f28+f29;
+	f28 = f20*f21;
+	f7 = f7+f23;
+	heapFloat[(r9+4)] = f6;
+	f0 = f0*f10;
+	f2 = f2*f14;
+	f6 = f24+f28;
+	heapFloat[(r9+5)] = f7;
+	heapFloat[(r9+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f6 = f11*f10;
+	f7 = f15*f14;
+	f4 = f4+f5;
+	f5 = f18*f19;
+	f0 = f0+f2;
+	heap32[(r9+7)] = 0;
+	f1 = f1*f13;
+	f2 = f3*f17;
+	f3 = f6+f7;
+	f6 = f20*f19;
+	f4 = f4+f5;
+	heapFloat[(r9+8)] = f0;
+	f0 = f12*f13;
+	f5 = f16*f17;
+	f1 = f1+f2;
+	f2 = f9*f22;
+	f3 = f3+f6;
+	heapFloat[(r9+9)] = f4;
+	f1 = f1+f2;
+	heapFloat[(r9+10)] = f3;
+	f2 = f10*f13;
+	f3 = f14*f17;
+	f0 = f0+f5;
+	f4 = f21*f22;
+	f0 = f0+f4;
+	f2 = f2+f3;
+	f3 = f19*f22;
+	f1 = f1+f27;
+	heap32[(r9+11)] = 0;
+	f2 = f2+f3;
+	f0 = f0+f26;
+	heapFloat[(r9+12)] = f1;
+	f1 = f2+f25;
+	heapFloat[(r9+13)] = f0;
+	heapFloat[(r9+14)] = f1;
+	heap32[(r9+15)] = 0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r6;
+	r2 = (r3 + 1)|0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	if(r3 ==0) //_LBB222_42
+{
+__label__ = 40;
+break _1;
+}
+else{
+continue _18;
+}
+}
+}
+}
+}
+}
+else{
+	if(r3 ==11) //_LBB222_20
+{
+	r2 = r4 >> 2;
+	r3 = heap32[(r5+17)];
+	f0 = heapFloat[(r5+14)];
+	f1 = heapFloat[(r5+15)];
+	f2 = heapFloat[(r2+12)];
+	f3 = heapFloat[(r2+13)];
+	f4 = heapFloat[(r2+14)];
+	r4 = sp + -880;
+	r5 = r4 >> 2;
+	heap32[(fp+-220)] = 0;
+	heap32[(r5+1)] = 0;
+	r7 = r3 << 2;
+	r4 = (r4 + r7)|0;
+	f5 =                       0.5;
+	heap32[(r5+2)] = 0;
+	r4 = r4 >> 2;
+	f1 = f1*f5;
+	heap32[(r5+3)] = 0;
+	r8 = sp + -896;
+	heapFloat[(r4)] = f1;
+	r4 = (r3 + 1)|0;
+	r4 = (r4 % 3)|0;
+	r9 = r8 >> 2;
+	heap32[(fp+-224)] = 0;
+	heap32[(r9+1)] = 0;
+	r4 = r4 << 2;
+	r8 = (r8 + r4)|0;
+	heap32[(r9+2)] = 0;
+	r8 = r8 >> 2;
+	heap32[(r9+3)] = 0;
+	r3 = (r3 + 2)|0;
+	r10 = sp + -912;
+	heapFloat[(r8)] = f0;
+	r3 = (r3 % 3)|0;
+	r8 = r10 >> 2;
+	heap32[(fp+-228)] = 0;
+	r3 = r3 << 2;
+	heap32[(r8+1)] = 0;
+	r3 = (r10 + r3)|0;
+	heap32[(r8+2)] = 0;
+	r3 = r3 >> 2;
+	heap32[(r8+3)] = 0;
+	heapFloat[(r3)] = f0;
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f1 = heapFloat[(r5+1)];
+	f5 = heapFloat[(fp+-220)];
+	f6 = heapFloat[(r9+1)];
+	f7 = heapFloat[(fp+-224)];
+	r10 = r_g0 >> 2;
+	f8 = heapFloat[(r5+2)];
+	f9 = heapFloat[(r9+2)];
+	f10 = heapFloat[(r2)];
+	f11 = f7-f5;
+	f12 = heapFloat[(r2+1)];
+	f13 = f6-f1;
+	f14 = heapFloat[(r2+4)];
+	f15 = heapFloat[(r2+5)];
+	r5 = heap32[(r10)];
+	f16 = heapFloat[(r2+2)];
+	f17 = f9-f8;
+	f18 = f10*f11;
+	f19 = f12*f13;
+	f20 = heapFloat[(r2+8)];
+	f21 = heapFloat[(r2+9)];
+	f22 = heapFloat[(r2+6)];
+	r5 = r5 >> 2;
+	f23 = f14*f11;
+	f24 = f15*f13;
+	f18 = f18+f19;
+	f19 = f16*f17;
+	f25 = heapFloat[(r2+10)];
+	r5 = heap32[(r5+2)];
+	f18 = f18+f19;
+	f11 = f20*f11;
+	f13 = f21*f13;
+	f19 = f23+f24;
+	f23 = f22*f17;
+	r9 = sp + -416;
+	f19 = f19+f23;
+	f11 = f11+f13;
+	f13 = f25*f17;
+	f17 = f2+f18;
+	f11 = f11+f13;
+	f10 = f10*f5;
+	f12 = f12*f1;
+	r10 = r9 >> 2;
+	f13 = f3+f19;
+	heapFloat[(fp+-104)] = f17;
+	f14 = f14*f5;
+	f15 = f15*f1;
+	f10 = f10+f12;
+	f12 = f16*f8;
+	f11 = f4+f11;
+	heapFloat[(r10+1)] = f13;
+	f10 = f10+f12;
+	heapFloat[(r10+2)] = f11;
+	f11 = f20*f5;
+	f12 = f21*f1;
+	f13 = f14+f15;
+	f14 = f22*f8;
+	r11 = sp + -400;
+	f13 = f13+f14;
+	f11 = f11+f12;
+	f12 = f25*f8;
+	f10 = f2+f10;
+	heap32[(r10+3)] = 0;
+	f11 = f11+f12;
+	r10 = r11 >> 2;
+	f12 = f3+f13;
+	heapFloat[(fp+-100)] = f10;
+	f10 = f4+f11;
+	heapFloat[(r10+1)] = f12;
+	heapFloat[(r10+2)] = f10;
+	heap32[(r10+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f10 = -f5;
+	f11 = -f1;
+	f12 = -f8;
+	r5 = r_g0 >> 2;
+	f13 = heapFloat[(r2)];
+	f7 = f10-f7;
+	f14 = heapFloat[(r2+1)];
+	f6 = f11-f6;
+	f15 = heapFloat[(r2+4)];
+	f16 = heapFloat[(r2+5)];
+	r5 = heap32[(r5)];
+	f17 = heapFloat[(r2+2)];
+	f9 = f12-f9;
+	f18 = f13*f7;
+	f19 = f14*f6;
+	f20 = heapFloat[(r2+8)];
+	f21 = heapFloat[(r2+9)];
+	f22 = heapFloat[(r2+6)];
+	r5 = r5 >> 2;
+	f23 = f15*f7;
+	f24 = f16*f6;
+	f18 = f18+f19;
+	f19 = f17*f9;
+	f25 = heapFloat[(r2+10)];
+	r5 = heap32[(r5+2)];
+	f18 = f18+f19;
+	f7 = f20*f7;
+	f6 = f21*f6;
+	f19 = f23+f24;
+	f23 = f22*f9;
+	r9 = sp + -384;
+	f19 = f19+f23;
+	f6 = f7+f6;
+	f7 = f25*f9;
+	f9 = f2+f18;
+	f6 = f6+f7;
+	f7 = f13*f5;
+	f13 = f14*f1;
+	r10 = r9 >> 2;
+	f14 = f3+f19;
+	heapFloat[(fp+-96)] = f9;
+	f9 = f15*f5;
+	f15 = f16*f1;
+	f7 = f7+f13;
+	f13 = f17*f8;
+	f6 = f4+f6;
+	heapFloat[(r10+1)] = f14;
+	f7 = f7+f13;
+	heapFloat[(r10+2)] = f6;
+	f6 = f20*f5;
+	f13 = f21*f1;
+	f9 = f9+f15;
+	f14 = f22*f8;
+	r11 = sp + -368;
+	f9 = f9+f14;
+	f6 = f6+f13;
+	f13 = f25*f8;
+	f7 = f2+f7;
+	heap32[(r10+3)] = 0;
+	f6 = f6+f13;
+	r10 = r11 >> 2;
+	f9 = f3+f9;
+	heapFloat[(fp+-92)] = f7;
+	f6 = f4+f6;
+	heapFloat[(r10+1)] = f9;
+	heapFloat[(r10+2)] = f6;
+	heap32[(r10+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f6 = heapFloat[(r8+1)];
+	f7 = heapFloat[(fp+-228)];
+	f9 = heapFloat[(r8+2)];
+	r5 = r_g0 >> 2;
+	f13 = heapFloat[(r2)];
+	f14 = f7-f5;
+	f15 = heapFloat[(r2+1)];
+	f16 = f6-f1;
+	f17 = heapFloat[(r2+4)];
+	f18 = heapFloat[(r2+5)];
+	r5 = heap32[(r5)];
+	f19 = heapFloat[(r2+2)];
+	f20 = f9-f8;
+	f21 = f13*f14;
+	f22 = f15*f16;
+	f23 = heapFloat[(r2+8)];
+	f24 = heapFloat[(r2+9)];
+	f25 = heapFloat[(r2+6)];
+	r5 = r5 >> 2;
+	f26 = f17*f14;
+	f27 = f18*f16;
+	f21 = f21+f22;
+	f22 = f19*f20;
+	f28 = heapFloat[(r2+10)];
+	r5 = heap32[(r5+2)];
+	f21 = f21+f22;
+	f14 = f23*f14;
+	f16 = f24*f16;
+	f22 = f26+f27;
+	f26 = f25*f20;
+	r8 = sp + -352;
+	f22 = f22+f26;
+	f14 = f14+f16;
+	f16 = f28*f20;
+	f20 = f2+f21;
+	f14 = f14+f16;
+	f13 = f13*f5;
+	f15 = f15*f1;
+	r9 = r8 >> 2;
+	f16 = f3+f22;
+	heapFloat[(fp+-88)] = f20;
+	f17 = f17*f5;
+	f18 = f18*f1;
+	f13 = f13+f15;
+	f15 = f19*f8;
+	f14 = f4+f14;
+	heapFloat[(r9+1)] = f16;
+	f13 = f13+f15;
+	heapFloat[(r9+2)] = f14;
+	f14 = f23*f5;
+	f15 = f24*f1;
+	f16 = f17+f18;
+	f17 = f25*f8;
+	r10 = sp + -336;
+	f16 = f16+f17;
+	f14 = f14+f15;
+	f15 = f28*f8;
+	f13 = f2+f13;
+	heap32[(r9+3)] = 0;
+	f14 = f14+f15;
+	r9 = r10 >> 2;
+	f15 = f3+f16;
+	heapFloat[(fp+-84)] = f13;
+	f13 = f4+f14;
+	heapFloat[(r9+1)] = f15;
+	heapFloat[(r9+2)] = f13;
+	heap32[(r9+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r5 = r_g0 >> 2;
+	f13 = heapFloat[(r2)];
+	f7 = f10-f7;
+	f10 = heapFloat[(r2+1)];
+	f6 = f11-f6;
+	f11 = heapFloat[(r2+4)];
+	f14 = heapFloat[(r2+5)];
+	r5 = heap32[(r5)];
+	f15 = heapFloat[(r2+2)];
+	f9 = f12-f9;
+	f12 = f13*f7;
+	f16 = f10*f6;
+	f17 = heapFloat[(r2+8)];
+	f18 = heapFloat[(r2+9)];
+	f19 = heapFloat[(r2+6)];
+	r5 = r5 >> 2;
+	f20 = f11*f7;
+	f21 = f14*f6;
+	f12 = f12+f16;
+	f16 = f15*f9;
+	f22 = heapFloat[(r2+10)];
+	r5 = heap32[(r5+2)];
+	f12 = f12+f16;
+	f7 = f17*f7;
+	f6 = f18*f6;
+	f16 = f20+f21;
+	f20 = f19*f9;
+	r8 = sp + -320;
+	f16 = f16+f20;
+	f6 = f7+f6;
+	f7 = f22*f9;
+	f9 = f2+f12;
+	f6 = f6+f7;
+	f7 = f13*f5;
+	f10 = f10*f1;
+	r9 = r8 >> 2;
+	f12 = f3+f16;
+	heapFloat[(fp+-80)] = f9;
+	f9 = f11*f5;
+	f11 = f14*f1;
+	f7 = f7+f10;
+	f10 = f15*f8;
+	f6 = f4+f6;
+	heapFloat[(r9+1)] = f12;
+	f7 = f7+f10;
+	heapFloat[(r9+2)] = f6;
+	f6 = f17*f5;
+	f10 = f18*f1;
+	f9 = f9+f11;
+	f11 = f19*f8;
+	r10 = sp + -304;
+	f9 = f9+f11;
+	f6 = f6+f10;
+	f10 = f22*f8;
+	f7 = f2+f7;
+	heap32[(r9+3)] = 0;
+	f6 = f6+f10;
+	r9 = r10 >> 2;
+	f9 = f3+f9;
+	heapFloat[(fp+-76)] = f7;
+	f6 = f4+f6;
+	heapFloat[(r9+1)] = f9;
+	heapFloat[(r9+2)] = f6;
+	heap32[(r9+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r6;
+	r3 = sp + -928;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = r3 >> 2;
+	heap32[(fp+-232)] = 0;
+	heap32[(r5+1)] = 0;
+	r3 = (r3 + r7)|0;
+	heap32[(r5+2)] = 0;
+	r3 = r3 >> 2;
+	heap32[(r5+3)] = 0;
+	r7 = sp + -944;
+	heap32[(r3)] = 1065353216;
+	r3 = r7 >> 2;
+	heap32[(fp+-236)] = 0;
+	heap32[(r3+1)] = 0;
+	r4 = (r7 + r4)|0;
+	heap32[(r3+2)] = 0;
+	r4 = r4 >> 2;
+	heap32[(r3+3)] = 0;
+	heap32[(r4)] = 1065353216;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0 >> 2;
+	r1 = heap32[(r1)];
+	f6 = heapFloat[(r2)];
+	f7 = heapFloat[(fp+-236)];
+	f9 = heapFloat[(r2+1)];
+	f10 = heapFloat[(r3+1)];
+	f11 = heapFloat[(r2+4)];
+	f12 = heapFloat[(r2+5)];
+	r1 = r1 >> 2;
+	f13 = heapFloat[(r2+2)];
+	f14 = heapFloat[(r3+2)];
+	f15 = f6*f7;
+	f16 = f9*f10;
+	f17 = heapFloat[(r2+8)];
+	f18 = heapFloat[(r2+9)];
+	f19 = heapFloat[(r2+10)];
+	f20 = heapFloat[(r2+6)];
+	r1 = heap32[(r1+15)];
+	f21 = f11*f7;
+	f22 = f12*f10;
+	f15 = f15+f16;
+	f16 = f13*f14;
+	r2 = sp + -288;
+	f7 = f17*f7;
+	f10 = f18*f10;
+	f21 = f21+f22;
+	f22 = f20*f14;
+	f15 = f15+f16;
+	r3 = r2 >> 2;
+	f7 = f7+f10;
+	f10 = f19*f14;
+	f14 = f21+f22;
+	heapFloat[(fp+-72)] = f15;
+	f7 = f7+f10;
+	heapFloat[(r3+1)] = f14;
+	heapFloat[(r3+2)] = f7;
+	heap32[(r3+3)] = 0;
+	f7 = heapFloat[(fp+-232)];
+	f10 = heapFloat[(r5+1)];
+	f14 = heapFloat[(r5+2)];
+	f15 = f6*f7;
+	f16 = f9*f10;
+	f21 = f11*f7;
+	f22 = f12*f10;
+	f15 = f15+f16;
+	f16 = f13*f14;
+	r3 = sp + -272;
+	f7 = f17*f7;
+	f10 = f18*f10;
+	f21 = f21+f22;
+	f22 = f20*f14;
+	f15 = f15+f16;
+	f6 = f6*f5;
+	f9 = f9*f1;
+	r4 = r3 >> 2;
+	f7 = f7+f10;
+	f10 = f19*f14;
+	f14 = f21+f22;
+	heapFloat[(fp+-68)] = f15;
+	f11 = f11*f5;
+	f12 = f12*f1;
+	f6 = f6+f9;
+	f9 = f13*f8;
+	f7 = f7+f10;
+	heapFloat[(r4+1)] = f14;
+	f6 = f6+f9;
+	heapFloat[(r4+2)] = f7;
+	f5 = f17*f5;
+	f1 = f18*f1;
+	f7 = f11+f12;
+	f9 = f20*f8;
+	r5 = sp + -256;
+	f7 = f7+f9;
+	f1 = f5+f1;
+	f5 = f19*f8;
+	f2 = f2-f6;
+	heap32[(r4+3)] = 0;
+	f1 = f1+f5;
+	r4 = r5 >> 2;
+	f3 = f3-f7;
+	heapFloat[(fp+-64)] = f2;
+	f1 = f4-f1;
+	heapFloat[(r4+1)] = f3;
+	heapFloat[(r4+2)] = f1;
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r3;
+}
+else{
+	if(r3 ==13) //_LBB222_21
+{
+	r3 = heap32[(r5)];
+	r3 = r3 >> 2;
+	r7 = heap32[(r5+13)];
+	r3 = heap32[(r3+21)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f0 = f_g0;
+	r3 = sp + -240;
+	f1 = heapFloat[(r5+8)];
+	f2 = heapFloat[(r5+9)];
+	f3 = heapFloat[(r5+7)];
+	r8 = r3 >> 2;
+	heap32[(r8+3)] = heap32[(r5+10)];
+	r9 = heap32[(r5)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	f4 = f_g0;
+	r9 = heap32[(r5)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	f5 = f_g0;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	f3 = f3+f_g0;
+	r2 = r7 << 2;
+	f1 = f1+f5;
+	heapFloat[(fp+-60)] = f3;
+	r3 = (r3 + r2)|0;
+	f2 = f2+f4;
+	heapFloat[(r8+1)] = f1;
+	r3 = r3 >> 2;
+	heapFloat[(r8+2)] = f2;
+	r4 = r4 >> 2;
+	f1 = heapFloat[(r3)];
+	f2 = heapFloat[(r4+12)];
+	f3 = heapFloat[(r4+13)];
+	f4 = heapFloat[(r4+14)];
+	r3 = sp + -960;
+	r5 = r3 >> 2;
+	heap32[(fp+-240)] = 0;
+	heap32[(r5+1)] = 0;
+	r3 = (r3 + r2)|0;
+	heap32[(r5+2)] = 0;
+	r3 = r3 >> 2;
+	heap32[(r5+3)] = 0;
+	r8 = sp + -976;
+	heapFloat[(r3)] = f1;
+	r3 = (r7 + 1)|0;
+	r3 = (r3 % 3)|0;
+	r7 = r8 >> 2;
+	heap32[(fp+-244)] = 0;
+	heap32[(r7+1)] = 0;
+	r3 = r3 << 2;
+	r8 = (r8 + r3)|0;
+	heap32[(r7+2)] = 0;
+	r8 = r8 >> 2;
+	heap32[(r7+3)] = 0;
+	heapFloat[(r8)] = f0;
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f1 = heapFloat[(r5+1)];
+	f5 = heapFloat[(r7+1)];
+	f6 = heapFloat[(fp+-240)];
+	f7 = heapFloat[(fp+-244)];
+	r9 = r_g0 >> 2;
+	f8 = heapFloat[(r5+2)];
+	f9 = heapFloat[(r7+2)];
+	f10 = f7-f6;
+	f11 = heapFloat[(r4)];
+	f12 = f5-f1;
+	f13 = heapFloat[(r4+1)];
+	r5 = heap32[(r9)];
+	f14 = heapFloat[(r4+4)];
+	f15 = heapFloat[(r4+5)];
+	f16 = f11*f10;
+	f17 = f13*f12;
+	f18 = f9-f8;
+	f19 = heapFloat[(r4+2)];
+	r5 = r5 >> 2;
+	f20 = heapFloat[(r4+8)];
+	f21 = heapFloat[(r4+9)];
+	f22 = heapFloat[(r4+6)];
+	f23 = f14*f10;
+	f24 = f15*f12;
+	f16 = f16+f17;
+	f17 = f19*f18;
+	f16 = f16+f17;
+	f17 = heapFloat[(r4+10)];
+	r5 = heap32[(r5+2)];
+	f10 = f20*f10;
+	f12 = f21*f12;
+	f23 = f23+f24;
+	f24 = f22*f18;
+	f25 = f6+f7;
+	f26 = f1+f5;
+	r7 = sp + -224;
+	f23 = f23+f24;
+	f10 = f10+f12;
+	f12 = f17*f18;
+	f16 = f2+f16;
+	f18 = f8+f9;
+	f10 = f10+f12;
+	f11 = f11*f25;
+	f12 = f13*f26;
+	r9 = r7 >> 2;
+	f13 = f3+f23;
+	heapFloat[(fp+-56)] = f16;
+	f14 = f14*f25;
+	f15 = f15*f26;
+	f11 = f11+f12;
+	f12 = f19*f18;
+	f10 = f4+f10;
+	heapFloat[(r9+1)] = f13;
+	f11 = f11+f12;
+	heapFloat[(r9+2)] = f10;
+	f10 = f20*f25;
+	f12 = f21*f26;
+	f13 = f14+f15;
+	f14 = f22*f18;
+	r10 = sp + -208;
+	f13 = f13+f14;
+	f10 = f10+f12;
+	f12 = f17*f18;
+	f11 = f2+f11;
+	heap32[(r9+3)] = 0;
+	f10 = f10+f12;
+	r9 = r10 >> 2;
+	f12 = f3+f13;
+	heapFloat[(fp+-52)] = f11;
+	f10 = f4+f10;
+	heapFloat[(r9+1)] = f12;
+	heapFloat[(r9+2)] = f10;
+	heap32[(r9+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	f10 = -f6;
+	f11 = -f1;
+	f12 = -f8;
+	r7 = r_g0 >> 2;
+	f10 = f10-f7;
+	f13 = heapFloat[(r4)];
+	f11 = f11-f5;
+	f14 = heapFloat[(r4+1)];
+	r7 = heap32[(r7)];
+	f15 = heapFloat[(r4+4)];
+	f16 = heapFloat[(r4+5)];
+	f17 = f13*f10;
+	f18 = f14*f11;
+	f12 = f12-f9;
+	f19 = heapFloat[(r4+2)];
+	r7 = r7 >> 2;
+	f20 = heapFloat[(r4+8)];
+	f21 = heapFloat[(r4+9)];
+	f22 = heapFloat[(r4+6)];
+	f23 = f15*f10;
+	f24 = f16*f11;
+	f17 = f17+f18;
+	f18 = f19*f12;
+	f17 = f17+f18;
+	f18 = heapFloat[(r4+10)];
+	r7 = heap32[(r7+2)];
+	f10 = f20*f10;
+	f11 = f21*f11;
+	f23 = f23+f24;
+	f24 = f22*f12;
+	f7 = f6-f7;
+	f5 = f1-f5;
+	r8 = sp + -192;
+	f23 = f23+f24;
+	f10 = f10+f11;
+	f11 = f18*f12;
+	f12 = f2+f17;
+	f9 = f8-f9;
+	f10 = f10+f11;
+	f11 = f13*f7;
+	f13 = f14*f5;
+	r9 = r8 >> 2;
+	f14 = f3+f23;
+	heapFloat[(fp+-48)] = f12;
+	f12 = f15*f7;
+	f15 = f16*f5;
+	f11 = f11+f13;
+	f13 = f19*f9;
+	f10 = f4+f10;
+	heapFloat[(r9+1)] = f14;
+	f11 = f11+f13;
+	heapFloat[(r9+2)] = f10;
+	f7 = f20*f7;
+	f5 = f21*f5;
+	f10 = f12+f15;
+	f12 = f22*f9;
+	r10 = sp + -176;
+	f10 = f10+f12;
+	f5 = f7+f5;
+	f7 = f18*f9;
+	f9 = f2+f11;
+	heap32[(r9+3)] = 0;
+	f5 = f5+f7;
+	r9 = r10 >> 2;
+	f7 = f3+f10;
+	heapFloat[(fp+-44)] = f9;
+	f5 = f4+f5;
+	heapFloat[(r9+1)] = f7;
+	heapFloat[(r9+2)] = f5;
+	heap32[(r9+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r6;
+	r5 = sp + -992;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r5 >> 2;
+	heap32[(fp+-248)] = 0;
+	heap32[(r7+1)] = 0;
+	r2 = (r5 + r2)|0;
+	heap32[(r7+2)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r7+3)] = 0;
+	r5 = sp + -1008;
+	heap32[(r2)] = 1065353216;
+	r2 = r5 >> 2;
+	heap32[(fp+-252)] = 0;
+	heap32[(r2+1)] = 0;
+	r3 = (r5 + r3)|0;
+	heap32[(r2+2)] = 0;
+	r3 = r3 >> 2;
+	heap32[(r2+3)] = 0;
+	heap32[(r3)] = 1065353216;
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	f5 = heapFloat[(r4)];
+	f7 = heapFloat[(fp+-252)];
+	f9 = heapFloat[(r4+1)];
+	f10 = heapFloat[(r2+1)];
+	f11 = heapFloat[(r4+4)];
+	f12 = heapFloat[(r4+5)];
+	r5 = r5 >> 2;
+	f13 = heapFloat[(r4+2)];
+	f14 = heapFloat[(r2+2)];
+	f15 = f5*f7;
+	f16 = f9*f10;
+	f17 = heapFloat[(r4+8)];
+	f18 = heapFloat[(r4+9)];
+	f19 = heapFloat[(r4+10)];
+	f20 = heapFloat[(r4+6)];
+	r2 = heap32[(r5+15)];
+	f21 = f11*f7;
+	f22 = f12*f10;
+	f15 = f15+f16;
+	f16 = f13*f14;
+	r5 = sp + -160;
+	f23 = f17*f7;
+	f24 = f18*f10;
+	f21 = f21+f22;
+	f22 = f20*f14;
+	f15 = f15+f16;
+	r8 = r5 >> 2;
+	f16 = f23+f24;
+	f23 = f19*f14;
+	f21 = f21+f22;
+	heapFloat[(fp+-40)] = f15;
+	f15 = f16+f23;
+	heapFloat[(r8+1)] = f21;
+	heapFloat[(r8+2)] = f15;
+	heap32[(r8+3)] = 0;
+	f15 = heapFloat[(fp+-248)];
+	f16 = heapFloat[(r7+1)];
+	f21 = heapFloat[(r7+2)];
+	f22 = f5*f15;
+	f23 = f9*f16;
+	f24 = f11*f15;
+	f25 = f12*f16;
+	f22 = f22+f23;
+	f23 = f13*f21;
+	r7 = sp + -144;
+	f26 = f17*f15;
+	f27 = f18*f16;
+	f24 = f24+f25;
+	f25 = f20*f21;
+	f22 = f22+f23;
+	f5 = f5*f6;
+	f9 = f9*f1;
+	r8 = r7 >> 2;
+	f23 = f26+f27;
+	f26 = f19*f21;
+	f24 = f24+f25;
+	heapFloat[(fp+-36)] = f22;
+	f11 = f11*f6;
+	f12 = f12*f1;
+	f5 = f5+f9;
+	f9 = f13*f8;
+	f13 = f23+f26;
+	heapFloat[(r8+1)] = f24;
+	f5 = f5+f9;
+	heapFloat[(r8+2)] = f13;
+	f9 = f17*f6;
+	f13 = f18*f1;
+	f11 = f11+f12;
+	f12 = f20*f8;
+	r9 = sp + -128;
+	f11 = f11+f12;
+	f9 = f9+f13;
+	f12 = f19*f8;
+	f5 = f2-f5;
+	heap32[(r8+3)] = 0;
+	f9 = f9+f12;
+	r8 = r9 >> 2;
+	f11 = f3-f11;
+	heapFloat[(fp+-32)] = f5;
+	f5 = f4-f9;
+	heapFloat[(r8+1)] = f11;
+	heapFloat[(r8+2)] = f5;
+	heap32[(r8+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r5;
+	heapFloat[(g0+4)] = f0;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = 0;
+	heap32[(g0+7)] = 1086918619;
+	heap32[(g0+8)] = r6;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0 >> 2;
+	f5 = heapFloat[(r4)];
+	f9 = heapFloat[(r4+1)];
+	r1 = heap32[(r1)];
+	f11 = heapFloat[(r4+4)];
+	f12 = heapFloat[(r4+5)];
+	f13 = heapFloat[(r4+2)];
+	r1 = r1 >> 2;
+	f17 = f5*f7;
+	f18 = f9*f10;
+	f19 = heapFloat[(r4+8)];
+	f20 = heapFloat[(r4+9)];
+	f22 = heapFloat[(r4+10)];
+	f23 = heapFloat[(r4+6)];
+	r1 = heap32[(r1+15)];
+	f24 = f11*f7;
+	f25 = f12*f10;
+	f17 = f17+f18;
+	f18 = f13*f14;
+	r2 = sp + -112;
+	f7 = f19*f7;
+	f10 = f20*f10;
+	f24 = f24+f25;
+	f25 = f23*f14;
+	f17 = f17+f18;
+	r3 = r2 >> 2;
+	f7 = f7+f10;
+	f10 = f22*f14;
+	f14 = f24+f25;
+	heapFloat[(fp+-28)] = f17;
+	f17 = f5*f15;
+	f18 = f9*f16;
+	f7 = f7+f10;
+	heapFloat[(r3+1)] = f14;
+	heapFloat[(r3+2)] = f7;
+	f7 = f11*f15;
+	f10 = f12*f16;
+	f14 = f17+f18;
+	f17 = f13*f21;
+	r4 = sp + -96;
+	f15 = f19*f15;
+	f16 = f20*f16;
+	f7 = f7+f10;
+	f10 = f23*f21;
+	f14 = f14+f17;
+	heap32[(r3+3)] = 0;
+	f5 = f5*f6;
+	f9 = f9*f1;
+	r3 = r4 >> 2;
+	f15 = f15+f16;
+	f16 = f22*f21;
+	f7 = f7+f10;
+	heapFloat[(fp+-24)] = f14;
+	f10 = f11*f6;
+	f11 = f12*f1;
+	f5 = f5+f9;
+	f9 = f13*f8;
+	f12 = f15+f16;
+	heapFloat[(r3+1)] = f7;
+	f5 = f5+f9;
+	heapFloat[(r3+2)] = f12;
+	f6 = f19*f6;
+	f1 = f20*f1;
+	f7 = f10+f11;
+	f9 = f23*f8;
+	r5 = sp + -80;
+	f7 = f7+f9;
+	f1 = f6+f1;
+	f6 = f22*f8;
+	f2 = f2+f5;
+	heap32[(r3+3)] = 0;
+	f1 = f1+f6;
+	r3 = r5 >> 2;
+	f3 = f3+f7;
+	heapFloat[(fp+-20)] = f2;
+	f1 = f4+f1;
+	heapFloat[(r3+1)] = f3;
+	heapFloat[(r3+2)] = f1;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r4;
+}
+else{
+__label__ = 32;
+break _1;
+}
+}
+	heap32[(g0+3)] = r2;
+	heapFloat[(g0+4)] = f0;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = 0;
+	heap32[(g0+7)] = 1086918619;
+	heap32[(g0+8)] = r6;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+}
+else{
+	if(r3 >8) //_LBB222_4
+{
+	if(r3 ==9) //_LBB222_16
+{
+	r2 = heap32[(r5+23)];
+	r3 = (r2 + -1)|0;
+	if(r3 <0) //_LBB222_42
+{
+__label__ = 40;
+break _1;
+}
+else{
+	r3 = 1;
+	r2 = (r3 - r2)|0;
+_32: while(true){
+	r3 = r2;
+	r2 = heap32[(r5+25)];
+	r7 = r3 << 4;
+	r8 = heap32[(r1)];
+	r2 = (r2 - r7)|0;
+	r2 = r2 >> 2;
+	r7 = r8 >> 2;
+	r7 = heap32[(r7+4)];
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r2+2)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r4 >> 2;
+	r8 = r_g0 >> 2;
+	r8 = heap32[(r8)];
+	f3 = heapFloat[(r7+1)];
+	f4 =                         0;
+	f5 = heapFloat[(r7)];
+	f6 = heapFloat[(r7+2)];
+	r8 = r8 >> 2;
+	f7 = f3*f4;
+	f8 = f5*f4;
+	f9 = heapFloat[(r7+8)];
+	f10 = heapFloat[(r7+9)];
+	f11 = heapFloat[(r7+10)];
+	f12 = heapFloat[(r7+4)];
+	f13 = heapFloat[(r7+5)];
+	f14 = heapFloat[(r7+6)];
+	r8 = heap32[(r8+4)];
+	f15 = f5+f7;
+	f16 = f6*f4;
+	f17 = heapFloat[(r7+14)];
+	f18 = heapFloat[(r7+13)];
+	f19 = heapFloat[(r7+12)];
+	r7 = sp + -608;
+	f20 = f8+f3;
+	f15 = f15+f16;
+	f7 = f8+f7;
+	r9 = r7 >> 2;
+	f8 = f20+f16;
+	heapFloat[(fp+-152)] = f15;
+	f15 = f13*f4;
+	f7 = f7+f6;
+	heapFloat[(r9+1)] = f8;
+	f8 = f12*f4;
+	heapFloat[(r9+2)] = f7;
+	f7 = f12+f15;
+	f16 = f14*f4;
+	f20 = f8+f13;
+	f7 = f7+f16;
+	heap32[(r9+3)] = 0;
+	f8 = f8+f15;
+	f15 = f20+f16;
+	heapFloat[(r9+4)] = f7;
+	f7 = f10*f4;
+	f8 = f8+f14;
+	heapFloat[(r9+5)] = f15;
+	f15 = f9*f4;
+	heapFloat[(r9+6)] = f8;
+	f8 = f9+f7;
+	f4 = f11*f4;
+	f16 = f15+f10;
+	f8 = f8+f4;
+	heap32[(r9+7)] = 0;
+	f7 = f15+f7;
+	f5 = f5*f0;
+	f3 = f3*f1;
+	f4 = f16+f4;
+	heapFloat[(r9+8)] = f8;
+	f8 = f12*f0;
+	f12 = f13*f1;
+	f3 = f5+f3;
+	f5 = f6*f2;
+	f6 = f7+f11;
+	heapFloat[(r9+9)] = f4;
+	f3 = f3+f5;
+	heapFloat[(r9+10)] = f6;
+	f0 = f9*f0;
+	f1 = f10*f1;
+	f4 = f8+f12;
+	f5 = f14*f2;
+	f4 = f4+f5;
+	f0 = f0+f1;
+	f1 = f11*f2;
+	f2 = f3+f19;
+	heap32[(r9+11)] = 0;
+	f0 = f0+f1;
+	f1 = f4+f18;
+	heapFloat[(r9+12)] = f2;
+	f0 = f0+f17;
+	heapFloat[(r9+13)] = f1;
+	heapFloat[(r9+14)] = f0;
+	heap32[(r9+15)] = 0;
+	r9 = heap32[(r5+30)];
+	r10 = r3 << 2;
+	r9 = (r9 - r10)|0;
+	r9 = r9 >> 2;
+	f0 = heapFloat[(r9)];
+	heap32[(g0)] = r_g0;
+	heapFloat[(g0+1)] = f0;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r6;
+	r2 = (r3 + 1)|0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	if(r3 ==0) //_LBB222_42
+{
+__label__ = 40;
+break _1;
+}
+else{
+continue _32;
+}
+}
+}
+}
+else{
+	if(r3 ==10) //_LBB222_19
+{
+	r3 = heap32[(r5+13)];
+	r5 = (r3 + 2)|0;
+	r5 = (r5 % 3)|0;
+	r7 = r3 << 2;
+	r2 = (r2 + 28)|0;
+	r5 = r5 << 2;
+	r8 = (r2 + r7)|0;
+	r2 = (r2 + r5)|0;
+	r8 = r8 >> 2;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r8)];
+	f1 = heapFloat[(r2)];
+	r2 = sp + -720;
+	r8 = r2 >> 2;
+	heap32[(fp+-180)] = 0;
+	heap32[(r8+1)] = 0;
+	r9 = (r2 + r7)|0;
+	heap32[(r8+2)] = 0;
+	r9 = r9 >> 2;
+	f2 = -f0;
+	heap32[(r8+3)] = 0;
+	r10 = sp + -736;
+	heapFloat[(r9)] = f2;
+	heap32[(fp+-184)] = 0;
+	r9 = r10 >> 2;
+	heap32[(r9+1)] = 0;
+	r7 = (r10 + r7)|0;
+	heap32[(r9+2)] = 0;
+	r7 = r7 >> 2;
+	heap32[(r9+3)] = 0;
+	heapFloat[(r7)] = f0;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r4)];
+	r7 = sp + -800;
+	heapFloat[(fp+-200)] = f0;
+	r11 = r7 >> 2;
+	f2 = heapFloat[(r4+1)];
+	heapFloat[(r11+1)] = f2;
+	f3 = heapFloat[(r4+2)];
+	heapFloat[(r11+2)] = f3;
+	heap32[(r11+3)] = heap32[(r4+3)];
+	f4 = heapFloat[(r4+4)];
+	heapFloat[(r11+4)] = f4;
+	f5 = heapFloat[(r4+5)];
+	heapFloat[(r11+5)] = f5;
+	f6 = heapFloat[(r4+6)];
+	heapFloat[(r11+6)] = f6;
+	heap32[(r11+7)] = heap32[(r4+7)];
+	f7 = heapFloat[(r4+8)];
+	heapFloat[(r11+8)] = f7;
+	f8 = heapFloat[(r4+9)];
+	heapFloat[(r11+9)] = f8;
+	f9 = heapFloat[(r4+10)];
+	heapFloat[(r11+10)] = f9;
+	heap32[(r11+11)] = heap32[(r4+11)];
+	f10 = heapFloat[(fp+-180)];
+	f11 = heapFloat[(r8+1)];
+	f12 = heapFloat[(r8+2)];
+	f0 = f0*f10;
+	f2 = f2*f11;
+	f4 = f4*f10;
+	f5 = f5*f11;
+	f0 = f0+f2;
+	f2 = f3*f12;
+	f3 = f7*f10;
+	f7 = f8*f11;
+	f4 = f4+f5;
+	f5 = f6*f12;
+	f0 = f0+f2;
+	f2 = heapFloat[(r4+12)];
+	f6 = heapFloat[(r4+13)];
+	f8 = heapFloat[(r4+14)];
+	f4 = f4+f5;
+	f3 = f3+f7;
+	f5 = f9*f12;
+	f0 = f0+f2;
+	f2 = f3+f5;
+	f3 = f4+f6;
+	heapFloat[(r11+12)] = f0;
+	f0 = f2+f8;
+	heapFloat[(r11+13)] = f3;
+	heapFloat[(r11+14)] = f0;
+	heap32[(r11+15)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+4)];
+	heap32[(g0)] = r_g0;
+	heapFloat[(g0+1)] = f1;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	f0 = heapFloat[(r4)];
+	r7 = sp + -864;
+	heapFloat[(fp+-216)] = f0;
+	r11 = r7 >> 2;
+	f2 = heapFloat[(r4+1)];
+	heapFloat[(r11+1)] = f2;
+	f3 = heapFloat[(r4+2)];
+	heapFloat[(r11+2)] = f3;
+	heap32[(r11+3)] = heap32[(r4+3)];
+	f4 = heapFloat[(r4+4)];
+	heapFloat[(r11+4)] = f4;
+	f5 = heapFloat[(r4+5)];
+	heapFloat[(r11+5)] = f5;
+	f6 = heapFloat[(r4+6)];
+	heapFloat[(r11+6)] = f6;
+	heap32[(r11+7)] = heap32[(r4+7)];
+	f7 = heapFloat[(r4+8)];
+	heapFloat[(r11+8)] = f7;
+	f8 = heapFloat[(r4+9)];
+	heapFloat[(r11+9)] = f8;
+	f9 = heapFloat[(r4+10)];
+	heapFloat[(r11+10)] = f9;
+	heap32[(r11+11)] = heap32[(r4+11)];
+	f10 = heapFloat[(fp+-184)];
+	f11 = heapFloat[(r9+1)];
+	f12 = heapFloat[(r9+2)];
+	f0 = f0*f10;
+	f2 = f2*f11;
+	f4 = f4*f10;
+	f5 = f5*f11;
+	f0 = f0+f2;
+	f2 = f3*f12;
+	f3 = f7*f10;
+	f7 = f8*f11;
+	f4 = f4+f5;
+	f5 = f6*f12;
+	f0 = f0+f2;
+	f2 = heapFloat[(r4+12)];
+	f6 = heapFloat[(r4+13)];
+	f8 = heapFloat[(r4+14)];
+	f4 = f4+f5;
+	f3 = f3+f7;
+	f5 = f9*f12;
+	f0 = f0+f2;
+	f2 = f3+f5;
+	f3 = f4+f6;
+	heapFloat[(r11+12)] = f0;
+	f0 = f2+f8;
+	heapFloat[(r11+13)] = f3;
+	heapFloat[(r11+14)] = f0;
+	heap32[(r11+15)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+4)];
+	r3 = (r3 + 1)|0;
+	heap32[(g0)] = r_g0;
+	heapFloat[(g0+1)] = f1;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r6;
+	r3 = (r3 % 3)|0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	r3 = r3 << 2;
+	r7 = (r2 + r3)|0;
+	f0 = heapFloat[(r4+12)];
+	f2 = heapFloat[(r4+13)];
+	f3 = heapFloat[(r4+14)];
+	r3 = (r10 + r3)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7)] = f1;
+	r3 = r3 >> 2;
+	heapFloat[(r3)] = f1;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	f4 = heapFloat[(fp+-184)];
+	f5 = heapFloat[(r4)];
+	f6 = heapFloat[(r9+1)];
+	f7 = heapFloat[(r4+1)];
+	r12 = heap32[(r12)];
+	f8 = heapFloat[(r4+4)];
+	f9 = heapFloat[(r4+5)];
+	f10 = f5*f4;
+	f11 = f7*f6;
+	f12 = heapFloat[(r9+2)];
+	f13 = heapFloat[(r4+2)];
+	r12 = r12 >> 2;
+	f14 = heapFloat[(r4+8)];
+	f15 = heapFloat[(r4+9)];
+	f16 = heapFloat[(r4+6)];
+	f17 = f8*f4;
+	f18 = f9*f6;
+	f10 = f10+f11;
+	f11 = f13*f12;
+	f10 = f10+f11;
+	f11 = heapFloat[(r4+10)];
+	r12 = heap32[(r12+2)];
+	f4 = f14*f4;
+	f6 = f15*f6;
+	f17 = f17+f18;
+	f18 = f16*f12;
+	r13 = sp + -544;
+	f17 = f17+f18;
+	f4 = f4+f6;
+	f6 = f11*f12;
+	f10 = f0+f10;
+	f4 = f4+f6;
+	r14 = r13 >> 2;
+	f6 = f2+f17;
+	heapFloat[(fp+-136)] = f10;
+	f4 = f3+f4;
+	heapFloat[(r14+1)] = f6;
+	heapFloat[(r14+2)] = f4;
+	heap32[(r14+3)] = 0;
+	f4 = heapFloat[(fp+-180)];
+	f6 = heapFloat[(r8+1)];
+	f10 = heapFloat[(r8+2)];
+	f5 = f5*f4;
+	f7 = f7*f6;
+	f8 = f8*f4;
+	f9 = f9*f6;
+	f5 = f5+f7;
+	f7 = f13*f10;
+	f5 = f5+f7;
+	f4 = f14*f4;
+	f6 = f15*f6;
+	f7 = f8+f9;
+	f8 = f16*f10;
+	r14 = sp + -528;
+	f7 = f7+f8;
+	f4 = f4+f6;
+	f6 = f11*f10;
+	f5 = f0+f5;
+	f4 = f4+f6;
+	r15 = r14 >> 2;
+	f6 = f2+f7;
+	heapFloat[(fp+-132)] = f5;
+	f4 = f3+f4;
+	heapFloat[(r15+1)] = f6;
+	heapFloat[(r15+2)] = f4;
+	heap32[(r15+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	f4 = -f1;
+	heapFloat[(r7)] = f4;
+	heapFloat[(r3)] = f4;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	f5 = heapFloat[(fp+-184)];
+	f6 = heapFloat[(r4)];
+	f7 = heapFloat[(r9+1)];
+	f8 = heapFloat[(r4+1)];
+	r12 = heap32[(r12)];
+	f9 = heapFloat[(r4+4)];
+	f10 = heapFloat[(r4+5)];
+	f11 = f6*f5;
+	f12 = f8*f7;
+	f13 = heapFloat[(r9+2)];
+	f14 = heapFloat[(r4+2)];
+	r12 = r12 >> 2;
+	f15 = heapFloat[(r4+8)];
+	f16 = heapFloat[(r4+9)];
+	f17 = heapFloat[(r4+6)];
+	f18 = f9*f5;
+	f19 = f10*f7;
+	f11 = f11+f12;
+	f12 = f14*f13;
+	f11 = f11+f12;
+	f12 = heapFloat[(r4+10)];
+	r12 = heap32[(r12+2)];
+	f5 = f15*f5;
+	f7 = f16*f7;
+	f18 = f18+f19;
+	f19 = f17*f13;
+	r13 = sp + -512;
+	f18 = f18+f19;
+	f5 = f5+f7;
+	f7 = f12*f13;
+	f11 = f0+f11;
+	f5 = f5+f7;
+	r14 = r13 >> 2;
+	f7 = f2+f18;
+	heapFloat[(fp+-128)] = f11;
+	f5 = f3+f5;
+	heapFloat[(r14+1)] = f7;
+	heapFloat[(r14+2)] = f5;
+	heap32[(r14+3)] = 0;
+	f5 = heapFloat[(fp+-180)];
+	f7 = heapFloat[(r8+1)];
+	f11 = heapFloat[(r8+2)];
+	f6 = f6*f5;
+	f8 = f8*f7;
+	f9 = f9*f5;
+	f10 = f10*f7;
+	f6 = f6+f8;
+	f8 = f14*f11;
+	f6 = f6+f8;
+	f5 = f15*f5;
+	f7 = f16*f7;
+	f8 = f9+f10;
+	f9 = f17*f11;
+	r14 = sp + -496;
+	f8 = f8+f9;
+	f5 = f5+f7;
+	f7 = f12*f11;
+	f6 = f0+f6;
+	f5 = f5+f7;
+	r15 = r14 >> 2;
+	f7 = f2+f8;
+	heapFloat[(fp+-124)] = f6;
+	f5 = f3+f5;
+	heapFloat[(r15+1)] = f7;
+	heapFloat[(r15+2)] = f5;
+	heap32[(r15+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	heap32[(r7)] = 0;
+	r2 = (r2 + r5)|0;
+	r5 = (r10 + r5)|0;
+	heap32[(r3)] = 0;
+	r2 = r2 >> 2;
+	heapFloat[(r2)] = f1;
+	r3 = r5 >> 2;
+	heapFloat[(r3)] = f1;
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r7 = r_g0 >> 2;
+	f1 = heapFloat[(fp+-184)];
+	f5 = heapFloat[(r4)];
+	f6 = heapFloat[(r9+1)];
+	f7 = heapFloat[(r4+1)];
+	r7 = heap32[(r7)];
+	f8 = heapFloat[(r4+4)];
+	f9 = heapFloat[(r4+5)];
+	f10 = f5*f1;
+	f11 = f7*f6;
+	f12 = heapFloat[(r9+2)];
+	f13 = heapFloat[(r4+2)];
+	r7 = r7 >> 2;
+	f14 = heapFloat[(r4+8)];
+	f15 = heapFloat[(r4+9)];
+	f16 = heapFloat[(r4+6)];
+	f17 = f8*f1;
+	f18 = f9*f6;
+	f10 = f10+f11;
+	f11 = f13*f12;
+	f10 = f10+f11;
+	f11 = heapFloat[(r4+10)];
+	r7 = heap32[(r7+2)];
+	f1 = f14*f1;
+	f6 = f15*f6;
+	f17 = f17+f18;
+	f18 = f16*f12;
+	r10 = sp + -480;
+	f17 = f17+f18;
+	f1 = f1+f6;
+	f6 = f11*f12;
+	f10 = f0+f10;
+	f1 = f1+f6;
+	r11 = r10 >> 2;
+	f6 = f2+f17;
+	heapFloat[(fp+-120)] = f10;
+	f1 = f3+f1;
+	heapFloat[(r11+1)] = f6;
+	heapFloat[(r11+2)] = f1;
+	heap32[(r11+3)] = 0;
+	f1 = heapFloat[(fp+-180)];
+	f6 = heapFloat[(r8+1)];
+	f10 = heapFloat[(r8+2)];
+	f5 = f5*f1;
+	f7 = f7*f6;
+	f8 = f8*f1;
+	f9 = f9*f6;
+	f5 = f5+f7;
+	f7 = f13*f10;
+	f5 = f5+f7;
+	f1 = f14*f1;
+	f6 = f15*f6;
+	f7 = f8+f9;
+	f8 = f16*f10;
+	r11 = sp + -464;
+	f7 = f7+f8;
+	f1 = f1+f6;
+	f6 = f11*f10;
+	f5 = f0+f5;
+	f1 = f1+f6;
+	r12 = r11 >> 2;
+	f6 = f2+f7;
+	heapFloat[(fp+-116)] = f5;
+	f1 = f3+f1;
+	heapFloat[(r12+1)] = f6;
+	heapFloat[(r12+2)] = f1;
+	heap32[(r12+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	heapFloat[(r2)] = f4;
+	heapFloat[(r3)] = f4;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0 >> 2;
+	f1 = heapFloat[(fp+-184)];
+	f4 = heapFloat[(r4)];
+	f5 = heapFloat[(r9+1)];
+	f6 = heapFloat[(r4+1)];
+	r1 = heap32[(r1)];
+	f7 = heapFloat[(r4+4)];
+	f8 = heapFloat[(r4+5)];
+	f9 = f4*f1;
+	f10 = f6*f5;
+	f11 = heapFloat[(r9+2)];
+	f12 = heapFloat[(r4+2)];
+	r1 = r1 >> 2;
+	f13 = heapFloat[(r4+8)];
+	f14 = heapFloat[(r4+9)];
+	f15 = heapFloat[(r4+6)];
+	f16 = f7*f1;
+	f17 = f8*f5;
+	f9 = f9+f10;
+	f10 = f12*f11;
+	f9 = f9+f10;
+	f10 = heapFloat[(r4+10)];
+	r1 = heap32[(r1+2)];
+	f1 = f13*f1;
+	f5 = f14*f5;
+	f16 = f16+f17;
+	f17 = f15*f11;
+	r2 = sp + -448;
+	f16 = f16+f17;
+	f1 = f1+f5;
+	f5 = f10*f11;
+	f9 = f0+f9;
+	f1 = f1+f5;
+	r3 = r2 >> 2;
+	f5 = f2+f16;
+	heapFloat[(fp+-112)] = f9;
+	f1 = f3+f1;
+	heapFloat[(r3+1)] = f5;
+	heapFloat[(r3+2)] = f1;
+	heap32[(r3+3)] = 0;
+	f1 = heapFloat[(fp+-180)];
+	f5 = heapFloat[(r8+1)];
+	f9 = heapFloat[(r8+2)];
+	f4 = f4*f1;
+	f6 = f6*f5;
+	f7 = f7*f1;
+	f8 = f8*f5;
+	f4 = f4+f6;
+	f6 = f12*f9;
+	f4 = f4+f6;
+	f1 = f13*f1;
+	f5 = f14*f5;
+	f6 = f7+f8;
+	f7 = f15*f9;
+	r3 = sp + -432;
+	f6 = f6+f7;
+	f1 = f1+f5;
+	f5 = f10*f9;
+	f0 = f0+f4;
+	f1 = f1+f5;
+	r4 = r3 >> 2;
+	f2 = f2+f6;
+	heapFloat[(fp+-108)] = f0;
+	f0 = f3+f1;
+	heapFloat[(r4+1)] = f2;
+	heapFloat[(r4+2)] = f0;
+	heap32[(r4+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r3;
+__label__ = 30;
+break _1;
+}
+else{
+__label__ = 32;
+break _1;
+}
+}
+}
+else{
+	if(r3 ==0) //_LBB222_14
+{
+	r3 = sp + -704;
+	f0 = heapFloat[(r5+8)];
+	f1 = heapFloat[(r5+9)];
+	f2 = heapFloat[(r5+7)];
+	r7 = r3 >> 2;
+	heap32[(r7+3)] = heap32[(r5+10)];
+	r8 = heap32[(r5)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f3 = f_g0;
+	r8 = heap32[(r5)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f4 = f_g0;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	f2 = f2+f_g0;
+	f0 = f0+f4;
+	heapFloat[(fp+-176)] = f2;
+	f1 = f1+f3;
+	heapFloat[(r7+1)] = f0;
+	heapFloat[(r7+2)] = f1;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r7+2)];
+	f1 = heapFloat[(r7+1)];
+	f2 = heapFloat[(fp+-176)];
+	r1 = heap32[(r1+18)];
+	r2 = sp + -624;
+	f2 = -f2;
+	r5 = r2 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-156)] = f2;
+	f0 = -f0;
+	heapFloat[(r5+1)] = f1;
+	heapFloat[(r5+2)] = f0;
+	heap32[(r5+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r6;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+else{
+	if(r3 ==8) //_LBB222_15
+{
+	r3 = heap32[(r5)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+11)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f0 = f_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r_g0;
+	heapFloat[(g0+1)] = f0;
+	heap32[(g0+2)] = r4;
+__label__ = 31;
+}
+else{
+__label__ = 32;
+}
+}
+}
+}
+} while(0);
+_41: do {
+switch(__label__ ){//multiple entries
+case 30:
+	heap32[(g0+2)] = r2;
+__label__ = 31;
+break _41;
+break;
+case 32:
+	r7 = (r3 + -21)|0;
+	if(uint(r7) <uint(9)) //_LBB222_34
+{
+	r3 = sp + -1024;
+	r7 = r3 >> 2;
+	heap32[(fp+-256)] = 1566444395;
+	heap32[(r7+1)] = 1566444395;
+	heap32[(r7+2)] = 1566444395;
+	r8 = sp + -1040;
+	heap32[(r7+3)] = 0;
+	r7 = r8 >> 2;
+	heap32[(fp+-260)] = -581039253;
+	heap32[(r7+1)] = -581039253;
+	heap32[(r7+2)] = -581039253;
+	heap32[(r7+3)] = 0;
+	r7 = heap32[(r1)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+4)];
+	r9 = _ZTV17DebugDrawcallback;
+	heap32[(g0)] = r0;
+	r10 = sp + -1136;
+	r11 = (r9 + 8)|0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r12 = r10 >> 2;
+	r9 = (r9 + 32)|0;
+	heap32[(fp+-284)] = r11;
+	heap32[(r12+1)] = r9;
+	r13 = r6 >> 2;
+	heap32[(r12+2)] = r_g0;
+	heap32[(r12+3)] = heap32[(r13)];
+	heap32[(r12+4)] = heap32[(r13+1)];
+	heap32[(r12+5)] = heap32[(r13+2)];
+	r7 = r4 >> 2;
+	heap32[(r12+6)] = heap32[(r13+3)];
+	heap32[(r12+7)] = heap32[(r7)];
+	heap32[(r12+8)] = heap32[(r7+1)];
+	heap32[(r12+9)] = heap32[(r7+2)];
+	heap32[(r12+10)] = heap32[(r7+3)];
+	heap32[(r12+11)] = heap32[(r7+4)];
+	heap32[(r12+12)] = heap32[(r7+5)];
+	heap32[(r12+13)] = heap32[(r7+6)];
+	heap32[(r12+14)] = heap32[(r7+7)];
+	heap32[(r12+15)] = heap32[(r7+8)];
+	heap32[(r12+16)] = heap32[(r7+9)];
+	heap32[(r12+17)] = heap32[(r7+10)];
+	heap32[(r12+18)] = heap32[(r7+11)];
+	heap32[(r12+19)] = heap32[(r7+12)];
+	heap32[(r12+20)] = heap32[(r7+13)];
+	heap32[(r12+21)] = heap32[(r7+14)];
+	heap32[(r12+22)] = heap32[(r7+15)];
+	r7 = heap32[(r5)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+15)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r3 = r10 | 4;
+	r7 = _ZTV31btInternalTriangleIndexCallback;
+	heap32[(fp+-284)] = r11;
+	r8 = _ZTV18btTriangleCallback;
+	r3 = r3 >> 2;
+	r7 = (r7 + 8)|0;
+	heap32[(r12+1)] = r9;
+	r8 = (r8 + 8)|0;
+	heap32[(r3)] = r7;
+	heap32[(fp+-284)] = r8;
+	r3 = heap32[(r5+1)];
+}
+	if(r3 ==3) //_LBB222_37
+{
+	r3 = sp + -1152;
+	r7 = r3 >> 2;
+	heap32[(fp+-288)] = 1566444395;
+	heap32[(r7+1)] = 1566444395;
+	heap32[(r7+2)] = 1566444395;
+	r8 = sp + -1168;
+	heap32[(r7+3)] = 0;
+	r7 = r8 >> 2;
+	heap32[(fp+-292)] = -581039253;
+	heap32[(r7+1)] = -581039253;
+	heap32[(r7+2)] = -581039253;
+	heap32[(r7+3)] = 0;
+	r7 = heap32[(r1)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+4)];
+	r9 = _ZTV17DebugDrawcallback;
+	heap32[(g0)] = r0;
+	r10 = sp + -1264;
+	r11 = (r9 + 8)|0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r12 = r10 >> 2;
+	r9 = (r9 + 32)|0;
+	heap32[(fp+-316)] = r11;
+	heap32[(r12+1)] = r9;
+	r13 = r6 >> 2;
+	heap32[(r12+2)] = r_g0;
+	heap32[(r12+3)] = heap32[(r13)];
+	heap32[(r12+4)] = heap32[(r13+1)];
+	heap32[(r12+5)] = heap32[(r13+2)];
+	r7 = r4 >> 2;
+	heap32[(r12+6)] = heap32[(r13+3)];
+	heap32[(r12+7)] = heap32[(r7)];
+	heap32[(r12+8)] = heap32[(r7+1)];
+	heap32[(r12+9)] = heap32[(r7+2)];
+	heap32[(r12+10)] = heap32[(r7+3)];
+	heap32[(r12+11)] = heap32[(r7+4)];
+	heap32[(r12+12)] = heap32[(r7+5)];
+	heap32[(r12+13)] = heap32[(r7+6)];
+	heap32[(r12+14)] = heap32[(r7+7)];
+	heap32[(r12+15)] = heap32[(r7+8)];
+	heap32[(r12+16)] = heap32[(r7+9)];
+	heap32[(r12+17)] = heap32[(r7+10)];
+	heap32[(r12+18)] = heap32[(r7+11)];
+	heap32[(r12+19)] = heap32[(r7+12)];
+	heap32[(r12+20)] = heap32[(r7+13)];
+	heap32[(r12+21)] = heap32[(r7+14)];
+	heap32[(r12+22)] = heap32[(r7+15)];
+	r7 = heap32[(r5+22)];
+	r13 = r7 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+2)];
+	r14 = (r10 + 4)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r3 = r10 | 4;
+	r7 = _ZTV31btInternalTriangleIndexCallback;
+	heap32[(fp+-316)] = r11;
+	r8 = _ZTV18btTriangleCallback;
+	r3 = r3 >> 2;
+	r7 = (r7 + 8)|0;
+	heap32[(r12+1)] = r9;
+	r8 = (r8 + 8)|0;
+	heap32[(r3)] = r7;
+	heap32[(fp+-316)] = r8;
+	r3 = heap32[(r5+1)];
+}
+	if(r3 >6) //_LBB222_42
+{
+__label__ = 40;
+}
+else{
+	r3 = heap32[(r5)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+22)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0;
+	if(r3 <1) //_LBB222_42
+{
+__label__ = 40;
+}
+else{
+	r3 = 0;
+_52: while(true){
+	r7 = heap32[(r5)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+23)];
+	r8 = sp + -1296;
+	r9 = sp + -1280;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r4 >> 2;
+	r9 = r9 >> 2;
+	f0 = heapFloat[(fp+-320)];
+	f1 = heapFloat[(r7)];
+	f2 = heapFloat[(r9+1)];
+	f3 = heapFloat[(r7+1)];
+	f4 = heapFloat[(r7+4)];
+	f5 = heapFloat[(r7+5)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r9+2)];
+	f9 = heapFloat[(r7+2)];
+	f10 = heapFloat[(r7+8)];
+	f11 = heapFloat[(r7+9)];
+	f12 = heapFloat[(r7+6)];
+	f13 = f4*f0;
+	f14 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f15 = heapFloat[(r7+10)];
+	f0 = f10*f0;
+	f2 = f11*f2;
+	f13 = f13+f14;
+	f14 = f12*f8;
+	f6 = f6+f7;
+	f7 = heapFloat[(r7+12)];
+	f16 = heapFloat[(r7+14)];
+	f17 = heapFloat[(r7+13)];
+	r7 = sp + -1312;
+	f13 = f13+f14;
+	f0 = f0+f2;
+	f2 = f15*f8;
+	f6 = f6+f7;
+	f0 = f0+f2;
+	r9 = r7 >> 2;
+	f2 = f13+f17;
+	heapFloat[(fp+-328)] = f6;
+	f0 = f0+f16;
+	heapFloat[(r9+1)] = f2;
+	heapFloat[(r9+2)] = f0;
+	heap32[(r9+3)] = 0;
+	r8 = r8 >> 2;
+	f0 = heapFloat[(fp+-324)];
+	f2 = heapFloat[(r8+1)];
+	f6 = heapFloat[(r8+2)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f9*f6;
+	f1 = f1+f3;
+	f0 = f10*f0;
+	f2 = f11*f2;
+	f3 = f4+f5;
+	f4 = f12*f6;
+	r8 = sp + -1328;
+	f3 = f3+f4;
+	f0 = f0+f2;
+	f2 = f15*f6;
+	f1 = f1+f7;
+	f0 = f0+f2;
+	r9 = r8 >> 2;
+	f2 = f3+f17;
+	heapFloat[(fp+-332)] = f1;
+	f0 = f0+f16;
+	heapFloat[(r9+1)] = f2;
+	heapFloat[(r9+2)] = f0;
+	heap32[(r9+3)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r10 = r_g0 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r7 = heap32[(r5)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+22)];
+	r3 = (r3 + 1)|0;
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r_g0;
+	if(r7 >r3) //_LBB222_41
+{
+continue _52;
+}
+else{
+__label__ = 40;
+break _41;
+}
+}
+}
+}
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 31:
+	heap32[(g0+3)] = r6;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+break;
+case 40:
+	return;
+break;
+}
+}
+
+function _ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -280;var g0 = i7>>2; // save stack
+	r0 = _ZTV19btSingleRayCallback;
+	r1 = heap32[(fp+1)];
+	r0 = (r0 + 8)|0;
+	r2 = sp + -256;
+	r3 = r1 >> 2;
+	heap32[(fp+-64)] = r0;
+	r0 = r2 >> 2;
+	f0 = heapFloat[(r3)];
+	heapFloat[(r0+9)] = f0;
+	f1 = heapFloat[(r3+1)];
+	heapFloat[(r0+10)] = f1;
+	f2 = heapFloat[(r3+2)];
+	heapFloat[(r0+11)] = f2;
+	r4 = heap32[(fp+2)];
+	f3 = heapFloat[(r3+3)];
+	r3 = r4 >> 2;
+	heapFloat[(r0+12)] = f3;
+	f4 = heapFloat[(r3)];
+	heapFloat[(r0+13)] = f4;
+	f5 = heapFloat[(r3+1)];
+	heapFloat[(r0+14)] = f5;
+	f6 = heapFloat[(r3+2)];
+	heapFloat[(r0+15)] = f6;
+	f7 = heapFloat[(r3+3)];
+	r3 = heap32[(fp)];
+	heapFloat[(r0+16)] = f7;
+	r5 = heap32[(fp+3)];
+	heap32[(r0+53)] = r3;
+	heap32[(r0+54)] = r5;
+	heap32[(r0+17)] = 1065353216;
+	heap32[(r0+18)] = 0;
+	heap32[(r0+19)] = 0;
+	heap32[(r0+20)] = 0;
+	heap32[(r0+21)] = 0;
+	heap32[(r0+22)] = 1065353216;
+	heap32[(r0+23)] = 0;
+	heap32[(r0+24)] = 0;
+	heap32[(r0+25)] = 0;
+	heap32[(r0+26)] = 0;
+	heap32[(r0+27)] = 1065353216;
+	heap32[(r0+28)] = 0;
+	heapFloat[(r0+29)] = f0;
+	heapFloat[(r0+30)] = f1;
+	heapFloat[(r0+31)] = f2;
+	heapFloat[(r0+32)] = f3;
+	heap32[(r0+33)] = 1065353216;
+	heap32[(r0+34)] = 0;
+	heap32[(r0+35)] = 0;
+	heap32[(r0+36)] = 0;
+	heap32[(r0+37)] = 0;
+	heap32[(r0+38)] = 1065353216;
+	heap32[(r0+39)] = 0;
+	heap32[(r0+40)] = 0;
+	heap32[(r0+41)] = 0;
+	heap32[(r0+42)] = 0;
+	heap32[(r0+43)] = 1065353216;
+	heap32[(r0+44)] = 0;
+	heapFloat[(r0+45)] = f4;
+	f0 = f4-f0;
+	heapFloat[(r0+46)] = f5;
+	f1 = f5-f1;
+	heapFloat[(r0+47)] = f6;
+	f2 = f6-f2;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	heapFloat[(r0+48)] = f7;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	f3 =                         1;
+	sqrtf(i7);
+	f4 = f3/f_g0;
+	f0 = f0*f4;
+	f1 = f1*f4;
+	f2 = f2*f4;
+	f4 =                         0;
+	if(f0 !=f4) //_LBB223_2
+{
+	f5 = f3/f0;
+}
+else{
+	f5 =        999999984306749440;
+}
+	heapFloat[(r0+1)] = f5;
+	if(f1 !=f4) //_LBB223_5
+{
+	f6 = f3/f1;
+}
+else{
+	f6 =        999999984306749440;
+}
+	heapFloat[(r0+2)] = f6;
+	if(f2 !=f4) //_LBB223_8
+{
+	f3 = f3/f2;
+}
+else{
+	f3 =        999999984306749440;
+}
+	r5 = f5 < f4;
+	r6 = f6 < f4;
+	r5 = r5 & 1;
+	heapFloat[(r0+3)] = f3;
+	r7 = f3 < f4;
+	r6 = r6 & 1;
+	heap32[(r0+5)] = r5;
+	r5 = r7 & 1;
+	heap32[(r0+6)] = r6;
+	heap32[(r0+7)] = r5;
+	f3 = heapFloat[(r0+14)];
+	f4 = heapFloat[(r0+10)];
+	f5 = heapFloat[(r0+13)];
+	f6 = heapFloat[(r0+9)];
+	f5 = f5-f6;
+	f3 = f3-f4;
+	f4 = heapFloat[(r0+15)];
+	f6 = heapFloat[(r0+11)];
+	f0 = f0*f5;
+	f1 = f1*f3;
+	f3 = f4-f6;
+	f0 = f0+f1;
+	f1 = f2*f3;
+	f0 = f0+f1;
+	r3 = r3 >> 2;
+	heapFloat[(r0+8)] = f0;
+	r0 = heap32[(r3+20)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	r5 = sp + -32;
+	r6 = r5 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+2)] = 0;
+	r7 = sp + -16;
+	heap32[(r6+3)] = 0;
+	r6 = r7 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+2)] = 0;
+	heap32[(r6+3)] = 0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+
+function _ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -136;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	if(r0 !=0) //_LBB224_2
+{
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = r1 >> 2;
+	r5 = heap32[(r4+2)];
+	r6 = 0;
+_3: while(true){
+	if(r5 >r6) //_LBB224_3
+{
+	r7 = heap32[(r4+4)];
+	r8 = r6 << 2;
+	r7 = (r7 + r8)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7)];
+	if(r7 ==r0) //_LBB224_6
+{
+__label__ = 6;
+break _3;
+}
+else{
+	r6 = (r6 + 1)|0;
+}
+}
+else{
+__label__ = 8;
+break _3;
+}
+}
+if (__label__ == 6){
+if(!(r5 ==r6)) //_LBB224_8
+{
+	r0 = _2E_str988;
+	r1 = _2E_str887;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 114;
+	_assert(i7);
+}
+}
+	r6 = heap32[(r4+3)];
+	if(r6 ==r5) //_LBB224_10
+{
+	r7 = 1;
+	r8 = r5 << 1;
+	r8 = r5 == 0 ? r7 : r8;
+if(!(r6 >=r8)) //_LBB224_9
+{
+	if(r8 !=0) //_LBB224_13
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r9 = heap32[(r6)];
+	r10 = r8 << 2;
+	r9 = (r9 + 1)|0;
+	r10 = r10 | 3;
+	heap32[(r6)] = r9;
+	r6 = (r10 + 16)|0;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB224_15
+{
+	r9 = 0;
+	r10 = (r6 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r6 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r6;
+	r6 = r10;
+}
+}
+else{
+	r6 = 0;
+}
+_19: do {
+	if(r5 <1) //_LBB224_18
+{
+	r10 = heap32[(r4+4)];
+}
+else{
+	r9 = 0;
+_22: while(true){
+	r10 = heap32[(r4+4)];
+	r11 = r9 << 2;
+	r12 = (r10 + r11)|0;
+	r12 = r12 >> 2;
+	r11 = (r6 + r11)|0;
+	r12 = heap32[(r12)];
+	r9 = (r9 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r12;
+if(!(r5 !=r9)) //_LBB224_19
+{
+break _19;
+}
+}
+}
+} while(0);
+	if(r10 !=0) //_LBB224_22
+{
+	r9 = heapU8[r1+20];
+	if(r9 !=0) //_LBB224_24
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r9 = heap32[(r5)];
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r5)] = r9;
+	r5 = heap32[(r10+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r4+2)];
+}
+	heap32[(r4+4)] = 0;
+}
+	heap8[r1+20] = r7;
+	heap32[(r4+4)] = r6;
+	heap32[(r4+3)] = r8;
+}
+}
+	r1 = r5 << 2;
+	r5 = heap32[(r4+4)];
+	r1 = (r5 + r1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	r1 = heap32[(r4+2)];
+	r1 = (r1 + 1)|0;
+	r5 = sp + -64;
+	r6 = r0 >> 2;
+	heap32[(r4+2)] = r1;
+	r1 = r5 >> 2;
+	heap32[(fp+-16)] = heap32[(r6+1)];
+	heap32[(r1+1)] = heap32[(r6+2)];
+	heap32[(r1+2)] = heap32[(r6+3)];
+	heap32[(r1+3)] = heap32[(r6+4)];
+	heap32[(r1+4)] = heap32[(r6+5)];
+	heap32[(r1+5)] = heap32[(r6+6)];
+	heap32[(r1+6)] = heap32[(r6+7)];
+	heap32[(r1+7)] = heap32[(r6+8)];
+	heap32[(r1+8)] = heap32[(r6+9)];
+	heap32[(r1+9)] = heap32[(r6+10)];
+	heap32[(r1+10)] = heap32[(r6+11)];
+	heap32[(r1+11)] = heap32[(r6+12)];
+	heap32[(r1+12)] = heap32[(r6+13)];
+	heap32[(r1+13)] = heap32[(r6+14)];
+	heap32[(r1+14)] = heap32[(r6+15)];
+	heap32[(r1+15)] = heap32[(r6+16)];
+	r1 = heap32[(r6+48)];
+	r7 = r1 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+2)];
+	r8 = sp + -80;
+	r9 = sp + -96;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r9;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r1 = heap32[(r4+20)];
+	r5 = r1 >> 2;
+	r7 = heap32[(r6+48)];
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r7 = r7 >> 2;
+	r5 = heap32[(r5+2)];
+	r7 = heap32[(r7+1)];
+	r4 = heap32[(r4+6)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r0;
+	heap32[(g0+5)] = r2;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r4;
+	heap32[(g0+8)] = 0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(r6+47)] = r_g0;
+	return;
+}
+else{
+	r0 = _2E_str786;
+	r1 = _2E_str887;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 111;
+	_assert(i7);
+}
+}
+
+function _ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+47)];
+	r3 = heap32[(fp)];
+if(!(r2 ==0)) //_LBB225_2
+{
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+10)];
+	r7 = heap32[(r4+6)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = heap32[(r4+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+	r4 = heap32[(r4+6)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	heap32[(r1+47)] = 0;
+}
+	r1 = r3 >> 2;
+	r2 = heap32[(r1+2)];
+	r3 = 0;
+_4: while(true){
+	if(r2 >r3) //_LBB225_3
+{
+	r4 = heap32[(r1+4)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r4 !=r0) //_LBB225_5
+{
+	r3 = (r3 + 1)|0;
+continue _4;
+}
+else{
+__label__ = 7;
+break _4;
+}
+}
+else{
+__label__ = 6;
+break _4;
+}
+}
+if (__label__ == 6){
+	r3 = r2;
+}
+if(!(r2 <=r3)) //_LBB225_10
+{
+	r0 = (r2 + -1)|0;
+	r2 = r3 << 2;
+	r3 = heap32[(r1+4)];
+	r0 = r0 << 2;
+	r2 = (r3 + r2)|0;
+	r3 = (r3 + r0)|0;
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r2)];
+	r3 = heap32[(r3)];
+	heap32[(r2)] = r3;
+	r2 = heap32[(r1+4)];
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r4;
+	r0 = heap32[(r1+2)];
+	r0 = (r0 + -1)|0;
+	heap32[(r1+2)] = r0;
+}
+	return;
+}
+
+function _ZN16btCollisionWorld33performDiscreteCollisionDetectionEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = _2E_str1190;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r0 = r1 >> 2;
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+2)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = _2E_str1291;
+	heap32[(g0)] = r2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+20)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+8)];
+	r4 = heap32[(r0+6)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	r2 = _ZN15CProfileManager11CurrentNodeE;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+4)];
+	r5 = (r5 + -1)|0;
+	heap32[(r4+4)] = r5;
+_1: do {
+if(!(r5 !=0)) //_LBB226_6
+{
+	r5 = heap32[(r4+1)];
+	if(r5 !=0) //_LBB226_3
+{
+	r3 = sp + -24;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	r5 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r3 = r3 >> 2;
+	r6 = heap32[(fp+-6)];
+	r7 = heap32[(r5)];
+	r6 = (r6 - r7)|0;
+	r3 = heap32[(r3+1)];
+	r5 = heap32[(r5+1)];
+	r3 = (r3 - r5)|0;
+	r5 = (r6 * 1000000)|0;
+	r3 = (r3 + r5)|0;
+	r5 = heap32[(r4+3)];
+	r3 = (r3 - r5)|0;
+	f0 = uint(r3); //fuitos r3, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r4+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r4+2)] = f0;
+	r3 = heap32[(r4+4)];
+	if(r3 !=0) //_LBB226_6
+{
+break _1;
+}
+else{
+	r3 = heap32[(r2)];
+}
+}
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	heap32[(r2)] = r3;
+}
+} while(0);
+	r3 = heap32[(r0+6)];
+	r4 = _2E_str1392;
+	heap32[(g0)] = r4;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+if(!(r3 ==0)) //_LBB226_8
+{
+	r4 = heap32[(r0+20)];
+	r5 = r3 >> 2;
+	r6 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r6 = heap32[(r6)];
+	r5 = r5 >> 2;
+	r6 = r6 >> 2;
+	r5 = heap32[(r5+8)];
+	r0 = heap32[(r0+6)];
+	r6 = heap32[(r6+9)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r1 = (r1 + 28)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r0 = heap32[(r2)];
+	r1 = r0 >> 2;
+	r3 = heap32[(r1+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r1+4)] = r3;
+_11: do {
+	if(r3 ==0) //_LBB226_10
+{
+	r3 = heap32[(r1+1)];
+	if(r3 !=0) //_LBB226_12
+{
+	r0 = sp + -16;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r0 = r0 >> 2;
+	r4 = heap32[(fp+-4)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r0 = heap32[(r0+1)];
+	r3 = heap32[(r3+1)];
+	r0 = (r0 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r0 = (r0 + r3)|0;
+	r3 = heap32[(r1+3)];
+	r0 = (r0 - r3)|0;
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r1+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r1+2)] = f0;
+	r0 = heap32[(r2)];
+	r1 = heap32[(r1+4)];
+if(!(r1 ==0)) //_LBB226_14
+{
+break _11;
+}
+}
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(r2)] = r0;
+}
+} while(0);
+	r1 = r0 >> 2;
+	r3 = heap32[(r1+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r1+4)] = r3;
+_17: do {
+if(!(r3 !=0)) //_LBB226_21
+{
+	r3 = heap32[(r1+1)];
+	if(r3 !=0) //_LBB226_18
+{
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r0 = r0 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r0 = heap32[(r0+1)];
+	r3 = heap32[(r3+1)];
+	r0 = (r0 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r0 = (r0 + r3)|0;
+	r3 = heap32[(r1+3)];
+	r0 = (r0 - r3)|0;
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r1+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r1+2)] = f0;
+	r0 = heap32[(r1+4)];
+	if(r0 !=0) //_LBB226_21
+{
+break _17;
+}
+else{
+	r0 = heap32[(r2)];
+}
+}
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(r2)] = r0;
+}
+} while(0);
+	return;
+}
+
+function _ZN16btCollisionWorld9serializeEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+8)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(fp)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	_ZN16btCollisionWorld25serializeCollisionObjectsEP12btSerializer(i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN21btSingleSweepCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btSingleSweepCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN21btSingleSweepCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btSingleSweepCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN21btSingleSweepCallback7processEPK17btBroadphaseProxy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+46)];
+	r3 = r2 >> 2;
+	f0 = heapFloat[(r3+1)];
+	f1 =                         0;
+	if(f0 !=f1) //_LBB230_2
+{
+	r4 = heap32[(fp+1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r5 = r4 >> 2;
+	r3 = heap32[(r3+2)];
+	r6 = heap32[(r5+47)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB230_4
+{
+	f0 = heapFloat[(r1+47)];
+	r2 = heap32[(r1+46)];
+	r3 = heap32[(r5+48)];
+	r1 = heap32[(r1+48)];
+	r5 = (r0 + 36)|0;
+	r0 = (r0 + 100)|0;
+	r6 = (r4 + 4)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r3;
+	heap32[(g0+5)] = r6;
+	heap32[(g0+6)] = r2;
+	heapFloat[(g0+7)] = f0;
+	_ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEf(i7);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = 1;
+}
+}
+else{
+	r0 = 0;
+}
+	r0 = r0 & 255;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN19btSingleRayCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV19btSingleRayCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN19btSingleRayCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV19btSingleRayCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN19btSingleRayCallback7processEPK17btBroadphaseProxy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+54)];
+	r3 = r2 >> 2;
+	f0 = heapFloat[(r3+1)];
+	f1 =                         0;
+	if(f0 !=f1) //_LBB233_2
+{
+	r4 = heap32[(fp+1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r5 = r4 >> 2;
+	r3 = heap32[(r3+2)];
+	r6 = heap32[(r5+47)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB233_4
+{
+	r1 = heap32[(r1+54)];
+	r2 = heap32[(r5+48)];
+	r3 = (r0 + 68)|0;
+	r0 = (r0 + 132)|0;
+	r5 = (r4 + 4)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r5;
+	heap32[(g0+5)] = r1;
+	_ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackE(i7);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = 1;
+}
+}
+else{
+	r0 = 0;
+}
+	r0 = r0 & 255;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN16btCollisionWorldD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btCollisionWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+4)];
+	r3 = heap32[(r2+2)];
+	if(r3 >0) //_LBB234_2
+{
+	r3 = 0;
+_3: while(true){
+	r4 = r3 << 2;
+	r1 = (r1 + r4)|0;
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r4 = heap32[(r1+47)];
+if(!(r4 ==0)) //_LBB234_5
+{
+	r5 = heap32[(r2+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+10)];
+	r7 = heap32[(r2+6)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = heap32[(r2+20)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+3)];
+	r7 = heap32[(r2+6)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	heap32[(r1+47)] = 0;
+}
+	r3 = (r3 + 1)|0;
+	r1 = heap32[(r2+4)];
+	r4 = heap32[(r2+2)];
+	if(r4 >r3) //_LBB234_3
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+if(!(r1 ==0)) //_LBB234_10
+{
+	r3 = heapU8[r0+20];
+if(!(r3 ==0)) //_LBB234_9
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	r1 = 1;
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	return;
+}
+
+function _ZN16btCollisionWorld25serializeCollisionObjectsEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+if(!(r1 <1)) //_LBB235_110
+{
+	r1 = heap32[(fp+1)];
+	heap32[(fp+-2)] = r1;
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+4)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+58)];
+if(!(r4 !=1)) //_LBB235_4
+{
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	heap32[(g0)] = r2;
+	r2 = heap32[(fp+-2)];
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+2)];
+if(!(r2 >r1)) //_LBB235_2
+{
+break _3;
+}
+}
+if(!(r2 <1)) //_LBB235_110
+{
+	r1 = 0;
+	r2 = r1;
+	r3 = r1;
+	r4 = r1;
+	r5 = r1;
+	r6 = r1;
+	heap32[(fp+-1)] = r1;
+	r7 = r1;
+	r8 = r1;
+	r9 = r1;
+	r10 = r1;
+	r11 = r1;
+	r12 = r1;
+_10: while(true){
+	r13 = heap32[(r0+4)];
+	r14 = r12 << 2;
+	r13 = (r13 + r14)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+48)];
+	r14 = r13 << 15;
+	r14 = r14 ^ -1;
+	r14 = (r13 + r14)|0;
+	r15 = r14 >> 10;
+	r14 = r15 ^ r14;
+	r14 = (r14 * 9)|0;
+	r15 = r14 >> 6;
+	r14 = r15 ^ r14;
+	r15 = r14 << 11;
+	r15 = r15 ^ -1;
+	r14 = (r14 + r15)|0;
+	r15 = r14 >> 16;
+	r14 = r15 ^ r14;
+	r15 = (r4 + -1)|0;
+	r15 = r14 & r15;
+	r12 = (r12 + 1)|0;
+_12: do {
+	if(uint(r10) <=uint(r15)) //_LBB235_20
+{
+__label__ = 19;
+}
+else{
+	r16 = r15 << 2;
+	r17 = (r8 + r16)|0;
+_14: while(true){
+	r17 = r17 >> 2;
+	r17 = heap32[(r17)];
+	if(r17 ==-1) //_LBB235_14
+{
+__label__ = 13;
+break _14;
+}
+else{
+	r18 = r17 << 3;
+	r18 = (r11 + r18)|0;
+	r18 = r18 >> 2;
+	r18 = heap32[(r18)];
+	if(r13 !=r18) //_LBB235_9
+{
+	r17 = r17 << 2;
+	r17 = (r6 + r17)|0;
+}
+else{
+__label__ = 12;
+break _14;
+}
+}
+}
+if (__label__ == 12){
+	r17 = r17 << 2;
+	r17 = (r3 + r17)|0;
+if(!(r17 ==0)) //_LBB235_14
+{
+__label__ = 89;
+break _12;
+}
+}
+	if(uint(r10) <=uint(r15)) //_LBB235_20
+{
+__label__ = 19;
+}
+else{
+	r16 = (r8 + r16)|0;
+_22: while(true){
+	r16 = r16 >> 2;
+	r16 = heap32[(r16)];
+	if(r16 ==-1) //_LBB235_20
+{
+__label__ = 19;
+break _12;
+}
+else{
+	r17 = r16 << 3;
+	r17 = (r11 + r17)|0;
+	r17 = r17 >> 2;
+	r17 = heap32[(r17)];
+	if(r13 !=r17) //_LBB235_16
+{
+	r16 = r16 << 2;
+	r16 = (r6 + r16)|0;
+}
+else{
+break _22;
+}
+}
+}
+	r14 = r16 << 2;
+	r14 = (r3 + r14)|0;
+	r14 = r14 >> 2;
+	heap32[(r14)] = r13;
+	r16 = r4;
+	r17 = r5;
+__label__ = 88;
+}
+}
+} while(0);
+if (__label__ == 19){
+	if(r4 ==r5) //_LBB235_22
+{
+	r16 = 1;
+	r17 = r5 << 1;
+	r16 = r5 == 0 ? r16 : r17;
+	if(r4 >=r16) //_LBB235_21
+{
+__label__ = 20;
+}
+else{
+	if(r16 !=0) //_LBB235_25
+{
+	r17 = gNumAlignedAllocs;
+	r17 = r17 >> 2;
+	r18 = heap32[(r17)];
+	r19 = r16 << 2;
+	r18 = (r18 + 1)|0;
+	r19 = r19 | 3;
+	heap32[(r17)] = r18;
+	r17 = (r19 + 16)|0;
+	heap32[(g0)] = r17;
+	malloc(i7);
+	r17 = r_g0;
+	if(r17 !=0) //_LBB235_27
+{
+	r18 = 0;
+	r19 = (r17 + 4)|0;
+	r18 = (r18 - r19)|0;
+	r18 = r18 & 15;
+	r18 = (r17 + r18)|0;
+	r19 = (r18 + 4)|0;
+	r18 = r18 >> 2;
+	heap32[(r18)] = r17;
+	r17 = r19;
+}
+}
+else{
+	r17 = 0;
+}
+_37: do {
+if(!(r5 <1)) //_LBB235_31
+{
+	r18 = r17;
+	r19 = r3;
+	r20 = r5;
+_39: while(true){
+	r21 = r19 >> 2;
+	r20 = (r20 + -1)|0;
+	r19 = (r19 + 4)|0;
+	r22 = (r18 + 4)|0;
+	r18 = r18 >> 2;
+	r21 = heap32[(r21)];
+	heap32[(r18)] = r21;
+	r18 = r22;
+if(!(r20 !=0)) //_LBB235_30
+{
+break _37;
+}
+}
+}
+} while(0);
+	if(r3 !=0) //_LBB235_33
+{
+	r18 = gNumAlignedFree;
+	r18 = r18 >> 2;
+	r19 = heap32[(r18)];
+	r19 = (r19 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r18)] = r19;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+	r3 = r17;
+__label__ = 32;
+}
+else{
+	r3 = r17;
+__label__ = 32;
+}
+}
+}
+else{
+__label__ = 20;
+}
+if (__label__ == 20){
+	r16 = r4;
+}
+	r18 = r5 << 2;
+	r19 = (r3 + r18)|0;
+	r17 = (r5 + 1)|0;
+	r19 = r19 >> 2;
+	heap32[(r19)] = r13;
+	if(r1 ==r2) //_LBB235_36
+{
+	r19 = 1;
+	r20 = r2 << 1;
+	r19 = r2 == 0 ? r19 : r20;
+if(!(r1 >=r19)) //_LBB235_35
+{
+	if(r19 !=0) //_LBB235_39
+{
+	r1 = gNumAlignedAllocs;
+	r1 = r1 >> 2;
+	r20 = heap32[(r1)];
+	r21 = r19 << 3;
+	r20 = (r20 + 1)|0;
+	r21 = r21 | 3;
+	heap32[(r1)] = r20;
+	r1 = (r21 + 16)|0;
+	heap32[(g0)] = r1;
+	malloc(i7);
+	r20 = r_g0;
+	if(r20 !=0) //_LBB235_41
+{
+	r1 = 0;
+	r21 = (r20 + 4)|0;
+	r1 = (r1 - r21)|0;
+	r1 = r1 & 15;
+	r1 = (r20 + r1)|0;
+	r21 = (r1 + 4)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r20;
+	r20 = r21;
+}
+}
+else{
+	r20 = 0;
+}
+_56: do {
+if(!(r2 <1)) //_LBB235_45
+{
+	r1 = (r11 + 4)|0;
+	r21 = (r20 + 4)|0;
+	r22 = r2;
+_58: while(true){
+	r23 = r1 >> 2;
+	r24 = heap32[(r23)];
+	r23 = heap32[(r23+-1)];
+	r25 = r21 >> 2;
+	r22 = (r22 + -1)|0;
+	r1 = (r1 + 8)|0;
+	r21 = (r21 + 8)|0;
+	heap32[(r25+-1)] = r23;
+	heap32[(r25)] = r24;
+if(!(r22 !=0)) //_LBB235_44
+{
+break _56;
+}
+}
+}
+} while(0);
+	if(r11 !=0) //_LBB235_47
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r21 = heap32[(r1)];
+	r21 = (r21 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r1)] = r21;
+	r1 = heap32[(r11+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r1 = r19;
+	r11 = r20;
+}
+else{
+	r1 = r19;
+	r11 = r20;
+}
+}
+}
+	r19 = r2 << 3;
+	r19 = (r11 + r19)|0;
+	r2 = (r2 + 1)|0;
+	r19 = r19 >> 2;
+	heap32[(r19)] = r13;
+	if(r4 <r16) //_LBB235_50
+{
+	if(r10 <r16) //_LBB235_52
+{
+_69: do {
+	if(r10 <=r16) //_LBB235_54
+{
+	if(r9 <r16) //_LBB235_56
+{
+	if(r16 !=0) //_LBB235_58
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r9 = heap32[(r4)];
+	r15 = r16 << 2;
+	r9 = (r9 + 1)|0;
+	r15 = r15 | 3;
+	heap32[(r4)] = r9;
+	r4 = (r15 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB235_60
+{
+	r9 = 0;
+	r15 = (r4 + 4)|0;
+	r9 = (r9 - r15)|0;
+	r9 = r9 & 15;
+	r9 = (r4 + r9)|0;
+	r15 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r4;
+	r4 = r15;
+}
+}
+else{
+	r4 = 0;
+}
+_78: do {
+if(!(r10 <1)) //_LBB235_64
+{
+	r9 = r4;
+	r15 = r8;
+	r19 = r10;
+_80: while(true){
+	r20 = r15 >> 2;
+	r19 = (r19 + -1)|0;
+	r15 = (r15 + 4)|0;
+	r21 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	r20 = heap32[(r20)];
+	heap32[(r9)] = r20;
+	r9 = r21;
+if(!(r19 !=0)) //_LBB235_63
+{
+break _78;
+}
+}
+}
+} while(0);
+	if(r8 !=0) //_LBB235_66
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r15 = heap32[(r9)];
+	r15 = (r15 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r9)] = r15;
+	r8 = heap32[(r8+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+	r8 = r4;
+	r9 = r16;
+}
+else{
+	r8 = r4;
+	r9 = r16;
+}
+}
+	r4 = r10;
+_87: while(true){
+	r15 = r4 << 2;
+	r15 = (r8 + r15)|0;
+	r4 = (r4 + 1)|0;
+	r15 = r15 >> 2;
+	heap32[(r15)] = 0;
+if(!(r16 !=r4)) //_LBB235_68
+{
+break _69;
+}
+}
+}
+} while(0);
+_90: do {
+	if(r7 <=r16) //_LBB235_71
+{
+if(!(r7 >=r16)) //_LBB235_70
+{
+	r4 = heap32[(fp+-1)];
+	if(r4 <r16) //_LBB235_74
+{
+	if(r16 !=0) //_LBB235_76
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r15 = heap32[(r4)];
+	r19 = r16 << 2;
+	r15 = (r15 + 1)|0;
+	r19 = r19 | 3;
+	heap32[(r4)] = r15;
+	r4 = (r19 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB235_78
+{
+	r15 = 0;
+	r19 = (r4 + 4)|0;
+	r15 = (r15 - r19)|0;
+	r15 = r15 & 15;
+	r15 = (r4 + r15)|0;
+	r19 = (r15 + 4)|0;
+	r15 = r15 >> 2;
+	heap32[(r15)] = r4;
+	r4 = r19;
+}
+}
+else{
+	r4 = 0;
+}
+_100: do {
+if(!(r7 <1)) //_LBB235_82
+{
+	r15 = r4;
+	r19 = r6;
+	r20 = r7;
+_102: while(true){
+	r21 = r19 >> 2;
+	r20 = (r20 + -1)|0;
+	r19 = (r19 + 4)|0;
+	r22 = (r15 + 4)|0;
+	r15 = r15 >> 2;
+	r21 = heap32[(r21)];
+	heap32[(r15)] = r21;
+	r15 = r22;
+if(!(r20 !=0)) //_LBB235_81
+{
+break _100;
+}
+}
+}
+} while(0);
+if(!(r6 ==0)) //_LBB235_84
+{
+	r15 = gNumAlignedFree;
+	r15 = r15 >> 2;
+	r19 = heap32[(r15)];
+	r19 = (r19 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r15)] = r19;
+	r6 = heap32[(r6+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	if(r7 <r16) //_LBB235_86
+{
+	r6 = r4;
+	heap32[(fp+-1)] = r16;
+}
+else{
+	r6 = r4;
+	heap32[(fp+-1)] = r16;
+break _90;
+}
+}
+_111: while(true){
+	r4 = r7 << 2;
+	r4 = (r6 + r4)|0;
+	r7 = (r7 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = 0;
+if(!(r16 !=r7)) //_LBB235_87
+{
+break _90;
+}
+}
+}
+}
+} while(0);
+_114: do {
+if(!(r16 <1)) //_LBB235_94
+{
+	r4 = r8;
+	r7 = r16;
+_116: while(true){
+	r7 = (r7 + -1)|0;
+	r15 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = -1;
+	r4 = r15;
+if(!(r7 !=0)) //_LBB235_90
+{
+break _116;
+}
+}
+if(!(r16 <1)) //_LBB235_94
+{
+	r4 = r6;
+	r7 = r16;
+_120: while(true){
+	r7 = (r7 + -1)|0;
+	r15 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = -1;
+	r4 = r15;
+if(!(r7 !=0)) //_LBB235_93
+{
+break _114;
+}
+}
+}
+}
+} while(0);
+_123: do {
+	if(r10 >0) //_LBB235_96
+{
+	r4 = (r16 + -1)|0;
+	r7 = 0;
+_125: while(true){
+	r15 = r7 << 3;
+	r15 = (r11 + r15)|0;
+	r15 = r15 >> 2;
+	r15 = heap32[(r15)];
+	r19 = r15 << 15;
+	r19 = r19 ^ -1;
+	r15 = (r15 + r19)|0;
+	r19 = r15 >> 10;
+	r15 = r19 ^ r15;
+	r15 = (r15 * 9)|0;
+	r19 = r15 >> 6;
+	r15 = r19 ^ r15;
+	r19 = r15 << 11;
+	r19 = r19 ^ -1;
+	r15 = (r15 + r19)|0;
+	r19 = r15 >> 16;
+	r15 = r19 ^ r15;
+	r15 = r15 & r4;
+	r15 = r15 << 2;
+	r15 = (r8 + r15)|0;
+	r15 = r15 >> 2;
+	r19 = r7 << 2;
+	r19 = (r6 + r19)|0;
+	r20 = heap32[(r15)];
+	r19 = r19 >> 2;
+	r21 = (r7 + 1)|0;
+	heap32[(r19)] = r20;
+	heap32[(r15)] = r7;
+	r7 = r21;
+	if(r10 ==r21) //_LBB235_95
+{
+break _123;
+}
+}
+}
+} while(0);
+	r7 = r16;
+	r10 = r16;
+}
+	r4 = (r16 + -1)|0;
+	r15 = r14 & r4;
+}
+	r4 = r15 << 2;
+	r4 = (r8 + r4)|0;
+	r4 = r4 >> 2;
+	r14 = (r6 + r18)|0;
+	r14 = r14 >> 2;
+	r15 = heap32[(r4)];
+	heap32[(r14)] = r15;
+	heap32[(r4)] = r5;
+__label__ = 88;
+}
+if (__label__ == 88){
+	r4 = r13 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+14)];
+	heap32[(g0)] = r13;
+	r5 = heap32[(fp+-2)];
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r16;
+	r5 = r17;
+}
+	r13 = heap32[(r0+2)];
+if(!(r13 >r12)) //_LBB235_7
+{
+break _10;
+}
+}
+if(!(r11 ==0)) //_LBB235_104
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r11 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+if(!(r3 ==0)) //_LBB235_106
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r3 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+if(!(r6 ==0)) //_LBB235_108
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r6 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+if(!(r8 ==0)) //_LBB235_110
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r8 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+}
+	return;
+}
+
+function _ZNK11btMatrix3x311getRotationER12btQuaternion(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+5)];
+	f2 = heapFloat[(r1+10)];
+	f3 = f0+f1;
+	f3 = f3+f2;
+	r2 = heap32[(fp+1)];
+	f4 =                         0;
+	if(f3 <=f4) //_LBB236_2
+{
+	if(f0 >=f1) //_LBB236_4
+{
+	r1 = 2;
+	r3 = 0;
+	r1 = f0 < f2 ? r1 : r3;
+}
+else{
+	r1 = 2;
+	r3 = 1;
+	r1 = f1 < f2 ? r1 : r3;
+}
+	r3 = (r1 + 1)|0;
+	r3 = (r3 % 3)|0;
+	r4 = (r1 + 2)|0;
+	r4 = (r4 % 3)|0;
+	r5 = r1 << 4;
+	r6 = r3 << 4;
+	r7 = r4 << 4;
+	r5 = (r0 + r5)|0;
+	r1 = r1 << 2;
+	r6 = (r0 + r6)|0;
+	r3 = r3 << 2;
+	r0 = (r0 + r7)|0;
+	r4 = r4 << 2;
+	r7 = (r5 + r1)|0;
+	r8 = (r6 + r3)|0;
+	r7 = r7 >> 2;
+	r8 = r8 >> 2;
+	r9 = (r0 + r4)|0;
+	r9 = r9 >> 2;
+	f0 = heapFloat[(r7)];
+	f1 = heapFloat[(r8)];
+	f2 = heapFloat[(r9)];
+	f0 = f0-f1;
+	f0 = f0-f2;
+	f1 =                         1;
+	f0 = f0+f1;
+	r7 = sp + -16;
+	heapFloat[(g0)] = f0;
+	r8 = (r7 + r1)|0;
+	f0 =                       0.5;
+	sqrtf(i7);
+	r9 = (r0 + r3)|0;
+	r10 = (r6 + r4)|0;
+	r8 = r8 >> 2;
+	f2 = f_g0*f0;
+	r9 = r9 >> 2;
+	heapFloat[(r8)] = f2;
+	r8 = r10 >> 2;
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r8)];
+	f2 = f2-f3;
+	f0 = f0/f_g0;
+	r6 = (r6 + r1)|0;
+	r8 = (r5 + r3)|0;
+	r9 = r7 >> 2;
+	f1 = f2*f0;
+	r6 = r6 >> 2;
+	heapFloat[(r9+3)] = f1;
+	r8 = r8 >> 2;
+	f1 = heapFloat[(r6)];
+	f2 = heapFloat[(r8)];
+	r3 = (r7 + r3)|0;
+	f1 = f1+f2;
+	r0 = (r0 + r1)|0;
+	r1 = (r5 + r4)|0;
+	r3 = r3 >> 2;
+	f1 = f1*f0;
+	r0 = r0 >> 2;
+	heapFloat[(r3)] = f1;
+	r1 = r1 >> 2;
+	f1 = heapFloat[(r0)];
+	f2 = heapFloat[(r1)];
+	r0 = (r7 + r4)|0;
+	f1 = f1+f2;
+	r0 = r0 >> 2;
+	f0 = f1*f0;
+	heapFloat[(r0)] = f0;
+	f1 = heapFloat[(fp+-4)];
+	f3 = heapFloat[(r9+1)];
+	f0 = heapFloat[(r9+2)];
+	f2 = heapFloat[(r9+3)];
+}
+else{
+	f0 =                         1;
+	f0 = f3+f0;
+	heapFloat[(g0)] = f0;
+	r0 = sp + -16;
+	f0 =                       0.5;
+	sqrtf(i7);
+	f2 = f_g0*f0;
+	r0 = r0 >> 2;
+	heapFloat[(r0+3)] = f2;
+	f3 = heapFloat[(r1+9)];
+	f4 = heapFloat[(r1+6)];
+	f3 = f3-f4;
+	f0 = f0/f_g0;
+	f1 = f3*f0;
+	heapFloat[(fp+-4)] = f1;
+	f3 = heapFloat[(r1+2)];
+	f4 = heapFloat[(r1+8)];
+	f3 = f3-f4;
+	f3 = f3*f0;
+	heapFloat[(r0+1)] = f3;
+	f4 = heapFloat[(r1+4)];
+	f5 = heapFloat[(r1+1)];
+	f4 = f4-f5;
+	f0 = f4*f0;
+	heapFloat[(r0+2)] = f0;
+}
+	r0 = r2 >> 2;
+	heapFloat[(r0)] = f1;
+	heapFloat[(r0+1)] = f3;
+	heapFloat[(r0+2)] = f0;
+	heapFloat[(r0+3)] = f2;
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0E_0v(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1E_0v(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0E_0v(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1E_0v(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -80;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+4)];
+	f1 = heapFloat[(r0+9)];
+	f2 = heapFloat[(r0+6)];
+	f3 = heapFloat[(r0+8)];
+	f4 = heapFloat[(r0+5)];
+	f5 = heapFloat[(r0+10)];
+	f6 = f4*f5;
+	f7 = f2*f1;
+	f8 = f2*f3;
+	f9 = f0*f5;
+	f10 = heapFloat[(r0)];
+	f11 = heapFloat[(r0+1)];
+	f6 = f6-f7;
+	f7 = f8-f9;
+	f8 = f0*f1;
+	f9 = f4*f3;
+	f12 = heapFloat[(r0+2)];
+	f8 = f8-f9;
+	f9 = f10*f6;
+	f13 = f11*f7;
+	f9 = f9+f13;
+	f13 = f12*f8;
+	r0 = heap32[(fp+1)];
+	f14 =                         1;
+	f9 = f9+f13;
+	r0 = r0 >> 2;
+	f9 = f14/f9;
+	f13 = f12*f1;
+	f15 = f11*f5;
+	f5 = f10*f5;
+	f16 = f12*f3;
+	f13 = f13-f15;
+	f5 = f5-f16;
+	f15 = f11*f2;
+	f16 = f12*f4;
+	f12 = f12*f0;
+	f2 = f10*f2;
+	f3 = f11*f3;
+	f1 = f10*f1;
+	f6 = f6*f9;
+	f17 = heapFloat[(r0)];
+	f7 = f7*f9;
+	f18 = heapFloat[(r0+1)];
+	f15 = f15-f16;
+	f2 = f12-f2;
+	f12 = f13*f9;
+	f5 = f5*f9;
+	f1 = f3-f1;
+	f3 = f10*f4;
+	f0 = f11*f0;
+	f4 = f6*f17;
+	f10 = f7*f18;
+	f8 = f8*f9;
+	f11 = heapFloat[(r0+2)];
+	f13 = heapFloat[(r0+8)];
+	f15 = f15*f9;
+	f16 = heapFloat[(r0+4)];
+	f19 = heapFloat[(r0+9)];
+	f2 = f2*f9;
+	f20 = heapFloat[(r0+5)];
+	f0 = f3-f0;
+	f1 = f1*f9;
+	f3 = heapFloat[(r0+10)];
+	f21 = heapFloat[(r0+6)];
+	f22 = f12*f17;
+	f23 = f5*f18;
+	f4 = f4+f10;
+	f10 = f8*f11;
+	f0 = f0*f9;
+	r0 = sp + -48;
+	f9 = f15*f17;
+	f17 = f2*f18;
+	f18 = f22+f23;
+	f22 = f1*f11;
+	f4 = f4+f10;
+	r1 = r0 >> 2;
+	f9 = f9+f17;
+	f10 = f0*f11;
+	f11 = f18+f22;
+	heapFloat[(fp+-12)] = f4;
+	f4 = f6*f16;
+	f17 = f7*f20;
+	f9 = f9+f10;
+	heapFloat[(r1+1)] = f11;
+	heapFloat[(r1+2)] = f9;
+	f9 = f12*f16;
+	f10 = f5*f20;
+	f4 = f4+f17;
+	f11 = f8*f21;
+	f16 = f15*f16;
+	f17 = f2*f20;
+	f9 = f9+f10;
+	f10 = f1*f21;
+	f4 = f4+f11;
+	heap32[(r1+3)] = 0;
+	f11 = f16+f17;
+	f16 = f0*f21;
+	f9 = f9+f10;
+	heapFloat[(r1+4)] = f4;
+	f4 = f6*f13;
+	f6 = f7*f19;
+	f7 = f11+f16;
+	heapFloat[(r1+5)] = f9;
+	heapFloat[(r1+6)] = f7;
+	f7 = f12*f13;
+	f5 = f5*f19;
+	f4 = f4+f6;
+	f6 = f8*f3;
+	f8 = f15*f13;
+	f2 = f2*f19;
+	f5 = f7+f5;
+	f1 = f1*f3;
+	f4 = f4+f6;
+	heap32[(r1+7)] = 0;
+	f2 = f8+f2;
+	f0 = f0*f3;
+	f1 = f5+f1;
+	heapFloat[(r1+8)] = f4;
+	f0 = f2+f0;
+	heapFloat[(r1+9)] = f1;
+	heapFloat[(r1+10)] = f0;
+	heap32[(r1+11)] = 0;
+	r1 = sp + -64;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r0 = r1 >> 2;
+	f0 = heapFloat[(fp+-16)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f5 = heapFloat[(r0+3)];
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 = f5*f5;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+	f4 =                         0;
+	if(f3 !=f4) //_LBB245_2
+{
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	f3 = f14/f3;
+	f0 = f0*f3;
+	f1 = f1*f3;
+	heapFloat[(fp+-16)] = f0;
+	f2 = f2*f3;
+	heapFloat[(r0+1)] = f1;
+	f4 =                        -1;
+	f3 = f5*f3;
+	heapFloat[(r0+2)] = f2;
+	f4 = f3 < f4 ? f4 : f3;
+	heapFloat[(r0+3)] = f3;
+	f3 = f4 > f14 ? f14 : f4;
+	heapFloat[(g0)] = f3;
+	acosf(i7);
+	r0 = r2 >> 2;
+	f3 = f_g0+f_g0;
+	r1 = r1 >> 2;
+	heapFloat[(r0)] = f3;
+	heapFloat[(r1)] = f0;
+	f0 = f0*f0;
+	f3 = f1*f1;
+	heapFloat[(r1+1)] = f1;
+	f0 = f0+f3;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(r1+2)] = f2;
+	heap32[(r1+3)] = 0;
+	f1 =   1.4210854715202004e-014;
+	if(f0 >=f1) //_LBB245_4
+{
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f14/f_g0;
+	f1 = heapFloat[(r1)];
+	f1 = f1*f0;
+	heapFloat[(r1)] = f1;
+	f1 = heapFloat[(r1+1)];
+	f1 = f1*f0;
+	heapFloat[(r1+1)] = f1;
+	f1 = heapFloat[(r1+2)];
+	f0 = f1*f0;
+	heapFloat[(r1+2)] = f0;
+	return;
+}
+else{
+	heap32[(r1)] = 1065353216;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+}
+else{
+	r0 = _2E_str584;
+	r1 = _2E_str685;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 188;
+	_assert(i7);
+}
+}
+
+function _ZNK16btCollisionWorld15convexSweepTestEPK13btConvexShapeRK11btTransformS5_RNS_20ConvexResultCallbackEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+var __label__ = 0;
+	i7 = sp + -528;var g0 = i7>>2; // save stack
+	r0 = _2E_str1089;
+	r1 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	r0 = sp + -112;
+	r1 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = r0 >> 2;
+	heap32[(fp+-28)] = heap32[(r1)];
+	heap32[(r2+1)] = heap32[(r1+1)];
+	heap32[(r2+2)] = heap32[(r1+2)];
+	heap32[(r2+3)] = heap32[(r1+3)];
+	heap32[(r2+4)] = heap32[(r1+4)];
+	heap32[(r2+5)] = heap32[(r1+5)];
+	heap32[(r2+6)] = heap32[(r1+6)];
+	heap32[(r2+7)] = heap32[(r1+7)];
+	heap32[(r2+8)] = heap32[(r1+8)];
+	heap32[(r2+9)] = heap32[(r1+9)];
+	heap32[(r2+10)] = heap32[(r1+10)];
+	heap32[(r2+11)] = heap32[(r1+11)];
+	heap32[(r2+12)] = heap32[(r1+12)];
+	heap32[(r2+13)] = heap32[(r1+13)];
+	r3 = heap32[(fp+3)];
+	heap32[(r2+14)] = heap32[(r1+14)];
+	r4 = sp + -176;
+	r3 = r3 >> 2;
+	heap32[(r2+15)] = heap32[(r1+15)];
+	r2 = r4 >> 2;
+	heap32[(fp+-44)] = heap32[(r3)];
+	heap32[(r2+1)] = heap32[(r3+1)];
+	heap32[(r2+2)] = heap32[(r3+2)];
+	heap32[(r2+3)] = heap32[(r3+3)];
+	heap32[(r2+4)] = heap32[(r3+4)];
+	heap32[(r2+5)] = heap32[(r3+5)];
+	heap32[(r2+6)] = heap32[(r3+6)];
+	heap32[(r2+7)] = heap32[(r3+7)];
+	heap32[(r2+8)] = heap32[(r3+8)];
+	heap32[(r2+9)] = heap32[(r3+9)];
+	heap32[(r2+10)] = heap32[(r3+10)];
+	heap32[(r2+11)] = heap32[(r3+11)];
+	heap32[(r2+12)] = heap32[(r3+12)];
+	heap32[(r2+13)] = heap32[(r3+13)];
+	heap32[(r2+14)] = heap32[(r3+14)];
+	heap32[(r2+15)] = heap32[(r3+15)];
+	r2 = sp + -24;
+	r5 = sp + -28;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r5;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+2)];
+	f1 = heapFloat[(fp+-7)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(fp+-6)];
+	r2 = sp + -424;
+	f3 = f3*f1;
+	r5 = r2 >> 2;
+	f2 = f2*f1;
+	heapFloat[(fp+-106)] = f3;
+	f0 = f0*f1;
+	heapFloat[(r5+1)] = f2;
+	heapFloat[(r5+2)] = f0;
+	r6 = sp + -440;
+	heap32[(r5+3)] = 0;
+	r5 = r6 >> 2;
+	heap32[(fp+-110)] = 0;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	r7 = sp + -504;
+	heap32[(r5+3)] = 0;
+	r5 = r7 >> 2;
+	heap32[(fp+-126)] = 1065353216;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap32[(r5+4)] = 0;
+	heap32[(r5+5)] = 1065353216;
+	heap32[(r5+6)] = 0;
+	heap32[(r5+7)] = 0;
+	heap32[(r5+8)] = 0;
+	heap32[(r5+9)] = 0;
+	heap32[(r5+10)] = 1065353216;
+	heap32[(r5+11)] = 0;
+	heap32[(r5+12)] = 0;
+	heap32[(r5+13)] = 0;
+	heap32[(r5+14)] = 0;
+	heap32[(r5+15)] = 0;
+	r8 = sp + -48;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r8;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r8 = r8 >> 2;
+	f0 = heapFloat[(fp+-12)];
+	f1 = heapFloat[(r8+1)];
+	f2 = heapFloat[(r8+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f5 = heapFloat[(r8+3)];
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 = f5*f5;
+	f6 =                         2;
+	f3 = f3+f4;
+	f3 = f6/f3;
+	f4 = f2*f3;
+	f6 = f1*f3;
+	f7 = f1*f6;
+	f2 = f2*f4;
+	f8 = f7+f2;
+	f9 =                         1;
+	f10 = f0*f6;
+	f11 = f5*f4;
+	f8 = f9-f8;
+	f12 = f0*f4;
+	f6 = f5*f6;
+	f13 = f10-f11;
+	heapFloat[(fp+-126)] = f8;
+	f3 = f0*f3;
+	f8 = f12+f6;
+	heapFloat[(r5+1)] = f13;
+	f0 = f0*f3;
+	heapFloat[(r5+2)] = f8;
+	f2 = f0+f2;
+	f8 = f10+f11;
+	heap32[(r5+3)] = 0;
+	f1 = f1*f4;
+	f3 = f5*f3;
+	f2 = f9-f2;
+	heapFloat[(r5+4)] = f8;
+	f4 = f1-f3;
+	heapFloat[(r5+5)] = f2;
+	heapFloat[(r5+6)] = f4;
+	f2 = f12-f6;
+	heap32[(r5+7)] = 0;
+	f0 = f0+f7;
+	f1 = f1+f3;
+	heapFloat[(r5+8)] = f2;
+	f0 = f9-f0;
+	heapFloat[(r5+9)] = f1;
+	heapFloat[(r5+10)] = f0;
+	heap32[(r5+11)] = 0;
+	r5 = heap32[(fp+1)];
+	r8 = sp + -192;
+	r9 = sp + -208;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r8;
+	heap32[(g0+5)] = r9;
+	r2 = _ZTV21btSingleSweepCallback;
+	r6 = sp + -408;
+	r2 = (r2 + 8)|0;
+	_ZNK16btCollisionShape21calculateTemporalAabbERK11btTransformRK9btVector3S5_fRS3_S6_(i7);
+	r7 = r6 >> 2;
+	heap32[(fp+-102)] = r2;
+	heap32[(r7+9)] = heap32[(r1)];
+	heap32[(r7+10)] = heap32[(r1+1)];
+	heap32[(r7+11)] = heap32[(r1+2)];
+	heap32[(r7+12)] = heap32[(r1+3)];
+	heap32[(r7+13)] = heap32[(r1+4)];
+	heap32[(r7+14)] = heap32[(r1+5)];
+	heap32[(r7+15)] = heap32[(r1+6)];
+	heap32[(r7+16)] = heap32[(r1+7)];
+	heap32[(r7+17)] = heap32[(r1+8)];
+	heap32[(r7+18)] = heap32[(r1+9)];
+	heap32[(r7+19)] = heap32[(r1+10)];
+	heap32[(r7+20)] = heap32[(r1+11)];
+	f0 = heapFloat[(r1+12)];
+	heapFloat[(r7+21)] = f0;
+	f1 = heapFloat[(r1+13)];
+	heapFloat[(r7+22)] = f1;
+	f2 = heapFloat[(r1+14)];
+	heapFloat[(r7+23)] = f2;
+	heap32[(r7+24)] = heap32[(r1+15)];
+	heap32[(r7+25)] = heap32[(r3)];
+	heap32[(r7+26)] = heap32[(r3+1)];
+	heap32[(r7+27)] = heap32[(r3+2)];
+	heap32[(r7+28)] = heap32[(r3+3)];
+	heap32[(r7+29)] = heap32[(r3+4)];
+	heap32[(r7+30)] = heap32[(r3+5)];
+	heap32[(r7+31)] = heap32[(r3+6)];
+	heap32[(r7+32)] = heap32[(r3+7)];
+	heap32[(r7+33)] = heap32[(r3+8)];
+	heap32[(r7+34)] = heap32[(r3+9)];
+	heap32[(r7+35)] = heap32[(r3+10)];
+	heap32[(r7+36)] = heap32[(r3+11)];
+	f3 = heapFloat[(r3+12)];
+	heapFloat[(r7+37)] = f3;
+	f4 = heapFloat[(r3+13)];
+	heapFloat[(r7+38)] = f4;
+	f5 = heapFloat[(r3+14)];
+	heapFloat[(r7+39)] = f5;
+	r1 = heap32[(fp)];
+	heap32[(r7+40)] = heap32[(r3+15)];
+	r3 = heap32[(fp+4)];
+	heap32[(r7+45)] = r1;
+	heap32[(r7+46)] = r3;
+	f0 = f3-f0;
+	f1 = f4-f1;
+	heap32[(r7+47)] = heap32[(fp+5)];
+	f2 = f5-f2;
+	heap32[(r7+48)] = r5;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f9/f_g0;
+	f4 = f0*f3;
+	f5 = f2*f3;
+	f3 = f1*f3;
+	f6 =                         0;
+	if(f4 !=f6) //_LBB246_2
+{
+	f7 = f9/f4;
+}
+else{
+	f7 =        999999984306749440;
+}
+	heapFloat[(r7+1)] = f7;
+	if(f3 !=f6) //_LBB246_5
+{
+	f8 = f9/f3;
+}
+else{
+	f8 =        999999984306749440;
+}
+	heapFloat[(r7+2)] = f8;
+	if(f5 !=f6) //_LBB246_8
+{
+	f9 = f9/f5;
+}
+else{
+	f9 =        999999984306749440;
+}
+	r3 = f7 < f6;
+	r5 = f8 < f6;
+	r3 = r3 & 1;
+	heapFloat[(r7+3)] = f9;
+	r10 = f9 < f6;
+	f0 = f4*f0;
+	f1 = f3*f1;
+	r5 = r5 & 1;
+	heap32[(r7+5)] = r3;
+	f0 = f0+f1;
+	f1 = f5*f2;
+	r3 = r10 & 1;
+	heap32[(r7+6)] = r5;
+	f0 = f0+f1;
+	heap32[(r7+7)] = r3;
+	r1 = r1 >> 2;
+	heapFloat[(r7+8)] = f0;
+	r1 = heap32[(r1+20)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	r0 = (r0 + 48)|0;
+	r4 = (r4 + 48)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r8;
+	heap32[(g0+5)] = r9;
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r0 = r0 >> 2;
+	heap32[(fp+-102)] = r2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_13: do {
+if(!(r3 !=0)) //_LBB246_15
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB246_12
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB246_15
+{
+break _13;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -1472;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r6 = heap32[(fp+3)];
+	r7 = heap32[(fp+5)];
+	r8 = heap32[(fp+6)];
+	f0 = heapFloat[(fp+7)];
+_1: do {
+	if(r2 >19) //_LBB247_6
+{
+	r9 = (r2 + -21)|0;
+	if(uint(r9) >uint(8)) //_LBB247_30
+{
+	if(r2 !=31) //_LBB247_5
+{
+break _1;
+}
+else{
+	r0 = _2E_str1493;
+	heap32[(g0)] = r0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r0 = heap32[(r1+4)];
+if(!(r0 <1)) //_LBB247_34
+{
+	r0 = 0;
+_8: while(true){
+	r2 = (r0 * 20)|0;
+	r9 = heap32[(r1+6)];
+	r2 = r2 << 2;
+	r2 = (r9 + r2)|0;
+	r2 = r2 >> 2;
+	r9 = r7 >> 2;
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r2+4)];
+	f4 = heapFloat[(r9+1)];
+	f5 = heapFloat[(r2+1)];
+	f6 = heapFloat[(r2+5)];
+	f7 = f1*f2;
+	f8 = f3*f4;
+	f9 = heapFloat[(r2+8)];
+	f10 = heapFloat[(r9+2)];
+	f11 = heapFloat[(r9+8)];
+	f12 = heapFloat[(r2+2)];
+	f13 = heapFloat[(r9+4)];
+	f14 = heapFloat[(r2+12)];
+	f15 = heapFloat[(r9+9)];
+	f16 = heapFloat[(r2+6)];
+	f17 = heapFloat[(r9+5)];
+	f18 = heapFloat[(r2+13)];
+	f19 = heapFloat[(r2+9)];
+	f20 = heapFloat[(r9+10)];
+	f21 = heapFloat[(r2+10)];
+	f22 = heapFloat[(r9+6)];
+	f23 = heapFloat[(r2+14)];
+	f24 = f5*f2;
+	f25 = f6*f4;
+	f7 = f7+f8;
+	f8 = f9*f10;
+	r2 = heap32[(r2+16)];
+	f26 = heapFloat[(r9+14)];
+	f27 = heapFloat[(r9+13)];
+	f28 = heapFloat[(r9+12)];
+	r9 = sp + -1408;
+	f29 = f12*f2;
+	f30 = f16*f4;
+	f24 = f24+f25;
+	f25 = f19*f10;
+	f7 = f7+f8;
+	r10 = r9 >> 2;
+	f8 = f29+f30;
+	f29 = f21*f10;
+	f24 = f24+f25;
+	heapFloat[(fp+-352)] = f7;
+	f7 = f1*f13;
+	f25 = f3*f17;
+	f8 = f8+f29;
+	heapFloat[(r10+1)] = f24;
+	heapFloat[(r10+2)] = f8;
+	f8 = f5*f13;
+	f24 = f6*f17;
+	f7 = f7+f25;
+	f25 = f9*f22;
+	f29 = f12*f13;
+	f30 = f16*f17;
+	f8 = f8+f24;
+	f24 = f19*f22;
+	f7 = f7+f25;
+	heap32[(r10+3)] = 0;
+	f25 = f29+f30;
+	f29 = f21*f22;
+	f8 = f8+f24;
+	heapFloat[(r10+4)] = f7;
+	f1 = f1*f11;
+	f3 = f3*f15;
+	f7 = f25+f29;
+	heapFloat[(r10+5)] = f8;
+	heapFloat[(r10+6)] = f7;
+	f5 = f5*f11;
+	f6 = f6*f15;
+	f1 = f1+f3;
+	f3 = f9*f20;
+	f7 = f12*f11;
+	f8 = f16*f15;
+	f5 = f5+f6;
+	f6 = f19*f20;
+	f1 = f1+f3;
+	heap32[(r10+7)] = 0;
+	f2 = f2*f14;
+	f3 = f4*f18;
+	f4 = f7+f8;
+	f7 = f21*f20;
+	f5 = f5+f6;
+	heapFloat[(r10+8)] = f1;
+	f1 = f13*f14;
+	f6 = f17*f18;
+	f2 = f2+f3;
+	f3 = f10*f23;
+	f4 = f4+f7;
+	heapFloat[(r10+9)] = f5;
+	f2 = f2+f3;
+	heapFloat[(r10+10)] = f4;
+	f3 = f11*f14;
+	f4 = f15*f18;
+	f1 = f1+f6;
+	f5 = f22*f23;
+	f1 = f1+f5;
+	f3 = f3+f4;
+	f4 = f20*f23;
+	f2 = f2+f28;
+	heap32[(r10+11)] = 0;
+	f3 = f3+f4;
+	f1 = f1+f27;
+	heapFloat[(r10+12)] = f2;
+	f2 = f3+f26;
+	heapFloat[(r10+13)] = f1;
+	heapFloat[(r10+14)] = f2;
+	r11 = r6 >> 2;
+	heap32[(r10+15)] = 0;
+	r10 = heap32[(r11+48)];
+	r12 = 1;
+	heap32[(r11+48)] = r2;
+	r13 = _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder;
+	r14 = -1;
+	heap16[(sp+-1424)>>1] = r12;
+	r12 = sp + -1432;
+	heap16[(sp+-1422)>>1] = r14;
+	r13 = (r13 + 8)|0;
+	r14 = r12 >> 2;
+	heap32[(fp+-358)] = r13;
+	heap32[(r14+3)] = r8;
+	r15 = r8 >> 2;
+	heap32[(r14+4)] = r0;
+	heap32[(r14+1)] = heap32[(r15+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r9;
+	heap32[(g0+6)] = r12;
+	heapFloat[(g0+7)] = f0;
+	_ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEf(i7);
+	r0 = (r0 + 1)|0;
+	heap32[(r11+48)] = r10;
+	heap32[(fp+-358)] = r13;
+	r2 = heap32[(r1+4)];
+if(!(r2 >r0)) //_LBB247_33
+{
+break _8;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+	if(r3 !=0) //_LBB247_5
+{
+break _1;
+}
+else{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB247_37
+{
+	r1 = sp + -24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-6)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB247_5
+{
+break _1;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+	return;
+}
+}
+}
+else{
+	if(r2 !=21) //_LBB247_11
+{
+	r2 = r5 >> 2;
+	r9 = r7 >> 2;
+	f0 = heapFloat[(r9)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r9+4)];
+	f3 = heapFloat[(r2+4)];
+	r10 = r4 >> 2;
+	f4 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2+5)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r9+8)];
+	f9 = heapFloat[(r2+8)];
+	f10 = heapFloat[(r9+2)];
+	f11 = heapFloat[(r2+2)];
+	f12 = heapFloat[(r9+1)];
+	f13 = heapFloat[(r2+12)];
+	f14 = heapFloat[(r10+12)];
+	f15 = heapFloat[(r9+6)];
+	f16 = heapFloat[(r2+6)];
+	f17 = heapFloat[(r9+5)];
+	f18 = heapFloat[(r2+13)];
+	f19 = heapFloat[(r10+13)];
+	f20 = heapFloat[(r9+13)];
+	f21 = heapFloat[(r2+10)];
+	f22 = heapFloat[(r9+10)];
+	f23 = heapFloat[(r2+9)];
+	f24 = heapFloat[(r9+9)];
+	f25 = heapFloat[(r2+14)];
+	heapFloat[(fp+-360)] = f25;
+	f26 = heapFloat[(r10+14)];
+	f27 = heapFloat[(r9+14)];
+	f28 = heapFloat[(r9+12)];
+	heapFloat[(fp+-359)] = f28;
+	f29 = f4*f0;
+	f30 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	r2 = sp + -1056;
+	f25 = f11*f0;
+	f28 = f16*f2;
+	f29 = f29+f30;
+	f30 = f23*f8;
+	f6 = f6+f7;
+	r9 = r2 >> 2;
+	f7 = f25+f28;
+	f25 = f21*f8;
+	f28 = f29+f30;
+	heapFloat[(fp+-264)] = f6;
+	f6 = f1*f12;
+	f29 = f3*f17;
+	f7 = f7+f25;
+	heapFloat[(r9+1)] = f28;
+	heapFloat[(r9+2)] = f7;
+	f7 = f4*f12;
+	f25 = f5*f17;
+	f6 = f6+f29;
+	f28 = f9*f24;
+	f29 = f11*f12;
+	f30 = f16*f17;
+	f7 = f7+f25;
+	f25 = f23*f24;
+	f6 = f6+f28;
+	heap32[(r9+3)] = 0;
+	f28 = f29+f30;
+	f29 = f21*f24;
+	f7 = f7+f25;
+	heapFloat[(r9+4)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f15;
+	f6 = f28+f29;
+	heapFloat[(r9+5)] = f7;
+	heapFloat[(r9+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f15;
+	f1 = f1+f3;
+	f3 = f9*f22;
+	f6 = f11*f10;
+	f7 = f16*f15;
+	f4 = f4+f5;
+	f5 = f23*f22;
+	f1 = f1+f3;
+	heap32[(r9+7)] = 0;
+	f3 = f6+f7;
+	f6 = f21*f22;
+	f4 = f4+f5;
+	heapFloat[(r9+8)] = f1;
+	f1 = f3+f6;
+	heapFloat[(r9+9)] = f4;
+	heapFloat[(r9+10)] = f1;
+	heap32[(r9+11)] = 0;
+	heap32[(r9+12)] = 0;
+	heap32[(r9+13)] = 0;
+	heap32[(r9+14)] = 0;
+	heap32[(r9+15)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r9 = sp + -1280;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r7;
+	heapFloat[(g0+5)] = f_g0;
+	r4 = _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0;
+	_ZN28btTriangleConvexcastCallbackC2EPK13btConvexShapeRK11btTransformS5_S5_f(i7);
+	r4 = (r4 + 8)|0;
+	r5 = r9 >> 2;
+	heap32[(fp+-320)] = r4;
+	heap32[(r5+52)] = r8;
+	heap32[(r5+53)] = r6;
+	r4 = r8 >> 2;
+	heap32[(r5+54)] = r0;
+	r6 = r3 >> 2;
+	heap32[(r5+50)] = heap32[(r4+1)];
+	r4 = heap32[(r6)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	f28 = heapFloat[(fp+-359)];
+	f1 = -f28;
+	r5 = sp + -1296;
+	r6 = sp + -1312;
+	f3 = f0*f14;
+	f4 = f2*f19;
+	f5 = f0*f1;
+	f6 = f2*f20;
+	f3 = f3+f4;
+	f4 = f8*f26;
+	f5 = f5-f6;
+	f6 = f8*f27;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	f7 = f12*f14;
+	f9 = f17*f19;
+	f11 = f12*f1;
+	f16 = f17*f20;
+	f3 = f3+f4;
+	f4 = f5-f6;
+	f5 = f10*f14;
+	f6 = f15*f19;
+	f1 = f10*f1;
+	f14 = f15*f20;
+	f7 = f7+f9;
+	f9 = f24*f26;
+	f11 = f11-f16;
+	f16 = f24*f27;
+	f3 = f3+f4;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r2 = sp + -1328;
+	f0 = f0*f13;
+	f2 = f2*f18;
+	f10 = f10*f13;
+	f15 = f15*f18;
+	f12 = f12*f13;
+	f13 = f17*f18;
+	f5 = f5+f6;
+	f6 = f22*f26;
+	f1 = f1-f14;
+	f14 = f22*f27;
+	f7 = f7+f9;
+	f9 = f11-f16;
+	f7 = f7+f9;
+	f0 = f0+f2;
+	f25 = heapFloat[(fp+-360)];
+	f2 = f8*f25;
+	f8 = f10+f15;
+	f10 = f22*f25;
+	f11 = f12+f13;
+	f12 = f24*f25;
+	r3 = r2 >> 2;
+	heapFloat[(fp+-332)] = f3;
+	f5 = f5+f6;
+	f1 = f1-f14;
+	f0 = f0+f2;
+	f2 = f8+f10;
+	f6 = f11+f12;
+	f5 = f5+f1;
+	heapFloat[(r3+1)] = f7;
+	f0 = f0+f4;
+	f1 = f2+f1;
+	f2 = f6+f9;
+	heapFloat[(r3+2)] = f5;
+	heap32[(r3+3)] = 0;
+	if(f0 <f3) //_LBB247_13
+{
+	heapFloat[(fp+-332)] = f0;
+	f4 = f0;
+}
+else{
+	f4 = f3;
+}
+	if(f2 <f7) //_LBB247_16
+{
+	heapFloat[(r3+1)] = f2;
+	f6 = f2;
+}
+else{
+	f6 = f7;
+}
+	if(f1 <f5) //_LBB247_19
+{
+	heapFloat[(r3+2)] = f1;
+	f8 = f1;
+}
+else{
+	f8 = f5;
+}
+	r4 = sp + -1344;
+	r7 = r4 >> 2;
+	heapFloat[(fp+-336)] = f3;
+	heapFloat[(r7+1)] = f7;
+	heapFloat[(r7+2)] = f5;
+	heap32[(r7+3)] = 0;
+	if(f3 <f0) //_LBB247_22
+{
+	heapFloat[(fp+-336)] = f0;
+	f3 = f0;
+}
+	if(f7 <f2) //_LBB247_25
+{
+	heapFloat[(r7+1)] = f2;
+	f7 = f2;
+}
+	if(f5 <f1) //_LBB247_28
+{
+	heapFloat[(r7+2)] = f1;
+	f5 = f1;
+}
+	f0 = heapFloat[(fp+-324)];
+	f0 = f4+f0;
+	r5 = r5 >> 2;
+	heapFloat[(fp+-332)] = f0;
+	f0 = heapFloat[(r5+1)];
+	f0 = f6+f0;
+	heapFloat[(r3+1)] = f0;
+	f0 = heapFloat[(r5+2)];
+	f0 = f8+f0;
+	heapFloat[(r3+2)] = f0;
+	f0 = heapFloat[(fp+-328)];
+	f0 = f3+f0;
+	r3 = r6 >> 2;
+	heapFloat[(fp+-336)] = f0;
+	f0 = heapFloat[(r3+1)];
+	f0 = f7+f0;
+	heapFloat[(r7+1)] = f0;
+	f0 = heapFloat[(r3+2)];
+	f0 = f5+f0;
+	heapFloat[(r7+2)] = f0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+15)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+else{
+	r2 = r7 >> 2;
+	r9 = r4 >> 2;
+	f0 = heapFloat[(r2+12)];
+	f0 = -f0;
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r9+12)];
+	f3 = heapFloat[(r2+4)];
+	f4 = heapFloat[(r2+13)];
+	f5 = heapFloat[(r9+13)];
+	f6 = heapFloat[(r2+1)];
+	f7 = heapFloat[(r2+5)];
+	f8 = f1*f2;
+	f9 = f3*f5;
+	f10 = f1*f0;
+	f11 = f3*f4;
+	f12 = heapFloat[(r2+8)];
+	f13 = heapFloat[(r2+14)];
+	f14 = heapFloat[(r9+14)];
+	f15 = heapFloat[(r2+9)];
+	f16 = heapFloat[(r2+2)];
+	f17 = heapFloat[(r2+6)];
+	f18 = f6*f2;
+	f19 = f7*f5;
+	f20 = f6*f0;
+	f21 = f7*f4;
+	f8 = f8+f9;
+	f9 = f12*f14;
+	f10 = f10-f11;
+	f11 = f12*f13;
+	f22 = heapFloat[(r2+10)];
+	f2 = f16*f2;
+	f5 = f17*f5;
+	f0 = f16*f0;
+	f4 = f17*f4;
+	f18 = f18+f19;
+	f19 = f15*f14;
+	f20 = f20-f21;
+	f21 = f15*f13;
+	f8 = f8+f9;
+	f9 = f10-f11;
+	r2 = sp + -656;
+	f2 = f2+f5;
+	f5 = f22*f14;
+	f0 = f0-f4;
+	f4 = f22*f13;
+	f10 = f18+f19;
+	f11 = f20-f21;
+	f8 = f8+f9;
+	r9 = r2 >> 2;
+	f2 = f2+f5;
+	f0 = f0-f4;
+	f4 = f10+f11;
+	heapFloat[(fp+-164)] = f8;
+	f2 = f2+f0;
+	heapFloat[(r9+1)] = f4;
+	heapFloat[(r9+2)] = f2;
+	r10 = r5 >> 2;
+	heap32[(r9+3)] = 0;
+	f2 = heapFloat[(r10+12)];
+	f4 = heapFloat[(r10+13)];
+	f5 = heapFloat[(r10+14)];
+	f8 = f1*f2;
+	f10 = f3*f4;
+	f13 = f6*f2;
+	f14 = f7*f4;
+	f8 = f8+f10;
+	f10 = f12*f5;
+	f8 = f8+f10;
+	f2 = f16*f2;
+	f4 = f17*f4;
+	f10 = f13+f14;
+	f13 = f15*f5;
+	r9 = sp + -672;
+	f10 = f10+f13;
+	f2 = f2+f4;
+	f4 = f22*f5;
+	f5 = f8+f9;
+	f2 = f2+f4;
+	r11 = r9 >> 2;
+	f4 = f10+f11;
+	heapFloat[(fp+-168)] = f5;
+	f0 = f2+f0;
+	heapFloat[(r11+1)] = f4;
+	heapFloat[(r11+2)] = f0;
+	heap32[(r11+3)] = 0;
+	f0 = heapFloat[(r10)];
+	f2 = heapFloat[(r10+4)];
+	f4 = heapFloat[(r10+1)];
+	f5 = heapFloat[(r10+5)];
+	f8 = heapFloat[(r10+8)];
+	f9 = f0*f1;
+	f10 = f2*f3;
+	f11 = heapFloat[(r10+2)];
+	f13 = heapFloat[(r10+6)];
+	f14 = heapFloat[(r10+10)];
+	f18 = heapFloat[(r10+9)];
+	f19 = f4*f1;
+	f20 = f5*f3;
+	f9 = f9+f10;
+	f10 = f8*f12;
+	r10 = sp + -736;
+	f1 = f11*f1;
+	f3 = f13*f3;
+	f19 = f19+f20;
+	f20 = f18*f12;
+	f9 = f9+f10;
+	r11 = r10 >> 2;
+	f1 = f1+f3;
+	f3 = f14*f12;
+	f10 = f19+f20;
+	heapFloat[(fp+-184)] = f9;
+	f9 = f0*f6;
+	f12 = f2*f7;
+	f1 = f1+f3;
+	heapFloat[(r11+1)] = f10;
+	heapFloat[(r11+2)] = f1;
+	f1 = f4*f6;
+	f3 = f5*f7;
+	f9 = f9+f12;
+	f10 = f8*f15;
+	f6 = f11*f6;
+	f7 = f13*f7;
+	f1 = f1+f3;
+	f3 = f18*f15;
+	f9 = f9+f10;
+	heap32[(r11+3)] = 0;
+	f6 = f6+f7;
+	f7 = f14*f15;
+	f1 = f1+f3;
+	heapFloat[(r11+4)] = f9;
+	f0 = f0*f16;
+	f2 = f2*f17;
+	f3 = f6+f7;
+	heapFloat[(r11+5)] = f1;
+	heapFloat[(r11+6)] = f3;
+	f1 = f4*f16;
+	f3 = f5*f17;
+	f0 = f0+f2;
+	f2 = f8*f22;
+	f4 = f11*f16;
+	f5 = f13*f17;
+	f1 = f1+f3;
+	f3 = f18*f22;
+	f0 = f0+f2;
+	heap32[(r11+7)] = 0;
+	f2 = f4+f5;
+	f4 = f14*f22;
+	f1 = f1+f3;
+	heapFloat[(r11+8)] = f0;
+	f0 = f2+f4;
+	heapFloat[(r11+9)] = f1;
+	heapFloat[(r11+10)] = f0;
+	heap32[(r11+11)] = 0;
+	heap32[(r11+12)] = 0;
+	heap32[(r11+13)] = 0;
+	heap32[(r11+14)] = 0;
+	heap32[(r11+15)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r11 = sp + -960;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r7;
+	heapFloat[(g0+5)] = f_g0;
+	r4 = _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback;
+	_ZN28btTriangleConvexcastCallbackC2EPK13btConvexShapeRK11btTransformS5_S5_f(i7);
+	r4 = (r4 + 8)|0;
+	r5 = r11 >> 2;
+	heap32[(fp+-240)] = r4;
+	heap32[(r5+52)] = r8;
+	heap32[(r5+53)] = r6;
+	r4 = r8 >> 2;
+	heap32[(r5+54)] = r0;
+	r0 = r3 >> 2;
+	heap32[(r5+50)] = heap32[(r4+1)];
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	r4 = sp + -976;
+	r5 = sp + -992;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = _ZTVZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback;
+	r3 = sp + -16;
+	r6 = heap32[(r1+12)];
+	r0 = (r0 + 8)|0;
+	r7 = r3 >> 2;
+	heap32[(fp+-4)] = r0;
+	heap32[(r7+1)] = r6;
+	heap32[(r7+2)] = r11;
+	r0 = heap32[(r1+13)];
+	r1 = heapU8[r0+60];
+	if(r1 ==0) //_LBB247_10
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	_ZNK14btQuantizedBvh27walkStacklessTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(i7);
+	return;
+}
+else{
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+14)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r1;
+	_ZNK14btQuantizedBvh36walkStacklessQuantizedTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(i7);
+	return;
+}
+}
+}
+}
+else{
+	r1 = _ZTVN12btConvexCast10CastResultE;
+	r2 = sp + -200;
+	r1 = (r1 + 8)|0;
+	r9 = r2 >> 2;
+	heap32[(fp+-50)] = r1;
+	heap32[(r9+42)] = 0;
+	r1 = sp + -560;
+	r10 = r8 >> 2;
+	heapFloat[(r9+43)] = f0;
+	r11 = r1 >> 2;
+	heap32[(r9+41)] = heap32[(r10+1)];
+	r12 = _ZTV30btGjkEpaPenetrationDepthSolver;
+	r13 = 0;
+	heap32[(r11+77)] = 953267991;
+	r11 = _ZTV27btContinuousConvexCollision;
+	r12 = (r12 + 8)|0;
+	heap8[sp+-228] = r13;
+	r13 = sp + -592;
+	r11 = (r11 + 8)|0;
+	heap32[(fp+-142)] = r12;
+	r12 = r13 >> 2;
+	heap32[(fp+-148)] = r11;
+	r11 = sp + -568;
+	heap32[(r12+1)] = r1;
+	heap32[(r12+2)] = r11;
+	heap32[(r12+3)] = r3;
+	heap32[(r12+4)] = r0;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r2;
+	_ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB247_5
+{
+	f0 = heapFloat[(r9+33)];
+	f1 = heapFloat[(r9+34)];
+	f2 = heapFloat[(r9+35)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	f1 =   9.9999997473787516e-005;
+if(!(f0 <=f1)) //_LBB247_5
+{
+	f1 = heapFloat[(r9+41)];
+	f2 = heapFloat[(r10+1)];
+if(!(f1 >=f2)) //_LBB247_5
+{
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f2 = heapFloat[(r9+33)];
+	f0 = f1/f_g0;
+	f1 = f2*f0;
+	heapFloat[(r9+33)] = f1;
+	f2 = heapFloat[(r9+34)];
+	f2 = f2*f0;
+	heapFloat[(r9+34)] = f2;
+	f3 = heapFloat[(r9+35)];
+	f0 = f3*f0;
+	heapFloat[(r9+35)] = f0;
+	r0 = sp + -640;
+	f3 = heapFloat[(r9+41)];
+	r1 = r0 >> 2;
+	heap32[(fp+-160)] = r6;
+	heap32[(r1+1)] = 0;
+	heapFloat[(r1+2)] = f1;
+	heapFloat[(r1+3)] = f2;
+	heapFloat[(r1+4)] = f0;
+	heap32[(r1+5)] = heap32[(r9+36)];
+	heap32[(r1+6)] = heap32[(r9+37)];
+	heap32[(r1+7)] = heap32[(r9+38)];
+	heap32[(r1+8)] = heap32[(r9+39)];
+	heap32[(r1+9)] = heap32[(r9+40)];
+	heapFloat[(r1+10)] = f3;
+	r1 = heap32[(r10)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + -1120;var g0 = i7>>2; // save stack
+	r0 = sp + -104;
+	r1 = r0 >> 2;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 1065353216;
+	heap32[(r1+4)] = 1065353216;
+	r2 = _ZTV13btSphereShape;
+	heap32[(r1+5)] = 1065353216;
+	r2 = (r2 + 8)|0;
+	heap32[(r1+6)] = 0;
+	heap32[(fp+-26)] = r2;
+	heap32[(r1+1)] = 8;
+	r2 = heap32[(fp+3)];
+	heap32[(r1+7)] = 0;
+	r3 = r2 >> 2;
+	heap32[(r1+11)] = 0;
+	r1 = heap32[(r3+1)];
+	r4 = heap32[(fp)];
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+2)];
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+5)];
+	if(r1 >19) //_LBB248_6
+{
+	r0 = (r1 + -21)|0;
+	if(uint(r0) >uint(8)) //_LBB248_25
+{
+if(!(r1 !=31)) //_LBB248_29
+{
+	r0 = heap32[(r3+4)];
+if(!(r0 <1)) //_LBB248_29
+{
+	r0 = 0;
+_8: while(true){
+	r1 = (r0 * 20)|0;
+	r2 = heap32[(r3+6)];
+	r1 = r1 << 2;
+	r1 = (r2 + r1)|0;
+	r1 = r1 >> 2;
+	r2 = r7 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r1+4)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r1+5)];
+	f6 = f0*f1;
+	f7 = f2*f3;
+	f8 = heapFloat[(r1+8)];
+	f9 = heapFloat[(r2+2)];
+	f10 = heapFloat[(r2+8)];
+	f11 = heapFloat[(r1+2)];
+	f12 = heapFloat[(r2+4)];
+	f13 = heapFloat[(r1+12)];
+	f14 = heapFloat[(r2+9)];
+	f15 = heapFloat[(r1+6)];
+	f16 = heapFloat[(r2+5)];
+	f17 = heapFloat[(r1+13)];
+	f18 = heapFloat[(r1+9)];
+	f19 = heapFloat[(r2+10)];
+	f20 = heapFloat[(r1+10)];
+	f21 = heapFloat[(r2+6)];
+	f22 = heapFloat[(r1+14)];
+	f23 = f4*f1;
+	f24 = f5*f3;
+	f6 = f6+f7;
+	f7 = f8*f9;
+	r1 = heap32[(r1+16)];
+	f25 = heapFloat[(r2+14)];
+	f26 = heapFloat[(r2+13)];
+	f27 = heapFloat[(r2+12)];
+	r2 = sp + -1056;
+	f28 = f11*f1;
+	f29 = f15*f3;
+	f23 = f23+f24;
+	f24 = f18*f9;
+	f6 = f6+f7;
+	r9 = r2 >> 2;
+	f7 = f28+f29;
+	f28 = f20*f9;
+	f23 = f23+f24;
+	heapFloat[(fp+-264)] = f6;
+	f6 = f0*f12;
+	f24 = f2*f16;
+	f7 = f7+f28;
+	heapFloat[(r9+1)] = f23;
+	heapFloat[(r9+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f8*f21;
+	f28 = f11*f12;
+	f29 = f15*f16;
+	f7 = f7+f23;
+	f23 = f18*f21;
+	f6 = f6+f24;
+	heap32[(r9+3)] = 0;
+	f24 = f28+f29;
+	f28 = f20*f21;
+	f7 = f7+f23;
+	heapFloat[(r9+4)] = f6;
+	f0 = f0*f10;
+	f2 = f2*f14;
+	f6 = f24+f28;
+	heapFloat[(r9+5)] = f7;
+	heapFloat[(r9+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f6 = f11*f10;
+	f7 = f15*f14;
+	f4 = f4+f5;
+	f5 = f18*f19;
+	f0 = f0+f2;
+	heap32[(r9+7)] = 0;
+	f1 = f1*f13;
+	f2 = f3*f17;
+	f3 = f6+f7;
+	f6 = f20*f19;
+	f4 = f4+f5;
+	heapFloat[(r9+8)] = f0;
+	f0 = f12*f13;
+	f5 = f16*f17;
+	f1 = f1+f2;
+	f2 = f9*f22;
+	f3 = f3+f6;
+	heapFloat[(r9+9)] = f4;
+	f1 = f1+f2;
+	heapFloat[(r9+10)] = f3;
+	f2 = f10*f13;
+	f3 = f14*f17;
+	f0 = f0+f5;
+	f4 = f21*f22;
+	f0 = f0+f4;
+	f2 = f2+f3;
+	f3 = f19*f22;
+	f1 = f1+f27;
+	heap32[(r9+11)] = 0;
+	f2 = f2+f3;
+	f0 = f0+f26;
+	heapFloat[(r9+12)] = f1;
+	f1 = f2+f25;
+	heapFloat[(r9+13)] = f0;
+	heapFloat[(r9+14)] = f1;
+	r10 = r6 >> 2;
+	heap32[(r9+15)] = 0;
+	r9 = sp + -1088;
+	r11 = heap32[(r10+48)];
+	r12 = r9 >> 2;
+	heap32[(r10+48)] = r1;
+	r13 = 1;
+	heap32[(r12+2)] = 0;
+	r14 = -1;
+	heap16[(sp+-1076)>>1] = r13;
+	heap16[(sp+-1074)>>1] = r14;
+	r13 = _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2;
+	heap32[(r12+4)] = 0;
+	r13 = (r13 + 8)|0;
+	heap32[(fp+-272)] = r13;
+	heap32[(r12+5)] = r8;
+	r14 = r8 >> 2;
+	heap32[(r12+6)] = r0;
+	heap32[(r12+1)] = heap32[(r14+1)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r9;
+	_ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackE(i7);
+	r0 = (r0 + 1)|0;
+	heap32[(r10+48)] = r11;
+	heap32[(fp+-272)] = r13;
+	r1 = heap32[(r3+4)];
+if(!(r1 >r0)) //_LBB248_28
+{
+break _8;
+}
+}
+}
+}
+	return;
+}
+else{
+	if(r1 !=21) //_LBB248_12
+{
+	r1 = r7 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r1+12)];
+	f1 = heapFloat[(r1+13)];
+	f2 = heapFloat[(r1+4)];
+	f3 = heapFloat[(r4+13)];
+	f4 = heapFloat[(r1)];
+	f5 = -f0;
+	f6 = heapFloat[(r4+12)];
+	f7 = heapFloat[(r1+5)];
+	f8 = heapFloat[(r1+1)];
+	f9 = f4*f6;
+	f10 = f2*f3;
+	f11 = f4*f5;
+	f12 = f2*f1;
+	f13 = heapFloat[(r1+14)];
+	f14 = heapFloat[(r1+8)];
+	f15 = heapFloat[(r4+14)];
+	r4 = r5 >> 2;
+	f16 = heapFloat[(r1+9)];
+	f17 = heapFloat[(r1+6)];
+	f18 = heapFloat[(r1+2)];
+	r5 = r8 >> 2;
+	f9 = f9+f10;
+	f10 = f14*f15;
+	f11 = f11-f12;
+	f12 = f14*f13;
+	f19 = f8*f6;
+	f20 = f7*f3;
+	f21 = f8*f5;
+	f22 = f7*f1;
+	f23 = heapFloat[(r4+12)];
+	f24 = heapFloat[(r4+13)];
+	f25 = heapFloat[(r1+10)];
+	f26 = heapFloat[(r4+14)];
+	r4 = sp + -960;
+	r7 = heap32[(r5+4)];
+	f9 = f9+f10;
+	f10 = f11-f12;
+	f6 = f18*f6;
+	f3 = f17*f3;
+	f11 = f19+f20;
+	f12 = f16*f15;
+	f5 = f18*f5;
+	f19 = f17*f1;
+	f20 = f21-f22;
+	f21 = f16*f13;
+	f9 = f9+f10;
+	f3 = f6+f3;
+	f6 = f25*f15;
+	f11 = f11+f12;
+	f12 = f20-f21;
+	r0 = r4 >> 2;
+	f5 = f5-f19;
+	f15 = f25*f13;
+	f11 = f11+f12;
+	heapFloat[(r0+1)] = f9;
+	f19 = f4*f23;
+	f20 = f2*f24;
+	f3 = f3+f6;
+	f5 = f5-f15;
+	f3 = f3+f5;
+	heapFloat[(r0+2)] = f11;
+	f6 = f19+f20;
+	f15 = f14*f26;
+	f19 = f8*f23;
+	f20 = f7*f24;
+	f6 = f6+f15;
+	heapFloat[(r0+3)] = f3;
+	f15 = f18*f23;
+	f21 = f17*f24;
+	f19 = f19+f20;
+	f20 = f16*f26;
+	f6 = f6+f10;
+	f10 = f19+f20;
+	heap32[(r0+4)] = 0;
+	f15 = f15+f21;
+	f19 = f25*f26;
+	f15 = f15+f19;
+	f10 = f10+f12;
+	heapFloat[(r0+5)] = f6;
+	f5 = f15+f5;
+	heapFloat[(r0+6)] = f10;
+	heapFloat[(r0+7)] = f5;
+	r9 = _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0;
+	heap32[(r0+8)] = 0;
+	r9 = (r9 + 8)|0;
+	heap32[(r0+9)] = r7;
+	heap32[(fp+-240)] = r9;
+	heap32[(r0+11)] = r8;
+	heap32[(r0+12)] = r6;
+	heap32[(r0+13)] = r2;
+	heapFloat[(r0+14)] = f4;
+	heapFloat[(r0+15)] = f8;
+	heapFloat[(r0+16)] = f18;
+	heap32[(r0+17)] = heap32[(r1+3)];
+	heapFloat[(r0+18)] = f2;
+	heapFloat[(r0+19)] = f7;
+	heapFloat[(r0+20)] = f17;
+	heap32[(r0+21)] = heap32[(r1+7)];
+	heapFloat[(r0+22)] = f14;
+	heapFloat[(r0+23)] = f16;
+	heapFloat[(r0+24)] = f25;
+	heap32[(r0+25)] = heap32[(r1+11)];
+	heapFloat[(r0+26)] = f0;
+	heapFloat[(r0+27)] = f1;
+	heapFloat[(r0+28)] = f13;
+	heap32[(r0+29)] = heap32[(r1+15)];
+	r1 = sp + -976;
+	heap32[(r0+10)] = heap32[(r5+1)];
+	r5 = r1 >> 2;
+	heapFloat[(fp+-244)] = f9;
+	heapFloat[(r5+1)] = f11;
+	heapFloat[(r5+2)] = f3;
+	heap32[(r5+3)] = 0;
+if(!(f6 >=f9)) //_LBB248_14
+{
+	heapFloat[(fp+-244)] = f6;
+}
+if(!(f10 >=f11)) //_LBB248_16
+{
+	heapFloat[(r5+1)] = f10;
+}
+if(!(f5 >=f3)) //_LBB248_18
+{
+	heapFloat[(r5+2)] = f5;
+}
+	r5 = sp + -992;
+	r6 = r5 >> 2;
+	heapFloat[(fp+-248)] = f9;
+	heapFloat[(r6+1)] = f11;
+	heapFloat[(r6+2)] = f3;
+	heap32[(r6+3)] = 0;
+if(!(f9 >=f6)) //_LBB248_20
+{
+	heapFloat[(fp+-248)] = f6;
+}
+if(!(f11 >=f10)) //_LBB248_22
+{
+	heapFloat[(r6+1)] = f10;
+}
+if(!(f3 >=f5)) //_LBB248_24
+{
+	heapFloat[(r6+2)] = f5;
+}
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+15)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r5;
+	r1 = _ZTV18btTriangleCallback;
+	r1 = (r1 + 8)|0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(fp+-240)] = r1;
+	return;
+}
+else{
+	r1 = r7 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r1+12)];
+	f1 = heapFloat[(r1+13)];
+	f2 = heapFloat[(r1+4)];
+	f3 = heapFloat[(r4+13)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r4+12)];
+	f6 = -f0;
+	f7 = heapFloat[(r1+5)];
+	f8 = heapFloat[(r1+1)];
+	f9 = heapFloat[(r1+14)];
+	f10 = heapFloat[(r1+8)];
+	f11 = heapFloat[(r4+14)];
+	f12 = f4*f5;
+	f13 = f2*f3;
+	f14 = f4*f6;
+	f15 = f2*f1;
+	f16 = heapFloat[(r1+9)];
+	f17 = heapFloat[(r1+6)];
+	f18 = heapFloat[(r1+2)];
+	f19 = f8*f5;
+	f20 = f7*f3;
+	f21 = f8*f6;
+	f22 = f7*f1;
+	f12 = f12+f13;
+	f13 = f10*f11;
+	f14 = f14-f15;
+	f15 = f10*f9;
+	f23 = heapFloat[(r1+10)];
+	f5 = f18*f5;
+	f3 = f17*f3;
+	f6 = f18*f6;
+	f24 = f17*f1;
+	f19 = f19+f20;
+	f20 = f16*f11;
+	f21 = f21-f22;
+	f22 = f16*f9;
+	f12 = f12+f13;
+	f13 = f14-f15;
+	r4 = sp + -704;
+	f12 = f12+f13;
+	f3 = f5+f3;
+	f5 = f23*f11;
+	f6 = f6-f24;
+	f11 = f23*f9;
+	f14 = f19+f20;
+	f15 = f21-f22;
+	r7 = r4 >> 2;
+	heapFloat[(fp+-176)] = f12;
+	f14 = f14+f15;
+	f3 = f3+f5;
+	f5 = f6-f11;
+	heapFloat[(r7+1)] = f14;
+	f3 = f3+f5;
+	heapFloat[(r7+2)] = f3;
+	r5 = r5 >> 2;
+	heap32[(r7+3)] = 0;
+	f6 = heapFloat[(r5+12)];
+	f11 = heapFloat[(r5+13)];
+	f19 = heapFloat[(r5+14)];
+	f20 = f4*f6;
+	f21 = f2*f11;
+	f22 = f8*f6;
+	f24 = f7*f11;
+	f20 = f20+f21;
+	f21 = f10*f19;
+	f20 = f20+f21;
+	f6 = f18*f6;
+	f11 = f17*f11;
+	f21 = f22+f24;
+	f22 = f16*f19;
+	r5 = sp + -720;
+	f21 = f21+f22;
+	f13 = f20+f13;
+	f6 = f6+f11;
+	f11 = f23*f19;
+	f6 = f6+f11;
+	r7 = r5 >> 2;
+	heapFloat[(fp+-180)] = f13;
+	f11 = f21+f15;
+	heapFloat[(r7+1)] = f11;
+	f5 = f6+f5;
+	heapFloat[(r7+2)] = f5;
+	r0 = sp + -840;
+	r9 = r8 >> 2;
+	heap32[(r7+3)] = 0;
+	r7 = r0 >> 2;
+	r10 = heap32[(r9+4)];
+	heapFloat[(r7+1)] = f12;
+	heapFloat[(r7+2)] = f14;
+	heapFloat[(r7+3)] = f3;
+	heap32[(r7+4)] = 0;
+	heapFloat[(r7+5)] = f13;
+	heapFloat[(r7+6)] = f11;
+	heapFloat[(r7+7)] = f5;
+	r11 = _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback;
+	heap32[(r7+8)] = 0;
+	r11 = (r11 + 8)|0;
+	heap32[(r7+9)] = r10;
+	heap32[(fp+-210)] = r11;
+	heap32[(r7+11)] = r8;
+	heap32[(r7+12)] = r6;
+	heap32[(r7+13)] = r2;
+	heapFloat[(r7+14)] = f4;
+	heapFloat[(r7+15)] = f8;
+	heapFloat[(r7+16)] = f18;
+	heap32[(r7+17)] = heap32[(r1+3)];
+	heapFloat[(r7+18)] = f2;
+	heapFloat[(r7+19)] = f7;
+	heapFloat[(r7+20)] = f17;
+	heap32[(r7+21)] = heap32[(r1+7)];
+	heapFloat[(r7+22)] = f10;
+	heapFloat[(r7+23)] = f16;
+	heapFloat[(r7+24)] = f23;
+	heap32[(r7+25)] = heap32[(r1+11)];
+	heapFloat[(r7+26)] = f0;
+	heapFloat[(r7+27)] = f1;
+	heapFloat[(r7+28)] = f9;
+	heap32[(r7+29)] = heap32[(r1+15)];
+	r1 = _ZTVZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	heap32[(r7+10)] = heap32[(r9+1)];
+	r2 = sp + -48;
+	r6 = heap32[(r3+12)];
+	r1 = (r1 + 8)|0;
+	r7 = r2 >> 2;
+	heap32[(fp+-12)] = r1;
+	heap32[(r7+1)] = r6;
+	heap32[(r7+2)] = r0;
+	r1 = heap32[(r3+13)];
+	r3 = sp + -32;
+	r6 = r3 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+2)] = 0;
+	r7 = sp + -16;
+	heap32[(r6+3)] = 0;
+	r6 = r7 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+2)] = 0;
+	heap32[(r6+3)] = 0;
+	r6 = heapU8[r1+60];
+	if(r6 ==0) //_LBB248_10
+{
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r3;
+	_ZNK14btQuantizedBvh27walkStacklessTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(i7);
+}
+else{
+	r6 = r1 >> 2;
+	r6 = heap32[(r6+14)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r3;
+	heap32[(g0+6)] = r6;
+	_ZNK14btQuantizedBvh36walkStacklessQuantizedTreeAgainstRayEP21btNodeOverlapCallbackRK9btVector3S4_S4_S4_ii(i7);
+}
+	r1 = _ZTV18btTriangleCallback;
+	r1 = (r1 + 8)|0;
+	heap32[(fp+-210)] = r1;
+	return;
+}
+}
+}
+else{
+	r1 = _ZTVN12btConvexCast10CastResultE;
+	r3 = sp + -280;
+	r1 = (r1 + 8)|0;
+	r9 = r3 >> 2;
+	heap32[(fp+-70)] = r1;
+	heap32[(r9+42)] = 0;
+	r1 = sp + -640;
+	r10 = r8 >> 2;
+	heap32[(r9+43)] = 0;
+	r11 = r1 >> 2;
+	heap32[(r9+41)] = heap32[(r10+1)];
+	r12 = _ZTV22btSubsimplexConvexCast;
+	r13 = 0;
+	heap32[(r11+77)] = 953267991;
+	r11 = sp + -656;
+	r12 = (r12 + 8)|0;
+	heap8[sp+-308] = r13;
+	r13 = r11 >> 2;
+	heap32[(fp+-164)] = r12;
+	heap32[(r13+1)] = r1;
+	heap32[(r13+2)] = r0;
+	heap32[(r13+3)] = r2;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r3;
+	_ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r1 = r_g0;
+if(!(r1 ==0)) //_LBB248_5
+{
+	f0 = heapFloat[(r9+33)];
+	f1 = heapFloat[(r9+34)];
+	f2 = heapFloat[(r9+35)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 =   9.9999997473787516e-005;
+if(!(f3 <=f4)) //_LBB248_5
+{
+	f3 = heapFloat[(r9+41)];
+	f4 = heapFloat[(r10+1)];
+if(!(f3 >=f4)) //_LBB248_5
+{
+	r1 = r4 >> 2;
+	f4 = heapFloat[(r1+4)];
+	f5 = heapFloat[(r1)];
+	f6 = heapFloat[(r1+5)];
+	f7 = heapFloat[(r1+1)];
+	f8 = heapFloat[(r1+8)];
+	f9 = heapFloat[(r1+9)];
+	f4 = f4*f0;
+	f6 = f6*f1;
+	f10 = heapFloat[(r1+6)];
+	f11 = heapFloat[(r1+2)];
+	f5 = f5*f0;
+	f7 = f7*f1;
+	f12 = heapFloat[(r1+10)];
+	f0 = f8*f0;
+	f1 = f9*f1;
+	f4 = f4+f6;
+	f6 = f10*f2;
+	f5 = f5+f7;
+	f7 = f11*f2;
+	f4 = f4+f6;
+	f5 = f5+f7;
+	f0 = f0+f1;
+	f1 = f12*f2;
+	f0 = f0+f1;
+	f1 = f5*f5;
+	f2 = f4*f4;
+	heap32[(r9+36)] = 0;
+	f1 = f1+f2;
+	f2 = f0*f0;
+	f1 = f1+f2;
+	heapFloat[(g0)] = f1;
+	f1 =                         1;
+	sqrtf(i7);
+	f1 = f1/f_g0;
+	f2 = f5*f1;
+	f4 = f4*f1;
+	heapFloat[(r9+33)] = f2;
+	f0 = f0*f1;
+	heapFloat[(r9+34)] = f4;
+	r1 = sp + -688;
+	heapFloat[(r9+35)] = f0;
+	r2 = r1 >> 2;
+	heap32[(fp+-172)] = r6;
+	heap32[(r2+1)] = 0;
+	heapFloat[(r2+2)] = f2;
+	heapFloat[(r2+3)] = f4;
+	heapFloat[(r2+4)] = f0;
+	heap32[(r2+5)] = 0;
+	heapFloat[(r2+6)] = f3;
+	r2 = heap32[(r10)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+}
+}
+	r1 = _ZTV12btConvexCast;
+	r1 = (r1 + 8)|0;
+	heap32[(fp+-164)] = r1;
+	return;
+}
+}
+
+function _ZN22btCompoundLeafCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22btCompoundLeafCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN22btCompoundLeafCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22btCompoundLeafCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN22btCompoundLeafCallback7ProcessEPK10btDbvtNode(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -136;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(fp+1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+48)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+9)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+6)];
+	r5 = (r4 * 80)|0;
+	r6 = heap32[(r1+4)];
+	r2 = (r2 + r5)|0;
+	r5 = r6 >> 2;
+	r2 = r2 >> 2;
+	r5 = heap32[(r5+5)];
+	r2 = heap32[(r2+16)];
+if(!(r5 ==0)) //_LBB251_3
+{
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+12)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = r_g0 & 2;
+if(!(r5 ==0)) //_LBB251_3
+{
+	r5 = heap32[(r1+1)];
+	r6 = sp + -112;
+	r5 = r5 >> 2;
+	r7 = r6 >> 2;
+	heap32[(fp+-28)] = heap32[(r5+1)];
+	heap32[(r7+1)] = heap32[(r5+2)];
+	heap32[(r7+2)] = heap32[(r5+3)];
+	heap32[(r7+3)] = heap32[(r5+4)];
+	heap32[(r7+4)] = heap32[(r5+5)];
+	heap32[(r7+5)] = heap32[(r5+6)];
+	heap32[(r7+6)] = heap32[(r5+7)];
+	heap32[(r7+7)] = heap32[(r5+8)];
+	heap32[(r7+8)] = heap32[(r5+9)];
+	heap32[(r7+9)] = heap32[(r5+10)];
+	heap32[(r7+10)] = heap32[(r5+11)];
+	heap32[(r7+11)] = heap32[(r5+12)];
+	heap32[(r7+12)] = heap32[(r5+13)];
+	heap32[(r7+13)] = heap32[(r5+14)];
+	heap32[(r7+14)] = heap32[(r5+15)];
+	heap32[(r7+15)] = heap32[(r5+16)];
+	r5 = (r3 + 16)|0;
+	r7 = sp + -32;
+	r8 = sp + -48;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 0;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r8;
+	_Z15btTransformAabbRK9btVector3S1_fRK11btTransformRS_S5_(i7);
+	r1 = heap32[(r1+4)];
+	r1 = r1 >> 2;
+	r3 = heap32[(r1+5)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+13)];
+	r5 = sp + -16;
+	r6 = r5 >> 2;
+	heap32[(fp+-4)] = 1065353216;
+	heap32[(r6+1)] = 0;
+	heap32[(r6+2)] = 0;
+	heap32[(r6+3)] = 0;
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	_ZN22btCompoundLeafCallback17ProcessChildShapeEP16btCollisionShapei(i7);
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+3)];
+if(!(r1 <1)) //_LBB252_5
+{
+	r1 = heap32[(fp+1)];
+	r2 = 0;
+_3: while(true){
+	r3 = heap32[(r0+5)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+if(!(r3 ==0)) //_LBB252_4
+{
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r0+3)];
+	if(r3 >r2) //_LBB252_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+28];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = r1 == 0 ? r2 : r3;
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+48)];
+	r7 = r6 >> 2;
+	r8 = heap32[(r7+1)];
+	if(r8 ==31) //_LBB253_2
+{
+	r0 = r0 >> 2;
+	r8 = heap32[(r0+3)];
+_3: do {
+	if(r8 >0) //_LBB253_4
+{
+	r9 = heap32[(fp+3)];
+	r10 = heap32[(fp+4)];
+	r1 = r1 == 0 ? r3 : r2;
+	r2 = 0;
+	f0 =                         1;
+_5: while(true){
+	r3 = (r2 * 20)|0;
+	r11 = heap32[(r7+6)];
+	r3 = r3 << 2;
+	r3 = (r11 + r3)|0;
+	r3 = r3 >> 2;
+	f1 = heapFloat[(r3)];
+	f2 = heapFloat[(r5+1)];
+	f3 = heapFloat[(r3+4)];
+	f4 = heapFloat[(r5+2)];
+	f5 = heapFloat[(r3+1)];
+	f6 = heapFloat[(r3+5)];
+	f7 = f1*f2;
+	f8 = f3*f4;
+	f9 = heapFloat[(r3+8)];
+	f10 = heapFloat[(r5+3)];
+	f11 = heapFloat[(r5+10)];
+	f12 = heapFloat[(r3+13)];
+	f13 = heapFloat[(r5+6)];
+	f14 = heapFloat[(r3+6)];
+	f15 = heapFloat[(r5+9)];
+	f16 = heapFloat[(r3+12)];
+	f17 = heapFloat[(r5+5)];
+	f18 = heapFloat[(r3+2)];
+	f19 = heapFloat[(r3+14)];
+	f20 = heapFloat[(r5+11)];
+	f21 = heapFloat[(r3+10)];
+	f22 = heapFloat[(r5+7)];
+	f23 = heapFloat[(r3+9)];
+	r3 = heap32[(r3+16)];
+	f24 = f5*f2;
+	f25 = f6*f4;
+	f7 = f7+f8;
+	f8 = f9*f10;
+	f26 = heapFloat[(r5+16)];
+	heapFloat[(fp+-1)] = f26;
+	f27 = heapFloat[(r5+15)];
+	f28 = heapFloat[(r5+14)];
+	f29 = heapFloat[(r5+13)];
+	f26 = heapFloat[(r5+12)];
+	heapFloat[(fp+-2)] = f26;
+	f26 = heapFloat[(r5+8)];
+	heapFloat[(fp+-3)] = f26;
+	f26 = heapFloat[(r5+4)];
+	heapFloat[(fp+-4)] = f26;
+	f30 = f18*f2;
+	f26 = f14*f4;
+	f24 = f24+f25;
+	f25 = f23*f10;
+	f7 = f7+f8;
+	f8 = f30+f26;
+	f26 = f21*f10;
+	f24 = f24+f25;
+	heapFloat[(r5+1)] = f7;
+	f7 = f1*f17;
+	f25 = f3*f13;
+	f8 = f8+f26;
+	heapFloat[(r5+2)] = f24;
+	heapFloat[(r5+3)] = f8;
+	f8 = f5*f17;
+	f24 = f6*f13;
+	f7 = f7+f25;
+	f25 = f9*f22;
+	f26 = f18*f17;
+	f30 = f14*f13;
+	f8 = f8+f24;
+	f24 = f23*f22;
+	f7 = f7+f25;
+	heap32[(r5+4)] = 0;
+	f25 = f26+f30;
+	f26 = f21*f22;
+	f8 = f8+f24;
+	heapFloat[(r5+5)] = f7;
+	f1 = f1*f15;
+	f3 = f3*f11;
+	f7 = f25+f26;
+	heapFloat[(r5+6)] = f8;
+	heapFloat[(r5+7)] = f7;
+	f5 = f5*f15;
+	f6 = f6*f11;
+	f1 = f1+f3;
+	f3 = f9*f20;
+	f7 = f18*f15;
+	f8 = f14*f11;
+	f5 = f5+f6;
+	f6 = f23*f20;
+	f1 = f1+f3;
+	heap32[(r5+8)] = 0;
+	f3 = f2*f16;
+	f9 = f4*f12;
+	f7 = f7+f8;
+	f8 = f21*f20;
+	f5 = f5+f6;
+	heapFloat[(r5+9)] = f1;
+	f1 = f17*f16;
+	f6 = f13*f12;
+	f3 = f3+f9;
+	f9 = f10*f19;
+	f7 = f7+f8;
+	heapFloat[(r5+10)] = f5;
+	f3 = f3+f9;
+	heapFloat[(r5+11)] = f7;
+	f5 = f15*f16;
+	f7 = f11*f12;
+	f1 = f1+f6;
+	f6 = f22*f19;
+	f1 = f1+f6;
+	f5 = f5+f7;
+	f6 = f20*f19;
+	f3 = f3+f29;
+	heap32[(r5+12)] = 0;
+	f5 = f5+f6;
+	f1 = f1+f28;
+	heapFloat[(r5+13)] = f3;
+	f3 = f5+f27;
+	heapFloat[(r5+14)] = f1;
+	heapFloat[(r5+15)] = f3;
+	heap32[(r5+16)] = 0;
+	heap32[(r5+48)] = r3;
+	r3 = heap32[(r0+5)];
+	r11 = r2 << 2;
+	r3 = (r3 + r11)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r11 = r3 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+3)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(r5+48)] = r6;
+	heapFloat[(r5+1)] = f2;
+	heapFloat[(r5+2)] = f4;
+	heapFloat[(r5+3)] = f10;
+	f26 = heapFloat[(fp+-4)];
+	heapFloat[(r5+4)] = f26;
+	heapFloat[(r5+5)] = f17;
+	heapFloat[(r5+6)] = f13;
+	heapFloat[(r5+7)] = f22;
+	f26 = heapFloat[(fp+-3)];
+	heapFloat[(r5+8)] = f26;
+	heapFloat[(r5+9)] = f15;
+	heapFloat[(r5+10)] = f11;
+	heapFloat[(r5+11)] = f20;
+	f26 = heapFloat[(fp+-2)];
+	heapFloat[(r5+12)] = f26;
+	heapFloat[(r5+13)] = f29;
+	heapFloat[(r5+14)] = f28;
+	r2 = (r2 + 1)|0;
+	f0 = f_g0 < f0 ? f_g0 : f0;
+	heapFloat[(r5+15)] = f27;
+	f26 = heapFloat[(fp+-1)];
+	heapFloat[(r5+16)] = f26;
+if(!(r8 !=r2)) //_LBB253_5
+{
+break _3;
+}
+}
+}
+else{
+	f0 =                         1;
+}
+} while(0);
+	f_g0 = f0;
+	return;
+}
+else{
+	r0 = _2E_str99;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 308;
+	_assert(i7);
+}
+}
+
+function _Z15btTransformAabbRK9btVector3S1_fRK11btTransformRS_S5_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(r1)];
+	if(f0 <=f1) //_LBB254_2
+{
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r1+1)];
+	if(f2 <=f3) //_LBB254_4
+{
+	f4 = heapFloat[(r0+2)];
+	f5 = heapFloat[(r1+2)];
+	if(f4 <=f5) //_LBB254_6
+{
+	f6 = heapFloat[(fp+2)];
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp+5)];
+	f7 = f1-f0;
+	f8 =                       0.5;
+	f9 = f3-f2;
+	f10 = f5-f4;
+	r0 = r0 >> 2;
+	f4 = f5+f4;
+	f2 = f3+f2;
+	f0 = f1+f0;
+	f1 = f7*f8;
+	f3 = f9*f8;
+	f5 = f10*f8;
+	f7 = heapFloat[(r0+10)];
+	f1 = f1+f6;
+	f3 = f3+f6;
+	f5 = f5+f6;
+	f4 = f4*f8;
+	f2 = f2*f8;
+	f0 = f0*f8;
+	f6 =                         0;
+	if(f7 <f6) //_LBB254_8
+{
+	f8 = -f7;
+}
+else{
+	f8 = f7;
+}
+	f9 = heapFloat[(r0+9)];
+	if(f9 <f6) //_LBB254_11
+{
+	f10 = -f9;
+}
+else{
+	f10 = f9;
+}
+	f11 = heapFloat[(r0+8)];
+	if(f11 <f6) //_LBB254_14
+{
+	f12 = -f11;
+}
+else{
+	f12 = f11;
+}
+	f13 = heapFloat[(r0+6)];
+	if(f13 <f6) //_LBB254_17
+{
+	f14 = -f13;
+}
+else{
+	f14 = f13;
+}
+	f15 = heapFloat[(r0+5)];
+	if(f15 <f6) //_LBB254_20
+{
+	f16 = -f15;
+}
+else{
+	f16 = f15;
+}
+	f17 = heapFloat[(r0+4)];
+	if(f17 <f6) //_LBB254_23
+{
+	f18 = -f17;
+}
+else{
+	f18 = f17;
+}
+	f19 = heapFloat[(r0+2)];
+	if(f19 <f6) //_LBB254_26
+{
+	f20 = -f19;
+}
+else{
+	f20 = f19;
+}
+	f21 = heapFloat[(r0+1)];
+	if(f21 <f6) //_LBB254_29
+{
+	f22 = -f21;
+}
+else{
+	f22 = f21;
+}
+	f23 = heapFloat[(r0)];
+	if(f23 <f6) //_LBB254_32
+{
+	f6 = -f23;
+}
+else{
+	f6 = f23;
+}
+	f23 = f23*f0;
+	f21 = f21*f2;
+	f17 = f17*f0;
+	f15 = f15*f2;
+	f21 = f23+f21;
+	f19 = f19*f4;
+	f6 = f6*f1;
+	f22 = f22*f3;
+	f0 = f11*f0;
+	f2 = f9*f2;
+	f9 = f17+f15;
+	f11 = f13*f4;
+	f13 = f18*f1;
+	f15 = f16*f3;
+	f16 = f21+f19;
+	f17 = heapFloat[(r0+12)];
+	f6 = f6+f22;
+	f18 = f20*f5;
+	f0 = f0+f2;
+	f2 = f7*f4;
+	f1 = f12*f1;
+	f3 = f10*f3;
+	f4 = f9+f11;
+	f7 = heapFloat[(r0+13)];
+	f9 = heapFloat[(r0+14)];
+	f10 = f13+f15;
+	f11 = f14*f5;
+	f12 = f16+f17;
+	f6 = f6+f18;
+	f0 = f0+f2;
+	r0 = r1 >> 2;
+	f1 = f1+f3;
+	f2 = f8*f5;
+	f3 = f4+f7;
+	f4 = f10+f11;
+	f5 = f12-f6;
+	f0 = f0+f9;
+	f1 = f1+f2;
+	f2 = f3-f4;
+	heapFloat[(r0)] = f5;
+	f5 = f0-f1;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f5;
+	r1 = r2 >> 2;
+	f2 = f12+f6;
+	heap32[(r0+3)] = 0;
+	f3 = f3+f4;
+	heapFloat[(r1)] = f2;
+	f0 = f0+f1;
+	heapFloat[(r1+1)] = f3;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+else{
+	r0 = _2E_str5104;
+	r1 = _2E_str3102;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 199;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str4103;
+	r1 = _2E_str3102;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 198;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str2101;
+	r1 = _2E_str3102;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 197;
+	_assert(i7);
+}
+}
+
+function _ZN22btCompoundLeafCallback17ProcessChildShapeEP16btCollisionShapei(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -264;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	if(r0 >-1) //_LBB255_2
+{
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1+1)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+48)];
+	r3 = r3 >> 2;
+	r4 = heap32[(r3+4)];
+	if(r4 >r0) //_LBB255_4
+{
+	r4 = heap32[(fp+1)];
+	r3 = heap32[(r3+6)];
+	r5 = (r0 * 80)|0;
+	r3 = (r3 + r5)|0;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r2+1)];
+	f1 = heapFloat[(r3)];
+	f2 = heapFloat[(r2+2)];
+	f3 = heapFloat[(r3+4)];
+	f4 = heapFloat[(r3+1)];
+	f5 = heapFloat[(r3+5)];
+	f6 = heapFloat[(r2+3)];
+	f7 = heapFloat[(r3+8)];
+	f8 = f1*f0;
+	f9 = f3*f2;
+	f10 = heapFloat[(r2+5)];
+	f11 = heapFloat[(r2+6)];
+	f12 = heapFloat[(r2+9)];
+	f13 = heapFloat[(r3+12)];
+	f14 = heapFloat[(r3+2)];
+	f15 = heapFloat[(r2+10)];
+	f16 = heapFloat[(r3+13)];
+	f17 = heapFloat[(r3+6)];
+	f18 = heapFloat[(r2+7)];
+	f19 = heapFloat[(r3+14)];
+	f20 = heapFloat[(r2+11)];
+	f21 = heapFloat[(r3+10)];
+	f22 = heapFloat[(r3+9)];
+	f23 = heapFloat[(r2+4)];
+	f24 = heapFloat[(r2+8)];
+	heapFloat[(fp+-59)] = f24;
+	f24 = heapFloat[(r2+12)];
+	heapFloat[(fp+-57)] = f24;
+	f24 = heapFloat[(r2+13)];
+	f25 = heapFloat[(r2+14)];
+	f26 = heapFloat[(r2+15)];
+	f27 = heapFloat[(r2+16)];
+	heapFloat[(fp+-58)] = f27;
+	f27 = heapFloat[(r2+17)];
+	heapFloat[(fp+-42)] = f27;
+	f27 = heapFloat[(r2+18)];
+	heapFloat[(fp+-41)] = f27;
+	f27 = heapFloat[(r2+19)];
+	heapFloat[(fp+-44)] = f27;
+	f27 = heapFloat[(r2+20)];
+	heapFloat[(fp+-43)] = f27;
+	f27 = heapFloat[(r2+21)];
+	heapFloat[(fp+-46)] = f27;
+	f27 = heapFloat[(r2+22)];
+	heapFloat[(fp+-45)] = f27;
+	f27 = heapFloat[(r2+23)];
+	heapFloat[(fp+-48)] = f27;
+	f27 = heapFloat[(r2+24)];
+	heapFloat[(fp+-47)] = f27;
+	f27 = heapFloat[(r2+25)];
+	heapFloat[(fp+-50)] = f27;
+	f27 = heapFloat[(r2+26)];
+	heapFloat[(fp+-49)] = f27;
+	f27 = heapFloat[(r2+27)];
+	heapFloat[(fp+-52)] = f27;
+	f27 = heapFloat[(r2+28)];
+	heapFloat[(fp+-51)] = f27;
+	f27 = heapFloat[(r2+29)];
+	heapFloat[(fp+-54)] = f27;
+	f27 = heapFloat[(r2+30)];
+	heapFloat[(fp+-53)] = f27;
+	f27 = heapFloat[(r2+31)];
+	heapFloat[(fp+-56)] = f27;
+	f27 = heapFloat[(r2+32)];
+	heapFloat[(fp+-55)] = f27;
+	f27 = f4*f0;
+	f28 = f5*f2;
+	f8 = f8+f9;
+	f9 = f7*f6;
+	r2 = sp + -96;
+	f29 = f14*f0;
+	f30 = f17*f2;
+	f27 = f27+f28;
+	f28 = f22*f6;
+	f8 = f8+f9;
+	r3 = r2 >> 2;
+	f9 = f29+f30;
+	f29 = f21*f6;
+	f27 = f27+f28;
+	heapFloat[(fp+-24)] = f8;
+	f8 = f1*f10;
+	f28 = f3*f11;
+	f9 = f9+f29;
+	heapFloat[(r3+1)] = f27;
+	heapFloat[(r3+2)] = f9;
+	f9 = f4*f10;
+	f27 = f5*f11;
+	f8 = f8+f28;
+	f28 = f7*f18;
+	f29 = f14*f10;
+	f30 = f17*f11;
+	f9 = f9+f27;
+	f27 = f22*f18;
+	f8 = f8+f28;
+	heap32[(r3+3)] = 0;
+	f28 = f29+f30;
+	f29 = f21*f18;
+	f9 = f9+f27;
+	heapFloat[(r3+4)] = f8;
+	f1 = f1*f12;
+	f3 = f3*f15;
+	f8 = f28+f29;
+	heapFloat[(r3+5)] = f9;
+	heapFloat[(r3+6)] = f8;
+	f4 = f4*f12;
+	f5 = f5*f15;
+	f1 = f1+f3;
+	f3 = f7*f20;
+	f7 = f14*f12;
+	f8 = f17*f15;
+	f4 = f4+f5;
+	f5 = f22*f20;
+	f1 = f1+f3;
+	heap32[(r3+7)] = 0;
+	f3 = f0*f13;
+	f9 = f2*f16;
+	f7 = f7+f8;
+	f8 = f21*f20;
+	f4 = f4+f5;
+	heapFloat[(r3+8)] = f1;
+	f1 = f10*f13;
+	f5 = f11*f16;
+	f3 = f3+f9;
+	f9 = f6*f19;
+	f7 = f7+f8;
+	heapFloat[(r3+9)] = f4;
+	f3 = f3+f9;
+	heapFloat[(r3+10)] = f7;
+	f4 = f12*f13;
+	f7 = f15*f16;
+	f1 = f1+f5;
+	f5 = f18*f19;
+	f1 = f1+f5;
+	f4 = f4+f7;
+	f5 = f20*f19;
+	f3 = f3+f24;
+	heap32[(r3+11)] = 0;
+	f4 = f4+f5;
+	f1 = f1+f25;
+	heapFloat[(r3+12)] = f3;
+	f3 = f4+f26;
+	heapFloat[(r3+13)] = f1;
+	heapFloat[(r3+14)] = f3;
+	r5 = r4 >> 2;
+	heap32[(r3+15)] = 0;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r6 = sp + -112;
+	r7 = sp + -128;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r7;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r2 = heap32[(r1+2)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5+48)];
+	r8 = r5 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r2 = (r2 + 4)|0;
+	r9 = sp + -144;
+	r10 = sp + -160;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r10;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f1 = heapFloat[(fp+-28)];
+	f3 = heapFloat[(fp+-40)];
+	if(f1 >f3) //_LBB255_7
+{
+__label__ = 7;
+}
+else{
+	f1 = heapFloat[(fp+-32)];
+	f3 = heapFloat[(fp+-36)];
+	if(f1 <f3) //_LBB255_7
+{
+__label__ = 7;
+}
+else{
+	r2 = 1;
+__label__ = 8;
+}
+}
+if (__label__ == 7){
+	r2 = 0;
+}
+	r5 = r6 >> 2;
+	r8 = r10 >> 2;
+	f1 = heapFloat[(r5+2)];
+	f3 = heapFloat[(r8+2)];
+	if(f1 >f3) //_LBB255_11
+{
+__label__ = 10;
+}
+else{
+	r11 = r7 >> 2;
+	r12 = r9 >> 2;
+	f1 = heapFloat[(r11+2)];
+	f3 = heapFloat[(r12+2)];
+	if(f1 <f3) //_LBB255_11
+{
+__label__ = 10;
+}
+else{
+__label__ = 11;
+}
+}
+if (__label__ == 10){
+	r2 = 0;
+}
+	f1 = heapFloat[(r5+1)];
+	f3 = heapFloat[(r8+1)];
+if(!(f1 >f3)) //_LBB255_24
+{
+	r5 = r7 >> 2;
+	r8 = r9 >> 2;
+	f1 = heapFloat[(r5+1)];
+	f3 = heapFloat[(r8+1)];
+if(!(f1 <f3)) //_LBB255_24
+{
+	r2 = r2 & 255;
+if(!(r2 ==0)) //_LBB255_24
+{
+	r2 = heap32[(r1+1)];
+	r2 = r2 >> 2;
+	heap32[(r2+1)] = heap32[(fp+-24)];
+	heap32[(r2+2)] = heap32[(r3+1)];
+	heap32[(r2+3)] = heap32[(r3+2)];
+	heap32[(r2+4)] = heap32[(r3+3)];
+	heap32[(r2+5)] = heap32[(r3+4)];
+	heap32[(r2+6)] = heap32[(r3+5)];
+	heap32[(r2+7)] = heap32[(r3+6)];
+	heap32[(r2+8)] = heap32[(r3+7)];
+	heap32[(r2+9)] = heap32[(r3+8)];
+	heap32[(r2+10)] = heap32[(r3+9)];
+	heap32[(r2+11)] = heap32[(r3+10)];
+	heap32[(r2+12)] = heap32[(r3+11)];
+	heap32[(r2+13)] = heap32[(r3+12)];
+	heap32[(r2+14)] = heap32[(r3+13)];
+	heap32[(r2+15)] = heap32[(r3+14)];
+	heap32[(r2+16)] = heap32[(r3+15)];
+	r2 = heap32[(r1+1)];
+	r2 = r2 >> 2;
+	heap32[(r2+17)] = heap32[(fp+-24)];
+	heap32[(r2+18)] = heap32[(r3+1)];
+	heap32[(r2+19)] = heap32[(r3+2)];
+	heap32[(r2+20)] = heap32[(r3+3)];
+	heap32[(r2+21)] = heap32[(r3+4)];
+	heap32[(r2+22)] = heap32[(r3+5)];
+	heap32[(r2+23)] = heap32[(r3+6)];
+	heap32[(r2+24)] = heap32[(r3+7)];
+	heap32[(r2+25)] = heap32[(r3+8)];
+	heap32[(r2+26)] = heap32[(r3+9)];
+	heap32[(r2+27)] = heap32[(r3+10)];
+	heap32[(r2+28)] = heap32[(r3+11)];
+	heap32[(r2+29)] = heap32[(r3+12)];
+	heap32[(r2+30)] = heap32[(r3+13)];
+	heap32[(r2+31)] = heap32[(r3+14)];
+	heap32[(r2+32)] = heap32[(r3+15)];
+	r2 = heap32[(r1+1)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+48)];
+	heap32[(r2+48)] = r4;
+	r2 = heap32[(r1+6)];
+	r4 = r0 << 2;
+	r2 = (r2 + r4)|0;
+	r2 = r2 >> 2;
+	r5 = heap32[(r2)];
+if(!(r5 !=0)) //_LBB255_17
+{
+	r5 = heap32[(r1+3)];
+	r8 = r5 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r11 = heap32[(r1+7)];
+	r12 = heap32[(r1+2)];
+	r13 = heap32[(r1+1)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r13;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r11;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	heap32[(r2)] = r_g0;
+}
+	r2 = heap32[(r1+5)];
+	r5 = r2 >> 2;
+	r8 = heap32[(r5)];
+	r5 = heap32[(r5+34)];
+	r11 = heap32[(r1+1)];
+	if(r5 !=r11) //_LBB255_19
+{
+	r5 = r8 >> 2;
+	r5 = heap32[(r5+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = -1;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+else{
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = -1;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+	r0 = heap32[(r1+6)];
+	r0 = (r0 + r4)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+2)];
+	r4 = heap32[(r1+5)];
+	r5 = heap32[(r1+4)];
+	r8 = heap32[(r1+2)];
+	r11 = heap32[(r1+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = heap32[(r1+4)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+if(!(r0 ==0)) //_LBB255_23
+{
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r_g0 & 2;
+if(!(r0 ==0)) //_LBB255_23
+{
+	r0 = heap32[(r1+4)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0+5)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+13)];
+	r4 = sp + -32;
+	r5 = r4 >> 2;
+	heap32[(fp+-8)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	heap32[(r5+3)] = 0;
+	r0 = heap32[(r0+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = heap32[(r1+4)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0+5)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+13)];
+	r4 = sp + -16;
+	r5 = r4 >> 2;
+	heap32[(fp+-4)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 1065353216;
+	heap32[(r5+3)] = 0;
+	r0 = heap32[(r0+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+}
+	r0 = heap32[(r1+1)];
+	r0 = r0 >> 2;
+	heap32[(r0+48)] = r3;
+	r0 = heap32[(r1+1)];
+	r0 = r0 >> 2;
+	heapFloat[(r0+1)] = f0;
+	heapFloat[(r0+2)] = f2;
+	heapFloat[(r0+3)] = f6;
+	heapFloat[(r0+4)] = f23;
+	heapFloat[(r0+5)] = f10;
+	heapFloat[(r0+6)] = f11;
+	heapFloat[(r0+7)] = f18;
+	f0 = heapFloat[(fp+-59)];
+	heapFloat[(r0+8)] = f0;
+	heapFloat[(r0+9)] = f12;
+	heapFloat[(r0+10)] = f15;
+	heapFloat[(r0+11)] = f20;
+	f0 = heapFloat[(fp+-57)];
+	heapFloat[(r0+12)] = f0;
+	heapFloat[(r0+13)] = f24;
+	heapFloat[(r0+14)] = f25;
+	heapFloat[(r0+15)] = f26;
+	f0 = heapFloat[(fp+-58)];
+	heapFloat[(r0+16)] = f0;
+	r0 = heap32[(r1+1)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(fp+-42)];
+	heapFloat[(r0+17)] = f0;
+	f0 = heapFloat[(fp+-41)];
+	heapFloat[(r0+18)] = f0;
+	f0 = heapFloat[(fp+-44)];
+	heapFloat[(r0+19)] = f0;
+	f0 = heapFloat[(fp+-43)];
+	heapFloat[(r0+20)] = f0;
+	f0 = heapFloat[(fp+-46)];
+	heapFloat[(r0+21)] = f0;
+	f0 = heapFloat[(fp+-45)];
+	heapFloat[(r0+22)] = f0;
+	f0 = heapFloat[(fp+-48)];
+	heapFloat[(r0+23)] = f0;
+	f0 = heapFloat[(fp+-47)];
+	heapFloat[(r0+24)] = f0;
+	f0 = heapFloat[(fp+-50)];
+	heapFloat[(r0+25)] = f0;
+	f0 = heapFloat[(fp+-49)];
+	heapFloat[(r0+26)] = f0;
+	f0 = heapFloat[(fp+-52)];
+	heapFloat[(r0+27)] = f0;
+	f0 = heapFloat[(fp+-51)];
+	heapFloat[(r0+28)] = f0;
+	f0 = heapFloat[(fp+-54)];
+	heapFloat[(r0+29)] = f0;
+	f0 = heapFloat[(fp+-53)];
+	heapFloat[(r0+30)] = f0;
+	f0 = heapFloat[(fp+-56)];
+	heapFloat[(r0+31)] = f0;
+	f0 = heapFloat[(fp+-55)];
+	heapFloat[(r0+32)] = f0;
+}
+}
+}
+	return;
+}
+else{
+	r0 = _2E_str7106;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 119;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str6105;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 117;
+	_assert(i7);
+}
+}
+
+function _ZN28btCompoundCollisionAlgorithm26preallocateChildAlgorithmsEP17btCollisionObjectS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+28];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = r1 == 0 ? r2 : r3;
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+48)];
+	r6 = r6 >> 2;
+	r7 = heap32[(r6+1)];
+	if(r7 ==31) //_LBB256_2
+{
+	r7 = r0 >> 2;
+	r8 = heap32[(r7+3)];
+	r9 = heap32[(r6+4)];
+_3: do {
+if(!(r8 >r9)) //_LBB256_21
+{
+if(!(r8 >=r9)) //_LBB256_21
+{
+	r10 = heap32[(r7+4)];
+if(!(r10 >=r9)) //_LBB256_20
+{
+	if(r9 !=0) //_LBB256_7
+{
+	r10 = gNumAlignedAllocs;
+	r10 = r10 >> 2;
+	r11 = heap32[(r10)];
+	r12 = r9 << 2;
+	r11 = (r11 + 1)|0;
+	r12 = r12 | 3;
+	heap32[(r10)] = r11;
+	r10 = (r12 + 16)|0;
+	heap32[(g0)] = r10;
+	malloc(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB256_9
+{
+	r11 = 0;
+	r12 = (r10 + 4)|0;
+	r11 = (r11 - r12)|0;
+	r11 = r11 & 15;
+	r11 = (r10 + r11)|0;
+	r12 = (r11 + 4)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r10;
+	r10 = r12;
+}
+}
+else{
+	r10 = 0;
+}
+	r11 = (r0 + 20)|0;
+	if(r8 <1) //_LBB256_12
+{
+	r12 = r11 >> 2;
+	r13 = heap32[(r12)];
+}
+else{
+	r12 = 0;
+_16: while(true){
+	r13 = r11 >> 2;
+	r13 = heap32[(r13)];
+	r14 = r12 << 2;
+	r15 = (r13 + r14)|0;
+	r15 = r15 >> 2;
+	r14 = (r10 + r14)|0;
+	r15 = heap32[(r15)];
+	r12 = (r12 + 1)|0;
+	r14 = r14 >> 2;
+	heap32[(r14)] = r15;
+if(!(r8 !=r12)) //_LBB256_13
+{
+break _16;
+}
+}
+	r11 = (r0 + 20)|0;
+}
+if(!(r13 ==0)) //_LBB256_19
+{
+	r12 = heapU8[r0+24];
+if(!(r12 ==0)) //_LBB256_18
+{
+	r12 = gNumAlignedFree;
+	r12 = r12 >> 2;
+	r14 = heap32[(r12)];
+	r14 = (r14 + 1)|0;
+	r13 = r13 >> 2;
+	heap32[(r12)] = r14;
+	r12 = heap32[(r13+-1)];
+	heap32[(g0)] = r12;
+	free(i7);
+}
+	r12 = r11 >> 2;
+	heap32[(r12)] = 0;
+}
+	r12 = 1;
+	r11 = r11 >> 2;
+	heap8[r0+24] = r12;
+	heap32[(r11)] = r10;
+	heap32[(r7+4)] = r9;
+	if(r8 >=r9) //_LBB256_21
+{
+break _3;
+}
+}
+_26: while(true){
+	r0 = r8 << 2;
+	r10 = heap32[(r7+5)];
+	r0 = (r10 + r0)|0;
+	r8 = (r8 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+if(!(r9 !=r8)) //_LBB256_20
+{
+break _3;
+}
+}
+}
+}
+} while(0);
+	heap32[(r7+3)] = r9;
+_29: do {
+if(!(r9 <1)) //_LBB256_27
+{
+	r0 = r1 == 0 ? r3 : r2;
+	r1 = 0;
+_31: while(true){
+	r2 = heap32[(r6+16)];
+	if(r2 ==0) //_LBB256_25
+{
+	r2 = (r1 * 20)|0;
+	r2 = r2 << 2;
+	r3 = heap32[(r6+6)];
+	r2 = (r3 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = heap32[(r5+48)];
+	r2 = heap32[(r2+16)];
+	heap32[(r5+48)] = r2;
+	r2 = heap32[(r7+1)];
+	r8 = r2 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r10 = heap32[(r7+8)];
+	r11 = heap32[(r7+5)];
+	r12 = r1 << 2;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r10;
+	r2 = (r11 + r12)|0;
+	r2 = r2 >> 2;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	heap32[(r2)] = r_g0;
+	heap32[(r5+48)] = r3;
+}
+else{
+	r2 = r1 << 2;
+	r3 = heap32[(r7+5)];
+	r2 = (r3 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+}
+	r1 = (r1 + 1)|0;
+if(!(r9 !=r1)) //_LBB256_23
+{
+break _29;
+}
+}
+}
+} while(0);
+	return;
+}
+else{
+	r0 = _2E_str99;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 44;
+	_assert(i7);
+}
+}
+
+function _ZN28btCompoundCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + -328;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heapU8[r0+28];
+	r4 = r3 == 0 ? r1 : r2;
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+48)];
+	r6 = r6 >> 2;
+	r7 = heap32[(r6+1)];
+	if(r7 ==31) //_LBB257_2
+{
+	r7 = r0 >> 2;
+	r8 = heap32[(r6+17)];
+	r9 = heap32[(r7+10)];
+if(!(r8 ==r9)) //_LBB257_9
+{
+	r8 = heap32[(r7+3)];
+if(!(r8 <1)) //_LBB257_8
+{
+	r9 = 0;
+_7: while(true){
+	r10 = heap32[(r7+5)];
+	r11 = r9 << 2;
+	r10 = (r10 + r11)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+if(!(r10 ==0)) //_LBB257_7
+{
+	r12 = r10 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12)];
+	heap32[(g0)] = r10;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	r10 = heap32[(r7+1)];
+	r12 = r10 >> 2;
+	r13 = heap32[(r7+5)];
+	r11 = (r13 + r11)|0;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r11 = r11 >> 2;
+	r12 = heap32[(r12+13)];
+	r11 = heap32[(r11)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+}
+	r9 = (r9 + 1)|0;
+if(!(r8 !=r9)) //_LBB257_5
+{
+break _7;
+}
+}
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN28btCompoundCollisionAlgorithm26preallocateChildAlgorithmsEP17btCollisionObjectS1_(i7);
+}
+	r0 = heap32[(fp+3)];
+	r8 = heap32[(fp+4)];
+	r1 = r3 == 0 ? r2 : r1;
+	r2 = _ZTV22btCompoundLeafCallback;
+	r3 = heap32[(r6+16)];
+	r9 = heap32[(r7+8)];
+	r10 = heap32[(r7+5)];
+	r11 = heap32[(r7+1)];
+	r12 = sp + -32;
+	r2 = (r2 + 8)|0;
+	r13 = r12 >> 2;
+	heap32[(fp+-8)] = r2;
+	heap32[(r13+1)] = r4;
+	heap32[(r13+2)] = r1;
+	heap32[(r13+3)] = r11;
+	heap32[(r13+4)] = r0;
+	heap32[(r13+5)] = r8;
+	heap32[(r13+6)] = r10;
+	r0 = sp + -56;
+	r2 = 1;
+	heap32[(r13+7)] = r9;
+	r4 = r0 >> 2;
+	heap8[sp+-40] = r2;
+	heap32[(r4+3)] = 0;
+	r9 = (r8 + 72)|0;
+	r10 = (r8 + 8)|0;
+	r11 = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+_14: while(true){
+	r13 = heap32[(r7+3)];
+	if(r13 >r11) //_LBB257_10
+{
+	r13 = heap32[(r7+5)];
+	r14 = r11 << 2;
+	r13 = (r13 + r14)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+if(!(r13 ==0)) //_LBB257_27
+{
+	r14 = r13 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+4)];
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r0;
+	r13 = 0;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+_19: while(true){
+	r14 = heap32[(r4+3)];
+	r15 = heap32[(r4+1)];
+	if(r15 >r13) //_LBB257_12
+{
+	r15 = r13 << 2;
+	r14 = (r14 + r15)|0;
+	r14 = r14 >> 2;
+	r14 = heap32[(r14)];
+	r15 = r14 >> 2;
+	r16 = heap32[(r15+279)];
+if(!(r16 ==0)) //_LBB257_20
+{
+	r16 = r8 >> 2;
+	heap32[(r16+1)] = r14;
+	if(r14 !=0) //_LBB257_15
+{
+	r17 = heap32[(r15+279)];
+if(!(r17 ==0)) //_LBB257_19
+{
+	r15 = heap32[(r15+277)];
+	r17 = heap32[(r16+34)];
+	if(r15 ==r17) //_LBB257_18
+{
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r9;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+else{
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r10;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+}
+	heap32[(r16+1)] = 0;
+}
+else{
+__label__ = 14;
+break _14;
+}
+}
+	r13 = (r13 + 1)|0;
+}
+else{
+break _19;
+}
+}
+if(!(r14 ==0)) //_LBB257_26
+{
+	r13 = heapU8[sp+-40];
+if(!(r13 ==0)) //_LBB257_25
+{
+	r13 = gNumAlignedFree;
+	r13 = r13 >> 2;
+	r15 = heap32[(r13)];
+	r15 = (r15 + 1)|0;
+	r14 = r14 >> 2;
+	heap32[(r13)] = r15;
+	r13 = heap32[(r14+-1)];
+	heap32[(g0)] = r13;
+	free(i7);
+}
+	heap32[(r4+3)] = 0;
+}
+	r13 = 1;
+	heap8[sp+-40] = r13;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+}
+	r11 = (r11 + 1)|0;
+}
+else{
+__label__ = 29;
+break _14;
+}
+}
+switch(__label__ ){//multiple entries
+case 29:
+	heap8[sp+-40] = r2;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+_42: do {
+	if(r3 ==0) //_LBB257_31
+{
+	if(r13 <1) //_LBB257_50
+{
+__label__ = 49;
+}
+else{
+	r0 = 0;
+_45: while(true){
+	r3 = (r0 * 20)|0;
+	r4 = heap32[(r6+6)];
+	r3 = r3 << 2;
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+16)];
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r0;
+	r0 = (r0 + 1)|0;
+	_ZN22btCompoundLeafCallback17ProcessChildShapeEP16btCollisionShapei(i7);
+if(!(r13 !=r0)) //_LBB257_33
+{
+__label__ = 34;
+break _42;
+}
+}
+}
+}
+else{
+	r13 = r1 >> 2;
+	f0 = heapFloat[(r5+1)];
+	f1 = heapFloat[(r13+1)];
+	f2 = heapFloat[(r5+5)];
+	f3 = heapFloat[(r13+5)];
+	f4 = heapFloat[(r13+2)];
+	f5 = heapFloat[(r13+6)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r5+9)];
+	f9 = heapFloat[(r13+9)];
+	f10 = heapFloat[(r5+2)];
+	f11 = heapFloat[(r5+6)];
+	f12 = heapFloat[(r5+3)];
+	f13 = heapFloat[(r13+13)];
+	f14 = heapFloat[(r13+3)];
+	f15 = heapFloat[(r5+7)];
+	f16 = heapFloat[(r5+14)];
+	f17 = heapFloat[(r13+14)];
+	f18 = heapFloat[(r13+7)];
+	f19 = heapFloat[(r5+10)];
+	f20 = heapFloat[(r5+15)];
+	f21 = heapFloat[(r5+11)];
+	f22 = heapFloat[(r13+15)];
+	f23 = heapFloat[(r13+11)];
+	f24 = heapFloat[(r13+10)];
+	f25 = heapFloat[(r5+13)];
+	f26 = f4*f0;
+	f27 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	r0 = sp + -152;
+	f28 = f14*f0;
+	f29 = f18*f2;
+	f26 = f26+f27;
+	f27 = f24*f8;
+	f6 = f6+f7;
+	r4 = r0 >> 2;
+	f7 = f28+f29;
+	f28 = f23*f8;
+	f26 = f26+f27;
+	heapFloat[(fp+-38)] = f6;
+	f6 = f1*f10;
+	f27 = f3*f11;
+	f7 = f7+f28;
+	heapFloat[(r4+1)] = f26;
+	heapFloat[(r4+2)] = f7;
+	f7 = f4*f10;
+	f26 = f5*f11;
+	f6 = f6+f27;
+	f27 = f9*f19;
+	f28 = f14*f10;
+	f29 = f18*f11;
+	f7 = f7+f26;
+	f26 = f24*f19;
+	f6 = f6+f27;
+	heap32[(r4+3)] = 0;
+	f27 = f28+f29;
+	f28 = f23*f19;
+	f7 = f7+f26;
+	heapFloat[(r4+4)] = f6;
+	f1 = f1*f12;
+	f3 = f3*f15;
+	f6 = f27+f28;
+	heapFloat[(r4+5)] = f7;
+	heapFloat[(r4+6)] = f6;
+	f4 = f4*f12;
+	f5 = f5*f15;
+	f1 = f1+f3;
+	f3 = f9*f21;
+	f6 = -f25;
+	f7 = f14*f12;
+	f9 = f18*f15;
+	f4 = f4+f5;
+	f5 = f24*f21;
+	f1 = f1+f3;
+	heap32[(r4+7)] = 0;
+	f3 = f0*f13;
+	f14 = f2*f17;
+	f0 = f0*f6;
+	f2 = f2*f16;
+	f7 = f7+f9;
+	f9 = f23*f21;
+	f4 = f4+f5;
+	heapFloat[(r4+8)] = f1;
+	f1 = f10*f13;
+	f5 = f11*f17;
+	f10 = f10*f6;
+	f11 = f11*f16;
+	f3 = f3+f14;
+	f14 = f8*f22;
+	f0 = f0-f2;
+	f2 = f8*f20;
+	f7 = f7+f9;
+	heapFloat[(r4+9)] = f4;
+	heapFloat[(r4+10)] = f7;
+	f4 = f12*f13;
+	f7 = f15*f17;
+	f6 = f12*f6;
+	f8 = f15*f16;
+	f1 = f1+f5;
+	f5 = f19*f22;
+	f9 = f10-f11;
+	f10 = f19*f20;
+	f3 = f3+f14;
+	f0 = f0-f2;
+	f2 = f4+f7;
+	f4 = f21*f22;
+	f6 = f6-f8;
+	f7 = f21*f20;
+	f1 = f1+f5;
+	f5 = f9-f10;
+	f0 = f3+f0;
+	heap32[(r4+11)] = 0;
+	f2 = f2+f4;
+	f3 = f6-f7;
+	f1 = f1+f5;
+	heapFloat[(r4+12)] = f0;
+	f0 = f2+f3;
+	heapFloat[(r4+13)] = f1;
+	heapFloat[(r4+14)] = f0;
+	heap32[(r4+15)] = 0;
+	r13 = heap32[(r13+48)];
+	r4 = r13 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	r8 = sp + -72;
+	r9 = sp + -88;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r9;
+	r13 = sp + -184;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = r13 >> 2;
+	r4 = r8 >> 2;
+	heap32[(fp+-46)] = heap32[(fp+-18)];
+	heap32[(r0+1)] = heap32[(r4+1)];
+	heap32[(r0+2)] = heap32[(r4+2)];
+	heap32[(r0+3)] = heap32[(r4+3)];
+	r4 = r9 >> 2;
+	heap32[(r0+4)] = heap32[(fp+-22)];
+	heap32[(r0+5)] = heap32[(r4+1)];
+	heap32[(r0+6)] = heap32[(r4+2)];
+	r3 = r3 >> 2;
+	heap32[(r0+7)] = heap32[(r4+3)];
+	r0 = heap32[(r3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r13;
+	heap32[(g0+2)] = r12;
+	_ZN6btDbvt9collideTVEPK10btDbvtNodeRK12btDbvtAabbMmRNS_8ICollideE(i7);
+__label__ = 34;
+}
+} while(0);
+_48: do {
+if (__label__ == 34){
+	r0 = heap32[(r7+3)];
+if(!(r0 <1)) //_LBB257_50
+{
+	r3 = 0;
+	r4 = (r1 + 4)|0;
+	r0 = (r3 - r0)|0;
+_51: while(true){
+	r8 = heap32[(r7+5)];
+	r9 = r3 << 2;
+	r8 = (r8 - r9)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+_53: do {
+if(!(r8 ==0)) //_LBB257_49
+{
+	r8 = (r3 * -20)|0;
+	r10 = heap32[(r6+6)];
+	r8 = r8 << 2;
+	r8 = (r10 + r8)|0;
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r5+1)];
+	f1 = heapFloat[(r8)];
+	f2 = heapFloat[(r5+2)];
+	f3 = heapFloat[(r8+4)];
+	f4 = heapFloat[(r8+1)];
+	f5 = heapFloat[(r8+5)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r5+3)];
+	f9 = heapFloat[(r8+8)];
+	f10 = heapFloat[(r5+5)];
+	f11 = heapFloat[(r5+6)];
+	f12 = heapFloat[(r5+9)];
+	f13 = heapFloat[(r8+12)];
+	f14 = heapFloat[(r8+2)];
+	f15 = heapFloat[(r5+10)];
+	f16 = heapFloat[(r8+13)];
+	f17 = heapFloat[(r8+6)];
+	r10 = heap32[(r8+16)];
+	f18 = heapFloat[(r5+7)];
+	f19 = heapFloat[(r8+14)];
+	f20 = heapFloat[(r5+11)];
+	f21 = heapFloat[(r8+10)];
+	f22 = heapFloat[(r8+9)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r5+13)];
+	f26 = heapFloat[(r5+14)];
+	f27 = heapFloat[(r5+15)];
+	r8 = sp + -248;
+	f28 = f14*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	r11 = r8 >> 2;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(fp+-62)] = f6;
+	f6 = f1*f10;
+	f24 = f3*f11;
+	f7 = f7+f28;
+	heapFloat[(r11+1)] = f23;
+	heapFloat[(r11+2)] = f7;
+	f7 = f4*f10;
+	f23 = f5*f11;
+	f6 = f6+f24;
+	f24 = f9*f18;
+	f28 = f14*f10;
+	f29 = f17*f11;
+	f7 = f7+f23;
+	f23 = f22*f18;
+	f6 = f6+f24;
+	heap32[(r11+3)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f18;
+	f7 = f7+f23;
+	heapFloat[(r11+4)] = f6;
+	f1 = f1*f12;
+	f3 = f3*f15;
+	f6 = f24+f28;
+	heapFloat[(r11+5)] = f7;
+	heapFloat[(r11+6)] = f6;
+	f4 = f4*f12;
+	f5 = f5*f15;
+	f1 = f1+f3;
+	f3 = f9*f20;
+	f6 = f14*f12;
+	f7 = f17*f15;
+	f4 = f4+f5;
+	f5 = f22*f20;
+	f1 = f1+f3;
+	heap32[(r11+7)] = 0;
+	f0 = f0*f13;
+	f2 = f2*f16;
+	f3 = f6+f7;
+	f6 = f21*f20;
+	f4 = f4+f5;
+	heapFloat[(r11+8)] = f1;
+	f1 = f10*f13;
+	f5 = f11*f16;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r11+9)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r11+10)] = f3;
+	f2 = f12*f13;
+	f3 = f15*f16;
+	f1 = f1+f5;
+	f4 = f18*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f20*f19;
+	f0 = f0+f25;
+	heap32[(r11+11)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r11+12)] = f0;
+	f0 = f2+f27;
+	heapFloat[(r11+13)] = f1;
+	heapFloat[(r11+14)] = f0;
+	r12 = r10 >> 2;
+	heap32[(r11+15)] = 0;
+	r11 = heap32[(r12)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+2)];
+	r12 = sp + -264;
+	r13 = sp + -280;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r13;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r8 = r1 >> 2;
+	r8 = heap32[(r8+48)];
+	r10 = r8 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	r11 = sp + -296;
+	r14 = sp + -312;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r14;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	f0 = heapFloat[(fp+-66)];
+	f1 = heapFloat[(fp+-78)];
+	if(f0 >f1) //_LBB257_40
+{
+__label__ = 40;
+}
+else{
+	f0 = heapFloat[(fp+-70)];
+	f1 = heapFloat[(fp+-74)];
+	if(f0 <f1) //_LBB257_40
+{
+__label__ = 40;
+}
+else{
+	r8 = r2;
+__label__ = 41;
+}
+}
+if (__label__ == 40){
+	r8 = 0;
+}
+	r10 = r12 >> 2;
+	r12 = r14 >> 2;
+	f0 = heapFloat[(r10+2)];
+	f1 = heapFloat[(r12+2)];
+	if(f0 >f1) //_LBB257_44
+{
+__label__ = 43;
+}
+else{
+	r14 = r13 >> 2;
+	r15 = r11 >> 2;
+	f0 = heapFloat[(r14+2)];
+	f1 = heapFloat[(r15+2)];
+	if(f0 <f1) //_LBB257_44
+{
+__label__ = 43;
+}
+else{
+__label__ = 44;
+}
+}
+if (__label__ == 43){
+	r8 = 0;
+}
+	f0 = heapFloat[(r10+1)];
+	f1 = heapFloat[(r12+1)];
+if(!(f0 >f1)) //_LBB257_48
+{
+	r10 = r13 >> 2;
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r10+1)];
+	f1 = heapFloat[(r11+1)];
+if(!(f0 <f1)) //_LBB257_48
+{
+	r8 = r8 & 255;
+	if(r8 !=0) //_LBB257_49
+{
+break _53;
+}
+}
+}
+	r8 = heap32[(r7+5)];
+	r8 = (r8 - r9)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+	r10 = r8 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+	heap32[(g0)] = r8;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r8 = heap32[(r7+1)];
+	r10 = r8 >> 2;
+	r11 = heap32[(r7+5)];
+	r11 = (r11 - r9)|0;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r11 = r11 >> 2;
+	r10 = heap32[(r10+13)];
+	r11 = heap32[(r11)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r8 = heap32[(r7+5)];
+	r8 = (r8 - r9)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = 0;
+}
+} while(0);
+	r3 = (r3 + -1)|0;
+if(!(r0 !=r3)) //_LBB257_36
+{
+break _48;
+}
+}
+}
+}
+} while(0);
+	return;
+break;
+case 14:
+	r14 = _2E_str59;
+	r0 = _2E_str160;
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+break;
+}
+}
+else{
+	r0 = _2E_str99;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 199;
+	_assert(i7);
+}
+}
+
+function _ZN28btCompoundCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btCompoundCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+3)];
+if(!(r1 <1)) //_LBB258_5
+{
+	r3 = 0;
+_3: while(true){
+	r4 = heap32[(r2+5)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+if(!(r4 ==0)) //_LBB258_4
+{
+	r6 = r4 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r4 = heap32[(r2+1)];
+	r6 = r4 >> 2;
+	r7 = heap32[(r2+5)];
+	r5 = (r7 + r5)|0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+13)];
+	r5 = heap32[(r5)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+	r3 = (r3 + 1)|0;
+	if(r1 !=r3) //_LBB258_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r1 = heap32[(r2+5)];
+if(!(r1 ==0)) //_LBB258_9
+{
+	r3 = heapU8[r0+24];
+if(!(r3 ==0)) //_LBB258_8
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+5)] = 0;
+}
+	r1 = 1;
+	heap8[r0+24] = r1;
+	heap32[(r2+5)] = 0;
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	heap32[(r2+3)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btCompoundCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+3)];
+if(!(r1 <1)) //_LBB259_5
+{
+	r3 = 0;
+_3: while(true){
+	r4 = heap32[(r2+5)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+if(!(r4 ==0)) //_LBB259_4
+{
+	r6 = r4 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r4 = heap32[(r2+1)];
+	r6 = r4 >> 2;
+	r7 = heap32[(r2+5)];
+	r5 = (r7 + r5)|0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+13)];
+	r5 = heap32[(r5)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+	r3 = (r3 + 1)|0;
+	if(r1 !=r3) //_LBB259_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r1 = heap32[(r2+5)];
+if(!(r1 ==0)) //_LBB259_9
+{
+	r3 = heapU8[r0+24];
+if(!(r3 ==0)) //_LBB259_8
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+5)] = 0;
+}
+	r1 = 1;
+	heap8[r0+24] = r1;
+	heap32[(r2+5)] = 0;
+	r0 = _ZTV30btActivatingCollisionAlgorithm;
+	heap32[(r2+3)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZNK21btConvexInternalShape15getLocalScalingEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = (r0 + 12)|0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btConvexInternalShape9setMarginEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0+11)] = heap32[(fp+1)];
+	return;
+}
+
+function _ZNK21btConvexInternalShape9getMarginEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+11)];
+	f_g0 = f0;
+	return;
+}
+
+function _ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 52;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape14getNumVerticesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 3;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape9getVertexEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 << 4;
+	r2 = heap32[(fp+2)];
+	r0 = (r1 + r0)|0;
+	r1 = r2 >> 2;
+	r0 = r0 >> 2;
+	heap32[(r1)] = heap32[(r0+13)];
+	heap32[(r1+1)] = heap32[(r0+14)];
+	heap32[(r1+2)] = heap32[(r0+15)];
+	heap32[(r1+3)] = heap32[(r0+16)];
+	return;
+}
+
+function _ZNK15btTriangleShape11getNumEdgesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 3;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape7getEdgeEiR9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+24)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+24)];
+	r2 = (r3 + 1)|0;
+	r2 = (r2 % 3)|0;
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZNK15btTriangleShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+18)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZNK15btTriangleShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r2+13)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r2+17)];
+	f3 = heapFloat[(r2+21)];
+	f4 = heapFloat[(r2+14)];
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r2+18)];
+	f7 = heapFloat[(r2+22)];
+	f0 = f1*f0;
+	f4 = f5*f4;
+	f8 = heapFloat[(r2+15)];
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r2+19)];
+	f11 = heapFloat[(r2+23)];
+	f2 = f1*f2;
+	f6 = f5*f6;
+	f1 = f1*f3;
+	f3 = f5*f7;
+	f0 = f0+f4;
+	f4 = f9*f8;
+	f2 = f2+f6;
+	f5 = f9*f10;
+	f1 = f1+f3;
+	f3 = f9*f11;
+	f0 = f0+f4;
+	f2 = f2+f5;
+	r1 = heap32[(fp)];
+	f1 = f1+f3;
+	if(f0 >=f2) //_LBB269_2
+{
+	r2 = 2;
+	r3 = 0;
+	r2 = f0 < f1 ? r2 : r3;
+}
+else{
+	r2 = 2;
+	r3 = 1;
+	r2 = f2 < f1 ? r2 : r3;
+}
+	r2 = r2 << 4;
+	r0 = (r0 + r2)|0;
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	heap32[(r1)] = heap32[(r0+13)];
+	heap32[(r1+1)] = heap32[(r0+14)];
+	heap32[(r1+2)] = heap32[(r0+15)];
+	heap32[(r1+3)] = heap32[(r0+16)];
+	return;
+}
+
+function _ZNK15btTriangleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 <1)) //_LBB270_6
+{
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r2 = (r2 + 8)|0;
+	r3 = (r3 + 12)|0;
+_3: while(true){
+	r4 = r1 >> 2;
+	r5 = r2 >> 2;
+	f0 = heapFloat[(r4+13)];
+	f1 = heapFloat[(r5+-2)];
+	f2 = heapFloat[(r4+17)];
+	f3 = heapFloat[(r4+21)];
+	f4 = heapFloat[(r4+14)];
+	f5 = heapFloat[(r5+-1)];
+	f6 = heapFloat[(r4+18)];
+	f7 = heapFloat[(r4+22)];
+	f0 = f1*f0;
+	f4 = f5*f4;
+	f8 = heapFloat[(r4+15)];
+	f9 = heapFloat[(r5)];
+	f10 = heapFloat[(r4+19)];
+	f11 = heapFloat[(r4+23)];
+	f2 = f1*f2;
+	f6 = f5*f6;
+	f1 = f1*f3;
+	f3 = f5*f7;
+	f0 = f0+f4;
+	f4 = f9*f8;
+	f2 = f2+f6;
+	f5 = f9*f10;
+	f1 = f1+f3;
+	f3 = f9*f11;
+	f0 = f0+f4;
+	f2 = f2+f5;
+	f1 = f1+f3;
+	if(f0 >=f2) //_LBB270_4
+{
+	r4 = 2;
+	r5 = 0;
+	r4 = f0 < f1 ? r4 : r5;
+}
+else{
+	r4 = 2;
+	r5 = 1;
+	r4 = f2 < f1 ? r4 : r5;
+}
+	r4 = r4 << 4;
+	r4 = (r1 + r4)|0;
+	r5 = r3 >> 2;
+	r4 = r4 >> 2;
+	heap32[(r5+-3)] = heap32[(r4+13)];
+	heap32[(r5+-2)] = heap32[(r4+14)];
+	r0 = (r0 + -1)|0;
+	r2 = (r2 + 16)|0;
+	r3 = (r3 + 16)|0;
+	heap32[(r5+-1)] = heap32[(r4+15)];
+	heap32[(r5)] = heap32[(r4+16)];
+	if(r0 !=0) //_LBB270_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZNK15btTriangleShape8getPlaneER9btVector3S1_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+28)];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZNK15btTriangleShape12getNumPlanesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str109;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape36getNumPreferredPenetrationDirectionsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 2;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN24btConvexTriangleCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV24btConvexTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	r1 = heap32[(r0+12)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	r3 = heap32[(r0+16)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r0+12)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = heap32[(r0+16)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	r1 = _ZTV18btTriangleCallback;
+	r1 = (r1 + 8)|0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN24btConvexTriangleCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV24btConvexTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+12)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	r4 = heap32[(r2+16)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+12)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	r4 = heap32[(r2+16)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	r1 = _ZTV18btTriangleCallback;
+	r1 = (r1 + 8)|0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN24btConvexTriangleCallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+var __label__ = 0;
+	i7 = sp + -240;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+13)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(r0+12)];
+	r4 = heap32[(r0+2)];
+if(!(r1 ==0)) //_LBB277_4
+{
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+if(!(r1 ==0)) //_LBB277_4
+{
+	r5 = r1 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+12)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r1 = r_g0 & 1;
+if(!(r1 ==0)) //_LBB277_4
+{
+	r1 = sp + -112;
+	r5 = r1 >> 2;
+	heap32[(fp+-28)] = 1065353216;
+	heap32[(r5+1)] = 1065353216;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	r5 = heap32[(r0+13)];
+	r5 = r5 >> 2;
+	r6 = r4 >> 2;
+	r7 = r2 >> 2;
+	r8 = heap32[(r5+5)];
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r7+4)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+5)];
+	f3 = heapFloat[(r6+2)];
+	r8 = heap32[(r8)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+6)];
+	f7 = heapFloat[(r6+3)];
+	r8 = r8 >> 2;
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	r8 = heap32[(r8+2)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r9 = sp + -96;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r10 = r9 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-24)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r10+1)] = f2;
+	heapFloat[(r10+2)] = f0;
+	heap32[(r10+3)] = 0;
+	f0 = heapFloat[(r7)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+1)];
+	f3 = heapFloat[(r6+2)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+2)];
+	f7 = heapFloat[(r6+3)];
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r10 = sp + -80;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r11 = r10 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-20)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r11+1)] = f2;
+	heapFloat[(r11+2)] = f0;
+	heap32[(r11+3)] = 0;
+	r5 = heap32[(r5+5)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r1;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r5 = heap32[(r0+13)];
+	r5 = r5 >> 2;
+	r8 = heap32[(r5+5)];
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r7+8)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+9)];
+	f3 = heapFloat[(r6+2)];
+	r8 = heap32[(r8)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+10)];
+	f7 = heapFloat[(r6+3)];
+	r8 = r8 >> 2;
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	r8 = heap32[(r8+2)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r9 = sp + -64;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r10 = r9 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-16)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r10+1)] = f2;
+	heapFloat[(r10+2)] = f0;
+	heap32[(r10+3)] = 0;
+	f0 = heapFloat[(r7+4)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+5)];
+	f3 = heapFloat[(r6+2)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+6)];
+	f7 = heapFloat[(r6+3)];
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r10 = sp + -48;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r11 = r10 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-12)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r11+1)] = f2;
+	heapFloat[(r11+2)] = f0;
+	heap32[(r11+3)] = 0;
+	r5 = heap32[(r5+5)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r1;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r5 = heap32[(r0+13)];
+	r5 = r5 >> 2;
+	r8 = heap32[(r5+5)];
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r7)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+1)];
+	f3 = heapFloat[(r6+2)];
+	r8 = heap32[(r8)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+2)];
+	f7 = heapFloat[(r6+3)];
+	r8 = r8 >> 2;
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	r8 = heap32[(r8+2)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r9 = sp + -32;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r10 = r9 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-8)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r10+1)] = f2;
+	heapFloat[(r10+2)] = f0;
+	heap32[(r10+3)] = 0;
+	f0 = heapFloat[(r7+8)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(r7+9)];
+	f3 = heapFloat[(r6+2)];
+	f4 = heapFloat[(r6+5)];
+	f5 = heapFloat[(r6+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r7+10)];
+	f7 = heapFloat[(r6+3)];
+	f8 = heapFloat[(r6+9)];
+	f9 = heapFloat[(r6+10)];
+	f10 = heapFloat[(r6+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+11)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+13)];
+	f8 = heapFloat[(r6+15)];
+	f9 = heapFloat[(r6+14)];
+	r6 = sp + -16;
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	r7 = r6 >> 2;
+	f2 = f4+f9;
+	heapFloat[(fp+-4)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r7+1)] = f2;
+	heapFloat[(r7+2)] = f0;
+	heap32[(r7+3)] = 0;
+	r5 = heap32[(r5+5)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r1;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+}
+}
+	r1 = heap32[(r0+1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+48)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+1)];
+if(!(r1 >19)) //_LBB277_9
+{
+	r1 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = sp + -216;
+	r7 = r6 >> 2;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 1065353216;
+	heap32[(r7+4)] = 1065353216;
+	r8 = _ZTV15btTriangleShape;
+	heap32[(r7+5)] = 1065353216;
+	r8 = (r8 + 8)|0;
+	heap32[(r7+6)] = 0;
+	heap32[(fp+-54)] = r8;
+	r2 = r2 >> 2;
+	heap32[(r7+1)] = 1;
+	heap32[(r7+13)] = heap32[(r2)];
+	heap32[(r7+14)] = heap32[(r2+1)];
+	heap32[(r7+15)] = heap32[(r2+2)];
+	heap32[(r7+16)] = heap32[(r2+3)];
+	heap32[(r7+17)] = heap32[(r2+4)];
+	heap32[(r7+18)] = heap32[(r2+5)];
+	heap32[(r7+19)] = heap32[(r2+6)];
+	heap32[(r7+20)] = heap32[(r2+7)];
+	heap32[(r7+21)] = heap32[(r2+8)];
+	heap32[(r7+22)] = heap32[(r2+9)];
+	heap32[(r7+23)] = heap32[(r2+10)];
+	heap32[(r7+24)] = heap32[(r2+11)];
+	r2 = r4 >> 2;
+	heap32[(r7+11)] = heap32[(r0+14)];
+	r4 = heap32[(r2+48)];
+	heap32[(r2+48)] = r6;
+	r6 = r3 >> 2;
+	r7 = heap32[(r6)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+2)];
+	r8 = heap32[(r0+16)];
+	r9 = heap32[(r0+2)];
+	r10 = heap32[(r0+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r7 = r_g0;
+	r8 = heap32[(r0+11)];
+	r9 = r8 >> 2;
+	r10 = heap32[(r9)];
+	r9 = heap32[(r9+34)];
+	r11 = heap32[(r0+2)];
+	if(r9 !=r11) //_LBB277_7
+{
+	r9 = r10 >> 2;
+	r9 = heap32[(r9+3)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+else{
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+}
+	r1 = r7 >> 2;
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r8 = heap32[(r0+11)];
+	r9 = heap32[(r0+13)];
+	r10 = heap32[(r0+2)];
+	r0 = heap32[(r0+1)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r8;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = heap32[(r1)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	heap32[(g0)] = r7;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = heap32[(r6)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+13)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	heap32[(r2+48)] = r4;
+}
+	return;
+}
+
+function _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -800;var g0 = i7>>2; // save stack
+	r0 = sp + -64;
+	r1 = r0 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+5)] = 1065353216;
+	heap32[(r1+6)] = 0;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+8)] = 0;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+10)] = 1065353216;
+	heap32[(r1+11)] = 0;
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = 0;
+	r2 = _ZTVN12btConvexCast10CastResultE;
+	heap32[(r1+14)] = 0;
+	r3 = sp + -240;
+	r2 = (r2 + 8)|0;
+	heap32[(r1+15)] = 0;
+	r1 = r3 >> 2;
+	heap32[(fp+-60)] = r2;
+	r2 = heap32[(fp)];
+	heap32[(r1+42)] = 0;
+	r4 = r2 >> 2;
+	heap32[(r1+43)] = 0;
+	r5 = sp + -296;
+	heap32[(r1+41)] = heap32[(r4+50)];
+	r6 = r5 >> 2;
+	f0 = heapFloat[(r4+49)];
+	heap32[(r6+2)] = 0;
+	heap32[(r6+3)] = 1065353216;
+	heap32[(r6+4)] = 1065353216;
+	r7 = _ZTV13btSphereShape;
+	heap32[(r6+5)] = 1065353216;
+	r7 = (r7 + 8)|0;
+	heap32[(r6+6)] = 0;
+	heap32[(fp+-74)] = r7;
+	heap32[(r6+1)] = 8;
+	r7 = sp + -400;
+	heapFloat[(r6+7)] = f0;
+	r8 = r7 >> 2;
+	heapFloat[(r6+11)] = f0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 1065353216;
+	heap32[(r8+4)] = 1065353216;
+	heap32[(r8+5)] = 1065353216;
+	r6 = _ZTV15btTriangleShape;
+	heap32[(r8+6)] = 0;
+	r6 = (r6 + 8)|0;
+	heap32[(r8+11)] = 1025758986;
+	r9 = heap32[(fp+1)];
+	heap32[(fp+-100)] = r6;
+	r6 = r9 >> 2;
+	heap32[(r8+1)] = 1;
+	heap32[(r8+13)] = heap32[(r6)];
+	heap32[(r8+14)] = heap32[(r6+1)];
+	heap32[(r8+15)] = heap32[(r6+2)];
+	heap32[(r8+16)] = heap32[(r6+3)];
+	heap32[(r8+17)] = heap32[(r6+4)];
+	heap32[(r8+18)] = heap32[(r6+5)];
+	heap32[(r8+19)] = heap32[(r6+6)];
+	heap32[(r8+20)] = heap32[(r6+7)];
+	heap32[(r8+21)] = heap32[(r6+8)];
+	heap32[(r8+22)] = heap32[(r6+9)];
+	r9 = sp + -760;
+	heap32[(r8+23)] = heap32[(r6+10)];
+	r10 = r9 >> 2;
+	heap32[(r8+24)] = heap32[(r6+11)];
+	r6 = _ZTV22btSubsimplexConvexCast;
+	r8 = 0;
+	heap32[(r10+77)] = 953267991;
+	r10 = sp + -776;
+	r6 = (r6 + 8)|0;
+	heap8[sp+-428] = r8;
+	r8 = r10 >> 2;
+	heap32[(fp+-194)] = r6;
+	heap32[(r8+1)] = r9;
+	heap32[(r8+2)] = r5;
+	heap32[(r8+3)] = r7;
+	r5 = (r2 + 4)|0;
+	r2 = (r2 + 68)|0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r0;
+	heap32[(g0+4)] = r0;
+	heap32[(g0+5)] = r3;
+	_ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB280_3
+{
+	f0 = heapFloat[(r1+41)];
+	f1 = heapFloat[(r4+50)];
+if(!(f1 <=f0)) //_LBB280_3
+{
+	heapFloat[(r4+50)] = f0;
+}
+}
+	return;
+}
+
+function _ZN15btTriangleShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN15btTriangleShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB282_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZNK15btTriangleShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str3112;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 125;
+	_assert(i7);
+}
+
+function _ZNK21btConvexInternalShape9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+if(!(r4 ==0)) //_LBB284_2
+{
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	r0 = r3 >> 2;
+	r1 = heap32[(r0+1)];
+	heap32[(r5+1)] = r1;
+	heap32[(r5+7)] = heap32[(r0+7)];
+	heap32[(r5+8)] = heap32[(r0+8)];
+	heap32[(r5+9)] = heap32[(r0+9)];
+	heap32[(r5+10)] = heap32[(r0+10)];
+	heap32[(r5+3)] = heap32[(r0+3)];
+	heap32[(r5+4)] = heap32[(r0+4)];
+	heap32[(r5+5)] = heap32[(r0+5)];
+	heap32[(r5+6)] = heap32[(r0+6)];
+	heap32[(r5+11)] = heap32[(r0+11)];
+	r0 = _2E_str1110;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape32getPreferredPenetrationDirectionEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+23)];
+	f1 = heapFloat[(r0+15)];
+	f2 = heapFloat[(r0+19)];
+	f3 = heapFloat[(r0+22)];
+	f4 = heapFloat[(r0+14)];
+	f5 = heapFloat[(r0+18)];
+	f5 = f5-f4;
+	f0 = f0-f1;
+	f1 = f2-f1;
+	f2 = f3-f4;
+	f3 = heapFloat[(r0+21)];
+	f4 = heapFloat[(r0+13)];
+	f6 = heapFloat[(r0+17)];
+	f3 = f3-f4;
+	f4 = f6-f4;
+	r0 = heap32[(fp+2)];
+	f6 = f5*f0;
+	f7 = f1*f2;
+	f6 = f6-f7;
+	f1 = f1*f3;
+	f0 = f4*f0;
+	r0 = r0 >> 2;
+	f0 = f1-f0;
+	heapFloat[(r0)] = f6;
+	f1 = f4*f2;
+	f2 = f5*f3;
+	f1 = f1-f2;
+	heapFloat[(r0+1)] = f0;
+	heapFloat[(r0+2)] = f1;
+	f2 = f6*f6;
+	f0 = f0*f0;
+	heap32[(r0+3)] = 0;
+	f0 = f2+f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r0)];
+	f1 = f1*f0;
+	heapFloat[(r0)] = f1;
+	f2 = heapFloat[(r0+1)];
+	f2 = f2*f0;
+	heapFloat[(r0+1)] = f2;
+	f3 = heapFloat[(r0+2)];
+	f0 = f3*f0;
+	heapFloat[(r0+2)] = f0;
+	r1 = heap32[(fp+1)];
+if(!(r1 ==0)) //_LBB285_2
+{
+	f1 = -f1;
+	f2 = -f2;
+	heapFloat[(r0)] = f1;
+	f0 = -f0;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+}
+	return;
+}
+
+function _ZNK15btTriangleShape8isInsideERK9btVector3f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(r1+19)];
+	f1 = heapFloat[(r1+15)];
+	f2 = heapFloat[(r1+23)];
+	f3 = heapFloat[(r1+17)];
+	f4 = heapFloat[(r1+13)];
+	f5 = heapFloat[(r1+21)];
+	f6 = heapFloat[(r1+22)];
+	f7 = heapFloat[(r1+14)];
+	f8 = heapFloat[(r1+18)];
+	f0 = f0-f1;
+	f6 = f6-f7;
+	f3 = f3-f4;
+	f1 = f2-f1;
+	f2 = f8-f7;
+	f4 = f5-f4;
+	f5 = f2*f1;
+	f7 = f0*f6;
+	f0 = f0*f4;
+	f1 = f3*f1;
+	f5 = f5-f7;
+	f0 = f0-f1;
+	f1 = f3*f6;
+	f2 = f2*f4;
+	f1 = f1-f2;
+	f2 = f5*f5;
+	f3 = f0*f0;
+	f2 = f2+f3;
+	f3 = f1*f1;
+	f2 = f2+f3;
+	heapFloat[(g0)] = f2;
+	sqrtf(i7);
+	r2 = heap32[(fp+1)];
+	f3 =                         1;
+	r2 = r2 >> 2;
+	f2 = f3/f_g0;
+	f4 = f5*f2;
+	f5 = heapFloat[(r2)];
+	f6 = heapFloat[(r1+13)];
+	f0 = f0*f2;
+	f7 = heapFloat[(r2+1)];
+	f8 = heapFloat[(r1+14)];
+	f1 = f1*f2;
+	f2 = heapFloat[(r2+2)];
+	f9 = heapFloat[(r1+15)];
+	f5 = f5*f4;
+	f7 = f7*f0;
+	f6 = f6*f4;
+	f8 = f8*f0;
+	f5 = f5+f7;
+	f2 = f2*f1;
+	f6 = f6+f8;
+	f7 = f9*f1;
+	f8 = heapFloat[(fp+2)];
+	f2 = f5+f2;
+	f5 = f6+f7;
+	f2 = f2-f5;
+	f5 = -f8;
+_1: do {
+	if(f2 <f5) //_LBB286_2
+{
+__label__ = 2;
+}
+else{
+	if(f2 <=f8) //_LBB286_3
+{
+	r3 = 0;
+_4: while(true){
+	if(r3 <3) //_LBB286_4
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+23)];
+	r5 = sp + -32;
+	r6 = sp + -16;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r5 >> 2;
+	r5 = r6 >> 2;
+	f2 = heapFloat[(r4+2)];
+	f6 = heapFloat[(r5+2)];
+	f7 = heapFloat[(r4+1)];
+	f8 = heapFloat[(r5+1)];
+	f9 = heapFloat[(fp+-8)];
+	f10 = heapFloat[(fp+-4)];
+	f2 = f2-f6;
+	f6 = f9-f10;
+	f7 = f7-f8;
+	f8 = f7*f1;
+	f9 = f2*f0;
+	f2 = f2*f4;
+	f10 = f6*f1;
+	f8 = f8-f9;
+	f2 = f2-f10;
+	f6 = f6*f0;
+	f7 = f7*f4;
+	f6 = f6-f7;
+	f7 = f8*f8;
+	f9 = f2*f2;
+	f7 = f7+f9;
+	f9 = f6*f6;
+	f7 = f7+f9;
+	heapFloat[(g0)] = f7;
+	sqrtf(i7);
+	f7 = f3/f_g0;
+	f9 = heapFloat[(r2)];
+	f8 = f8*f7;
+	f10 = heapFloat[(fp+-4)];
+	f11 = heapFloat[(r2+1)];
+	f2 = f2*f7;
+	f12 = heapFloat[(r5+1)];
+	f9 = f9*f8;
+	f11 = f11*f2;
+	f13 = heapFloat[(r2+2)];
+	f6 = f6*f7;
+	f7 = heapFloat[(r5+2)];
+	f8 = f10*f8;
+	f2 = f12*f2;
+	f9 = f9+f11;
+	f10 = f13*f6;
+	f2 = f8+f2;
+	f6 = f7*f6;
+	f7 = f9+f10;
+	f2 = f2+f6;
+	f2 = f7-f2;
+	if(f2 <f5) //_LBB286_2
+{
+__label__ = 2;
+break _1;
+}
+else{
+	r3 = (r3 + 1)|0;
+}
+}
+else{
+break _4;
+}
+}
+	r0 = 1;
+__label__ = 8;
+}
+else{
+__label__ = 2;
+}
+}
+} while(0);
+if (__label__ == 2){
+	r0 = 0;
+}
+	r0 = r0 & 255;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btTriangleShape16getPlaneEquationEiR9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+23)];
+	f1 = heapFloat[(r0+15)];
+	f2 = heapFloat[(r0+19)];
+	f3 = heapFloat[(r0+22)];
+	f4 = heapFloat[(r0+14)];
+	f5 = heapFloat[(r0+18)];
+	f5 = f5-f4;
+	f0 = f0-f1;
+	f1 = f2-f1;
+	f2 = f3-f4;
+	f3 = heapFloat[(r0+21)];
+	f4 = heapFloat[(r0+13)];
+	f6 = heapFloat[(r0+17)];
+	f3 = f3-f4;
+	f4 = f6-f4;
+	r1 = heap32[(fp+2)];
+	f6 = f5*f0;
+	f7 = f1*f2;
+	f6 = f6-f7;
+	r1 = r1 >> 2;
+	f1 = f1*f3;
+	f0 = f4*f0;
+	f0 = f1-f0;
+	heapFloat[(r1)] = f6;
+	f1 = f4*f2;
+	f2 = f5*f3;
+	f1 = f1-f2;
+	heapFloat[(r1+1)] = f0;
+	heapFloat[(r1+2)] = f1;
+	f2 = f6*f6;
+	f0 = f0*f0;
+	heap32[(r1+3)] = 0;
+	f0 = f2+f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r1)];
+	f1 = f1*f0;
+	heapFloat[(r1)] = f1;
+	f1 = heapFloat[(r1+1)];
+	f1 = f1*f0;
+	heapFloat[(r1+1)] = f1;
+	f1 = heapFloat[(r1+2)];
+	r2 = heap32[(fp+3)];
+	f0 = f1*f0;
+	r2 = r2 >> 2;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r2)] = heap32[(r0+13)];
+	heap32[(r2+1)] = heap32[(r0+14)];
+	heap32[(r2+2)] = heap32[(r0+15)];
+	heap32[(r2+3)] = heap32[(r0+16)];
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -440;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = heapU8[r0+8];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = r0 == 0 ? r1 : r2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3+30)];
+	f1 = heapFloat[(r3+14)];
+	f2 = heapFloat[(r3+29)];
+	f3 = heapFloat[(r3+13)];
+	f4 = f2-f3;
+	f5 = f0-f1;
+	f6 = heapFloat[(r3+31)];
+	f7 = heapFloat[(r3+15)];
+	f8 = f6-f7;
+	f4 = f4*f4;
+	f5 = f5*f5;
+	f9 = heapFloat[(r3+62)];
+	f4 = f4+f5;
+	f5 = f8*f8;
+	f8 = f9*f9;
+	f4 = f4+f5;
+if(!(f8 >f4)) //_LBB288_23
+{
+	r0 = r0 == 0 ? r2 : r1;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+48)];
+	r2 = r1 >> 2;
+	r4 = heap32[(r2+1)];
+	r4 = (r4 + -21)|0;
+if(!(uint(r4) >uint(8))) //_LBB288_23
+{
+	f4 = heapFloat[(r0+13)];
+	f5 = heapFloat[(r0+3)];
+	f8 = heapFloat[(r0+2)];
+	f4 = -f4;
+	f9 = heapFloat[(r0+1)];
+	f10 = heapFloat[(r0+7)];
+	f11 = heapFloat[(r0+6)];
+	f12 = heapFloat[(r0+14)];
+	f13 = heapFloat[(r0+5)];
+	f14 = heapFloat[(r3+3)];
+	f15 = heapFloat[(r3+7)];
+	f16 = heapFloat[(r3+2)];
+	f17 = heapFloat[(r3+6)];
+	f18 = heapFloat[(r3+1)];
+	f19 = heapFloat[(r3+5)];
+	f20 = heapFloat[(r3+19)];
+	heapFloat[(fp+-63)] = f20;
+	f21 = heapFloat[(r3+23)];
+	f22 = heapFloat[(r3+18)];
+	f23 = heapFloat[(r3+22)];
+	f24 = heapFloat[(r3+17)];
+	f25 = heapFloat[(r3+21)];
+	f26 = f5*f3;
+	heapFloat[(fp+-65)] = f26;
+	f27 = f10*f1;
+	f28 = f8*f3;
+	heapFloat[(fp+-66)] = f28;
+	f29 = f11*f1;
+	f3 = f9*f3;
+	heapFloat[(fp+-64)] = f3;
+	f1 = f13*f1;
+	f30 = heapFloat[(r0+11)];
+	f3 = heapFloat[(r0+10)];
+	f20 = heapFloat[(r0+15)];
+	f26 = heapFloat[(r0+9)];
+	f28 = f5*f2;
+	heapFloat[(fp+-67)] = f28;
+	f28 = f10*f0;
+	heapFloat[(fp+-69)] = f28;
+	f28 = f5*f4;
+	heapFloat[(fp+-68)] = f28;
+	f28 = f10*f12;
+	heapFloat[(fp+-71)] = f28;
+	f28 = f8*f2;
+	heapFloat[(fp+-70)] = f28;
+	f28 = f11*f0;
+	heapFloat[(fp+-73)] = f28;
+	f28 = f8*f4;
+	heapFloat[(fp+-72)] = f28;
+	f28 = f11*f12;
+	heapFloat[(fp+-78)] = f28;
+	f2 = f9*f2;
+	heapFloat[(fp+-74)] = f2;
+	f0 = f13*f0;
+	heapFloat[(fp+-76)] = f0;
+	f4 = f9*f4;
+	heapFloat[(fp+-75)] = f4;
+	f12 = f13*f12;
+	heapFloat[(fp+-77)] = f12;
+	f0 = heapFloat[(r3+11)];
+	f2 = heapFloat[(r3+10)];
+	f4 = heapFloat[(r3+9)];
+	f12 = heapFloat[(r3+27)];
+	f28 = heapFloat[(r3+26)];
+	heapFloat[(fp+-62)] = f28;
+	f28 = heapFloat[(r3+25)];
+	heapFloat[(fp+-61)] = f28;
+	f28 = heapFloat[(fp+-65)];
+	f27 = f28+f27;
+	heapFloat[(fp+-65)] = f27;
+	f27 = f30*f7;
+	heapFloat[(fp+-99)] = f27;
+	f28 = heapFloat[(fp+-66)];
+	f28 = f28+f29;
+	heapFloat[(fp+-66)] = f28;
+	f29 = f3*f7;
+	heapFloat[(fp+-98)] = f29;
+	f27 = heapFloat[(fp+-64)];
+	f1 = f27+f1;
+	heapFloat[(fp+-80)] = f1;
+	f7 = f26*f7;
+	heapFloat[(fp+-97)] = f7;
+	f27 = f14*f5;
+	heapFloat[(fp+-64)] = f27;
+	f1 = f15*f10;
+	heapFloat[(fp+-82)] = f1;
+	f1 = f16*f5;
+	heapFloat[(fp+-79)] = f1;
+	f1 = f17*f10;
+	heapFloat[(fp+-84)] = f1;
+	f1 = f18*f5;
+	heapFloat[(fp+-81)] = f1;
+	f1 = f19*f10;
+	heapFloat[(fp+-86)] = f1;
+	f1 = f14*f8;
+	heapFloat[(fp+-83)] = f1;
+	f1 = f15*f11;
+	heapFloat[(fp+-88)] = f1;
+	f1 = f16*f8;
+	heapFloat[(fp+-85)] = f1;
+	f1 = f17*f11;
+	heapFloat[(fp+-92)] = f1;
+	f1 = f18*f8;
+	heapFloat[(fp+-87)] = f1;
+	f1 = f19*f11;
+	heapFloat[(fp+-93)] = f1;
+	f14 = f14*f9;
+	heapFloat[(fp+-89)] = f14;
+	f15 = f15*f13;
+	heapFloat[(fp+-94)] = f15;
+	f16 = f16*f9;
+	heapFloat[(fp+-90)] = f16;
+	f17 = f17*f13;
+	heapFloat[(fp+-95)] = f17;
+	f18 = f18*f9;
+	heapFloat[(fp+-91)] = f18;
+	f19 = f19*f13;
+	heapFloat[(fp+-96)] = f19;
+	f1 = heapFloat[(fp+-67)];
+	f7 = heapFloat[(fp+-69)];
+	f1 = f1+f7;
+	f7 = f30*f6;
+	f14 = heapFloat[(fp+-68)];
+	f15 = heapFloat[(fp+-71)];
+	f14 = f14-f15;
+	f15 = f30*f20;
+	f16 = heapFloat[(fp+-70)];
+	f17 = heapFloat[(fp+-73)];
+	f16 = f16+f17;
+	f17 = f3*f6;
+	f18 = heapFloat[(fp+-72)];
+	f19 = heapFloat[(fp+-78)];
+	f18 = f18-f19;
+	f19 = f3*f20;
+	f27 = heapFloat[(fp+-74)];
+	f28 = heapFloat[(fp+-76)];
+	f27 = f27+f28;
+	f6 = f26*f6;
+	f28 = heapFloat[(fp+-75)];
+	f29 = heapFloat[(fp+-77)];
+	f28 = f28-f29;
+	f20 = f26*f20;
+	f29 = heapFloat[(fp+-63)];
+	f29 = f29*f5;
+	heapFloat[(fp+-67)] = f29;
+	f29 = f21*f10;
+	heapFloat[(fp+-69)] = f29;
+	f29 = f22*f5;
+	heapFloat[(fp+-68)] = f29;
+	f29 = f23*f10;
+	f5 = f24*f5;
+	heapFloat[(fp+-70)] = f5;
+	f5 = f25*f10;
+	heapFloat[(fp+-101)] = f5;
+	f10 = heapFloat[(fp+-63)];
+	f5 = f10*f8;
+	heapFloat[(fp+-71)] = f5;
+	f5 = f21*f11;
+	heapFloat[(fp+-73)] = f5;
+	f5 = f22*f8;
+	heapFloat[(fp+-72)] = f5;
+	f5 = f23*f11;
+	heapFloat[(fp+-100)] = f5;
+	f8 = f24*f8;
+	heapFloat[(fp+-74)] = f8;
+	f5 = f25*f11;
+	heapFloat[(fp+-102)] = f5;
+	f8 = f10*f9;
+	heapFloat[(fp+-75)] = f8;
+	f5 = f21*f13;
+	heapFloat[(fp+-103)] = f5;
+	f8 = f22*f9;
+	heapFloat[(fp+-78)] = f8;
+	f5 = f23*f13;
+	heapFloat[(fp+-104)] = f5;
+	f8 = f24*f9;
+	heapFloat[(fp+-76)] = f8;
+	f5 = f25*f13;
+	heapFloat[(fp+-105)] = f5;
+	f8 = heapFloat[(fp+-65)];
+	f9 = heapFloat[(fp+-99)];
+	f8 = f8+f9;
+	heapFloat[(fp+-77)] = f8;
+	f9 = f14-f15;
+	f1 = f1+f7;
+	heapFloat[(fp+-63)] = f1;
+	f7 = heapFloat[(fp+-66)];
+	f10 = heapFloat[(fp+-98)];
+	f7 = f7+f10;
+	heapFloat[(fp+-98)] = f7;
+	f10 = f18-f19;
+	f11 = f16+f17;
+	heapFloat[(fp+-65)] = f11;
+	f13 = heapFloat[(fp+-80)];
+	f14 = heapFloat[(fp+-97)];
+	f1 = f13+f14;
+	heapFloat[(fp+-80)] = f1;
+	f5 = f28-f20;
+	f6 = f27+f6;
+	heapFloat[(fp+-66)] = f6;
+	f7 = heapFloat[(fp+-64)];
+	f8 = heapFloat[(fp+-82)];
+	f1 = f7+f8;
+	heapFloat[(fp+-64)] = f1;
+	f1 = f0*f30;
+	heapFloat[(fp+-82)] = f1;
+	f6 = heapFloat[(fp+-79)];
+	f7 = heapFloat[(fp+-84)];
+	f1 = f6+f7;
+	heapFloat[(fp+-79)] = f1;
+	f1 = f2*f30;
+	heapFloat[(fp+-84)] = f1;
+	f6 = heapFloat[(fp+-81)];
+	f7 = heapFloat[(fp+-86)];
+	f1 = f6+f7;
+	heapFloat[(fp+-81)] = f1;
+	f1 = f4*f30;
+	heapFloat[(fp+-86)] = f1;
+	f6 = heapFloat[(fp+-83)];
+	f7 = heapFloat[(fp+-88)];
+	f1 = f6+f7;
+	heapFloat[(fp+-83)] = f1;
+	f1 = f0*f3;
+	heapFloat[(fp+-88)] = f1;
+	f6 = heapFloat[(fp+-85)];
+	f7 = heapFloat[(fp+-92)];
+	f1 = f6+f7;
+	heapFloat[(fp+-85)] = f1;
+	f1 = f2*f3;
+	heapFloat[(fp+-92)] = f1;
+	f6 = heapFloat[(fp+-87)];
+	f7 = heapFloat[(fp+-93)];
+	f1 = f6+f7;
+	heapFloat[(fp+-87)] = f1;
+	f1 = f4*f3;
+	heapFloat[(fp+-93)] = f1;
+	f6 = heapFloat[(fp+-89)];
+	f7 = heapFloat[(fp+-94)];
+	f1 = f6+f7;
+	heapFloat[(fp+-89)] = f1;
+	f0 = f0*f26;
+	f6 = heapFloat[(fp+-90)];
+	f7 = heapFloat[(fp+-95)];
+	f6 = f6+f7;
+	f2 = f2*f26;
+	f7 = heapFloat[(fp+-91)];
+	f8 = heapFloat[(fp+-96)];
+	f7 = f7+f8;
+	f4 = f4*f26;
+	f8 = heapFloat[(fp+-67)];
+	f11 = heapFloat[(fp+-69)];
+	f8 = f8+f11;
+	f11 = f12*f30;
+	f13 = heapFloat[(fp+-68)];
+	f13 = f13+f29;
+	f28 = heapFloat[(fp+-62)];
+	f14 = f28*f30;
+	f15 = heapFloat[(fp+-70)];
+	f16 = heapFloat[(fp+-101)];
+	f15 = f15+f16;
+	f28 = heapFloat[(fp+-61)];
+	f16 = f28*f30;
+	f17 = heapFloat[(fp+-71)];
+	f18 = heapFloat[(fp+-73)];
+	f17 = f17+f18;
+	f18 = f12*f3;
+	f19 = heapFloat[(fp+-72)];
+	f20 = heapFloat[(fp+-100)];
+	f19 = f19+f20;
+	f28 = heapFloat[(fp+-62)];
+	f20 = f28*f3;
+	f21 = heapFloat[(fp+-74)];
+	f22 = heapFloat[(fp+-102)];
+	f21 = f21+f22;
+	f28 = heapFloat[(fp+-61)];
+	f3 = f28*f3;
+	f22 = heapFloat[(fp+-75)];
+	f23 = heapFloat[(fp+-103)];
+	f22 = f22+f23;
+	f12 = f12*f26;
+	f23 = heapFloat[(fp+-78)];
+	f24 = heapFloat[(fp+-104)];
+	f23 = f23+f24;
+	f28 = heapFloat[(fp+-62)];
+	f24 = f28*f26;
+	f25 = heapFloat[(fp+-76)];
+	f27 = heapFloat[(fp+-105)];
+	f25 = f25+f27;
+	f28 = heapFloat[(fp+-61)];
+	f26 = f28*f26;
+	f27 = heapFloat[(fp+-77)];
+	f27 = f27+f9;
+	f28 = heapFloat[(fp+-98)];
+	f28 = f28+f10;
+	f29 = heapFloat[(fp+-80)];
+	f29 = f29+f5;
+	f30 = heapFloat[(fp+-64)];
+	f1 = heapFloat[(fp+-82)];
+	f1 = f30+f1;
+	heapFloat[(fp+-61)] = f1;
+	f1 = heapFloat[(fp+-79)];
+	f30 = heapFloat[(fp+-84)];
+	f1 = f1+f30;
+	heapFloat[(fp+-62)] = f1;
+	f1 = heapFloat[(fp+-81)];
+	f30 = heapFloat[(fp+-86)];
+	f1 = f1+f30;
+	heapFloat[(fp+-64)] = f1;
+	f1 = heapFloat[(fp+-83)];
+	f30 = heapFloat[(fp+-88)];
+	f1 = f1+f30;
+	heapFloat[(fp+-67)] = f1;
+	f1 = heapFloat[(fp+-85)];
+	f30 = heapFloat[(fp+-92)];
+	f1 = f1+f30;
+	heapFloat[(fp+-68)] = f1;
+	f1 = heapFloat[(fp+-87)];
+	f30 = heapFloat[(fp+-93)];
+	f1 = f1+f30;
+	f30 = heapFloat[(fp+-89)];
+	f0 = f30+f0;
+	f2 = f6+f2;
+	f4 = f7+f4;
+	f6 = heapFloat[(fp+-63)];
+	f6 = f6+f9;
+	f7 = heapFloat[(fp+-65)];
+	f7 = f7+f10;
+	f9 = heapFloat[(fp+-66)];
+	f5 = f9+f5;
+	f8 = f8+f11;
+	f9 = f13+f14;
+	f10 = f15+f16;
+	f11 = f17+f18;
+	f13 = f19+f20;
+	f3 = f21+f3;
+	f12 = f22+f12;
+	f14 = f23+f24;
+	f15 = f25+f26;
+	r0 = sp + -16;
+	r4 = r0 >> 2;
+	heapFloat[(fp+-4)] = f29;
+	heapFloat[(r4+1)] = f28;
+	heapFloat[(r4+2)] = f27;
+	heap32[(r4+3)] = 0;
+	if(f5 <f29) //_LBB288_4
+{
+	heapFloat[(fp+-4)] = f5;
+	f16 = f5;
+}
+else{
+	f16 = f29;
+}
+	if(f7 <f28) //_LBB288_7
+{
+	heapFloat[(r4+1)] = f7;
+	f17 = f7;
+}
+else{
+	f17 = f28;
+}
+	if(f6 <f27) //_LBB288_10
+{
+	heapFloat[(r4+2)] = f6;
+	f18 = f6;
+}
+else{
+	f18 = f27;
+}
+	r5 = sp + -32;
+	r6 = r5 >> 2;
+	heapFloat[(fp+-8)] = f29;
+	heapFloat[(r6+1)] = f28;
+	heapFloat[(r6+2)] = f27;
+	heap32[(r6+3)] = 0;
+	if(f29 <f5) //_LBB288_13
+{
+	heapFloat[(fp+-8)] = f5;
+	f19 = f5;
+}
+else{
+	f19 = f29;
+}
+	if(f28 <f7) //_LBB288_16
+{
+	heapFloat[(r6+1)] = f7;
+	f20 = f7;
+}
+else{
+	f20 = f28;
+}
+	if(f27 <f6) //_LBB288_19
+{
+	heapFloat[(r6+2)] = f6;
+	f21 = f6;
+}
+else{
+	f21 = f27;
+}
+	f22 = heapFloat[(r3+61)];
+	f16 = f16-f22;
+	f17 = f17-f22;
+	heapFloat[(fp+-4)] = f16;
+	f16 = f18-f22;
+	heapFloat[(r4+1)] = f17;
+	f17 = f19+f22;
+	heapFloat[(r4+2)] = f16;
+	f16 = f20+f22;
+	heapFloat[(fp+-8)] = f17;
+	r4 = _ZTVZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback;
+	f17 = f21+f22;
+	heapFloat[(r6+1)] = f16;
+	r7 = sp + -240;
+	r4 = (r4 + 8)|0;
+	heapFloat[(r6+2)] = f17;
+	r6 = r7 >> 2;
+	heap32[(fp+-60)] = r4;
+	heapFloat[(r6+1)] = f4;
+	heapFloat[(r6+2)] = f2;
+	heapFloat[(r6+3)] = f0;
+	heap32[(r6+4)] = 0;
+	heapFloat[(r6+5)] = f1;
+	f0 = heapFloat[(fp+-68)];
+	heapFloat[(r6+6)] = f0;
+	f0 = heapFloat[(fp+-67)];
+	heapFloat[(r6+7)] = f0;
+	heap32[(r6+8)] = 0;
+	f0 = heapFloat[(fp+-64)];
+	heapFloat[(r6+9)] = f0;
+	f0 = heapFloat[(fp+-62)];
+	heapFloat[(r6+10)] = f0;
+	f0 = heapFloat[(fp+-61)];
+	heapFloat[(r6+11)] = f0;
+	heap32[(r6+12)] = 0;
+	heapFloat[(r6+13)] = f29;
+	heapFloat[(r6+14)] = f28;
+	heapFloat[(r6+15)] = f27;
+	heap32[(r6+16)] = 0;
+	heapFloat[(r6+17)] = f15;
+	heapFloat[(r6+18)] = f14;
+	heapFloat[(r6+19)] = f12;
+	heap32[(r6+20)] = 0;
+	heapFloat[(r6+21)] = f3;
+	heapFloat[(r6+22)] = f13;
+	heapFloat[(r6+23)] = f11;
+	heap32[(r6+24)] = 0;
+	heapFloat[(r6+25)] = f10;
+	heapFloat[(r6+26)] = f9;
+	heapFloat[(r6+27)] = f8;
+	heap32[(r6+28)] = 0;
+	heapFloat[(r6+29)] = f5;
+	heapFloat[(r6+30)] = f7;
+	heapFloat[(r6+31)] = f6;
+	heap32[(r6+32)] = 0;
+	heapFloat[(r6+49)] = f22;
+	heap32[(r6+50)] = heap32[(r3+60)];
+if(!(r1 ==0)) //_LBB288_23
+{
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+15)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = heapFloat[(r6+50)];
+	f1 = heapFloat[(r3+60)];
+if(!(f0 >=f1)) //_LBB288_23
+{
+	heapFloat[(r3+60)] = f0;
+	f_g0 = f0;
+	return;
+}
+}
+}
+}
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -80;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+8];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+1)];
+	r4 = r1 == 0 ? r2 : r3;
+	r5 = r4 >> 2;
+	r5 = heap32[(r5+48)];
+	r6 = r5 >> 2;
+	r7 = heap32[(r6+1)];
+	r7 = (r7 + -21)|0;
+if(!(uint(r7) >uint(8))) //_LBB289_8
+{
+	r1 = r1 == 0 ? r3 : r2;
+	r2 = r1 >> 2;
+	r2 = heap32[(r2+48)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+if(!(r2 >19)) //_LBB289_8
+{
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp+4)];
+	r7 = heap32[(r6)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+11)];
+	heap32[(g0)] = r5;
+	r8 = r0 >> 2;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	f0 = f_g0;
+	r7 = r3 >> 2;
+	r9 = heap32[(r8+19)];
+	heap32[(r7+1)] = r9;
+	heap32[(r8+16)] = r2;
+	heapFloat[(r8+17)] = f0;
+	heap32[(r8+14)] = r3;
+	r2 = heap32[(r8+4)];
+	r9 = heap32[(r8+5)];
+	r9 = r9 >> 2;
+	r2 = r2 >> 2;
+	f1 = heapFloat[(r9+1)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r9+5)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+2)];
+	f6 = heapFloat[(r2+6)];
+	f7 = f2*f1;
+	f8 = f4*f3;
+	f9 = heapFloat[(r9+9)];
+	f10 = heapFloat[(r2+9)];
+	f11 = heapFloat[(r9+2)];
+	f12 = heapFloat[(r9+6)];
+	f13 = heapFloat[(r9+3)];
+	f14 = heapFloat[(r2+13)];
+	f15 = heapFloat[(r2+3)];
+	f16 = heapFloat[(r9+7)];
+	f17 = heapFloat[(r9+14)];
+	f18 = heapFloat[(r2+14)];
+	f19 = heapFloat[(r2+7)];
+	f20 = heapFloat[(r9+10)];
+	f21 = heapFloat[(r9+15)];
+	f22 = heapFloat[(r9+11)];
+	f23 = heapFloat[(r2+15)];
+	f24 = heapFloat[(r2+11)];
+	f25 = heapFloat[(r2+10)];
+	f26 = heapFloat[(r9+13)];
+	f27 = f5*f1;
+	f28 = f6*f3;
+	f7 = f7+f8;
+	f8 = f10*f9;
+	r9 = sp + -64;
+	f29 = f15*f1;
+	f30 = f19*f3;
+	f27 = f27+f28;
+	f28 = f25*f9;
+	f7 = f7+f8;
+	r10 = r9 >> 2;
+	f8 = f29+f30;
+	f29 = f24*f9;
+	f27 = f27+f28;
+	heapFloat[(fp+-16)] = f7;
+	f7 = f2*f11;
+	f28 = f4*f12;
+	f8 = f8+f29;
+	heapFloat[(r10+1)] = f27;
+	heapFloat[(r10+2)] = f8;
+	f8 = f5*f11;
+	f27 = f6*f12;
+	f7 = f7+f28;
+	f28 = f10*f20;
+	f29 = f15*f11;
+	f30 = f19*f12;
+	f8 = f8+f27;
+	f27 = f25*f20;
+	f7 = f7+f28;
+	heap32[(r10+3)] = 0;
+	f28 = f29+f30;
+	f29 = f24*f20;
+	f8 = f8+f27;
+	heapFloat[(r10+4)] = f7;
+	f2 = f2*f13;
+	f4 = f4*f16;
+	f7 = f28+f29;
+	heapFloat[(r10+5)] = f8;
+	heapFloat[(r10+6)] = f7;
+	f5 = f5*f13;
+	f6 = f6*f16;
+	f2 = f2+f4;
+	f4 = f10*f22;
+	f7 = -f26;
+	f8 = f15*f13;
+	f10 = f19*f16;
+	f5 = f5+f6;
+	f6 = f25*f22;
+	f2 = f2+f4;
+	heap32[(r10+7)] = 0;
+	f4 = f1*f14;
+	f15 = f3*f18;
+	f1 = f1*f7;
+	f3 = f3*f17;
+	f8 = f8+f10;
+	f10 = f24*f22;
+	f5 = f5+f6;
+	heapFloat[(r10+8)] = f2;
+	f2 = f11*f14;
+	f6 = f12*f18;
+	f11 = f11*f7;
+	f12 = f12*f17;
+	f4 = f4+f15;
+	f15 = f9*f23;
+	f1 = f1-f3;
+	f3 = f9*f21;
+	f8 = f8+f10;
+	heapFloat[(r10+9)] = f5;
+	heapFloat[(r10+10)] = f8;
+	f5 = f13*f14;
+	f8 = f16*f18;
+	f7 = f13*f7;
+	f9 = f16*f17;
+	f2 = f2+f6;
+	f6 = f20*f23;
+	f10 = f11-f12;
+	f11 = f20*f21;
+	f4 = f4+f15;
+	f1 = f1-f3;
+	f3 = f5+f8;
+	f5 = f22*f23;
+	f7 = f7-f9;
+	f8 = f22*f21;
+	f2 = f2+f6;
+	f6 = f10-f11;
+	f1 = f4+f1;
+	heap32[(r10+11)] = 0;
+	f3 = f3+f5;
+	f4 = f7-f8;
+	f2 = f2+f6;
+	heapFloat[(r10+12)] = f1;
+	f1 = f3+f4;
+	heapFloat[(r10+13)] = f2;
+	heapFloat[(r10+14)] = f1;
+	heap32[(r10+15)] = 0;
+	r2 = heap32[(r2+48)];
+	r10 = r2 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+2)];
+	r11 = (r0 + 40)|0;
+	r12 = (r0 + 24)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	f1 = heapFloat[(r8+10)];
+	f1 = f1+f0;
+	heapFloat[(r8+10)] = f1;
+	f1 = heapFloat[(r8+11)];
+	f1 = f1+f0;
+	heapFloat[(r8+11)] = f1;
+	f1 = heapFloat[(r8+12)];
+	f1 = f1+f0;
+	heapFloat[(r8+12)] = f1;
+	f1 = heapFloat[(r8+6)];
+	f1 = f1-f0;
+	heapFloat[(r8+6)] = f1;
+	f1 = heapFloat[(r8+7)];
+	f1 = f1-f0;
+	heapFloat[(r8+7)] = f1;
+	f1 = heapFloat[(r8+8)];
+	f0 = f1-f0;
+	heapFloat[(r8+8)] = f0;
+	r2 = heap32[(r8+19)];
+	r2 = r2 >> 2;
+	heap32[(r2+277)] = r1;
+	heap32[(r2+278)] = r4;
+	r1 = heap32[(r6)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+15)];
+	r0 = (r0 + 12)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r11;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r7+1)];
+	if(r0 !=0) //_LBB289_4
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+if(!(r2 ==0)) //_LBB289_8
+{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r7+34)];
+	if(r1 ==r2) //_LBB289_7
+{
+	r1 = (r3 + 8)|0;
+	r2 = (r3 + 72)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+else{
+	r1 = (r3 + 72)|0;
+	r3 = (r3 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r3 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+}
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+19)];
+if(!(r1 ==0)) //_LBB290_22
+{
+	r2 = heap32[(fp+1)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB290_3
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB290_2
+{
+	if(r7 !=0) //_LBB290_6
+{
+	r1 = gNumAlignedAllocs;
+	r1 = r1 >> 2;
+	r4 = heap32[(r1)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r1)] = r4;
+	r1 = (r8 + 16)|0;
+	heap32[(g0)] = r1;
+	malloc(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB290_8
+{
+	r4 = 0;
+	r8 = (r1 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r1 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r1;
+	r1 = r8;
+}
+}
+else{
+	r1 = 0;
+}
+	r4 = (r2 + 12)|0;
+	if(r5 <1) //_LBB290_11
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_14: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r1 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB290_12
+{
+break _14;
+}
+}
+	r4 = (r2 + 12)|0;
+}
+	if(r9 !=0) //_LBB290_16
+{
+	r8 = heapU8[r2+16];
+	if(r8 !=0) //_LBB290_18
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r2+16] = r6;
+	heap32[(r4)] = r1;
+	heap32[(r3+2)] = r7;
+	r1 = heap32[(r0+19)];
+}
+}
+	r0 = r5 << 2;
+	r2 = heap32[(r3+3)];
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV33btConvexConcaveCollisionAlgorithm;
+	r2 = _ZTV24btConvexTriangleCallback;
+	r1 = (r1 + 8)|0;
+	r3 = r0 >> 2;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r1;
+	heap32[(r3+3)] = r2;
+	r1 = heap32[(r3+15)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	r4 = heap32[(r3+19)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r3+15)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r4 = heap32[(r3+19)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	r1 = _ZTV18btTriangleCallback;
+	r4 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = (r4 + 8)|0;
+	heap32[(r3+3)] = r1;
+	heap32[(r3)] = r2;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV33btConvexConcaveCollisionAlgorithm;
+	r2 = _ZTV24btConvexTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r2 = (r2 + 8)|0;
+	heap32[(r0)] = r1;
+	heap32[(r0+3)] = r2;
+	r1 = heap32[(r0+15)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	r3 = heap32[(r0+19)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r0+15)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = heap32[(r0+19)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	r1 = _ZTV18btTriangleCallback;
+	r3 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = (r3 + 8)|0;
+	heap32[(r0+3)] = r1;
+	heap32[(r0)] = r2;
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN23btConvexConvexAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN23btConvexConvexAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 36;
+	r1 = heap32[(fp)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r1 >> 2;
+	r3 = _ZTV20btCollisionAlgorithm;
+	r4 = heap32[(r1+5)];
+	r5 = heap32[(r1+4)];
+	r6 = heap32[(r0+1)];
+	r7 = heap32[(r1+2)];
+	r1 = heap32[(r1+3)];
+	r8 = r_g0 >> 2;
+	r3 = (r3 + 8)|0;
+	heap32[(r8)] = r3;
+	r0 = heap32[(r0)];
+	r3 = _ZTV23btConvexConvexAlgorithm;
+	r3 = (r3 + 8)|0;
+	heap32[(r8+1)] = r0;
+	heap32[(r8)] = r3;
+	heap32[(r8+2)] = r1;
+	r0 = 0;
+	heap32[(r8+3)] = r7;
+	heap8[r_g0+16] = r0;
+	heap32[(r8+5)] = r6;
+	heap8[r_g0+24] = r0;
+	heap32[(r8+7)] = r5;
+	heap32[(r8+8)] = r4;
+	return;
+}
+
+function _ZN24btPerturbedContactResultD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV24btPerturbedContactResult;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN24btPerturbedContactResultD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV24btPerturbedContactResult;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN24btPerturbedContactResult15addContactPointERK9btVector3S2_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -104;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+2)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r1+2)];
+	heapFloat[(fp+-5)] = f0;
+	f1 = heapFloat[(r1+1)];
+	heapFloat[(fp+-6)] = f1;
+	f2 = heapFloat[(fp+3)];
+	f3 = heapFloat[(r1)];
+	heapFloat[(fp+-7)] = f3;
+	f4 = heapFloat[(r2+2)];
+	heapFloat[(fp+-11)] = f4;
+	f0 = f0*f2;
+	f5 = heapFloat[(r2+1)];
+	heapFloat[(fp+-12)] = f5;
+	f1 = f1*f2;
+	f6 = heapFloat[(r2)];
+	heapFloat[(fp+-13)] = f6;
+	f2 = f3*f2;
+	r1 = heap32[(fp)];
+	f0 = f4+f0;
+	heapFloat[(fp+-8)] = f0;
+	f0 = f5+f1;
+	heapFloat[(fp+-9)] = f0;
+	f0 = f6+f2;
+	heapFloat[(fp+-10)] = f0;
+	r2 = heapU8[r1+356];
+	if(r2 ==0) //_LBB298_2
+{
+	r2 = r1 >> 2;
+	f3 = heapFloat[(r2+69)];
+	f3 = -f3;
+	f0 = heapFloat[(r2+57)];
+	f1 = heapFloat[(r2+58)];
+	f2 = heapFloat[(r2+61)];
+	f4 = heapFloat[(r2+70)];
+	f5 = heapFloat[(r2+62)];
+	f6 = heapFloat[(r2+77)];
+	f7 = heapFloat[(r2+78)];
+	f8 = heapFloat[(r2+73)];
+	f9 = heapFloat[(r2+65)];
+	f10 = heapFloat[(r2+74)];
+	f11 = heapFloat[(r2+66)];
+	f12 = heapFloat[(r2+71)];
+	f13 = heapFloat[(r2+59)];
+	f14 = heapFloat[(r2+63)];
+	f15 = f0*f3;
+	f16 = f2*f4;
+	f17 = f1*f3;
+	f18 = f5*f4;
+	f19 = heapFloat[(r2+81)];
+	f20 = heapFloat[(r2+82)];
+	f21 = heapFloat[(r2+79)];
+	f22 = heapFloat[(r2+67)];
+	f23 = heapFloat[(r2+75)];
+	f24 = f0*f6;
+	f25 = f1*f7;
+	f26 = f2*f6;
+	f27 = f5*f7;
+	f28 = f0*f8;
+	heapFloat[(fp+-14)] = f28;
+	f28 = f1*f10;
+	heapFloat[(fp+-15)] = f28;
+	f29 = f2*f8;
+	f28 = f5*f10;
+	f15 = f15-f16;
+	f16 = f9*f12;
+	f17 = f17-f18;
+	f18 = f11*f12;
+	f3 = f13*f3;
+	heapFloat[(fp+-16)] = f3;
+	f3 = f14*f4;
+	heapFloat[(fp+-20)] = f3;
+	f4 = f15-f16;
+	f15 = f17-f18;
+	f16 = heapFloat[(r2+83)];
+	f0 = f0*f19;
+	f1 = f1*f20;
+	f2 = f2*f19;
+	f5 = f5*f20;
+	f17 = f24+f25;
+	heapFloat[(fp+-17)] = f17;
+	f3 = f13*f21;
+	heapFloat[(fp+-21)] = f3;
+	f17 = f26+f27;
+	heapFloat[(fp+-18)] = f17;
+	f18 = f14*f21;
+	f24 = f9*f6;
+	heapFloat[(fp+-19)] = f24;
+	f25 = f11*f7;
+	f26 = heapFloat[(fp+-14)];
+	f27 = heapFloat[(fp+-15)];
+	f26 = f26+f27;
+	f27 = f13*f23;
+	f28 = f29+f28;
+	f29 = f14*f23;
+	f30 = f9*f8;
+	f3 = f11*f10;
+	f17 = heapFloat[(fp+-16)];
+	f24 = heapFloat[(fp+-20)];
+	f17 = f17-f24;
+	f12 = f22*f12;
+	f12 = f17-f12;
+	f0 = f0+f1;
+	f1 = f13*f16;
+	f2 = f2+f5;
+	f5 = f14*f16;
+	f9 = f9*f19;
+	f11 = f11*f20;
+	f17 = heapFloat[(fp+-17)];
+	f13 = heapFloat[(fp+-21)];
+	f13 = f17+f13;
+	f14 = f26+f27;
+	f17 = heapFloat[(fp+-18)];
+	f17 = f17+f18;
+	f18 = f28+f29;
+	f24 = heapFloat[(fp+-19)];
+	f24 = f24+f25;
+	f25 = f22*f21;
+	f6 = f6*f4;
+	f7 = f7*f15;
+	f3 = f30+f3;
+	f26 = f22*f23;
+	f8 = f8*f4;
+	f10 = f10*f15;
+	f0 = f0+f1;
+	f1 = f2+f5;
+	f2 = f9+f11;
+	f5 = f22*f16;
+	f4 = f19*f4;
+	f9 = f20*f15;
+	f11 = heapFloat[(fp+-13)];
+	f13 = f13*f11;
+	f15 = heapFloat[(fp+-12)];
+	f17 = f17*f15;
+	f19 = f24+f25;
+	f3 = f3+f26;
+	f6 = f6+f7;
+	f7 = f21*f12;
+	f14 = f14*f11;
+	f18 = f18*f15;
+	f8 = f8+f10;
+	f10 = f23*f12;
+	f2 = f2+f5;
+	f0 = f0*f11;
+	f1 = f1*f15;
+	f4 = f4+f9;
+	f5 = f16*f12;
+	f9 = f13+f17;
+	f11 = heapFloat[(fp+-11)];
+	f12 = f19*f11;
+	f6 = f6+f7;
+	f7 = heapFloat[(r2+86)];
+	f13 = f14+f18;
+	f3 = f3*f11;
+	f8 = f8+f10;
+	f10 = heapFloat[(r2+85)];
+	f14 = heapFloat[(r2+87)];
+	f4 = f4+f5;
+	f0 = f0+f1;
+	f1 = f2*f11;
+	f2 = f9+f12;
+	f5 = f6+f7;
+	f3 = f13+f3;
+	f6 = f8+f10;
+	f3 = f3+f6;
+	f2 = f2+f5;
+	f0 = f0+f1;
+	f1 = f4+f14;
+	r2 = sp + -16;
+	f4 = heapFloat[(fp+-10)];
+	f4 = f4-f3;
+	f5 = heapFloat[(fp+-9)];
+	f5 = f5-f2;
+	f0 = f0+f1;
+	f1 = heapFloat[(fp+-7)];
+	f1 = f4*f1;
+	f4 = heapFloat[(fp+-6)];
+	f4 = f5*f4;
+	f5 = heapFloat[(fp+-8)];
+	f5 = f5-f0;
+	r2 = r2 >> 2;
+	heapFloat[(fp+-4)] = f3;
+	heapFloat[(r2+1)] = f2;
+	f3 = f1+f4;
+	f1 = heapFloat[(fp+-5)];
+	f1 = f5*f1;
+	f3 = f3+f1;
+	heapFloat[(r2+2)] = f0;
+	heap32[(r2+3)] = 0;
+}
+else{
+	r2 = r1 >> 2;
+	f0 = heapFloat[(r2+53)];
+	f0 = -f0;
+	f1 = heapFloat[(r2+41)];
+	f2 = heapFloat[(r2+42)];
+	f3 = heapFloat[(r2+45)];
+	f4 = heapFloat[(r2+54)];
+	f5 = heapFloat[(r2+46)];
+	f6 = heapFloat[(r2+77)];
+	f7 = heapFloat[(r2+78)];
+	f8 = heapFloat[(r2+73)];
+	f9 = heapFloat[(r2+49)];
+	f10 = heapFloat[(r2+74)];
+	f11 = heapFloat[(r2+50)];
+	f12 = heapFloat[(r2+55)];
+	f13 = heapFloat[(r2+43)];
+	f14 = heapFloat[(r2+47)];
+	f15 = f1*f0;
+	f16 = f3*f4;
+	f17 = f2*f0;
+	f18 = f5*f4;
+	f19 = heapFloat[(r2+81)];
+	f20 = heapFloat[(r2+82)];
+	f21 = heapFloat[(r2+79)];
+	f22 = heapFloat[(r2+51)];
+	f23 = heapFloat[(r2+75)];
+	f24 = f1*f8;
+	f25 = f2*f10;
+	f26 = f3*f8;
+	f27 = f5*f10;
+	f28 = f1*f6;
+	heapFloat[(fp+-14)] = f28;
+	f29 = f2*f7;
+	f30 = f3*f6;
+	f28 = f5*f7;
+	f15 = f15-f16;
+	f16 = f9*f12;
+	f17 = f17-f18;
+	f18 = f11*f12;
+	f0 = f13*f0;
+	heapFloat[(fp+-15)] = f0;
+	f0 = f14*f4;
+	heapFloat[(fp+-16)] = f0;
+	f4 = f15-f16;
+	f15 = f17-f18;
+	f16 = heapFloat[(r2+83)];
+	f0 = f24+f25;
+	heapFloat[(fp+-17)] = f0;
+	f17 = f13*f23;
+	f0 = f26+f27;
+	heapFloat[(fp+-18)] = f0;
+	f18 = f14*f23;
+	f24 = f9*f8;
+	f25 = f11*f10;
+	f26 = heapFloat[(fp+-14)];
+	f26 = f26+f29;
+	f27 = f13*f21;
+	f28 = f30+f28;
+	f29 = f14*f21;
+	f30 = f9*f6;
+	f0 = f11*f7;
+	f1 = f1*f19;
+	heapFloat[(fp+-14)] = f1;
+	f2 = f2*f20;
+	f1 = f3*f19;
+	heapFloat[(fp+-19)] = f1;
+	f3 = f5*f20;
+	f5 = heapFloat[(fp+-15)];
+	f1 = heapFloat[(fp+-16)];
+	f1 = f5-f1;
+	f5 = f22*f12;
+	f1 = f1-f5;
+	f5 = heapFloat[(fp+-17)];
+	f5 = f5+f17;
+	f12 = f26+f27;
+	f17 = heapFloat[(fp+-18)];
+	f17 = f17+f18;
+	f18 = f28+f29;
+	f24 = f24+f25;
+	f25 = f22*f23;
+	f8 = f8*f4;
+	f10 = f10*f15;
+	f0 = f30+f0;
+	f26 = f22*f21;
+	f6 = f6*f4;
+	f7 = f7*f15;
+	f27 = heapFloat[(fp+-14)];
+	f2 = f27+f2;
+	f13 = f13*f16;
+	f27 = heapFloat[(fp+-19)];
+	f3 = f27+f3;
+	f14 = f14*f16;
+	f9 = f9*f19;
+	f11 = f11*f20;
+	f2 = f2+f13;
+	f3 = f3+f14;
+	f13 = heapFloat[(fp+-10)];
+	f5 = f5*f13;
+	f14 = heapFloat[(fp+-9)];
+	f17 = f17*f14;
+	f24 = f24+f25;
+	f0 = f0+f26;
+	f8 = f8+f10;
+	f10 = f23*f1;
+	f12 = f12*f13;
+	f18 = f18*f14;
+	f6 = f6+f7;
+	f7 = f21*f1;
+	f9 = f9+f11;
+	f11 = f22*f16;
+	f4 = f19*f4;
+	f15 = f20*f15;
+	f9 = f9+f11;
+	f5 = f5+f17;
+	f11 = heapFloat[(fp+-8)];
+	f17 = f24*f11;
+	f8 = f8+f10;
+	f10 = heapFloat[(r2+85)];
+	f12 = f12+f18;
+	f0 = f0*f11;
+	f6 = f6+f7;
+	f7 = heapFloat[(r2+86)];
+	f2 = f2*f13;
+	f3 = f3*f14;
+	f4 = f4+f15;
+	f1 = f16*f1;
+	f13 = heapFloat[(r2+87)];
+	f1 = f4+f1;
+	f4 = f5+f17;
+	f5 = f8+f10;
+	f0 = f12+f0;
+	f6 = f6+f7;
+	f2 = f2+f3;
+	f3 = f9*f11;
+	f4 = f4+f5;
+	f0 = f0+f6;
+	f2 = f2+f3;
+	f1 = f1+f13;
+	f3 = heapFloat[(fp+-13)];
+	f3 = f4-f3;
+	f5 = heapFloat[(fp+-12)];
+	f5 = f0-f5;
+	f1 = f2+f1;
+	f2 = heapFloat[(fp+-7)];
+	f3 = f3*f2;
+	f6 = heapFloat[(fp+-6)];
+	f5 = f5*f6;
+	f7 = heapFloat[(fp+-11)];
+	f7 = f1-f7;
+	f3 = f3+f5;
+	f5 = heapFloat[(fp+-5)];
+	f7 = f7*f5;
+	f3 = f3+f7;
+	f2 = f2*f3;
+	r2 = sp + -16;
+	f6 = f6*f3;
+	f2 = f4+f2;
+	f4 = f5*f3;
+	r2 = r2 >> 2;
+	f0 = f0+f6;
+	heapFloat[(fp+-4)] = f2;
+	f1 = f1+f4;
+	heapFloat[(r2+1)] = f0;
+	heapFloat[(r2+2)] = f1;
+	heap32[(r2+3)] = 0;
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+40)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = sp + -16;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	heapFloat[(g0+3)] = f3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+if(!(r2 ==0)) //_LBB299_23
+{
+	r0 = heapU8[r0+16];
+if(!(r0 ==0)) //_LBB299_23
+{
+	r0 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB299_4
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB299_3
+{
+	if(r7 !=0) //_LBB299_7
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r4;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB299_9
+{
+	r4 = 0;
+	r8 = (r2 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r2 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r4 = (r0 + 12)|0;
+	if(r5 <1) //_LBB299_12
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_15: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB299_13
+{
+break _15;
+}
+}
+	r4 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB299_17
+{
+	r8 = heapU8[r0+16];
+	if(r8 !=0) //_LBB299_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r4)] = r2;
+	heap32[(r3+2)] = r7;
+	r2 = heap32[(r1+5)];
+}
+}
+	r0 = r5 << 2;
+	r1 = heap32[(r3+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+}
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -1240;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+2)];
+	r3 = r2 >> 2;
+	f0 = heapFloat[(r1+29)];
+	f1 = heapFloat[(r1+13)];
+	f2 = heapFloat[(r1+30)];
+	f3 = heapFloat[(r1+14)];
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = heapFloat[(r1+31)];
+	f3 = heapFloat[(r1+15)];
+	f2 = f2-f3;
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f3 = heapFloat[(r1+62)];
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f2 = f3*f3;
+	f0 = f0+f1;
+if(!(f2 <=f0)) //_LBB300_2
+{
+	f0 = heapFloat[(r3+31)];
+	f1 = heapFloat[(r3+15)];
+	f2 = heapFloat[(r3+30)];
+	f3 = heapFloat[(r3+14)];
+	f4 = heapFloat[(r3+29)];
+	f5 = heapFloat[(r3+13)];
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = f4-f5;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	f3 = heapFloat[(r3+62)];
+	f1 = f2+f1;
+	f0 = f0*f0;
+	f2 = f3*f3;
+	f0 = f1+f0;
+	if(f2 >f0) //_LBB300_16
+{
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+}
+	r4 = sp + -56;
+	r5 = heap32[(r1+48)];
+	f0 = heapFloat[(r3+61)];
+	r6 = r4 >> 2;
+	heap32[(r6+2)] = 0;
+	heap32[(r6+3)] = 1065353216;
+	heap32[(r6+4)] = 1065353216;
+	r7 = _ZTV13btSphereShape;
+	heap32[(r6+5)] = 1065353216;
+	r7 = (r7 + 8)|0;
+	heap32[(r6+6)] = 0;
+	heap32[(fp+-14)] = r7;
+	heap32[(r6+1)] = 8;
+	r8 = _ZTVN12btConvexCast10CastResultE;
+	heapFloat[(r6+7)] = f0;
+	r9 = sp + -232;
+	r8 = (r8 + 8)|0;
+	heapFloat[(r6+11)] = f0;
+	r6 = r9 >> 2;
+	heap32[(fp+-58)] = r8;
+	heap32[(r6+41)] = 1566444395;
+	r10 = sp + -592;
+	heap32[(r6+42)] = 0;
+	r11 = r10 >> 2;
+	heap32[(r6+43)] = 0;
+	r12 = _ZTV15btGjkConvexCast;
+	r13 = 0;
+	heap32[(r11+77)] = 953267991;
+	r11 = sp + -608;
+	r12 = (r12 + 8)|0;
+	heap8[sp+-260] = r13;
+	r13 = r11 >> 2;
+	heap32[(fp+-152)] = r12;
+	heap32[(r13+1)] = r10;
+	heap32[(r13+2)] = r5;
+	heap32[(r13+3)] = r4;
+	r4 = (r2 + 68)|0;
+	r2 = (r2 + 4)|0;
+	r5 = (r0 + 68)|0;
+	r0 = (r0 + 4)|0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r9;
+	_ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB300_4
+{
+	f0 = heapFloat[(r6+41)];
+	f1 = heapFloat[(r1+60)];
+if(!(f1 <=f0)) //_LBB300_6
+{
+	heapFloat[(r1+60)] = f0;
+}
+	f1 = heapFloat[(r3+60)];
+if(!(f1 <=f0)) //_LBB300_8
+{
+	heapFloat[(r3+60)] = f0;
+}
+	f1 =                         1;
+	if(f0 >=f1) //_LBB300_3
+{
+__label__ = 3;
+}
+else{
+__label__ = 9;
+}
+}
+else{
+__label__ = 3;
+}
+if (__label__ == 3){
+	f0 =                         1;
+}
+	r6 = _ZTV12btConvexCast;
+	r9 = _ZTV13btConvexShape;
+	r6 = (r6 + 8)|0;
+	r9 = (r9 + 8)|0;
+	heap32[(fp+-152)] = r6;
+	heap32[(fp+-14)] = r9;
+	r6 = sp + -664;
+	r9 = heap32[(r3+48)];
+	f1 = heapFloat[(r1+61)];
+	r10 = r6 >> 2;
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	heap32[(r10+5)] = 1065353216;
+	heap32[(r10+6)] = 0;
+	heap32[(fp+-166)] = r7;
+	heap32[(r10+1)] = 8;
+	heapFloat[(r10+7)] = f1;
+	r7 = sp + -840;
+	heapFloat[(r10+11)] = f1;
+	r10 = r7 >> 2;
+	heap32[(fp+-210)] = r8;
+	heap32[(r10+41)] = 1566444395;
+	r8 = sp + -1200;
+	heap32[(r10+42)] = 0;
+	r11 = r8 >> 2;
+	heap32[(r10+43)] = 0;
+	heap32[(r11+77)] = 953267991;
+	r11 = heapU8[sp+-868];
+	r11 = r11 & 240;
+	r13 = sp + -1216;
+	heap8[sp+-868] = r11;
+	r11 = r13 >> 2;
+	heap32[(fp+-304)] = r12;
+	heap32[(r11+1)] = r8;
+	heap32[(r11+2)] = r6;
+	heap32[(r11+3)] = r9;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r7;
+	_ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB300_15
+{
+	f1 = heapFloat[(r10+41)];
+	f2 = heapFloat[(r1+60)];
+if(!(f2 <=f1)) //_LBB300_12
+{
+	heapFloat[(r1+60)] = f1;
+}
+	f2 = heapFloat[(r3+60)];
+if(!(f2 <=f1)) //_LBB300_14
+{
+	heapFloat[(r3+60)] = f1;
+}
+	f0 = f1 < f0 ? f1 : f0;
+}
+	f_g0 = f0;
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -816;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = heap32[(fp+4)];
+	if(r2 ==0) //_LBB301_2
+{
+	r2 = heap32[(r1+1)];
+	r7 = r2 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r2 = r_g0;
+	r7 = 1;
+	heap32[(r1+5)] = r2;
+	heap8[r0+16] = r7;
+}
+	r7 = r6 >> 2;
+	r8 = r3 >> 2;
+	heap32[(r7+1)] = r2;
+	r2 = r4 >> 2;
+	r9 = heap32[(r8+48)];
+	r10 = heap32[(r2+48)];
+	r11 = r9 >> 2;
+	r12 = heap32[(r11+1)];
+	if(r12 !=10) //_LBB301_5
+{
+__label__ = 4;
+}
+else{
+	r12 = r10 >> 2;
+	r13 = heap32[(r12+1)];
+	if(r13 ==10) //_LBB301_6
+{
+	r0 = heap32[(r11)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+7)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = heap32[(r12)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+7)];
+	heap32[(g0)] = r10;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = heap32[(r11+13)];
+	r5 = heap32[(r12+13)];
+	r11 = r5 << 2;
+	r12 = r0 << 2;
+	r3 = (r3 + r12)|0;
+	r4 = (r4 + r11)|0;
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	r5 = (r5 + 2)|0;
+	r0 = (r0 + 2)|0;
+	f0 = heapFloat[(r3+1)];
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(r3+5)];
+	f3 = heapFloat[(r4+5)];
+	r5 = (r5 % 3)|0;
+	r0 = (r0 % 3)|0;
+	f4 = heapFloat[(r3+9)];
+	f5 = heapFloat[(r4+9)];
+	f6 = f0*f1;
+	f7 = f2*f3;
+	f8 = heapFloat[(r2+13)];
+	f9 = heapFloat[(r8+13)];
+	f10 = heapFloat[(r2+14)];
+	f11 = heapFloat[(r8+14)];
+	f8 = f8-f9;
+	f9 = f10-f11;
+	r3 = (r10 + 28)|0;
+	r4 = r5 << 2;
+	r5 = (r9 + 28)|0;
+	r0 = r0 << 2;
+	f6 = f6+f7;
+	f7 = f4*f5;
+	f10 = heapFloat[(r2+15)];
+	f11 = heapFloat[(r8+15)];
+	f10 = f10-f11;
+	f6 = f6+f7;
+	r1 = heap32[(r1+5)];
+	r4 = (r3 + r4)|0;
+	r3 = (r3 + r11)|0;
+	r0 = (r5 + r0)|0;
+	r5 = (r5 + r12)|0;
+	f7 = f0*f8;
+	f11 = f2*f9;
+	f12 = f1*f8;
+	f13 = f3*f9;
+	r1 = r1 >> 2;
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	r0 = r0 >> 2;
+	r5 = r5 >> 2;
+	f14 =                         1;
+	f15 = f6*f6;
+	f7 = f7+f11;
+	f11 = f4*f10;
+	f12 = f12+f13;
+	f13 = f5*f10;
+	f15 = f14-f15;
+	f16 = heapFloat[(r1+280)];
+	f17 = heapFloat[(r4)];
+	f18 = heapFloat[(r3)];
+	f19 = heapFloat[(r0)];
+	f20 = heapFloat[(r5)];
+	f7 = f7+f11;
+	f11 = f12+f13;
+	f12 =                         0;
+	if(f15 !=f12) //_LBB301_8
+{
+	f13 = f11*f6;
+	f13 = f7-f13;
+	f13 = f13/f15;
+	f15 = -f20;
+	if(f13 >=f15) //_LBB301_10
+{
+	if(f13 >f20) //_LBB301_12
+{
+	f15 = f20;
+}
+else{
+	f15 = f13;
+}
+}
+}
+else{
+	f15 =                         0;
+}
+	f13 = f15*f6;
+	f11 = f13-f11;
+	f13 = -f18;
+	if(f11 >=f13) //_LBB301_19
+{
+	if(f11 >f18) //_LBB301_21
+{
+	f13 = f6*f18;
+	f6 = f13+f7;
+	f15 = -f20;
+	if(f6 >=f15) //_LBB301_23
+{
+	if(f6 >f20) //_LBB301_25
+{
+	f13 = f18;
+	f15 = f20;
+}
+else{
+	f13 = f18;
+	f15 = f6;
+}
+}
+else{
+	f13 = f18;
+}
+}
+else{
+	f13 = f11;
+}
+}
+else{
+	f6 = f6*f13;
+	f6 = f6+f7;
+	f15 = -f20;
+	if(f6 >=f15) //_LBB301_16
+{
+	if(f6 >f20) //_LBB301_18
+{
+	f15 = f20;
+}
+else{
+	f15 = f6;
+}
+}
+}
+	f6 = f0*f15;
+	f7 = f2*f15;
+	f1 = f1*f13;
+	f6 = f8-f6;
+	f3 = f3*f13;
+	f7 = f9-f7;
+	f8 = f4*f15;
+	f6 = f6+f1;
+	f7 = f7+f3;
+	f5 = f5*f13;
+	f8 = f10-f8;
+	f8 = f8+f5;
+	f9 = f6*f6;
+	f10 = f7*f7;
+	f9 = f9+f10;
+	f10 = f8*f8;
+	f9 = f9+f10;
+	heapFloat[(g0)] = f9;
+	sqrtf(i7);
+	f10 = f_g0-f19;
+	f10 = f10-f17;
+if(!(f10 >f16)) //_LBB301_36
+{
+	f11 =   1.4210854715202004e-014;
+	if(f9 >f11) //_LBB301_34
+{
+	heapFloat[(g0)] = f9;
+	f0 =                        -1;
+	sqrtf(i7);
+	f0 = f0/f_g0;
+	f9 = f6*f0;
+	r0 = sp + -16;
+	f6 = f7*f0;
+	r0 = r0 >> 2;
+	heapFloat[(fp+-4)] = f9;
+	f12 = f8*f0;
+	heapFloat[(r0+1)] = f6;
+	heapFloat[(r0+2)] = f12;
+	heap32[(r0+3)] = 0;
+}
+else{
+	if(f4 <f12) //_LBB301_30
+{
+	f6 = -f4;
+}
+else{
+	f6 = f4;
+}
+	f7 =       0.70710676908493042;
+	if(f6 <=f7) //_LBB301_33
+{
+	f6 = f0*f0;
+	f9 = f2*f2;
+	f6 = f6+f9;
+	heapFloat[(g0)] = f6;
+	sqrtf(i7);
+	f6 = f14/f_g0;
+	f9 = -f2;
+	f9 = f6*f9;
+	r0 = sp + -16;
+	f6 = f0*f6;
+	r0 = r0 >> 2;
+	heapFloat[(fp+-4)] = f9;
+	heapFloat[(r0+1)] = f6;
+	heap32[(r0+2)] = 0;
+}
+else{
+	f0 = f2*f2;
+	f6 = f4*f4;
+	f0 = f0+f6;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	r0 = sp + -16;
+	f0 = f14/f_g0;
+	f6 = -f4;
+	f6 = f0*f6;
+	r0 = r0 >> 2;
+	heap32[(fp+-4)] = 0;
+	f9 =                         0;
+	f12 = f2*f0;
+	heapFloat[(r0+1)] = f6;
+	heapFloat[(r0+2)] = f12;
+}
+}
+	f0 = heapFloat[(r2+13)];
+	f2 = heapFloat[(r2+14)];
+	f4 = heapFloat[(r2+15)];
+	f0 = f0+f1;
+	f1 = f9*f17;
+	r0 = sp + -32;
+	f2 = f2+f3;
+	f3 = f6*f17;
+	f0 = f0+f1;
+	r0 = r0 >> 2;
+	f1 = f4+f5;
+	f4 = f12*f17;
+	f2 = f2+f3;
+	heapFloat[(fp+-8)] = f0;
+	f0 = f1+f4;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+}
+if(!(f10 >=f16)) //_LBB301_40
+{
+	r0 = sp + -16;
+	r1 = r0 >> 2;
+	f0 = heapFloat[(fp+-4)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r1+2)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	f1 =   1.4210854715202004e-014;
+	if(f0 >=f1) //_LBB301_39
+{
+	r1 = heap32[(r7)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	r2 = sp + -32;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heapFloat[(g0+3)] = f10;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+else{
+	r0 = _2E_str4119;
+	r1 = _2E_str5120;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 325;
+	_assert(i7);
+}
+}
+	r0 = heap32[(r7+1)];
+	if(r0 !=0) //_LBB301_42
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	if(r2 ==0) //_LBB301_47
+{
+__label__ = 44;
+}
+else{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r7+34)];
+	if(r1 ==r2) //_LBB301_46
+{
+__label__ = 43;
+}
+else{
+	r1 = (r6 + 72)|0;
+	r2 = (r6 + 8)|0;
+__label__ = 42;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r1 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+else{
+__label__ = 4;
+}
+}
+if (__label__ == 4){
+	r3 = sp + -168;
+	r4 = r3 >> 2;
+	heap32[(r4+32)] = 1566444395;
+	heap32[(r4+33)] = 0;
+	r12 = _ZTV17btGjkPairDetector;
+	r13 = heap32[(r1+2)];
+	r14 = heap32[(r1+3)];
+	r15 = sp + -248;
+	r12 = (r12 + 8)|0;
+	heap32[(fp+-62)] = r12;
+	r12 = r15 >> 2;
+	heap32[(r12+1)] = 0;
+	heap32[(r12+2)] = 1065353216;
+	heap32[(r12+3)] = 0;
+	heap32[(r12+4)] = 0;
+	heap32[(r12+5)] = r14;
+	heap32[(r12+6)] = r13;
+	heap32[(r12+7)] = r9;
+	heap32[(r12+8)] = r10;
+	r13 = heap32[(r11+1)];
+	heap32[(r12+9)] = r13;
+	r13 = r10 >> 2;
+	r14 = heap32[(r13+1)];
+	heap32[(r12+10)] = r14;
+	r14 = heap32[(r11)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+11)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	heapFloat[(r12+11)] = f_g0;
+	r14 = heap32[(r13)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+11)];
+	heap32[(g0)] = r10;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	r14 = 0;
+	heapFloat[(r12+12)] = f_g0;
+	heap8[sp+-196] = r14;
+	heap32[(r12+15)] = -1;
+	heap32[(r12+18)] = 1;
+	heap32[(r12+7)] = r9;
+	heap32[(r12+8)] = r10;
+	r16 = heap32[(r11)];
+	r16 = r16 >> 2;
+	r17 = heapU8[r5+40];
+	r16 = heap32[(r16+11)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+	f0 = f_g0;
+	r16 = heap32[(r13)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+11)];
+	heap32[(g0)] = r10;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+	f0 = f0+f_g0;
+	r16 = heap32[(r1+5)];
+	if(r17 ==0) //_LBB301_49
+{
+	r16 = (r16 + 1120)|0;
+}
+else{
+	r16 = (r16 + 1124)|0;
+}
+	r16 = r16 >> 2;
+	f1 = heapFloat[(r16)];
+	f0 = f0+f1;
+	f0 = f0*f0;
+	r5 = r5 >> 2;
+	heapFloat[(r4+32)] = f0;
+	r16 = heap32[(r5+11)];
+	heap32[(r4+33)] = r16;
+	heap32[(fp+-42)] = heap32[(r8+1)];
+	heap32[(r4+1)] = heap32[(r8+2)];
+	heap32[(r4+2)] = heap32[(r8+3)];
+	heap32[(r4+3)] = heap32[(r8+4)];
+	heap32[(r4+4)] = heap32[(r8+5)];
+	heap32[(r4+5)] = heap32[(r8+6)];
+	heap32[(r4+6)] = heap32[(r8+7)];
+	heap32[(r4+7)] = heap32[(r8+8)];
+	heap32[(r4+8)] = heap32[(r8+9)];
+	heap32[(r4+9)] = heap32[(r8+10)];
+	heap32[(r4+10)] = heap32[(r8+11)];
+	heap32[(r4+11)] = heap32[(r8+12)];
+	heap32[(r4+12)] = heap32[(r8+13)];
+	heap32[(r4+13)] = heap32[(r8+14)];
+	heap32[(r4+14)] = heap32[(r8+15)];
+	heap32[(r4+15)] = heap32[(r8+16)];
+	heap32[(r4+16)] = heap32[(r2+1)];
+	heap32[(r4+17)] = heap32[(r2+2)];
+	heap32[(r4+18)] = heap32[(r2+3)];
+	heap32[(r4+19)] = heap32[(r2+4)];
+	heap32[(r4+20)] = heap32[(r2+5)];
+	heap32[(r4+21)] = heap32[(r2+6)];
+	heap32[(r4+22)] = heap32[(r2+7)];
+	heap32[(r4+23)] = heap32[(r2+8)];
+	heap32[(r4+24)] = heap32[(r2+9)];
+	heap32[(r4+25)] = heap32[(r2+10)];
+	heap32[(r4+26)] = heap32[(r2+11)];
+	heap32[(r4+27)] = heap32[(r2+12)];
+	heap32[(r4+28)] = heap32[(r2+13)];
+	heap32[(r4+29)] = heap32[(r2+14)];
+	heap32[(r4+30)] = heap32[(r2+15)];
+	heap32[(r4+31)] = heap32[(r2+16)];
+	r16 = heap32[(r5+5)];
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r16;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r16 = heap32[(r1+7)];
+_63: do {
+if(!(r16 ==0)) //_LBB301_73
+{
+	r16 = heap32[(r7+1)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+279)];
+	r17 = heap32[(r1+8)];
+if(!(r16 >=r17)) //_LBB301_73
+{
+	f0 = heapFloat[(r12+1)];
+	f1 = heapFloat[(r12+2)];
+	f2 = heapFloat[(r12+3)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	heapFloat[(fp+-169)] = f1;
+	f2 = heapFloat[(r12+3)];
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r12+2)];
+	f3 = heapFloat[(r12+1)];
+	f2 = f2*f0;
+	heapFloat[(fp+-171)] = f2;
+	f1 = f1*f0;
+	heapFloat[(fp+-170)] = f1;
+	f0 = f3*f0;
+	heapFloat[(fp+-174)] = f0;
+	f0 =                         0;
+	heapFloat[(fp+-175)] = f0;
+	if(f2 <f0) //_LBB301_54
+{
+	f0 = f2;
+	f0 = -f0;
+}
+else{
+	f0 = heapFloat[(fp+-171)];
+}
+	f1 =       0.70710676908493042;
+	if(f0 <=f1) //_LBB301_57
+{
+	f0 = heapFloat[(fp+-174)];
+	f1 = f0*f0;
+	f2 = heapFloat[(fp+-170)];
+	f3 = f2*f2;
+	f1 = f1+f3;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f3 = heapFloat[(fp+-169)];
+	f1 = f3/f_g0;
+	f2 = -f2;
+	f2 = f1*f2;
+	heapFloat[(fp+-173)] = f2;
+	f0 = f0*f1;
+	heapFloat[(fp+-172)] = f0;
+}
+else{
+	f0 = heapFloat[(fp+-170)];
+	f1 = f0*f0;
+	f2 = heapFloat[(fp+-171)];
+	f3 = f2*f2;
+	f1 = f1+f3;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f3 = heapFloat[(fp+-169)];
+	f1 = f3/f_g0;
+	f2 = -f2;
+	f2 = f1*f2;
+	heapFloat[(fp+-172)] = f2;
+	f0 = f0*f1;
+	heapFloat[(fp+-175)] = f0;
+	f0 =                         0;
+	heapFloat[(fp+-173)] = f0;
+}
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	f0 = f_g0;
+	heapFloat[(fp+-194)] = f0;
+	r9 = heap32[(r13)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+4)];
+	heap32[(g0)] = r10;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	f1 = f_g0;
+	heapFloat[(fp+-195)] = f1;
+	r9 = f0 < f1;
+	f2 =      0.019999999552965164;
+	f3 = f0 < f1 ? f0 : f1;
+	r9 = r9 & 1;
+	f2 = f2/f3;
+	if(f0 >=f1) //_LBB301_60
+{
+	f0 = heapFloat[(r4+16)];
+	heapFloat[(fp+-176)] = f0;
+	f0 = heapFloat[(r4+17)];
+	heapFloat[(fp+-177)] = f0;
+	f0 = heapFloat[(r4+18)];
+	heapFloat[(fp+-178)] = f0;
+	f0 = heapFloat[(r4+19)];
+	heapFloat[(fp+-179)] = f0;
+	f0 = heapFloat[(r4+20)];
+	heapFloat[(fp+-180)] = f0;
+	f0 = heapFloat[(r4+21)];
+	heapFloat[(fp+-181)] = f0;
+	f0 = heapFloat[(r4+22)];
+	heapFloat[(fp+-182)] = f0;
+	f0 = heapFloat[(r4+23)];
+	heapFloat[(fp+-183)] = f0;
+	f0 = heapFloat[(r4+24)];
+	heapFloat[(fp+-184)] = f0;
+	f0 = heapFloat[(r4+25)];
+	heapFloat[(fp+-185)] = f0;
+	f0 = heapFloat[(r4+26)];
+	heapFloat[(fp+-186)] = f0;
+	f0 = heapFloat[(r4+27)];
+	heapFloat[(fp+-187)] = f0;
+	f0 = heapFloat[(r4+28)];
+	heapFloat[(fp+-188)] = f0;
+	f0 = heapFloat[(r4+29)];
+	heapFloat[(fp+-189)] = f0;
+	f0 = heapFloat[(r4+30)];
+	heapFloat[(fp+-190)] = f0;
+	f0 = heapFloat[(r4+31)];
+	heapFloat[(fp+-191)] = f0;
+}
+else{
+	f0 = heapFloat[(fp+-42)];
+	heapFloat[(fp+-176)] = f0;
+	f0 = heapFloat[(r4+1)];
+	heapFloat[(fp+-177)] = f0;
+	f0 = heapFloat[(r4+2)];
+	heapFloat[(fp+-178)] = f0;
+	f0 = heapFloat[(r4+3)];
+	heapFloat[(fp+-179)] = f0;
+	f0 = heapFloat[(r4+4)];
+	heapFloat[(fp+-180)] = f0;
+	f0 = heapFloat[(r4+5)];
+	heapFloat[(fp+-181)] = f0;
+	f0 = heapFloat[(r4+6)];
+	heapFloat[(fp+-182)] = f0;
+	f0 = heapFloat[(r4+7)];
+	heapFloat[(fp+-183)] = f0;
+	f0 = heapFloat[(r4+8)];
+	heapFloat[(fp+-184)] = f0;
+	f0 = heapFloat[(r4+9)];
+	heapFloat[(fp+-185)] = f0;
+	f0 = heapFloat[(r4+10)];
+	heapFloat[(fp+-186)] = f0;
+	f0 = heapFloat[(r4+11)];
+	heapFloat[(fp+-187)] = f0;
+	f0 = heapFloat[(r4+12)];
+	heapFloat[(fp+-188)] = f0;
+	f0 = heapFloat[(r4+13)];
+	heapFloat[(fp+-189)] = f0;
+	f0 = heapFloat[(r4+14)];
+	heapFloat[(fp+-190)] = f0;
+	f0 = heapFloat[(r4+15)];
+	heapFloat[(fp+-191)] = f0;
+}
+	f0 = heapFloat[(fp+-173)];
+	f0 = f0*f0;
+	f1 = heapFloat[(fp+-172)];
+	f1 = f1*f1;
+	f3 =                       0.5;
+	heapFloat[(fp+-193)] = f3;
+	f4 = heapFloat[(fp+-174)];
+	f4 = f4*f4;
+	f5 = heapFloat[(fp+-170)];
+	f5 = f5*f5;
+	f0 = f0+f1;
+	f1 = heapFloat[(fp+-175)];
+	f1 = f1*f1;
+	f6 =       0.39269909262657166;
+	f7 =       0.19634954631328583;
+	f3 = f2*f3;
+	f4 = f4+f5;
+	f5 = heapFloat[(fp+-171)];
+	f5 = f5*f5;
+	f0 = f0+f1;
+	heapFloat[(fp+-196)] = f0;
+	f0 = f2 > f6 ? f7 : f3;
+	heapFloat[(fp+-197)] = f0;
+	f0 = f4+f5;
+	heapFloat[(fp+-192)] = f0;
+_78: while(true){
+	r10 = heap32[(r1+7)];
+	if(r10 >r14) //_LBB301_62
+{
+	f0 =   1.1920928955078125e-007;
+	f1 = heapFloat[(fp+-196)];
+if(!(f1 <=f0)) //_LBB301_71
+{
+	f0 = f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f1 =                         0;
+	if(f0 !=f1) //_LBB301_65
+{
+	f2 = heapFloat[(fp+-197)];
+	heapFloat[(g0)] = f2;
+	sinf(i7);
+	f3 = f_g0;
+	heapFloat[(g0)] = f2;
+	cosf(i7);
+	f2 = f_g0;
+	r10 = heap32[(r1+7)];
+	f4 = heapFloat[(fp+-192)];
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	if(f4 !=f1) //_LBB301_67
+{
+	f0 = f3/f0;
+	f3 = heapFloat[(fp+-175)];
+	f3 = f3*f0;
+	f5 = heapFloat[(fp+-172)];
+	f5 = f5*f0;
+	f6 = heapFloat[(fp+-173)];
+	f0 = f6*f0;
+	f6 =        6.2831854820251465;
+	f7 = r10; //fitos r10, f7
+	f8 = r14; //fitos r14, f8
+	f6 = f6/f7;
+	f6 = f8*f6;
+	f7 = heapFloat[(fp+-193)];
+	f6 = f6*f7;
+	heapFloat[(g0)] = f6;
+	sinf(i7);
+	heapFloat[(g0)] = f6;
+	f4 = f_g0/f4;
+	f6 = heapFloat[(fp+-171)];
+	f6 = f6*f4;
+	f7 = heapFloat[(fp+-170)];
+	f7 = f7*f4;
+	f8 = heapFloat[(fp+-174)];
+	f4 = f8*f4;
+	cosf(i7);
+	f8 = f_g0;
+	f10 = heapFloat[(fp+-195)];
+	f9 = heapFloat[(fp+-194)];
+	if(f9 >=f10) //_LBB301_69
+{
+	f9 = heapFloat[(r8+1)];
+	heapFloat[(fp+-155)] = f9;
+	heapFloat[(fp+-42)] = f9;
+	f9 = heapFloat[(r8+2)];
+	heapFloat[(fp+-156)] = f9;
+	heapFloat[(r4+1)] = f9;
+	f9 = heapFloat[(r8+3)];
+	heapFloat[(fp+-157)] = f9;
+	heapFloat[(r4+2)] = f9;
+	f9 = heapFloat[(r8+4)];
+	heapFloat[(fp+-163)] = f9;
+	heapFloat[(r4+3)] = f9;
+	f9 = heapFloat[(r8+5)];
+	heapFloat[(fp+-158)] = f9;
+	heapFloat[(r4+4)] = f9;
+	f9 = heapFloat[(r8+6)];
+	heapFloat[(fp+-159)] = f9;
+	heapFloat[(r4+5)] = f9;
+	f9 = heapFloat[(r8+7)];
+	heapFloat[(fp+-160)] = f9;
+	heapFloat[(r4+6)] = f9;
+	f9 = heapFloat[(r8+8)];
+	heapFloat[(fp+-162)] = f9;
+	heapFloat[(r4+7)] = f9;
+	f9 = heapFloat[(r8+9)];
+	heapFloat[(fp+-161)] = f9;
+	f10 = f8*f2;
+	f11 = f0*f4;
+	f12 = f8*f0;
+	f13 = f2*f4;
+	f14 = f8*f5;
+	f15 = f2*f7;
+	heapFloat[(r4+8)] = f9;
+	f9 = f10+f11;
+	f10 = f5*f7;
+	f11 = f8*f3;
+	f2 = f2*f6;
+	f12 = f12-f13;
+	f13 = f3*f7;
+	f14 = f14-f15;
+	f15 = f0*f6;
+	f16 = heapFloat[(r8+10)];
+	heapFloat[(fp+-164)] = f16;
+	f9 = f9+f10;
+	f10 = f3*f6;
+	f2 = f11-f2;
+	f11 = f5*f4;
+	f12 = f12-f13;
+	f5 = f5*f6;
+	f13 = f14-f15;
+	f3 = f3*f4;
+	f9 = f9+f10;
+	f5 = f12+f5;
+	f3 = f13+f3;
+	heapFloat[(r4+9)] = f16;
+	f2 = f2-f11;
+	f0 = f0*f7;
+	f0 = f2+f0;
+	f2 = heapFloat[(r8+11)];
+	heapFloat[(fp+-166)] = f2;
+	f10 = f9*f7;
+	f11 = f3*f8;
+	f12 = f9*f4;
+	f13 = f5*f8;
+	heapFloat[(r4+10)] = f2;
+	f2 = f10+f11;
+	f10 = f0*f4;
+	f11 = f12+f13;
+	f12 = f3*f6;
+	f13 = f9*f6;
+	f14 = f0*f8;
+	f17 = heapFloat[(r8+12)];
+	f8 = f9*f8;
+	f9 = f5*f4;
+	f2 = f2+f10;
+	f10 = f5*f6;
+	f11 = f11+f12;
+	f12 = f0*f7;
+	f13 = f13+f14;
+	f5 = f5*f7;
+	f10 = f2-f10;
+	f2 = f11-f12;
+	heapFloat[(r4+11)] = f17;
+	f8 = f8-f9;
+	f7 = f3*f7;
+	f5 = f13+f5;
+	f3 = f3*f4;
+	f4 = heapFloat[(r8+13)];
+	heapFloat[(fp+-165)] = f4;
+	f3 = f5-f3;
+	f5 = f8-f7;
+	f0 = f0*f6;
+	f6 = f2*f2;
+	f7 = f10*f10;
+	f5 = f5-f0;
+	heapFloat[(r4+12)] = f4;
+	f0 = f6+f7;
+	f4 = f3*f3;
+	f6 = heapFloat[(r8+14)];
+	heapFloat[(fp+-167)] = f6;
+	f0 = f0+f4;
+	f4 = f5*f5;
+	heapFloat[(r4+13)] = f6;
+	f6 =                         2;
+	f0 = f0+f4;
+	f0 = f6/f0;
+	f4 = heapFloat[(r8+15)];
+	heapFloat[(fp+-168)] = f4;
+	f6 = f3*f0;
+	f7 = f10*f0;
+	heapFloat[(r4+14)] = f4;
+	f16 = heapFloat[(r8+16)];
+	f4 = f10*f7;
+	f3 = f3*f6;
+	f8 = f4+f3;
+	f9 = f2*f7;
+	f11 = f5*f6;
+	heapFloat[(r4+15)] = f16;
+	f12 = heapFloat[(fp+-169)];
+	f8 = f12-f8;
+	f13 = heapFloat[(r2+1)];
+	f14 = f9-f11;
+	f15 = heapFloat[(r2+5)];
+	f18 = f2*f6;
+	f7 = f5*f7;
+	f19 = f2*f0;
+	f20 = heapFloat[(r2+2)];
+	f21 = heapFloat[(r2+6)];
+	f0 = f13*f8;
+	f22 = f15*f14;
+	f23 = f18+f7;
+	f24 = heapFloat[(r2+9)];
+	f25 = f2*f19;
+	f26 = heapFloat[(r2+3)];
+	f27 = heapFloat[(r2+7)];
+	f28 = heapFloat[(r2+11)];
+	f29 = heapFloat[(r2+10)];
+	f2 = f20*f8;
+	f30 = f21*f14;
+	f0 = f0+f22;
+	f22 = f24*f23;
+	f3 = f25+f3;
+	f0 = f0+f22;
+	f8 = f26*f8;
+	f14 = f27*f14;
+	f2 = f2+f30;
+	f22 = f29*f23;
+	f9 = f9+f11;
+	f11 = f12-f3;
+	f2 = f2+f22;
+	heapFloat[(r4+16)] = f0;
+	f6 = f10*f6;
+	f10 = f5*f19;
+	f3 = f8+f14;
+	f5 = f28*f23;
+	f8 = f6-f10;
+	f3 = f3+f5;
+	heapFloat[(r4+17)] = f2;
+	f5 = f13*f9;
+	f14 = f15*f11;
+	heapFloat[(r4+18)] = f3;
+	f19 = f20*f9;
+	f22 = f21*f11;
+	f5 = f5+f14;
+	f14 = f24*f8;
+	f5 = f5+f14;
+	heap32[(r4+19)] = 0;
+	f9 = f26*f9;
+	f11 = f27*f11;
+	f14 = f19+f22;
+	f19 = f29*f8;
+	f18 = f18-f7;
+	f10 = f6+f10;
+	f4 = f25+f4;
+	f6 = f14+f19;
+	heapFloat[(r4+20)] = f5;
+	f7 = f9+f11;
+	f8 = f28*f8;
+	f4 = f12-f4;
+	f7 = f7+f8;
+	heapFloat[(r4+21)] = f6;
+	f8 = f13*f18;
+	f9 = f15*f10;
+	heapFloat[(r4+22)] = f7;
+	f11 = f20*f18;
+	f12 = f21*f10;
+	f8 = f8+f9;
+	f9 = f24*f4;
+	f9 = f8+f9;
+	heap32[(r4+23)] = 0;
+	f8 = f26*f18;
+	f13 = f27*f10;
+	f10 = f11+f12;
+	f11 = f29*f4;
+	f10 = f10+f11;
+	heapFloat[(r4+24)] = f9;
+	f8 = f8+f13;
+	f4 = f28*f4;
+	f11 = f8+f4;
+	heapFloat[(r4+25)] = f10;
+	heapFloat[(r4+26)] = f11;
+	heap32[(r4+27)] = 0;
+	f12 = heapFloat[(r4+28)];
+	f13 = heapFloat[(r4+29)];
+	f14 = heapFloat[(r4+30)];
+	f15 = heapFloat[(r4+31)];
+	f8 = f1;
+	f4 = f1;
+}
+else{
+	f1 = f8*f2;
+	f9 = f0*f4;
+	f10 = f8*f0;
+	f11 = f2*f4;
+	f12 = f8*f5;
+	f13 = f2*f7;
+	f1 = f1+f9;
+	f9 = f5*f7;
+	f14 = f8*f3;
+	f2 = f2*f6;
+	f10 = f10-f11;
+	f11 = f3*f7;
+	f12 = f12-f13;
+	f13 = f0*f6;
+	f1 = f1+f9;
+	f9 = f3*f6;
+	f2 = f14-f2;
+	f14 = f5*f4;
+	f10 = f10-f11;
+	f5 = f5*f6;
+	f11 = f12-f13;
+	f3 = f3*f4;
+	f1 = f1+f9;
+	f5 = f10+f5;
+	f3 = f11+f3;
+	f2 = f2-f14;
+	f0 = f0*f7;
+	f0 = f2+f0;
+	f2 = f1*f7;
+	f9 = f3*f8;
+	f10 = f1*f4;
+	f11 = f5*f8;
+	f2 = f2+f9;
+	f9 = f0*f4;
+	f10 = f10+f11;
+	f11 = f3*f6;
+	f12 = f1*f6;
+	f13 = f0*f8;
+	f1 = f1*f8;
+	f8 = f5*f4;
+	f2 = f2+f9;
+	f9 = f5*f6;
+	f10 = f10+f11;
+	f11 = f0*f7;
+	f12 = f12+f13;
+	f5 = f5*f7;
+	f2 = f2-f9;
+	f9 = f10-f11;
+	f1 = f1-f8;
+	f7 = f3*f7;
+	f5 = f12+f5;
+	f3 = f3*f4;
+	f3 = f5-f3;
+	f1 = f1-f7;
+	f0 = f0*f6;
+	f4 = f9*f9;
+	f5 = f2*f2;
+	f0 = f1-f0;
+	f1 = f4+f5;
+	f4 = f3*f3;
+	f1 = f1+f4;
+	f4 = f0*f0;
+	f5 =                         2;
+	f1 = f1+f4;
+	f1 = f5/f1;
+	f4 = f3*f1;
+	f5 = f2*f1;
+	f6 = f2*f5;
+	f3 = f3*f4;
+	f7 = f6+f3;
+	f8 = f9*f5;
+	f10 = f0*f4;
+	f11 = heapFloat[(fp+-169)];
+	f7 = f11-f7;
+	f12 = heapFloat[(r8+1)];
+	f13 = f8-f10;
+	f14 = heapFloat[(r8+5)];
+	f15 = f9*f4;
+	f5 = f0*f5;
+	f1 = f9*f1;
+	f16 = heapFloat[(r8+2)];
+	f17 = heapFloat[(r8+6)];
+	f18 = f12*f7;
+	f19 = f14*f13;
+	f20 = f15+f5;
+	f21 = heapFloat[(r8+9)];
+	f9 = f9*f1;
+	f22 = heapFloat[(r8+3)];
+	f23 = heapFloat[(r8+7)];
+	f24 = heapFloat[(r8+11)];
+	f25 = heapFloat[(r8+10)];
+	f26 = f16*f7;
+	f27 = f17*f13;
+	f18 = f18+f19;
+	f19 = f21*f20;
+	f3 = f9+f3;
+	f18 = f18+f19;
+	heapFloat[(fp+-155)] = f18;
+	f7 = f22*f7;
+	f13 = f23*f13;
+	f19 = f26+f27;
+	f26 = f25*f20;
+	f8 = f8+f10;
+	f3 = f11-f3;
+	f10 = f19+f26;
+	heapFloat[(fp+-156)] = f10;
+	heapFloat[(fp+-42)] = f18;
+	f2 = f2*f4;
+	f0 = f0*f1;
+	f1 = f7+f13;
+	f4 = f24*f20;
+	f7 = f2-f0;
+	f1 = f1+f4;
+	heapFloat[(fp+-157)] = f1;
+	heapFloat[(r4+1)] = f10;
+	f4 = f12*f8;
+	f10 = f14*f3;
+	heapFloat[(r4+2)] = f1;
+	f1 = f16*f8;
+	f13 = f17*f3;
+	f4 = f4+f10;
+	f10 = f21*f7;
+	f4 = f4+f10;
+	heapFloat[(fp+-158)] = f4;
+	heap32[(r4+3)] = 0;
+	f8 = f22*f8;
+	f3 = f23*f3;
+	f1 = f1+f13;
+	f10 = f25*f7;
+	f5 = f15-f5;
+	f0 = f2+f0;
+	f2 = f9+f6;
+	f1 = f1+f10;
+	heapFloat[(fp+-159)] = f1;
+	heapFloat[(r4+4)] = f4;
+	f3 = f8+f3;
+	f4 = f24*f7;
+	f2 = f11-f2;
+	f3 = f3+f4;
+	heapFloat[(fp+-160)] = f3;
+	heapFloat[(r4+5)] = f1;
+	f1 = f12*f5;
+	f4 = f14*f0;
+	heapFloat[(r4+6)] = f3;
+	f3 = f16*f5;
+	f6 = f17*f0;
+	f1 = f1+f4;
+	f4 = f21*f2;
+	f1 = f1+f4;
+	heapFloat[(fp+-161)] = f1;
+	heap32[(r4+7)] = 0;
+	f4 = f22*f5;
+	f0 = f23*f0;
+	f3 = f3+f6;
+	f5 = f25*f2;
+	f3 = f3+f5;
+	heapFloat[(fp+-164)] = f3;
+	heapFloat[(r4+8)] = f1;
+	f0 = f4+f0;
+	f1 = f24*f2;
+	f0 = f0+f1;
+	heapFloat[(fp+-166)] = f0;
+	heapFloat[(r4+9)] = f3;
+	heapFloat[(r4+10)] = f0;
+	heap32[(r4+11)] = 0;
+	f0 = heapFloat[(r2+1)];
+	heapFloat[(r4+16)] = f0;
+	f2 = heapFloat[(r2+2)];
+	heapFloat[(r4+17)] = f2;
+	f3 = heapFloat[(r2+3)];
+	heapFloat[(r4+18)] = f3;
+	f4 = heapFloat[(r2+4)];
+	heapFloat[(r4+19)] = f4;
+	f5 = heapFloat[(r2+5)];
+	heapFloat[(r4+20)] = f5;
+	f6 = heapFloat[(r2+6)];
+	heapFloat[(r4+21)] = f6;
+	f7 = heapFloat[(r2+7)];
+	heapFloat[(r4+22)] = f7;
+	f8 = heapFloat[(r2+8)];
+	heapFloat[(r4+23)] = f8;
+	f9 = heapFloat[(r2+9)];
+	heapFloat[(r4+24)] = f9;
+	f10 = heapFloat[(r2+10)];
+	heapFloat[(r4+25)] = f10;
+	f11 = heapFloat[(r2+11)];
+	heapFloat[(r4+26)] = f11;
+	f1 = heapFloat[(r2+12)];
+	heapFloat[(r4+27)] = f1;
+	f12 = heapFloat[(r2+13)];
+	heapFloat[(r4+28)] = f12;
+	f13 = heapFloat[(r2+14)];
+	heapFloat[(r4+29)] = f13;
+	f14 = heapFloat[(r2+15)];
+	heapFloat[(r4+30)] = f14;
+	f15 = heapFloat[(r2+16)];
+	heapFloat[(r4+31)] = f15;
+	f16 = heapFloat[(r4+12)];
+	heapFloat[(fp+-165)] = f16;
+	f16 = heapFloat[(r4+13)];
+	heapFloat[(fp+-167)] = f16;
+	f16 = heapFloat[(r4+14)];
+	heapFloat[(fp+-168)] = f16;
+	f16 = heapFloat[(r4+15)];
+	f17 =                         0;
+	heapFloat[(fp+-162)] = f17;
+	heapFloat[(fp+-163)] = f17;
+}
+	r10 = _ZTV24btPerturbedContactResult;
+	r11 = sp + -616;
+	r12 = heap32[(r5+5)];
+	r10 = (r10 + 8)|0;
+	r13 = r11 >> 2;
+	heap32[(fp+-154)] = r10;
+	heap32[(r13+40)] = r6;
+	f18 = heapFloat[(fp+-155)];
+	heapFloat[(r13+41)] = f18;
+	f18 = heapFloat[(fp+-156)];
+	heapFloat[(r13+42)] = f18;
+	f18 = heapFloat[(fp+-157)];
+	heapFloat[(r13+43)] = f18;
+	f22 = heapFloat[(fp+-163)];
+	heapFloat[(r13+44)] = f22;
+	f18 = heapFloat[(fp+-158)];
+	heapFloat[(r13+45)] = f18;
+	f18 = heapFloat[(fp+-159)];
+	heapFloat[(r13+46)] = f18;
+	f18 = heapFloat[(fp+-160)];
+	heapFloat[(r13+47)] = f18;
+	f22 = heapFloat[(fp+-162)];
+	heapFloat[(r13+48)] = f22;
+	f18 = heapFloat[(fp+-161)];
+	heapFloat[(r13+49)] = f18;
+	f18 = heapFloat[(fp+-164)];
+	heapFloat[(r13+50)] = f18;
+	f18 = heapFloat[(fp+-166)];
+	heapFloat[(r13+51)] = f18;
+	heapFloat[(r13+52)] = f17;
+	f17 = heapFloat[(fp+-165)];
+	heapFloat[(r13+53)] = f17;
+	f17 = heapFloat[(fp+-167)];
+	heapFloat[(r13+54)] = f17;
+	f17 = heapFloat[(fp+-168)];
+	heapFloat[(r13+55)] = f17;
+	heapFloat[(r13+56)] = f16;
+	heapFloat[(r13+57)] = f0;
+	heapFloat[(r13+58)] = f2;
+	heapFloat[(r13+59)] = f3;
+	heapFloat[(r13+60)] = f4;
+	heapFloat[(r13+61)] = f5;
+	heapFloat[(r13+62)] = f6;
+	heapFloat[(r13+63)] = f7;
+	heapFloat[(r13+64)] = f8;
+	heapFloat[(r13+65)] = f9;
+	heapFloat[(r13+66)] = f10;
+	heapFloat[(r13+67)] = f11;
+	heapFloat[(r13+68)] = f1;
+	heapFloat[(r13+69)] = f12;
+	heapFloat[(r13+70)] = f13;
+	heapFloat[(r13+71)] = f14;
+	heapFloat[(r13+72)] = f15;
+	f0 = heapFloat[(fp+-176)];
+	heapFloat[(r13+73)] = f0;
+	f0 = heapFloat[(fp+-177)];
+	heapFloat[(r13+74)] = f0;
+	f0 = heapFloat[(fp+-178)];
+	heapFloat[(r13+75)] = f0;
+	f0 = heapFloat[(fp+-179)];
+	heapFloat[(r13+76)] = f0;
+	f0 = heapFloat[(fp+-180)];
+	heapFloat[(r13+77)] = f0;
+	f0 = heapFloat[(fp+-181)];
+	heapFloat[(r13+78)] = f0;
+	f0 = heapFloat[(fp+-182)];
+	heapFloat[(r13+79)] = f0;
+	f0 = heapFloat[(fp+-183)];
+	heapFloat[(r13+80)] = f0;
+	f0 = heapFloat[(fp+-184)];
+	heapFloat[(r13+81)] = f0;
+	f0 = heapFloat[(fp+-185)];
+	heapFloat[(r13+82)] = f0;
+	f0 = heapFloat[(fp+-186)];
+	heapFloat[(r13+83)] = f0;
+	f0 = heapFloat[(fp+-187)];
+	heapFloat[(r13+84)] = f0;
+	f0 = heapFloat[(fp+-188)];
+	heapFloat[(r13+85)] = f0;
+	f0 = heapFloat[(fp+-189)];
+	heapFloat[(r13+86)] = f0;
+	f0 = heapFloat[(fp+-190)];
+	heapFloat[(r13+87)] = f0;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(r13+88)] = f0;
+	heap8[sp+-260] = r9;
+	heap32[(r13+90)] = r12;
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+}
+else{
+break _78;
+}
+}
+else{
+break _78;
+}
+}
+	r14 = (r14 + 1)|0;
+}
+else{
+break _63;
+}
+}
+	r0 = _2E_str115;
+	r1 = _2E_str685;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 61;
+	_assert(i7);
+}
+}
+} while(0);
+	r0 = heapU8[r0+16];
+	if(r0 ==0) //_LBB301_47
+{
+__label__ = 44;
+}
+else{
+	r0 = heap32[(r7+1)];
+	if(r0 !=0) //_LBB301_76
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	if(r2 ==0) //_LBB301_47
+{
+__label__ = 44;
+}
+else{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r7+34)];
+	if(r1 ==r2) //_LBB301_79
+{
+__label__ = 43;
+}
+else{
+	r1 = (r6 + 72)|0;
+	r6 = (r6 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r6 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 44:
+	return;
+break;
+case 43:
+	r1 = (r6 + 8)|0;
+	r2 = (r6 + 72)|0;
+break;
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btConvexConvexAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+16];
+if(!(r1 ==0)) //_LBB302_3
+{
+	r1 = heap32[(r2+5)];
+if(!(r1 ==0)) //_LBB302_3
+{
+	r3 = heap32[(r2+1)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+}
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btConvexConvexAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btConvexConvexAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+16];
+if(!(r0 ==0)) //_LBB303_3
+{
+	r0 = heap32[(r2+5)];
+if(!(r0 ==0)) //_LBB303_3
+{
+	r1 = heap32[(r2+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	r0 = _ZTV30btActivatingCollisionAlgorithm;
+	r0 = (r0 + 8)|0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB305_23
+{
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB305_23
+{
+	r0 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB305_4
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB305_3
+{
+	if(r7 !=0) //_LBB305_7
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r4;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB305_9
+{
+	r4 = 0;
+	r8 = (r2 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r2 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r4 = (r0 + 12)|0;
+	if(r5 <1) //_LBB305_12
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_15: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB305_13
+{
+break _15;
+}
+}
+	r4 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB305_17
+{
+	r8 = heapU8[r0+16];
+	if(r8 !=0) //_LBB305_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r4)] = r2;
+	heap32[(r3+2)] = r7;
+	r2 = heap32[(r1+3)];
+}
+}
+	r0 = r5 << 2;
+	r1 = heap32[(r3+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+}
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm20collideSingleContactERK12btQuaternionP17btCollisionObjectS4_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -136;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f5 = heapFloat[(r0+3)];
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 = f5*f5;
+	f6 =                         2;
+	f3 = f3+f4;
+	f3 = f6/f3;
+	r0 = heap32[(fp)];
+	f4 = f2*f3;
+	f6 = f1*f3;
+	r1 = heapU8[r0+16];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp+2)];
+	f3 = f0*f3;
+	r4 = r1 == 0 ? r3 : r2;
+	f7 = f1*f6;
+	f2 = f2*f4;
+	r4 = r4 >> 2;
+	f8 = f0*f3;
+	f9 =                         1;
+	f10 = f7+f2;
+	f11 = f0*f6;
+	f12 = f5*f4;
+	f2 = f8+f2;
+	f10 = f9-f10;
+	f13 = heapFloat[(r4+1)];
+	heapFloat[(fp+-17)] = f13;
+	f13 = heapFloat[(r4+5)];
+	heapFloat[(fp+-18)] = f13;
+	f14 = f11+f12;
+	f13 = heapFloat[(r4+2)];
+	heapFloat[(fp+-19)] = f13;
+	f13 = heapFloat[(r4+6)];
+	heapFloat[(fp+-20)] = f13;
+	f0 = f0*f4;
+	f6 = f5*f6;
+	f11 = f11-f12;
+	f2 = f9-f2;
+	f12 = heapFloat[(r4+9)];
+	heapFloat[(fp+-24)] = f12;
+	f15 = heapFloat[(r4+10)];
+	heapFloat[(fp+-25)] = f15;
+	r1 = r1 == 0 ? r2 : r3;
+	f1 = f1*f4;
+	f3 = f5*f3;
+	f13 = heapFloat[(fp+-17)];
+	f4 = f10*f13;
+	f13 = heapFloat[(fp+-19)];
+	f5 = f14*f13;
+	f13 = heapFloat[(fp+-18)];
+	f16 = f10*f13;
+	f13 = heapFloat[(fp+-20)];
+	f17 = f14*f13;
+	f18 = f0-f6;
+	f19 = heapFloat[(r4+3)];
+	heapFloat[(fp+-26)] = f19;
+	f20 = heapFloat[(r4+7)];
+	heapFloat[(fp+-27)] = f20;
+	r1 = r1 >> 2;
+	f0 = f0+f6;
+	f6 = f1-f3;
+	f1 = f1+f3;
+	f3 = heapFloat[(r4+11)];
+	heapFloat[(fp+-21)] = f3;
+	f7 = f8+f7;
+	f13 = heapFloat[(fp+-17)];
+	f8 = f11*f13;
+	f13 = heapFloat[(fp+-19)];
+	f21 = f2*f13;
+	f13 = heapFloat[(fp+-18)];
+	f22 = f11*f13;
+	f13 = heapFloat[(fp+-20)];
+	f23 = f2*f13;
+	f4 = f4+f5;
+	f5 = f18*f19;
+	f16 = f16+f17;
+	f17 = f18*f20;
+	f10 = f10*f12;
+	f14 = f14*f15;
+	f7 = f9-f7;
+	f9 = heapFloat[(r1+2)];
+	f24 = heapFloat[(r1+6)];
+	f25 = heapFloat[(r1+1)];
+	f26 = heapFloat[(r1+5)];
+	f4 = f4+f5;
+	f5 = f16+f17;
+	r2 = heap32[(r1+48)];
+	f13 = heapFloat[(fp+-17)];
+	f16 = f0*f13;
+	f13 = heapFloat[(fp+-19)];
+	f17 = f6*f13;
+	f13 = heapFloat[(fp+-18)];
+	f27 = f0*f13;
+	f13 = heapFloat[(fp+-20)];
+	f28 = f6*f13;
+	f8 = f8+f21;
+	f21 = f1*f19;
+	f22 = f22+f23;
+	f23 = f1*f20;
+	f11 = f11*f12;
+	f2 = f2*f15;
+	f10 = f10+f14;
+	f14 = f18*f3;
+	f18 = heapFloat[(r1+3)];
+	f29 = heapFloat[(r1+7)];
+	f8 = f8+f21;
+	f21 = f22+f23;
+	f22 = heapFloat[(r1+10)];
+	f23 = heapFloat[(r1+9)];
+	r2 = r2 >> 2;
+	f10 = f10+f14;
+	r3 = heap32[(r4+48)];
+	f14 = f16+f17;
+	f16 = f7*f19;
+	f17 = f27+f28;
+	f27 = f7*f20;
+	f0 = f0*f12;
+	f6 = f6*f15;
+	f2 = f11+f2;
+	f1 = f1*f3;
+	f11 = f25*f4;
+	f28 = f26*f5;
+	f30 = f9*f4;
+	f3 = f24*f5;
+	f12 = heapFloat[(r1+11)];
+	f14 = f14+f16;
+	f16 = f17+f27;
+	f1 = f2+f1;
+	r5 = r3 >> 2;
+	f2 = heapFloat[(r2+12)];
+	f0 = f0+f6;
+	f6 = heapFloat[(fp+-21)];
+	f7 = f7*f6;
+	f17 = f25*f8;
+	f27 = f26*f21;
+	f6 = f9*f8;
+	f13 = f24*f21;
+	f11 = f11+f28;
+	f28 = f23*f10;
+	f3 = f30+f3;
+	f30 = f22*f10;
+	f4 = f18*f4;
+	f5 = f29*f5;
+	f0 = f0+f7;
+	r5 = heap32[(r5)];
+	f7 = f25*f14;
+	f15 = f26*f16;
+	f19 = f9*f14;
+	f20 = f24*f16;
+	f17 = f17+f27;
+	f27 = f23*f1;
+	f6 = f6+f13;
+	f13 = f22*f1;
+	f8 = f18*f8;
+	f21 = f29*f21;
+	f11 = f11+f28;
+	f2 = -f2;
+	f3 = f3+f30;
+	f28 = heapFloat[(r2+13)];
+	f4 = f4+f5;
+	f5 = f12*f10;
+	r5 = r5 >> 2;
+	f10 = f17+f27;
+	f6 = f6+f13;
+	f7 = f7+f15;
+	f13 = f23*f0;
+	f15 = f19+f20;
+	f17 = f22*f0;
+	f14 = f18*f14;
+	f16 = f29*f16;
+	f8 = f8+f21;
+	f1 = f12*f1;
+	f11 = f11*f2;
+	f3 = f3*f28;
+	f4 = f4+f5;
+	f5 = heapFloat[(r2+14)];
+	f19 = heapFloat[(r4+13)];
+	heapFloat[(fp+-22)] = f19;
+	f19 = heapFloat[(r4+14)];
+	heapFloat[(fp+-23)] = f19;
+	f20 = heapFloat[(r4+15)];
+	heapFloat[(fp+-28)] = f20;
+	f21 = heapFloat[(r1+14)];
+	f27 = heapFloat[(r1+15)];
+	heapFloat[(fp+-29)] = f27;
+	f7 = f7+f13;
+	f13 = f15+f17;
+	f1 = f8+f1;
+	f8 = heapFloat[(r1+13)];
+	r4 = heap32[(r5+15)];
+	f14 = f14+f16;
+	f0 = f12*f0;
+	f10 = f10*f2;
+	f6 = f6*f28;
+	f3 = f11-f3;
+	f4 = f4*f5;
+	r5 = sp + -16;
+	f0 = f14+f0;
+	f2 = f7*f2;
+	f7 = f13*f28;
+	f6 = f10-f6;
+	f1 = f1*f5;
+	f3 = f3-f4;
+	r6 = r5 >> 2;
+	f2 = f2-f7;
+	f0 = f0*f5;
+	f1 = f6-f1;
+	heapFloat[(fp+-4)] = f3;
+	f0 = f2-f0;
+	heapFloat[(r6+1)] = f1;
+	heapFloat[(r6+2)] = f0;
+	heap32[(r6+3)] = 0;
+	r6 = sp + -32;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r5;
+	f13 = heapFloat[(fp+-17)];
+	f0 = f13*f9;
+	f13 = heapFloat[(fp+-18)];
+	f1 = f13*f24;
+	f13 = heapFloat[(fp+-19)];
+	f2 = f13*f9;
+	f13 = heapFloat[(fp+-20)];
+	f3 = f13*f24;
+	f13 = heapFloat[(fp+-17)];
+	f4 = f13*f25;
+	f13 = heapFloat[(fp+-18)];
+	f5 = f13*f26;
+	f13 = heapFloat[(fp+-19)];
+	f6 = f13*f25;
+	f13 = heapFloat[(fp+-20)];
+	f7 = f13*f26;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	f8 = -f8;
+	r3 = r6 >> 2;
+	f13 = heapFloat[(fp+-17)];
+	f10 = f13*f18;
+	f13 = heapFloat[(fp+-18)];
+	f11 = f13*f29;
+	f13 = heapFloat[(fp+-19)];
+	f13 = f13*f18;
+	f14 = heapFloat[(fp+-20)];
+	f14 = f14*f29;
+	f0 = f0+f1;
+	f1 = heapFloat[(fp+-24)];
+	f15 = f1*f22;
+	f2 = f2+f3;
+	f3 = heapFloat[(fp+-25)];
+	f16 = f3*f22;
+	f19 = heapFloat[(fp+-26)];
+	f17 = f19*f9;
+	f20 = heapFloat[(fp+-27)];
+	f28 = f20*f24;
+	f4 = f4+f5;
+	f5 = f1*f23;
+	f6 = f6+f7;
+	f7 = f3*f23;
+	f30 = f19*f25;
+	f1 = f20*f26;
+	f10 = f10+f11;
+	f11 = heapFloat[(fp+-24)];
+	f11 = f11*f12;
+	f13 = f13+f14;
+	f3 = f3*f12;
+	f14 = f19*f18;
+	f19 = f20*f29;
+	f0 = f0+f15;
+	f15 = heapFloat[(fp+-8)];
+	f4 = f4+f5;
+	f2 = f2+f16;
+	f5 = heapFloat[(r3+1)];
+	f6 = f6+f7;
+	f7 = f17+f28;
+	f16 = heapFloat[(fp+-21)];
+	f17 = f16*f22;
+	f20 = heapFloat[(fp+-22)];
+	f28 = f9*f20;
+	f16 = heapFloat[(fp+-23)];
+	f16 = f24*f16;
+	f9 = f9*f8;
+	f24 = f24*f21;
+	f1 = f30+f1;
+	f30 = heapFloat[(fp+-21)];
+	f20 = f30*f23;
+	f27 = heapFloat[(fp+-22)];
+	f27 = f25*f27;
+	f30 = heapFloat[(fp+-23)];
+	f30 = f26*f30;
+	f25 = f25*f8;
+	f26 = f26*f21;
+	f10 = f10+f11;
+	f3 = f13+f3;
+	f11 = f14+f19;
+	f13 = heapFloat[(fp+-21)];
+	f13 = f13*f12;
+	f14 = heapFloat[(fp+-22)];
+	f14 = f18*f14;
+	f19 = heapFloat[(fp+-23)];
+	f19 = f29*f19;
+	f8 = f18*f8;
+	f18 = f29*f21;
+	f0 = f0*f15;
+	f2 = f2*f5;
+	f7 = f7+f17;
+	f17 = heapFloat[(r3+2)];
+	f1 = f1+f20;
+	f16 = f28+f16;
+	f20 = heapFloat[(fp+-28)];
+	f21 = f22*f20;
+	f9 = f9-f24;
+	f24 = heapFloat[(fp+-29)];
+	f22 = f22*f24;
+	f4 = f4*f15;
+	f6 = f6*f5;
+	f27 = f27+f30;
+	f28 = f23*f20;
+	f25 = f25-f26;
+	f23 = f23*f24;
+	f11 = f11+f13;
+	f10 = f10*f15;
+	f3 = f3*f5;
+	f5 = f14+f19;
+	f13 = f12*f20;
+	f8 = f8-f18;
+	f12 = f12*f24;
+	f0 = f0+f2;
+	f2 = f7*f17;
+	f7 = f16+f21;
+	f9 = f9-f22;
+	f4 = f4+f6;
+	f1 = f1*f17;
+	f6 = f27+f28;
+	f14 = f25-f23;
+	f3 = f10+f3;
+	f10 = f11*f17;
+	f5 = f5+f13;
+	f8 = f8-f12;
+	f0 = f0+f2;
+	f2 = f7+f9;
+	f1 = f4+f1;
+	f4 = f6+f14;
+	f3 = f3+f10;
+	f5 = f5+f8;
+	f0 = f0+f2;
+	f2 = heapFloat[(r2+13)];
+	f1 = f1+f4;
+	f4 = heapFloat[(r2+12)];
+	f6 = f4*f1;
+	f7 = f2*f0;
+	f3 = f3+f5;
+	f5 = heapFloat[(r2+14)];
+	r0 = r0 >> 2;
+	f6 = f6+f7;
+	f7 = f5*f3;
+	r0 = heap32[(r0+3)];
+	f6 = f6+f7;
+	f7 = heapFloat[(r2+16)];
+	f6 = f6-f7;
+	r3 = r0 >> 2;
+	r4 = heap32[(fp+4)];
+	f7 = heapFloat[(r1+9)];
+	f8 = heapFloat[(r1+10)];
+	f9 = heapFloat[(r1+11)];
+	f10 = heapFloat[(r1+15)];
+	f11 = heapFloat[(r1+5)];
+	f12 = heapFloat[(r1+6)];
+	f13 = heapFloat[(r1+7)];
+	f14 = heapFloat[(r1+14)];
+	f15 = heapFloat[(r1+1)];
+	f16 = heapFloat[(r1+2)];
+	f17 = heapFloat[(r1+3)];
+	f18 = heapFloat[(r1+13)];
+	f19 = heapFloat[(r3+280)];
+	r3 = r4 >> 2;
+	heap32[(r3+1)] = r0;
+if(!(f19 <=f6)) //_LBB306_2
+{
+	f5 = f5*f6;
+	f2 = f2*f6;
+	f4 = f4*f6;
+	f3 = f3-f5;
+	f0 = f0-f2;
+	f1 = f1-f4;
+	f2 = heapFloat[(r2+12)];
+	f4 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r2+13)];
+	f19 = heapFloat[(r1+2)];
+	f20 = heapFloat[(r1+5)];
+	f21 = heapFloat[(r1+6)];
+	f4 = f4*f2;
+	f19 = f19*f5;
+	f22 = heapFloat[(r2+14)];
+	f23 = heapFloat[(r1+3)];
+	f24 = heapFloat[(r1+9)];
+	f25 = heapFloat[(r1+10)];
+	f26 = heapFloat[(r1+11)];
+	f27 = heapFloat[(r1+7)];
+	f20 = f20*f2;
+	f21 = f21*f5;
+	f4 = f4+f19;
+	f19 = f23*f22;
+	r0 = sp + -48;
+	f2 = f24*f2;
+	f5 = f25*f5;
+	f20 = f20+f21;
+	f21 = f27*f22;
+	f4 = f4+f19;
+	f15 = f15*f1;
+	f16 = f16*f0;
+	r1 = r0 >> 2;
+	f2 = f2+f5;
+	f5 = f26*f22;
+	f19 = f20+f21;
+	heapFloat[(fp+-12)] = f4;
+	f4 = f11*f1;
+	f11 = f12*f0;
+	f12 = f15+f16;
+	f15 = f17*f3;
+	f2 = f2+f5;
+	heapFloat[(r1+1)] = f19;
+	heapFloat[(r1+2)] = f2;
+	f1 = f7*f1;
+	f0 = f8*f0;
+	f2 = f4+f11;
+	f4 = f13*f3;
+	f5 = f12+f15;
+	r2 = sp + -64;
+	f0 = f1+f0;
+	f1 = f9*f3;
+	f2 = f2+f4;
+	f3 = f5+f18;
+	heap32[(r1+3)] = 0;
+	r1 = r2 >> 2;
+	f0 = f0+f1;
+	f1 = f2+f14;
+	heapFloat[(fp+-16)] = f3;
+	f0 = f0+f10;
+	heapFloat[(r1+1)] = f1;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	r1 = heap32[(r3)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heapFloat[(g0+3)] = f6;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB307_23
+{
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+4)];
+	r5 = heapU8[r0+16];
+	r6 = r5 == 0 ? r2 : r3;
+	r5 = r5 == 0 ? r3 : r2;
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+48)];
+	r5 = heap32[(r5+48)];
+	r7 = sp + -32;
+	r8 = r7 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r8+1)] = 0;
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = 1065353216;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	r7 = r4 >> 2;
+	_ZN31btConvexPlaneCollisionAlgorithm20collideSingleContactERK12btQuaternionP17btCollisionObjectS4_RK16btDispatcherInfoP16btManifoldResult(i7);
+	r8 = heap32[(r7+1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+279)];
+	r9 = heap32[(r1+6)];
+_3: do {
+if(!(r8 >=r9)) //_LBB307_15
+{
+	r5 = r5 >> 2;
+	f0 = heapFloat[(r5+14)];
+	f1 =                         0;
+	if(f0 <f1) //_LBB307_4
+{
+	f2 = -f0;
+}
+else{
+	f2 = f0;
+}
+	f3 =       0.70710676908493042;
+	if(f2 <=f3) //_LBB307_7
+{
+	f0 = heapFloat[(r5+12)];
+	f2 = heapFloat[(r5+13)];
+	f0 = f0*f0;
+	f2 = f2*f2;
+	f0 = f0+f2;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f2 = heapFloat[(r5+13)];
+	f3 =                         1;
+	f2 = -f2;
+	f0 = f3/f_g0;
+	f4 = heapFloat[(r5+12)];
+	f3 = f0*f2;
+	f2 = f4*f0;
+	f0 = f1;
+}
+else{
+	f2 = heapFloat[(r5+13)];
+	f2 = f2*f2;
+	f0 = f0*f0;
+	f0 = f2+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f2 = heapFloat[(r5+14)];
+	f3 =                         1;
+	f2 = -f2;
+	f0 = f3/f_g0;
+	f3 = heapFloat[(r5+13)];
+	f2 = f0*f2;
+	f0 = f3*f0;
+	f3 =                         0;
+}
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r6;
+	f4 = f3*f3;
+	f5 = f2*f2;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	f6 = f_g0;
+	f4 = f4+f5;
+	f5 = f0*f0;
+	f4 = f4+f5;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	if(f4 !=f1) //_LBB307_10
+{
+	f1 =      0.019999999552965164;
+	f1 = f1/f6;
+	f5 =                       0.5;
+	f6 =       0.39269909262657166;
+	f7 =       0.19634954631328583;
+	f8 = f1*f5;
+	f1 = f1 > f6 ? f7 : f8;
+	heapFloat[(g0)] = f1;
+	sinf(i7);
+	heapFloat[(g0)] = f1;
+	f1 = f_g0/f4;
+	f0 = f0*f1;
+	f2 = f2*f1;
+	f1 = f3*f1;
+	r6 = 0;
+	cosf(i7);
+	f3 = f_g0;
+_15: while(true){
+	r8 = heap32[(r1+5)];
+	if(r8 >r6) //_LBB307_11
+{
+	f4 = heapFloat[(r5+12)];
+	f6 = heapFloat[(r5+13)];
+	f7 = heapFloat[(r5+14)];
+	f4 = f4*f4;
+	f6 = f6*f6;
+	f4 = f4+f6;
+	f6 = f7*f7;
+	f4 = f4+f6;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	f6 =                         0;
+	if(f4 !=f6) //_LBB307_13
+{
+	f6 =        6.2831854820251465;
+	f7 = r8; //fitos r8, f7
+	f8 = r6; //fitos r6, f8
+	f6 = f6/f7;
+	f6 = f8*f6;
+	f6 = f6*f5;
+	heapFloat[(g0)] = f6;
+	sinf(i7);
+	f7 = f_g0;
+	heapFloat[(g0)] = f6;
+	cosf(i7);
+	f4 = f7/f4;
+	f7 = heapFloat[(r5+12)];
+	f7 = f7*f4;
+	f8 = heapFloat[(r5+13)];
+	f8 = f8*f4;
+	f9 = heapFloat[(r5+14)];
+	f10 = f_g0*f3;
+	f11 = f1*f7;
+	f12 = f_g0*f1;
+	f13 = f3*f7;
+	f4 = f9*f4;
+	f9 = f10+f11;
+	f10 = f2*f8;
+	f11 = f12-f13;
+	f12 = f0*f8;
+	f13 = f_g0*f2;
+	f14 = f3*f8;
+	f9 = f9+f10;
+	f10 = f0*f4;
+	f11 = f11-f12;
+	f12 = f2*f4;
+	f13 = f13-f14;
+	f14 = f1*f4;
+	f15 = f_g0*f0;
+	f16 = f3*f4;
+	f9 = f9+f10;
+	f10 = f11+f12;
+	f11 = f13-f14;
+	f12 = f0*f7;
+	f13 = f15-f16;
+	f14 = f2*f7;
+	f11 = f11+f12;
+	f12 = f9*f7;
+	f15 = f10*f_g0;
+	f13 = f13-f14;
+	f14 = f1*f8;
+	f13 = f13+f14;
+	f14 = f9*f8;
+	f16 = f11*f_g0;
+	f12 = f12+f15;
+	f15 = f11*f4;
+	f17 = f9*f4;
+	f18 = f13*f_g0;
+	f14 = f14+f16;
+	f16 = f13*f7;
+	f12 = f12+f15;
+	f15 = f13*f8;
+	r8 = sp + -16;
+	f6 = f9*f_g0;
+	f9 = f10*f7;
+	f17 = f17+f18;
+	f18 = f10*f8;
+	f14 = f14+f16;
+	f10 = f10*f4;
+	f12 = f12-f15;
+	r9 = r8 >> 2;
+	f6 = f6-f9;
+	f8 = f11*f8;
+	f9 = f17+f18;
+	f7 = f11*f7;
+	f10 = f14-f10;
+	heapFloat[(fp+-4)] = f12;
+	f6 = f6-f8;
+	f4 = f13*f4;
+	f7 = f9-f7;
+	heapFloat[(r9+1)] = f10;
+	f4 = f6-f4;
+	heapFloat[(r9+2)] = f7;
+	heapFloat[(r9+3)] = f4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	r6 = (r6 + 1)|0;
+	_ZN31btConvexPlaneCollisionAlgorithm20collideSingleContactERK12btQuaternionP17btCollisionObjectS4_RK16btDispatcherInfoP16btManifoldResult(i7);
+}
+else{
+break _15;
+}
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _2E_str115;
+	r1 = _2E_str685;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 61;
+	_assert(i7);
+}
+} while(0);
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB307_23
+{
+	r0 = heap32[(r1+3)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+279)];
+if(!(r0 ==0)) //_LBB307_23
+{
+	r0 = heap32[(r7+1)];
+	if(r0 !=0) //_LBB307_19
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+if(!(r2 ==0)) //_LBB307_23
+{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r7+34)];
+	if(r1 ==r2) //_LBB307_22
+{
+	r1 = (r4 + 8)|0;
+	r2 = (r4 + 72)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+else{
+	r1 = (r4 + 72)|0;
+	r4 = (r4 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r4 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+}
+}
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btConvexPlaneCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+8];
+if(!(r1 ==0)) //_LBB308_3
+{
+	r1 = heap32[(r2+3)];
+if(!(r1 ==0)) //_LBB308_3
+{
+	r2 = heap32[(r2+1)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btConvexPlaneCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB309_3
+{
+	r0 = heap32[(r2+3)];
+if(!(r0 ==0)) //_LBB309_3
+{
+	r1 = heap32[(r2+1)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+}
+	return;
+}
+
+function _ZN31btDefaultCollisionConfiguration25getPersistentManifoldPoolEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN31btDefaultCollisionConfiguration25getCollisionAlgorithmPoolEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+6)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN31btDefaultCollisionConfiguration17getStackAllocatorEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+2)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN31btDefaultCollisionConfiguration16getSimplexSolverEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+8)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN31btConvexPlaneCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN31btConvexPlaneCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN31btConvexPlaneCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 28;
+	r1 = heap32[(fp)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r3 = r1 >> 2;
+	r4 = _ZTV20btCollisionAlgorithm;
+	r5 = heap32[(r3+3)];
+	r3 = heap32[(r3+2)];
+	r1 = heapU8[r1+4];
+	r6 = r2 >> 2;
+	r4 = (r4 + 8)|0;
+	heap32[(r6)] = r4;
+	r0 = heap32[(r0)];
+	r4 = _ZTV31btConvexPlaneCollisionAlgorithm;
+	r4 = (r4 + 8)|0;
+	heap32[(r6+1)] = r0;
+	r7 = 0;
+	heap32[(r6)] = r4;
+	r4 = heap32[(fp+2)];
+	r8 = heap32[(fp+3)];
+	heap8[r2+8] = r7;
+	heap32[(r6+3)] = 0;
+	if(r1 !=0) //_LBB316_3
+{
+	r1 = 1;
+	r6 = r2 >> 2;
+	heap8[r2+16] = r1;
+	heap32[(r6+5)] = r3;
+	r3 = r0 >> 2;
+	heap32[(r6+6)] = r5;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB316_5
+{
+	r0 = heap32[(r6+1)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(r6+3)] = r_g0;
+	heap8[r2+8] = r1;
+}
+}
+else{
+	r1 = r2 >> 2;
+	heap8[r2+16] = r7;
+	heap32[(r1+5)] = r3;
+	r3 = r0 >> 2;
+	heap32[(r1+6)] = r5;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r8;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB316_5
+{
+	r0 = heap32[(r1+1)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r8;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = 1;
+	heap32[(r1+3)] = r_g0;
+	heap8[r2+8] = r3;
+}
+}
+	r_g0 = r2;
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN33btConvexConcaveCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN33btConvexConcaveCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 80;
+	r1 = _ZTV20btCollisionAlgorithm;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r1 = (r1 + 8)|0;
+	r3 = r2 >> 2;
+	heap32[(r3)] = r1;
+	r1 = heap32[(r0)];
+	r4 = _ZTV33btConvexConcaveCollisionAlgorithm;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+1)] = r1;
+	r1 = 0;
+	heap32[(r3)] = r4;
+	heap8[r2+8] = r1;
+	r1 = _ZTV24btConvexTriangleCallback;
+	r0 = heap32[(r0)];
+	r1 = (r1 + 8)|0;
+	heap32[(r3+3)] = r1;
+	heap32[(r3+15)] = r0;
+	r1 = heap32[(fp+2)];
+	heap32[(r3+16)] = 0;
+	r4 = heap32[(fp+3)];
+	heap32[(r3+4)] = r1;
+	r5 = r0 >> 2;
+	heap32[(r3+5)] = r4;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(r3+19)] = r_g0;
+	r1 = heap32[(r3+15)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r_g0 = r2;
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 80;
+	r1 = _ZTV20btCollisionAlgorithm;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r1 = (r1 + 8)|0;
+	r3 = r2 >> 2;
+	heap32[(r3)] = r1;
+	r1 = heap32[(r0)];
+	r4 = _ZTV33btConvexConcaveCollisionAlgorithm;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+1)] = r1;
+	r1 = 1;
+	heap32[(r3)] = r4;
+	heap8[r2+8] = r1;
+	r1 = _ZTV24btConvexTriangleCallback;
+	r0 = heap32[(r0)];
+	r1 = (r1 + 8)|0;
+	heap32[(r3+3)] = r1;
+	heap32[(r3+15)] = r0;
+	r1 = heap32[(fp+3)];
+	heap32[(r3+16)] = 0;
+	r4 = heap32[(fp+2)];
+	heap32[(r3+4)] = r1;
+	r5 = r0 >> 2;
+	heap32[(r3+5)] = r4;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(r3+19)] = r_g0;
+	r1 = heap32[(r3+15)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r_g0 = r2;
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN28btCompoundCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN28btCompoundCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 44;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+	r2 = _ZTV20btCollisionAlgorithm;
+	r3 = r1 >> 2;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r2;
+	r2 = heap32[(r0)];
+	r4 = _ZTV28btCompoundCollisionAlgorithm;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+1)] = r2;
+	r2 = 1;
+	heap32[(r3)] = r4;
+	heap8[r1+24] = r2;
+	heap32[(r3+5)] = 0;
+	heap32[(r3+3)] = 0;
+	r2 = 0;
+	heap32[(r3+4)] = 0;
+	heap8[r1+28] = r2;
+	r0 = heap32[(r0+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(r3+8)] = r0;
+	r0 = r4 >> 2;
+	heap8[r1+36] = r2;
+	r0 = heap32[(r0+48)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0+1)];
+	if(r2 ==31) //_LBB325_2
+{
+	r2 = heap32[(fp+3)];
+	r3 = r1 >> 2;
+	r0 = heap32[(r0+17)];
+	heap32[(r3+10)] = r0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r2;
+	_ZN28btCompoundCollisionAlgorithm26preallocateChildAlgorithmsEP17btCollisionObjectS1_(i7);
+	r_g0 = r1;
+	return;
+}
+else{
+	r0 = _2E_str99;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 32;
+	_assert(i7);
+}
+}
+
+function _ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN28btCompoundCollisionAlgorithm17SwappedCreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN28btCompoundCollisionAlgorithm17SwappedCreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN28btCompoundCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 44;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+	r2 = _ZTV20btCollisionAlgorithm;
+	r3 = r1 >> 2;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r2;
+	r2 = heap32[(r0)];
+	r4 = _ZTV28btCompoundCollisionAlgorithm;
+	r4 = (r4 + 8)|0;
+	heap32[(r3+1)] = r2;
+	r2 = 1;
+	heap32[(r3)] = r4;
+	heap8[r1+24] = r2;
+	heap32[(r3+5)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(r3+4)] = 0;
+	heap8[r1+28] = r2;
+	r0 = heap32[(r0+1)];
+	r2 = heap32[(fp+3)];
+	r4 = 0;
+	heap32[(r3+8)] = r0;
+	r0 = r2 >> 2;
+	heap8[r1+36] = r4;
+	r0 = heap32[(r0+48)];
+	r0 = r0 >> 2;
+	r3 = heap32[(r0+1)];
+	if(r3 ==31) //_LBB328_2
+{
+	r3 = heap32[(fp+2)];
+	r4 = r1 >> 2;
+	r0 = heap32[(r0+17)];
+	heap32[(r4+10)] = r0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	_ZN28btCompoundCollisionAlgorithm26preallocateChildAlgorithmsEP17btCollisionObjectS1_(i7);
+	r_g0 = r1;
+	return;
+}
+else{
+	r0 = _2E_str99;
+	r1 = _2E_str1100;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 32;
+	_assert(i7);
+}
+}
+
+function _ZN16btEmptyAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btEmptyAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btEmptyAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btEmptyAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btEmptyAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 8;
+	r1 = _ZTV20btCollisionAlgorithm;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r3)] = r1;
+	r0 = heap32[(r0)];
+	r1 = _ZTV16btEmptyAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r3+1)] = r0;
+	heap32[(r3)] = r1;
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN32btSphereSphereCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN32btSphereSphereCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 16;
+	r1 = _ZTV20btCollisionAlgorithm;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r3 = r2 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r3)] = r1;
+	r0 = heap32[(r0)];
+	r1 = _ZTV32btSphereSphereCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r3+1)] = r0;
+	r4 = 0;
+	heap32[(r3)] = r1;
+	heap8[r2+8] = r4;
+	r1 = r0 >> 2;
+	heap32[(r3+3)] = 0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = 1;
+	heap32[(r3+3)] = r_g0;
+	heap8[r2+8] = r1;
+	r_g0 = r2;
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN34btSphereTriangleCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN34btSphereTriangleCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 20;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+	r2 = heap32[(fp)];
+	r3 = _ZTV20btCollisionAlgorithm;
+	r4 = heap32[(r0+1)];
+	r2 = heapU8[r2+4];
+	r5 = r1 >> 2;
+	r3 = (r3 + 8)|0;
+	heap32[(r5)] = r3;
+	r0 = heap32[(r0)];
+	r3 = _ZTV34btSphereTriangleCollisionAlgorithm;
+	r3 = (r3 + 8)|0;
+	heap32[(r5+1)] = r0;
+	r6 = 0;
+	heap32[(r5)] = r3;
+	heap8[r1+8] = r6;
+	heap32[(r5+3)] = r4;
+	heap8[r1+16] = r2;
+if(!(r4 !=0)) //_LBB337_2
+{
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = r0 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	r0 = r1 >> 2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = 1;
+	heap32[(r0+3)] = r_g0;
+	heap8[r1+8] = r3;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm10CreateFuncD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN26btBoxBoxCollisionAlgorithm10CreateFuncE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm10CreateFuncD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN26btBoxBoxCollisionAlgorithm10CreateFuncE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN26btBoxBoxCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 16;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+	r2 = _ZTV20btCollisionAlgorithm;
+	r3 = r1 >> 2;
+	r2 = (r2 + 8)|0;
+	heap32[(r3)] = r2;
+	r0 = heap32[(r0)];
+	r2 = _ZTV26btBoxBoxCollisionAlgorithm;
+	r2 = (r2 + 8)|0;
+	heap32[(r3+1)] = r0;
+	r4 = 0;
+	heap32[(r3)] = r2;
+	heap8[r1+8] = r4;
+	r2 = r0 >> 2;
+	heap32[(r3+3)] = 0;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+6)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB340_2
+{
+	r0 = r1 >> 2;
+	r2 = heap32[(r0+1)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = 1;
+	heap32[(r0+3)] = r_g0;
+	heap8[r1+8] = r3;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN31btDefaultCollisionConfiguration31getCollisionAlgorithmCreateFuncEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+	if(r0 !=8) //_LBB341_3
+{
+__label__ = 3;
+}
+else{
+	if(r2 !=8) //_LBB341_3
+{
+__label__ = 3;
+}
+else{
+	r0 = (r1 + 64)|0;
+__label__ = 30;
+}
+}
+_4: do {
+if (__label__ == 3){
+if(!(r0 !=8)) //_LBB341_6
+{
+if(!(r2 !=1)) //_LBB341_6
+{
+	r0 = (r1 + 72)|0;
+break _4;
+}
+}
+if(!(r0 !=1)) //_LBB341_9
+{
+if(!(r2 !=8)) //_LBB341_9
+{
+	r0 = (r1 + 76)|0;
+break _4;
+}
+}
+	r3 = r2 | r0;
+	if(r3 !=0) //_LBB341_11
+{
+if(!(r0 >19)) //_LBB341_14
+{
+if(!(r2 !=28)) //_LBB341_14
+{
+	r0 = (r1 + 84)|0;
+break _4;
+}
+}
+if(!(r2 >19)) //_LBB341_17
+{
+if(!(r0 !=28)) //_LBB341_17
+{
+	r0 = (r1 + 80)|0;
+break _4;
+}
+}
+_24: do {
+	if(r0 >19) //_LBB341_21
+{
+	if(r2 <20) //_LBB341_23
+{
+	r3 = (r0 + -21)|0;
+	if(uint(r3) <uint(9)) //_LBB341_25
+{
+	r0 = (r1 + 48)|0;
+break _4;
+}
+}
+	if(r0 ==31) //_LBB341_26
+{
+	r0 = (r1 + 52)|0;
+break _4;
+}
+else{
+break _24;
+}
+}
+else{
+	if(r2 >19) //_LBB341_20
+{
+	r0 = (r2 + -21)|0;
+	if(uint(r0) <uint(9)) //_LBB341_22
+{
+	r0 = (r1 + 44)|0;
+break _4;
+}
+}
+else{
+	r0 = (r1 + 40)|0;
+break _4;
+}
+}
+} while(0);
+	if(r2 !=31) //_LBB341_29
+{
+	r0 = (r1 + 60)|0;
+}
+else{
+	r0 = (r1 + 56)|0;
+}
+}
+else{
+	r0 = (r1 + 68)|0;
+}
+}
+} while(0);
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN31btDefaultCollisionConfigurationD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btDefaultCollisionConfiguration;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+12];
+_1: do {
+if(!(r1 ==0)) //_LBB342_13
+{
+	r1 = heap32[(r2+2)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+2)];
+	if(r4 ==0) //_LBB342_3
+{
+	r1 = heapU8[r1+16];
+if(!(r1 !=0)) //_LBB342_6
+{
+	r1 = heap32[(r3)];
+if(!(r1 ==0)) //_LBB342_6
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	heap32[(r3)] = 0;
+	heap32[(r3+2)] = 0;
+	r1 = heap32[(r2+2)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+2)];
+	if(r4 ==0) //_LBB342_8
+{
+	r1 = heapU8[r1+16];
+if(!(r1 !=0)) //_LBB342_11
+{
+	r1 = heap32[(r3)];
+if(!(r1 ==0)) //_LBB342_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	heap32[(r3)] = 0;
+	heap32[(r3+2)] = 0;
+	r1 = heap32[(r2+2)];
+	if(r1 ==0) //_LBB342_13
+{
+break _1;
+}
+else{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+break _1;
+}
+}
+}
+	r0 = _2E_str128;
+	r1 = _2E_str1129;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 49;
+	_assert(i7);
+}
+} while(0);
+	r1 = heapU8[r0+28];
+if(!(r1 ==0)) //_LBB342_19
+{
+	r1 = heap32[(r2+6)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3+4)];
+	if(r3 !=0) //_LBB342_16
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r4 = heap32[(r1)];
+	r4 = (r4 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r1)] = r4;
+	r1 = heap32[(r3+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r1 = heap32[(r2+6)];
+}
+if(!(r1 ==0)) //_LBB342_19
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heapU8[r0+20];
+if(!(r1 ==0)) //_LBB342_25
+{
+	r1 = heap32[(r2+4)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3+4)];
+	if(r3 !=0) //_LBB342_22
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r4 = heap32[(r1)];
+	r4 = (r4 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r1)] = r4;
+	r1 = heap32[(r3+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r1 = heap32[(r2+4)];
+}
+if(!(r1 ==0)) //_LBB342_25
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heap32[(r2+10)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+10)];
+if(!(r1 ==0)) //_LBB342_27
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+11)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+11)];
+if(!(r1 ==0)) //_LBB342_29
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+12)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+12)];
+if(!(r1 ==0)) //_LBB342_31
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+13)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+13)];
+if(!(r1 ==0)) //_LBB342_33
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+14)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+14)];
+if(!(r1 ==0)) //_LBB342_35
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+15)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+15)];
+if(!(r1 ==0)) //_LBB342_37
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+16)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+16)];
+if(!(r1 ==0)) //_LBB342_39
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+18)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+18)];
+if(!(r1 ==0)) //_LBB342_41
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+19)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+19)];
+if(!(r1 ==0)) //_LBB342_43
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+17)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+17)];
+if(!(r1 ==0)) //_LBB342_45
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+21)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+21)];
+if(!(r1 ==0)) //_LBB342_47
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+20)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+20)];
+if(!(r1 ==0)) //_LBB342_49
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+8)];
+if(!(r1 ==0)) //_LBB342_51
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	r1 = heap32[(r2+9)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+9)];
+if(!(r1 ==0)) //_LBB342_53
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r3;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN31btDefaultCollisionConfigurationD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN31btDefaultCollisionConfigurationD2Ev(i7);
+	return;
+}
+
+function _ZN31btDefaultCollisionConfigurationD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btDefaultCollisionConfiguration;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+12];
+_1: do {
+if(!(r1 ==0)) //_LBB344_13
+{
+	r1 = heap32[(r2+2)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+2)];
+	if(r4 ==0) //_LBB344_3
+{
+	r1 = heapU8[r1+16];
+if(!(r1 !=0)) //_LBB344_6
+{
+	r1 = heap32[(r3)];
+if(!(r1 ==0)) //_LBB344_6
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	heap32[(r3)] = 0;
+	heap32[(r3+2)] = 0;
+	r1 = heap32[(r2+2)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+2)];
+	if(r4 ==0) //_LBB344_8
+{
+	r1 = heapU8[r1+16];
+if(!(r1 !=0)) //_LBB344_11
+{
+	r1 = heap32[(r3)];
+if(!(r1 ==0)) //_LBB344_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	heap32[(r3)] = 0;
+	heap32[(r3+2)] = 0;
+	r1 = heap32[(r2+2)];
+	if(r1 ==0) //_LBB344_13
+{
+break _1;
+}
+else{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+break _1;
+}
+}
+}
+	r0 = _2E_str128;
+	r1 = _2E_str1129;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 49;
+	_assert(i7);
+}
+} while(0);
+	r1 = heapU8[r0+28];
+if(!(r1 ==0)) //_LBB344_19
+{
+	r1 = heap32[(r2+6)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3+4)];
+	if(r3 !=0) //_LBB344_16
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r4 = heap32[(r1)];
+	r4 = (r4 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r1)] = r4;
+	r1 = heap32[(r3+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+	r1 = heap32[(r2+6)];
+}
+if(!(r1 ==0)) //_LBB344_19
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r0 = heapU8[r0+20];
+if(!(r0 ==0)) //_LBB344_25
+{
+	r0 = heap32[(r2+4)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+4)];
+	if(r1 !=0) //_LBB344_22
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r3 = heap32[(r0)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r0)] = r3;
+	r0 = heap32[(r1+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+	r0 = heap32[(r2+4)];
+}
+if(!(r0 ==0)) //_LBB344_25
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	r0 = heap32[(r2+10)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+10)];
+if(!(r0 ==0)) //_LBB344_27
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+11)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+11)];
+if(!(r0 ==0)) //_LBB344_29
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+12)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+12)];
+if(!(r0 ==0)) //_LBB344_31
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+13)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+13)];
+if(!(r0 ==0)) //_LBB344_33
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+14)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+14)];
+if(!(r0 ==0)) //_LBB344_35
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+15)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+15)];
+if(!(r0 ==0)) //_LBB344_37
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+16)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+16)];
+if(!(r0 ==0)) //_LBB344_39
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+18)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+18)];
+if(!(r0 ==0)) //_LBB344_41
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+19)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+19)];
+if(!(r0 ==0)) //_LBB344_43
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+17)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+17)];
+if(!(r0 ==0)) //_LBB344_45
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+21)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+21)];
+if(!(r0 ==0)) //_LBB344_47
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+20)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+20)];
+if(!(r0 ==0)) //_LBB344_49
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+8)];
+if(!(r0 ==0)) //_LBB344_51
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	r0 = heap32[(r2+9)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+9)];
+if(!(r0 ==0)) //_LBB344_53
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN16btEmptyAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btEmptyAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btEmptyAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN16btEmptyAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btEmptyAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btEmptyAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btEmptyAlgorithm;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btManifoldResultD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btManifoldResult;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btManifoldResultD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btManifoldResult;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btManifoldResult15addContactPointERK9btVector3S2_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -304;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	if(r1 !=0) //_LBB352_2
+{
+	f0 = heapFloat[(fp+3)];
+	r2 = r1 >> 2;
+	f1 = heapFloat[(r2+280)];
+if(!(f1 <f0)) //_LBB352_53
+{
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	f1 = heapFloat[(r3+2)];
+	heapFloat[(fp+-71)] = f1;
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r3)];
+	f4 = heapFloat[(r4+2)];
+	f1 = f1*f0;
+	f5 = heapFloat[(r4+1)];
+	f6 = f2*f0;
+	f7 = heapFloat[(r4)];
+	f8 = f3*f0;
+	r5 = heap32[(r2+277)];
+	r6 = heap32[(r0+34)];
+	f1 = f4+f1;
+	f6 = f5+f6;
+	f8 = f7+f8;
+	if(r5 ==r6) //_LBB352_5
+{
+	f9 = heapFloat[(r0+14)];
+	f10 = heapFloat[(r0+15)];
+	f11 = heapFloat[(r0+30)];
+	f13 = heapFloat[(r0+31)];
+	f14 = heapFloat[(r0+4)];
+	f9 = f8-f9;
+	f15 = heapFloat[(r0+3)];
+	f12 = heapFloat[(r0+2)];
+	f16 = heapFloat[(r0+8)];
+	f10 = f6-f10;
+	f17 = heapFloat[(r0+7)];
+	f18 = heapFloat[(r0+6)];
+	f19 = heapFloat[(r0+16)];
+	f20 = heapFloat[(r0+20)];
+	f11 = f7-f11;
+	f21 = heapFloat[(r0+19)];
+	f22 = heapFloat[(r0+18)];
+	f23 = heapFloat[(r0+24)];
+	f13 = f5-f13;
+	f24 = heapFloat[(r0+23)];
+	f25 = heapFloat[(r0+22)];
+	f26 = heapFloat[(r0+32)];
+	f14 = f14*f9;
+	f16 = f16*f10;
+	f27 = heapFloat[(r0+12)];
+	f19 = f1-f19;
+	f28 = heapFloat[(r0+11)];
+	f29 = heapFloat[(r0+10)];
+	f15 = f15*f9;
+	f17 = f17*f10;
+	f9 = f12*f9;
+	f10 = f18*f10;
+	f12 = f20*f11;
+	f18 = f23*f13;
+	f20 = heapFloat[(r0+28)];
+	f23 = f4-f26;
+	f26 = heapFloat[(r0+27)];
+	f30 = heapFloat[(r0+26)];
+	f21 = f21*f11;
+	f24 = f24*f13;
+	f11 = f22*f11;
+	f13 = f25*f13;
+	f14 = f14+f16;
+	f16 = f27*f19;
+	f15 = f15+f17;
+	f17 = f28*f19;
+	f9 = f9+f10;
+	f10 = f29*f19;
+	f12 = f12+f18;
+	f18 = f20*f23;
+	f19 = f21+f24;
+	f20 = f26*f23;
+	f11 = f11+f13;
+	f21 = f30*f23;
+	f13 = f14+f16;
+	f14 = f15+f17;
+	f9 = f9+f10;
+	f10 = f12+f18;
+	f15 = f19+f20;
+	f11 = f11+f21;
+}
+else{
+	f9 = heapFloat[(r0+30)];
+	f10 = heapFloat[(r0+31)];
+	f11 = heapFloat[(r0+14)];
+	f12 = heapFloat[(r0+15)];
+	f13 = heapFloat[(r0+20)];
+	f9 = f8-f9;
+	f14 = heapFloat[(r0+19)];
+	f15 = heapFloat[(r0+18)];
+	f16 = heapFloat[(r0+24)];
+	f10 = f6-f10;
+	f17 = heapFloat[(r0+23)];
+	f18 = heapFloat[(r0+22)];
+	f19 = heapFloat[(r0+32)];
+	f20 = heapFloat[(r0+4)];
+	f11 = f7-f11;
+	f21 = heapFloat[(r0+3)];
+	f22 = heapFloat[(r0+2)];
+	f23 = heapFloat[(r0+8)];
+	f12 = f5-f12;
+	f24 = heapFloat[(r0+7)];
+	f25 = heapFloat[(r0+6)];
+	f26 = heapFloat[(r0+16)];
+	f13 = f13*f9;
+	f16 = f16*f10;
+	f27 = heapFloat[(r0+28)];
+	f19 = f1-f19;
+	f28 = heapFloat[(r0+27)];
+	f29 = heapFloat[(r0+26)];
+	f14 = f14*f9;
+	f17 = f17*f10;
+	f9 = f15*f9;
+	f10 = f18*f10;
+	f15 = f20*f11;
+	f18 = f23*f12;
+	f20 = heapFloat[(r0+12)];
+	f23 = f4-f26;
+	f26 = heapFloat[(r0+11)];
+	f30 = heapFloat[(r0+10)];
+	f21 = f21*f11;
+	f24 = f24*f12;
+	f11 = f22*f11;
+	f12 = f25*f12;
+	f13 = f13+f16;
+	f16 = f27*f19;
+	f14 = f14+f17;
+	f17 = f28*f19;
+	f9 = f9+f10;
+	f10 = f29*f19;
+	f15 = f15+f18;
+	f18 = f20*f23;
+	f19 = f21+f24;
+	f20 = f26*f23;
+	f11 = f11+f12;
+	f12 = f30*f23;
+	f13 = f13+f16;
+	f14 = f14+f17;
+	f9 = f9+f10;
+	f10 = f15+f18;
+	f15 = f19+f20;
+	f11 = f11+f12;
+}
+	r7 = sp + -280;
+	r8 = r7 >> 2;
+	heapFloat[(fp+-70)] = f9;
+	heapFloat[(r8+1)] = f14;
+	heapFloat[(r8+2)] = f13;
+	heap32[(r8+3)] = 0;
+	heapFloat[(r8+4)] = f11;
+	heapFloat[(r8+5)] = f15;
+	heapFloat[(r8+6)] = f10;
+	heap32[(r8+7)] = 0;
+	heapFloat[(r8+16)] = f3;
+	heapFloat[(r8+17)] = f2;
+	f2 = heapFloat[(fp+-71)];
+	heapFloat[(r8+18)] = f2;
+	heap32[(r8+19)] = heap32[(r3+3)];
+	heapFloat[(r8+20)] = f0;
+	heap32[(r8+21)] = 0;
+	heap32[(r8+22)] = 0;
+	heap32[(r8+27)] = 0;
+	r3 = 0;
+	heap32[(r8+28)] = 0;
+	heap8[sp+-164] = r3;
+	heap32[(r8+30)] = 0;
+	heap32[(r8+31)] = 0;
+	heap32[(r8+32)] = 0;
+	heap32[(r8+33)] = 0;
+	heap32[(r8+34)] = 0;
+	heap32[(r8+35)] = 0;
+	heap32[(r8+36)] = 0;
+	heap32[(r8+52)] = 0;
+	heap32[(r8+60)] = 0;
+	heap32[(r8+68)] = 0;
+	heapFloat[(r8+12)] = f8;
+	heapFloat[(r8+13)] = f6;
+	heapFloat[(r8+14)] = f1;
+	heap32[(r8+15)] = 0;
+	heapFloat[(r8+8)] = f7;
+	heapFloat[(r8+9)] = f5;
+	heapFloat[(r8+10)] = f4;
+	heap32[(r8+11)] = heap32[(r4+3)];
+	r4 = heap32[(r2+279)];
+_9: do {
+	if(r4 >0) //_LBB352_8
+{
+	f1 = heapFloat[(r2+280)];
+	f1 = f1*f1;
+	r10 = 0;
+	r9 = -1;
+_11: while(true){
+	r11 = (r10 * 69)|0;
+	r11 = r11 << 2;
+	r11 = (r1 + r11)|0;
+	r11 = r11 >> 2;
+	f2 = heapFloat[(r11+1)];
+	f3 = heapFloat[(r11+2)];
+	f2 = f2-f9;
+	f3 = f3-f14;
+	f4 = heapFloat[(r11+3)];
+	f4 = f4-f13;
+	f2 = f2*f2;
+	f3 = f3*f3;
+	f2 = f2+f3;
+	f3 = f4*f4;
+	f2 = f2+f3;
+	r11 = (r10 + 1)|0;
+	r9 = f2 < f1 ? r10 : r9;
+	f1 = f2 < f1 ? f2 : f1;
+	r10 = r11;
+if(!(r4 !=r11)) //_LBB352_9
+{
+break _9;
+}
+}
+}
+else{
+	r9 = -1;
+}
+} while(0);
+	r4 = heap32[(r0+35)];
+	r4 = r4 >> 2;
+	r10 = r6 >> 2;
+	f1 = heapFloat[(r10+56)];
+	f2 = heapFloat[(r4+56)];
+	f1 = f1*f2;
+	f2 =                       -10;
+	f1 = f1 < f2 ? f2 : f1;
+	f2 =                        10;
+	f1 = f1 > f2 ? f2 : f1;
+	heapFloat[(r8+21)] = f1;
+	f1 = heapFloat[(r10+57)];
+	f2 = heapFloat[(r4+57)];
+	f1 = f1*f2;
+	heapFloat[(r8+22)] = f1;
+	if(r5 ==r6) //_LBB352_12
+{
+	r4 = heap32[(r0+36)];
+	heap32[(r8+23)] = r4;
+	r4 = heap32[(r0+37)];
+	heap32[(r8+24)] = r4;
+	r4 = heap32[(r0+38)];
+	heap32[(r8+25)] = r4;
+	r0 = heap32[(r0+39)];
+	heap32[(r8+26)] = r0;
+}
+else{
+	r4 = heap32[(r0+37)];
+	heap32[(r8+23)] = r4;
+	r4 = heap32[(r0+36)];
+	heap32[(r8+24)] = r4;
+	r4 = heap32[(r0+39)];
+	heap32[(r8+25)] = r4;
+	r0 = heap32[(r0+38)];
+	heap32[(r8+26)] = r0;
+}
+	f1 = heapFloat[(r2+280)];
+	if(r9 <0) //_LBB352_19
+{
+	if(f1 >=f0) //_LBB352_21
+{
+	r0 = heap32[(r2+279)];
+	if(r0 !=4) //_LBB352_49
+{
+	r4 = (r0 + 1)|0;
+	heap32[(r2+279)] = r4;
+}
+else{
+	f1 = heapFloat[(r2+21)];
+	r0 = -1;
+	f2 = heapFloat[(r2+90)];
+	f3 = f1 < f0 ? f1 : f0;
+	r4 = 1;
+	f4 = heapFloat[(r2+159)];
+	f5 = f2 < f3 ? f2 : f3;
+	r5 = 2;
+	f6 = heapFloat[(r2+228)];
+	f7 = f4 < f5 ? f4 : f5;
+	if(f6 >=f7) //_LBB352_24
+{
+	r6 = f1 >= f0 ? r0 : r3;
+	r6 = f2 < f3 ? r4 : r6;
+	r6 = f4 < f5 ? r5 : r6;
+	if(r6 ==0) //_LBB352_26
+{
+	f0 = heapFloat[(r2+210)];
+	f1 = heapFloat[(r2+141)];
+	f2 = heapFloat[(r2+209)];
+	f3 = heapFloat[(r2+140)];
+	f4 = heapFloat[(r2+208)];
+	f5 = heapFloat[(r2+139)];
+	f6 = heapFloat[(r2+72)];
+	f7 = heapFloat[(r2+71)];
+	f8 = heapFloat[(r2+70)];
+	f10 =                         0;
+	r6 = r3;
+__label__ = 28;
+}
+else{
+__label__ = 26;
+}
+}
+else{
+	r6 = 3;
+__label__ = 26;
+}
+if (__label__ == 26){
+	f6 = heapFloat[(r2+72)];
+	f0 = heapFloat[(r2+210)];
+	f1 = heapFloat[(r2+141)];
+	f8 = heapFloat[(r2+70)];
+	f2 = heapFloat[(r2+209)];
+	f3 = heapFloat[(r2+140)];
+	f7 = heapFloat[(r2+71)];
+	f4 = heapFloat[(r2+208)];
+	f5 = heapFloat[(r2+139)];
+	f10 = f13-f6;
+	f11 = f2-f3;
+	f12 = f9-f8;
+	f15 = f0-f1;
+	f16 = f14-f7;
+	f17 = f4-f5;
+	f18 = f16*f15;
+	f19 = f10*f11;
+	f10 = f10*f17;
+	f15 = f12*f15;
+	f18 = f18-f19;
+	f10 = f10-f15;
+	f11 = f12*f11;
+	f12 = f16*f17;
+	f11 = f11-f12;
+	f12 = f18*f18;
+	f10 = f10*f10;
+	f10 = f12+f10;
+	f11 = f11*f11;
+	f10 = f10+f11;
+	if(r6 ==1) //_LBB352_29
+{
+	f11 = heapFloat[(r2+3)];
+	f12 = heapFloat[(r2+2)];
+	f15 = heapFloat[(r2+1)];
+	f16 =                         0;
+	r6 = r4;
+__label__ = 30;
+}
+else{
+__label__ = 28;
+}
+}
+if (__label__ == 28){
+	f11 = heapFloat[(r2+3)];
+	f15 = heapFloat[(r2+1)];
+	f12 = heapFloat[(r2+2)];
+	f16 = f13-f11;
+	f17 = f2-f3;
+	f18 = f9-f15;
+	f19 = f0-f1;
+	f20 = f14-f12;
+	f21 = f4-f5;
+	f22 = f20*f19;
+	f23 = f16*f17;
+	f16 = f16*f21;
+	f19 = f18*f19;
+	f22 = f22-f23;
+	f16 = f16-f19;
+	f17 = f18*f17;
+	f18 = f20*f21;
+	f17 = f17-f18;
+	f18 = f22*f22;
+	f16 = f16*f16;
+	f16 = f18+f16;
+	f17 = f17*f17;
+	f16 = f16+f17;
+	if(r6 ==2) //_LBB352_32
+{
+	f0 =                         0;
+__label__ = 32;
+}
+else{
+__label__ = 30;
+}
+}
+if (__label__ == 30){
+	f17 = f13-f11;
+	f2 = f2-f7;
+	f18 = f9-f15;
+	f0 = f0-f6;
+	f19 = f14-f12;
+	f4 = f4-f8;
+	f20 = f19*f0;
+	f21 = f17*f2;
+	f17 = f17*f4;
+	f0 = f18*f0;
+	f20 = f20-f21;
+	f0 = f17-f0;
+	f2 = f18*f2;
+	f4 = f19*f4;
+	f2 = f2-f4;
+	f4 = f20*f20;
+	f0 = f0*f0;
+	f0 = f4+f0;
+	f2 = f2*f2;
+	f0 = f0+f2;
+	if(r6 ==3) //_LBB352_35
+{
+	f1 =                         0;
+__label__ = 34;
+}
+else{
+__label__ = 32;
+}
+}
+if (__label__ == 32){
+	f2 = f13-f11;
+	f3 = f3-f7;
+	f4 = f9-f15;
+	f1 = f1-f6;
+	f6 = f14-f12;
+	f5 = f5-f8;
+	f7 = f6*f1;
+	f8 = f2*f3;
+	f2 = f2*f5;
+	f1 = f4*f1;
+	f7 = f7-f8;
+	f1 = f2-f1;
+	f2 = f4*f3;
+	f3 = f6*f5;
+	f2 = f2-f3;
+	f3 = f7*f7;
+	f1 = f1*f1;
+	f1 = f3+f1;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f2 =                         0;
+	if(f1 <f2) //_LBB352_38
+{
+	f1 = -f1;
+}
+}
+	f2 =                         0;
+	if(f0 <f2) //_LBB352_41
+{
+	f0 = -f0;
+}
+	if(f16 <f2) //_LBB352_44
+{
+	f16 = -f16;
+}
+	if(f10 <f2) //_LBB352_47
+{
+	f10 = -f10;
+}
+	f2 =       -999999984306749440;
+	r2 = 0;
+	f3 = f10 > f2 ? f10 : f2;
+	r0 = f10 <= f2 ? r0 : r2;
+	f2 = f16 > f3 ? f16 : f3;
+	r0 = f16 > f3 ? r4 : r0;
+	f3 = f0 > f2 ? f0 : f2;
+	r2 = 3;
+	r0 = f0 > f2 ? r5 : r0;
+	r0 = f1 > f3 ? r2 : r0;
+}
+	r0 = r0 < 0 ? r3 : r0;
+	r0 = (r0 * 276)|0;
+	r0 = (r1 + r0)|0;
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+28)];
+	if(r1 ==0) //_LBB352_52
+{
+	r0 = (r0 + 4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = 276;
+	memcpy(i7);
+}
+else{
+	r0 = _2E_str4438;
+	r7 = _2E_str3437;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = 190;
+	_assert(i7);
+}
+}
+else{
+	r1 = _2E_str2149;
+	r2 = _2E_str3437;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 168;
+	_assert(i7);
+}
+}
+else{
+	if(f1 >=f0) //_LBB352_16
+{
+	r2 = (r9 * 276)|0;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+37)];
+	if(r3 >-1) //_LBB352_18
+{
+	f0 = heapFloat[(r2+53)];
+	f1 = heapFloat[(r2+61)];
+	f9 = heapFloat[(r2+69)];
+	r0 = heap32[(r2+28)];
+	r1 = (r1 + 4)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = 276;
+	memcpy(i7);
+	heap32[(r2+28)] = r0;
+	heapFloat[(r2+29)] = f0;
+	heapFloat[(r2+31)] = f1;
+	heapFloat[(r2+32)] = f9;
+	heapFloat[(r2+53)] = f0;
+	heapFloat[(r2+61)] = f1;
+	heapFloat[(r2+69)] = f9;
+	heap32[(r2+37)] = r3;
+	return;
+}
+else{
+	r1 = _2E_str3150;
+	r2 = _2E_str483;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 177;
+	_assert(i7);
+}
+}
+else{
+	r1 = _2E_str2149;
+	r2 = _2E_str483;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 165;
+	_assert(i7);
+}
+}
+}
+	return;
+}
+else{
+	r0 = _2E_str59;
+	r1 = _2E_str5152;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 64;
+	_assert(i7);
+}
+}
+
+function _ZN25btSimulationIslandManager26storeIslandActivationStateEP16btCollisionWorld(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+if(!(r1 <1)) //_LBB353_10
+{
+	r1 = heap32[(fp)];
+	r2 = 0;
+	r3 = r2;
+_3: while(true){
+	r4 = heap32[(r0+4)];
+	r5 = r2 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r5 = (r2 + 1)|0;
+	r6 = heapU8[r4+204];
+	r6 = r6 & 3;
+	if(r6 !=0) //_LBB353_8
+{
+	r2 = r4 >> 2;
+	heap32[(r2+52)] = -1;
+	heap32[(r2+53)] = -2;
+}
+else{
+	r6 = r1 >> 2;
+	r7 = heap32[(r6+4)];
+	r8 = r3 << 3;
+	r9 = (r7 + r8)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	if(r9 ==r3) //_LBB353_5
+{
+	r10 = r3;
+}
+else{
+	r10 = r3;
+_11: while(true){
+	r9 = r9 << 3;
+	r10 = r10 << 3;
+	r9 = (r7 + r9)|0;
+	r7 = (r7 + r10)|0;
+	r9 = r9 >> 2;
+	r7 = r7 >> 2;
+	r10 = heap32[(r9)];
+	heap32[(r7)] = r10;
+	r10 = heap32[(r9)];
+	r7 = heap32[(r6+4)];
+	r9 = r10 << 3;
+	r9 = (r7 + r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+if(!(r9 !=r10)) //_LBB353_6
+{
+break _11;
+}
+}
+}
+	r4 = r4 >> 2;
+	heap32[(r4+52)] = r10;
+	r6 = heap32[(r6+4)];
+	r6 = (r6 + r8)|0;
+	r6 = r6 >> 2;
+	r3 = (r3 + 1)|0;
+	heap32[(r6+1)] = r2;
+	heap32[(r4+53)] = -1;
+}
+	r4 = heap32[(r0+2)];
+	r2 = r5;
+	if(r4 >r5) //_LBB353_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN20btAlignedObjectArrayIP20btPersistentManifoldE17quickSortInternalI33btPersistentManifoldSortPredicateEEvT_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = (r0 + r1)|0;
+	r3 = r2 >>> 31;
+	r4 = heap32[(fp)];
+	r2 = (r2 + r3)|0;
+	r3 = r4 >> 2;
+	r2 = r2 & 2147483646;
+	r5 = heap32[(r3+3)];
+	r2 = r2 << 1;
+	r2 = (r5 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r5 = r1;
+	r6 = r0;
+_1: while(true){
+	r7 = r2 >> 2;
+	r8 = heap32[(r7+277)];
+	r8 = r8 >> 2;
+	r9 = heap32[(r3+3)];
+	r8 = heap32[(r8+52)];
+_3: while(true){
+	r10 = r5 << 2;
+	r10 = (r9 + r10)|0;
+	r10 = r10 >> 2;
+	r11 = heap32[(r10)];
+	r12 = r11 >> 2;
+	r13 = heap32[(r12+277)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+52)];
+	if(r13 <0) //_LBB354_5
+{
+	r13 = heap32[(r12+278)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+52)];
+}
+	if(r8 <0) //_LBB354_8
+{
+	r12 = heap32[(r7+278)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+52)];
+}
+else{
+	r12 = r8;
+}
+	if(r13 <r12) //_LBB354_2
+{
+	r5 = (r5 + 1)|0;
+continue _3;
+}
+else{
+break _3;
+}
+}
+_13: while(true){
+	r12 = r6 << 2;
+	r13 = (r9 + r12)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	if(r8 <0) //_LBB354_13
+{
+	r14 = heap32[(r7+278)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+52)];
+}
+else{
+	r14 = r8;
+}
+	r15 = r13 >> 2;
+	r16 = heap32[(r15+277)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+52)];
+	if(r16 <0) //_LBB354_16
+{
+	r16 = heap32[(r15+278)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+52)];
+}
+	if(r14 <r16) //_LBB354_10
+{
+	r6 = (r6 + -1)|0;
+continue _13;
+}
+else{
+break _13;
+}
+}
+	if(r5 <=r6) //_LBB354_20
+{
+	heap32[(r10)] = r13;
+	r7 = heap32[(r3+3)];
+	r7 = (r7 + r12)|0;
+	r5 = (r5 + 1)|0;
+	r6 = (r6 + -1)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r11;
+}
+	if(r5 <=r6) //_LBB354_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+if(!(r6 <=r1)) //_LBB354_24
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	_ZN20btAlignedObjectArrayIP20btPersistentManifoldE17quickSortInternalI33btPersistentManifoldSortPredicateEEvT_ii(i7);
+}
+if(!(r5 >=r0)) //_LBB354_26
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r0;
+	_ZN20btAlignedObjectArrayIP20btPersistentManifoldE17quickSortInternalI33btPersistentManifoldSortPredicateEEvT_ii(i7);
+}
+	return;
+}
+
+function _ZN25btSimulationIslandManager21updateActivationStateEP16btCollisionWorldP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0+2)];
+_1: do {
+	if(r2 >0) //_LBB355_2
+{
+	r3 = 0;
+	r2 = r3;
+_3: while(true){
+	r4 = heap32[(r0+4)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r3 = (r3 + 1)|0;
+	r5 = heapU8[r4+204];
+	r5 = r5 & 3;
+	if(r5 ==0) //_LBB355_5
+{
+	r5 = (r2 + 1)|0;
+	r6 = r4 >> 2;
+	heap32[(r6+52)] = r2;
+	r2 = r5;
+}
+	r4 = r4 >> 2;
+	heap32[(r4+53)] = -1;
+	heap32[(r4+60)] = 1065353216;
+	r4 = heap32[(r0+2)];
+	if(r4 >r3) //_LBB355_3
+{
+continue _3;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	r2 = 0;
+}
+} while(0);
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+2)];
+_10: do {
+if(!(r4 >r2)) //_LBB355_26
+{
+if(!(r4 >=r2)) //_LBB355_26
+{
+	r5 = heap32[(r3+3)];
+if(!(r5 >=r2)) //_LBB355_25
+{
+	if(r2 !=0) //_LBB355_12
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r7 = r2 << 3;
+	r6 = (r6 + 1)|0;
+	r7 = r7 | 3;
+	heap32[(r5)] = r6;
+	r5 = (r7 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB355_14
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+}
+else{
+	r5 = 0;
+}
+	r6 = (r1 + 16)|0;
+	if(r4 <1) //_LBB355_17
+{
+	r7 = r6 >> 2;
+	r8 = heap32[(r7)];
+}
+else{
+	r7 = 0;
+_23: while(true){
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r7 << 3;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r5 + r9)|0;
+	r11 = heap32[(r10+1)];
+	r10 = heap32[(r10)];
+	r9 = r9 >> 2;
+	r7 = (r7 + 1)|0;
+	heap32[(r9)] = r10;
+	heap32[(r9+1)] = r11;
+if(!(r4 !=r7)) //_LBB355_18
+{
+break _23;
+}
+}
+	r6 = (r1 + 16)|0;
+}
+if(!(r8 ==0)) //_LBB355_24
+{
+	r7 = heapU8[r1+20];
+if(!(r7 ==0)) //_LBB355_23
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r9 = heap32[(r7)];
+	r9 = (r9 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r7)] = r9;
+	r7 = heap32[(r8+-1)];
+	heap32[(g0)] = r7;
+	free(i7);
+}
+	r7 = r6 >> 2;
+	heap32[(r7)] = 0;
+}
+	r7 = 1;
+	r6 = r6 >> 2;
+	heap8[r1+20] = r7;
+	heap32[(r6)] = r5;
+	heap32[(r3+3)] = r2;
+	if(r4 >=r2) //_LBB355_26
+{
+break _10;
+}
+}
+_33: while(true){
+	r1 = r4 << 3;
+	r5 = heap32[(r3+4)];
+	r1 = (r5 + r1)|0;
+	r1 = r1 >> 2;
+	r4 = (r4 + 1)|0;
+	heap32[(r1)] = 0;
+	heap32[(r1+1)] = 0;
+	if(r2 !=r4) //_LBB355_25
+{
+continue _33;
+}
+else{
+break _10;
+}
+}
+}
+}
+} while(0);
+	heap32[(r3+2)] = r2;
+_36: do {
+if(!(r2 <1)) //_LBB355_29
+{
+	r1 = 0;
+_38: while(true){
+	r4 = r1 << 3;
+	r5 = heap32[(r3+4)];
+	r5 = (r5 + r4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r1;
+	r5 = heap32[(r3+4)];
+	r4 = (r5 + r4)|0;
+	r1 = (r1 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r4+1)] = 1;
+	if(r2 !=r1) //_LBB355_28
+{
+continue _38;
+}
+else{
+break _36;
+}
+}
+}
+} while(0);
+	r0 = heap32[(r0+20)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r_g0;
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r_g0;
+_41: do {
+if(!(r2 <1)) //_LBB355_46
+{
+	r0 = (r0 + 4)|0;
+_43: while(true){
+	r1 = r0 >> 2;
+	r4 = heap32[(r1+-1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+if(!(r4 ==0)) //_LBB355_45
+{
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+if(!(r1 ==0)) //_LBB355_45
+{
+	r4 = r4 >> 2;
+	r5 = heap32[(r4+51)];
+	r5 = r5 & 7;
+if(!(r5 !=0)) //_LBB355_45
+{
+	r5 = heapU8[r1+204];
+	r5 = r5 & 7;
+if(!(r5 !=0)) //_LBB355_45
+{
+	r4 = heap32[(r4+52)];
+	r5 = heap32[(r3+4)];
+	r6 = r4 << 3;
+	r6 = (r5 + r6)|0;
+	r6 = r6 >> 2;
+	r1 = r1 >> 2;
+	r6 = heap32[(r6)];
+	r1 = heap32[(r1+52)];
+if(!(r6 ==r4)) //_LBB355_37
+{
+_51: while(true){
+	r6 = r6 << 3;
+	r4 = r4 << 3;
+	r6 = (r5 + r6)|0;
+	r4 = (r5 + r4)|0;
+	r5 = r6 >> 2;
+	r4 = r4 >> 2;
+	r6 = heap32[(r5)];
+	heap32[(r4)] = r6;
+	r4 = heap32[(r5)];
+	r5 = heap32[(r3+4)];
+	r6 = r4 << 3;
+	r6 = (r5 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+if(!(r6 !=r4)) //_LBB355_38
+{
+break _51;
+}
+}
+}
+	r6 = r1 << 3;
+	r6 = (r5 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+_54: do {
+if(!(r6 ==r1)) //_LBB355_41
+{
+_55: while(true){
+	r6 = r6 << 3;
+	r1 = r1 << 3;
+	r6 = (r5 + r6)|0;
+	r1 = (r5 + r1)|0;
+	r5 = r6 >> 2;
+	r1 = r1 >> 2;
+	r6 = heap32[(r5)];
+	heap32[(r1)] = r6;
+	r1 = heap32[(r5)];
+	r5 = heap32[(r3+4)];
+	r6 = r1 << 3;
+	r6 = (r5 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+if(!(r6 !=r1)) //_LBB355_42
+{
+break _54;
+}
+}
+}
+} while(0);
+if(!(r4 ==r1)) //_LBB355_45
+{
+	r4 = r4 << 3;
+	r5 = (r5 + r4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r1;
+	r5 = heap32[(r3+4)];
+	r1 = r1 << 3;
+	r1 = (r5 + r1)|0;
+	r4 = (r5 + r4)|0;
+	r1 = r1 >> 2;
+	r4 = r4 >> 2;
+	r5 = heap32[(r1+1)];
+	r4 = heap32[(r4+1)];
+	r4 = (r4 + r5)|0;
+	heap32[(r1+1)] = r4;
+}
+}
+}
+}
+}
+	r2 = (r2 + -1)|0;
+	r0 = (r0 + 16)|0;
+	if(r2 !=0) //_LBB355_31
+{
+continue _43;
+}
+else{
+break _41;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN25btSimulationIslandManagerD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV25btSimulationIslandManager;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+14)];
+if(!(r1 ==0)) //_LBB356_4
+{
+	r3 = heapU8[r0+60];
+if(!(r3 ==0)) //_LBB356_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+14)] = 0;
+}
+	r1 = 1;
+	heap8[r0+60] = r1;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	r3 = heap32[(r2+9)];
+if(!(r3 ==0)) //_LBB356_8
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB356_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+9)] = 0;
+}
+	heap8[r0+40] = r1;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB356_12
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB356_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN25btSimulationIslandManagerD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV25btSimulationIslandManager;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+14)];
+if(!(r1 ==0)) //_LBB357_4
+{
+	r3 = heapU8[r0+60];
+if(!(r3 ==0)) //_LBB357_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+14)] = 0;
+}
+	r1 = 1;
+	heap8[r0+60] = r1;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	r3 = heap32[(r2+9)];
+if(!(r3 ==0)) //_LBB357_8
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB357_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+9)] = 0;
+}
+	heap8[r0+40] = r1;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB357_12
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB357_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB359_23
+{
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB359_23
+{
+	r0 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB359_4
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB359_3
+{
+	if(r7 !=0) //_LBB359_7
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r4;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB359_9
+{
+	r4 = 0;
+	r8 = (r2 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r2 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r4 = (r0 + 12)|0;
+	if(r5 <1) //_LBB359_12
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_15: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB359_13
+{
+break _15;
+}
+}
+	r4 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB359_17
+{
+	r8 = heapU8[r0+16];
+	if(r8 !=0) //_LBB359_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r4)] = r2;
+	heap32[(r3+2)] = r7;
+	r2 = heap32[(r1+3)];
+}
+}
+	r0 = r5 << 2;
+	r1 = heap32[(r3+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+}
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+3)];
+_1: do {
+if(!(r0 ==0)) //_LBB360_10
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+4)];
+	r4 = r3 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r4+1)] = r0;
+	r0 = r2 >> 2;
+	f0 = heapFloat[(r1+14)];
+	f1 = heapFloat[(r0+14)];
+	f2 = heapFloat[(r1+13)];
+	f3 = heapFloat[(r0+13)];
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = heapFloat[(r1+15)];
+	f3 = heapFloat[(r0+15)];
+	f2 = f2-f3;
+	r1 = heap32[(r1+48)];
+	r2 = heap32[(r0+48)];
+	f3 = f1*f1;
+	f4 = f0*f0;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	f4 = heapFloat[(r1+7)];
+	f5 = heapFloat[(r1+3)];
+	f6 = heapFloat[(r2+7)];
+	f7 = heapFloat[(r2+3)];
+	f6 = f6*f7;
+	f4 = f4*f5;
+	f4 = f4+f6;
+_3: do {
+	if(f4 >=f3) //_LBB360_11
+{
+	r1 = sp + -16;
+	r2 = r1 >> 2;
+	heap32[(fp+-4)] = 1065353216;
+	heap32[(r2+1)] = 0;
+	f4 = f3-f4;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	f5 =   1.1920928955078125e-007;
+	if(f3 >f5) //_LBB360_13
+{
+	f5 =                         1;
+	f3 = f5/f3;
+	f1 = f1*f3;
+	f0 = f0*f3;
+	heapFloat[(fp+-4)] = f1;
+	f2 = f2*f3;
+	heapFloat[(r2+1)] = f0;
+	heapFloat[(r2+2)] = f2;
+	heap32[(r2+3)] = 0;
+}
+else{
+	f1 =                         1;
+	f0 =                         0;
+	f2 = f0;
+}
+	f1 = f1*f6;
+	f3 = heapFloat[(r0+13)];
+	f5 = heapFloat[(r0+15)];
+	f7 = heapFloat[(r0+14)];
+	r0 = sp + -32;
+	f0 = f0*f6;
+	f1 = f3+f1;
+	f2 = f2*f6;
+	r2 = r0 >> 2;
+	f0 = f7+f0;
+	heapFloat[(fp+-8)] = f1;
+	f1 = f5+f2;
+	heapFloat[(r2+1)] = f0;
+	heapFloat[(r2+2)] = f1;
+	heap32[(r2+3)] = 0;
+	r2 = heap32[(r4)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	heapFloat[(g0+3)] = f4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = heap32[(r4+1)];
+	if(r0 !=0) //_LBB360_16
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	if(r2 ==0) //_LBB360_10
+{
+break _1;
+}
+else{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r4+34)];
+	if(r1 ==r2) //_LBB360_19
+{
+	r1 = (r3 + 8)|0;
+	r2 = (r3 + 72)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+else{
+	r1 = (r3 + 72)|0;
+	r3 = (r3 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+__label__ = 8;
+break _3;
+}
+}
+}
+else{
+__label__ = 3;
+}
+}
+else{
+	r0 = heap32[(r4+1)];
+	if(r0 !=0) //_LBB360_4
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	if(r2 ==0) //_LBB360_10
+{
+break _1;
+}
+else{
+	r1 = heap32[(r1+277)];
+	r4 = heap32[(r4+34)];
+	if(r1 ==r4) //_LBB360_9
+{
+	r4 = (r3 + 8)|0;
+	r3 = (r3 + 72)|0;
+}
+else{
+	r4 = (r3 + 72)|0;
+	r3 = (r3 + 8)|0;
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+__label__ = 8;
+}
+}
+else{
+__label__ = 3;
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 8:
+	heap32[(g0+2)] = r3;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+break;
+case 3:
+	r0 = _2E_str59;
+	r3 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+break;
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV32btSphereSphereCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+8];
+if(!(r1 ==0)) //_LBB361_3
+{
+	r1 = heap32[(r2+3)];
+if(!(r1 ==0)) //_LBB361_3
+{
+	r3 = heap32[(r2+1)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+}
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN32btSphereSphereCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV32btSphereSphereCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB362_3
+{
+	r0 = heap32[(r2+3)];
+if(!(r0 ==0)) //_LBB362_3
+{
+	r1 = heap32[(r2+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	r0 = _ZTV30btActivatingCollisionAlgorithm;
+	r0 = (r0 + 8)|0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB364_23
+{
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB364_23
+{
+	r0 = heap32[(fp+1)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+2)];
+	r5 = heap32[(r3+1)];
+	if(r4 ==r5) //_LBB364_4
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB364_3
+{
+	if(r7 !=0) //_LBB364_7
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r8 = r7 << 2;
+	r4 = (r4 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r4;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB364_9
+{
+	r4 = 0;
+	r8 = (r2 + 4)|0;
+	r4 = (r4 - r8)|0;
+	r4 = r4 & 15;
+	r4 = (r2 + r4)|0;
+	r8 = (r4 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r4 = (r0 + 12)|0;
+	if(r5 <1) //_LBB364_12
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_15: while(true){
+	r9 = r4 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r5 !=r8)) //_LBB364_13
+{
+break _15;
+}
+}
+	r4 = (r0 + 12)|0;
+}
+	if(r9 !=0) //_LBB364_17
+{
+	r8 = heapU8[r0+16];
+	if(r8 !=0) //_LBB364_19
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r8 = heap32[(r5)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r5)] = r8;
+	r5 = heap32[(r9+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r3+1)];
+}
+	r8 = r4 >> 2;
+	heap32[(r8)] = 0;
+}
+	r4 = r4 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r4)] = r2;
+	heap32[(r3+2)] = r7;
+	r2 = heap32[(r1+3)];
+}
+}
+	r0 = r5 << 2;
+	r1 = heap32[(r3+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+1)] = r0;
+}
+}
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -176;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+if(!(r2 ==0)) //_LBB365_8
+{
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = heap32[(fp+4)];
+	r7 = heapU8[r0+16];
+	r8 = r7 == 0 ? r4 : r3;
+	r3 = r7 == 0 ? r3 : r4;
+	r4 = r8 >> 2;
+	r3 = r3 >> 2;
+	r7 = heap32[(r4+48)];
+	r8 = heap32[(r3+48)];
+	r9 = r6 >> 2;
+	heap32[(r9+1)] = r2;
+	r1 = heap32[(r1+3)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1+280)];
+	r1 = _ZTV22SphereTriangleDetector;
+	r2 = sp + -16;
+	r1 = (r1 + 8)|0;
+	r10 = r2 >> 2;
+	heap32[(fp+-4)] = r1;
+	heap32[(r10+1)] = r8;
+	r1 = sp + -152;
+	heap32[(r10+2)] = r7;
+	r7 = r1 >> 2;
+	heapFloat[(r10+3)] = f0;
+	heap32[(r7+33)] = 0;
+	heap32[(r7+32)] = 1566444395;
+	heap32[(fp+-38)] = heap32[(r3+1)];
+	heap32[(r7+1)] = heap32[(r3+2)];
+	heap32[(r7+2)] = heap32[(r3+3)];
+	heap32[(r7+3)] = heap32[(r3+4)];
+	heap32[(r7+4)] = heap32[(r3+5)];
+	heap32[(r7+5)] = heap32[(r3+6)];
+	heap32[(r7+6)] = heap32[(r3+7)];
+	heap32[(r7+7)] = heap32[(r3+8)];
+	heap32[(r7+8)] = heap32[(r3+9)];
+	heap32[(r7+9)] = heap32[(r3+10)];
+	heap32[(r7+10)] = heap32[(r3+11)];
+	heap32[(r7+11)] = heap32[(r3+12)];
+	heap32[(r7+12)] = heap32[(r3+13)];
+	heap32[(r7+13)] = heap32[(r3+14)];
+	heap32[(r7+14)] = heap32[(r3+15)];
+	heap32[(r7+15)] = heap32[(r3+16)];
+	heap32[(r7+16)] = heap32[(r4+1)];
+	heap32[(r7+17)] = heap32[(r4+2)];
+	heap32[(r7+18)] = heap32[(r4+3)];
+	heap32[(r7+19)] = heap32[(r4+4)];
+	heap32[(r7+20)] = heap32[(r4+5)];
+	heap32[(r7+21)] = heap32[(r4+6)];
+	heap32[(r7+22)] = heap32[(r4+7)];
+	heap32[(r7+23)] = heap32[(r4+8)];
+	heap32[(r7+24)] = heap32[(r4+9)];
+	heap32[(r7+25)] = heap32[(r4+10)];
+	heap32[(r7+26)] = heap32[(r4+11)];
+	heap32[(r7+27)] = heap32[(r4+12)];
+	heap32[(r7+28)] = heap32[(r4+13)];
+	heap32[(r7+29)] = heap32[(r4+14)];
+	heap32[(r7+30)] = heap32[(r4+15)];
+	heap32[(r7+31)] = heap32[(r4+16)];
+	r3 = r5 >> 2;
+	r4 = heapU8[r0+16];
+	r3 = heap32[(r3+5)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	_ZN22SphereTriangleDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB365_8
+{
+	r0 = heap32[(r9+1)];
+	if(r0 !=0) //_LBB365_4
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+if(!(r2 ==0)) //_LBB365_8
+{
+	r1 = heap32[(r1+277)];
+	r2 = heap32[(r9+34)];
+	if(r1 ==r2) //_LBB365_7
+{
+	r1 = (r6 + 8)|0;
+	r2 = (r6 + 72)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+}
+else{
+	r1 = (r6 + 72)|0;
+	r6 = (r6 + 8)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	_ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(i7);
+	return;
+}
+}
+}
+else{
+	r0 = _2E_str59;
+	r6 = _2E_str160;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+}
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithmD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV34btSphereTriangleCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+8];
+if(!(r1 ==0)) //_LBB366_3
+{
+	r1 = heap32[(r2+3)];
+if(!(r1 ==0)) //_LBB366_3
+{
+	r3 = heap32[(r2+1)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+}
+	r1 = _ZTV30btActivatingCollisionAlgorithm;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN34btSphereTriangleCollisionAlgorithmD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV34btSphereTriangleCollisionAlgorithm;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+8];
+if(!(r0 ==0)) //_LBB367_3
+{
+	r0 = heap32[(r2+3)];
+if(!(r0 ==0)) //_LBB367_3
+{
+	r1 = heap32[(r2+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+}
+	r0 = _ZTV30btActivatingCollisionAlgorithm;
+	r0 = (r0 + 8)|0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZN20btAlignedObjectArrayI9btElementE17quickSortInternalI31btUnionFindElementSortPredicateEEvT_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = (r0 + r1)|0;
+	r3 = r2 >>> 31;
+	r4 = heap32[(fp)];
+	r2 = (r2 + r3)|0;
+	r3 = r4 >> 2;
+	r2 = r2 & 1073741822;
+	r5 = heap32[(r3+3)];
+	r2 = r2 << 2;
+	r2 = (r5 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r5 = r1;
+	r6 = r0;
+_1: while(true){
+	r7 = heap32[(r3+3)];
+	r8 = r5 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+	if(r8 <r2) //_LBB368_3
+{
+_4: while(true){
+	r8 = r5 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r5 = (r5 + 1)|0;
+	if(r8 <r2) //_LBB368_3
+{
+continue _4;
+}
+else{
+break _4;
+}
+}
+}
+	r9 = r6 << 3;
+	r9 = (r7 + r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+_7: do {
+	if(r2 <r9) //_LBB368_6
+{
+_8: while(true){
+	r9 = r6 << 3;
+	r9 = (r7 + r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+-2)];
+	r6 = (r6 + -1)|0;
+	if(r2 <r9) //_LBB368_6
+{
+continue _8;
+}
+else{
+break _7;
+}
+}
+}
+} while(0);
+	if(r5 <=r6) //_LBB368_9
+{
+	r10 = r5 << 3;
+	r11 = r6 << 3;
+	r10 = (r7 + r10)|0;
+	r7 = (r7 + r11)|0;
+	r10 = r10 >> 2;
+	r7 = r7 >> 2;
+	r12 = heap32[(r10+1)];
+	r7 = heap32[(r7+1)];
+	heap32[(r10)] = r9;
+	heap32[(r10+1)] = r7;
+	r7 = heap32[(r3+3)];
+	r7 = (r7 + r11)|0;
+	r7 = r7 >> 2;
+	r5 = (r5 + 1)|0;
+	r6 = (r6 + -1)|0;
+	heap32[(r7)] = r8;
+	heap32[(r7+1)] = r12;
+}
+	if(r5 <=r6) //_LBB368_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+if(!(r6 <=r1)) //_LBB368_13
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	_ZN20btAlignedObjectArrayI9btElementE17quickSortInternalI31btUnionFindElementSortPredicateEEvT_ii(i7);
+}
+if(!(r5 >=r0)) //_LBB368_15
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r0;
+	_ZN20btAlignedObjectArrayI9btElementE17quickSortInternalI31btUnionFindElementSortPredicateEEvT_ii(i7);
+}
+	return;
+}
+
+function _ZN22SphereTriangleDetectorD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22SphereTriangleDetector;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN22SphereTriangleDetectorD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22SphereTriangleDetector;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN22SphereTriangleDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -144;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1+19)];
+	f1 = heapFloat[(r1+15)];
+	f2 = heapFloat[(r1+23)];
+	f3 = heapFloat[(r1+17)];
+	f4 = heapFloat[(r1+13)];
+	f5 = heapFloat[(r1+21)];
+	f6 = heapFloat[(r1+22)];
+	f7 = heapFloat[(r1+14)];
+	f8 = heapFloat[(r1+18)];
+	f0 = f0-f1;
+	f6 = f6-f7;
+	f3 = f3-f4;
+	f1 = f2-f1;
+	f2 = f8-f7;
+	f4 = f5-f4;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(r0+1)];
+	f5 = f2*f1;
+	f7 = f0*f6;
+	f0 = f0*f4;
+	f1 = f3*f1;
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	f5 = f5-f7;
+	f0 = f0-f1;
+	f1 = f3*f6;
+	f2 = f2*f4;
+	f3 = heapFloat[(r0+3)];
+	f1 = f1-f2;
+	f2 = f5*f5;
+	f4 = f0*f0;
+	f6 = heapFloat[(r3+7)];
+	f7 = heapFloat[(r3+3)];
+	f8 = heapFloat[(r2+18)];
+	f9 = heapFloat[(r2+22)];
+	f10 = heapFloat[(r2+26)];
+	f11 = heapFloat[(r2+17)];
+	f12 = heapFloat[(r2+21)];
+	f13 = heapFloat[(r2+25)];
+	f14 = heapFloat[(r2+16)];
+	f15 = heapFloat[(r2+12)];
+	f16 = heapFloat[(r2+28)];
+	f17 = heapFloat[(r2+20)];
+	f18 = heapFloat[(r2+13)];
+	f19 = heapFloat[(r2+29)];
+	f20 = heapFloat[(r2+24)];
+	f21 = heapFloat[(r2+14)];
+	f22 = heapFloat[(r2+30)];
+	f2 = f2+f4;
+	f4 = f1*f1;
+	f15 = f15-f16;
+	f16 = f18-f19;
+	f2 = f2+f4;
+	f4 = f21-f22;
+	heapFloat[(g0)] = f2;
+	f2 = f11*f15;
+	f11 = f12*f16;
+	f12 = f14*f15;
+	f14 = f17*f16;
+	sqrtf(i7);
+	f18 =                         1;
+	heapFloat[(fp+-25)] = f18;
+	f8 = f8*f15;
+	f9 = f9*f16;
+	f2 = f2+f11;
+	f11 = f13*f4;
+	f12 = f12+f14;
+	f13 = f20*f4;
+	f14 = f18/f_g0;
+	f2 = f2+f11;
+	f11 = heapFloat[(r1+14)];
+	f12 = f12+f13;
+	f13 = heapFloat[(r1+13)];
+	f8 = f8+f9;
+	f4 = f10*f4;
+	f5 = f5*f14;
+	f9 = f12-f13;
+	heapFloat[(fp+-28)] = f9;
+	f0 = f0*f14;
+	f10 = f2-f11;
+	heapFloat[(fp+-29)] = f10;
+	f4 = f8+f4;
+	f8 = heapFloat[(r1+15)];
+	f1 = f1*f14;
+	f14 = f4-f8;
+	heapFloat[(fp+-27)] = f14;
+	f9 = f9*f5;
+	f10 = f10*f0;
+	f9 = f9+f10;
+	f10 = f14*f1;
+	f9 = f9+f10;
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+4)];
+	f6 = f6*f7;
+	heapFloat[(fp+-26)] = f6;
+	f6 =                         0;
+	if(f9 <f6) //_LBB371_2
+{
+	f9 = -f9;
+	f5 = -f5;
+	f0 = -f0;
+	f1 = -f1;
+}
+	f7 = heapFloat[(fp+-26)];
+	if(f9 <f7) //_LBB371_5
+{
+__label__ = 4;
+}
+else{
+	f7 = f5*f6;
+	f10 = f0*f6;
+	f7 = f7+f10;
+	f10 = f1*f6;
+	f7 = f7+f10;
+	if(f7 >=f6) //_LBB371_31
+{
+__label__ = 29;
+}
+else{
+__label__ = 4;
+}
+}
+_6: do {
+if (__label__ == 4){
+	f7 = heapFloat[(fp+-26)];
+	f3 = f7+f3;
+	heapFloat[(fp+-30)] = f3;
+if(!(f3 <=f9)) //_LBB371_31
+{
+	f3 = heapFloat[(r1+19)];
+	f7 = heapFloat[(r1+23)];
+	f10 = heapFloat[(r1+17)];
+	f14 = heapFloat[(r1+21)];
+	f15 = heapFloat[(r1+18)];
+	f16 = heapFloat[(r1+22)];
+	f17 = f7-f3;
+	f18 = f14-f10;
+	f19 = f3-f8;
+	f8 = f8-f7;
+	f20 = f16-f15;
+	f21 = f10-f13;
+	f22 = f15-f11;
+	f13 = f13-f14;
+	f11 = f11-f16;
+	f23 = f20*f1;
+	f24 = f17*f0;
+	f17 = f17*f5;
+	f25 = f18*f1;
+	f26 = f22*f1;
+	f27 = f19*f0;
+	f19 = f19*f5;
+	f28 = f21*f1;
+	f29 = f11*f1;
+	f30 = f8*f0;
+	f8 = f8*f5;
+	heapFloat[(fp+-31)] = f8;
+	f8 = f13*f1;
+	f23 = f23-f24;
+	f10 = f12-f10;
+	f17 = f17-f25;
+	f15 = f2-f15;
+	f18 = f18*f0;
+	f20 = f20*f5;
+	f24 = f26-f27;
+	f19 = f19-f28;
+	f21 = f21*f0;
+	f22 = f22*f5;
+	f25 = f29-f30;
+	f14 = f12-f14;
+	f26 = heapFloat[(fp+-31)];
+	f8 = f26-f8;
+	f16 = f2-f16;
+	f13 = f13*f0;
+	f11 = f11*f5;
+	f10 = f23*f10;
+	f15 = f17*f15;
+	f17 = f18-f20;
+	f3 = f4-f3;
+	f18 = heapFloat[(fp+-28)];
+	f18 = f24*f18;
+	f20 = heapFloat[(fp+-29)];
+	f19 = f19*f20;
+	f20 = f21-f22;
+	f14 = f25*f14;
+	f8 = f8*f16;
+	f11 = f13-f11;
+	f7 = f4-f7;
+	f10 = f10+f15;
+	f3 = f17*f3;
+	f13 = f18+f19;
+	f15 = heapFloat[(fp+-27)];
+	f15 = f20*f15;
+	f8 = f14+f8;
+	f7 = f11*f7;
+	f3 = f10+f3;
+	f10 = f13+f15;
+	f7 = f8+f7;
+	if(f3 <=f6) //_LBB371_9
+{
+__label__ = 8;
+}
+else{
+	f8 =                         0;
+	if(f10 <=f8) //_LBB371_9
+{
+__label__ = 8;
+}
+else{
+	if(f7 >f8) //_LBB371_12
+{
+__label__ = 11;
+}
+else{
+__label__ = 8;
+}
+}
+}
+_12: do {
+if (__label__ == 8){
+if(!(f10 >f6)) //_LBB371_13
+{
+if(!(f3 >f6)) //_LBB371_13
+{
+if(!(f7 >f6)) //_LBB371_13
+{
+__label__ = 11;
+break _12;
+}
+}
+}
+	r1 = heap32[(r0+2)];
+	r5 = r1 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+22)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r1 = r_g0;
+	if(r1 <1) //_LBB371_31
+{
+break _6;
+}
+else{
+	f0 = heapFloat[(fp+-30)];
+	f5 = f0*f0;
+	r1 = 0;
+	r5 = r1;
+_19: while(true){
+	r6 = heap32[(r0+2)];
+	r7 = r6 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+23)];
+	r8 = sp + -32;
+	r9 = sp + -16;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r6 = r8 >> 2;
+	r7 = r9 >> 2;
+	f7 = heapFloat[(r7+1)];
+	f8 = heapFloat[(r6+1)];
+	f9 = heapFloat[(fp+-4)];
+	f10 = heapFloat[(fp+-8)];
+	f11 = f2-f7;
+	f8 = f8-f7;
+	f13 = f12-f9;
+	f10 = f10-f9;
+	f14 = heapFloat[(r7+2)];
+	f15 = heapFloat[(r6+2)];
+	f16 = f4-f14;
+	f15 = f15-f14;
+	f17 = f10*f13;
+	f18 = f8*f11;
+	f17 = f17+f18;
+	f18 = f15*f16;
+	f17 = f17+f18;
+	r1 = (r1 + 1)|0;
+	if(f17 >f6) //_LBB371_17
+{
+	f18 = f10*f10;
+	f19 = f8*f8;
+	f18 = f18+f19;
+	f19 = f15*f15;
+	f18 = f18+f19;
+	if(f17 >=f18) //_LBB371_19
+{
+	f13 = f13-f10;
+	f11 = f11-f8;
+	f16 = f16-f15;
+	f17 = heapFloat[(fp+-25)];
+}
+else{
+	f17 = f17/f18;
+	f18 = f10*f17;
+	f19 = f8*f17;
+	f20 = f15*f17;
+	f13 = f13-f18;
+	f11 = f11-f19;
+	f16 = f16-f20;
+}
+}
+else{
+	f17 = f6;
+}
+	f13 = f13*f13;
+	f11 = f11*f11;
+	f11 = f13+f11;
+	f13 = f16*f16;
+	f11 = f11+f13;
+	if(f11 <f5) //_LBB371_22
+{
+	f0 = f10*f17;
+	f3 = f8*f17;
+	f8 = f15*f17;
+	f1 = f9+f0;
+	f0 = f7+f3;
+	f3 = f14+f8;
+	r5 = 1;
+}
+	r6 = heap32[(r0+2)];
+	r7 = r6 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+22)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r6 = r_g0;
+if(!(r6 >r1)) //_LBB371_15
+{
+break _19;
+}
+}
+	r0 = r5 & 255;
+	if(r0 ==0) //_LBB371_31
+{
+break _6;
+}
+else{
+__label__ = 23;
+}
+}
+}
+} while(0);
+if (__label__ == 11){
+	f6 = f1*f9;
+	f0 = f0*f9;
+	f1 = f5*f9;
+	f3 = f4-f6;
+	f0 = f2-f0;
+	f1 = f12-f1;
+}
+	f2 = f2-f0;
+	f5 = f12-f1;
+	f4 = f4-f3;
+	f6 = f5*f5;
+	f7 = f2*f2;
+	f6 = f6+f7;
+	f7 = f4*f4;
+	f6 = f6+f7;
+	f7 = heapFloat[(fp+-26)];
+	f7 = f7*f7;
+	if(f7 <=f6) //_LBB371_27
+{
+	f6 =                         0;
+	f5 = f5*f6;
+	f2 = f2*f6;
+	f2 = f5+f2;
+	f4 = f4*f6;
+	f2 = f2+f4;
+	if(f2 >=f6) //_LBB371_31
+{
+break _6;
+}
+}
+else{
+	heapFloat[(g0)] = f6;
+	sqrtf(i7);
+	f7 = f_g0;
+	heapFloat[(g0)] = f6;
+	f6 =                         1;
+	sqrtf(i7);
+	f9 = heapFloat[(fp+-26)];
+	f7 = f9-f7;
+	f6 = f6/f_g0;
+	f5 = f5*f6;
+	f2 = f2*f6;
+	f4 = f4*f6;
+	f6 = -f7;
+}
+	if(r4 ==0) //_LBB371_30
+{
+	r0 = r3 >> 2;
+	f7 = heapFloat[(r2+16)];
+	f8 = heapFloat[(r2+17)];
+	r0 = heap32[(r0)];
+	f9 = heapFloat[(r2+20)];
+	f10 = heapFloat[(r2+21)];
+	f11 = f7*f1;
+	f12 = f8*f0;
+	f13 = heapFloat[(r2+18)];
+	r0 = r0 >> 2;
+	f14 = heapFloat[(r2+24)];
+	f15 = heapFloat[(r2+25)];
+	f16 = heapFloat[(r2+22)];
+	f17 = f9*f1;
+	f18 = f10*f0;
+	f11 = f11+f12;
+	f12 = f13*f3;
+	f19 = heapFloat[(r2+26)];
+	r0 = heap32[(r0+4)];
+	f1 = f14*f1;
+	f0 = f15*f0;
+	f17 = f17+f18;
+	f18 = f16*f3;
+	f11 = f11+f12;
+	f12 = heapFloat[(r2+28)];
+	f20 = heapFloat[(r2+30)];
+	f21 = heapFloat[(r2+29)];
+	r1 = sp + -64;
+	f17 = f17+f18;
+	f0 = f1+f0;
+	f1 = f19*f3;
+	f3 = f11+f12;
+	f0 = f0+f1;
+	r2 = r1 >> 2;
+	f1 = f17+f21;
+	heapFloat[(fp+-16)] = f3;
+	f3 = f7*f5;
+	f7 = f8*f2;
+	f0 = f0+f20;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f0;
+	f0 = f9*f5;
+	f1 = f10*f2;
+	f3 = f3+f7;
+	f7 = f13*f4;
+	r4 = sp + -48;
+	f5 = f14*f5;
+	f2 = f15*f2;
+	f0 = f0+f1;
+	f1 = f16*f4;
+	f3 = f3+f7;
+	heap32[(r2+3)] = 0;
+	r2 = r4 >> 2;
+	f2 = f5+f2;
+	f4 = f19*f4;
+	f0 = f0+f1;
+	heapFloat[(fp+-12)] = f3;
+	f1 = f2+f4;
+	heapFloat[(r2+1)] = f0;
+	heapFloat[(r2+2)] = f1;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heapFloat[(g0+3)] = f6;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+else{
+	f7 = heapFloat[(r2+16)];
+	f8 = heapFloat[(r2+17)];
+	f9 = heapFloat[(r2+20)];
+	f10 = heapFloat[(r2+21)];
+	f11 = f7*f5;
+	f12 = f8*f2;
+	f13 = heapFloat[(r2+18)];
+	f14 = heapFloat[(r2+24)];
+	f15 = heapFloat[(r2+25)];
+	f16 = heapFloat[(r2+22)];
+	f17 = f9*f5;
+	f18 = f10*f2;
+	f11 = f11+f12;
+	f12 = f13*f4;
+	f19 = heapFloat[(r2+26)];
+	f11 = f11+f12;
+	f5 = f14*f5;
+	f2 = f15*f2;
+	f12 = f17+f18;
+	f17 = f16*f4;
+	r0 = sp + -80;
+	f12 = f12+f17;
+	f2 = f5+f2;
+	f4 = f19*f4;
+	f5 = -f11;
+	f2 = f2+f4;
+	r1 = r0 >> 2;
+	f4 = -f12;
+	heapFloat[(fp+-20)] = f5;
+	f5 = -f2;
+	heapFloat[(r1+1)] = f4;
+	heapFloat[(r1+2)] = f5;
+	f4 = f7*f1;
+	f5 = f8*f0;
+	heap32[(r1+3)] = 0;
+	f7 = f9*f1;
+	f8 = f10*f0;
+	f4 = f4+f5;
+	f5 = f13*f3;
+	f1 = f14*f1;
+	f0 = f15*f0;
+	f7 = f7+f8;
+	f8 = f16*f3;
+	f4 = f4+f5;
+	f5 = heapFloat[(r2+28)];
+	f0 = f1+f0;
+	f1 = f19*f3;
+	f3 = f7+f8;
+	f7 = heapFloat[(r2+29)];
+	f8 = heapFloat[(r2+30)];
+	f4 = f4+f5;
+	f5 = f11*f6;
+	r2 = sp + -96;
+	f0 = f0+f1;
+	f1 = f3+f7;
+	f3 = f12*f6;
+	f4 = f4+f5;
+	r1 = r2 >> 2;
+	f0 = f0+f8;
+	f2 = f2*f6;
+	f1 = f1+f3;
+	heapFloat[(fp+-24)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r1+1)] = f1;
+	heapFloat[(r1+2)] = f0;
+	r4 = r3 >> 2;
+	heap32[(r1+3)] = 0;
+	r1 = heap32[(r4)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heapFloat[(g0+3)] = f6;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZNK10btBoxShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = heapFloat[(r1+7)];
+	f2 = heapFloat[(r1+8)];
+	f3 = heapFloat[(r1+9)];
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	heapFloat[(g0)] = f1;
+	heapFloat[(g0+1)] = f2;
+	heapFloat[(g0+2)] = f3;
+	heapFloat[(g0+3)] = f_g0;
+	heap32[(g0+4)] = r0;
+	heap32[(g0+5)] = r1;
+	heap32[(g0+6)] = r2;
+	_Z15btTransformAabbRK9btVector3fRK11btTransformRS_S5_(i7);
+	return;
+}
+
+function _Z15btTransformAabbRK9btVector3fRK11btTransformRS_S5_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(fp+2)];
+	f1 = heapFloat[(fp+3)];
+	f2 = heapFloat[(fp+1)];
+	f3 = heapFloat[(fp)];
+	f4 = heapFloat[(r0+10)];
+	r1 = heap32[(fp+5)];
+	r2 = heap32[(fp+6)];
+	f0 = f0+f1;
+	f2 = f2+f1;
+	f1 = f3+f1;
+	f3 =                         0;
+	if(f4 <f3) //_LBB373_2
+{
+	f4 = -f4;
+}
+	f5 = heapFloat[(r0+9)];
+	if(f5 <f3) //_LBB373_5
+{
+	f5 = -f5;
+}
+	f6 = heapFloat[(r0+8)];
+	if(f6 <f3) //_LBB373_8
+{
+	f6 = -f6;
+}
+	f7 = heapFloat[(r0+6)];
+	if(f7 <f3) //_LBB373_11
+{
+	f7 = -f7;
+}
+	f8 = heapFloat[(r0+5)];
+	if(f8 <f3) //_LBB373_14
+{
+	f8 = -f8;
+}
+	f9 = heapFloat[(r0+4)];
+	if(f9 <f3) //_LBB373_17
+{
+	f9 = -f9;
+}
+	f10 = heapFloat[(r0+2)];
+	if(f10 <f3) //_LBB373_20
+{
+	f10 = -f10;
+}
+	f11 = heapFloat[(r0+1)];
+	if(f11 <f3) //_LBB373_23
+{
+	f11 = -f11;
+}
+	f12 = heapFloat[(r0)];
+	if(f12 <f3) //_LBB373_26
+{
+	f12 = -f12;
+}
+	f3 = f12*f1;
+	f11 = f11*f2;
+	f9 = f9*f1;
+	f8 = f8*f2;
+	f3 = f3+f11;
+	f10 = f10*f0;
+	f1 = f6*f1;
+	f2 = f5*f2;
+	f5 = f9+f8;
+	f6 = f7*f0;
+	f3 = f3+f10;
+	f7 = heapFloat[(r0+12)];
+	f8 = heapFloat[(r0+13)];
+	f9 = heapFloat[(r0+14)];
+	f5 = f5+f6;
+	r0 = r1 >> 2;
+	f1 = f1+f2;
+	f0 = f4*f0;
+	f2 = f7-f3;
+	f0 = f1+f0;
+	f1 = f8-f5;
+	heapFloat[(r0)] = f2;
+	f2 = f9-f0;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f2;
+	r1 = r2 >> 2;
+	f1 = f7+f3;
+	heap32[(r0+3)] = 0;
+	f2 = f8+f5;
+	heapFloat[(r1)] = f1;
+	f0 = f9+f0;
+	heapFloat[(r1+1)] = f2;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape24localGetSupportingVertexERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	f0 = heapFloat[(r1+7)];
+	f1 = heapFloat[(r1+8)];
+	f2 = heapFloat[(r1+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f3 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f4 = f_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp+2)];
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r0 >> 2;
+	f0 = f0+f_g0;
+	r1 = heap32[(fp)];
+	f1 = f1+f4;
+	f4 =                         0;
+	f5 = -f0;
+	f6 = heapFloat[(r0)];
+	f7 = heapFloat[(r0+2)];
+	f8 = heapFloat[(r0+1)];
+	f2 = f2+f3;
+	f3 = -f1;
+	r0 = r1 >> 2;
+	f0 = f6 < f4 ? f5 : f0;
+	f5 = -f2;
+	f1 = f8 < f4 ? f3 : f1;
+	heapFloat[(r0)] = f0;
+	f0 = f7 < f4 ? f5 : f2;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+2)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r0+7)];
+	r2 = heap32[(fp)];
+	f1 = heapFloat[(r0+9)];
+	f2 = heapFloat[(r0+8)];
+	f3 =                         0;
+	f4 = -f0;
+	f5 = heapFloat[(r1)];
+	f6 = heapFloat[(r1+2)];
+	f7 = heapFloat[(r1+1)];
+	f8 = -f2;
+	r0 = r2 >> 2;
+	f0 = f5 < f3 ? f4 : f0;
+	f4 = -f1;
+	f2 = f7 < f3 ? f8 : f2;
+	heapFloat[(r0)] = f0;
+	f0 = f6 < f3 ? f4 : f1;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 <1)) //_LBB376_3
+{
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r3 = (r3 + 8)|0;
+	r2 = (r2 + 8)|0;
+	f3 =                         0;
+_3: while(true){
+	r4 = r1 >> 2;
+	r5 = r2 >> 2;
+	f0 = heapFloat[(r4+7)];
+	f1 = heapFloat[(r4+9)];
+	f2 = heapFloat[(r4+8)];
+	f4 = -f0;
+	f5 = heapFloat[(r5+-2)];
+	f6 = heapFloat[(r5)];
+	f7 = heapFloat[(r5+-1)];
+	f8 = -f2;
+	r4 = r3 >> 2;
+	f0 = f5 < f3 ? f4 : f0;
+	f4 = -f1;
+	f2 = f7 < f3 ? f8 : f2;
+	heapFloat[(r4+-2)] = f0;
+	f0 = f6 < f3 ? f4 : f1;
+	heapFloat[(r4+-1)] = f2;
+	r0 = (r0 + -1)|0;
+	r3 = (r3 + 16)|0;
+	r2 = (r2 + 16)|0;
+	heapFloat[(r4)] = f0;
+	heap32[(r4+1)] = 0;
+	if(r0 !=0) //_LBB376_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN10btBoxShape9setMarginEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f2 = f_g0;
+	f3 = heapFloat[(r1+9)];
+	f4 = heapFloat[(r1+8)];
+	f5 = heapFloat[(r1+7)];
+	heap32[(r1+11)] = heap32[(fp+1)];
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f6 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f7 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	f2 = f5+f2;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f4+f1;
+	f2 = f2-f_g0;
+	f0 = f3+f0;
+	f1 = f1-f7;
+	heapFloat[(r1+7)] = f2;
+	f0 = f0-f6;
+	heapFloat[(r1+8)] = f1;
+	heapFloat[(r1+9)] = f0;
+	heap32[(r1+10)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape8getPlaneER9btVector3S1_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+28)];
+	r3 = sp + -32;
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r3 >> 2;
+	r3 = heap32[(fp+1)];
+	f0 = heapFloat[(r2+2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(fp+-8)];
+	r2 = r3 >> 2;
+	heapFloat[(r2)] = f2;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f0;
+	heap32[(r2+3)] = 0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+15)];
+	r2 = sp + -16;
+	f2 = -f2;
+	r3 = r2 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-4)] = f2;
+	f0 = -f0;
+	heapFloat[(r3+1)] = f1;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	r3 = sp + -48;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r3 >> 2;
+	heap32[(r0)] = heap32[(fp+-12)];
+	heap32[(r0+1)] = heap32[(r1+1)];
+	heap32[(r0+2)] = heap32[(r1+2)];
+	heap32[(r0+3)] = heap32[(r1+3)];
+	return;
+}
+
+function _ZNK10btBoxShape12getNumPlanesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 6;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape14getNumVerticesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 8;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape11getNumEdgesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 12;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape9getVertexEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >>> 1;
+	r2 = heap32[(fp)];
+	r2 = r2 >> 2;
+	r1 = r1 & 1;
+	r3 = r0 >>> 2;
+	r0 = r0 & 1;
+	r4 = 0;
+	f0 =                         1;
+	f1 =                         0;
+	r3 = r3 & 1;
+	r5 = r1 ^ 1;
+	f0 = r0 == r4 ? f0 : f1;
+	f1 = heapFloat[(r2+7)];
+	f2 = r0; //fitos r0, f2
+	r0 = heap32[(fp+2)];
+	r4 = r3 ^ 1;
+	f3 = r5; //fitos r5, f3
+	f4 = heapFloat[(r2+8)];
+	f5 = r1; //fitos r1, f5
+	f6 = heapFloat[(r2+9)];
+	f0 = f1*f0;
+	f1 = f1*f2;
+	f2 = r4; //fitos r4, f2
+	f7 = r3; //fitos r3, f7
+	r0 = r0 >> 2;
+	f3 = f4*f3;
+	f4 = f4*f5;
+	f0 = f0-f1;
+	f1 = f6*f2;
+	f2 = f6*f7;
+	f3 = f3-f4;
+	heapFloat[(r0)] = f0;
+	f0 = f1-f2;
+	heapFloat[(r0+1)] = f3;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape8isInsideERK9btVector3f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(fp+2)];
+	f2 = heapFloat[(r1+7)];
+	f3 = f2+f1;
+if(!(f0 >f3)) //_LBB383_6
+{
+	f2 = -f2;
+	f2 = f2-f1;
+if(!(f0 <f2)) //_LBB383_6
+{
+	f0 = heapFloat[(r1+8)];
+	f2 = heapFloat[(r0+1)];
+	f3 = f0+f1;
+if(!(f2 >f3)) //_LBB383_6
+{
+	f0 = -f0;
+	f0 = f0-f1;
+if(!(f2 <f0)) //_LBB383_6
+{
+	f0 = heapFloat[(r1+9)];
+	f2 = heapFloat[(r0+2)];
+	f3 = f0+f1;
+if(!(f2 >f3)) //_LBB383_6
+{
+	f0 = -f0;
+	f0 = f0-f1;
+	r0 = f2 >= f0;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+}
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str173;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape36getNumPreferredPenetrationDirectionsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 6;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	f0 = heapFloat[(r1+7)];
+	f1 = heapFloat[(r1+8)];
+	f2 = heapFloat[(r1+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f3 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	heap32[(g0)] = r0;
+	f1 = f1+f_g0;
+	f2 = f2+f3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f0+f_g0;
+	f1 = f1+f1;
+	f2 = f2+f2;
+	f0 = f0+f0;
+	f3 = heapFloat[(fp+1)];
+	f4 =                        12;
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f0 = f0*f0;
+	r0 = heap32[(fp+2)];
+	f3 = f3/f4;
+	f4 = f1+f2;
+	f2 = f0+f2;
+	r0 = r0 >> 2;
+	f4 = f3*f4;
+	f0 = f0+f1;
+	f1 = f3*f2;
+	heapFloat[(r0)] = f4;
+	f0 = f3*f0;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK10btBoxShape16getPlaneEquationER9btVector4i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+1)];
+	f0 = heapFloat[(r0+8)];
+_1: do {
+	if(r1 >2) //_LBB387_4
+{
+	if(r1 ==3) //_LBB387_13
+{
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+	heap32[(r2+1)] = -1082130432;
+__label__ = 11;
+break _1;
+}
+else{
+	f0 = heapFloat[(r0+9)];
+	if(r1 ==4) //_LBB387_14
+{
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+	heap32[(r2+1)] = 0;
+	f0 = -f0;
+	heap32[(r2+2)] = 1065353216;
+	heapFloat[(r2+3)] = f0;
+	return;
+}
+else{
+	if(r1 ==5) //_LBB387_15
+{
+	r0 = r2 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	f0 = -f0;
+	heap32[(r0+2)] = -1082130432;
+	heapFloat[(r0+3)] = f0;
+	return;
+}
+else{
+__label__ = 16;
+break _1;
+}
+}
+}
+}
+else{
+	f1 = heapFloat[(r0+7)];
+	if(r1 ==0) //_LBB387_7
+{
+	r2 = r2 >> 2;
+	heap32[(r2)] = 1065353216;
+}
+else{
+	if(r1 ==1) //_LBB387_9
+{
+	r2 = r2 >> 2;
+	heap32[(r2)] = -1082130432;
+}
+else{
+	if(r1 ==2) //_LBB387_10
+{
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+	heap32[(r2+1)] = 1065353216;
+__label__ = 11;
+break _1;
+}
+else{
+__label__ = 16;
+break _1;
+}
+}
+}
+	heap32[(r2+1)] = 0;
+	f0 = -f1;
+__label__ = 12;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 11:
+	f0 = -f0;
+break;
+case 16:
+	r0 = _2E_str10;
+	r1 = _2E_str2175;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 182;
+	_assert(i7);
+break;
+}
+	heap32[(r2+2)] = 0;
+	heapFloat[(r2+3)] = f0;
+	return;
+}
+
+function _ZNK10btBoxShape7getEdgeEiR9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+_1: do {
+	if(r0 >5) //_LBB388_8
+{
+	if(r0 >8) //_LBB388_12
+{
+	if(r0 ==9) //_LBB388_24
+{
+	r0 = 4;
+	r4 = 6;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==10) //_LBB388_25
+{
+	r0 = 5;
+	r4 = 7;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==11) //_LBB388_26
+{
+	r0 = 6;
+	r4 = 7;
+__label__ = 28;
+break _1;
+}
+else{
+__label__ = 27;
+break _1;
+}
+}
+}
+}
+else{
+	if(r0 ==6) //_LBB388_21
+{
+	r0 = 2;
+	r4 = 6;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==7) //_LBB388_22
+{
+	r0 = 3;
+	r4 = 7;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==8) //_LBB388_23
+{
+	r0 = 4;
+	r4 = 5;
+__label__ = 28;
+break _1;
+}
+else{
+__label__ = 27;
+break _1;
+}
+}
+}
+}
+}
+else{
+	if(r0 >2) //_LBB388_5
+{
+	if(r0 ==3) //_LBB388_18
+{
+	r0 = 2;
+	r4 = 3;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==4) //_LBB388_19
+{
+	r0 = 0;
+	r4 = 4;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==5) //_LBB388_20
+{
+	r0 = 1;
+	r4 = 5;
+__label__ = 28;
+break _1;
+}
+else{
+__label__ = 27;
+break _1;
+}
+}
+}
+}
+else{
+	if(r0 ==0) //_LBB388_15
+{
+	r0 = 0;
+	r4 = 1;
+__label__ = 28;
+break _1;
+}
+else{
+	if(r0 ==1) //_LBB388_16
+{
+	r0 = 0;
+	r4 = 2;
+__label__ = 28;
+}
+else{
+	if(r0 ==2) //_LBB388_17
+{
+	r0 = 1;
+	r4 = 3;
+__label__ = 28;
+}
+else{
+__label__ = 27;
+}
+}
+}
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 28:
+	r5 = r1 >> 2;
+	r6 = heap32[(r5)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+24)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r0 = heap32[(r5)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+24)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	return;
+break;
+case 27:
+	r0 = _2E_str10;
+	r1 = _2E_str2175;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 246;
+	_assert(i7);
+break;
+}
+}
+
+function _ZNK10btBoxShape32getPreferredPenetrationDirectionEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+_1: do {
+	if(r0 >2) //_LBB389_4
+{
+	if(r0 ==3) //_LBB389_12
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 0;
+	heap32[(r1+1)] = -1082130432;
+__label__ = 9;
+break _1;
+}
+else{
+	if(r0 ==4) //_LBB389_13
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 0;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 1065353216;
+	heap32[(r1+3)] = 0;
+	return;
+}
+else{
+	if(r0 ==5) //_LBB389_14
+{
+	r0 = r1 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = -1082130432;
+	heap32[(r0+3)] = 0;
+	return;
+}
+else{
+__label__ = 15;
+break _1;
+}
+}
+}
+}
+else{
+	if(r0 ==0) //_LBB389_7
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 1065353216;
+}
+else{
+	if(r0 ==1) //_LBB389_10
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = -1082130432;
+}
+else{
+	if(r0 ==2) //_LBB389_11
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 0;
+	heap32[(r1+1)] = 1065353216;
+__label__ = 9;
+break _1;
+}
+else{
+__label__ = 15;
+break _1;
+}
+}
+}
+	heap32[(r1+1)] = 0;
+__label__ = 9;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 9:
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	return;
+break;
+case 15:
+	r0 = _2E_str10;
+	r1 = _2E_str2175;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 309;
+	_assert(i7);
+break;
+}
+}
+
+function _ZN10btBoxShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f2 = f_g0;
+	r0 = heap32[(fp+1)];
+	f3 = heapFloat[(r1+9)];
+	f4 = heapFloat[(r1+8)];
+	f5 = heapFloat[(r1+7)];
+	r0 = r0 >> 2;
+	f3 = f3+f0;
+	f6 = heapFloat[(r1+5)];
+	f4 = f4+f1;
+	f7 = heapFloat[(r1+4)];
+	f5 = f5+f2;
+	f8 = heapFloat[(r1+3)];
+	f9 = heapFloat[(r0+2)];
+	f3 = f3/f6;
+	f4 = f4/f7;
+	f5 = f5/f8;
+	f6 =                         0;
+	if(f9 <f6) //_LBB390_2
+{
+	f9 = -f9;
+}
+	f7 = heapFloat[(r0+1)];
+	if(f7 <f6) //_LBB390_5
+{
+	f7 = -f7;
+}
+	f8 = heapFloat[(r0)];
+	if(f8 <f6) //_LBB390_8
+{
+	f8 = -f8;
+}
+	heapFloat[(r1+3)] = f8;
+	heapFloat[(r1+4)] = f7;
+	heapFloat[(r1+5)] = f9;
+	f5 = f5*f8;
+	f4 = f4*f7;
+	f2 = f5-f2;
+	heap32[(r1+6)] = 0;
+	f3 = f3*f9;
+	f1 = f4-f1;
+	heapFloat[(r1+7)] = f2;
+	f0 = f3-f0;
+	heapFloat[(r1+8)] = f1;
+	heapFloat[(r1+9)] = f0;
+	heap32[(r1+10)] = 0;
+	return;
+}
+
+function _ZN10btBoxShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB391_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN10btBoxShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZNK14btConcaveShape9getMarginEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var f0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+3)];
+	f_g0 = f0;
+	return;
+}
+
+function _ZN14btConcaveShape9setMarginEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0+3)] = heap32[(fp+1)];
+	return;
+}
+
+function _ZNK22btBvhTriangleMeshShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str181;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK22btBvhTriangleMeshShape28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 60;
+	r_g0 = r0;
+	return;
+}
+
+function _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -120;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = heap32[(fp+1)];
+	r4 = sp + -52;
+	r5 = sp + -56;
+	r6 = sp + -60;
+	r7 = sp + -64;
+	r8 = sp + -68;
+	r9 = sp + -72;
+	r10 = sp + -76;
+	r11 = sp + -80;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r8;
+	heap32[(g0+6)] = r9;
+	heap32[(g0+7)] = r10;
+	heap32[(g0+8)] = r11;
+	heap32[(g0+9)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(fp+-20)];
+	r2 = (r1 + -2)|0;
+	if(uint(r2) <uint(2)) //_LBB399_2
+{
+	r2 = heap32[(fp+2)];
+	r4 = heap32[(fp+-17)];
+	r5 = heap32[(fp+-18)];
+	r5 = (r5 * r2)|0;
+	r6 = heap32[(r0+1)];
+	r4 = (r4 + r5)|0;
+	r5 = -6;
+_3: while(true){
+	r7 = 0;
+	r8 = r5 << 1;
+	r7 = (r7 - r8)|0;
+	if(r1 !=3) //_LBB399_5
+{
+	r8 = (r4 - r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+-1)];
+}
+else{
+	r8 = (r4 - r5)|0;
+	r8 = heapU16[(r8+-2)>>1];
+}
+	r9 = heap32[(fp+-16)];
+	r10 = heap32[(fp+-13)];
+	r8 = (r9 * r8)|0;
+	r9 = heap32[(fp+-15)];
+	if(r9 !=0) //_LBB399_8
+{
+	r9 = (r10 + r8)|0;
+	r11 = r6 >> 2;
+	f0 = llvm_readDouble((r9+16));
+	f1 = llvm_readDouble((r9+8));
+	f2 = llvm_readDouble((r10+r8));
+	f0 = f0; //fdtos f0, f0
+	f3 = heapFloat[(r11+3)];
+	f1 = f1; //fdtos f1, f1
+	f4 = heapFloat[(r11+2)];
+	f2 = f2; //fdtos f2, f2
+	f5 = heapFloat[(r11+1)];
+	f0 = f0*f3;
+	f1 = f1*f4;
+	f2 = f2*f5;
+}
+else{
+	r8 = (r10 + r8)|0;
+	r8 = r8 >> 2;
+	r10 = r6 >> 2;
+	f0 = heapFloat[(r8+2)];
+	f1 = heapFloat[(r10+3)];
+	f2 = heapFloat[(r8+1)];
+	f3 = heapFloat[(r10+2)];
+	f4 = heapFloat[(r8)];
+	f5 = heapFloat[(r10+1)];
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = f4*f5;
+}
+	r8 = sp + -48;
+	r9 = r7 << 2;
+	r10 = r7 << 2;
+	r9 = (r8 + r9)|0;
+	r11 = r7 << 2;
+	r10 = (r8 + r10)|0;
+	r9 = r9 >> 2;
+	r7 = r7 << 2;
+	r11 = (r8 + r11)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r9+-4)] = f2;
+	r7 = (r8 + r7)|0;
+	r9 = r11 >> 2;
+	heapFloat[(r10+-3)] = f1;
+	r5 = (r5 + 2)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r9+-2)] = f0;
+	heap32[(r7+-1)] = 0;
+if(!(r5 !=0)) //_LBB399_3
+{
+break _3;
+}
+}
+	r1 = heap32[(r0+2)];
+	r4 = r1 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = heap32[(r0+1)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+else{
+	r0 = _2E_str6187;
+	r1 = _2E_str7188;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 130;
+	_assert(i7);
+}
+}
+
+function _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallback11processNodeEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -120;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	r3 = heap32[(fp+1)];
+	r4 = sp + -52;
+	r5 = sp + -56;
+	r6 = sp + -60;
+	r7 = sp + -64;
+	r8 = sp + -68;
+	r9 = sp + -72;
+	r10 = sp + -76;
+	r11 = sp + -80;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r8;
+	heap32[(g0+6)] = r9;
+	heap32[(g0+7)] = r10;
+	heap32[(g0+8)] = r11;
+	heap32[(g0+9)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(fp+-20)];
+	r2 = (r1 + -2)|0;
+	if(uint(r2) <uint(2)) //_LBB402_2
+{
+	r2 = heap32[(fp+2)];
+	r4 = heap32[(fp+-17)];
+	r5 = heap32[(fp+-18)];
+	r5 = (r5 * r2)|0;
+	r6 = heap32[(r0+1)];
+	r4 = (r4 + r5)|0;
+	r5 = -6;
+_3: while(true){
+	r7 = 0;
+	r8 = r5 << 1;
+	r7 = (r7 - r8)|0;
+	if(r1 !=3) //_LBB402_5
+{
+	r8 = (r4 - r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+-1)];
+}
+else{
+	r8 = (r4 - r5)|0;
+	r8 = heapU16[(r8+-2)>>1];
+}
+	r9 = heap32[(fp+-16)];
+	r10 = heap32[(fp+-13)];
+	r8 = (r9 * r8)|0;
+	r9 = heap32[(fp+-15)];
+	if(r9 !=0) //_LBB402_8
+{
+	r9 = (r10 + r8)|0;
+	r11 = r6 >> 2;
+	f0 = llvm_readDouble((r9+16));
+	f1 = llvm_readDouble((r9+8));
+	f2 = llvm_readDouble((r10+r8));
+	f0 = f0; //fdtos f0, f0
+	f3 = heapFloat[(r11+3)];
+	f1 = f1; //fdtos f1, f1
+	f4 = heapFloat[(r11+2)];
+	f2 = f2; //fdtos f2, f2
+	f5 = heapFloat[(r11+1)];
+	f0 = f0*f3;
+	f1 = f1*f4;
+	f2 = f2*f5;
+}
+else{
+	r8 = (r10 + r8)|0;
+	r8 = r8 >> 2;
+	r10 = r6 >> 2;
+	f0 = heapFloat[(r8+2)];
+	f1 = heapFloat[(r10+3)];
+	f2 = heapFloat[(r8+1)];
+	f3 = heapFloat[(r10+2)];
+	f4 = heapFloat[(r8)];
+	f5 = heapFloat[(r10+1)];
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = f4*f5;
+}
+	r8 = sp + -48;
+	r9 = r7 << 2;
+	r10 = r7 << 2;
+	r9 = (r8 + r9)|0;
+	r11 = r7 << 2;
+	r10 = (r8 + r10)|0;
+	r9 = r9 >> 2;
+	r7 = r7 << 2;
+	r11 = (r8 + r11)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r9+-4)] = f2;
+	r7 = (r8 + r7)|0;
+	r9 = r11 >> 2;
+	heapFloat[(r10+-3)] = f1;
+	r5 = (r5 + 2)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r9+-2)] = f0;
+	heap32[(r7+-1)] = 0;
+if(!(r5 !=0)) //_LBB402_3
+{
+break _3;
+}
+}
+	r1 = heap32[(r0+2)];
+	r4 = r1 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r0 = heap32[(r0+1)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+else{
+	r0 = _2E_str6187;
+	r1 = _2E_str7188;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 199;
+	_assert(i7);
+}
+}
+
+function _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -72;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	r4 = heap32[(fp+1)];
+	r5 = sp + -4;
+	r6 = sp + -8;
+	r7 = sp + -12;
+	r8 = sp + -16;
+	r9 = sp + -20;
+	r10 = sp + -24;
+	r11 = sp + -28;
+	r12 = sp + -32;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r8;
+	heap32[(g0+5)] = r9;
+	heap32[(g0+6)] = r10;
+	heap32[(g0+7)] = r11;
+	heap32[(g0+8)] = r12;
+	heap32[(g0+9)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = heap32[(fp+-8)];
+	r3 = (r2 + -2)|0;
+	if(uint(r3) <uint(2)) //_LBB405_2
+{
+	r3 = heap32[(fp+2)];
+	r5 = heap32[(fp+-5)];
+	r6 = heap32[(fp+-6)];
+	r6 = (r6 * r3)|0;
+	r5 = (r6 + r5)|0;
+	r6 = heap32[(r1+1)];
+	r5 = (r5 + 8)|0;
+	r7 = 0;
+	r8 = r7;
+_3: while(true){
+	r9 = r8 << 1;
+	r10 = (r7 - r9)|0;
+	if(r2 !=3) //_LBB405_5
+{
+	r9 = (r5 - r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+}
+else{
+	r9 = (r5 - r8)|0;
+	r9 = heapU16[(r9+-4)>>1];
+}
+	r11 = heap32[(fp+-4)];
+	r12 = heap32[(fp+-1)];
+	r9 = (r11 * r9)|0;
+	r11 = heap32[(fp+-3)];
+	if(r11 !=0) //_LBB405_8
+{
+	r11 = (r12 + r9)|0;
+	r13 = r6 >> 2;
+	f0 = llvm_readDouble((r11+16));
+	f1 = llvm_readDouble((r11+8));
+	f2 = llvm_readDouble((r12+r9));
+	f0 = f0; //fdtos f0, f0
+	f3 = heapFloat[(r13+3)];
+	f1 = f1; //fdtos f1, f1
+	f4 = heapFloat[(r13+2)];
+	f2 = f2; //fdtos f2, f2
+	f5 = heapFloat[(r13+1)];
+	f0 = f0*f3;
+	f1 = f1*f4;
+	f2 = f2*f5;
+}
+else{
+	r9 = (r12 + r9)|0;
+	r9 = r9 >> 2;
+	r12 = r6 >> 2;
+	f0 = heapFloat[(r9+2)];
+	f1 = heapFloat[(r12+3)];
+	f2 = heapFloat[(r9+1)];
+	f3 = heapFloat[(r12+2)];
+	f4 = heapFloat[(r9)];
+	f5 = heapFloat[(r12+1)];
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = f4*f5;
+}
+	r9 = r10 << 2;
+	r11 = r10 << 2;
+	r9 = (r0 + r9)|0;
+	r12 = r10 << 2;
+	r11 = (r0 + r11)|0;
+	r9 = r9 >> 2;
+	r10 = r10 << 2;
+	r12 = (r0 + r12)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r9+11)] = f2;
+	r9 = (r0 + r10)|0;
+	r10 = r12 >> 2;
+	heapFloat[(r11+12)] = f1;
+	r8 = (r8 + 2)|0;
+	r9 = r9 >> 2;
+	heapFloat[(r10+13)] = f0;
+	heap32[(r9+14)] = 0;
+if(!(r8 !=6)) //_LBB405_3
+{
+break _3;
+}
+}
+	r2 = heap32[(r1+2)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r0 = (r0 + 12)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = heap32[(r1+1)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+else{
+	r0 = _2E_str6187;
+	r1 = _2E_str7188;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 280;
+	_assert(i7);
+}
+}
+
+function _ZNK22btBvhTriangleMeshShape18serializeSingleBvhEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+13)];
+if(!(r1 ==0)) //_LBB406_2
+{
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r2 >> 2;
+	r4 = heap32[(r3)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = r_g0;
+	r4 = heap32[(r0+13)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r6 = r1 >> 2;
+	r5 = heap32[(r5+4)];
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	r0 = heap32[(r0+13)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1213612625;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	return;
+}
+
+function _ZNK22btBvhTriangleMeshShape30serializeSingleTriangleInfoMapEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+14)];
+if(!(r1 ==0)) //_LBB407_2
+{
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r2 >> 2;
+	r4 = heap32[(r3)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = r_g0;
+	r4 = heap32[(r0+14)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r6 = r1 >> 2;
+	r5 = heap32[(r5+3)];
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	r0 = heap32[(r0+14)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1346456916;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+}
+	return;
+}
+
+function _ZNK19btTriangleMeshShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str5186;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 43;
+	_assert(i7);
+}
+
+function _ZNK22btBvhTriangleMeshShape9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r6 = r5 >> 2;
+	heap32[(r6)] = r4;
+if(!(r4 ==0)) //_LBB409_2
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	r2 = r3 >> 2;
+	r3 = heap32[(r2+1)];
+	heap32[(r6+1)] = r3;
+	r3 = heap32[(r2+12)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+14)];
+	r5 = (r5 + 12)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	heap32[(r6+13)] = heap32[(r2+3)];
+	r3 = heap32[(r2+13)];
+	if(r3 ==0) //_LBB409_4
+{
+__label__ = 4;
+}
+else{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+13)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0 & 1;
+	if(r3 ==0) //_LBB409_5
+{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	r4 = heap32[(r2+13)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0;
+	if(r3 ==0) //_LBB409_7
+{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	r4 = heap32[(r2+13)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(r6+10)] = r_g0;
+	heap32[(r6+11)] = 0;
+	r3 = heap32[(r2+13)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+3)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = r_g0;
+	r4 = heap32[(r2+13)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r7 = r3 >> 2;
+	r5 = heap32[(r5+4)];
+	r7 = heap32[(r7+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+5)];
+	r7 = heap32[(r2+13)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1213612625;
+	heap32[(g0+4)] = r7;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+__label__ = 8;
+}
+else{
+	heap32[(r6+10)] = r3;
+	heap32[(r6+11)] = 0;
+__label__ = 8;
+}
+}
+else{
+__label__ = 4;
+}
+}
+if (__label__ == 4){
+	heap32[(r6+10)] = 0;
+	heap32[(r6+11)] = 0;
+}
+	r3 = heap32[(r2+14)];
+	if(r3 ==0) //_LBB409_10
+{
+__label__ = 10;
+}
+else{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+13)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0 & 2;
+	if(r3 ==0) //_LBB409_12
+{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	r4 = heap32[(r2+14)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0;
+	if(r3 ==0) //_LBB409_14
+{
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	r4 = heap32[(r2+14)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(r6+12)] = r_g0;
+	r3 = heap32[(r2+14)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = r_g0;
+	r4 = heap32[(r2+14)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r6 = r3 >> 2;
+	r5 = heap32[(r5+3)];
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	r2 = heap32[(r2+14)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1346456916;
+	heap32[(g0+4)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+__label__ = 11;
+}
+else{
+	heap32[(r6+12)] = r3;
+__label__ = 11;
+}
+}
+else{
+__label__ = 10;
+}
+}
+if (__label__ == 10){
+	heap32[(r6+12)] = 0;
+}
+	r0 = _2E_str8189;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN22btBvhTriangleMeshShape17buildOptimizedBvhEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -72;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+61];
+if(!(r1 ==0)) //_LBB410_3
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+13)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r1+13)];
+if(!(r1 ==0)) //_LBB410_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r3;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = gNumAlignedAllocs;
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1)] = r2;
+	heap32[(g0)] = 191;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB410_5
+{
+	r3 = 0;
+	r4 = (r2 + 4)|0;
+	r3 = (r3 - r4)|0;
+	r3 = r3 & 15;
+	r3 = (r2 + r3)|0;
+	r4 = (r3 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r2;
+	r2 = r4;
+}
+	r3 = r2 >> 2;
+	r4 = 1;
+	heap32[(r3+13)] = 277;
+	heap8[r2+80] = r4;
+	heap32[(r3+19)] = 0;
+	heap32[(r3+17)] = 0;
+	heap32[(r3+18)] = 0;
+	heap8[r2+100] = r4;
+	heap32[(r3+24)] = 0;
+	heap32[(r3+22)] = 0;
+	heap32[(r3+23)] = 0;
+	heap8[r2+120] = r4;
+	heap32[(r3+29)] = 0;
+	heap32[(r3+27)] = 0;
+	heap32[(r3+28)] = 0;
+	heap8[r2+140] = r4;
+	heap32[(r3+34)] = 0;
+	heap32[(r3+32)] = 0;
+	heap32[(r3+33)] = 0;
+	heap32[(r3+36)] = 0;
+	heap8[r2+164] = r4;
+	heap32[(r3+40)] = 0;
+	heap32[(r3+38)] = 0;
+	heap32[(r3+39)] = 0;
+	heap32[(r3+42)] = 0;
+	heap32[(r3+1)] = -8388609;
+	heap32[(r3+2)] = -8388609;
+	heap32[(r3+3)] = -8388609;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = 2139095039;
+	heap32[(r3+6)] = 2139095039;
+	r5 = _ZTV14btOptimizedBvh;
+	heap32[(r3+7)] = 2139095039;
+	r5 = (r5 + 8)|0;
+	heap32[(r3+8)] = 0;
+	r6 = r0 >> 2;
+	heap32[(r3)] = r5;
+	heap32[(r6+13)] = r2;
+	r5 = heap32[(r6+12)];
+	r7 = heapU8[r0+60];
+	heap8[r2+60] = r7;
+	if(r7 ==0) //_LBB410_11
+{
+	r6 = _ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback;
+	r7 = sp + -24;
+	r6 = (r6 + 8)|0;
+	r8 = r7 >> 2;
+	r9 = (r2 + 64)|0;
+	heap32[(fp+-6)] = r6;
+	r6 = sp + -40;
+	heap32[(r8+1)] = r9;
+	r8 = r6 >> 2;
+	heap32[(fp+-10)] = -581039253;
+	heap32[(r8+1)] = -581039253;
+	heap32[(r8+2)] = -581039253;
+	r9 = sp + -56;
+	heap32[(r8+3)] = 0;
+	r8 = r9 >> 2;
+	heap32[(fp+-14)] = 1566444395;
+	heap32[(r8+1)] = 1566444395;
+	heap32[(r8+2)] = 1566444395;
+	r10 = r5 >> 2;
+	heap32[(r8+3)] = 0;
+	r8 = heap32[(r10)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r5 = heap32[(r3+17)];
+	r6 = heap32[(r3+22)];
+	r7 = r5 << 1;
+if(!(r6 >=r7)) //_LBB410_26
+{
+	r8 = heap32[(r3+23)];
+if(!(r8 >=r7)) //_LBB410_26
+{
+	if(r7 !=0) //_LBB410_15
+{
+	r8 = heap32[(r1)];
+	r8 = (r8 + 1)|0;
+	r9 = r5 << 7;
+	heap32[(r1)] = r8;
+	r8 = r9 | 19;
+	heap32[(g0)] = r8;
+	malloc(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB410_17
+{
+	r9 = 0;
+	r10 = (r8 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r8 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r8;
+	r8 = r10;
+}
+}
+else{
+	r8 = 0;
+}
+if(!(r6 <1)) //_LBB410_21
+{
+	r9 = 0;
+_20: while(true){
+	r10 = heap32[(r3+24)];
+	r11 = (r8 + r9)|0;
+	r10 = (r10 + r9)|0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = 64;
+	r6 = (r6 + -1)|0;
+	r9 = (r9 + 64)|0;
+	memcpy(i7);
+if(!(r6 !=0)) //_LBB410_20
+{
+break _20;
+}
+}
+}
+	r6 = heap32[(r3+24)];
+if(!(r6 ==0)) //_LBB410_25
+{
+	r9 = heapU8[r2+100];
+if(!(r9 ==0)) //_LBB410_24
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r10 = (r10 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r9)] = r10;
+	r6 = heap32[(r6+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	heap32[(r3+24)] = 0;
+}
+	r6 = 1;
+	heap8[r2+100] = r6;
+	heap32[(r3+24)] = r8;
+	heap32[(r3+23)] = r7;
+}
+}
+	r6 = _ZTV31btInternalTriangleIndexCallback;
+	r6 = (r6 + 8)|0;
+	heap32[(r3+22)] = r7;
+	heap32[(fp+-6)] = r6;
+}
+else{
+	r7 = (r2 + 4)|0;
+	r8 = (r2 + 20)|0;
+	f0 =                        -1;
+	f1 = heapFloat[(r6+6)];
+	f2 = heapFloat[(r6+5)];
+	f3 = heapFloat[(r6+4)];
+	f3 = f3+f0;
+	f2 = f2+f0;
+	heapFloat[(r3+1)] = f3;
+	f0 = f1+f0;
+	heapFloat[(r3+2)] = f2;
+	heapFloat[(r3+3)] = f0;
+	heap32[(r3+4)] = 0;
+	f1 =                         1;
+	f4 = heapFloat[(r6+10)];
+	f5 = heapFloat[(r6+9)];
+	f6 = heapFloat[(r6+8)];
+	f6 = f6+f1;
+	f5 = f5+f1;
+	heapFloat[(r3+5)] = f6;
+	f1 = f4+f1;
+	heapFloat[(r3+6)] = f5;
+	heapFloat[(r3+7)] = f1;
+	f4 =                     65533;
+	f3 = f6-f3;
+	f2 = f5-f2;
+	f3 = f4/f3;
+	heap32[(r3+8)] = 0;
+	f0 = f1-f0;
+	f1 = f4/f2;
+	heapFloat[(r3+9)] = f3;
+	f0 = f4/f0;
+	heapFloat[(r3+10)] = f1;
+	heapFloat[(r3+11)] = f0;
+	r6 = _ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback;
+	heap32[(r3+12)] = 0;
+	r9 = sp + -16;
+	r6 = (r6 + 8)|0;
+	heap8[r2+60] = r4;
+	r10 = r9 >> 2;
+	r11 = (r2 + 104)|0;
+	heap32[(fp+-4)] = r6;
+	heap32[(r10+1)] = r11;
+	r6 = r5 >> 2;
+	heap32[(r10+2)] = r2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = heap32[(r3+27)];
+	r6 = heap32[(r3+32)];
+	r7 = r5 << 1;
+_31: do {
+if(!(r6 >=r7)) //_LBB410_10
+{
+	r8 = (r2 + 124)|0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r7;
+	r8 = (r7 - r6)|0;
+	r6 = r6 << 4;
+	_ZN20btAlignedObjectArrayI18btQuantizedBvhNodeE7reserveEi(i7);
+_33: while(true){
+	r9 = heap32[(r3+34)];
+	r9 = (r9 + r6)|0;
+	r9 = r9 >> 2;
+	r8 = (r8 + -1)|0;
+	r6 = (r6 + 16)|0;
+	heap32[(r9)] = 0;
+	heap32[(r9+1)] = 0;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 0;
+if(!(r8 !=0)) //_LBB410_9
+{
+break _31;
+}
+}
+}
+} while(0);
+	r6 = _ZTV31btInternalTriangleIndexCallback;
+	r6 = (r6 + 8)|0;
+	heap32[(r3+32)] = r7;
+	heap32[(fp+-4)] = r6;
+}
+	heap32[(r3+14)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r5;
+	_ZN14btQuantizedBvh9buildTreeEii(i7);
+	r5 = heapU8[r2+60];
+if(!(r5 ==0)) //_LBB410_41
+{
+	r5 = heap32[(r3+38)];
+if(!(r5 !=0)) //_LBB410_41
+{
+	r6 = heap32[(r3+39)];
+	if(r6 !=r5) //_LBB410_31
+{
+__label__ = 29;
+}
+else{
+	if(r6 <1) //_LBB410_32
+{
+	r6 = heap32[(r1)];
+	r6 = (r6 + 1)|0;
+	heap32[(r1)] = r6;
+	heap32[(g0)] = 51;
+	malloc(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB410_34
+{
+	r6 = 0;
+	r7 = (r1 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r1 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r1;
+	r1 = r7;
+}
+	r6 = heap32[(r3+40)];
+if(!(r6 ==0)) //_LBB410_39
+{
+	r7 = heapU8[r2+164];
+if(!(r7 ==0)) //_LBB410_38
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r8 = (r8 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r7)] = r8;
+	r6 = heap32[(r6+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	heap32[(r3+40)] = 0;
+}
+	r6 = 1;
+	heap8[r2+164] = r6;
+	heap32[(r3+40)] = r1;
+	heap32[(r3+39)] = 1;
+	r6 = heap32[(r3+38)];
+	r6 = (r6 + 1)|0;
+__label__ = 37;
+}
+else{
+__label__ = 29;
+}
+}
+if (__label__ == 29){
+	r1 = heap32[(r3+40)];
+	r6 = r4;
+}
+	heap32[(r3+38)] = r6;
+	r6 = heap32[(r3+34)];
+	r7 = heapU16[(r6)>>1];
+	r5 = r5 << 5;
+	heap16[(r1+r5)>>1] = r7;
+	r1 = (r1 + r5)|0;
+	r5 = heapU16[(r6+2)>>1];
+	heap16[(r1+2)>>1] = r5;
+	r5 = heapU16[(r6+4)>>1];
+	heap16[(r1+4)>>1] = r5;
+	r5 = heapU16[(r6+6)>>1];
+	heap16[(r1+6)>>1] = r5;
+	r5 = heapU16[(r6+8)>>1];
+	heap16[(r1+8)>>1] = r5;
+	r5 = heapU16[(r6+10)>>1];
+	r6 = r1 >> 2;
+	heap16[(r1+10)>>1] = r5;
+	heap32[(r6+3)] = 0;
+	r1 = heap32[(r3+34)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	r5 = 0;
+	r5 = (r5 - r1)|0;
+	r1 = r1 < 0 ? r5 : r4;
+	heap32[(r6+4)] = r1;
+}
+}
+	r1 = heap32[(r3+38)];
+	heap32[(r3+42)] = r1;
+	r1 = heap32[(r3+29)];
+if(!(r1 ==0)) //_LBB410_45
+{
+	r4 = heapU8[r2+120];
+if(!(r4 ==0)) //_LBB410_44
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r4)] = r5;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r3+29)] = 0;
+}
+	r1 = 1;
+	heap8[r2+120] = r1;
+	heap32[(r3+29)] = 0;
+	heap32[(r3+27)] = 0;
+	heap32[(r3+28)] = 0;
+	r4 = heap32[(r3+19)];
+if(!(r4 ==0)) //_LBB410_49
+{
+	r5 = heapU8[r2+80];
+if(!(r5 ==0)) //_LBB410_48
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r6 = (r6 + 1)|0;
+	r4 = r4 >> 2;
+	heap32[(r5)] = r6;
+	r4 = heap32[(r4+-1)];
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	heap32[(r3+19)] = 0;
+}
+	heap8[r2+80] = r1;
+	heap32[(r3+19)] = 0;
+	heap32[(r3+17)] = 0;
+	heap32[(r3+18)] = 0;
+	heap8[r0+61] = r1;
+	return;
+}
+
+function _ZN22btBvhTriangleMeshShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+7)];
+	heap32[(g0)] = r0;
+	r3 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r3+1)];
+	f1 = f1-f0;
+	f2 = f2-f3;
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r3+2)];
+	f3 = f3-f4;
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f2 = f3*f3;
+	f1 = f1+f2;
+	f2 =   1.1920928955078125e-007;
+if(!(f1 <=f2)) //_LBB411_2
+{
+	r1 = heap32[(r1+12)];
+	r1 = r1 >> 2;
+	heapFloat[(r1+1)] = f0;
+	heap32[(r1+2)] = heap32[(r3+1)];
+	heap32[(r1+3)] = heap32[(r3+2)];
+	heap32[(r1+4)] = heap32[(r3+3)];
+	heap32[(g0)] = r0;
+	_ZN19btTriangleMeshShape15recalcLocalAabbEv(i7);
+	heap32[(g0)] = r0;
+	_ZN22btBvhTriangleMeshShape17buildOptimizedBvhEv(i7);
+}
+	return;
+}
+
+function _ZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -80;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = _ZTVZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback;
+	r2 = sp + -64;
+	r3 = heap32[(r0+12)];
+	r1 = (r1 + 8)|0;
+	r4 = r2 >> 2;
+	heap32[(fp+-16)] = r1;
+	r1 = heap32[(fp+1)];
+	heap32[(r4+1)] = r3;
+	heap32[(r4+2)] = r1;
+	r0 = heap32[(r0+13)];
+	r1 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r3;
+	_ZNK14btQuantizedBvh26reportAabbOverlappingNodexEP21btNodeOverlapCallbackRK9btVector3S4_(i7);
+	return;
+}
+
+function _ZN22btBvhTriangleMeshShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22btBvhTriangleMeshShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+61];
+	if(r1 ==0) //_LBB413_3
+{
+__label__ = 3;
+}
+else{
+	r1 = heap32[(r2+13)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+13)];
+	if(r1 ==0) //_LBB413_3
+{
+__label__ = 3;
+}
+else{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r3 = heap32[(r0)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r0)] = r3;
+	r0 = heap32[(r1+-1)];
+	r1 = _ZTV14btConcaveShape;
+	heap32[(g0)] = r0;
+	r0 = (r1 + 8)|0;
+	free(i7);
+	heap32[(r2)] = r0;
+__label__ = 4;
+}
+}
+if (__label__ == 3){
+	r1 = _ZTV14btConcaveShape;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	if(r0 ==0) //_LBB413_5
+{
+__label__ = 5;
+}
+else{
+__label__ = 4;
+}
+}
+if (__label__ == 4){
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN22btBvhTriangleMeshShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV22btBvhTriangleMeshShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r0 = heapU8[r0+61];
+if(!(r0 ==0)) //_LBB414_3
+{
+	r0 = heap32[(r2+13)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = heap32[(r2+13)];
+if(!(r0 ==0)) //_LBB414_3
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	r0 = _ZTV14btConcaveShape;
+	r0 = (r0 + 8)|0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN14btCapsuleShape9setMarginEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f2 = f_g0;
+	f3 = heapFloat[(r1+9)];
+	f4 = heapFloat[(r1+8)];
+	f5 = heapFloat[(r1+7)];
+	heap32[(r1+11)] = heap32[(fp+1)];
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f6 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f7 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	f2 = f5+f2;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f4+f1;
+	f2 = f2-f_g0;
+	f0 = f3+f0;
+	f1 = f1-f7;
+	heapFloat[(r1+7)] = f2;
+	f0 = f0-f6;
+	heapFloat[(r1+8)] = f1;
+	heapFloat[(r1+9)] = f0;
+	heap32[(r1+10)] = 0;
+	return;
+}
+
+function _ZNK14btCapsuleShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str194;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK14btCapsuleShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+13)];
+	r3 = (r2 + 2)|0;
+	r3 = (r3 % 3)|0;
+	r4 = (r0 + 28)|0;
+	r3 = r3 << 2;
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3)];
+	r3 = sp + -16;
+	r5 = r3 >> 2;
+	heapFloat[(fp+-4)] = f0;
+	r2 = r2 << 2;
+	heapFloat[(r5+1)] = f0;
+	r4 = (r4 + r2)|0;
+	heapFloat[(r5+2)] = f0;
+	r4 = r4 >> 2;
+	heap32[(r5+3)] = 0;
+	r2 = (r3 + r2)|0;
+	f1 = heapFloat[(r4)];
+	r2 = r2 >> 2;
+	f0 = f0+f1;
+	heapFloat[(r2)] = f0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f3 = heapFloat[(fp+-4)];
+	f2 = f3+f_g0;
+	heapFloat[(fp+-4)] = f2;
+	f3 = heapFloat[(r5+1)];
+	f1 = f3+f1;
+	heapFloat[(r5+1)] = f1;
+	f3 = heapFloat[(r5+2)];
+	r0 = heap32[(fp+1)];
+	f0 = f3+f0;
+	r0 = r0 >> 2;
+	heapFloat[(r5+2)] = f0;
+	f3 = heapFloat[(r0+10)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	f4 =                         0;
+	if(f3 <f4) //_LBB418_2
+{
+	f3 = -f3;
+}
+	f5 = heapFloat[(r0+9)];
+	if(f5 <f4) //_LBB418_5
+{
+	f5 = -f5;
+}
+	f6 = heapFloat[(r0+8)];
+	if(f6 <f4) //_LBB418_8
+{
+	f6 = -f6;
+}
+	f7 = heapFloat[(r0+6)];
+	if(f7 <f4) //_LBB418_11
+{
+	f7 = -f7;
+}
+	f8 = heapFloat[(r0+5)];
+	if(f8 <f4) //_LBB418_14
+{
+	f8 = -f8;
+}
+	f9 = heapFloat[(r0+4)];
+	if(f9 <f4) //_LBB418_17
+{
+	f9 = -f9;
+}
+	f10 = heapFloat[(r0+2)];
+	if(f10 <f4) //_LBB418_20
+{
+	f10 = -f10;
+}
+	f11 = heapFloat[(r0+1)];
+	if(f11 <f4) //_LBB418_23
+{
+	f11 = -f11;
+}
+	f12 = heapFloat[(r0)];
+	if(f12 <f4) //_LBB418_26
+{
+	f12 = -f12;
+}
+	f4 = f12*f2;
+	f11 = f11*f1;
+	f9 = f9*f2;
+	f8 = f8*f1;
+	f4 = f4+f11;
+	f10 = f10*f0;
+	f2 = f6*f2;
+	f1 = f5*f1;
+	f5 = f9+f8;
+	f6 = f7*f0;
+	f4 = f4+f10;
+	f7 = heapFloat[(r0+12)];
+	f8 = heapFloat[(r0+13)];
+	f9 = heapFloat[(r0+14)];
+	f5 = f5+f6;
+	r0 = r1 >> 2;
+	f1 = f2+f1;
+	f0 = f3*f0;
+	f2 = f7-f4;
+	f0 = f1+f0;
+	f1 = f8-f5;
+	heapFloat[(r0)] = f2;
+	f2 = f9-f0;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f2;
+	r1 = r2 >> 2;
+	f1 = f7+f4;
+	heap32[(r0+3)] = 0;
+	f2 = f8+f5;
+	heapFloat[(r1)] = f1;
+	f0 = f9+f0;
+	heapFloat[(r1+1)] = f2;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+
+function _ZNK14btCapsuleShape28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 60;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK14btCapsuleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 <1)) //_LBB420_9
+{
+	r1 = heap32[(fp)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+13)];
+	r4 = (r3 + 2)|0;
+	r4 = (r4 % 3)|0;
+	r4 = r4 << 2;
+	r4 = (r1 + r4)|0;
+	r4 = r4 >> 2;
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+2)];
+	f0 = heapFloat[(r4+7)];
+	r0 = (r0 + -1)|0;
+	r4 = (r5 + 8)|0;
+	r5 = (r6 + 8)|0;
+_3: while(true){
+	r6 = sp + -16;
+	heap32[(fp+-4)] = 0;
+	r7 = r6 >> 2;
+	r3 = r3 << 2;
+	heap32[(r7+1)] = 0;
+	r6 = (r6 + r3)|0;
+	r3 = (r1 + r3)|0;
+	heap32[(r7+2)] = 0;
+	r6 = r6 >> 2;
+	r3 = r3 >> 2;
+	heap32[(r7+3)] = 0;
+	heap32[(r6)] = heap32[(r3+7)];
+	r3 = heap32[(r2)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+11)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r4 >> 2;
+	f2 = heapFloat[(r3+-1)];
+	f3 = heapFloat[(r2+4)];
+	f4 = heapFloat[(r3+-2)];
+	f5 = heapFloat[(r2+3)];
+	f6 = heapFloat[(r3)];
+	f7 = heapFloat[(r2+5)];
+	f3 = f2*f3;
+	f5 = f4*f5;
+	f7 = f6*f7;
+	f8 = heapFloat[(r7+1)];
+	f3 = f3*f0;
+	f9 = heapFloat[(fp+-4)];
+	f5 = f5*f0;
+	f10 = heapFloat[(r7+2)];
+	f7 = f7*f0;
+	f3 = f8+f3;
+	f8 = f2*f_g0;
+	f5 = f9+f5;
+	f9 = f4*f_g0;
+	f3 = f3-f8;
+	f5 = f5-f9;
+	f7 = f10+f7;
+	f1 = f6*f_g0;
+	f1 = f7-f1;
+	f4 = f4*f5;
+	f2 = f2*f3;
+	f2 = f4+f2;
+	f4 = f6*f1;
+	f2 = f2+f4;
+	f4 =       -999999984306749440;
+	if(f2 >f4) //_LBB420_4
+{
+	r6 = r5 >> 2;
+	heapFloat[(r6+-2)] = f5;
+	heapFloat[(r6+-1)] = f3;
+	heapFloat[(r6)] = f1;
+	heap32[(r6+1)] = 0;
+	f4 = f2;
+}
+	r6 = sp + -32;
+	heap32[(fp+-8)] = 0;
+	r7 = r6 >> 2;
+	heap32[(r7+1)] = 0;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	r8 = heap32[(r2+13)];
+	r8 = r8 << 2;
+	r9 = (r1 + r8)|0;
+	r9 = r9 >> 2;
+	f1 = heapFloat[(r9+7)];
+	r6 = (r6 + r8)|0;
+	r6 = r6 >> 2;
+	f1 = -f1;
+	heapFloat[(r6)] = f1;
+	r6 = heap32[(r2)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+11)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	f2 = heapFloat[(r3+-1)];
+	f3 = heapFloat[(r2+4)];
+	f5 = heapFloat[(r3+-2)];
+	f6 = heapFloat[(r2+3)];
+	f7 = heapFloat[(r3)];
+	f8 = heapFloat[(r2+5)];
+	f3 = f2*f3;
+	f6 = f5*f6;
+	f8 = f7*f8;
+	f9 = heapFloat[(r7+1)];
+	f3 = f3*f0;
+	f10 = heapFloat[(fp+-8)];
+	f6 = f6*f0;
+	f11 = heapFloat[(r7+2)];
+	f8 = f8*f0;
+	f3 = f9+f3;
+	f9 = f2*f_g0;
+	f6 = f10+f6;
+	f10 = f5*f_g0;
+	f3 = f3-f9;
+	f6 = f6-f10;
+	f8 = f11+f8;
+	f1 = f7*f_g0;
+	f1 = f8-f1;
+	f5 = f5*f6;
+	f2 = f2*f3;
+	f2 = f5+f2;
+	f5 = f7*f1;
+	f2 = f2+f5;
+if(!(f2 <=f4)) //_LBB420_7
+{
+	r3 = r5 >> 2;
+	heapFloat[(r3+-2)] = f6;
+	heapFloat[(r3+-1)] = f3;
+	heapFloat[(r3)] = f1;
+	heap32[(r3+1)] = 0;
+}
+	if(r0 ==0) //_LBB420_9
+{
+break _3;
+}
+else{
+	r3 = heap32[(r2+13)];
+	r0 = (r0 + -1)|0;
+	r4 = (r4 + 16)|0;
+	r5 = (r5 + 16)|0;
+continue _3;
+}
+}
+}
+	return;
+}
+
+function _ZNK14btCapsuleShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+13)];
+	r2 = (r1 + 2)|0;
+	r2 = (r2 % 3)|0;
+	r0 = (r0 + 28)|0;
+	r2 = r2 << 2;
+	r2 = (r0 + r2)|0;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2)];
+	r2 = sp + -16;
+	r3 = r2 >> 2;
+	heapFloat[(fp+-4)] = f0;
+	r1 = r1 << 2;
+	heapFloat[(r3+1)] = f0;
+	r2 = (r2 + r1)|0;
+	r0 = (r0 + r1)|0;
+	heapFloat[(r3+2)] = f0;
+	r1 = r2 >> 2;
+	heap32[(r3+3)] = 0;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r0)];
+	f0 = f0+f1;
+	heapFloat[(r1)] = f0;
+	f0 =      0.039999999105930328;
+	f1 = heapFloat[(r3+1)];
+	f2 = heapFloat[(r3+2)];
+	f3 = heapFloat[(fp+-4)];
+	f1 = f1+f0;
+	f2 = f2+f0;
+	f0 = f3+f0;
+	f1 = f1+f1;
+	f2 = f2+f2;
+	f0 = f0+f0;
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f3 = heapFloat[(fp+1)];
+	f4 =      0.083333328366279602;
+	f0 = f0*f0;
+	r0 = heap32[(fp+2)];
+	f5 = f1+f2;
+	f3 = f3*f4;
+	f2 = f0+f2;
+	r0 = r0 >> 2;
+	f4 = f5*f3;
+	f0 = f0+f1;
+	f1 = f2*f3;
+	heapFloat[(r0)] = f4;
+	f0 = f0*f3;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f0;
+	return;
+}
+
+function _ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str4198;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 110;
+	_assert(i7);
+}
+
+function _ZNK14btCapsuleShape9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+if(!(r4 ==0)) //_LBB423_2
+{
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	r0 = r3 >> 2;
+	r1 = heap32[(r0+1)];
+	heap32[(r5+1)] = r1;
+	heap32[(r5+7)] = heap32[(r0+7)];
+	heap32[(r5+8)] = heap32[(r0+8)];
+	heap32[(r5+9)] = heap32[(r0+9)];
+	heap32[(r5+10)] = heap32[(r0+10)];
+	heap32[(r5+3)] = heap32[(r0+3)];
+	heap32[(r5+4)] = heap32[(r0+4)];
+	heap32[(r5+5)] = heap32[(r0+5)];
+	heap32[(r5+6)] = heap32[(r0+6)];
+	heap32[(r5+11)] = heap32[(r0+11)];
+	r0 = heap32[(r0+13)];
+	heap32[(r5+13)] = r0;
+	r0 = _2E_str6199;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN14btCapsuleShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f2 = f_g0;
+	r0 = heap32[(fp+1)];
+	f3 = heapFloat[(r1+9)];
+	f4 = heapFloat[(r1+8)];
+	f5 = heapFloat[(r1+7)];
+	r0 = r0 >> 2;
+	f3 = f3+f0;
+	f6 = heapFloat[(r1+5)];
+	f4 = f4+f1;
+	f7 = heapFloat[(r1+4)];
+	f5 = f5+f2;
+	f8 = heapFloat[(r1+3)];
+	f9 = heapFloat[(r0+2)];
+	f3 = f3/f6;
+	f4 = f4/f7;
+	f5 = f5/f8;
+	f6 =                         0;
+	if(f9 <f6) //_LBB424_2
+{
+	f9 = -f9;
+}
+	f7 = heapFloat[(r0+1)];
+	if(f7 <f6) //_LBB424_5
+{
+	f7 = -f7;
+}
+	f8 = heapFloat[(r0)];
+	if(f8 <f6) //_LBB424_8
+{
+	f8 = -f8;
+}
+	heapFloat[(r1+3)] = f8;
+	heapFloat[(r1+4)] = f7;
+	heapFloat[(r1+5)] = f9;
+	f5 = f5*f8;
+	f4 = f4*f7;
+	f2 = f5-f2;
+	heap32[(r1+6)] = 0;
+	f3 = f3*f9;
+	f1 = f4-f1;
+	heapFloat[(r1+7)] = f2;
+	f0 = f3-f0;
+	heapFloat[(r1+8)] = f1;
+	heapFloat[(r1+9)] = f0;
+	heap32[(r1+10)] = 0;
+	return;
+}
+
+function _ZN14btCapsuleShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB425_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN14btCapsuleShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZNK14btCapsuleShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	r1 = heap32[(fp+2)];
+	heap32[(r0+2)] = 0;
+	r1 = r1 >> 2;
+	heap32[(r0+3)] = 0;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r1+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	r1 = heap32[(fp+1)];
+	f4 =   9.9999997473787516e-005;
+	if(f3 >=f4) //_LBB427_2
+{
+	heapFloat[(g0)] = f3;
+	f3 =                         1;
+	sqrtf(i7);
+	f3 = f3/f_g0;
+	f0 = f0*f3;
+	f1 = f1*f3;
+	f2 = f2*f3;
+}
+else{
+	f0 =                         1;
+	f1 =                         0;
+	f2 = f1;
+}
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+13)];
+	r4 = (r3 + 2)|0;
+	r4 = (r4 % 3)|0;
+	r5 = (r1 + 28)|0;
+	r4 = r4 << 2;
+	r4 = (r5 + r4)|0;
+	r4 = r4 >> 2;
+	f3 = heapFloat[(r4)];
+	r4 = sp + -16;
+	heap32[(fp+-4)] = 0;
+	r6 = r4 >> 2;
+	r3 = r3 << 2;
+	heap32[(r6+1)] = 0;
+	r4 = (r4 + r3)|0;
+	r3 = (r5 + r3)|0;
+	heap32[(r6+2)] = 0;
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	heap32[(r6+3)] = 0;
+	heap32[(r4)] = heap32[(r3)];
+	r3 = heap32[(r2)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+11)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f5 = heapFloat[(r2+4)];
+	f6 = heapFloat[(r2+3)];
+	f7 = heapFloat[(r2+5)];
+	f5 = f1*f5;
+	f6 = f0*f6;
+	f7 = f2*f7;
+	f8 = heapFloat[(r6+1)];
+	f5 = f5*f3;
+	f9 = heapFloat[(fp+-4)];
+	f6 = f6*f3;
+	f10 = heapFloat[(r6+2)];
+	f7 = f7*f3;
+	f5 = f8+f5;
+	f8 = f1*f_g0;
+	f6 = f9+f6;
+	f9 = f0*f_g0;
+	f5 = f5-f8;
+	f6 = f6-f9;
+	f7 = f10+f7;
+	f4 = f2*f_g0;
+	f4 = f7-f4;
+	f7 = f0*f6;
+	f8 = f1*f5;
+	f7 = f7+f8;
+	f8 = f2*f4;
+	f7 = f7+f8;
+	f8 =       -999999984306749440;
+	if(f7 >f8) //_LBB427_5
+{
+	heapFloat[(r0)] = f6;
+	heapFloat[(r0+1)] = f5;
+	heapFloat[(r0+2)] = f4;
+	heap32[(r0+3)] = 0;
+	f8 = f7;
+}
+	r3 = sp + -32;
+	heap32[(fp+-8)] = 0;
+	r4 = r3 >> 2;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	r5 = heap32[(r2+13)];
+	r5 = r5 << 2;
+	r6 = (r1 + r5)|0;
+	r6 = r6 >> 2;
+	f4 = heapFloat[(r6+7)];
+	r3 = (r3 + r5)|0;
+	r3 = r3 >> 2;
+	f4 = -f4;
+	heapFloat[(r3)] = f4;
+	r3 = heap32[(r2)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+11)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f5 = heapFloat[(r2+4)];
+	f6 = heapFloat[(r2+3)];
+	f7 = heapFloat[(r2+5)];
+	f5 = f1*f5;
+	f6 = f0*f6;
+	f7 = f2*f7;
+	f9 = heapFloat[(r4+1)];
+	f5 = f5*f3;
+	f10 = heapFloat[(fp+-8)];
+	f6 = f6*f3;
+	f11 = heapFloat[(r4+2)];
+	f3 = f7*f3;
+	f5 = f9+f5;
+	f7 = f1*f_g0;
+	f6 = f10+f6;
+	f9 = f0*f_g0;
+	f5 = f5-f7;
+	f6 = f6-f9;
+	f3 = f11+f3;
+	f4 = f2*f_g0;
+	f3 = f3-f4;
+	f0 = f0*f6;
+	f1 = f1*f5;
+	f0 = f0+f1;
+	f1 = f2*f3;
+	f0 = f0+f1;
+if(!(f0 <=f8)) //_LBB427_8
+{
+	heapFloat[(r0)] = f6;
+	heapFloat[(r0+1)] = f5;
+	heapFloat[(r0+2)] = f3;
+	heap32[(r0+3)] = 0;
+}
+	return;
+}
+
+function _ZNK16btCollisionShape28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 12;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btCollisionShape27getContactBreakingThresholdEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f1 = heapFloat[(fp+1)];
+	f0 = f_g0*f1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZNK16btCollisionShape9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+if(!(r4 ==0)) //_LBB430_2
+{
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	r0 = r3 >> 2;
+	r0 = heap32[(r0+1)];
+	heap32[(r5+1)] = r0;
+	r0 = _2E_str200;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r0;
+	r3 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r4 = r3 >> 2;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r2 = r_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r5 = r2 >> 2;
+	r1 = heap32[(r1+13)];
+	r5 = heap32[(r5+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+5)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1346455635;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	return;
+}
+
+function _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = sp + -64;
+	r1 = r0 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+5)] = 1065353216;
+	heap32[(r1+6)] = 0;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+8)] = 0;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+10)] = 1065353216;
+	heap32[(r1+11)] = 0;
+	heap32[(r1+12)] = 0;
+	heap32[(r1+13)] = 0;
+	r2 = heap32[(fp)];
+	heap32[(r1+14)] = 0;
+	r3 = r2 >> 2;
+	heap32[(r1+15)] = 0;
+	r1 = heap32[(r3)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+2)];
+	r3 = sp + -96;
+	r4 = sp + -80;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r3 >> 2;
+	r1 = r4 >> 2;
+	f0 = heapFloat[(r0+1)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(fp+-24)];
+	f3 = heapFloat[(fp+-20)];
+	f2 = f2-f3;
+	f0 = f0-f1;
+	f1 = heapFloat[(r0+2)];
+	f3 = heapFloat[(r1+2)];
+	f1 = f1-f3;
+	f2 = f2*f2;
+	f0 = f0*f0;
+	f0 = f2+f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	r2 = heap32[(fp+2)];
+	f0 =                       0.5;
+	sqrtf(i7);
+	r2 = r2 >> 2;
+	f1 = f_g0*f0;
+	heapFloat[(r2)] = f1;
+	f1 = heapFloat[(fp+-20)];
+	f2 = heapFloat[(fp+-24)];
+	r2 = heap32[(fp+1)];
+	f1 = f1+f2;
+	f2 = heapFloat[(r1+2)];
+	f3 = heapFloat[(r0+2)];
+	f4 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r0+1)];
+	f4 = f4+f5;
+	r0 = r2 >> 2;
+	f1 = f1*f0;
+	f2 = f2+f3;
+	f3 = f4*f0;
+	heapFloat[(r0)] = f1;
+	f0 = f2*f0;
+	heapFloat[(r0+1)] = f3;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK16btCollisionShape20getAngularMotionDiscEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	r2 = sp + -16;
+	r3 = sp + -20;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r2 >> 2;
+	f0 = heapFloat[(fp+-4)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+2)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 = heapFloat[(fp+-5)];
+	f0 = f_g0+f1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZNK16btCollisionShape21calculateTemporalAabbERK11btTransformRK9btVector3S5_fRS3_S6_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+2)];
+	r3 = heap32[(fp+5)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	r5 = heap32[(fp+2)];
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r3 >> 2;
+	r3 = r4 >> 2;
+	r4 = r5 >> 2;
+	f0 = heapFloat[(r4)];
+	r5 = heap32[(fp+3)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r3)];
+	f5 = heapFloat[(r3+1)];
+	f6 = heapFloat[(r3+2)];
+	f7 = heapFloat[(r4+2)];
+	f8 = heapFloat[(r4+1)];
+	f9 =                         0;
+	if(f0 <=f9) //_LBB434_2
+{
+	f4 = f0+f4;
+}
+else{
+	f1 = f0+f1;
+}
+	if(f8 <=f9) //_LBB434_5
+{
+	f5 = f8+f5;
+}
+else{
+	f2 = f8+f2;
+}
+	if(f7 <=f9) //_LBB434_8
+{
+	f6 = f7+f6;
+}
+else{
+	f3 = f7+f3;
+}
+	r4 = r5 >> 2;
+	f0 = heapFloat[(r4)];
+	f7 = heapFloat[(r4+1)];
+	f8 = heapFloat[(r4+2)];
+	f0 = f0*f0;
+	f7 = f7*f7;
+	f0 = f0+f7;
+	f7 = f8*f8;
+	f0 = f0+f7;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	heapFloat[(r3)] = f4;
+	heapFloat[(r3+1)] = f5;
+	heapFloat[(r3+2)] = f6;
+	heap32[(r3+3)] = 0;
+	heapFloat[(r2)] = f1;
+	heapFloat[(r2+1)] = f2;
+	heapFloat[(r2+2)] = f3;
+	heap32[(r2+3)] = 0;
+	f0 = f0*f_g0;
+	f1 = heapFloat[(r3)];
+	f1 = f1-f0;
+	heapFloat[(r3)] = f1;
+	f1 = heapFloat[(r3+1)];
+	f1 = f1-f0;
+	heapFloat[(r3+1)] = f1;
+	f1 = heapFloat[(r3+2)];
+	f1 = f1-f0;
+	heapFloat[(r3+2)] = f1;
+	f1 = heapFloat[(r2)];
+	f1 = f1+f0;
+	heapFloat[(r2)] = f1;
+	f1 = heapFloat[(r2+1)];
+	f1 = f1+f0;
+	heapFloat[(r2+1)] = f1;
+	f1 = heapFloat[(r2+2)];
+	f0 = f1+f0;
+	heapFloat[(r2+2)] = f0;
+	return;
+}
+
+function _ZN14btConcaveShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btConcaveShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN14btConcaveShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btConcaveShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK17btConvexHullShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str219;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btConvexHullShape28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 68;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btConvexHullShape12getNumPlanesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btConvexHullShape9getVertexEiR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+25)];
+	r1 = r1 << 4;
+	r1 = (r2 + r1)|0;
+	r1 = r1 >> 2;
+	r2 = heap32[(fp+2)];
+	f0 = heapFloat[(r1+2)];
+	f1 = heapFloat[(r0+5)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r0+4)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r0+3)];
+	r0 = r2 >> 2;
+	f4 = f4*f5;
+	f2 = f2*f3;
+	heapFloat[(r0)] = f4;
+	f0 = f0*f1;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK17btConvexHullShape7getEdgeEiR9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+23)];
+	r3 = (r1 % r2)|0;
+	r4 = heap32[(r0+25)];
+	r3 = r3 << 4;
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	r4 = heap32[(fp+2)];
+	f0 = heapFloat[(r3+2)];
+	f1 = heapFloat[(r0+5)];
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r0+4)];
+	f4 = heapFloat[(r3)];
+	f5 = heapFloat[(r0+3)];
+	r3 = r4 >> 2;
+	f4 = f4*f5;
+	f2 = f2*f3;
+	heapFloat[(r3)] = f4;
+	f0 = f0*f1;
+	heapFloat[(r3+1)] = f2;
+	r1 = (r1 + 1)|0;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	r1 = (r1 % r2)|0;
+	r2 = heap32[(r0+25)];
+	r1 = r1 << 4;
+	r1 = (r2 + r1)|0;
+	r1 = r1 >> 2;
+	r2 = heap32[(fp+3)];
+	f0 = heapFloat[(r1+2)];
+	f1 = heapFloat[(r0+5)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r0+4)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r0+3)];
+	r0 = r2 >> 2;
+	f4 = f4*f5;
+	f2 = f2*f3;
+	heapFloat[(r0)] = f4;
+	f0 = f0*f1;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK17btConvexHullShape11getNumEdgesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+23)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btConvexHullShape14getNumVerticesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+23)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btConvexHullShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp+2)];
+if(!(r0 <1)) //_LBB444_3
+{
+	r2 = (r1 + 12)|0;
+	r3 = r0;
+_3: while(true){
+	r3 = (r3 + -1)|0;
+	r4 = (r2 + 16)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = -581039253;
+	r2 = r4;
+	if(r3 !=0) //_LBB444_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r2 = heap32[(fp)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+23)];
+_6: do {
+if(!(r3 <1)) //_LBB444_11
+{
+	r3 = heap32[(fp+1)];
+	r1 = (r1 + 8)|0;
+	r3 = (r3 + 8)|0;
+	r4 = 0;
+_8: while(true){
+if(!(r0 <1)) //_LBB444_10
+{
+	r5 = heap32[(r2+25)];
+	r6 = r4 << 4;
+	r5 = (r5 + r6)|0;
+	r5 = r5 >> 2;
+	f0 = heapFloat[(r5+2)];
+	f1 = heapFloat[(r2+5)];
+	f2 = heapFloat[(r5+1)];
+	f3 = heapFloat[(r2+4)];
+	f4 = heapFloat[(r5)];
+	f5 = heapFloat[(r2+3)];
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = f4*f5;
+	r5 = r3;
+	r6 = r1;
+	r7 = r0;
+_12: while(true){
+	r8 = r5 >> 2;
+	f3 = heapFloat[(r8+-2)];
+	f4 = heapFloat[(r8+-1)];
+	f3 = f3*f2;
+	f4 = f4*f1;
+	f5 = heapFloat[(r8)];
+	f3 = f3+f4;
+	f4 = f5*f0;
+	r8 = r6 >> 2;
+	f3 = f3+f4;
+	f4 = heapFloat[(r8+1)];
+if(!(f4 >=f3)) //_LBB444_9
+{
+	heapFloat[(r8+-2)] = f2;
+	heapFloat[(r8+-1)] = f1;
+	heapFloat[(r8)] = f0;
+	heapFloat[(r8+1)] = f3;
+}
+	r7 = (r7 + -1)|0;
+	r6 = (r6 + 16)|0;
+	r5 = (r5 + 16)|0;
+if(!(r7 !=0)) //_LBB444_7
+{
+break _12;
+}
+}
+}
+	r4 = (r4 + 1)|0;
+	r5 = heap32[(r2+23)];
+	if(r5 >r4) //_LBB444_5
+{
+continue _8;
+}
+else{
+break _6;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZNK17btConvexHullShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	r1 = heap32[(fp+1)];
+	heap32[(r0+2)] = 0;
+	r1 = r1 >> 2;
+	heap32[(r0+3)] = 0;
+	r2 = heap32[(r1+23)];
+if(!(r2 <1)) //_LBB445_6
+{
+	r3 = heap32[(fp+2)];
+	r3 = r3 >> 2;
+	r4 = heap32[(r1+25)];
+	f0 = heapFloat[(r1+5)];
+	f1 = heapFloat[(r1+4)];
+	f2 = heapFloat[(r1+3)];
+	f3 = heapFloat[(r3)];
+	f4 = heapFloat[(r3+1)];
+	f5 = heapFloat[(r3+2)];
+	r1 = 0;
+	f6 =       -999999984306749440;
+_3: while(true){
+	r3 = r1 << 4;
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	f7 = heapFloat[(r3+1)];
+	f8 = heapFloat[(r3)];
+	f7 = f7*f1;
+	f8 = f8*f2;
+	f9 = heapFloat[(r3+2)];
+	f9 = f9*f0;
+	f10 = f3*f8;
+	f11 = f4*f7;
+	f10 = f10+f11;
+	f11 = f5*f9;
+	f10 = f10+f11;
+	if(f10 >f6) //_LBB445_4
+{
+	heapFloat[(r0)] = f8;
+	heapFloat[(r0+1)] = f7;
+	heapFloat[(r0+2)] = f9;
+	heap32[(r0+3)] = 0;
+	f6 = f10;
+}
+	r1 = (r1 + 1)|0;
+	if(r1 <r2) //_LBB445_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZNK17btConvexHullShape8isInsideERK9btVector3f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str3222;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 173;
+	_assert(i7);
+}
+
+function _ZNK17btConvexHullShape8getPlaneER9btVector3S1_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str3222;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 167;
+	_assert(i7);
+}
+
+function _ZN17btConvexHullShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btConvexHullShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+25)];
+if(!(r1 ==0)) //_LBB448_4
+{
+	r3 = heapU8[r0+104];
+if(!(r3 ==0)) //_LBB448_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+25)] = 0;
+}
+	r1 = 1;
+	heap8[r0+104] = r1;
+	heap32[(r2+25)] = 0;
+	r1 = _ZTV13btConvexShape;
+	heap32[(r2+23)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+24)] = 0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB448_6
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN17btConvexHullShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btConvexHullShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+25)];
+if(!(r1 ==0)) //_LBB449_4
+{
+	r3 = heapU8[r0+104];
+if(!(r3 ==0)) //_LBB449_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+25)] = 0;
+}
+	r1 = 1;
+	heap8[r0+104] = r1;
+	heap32[(r2+25)] = 0;
+	r0 = _ZTV13btConvexShape;
+	heap32[(r2+23)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r2+24)] = 0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZN17btConvexHullShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r2+3)] = heap32[(r1)];
+	heap32[(r2+4)] = heap32[(r1+1)];
+	heap32[(r2+5)] = heap32[(r1+2)];
+	heap32[(r2+6)] = heap32[(r1+3)];
+	heap32[(g0)] = r0;
+	_ZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEv(i7);
+	return;
+}
+
+function _ZNK17btConvexHullShape9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+if(!(r4 ==0)) //_LBB451_2
+{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+	r2 = r3 >> 2;
+	r3 = heap32[(r2+1)];
+	heap32[(r5+1)] = r3;
+	heap32[(r5+7)] = heap32[(r2+7)];
+	heap32[(r5+8)] = heap32[(r2+8)];
+	heap32[(r5+9)] = heap32[(r2+9)];
+	heap32[(r5+10)] = heap32[(r2+10)];
+	heap32[(r5+3)] = heap32[(r2+3)];
+	heap32[(r5+4)] = heap32[(r2+4)];
+	heap32[(r5+5)] = heap32[(r2+5)];
+	heap32[(r5+6)] = heap32[(r2+6)];
+	heap32[(r5+11)] = heap32[(r2+11)];
+	r3 = heap32[(r2+23)];
+	heap32[(r5+15)] = r3;
+	if(r3 ==0) //_LBB451_7
+{
+	heap32[(r5+13)] = 0;
+	heap32[(r5+14)] = 0;
+	r0 = _2E_str6224;
+	r_g0 = r0;
+	return;
+}
+else{
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	r6 = heap32[(r2+25)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	heap32[(r5+13)] = r_g0;
+	heap32[(r5+14)] = 0;
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 16;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = r_g0;
+if(!(r3 <1)) //_LBB451_6
+{
+	r4 = r5 >> 2;
+	r4 = heap32[(r4+2)];
+	r6 = 0;
+_9: while(true){
+	r7 = r6 << 4;
+	r8 = heap32[(r2+25)];
+	r9 = (r4 + r7)|0;
+	r7 = (r8 + r7)|0;
+	r8 = r9 >> 2;
+	r7 = r7 >> 2;
+	heap32[(r8)] = heap32[(r7)];
+	heap32[(r8+1)] = heap32[(r7+1)];
+	r6 = (r6 + 1)|0;
+	heap32[(r8+2)] = heap32[(r7+2)];
+	heap32[(r8+3)] = heap32[(r7+3)];
+if(!(r3 !=r6)) //_LBB451_5
+{
+break _9;
+}
+}
+}
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	r2 = heap32[(r2+25)];
+	r3 = _2E_str5223;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r5 = _2E_str6224;
+	r_g0 = r5;
+	return;
+}
+}
+
+function _ZNK17btConvexHullShape24localGetSupportingVertexERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+16)];
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB452_2
+{
+	r2 = r4 >> 2;
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r2+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 =   1.4210854715202004e-014;
+	f5 =                        -1;
+	f0 = f3 < f4 ? f5 : f0;
+	f1 = f3 < f4 ? f5 : f1;
+	f2 = f3 < f4 ? f5 : f2;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	f4 =                         1;
+	f3 = f4/f_g0;
+	heap32[(g0)] = r0;
+	r0 = r3 >> 2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f0*f3;
+	f0 = f0*f_g0;
+	f5 = heapFloat[(r0)];
+	f0 = f5+f0;
+	f1 = f1*f3;
+	heapFloat[(r0)] = f0;
+	f0 = f1*f_g0;
+	f1 = heapFloat[(r0+1)];
+	f0 = f1+f0;
+	f1 = f2*f3;
+	heapFloat[(r0+1)] = f0;
+	f0 = f1*f_g0;
+	f1 = heapFloat[(r0+2)];
+	f0 = f1+f0;
+	heapFloat[(r0+2)] = f0;
+}
+	return;
+}
+
+function _ZN17btConvexHullShape8addPointERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+24)];
+	r3 = heap32[(r1+23)];
+	r4 = heap32[(fp+1)];
+	if(r2 ==r3) //_LBB453_2
+{
+	r5 = 1;
+	r6 = r3 << 1;
+	r6 = r3 == 0 ? r5 : r6;
+if(!(r2 >=r6)) //_LBB453_1
+{
+	if(r6 !=0) //_LBB453_5
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r7 = heap32[(r2)];
+	r8 = r6 << 4;
+	r7 = (r7 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r7;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB453_7
+{
+	r7 = 0;
+	r8 = (r2 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r2 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r7 = (r0 + 100)|0;
+	if(r3 <1) //_LBB453_10
+{
+	r8 = r7 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_12: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 4;
+	r11 = (r2 + r10)|0;
+	r10 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = r10 >> 2;
+	heap32[(r11)] = heap32[(r10)];
+	heap32[(r11+1)] = heap32[(r10+1)];
+	r8 = (r8 + 1)|0;
+	heap32[(r11+2)] = heap32[(r10+2)];
+	heap32[(r11+3)] = heap32[(r10+3)];
+if(!(r3 !=r8)) //_LBB453_11
+{
+break _12;
+}
+}
+	r7 = (r0 + 100)|0;
+}
+	if(r9 !=0) //_LBB453_15
+{
+	r8 = heapU8[r0+104];
+	if(r8 !=0) //_LBB453_17
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r8 = heap32[(r3)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r3)] = r8;
+	r3 = heap32[(r9+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+	r3 = heap32[(r1+23)];
+}
+	r8 = r7 >> 2;
+	heap32[(r8)] = 0;
+}
+	r7 = r7 >> 2;
+	heap8[r0+104] = r5;
+	heap32[(r7)] = r2;
+	heap32[(r1+24)] = r6;
+}
+}
+	r2 = r3 << 4;
+	r3 = heap32[(r1+25)];
+	r2 = (r3 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = r4 >> 2;
+	heap32[(r2)] = heap32[(r3)];
+	heap32[(r2+1)] = heap32[(r3+1)];
+	heap32[(r2+2)] = heap32[(r3+2)];
+	heap32[(r2+3)] = heap32[(r3+3)];
+	r2 = heap32[(r1+23)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+23)] = r2;
+	heap32[(g0)] = r0;
+	_ZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEv(i7);
+	return;
+}
+
+function _ZN20btAlignedObjectArrayI9btVector3E6resizeEiRKS0_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(fp+1)];
+_1: do {
+if(!(r2 >r3)) //_LBB454_20
+{
+if(!(r2 >=r3)) //_LBB454_20
+{
+	r4 = heap32[(r1+2)];
+if(!(r4 >=r3)) //_LBB454_18
+{
+	if(r3 !=0) //_LBB454_5
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = r3 << 4;
+	r5 = (r5 + 1)|0;
+	r6 = r6 | 3;
+	heap32[(r4)] = r5;
+	r4 = (r6 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB454_7
+{
+	r5 = 0;
+	r6 = (r4 + 4)|0;
+	r5 = (r5 - r6)|0;
+	r5 = r5 & 15;
+	r5 = (r4 + r5)|0;
+	r6 = (r5 + 4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = r4;
+	r4 = r6;
+}
+}
+else{
+	r4 = 0;
+}
+	r5 = (r0 + 12)|0;
+	if(r2 <1) //_LBB454_10
+{
+	r6 = r5 >> 2;
+	r7 = heap32[(r6)];
+}
+else{
+	r6 = 0;
+_14: while(true){
+	r7 = r5 >> 2;
+	r7 = heap32[(r7)];
+	r8 = r6 << 4;
+	r9 = (r4 + r8)|0;
+	r8 = (r7 + r8)|0;
+	r9 = r9 >> 2;
+	r8 = r8 >> 2;
+	heap32[(r9)] = heap32[(r8)];
+	heap32[(r9+1)] = heap32[(r8+1)];
+	r6 = (r6 + 1)|0;
+	heap32[(r9+2)] = heap32[(r8+2)];
+	heap32[(r9+3)] = heap32[(r8+3)];
+if(!(r2 !=r6)) //_LBB454_11
+{
+break _14;
+}
+}
+	r5 = (r0 + 12)|0;
+}
+if(!(r7 ==0)) //_LBB454_17
+{
+	r6 = heapU8[r0+16];
+if(!(r6 ==0)) //_LBB454_16
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r8 = heap32[(r6)];
+	r8 = (r8 + 1)|0;
+	r7 = r7 >> 2;
+	heap32[(r6)] = r8;
+	r6 = heap32[(r7+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+}
+	r6 = r5 >> 2;
+	heap32[(r6)] = 0;
+}
+	r6 = 1;
+	r5 = r5 >> 2;
+	heap8[r0+16] = r6;
+	heap32[(r5)] = r4;
+	heap32[(r1+2)] = r3;
+	if(r2 >=r3) //_LBB454_20
+{
+break _1;
+}
+}
+	r0 = heap32[(fp+2)];
+_25: while(true){
+	r4 = r2 << 4;
+	r5 = heap32[(r1+3)];
+	r4 = (r5 + r4)|0;
+	r4 = r4 >> 2;
+	r5 = r0 >> 2;
+	heap32[(r4)] = heap32[(r5)];
+	heap32[(r4+1)] = heap32[(r5+1)];
+	r2 = (r2 + 1)|0;
+	heap32[(r4+2)] = heap32[(r5+2)];
+	heap32[(r4+3)] = heap32[(r5+3)];
+	if(r3 !=r2) //_LBB454_19
+{
+continue _25;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	heap32[(r1+1)] = r3;
+	return;
+}
+
+function _ZN17btConvexHullShapeC1EPKfii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 1065353216;
+	heap32[(r1+4)] = 1065353216;
+	heap32[(r1+5)] = 1065353216;
+	heap32[(r1+6)] = 0;
+	heap32[(r1+11)] = 1025758986;
+	heap32[(r1+13)] = 1065353216;
+	heap32[(r1+14)] = 1065353216;
+	heap32[(r1+15)] = 1065353216;
+	heap32[(r1+16)] = 0;
+	heap32[(r1+17)] = -1082130432;
+	heap32[(r1+18)] = -1082130432;
+	heap32[(r1+19)] = -1082130432;
+	r2 = _ZTV17btConvexHullShape;
+	r3 = 0;
+	heap32[(r1+20)] = 0;
+	r2 = (r2 + 8)|0;
+	heap8[r0+84] = r3;
+	r4 = 1;
+	heap32[(r1)] = r2;
+	heap8[r0+104] = r4;
+	heap32[(r1+25)] = 0;
+	heap32[(r1+23)] = 0;
+	heap32[(r1+24)] = 0;
+	heap32[(r1+1)] = 4;
+	r2 = heap32[(fp+2)];
+	r4 = (r0 + 88)|0;
+	r5 = sp + -16;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r5;
+	_ZN20btAlignedObjectArrayI9btVector3E6resizeEiRKS0_(i7);
+if(!(r2 <1)) //_LBB455_3
+{
+	r4 = heap32[(fp+1)];
+_3: while(true){
+	r5 = r3 << 4;
+	r6 = (r4 + r5)|0;
+	r6 = r6 >> 2;
+	r7 = heap32[(r1+25)];
+	r5 = (r7 + r5)|0;
+	f0 = heapFloat[(r6+2)];
+	f1 = heapFloat[(r6+1)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = heap32[(r6)];
+	heapFloat[(r5+1)] = f1;
+	r3 = (r3 + 1)|0;
+	heapFloat[(r5+2)] = f0;
+	heap32[(r5+3)] = 0;
+	if(r2 !=r3) //_LBB455_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	heap32[(g0)] = r0;
+	_ZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEv(i7);
+	return;
+}
+
+function _ZN21btConvexInternalShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+2)];
+	r1 = heap32[(fp)];
+	f1 =                         0;
+	if(f0 <f1) //_LBB456_2
+{
+	f0 = -f0;
+}
+	f2 = heapFloat[(r0+1)];
+	if(f2 <f1) //_LBB456_5
+{
+	f2 = -f2;
+}
+	f3 = heapFloat[(r0)];
+	if(f3 <f1) //_LBB456_8
+{
+	f3 = -f3;
+}
+	r0 = r1 >> 2;
+	heapFloat[(r0+3)] = f3;
+	heapFloat[(r0+4)] = f2;
+	heapFloat[(r0+5)] = f0;
+	heap32[(r0+6)] = 0;
+	return;
+}
+
+function _ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = 0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+_1: while(true){
+	r2 = sp + -64;
+	r7 = r2 >> 2;
+	heap32[(fp+-16)] = 0;
+	heap32[(r7+1)] = 0;
+	r8 = r6 << 2;
+	r2 = (r2 - r8)|0;
+	heap32[(r7+2)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r7+3)] = 0;
+	heap32[(r2)] = 1065353216;
+	r9 = r3 >> 2;
+	r10 = heap32[(r1)];
+	f1 = heapFloat[(fp+-16)];
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r7+1)];
+	f4 = heapFloat[(r9+4)];
+	r10 = r10 >> 2;
+	f5 = heapFloat[(r9+1)];
+	f6 = heapFloat[(r9+5)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f7 = heapFloat[(r7+2)];
+	f8 = heapFloat[(r9+8)];
+	f9 = heapFloat[(r9+2)];
+	f10 = heapFloat[(r9+6)];
+	f11 = heapFloat[(r9+10)];
+	f12 = heapFloat[(r9+9)];
+	r10 = heap32[(r10+15)];
+	f5 = f5*f1;
+	f6 = f6*f3;
+	f2 = f2+f4;
+	f4 = f8*f7;
+	r11 = sp + -48;
+	f1 = f9*f1;
+	f3 = f10*f3;
+	f5 = f5+f6;
+	f6 = f12*f7;
+	f2 = f2+f4;
+	r12 = r11 >> 2;
+	f1 = f1+f3;
+	f3 = f11*f7;
+	f4 = f5+f6;
+	heapFloat[(fp+-12)] = f2;
+	f1 = f1+f3;
+	heapFloat[(r12+1)] = f4;
+	heapFloat[(r12+2)] = f1;
+	heap32[(r12+3)] = 0;
+	r12 = sp + -80;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r10 = r12 >> 2;
+	f1 = heapFloat[(fp+-20)];
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r10+1)];
+	f4 = heapFloat[(r9+1)];
+	f5 = heapFloat[(r9+4)];
+	f6 = heapFloat[(r9+5)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f7 = heapFloat[(r10+2)];
+	f8 = heapFloat[(r9+2)];
+	f9 = heapFloat[(r9+8)];
+	f10 = heapFloat[(r9+9)];
+	f11 = heapFloat[(r9+6)];
+	f5 = f5*f1;
+	f6 = f6*f3;
+	f2 = f2+f4;
+	f4 = f8*f7;
+	f8 = heapFloat[(r9+10)];
+	f1 = f9*f1;
+	f3 = f10*f3;
+	f5 = f5+f6;
+	f6 = f11*f7;
+	f2 = f2+f4;
+	f4 = heapFloat[(r9+12)];
+	f9 = heapFloat[(r9+14)];
+	f10 = heapFloat[(r9+13)];
+	r10 = sp + -96;
+	f5 = f5+f6;
+	f1 = f1+f3;
+	f3 = f8*f7;
+	f2 = f2+f4;
+	f1 = f1+f3;
+	f3 = f5+f10;
+	heapFloat[(fp+-24)] = f2;
+	r11 = r10 >> 2;
+	f1 = f1+f9;
+	heapFloat[(r11+1)] = f3;
+	heapFloat[(r11+2)] = f1;
+	r10 = (r10 - r8)|0;
+	heap32[(r11+3)] = 0;
+	r10 = r10 >> 2;
+	r12 = (r5 - r8)|0;
+	f1 = heapFloat[(r10)];
+	r12 = r12 >> 2;
+	f1 = f1+f0;
+	heapFloat[(r12)] = f1;
+	heap32[(r2)] = -1082130432;
+	r2 = heap32[(r1)];
+	f1 = heapFloat[(fp+-16)];
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r7+1)];
+	f4 = heapFloat[(r9+4)];
+	r2 = r2 >> 2;
+	f5 = heapFloat[(r9+1)];
+	f6 = heapFloat[(r9+5)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f7 = heapFloat[(r7+2)];
+	f8 = heapFloat[(r9+8)];
+	f9 = heapFloat[(r9+2)];
+	f10 = heapFloat[(r9+6)];
+	f11 = heapFloat[(r9+10)];
+	f12 = heapFloat[(r9+9)];
+	r2 = heap32[(r2+15)];
+	f5 = f5*f1;
+	f6 = f6*f3;
+	f2 = f2+f4;
+	f4 = f8*f7;
+	r7 = sp + -16;
+	f1 = f9*f1;
+	f3 = f10*f3;
+	f5 = f5+f6;
+	f6 = f12*f7;
+	f2 = f2+f4;
+	r12 = r7 >> 2;
+	f1 = f1+f3;
+	f3 = f11*f7;
+	f4 = f5+f6;
+	heapFloat[(fp+-4)] = f2;
+	f1 = f1+f3;
+	heapFloat[(r12+1)] = f4;
+	heapFloat[(r12+2)] = f1;
+	heap32[(r12+3)] = 0;
+	r12 = sp + -32;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r12 >> 2;
+	f1 = heapFloat[(fp+-8)];
+	f2 = heapFloat[(r9)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r9+1)];
+	f5 = heapFloat[(r9+4)];
+	f6 = heapFloat[(r9+5)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f7 = heapFloat[(r2+2)];
+	f8 = heapFloat[(r9+2)];
+	f9 = heapFloat[(r9+8)];
+	f10 = heapFloat[(r9+9)];
+	f11 = heapFloat[(r9+6)];
+	f5 = f5*f1;
+	f6 = f6*f3;
+	f2 = f2+f4;
+	f4 = f8*f7;
+	f8 = heapFloat[(r9+10)];
+	f1 = f9*f1;
+	f3 = f10*f3;
+	f5 = f5+f6;
+	f6 = f11*f7;
+	f2 = f2+f4;
+	f4 = heapFloat[(r9+12)];
+	f9 = heapFloat[(r9+14)];
+	f10 = heapFloat[(r9+13)];
+	f5 = f5+f6;
+	f1 = f1+f3;
+	f3 = f8*f7;
+	f2 = f2+f4;
+	f1 = f1+f3;
+	f3 = f5+f10;
+	heapFloat[(fp+-24)] = f2;
+	f1 = f1+f9;
+	heapFloat[(r11+1)] = f3;
+	heapFloat[(r11+2)] = f1;
+	heap32[(r11+3)] = 0;
+	r2 = (r4 - r8)|0;
+	f1 = heapFloat[(r10)];
+	r6 = (r6 + -1)|0;
+	r2 = r2 >> 2;
+	f1 = f1-f0;
+	heapFloat[(r2)] = f1;
+	if(r6 !=-3) //_LBB457_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	return;
+}
+
+function _ZNK21btConvexInternalShape24localGetSupportingVertexERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+16)];
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB458_2
+{
+	r2 = r4 >> 2;
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r2+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 =   1.4210854715202004e-014;
+	f5 =                        -1;
+	f0 = f3 < f4 ? f5 : f0;
+	f1 = f3 < f4 ? f5 : f1;
+	f2 = f3 < f4 ? f5 : f2;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	f4 =                         1;
+	f3 = f4/f_g0;
+	heap32[(g0)] = r0;
+	r0 = r3 >> 2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f0*f3;
+	f0 = f0*f_g0;
+	f5 = heapFloat[(r0)];
+	f0 = f5+f0;
+	f1 = f1*f3;
+	heapFloat[(r0)] = f0;
+	f0 = f1*f_g0;
+	f1 = heapFloat[(r0+1)];
+	f0 = f1+f0;
+	f1 = f2*f3;
+	heapFloat[(r0+1)] = f0;
+	f0 = f1*f_g0;
+	f1 = heapFloat[(r0+2)];
+	f0 = f1+f0;
+	heapFloat[(r0+2)] = f0;
+}
+	return;
+}
+
+function _ZN13btConvexShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN13btConvexShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB460_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZL17convexHullSupportRK9btVector3PS0_iS1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+5)];
+if(!(r0 <1)) //_LBB461_4
+{
+	f0 = heapFloat[(fp+8)];
+	f1 = heapFloat[(fp+3)];
+	f2 = heapFloat[(fp+7)];
+	f3 = heapFloat[(fp+2)];
+	f4 = heapFloat[(fp+6)];
+	f5 = heapFloat[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+4)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f5 = f5*f4;
+	r3 = 0;
+	r4 = -1;
+	f6 =       -999999984306749440;
+_3: while(true){
+	r5 = r3 << 4;
+	r5 = (r2 + r5)|0;
+	r5 = r5 >> 2;
+	f7 = heapFloat[(r5)];
+	f8 = heapFloat[(r5+1)];
+	f7 = f5*f7;
+	f8 = f3*f8;
+	f9 = heapFloat[(r5+2)];
+	f7 = f7+f8;
+	f8 = f1*f9;
+	f7 = f7+f8;
+	r5 = (r3 + 1)|0;
+	r4 = f7 > f6 ? r3 : r4;
+	f6 = f7 > f6 ? f7 : f6;
+	r3 = r5;
+if(!(r0 !=r5)) //_LBB461_2
+{
+break _3;
+}
+}
+	if(r4 >-1) //_LBB461_5
+{
+	r0 = r4 << 4;
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0)];
+	f3 = heapFloat[(r0+2)];
+	f5 = heapFloat[(r0+1)];
+	r0 = r1 >> 2;
+	f1 = f1*f4;
+	f2 = f5*f2;
+	heapFloat[(r0)] = f1;
+	f0 = f3*f0;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+}
+	r1 = _2E_str6249;
+	r2 = _2E_str7250;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 108;
+	_assert(i7);
+}
+
+function _ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+var __label__ = 0;
+	i7 = sp + -120;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+2)];
+_1: do {
+	if(r2 >4) //_LBB462_4
+{
+	if(r2 >9) //_LBB462_7
+{
+	if(r2 ==10) //_LBB462_32
+{
+	r2 = heap32[(r1+13)];
+	r5 = (r2 + 2)|0;
+	r4 = r4 >> 2;
+	r5 = (r5 % 3)|0;
+	f0 = heapFloat[(r4)];
+	f1 = heapFloat[(r4+1)];
+	r2 = r2 << 2;
+	r0 = (r0 + 28)|0;
+	r5 = r5 << 2;
+	f2 = heapFloat[(r4+2)];
+	r4 = (r0 + r2)|0;
+	r0 = (r0 + r5)|0;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	r4 = r4 >> 2;
+	r0 = r0 >> 2;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 = heapFloat[(r4)];
+	f5 = heapFloat[(r0)];
+	f6 =   9.9999997473787516e-005;
+	if(f3 >=f6) //_LBB462_34
+{
+	heapFloat[(g0)] = f3;
+	f3 =                         1;
+	sqrtf(i7);
+	f3 = f3/f_g0;
+	f0 = f0*f3;
+	f1 = f1*f3;
+	f2 = f2*f3;
+}
+else{
+	f0 =                         1;
+	f1 =                         0;
+	f2 = f1;
+}
+	r0 = sp + -64;
+	r4 = r0 >> 2;
+	heap32[(fp+-16)] = 0;
+	heap32[(r4+1)] = 0;
+	r0 = (r0 + r2)|0;
+	heap32[(r4+2)] = 0;
+	r0 = r0 >> 2;
+	heap32[(r4+3)] = 0;
+	heapFloat[(r0)] = f4;
+	f3 = heapFloat[(r1+4)];
+	f6 = heapFloat[(r1+3)];
+	f7 = heapFloat[(r1+5)];
+	f3 = f1*f3;
+	f6 = f0*f6;
+	f8 = heapFloat[(r1+11)];
+	f7 = f2*f7;
+	f3 = f3*f5;
+	f9 = heapFloat[(r4+1)];
+	f6 = f6*f5;
+	f10 = heapFloat[(fp+-16)];
+	f5 = f7*f5;
+	f7 = heapFloat[(r4+2)];
+	f11 = f1*f8;
+	f9 = f9+f3;
+	f12 = f0*f8;
+	f10 = f10+f6;
+	f9 = f9-f11;
+	f10 = f10-f12;
+	f8 = f2*f8;
+	f7 = f7+f5;
+	f7 = f7-f8;
+	f13 = f0*f10;
+	f14 = f1*f9;
+	f13 = f13+f14;
+	f14 = f2*f7;
+	f13 = f13+f14;
+	f14 =       -999999984306749440;
+	if(f13 >f14) //_LBB462_37
+{
+	f14 = f13;
+}
+else{
+	f10 =                         0;
+	f9 = f10;
+	f7 = f10;
+}
+	r0 = sp + -80;
+	r1 = r0 >> 2;
+	heap32[(fp+-20)] = 0;
+	heap32[(r1+1)] = 0;
+	r0 = (r0 + r2)|0;
+	heap32[(r1+2)] = 0;
+	r0 = r0 >> 2;
+	f4 = -f4;
+	heap32[(r1+3)] = 0;
+	heapFloat[(r0)] = f4;
+	f4 = heapFloat[(r1+1)];
+	f13 = heapFloat[(fp+-20)];
+	f15 = heapFloat[(r1+2)];
+	f3 = f4+f3;
+	f4 = f13+f6;
+	f4 = f4-f12;
+	f3 = f3-f11;
+	f5 = f15+f5;
+	f0 = f0*f4;
+	f1 = f1*f3;
+	f5 = f5-f8;
+	f0 = f0+f1;
+	f1 = f2*f5;
+	f0 = f0+f1;
+	r0 = r3 >> 2;
+	f1 = f0 > f14 ? f4 : f10;
+	f2 = f0 > f14 ? f3 : f9;
+	heapFloat[(r0)] = f1;
+	f0 = f0 > f14 ? f5 : f7;
+__label__ = 11;
+break _1;
+}
+else{
+	if(r2 ==13) //_LBB462_16
+{
+	r0 = sp + -16;
+	r2 = r0 >> 2;
+	heap32[(fp+-4)] = heap32[(r1+7)];
+	heap32[(r2+1)] = heap32[(r1+8)];
+	heap32[(r2+2)] = heap32[(r1+9)];
+	r4 = r4 >> 2;
+	heap32[(r2+3)] = heap32[(r1+10)];
+	r2 = sp + -32;
+	heap32[(fp+-8)] = heap32[(r4)];
+	f0 = heapFloat[(r4+1)];
+	r5 = r2 >> 2;
+	heapFloat[(r5+1)] = f0;
+	f1 = heapFloat[(r4+2)];
+	heapFloat[(r5+2)] = f1;
+	heap32[(r5+3)] = 0;
+	r1 = heap32[(r1+13)];
+	if(r1 ==2) //_LBB462_21
+{
+	r4 = 0;
+	r5 = 2;
+	r6 = 1;
+	f1 = f0;
+}
+else{
+	if(r1 ==1) //_LBB462_20
+{
+	r4 = 0;
+	r5 = 1;
+	r6 = 2;
+}
+else{
+	if(r1 !=0) //_LBB462_22
+{
+	r0 = _2E_str10;
+	r1 = _2E_str7250;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 175;
+	_assert(i7);
+}
+else{
+	r4 = 1;
+	r5 = 0;
+	r6 = 2;
+}
+}
+}
+	r1 = r1 << 2;
+	r4 = r4 << 2;
+	r7 = (r0 + r4)|0;
+	r0 = (r0 + r1)|0;
+	r1 = (r2 + r4)|0;
+	r7 = r7 >> 2;
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1)];
+	f2 = heapFloat[(r7)];
+	f3 = heapFloat[(r0)];
+	f4 = f0*f0;
+	f5 = f1*f1;
+	f4 = f4+f5;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	f5 =                         0;
+	if(f4 ==f5) //_LBB462_28
+{
+	r0 = sp + -48;
+	r1 = (r0 + r4)|0;
+	r4 = r5 << 2;
+	r2 = (r2 + r4)|0;
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	heapFloat[(r1)] = f2;
+	f0 = heapFloat[(r2)];
+	if(f0 <f5) //_LBB462_30
+{
+	f3 = -f3;
+}
+	r1 = r6 << 2;
+	r4 = (r0 + r4)|0;
+	r1 = (r0 + r1)|0;
+	r4 = r4 >> 2;
+	r1 = r1 >> 2;
+	heapFloat[(r4)] = f3;
+	r3 = r3 >> 2;
+	heap32[(r1)] = 0;
+	r0 = r0 >> 2;
+	heap32[(r3)] = heap32[(fp+-12)];
+	heap32[(r3+1)] = heap32[(r0+1)];
+	heap32[(r3+2)] = heap32[(r0+2)];
+	heap32[(r3+3)] = 0;
+	return;
+}
+else{
+	r0 = sp + -48;
+	r4 = (r0 + r4)|0;
+	f2 = f2/f4;
+	r1 = r5 << 2;
+	r2 = (r2 + r1)|0;
+	r4 = r4 >> 2;
+	f0 = f0*f2;
+	r2 = r2 >> 2;
+	heapFloat[(r4)] = f0;
+	f0 = heapFloat[(r2)];
+	if(f0 <f5) //_LBB462_26
+{
+	f3 = -f3;
+}
+	r4 = r6 << 2;
+	r1 = (r0 + r1)|0;
+	r4 = (r0 + r4)|0;
+	r1 = r1 >> 2;
+	r4 = r4 >> 2;
+	f2 = f1*f2;
+	heapFloat[(r1)] = f3;
+	r1 = r3 >> 2;
+	heapFloat[(r4)] = f2;
+	r4 = r0 >> 2;
+	heap32[(r1)] = heap32[(fp+-12)];
+	heap32[(r1+1)] = heap32[(r4+1)];
+	heap32[(r1+2)] = heap32[(r4+2)];
+	heap32[(r1+3)] = 0;
+	return;
+}
+}
+else{
+__label__ = 40;
+break _1;
+}
+}
+}
+else{
+	if(r2 ==5) //_LBB462_39
+{
+	r0 = r4 >> 2;
+	f0 = heapFloat[(r1+5)];
+	r4 = heap32[(r1+22)];
+__label__ = 38;
+break _1;
+}
+else{
+	if(r2 ==8) //_LBB462_9
+{
+	r0 = r3 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+else{
+__label__ = 40;
+break _1;
+}
+}
+}
+}
+else{
+	if(r2 ==0) //_LBB462_10
+{
+	r0 = r4 >> 2;
+	f0 = heapFloat[(r1+7)];
+	f1 = heapFloat[(r1+9)];
+	f2 = heapFloat[(r1+8)];
+	f3 =                         0;
+	f4 = -f0;
+	f5 = heapFloat[(r0)];
+	f6 = heapFloat[(r0+2)];
+	f7 = heapFloat[(r0+1)];
+	f8 = -f2;
+	r0 = r3 >> 2;
+	f0 = f5 < f3 ? f4 : f0;
+	f4 = -f1;
+	f2 = f7 < f3 ? f8 : f2;
+	heapFloat[(r0)] = f0;
+	f0 = f6 < f3 ? f4 : f1;
+__label__ = 11;
+break _1;
+}
+else{
+	if(r2 ==1) //_LBB462_12
+{
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r1+13)];
+	f1 = heapFloat[(r4)];
+	f2 = heapFloat[(r1+17)];
+	f3 = heapFloat[(r1+21)];
+	f4 = heapFloat[(r1+14)];
+	f5 = heapFloat[(r4+1)];
+	f6 = heapFloat[(r1+18)];
+	f7 = heapFloat[(r1+22)];
+	f0 = f1*f0;
+	f4 = f5*f4;
+	f8 = heapFloat[(r1+15)];
+	f9 = heapFloat[(r4+2)];
+	f10 = heapFloat[(r1+19)];
+	f11 = heapFloat[(r1+23)];
+	f2 = f1*f2;
+	f6 = f5*f6;
+	f1 = f1*f3;
+	f3 = f5*f7;
+	f0 = f0+f4;
+	f4 = f9*f8;
+	f2 = f2+f6;
+	f5 = f9*f10;
+	f1 = f1+f3;
+	f3 = f9*f11;
+	f0 = f0+f4;
+	f2 = f2+f5;
+	f1 = f1+f3;
+	if(f0 >=f2) //_LBB462_14
+{
+	r1 = 2;
+	r4 = 0;
+	r1 = f0 < f1 ? r1 : r4;
+}
+else{
+	r1 = 2;
+	r4 = 1;
+	r1 = f2 < f1 ? r1 : r4;
+}
+	r1 = r1 << 4;
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+15)];
+	f1 = heapFloat[(r0+14)];
+	r1 = r3 >> 2;
+	heap32[(r1)] = heap32[(r0+13)];
+	heapFloat[(r1+1)] = f1;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+else{
+	if(r2 ==4) //_LBB462_41
+{
+	r0 = r4 >> 2;
+	f0 = heapFloat[(r1+5)];
+	r4 = heap32[(r1+25)];
+__label__ = 38;
+}
+else{
+__label__ = 40;
+}
+}
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 11:
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+break;
+case 40:
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+16)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+break;
+case 38:
+	r2 = heap32[(r1+23)];
+	f1 = heapFloat[(r0)];
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r0+2)];
+	f4 = heapFloat[(r1+3)];
+	f5 = heapFloat[(r1+4)];
+	heap32[(g0)] = r3;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	heapFloat[(g0+3)] = f3;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r2;
+	heapFloat[(g0+6)] = f4;
+	heapFloat[(g0+7)] = f5;
+	heapFloat[(g0+8)] = f0;
+	_ZL17convexHullSupportRK9btVector3PS0_iS1_(i7);
+	return;
+break;
+}
+}
+
+function _ZNK13btConvexShape31localGetSupportVertexNonVirtualERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	r1 = sp + -32;
+	heapFloat[(fp+-8)] = f0;
+	f1 = heapFloat[(r0+1)];
+	r2 = r1 >> 2;
+	heapFloat[(r2+1)] = f1;
+	f2 = heapFloat[(r0+2)];
+	r3 = heap32[(fp)];
+	r4 = heap32[(fp+1)];
+	heapFloat[(r2+2)] = f2;
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	heap32[(r2+3)] = heap32[(r0+3)];
+	f3 = f3+f4;
+	f4 =   1.4210854715202004e-014;
+	if(f3 <f4) //_LBB463_2
+{
+	heap32[(fp+-8)] = -1082130432;
+	heap32[(r2+1)] = -1082130432;
+	f2 =                        -1;
+	heap32[(r2+2)] = -1082130432;
+	heap32[(r2+3)] = 0;
+	f1 = f2;
+	f0 = f2;
+}
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f0 = f1/f_g0;
+	f1 = heapFloat[(fp+-8)];
+	f1 = f1*f0;
+	heapFloat[(fp+-8)] = f1;
+	f2 = heapFloat[(r2+1)];
+	f2 = f2*f0;
+	heapFloat[(r2+1)] = f2;
+	f3 = heapFloat[(r2+2)];
+	f0 = f3*f0;
+	r0 = r4 >> 2;
+	heapFloat[(r2+2)] = f0;
+	r5 = heap32[(r0+1)];
+_4: do {
+	if(r5 >7) //_LBB463_7
+{
+	if(r5 ==13) //_LBB463_13
+{
+	f3 = heapFloat[(r0+11)];
+__label__ = 16;
+break _4;
+}
+else{
+	if(r5 ==10) //_LBB463_14
+{
+	f3 = heapFloat[(r0+11)];
+__label__ = 16;
+break _4;
+}
+else{
+	if(r5 !=8) //_LBB463_16
+{
+__label__ = 15;
+break _4;
+}
+else{
+	f3 = heapFloat[(r0+7)];
+	f4 = heapFloat[(r0+3)];
+	f3 = f3*f4;
+__label__ = 16;
+break _4;
+}
+}
+}
+}
+else{
+	if(r5 ==0) //_LBB463_11
+{
+	f3 = heapFloat[(r0+11)];
+__label__ = 16;
+break _4;
+}
+else{
+	if(r5 ==1) //_LBB463_12
+{
+	f3 = heapFloat[(r0+11)];
+__label__ = 16;
+}
+else{
+	r5 = (r5 + -4)|0;
+	if(uint(r5) <uint(2)) //_LBB463_15
+{
+	f3 = heapFloat[(r0+11)];
+__label__ = 16;
+}
+else{
+__label__ = 15;
+}
+}
+}
+}
+} while(0);
+if (__label__ == 15){
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+11)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	f3 = f_g0;
+	f0 = heapFloat[(r2+2)];
+	f2 = heapFloat[(r2+1)];
+	f1 = heapFloat[(fp+-8)];
+}
+	r0 = sp + -16;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	_ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3(i7);
+	r0 = r0 >> 2;
+	f1 = f1*f3;
+	f4 = heapFloat[(fp+-4)];
+	f5 = heapFloat[(r0+2)];
+	f6 = heapFloat[(r0+1)];
+	f2 = f2*f3;
+	r0 = r3 >> 2;
+	f1 = f4+f1;
+	f0 = f0*f3;
+	f2 = f6+f2;
+	heapFloat[(r0)] = f1;
+	f0 = f5+f0;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallback28internalProcessTriangleIndexEPS2_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	f0 =        999999984306749440;
+	f1 = heapFloat[(r0)];
+	f2 = heapFloat[(r0+1)];
+	f3 =       -999999984306749440;
+	f4 = heapFloat[(r0+2)];
+	f5 = heapFloat[(r0+3)];
+	f6 =                         0;
+	r1 = heap32[(r1+1)];
+	f7 = f1 < f0 ? f1 : f0;
+	f8 = heapFloat[(r0+4)];
+	f1 = f1 > f3 ? f1 : f3;
+	f9 = f2 < f0 ? f2 : f0;
+	f10 = heapFloat[(r0+5)];
+	f2 = f2 > f3 ? f2 : f3;
+	f0 = f4 < f0 ? f4 : f0;
+	f11 = heapFloat[(r0+6)];
+	f3 = f4 > f3 ? f4 : f3;
+	f4 = f5 < f6 ? f5 : f6;
+	f12 = heapFloat[(r0+7)];
+	f5 = f5 > f6 ? f5 : f6;
+	r2 = r1 >> 2;
+	f6 = f8 < f7 ? f8 : f7;
+	f7 = heapFloat[(r0+8)];
+	f1 = f1 < f8 ? f8 : f1;
+	f8 = f10 < f9 ? f10 : f9;
+	f9 = heapFloat[(r0+9)];
+	f2 = f2 < f10 ? f10 : f2;
+	f0 = f11 < f0 ? f11 : f0;
+	f10 = heapFloat[(r0+10)];
+	f3 = f3 < f11 ? f11 : f3;
+	f4 = f12 < f4 ? f12 : f4;
+	f11 = heapFloat[(r0+11)];
+	f5 = f5 < f12 ? f12 : f5;
+	r0 = heap32[(r2+2)];
+	r3 = heap32[(r2+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	f6 = f7 < f6 ? f7 : f6;
+	f8 = f9 < f8 ? f9 : f8;
+	f0 = f10 < f0 ? f10 : f0;
+	f4 = f11 < f4 ? f11 : f4;
+	f1 = f1 < f7 ? f7 : f1;
+	f2 = f2 < f9 ? f9 : f2;
+	f3 = f3 < f10 ? f10 : f3;
+	f5 = f5 < f11 ? f11 : f5;
+	if(r0 ==r3) //_LBB466_2
+{
+	r6 = 1;
+	r7 = r3 << 1;
+	r7 = r3 == 0 ? r6 : r7;
+if(!(r0 >=r7)) //_LBB466_1
+{
+	if(r7 !=0) //_LBB466_5
+{
+	r0 = gNumAlignedAllocs;
+	r0 = r0 >> 2;
+	r8 = heap32[(r0)];
+	r8 = (r8 + 1)|0;
+	r9 = r7 << 6;
+	heap32[(r0)] = r8;
+	r0 = r9 | 19;
+	heap32[(g0)] = r0;
+	malloc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB466_7
+{
+	r3 = 0;
+	r8 = (r0 + 4)|0;
+	r3 = (r3 - r8)|0;
+	r3 = r3 & 15;
+	r3 = (r0 + r3)|0;
+	r8 = r3 >> 2;
+	heap32[(r8)] = r0;
+	r0 = (r3 + 4)|0;
+	r3 = heap32[(r2+1)];
+}
+}
+else{
+	r0 = 0;
+}
+if(!(r3 <1)) //_LBB466_11
+{
+	r8 = 0;
+_11: while(true){
+	r9 = heap32[(r2+3)];
+	r10 = (r0 + r8)|0;
+	r9 = (r9 + r8)|0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = 64;
+	r3 = (r3 + -1)|0;
+	r8 = (r8 + 64)|0;
+	memcpy(i7);
+if(!(r3 !=0)) //_LBB466_10
+{
+break _11;
+}
+}
+}
+	r3 = heap32[(r2+3)];
+if(!(r3 ==0)) //_LBB466_15
+{
+	r8 = heapU8[r1+16];
+if(!(r8 ==0)) //_LBB466_14
+{
+	r8 = gNumAlignedFree;
+	r8 = r8 >> 2;
+	r9 = heap32[(r8)];
+	r9 = (r9 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r8)] = r9;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+3)] = 0;
+}
+	heap8[r1+16] = r6;
+	heap32[(r2+3)] = r0;
+	heap32[(r2+2)] = r7;
+	r3 = heap32[(r2+1)];
+}
+}
+	r0 = r3 << 6;
+	r1 = heap32[(r2+3)];
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	heapFloat[(r0)] = f6;
+	heapFloat[(r0+1)] = f8;
+	heapFloat[(r0+2)] = f0;
+	heapFloat[(r0+3)] = f4;
+	heapFloat[(r0+4)] = f1;
+	heapFloat[(r0+5)] = f2;
+	heapFloat[(r0+6)] = f3;
+	heapFloat[(r0+7)] = f5;
+	heap32[(r0+8)] = -1;
+	heap32[(r0+9)] = r4;
+	heap32[(r0+10)] = r5;
+	r0 = heap32[(r2+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r2+1)] = r0;
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallback28internalProcessTriangleIndexEPS2_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	if(r0 <1024) //_LBB469_2
+{
+	r1 = heap32[(fp+3)];
+	if(r1 <2097152) //_LBB469_4
+{
+	if(r1 >-1) //_LBB469_6
+{
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r4 = sp + -32;
+	r5 = r4 >> 2;
+	heap32[(fp+-8)] = 1566444395;
+	heap32[(r5+1)] = 1566444395;
+	heap32[(r5+2)] = 1566444395;
+	r6 = sp + -48;
+	heap32[(r5+3)] = 0;
+	r7 = r6 >> 2;
+	heap32[(fp+-12)] = -581039253;
+	heap32[(r7+1)] = -581039253;
+	heap32[(r7+2)] = -581039253;
+	r3 = r3 >> 2;
+	heap32[(r7+3)] = 0;
+	f0 = heapFloat[(r3)];
+	f1 =        999999984306749440;
+	if(f0 <f1) //_LBB469_8
+{
+	heapFloat[(fp+-8)] = f0;
+	f2 = f0;
+}
+else{
+	f2 = f1;
+}
+	f3 = heapFloat[(r3+1)];
+	if(f3 <f1) //_LBB469_11
+{
+	heapFloat[(r5+1)] = f3;
+	f1 = f3;
+}
+else{
+	f1 =        999999984306749440;
+}
+	f4 = heapFloat[(r3+2)];
+	f5 =        999999984306749440;
+	if(f4 <f5) //_LBB469_14
+{
+	heapFloat[(r5+2)] = f4;
+	f5 = f4;
+}
+	f6 = heapFloat[(r3+3)];
+	f7 =                         0;
+	if(f6 <f7) //_LBB469_17
+{
+	heapFloat[(r5+3)] = f6;
+	f7 = f6;
+}
+	f8 =       -999999984306749440;
+	if(f0 >f8) //_LBB469_20
+{
+	heapFloat[(fp+-12)] = f0;
+}
+else{
+	f0 = f8;
+}
+	if(f3 >f8) //_LBB469_23
+{
+	heapFloat[(r7+1)] = f3;
+}
+else{
+	f3 =       -999999984306749440;
+}
+	f8 =       -999999984306749440;
+	if(f4 >f8) //_LBB469_26
+{
+	heapFloat[(r7+2)] = f4;
+	f8 = f4;
+}
+	f4 =                         0;
+	if(f6 >f4) //_LBB469_29
+{
+	heapFloat[(r7+3)] = f6;
+	f4 = f6;
+}
+	f6 = heapFloat[(r3+4)];
+	if(f6 <f2) //_LBB469_32
+{
+	heapFloat[(fp+-8)] = f6;
+	f2 = f6;
+}
+	f9 = heapFloat[(r3+5)];
+	if(f9 <f1) //_LBB469_35
+{
+	heapFloat[(r5+1)] = f9;
+	f1 = f9;
+}
+	f10 = heapFloat[(r3+6)];
+	if(f10 <f5) //_LBB469_38
+{
+	heapFloat[(r5+2)] = f10;
+	f5 = f10;
+}
+	f11 = heapFloat[(r3+7)];
+	if(f11 <f7) //_LBB469_41
+{
+	heapFloat[(r5+3)] = f11;
+	f7 = f11;
+}
+	if(f0 <f6) //_LBB469_44
+{
+	heapFloat[(fp+-12)] = f6;
+	f0 = f6;
+}
+	if(f3 <f9) //_LBB469_47
+{
+	heapFloat[(r7+1)] = f9;
+	f3 = f9;
+}
+	if(f8 <f10) //_LBB469_50
+{
+	heapFloat[(r7+2)] = f10;
+	f8 = f10;
+}
+	if(f4 <f11) //_LBB469_53
+{
+	heapFloat[(r7+3)] = f11;
+	f4 = f11;
+}
+	f6 = heapFloat[(r3+8)];
+	if(f6 <f2) //_LBB469_56
+{
+	heapFloat[(fp+-8)] = f6;
+	f2 = f6;
+}
+	f9 = heapFloat[(r3+9)];
+	if(f9 <f1) //_LBB469_59
+{
+	heapFloat[(r5+1)] = f9;
+	f1 = f9;
+}
+	f10 = heapFloat[(r3+10)];
+	if(f10 <f5) //_LBB469_62
+{
+	heapFloat[(r5+2)] = f10;
+	f5 = f10;
+}
+	f11 = heapFloat[(r3+11)];
+if(!(f11 >=f7)) //_LBB469_65
+{
+	heapFloat[(r5+3)] = f11;
+}
+	if(f0 <f6) //_LBB469_67
+{
+	heapFloat[(fp+-12)] = f6;
+	f0 = f6;
+}
+	if(f3 <f9) //_LBB469_70
+{
+	heapFloat[(r7+1)] = f9;
+	f3 = f9;
+}
+	if(f8 <f10) //_LBB469_73
+{
+	heapFloat[(r7+2)] = f10;
+	f8 = f10;
+}
+if(!(f4 >=f11)) //_LBB469_76
+{
+	heapFloat[(r7+3)] = f11;
+}
+	f4 = f0-f2;
+	f6 =     0.0020000000949949026;
+if(!(f4 >=f6)) //_LBB469_78
+{
+	f4 =     0.0010000000474974513;
+	f0 = f0+f4;
+	f4 =    -0.0010000000474974513;
+	f2 = f2+f4;
+	heapFloat[(fp+-12)] = f0;
+	heapFloat[(fp+-8)] = f2;
+}
+	f0 = f3-f1;
+if(!(f0 >=f6)) //_LBB469_80
+{
+	f0 =     0.0010000000474974513;
+	f2 =    -0.0010000000474974513;
+	f0 = f3+f0;
+	f1 = f1+f2;
+	heapFloat[(r7+1)] = f0;
+	heapFloat[(r5+1)] = f1;
+}
+	f0 = f8-f5;
+if(!(f0 >=f6)) //_LBB469_82
+{
+	f0 =     0.0010000000474974513;
+	f1 =    -0.0010000000474974513;
+	f0 = f8+f0;
+	f1 = f5+f1;
+	heapFloat[(r7+2)] = f0;
+	heapFloat[(r5+2)] = f1;
+}
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+2)];
+	r5 = sp + -16;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = 0;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r3 = heap32[(r2+2)];
+	r4 = (r5 + 6)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = 1;
+	r0 = r0 << 21;
+	r0 = r0 | r1;
+	_ZNK14btQuantizedBvh8quantizeEPtRK9btVector3i(i7);
+	r1 = r5 >> 2;
+	heap32[(r1+3)] = r0;
+	r1 = heap32[(r2+1)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+1)];
+	r4 = heap32[(r2+2)];
+	if(r4 ==r3) //_LBB469_84
+{
+	r4 = 1;
+	r5 = r3 << 1;
+	r3 = r3 == 0 ? r4 : r5;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	_ZN20btAlignedObjectArrayI18btQuantizedBvhNodeE7reserveEi(i7);
+	r3 = heap32[(r2+1)];
+}
+	r1 = heap32[(r2+3)];
+	r4 = heapU16[(sp+-16)>>1];
+	r3 = r3 << 4;
+	heap16[(r1+r3)>>1] = r4;
+	r1 = (r1 + r3)|0;
+	r3 = heapU16[(sp+-14)>>1];
+	heap16[(r1+2)>>1] = r3;
+	r3 = heapU16[(sp+-12)>>1];
+	heap16[(r1+4)>>1] = r3;
+	r3 = heapU16[(sp+-10)>>1];
+	heap16[(r1+6)>>1] = r3;
+	r3 = heapU16[(sp+-8)>>1];
+	heap16[(r1+8)>>1] = r3;
+	r3 = heapU16[(sp+-6)>>1];
+	r4 = r1 >> 2;
+	heap16[(r1+10)>>1] = r3;
+	heap32[(r4+3)] = r0;
+	r0 = heap32[(r2+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r2+1)] = r0;
+	return;
+}
+else{
+	r0 = _2E_str20316;
+	r1 = _2E_str10306;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 103;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str19315;
+	r1 = _2E_str10306;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 101;
+	_assert(i7);
+}
+}
+else{
+	r0 = _2E_str18314;
+	r1 = _2E_str10306;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 100;
+	_assert(i7);
+}
+}
+
+function _ZNK14btOptimizedBvh16serializeInPlaceEPvjb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	_ZNK14btQuantizedBvh9serializeEPvjb(i7);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN14btOptimizedBvhD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btOptimizedBvh;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN14btQuantizedBvhD2Ev(i7);
+if(!(r0 ==0)) //_LBB471_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN14btOptimizedBvhD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btOptimizedBvh;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN14btQuantizedBvhD2Ev(i7);
+	return;
+}
+
+function _ZNK23btPolyhedralConvexShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	r3 = sp + -64;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = r3 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 1065353216;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 1065353216;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+2)];
+	r2 = sp + -80;
+	r4 = sp + -96;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r4 >> 2;
+	r1 = r2 >> 2;
+	f1 = heapFloat[(r0+2)];
+	f2 = heapFloat[(r1+2)];
+	f3 = heapFloat[(r0+1)];
+	f4 = heapFloat[(r1+1)];
+	f3 = f3-f4;
+	f4 =                       0.5;
+	f1 = f1-f2;
+	f2 = heapFloat[(fp+-24)];
+	f5 = heapFloat[(fp+-20)];
+	f2 = f2-f5;
+	f3 = f3*f4;
+	f1 = f1*f4;
+	f2 = f2*f4;
+	f3 = f3+f0;
+	f1 = f1+f0;
+	f0 = f2+f0;
+	f2 = f3+f3;
+	f1 = f1+f1;
+	f0 = f0+f0;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	f3 = heapFloat[(fp+1)];
+	f4 =      0.083333328366279602;
+	f0 = f0*f0;
+	r0 = heap32[(fp+2)];
+	f5 = f2+f1;
+	f3 = f3*f4;
+	f1 = f0+f1;
+	r0 = r0 >> 2;
+	f4 = f5*f3;
+	f0 = f0+f2;
+	f1 = f1*f3;
+	heapFloat[(r0)] = f4;
+	f0 = f0*f3;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK34btPolyhedralConvexAabbCachingShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f0 = f_g0;
+	r1 = heapU8[r0+84];
+	if(r1 !=0) //_LBB474_2
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = (r0 + 52)|0;
+	r0 = (r0 + 68)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heapFloat[(g0+2)] = f0;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r3;
+	_Z15btTransformAabbRK9btVector3S1_fRK11btTransformRS_S5_(i7);
+	return;
+}
+else{
+	r0 = _2E_str6232;
+	r1 = _2E_str7331;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 86;
+	_assert(i7);
+}
+}
+
+function _ZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -112;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = 1;
+	r2 = _ZGVZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEvE11_directions;
+	heap8[r0+84] = r1;
+	r3 = heapU8[r2];
+if(!(r3 !=0)) //_LBB475_2
+{
+	r3 = _ZZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEvE11_directions;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 1065353216;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = 1065353216;
+	heap32[(r3+6)] = 0;
+	heap32[(r3+7)] = 0;
+	heap32[(r3+8)] = 0;
+	heap32[(r3+9)] = 0;
+	heap32[(r3+10)] = 1065353216;
+	heap32[(r3+11)] = 0;
+	heap32[(r3+12)] = -1082130432;
+	heap32[(r3+13)] = 0;
+	heap32[(r3+14)] = 0;
+	heap32[(r3+15)] = 0;
+	heap32[(r3+16)] = 0;
+	heap32[(r3+17)] = -1082130432;
+	heap32[(r3+18)] = 0;
+	heap32[(r3+19)] = 0;
+	heap32[(r3+20)] = 0;
+	heap32[(r3+21)] = 0;
+	heap32[(r3+22)] = -1082130432;
+	heap32[(r3+23)] = 0;
+	heap8[r2] = r1;
+}
+	r1 = sp + -96;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 96;
+	r2 = r0 >> 2;
+	memset(i7);
+	r3 = heap32[(r2)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+17)];
+	r4 = _ZZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEvE11_directions;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = 6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	f0 = heapFloat[(fp+-24)];
+	f1 = heapFloat[(r2+11)];
+	f0 = f0+f1;
+	r0 = r1 >> 2;
+	heapFloat[(r2+17)] = f0;
+	f0 = heapFloat[(r0+12)];
+	f0 = f0-f1;
+	heapFloat[(r2+13)] = f0;
+	f0 = heapFloat[(r0+5)];
+	f0 = f0+f1;
+	heapFloat[(r2+18)] = f0;
+	f0 = heapFloat[(r0+17)];
+	f0 = f0-f1;
+	heapFloat[(r2+14)] = f0;
+	f0 = heapFloat[(r0+10)];
+	f0 = f0+f1;
+	heapFloat[(r2+19)] = f0;
+	f0 = heapFloat[(r0+22)];
+	f0 = f0-f1;
+	heapFloat[(r2+15)] = f0;
+	return;
+}
+
+function _ZNK13btSphereShape37localGetSupportingVertexWithoutMarginERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK13btSphereShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str342;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN13btSphereShape9setMarginEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0+11)] = heap32[(fp+1)];
+	return;
+}
+
+function _ZNK13btSphereShape9getMarginEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+7)];
+	f1 = heapFloat[(r0+3)];
+	f0 = f0*f1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZNK13btSphereShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 <1)) //_LBB480_3
+{
+	r1 = heap32[(fp+2)];
+	r1 = (r1 + 8)|0;
+_3: while(true){
+	r2 = r1 >> 2;
+	heap32[(r2+-2)] = 0;
+	heap32[(r2+-1)] = 0;
+	r0 = (r0 + -1)|0;
+	r1 = (r1 + 16)|0;
+	heap32[(r2)] = 0;
+	heap32[(r2+1)] = 0;
+	if(r0 !=0) //_LBB480_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZNK13btSphereShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f0 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f1 = f_g0;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	r0 = r2 >> 2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = heap32[(fp+2)];
+	f3 = heapFloat[(r0+14)];
+	f4 = heapFloat[(r0+13)];
+	f5 = heapFloat[(r0+12)];
+	r1 = r1 >> 2;
+	f5 = f5-f_g0;
+	f4 = f4-f1;
+	heapFloat[(r1)] = f5;
+	f3 = f3-f0;
+	heapFloat[(r1+1)] = f4;
+	heapFloat[(r1+2)] = f3;
+	heap32[(r1+3)] = 0;
+	r1 = heap32[(fp+3)];
+	f3 = heapFloat[(r0+14)];
+	f4 = heapFloat[(r0+13)];
+	f5 = heapFloat[(r0+12)];
+	r0 = r1 >> 2;
+	f2 = f5+f_g0;
+	f1 = f4+f1;
+	heapFloat[(r0)] = f2;
+	f0 = f3+f0;
+	heapFloat[(r0+1)] = f1;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZNK13btSphereShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	f1 = heapFloat[(fp+1)];
+	f2 =       0.40000000596046448;
+	f1 = f1*f2;
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp+2)];
+	f0 = f1*f_g0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r0 >> 2;
+	f0 = f0*f_g0;
+	heapFloat[(r0)] = f0;
+	heapFloat[(r0+1)] = f0;
+	heapFloat[(r0+2)] = f0;
+	heap32[(r0+3)] = 0;
+	return;
+}
+
+function _ZN13btSphereShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB483_2
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN13btSphereShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV13btConvexShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZNK13btSphereShape24localGetSupportingVertexERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+16)];
+	r3 = heap32[(fp+2)];
+	r4 = sp + -16;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r4 >> 2;
+	r4 = heap32[(fp)];
+	f0 = heapFloat[(fp+-4)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r2+2)];
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	heap32[(r4+3)] = heap32[(r2+3)];
+	f3 = heapFloat[(r3)];
+	f4 = heapFloat[(r3+1)];
+	f5 = heapFloat[(r3+2)];
+	f6 = f3*f3;
+	f7 = f4*f4;
+	f6 = f6+f7;
+	f7 = f5*f5;
+	f6 = f6+f7;
+	f7 =   1.4210854715202004e-014;
+	f8 =                        -1;
+	f3 = f6 < f7 ? f8 : f3;
+	f4 = f6 < f7 ? f8 : f4;
+	f5 = f6 < f7 ? f8 : f5;
+	f6 = f3*f3;
+	f7 = f4*f4;
+	f6 = f6+f7;
+	f7 = f5*f5;
+	f6 = f6+f7;
+	heapFloat[(g0)] = f6;
+	sqrtf(i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	f7 =                         1;
+	f6 = f7/f_g0;
+	heap32[(g0)] = r0;
+	f3 = f3*f6;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	f4 = f4*f6;
+	f3 = f3*f_g0;
+	f5 = f5*f6;
+	f4 = f4*f_g0;
+	f0 = f0+f3;
+	f3 = f5*f_g0;
+	f1 = f1+f4;
+	heapFloat[(r4)] = f0;
+	f0 = f2+f3;
+	heapFloat[(r4+1)] = f1;
+	heapFloat[(r4+2)] = f0;
+	return;
+}
+
+function _ZNK23btStridingMeshInterface14hasPremadeAabbEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK23btStridingMeshInterface14setPremadeAabbERK9btVector3S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK23btStridingMeshInterface14getPremadeAabbEP9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK23btStridingMeshInterface28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 28;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK23btStridingMeshInterface9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+var __label__ = 0;
+	i7 = sp + -72;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+7)];
+	r3 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r3 = r3 >> 2;
+	heap32[(r3+5)] = r2;
+	heap32[(r3)] = 0;
+if(!(r2 ==0)) //_LBB490_32
+{
+	r4 = heap32[(fp+2)];
+	r5 = r4 >> 2;
+	r6 = heap32[(r5)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 28;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r2 = r_g0;
+	r6 = heap32[(r5)];
+	r6 = r6 >> 2;
+	r7 = r2 >> 2;
+	r7 = heap32[(r7+2)];
+	r6 = heap32[(r6+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	heap32[(r3)] = r_g0;
+	r6 = heap32[(r1)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+7)];
+	heap32[(g0)] = r0;
+	r8 = 0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0;
+_3: while(true){
+	if(r8 <r6) //_LBB490_2
+{
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+4)];
+	r10 = sp + -4;
+	r11 = sp + -28;
+	r12 = sp + -16;
+	r13 = sp + -24;
+	r14 = sp + -8;
+	r15 = sp + -12;
+	r16 = sp + -32;
+	r17 = sp + -20;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = r13;
+	heap32[(g0+5)] = r14;
+	heap32[(g0+6)] = r15;
+	heap32[(g0+7)] = r16;
+	heap32[(g0+8)] = r17;
+	heap32[(g0+9)] = r8;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r9 = r7 >> 2;
+	r10 = heap32[(fp+-8)];
+	heap32[(r9+5)] = r10;
+	r10 = heap32[(fp+-7)];
+	heap32[(r9+6)] = r10;
+	heap32[(r9+4)] = 0;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 0;
+	heap32[(r9)] = 0;
+	heap32[(r9+1)] = 0;
+	r10 = heap32[(fp+-5)];
+	if(r10 ==3) //_LBB490_9
+{
+	r10 = heap32[(fp+-8)];
+if(!(r10 ==0)) //_LBB490_15
+{
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 8;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r10 = r_g0;
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r12 = heap32[(r12+2)];
+	r11 = heap32[(r11+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(r9+3)] = r_g0;
+	r11 = heap32[(fp+-8)];
+if(!(r11 <1)) //_LBB490_13
+{
+	r11 = 0;
+_11: while(true){
+	r13 = heap32[(fp+-3)];
+	r13 = (r13 * r11)|0;
+	r14 = heap32[(fp+-2)];
+	r15 = heapU16[(r14+r13)>>1];
+	r16 = r11 << 3;
+	r13 = (r14 + r13)|0;
+	heap16[(r12+r16)>>1] = r15;
+	r14 = (r12 + r16)|0;
+	r15 = heapU16[(r13+2)>>1];
+	heap16[(r14+2)>>1] = r15;
+	r13 = heapU16[(r13+4)>>1];
+	r11 = (r11 + 1)|0;
+	heap16[(r14+4)>>1] = r13;
+	r13 = heap32[(fp+-8)];
+if(!(r11 <r13)) //_LBB490_12
+{
+break _11;
+}
+}
+}
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r11 = heap32[(r11+5)];
+	r12 = heap32[(r12+2)];
+	r13 = _2E_str1350;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+}
+}
+else{
+	if(r10 !=2) //_LBB490_14
+{
+__label__ = 14;
+break _3;
+}
+else{
+	r10 = heap32[(fp+-8)];
+	r10 = (r10 * 3)|0;
+if(!(r10 ==0)) //_LBB490_15
+{
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 4;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r10 = r_g0;
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r12 = heap32[(r12+2)];
+	r11 = heap32[(r11+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(r9+2)] = r_g0;
+	r11 = heap32[(fp+-8)];
+_17: do {
+if(!(r11 <1)) //_LBB490_8
+{
+	r11 = 0;
+_19: while(true){
+	r13 = heap32[(fp+-3)];
+	r13 = (r13 * r11)|0;
+	r14 = heap32[(fp+-2)];
+	r15 = (r11 * 3)|0;
+	r13 = (r14 + r13)|0;
+	r13 = r13 >> 2;
+	r14 = r15 << 2;
+	r14 = (r12 + r14)|0;
+	r15 = heap32[(r13)];
+	r14 = r14 >> 2;
+	heap32[(r14)] = r15;
+	r15 = heap32[(r13+1)];
+	heap32[(r14+1)] = r15;
+	r13 = heap32[(r13+2)];
+	r11 = (r11 + 1)|0;
+	heap32[(r14+2)] = r13;
+	r13 = heap32[(fp+-8)];
+if(!(r11 <r13)) //_LBB490_7
+{
+break _17;
+}
+}
+}
+} while(0);
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r11 = heap32[(r11+5)];
+	r12 = heap32[(r12+2)];
+	r13 = _2E_str349;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+}
+}
+}
+	r10 = heap32[(fp+-4)];
+_23: do {
+	if(r10 ==1) //_LBB490_22
+{
+	r10 = heap32[(fp+-7)];
+	if(r10 ==0) //_LBB490_29
+{
+break _23;
+}
+else{
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 32;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r10 = r_g0;
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r12 = heap32[(r12+2)];
+	r11 = heap32[(r11+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(r9+1)] = r_g0;
+	r9 = heap32[(fp+-7)];
+_26: do {
+if(!(r9 <1)) //_LBB490_26
+{
+	r11 = heap32[(fp+-1)];
+	r13 = heap32[(fp+-6)];
+	r11 = (r11 + 16)|0;
+	r14 = 0;
+_28: while(true){
+	r15 = r14 << 5;
+	r15 = (r12 + r15)|0;
+	llvm_move_double(r15,r11+-16);
+	r14 = (r14 + 1)|0;
+	r16 = (r11 + r13)|0;
+	llvm_move_double(r15+8,r11+-8);
+	llvm_move_double(r15+16,r11);
+	r11 = r16;
+if(!(r14 <r9)) //_LBB490_25
+{
+break _26;
+}
+}
+}
+} while(0);
+	r9 = heap32[(r5)];
+	r9 = r9 >> 2;
+	r11 = r10 >> 2;
+	r9 = heap32[(r9+5)];
+	r11 = heap32[(r11+2)];
+	r12 = _2E_str5354;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r11;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+}
+else{
+	if(r10 !=0) //_LBB490_27
+{
+if(!(uint(r10) <uint(2))) //_LBB490_29
+{
+__label__ = 28;
+break _3;
+}
+}
+else{
+	r10 = heap32[(fp+-7)];
+if(!(r10 ==0)) //_LBB490_29
+{
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 16;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r10 = r_g0;
+	r11 = heap32[(r5)];
+	r11 = r11 >> 2;
+	r12 = r10 >> 2;
+	r12 = heap32[(r12+2)];
+	r11 = heap32[(r11+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r12;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	heap32[(r9)] = r_g0;
+	r9 = heap32[(fp+-7)];
+_36: do {
+if(!(r9 <1)) //_LBB490_21
+{
+	r9 = 0;
+_38: while(true){
+	r11 = heap32[(fp+-6)];
+	r13 = heap32[(fp+-1)];
+	r11 = (r11 * r9)|0;
+	r14 = r9 << 4;
+	r14 = (r12 + r14)|0;
+	r11 = (r13 + r11)|0;
+	r13 = r14 >> 2;
+	r11 = r11 >> 2;
+	heap32[(r13)] = heap32[(r11)];
+	r9 = (r9 + 1)|0;
+	heap32[(r13+1)] = heap32[(r11+1)];
+	heap32[(r13+2)] = heap32[(r11+2)];
+	r11 = heap32[(fp+-7)];
+if(!(r9 <r11)) //_LBB490_20
+{
+break _36;
+}
+}
+}
+} while(0);
+	r9 = heap32[(r5)];
+	r9 = r9 >> 2;
+	r11 = r10 >> 2;
+	r9 = heap32[(r9+5)];
+	r11 = heap32[(r11+2)];
+	r12 = _2E_str5223;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r11;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+}
+}
+} while(0);
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r8;
+	r8 = (r8 + 1)|0;
+	r7 = (r7 + 28)|0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+else{
+__label__ = 31;
+break _3;
+}
+}
+switch(__label__ ){//multiple entries
+case 31:
+	r0 = heap32[(r5)];
+	r0 = r0 >> 2;
+	r5 = r2 >> 2;
+	r0 = heap32[(r0+5)];
+	r5 = heap32[(r5+2)];
+	r6 = _2E_str7356;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = 1497453121;
+	heap32[(g0+4)] = r5;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+break;
+case 28:
+	r0 = _2E_str6355;
+	r1 = _2E_str3352;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 319;
+	_assert(i7);
+break;
+case 14:
+	r0 = _2E_str10;
+	r1 = _2E_str3352;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 271;
+	_assert(i7);
+break;
+}
+}
+	heap32[(r3+1)] = heap32[(r1+1)];
+	heap32[(r3+2)] = heap32[(r1+2)];
+	heap32[(r3+3)] = heap32[(r1+3)];
+	heap32[(r3+4)] = heap32[(r1+4)];
+	r0 = _2E_str8357;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK23btStridingMeshInterface27InternalProcessAllTrianglesEP31btInternalTriangleIndexCallbackRK9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -120;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+7)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r3 = heap32[(fp+1)];
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r1+2)];
+	f2 = heapFloat[(r1+3)];
+	r4 = 0;
+_1: while(true){
+	if(r4 <r2) //_LBB491_1
+{
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+4)];
+	r6 = sp + -4;
+	r7 = sp + -28;
+	r8 = sp + -16;
+	r9 = sp + -24;
+	r10 = sp + -8;
+	r11 = sp + -12;
+	r12 = sp + -32;
+	r13 = sp + -20;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r8;
+	heap32[(g0+4)] = r9;
+	heap32[(g0+5)] = r10;
+	heap32[(g0+6)] = r11;
+	heap32[(g0+7)] = r12;
+	heap32[(g0+8)] = r13;
+	heap32[(g0+9)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = heap32[(fp+-4)];
+_4: do {
+	if(r5 ==1) //_LBB491_13
+{
+	r5 = heap32[(fp+-5)];
+	if(r5 ==3) //_LBB491_17
+{
+	r5 = heap32[(fp+-8)];
+	if(r5 <1) //_LBB491_25
+{
+break _4;
+}
+else{
+	r5 = 0;
+_9: while(true){
+	r6 = heap32[(fp+-3)];
+	r7 = heap32[(fp+-2)];
+	r6 = (r6 * r5)|0;
+	r8 = heapU16[(r7+r6)>>1];
+	r9 = heap32[(fp+-6)];
+	r10 = heap32[(fp+-1)];
+	r8 = (r8 * r9)|0;
+	r11 = (r10 + r8)|0;
+	f3 = llvm_readDouble((r10+r8));
+	f4 = llvm_readDouble((r11+16));
+	f5 = llvm_readDouble((r11+8));
+	f3 = f3; //fdtos f3, f3
+	r8 = sp + -80;
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	r11 = r8 >> 2;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(fp+-20)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r11+1)] = f5;
+	heapFloat[(r11+2)] = f3;
+	r6 = (r7 + r6)|0;
+	heap32[(r11+3)] = 0;
+	r7 = heapU16[(r6+2)>>1];
+	r7 = (r7 * r9)|0;
+	r12 = (r10 + r7)|0;
+	f3 = llvm_readDouble((r10+r7));
+	f3 = f3; //fdtos f3, f3
+	f4 = llvm_readDouble((r12+16));
+	f5 = llvm_readDouble((r12+8));
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(r11+4)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r11+5)] = f5;
+	heapFloat[(r11+6)] = f3;
+	heap32[(r11+7)] = 0;
+	r6 = heapU16[(r6+4)>>1];
+	r6 = (r6 * r9)|0;
+	r7 = (r10 + r6)|0;
+	f3 = llvm_readDouble((r10+r6));
+	f3 = f3; //fdtos f3, f3
+	f4 = llvm_readDouble((r7+16));
+	f5 = llvm_readDouble((r7+8));
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(r11+8)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r11+9)] = f5;
+	heapFloat[(r11+10)] = f3;
+	r6 = r3 >> 2;
+	heap32[(r11+11)] = 0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	r5 = (r5 + 1)|0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(fp+-8)];
+	if(r5 <r6) //_LBB491_20
+{
+continue _9;
+}
+else{
+break _4;
+}
+}
+}
+}
+else{
+	if(r5 !=2) //_LBB491_21
+{
+	r5 = (r5 + -2)|0;
+if(!(uint(r5) <uint(2))) //_LBB491_25
+{
+__label__ = 22;
+break _1;
+}
+}
+else{
+	r5 = heap32[(fp+-8)];
+	if(r5 <1) //_LBB491_25
+{
+break _4;
+}
+else{
+	r5 = 0;
+_16: while(true){
+	r6 = heap32[(fp+-3)];
+	r7 = heap32[(fp+-2)];
+	r6 = (r6 * r5)|0;
+	r6 = (r7 + r6)|0;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r8 = heap32[(fp+-6)];
+	r9 = heap32[(fp+-1)];
+	r7 = (r8 * r7)|0;
+	r10 = (r9 + r7)|0;
+	f3 = llvm_readDouble((r9+r7));
+	f4 = llvm_readDouble((r10+16));
+	f5 = llvm_readDouble((r10+8));
+	f3 = f3; //fdtos f3, f3
+	r7 = sp + -80;
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	r10 = r7 >> 2;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(fp+-20)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r10+1)] = f5;
+	heapFloat[(r10+2)] = f3;
+	heap32[(r10+3)] = 0;
+	r11 = heap32[(r6+1)];
+	r11 = (r8 * r11)|0;
+	r12 = (r9 + r11)|0;
+	f3 = llvm_readDouble((r9+r11));
+	f3 = f3; //fdtos f3, f3
+	f4 = llvm_readDouble((r12+16));
+	f5 = llvm_readDouble((r12+8));
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(r10+4)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r10+5)] = f5;
+	heapFloat[(r10+6)] = f3;
+	heap32[(r10+7)] = 0;
+	r6 = heap32[(r6+2)];
+	r6 = (r8 * r6)|0;
+	r8 = (r9 + r6)|0;
+	f3 = llvm_readDouble((r9+r6));
+	f3 = f3; //fdtos f3, f3
+	f4 = llvm_readDouble((r8+16));
+	f5 = llvm_readDouble((r8+8));
+	f5 = f5; //fdtos f5, f5
+	f3 = f3*f0;
+	f4 = f4; //fdtos f4, f4
+	f5 = f5*f1;
+	heapFloat[(r10+8)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r10+9)] = f5;
+	heapFloat[(r10+10)] = f3;
+	r6 = r3 >> 2;
+	heap32[(r10+11)] = 0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	r5 = (r5 + 1)|0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(fp+-8)];
+	if(r5 <r6) //_LBB491_19
+{
+continue _16;
+}
+else{
+break _4;
+}
+}
+}
+}
+}
+}
+else{
+	if(r5 !=0) //_LBB491_23
+{
+if(!(uint(r5) <uint(2))) //_LBB491_25
+{
+__label__ = 24;
+break _1;
+}
+}
+else{
+	r5 = heap32[(fp+-5)];
+	if(r5 ==3) //_LBB491_7
+{
+	r5 = heap32[(fp+-8)];
+	if(r5 <1) //_LBB491_25
+{
+break _4;
+}
+else{
+	r5 = 0;
+_25: while(true){
+	r6 = heap32[(fp+-3)];
+	r7 = heap32[(fp+-2)];
+	r6 = (r6 * r5)|0;
+	r8 = heapU16[(r7+r6)>>1];
+	r9 = heap32[(fp+-6)];
+	r10 = heap32[(fp+-1)];
+	r8 = (r8 * r9)|0;
+	r8 = (r10 + r8)|0;
+	r8 = r8 >> 2;
+	f3 = heapFloat[(r8)];
+	f4 = heapFloat[(r8+2)];
+	f5 = heapFloat[(r8+1)];
+	r8 = sp + -80;
+	f3 = f3*f0;
+	r11 = r8 >> 2;
+	f5 = f5*f1;
+	heapFloat[(fp+-20)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r11+1)] = f5;
+	heapFloat[(r11+2)] = f3;
+	r6 = (r7 + r6)|0;
+	heap32[(r11+3)] = 0;
+	r7 = heapU16[(r6+2)>>1];
+	r7 = (r7 * r9)|0;
+	r7 = (r10 + r7)|0;
+	r7 = r7 >> 2;
+	f3 = heapFloat[(r7+2)];
+	f4 = heapFloat[(r7+1)];
+	f5 = heapFloat[(r7)];
+	f5 = f5*f0;
+	f4 = f4*f1;
+	heapFloat[(r11+4)] = f5;
+	f3 = f3*f2;
+	heapFloat[(r11+5)] = f4;
+	heapFloat[(r11+6)] = f3;
+	heap32[(r11+7)] = 0;
+	r6 = heapU16[(r6+4)>>1];
+	r6 = (r6 * r9)|0;
+	r6 = (r10 + r6)|0;
+	r6 = r6 >> 2;
+	f3 = heapFloat[(r6+2)];
+	f4 = heapFloat[(r6+1)];
+	f5 = heapFloat[(r6)];
+	f5 = f5*f0;
+	f4 = f4*f1;
+	heapFloat[(r11+8)] = f5;
+	f3 = f3*f2;
+	heapFloat[(r11+9)] = f4;
+	heapFloat[(r11+10)] = f3;
+	r6 = r3 >> 2;
+	heap32[(r11+11)] = 0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	r5 = (r5 + 1)|0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(fp+-8)];
+	if(r5 <r6) //_LBB491_10
+{
+continue _25;
+}
+else{
+break _4;
+}
+}
+}
+}
+else{
+	if(r5 !=2) //_LBB491_11
+{
+	r5 = (r5 + -2)|0;
+if(!(uint(r5) <uint(2))) //_LBB491_25
+{
+__label__ = 12;
+break _1;
+}
+}
+else{
+	r5 = heap32[(fp+-8)];
+if(!(r5 <1)) //_LBB491_25
+{
+	r5 = 0;
+_32: while(true){
+	r6 = heap32[(fp+-3)];
+	r7 = heap32[(fp+-2)];
+	r6 = (r6 * r5)|0;
+	r6 = (r7 + r6)|0;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r8 = heap32[(fp+-6)];
+	r9 = heap32[(fp+-1)];
+	r7 = (r8 * r7)|0;
+	r7 = (r9 + r7)|0;
+	r7 = r7 >> 2;
+	f3 = heapFloat[(r7)];
+	f4 = heapFloat[(r7+2)];
+	f5 = heapFloat[(r7+1)];
+	r7 = sp + -80;
+	f3 = f3*f0;
+	r10 = r7 >> 2;
+	f5 = f5*f1;
+	heapFloat[(fp+-20)] = f3;
+	f3 = f4*f2;
+	heapFloat[(r10+1)] = f5;
+	heapFloat[(r10+2)] = f3;
+	heap32[(r10+3)] = 0;
+	r11 = heap32[(r6+1)];
+	r11 = (r8 * r11)|0;
+	r11 = (r9 + r11)|0;
+	r11 = r11 >> 2;
+	f3 = heapFloat[(r11+2)];
+	f4 = heapFloat[(r11+1)];
+	f5 = heapFloat[(r11)];
+	f5 = f5*f0;
+	f4 = f4*f1;
+	heapFloat[(r10+4)] = f5;
+	f3 = f3*f2;
+	heapFloat[(r10+5)] = f4;
+	heapFloat[(r10+6)] = f3;
+	heap32[(r10+7)] = 0;
+	r6 = heap32[(r6+2)];
+	r6 = (r8 * r6)|0;
+	r6 = (r9 + r6)|0;
+	r6 = r6 >> 2;
+	f3 = heapFloat[(r6+2)];
+	f4 = heapFloat[(r6+1)];
+	f5 = heapFloat[(r6)];
+	f5 = f5*f0;
+	f4 = f4*f1;
+	heapFloat[(r10+8)] = f5;
+	f3 = f3*f2;
+	heapFloat[(r10+9)] = f4;
+	heapFloat[(r10+10)] = f3;
+	r6 = r3 >> 2;
+	heap32[(r10+11)] = 0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	r5 = (r5 + 1)|0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(fp+-8)];
+if(!(r5 <r6)) //_LBB491_9
+{
+break _4;
+}
+}
+}
+}
+}
+}
+}
+} while(0);
+	r5 = heap32[(r1)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	r4 = (r4 + 1)|0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+continue _1;
+}
+else{
+__label__ = 27;
+break _1;
+}
+}
+switch(__label__ ){//multiple entries
+case 27:
+	return;
+break;
+case 22:
+	r0 = _2E_str9358;
+	r1 = _2E_str3352;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 134;
+	_assert(i7);
+break;
+case 24:
+	r0 = _2E_str6355;
+	r1 = _2E_str3352;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 139;
+	_assert(i7);
+break;
+case 12:
+	r0 = _2E_str9358;
+	r1 = _2E_str3352;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 92;
+	_assert(i7);
+break;
+}
+}
+
+function _ZN23btStridingMeshInterfaceD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btStridingMeshInterface;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btStridingMeshInterfaceD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btStridingMeshInterface;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN31btInternalTriangleIndexCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN31btInternalTriangleIndexCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN18btTriangleCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN18btTriangleCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN26btTriangleIndexVertexArray16unLockVertexBaseEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray24unLockReadOnlyVertexBaseEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN26btTriangleIndexVertexArray19preallocateVerticesEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN26btTriangleIndexVertexArray18preallocateIndicesEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray14hasPremadeAabbEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+12)];
+	r1 = 1;
+	r0 = r0 == r1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray14setPremadeAabbERK9btVector3S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r0+13)] = heap32[(r1)];
+	heap32[(r0+14)] = heap32[(r1+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(r0+15)] = heap32[(r1+2)];
+	r2 = r2 >> 2;
+	heap32[(r0+16)] = heap32[(r1+3)];
+	heap32[(r0+17)] = heap32[(r2)];
+	heap32[(r0+18)] = heap32[(r2+1)];
+	heap32[(r0+19)] = heap32[(r2+2)];
+	heap32[(r0+20)] = heap32[(r2+3)];
+	heap32[(r0+12)] = 1;
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray14getPremadeAabbEP9btVector3S1_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r1)] = heap32[(r0+13)];
+	heap32[(r1+1)] = heap32[(r0+14)];
+	r2 = heap32[(fp+2)];
+	heap32[(r1+2)] = heap32[(r0+15)];
+	r2 = r2 >> 2;
+	heap32[(r1+3)] = heap32[(r0+16)];
+	heap32[(r2)] = heap32[(r0+17)];
+	heap32[(r2+1)] = heap32[(r0+18)];
+	heap32[(r2+2)] = heap32[(r0+19)];
+	heap32[(r2+3)] = heap32[(r0+20)];
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray14getNumSubPartsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+6)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK26btTriangleIndexVertexArray32getLockedReadOnlyVertexIndexBaseEPPKhRiR14PHY_ScalarTypeS3_S2_S3_S3_S5_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+9)];
+	r0 = r0 >> 2;
+	r1 = r1 << 5;
+	r0 = heap32[(r0+8)];
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(r0+3)];
+	r1 = r1 >> 2;
+	r3 = heap32[(fp+1)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0+4)];
+	r3 = heap32[(fp+3)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0+7)];
+	r3 = heap32[(fp+4)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0+5)];
+	r3 = heap32[(fp+7)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0)];
+	r3 = heap32[(fp+5)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0+1)];
+	r3 = heap32[(fp+6)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r2 = heap32[(r0+2)];
+	r3 = heap32[(fp+8)];
+	heap32[(r1)] = r2;
+	r1 = r3 >> 2;
+	r0 = heap32[(r0+6)];
+	heap32[(r1)] = r0;
+	return;
+}
+
+function _ZN26btTriangleIndexVertexArray24getLockedVertexIndexBaseEPPhRiR14PHY_ScalarTypeS2_S1_S2_S2_S4_i(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+7)];
+	r3 = heap32[(fp+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r_g0;
+	if(r0 >r3) //_LBB507_2
+{
+	r0 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	r5 = heap32[(fp+4)];
+	r6 = heap32[(fp+5)];
+	r7 = heap32[(fp+6)];
+	r8 = heap32[(fp+7)];
+	r9 = heap32[(fp+8)];
+	r3 = r3 << 5;
+	r1 = heap32[(r1+8)];
+	r1 = (r1 + r3)|0;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1+3)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r3;
+	r0 = r0 >> 2;
+	r2 = heap32[(r1+4)];
+	heap32[(r0)] = r2;
+	r0 = r4 >> 2;
+	r2 = heap32[(r1+7)];
+	heap32[(r0)] = r2;
+	r0 = r5 >> 2;
+	r2 = heap32[(r1+5)];
+	heap32[(r0)] = r2;
+	r0 = r8 >> 2;
+	r2 = heap32[(r1)];
+	heap32[(r0)] = r2;
+	r0 = r6 >> 2;
+	r2 = heap32[(r1+1)];
+	heap32[(r0)] = r2;
+	r0 = r7 >> 2;
+	r2 = heap32[(r1+2)];
+	heap32[(r0)] = r2;
+	r0 = r9 >> 2;
+	r1 = heap32[(r1+6)];
+	heap32[(r0)] = r1;
+	return;
+}
+else{
+	r1 = _2E_str367;
+	r3 = _2E_str1368;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 41;
+	_assert(i7);
+}
+}
+
+function _ZN26btTriangleIndexVertexArrayD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV26btTriangleIndexVertexArray;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+8)];
+if(!(r1 ==0)) //_LBB508_4
+{
+	r3 = heapU8[r0+36];
+if(!(r3 ==0)) //_LBB508_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+8)] = 0;
+}
+	r1 = 1;
+	heap8[r0+36] = r1;
+	heap32[(r2+8)] = 0;
+	r1 = _ZTV23btStridingMeshInterface;
+	heap32[(r2+6)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB508_6
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+
+function _ZN26btTriangleIndexVertexArrayD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV26btTriangleIndexVertexArray;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+8)];
+if(!(r1 ==0)) //_LBB509_4
+{
+	r3 = heapU8[r0+36];
+if(!(r3 ==0)) //_LBB509_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+8)] = 0;
+}
+	r1 = 1;
+	heap8[r0+36] = r1;
+	heap32[(r2+8)] = 0;
+	r0 = _ZTV23btStridingMeshInterface;
+	heap32[(r2+6)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2)] = r0;
+	return;
+}
+
+function _ZNK19btTriangleMeshShape7getNameEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _2E_str372;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK19btTriangleMeshShape7getAabbERK11btTransformR9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	f0 = heapFloat[(r1+10)];
+	f1 = heapFloat[(r1+6)];
+	f2 = heapFloat[(r1+9)];
+	f3 = heapFloat[(r1+5)];
+	f4 = heapFloat[(r1+8)];
+	f5 = heapFloat[(r1+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f6 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	f7 = f_g0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+11)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = heap32[(fp+1)];
+	f4 = f4-f5;
+	f5 =                       0.5;
+	f2 = f2-f3;
+	f0 = f0-f1;
+	f1 = heapFloat[(r1+10)];
+	f3 = heapFloat[(r1+6)];
+	f9 = heapFloat[(r1+9)];
+	f10 = heapFloat[(r1+5)];
+	f11 = heapFloat[(r1+8)];
+	f12 = heapFloat[(r1+4)];
+	r0 = r0 >> 2;
+	f4 = f4*f5;
+	f2 = f2*f5;
+	f0 = f0*f5;
+	f1 = f1+f3;
+	f3 = f9+f10;
+	f9 = f11+f12;
+	f10 = heapFloat[(r0+10)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	f4 = f4+f_g0;
+	f2 = f2+f7;
+	f0 = f0+f6;
+	f1 = f1*f5;
+	f3 = f3*f5;
+	f5 = f9*f5;
+	f6 =                         0;
+	if(f10 <f6) //_LBB511_2
+{
+	f7 = -f10;
+}
+else{
+	f7 = f10;
+}
+	f8 = heapFloat[(r0+9)];
+	if(f8 <f6) //_LBB511_5
+{
+	f9 = -f8;
+}
+else{
+	f9 = f8;
+}
+	f11 = heapFloat[(r0+8)];
+	if(f11 <f6) //_LBB511_8
+{
+	f12 = -f11;
+}
+else{
+	f12 = f11;
+}
+	f13 = heapFloat[(r0+6)];
+	if(f13 <f6) //_LBB511_11
+{
+	f14 = -f13;
+}
+else{
+	f14 = f13;
+}
+	f15 = heapFloat[(r0+5)];
+	if(f15 <f6) //_LBB511_14
+{
+	f16 = -f15;
+}
+else{
+	f16 = f15;
+}
+	f17 = heapFloat[(r0+4)];
+	if(f17 <f6) //_LBB511_17
+{
+	f18 = -f17;
+}
+else{
+	f18 = f17;
+}
+	f19 = heapFloat[(r0+2)];
+	if(f19 <f6) //_LBB511_20
+{
+	f20 = -f19;
+}
+else{
+	f20 = f19;
+}
+	f21 = heapFloat[(r0+1)];
+	if(f21 <f6) //_LBB511_23
+{
+	f22 = -f21;
+}
+else{
+	f22 = f21;
+}
+	f23 = heapFloat[(r0)];
+	if(f23 <f6) //_LBB511_26
+{
+	f6 = -f23;
+}
+else{
+	f6 = f23;
+}
+	f23 = f23*f5;
+	f21 = f21*f3;
+	f17 = f17*f5;
+	f15 = f15*f3;
+	f21 = f23+f21;
+	f19 = f19*f1;
+	f6 = f6*f4;
+	f22 = f22*f2;
+	f5 = f11*f5;
+	f3 = f8*f3;
+	f8 = f17+f15;
+	f11 = f13*f1;
+	f13 = f18*f4;
+	f15 = f16*f2;
+	f16 = f21+f19;
+	f17 = heapFloat[(r0+12)];
+	f6 = f6+f22;
+	f18 = f20*f0;
+	f3 = f5+f3;
+	f1 = f10*f1;
+	f4 = f12*f4;
+	f2 = f9*f2;
+	f5 = f8+f11;
+	f8 = heapFloat[(r0+13)];
+	f9 = heapFloat[(r0+14)];
+	f10 = f13+f15;
+	f11 = f14*f0;
+	f12 = f16+f17;
+	f6 = f6+f18;
+	f1 = f3+f1;
+	r0 = r1 >> 2;
+	f2 = f4+f2;
+	f0 = f7*f0;
+	f3 = f5+f8;
+	f4 = f10+f11;
+	f5 = f12-f6;
+	f1 = f1+f9;
+	f0 = f2+f0;
+	f2 = f3-f4;
+	heapFloat[(r0)] = f5;
+	f5 = f1-f0;
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f5;
+	r1 = r2 >> 2;
+	f2 = f12+f6;
+	heap32[(r0+3)] = 0;
+	f3 = f3+f4;
+	heapFloat[(r1)] = f2;
+	f0 = f1+f0;
+	heapFloat[(r1+1)] = f3;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+
+function _ZN19btTriangleMeshShape15recalcLocalAabbEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = 0;
+_1: while(true){
+	r2 = sp + -16;
+	r3 = r2 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	r4 = (r2 + r1)|0;
+	heap32[(r3+3)] = 0;
+	r3 = r4 >> 2;
+	heap32[(r3)] = 1065353216;
+	r4 = r0 >> 2;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+16)];
+	r6 = sp + -32;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	r7 = (r6 + r1)|0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = r7 >> 2;
+	r7 = (r0 + r1)|0;
+	f0 = heapFloat[(r5)];
+	f1 = heapFloat[(r4+3)];
+	f0 = f0+f1;
+	r7 = r7 >> 2;
+	heapFloat[(r7+8)] = f0;
+	heap32[(r3)] = -1082130432;
+	r3 = heap32[(r4)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+16)];
+	r8 = sp + -48;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r6 >> 2;
+	r3 = r8 >> 2;
+	heap32[(fp+-8)] = heap32[(fp+-12)];
+	heap32[(r2+1)] = heap32[(r3+1)];
+	heap32[(r2+2)] = heap32[(r3+2)];
+	heap32[(r2+3)] = heap32[(r3+3)];
+	f0 = heapFloat[(r5)];
+	f1 = heapFloat[(r4+3)];
+	r1 = (r1 + 4)|0;
+	f0 = f0-f1;
+	heapFloat[(r7+4)] = f0;
+	if(r1 !=12) //_LBB512_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	return;
+}
+
+function _ZN21SupportVertexCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN21SupportVertexCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN21SupportVertexCallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r1+22)];
+	f1 = heapFloat[(r0)];
+	f2 = heapFloat[(r1+23)];
+	f3 = heapFloat[(r0+1)];
+	f4 = heapFloat[(r1+24)];
+	f5 = heapFloat[(r0+2)];
+	f1 = f0*f1;
+	f3 = f2*f3;
+	f1 = f1+f3;
+	f3 = f4*f5;
+	f5 = heapFloat[(r1+21)];
+	f1 = f1+f3;
+	if(f5 <f1) //_LBB515_2
+{
+	heapFloat[(r1+21)] = f1;
+	heap32[(r1+1)] = heap32[(r0)];
+	heap32[(r1+2)] = heap32[(r0+1)];
+	heap32[(r1+3)] = heap32[(r0+2)];
+	heap32[(r1+4)] = heap32[(r0+3)];
+	f5 = f1;
+}
+	f1 = heapFloat[(r0+4)];
+	f3 = heapFloat[(r0+5)];
+	f1 = f0*f1;
+	f3 = f2*f3;
+	f6 = heapFloat[(r0+6)];
+	f1 = f1+f3;
+	f3 = f4*f6;
+	f1 = f1+f3;
+	if(f5 <f1) //_LBB515_7
+{
+	heapFloat[(r1+21)] = f1;
+	heap32[(r1+1)] = heap32[(r0+4)];
+	heap32[(r1+2)] = heap32[(r0+5)];
+	heap32[(r1+3)] = heap32[(r0+6)];
+	heap32[(r1+4)] = heap32[(r0+7)];
+	f5 = f1;
+}
+	f1 = heapFloat[(r0+8)];
+	f3 = heapFloat[(r0+9)];
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = heapFloat[(r0+10)];
+	f0 = f0+f1;
+	f1 = f4*f2;
+	f0 = f0+f1;
+	if(f5 <f0) //_LBB515_8
+{
+	heapFloat[(r1+21)] = f0;
+	heap32[(r1+1)] = heap32[(r0+8)];
+	heap32[(r1+2)] = heap32[(r0+9)];
+	heap32[(r1+3)] = heap32[(r0+10)];
+	heap32[(r1+4)] = heap32[(r0+11)];
+	return;
+}
+else{
+	return;
+}
+}
+
+function _ZN19btTriangleMeshShape15setLocalScalingERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r1 = heap32[(r1+12)];
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	heap32[(r1+1)] = heap32[(r2)];
+	heap32[(r1+2)] = heap32[(r2+1)];
+	heap32[(r1+3)] = heap32[(r2+2)];
+	heap32[(r1+4)] = heap32[(r2+3)];
+	heap32[(g0)] = r0;
+	_ZN19btTriangleMeshShape15recalcLocalAabbEv(i7);
+	return;
+}
+
+function _ZNK19btTriangleMeshShape15getLocalScalingEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+12)];
+	r0 = (r0 + 4)|0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV31btInternalTriangleIndexCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallback28internalProcessTriangleIndexEPS2_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp)];
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+4)];
+	f2 = heapFloat[(r1+8)];
+	f3 = f0 < f1 ? f0 : f1;
+	r2 = r2 >> 2;
+	f3 = f3 < f2 ? f3 : f2;
+	f4 = heapFloat[(r2+6)];
+if(!(f3 >f4)) //_LBB520_7
+{
+	f0 = f0 > f1 ? f0 : f1;
+	f0 = f0 > f2 ? f0 : f2;
+	f1 = heapFloat[(r2+2)];
+if(!(f0 <f1)) //_LBB520_7
+{
+	f0 = heapFloat[(r1+2)];
+	f1 = heapFloat[(r1+6)];
+	f2 = heapFloat[(r1+10)];
+	f3 = f0 < f1 ? f0 : f1;
+	f3 = f3 < f2 ? f3 : f2;
+	f4 = heapFloat[(r2+8)];
+if(!(f3 >f4)) //_LBB520_7
+{
+	f0 = f0 > f1 ? f0 : f1;
+	f0 = f0 > f2 ? f0 : f2;
+	f1 = heapFloat[(r2+4)];
+if(!(f0 <f1)) //_LBB520_7
+{
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r1+5)];
+	f2 = heapFloat[(r1+9)];
+	f3 = f0 < f1 ? f0 : f1;
+	f3 = f3 < f2 ? f3 : f2;
+	f4 = heapFloat[(r2+7)];
+if(!(f3 >f4)) //_LBB520_7
+{
+	f0 = f0 > f1 ? f0 : f1;
+	f0 = f0 > f2 ? f0 : f2;
+	f1 = heapFloat[(r2+3)];
+if(!(f0 <f1)) //_LBB520_7
+{
+	r1 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r2 = heap32[(r2+1)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+}
+}
+}
+}
+}
+}
+	return;
+}
+
+function _ZNK19btTriangleMeshShape21calculateLocalInertiaEfR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str10;
+	r1 = _2E_str3375;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 188;
+	_assert(i7);
+}
+
+function _ZNK19btTriangleMeshShape24localGetSupportingVertexERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -152;var g0 = i7>>2; // save stack
+	r0 = _ZTV21SupportVertexCallback;
+	r1 = sp + -120;
+	r0 = (r0 + 8)|0;
+	r2 = r1 >> 2;
+	heap32[(fp+-30)] = r0;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+5)] = 1065353216;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 1065353216;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 1065353216;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+17)] = 0;
+	heap32[(r2+18)] = 0;
+	heap32[(r2+19)] = 0;
+	r0 = heap32[(fp+2)];
+	heap32[(r2+20)] = 0;
+	r0 = r0 >> 2;
+	heap32[(r2+21)] = -581039253;
+	f0 =                         0;
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0)];
+	f3 = heapFloat[(r0+2)];
+	f4 = f1*f0;
+	f5 = f2*f0;
+	f2 = f2+f4;
+	f0 = f3*f0;
+	f1 = f5+f1;
+	f2 = f2+f0;
+	f4 = f5+f4;
+	f0 = f1+f0;
+	heapFloat[(r2+22)] = f2;
+	f1 = f4+f3;
+	heapFloat[(r2+23)] = f0;
+	heapFloat[(r2+24)] = f1;
+	r0 = sp + -136;
+	heap32[(r2+25)] = 0;
+	r3 = r0 >> 2;
+	heap32[(fp+-34)] = 1566444395;
+	heap32[(r3+1)] = 1566444395;
+	r4 = heap32[(fp+1)];
+	heap32[(r3+2)] = 1566444395;
+	r5 = r4 >> 2;
+	heap32[(r3+3)] = 0;
+	r3 = heap32[(r5)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+15)];
+	r5 = sp + -16;
+	r6 = r5 >> 2;
+	heap32[(fp+-4)] = -581039253;
+	heap32[(r6+1)] = -581039253;
+	heap32[(r6+2)] = -581039253;
+	heap32[(r6+3)] = 0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r0 = heap32[(fp)];
+	f0 = heapFloat[(r2+4)];
+	f1 = heapFloat[(r2+3)];
+	f2 = heapFloat[(r2+2)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = heap32[(r2+1)];
+	heapFloat[(r0+1)] = f2;
+	heapFloat[(r0+2)] = f1;
+	heapFloat[(r0+3)] = f0;
+	return;
+}
+
+function _ZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = _ZTVZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback;
+	r1 = sp + -40;
+	r0 = (r0 + 8)|0;
+	r2 = heap32[(fp+2)];
+	r3 = r1 >> 2;
+	r4 = heap32[(fp+1)];
+	heap32[(fp+-10)] = r0;
+	r0 = r2 >> 2;
+	heap32[(r3+1)] = r4;
+	heap32[(r3+2)] = heap32[(r0)];
+	heap32[(r3+3)] = heap32[(r0+1)];
+	r4 = heap32[(fp+3)];
+	heap32[(r3+4)] = heap32[(r0+2)];
+	r5 = r4 >> 2;
+	heap32[(r3+5)] = heap32[(r0+3)];
+	heap32[(r3+6)] = heap32[(r5)];
+	heap32[(r3+7)] = heap32[(r5+1)];
+	r0 = heap32[(fp)];
+	heap32[(r3+8)] = heap32[(r5+2)];
+	r0 = r0 >> 2;
+	heap32[(r3+9)] = heap32[(r5+3)];
+	r0 = heap32[(r0+12)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+
+function _ZN19btTriangleMeshShapeD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btConcaveShape;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN19btTriangleMeshShapeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV14btConcaveShape;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _GLOBAL__D__ZN19btGenericMemoryPool24allocate_from_free_nodesEj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btPointCollectorD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btPointCollector;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btPointCollectorD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV16btPointCollector;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btPointCollector20setShapeIdentifiersAEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btPointCollector20setShapeIdentifiersBEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN16btPointCollector15addContactPointERK9btVector3S2_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	f0 = heapFloat[(fp+3)];
+	r1 = r0 >> 2;
+	f1 = heapFloat[(r1+9)];
+if(!(f1 <=f0)) //_LBB531_2
+{
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = 1;
+	r2 = r2 >> 2;
+	heap8[r0+40] = r4;
+	heap32[(r1+1)] = heap32[(r2)];
+	heap32[(r1+2)] = heap32[(r2+1)];
+	heap32[(r1+3)] = heap32[(r2+2)];
+	r0 = r3 >> 2;
+	heap32[(r1+4)] = heap32[(r2+3)];
+	heap32[(r1+5)] = heap32[(r0)];
+	heap32[(r1+6)] = heap32[(r0+1)];
+	heap32[(r1+7)] = heap32[(r0+2)];
+	heap32[(r1+8)] = heap32[(r0+3)];
+	heapFloat[(r1+9)] = f0;
+}
+	return;
+}
+
+function _ZN27btContinuousConvexCollisionD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN27btContinuousConvexCollisionD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+var __label__ = 0;
+	i7 = sp + -816;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = 0;
+	r3 = r1 >> 2;
+	heap8[r1+312] = r2;
+	r4 = 1;
+	heap32[(r3)] = 0;
+	heap8[r1+356] = r4;
+	heap32[(r3+73)] = 1566444395;
+	heap32[(r3+74)] = 1566444395;
+	heap32[(r3+75)] = 1566444395;
+	heap32[(r3+76)] = 0;
+	heap8[r1+352] = r2;
+	heap32[(r3+84)] = 0;
+	heap32[(r3+85)] = 0;
+	heap32[(r3+86)] = 0;
+	heap32[(r3+87)] = 0;
+	r3 = heapU8[r1+332];
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+2)];
+	r3 = r3 & 240;
+	r7 = r6 >> 2;
+	heap8[r1+332] = r3;
+	r1 = r5 >> 2;
+	f0 = heapFloat[(r7+14)];
+	f1 = heapFloat[(r1+14)];
+	f2 = heapFloat[(r7+13)];
+	f3 = heapFloat[(r1+13)];
+	f4 = heapFloat[(r7+12)];
+	f5 = heapFloat[(r1+12)];
+	r3 = sp + -40;
+	r7 = sp + -44;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r7;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	r3 = r3 >> 2;
+	f6 = heapFloat[(r3+2)];
+	f7 = heapFloat[(fp+-11)];
+	f8 = heapFloat[(r3+1)];
+	f9 = heapFloat[(fp+-10)];
+	r3 = sp + -96;
+	f9 = f9*f7;
+	f8 = f8*f7;
+	r6 = r3 >> 2;
+	heapFloat[(fp+-24)] = f9;
+	f6 = f6*f7;
+	heapFloat[(r6+1)] = f8;
+	r7 = heap32[(fp+3)];
+	r8 = heap32[(fp+4)];
+	heapFloat[(r6+2)] = f6;
+	r9 = r8 >> 2;
+	heap32[(r6+3)] = 0;
+	r6 = r7 >> 2;
+	f7 = heapFloat[(r9+14)];
+	f10 = heapFloat[(r6+14)];
+	f11 = heapFloat[(r9+13)];
+	f12 = heapFloat[(r6+13)];
+	f13 = heapFloat[(r9+12)];
+	f14 = heapFloat[(r6+12)];
+	r9 = sp + -16;
+	r10 = sp + -20;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r10;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	r8 = r9 >> 2;
+	f15 = heapFloat[(r8+2)];
+	f16 = heapFloat[(fp+-5)];
+	f17 = heapFloat[(r8+1)];
+	f18 = heapFloat[(fp+-4)];
+	r8 = sp + -112;
+	f18 = f18*f16;
+	f17 = f17*f16;
+	r9 = r8 >> 2;
+	heapFloat[(fp+-28)] = f18;
+	f15 = f15*f16;
+	heapFloat[(r9+1)] = f17;
+	heapFloat[(r9+2)] = f15;
+	heap32[(r9+3)] = 0;
+	r9 = heap32[(r0+3)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+4)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	f16 = f_g0;
+	r9 = heap32[(r0+4)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+4)];
+	heap32[(g0)] = r9;
+	f9 = f9*f9;
+	f8 = f8*f8;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	f19 = f_g0;
+	f8 = f9+f8;
+	f6 = f6*f6;
+	f6 = f8+f6;
+	heapFloat[(g0)] = f6;
+	f6 = f18*f18;
+	f8 = f17*f17;
+	sqrtf(i7);
+	f9 = f_g0;
+	f11 = f11-f12;
+	f2 = f2-f3;
+	f3 = f13-f14;
+	f4 = f4-f5;
+	f5 = f6+f8;
+	f6 = f15*f15;
+	f8 = f11-f2;
+	f12 = f3-f4;
+	f7 = f7-f10;
+	f0 = f0-f1;
+	f1 = f5+f6;
+	f5 = f7-f0;
+	heapFloat[(g0)] = f1;
+	f1 = f12*f12;
+	f6 = f8*f8;
+	sqrtf(i7);
+	f1 = f1+f6;
+	f6 = f5*f5;
+	f1 = f1+f6;
+	f6 = f9*f16;
+	f9 = f_g0*f19;
+	heapFloat[(g0)] = f1;
+	f1 = f6+f9;
+	sqrtf(i7);
+	f6 = f_g0+f1;
+	f9 =                         0;
+_1: do {
+if(!(f6 ==f9)) //_LBB534_21
+{
+	r9 = _ZTV16btPointCollector;
+	r9 = (r9 + 8)|0;
+	r10 = sp + -176;
+	heap32[(fp+-44)] = r9;
+	r11 = r10 >> 2;
+	heap32[(r11+9)] = 1566444395;
+	heap8[sp+-136] = r2;
+	r12 = heap32[(r0+4)];
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+11)];
+	r14 = heap32[(r0+2)];
+	r15 = heap32[(r0+1)];
+	heap32[(g0)] = r12;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	f6 = f_g0;
+	r12 = heap32[(r0+3)];
+	r13 = r12 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+11)];
+	heap32[(g0)] = r12;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r12 = heap32[(r0+4)];
+	r13 = heap32[(r0+3)];
+	r16 = r12 >> 2;
+	r17 = r13 >> 2;
+	r18 = _ZTV17btGjkPairDetector;
+	r16 = heap32[(r16+1)];
+	r17 = heap32[(r17+1)];
+	r19 = sp + -256;
+	r18 = (r18 + 8)|0;
+	r20 = r19 >> 2;
+	heap32[(fp+-64)] = r18;
+	heap32[(r20+1)] = 0;
+	heap32[(r20+2)] = 1065353216;
+	heap32[(r20+3)] = 0;
+	heap32[(r20+4)] = 0;
+	heap32[(r20+5)] = r14;
+	heap32[(r20+6)] = r15;
+	heap32[(r20+7)] = r13;
+	heap32[(r20+8)] = r12;
+	heap32[(r20+9)] = r17;
+	heap32[(r20+10)] = r16;
+	heapFloat[(r20+11)] = f_g0;
+	heapFloat[(r20+12)] = f6;
+	heap8[sp+-204] = r2;
+	r12 = sp + -392;
+	heap32[(r20+15)] = -1;
+	r13 = r12 >> 2;
+	heap32[(r20+18)] = 1;
+	heap32[(r13+32)] = 1566444395;
+	heap32[(r13+33)] = 0;
+	heap32[(fp+-98)] = heap32[(r1)];
+	heap32[(r13+1)] = heap32[(r1+1)];
+	heap32[(r13+2)] = heap32[(r1+2)];
+	heap32[(r13+3)] = heap32[(r1+3)];
+	heap32[(r13+4)] = heap32[(r1+4)];
+	heap32[(r13+5)] = heap32[(r1+5)];
+	heap32[(r13+6)] = heap32[(r1+6)];
+	heap32[(r13+7)] = heap32[(r1+7)];
+	heap32[(r13+8)] = heap32[(r1+8)];
+	heap32[(r13+9)] = heap32[(r1+9)];
+	heap32[(r13+10)] = heap32[(r1+10)];
+	heap32[(r13+11)] = heap32[(r1+11)];
+	heap32[(r13+12)] = heap32[(r1+12)];
+	heap32[(r13+13)] = heap32[(r1+13)];
+	heap32[(r13+14)] = heap32[(r1+14)];
+	heap32[(r13+15)] = heap32[(r1+15)];
+	heap32[(r13+16)] = heap32[(r6)];
+	heap32[(r13+17)] = heap32[(r6+1)];
+	heap32[(r13+18)] = heap32[(r6+2)];
+	heap32[(r13+19)] = heap32[(r6+3)];
+	heap32[(r13+20)] = heap32[(r6+4)];
+	heap32[(r13+21)] = heap32[(r6+5)];
+	heap32[(r13+22)] = heap32[(r6+6)];
+	heap32[(r13+23)] = heap32[(r6+7)];
+	heap32[(r13+24)] = heap32[(r6+8)];
+	heap32[(r13+25)] = heap32[(r6+9)];
+	heap32[(r13+26)] = heap32[(r6+10)];
+	heap32[(r13+27)] = heap32[(r6+11)];
+	heap32[(r13+28)] = heap32[(r6+12)];
+	heap32[(r13+29)] = heap32[(r6+13)];
+	heap32[(r13+30)] = heap32[(r6+14)];
+	heap32[(r13+31)] = heap32[(r6+15)];
+	heap32[(g0)] = r19;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	f6 = heapFloat[(r11+5)];
+	r1 = heapU8[sp+-136];
+	r6 = sp + -128;
+	heapFloat[(fp+-32)] = f6;
+	f10 = heapFloat[(r11+6)];
+	r10 = r6 >> 2;
+	heapFloat[(r10+1)] = f10;
+	f13 = heapFloat[(r11+7)];
+	heapFloat[(r10+2)] = f13;
+	f14 = heapFloat[(r11+8)];
+	heapFloat[(r10+3)] = f14;
+if(!(r1 ==0)) //_LBB534_21
+{
+	r1 = heap32[(fp+5)];
+	f15 = heapFloat[(r11+1)];
+	f16 = heapFloat[(r11+2)];
+	f17 = heapFloat[(r11+3)];
+	f18 = f12*f15;
+	f19 = f8*f16;
+	r12 = sp + -456;
+	f18 = f18+f19;
+	f19 = f5*f17;
+	f20 = heapFloat[(r11+9)];
+	f21 = heapFloat[(r11+4)];
+	f18 = f18+f19;
+	r11 = (r12 + 48)|0;
+_4: while(true){
+	f19 =     0.0010000000474974513;
+	if(f20 >f19) //_LBB534_3
+{
+	r13 = r1 >> 2;
+	r14 = heap32[(r13+42)];
+if(!(r14 ==0)) //_LBB534_5
+{
+	r15 = r14 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+5)];
+	r16 = sp + -80;
+	r17 = r16 >> 2;
+	heap32[(fp+-20)] = 1065353216;
+	heap32[(r17+1)] = 1065353216;
+	heap32[(r17+2)] = 1065353216;
+	heap32[(r17+3)] = 0;
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 1045220557;
+	heap32[(g0+3)] = r16;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+}
+	r2 = (r2 + 1)|0;
+	if(r2 >64) //_LBB534_21
+{
+break _1;
+}
+else{
+	f6 = f12*f15;
+	f10 = f8*f16;
+	f6 = f6+f10;
+	f10 = f5*f17;
+	f18 = f6+f10;
+	f6 = f18+f1;
+	f10 =   1.1920928955078125e-007;
+	if(f6 <=f10) //_LBB534_21
+{
+break _1;
+}
+else{
+	f6 = f20/f6;
+	f19 = f9+f6;
+	f6 =                         0;
+	if(f19 <f6) //_LBB534_21
+{
+break _1;
+}
+else{
+	f10 =                         1;
+	if(f19 >f10) //_LBB534_21
+{
+break _1;
+}
+else{
+	if(f19 <=f9) //_LBB534_21
+{
+break _1;
+}
+else{
+	heap32[(g0)] = r5;
+	heapFloat[(g0+1)] = f4;
+	heapFloat[(g0+2)] = f2;
+	heapFloat[(g0+3)] = f0;
+	heap32[(g0+4)] = r3;
+	heapFloat[(g0+5)] = f19;
+	heap32[(g0+6)] = r12;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	r14 = sp + -520;
+	heap32[(g0)] = r7;
+	heapFloat[(g0+1)] = f3;
+	heapFloat[(g0+2)] = f11;
+	heapFloat[(g0+3)] = f7;
+	heap32[(g0+4)] = r8;
+	heapFloat[(g0+5)] = f19;
+	heap32[(g0+6)] = r14;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	r15 = heap32[(r13+42)];
+if(!(r15 ==0)) //_LBB534_12
+{
+	r16 = r15 >> 2;
+	r16 = heap32[(r16)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+5)];
+	r17 = sp + -64;
+	r19 = r17 >> 2;
+	heap32[(fp+-16)] = 1065353216;
+	heap32[(r19+1)] = 0;
+	heap32[(r19+2)] = 0;
+	heap32[(r19+3)] = 0;
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = 1045220557;
+	heap32[(g0+3)] = r17;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+}
+	r15 = heap32[(r13)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15)];
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f19;
+	r16 = sp + -568;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	r15 = r16 >> 2;
+	heap32[(fp+-142)] = r9;
+	r17 = 0;
+	heap32[(r15+9)] = 1566444395;
+	heap8[sp+-528] = r17;
+	r19 = heap32[(r0+4)];
+	r20 = heap32[(r0+3)];
+	r21 = heap32[(r0+1)];
+	r22 = heap32[(r0+2)];
+	r23 = sp + -648;
+	heap32[(fp+-162)] = r18;
+	r24 = r23 >> 2;
+	heap32[(r24+1)] = 0;
+	heap32[(r24+2)] = 1065353216;
+	heap32[(r24+3)] = 0;
+	heap32[(r24+4)] = 0;
+	heap32[(r24+5)] = r22;
+	heap32[(r24+6)] = r21;
+	heap32[(r24+7)] = r20;
+	r21 = r20 >> 2;
+	heap32[(r24+8)] = r19;
+	r22 = heap32[(r21+1)];
+	heap32[(r24+9)] = r22;
+	r22 = r19 >> 2;
+	r25 = heap32[(r22+1)];
+	heap32[(r24+10)] = r25;
+	r21 = heap32[(r21)];
+	r21 = r21 >> 2;
+	r21 = heap32[(r21+11)];
+	heap32[(g0)] = r20;
+	__FUNCTION_TABLE__[(r21)>>2](i7);
+	heapFloat[(r24+11)] = f_g0;
+	r20 = heap32[(r22)];
+	r20 = r20 >> 2;
+	r20 = heap32[(r20+11)];
+	heap32[(g0)] = r19;
+	__FUNCTION_TABLE__[(r20)>>2](i7);
+	heapFloat[(r24+12)] = f_g0;
+	heap8[sp+-596] = r17;
+	r19 = sp + -784;
+	heap32[(r24+15)] = -1;
+	r20 = r19 >> 2;
+	heap32[(r24+18)] = 1;
+	heap32[(r20+32)] = 1566444395;
+	heap32[(r20+33)] = 0;
+	r21 = r12 >> 2;
+	heap32[(fp+-196)] = heap32[(fp+-114)];
+	heap32[(r20+1)] = heap32[(r21+1)];
+	heap32[(r20+2)] = heap32[(r21+2)];
+	heap32[(r20+3)] = heap32[(r21+3)];
+	heap32[(r20+4)] = heap32[(r21+4)];
+	heap32[(r20+5)] = heap32[(r21+5)];
+	heap32[(r20+6)] = heap32[(r21+6)];
+	heap32[(r20+7)] = heap32[(r21+7)];
+	heap32[(r20+8)] = heap32[(r21+8)];
+	heap32[(r20+9)] = heap32[(r21+9)];
+	heap32[(r20+10)] = heap32[(r21+10)];
+	heap32[(r20+11)] = heap32[(r21+11)];
+	heap32[(r20+12)] = heap32[(r21+12)];
+	heap32[(r20+13)] = heap32[(r21+13)];
+	heap32[(r20+14)] = heap32[(r21+14)];
+	heap32[(r20+15)] = heap32[(r21+15)];
+	r14 = r14 >> 2;
+	heap32[(r20+16)] = heap32[(fp+-130)];
+	heap32[(r20+17)] = heap32[(r14+1)];
+	heap32[(r20+18)] = heap32[(r14+2)];
+	heap32[(r20+19)] = heap32[(r14+3)];
+	heap32[(r20+20)] = heap32[(r14+4)];
+	heap32[(r20+21)] = heap32[(r14+5)];
+	heap32[(r20+22)] = heap32[(r14+6)];
+	heap32[(r20+23)] = heap32[(r14+7)];
+	heap32[(r20+24)] = heap32[(r14+8)];
+	heap32[(r20+25)] = heap32[(r14+9)];
+	heap32[(r20+26)] = heap32[(r14+10)];
+	heap32[(r20+27)] = heap32[(r14+11)];
+	heap32[(r20+28)] = heap32[(r14+12)];
+	heap32[(r20+29)] = heap32[(r14+13)];
+	heap32[(r20+30)] = heap32[(r14+14)];
+	heap32[(r20+31)] = heap32[(r14+15)];
+	heap32[(g0)] = r23;
+	heap32[(g0+1)] = r19;
+	heap32[(g0+2)] = r16;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r14 = heapU8[sp+-528];
+	if(r14 !=0) //_LBB534_14
+{
+	f20 = heapFloat[(r15+9)];
+	if(f20 >=f6) //_LBB534_17
+{
+	f6 = heapFloat[(r15+5)];
+	heapFloat[(fp+-32)] = f6;
+	f10 = heapFloat[(r15+6)];
+	heapFloat[(r10+1)] = f10;
+	f13 = heapFloat[(r15+7)];
+	heapFloat[(r10+2)] = f13;
+	f14 = heapFloat[(r15+8)];
+	heapFloat[(r10+3)] = f14;
+	f15 = heapFloat[(r15+1)];
+	f16 = heapFloat[(r15+2)];
+	f17 = heapFloat[(r15+3)];
+	f21 = heapFloat[(r15+4)];
+	heap32[(fp+-142)] = r9;
+	f9 = f19;
+}
+else{
+__label__ = 14;
+break _4;
+}
+}
+else{
+__label__ = 15;
+break _4;
+}
+}
+}
+}
+}
+}
+}
+else{
+__label__ = 18;
+break _4;
+}
+}
+switch(__label__ ){//multiple entries
+case 18:
+	r0 = r1 >> 2;
+	f0 = f18+f1;
+	f1 = heapFloat[(r0+43)];
+	if(f0 <=f1) //_LBB534_21
+{
+break _1;
+}
+else{
+	heapFloat[(r0+41)] = f9;
+	heapFloat[(r0+33)] = f15;
+	heapFloat[(r0+34)] = f16;
+	heapFloat[(r0+35)] = f17;
+	heapFloat[(r0+36)] = f21;
+	heapFloat[(r0+37)] = f6;
+	heapFloat[(r0+38)] = f10;
+	heapFloat[(r0+39)] = f13;
+	heapFloat[(r0+40)] = f14;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+break;
+case 14:
+	heapFloat[(r13+41)] = f19;
+	f0 = heapFloat[(r15+4)];
+	f1 = heapFloat[(r15+3)];
+	f2 = heapFloat[(r15+2)];
+	heap32[(r13+33)] = heap32[(r15+1)];
+	heapFloat[(r13+34)] = f2;
+	heapFloat[(r13+35)] = f1;
+	heapFloat[(r13+36)] = f0;
+	heap32[(r13+37)] = heap32[(r15+5)];
+	heap32[(r13+38)] = heap32[(r15+6)];
+	heap32[(r13+39)] = heap32[(r15+7)];
+	heap32[(r13+40)] = heap32[(r15+8)];
+	r17 = r4;
+break;
+}
+	heap32[(fp+-142)] = r9;
+	r0 = r17 & 255;
+	r_g0 = r0;
+	return;
+}
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(fp+5)];
+	f1 = heapFloat[(fp+1)];
+	r2 = heap32[(fp+6)];
+	f2 = heapFloat[(fp+2)];
+	f1 = f1*f0;
+	f3 = heapFloat[(r1+12)];
+	f4 = heapFloat[(r1+14)];
+	f5 = heapFloat[(r1+13)];
+	f6 = heapFloat[(fp+3)];
+	f2 = f2*f0;
+	r1 = r2 >> 2;
+	f1 = f3+f1;
+	f3 = f6*f0;
+	f2 = f5+f2;
+	heapFloat[(r1+12)] = f1;
+	f1 = f4+f3;
+	heapFloat[(r1+13)] = f2;
+	r2 = heap32[(fp+4)];
+	heapFloat[(r1+14)] = f1;
+	r2 = r2 >> 2;
+	heap32[(r1+15)] = 0;
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r2+2)];
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f2 = f3*f3;
+	f1 = f1+f2;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f1 = f_g0;
+	f2 = f1*f0;
+	f3 =       0.78539818525314331;
+	if(f2 >f3) //_LBB535_2
+{
+	f1 = f3/f0;
+}
+	f2 =     0.0010000000474974513;
+	if(f1 >=f2) //_LBB535_5
+{
+	f2 =                       0.5;
+	f2 = f1*f2;
+	f2 = f2*f0;
+	heapFloat[(g0)] = f2;
+	sinf(i7);
+	f3 = heapFloat[(r2+2)];
+	f2 = f_g0/f1;
+	f5 = heapFloat[(r2+1)];
+	f6 = heapFloat[(r2)];
+	f4 = f3*f2;
+	f3 = f5*f2;
+	f2 = f6*f2;
+}
+else{
+	f2 = f0*f0;
+	f2 = f2*f0;
+	f3 =      -0.02083333395421505;
+	f2 = f2*f3;
+	f3 =                       0.5;
+	f2 = f2*f1;
+	f3 = f0*f3;
+	f2 = f2*f1;
+	f4 = heapFloat[(r2+2)];
+	f2 = f3+f2;
+	f3 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2)];
+	f4 = f4*f2;
+	f3 = f3*f2;
+	f2 = f5*f2;
+}
+	f0 = f1*f0;
+	f1 =                       0.5;
+	f0 = f0*f1;
+	heapFloat[(g0)] = f0;
+	cosf(i7);
+	f0 = f_g0;
+	r2 = sp + -16;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r0 = r2 >> 2;
+	f1 = heapFloat[(fp+-4)];
+	f5 = heapFloat[(r0+3)];
+	f6 = heapFloat[(r0+1)];
+	f7 = heapFloat[(r0+2)];
+	f8 = f0*f6;
+	f9 = f3*f5;
+	f10 = f0*f1;
+	f11 = f2*f5;
+	f12 = f0*f7;
+	f13 = f4*f5;
+	f8 = f8+f9;
+	f9 = f4*f1;
+	f10 = f10+f11;
+	f11 = f3*f7;
+	f0 = f0*f5;
+	f5 = f2*f1;
+	f12 = f12+f13;
+	f13 = f2*f6;
+	f8 = f8+f9;
+	f2 = f2*f7;
+	f9 = f10+f11;
+	f10 = f4*f6;
+	f2 = f8-f2;
+	f8 = f9-f10;
+	f0 = f0-f5;
+	f5 = f3*f6;
+	f6 = f12+f13;
+	f1 = f3*f1;
+	f1 = f6-f1;
+	f3 = f8*f8;
+	f6 = f2*f2;
+	f0 = f0-f5;
+	f4 = f4*f7;
+	f0 = f0-f4;
+	f3 = f3+f6;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f0*f0;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+	f4 =                         0;
+	if(f3 !=f4) //_LBB535_8
+{
+	f4 =                         1;
+	f3 = f4/f3;
+	f5 = f8*f3;
+	f2 = f2*f3;
+	f1 = f1*f3;
+	f6 = f5*f5;
+	f7 = f2*f2;
+	f0 = f0*f3;
+	f3 = f6+f7;
+	f6 = f1*f1;
+	f3 = f3+f6;
+	f6 = f0*f0;
+	f7 =                         2;
+	f3 = f3+f6;
+	f3 = f7/f3;
+	f6 = f1*f3;
+	f7 = f2*f3;
+	f8 = f2*f7;
+	f1 = f1*f6;
+	f9 = f8+f1;
+	f9 = f4-f9;
+	f10 = f5*f7;
+	f11 = f0*f6;
+	f12 = f5*f6;
+	f7 = f0*f7;
+	f13 = f10-f11;
+	heapFloat[(r1)] = f9;
+	f3 = f5*f3;
+	f9 = f12+f7;
+	heapFloat[(r1+1)] = f13;
+	f5 = f5*f3;
+	heapFloat[(r1+2)] = f9;
+	f1 = f5+f1;
+	f9 = f10+f11;
+	heap32[(r1+3)] = 0;
+	f2 = f2*f6;
+	f0 = f0*f3;
+	f1 = f4-f1;
+	heapFloat[(r1+4)] = f9;
+	f3 = f2-f0;
+	heapFloat[(r1+5)] = f1;
+	heapFloat[(r1+6)] = f3;
+	f1 = f12-f7;
+	heap32[(r1+7)] = 0;
+	f3 = f5+f8;
+	f0 = f2+f0;
+	heapFloat[(r1+8)] = f1;
+	f1 = f4-f3;
+	heapFloat[(r1+9)] = f0;
+	heapFloat[(r1+10)] = f1;
+	heap32[(r1+11)] = 0;
+	return;
+}
+else{
+	r1 = _2E_str584;
+	r0 = _2E_str685;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 188;
+	_assert(i7);
+}
+}
+
+function _ZN12btConvexCastD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN12btConvexCastD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN15btGjkConvexCastD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN15btGjkConvexCastD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+var __label__ = 0;
+	i7 = sp + -288;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = 0;
+	r3 = r1 >> 2;
+	heap8[r1+312] = r2;
+	r4 = 1;
+	heap32[(r3)] = 0;
+	heap8[r1+356] = r4;
+	heap32[(r3+73)] = 1566444395;
+	heap32[(r3+74)] = 1566444395;
+	heap32[(r3+75)] = 1566444395;
+	heap32[(r3+76)] = 0;
+	heap8[r1+352] = r2;
+	heap32[(r3+84)] = 0;
+	heap32[(r3+85)] = 0;
+	heap32[(r3+86)] = 0;
+	heap32[(r3+87)] = 0;
+	r3 = heapU8[r1+332];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+4)];
+	r7 = heap32[(fp+3)];
+	r3 = r3 & 240;
+	r4 = r4 >> 2;
+	heap8[r1+332] = r3;
+	r1 = r5 >> 2;
+	r3 = r6 >> 2;
+	r5 = r7 >> 2;
+	r6 = _ZTV16btPointCollector;
+	f0 = heapFloat[(r4+14)];
+	f1 = heapFloat[(r1+14)];
+	f2 = heapFloat[(r3+14)];
+	f3 = heapFloat[(r5+14)];
+	f4 = heapFloat[(r4+13)];
+	f5 = heapFloat[(r1+13)];
+	f6 = heapFloat[(r3+13)];
+	f7 = heapFloat[(r5+13)];
+	f8 = heapFloat[(r4+12)];
+	f9 = heapFloat[(r1+12)];
+	f10 = heapFloat[(r3+12)];
+	f11 = heapFloat[(r5+12)];
+	r7 = sp + -48;
+	r6 = (r6 + 8)|0;
+	r8 = r7 >> 2;
+	heap32[(fp+-12)] = r6;
+	heap32[(r8+9)] = 1566444395;
+	heap8[sp+-8] = r2;
+	r6 = heap32[(r0+3)];
+	r9 = heap32[(r0+2)];
+	r0 = heap32[(r0+1)];
+	r10 = _ZTV17btGjkPairDetector;
+	r11 = sp + -128;
+	r10 = (r10 + 8)|0;
+	heap32[(fp+-32)] = r10;
+	r10 = r11 >> 2;
+	heap32[(r10+1)] = 0;
+	heap32[(r10+2)] = 1065353216;
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = 0;
+	heap32[(r10+5)] = 0;
+	heap32[(r10+6)] = r0;
+	heap32[(r10+7)] = r9;
+	r0 = r9 >> 2;
+	heap32[(r10+8)] = r6;
+	r12 = heap32[(r0+1)];
+	heap32[(r10+9)] = r12;
+	r12 = r6 >> 2;
+	r13 = heap32[(r12+1)];
+	heap32[(r10+10)] = r13;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+11)];
+	heap32[(g0)] = r9;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	heapFloat[(r10+11)] = f_g0;
+	r0 = heap32[(r12)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+11)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	heapFloat[(r10+12)] = f_g0;
+	heap8[sp+-76] = r2;
+	r0 = sp + -264;
+	heap32[(r10+15)] = -1;
+	r6 = r0 >> 2;
+	heap32[(r10+18)] = 1;
+	heap32[(r6+32)] = 1566444395;
+	heap32[(r6+33)] = 0;
+	heap32[(fp+-66)] = heap32[(r1)];
+	heap32[(r6+1)] = heap32[(r1+1)];
+	heap32[(r6+2)] = heap32[(r1+2)];
+	heap32[(r6+3)] = heap32[(r1+3)];
+	heap32[(r6+4)] = heap32[(r1+4)];
+	heap32[(r6+5)] = heap32[(r1+5)];
+	heap32[(r6+6)] = heap32[(r1+6)];
+	heap32[(r6+7)] = heap32[(r1+7)];
+	heap32[(r6+8)] = heap32[(r1+8)];
+	heap32[(r6+9)] = heap32[(r1+9)];
+	heap32[(r6+10)] = heap32[(r1+10)];
+	heap32[(r6+11)] = heap32[(r1+11)];
+	heap32[(r6+12)] = heap32[(r1+12)];
+	heap32[(r6+13)] = heap32[(r1+13)];
+	heap32[(r6+14)] = heap32[(r1+14)];
+	heap32[(r6+15)] = heap32[(r1+15)];
+	heap32[(r6+16)] = heap32[(r5)];
+	heap32[(r6+17)] = heap32[(r5+1)];
+	heap32[(r6+18)] = heap32[(r5+2)];
+	heap32[(r6+19)] = heap32[(r5+3)];
+	heap32[(r6+20)] = heap32[(r5+4)];
+	heap32[(r6+21)] = heap32[(r5+5)];
+	heap32[(r6+22)] = heap32[(r5+6)];
+	heap32[(r6+23)] = heap32[(r5+7)];
+	heap32[(r6+24)] = heap32[(r5+8)];
+	heap32[(r6+25)] = heap32[(r5+9)];
+	heap32[(r6+26)] = heap32[(r5+10)];
+	heap32[(r6+27)] = heap32[(r5+11)];
+	heap32[(r6+28)] = heap32[(r5+12)];
+	heap32[(r6+29)] = heap32[(r5+13)];
+	heap32[(r6+30)] = heap32[(r5+14)];
+	heap32[(r6+31)] = heap32[(r5+15)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r9 = heapU8[sp+-8];
+_1: do {
+if(!(r9 ==0)) //_LBB540_14
+{
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = f4-f5;
+	f3 = f6-f7;
+	f4 = f8-f9;
+	f5 = f10-f11;
+	r9 = heap32[(fp+5)];
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = f4-f5;
+	f3 = heapFloat[(r8+8)];
+	f4 = heapFloat[(r8+7)];
+	f5 = heapFloat[(r8+6)];
+	f6 = heapFloat[(r8+5)];
+	f7 = heapFloat[(r8+9)];
+	f8 = heapFloat[(r8+1)];
+	f9 = heapFloat[(r8+2)];
+	f10 = heapFloat[(r8+3)];
+	f11 = heapFloat[(r8+4)];
+	f12 =                         0;
+_3: while(true){
+	f13 =     0.0010000000474974513;
+	if(f7 >f13) //_LBB540_2
+{
+	r2 = (r2 + 1)|0;
+	if(r2 >32) //_LBB540_14
+{
+break _1;
+}
+else{
+	f3 = f2*f8;
+	f4 = f1*f9;
+	f3 = f3+f4;
+	f4 = f0*f10;
+	f3 = f3+f4;
+	f3 = f7/f3;
+	f13 = f12-f3;
+	f3 =                         0;
+	if(f13 <f3) //_LBB540_14
+{
+break _1;
+}
+else{
+	f4 =                         1;
+	if(f13 >f4) //_LBB540_14
+{
+break _1;
+}
+else{
+	if(f13 <=f12) //_LBB540_14
+{
+break _1;
+}
+else{
+	r10 = r9 >> 2;
+	r12 = heap32[(r10)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12)];
+	heap32[(g0)] = r9;
+	heapFloat[(g0+1)] = f13;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	f5 = heapFloat[(r4+12)];
+	f6 = heapFloat[(r1+12)];
+	f4 = f4-f13;
+	f6 = f6*f4;
+	f5 = f5*f13;
+	f5 = f6+f5;
+	heapFloat[(r6+12)] = f5;
+	f5 = heapFloat[(r1+13)];
+	f6 = heapFloat[(r4+13)];
+	f5 = f5*f4;
+	f6 = f6*f13;
+	f5 = f5+f6;
+	heapFloat[(r6+13)] = f5;
+	f5 = heapFloat[(r1+14)];
+	f6 = heapFloat[(r4+14)];
+	f5 = f5*f4;
+	f6 = f6*f13;
+	f5 = f5+f6;
+	heapFloat[(r6+14)] = f5;
+	f5 = heapFloat[(r5+12)];
+	f6 = heapFloat[(r3+12)];
+	f5 = f5*f4;
+	f6 = f6*f13;
+	f5 = f5+f6;
+	heapFloat[(r6+28)] = f5;
+	f5 = heapFloat[(r5+13)];
+	f6 = heapFloat[(r3+13)];
+	f5 = f5*f4;
+	f6 = f6*f13;
+	f5 = f5+f6;
+	heapFloat[(r6+29)] = f5;
+	f5 = heapFloat[(r5+14)];
+	f6 = heapFloat[(r3+14)];
+	f4 = f5*f4;
+	f5 = f6*f13;
+	f4 = f4+f5;
+	heapFloat[(r6+30)] = f4;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = 0;
+	_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(i7);
+	r12 = heapU8[sp+-8];
+	if(r12 ==0) //_LBB540_14
+{
+break _1;
+}
+else{
+	f7 = heapFloat[(r8+9)];
+	if(f7 >=f3) //_LBB540_9
+{
+	f6 = heapFloat[(r8+5)];
+	f5 = heapFloat[(r8+6)];
+	f4 = heapFloat[(r8+7)];
+	f3 = heapFloat[(r8+8)];
+	f8 = heapFloat[(r8+1)];
+	f9 = heapFloat[(r8+2)];
+	f10 = heapFloat[(r8+3)];
+	f11 = heapFloat[(r8+4)];
+	f12 = f13;
+}
+else{
+__label__ = 8;
+break _3;
+}
+}
+}
+}
+}
+}
+}
+else{
+__label__ = 11;
+break _3;
+}
+}
+switch(__label__ ){//multiple entries
+case 11:
+	r0 = r9 >> 2;
+	f2 = f8*f2;
+	f1 = f9*f1;
+	f7 = heapFloat[(r0+43)];
+	f1 = f2+f1;
+	f0 = f10*f0;
+	f0 = f1+f0;
+	f1 = -f7;
+	if(f0 >=f1) //_LBB540_14
+{
+break _1;
+}
+else{
+	heapFloat[(r0+41)] = f12;
+	heapFloat[(r0+33)] = f8;
+	heapFloat[(r0+34)] = f9;
+	heapFloat[(r0+35)] = f10;
+	heapFloat[(r0+36)] = f11;
+	heapFloat[(r0+37)] = f6;
+	heapFloat[(r0+38)] = f5;
+	heapFloat[(r0+39)] = f4;
+	heapFloat[(r0+40)] = f3;
+}
+break;
+case 8:
+	heapFloat[(r10+41)] = f13;
+	f0 = heapFloat[(r8+4)];
+	f1 = heapFloat[(r8+3)];
+	f2 = heapFloat[(r8+2)];
+	heap32[(r10+33)] = heap32[(r8+1)];
+	heapFloat[(r10+34)] = f2;
+	heapFloat[(r10+35)] = f1;
+	heapFloat[(r10+36)] = f0;
+	heap32[(r10+37)] = heap32[(r8+5)];
+	heap32[(r10+38)] = heap32[(r8+6)];
+	heap32[(r10+39)] = heap32[(r8+7)];
+	heap32[(r10+40)] = heap32[(r8+8)];
+break;
+}
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_PfRj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r1)];
+	f3 = heapFloat[(r0)];
+	f1 = f1-f0;
+	f3 = f3-f2;
+	f4 = heapFloat[(r1+2)];
+	f5 = heapFloat[(r0+2)];
+	f5 = f5-f4;
+	f6 = f3*f3;
+	f7 = f1*f1;
+	f6 = f6+f7;
+	f7 = f5*f5;
+	f6 = f6+f7;
+	f7 =                         0;
+	if(f6 <=f7) //_LBB541_7
+{
+	f0 =                        -1;
+	f_g0 = f0;
+	return;
+}
+else{
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	f2 = f2*f3;
+	f0 = f0*f1;
+	f0 = f2+f0;
+	f2 = f4*f5;
+	f0 = f0+f2;
+	f0 = -f0;
+	f0 = f0/f6;
+	f2 =                         1;
+	if(f0 <f2) //_LBB541_4
+{
+	if(f0 >f7) //_LBB541_6
+{
+	r0 = r2 >> 2;
+	f2 = f2-f0;
+	heapFloat[(r0+1)] = f0;
+	r2 = r3 >> 2;
+	heapFloat[(r0)] = f2;
+	heap32[(r2)] = 3;
+	f2 = heapFloat[(r1)];
+	f3 = f3*f0;
+	f4 = heapFloat[(r1+1)];
+	f1 = f1*f0;
+	f2 = f2+f3;
+	f1 = f4+f1;
+	f3 = heapFloat[(r1+2)];
+	f0 = f5*f0;
+	f0 = f3+f0;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	f1 = f2+f1;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	f_g0 = f0;
+	return;
+}
+else{
+	r2 = r2 >> 2;
+	heap32[(r2)] = 1065353216;
+	r3 = r3 >> 2;
+	heap32[(r2+1)] = 0;
+	heap32[(r3)] = 1;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r1+1)];
+	f2 = heapFloat[(r1+2)];
+}
+}
+else{
+	r1 = r2 >> 2;
+	heap32[(r1)] = 0;
+	r2 = r3 >> 2;
+	heap32[(r1+1)] = 1065353216;
+	heap32[(r2)] = 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+2)];
+}
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	f_g0 = f0;
+	return;
+}
+}
+
+function _ZN12gjkepa2_implL10InitializeEPK13btConvexShapeRK11btTransformS2_S5_RN15btGjkEpaSolver28sResultsERNS_13MinkowskiDiffEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+5)];
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	heap32[(r0+4)] = 0;
+	heap32[(r0+5)] = 0;
+	heap32[(r0+6)] = 0;
+	heap32[(r0+7)] = 0;
+	heap32[(r0+8)] = 0;
+	r0 = r1 >> 2;
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	heap32[(r0)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r0+1)] = r4;
+	r2 = r3 >> 2;
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r2+4)];
+	f3 = heapFloat[(r1+4)];
+	f4 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2+5)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r2+8)];
+	f9 = heapFloat[(r1+8)];
+	f10 = heapFloat[(r1+2)];
+	f11 = heapFloat[(r2+2)];
+	f12 = heapFloat[(r1+1)];
+	f13 = heapFloat[(r1+6)];
+	f14 = heapFloat[(r2+6)];
+	f15 = heapFloat[(r1+5)];
+	f16 = heapFloat[(r1+10)];
+	f17 = heapFloat[(r2+10)];
+	f18 = heapFloat[(r2+9)];
+	f19 = heapFloat[(r1+9)];
+	f20 = f1*f4;
+	f21 = f3*f5;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f1 = f1*f11;
+	f3 = f3*f14;
+	f20 = f20+f21;
+	f21 = f9*f18;
+	f6 = f6+f7;
+	f1 = f1+f3;
+	f3 = f9*f17;
+	f7 = f20+f21;
+	heapFloat[(r0+2)] = f6;
+	f6 = f12*f0;
+	f9 = f15*f2;
+	f1 = f1+f3;
+	heapFloat[(r0+3)] = f7;
+	heapFloat[(r0+4)] = f1;
+	f1 = f12*f4;
+	f3 = f15*f5;
+	f6 = f6+f9;
+	f7 = f19*f8;
+	f9 = f12*f11;
+	f12 = f15*f14;
+	f1 = f1+f3;
+	f3 = f19*f18;
+	f6 = f6+f7;
+	heap32[(r0+5)] = 0;
+	f7 = f9+f12;
+	f9 = f19*f17;
+	f1 = f1+f3;
+	heapFloat[(r0+6)] = f6;
+	f0 = f10*f0;
+	f2 = f13*f2;
+	f3 = f7+f9;
+	heapFloat[(r0+7)] = f1;
+	heapFloat[(r0+8)] = f3;
+	f1 = f10*f4;
+	f3 = f13*f5;
+	f0 = f0+f2;
+	f2 = f16*f8;
+	f4 = f10*f11;
+	f5 = f13*f14;
+	f1 = f1+f3;
+	f3 = f16*f18;
+	f0 = f0+f2;
+	heap32[(r0+9)] = 0;
+	f2 = f4+f5;
+	f4 = f16*f17;
+	f1 = f1+f3;
+	heapFloat[(r0+10)] = f0;
+	f0 = f2+f4;
+	heapFloat[(r0+11)] = f1;
+	heapFloat[(r0+12)] = f0;
+	heap32[(r0+13)] = 0;
+	f0 = heapFloat[(r2)];
+	f1 = heapFloat[(r1)];
+	f2 = heapFloat[(r2+4)];
+	f3 = heapFloat[(r1+4)];
+	f4 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r1+5)];
+	f6 = f0*f1;
+	f7 = f2*f3;
+	f8 = heapFloat[(r2+8)];
+	f9 = heapFloat[(r1+8)];
+	f10 = heapFloat[(r2+2)];
+	f11 = heapFloat[(r2+6)];
+	f12 = heapFloat[(r2+1)];
+	f13 = heapFloat[(r1+2)];
+	f14 = heapFloat[(r2+5)];
+	f15 = heapFloat[(r1+6)];
+	f16 = heapFloat[(r2+10)];
+	f17 = heapFloat[(r1+10)];
+	f18 = heapFloat[(r2+9)];
+	f19 = heapFloat[(r1+9)];
+	f20 = f0*f4;
+	f21 = f2*f5;
+	f6 = f6+f7;
+	f7 = f8*f9;
+	f22 = heapFloat[(r1+14)];
+	f23 = heapFloat[(r2+14)];
+	f24 = heapFloat[(r1+13)];
+	f25 = heapFloat[(r2+13)];
+	f26 = heapFloat[(r1+12)];
+	f27 = heapFloat[(r2+12)];
+	f28 = f0*f13;
+	f29 = f2*f15;
+	f20 = f20+f21;
+	f21 = f8*f19;
+	f6 = f6+f7;
+	f7 = f28+f29;
+	f28 = f8*f17;
+	f20 = f20+f21;
+	heapFloat[(r0+14)] = f6;
+	f6 = f12*f1;
+	f21 = f14*f3;
+	f7 = f7+f28;
+	heapFloat[(r0+15)] = f20;
+	heapFloat[(r0+16)] = f7;
+	f7 = f12*f4;
+	f20 = f14*f5;
+	f6 = f6+f21;
+	f21 = f18*f9;
+	f28 = f12*f13;
+	f29 = f14*f15;
+	f7 = f7+f20;
+	f20 = f18*f19;
+	f6 = f6+f21;
+	heap32[(r0+17)] = 0;
+	f21 = f28+f29;
+	f28 = f18*f17;
+	f7 = f7+f20;
+	heapFloat[(r0+18)] = f6;
+	f1 = f10*f1;
+	f3 = f11*f3;
+	f6 = f21+f28;
+	heapFloat[(r0+19)] = f7;
+	heapFloat[(r0+20)] = f6;
+	f4 = f10*f4;
+	f5 = f11*f5;
+	f1 = f1+f3;
+	f3 = f16*f9;
+	f6 = f10*f13;
+	f7 = f11*f15;
+	f4 = f4+f5;
+	f5 = f16*f19;
+	f1 = f1+f3;
+	heap32[(r0+21)] = 0;
+	f3 = f26-f27;
+	f9 = f24-f25;
+	f6 = f6+f7;
+	f7 = f16*f17;
+	f4 = f4+f5;
+	heapFloat[(r0+22)] = f1;
+	f1 = f22-f23;
+	f0 = f0*f3;
+	f2 = f2*f9;
+	f5 = f6+f7;
+	heapFloat[(r0+23)] = f4;
+	heapFloat[(r0+24)] = f5;
+	f4 = f12*f3;
+	f5 = f14*f9;
+	f0 = f0+f2;
+	f2 = f8*f1;
+	f3 = f10*f3;
+	f6 = f11*f9;
+	f4 = f4+f5;
+	f5 = f18*f1;
+	f0 = f0+f2;
+	heap32[(r0+25)] = 0;
+	f2 = f3+f6;
+	f1 = f16*f1;
+	f3 = f4+f5;
+	heapFloat[(r0+26)] = f0;
+	f0 = f2+f1;
+	heapFloat[(r0+27)] = f3;
+	heapFloat[(r0+28)] = f0;
+	heap32[(r0+29)] = 0;
+	r1 = heap32[(fp+6)];
+	if(r1 ==0) //_LBB542_3
+{
+	r1 = _ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3__index__;
+}
+else{
+	r1 = _ZNK13btConvexShape31localGetSupportVertexNonVirtualERK9btVector3__index__;
+}
+	heap32[(r0+30)] = r1;
+	heap32[(r0+31)] = 0;
+	return;
+}
+
+function _ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(r0+1)];
+	f2 = heapFloat[(r0+2)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	r1 = heap32[(fp+2)];
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r0+2)];
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r0)];
+	f3 = f3*f0;
+	r0 = r1 >> 2;
+	f2 = f2*f0;
+	heapFloat[(r0)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r0+1)] = f2;
+	r2 = heap32[(fp)];
+	heapFloat[(r0+2)] = f0;
+	r2 = r2 >> 2;
+	heap32[(r0+3)] = 0;
+	r3 = heap32[(r2+30)];
+	f0 = -f0;
+	f1 = -f2;
+	f2 = -f3;
+	r4 = heap32[(r2+1)];
+	r5 = heap32[(r2+31)];
+	r6 = r3 & 1;
+	if(r6 != 0) //_LBB543_2
+{
+	r6 = (r4 + r5)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r3 = (r6 + r3)|0;
+	r3 = (r3 + -1)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+}
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r2+3)];
+	f5 = heapFloat[(r2+6)];
+	f6 = heapFloat[(r2+7)];
+	f3 = f3*f2;
+	f4 = f4*f1;
+	f7 = heapFloat[(r2+4)];
+	f8 = heapFloat[(r2+10)];
+	f9 = heapFloat[(r2+11)];
+	f10 = heapFloat[(r2+12)];
+	f11 = heapFloat[(r2+8)];
+	f5 = f5*f2;
+	f6 = f6*f1;
+	f3 = f3+f4;
+	f4 = f7*f0;
+	r6 = sp + -16;
+	f2 = f8*f2;
+	f1 = f9*f1;
+	f5 = f5+f6;
+	f6 = f11*f0;
+	f3 = f3+f4;
+	r7 = r6 >> 2;
+	f1 = f2+f1;
+	f0 = f10*f0;
+	f2 = f5+f6;
+	heapFloat[(fp+-4)] = f3;
+	f0 = f1+f0;
+	heapFloat[(r7+1)] = f2;
+	heapFloat[(r7+2)] = f0;
+	heap32[(r7+3)] = 0;
+	r7 = sp + -32;
+	r4 = (r4 + r5)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r7 >> 2;
+	f0 = heapFloat[(r2+22)];
+	f1 = heapFloat[(fp+-8)];
+	f2 = heapFloat[(r2+18)];
+	f3 = heapFloat[(r2+14)];
+	f4 = heapFloat[(r2+23)];
+	f5 = heapFloat[(r3+1)];
+	f6 = heapFloat[(r2+19)];
+	f7 = heapFloat[(r2+15)];
+	f0 = f0*f1;
+	f4 = f4*f5;
+	f8 = heapFloat[(r2+24)];
+	f9 = heapFloat[(r3+2)];
+	f10 = heapFloat[(r2+20)];
+	f11 = heapFloat[(r2+16)];
+	f2 = f2*f1;
+	f6 = f6*f5;
+	f1 = f3*f1;
+	f3 = f7*f5;
+	f0 = f0+f4;
+	f4 = f8*f9;
+	f2 = f2+f6;
+	f5 = f10*f9;
+	f1 = f1+f3;
+	f3 = f11*f9;
+	f0 = f0+f4;
+	f4 = heapFloat[(r2+28)];
+	f2 = f2+f5;
+	f5 = heapFloat[(r2+27)];
+	f1 = f1+f3;
+	f3 = heapFloat[(r2+26)];
+	r3 = heap32[(r2+30)];
+	f0 = f0+f4;
+	f2 = f2+f5;
+	f1 = f1+f3;
+	r4 = heap32[(r2)];
+	r2 = heap32[(r2+31)];
+	r5 = r3 & 1;
+	if(r5 != 0) //_LBB543_5
+{
+	r5 = (r4 + r2)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r3 = (r3 + r5)|0;
+	r3 = (r3 + -1)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+}
+	r5 = sp + -48;
+	r2 = (r4 + r2)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = r5 >> 2;
+	f3 = heapFloat[(fp+-12)];
+	f4 = heapFloat[(r1+2)];
+	f5 = heapFloat[(r1+1)];
+	f1 = f3-f1;
+	f2 = f5-f2;
+	heapFloat[(r0+4)] = f1;
+	f0 = f4-f0;
+	heapFloat[(r0+5)] = f2;
+	heapFloat[(r0+6)] = f0;
+	heap32[(r0+7)] = 0;
+	return;
+}
+
+function _ZN12gjkepa2_impl3GJK13EncloseOriginEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + -128;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+93)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+8)];
+_1: do {
+	if(r4 >2) //_LBB544_3
+{
+	if(r4 ==3) //_LBB544_17
+{
+	r5 = heap32[(r3)];
+	r6 = heap32[(r3+2)];
+	r7 = heap32[(r3+1)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r7 = r7 >> 2;
+	f0 = heapFloat[(r6+6)];
+	f1 = heapFloat[(r5+6)];
+	f2 = heapFloat[(r7+6)];
+	f3 = heapFloat[(r6+5)];
+	f4 = heapFloat[(r5+5)];
+	f5 = heapFloat[(r7+5)];
+	f5 = f5-f4;
+	f0 = f0-f1;
+	f1 = f2-f1;
+	f2 = f3-f4;
+	f3 = heapFloat[(r6+4)];
+	f4 = heapFloat[(r5+4)];
+	f6 = heapFloat[(r7+4)];
+	f3 = f3-f4;
+	f4 = f6-f4;
+	f6 = f5*f0;
+	f7 = f1*f2;
+	r5 = sp + -112;
+	f6 = f6-f7;
+	f1 = f1*f3;
+	f0 = f4*f0;
+	f0 = f1-f0;
+	r6 = r5 >> 2;
+	heapFloat[(fp+-28)] = f6;
+	f1 = f4*f2;
+	f2 = f5*f3;
+	f1 = f1-f2;
+	heapFloat[(r6+1)] = f0;
+	f2 = f6*f6;
+	f0 = f0*f0;
+	heapFloat[(r6+2)] = f1;
+	f0 = f2+f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 =                         0;
+	heap32[(r6+3)] = 0;
+	if(f0 <=f1) //_LBB544_25
+{
+__label__ = 24;
+break _1;
+}
+else{
+	r4 = r4 << 2;
+	r4 = (r2 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4+4)] = 0;
+	r4 = heap32[(r1+91)];
+	r4 = (r4 + -1)|0;
+	r7 = heap32[(r3+8)];
+	r8 = r4 << 2;
+	r7 = r7 << 2;
+	r8 = (r0 + r8)|0;
+	r7 = (r2 + r7)|0;
+	r8 = r8 >> 2;
+	heap32[(r1+91)] = r4;
+	r4 = r7 >> 2;
+	r7 = heap32[(r8+87)];
+	heap32[(r4)] = r7;
+	r4 = heap32[(r3+8)];
+	r7 = r4 << 2;
+	r2 = (r2 + r7)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r4 = (r4 + 1)|0;
+	heap32[(r3+8)] = r4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r2;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r2 = r3 >> 2;
+	r4 = heap32[(r2+8)];
+	r4 = (r4 + -1)|0;
+	r5 = heap32[(r1+91)];
+	r7 = r4 << 2;
+	r3 = (r3 + r7)|0;
+	r7 = (r0 + 348)|0;
+	r8 = r5 << 2;
+	r8 = (r7 + r8)|0;
+	r3 = r3 >> 2;
+	heap32[(r2+8)] = r4;
+	r2 = r8 >> 2;
+	r3 = heap32[(r3)];
+	r4 = (r5 + 1)|0;
+	heap32[(r2)] = r3;
+	heap32[(r1+91)] = r4;
+	f0 = heapFloat[(r6+2)];
+	f1 = heapFloat[(r6+1)];
+	f2 = heapFloat[(fp+-28)];
+	r3 = sp + -16;
+	f2 = -f2;
+	r2 = r3 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-4)] = f2;
+	f0 = -f0;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f0;
+	heap32[(r2+3)] = 0;
+	r2 = heap32[(r1+93)];
+	r4 = r2 >> 2;
+	r5 = heap32[(r4+8)];
+	r5 = r5 << 2;
+	r5 = (r2 + r5)|0;
+	r5 = r5 >> 2;
+	heap32[(r5+4)] = 0;
+	r5 = heap32[(r1+91)];
+	r5 = (r5 + -1)|0;
+	r6 = heap32[(r4+8)];
+	r8 = r5 << 2;
+	r6 = r6 << 2;
+	r7 = (r7 + r8)|0;
+	r6 = (r2 + r6)|0;
+	r7 = r7 >> 2;
+	heap32[(r1+91)] = r5;
+	r5 = r6 >> 2;
+	r6 = heap32[(r7)];
+	heap32[(r5)] = r6;
+	r5 = heap32[(r4+8)];
+	r6 = r5 << 2;
+	r2 = (r2 + r6)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r5 = (r5 + 1)|0;
+	heap32[(r4+8)] = r5;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r2 = r3 >> 2;
+	r4 = heap32[(r2+8)];
+	r4 = (r4 + -1)|0;
+	r5 = heap32[(r1+91)];
+	r6 = r4 << 2;
+	r7 = r5 << 2;
+	r3 = (r3 + r6)|0;
+	r0 = (r0 + r7)|0;
+	r3 = r3 >> 2;
+	heap32[(r2+8)] = r4;
+	r0 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r2 = (r5 + 1)|0;
+	heap32[(r0+87)] = r3;
+	heap32[(r1+91)] = r2;
+	r3 = 0;
+	r_g0 = r3;
+	return;
+}
+}
+}
+}
+else{
+	if(r4 ==4) //_LBB544_21
+{
+	r0 = heap32[(r3)];
+	r1 = heap32[(r3+1)];
+	r2 = heap32[(r3+3)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	r3 = heap32[(r3+2)];
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r1+6)];
+	f1 = heapFloat[(r2+6)];
+	f2 = heapFloat[(r0+6)];
+	f3 = heapFloat[(r0+5)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r1+4)];
+	f6 = heapFloat[(r2+4)];
+	f7 = heapFloat[(r3+5)];
+	f8 = heapFloat[(r0+4)];
+	f9 = heapFloat[(r3+4)];
+	f0 = f0-f1;
+	f3 = f3-f4;
+	f5 = f5-f6;
+	f2 = f2-f1;
+	f8 = f8-f6;
+	f10 = f3*f0;
+	f6 = f9-f6;
+	f9 = f2*f5;
+	f7 = f7-f4;
+	f0 = f8*f0;
+	f11 = heapFloat[(r3+6)];
+	f12 = heapFloat[(r1+5)];
+	f10 = f10*f6;
+	f9 = f9*f7;
+	f4 = f12-f4;
+	f9 = f10+f9;
+	f0 = f0*f7;
+	f3 = f3*f5;
+	f1 = f11-f1;
+	f5 = f8*f4;
+	f0 = f9-f0;
+	f3 = f3*f1;
+	f2 = f2*f4;
+	f0 = f0-f3;
+	f1 = f5*f1;
+	f0 = f0+f1;
+	f1 = f2*f6;
+	f0 = f0-f1;
+	f1 =                         0;
+	if(f0 <f1) //_LBB544_23
+{
+	f0 = -f0;
+}
+	r0 = f0 > f1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+else{
+__label__ = 24;
+break _1;
+}
+}
+}
+else{
+	if(r4 ==1) //_LBB544_5
+{
+	r2 = 0;
+_16: while(true){
+	if(uint(r2) <uint(3)) //_LBB544_6
+{
+	r3 = sp + -64;
+	r4 = r3 >> 2;
+	heap32[(fp+-16)] = 0;
+	r5 = r2 << 2;
+	heap32[(r4+1)] = 0;
+	r5 = (r3 + r5)|0;
+	heap32[(r4+2)] = 0;
+	r5 = r5 >> 2;
+	heap32[(r4+3)] = 0;
+	heap32[(r5)] = 1065353216;
+	r5 = heap32[(r1+93)];
+	r6 = r5 >> 2;
+	r7 = heap32[(r6+8)];
+	r7 = r7 << 2;
+	r7 = (r5 + r7)|0;
+	r7 = r7 >> 2;
+	heap32[(r7+4)] = 0;
+	r7 = heap32[(r1+91)];
+	r7 = (r7 + -1)|0;
+	r8 = heap32[(r6+8)];
+	r9 = r7 << 2;
+	r8 = r8 << 2;
+	r9 = (r0 + r9)|0;
+	r8 = (r5 + r8)|0;
+	r9 = r9 >> 2;
+	heap32[(r1+91)] = r7;
+	r7 = r8 >> 2;
+	r8 = heap32[(r9+87)];
+	heap32[(r7)] = r8;
+	r7 = heap32[(r6+8)];
+	r8 = r7 << 2;
+	r5 = (r5 + r8)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r7 = (r7 + 1)|0;
+	heap32[(r6+8)] = r7;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r5;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r5 = r3 >> 2;
+	r6 = heap32[(r5+8)];
+	r6 = (r6 + -1)|0;
+	r7 = heap32[(r1+91)];
+	r8 = r6 << 2;
+	r3 = (r3 + r8)|0;
+	r8 = (r0 + 348)|0;
+	r9 = r7 << 2;
+	r9 = (r8 + r9)|0;
+	r3 = r3 >> 2;
+	heap32[(r5+8)] = r6;
+	r5 = r9 >> 2;
+	r3 = heap32[(r3)];
+	r6 = (r7 + 1)|0;
+	heap32[(r5)] = r3;
+	heap32[(r1+91)] = r6;
+	f0 = heapFloat[(r4+2)];
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(fp+-16)];
+	r3 = sp + -48;
+	f2 = -f2;
+	r4 = r3 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-12)] = f2;
+	f0 = -f0;
+	heapFloat[(r4+1)] = f1;
+	heapFloat[(r4+2)] = f0;
+	heap32[(r4+3)] = 0;
+	r4 = heap32[(r1+93)];
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+8)];
+	r6 = r6 << 2;
+	r6 = (r4 + r6)|0;
+	r6 = r6 >> 2;
+	heap32[(r6+4)] = 0;
+	r6 = heap32[(r1+91)];
+	r6 = (r6 + -1)|0;
+	r7 = heap32[(r5+8)];
+	r9 = r6 << 2;
+	r7 = r7 << 2;
+	r8 = (r8 + r9)|0;
+	r7 = (r4 + r7)|0;
+	r8 = r8 >> 2;
+	heap32[(r1+91)] = r6;
+	r6 = r7 >> 2;
+	r7 = heap32[(r8)];
+	heap32[(r6)] = r7;
+	r6 = heap32[(r5+8)];
+	r7 = r6 << 2;
+	r4 = (r4 + r7)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r6 = (r6 + 1)|0;
+	heap32[(r5+8)] = r6;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+8)];
+	r5 = (r5 + -1)|0;
+	r6 = heap32[(r1+91)];
+	r7 = r5 << 2;
+	r8 = r6 << 2;
+	r3 = (r3 + r7)|0;
+	r7 = (r0 + r8)|0;
+	r3 = r3 >> 2;
+	heap32[(r4+8)] = r5;
+	r4 = r7 >> 2;
+	r3 = heap32[(r3)];
+	r2 = (r2 + 1)|0;
+	r5 = (r6 + 1)|0;
+	heap32[(r4+87)] = r3;
+	heap32[(r1+91)] = r5;
+continue _16;
+}
+}
+}
+else{
+__label__ = 24;
+break _1;
+}
+}
+}
+else{
+	if(r4 ==2) //_LBB544_10
+{
+	r2 = heap32[(r3+1)];
+	r3 = heap32[(r3)];
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r2+6)];
+	f1 = heapFloat[(r3+6)];
+	f2 = heapFloat[(r2+5)];
+	f3 = heapFloat[(r3+5)];
+	f4 = heapFloat[(r2+4)];
+	f5 = heapFloat[(r3+4)];
+	f0 = f0-f1;
+	f1 = f2-f3;
+	f2 = f4-f5;
+	r2 = 0;
+_23: while(true){
+	if(uint(r2) <uint(3)) //_LBB544_11
+{
+	r3 = sp + -80;
+	r4 = r3 >> 2;
+	heap32[(fp+-20)] = 0;
+	r5 = r2 << 2;
+	heap32[(r4+1)] = 0;
+	r3 = (r3 + r5)|0;
+	heap32[(r4+2)] = 0;
+	r3 = r3 >> 2;
+	heap32[(r4+3)] = 0;
+	heap32[(r3)] = 1065353216;
+	f3 = heapFloat[(r4+2)];
+	f4 = heapFloat[(r4+1)];
+	f5 = heapFloat[(fp+-20)];
+	f6 = f1*f3;
+	f7 = f0*f4;
+	r3 = sp + -96;
+	f6 = f6-f7;
+	f7 = f0*f5;
+	f3 = f2*f3;
+	f3 = f7-f3;
+	r4 = r3 >> 2;
+	heapFloat[(fp+-24)] = f6;
+	f4 = f2*f4;
+	f5 = f1*f5;
+	f4 = f4-f5;
+	heapFloat[(r4+1)] = f3;
+	f5 = f6*f6;
+	f3 = f3*f3;
+	heapFloat[(r4+2)] = f4;
+	f3 = f5+f3;
+	f4 = f4*f4;
+	f3 = f3+f4;
+	f4 =                         0;
+	heap32[(r4+3)] = 0;
+if(!(f3 <=f4)) //_LBB544_15
+{
+	r5 = heap32[(r1+93)];
+	r6 = r5 >> 2;
+	r7 = heap32[(r6+8)];
+	r7 = r7 << 2;
+	r7 = (r5 + r7)|0;
+	r7 = r7 >> 2;
+	heap32[(r7+4)] = 0;
+	r7 = heap32[(r1+91)];
+	r7 = (r7 + -1)|0;
+	r8 = heap32[(r6+8)];
+	r9 = r7 << 2;
+	r8 = r8 << 2;
+	r9 = (r0 + r9)|0;
+	r8 = (r5 + r8)|0;
+	r9 = r9 >> 2;
+	heap32[(r1+91)] = r7;
+	r7 = r8 >> 2;
+	r8 = heap32[(r9+87)];
+	heap32[(r7)] = r8;
+	r7 = heap32[(r6+8)];
+	r8 = r7 << 2;
+	r5 = (r5 + r8)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r7 = (r7 + 1)|0;
+	heap32[(r6+8)] = r7;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r5;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r5 = r3 >> 2;
+	r6 = heap32[(r5+8)];
+	r6 = (r6 + -1)|0;
+	r7 = heap32[(r1+91)];
+	r8 = r6 << 2;
+	r3 = (r3 + r8)|0;
+	r8 = (r0 + 348)|0;
+	r9 = r7 << 2;
+	r9 = (r8 + r9)|0;
+	r3 = r3 >> 2;
+	heap32[(r5+8)] = r6;
+	r5 = r9 >> 2;
+	r3 = heap32[(r3)];
+	r6 = (r7 + 1)|0;
+	heap32[(r5)] = r3;
+	heap32[(r1+91)] = r6;
+	f3 = heapFloat[(r4+2)];
+	f4 = heapFloat[(r4+1)];
+	f5 = heapFloat[(fp+-24)];
+	r3 = sp + -32;
+	f5 = -f5;
+	r4 = r3 >> 2;
+	f4 = -f4;
+	heapFloat[(fp+-8)] = f5;
+	f3 = -f3;
+	heapFloat[(r4+1)] = f4;
+	heapFloat[(r4+2)] = f3;
+	heap32[(r4+3)] = 0;
+	r4 = heap32[(r1+93)];
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+8)];
+	r6 = r6 << 2;
+	r6 = (r4 + r6)|0;
+	r6 = r6 >> 2;
+	heap32[(r6+4)] = 0;
+	r6 = heap32[(r1+91)];
+	r6 = (r6 + -1)|0;
+	r7 = heap32[(r5+8)];
+	r9 = r6 << 2;
+	r7 = r7 << 2;
+	r8 = (r8 + r9)|0;
+	r7 = (r4 + r7)|0;
+	r8 = r8 >> 2;
+	heap32[(r1+91)] = r6;
+	r6 = r7 >> 2;
+	r7 = heap32[(r8)];
+	heap32[(r6)] = r7;
+	r6 = heap32[(r5+8)];
+	r7 = r6 << 2;
+	r4 = (r4 + r7)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r6 = (r6 + 1)|0;
+	heap32[(r5+8)] = r6;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(g0)] = r0;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB544_26
+{
+__label__ = 25;
+break _1;
+}
+else{
+	r3 = heap32[(r1+93)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+8)];
+	r5 = (r5 + -1)|0;
+	r6 = heap32[(r1+91)];
+	r7 = r5 << 2;
+	r8 = r6 << 2;
+	r3 = (r3 + r7)|0;
+	r7 = (r0 + r8)|0;
+	r3 = r3 >> 2;
+	heap32[(r4+8)] = r5;
+	r4 = r7 >> 2;
+	r3 = heap32[(r3)];
+	r5 = (r6 + 1)|0;
+	heap32[(r4+87)] = r3;
+	heap32[(r1+91)] = r5;
+}
+}
+}
+	r2 = (r2 + 1)|0;
+continue _23;
+}
+else{
+__label__ = 24;
+break _1;
+}
+}
+}
+else{
+__label__ = 24;
+}
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 24:
+	r0 = 0;
+	r_g0 = r0;
+	return;
+break;
+case 25:
+	r0 = 1;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function _ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+var __label__ = 0;
+	i7 = sp + -96;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = sp + -12;
+	r2 = heap32[(fp+1)];
+	r3 = r1 >> 2;
+	heap32[(fp+-3)] = r0;
+	r4 = heap32[(fp+2)];
+	heap32[(r3+1)] = r2;
+	r5 = r0 >> 2;
+	heap32[(r3+2)] = r4;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r5+2)];
+	f1 = heapFloat[(r2+2)];
+	f2 = heapFloat[(r5+1)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r5)];
+	f5 = heapFloat[(r2)];
+	r3 = sp + -64;
+	f6 = f4-f5;
+	f7 = f2-f3;
+	r6 = r3 >> 2;
+	heapFloat[(fp+-16)] = f6;
+	f8 = f0-f1;
+	heapFloat[(r6+1)] = f7;
+	heapFloat[(r6+2)] = f8;
+	r4 = r4 >> 2;
+	heap32[(r6+3)] = 0;
+	f9 = heapFloat[(r4+2)];
+	f10 = heapFloat[(r4+1)];
+	f11 = heapFloat[(r4)];
+	f5 = f5-f11;
+	f3 = f3-f10;
+	heapFloat[(r6+4)] = f5;
+	f1 = f1-f9;
+	heapFloat[(r6+5)] = f3;
+	heapFloat[(r6+6)] = f1;
+	f12 = f8*f5;
+	f13 = f6*f1;
+	f14 = f7*f1;
+	f15 = f8*f3;
+	f12 = f12-f13;
+	f13 = f14-f15;
+	f11 = f11-f4;
+	heap32[(r6+7)] = 0;
+	f14 = f6*f3;
+	f15 = f7*f5;
+	f14 = f14-f15;
+	f10 = f10-f2;
+	heapFloat[(r6+8)] = f11;
+	f15 = f13*f13;
+	f16 = f12*f12;
+	f9 = f9-f0;
+	heapFloat[(r6+9)] = f10;
+	f15 = f15+f16;
+	f16 = f14*f14;
+	f15 = f15+f16;
+	heapFloat[(r6+10)] = f9;
+	heap32[(r6+11)] = 0;
+	f16 =                         0;
+	if(f15 >f16) //_LBB545_2
+{
+	r6 = heap32[(fp+3)];
+	r7 = heap32[(fp+4)];
+	r8 = sp + -72;
+	r9 = r8 >> 2;
+	heap32[(fp+-18)] = 0;
+	r10 = 0;
+	f17 =                        -1;
+	heap32[(r9+1)] = 0;
+	heap32[(fp+-19)] = 0;
+	r18 = 0;
+_3: while(true){
+	f18 = f7*f14;
+	f19 = f8*f12;
+	f8 = f8*f13;
+	f20 = f6*f14;
+	f18 = f18-f19;
+	f8 = f8-f20;
+	f6 = f6*f12;
+	f7 = f7*f13;
+	f4 = f4*f18;
+	f2 = f2*f8;
+	f6 = f6-f7;
+	f2 = f4+f2;
+	f0 = f0*f6;
+	f0 = f2+f0;
+_5: do {
+	if(f0 >f16) //_LBB545_5
+{
+	r11 = _ZZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRjE4imd3;
+	r12 = r10 << 2;
+	r13 = (r11 + r12)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r14 = r13 << 2;
+	r15 = (r1 + r14)|0;
+	r15 = r15 >> 2;
+	r15 = heap32[(r15)];
+	r16 = sp + -76;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r15;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r16;
+	_ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_PfRj(i7);
+	f0 = f_g0;
+if(!(f17 <f16)) //_LBB545_7
+{
+	if(f0 >=f17) //_LBB545_4
+{
+break _5;
+}
+}
+	r0 = heap32[(fp+-19)];
+	r15 = 1;
+	r11 = (r11 + r14)|0;
+	r16 = r0 & 1;
+	r17 = r15 << r10;
+	r0 = r0 & 2;
+	r13 = r15 << r13;
+	r11 = r11 >> 2;
+	r15 = r16 == 0 ? r18 : r17;
+	r0 = r0 == 0 ? r18 : r13;
+	r11 = heap32[(r11)];
+	r12 = (r6 + r12)|0;
+	r13 = r7 >> 2;
+	r0 = (r15 + r0)|0;
+	r11 = r11 << 2;
+	r14 = (r6 + r14)|0;
+	r12 = r12 >> 2;
+	heap32[(r13)] = r0;
+	r0 = (r6 + r11)|0;
+	r11 = r14 >> 2;
+	heap32[(r12)] = heap32[(fp+-18)];
+	r0 = r0 >> 2;
+	heap32[(r11)] = heap32[(r9+1)];
+	heap32[(r0)] = 0;
+	f17 = f0;
+}
+} while(0);
+	if(r10 ==2) //_LBB545_10
+{
+break _3;
+}
+else{
+	r11 = (r10 + 1)|0;
+	r0 = r10 << 2;
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	r10 = r10 << 4;
+	r0 = heap32[(r0+1)];
+	r10 = (r3 + r10)|0;
+	r10 = r10 >> 2;
+	r12 = r0 >> 2;
+	f6 = heapFloat[(r10+4)];
+	f7 = heapFloat[(r10+5)];
+	f8 = heapFloat[(r10+6)];
+	f4 = heapFloat[(r12)];
+	f2 = heapFloat[(r12+1)];
+	f0 = heapFloat[(r12+2)];
+	r10 = r11;
+}
+}
+	if(f17 <f16) //_LBB545_12
+{
+	f17 = heapFloat[(r5)];
+	f0 = heapFloat[(r5+1)];
+	f2 = heapFloat[(r5+2)];
+	f17 = f17*f13;
+	f0 = f0*f12;
+	heapFloat[(g0)] = f15;
+	f17 = f17+f0;
+	f0 = f2*f14;
+	f17 = f17+f0;
+	r0 = r7 >> 2;
+	sqrtf(i7);
+	f0 = f_g0;
+	f17 = f17/f15;
+	heap32[(r0)] = 7;
+	f2 = f13*f17;
+	f4 = heapFloat[(r2)];
+	f6 = f12*f17;
+	f7 = heapFloat[(r2+1)];
+	f8 = heapFloat[(r2+2)];
+	f17 = f14*f17;
+	f7 = f7-f6;
+	f8 = f8-f17;
+	f4 = f4-f2;
+	f12 = f3*f8;
+	f13 = f1*f7;
+	f1 = f1*f4;
+	f8 = f5*f8;
+	f12 = f12-f13;
+	f1 = f1-f8;
+	f5 = f5*f7;
+	f3 = f3*f4;
+	f3 = f5-f3;
+	f4 = f12*f12;
+	f1 = f1*f1;
+	f1 = f4+f1;
+	f3 = f3*f3;
+	f1 = f1+f3;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	r0 = r6 >> 2;
+	f1 = f_g0/f0;
+	heapFloat[(r0)] = f1;
+	f1 = heapFloat[(r4+2)];
+	f3 = heapFloat[(r4+1)];
+	f4 = heapFloat[(r4)];
+	f3 = f3-f6;
+	f1 = f1-f17;
+	f4 = f4-f2;
+	f5 = f10*f1;
+	f7 = f9*f3;
+	f8 = f9*f4;
+	f1 = f11*f1;
+	f5 = f5-f7;
+	f1 = f8-f1;
+	f3 = f11*f3;
+	f4 = f10*f4;
+	f3 = f3-f4;
+	f4 = f5*f5;
+	f1 = f1*f1;
+	f1 = f4+f1;
+	f3 = f3*f3;
+	f1 = f1+f3;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f0 = f_g0/f0;
+	heapFloat[(r0+1)] = f0;
+	f1 = heapFloat[(r0)];
+	f3 =                         1;
+	f0 = f1+f0;
+	f1 = f2*f2;
+	f2 = f6*f6;
+	f0 = f3-f0;
+	f1 = f1+f2;
+	f17 = f17*f17;
+	heapFloat[(r0+2)] = f0;
+	f17 = f1+f17;
+}
+}
+else{
+	f17 =                        -1;
+}
+	f_g0 = f17;
+	return;
+}
+
+function _ZN12gjkepa2_impl3GJK8EvaluateERKNS_13MinkowskiDiffERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -240;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = (r0 + 220)|0;
+	r3 = (r0 + 252)|0;
+	heap32[(r1+87)] = r2;
+	r2 = (r0 + 284)|0;
+	heap32[(r1+88)] = r3;
+	r3 = (r0 + 316)|0;
+	heap32[(r1+89)] = r2;
+	heap32[(r1+90)] = r3;
+	heap32[(r1+91)] = 4;
+	r2 = heap32[(fp+1)];
+	heap32[(r1+92)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r1+94)] = 0;
+	r4 = heap32[(r2+1)];
+	r5 = heap32[(r2)];
+	heap32[(r1)] = r5;
+	heap32[(r1+1)] = r4;
+	heap32[(r1+2)] = heap32[(r2+2)];
+	heap32[(r1+3)] = heap32[(r2+3)];
+	heap32[(r1+4)] = heap32[(r2+4)];
+	heap32[(r1+5)] = heap32[(r2+5)];
+	heap32[(r1+6)] = heap32[(r2+6)];
+	heap32[(r1+7)] = heap32[(r2+7)];
+	heap32[(r1+8)] = heap32[(r2+8)];
+	heap32[(r1+9)] = heap32[(r2+9)];
+	heap32[(r1+10)] = heap32[(r2+10)];
+	heap32[(r1+11)] = heap32[(r2+11)];
+	heap32[(r1+12)] = heap32[(r2+12)];
+	heap32[(r1+13)] = heap32[(r2+13)];
+	heap32[(r1+14)] = heap32[(r2+14)];
+	heap32[(r1+15)] = heap32[(r2+15)];
+	heap32[(r1+16)] = heap32[(r2+16)];
+	heap32[(r1+17)] = heap32[(r2+17)];
+	heap32[(r1+18)] = heap32[(r2+18)];
+	heap32[(r1+19)] = heap32[(r2+19)];
+	heap32[(r1+20)] = heap32[(r2+20)];
+	heap32[(r1+21)] = heap32[(r2+21)];
+	heap32[(r1+22)] = heap32[(r2+22)];
+	heap32[(r1+23)] = heap32[(r2+23)];
+	heap32[(r1+24)] = heap32[(r2+24)];
+	heap32[(r1+25)] = heap32[(r2+25)];
+	heap32[(r1+26)] = heap32[(r2+26)];
+	heap32[(r1+27)] = heap32[(r2+27)];
+	heap32[(r1+28)] = heap32[(r2+28)];
+	heap32[(r1+29)] = heap32[(r2+29)];
+	r4 = heap32[(r2+31)];
+	r2 = heap32[(r2+30)];
+	heap32[(r1+30)] = r2;
+	heap32[(r1+31)] = r4;
+	r2 = heap32[(fp+2)];
+	heap32[(r1+36)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r1+45)] = 0;
+	f0 = heapFloat[(r2)];
+	heapFloat[(r1+32)] = f0;
+	f1 = heapFloat[(r2+1)];
+	heapFloat[(r1+33)] = f1;
+	f2 = heapFloat[(r2+2)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	heapFloat[(r1+34)] = f2;
+	heap32[(r1+35)] = heap32[(r2+3)];
+	f4 =                         0;
+	if(f3 <=f4) //_LBB546_2
+{
+	r2 = sp + -112;
+	r2 = r2 >> 2;
+	heap32[(fp+-28)] = 1065353216;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+}
+else{
+	r2 = sp + -112;
+	f0 = -f0;
+	r2 = r2 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-28)] = f0;
+	f0 = -f2;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f0;
+	heap32[(r2+3)] = 0;
+}
+	heap32[(r1+41)] = 0;
+	heap32[(r1+91)] = 3;
+	heap32[(r1+37)] = r3;
+	heap32[(r1+45)] = 1;
+	r2 = sp + -112;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	heap32[(r1+41)] = 1065353216;
+	r2 = heap32[(r1+37)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+4)];
+	heapFloat[(r1+32)] = f0;
+	f1 = heapFloat[(r2+5)];
+	heapFloat[(r1+33)] = f1;
+	f2 = heapFloat[(r2+6)];
+	heapFloat[(r1+34)] = f2;
+	f5 = heapFloat[(r2+7)];
+	r2 = sp + -176;
+	r3 = r2 >> 2;
+	heapFloat[(r1+35)] = f5;
+	heapFloat[(r3+12)] = f0;
+	heapFloat[(r3+13)] = f1;
+	heapFloat[(r3+14)] = f2;
+	heapFloat[(r3+15)] = f5;
+	heapFloat[(r3+8)] = f0;
+	heapFloat[(r3+9)] = f1;
+	heapFloat[(r3+10)] = f2;
+	heapFloat[(r3+11)] = f5;
+	heapFloat[(r3+4)] = f0;
+	heapFloat[(r3+5)] = f1;
+	heapFloat[(r3+6)] = f2;
+	heapFloat[(r3+7)] = f5;
+	heapFloat[(fp+-44)] = f0;
+	heapFloat[(r3+1)] = f1;
+	r4 = (r0 + 148)|0;
+	heap32[(fp+-52)] = r4;
+	r4 = 0;
+	r5 = 1;
+	heap32[(fp+-53)] = r5;
+	heapFloat[(r3+2)] = f2;
+	heapFloat[(r3+3)] = f5;
+	heap32[(fp+-50)] = r5;
+	r24 = 0;
+_5: while(true){
+	f0 = f0*f0;
+	f1 = f1*f1;
+	r3 = heap32[(r1+92)];
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f1 =   9.9999997473787516e-005;
+	if(f0 >=f1) //_LBB546_6
+{
+	r5 = heap32[(fp+-53)];
+	r5 = (r5 - r3)|0;
+	heap32[(fp+-51)] = r5;
+	f2 = heapFloat[(r1+34)];
+	f5 = heapFloat[(r1+33)];
+	f6 = heapFloat[(r1+32)];
+	r5 = sp + -96;
+	f6 = -f6;
+	r6 = r5 >> 2;
+	f5 = -f5;
+	heapFloat[(fp+-24)] = f6;
+	r3 = (r3 * 36)|0;
+	f2 = -f2;
+	heapFloat[(r6+1)] = f5;
+	r7 = (r0 + r3)|0;
+	heapFloat[(r6+2)] = f2;
+	heap32[(r6+3)] = 0;
+	r6 = r7 >> 2;
+	r8 = heap32[(r6+45)];
+	r8 = r8 << 2;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+41)] = 0;
+	r8 = heap32[(r1+91)];
+	r8 = (r8 + -1)|0;
+	r9 = heap32[(r6+45)];
+	r10 = r8 << 2;
+	r10 = (r0 + r10)|0;
+	r9 = r9 << 2;
+	r7 = (r7 + 148)|0;
+	r9 = (r7 + r9)|0;
+	r10 = r10 >> 2;
+	heap32[(r1+91)] = r8;
+	r8 = r9 >> 2;
+	r9 = heap32[(r10+87)];
+	heap32[(r8)] = r9;
+	r8 = heap32[(r6+45)];
+	r9 = r8 << 2;
+	r9 = (r7 + r9)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r8 = (r8 + 1)|0;
+	heap32[(r6+45)] = r8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r9;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	r5 = heap32[(r6+45)];
+	r8 = r5 << 2;
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+-1)];
+	r8 = 0;
+_8: while(true){
+	if(uint(r8) <uint(4)) //_LBB546_7
+{
+	r9 = r8 << 4;
+	r9 = (r2 + r9)|0;
+	r10 = r7 >> 2;
+	r9 = r9 >> 2;
+	f2 = heapFloat[(r10+4)];
+	f5 = heapFloat[(r9)];
+	f6 = heapFloat[(r10+5)];
+	f7 = heapFloat[(r9+1)];
+	f2 = f2-f5;
+	f5 = f6-f7;
+	f6 = heapFloat[(r10+6)];
+	f7 = heapFloat[(r9+2)];
+	f6 = f6-f7;
+	f2 = f2*f2;
+	f5 = f5*f5;
+	f2 = f2+f5;
+	f5 = f6*f6;
+	f2 = f2+f5;
+	if(f2 <f1) //_LBB546_10
+{
+__label__ = 10;
+break _5;
+}
+else{
+	r8 = (r8 + 1)|0;
+}
+}
+else{
+break _8;
+}
+}
+	r8 = heap32[(fp+-50)];
+	r8 = r8 << 4;
+	r8 = (r2 + r8)|0;
+	r8 = r8 >> 2;
+	r7 = r7 >> 2;
+	heap32[(r8)] = heap32[(r7+4)];
+	heap32[(r8+1)] = heap32[(r7+5)];
+	heap32[(r8+2)] = heap32[(r7+6)];
+	heap32[(r8+3)] = heap32[(r7+7)];
+	f1 = heapFloat[(r1+32)];
+	f2 = heapFloat[(r7+4)];
+	f5 = heapFloat[(r1+33)];
+	f6 = heapFloat[(r7+5)];
+	f1 = f1*f2;
+	f2 = f5*f6;
+	f5 = heapFloat[(r1+34)];
+	f6 = heapFloat[(r7+6)];
+	f1 = f1+f2;
+	f2 = f5*f6;
+	f1 = f1+f2;
+	f1 = f1/f0;
+	f4 = f1 > f4 ? f1 : f4;
+	f1 =  -9.9999997473787516e-005;
+	f2 = f0-f4;
+	f0 = f0*f1;
+	f0 = f2+f0;
+	f5 =                         0;
+	if(f0 >f5) //_LBB546_13
+{
+	heap32[(fp+-49)] = 0;
+_14: do {
+	if(r5 ==2) //_LBB546_17
+{
+	r5 = heap32[(r6+38)];
+	r7 = heap32[(r6+37)];
+	r7 = (r7 + 16)|0;
+	r5 = (r5 + 16)|0;
+	r8 = sp + -192;
+	r9 = sp + -196;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r9;
+	_ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_PfRj(i7);
+	f3 = f_g0;
+__label__ = 32;
+break _14;
+}
+else{
+	if(r5 ==3) //_LBB546_18
+{
+	r5 = heap32[(r6+39)];
+	r7 = heap32[(r6+38)];
+	r8 = heap32[(r6+37)];
+	r8 = (r8 + 16)|0;
+	r7 = (r7 + 16)|0;
+	r5 = (r5 + 16)|0;
+	r9 = sp + -192;
+	r10 = sp + -196;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = r10;
+	_ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRj(i7);
+	f3 = f_g0;
+__label__ = 32;
+}
+else{
+	if(r5 ==4) //_LBB546_19
+{
+	r5 = heap32[(r6+40)];
+	r7 = heap32[(r6+39)];
+	r8 = heap32[(r6+38)];
+	r9 = heap32[(r6+37)];
+	r10 = sp + -16;
+	r11 = (r9 + 16)|0;
+	r12 = r10 >> 2;
+	r13 = (r8 + 16)|0;
+	heap32[(fp+-4)] = r11;
+	r11 = (r7 + 16)|0;
+	heap32[(r12+1)] = r13;
+	r13 = (r5 + 16)|0;
+	heap32[(r12+2)] = r11;
+	r9 = r9 >> 2;
+	heap32[(r12+3)] = r13;
+	r5 = r5 >> 2;
+	f0 = heapFloat[(r9+6)];
+	f1 = heapFloat[(r5+6)];
+	f2 = heapFloat[(r9+5)];
+	f3 = heapFloat[(r5+5)];
+	f6 = heapFloat[(r9+4)];
+	f7 = heapFloat[(r5+4)];
+	r11 = sp + -64;
+	f8 = f6-f7;
+	f9 = f2-f3;
+	r12 = r11 >> 2;
+	heapFloat[(fp+-16)] = f8;
+	f10 = f0-f1;
+	heapFloat[(r12+1)] = f9;
+	heapFloat[(r12+2)] = f10;
+	r8 = r8 >> 2;
+	heap32[(r12+3)] = 0;
+	f11 = heapFloat[(r8+6)];
+	f12 = heapFloat[(r8+5)];
+	f13 = heapFloat[(r8+4)];
+	f14 = f13-f7;
+	f15 = f12-f3;
+	heapFloat[(r12+4)] = f14;
+	f16 = f11-f1;
+	heapFloat[(r12+5)] = f15;
+	heapFloat[(r12+6)] = f16;
+	r7 = r7 >> 2;
+	heap32[(r12+7)] = 0;
+	f17 = heapFloat[(r7+5)];
+	f18 = heapFloat[(r7+4)];
+	f19 = f9*f16;
+	f7 = f18-f7;
+	f20 = f10*f14;
+	f3 = f17-f3;
+	f21 = heapFloat[(r7+6)];
+	f16 = f8*f16;
+	f19 = f19*f7;
+	f20 = f20*f3;
+	f22 = f11-f21;
+	f23 = f2-f12;
+	f18 = f13-f18;
+	f11 = f0-f11;
+	f12 = f12-f17;
+	f13 = f6-f13;
+	f17 = f19+f20;
+	f16 = f16*f3;
+	f14 = f9*f14;
+	f1 = f21-f1;
+	f19 = f8*f15;
+	f20 = f12*f11;
+	f21 = f22*f23;
+	f22 = f22*f13;
+	f11 = f18*f11;
+	f16 = f17-f16;
+	f14 = f14*f1;
+	f17 = f20-f21;
+	f11 = f22-f11;
+	f15 = f10*f15;
+	heapFloat[(r12+8)] = f7;
+	f18 = f18*f23;
+	f12 = f12*f13;
+	f13 = f16-f14;
+	f14 = f19*f1;
+	f12 = f18-f12;
+	heapFloat[(r12+9)] = f3;
+	f3 = f6*f17;
+	f2 = f2*f11;
+	f6 = f13+f14;
+	f7 = f15*f7;
+	f6 = f6-f7;
+	heapFloat[(r12+10)] = f1;
+	f1 = f3+f2;
+	f0 = f0*f12;
+	f0 = f1+f0;
+	heap32[(r12+11)] = 0;
+	f0 = f0*f6;
+	if(f0 >f5) //_LBB546_45
+{
+__label__ = 42;
+break _5;
+}
+else{
+	if(f6 <f5) //_LBB546_22
+{
+	f0 = -f6;
+}
+else{
+	f0 = f6;
+}
+	if(f0 <=f5) //_LBB546_45
+{
+__label__ = 42;
+break _5;
+}
+else{
+	r12 = sp + -76;
+	r14 = r12 >> 2;
+	heap32[(fp+-19)] = 0;
+	heap32[(r14+1)] = 0;
+	r15 = 0;
+	f3 =                        -1;
+	heap32[(r14+2)] = 0;
+	heap32[(fp+-20)] = 0;
+_27: while(true){
+	r16 = _ZZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRjE4imd3;
+	r17 = r15 << 2;
+	r18 = (r16 + r17)|0;
+	r18 = r18 >> 2;
+	r18 = heap32[(r18)];
+	r19 = r18 << 4;
+	r19 = (r11 + r19)|0;
+	r19 = r19 >> 2;
+	f0 = heapFloat[(r19+1)];
+	f1 = heapFloat[(r19+2)];
+	f2 = heapFloat[(r19)];
+	f7 = f9*f1;
+	f11 = f10*f0;
+	f10 = f10*f2;
+	f1 = f8*f1;
+	f12 = heapFloat[(r5+4)];
+	f7 = f7-f11;
+	f11 = heapFloat[(r5+5)];
+	f1 = f10-f1;
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f8 = f12*f7;
+	f1 = f11*f1;
+	f9 = heapFloat[(r5+6)];
+	f0 = f0-f2;
+	f1 = f8+f1;
+	f0 = f9*f0;
+	f0 = f1+f0;
+	f0 = f0*f6;
+_29: do {
+	if(f0 >f5) //_LBB546_27
+{
+	r19 = r18 << 2;
+	r20 = (r10 + r19)|0;
+	r21 = (r10 + r17)|0;
+	r20 = r20 >> 2;
+	r21 = r21 >> 2;
+	r20 = heap32[(r20)];
+	r21 = heap32[(r21)];
+	r22 = sp + -80;
+	heap32[(g0)] = r21;
+	heap32[(g0+1)] = r20;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = r22;
+	_ZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRj(i7);
+	f0 = f_g0;
+	f1 =                         0;
+if(!(f3 <f1)) //_LBB546_29
+{
+	if(f0 >=f3) //_LBB546_26
+{
+break _29;
+}
+}
+	r20 = heap32[(fp+-20)];
+	r21 = 1;
+	r22 = r20 & 1;
+	r23 = r21 << r15;
+	r25 = r20 & 2;
+	r18 = r21 << r18;
+	r16 = (r16 + r19)|0;
+	r21 = r22 == 0 ? r24 : r23;
+	r18 = r25 == 0 ? r24 : r18;
+	r20 = r20 & 4;
+	r22 = 8;
+	r23 = sp + -192;
+	r16 = r16 >> 2;
+	r18 = (r21 + r18)|0;
+	r20 = r20 == 0 ? r24 : r22;
+	r16 = heap32[(r16)];
+	r17 = (r23 + r17)|0;
+	r18 = (r18 + r20)|0;
+	r16 = r16 << 2;
+	r19 = (r23 + r19)|0;
+	r17 = r17 >> 2;
+	heap32[(fp+-49)] = r18;
+	r16 = (r23 + r16)|0;
+	r18 = r19 >> 2;
+	heap32[(r17)] = heap32[(fp+-19)];
+	r16 = r16 >> 2;
+	heap32[(r18)] = heap32[(r14+1)];
+	r17 = r23 >> 2;
+	heap32[(r16)] = 0;
+	heap32[(r17+3)] = heap32[(r14+2)];
+	f3 = f0;
+}
+} while(0);
+	if(r15 ==2) //_LBB546_32
+{
+break _27;
+}
+else{
+	r16 = (r15 + 1)|0;
+	r15 = r15 << 4;
+	r15 = (r11 + r15)|0;
+	r15 = r15 >> 2;
+	f8 = heapFloat[(r15+4)];
+	f9 = heapFloat[(r15+5)];
+	f10 = heapFloat[(r15+6)];
+	r15 = r16;
+}
+}
+	if(f3 <f5) //_LBB546_34
+{
+	heap32[(fp+-49)] = 15;
+	f0 = heapFloat[(r7+5)];
+	f1 = heapFloat[(r8+6)];
+	f2 = heapFloat[(r8+4)];
+	f3 = heapFloat[(r7+6)];
+	f7 = heapFloat[(r7+4)];
+	f8 = f0*f1;
+	f9 = heapFloat[(r5+4)];
+	f10 = f3*f2;
+	f11 = heapFloat[(r5+5)];
+	f12 = f7*f1;
+	f8 = f8*f9;
+	f10 = f10*f11;
+	f13 = heapFloat[(r8+5)];
+	f14 = heapFloat[(r5+6)];
+	f15 = f0*f2;
+	f8 = f8+f10;
+	f10 = f12*f11;
+	f12 = f7*f13;
+	f8 = f8-f10;
+	f10 = f15*f14;
+	f15 = f3*f13;
+	f8 = f8-f10;
+	f10 = f12*f14;
+	f8 = f8+f10;
+	f10 = f15*f9;
+	f8 = f8-f10;
+	f8 = f8/f6;
+	heapFloat[(fp+-48)] = f8;
+	f10 = heapFloat[(r9+5)];
+	f12 = heapFloat[(r9+6)];
+	f15 = heapFloat[(r9+4)];
+	f16 = f10*f3;
+	f17 = f12*f7;
+	f18 = f13*f12;
+	f19 = f1*f15;
+	f3 = f15*f3;
+	f16 = f16*f9;
+	f17 = f17*f11;
+	f20 = f2*f12;
+	f7 = f10*f7;
+	f18 = f18*f9;
+	f19 = f19*f11;
+	f16 = f16+f17;
+	f3 = f3*f11;
+	f13 = f13*f15;
+	f15 = f15*f0;
+	f17 = f18+f19;
+	f11 = f20*f11;
+	f3 = f16-f3;
+	f7 = f7*f14;
+	f2 = f2*f10;
+	f0 = f12*f0;
+	f11 = f17-f11;
+	f12 = f13*f14;
+	f3 = f3-f7;
+	f7 = f15*f14;
+	f1 = f1*f10;
+	f10 = f11-f12;
+	f2 = f2*f14;
+	f3 = f3+f7;
+	f0 = f0*f9;
+	f0 = f3-f0;
+	f2 = f10+f2;
+	f1 = f1*f9;
+	r5 = sp + -192;
+	f1 = f2-f1;
+	f0 = f0/f6;
+	r5 = r5 >> 2;
+	f2 = f8+f0;
+	f1 = f1/f6;
+	heapFloat[(r5+1)] = f0;
+	f0 =                         1;
+	f2 = f2+f1;
+	r7 = 15;
+	f0 = f0-f2;
+	heapFloat[(r5+2)] = f1;
+	heapFloat[(r5+3)] = f0;
+__label__ = 34;
+}
+else{
+__label__ = 32;
+}
+}
+}
+}
+else{
+__label__ = 32;
+}
+}
+}
+} while(0);
+if (__label__ == 32){
+	f0 =                         0;
+	if(f3 <f0) //_LBB546_45
+{
+__label__ = 42;
+break _5;
+}
+else{
+	r7 = heap32[(fp+-49)];
+	f5 = f3;
+}
+}
+	r5 = heap32[(fp+-51)];
+	r8 = (r5 * 36)|0;
+	r8 = (r0 + r8)|0;
+	r9 = r8 >> 2;
+	heap32[(r9+45)] = 0;
+	heap32[(r1+32)] = 0;
+	heap32[(r1+33)] = 0;
+	heap32[(r1+34)] = 0;
+	heap32[(r1+35)] = 0;
+	heap32[(r1+92)] = r5;
+	r5 = heap32[(r6+45)];
+_42: do {
+if(!(r5 ==0)) //_LBB546_43
+{
+	r6 = heap32[(fp+-52)];
+	r3 = (r6 + r3)|0;
+	r6 = 0;
+_44: while(true){
+	r10 = 1;
+	r10 = r10 << r6;
+	r10 = r7 & r10;
+	if(r10 ==0) //_LBB546_41
+{
+	r10 = r6 << 2;
+	r11 = heap32[(r1+91)];
+	r10 = (r3 + r10)|0;
+	r12 = r11 << 2;
+	r10 = r10 >> 2;
+	r12 = (r0 + r12)|0;
+	r10 = heap32[(r10)];
+	r12 = r12 >> 2;
+	r11 = (r11 + 1)|0;
+	heap32[(r12+87)] = r10;
+	heap32[(r1+91)] = r11;
+}
+else{
+	r10 = r6 << 2;
+	r11 = (r3 + r10)|0;
+	r12 = heap32[(r9+45)];
+	r11 = r11 >> 2;
+	r13 = (r8 + 148)|0;
+	r12 = r12 << 2;
+	r12 = (r13 + r12)|0;
+	r14 = heap32[(r11)];
+	r12 = r12 >> 2;
+	r15 = sp + -192;
+	heap32[(r12)] = r14;
+	r12 = heap32[(r9+45)];
+	r10 = (r15 + r10)|0;
+	r14 = r12 << 2;
+	r10 = r10 >> 2;
+	r13 = (r13 + r14)|0;
+	f0 = heapFloat[(r10)];
+	r10 = r13 >> 2;
+	r12 = (r12 + 1)|0;
+	heapFloat[(r10+4)] = f0;
+	heap32[(r9+45)] = r12;
+	r10 = heap32[(r11)];
+	r10 = r10 >> 2;
+	f1 = heapFloat[(r10+4)];
+	f2 = heapFloat[(r10+6)];
+	f3 = heapFloat[(r10+5)];
+	f6 = heapFloat[(r1+32)];
+	f1 = f1*f0;
+	f1 = f6+f1;
+	heapFloat[(r1+32)] = f1;
+	f1 = f3*f0;
+	f3 = heapFloat[(r1+33)];
+	f1 = f3+f1;
+	heapFloat[(r1+33)] = f1;
+	f0 = f2*f0;
+	f1 = heapFloat[(r1+34)];
+	f0 = f1+f0;
+	heapFloat[(r1+34)] = f0;
+}
+	r6 = (r6 + 1)|0;
+if(!(r5 !=r6)) //_LBB546_39
+{
+break _42;
+}
+}
+}
+} while(0);
+if(!(r7 !=15)) //_LBB546_46
+{
+	heap32[(r1+94)] = 1;
+}
+	r4 = (r4 + 1)|0;
+	if(uint(r4) <uint(128)) //_LBB546_48
+{
+	r3 = heap32[(r1+94)];
+	if(r3 !=0) //_LBB546_50
+{
+__label__ = 47;
+break _5;
+}
+else{
+	r5 = heap32[(fp+-50)];
+	r3 = (r5 + 1)|0;
+	f0 = heapFloat[(r1+32)];
+	f1 = heapFloat[(r1+33)];
+	f2 = heapFloat[(r1+34)];
+	r5 = r3 & 3;
+	heap32[(fp+-50)] = r5;
+	f3 = f5;
+continue _5;
+}
+}
+else{
+__label__ = 44;
+break _5;
+}
+}
+else{
+__label__ = 12;
+break _5;
+}
+}
+else{
+__label__ = 5;
+break _5;
+}
+}
+switch(__label__ ){//multiple entries
+case 10:
+	r2 = heap32[(r1+92)];
+	r2 = (r2 * 36)|0;
+	r2 = (r0 + r2)|0;
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+45)];
+	r4 = (r4 + -1)|0;
+	r5 = r4 << 2;
+	r6 = heap32[(r1+91)];
+	r2 = (r2 + r5)|0;
+	r5 = r6 << 2;
+	r2 = (r2 + 148)|0;
+	r5 = (r0 + r5)|0;
+	r2 = r2 >> 2;
+	heap32[(r3+45)] = r4;
+	r3 = r5 >> 2;
+	r2 = heap32[(r2)];
+	r4 = (r6 + 1)|0;
+	heap32[(r3+87)] = r2;
+	heap32[(r1+91)] = r4;
+break;
+case 42:
+	r2 = heap32[(r1+92)];
+	r2 = (r2 * 36)|0;
+	r2 = (r0 + r2)|0;
+	r4 = r2 >> 2;
+	r3 = heap32[(r4+45)];
+	r3 = (r3 + -1)|0;
+	r5 = r3 << 2;
+	r6 = heap32[(r1+91)];
+	r2 = (r2 + r5)|0;
+	r5 = r6 << 2;
+	r2 = (r2 + 148)|0;
+	r5 = (r0 + r5)|0;
+	r2 = r2 >> 2;
+	heap32[(r4+45)] = r3;
+	r4 = r5 >> 2;
+	r2 = heap32[(r2)];
+	r3 = (r6 + 1)|0;
+	heap32[(r4+87)] = r2;
+	heap32[(r1+91)] = r3;
+break;
+case 5:
+	heap32[(r1+94)] = 1;
+break;
+case 44:
+	heap32[(r1+94)] = 2;
+break;
+case 12:
+	r2 = heap32[(r1+92)];
+	r2 = (r2 * 36)|0;
+	r2 = (r0 + r2)|0;
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+45)];
+	r4 = (r4 + -1)|0;
+	r5 = r4 << 2;
+	r6 = heap32[(r1+91)];
+	r2 = (r2 + r5)|0;
+	r5 = r6 << 2;
+	r2 = (r2 + 148)|0;
+	r5 = (r0 + r5)|0;
+	r2 = r2 >> 2;
+	heap32[(r3+45)] = r4;
+	r3 = r5 >> 2;
+	r2 = heap32[(r2)];
+	r4 = (r6 + 1)|0;
+	heap32[(r3+87)] = r2;
+	heap32[(r1+91)] = r4;
+break;
+}
+	r2 = heap32[(r1+92)];
+	r2 = (r2 * 36)|0;
+	r0 = (r0 + r2)|0;
+	r0 = (r0 + 148)|0;
+	heap32[(r1+93)] = r0;
+	r0 = heap32[(r1+94)];
+	if(r0 ==1) //_LBB546_53
+{
+	heap32[(r1+36)] = 0;
+	r0 = 1;
+}
+else{
+if(!(r0 !=0)) //_LBB546_54
+{
+	f0 = heapFloat[(r1+32)];
+	f1 = heapFloat[(r1+33)];
+	f2 = heapFloat[(r1+34)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	heapFloat[(r1+36)] = f_g0;
+	r0 = heap32[(r1+94)];
+	r_g0 = r0;
+	return;
+}
+}
+	r_g0 = r0;
+	return;
+}
+
+function _ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2450)];
+_1: do {
+	if(r1 ==0) //_LBB547_23
+{
+	heap32[(r0)] = 5;
+	r1 = 0;
+}
+else{
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+13)];
+if(!(r3 ==0)) //_LBB547_3
+{
+	r3 = r3 >> 2;
+	r4 = heap32[(r2+12)];
+	heap32[(r3+12)] = r4;
+}
+	r3 = heap32[(r2+12)];
+if(!(r3 ==0)) //_LBB547_5
+{
+	r3 = r3 >> 2;
+	r4 = heap32[(r2+13)];
+	heap32[(r3+13)] = r4;
+}
+	r3 = heap32[(r0+2450)];
+if(!(r3 !=r1)) //_LBB547_7
+{
+	r3 = heap32[(r2+13)];
+	heap32[(r0+2450)] = r3;
+}
+	r3 = heap32[(r0+2451)];
+	r3 = (r3 + -1)|0;
+	heap32[(r0+2451)] = r3;
+	heap32[(r2+12)] = 0;
+	r3 = heap32[(r0+2448)];
+	heap32[(r2+13)] = r3;
+	r3 = heap32[(r0+2448)];
+if(!(r3 ==0)) //_LBB547_9
+{
+	r3 = r3 >> 2;
+	heap32[(r3+12)] = r1;
+}
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	heap32[(r0+2448)] = r1;
+	r6 = heap32[(r0+2449)];
+	r6 = (r6 + 1)|0;
+	r7 = 0;
+	heap32[(r0+2449)] = r6;
+	heap8[r1+59] = r7;
+	heap32[(r2+6)] = r3;
+	heap32[(r2+7)] = r4;
+	heap32[(r2+8)] = r5;
+	r5 = r5 >> 2;
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r5+6)];
+	f1 = heapFloat[(r3+6)];
+	f2 = heapFloat[(r4+6)];
+	f3 = heapFloat[(r5+5)];
+	f4 = heapFloat[(r3+5)];
+	f5 = heapFloat[(r4+5)];
+	f5 = f5-f4;
+	f0 = f0-f1;
+	f1 = f2-f1;
+	f2 = f3-f4;
+	f3 = heapFloat[(r5+4)];
+	f4 = heapFloat[(r3+4)];
+	f6 = heapFloat[(r4+4)];
+	f3 = f3-f4;
+	f4 = f6-f4;
+	f6 = f5*f0;
+	f7 = f1*f2;
+	f6 = f6-f7;
+	f1 = f1*f3;
+	f0 = f4*f0;
+	f0 = f1-f0;
+	heapFloat[(r2)] = f6;
+	f1 = f4*f2;
+	f2 = f5*f3;
+	f1 = f1-f2;
+	heapFloat[(r2+1)] = f0;
+	heapFloat[(r2+2)] = f1;
+	f2 = f6*f6;
+	f0 = f0*f0;
+	heap32[(r2+3)] = 0;
+	f0 = f2+f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f1 = heapFloat[(r5+6)];
+	f2 = heapFloat[(r3+6)];
+	f3 = heapFloat[(r4+6)];
+	f4 = heapFloat[(r5+5)];
+	f5 = heapFloat[(r3+5)];
+	f6 = heapFloat[(r4+5)];
+	f7 = heapFloat[(r5+4)];
+	f8 = heapFloat[(r3+4)];
+	f9 = heapFloat[(r4+4)];
+	f10 = heapFloat[(r2)];
+	f11 = f2-f3;
+	f12 = heapFloat[(r2+1)];
+	f13 = f3-f1;
+	f14 = heapFloat[(r2+2)];
+	f15 = f5-f6;
+	f16 = f8-f9;
+	f17 = f6-f4;
+	f18 = f9-f7;
+	f19 = f1-f2;
+	f20 = f4-f5;
+	f21 = f7-f8;
+	f22 = f12*f11;
+	f23 = f14*f15;
+	f24 = f14*f16;
+	f11 = f10*f11;
+	f25 = f12*f13;
+	f26 = f14*f17;
+	f27 = f14*f18;
+	f13 = f10*f13;
+	f22 = f22-f23;
+	f11 = f24-f11;
+	f23 = f25-f26;
+	f13 = f27-f13;
+	f15 = f10*f15;
+	f16 = f12*f16;
+	f17 = f10*f17;
+	f18 = f12*f18;
+	f24 = f12*f19;
+	f25 = f14*f20;
+	f26 = f14*f21;
+	f19 = f10*f19;
+	f15 = f15-f16;
+	f16 = f17-f18;
+	f17 = f24-f25;
+	f18 = f26-f19;
+	f8 = f8*f22;
+	f5 = f5*f11;
+	f9 = f9*f23;
+	f6 = f6*f13;
+	f11 = f10*f20;
+	f13 = f12*f21;
+	f11 = f11-f13;
+	f5 = f8+f5;
+	f2 = f2*f15;
+	f6 = f9+f6;
+	f3 = f3*f16;
+	f7 = f7*f17;
+	f4 = f4*f18;
+	f2 = f5+f2;
+	f3 = f6+f3;
+	f4 = f7+f4;
+	f1 = f1*f11;
+	f5 =   9.9999997473787516e-005;
+	f6 =                         1;
+	f2 = f2 < f3 ? f2 : f3;
+	f1 = f4+f1;
+	f1 = f2 < f1 ? f2 : f1;
+	f2 = f0 > f5 ? f0 : f6;
+	f1 = f1/f2;
+	f2 =    -0.0099999997764825821;
+	f3 =                         0;
+	f1 = f1 < f2 ? f1 : f3;
+	heapFloat[(r2+5)] = f1;
+	if(f0 <=f5) //_LBB547_13
+{
+	heap32[(r0)] = 2;
+}
+else{
+	r4 = heap32[(fp+4)];
+	f1 = heapFloat[(r3+4)];
+	f2 = heapFloat[(r3+5)];
+	f3 = heapFloat[(r3+6)];
+	f1 = f1*f10;
+	f2 = f2*f12;
+	f1 = f1+f2;
+	f2 = f3*f14;
+	f1 = f1+f2;
+	f2 = f6/f0;
+	f0 = f1/f0;
+	f1 = f10*f2;
+	heapFloat[(r2+4)] = f0;
+	f3 = f12*f2;
+	heapFloat[(r2)] = f1;
+	f1 = f14*f2;
+	heapFloat[(r2+1)] = f3;
+	heapFloat[(r2+2)] = f1;
+	if(r4 !=0) //_LBB547_24
+{
+break _1;
+}
+else{
+	f1 =  -9.9999997473787516e-006;
+	if(f0 >=f1) //_LBB547_24
+{
+break _1;
+}
+else{
+	heap32[(r0)] = 3;
+}
+}
+}
+	r3 = heap32[(r2+13)];
+if(!(r3 ==0)) //_LBB547_16
+{
+	r3 = r3 >> 2;
+	r4 = heap32[(r2+12)];
+	heap32[(r3+12)] = r4;
+}
+	r3 = heap32[(r2+12)];
+if(!(r3 ==0)) //_LBB547_18
+{
+	r3 = r3 >> 2;
+	r4 = heap32[(r2+13)];
+	heap32[(r3+13)] = r4;
+}
+	r3 = heap32[(r0+2448)];
+if(!(r3 !=r1)) //_LBB547_20
+{
+	r3 = heap32[(r2+13)];
+	heap32[(r0+2448)] = r3;
+}
+	r3 = heap32[(r0+2449)];
+	r3 = (r3 + -1)|0;
+	heap32[(r0+2449)] = r3;
+	heap32[(r2+12)] = 0;
+	r3 = heap32[(r0+2450)];
+	heap32[(r2+13)] = r3;
+	r2 = heap32[(r0+2450)];
+if(!(r2 ==0)) //_LBB547_22
+{
+	r2 = r2 >> 2;
+	heap32[(r2+12)] = r1;
+}
+	heap32[(r0+2450)] = r1;
+	r1 = heap32[(r0+2451)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0+2451)] = r1;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r_g0 = r1;
+	return;
+}
+
+function _ZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU8[r0+59];
+_1: do {
+if(!(r2 ==r1)) //_LBB548_10
+{
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r6 = r0 >> 2;
+	r7 = r3 >> 2;
+	f0 = heapFloat[(r6)];
+	f1 = heapFloat[(r7+4)];
+	f2 = heapFloat[(r6+1)];
+	f3 = heapFloat[(r7+5)];
+	r8 = _ZZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRjE4imd3;
+	r9 = r4 << 2;
+	r8 = (r8 + r9)|0;
+	f0 = f0*f1;
+	f1 = f2*f3;
+	f2 = heapFloat[(r6+2)];
+	f3 = heapFloat[(r7+6)];
+	r7 = r8 >> 2;
+	f0 = f0+f1;
+	f1 = f2*f3;
+	r7 = heap32[(r7)];
+	f0 = f0+f1;
+	f1 = heapFloat[(r6+4)];
+	f0 = f0-f1;
+	f1 =  -9.9999997473787516e-006;
+	if(f0 >=f1) //_LBB548_8
+{
+	r4 = r7 << 2;
+	r4 = (r0 + r4)|0;
+	r7 = (r0 + r7)|0;
+	heap8[r0+59] = r1;
+	r4 = r4 >> 2;
+	r7 = heapU8[r7+56];
+	r4 = heap32[(r4+9)];
+	r8 = _ZZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonEE4i2m3;
+	r8 = (r8 + r9)|0;
+	r8 = r8 >> 2;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r5;
+	r4 = heap32[(r8)];
+	_ZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonE(i7);
+	r7 = r_g0;
+	if(r7 ==0) //_LBB548_10
+{
+break _1;
+}
+else{
+	r7 = r4 << 2;
+	r7 = (r0 + r7)|0;
+	r4 = (r0 + r4)|0;
+	r7 = r7 >> 2;
+	r4 = heapU8[r4+56];
+	r7 = heap32[(r7+9)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	_ZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonE(i7);
+	r1 = r_g0;
+	if(r1 !=0) //_LBB548_11
+{
+	r1 = heap32[(r6+13)];
+if(!(r1 ==0)) //_LBB548_13
+{
+	r1 = r1 >> 2;
+	r3 = heap32[(r6+12)];
+	heap32[(r1+12)] = r3;
+}
+	r1 = heap32[(r6+12)];
+if(!(r1 ==0)) //_LBB548_15
+{
+	r1 = r1 >> 2;
+	r3 = heap32[(r6+13)];
+	heap32[(r1+13)] = r3;
+}
+	r1 = r2 >> 2;
+	r2 = heap32[(r1+2448)];
+if(!(r2 !=r0)) //_LBB548_17
+{
+	r2 = heap32[(r6+13)];
+	heap32[(r1+2448)] = r2;
+}
+	r2 = heap32[(r1+2449)];
+	r2 = (r2 + -1)|0;
+	heap32[(r1+2449)] = r2;
+	heap32[(r6+12)] = 0;
+	r2 = heap32[(r1+2450)];
+	heap32[(r6+13)] = r2;
+	r2 = heap32[(r1+2450)];
+if(!(r2 ==0)) //_LBB548_19
+{
+	r2 = r2 >> 2;
+	heap32[(r2+12)] = r0;
+}
+	heap32[(r1+2450)] = r0;
+	r0 = heap32[(r1+2451)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1+2451)] = r0;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	r1 = (r0 + 24)|0;
+	r6 = r7 << 2;
+	r7 = (r1 + r9)|0;
+	r1 = (r1 + r6)|0;
+	r6 = r7 >> 2;
+	r1 = r1 >> 2;
+	r6 = heap32[(r6)];
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = 0;
+	_ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(i7);
+	r1 = r_g0;
+	if(r1 ==0) //_LBB548_10
+{
+break _1;
+}
+else{
+	r2 = r1 >> 2;
+	heap8[r1+56] = r4;
+	r3 = (r0 + r9)|0;
+	r6 = (r0 + r4)|0;
+	r7 = 0;
+	heap32[(r2+9)] = r0;
+	r0 = r3 >> 2;
+	heap8[r6+56] = r7;
+	r3 = r5 >> 2;
+	heap32[(r0+9)] = r1;
+	r0 = heap32[(r3)];
+	if(r0 ==0) //_LBB548_5
+{
+	heap32[(r3+1)] = r1;
+}
+else{
+	r5 = 2;
+	r6 = r0 >> 2;
+	heap8[r0+57] = r5;
+	r5 = 1;
+	heap32[(r6+10)] = r1;
+	heap8[r1+58] = r5;
+	heap32[(r2+11)] = r0;
+}
+	heap32[(r3)] = r1;
+	r0 = heap32[(r3+2)];
+	r0 = (r0 + 1)|0;
+	heap32[(r3+2)] = r0;
+}
+}
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btGjkEpaSolver211PenetrationEPK13btConvexShapeRK11btTransformS2_S5_RK9btVector3RNS_8sResultsEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+var __label__ = 0;
+	i7 = sp + -10400;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+5)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	r5 = sp + -176;
+	r6 = heap32[(fp+6)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r1;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r6;
+	r2 = sp + -560;
+	r3 = r2 >> 2;
+	_ZN12gjkepa2_implL10InitializeEPK13btConvexShapeRK11btTransformS2_S5_RN15btGjkEpaSolver28sResultsERNS_13MinkowskiDiffEb(i7);
+	heap32[(r3+32)] = 0;
+	heap32[(r3+33)] = 0;
+	heap32[(r3+34)] = 0;
+	heap32[(r3+35)] = 0;
+	heap32[(r3+91)] = 0;
+	heap32[(r3+94)] = 2;
+	r4 = heap32[(fp+4)];
+	heap32[(r3+92)] = 0;
+	r4 = r4 >> 2;
+	heap32[(r3+36)] = 0;
+	f0 = heapFloat[(r4+2)];
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(r4)];
+	r6 = sp + -48;
+	f2 = -f2;
+	r7 = r6 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-12)] = f2;
+	f0 = -f0;
+	heapFloat[(r7+1)] = f1;
+	heapFloat[(r7+2)] = f0;
+	heap32[(r7+3)] = 0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	_ZN12gjkepa2_impl3GJK8EvaluateERKNS_13MinkowskiDiffERK9btVector3(i7);
+	r6 = r_g0;
+	if(r6 ==2) //_LBB549_71
+{
+	r0 = r1 >> 2;
+	heap32[(r0)] = 2;
+}
+else{
+if(!(r6 !=1)) //_LBB549_72
+{
+	r6 = sp + -10368;
+	r7 = r6 >> 2;
+	heap32[(r7+2448)] = 0;
+	heap32[(r7+2449)] = 0;
+	heap32[(r7+2450)] = 0;
+	heap32[(r7+2451)] = 0;
+	heap32[(fp+-2592)] = 9;
+	heap32[(r7+10)] = 0;
+	heap32[(r7+11)] = 0;
+	heap32[(r7+12)] = 0;
+	heap32[(r7+13)] = 0;
+	r8 = 0;
+	r9 = (r6 + 9780)|0;
+	r10 = (r6 + 9728)|0;
+	heap32[(r7+14)] = 0;
+	heap32[(r7+2447)] = 0;
+	r11 = r8;
+	r12 = r8;
+	r13 = r8;
+_5: while(true){
+	r14 = 127;
+	r14 = (r14 - r13)|0;
+	r15 = (r9 + r8)|0;
+	r14 = (r14 * 60)|0;
+	r14 = (r6 + r14)|0;
+	r15 = r15 >> 2;
+	r14 = (r14 + 2108)|0;
+	r16 = (r10 + r8)|0;
+	heap32[(r15+-1)] = 0;
+	heap32[(r15)] = r12;
+	if(r12 !=0) //_LBB549_5
+{
+	r11 = r12 >> 2;
+	heap32[(r11+12)] = r16;
+	r11 = heap32[(r7+2451)];
+}
+	r8 = (r8 + -60)|0;
+	r13 = (r13 + 1)|0;
+	r11 = (r11 + 1)|0;
+	heap32[(r7+2450)] = r16;
+	heap32[(r7+2451)] = r11;
+	r12 = r14;
+if(!(r8 !=-7680)) //_LBB549_3
+{
+break _5;
+}
+}
+	r3 = heap32[(r3+93)];
+	f0 = heapFloat[(r4+2)];
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(r4)];
+	r3 = r3 >> 2;
+	r4 = heap32[(r3+8)];
+	if(uint(r4) <uint(2)) //_LBB549_57
+{
+__label__ = 56;
+}
+else{
+	heap32[(g0)] = r2;
+	_ZN12gjkepa2_impl3GJK13EncloseOriginEv(i7);
+	r4 = r_g0;
+	if(r4 ==0) //_LBB549_57
+{
+__label__ = 56;
+}
+else{
+	r4 = heap32[(r7+2448)];
+_14: do {
+if(!(r4 ==0)) //_LBB549_19
+{
+_15: while(true){
+	r8 = r4 >> 2;
+	r9 = heap32[(r8+13)];
+if(!(r9 ==0)) //_LBB549_12
+{
+	r9 = r9 >> 2;
+	r10 = heap32[(r8+12)];
+	heap32[(r9+12)] = r10;
+}
+	r9 = heap32[(r8+12)];
+if(!(r9 ==0)) //_LBB549_14
+{
+	r9 = r9 >> 2;
+	r10 = heap32[(r8+13)];
+	heap32[(r9+13)] = r10;
+}
+	r9 = heap32[(r7+2448)];
+if(!(r9 !=r4)) //_LBB549_16
+{
+	r9 = heap32[(r8+13)];
+	heap32[(r7+2448)] = r9;
+}
+	r9 = heap32[(r7+2449)];
+	r9 = (r9 + -1)|0;
+	heap32[(r7+2449)] = r9;
+	heap32[(r8+12)] = 0;
+	r9 = heap32[(r7+2450)];
+	heap32[(r8+13)] = r9;
+	r8 = heap32[(r7+2450)];
+if(!(r8 ==0)) //_LBB549_18
+{
+	r8 = r8 >> 2;
+	heap32[(r8+12)] = r4;
+}
+	heap32[(r7+2450)] = r4;
+	r4 = heap32[(r7+2451)];
+	r4 = (r4 + 1)|0;
+	heap32[(r7+2451)] = r4;
+	r4 = heap32[(r7+2448)];
+if(!(r4 !=0)) //_LBB549_10
+{
+break _14;
+}
+}
+}
+} while(0);
+	heap32[(fp+-2592)] = 0;
+	heap32[(r7+2447)] = 0;
+	r4 = heap32[(r3+1)];
+	r8 = heap32[(r3)];
+	r9 = heap32[(r3+3)];
+	r10 = r8 >> 2;
+	r11 = r4 >> 2;
+	r9 = r9 >> 2;
+	r12 = heap32[(r3+2)];
+	r13 = r12 >> 2;
+	f3 = heapFloat[(r11+6)];
+	f4 = heapFloat[(r9+6)];
+	f5 = heapFloat[(r10+6)];
+	f6 = heapFloat[(r10+5)];
+	f7 = heapFloat[(r9+5)];
+	f8 = heapFloat[(r11+4)];
+	f9 = heapFloat[(r9+4)];
+	f10 = heapFloat[(r13+5)];
+	f11 = heapFloat[(r10+4)];
+	f12 = heapFloat[(r13+4)];
+	f3 = f3-f4;
+	f6 = f6-f7;
+	f8 = f8-f9;
+	f5 = f5-f4;
+	f11 = f11-f9;
+	f13 = f6*f3;
+	f9 = f12-f9;
+	f12 = f5*f8;
+	f10 = f10-f7;
+	f3 = f11*f3;
+	f14 = heapFloat[(r13+6)];
+	f15 = heapFloat[(r11+5)];
+	f13 = f13*f9;
+	f12 = f12*f10;
+	f7 = f15-f7;
+	f12 = f13+f12;
+	f3 = f3*f10;
+	f6 = f6*f8;
+	f4 = f14-f4;
+	f8 = f11*f7;
+	f3 = f12-f3;
+	f6 = f6*f4;
+	f5 = f5*f7;
+	f3 = f3-f6;
+	f4 = f8*f4;
+	f3 = f3+f4;
+	f4 = f5*f9;
+	f3 = f3-f4;
+	f4 =                         0;
+	if(f3 <f4) //_LBB549_21
+{
+	heap32[(r3)] = r4;
+	heap32[(r3+1)] = r8;
+	f3 = heapFloat[(r3+4)];
+	heap32[(r3+4)] = heap32[(r3+5)];
+	heapFloat[(r3+5)] = f3;
+	r9 = r4;
+	r4 = r8;
+}
+else{
+	r9 = r8;
+}
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = 1;
+	_ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(i7);
+	r4 = r_g0;
+	r8 = heap32[(r3+3)];
+	r9 = heap32[(r3)];
+	r10 = heap32[(r3+1)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	heap32[(g0+4)] = 1;
+	_ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(i7);
+	r8 = r_g0;
+	r9 = heap32[(r3+3)];
+	r10 = heap32[(r3+1)];
+	r11 = heap32[(r3+2)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r9;
+	heap32[(g0+4)] = 1;
+	_ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(i7);
+	r9 = r_g0;
+	r10 = heap32[(r3+3)];
+	r11 = heap32[(r3+2)];
+	r12 = heap32[(r3)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = 1;
+	_ZN12gjkepa2_impl3EPA7newfaceEPNS_3GJK3sSVES3_S3_b(i7);
+	r10 = r_g0;
+	r11 = heap32[(r7+2449)];
+	if(r11 !=4) //_LBB549_57
+{
+__label__ = 56;
+}
+else{
+	r3 = heap32[(r7+2448)];
+	r11 = r3 >> 2;
+	f0 = heapFloat[(r11+4)];
+	f0 = f0*f0;
+	f1 = heapFloat[(r11+5)];
+_35: while(true){
+	f2 = f1;
+	r11 = r3;
+	f3 = f0;
+_37: while(true){
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+13)];
+	if(r3 !=0) //_LBB549_24
+{
+	r12 = r3 >> 2;
+	f1 = heapFloat[(r12+5)];
+if(!(f1 <f2)) //_LBB549_27
+{
+	f0 = heapFloat[(r12+4)];
+	f0 = f0*f0;
+if(!(f0 >=f3)) //_LBB549_27
+{
+continue _35;
+}
+}
+}
+else{
+break _35;
+}
+}
+}
+	r3 = r11 >> 2;
+	f0 = heapFloat[(r3)];
+	f1 = heapFloat[(r3+1)];
+	f2 = heapFloat[(r3+2)];
+	f3 = heapFloat[(r3+3)];
+	f4 = heapFloat[(r3+4)];
+	f5 = heapFloat[(r3+5)];
+	r12 = heap32[(r3+6)];
+	r13 = heap32[(r3+7)];
+	r3 = heap32[(r3+8)];
+	r14 = 0;
+	r15 = r4 >> 2;
+	heap8[r4+56] = r14;
+	heap32[(r15+9)] = r8;
+	r16 = r8 >> 2;
+	heap8[r8+56] = r14;
+	heap32[(r16+9)] = r4;
+	heap8[r4+57] = r14;
+	r17 = 1;
+	heap32[(r15+10)] = r9;
+	r18 = r9 >> 2;
+	heap8[r9+56] = r17;
+	heap32[(r18+9)] = r4;
+	heap8[r4+58] = r14;
+	r19 = 2;
+	heap32[(r15+11)] = r10;
+	r15 = r10 >> 2;
+	heap8[r10+56] = r19;
+	heap32[(r15+9)] = r4;
+	heap8[r8+57] = r19;
+	heap32[(r16+10)] = r10;
+	heap8[r10+58] = r17;
+	heap32[(r15+11)] = r8;
+	heap8[r8+58] = r17;
+	heap32[(r16+11)] = r9;
+	heap8[r9+57] = r19;
+	heap32[(r18+10)] = r8;
+	heap8[r9+58] = r17;
+	heap32[(r18+11)] = r10;
+	heap8[r10+57] = r19;
+	heap32[(r15+10)] = r9;
+	heap32[(fp+-2592)] = 0;
+_42: while(true){
+	r4 = (r14 + 1)|0;
+_44: while(true){
+	if(uint(r14) <uint(255)) //_LBB549_30
+{
+	r8 = heap32[(r7+2447)];
+	if(uint(r8) >uint(63)) //_LBB549_54
+{
+__label__ = 53;
+break _42;
+}
+else{
+	r9 = sp + -16;
+	r10 = r9 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r10+1)] = 0;
+	r15 = (r8 + 1)|0;
+	heap32[(r10+2)] = 0;
+	r8 = r8 << 5;
+	heap32[(r7+2447)] = r15;
+	r8 = (r6 + r8)|0;
+	heap8[r11+59] = r4;
+	r15 = (r8 + 60)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r15;
+	r8 = r8 >> 2;
+	_ZNK12gjkepa2_impl3GJK10getsupportERK9btVector3RNS0_3sSVE(i7);
+	r16 = r11 >> 2;
+	f6 = heapFloat[(r16)];
+	f7 = heapFloat[(r8+19)];
+	f8 = heapFloat[(r16+1)];
+	f9 = heapFloat[(r8+20)];
+	f6 = f6*f7;
+	f7 = f8*f9;
+	f8 = heapFloat[(r16+2)];
+	f9 = heapFloat[(r8+21)];
+	f6 = f6+f7;
+	f7 = f8*f9;
+	f6 = f6+f7;
+	f7 = heapFloat[(r16+4)];
+	f6 = f6-f7;
+	f7 =   9.9999997473787516e-005;
+	if(f6 <=f7) //_LBB549_53
+{
+__label__ = 52;
+break _42;
+}
+else{
+	r14 = (r14 + 1)|0;
+	r8 = (r11 + 1)|0;
+	r18 = 0;
+	r20 = r17;
+_49: while(true){
+	r21 = r18 << 2;
+	r21 = (r11 + r21)|0;
+	r22 = (r8 + r18)|0;
+	r21 = r21 >> 2;
+	r22 = heapU8[r22+55];
+	r21 = heap32[(r21+9)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = r15;
+	heap32[(g0+3)] = r21;
+	heap32[(g0+4)] = r22;
+	heap32[(g0+5)] = r9;
+	_ZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonE(i7);
+	r18 = (r18 + 1)|0;
+	r20 = r_g0 & r20;
+	if(uint(r18) >uint(2)) //_LBB549_35
+{
+break _49;
+}
+else{
+if(!(r20 !=0)) //_LBB549_33
+{
+break _49;
+}
+}
+}
+	if(r20 !=1) //_LBB549_52
+{
+__label__ = 51;
+break _42;
+}
+else{
+	r8 = heap32[(r10+2)];
+	if(uint(r8) <uint(3)) //_LBB549_52
+{
+__label__ = 51;
+break _42;
+}
+else{
+	r8 = heap32[(fp+-4)];
+	r9 = heap32[(r10+1)];
+	r10 = r8 >> 2;
+	heap8[r8+57] = r19;
+	r15 = 1;
+	heap32[(r10+10)] = r9;
+	r10 = r9 >> 2;
+	heap8[r9+58] = r15;
+	heap32[(r10+11)] = r8;
+	r8 = heap32[(r16+13)];
+if(!(r8 ==0)) //_LBB549_39
+{
+	r8 = r8 >> 2;
+	r9 = heap32[(r16+12)];
+	heap32[(r8+12)] = r9;
+}
+	r8 = heap32[(r16+12)];
+if(!(r8 ==0)) //_LBB549_41
+{
+	r8 = r8 >> 2;
+	r9 = heap32[(r16+13)];
+	heap32[(r8+13)] = r9;
+}
+	r8 = heap32[(r7+2448)];
+if(!(r8 !=r11)) //_LBB549_43
+{
+	r8 = heap32[(r16+13)];
+	heap32[(r7+2448)] = r8;
+}
+	r8 = heap32[(r7+2449)];
+	r8 = (r8 + -1)|0;
+	heap32[(r7+2449)] = r8;
+	heap32[(r16+12)] = 0;
+	r8 = heap32[(r7+2450)];
+	heap32[(r16+13)] = r8;
+	r8 = heap32[(r7+2450)];
+if(!(r8 ==0)) //_LBB549_45
+{
+	r8 = r8 >> 2;
+	heap32[(r8+12)] = r11;
+}
+	heap32[(r7+2450)] = r11;
+	r11 = heap32[(r7+2451)];
+	r11 = (r11 + 1)|0;
+	heap32[(r7+2451)] = r11;
+	r8 = heap32[(r7+2448)];
+	r11 = r8 >> 2;
+	f6 = heapFloat[(r11+4)];
+	f6 = f6*f6;
+	f7 = heapFloat[(r11+5)];
+_67: while(true){
+	f8 = f7;
+	r11 = r8;
+	f9 = f6;
+_69: while(true){
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+13)];
+	if(r8 !=0) //_LBB549_46
+{
+	r9 = r8 >> 2;
+	f7 = heapFloat[(r9+5)];
+if(!(f7 <f8)) //_LBB549_49
+{
+	f6 = heapFloat[(r9+4)];
+	f6 = f6*f6;
+if(!(f6 >=f9)) //_LBB549_49
+{
+continue _67;
+}
+}
+}
+else{
+break _67;
+}
+}
+}
+	r8 = r11 >> 2;
+	f6 = heapFloat[(r8+5)];
+	r4 = (r4 + 1)|0;
+if(!(f6 <f5)) //_LBB549_55
+{
+break _44;
+}
+}
+}
+}
+}
+}
+else{
+__label__ = 55;
+break _42;
+}
+}
+	f0 = heapFloat[(r8)];
+	f1 = heapFloat[(r8+1)];
+	f2 = heapFloat[(r8+2)];
+	f3 = heapFloat[(r8+3)];
+	f4 = heapFloat[(r8+4)];
+	r12 = heap32[(r8+6)];
+	r13 = heap32[(r8+7)];
+	r3 = heap32[(r8+8)];
+	f5 = f6;
+}
+switch(__label__ ){//multiple entries
+case 53:
+	heap32[(fp+-2592)] = 6;
+break;
+case 52:
+	heap32[(fp+-2592)] = 7;
+break;
+case 51:
+	heap32[(fp+-2592)] = 4;
+break;
+}
+	heapFloat[(r7+10)] = f0;
+	heapFloat[(r7+11)] = f1;
+	heapFloat[(r7+12)] = f2;
+	heapFloat[(r7+13)] = f3;
+	heapFloat[(r7+14)] = f4;
+	heap32[(r7+9)] = 3;
+	heap32[(r7+1)] = r12;
+	heap32[(r7+2)] = r13;
+	heap32[(r7+3)] = r3;
+	r3 = r3 >> 2;
+	r2 = r13 >> 2;
+	f2 = f2*f4;
+	f3 = heapFloat[(r3+6)];
+	f5 = heapFloat[(r2+6)];
+	f1 = f1*f4;
+	f6 = heapFloat[(r3+5)];
+	f7 = heapFloat[(r2+5)];
+	f0 = f0*f4;
+	f4 = heapFloat[(r3+4)];
+	f8 = heapFloat[(r2+4)];
+	f5 = f5-f2;
+	f6 = f6-f1;
+	f8 = f8-f0;
+	f3 = f3-f2;
+	f7 = f7-f1;
+	f4 = f4-f0;
+	f9 = f7*f3;
+	f10 = f5*f6;
+	f5 = f5*f4;
+	f3 = f8*f3;
+	f9 = f9-f10;
+	f3 = f5-f3;
+	f5 = f8*f6;
+	f4 = f7*f4;
+	f4 = f5-f4;
+	f5 = f9*f9;
+	f3 = f3*f3;
+	f3 = f5+f3;
+	f4 = f4*f4;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	heapFloat[(r7+5)] = f_g0;
+	r4 = r12 >> 2;
+	f3 = heapFloat[(r4+6)];
+	f4 = heapFloat[(r4+5)];
+	f5 = heapFloat[(r4+4)];
+	f6 = heapFloat[(r3+6)];
+	f7 = heapFloat[(r3+5)];
+	f8 = heapFloat[(r3+4)];
+	f6 = f6-f2;
+	f4 = f4-f1;
+	f8 = f8-f0;
+	f3 = f3-f2;
+	f7 = f7-f1;
+	f5 = f5-f0;
+	f9 = f7*f3;
+	f10 = f6*f4;
+	f6 = f6*f5;
+	f3 = f8*f3;
+	f9 = f9-f10;
+	f3 = f6-f3;
+	f4 = f8*f4;
+	f5 = f7*f5;
+	f4 = f4-f5;
+	f5 = f9*f9;
+	f3 = f3*f3;
+	f3 = f5+f3;
+	f4 = f4*f4;
+	f3 = f3+f4;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	heapFloat[(r7+6)] = f_g0;
+	f3 = heapFloat[(r2+6)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+4)];
+	f6 = heapFloat[(r4+6)];
+	f7 = heapFloat[(r4+5)];
+	f8 = heapFloat[(r4+4)];
+	f6 = f6-f2;
+	f4 = f4-f1;
+	f8 = f8-f0;
+	f2 = f3-f2;
+	f1 = f7-f1;
+	f0 = f5-f0;
+	f3 = f1*f2;
+	f5 = f6*f4;
+	f6 = f6*f0;
+	f2 = f8*f2;
+	f3 = f3-f5;
+	f2 = f6-f2;
+	f4 = f8*f4;
+	f0 = f1*f0;
+	f0 = f4-f0;
+	f1 = f3*f3;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 = heapFloat[(r7+5)];
+	f2 = heapFloat[(r7+6)];
+	f3 = f1+f2;
+	f3 = f3+f_g0;
+	f1 = f1/f3;
+	f2 = f2/f3;
+	heapFloat[(r7+5)] = f1;
+	f0 = f_g0/f3;
+	heapFloat[(r7+6)] = f2;
+	heapFloat[(r7+7)] = f0;
+__label__ = 60;
+}
+}
+}
+if (__label__ == 56){
+	heap32[(fp+-2592)] = 8;
+	heapFloat[(r7+10)] = f2;
+	heapFloat[(r7+11)] = f1;
+	heapFloat[(r7+12)] = f0;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	heap32[(r7+13)] = 0;
+	f1 = f2+f1;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f1 =                         0;
+	if(f0 >f1) //_LBB549_59
+{
+	f1 =                         1;
+	f2 = heapFloat[(r7+12)];
+	f0 = f1/f0;
+	f1 = heapFloat[(r7+11)];
+	f3 = heapFloat[(r7+10)];
+	f2 = f2*f0;
+	f1 = f1*f0;
+	f0 = f3*f0;
+}
+else{
+	f0 =                         1;
+	f2 = f1;
+}
+	heapFloat[(r7+10)] = f0;
+	heapFloat[(r7+11)] = f1;
+	heapFloat[(r7+12)] = f2;
+	heap32[(r7+13)] = 0;
+	heap32[(r7+14)] = 0;
+	heap32[(r7+9)] = 1;
+	r2 = heap32[(r3)];
+	heap32[(r7+1)] = r2;
+	heap32[(r7+5)] = 1065353216;
+}
+	r2 = heap32[(fp+-2592)];
+	if(r2 ==9) //_LBB549_70
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 3;
+	r1 = 0;
+	r_g0 = r1;
+	return;
+}
+else{
+	r2 = heap32[(r7+9)];
+_90: do {
+	if(r2 !=0) //_LBB549_64
+{
+	r2 = 0;
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+_92: while(true){
+	r3 = r2 << 2;
+	r3 = (r6 + r3)|0;
+	r4 = r5 >> 2;
+	r3 = r3 >> 2;
+	r8 = heap32[(r4+30)];
+	r2 = (r2 + 1)|0;
+	r9 = heap32[(r3+1)];
+	r10 = heap32[(fp+-44)];
+	r4 = heap32[(r4+31)];
+	r11 = r8 & 1;
+	if(r11 != 0) //_LBB549_67
+{
+	r11 = (r10 + r4)|0;
+	r11 = r11 >> 2;
+	r11 = heap32[(r11)];
+	r8 = (r8 + r11)|0;
+	r8 = (r8 + -1)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+}
+	r11 = sp + -32;
+	r4 = (r10 + r4)|0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r4 = r11 >> 2;
+	f3 = heapFloat[(fp+-8)];
+	f4 = heapFloat[(r3+5)];
+	f5 = heapFloat[(r4+1)];
+	f6 = heapFloat[(r4+2)];
+	f3 = f3*f4;
+	f5 = f5*f4;
+	f4 = f6*f4;
+	f2 = f2+f3;
+	f1 = f1+f5;
+	f0 = f0+f4;
+	r3 = heap32[(r7+9)];
+if(!(uint(r3) >uint(r2))) //_LBB549_65
+{
+break _90;
+}
+}
+}
+else{
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+}
+} while(0);
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	heap32[(r1)] = 1;
+	f3 = heapFloat[(r0)];
+	f4 = heapFloat[(r0+1)];
+	f5 = heapFloat[(r0+4)];
+	f6 = heapFloat[(r0+5)];
+	f3 = f3*f2;
+	f4 = f4*f1;
+	f7 = heapFloat[(r0+2)];
+	f8 = heapFloat[(r0+8)];
+	f9 = heapFloat[(r0+9)];
+	f10 = heapFloat[(r0+6)];
+	f5 = f5*f2;
+	f6 = f6*f1;
+	f3 = f3+f4;
+	f4 = f7*f0;
+	f7 = heapFloat[(r0+10)];
+	f8 = f8*f2;
+	f9 = f9*f1;
+	f5 = f5+f6;
+	f6 = f10*f0;
+	f3 = f3+f4;
+	f4 = heapFloat[(r0+12)];
+	f10 = heapFloat[(r0+14)];
+	f11 = heapFloat[(r0+13)];
+	f5 = f5+f6;
+	f6 = f8+f9;
+	f7 = f7*f0;
+	f3 = f3+f4;
+	f4 = f6+f7;
+	f5 = f5+f11;
+	heapFloat[(r1+1)] = f3;
+	f3 = f4+f10;
+	heapFloat[(r1+2)] = f5;
+	heapFloat[(r1+3)] = f3;
+	heap32[(r1+4)] = 0;
+	f3 = heapFloat[(r7+14)];
+	f4 = heapFloat[(r7+11)];
+	f5 = heapFloat[(r7+10)];
+	f6 = heapFloat[(r7+12)];
+	f7 = f5*f3;
+	f8 = f4*f3;
+	f9 = f6*f3;
+	f2 = f2-f7;
+	f7 = heapFloat[(r0)];
+	f1 = f1-f8;
+	f8 = heapFloat[(r0+1)];
+	f10 = heapFloat[(r0+4)];
+	f11 = heapFloat[(r0+5)];
+	f7 = f7*f2;
+	f8 = f8*f1;
+	f0 = f0-f9;
+	f9 = heapFloat[(r0+2)];
+	f12 = heapFloat[(r0+8)];
+	f13 = heapFloat[(r0+9)];
+	f14 = heapFloat[(r0+6)];
+	f10 = f10*f2;
+	f11 = f11*f1;
+	f7 = f7+f8;
+	f8 = f9*f0;
+	f9 = heapFloat[(r0+10)];
+	f2 = f12*f2;
+	f1 = f13*f1;
+	f10 = f10+f11;
+	f11 = f14*f0;
+	f7 = f7+f8;
+	f8 = heapFloat[(r0+12)];
+	f12 = heapFloat[(r0+14)];
+	f13 = heapFloat[(r0+13)];
+	f10 = f10+f11;
+	f1 = f2+f1;
+	f0 = f9*f0;
+	f2 = f7+f8;
+	f0 = f1+f0;
+	f1 = f10+f13;
+	heapFloat[(r1+5)] = f2;
+	f0 = f0+f12;
+	heapFloat[(r1+6)] = f1;
+	heapFloat[(r1+7)] = f0;
+	f0 = -f5;
+	heap32[(r1+8)] = 0;
+	f1 = -f4;
+	heapFloat[(r1+9)] = f0;
+	f0 = -f6;
+	heapFloat[(r1+10)] = f1;
+	heapFloat[(r1+11)] = f0;
+	f0 = -f3;
+	heap32[(r1+12)] = 0;
+	heapFloat[(r1+13)] = f0;
+	r1 = 1;
+	r_g0 = r1;
+	return;
+}
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btGjkEpaSolver28DistanceEPK13btConvexShapeRK11btTransformS2_S5_RK9btVector3RNS_8sResultsE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+var __label__ = 0;
+	i7 = sp + -592;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+5)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	r5 = sp + -176;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r1;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = 0;
+	r2 = sp + -560;
+	r3 = r2 >> 2;
+	_ZN12gjkepa2_implL10InitializeEPK13btConvexShapeRK11btTransformS2_S5_RN15btGjkEpaSolver28sResultsERNS_13MinkowskiDiffEb(i7);
+	heap32[(r3+32)] = 0;
+	heap32[(r3+33)] = 0;
+	heap32[(r3+34)] = 0;
+	heap32[(r3+35)] = 0;
+	heap32[(r3+91)] = 0;
+	heap32[(r3+94)] = 2;
+	heap32[(r3+92)] = 0;
+	heap32[(r3+36)] = 0;
+	r4 = heap32[(fp+4)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r4;
+	_ZN12gjkepa2_impl3GJK8EvaluateERKNS_13MinkowskiDiffERK9btVector3(i7);
+	r2 = r_g0;
+	if(r2 ==0) //_LBB550_3
+{
+	r2 = heap32[(r3+93)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+8)];
+_3: do {
+	if(r4 !=0) //_LBB550_5
+{
+	r4 = 0;
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+	f3 = f0;
+	f4 = f0;
+	f5 = f0;
+_5: while(true){
+	r6 = r4 << 2;
+	r2 = (r2 + r6)|0;
+	r2 = r2 >> 2;
+	r7 = r5 >> 2;
+	r8 = heap32[(r7+30)];
+	r4 = (r4 + 1)|0;
+	f6 = heapFloat[(r2+4)];
+	r2 = heap32[(r2)];
+	r9 = heap32[(fp+-44)];
+	r10 = heap32[(r7+31)];
+	r11 = r8 & 1;
+	if(r11 != 0) //_LBB550_8
+{
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r11 = heap32[(r11)];
+	r8 = (r8 + r11)|0;
+	r8 = (r8 + -1)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+}
+	r11 = sp + -48;
+	r9 = (r9 + r10)|0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r2 = heap32[(r3+93)];
+	r2 = (r2 + r6)|0;
+	r2 = r2 >> 2;
+	r6 = r11 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	f7 = heapFloat[(fp+-12)];
+	f8 = heapFloat[(r6+1)];
+	f9 = heapFloat[(r6+2)];
+	f10 = heapFloat[(r2+2)];
+	f11 = heapFloat[(r2+1)];
+	f12 = heapFloat[(r2)];
+	f7 = f7*f6;
+	f8 = f8*f6;
+	f9 = f9*f6;
+	r2 = heap32[(r7+30)];
+	f5 = f5+f7;
+	f4 = f4+f8;
+	f3 = f3+f9;
+	f7 = -f10;
+	f8 = -f11;
+	f9 = -f12;
+	r6 = heap32[(r7+1)];
+	r8 = heap32[(r7+31)];
+	r9 = r2 & 1;
+	if(r9 != 0) //_LBB550_11
+{
+	r9 = (r6 + r8)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r2 = (r2 + r9)|0;
+	r2 = (r2 + -1)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+}
+	f10 = heapFloat[(r7+2)];
+	f11 = heapFloat[(r7+3)];
+	f12 = heapFloat[(r7+6)];
+	f13 = heapFloat[(r7+7)];
+	f10 = f10*f9;
+	f11 = f11*f8;
+	f14 = heapFloat[(r7+4)];
+	f15 = heapFloat[(r7+10)];
+	f16 = heapFloat[(r7+11)];
+	f17 = heapFloat[(r7+12)];
+	f18 = heapFloat[(r7+8)];
+	f12 = f12*f9;
+	f13 = f13*f8;
+	f10 = f10+f11;
+	f11 = f14*f7;
+	r9 = sp + -16;
+	f9 = f15*f9;
+	f8 = f16*f8;
+	f12 = f12+f13;
+	f13 = f18*f7;
+	f10 = f10+f11;
+	r10 = r9 >> 2;
+	f8 = f9+f8;
+	f7 = f17*f7;
+	f9 = f12+f13;
+	heapFloat[(fp+-4)] = f10;
+	f7 = f8+f7;
+	heapFloat[(r10+1)] = f9;
+	heapFloat[(r10+2)] = f7;
+	heap32[(r10+3)] = 0;
+	r10 = sp + -32;
+	r6 = (r6 + r8)|0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r9;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r10 >> 2;
+	f7 = heapFloat[(r7+14)];
+	f8 = heapFloat[(fp+-8)];
+	f9 = heapFloat[(r7+18)];
+	f10 = heapFloat[(r7+22)];
+	f11 = heapFloat[(r7+15)];
+	f12 = heapFloat[(r2+1)];
+	f13 = heapFloat[(r7+19)];
+	f14 = heapFloat[(r7+23)];
+	f7 = f7*f8;
+	f11 = f11*f12;
+	f15 = heapFloat[(r7+16)];
+	f16 = heapFloat[(r2+2)];
+	f17 = heapFloat[(r7+20)];
+	f18 = heapFloat[(r7+24)];
+	f9 = f9*f8;
+	f13 = f13*f12;
+	f8 = f10*f8;
+	f10 = f14*f12;
+	f7 = f7+f11;
+	f11 = f15*f16;
+	f9 = f9+f13;
+	f12 = f17*f16;
+	f8 = f8+f10;
+	f10 = f18*f16;
+	f7 = f7+f11;
+	f11 = heapFloat[(r7+26)];
+	f9 = f9+f12;
+	f12 = heapFloat[(r7+27)];
+	f8 = f8+f10;
+	f10 = heapFloat[(r7+28)];
+	f7 = f7+f11;
+	f9 = f9+f12;
+	f8 = f8+f10;
+	f7 = f7*f6;
+	f9 = f9*f6;
+	f6 = f8*f6;
+	r2 = heap32[(r3+93)];
+	f2 = f2+f7;
+	f1 = f1+f9;
+	f0 = f0+f6;
+	r6 = r2 >> 2;
+	r6 = heap32[(r6+8)];
+if(!(uint(r6) >uint(r4))) //_LBB550_6
+{
+break _3;
+}
+}
+}
+else{
+	f0 =                         0;
+	f1 = f0;
+	f2 = f0;
+	f3 = f0;
+	f4 = f0;
+	f5 = f0;
+}
+} while(0);
+	r0 = r0 >> 2;
+	f6 = heapFloat[(r0)];
+	f7 = heapFloat[(r0+1)];
+	f8 = heapFloat[(r0+4)];
+	f9 = heapFloat[(r0+5)];
+	f6 = f6*f5;
+	f7 = f7*f4;
+	f10 = heapFloat[(r0+2)];
+	f11 = heapFloat[(r0+8)];
+	f12 = heapFloat[(r0+9)];
+	f13 = heapFloat[(r0+6)];
+	f8 = f8*f5;
+	f9 = f9*f4;
+	f6 = f6+f7;
+	f7 = f10*f3;
+	f10 = heapFloat[(r0+10)];
+	f11 = f11*f5;
+	f12 = f12*f4;
+	f8 = f8+f9;
+	f9 = f13*f3;
+	f6 = f6+f7;
+	f7 = heapFloat[(r0+12)];
+	f13 = heapFloat[(r0+14)];
+	f14 = heapFloat[(r0+13)];
+	f8 = f8+f9;
+	r1 = r1 >> 2;
+	f9 = f11+f12;
+	f10 = f10*f3;
+	f6 = f6+f7;
+	f7 = f9+f10;
+	f8 = f8+f14;
+	heapFloat[(r1+1)] = f6;
+	f6 = f7+f13;
+	heapFloat[(r1+2)] = f8;
+	heapFloat[(r1+3)] = f6;
+	heap32[(r1+4)] = 0;
+	f6 = heapFloat[(r0)];
+	f7 = heapFloat[(r0+1)];
+	f8 = heapFloat[(r0+4)];
+	f9 = heapFloat[(r0+5)];
+	f10 = heapFloat[(r0+2)];
+	f6 = f6*f2;
+	f7 = f7*f1;
+	f11 = heapFloat[(r0+8)];
+	f12 = heapFloat[(r0+9)];
+	f13 = heapFloat[(r0+6)];
+	f8 = f8*f2;
+	f9 = f9*f1;
+	f6 = f6+f7;
+	f7 = f10*f0;
+	f10 = heapFloat[(r0+10)];
+	f11 = f11*f2;
+	f12 = f12*f1;
+	f8 = f8+f9;
+	f9 = f13*f0;
+	f6 = f6+f7;
+	f7 = heapFloat[(r0+12)];
+	f13 = heapFloat[(r0+14)];
+	f14 = heapFloat[(r0+13)];
+	f8 = f8+f9;
+	f9 = f11+f12;
+	f10 = f10*f0;
+	f6 = f6+f7;
+	f7 = f9+f10;
+	f8 = f8+f14;
+	heapFloat[(r1+5)] = f6;
+	f6 = f7+f13;
+	heapFloat[(r1+6)] = f8;
+	heapFloat[(r1+7)] = f6;
+	f2 = f5-f2;
+	heap32[(r1+8)] = 0;
+	f1 = f4-f1;
+	heapFloat[(r1+9)] = f2;
+	f0 = f3-f0;
+	heapFloat[(r1+10)] = f1;
+	heapFloat[(r1+11)] = f0;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	heap32[(r1+12)] = 0;
+	f1 = f2+f1;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f2 =   9.9999997473787516e-005;
+	f2 = f_g0 > f2 ? f_g0 : f1;
+	heapFloat[(r1+13)] = f_g0;
+	f0 = f1/f2;
+	f1 = heapFloat[(r1+9)];
+	f1 = f1*f0;
+	heapFloat[(r1+9)] = f1;
+	f1 = heapFloat[(r1+10)];
+	f1 = f1*f0;
+	heapFloat[(r1+10)] = f1;
+	f1 = heapFloat[(r1+11)];
+	f0 = f1*f0;
+	heapFloat[(r1+11)] = f0;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	if(r2 !=1) //_LBB550_14
+{
+	r0 = 2;
+}
+else{
+	r0 = 1;
+}
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN30btGjkEpaPenetrationDepthSolver12calcPenDepthER22btVoronoiSimplexSolverPK13btConvexShapeS4_RK11btTransformS7_R9btVector3S9_S9_P12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -104;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r1 = heap32[(fp+5)];
+	r2 = r0 >> 2;
+	r3 = r1 >> 2;
+	f0 = heapFloat[(r2+14)];
+	f1 = heapFloat[(r3+14)];
+	f2 = heapFloat[(r2+13)];
+	f3 = heapFloat[(r3+13)];
+	f4 = heapFloat[(r2+12)];
+	f5 = heapFloat[(r3+12)];
+	r2 = sp + -16;
+	f4 = f4-f5;
+	r3 = r2 >> 2;
+	f2 = f2-f3;
+	heapFloat[(fp+-4)] = f4;
+	f0 = f0-f1;
+	heapFloat[(r3+1)] = f2;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	r5 = sp + -72;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = 1;
+	r6 = heap32[(fp+6)];
+	r7 = heap32[(fp+7)];
+	r8 = heap32[(fp+8)];
+	_ZN15btGjkEpaSolver211PenetrationEPK13btConvexShapeRK11btTransformS2_S5_RK9btVector3RNS_8sResultsEb(i7);
+	r9 = r_g0;
+	if(r9 ==0) //_LBB551_2
+{
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r5;
+	_ZN15btGjkEpaSolver28DistanceEPK13btConvexShapeRK11btTransformS2_S5_RK9btVector3RNS_8sResultsE(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB551_4
+{
+	r0 = r5 >> 2;
+	r1 = r7 >> 2;
+	heap32[(r1)] = heap32[(r0+1)];
+	heap32[(r1+1)] = heap32[(r0+2)];
+	heap32[(r1+2)] = heap32[(r0+3)];
+	r2 = r8 >> 2;
+	heap32[(r1+3)] = heap32[(r0+4)];
+	heap32[(r2)] = heap32[(r0+5)];
+	heap32[(r2+1)] = heap32[(r0+6)];
+	heap32[(r2+2)] = heap32[(r0+7)];
+	r1 = r6 >> 2;
+	heap32[(r2+3)] = heap32[(r0+8)];
+	heap32[(r1)] = heap32[(r0+9)];
+	heap32[(r1+1)] = heap32[(r0+10)];
+	heap32[(r1+2)] = heap32[(r0+11)];
+	heap32[(r1+3)] = heap32[(r0+12)];
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = r5 >> 2;
+	r1 = r7 >> 2;
+	heap32[(r1)] = heap32[(r0+1)];
+	heap32[(r1+1)] = heap32[(r0+2)];
+	heap32[(r1+2)] = heap32[(r0+3)];
+	r2 = r8 >> 2;
+	heap32[(r1+3)] = heap32[(r0+4)];
+	heap32[(r2)] = heap32[(r0+5)];
+	heap32[(r2+1)] = heap32[(r0+6)];
+	heap32[(r2+2)] = heap32[(r0+7)];
+	r1 = r6 >> 2;
+	heap32[(r2+3)] = heap32[(r0+8)];
+	heap32[(r1)] = heap32[(r0+9)];
+	heap32[(r1+1)] = heap32[(r0+10)];
+	heap32[(r1+2)] = heap32[(r0+11)];
+	heap32[(r1+3)] = heap32[(r0+12)];
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN30btGjkEpaPenetrationDepthSolverD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV30btGjkEpaPenetrationDepthSolver;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN30btGjkEpaPenetrationDepthSolverD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV30btGjkEpaPenetrationDepthSolver;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN17btGjkPairDetectorD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btGjkPairDetector;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN17btGjkPairDetectorD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btGjkPairDetector;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -304;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = sp + -32;
+	heap32[(r1+14)] = 0;
+	r3 = r2 >> 2;
+	heap32[(fp+-8)] = 0;
+	heap32[(r3+1)] = 0;
+	r4 = heap32[(fp+1)];
+	heap32[(r3+2)] = 0;
+	r5 = sp + -96;
+	r4 = r4 >> 2;
+	heap32[(r3+3)] = 0;
+	r6 = r5 >> 2;
+	heap32[(fp+-24)] = heap32[(r4)];
+	heap32[(r6+1)] = heap32[(r4+1)];
+	heap32[(r6+2)] = heap32[(r4+2)];
+	heap32[(r6+3)] = heap32[(r4+3)];
+	heap32[(r6+4)] = heap32[(r4+4)];
+	heap32[(r6+5)] = heap32[(r4+5)];
+	heap32[(r6+6)] = heap32[(r4+6)];
+	heap32[(r6+7)] = heap32[(r4+7)];
+	heap32[(r6+8)] = heap32[(r4+8)];
+	heap32[(r6+9)] = heap32[(r4+9)];
+	heap32[(r6+10)] = heap32[(r4+10)];
+	heap32[(r6+11)] = heap32[(r4+11)];
+	f0 = heapFloat[(r4+12)];
+	f1 = heapFloat[(r4+13)];
+	f2 = heapFloat[(r4+14)];
+	r7 = sp + -160;
+	heap32[(r6+15)] = heap32[(r4+15)];
+	r8 = r7 >> 2;
+	heap32[(fp+-40)] = heap32[(r4+16)];
+	heap32[(r8+1)] = heap32[(r4+17)];
+	heap32[(r8+2)] = heap32[(r4+18)];
+	heap32[(r8+3)] = heap32[(r4+19)];
+	heap32[(r8+4)] = heap32[(r4+20)];
+	heap32[(r8+5)] = heap32[(r4+21)];
+	heap32[(r8+6)] = heap32[(r4+22)];
+	heap32[(r8+7)] = heap32[(r4+23)];
+	heap32[(r8+8)] = heap32[(r4+24)];
+	heap32[(r8+9)] = heap32[(r4+25)];
+	heap32[(r8+10)] = heap32[(r4+26)];
+	heap32[(r8+11)] = heap32[(r4+27)];
+	f3 = heapFloat[(r4+28)];
+	f4 = heapFloat[(r4+29)];
+	f5 = heapFloat[(r4+30)];
+	f6 = f0+f3;
+	f7 =                       0.5;
+	f6 = f6*f7;
+	f8 = f1+f4;
+	f8 = f8*f7;
+	f9 = f2+f5;
+	f0 = f0-f6;
+	heap32[(r8+15)] = heap32[(r4+31)];
+	f7 = f9*f7;
+	f1 = f1-f8;
+	heapFloat[(r6+12)] = f0;
+	f0 = f2-f7;
+	heapFloat[(r6+13)] = f1;
+	f1 = f3-f6;
+	heapFloat[(r6+14)] = f0;
+	f0 = f4-f8;
+	heapFloat[(r8+12)] = f1;
+	f1 = f5-f7;
+	heapFloat[(r8+13)] = f0;
+	heapFloat[(r8+14)] = f1;
+	r9 = heap32[(r1+7)];
+	r9 = r9 >> 2;
+	r10 = heap32[(fp+2)];
+	r11 = heap32[(fp+3)];
+	r9 = heap32[(r9+1)];
+	r9 = (r9 + -17)|0;
+	if(uint(r9) >uint(1)) //_LBB556_3
+{
+__label__ = 3;
+}
+else{
+	r9 = heap32[(r1+8)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+1)];
+	r9 = (r9 + -17)|0;
+	if(uint(r9) >uint(1)) //_LBB556_3
+{
+__label__ = 3;
+}
+else{
+	r9 = (r0 + 32)|0;
+	r12 = 0;
+__label__ = 4;
+}
+}
+if (__label__ == 3){
+	r9 = (r0 + 32)|0;
+	r12 = 1;
+}
+	r13 = gNumGjkChecks;
+	r13 = r13 >> 2;
+	r14 = heap32[(r13)];
+	f0 = heapFloat[(r1+11)];
+	f1 = heapFloat[(r1+12)];
+	r14 = (r14 + 1)|0;
+	heap32[(r13)] = r14;
+	r13 = heapU8[r0+52];
+	heap32[(r1+16)] = 0;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 1065353216;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+17)] = 0;
+	heap32[(r1+15)] = -1;
+	r14 = heap32[(r1+6)];
+	r15 = 0;
+	r16 = r14 >> 2;
+	heap8[r14+312] = r15;
+	r17 = 1;
+	heap32[(r16)] = 0;
+	heap8[r14+356] = r17;
+	heap32[(r16+73)] = 1566444395;
+	heap32[(r16+74)] = 1566444395;
+	heap32[(r16+75)] = 1566444395;
+	heap32[(r16+76)] = 0;
+	heap8[r14+352] = r15;
+	heap32[(r16+84)] = 0;
+	heap32[(r16+85)] = 0;
+	heap32[(r16+86)] = 0;
+	heap32[(r16+87)] = 0;
+	r16 = heapU8[r14+332];
+	f2 =                         0;
+	r16 = r16 & 240;
+	heap8[r14+332] = r16;
+	f1 = r13 == r15 ? f1 : f2;
+	f0 = r13 == r15 ? f0 : f2;
+	f0 = f0+f1;
+	f3 = heapFloat[(r1+3)];
+	f4 = heapFloat[(r1+2)];
+	f5 = heapFloat[(r1+1)];
+	f9 =        999999984306749440;
+_7: while(true){
+	f10 = -f5;
+	f11 = heapFloat[(r4)];
+	f12 = heapFloat[(r4+4)];
+	f13 = heapFloat[(r4+1)];
+	f14 = heapFloat[(r4+5)];
+	f11 = f11*f10;
+	f12 = f12*f4;
+	f15 = heapFloat[(r4+8)];
+	f16 = heapFloat[(r4+2)];
+	f17 = heapFloat[(r4+6)];
+	f18 = heapFloat[(r4+10)];
+	f19 = heapFloat[(r4+9)];
+	f13 = f13*f10;
+	f14 = f14*f4;
+	f11 = f11-f12;
+	f12 = f15*f3;
+	r13 = sp + -176;
+	f10 = f16*f10;
+	f15 = f17*f4;
+	f13 = f13-f14;
+	f14 = f19*f3;
+	f11 = f11-f12;
+	r14 = r13 >> 2;
+	f10 = f10-f15;
+	f12 = f18*f3;
+	f13 = f13-f14;
+	heapFloat[(fp+-44)] = f11;
+	f10 = f10-f12;
+	heapFloat[(r14+1)] = f13;
+	heapFloat[(r14+2)] = f10;
+	heap32[(r14+3)] = 0;
+	f10 = heapFloat[(r4+16)];
+	f11 = heapFloat[(r4+20)];
+	f12 = heapFloat[(r4+17)];
+	f13 = heapFloat[(r4+21)];
+	f14 = heapFloat[(r4+24)];
+	f10 = f10*f5;
+	f11 = f11*f4;
+	f15 = heapFloat[(r4+18)];
+	f16 = heapFloat[(r4+22)];
+	f17 = heapFloat[(r4+26)];
+	f18 = heapFloat[(r4+25)];
+	f12 = f12*f5;
+	f13 = f13*f4;
+	f10 = f10+f11;
+	f11 = f14*f3;
+	r14 = sp + -192;
+	f5 = f15*f5;
+	f4 = f16*f4;
+	f12 = f12+f13;
+	f13 = f18*f3;
+	f10 = f10+f11;
+	r16 = r14 >> 2;
+	f4 = f5+f4;
+	f3 = f17*f3;
+	f5 = f12+f13;
+	heapFloat[(fp+-48)] = f10;
+	f3 = f4+f3;
+	heapFloat[(r16+1)] = f5;
+	heapFloat[(r16+2)] = f3;
+	heap32[(r16+3)] = 0;
+	r16 = heap32[(r1+7)];
+	r18 = sp + -208;
+	heap32[(g0)] = r18;
+	heap32[(g0+1)] = r16;
+	heap32[(g0+2)] = r13;
+	r13 = r9 >> 2;
+	_ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3(i7);
+	r16 = heap32[(r13)];
+	r19 = sp + -224;
+	heap32[(g0)] = r19;
+	heap32[(g0+1)] = r16;
+	heap32[(g0+2)] = r14;
+	_ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3(i7);
+	r14 = r18 >> 2;
+	r16 = r19 >> 2;
+	f3 = heapFloat[(r6+8)];
+	f4 = heapFloat[(fp+-52)];
+	f5 = heapFloat[(r6+4)];
+	f10 = heapFloat[(fp+-24)];
+	f11 = heapFloat[(r6+9)];
+	f12 = heapFloat[(r14+1)];
+	f13 = heapFloat[(r6+5)];
+	f14 = heapFloat[(r6+1)];
+	f15 = heapFloat[(r8+8)];
+	f16 = heapFloat[(fp+-56)];
+	f17 = heapFloat[(r8+4)];
+	f18 = heapFloat[(fp+-40)];
+	f19 = heapFloat[(r8+9)];
+	f20 = heapFloat[(r16+1)];
+	f21 = heapFloat[(r8+5)];
+	f22 = heapFloat[(r8+1)];
+	f3 = f3*f4;
+	f11 = f11*f12;
+	f23 = heapFloat[(r6+10)];
+	f24 = heapFloat[(r14+2)];
+	f25 = heapFloat[(r6+6)];
+	f26 = heapFloat[(r6+2)];
+	f15 = f15*f16;
+	f19 = f19*f20;
+	f27 = heapFloat[(r8+10)];
+	f28 = heapFloat[(r16+2)];
+	f29 = heapFloat[(r8+6)];
+	f30 = heapFloat[(r8+2)];
+	f5 = f5*f4;
+	f13 = f13*f12;
+	f17 = f17*f16;
+	f21 = f21*f20;
+	f4 = f10*f4;
+	f10 = f14*f12;
+	f12 = f18*f16;
+	f14 = f22*f20;
+	f3 = f3+f11;
+	f11 = f23*f24;
+	f15 = f15+f19;
+	f16 = f27*f28;
+	f5 = f5+f13;
+	f13 = f25*f24;
+	f17 = f17+f21;
+	f18 = f29*f28;
+	f4 = f4+f10;
+	f10 = f26*f24;
+	f12 = f12+f14;
+	f14 = f30*f28;
+	f3 = f3+f11;
+	f11 = heapFloat[(r6+14)];
+	f15 = f15+f16;
+	f16 = heapFloat[(r8+14)];
+	f5 = f5+f13;
+	f13 = heapFloat[(r6+13)];
+	f17 = f17+f18;
+	f18 = heapFloat[(r8+13)];
+	f4 = f4+f10;
+	f10 = heapFloat[(r6+12)];
+	f12 = f12+f14;
+	f14 = heapFloat[(r8+12)];
+	f5 = f5+f13;
+	f13 = f17+f18;
+	f4 = f4+f10;
+	f10 = f12+f14;
+	f3 = f3+f11;
+	f11 = f15+f16;
+	f3 = r12 != r15 ? f3 : f2;
+	f11 = r12 != r15 ? f11 : f2;
+	f12 = f5-f13;
+	f14 = heapFloat[(r1+2)];
+	f15 = f4-f10;
+	f16 = heapFloat[(r1+1)];
+	f17 = f3-f11;
+	f18 = heapFloat[(r1+3)];
+	f16 = f16*f15;
+	f14 = f14*f12;
+	f14 = f16+f14;
+	f16 = f18*f17;
+	f14 = f14+f16;
+if(!(f14 <=f2)) //_LBB556_8
+{
+	f16 = heapFloat[(r4+32)];
+	f18 = f14*f14;
+	f16 = f16*f9;
+if(!(f18 <=f16)) //_LBB556_8
+{
+__label__ = 7;
+break _7;
+}
+}
+	r14 = heap32[(r1+6)];
+	r16 = r14 >> 2;
+	r18 = heap32[(r16)];
+_12: do {
+	if(r18 >0) //_LBB556_10
+{
+	r19 = -12;
+	f16 = heapFloat[(r16+77)];
+	r20 = (r19 - r14)|0;
+	r21 = 0;
+	r22 = r18;
+	r19 = r21;
+_14: while(true){
+	r23 = -8;
+	r24 = -4;
+	r23 = (r23 - r20)|0;
+	r24 = (r24 - r20)|0;
+	r23 = r23 >> 2;
+	r24 = r24 >> 2;
+	r25 = (r21 - r20)|0;
+	r25 = r25 >> 2;
+	f18 = heapFloat[(r23)];
+	f19 = heapFloat[(r24)];
+	f18 = f15-f18;
+	f19 = f12-f19;
+	f20 = heapFloat[(r25)];
+	f20 = f17-f20;
+	f18 = f18*f18;
+	f19 = f19*f19;
+	f18 = f18+f19;
+	f19 = f20*f20;
+	f18 = f18+f19;
+	r22 = (r22 + -1)|0;
+	r19 = f18 > f16 ? r19 : r17;
+	r20 = (r20 + -16)|0;
+	if(r22 !=0) //_LBB556_11
+{
+continue _14;
+}
+else{
+break _12;
+}
+}
+}
+else{
+	r19 = r15;
+}
+} while(0);
+	f16 = heapFloat[(r16+76)];
+	if(f16 ==f2) //_LBB556_14
+{
+	f16 = heapFloat[(r16+75)];
+if(!(f17 !=f16)) //_LBB556_13
+{
+	f16 = heapFloat[(r16+74)];
+if(!(f12 !=f16)) //_LBB556_13
+{
+	f16 = heapFloat[(r16+73)];
+	r19 = f15 != f16 ? r19 : r17;
+}
+}
+}
+	r19 = r19 & 255;
+	if(r19 ==0) //_LBB556_19
+{
+	f14 = f9-f14;
+	f16 =   9.9999999747524271e-007;
+	f18 = f9*f16;
+	if(f14 >f18) //_LBB556_21
+{
+	heapFloat[(r16+73)] = f15;
+	heapFloat[(r16+74)] = f12;
+	r18 = r18 << 4;
+	heapFloat[(r16+75)] = f17;
+	r18 = (r14 + r18)|0;
+	heap32[(r16+76)] = 0;
+	r18 = r18 >> 2;
+	heap8[r14+356] = r17;
+	heapFloat[(r18+1)] = f15;
+	heapFloat[(r18+2)] = f12;
+	heapFloat[(r18+3)] = f17;
+	heap32[(r18+4)] = 0;
+	r18 = heap32[(r16)];
+	r18 = r18 << 4;
+	r18 = (r14 + r18)|0;
+	r18 = r18 >> 2;
+	heapFloat[(r18+21)] = f4;
+	heapFloat[(r18+22)] = f5;
+	heapFloat[(r18+23)] = f3;
+	heap32[(r18+24)] = 0;
+	r18 = heap32[(r16)];
+	r18 = r18 << 4;
+	r14 = (r14 + r18)|0;
+	r14 = r14 >> 2;
+	heapFloat[(r14+41)] = f10;
+	heapFloat[(r14+42)] = f13;
+	heapFloat[(r14+43)] = f11;
+	heap32[(r14+44)] = 0;
+	r14 = heap32[(r16)];
+	r14 = (r14 + 1)|0;
+	heap32[(r16)] = r14;
+	r14 = heap32[(r1+6)];
+	heap32[(g0)] = r14;
+	_ZN22btVoronoiSimplexSolver28updateClosestVectorAndPointsEv(i7);
+	r16 = r_g0;
+	if(r16 !=0) //_LBB556_23
+{
+	r14 = r14 >> 2;
+	f5 = heapFloat[(r14+69)];
+	f4 = heapFloat[(r14+70)];
+	f3 = heapFloat[(r14+71)];
+	f10 = heapFloat[(r14+72)];
+	heapFloat[(r1+1)] = f5;
+	f11 = f5*f5;
+	f12 = f4*f4;
+	heapFloat[(r1+2)] = f4;
+	f11 = f11+f12;
+	f12 = f3*f3;
+	f11 = f11+f12;
+	heapFloat[(r1+3)] = f3;
+	heapFloat[(r1+4)] = f10;
+	if(f11 >=f16) //_LBB556_25
+{
+	f10 =   1.1920928955078125e-007;
+	f12 = f9-f11;
+	f9 = f9*f10;
+	if(f12 >f9) //_LBB556_27
+{
+	r14 = heap32[(r1+16)];
+	r16 = (r14 + 1)|0;
+	heap32[(r1+16)] = r16;
+	if(r14 <1001) //_LBB556_29
+{
+	r14 = heap32[(r1+6)];
+	r14 = r14 >> 2;
+	r16 = heap32[(r14)];
+	f9 = f11;
+	if(r16 !=4) //_LBB556_5
+{
+continue _7;
+}
+else{
+__label__ = 29;
+break _7;
+}
+}
+else{
+__label__ = 27;
+break _7;
+}
+}
+else{
+__label__ = 25;
+break _7;
+}
+}
+else{
+__label__ = 23;
+break _7;
+}
+}
+else{
+__label__ = 21;
+break _7;
+}
+}
+else{
+__label__ = 19;
+break _7;
+}
+}
+else{
+__label__ = 17;
+break _7;
+}
+}
+_29: do {
+switch(__label__ ){//multiple entries
+case 7:
+	heap32[(r1+17)] = 10;
+__label__ = 30;
+break _29;
+break;
+case 29:
+	heap32[(r1+1)] = heap32[(r14+69)];
+	heap32[(r1+2)] = heap32[(r14+70)];
+	heap32[(r1+3)] = heap32[(r14+71)];
+	r17 = 0;
+	heap32[(r1+4)] = heap32[(r14+72)];
+	heap32[(r1+17)] = 13;
+__label__ = 37;
+break _29;
+break;
+case 27:
+	r6 = _2E_str425;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r16;
+	printf(i7);
+	r6 = heap32[(r13)];
+	r8 = heap32[(r1+7)];
+	r6 = r6 >> 2;
+	r8 = r8 >> 2;
+	f2 = heapFloat[(r1+3)];
+	f3 = heapFloat[(r1+2)];
+	f4 = heapFloat[(r1+1)];
+	r6 = heap32[(r6+1)];
+	r8 = heap32[(r8+1)];
+	r9 = _2E_str1426;
+	f4 = f4; //fstod f4, f4
+	f3 = f3; //fstod f3, f3
+	f2 = f2; //fstod f2, f2
+	f5 = f11; //fstod f11, f5
+	heap32[(g0)] = r9;
+	llvm_writeDouble((i7+8),f4);
+	llvm_writeDouble((i7+16),f3);
+	llvm_writeDouble((i7+24),f2);
+	llvm_writeDouble((i7+32),f5);
+	heap32[(g0+10)] = r8;
+	heap32[(g0+11)] = r6;
+	f2 =                         0;
+	r17 = 0;
+	printf(i7);
+__label__ = 37;
+break _29;
+break;
+case 25:
+	r6 = heap32[(r1+6)];
+	r6 = r6 >> 2;
+	heap32[(r1+1)] = heap32[(r6+69)];
+	heap32[(r1+2)] = heap32[(r6+70)];
+	heap32[(r1+3)] = heap32[(r6+71)];
+	heap32[(r1+4)] = heap32[(r6+72)];
+	heap32[(r1+17)] = 12;
+	f9 = f11;
+__label__ = 30;
+break _29;
+break;
+case 23:
+	heap32[(r1+17)] = 6;
+__label__ = 30;
+break _29;
+break;
+case 21:
+	heap32[(r1+17)] = 3;
+__label__ = 30;
+break _29;
+break;
+case 19:
+	r6 = 11;
+	r8 = 2;
+	r6 = f14 > f2 ? r6 : r8;
+	heap32[(r1+17)] = r6;
+__label__ = 30;
+break _29;
+break;
+case 17:
+	heap32[(r1+17)] = 1;
+__label__ = 30;
+break;
+}
+} while(0);
+if (__label__ == 30){
+	r6 = heap32[(r1+6)];
+	heap32[(g0)] = r6;
+	r6 = r6 >> 2;
+	_ZN22btVoronoiSimplexSolver28updateClosestVectorAndPointsEv(i7);
+	f3 = heapFloat[(r6+65)];
+	f2 = heapFloat[(r6+61)];
+	f4 = heapFloat[(r6+66)];
+	f5 = heapFloat[(r6+62)];
+	f10 = heapFloat[(r6+67)];
+	f11 = heapFloat[(r6+63)];
+	f2 = f2-f3;
+	f5 = f5-f4;
+	heapFloat[(fp+-8)] = f2;
+	f2 = f11-f10;
+	heapFloat[(r3+1)] = f5;
+	heapFloat[(r3+2)] = f2;
+	heap32[(r3+3)] = 0;
+	f2 = heapFloat[(r1+1)];
+	f5 = heapFloat[(r1+2)];
+	f11 = heapFloat[(r1+3)];
+	f2 = f2*f2;
+	f5 = f5*f5;
+	f2 = f2+f5;
+	f5 = f11*f11;
+	f2 = f2+f5;
+	f5 = f2; //fstod f2, f5
+	f11 =                    0.0001;
+if(!(f5 >=f11)) //_LBB556_33
+{
+	heap32[(r1+17)] = 5;
+}
+	f5 =   1.4210854715202004e-014;
+	if(f2 <=f5) //_LBB556_37
+{
+	f2 =                         0;
+	r17 = 0;
+	heap32[(r1+15)] = 2;
+}
+else{
+	heapFloat[(g0)] = f2;
+	sqrtf(i7);
+	f5 =                         1;
+	f2 = f5/f_g0;
+	f11 = heapFloat[(fp+-8)];
+	f11 = f11*f2;
+	heapFloat[(fp+-8)] = f11;
+	f11 = heapFloat[(r3+1)];
+	f11 = f11*f2;
+	heapFloat[(r3+1)] = f11;
+	f11 = heapFloat[(r3+2)];
+	f11 = f11*f2;
+	heapFloat[(r3+2)] = f11;
+	heapFloat[(g0)] = f9;
+	sqrtf(i7);
+	f9 = f_g0;
+	f11 =                         0;
+	if(f9 >f11) //_LBB556_36
+{
+	f9 = f1/f9;
+	f11 = heapFloat[(r1+3)];
+	f12 = heapFloat[(r1+2)];
+	f13 = heapFloat[(r1+1)];
+	f13 = f13*f9;
+	f12 = f12*f9;
+	f9 = f11*f9;
+	f2 = f5/f2;
+	f3 = f3+f13;
+	f4 = f4+f12;
+	f10 = f10+f9;
+	f2 = f2-f0;
+	heap32[(r1+15)] = 1;
+}
+else{
+	r0 = _2E_str2427;
+	r1 = _2E_str3428;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 320;
+	_assert(i7);
+}
+}
+}
+	r6 = heap32[(r1+18)];
+	if(r6 ==0) //_LBB556_45
+{
+__label__ = 42;
+}
+else{
+	r6 = heap32[(r1+5)];
+	if(r6 ==0) //_LBB556_45
+{
+__label__ = 42;
+}
+else{
+	r8 = heap32[(r1+17)];
+	if(r8 ==0) //_LBB556_45
+{
+__label__ = 42;
+}
+else{
+	f5 = f2+f0;
+	f5 = f5; //fstod f5, f5
+	f9 =                      0.01;
+	if(f5 <f9) //_LBB556_43
+{
+__label__ = 44;
+}
+else{
+	r8 = r17 & 255;
+	if(r8 ==1) //_LBB556_44
+{
+__label__ = 60;
+}
+else{
+__label__ = 44;
+}
+}
+}
+}
+}
+if (__label__ == 42){
+	r6 = r17 & 255;
+	if(r6 ==1) //_LBB556_44
+{
+__label__ = 60;
+}
+else{
+	r6 = heap32[(r1+5)];
+	if(r6 ==0) //_LBB556_62
+{
+__label__ = 59;
+}
+else{
+__label__ = 44;
+}
+}
+}
+_58: do {
+if (__label__ == 44){
+	r8 = gNumDeepPenetrationChecks;
+	r8 = r8 >> 2;
+	r9 = heap32[(r8)];
+	r9 = (r9 + 1)|0;
+	heap32[(r8)] = r9;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+2)];
+	r9 = heap32[(r4+33)];
+	r12 = heap32[(r13)];
+	r13 = heap32[(r1+7)];
+	r14 = heap32[(r1+6)];
+	r0 = (r0 + 4)|0;
+	r15 = sp + -240;
+	r16 = sp + -256;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r14;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = r5;
+	heap32[(g0+5)] = r7;
+	heap32[(g0+6)] = r0;
+	heap32[(g0+7)] = r15;
+	heap32[(g0+8)] = r16;
+	heap32[(g0+9)] = r11;
+	heap32[(g0+10)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB556_57
+{
+	f5 = heapFloat[(r1+1)];
+	f9 = heapFloat[(r1+2)];
+	f11 = heapFloat[(r1+3)];
+	f5 = f5*f5;
+	f9 = f9*f9;
+	f5 = f5+f9;
+	f9 = f11*f11;
+	f5 = f5+f9;
+	f9 =                         0;
+	if(f5 <=f9) //_LBB556_62
+{
+__label__ = 59;
+break _58;
+}
+else{
+	r0 = r15 >> 2;
+	r5 = r16 >> 2;
+	f5 = heapFloat[(r0+1)];
+	f9 = heapFloat[(r5+1)];
+	f11 = heapFloat[(fp+-60)];
+	f12 = heapFloat[(fp+-64)];
+	f11 = f11-f12;
+	f5 = f5-f9;
+	f9 = heapFloat[(r0+2)];
+	f12 = heapFloat[(r5+2)];
+	f9 = f9-f12;
+	f11 = f11*f11;
+	f5 = f5*f5;
+	f5 = f11+f5;
+	f9 = f9*f9;
+	f5 = f5+f9;
+	heapFloat[(g0)] = f5;
+	sqrtf(i7);
+	f0 = f_g0-f0;
+	r0 = r17 & 255;
+if(!(r0 !=1)) //_LBB556_60
+{
+	if(f0 >=f2) //_LBB556_61
+{
+	heap32[(r1+15)] = 5;
+__label__ = 59;
+break _58;
+}
+}
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r1+2)];
+	f4 = heapFloat[(r1+3)];
+	f10 = heapFloat[(fp+-64)];
+	f5 = heapFloat[(r5+1)];
+	f9 = heapFloat[(r5+2)];
+	heapFloat[(fp+-8)] = f2;
+	heapFloat[(r3+1)] = f3;
+	heapFloat[(r3+2)] = f4;
+	f11 = f2*f2;
+	f12 = f3*f3;
+	heap32[(r3+3)] = heap32[(r1+4)];
+	f11 = f11+f12;
+	f12 = f4*f4;
+	f11 = f11+f12;
+	heapFloat[(g0)] = f11;
+	sqrtf(i7);
+	f12 =                         1;
+	f11 = f12/f_g0;
+	f12 = heapFloat[(fp+-8)];
+	f12 = f12*f11;
+	heapFloat[(fp+-8)] = f12;
+	f12 = heapFloat[(r3+1)];
+	f12 = f12*f11;
+	heapFloat[(r3+1)] = f12;
+	f12 = heapFloat[(r3+2)];
+	f2 = f2*f1;
+	f13 = f3*f1;
+	f1 = f4*f1;
+	f11 = f12*f11;
+	f3 = f10+f2;
+	f4 = f5+f13;
+	f10 = f9+f1;
+	heapFloat[(r3+2)] = f11;
+	heap32[(r1+15)] = 6;
+	f2 = f0;
+__label__ = 60;
+break _58;
+}
+}
+else{
+	r16 = r16 >> 2;
+	r15 = r15 >> 2;
+	f0 = heapFloat[(r16+1)];
+	f1 = heapFloat[(r15+1)];
+	f5 = heapFloat[(fp+-64)];
+	f9 = heapFloat[(fp+-60)];
+	f0 = f0-f1;
+	f1 = f5-f9;
+	f5 = heapFloat[(r16+2)];
+	f9 = heapFloat[(r15+2)];
+	f5 = f5-f9;
+	f9 = f1*f1;
+	f11 = f0*f0;
+	f9 = f9+f11;
+	f11 = f5*f5;
+	f9 = f9+f11;
+	f11 =   1.4210854715202004e-014;
+	if(f9 <=f11) //_LBB556_50
+{
+	f1 = heapFloat[(r1+1)];
+	f0 = heapFloat[(r1+2)];
+	f5 = heapFloat[(r1+3)];
+	f9 = f1*f1;
+	f12 = f0*f0;
+	f9 = f9+f12;
+	f13 = f5*f5;
+	f12 = heapFloat[(r1+4)];
+	f9 = f9+f13;
+}
+else{
+	f12 =                         0;
+}
+	if(f9 <=f11) //_LBB556_56
+{
+	heap32[(r1+15)] = 9;
+__label__ = 59;
+break _58;
+}
+else{
+	heapFloat[(g0)] = f9;
+	sqrtf(i7);
+	f9 = f_g0;
+	f11 = heapFloat[(r15+1)];
+	f13 = heapFloat[(r16+1)];
+	f14 = heapFloat[(fp+-60)];
+	f15 = heapFloat[(fp+-64)];
+	f14 = f14-f15;
+	f11 = f11-f13;
+	f13 = heapFloat[(r15+2)];
+	f15 = heapFloat[(r16+2)];
+	f13 = f13-f15;
+	f14 = f14*f14;
+	f11 = f11*f11;
+	f11 = f14+f11;
+	f13 = f13*f13;
+	f11 = f11+f13;
+	heapFloat[(g0)] = f11;
+	sqrtf(i7);
+	f11 = -f_g0;
+	r15 = r17 & 255;
+if(!(r15 !=1)) //_LBB556_54
+{
+	if(f2 <=f11) //_LBB556_55
+{
+	heap32[(r1+15)] = 8;
+__label__ = 59;
+break _58;
+}
+}
+	f2 =                         1;
+	f2 = f2/f9;
+	f3 = heapFloat[(fp+-64)];
+	f4 = heapFloat[(r16+1)];
+	f10 = heapFloat[(r16+2)];
+	f1 = f1*f2;
+	f0 = f0*f2;
+	heapFloat[(fp+-8)] = f1;
+	f1 = f5*f2;
+	heapFloat[(r3+1)] = f0;
+	heapFloat[(r3+2)] = f1;
+	heapFloat[(r3+3)] = f12;
+	heap32[(r1+15)] = 3;
+	f2 = f11;
+__label__ = 60;
+}
+}
+}
+} while(0);
+if (__label__ == 59){
+	r0 = r17 & 255;
+	if(r0 ==0) //_LBB556_66
+{
+__label__ = 63;
+}
+else{
+__label__ = 60;
+}
+}
+_81: do {
+if (__label__ == 60){
+	f0 =                         0;
+if(!(f2 <f0)) //_LBB556_65
+{
+	f0 = f2*f2;
+	f1 = heapFloat[(r4+32)];
+	if(f0 >=f1) //_LBB556_66
+{
+break _81;
+}
+}
+	heap32[(r1+1)] = heap32[(fp+-8)];
+	heap32[(r1+2)] = heap32[(r3+1)];
+	heap32[(r1+3)] = heap32[(r3+2)];
+	heap32[(r1+4)] = heap32[(r3+3)];
+	r0 = r10 >> 2;
+	heapFloat[(r1+14)] = f2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r1 = sp + -16;
+	f0 = f3+f6;
+	r3 = r1 >> 2;
+	f1 = f4+f8;
+	heapFloat[(fp+-4)] = f0;
+	f0 = f10+f7;
+	heapFloat[(r3+1)] = f1;
+	heapFloat[(r3+2)] = f0;
+	heap32[(r3+3)] = 0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	heapFloat[(g0+3)] = f2;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+} while(0);
+	return;
+}
+
+function _ZN20btPersistentManifold18removeContactPointEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	r3 = (r2 + -1)|0;
+	r4 = heap32[(fp+1)];
+	if(r3 ==r4) //_LBB557_2
+{
+	r3 = (r2 * 276)|0;
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+-41)];
+	if(r0 !=0) //_LBB557_4
+{
+	r1 = _2E_str434;
+	r2 = _2E_str483;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 160;
+	_assert(i7);
+}
+}
+else{
+	r4 = (r4 * 276)|0;
+	r5 = (r0 + 4)|0;
+	r3 = (r3 * 276)|0;
+	r4 = (r5 + r4)|0;
+	r3 = (r5 + r3)|0;
+	r2 = (r2 * 276)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 276;
+	r0 = (r0 + r2)|0;
+	memcpy(i7);
+	r2 = r0 >> 2;
+	heap32[(r2+-41)] = 0;
+	heap32[(r2+-16)] = 0;
+	heap32[(r2+-8)] = 0;
+	heap32[(r2)] = 0;
+	r3 = 0;
+	heap32[(r2+-40)] = 0;
+	heap8[r0+-156] = r3;
+	heap32[(r2+-38)] = 0;
+	heap32[(r2+-37)] = 0;
+	heap32[(r2+-32)] = 0;
+	r2 = heap32[(r1+279)];
+}
+	r0 = (r2 + -1)|0;
+	heap32[(r1+279)] = r0;
+	return;
+}
+
+function _ZN20btPersistentManifold20refreshContactPointsERK11btTransformS2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+279)];
+	r3 = (r2 + -1)|0;
+	if(r3 >-1) //_LBB558_2
+{
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+_3: while(true){
+	r5 = (r2 * 69)|0;
+	r5 = r5 << 2;
+	r5 = (r0 + r5)|0;
+	r6 = r3 >> 2;
+	r5 = r5 >> 2;
+	f0 = heapFloat[(r5+-68)];
+	f1 = heapFloat[(r6)];
+	f2 = heapFloat[(r5+-67)];
+	f3 = heapFloat[(r6+1)];
+	f4 = heapFloat[(r6+4)];
+	f5 = heapFloat[(r6+5)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r5+-66)];
+	f7 = heapFloat[(r6+2)];
+	f8 = heapFloat[(r6+8)];
+	f9 = heapFloat[(r6+9)];
+	f10 = heapFloat[(r6+6)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+10)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+12)];
+	f8 = heapFloat[(r6+14)];
+	f9 = heapFloat[(r6+13)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(r5+-56)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r5+-55)] = f2;
+	heapFloat[(r5+-54)] = f0;
+	heap32[(r5+-53)] = 0;
+	r6 = r4 >> 2;
+	f0 = heapFloat[(r5+-64)];
+	f1 = heapFloat[(r6)];
+	f2 = heapFloat[(r5+-63)];
+	f3 = heapFloat[(r6+1)];
+	f4 = heapFloat[(r6+4)];
+	f5 = heapFloat[(r6+5)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r5+-62)];
+	f7 = heapFloat[(r6+2)];
+	f8 = heapFloat[(r6+8)];
+	f9 = heapFloat[(r6+9)];
+	f10 = heapFloat[(r6+6)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r6+10)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r6+12)];
+	f8 = heapFloat[(r6+14)];
+	f9 = heapFloat[(r6+13)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(r5+-60)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r5+-59)] = f2;
+	heapFloat[(r5+-58)] = f0;
+	heap32[(r5+-57)] = 0;
+	f0 = heapFloat[(r5+-55)];
+	f1 = heapFloat[(r5+-59)];
+	f2 = heapFloat[(r5+-56)];
+	f3 = heapFloat[(r5+-60)];
+	f2 = f2-f3;
+	f3 = heapFloat[(r5+-52)];
+	f0 = f0-f1;
+	f1 = heapFloat[(r5+-51)];
+	f4 = heapFloat[(r5+-54)];
+	f5 = heapFloat[(r5+-58)];
+	f6 = heapFloat[(r5+-50)];
+	f4 = f4-f5;
+	f2 = f2*f3;
+	f0 = f0*f1;
+	f0 = f2+f0;
+	f1 = f4*f6;
+	f0 = f0+f1;
+	heapFloat[(r5+-48)] = f0;
+	r6 = heap32[(r5+-32)];
+	r2 = (r2 + -1)|0;
+	r6 = (r6 + 1)|0;
+	heap32[(r5+-32)] = r6;
+if(!(r2 !=0)) //_LBB558_3
+{
+break _3;
+}
+}
+	r2 = heap32[(r1+279)];
+}
+	r2 = (r2 + -1)|0;
+_7: do {
+if(!(r2 <0)) //_LBB558_11
+{
+_8: while(true){
+	r3 = r2;
+	r2 = (r3 * 69)|0;
+	r2 = r2 << 2;
+	r2 = (r0 + r2)|0;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+21)];
+	f1 = heapFloat[(r1+280)];
+	if(f0 <=f1) //_LBB558_8
+{
+	f2 = heapFloat[(r2+17)];
+	f3 = heapFloat[(r2+18)];
+	f4 = heapFloat[(r2+19)];
+	f5 = heapFloat[(r2+13)];
+	f2 = f2*f0;
+	f6 = heapFloat[(r2+14)];
+	f3 = f3*f0;
+	f7 = heapFloat[(r2+9)];
+	f2 = f5-f2;
+	f5 = heapFloat[(r2+10)];
+	f3 = f6-f3;
+	f6 = heapFloat[(r2+15)];
+	f0 = f4*f0;
+	f2 = f7-f2;
+	f3 = f5-f3;
+	f4 = heapFloat[(r2+11)];
+	f0 = f6-f0;
+	f0 = f4-f0;
+	f2 = f2*f2;
+	f3 = f3*f3;
+	f2 = f2+f3;
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f2+f0;
+if(!(f1 >=f0)) //_LBB558_10
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	_ZN20btPersistentManifold18removeContactPointEi(i7);
+}
+}
+else{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	_ZN20btPersistentManifold18removeContactPointEi(i7);
+}
+	r2 = (r3 + -1)|0;
+	if(r3 !=0) //_LBB558_6
+{
+continue _8;
+}
+else{
+break _7;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN25btTriangleRaycastCallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+6)];
+	f1 = heapFloat[(r0+2)];
+	f2 = heapFloat[(r0+10)];
+	f3 = heapFloat[(r0+5)];
+	f4 = heapFloat[(r0+1)];
+	f5 = heapFloat[(r0+9)];
+	f6 = heapFloat[(r0+4)];
+	f7 = heapFloat[(r0)];
+	f8 = heapFloat[(r0+8)];
+	f9 = f3-f4;
+	f10 = f2-f1;
+	f11 = f0-f1;
+	f12 = f5-f4;
+	f13 = f8-f7;
+	f14 = f6-f7;
+	f15 = f9*f10;
+	f16 = f11*f12;
+	f15 = f15-f16;
+	r0 = sp + -32;
+	f11 = f11*f13;
+	f10 = f14*f10;
+	f10 = f11-f10;
+	r1 = r0 >> 2;
+	heapFloat[(fp+-8)] = f15;
+	f11 = f14*f12;
+	f9 = f9*f13;
+	f9 = f11-f9;
+	heapFloat[(r1+1)] = f10;
+	r2 = heap32[(fp)];
+	heapFloat[(r1+2)] = f9;
+	r3 = r2 >> 2;
+	heap32[(r1+3)] = 0;
+	f11 = heapFloat[(r3+1)];
+	f12 = heapFloat[(r3+2)];
+	f13 = heapFloat[(r3+5)];
+	f14 = heapFloat[(r3+6)];
+	f16 = heapFloat[(r3+3)];
+	f17 = heapFloat[(r3+7)];
+	f18 = f15*f11;
+	f19 = f10*f12;
+	f20 = f15*f13;
+	f21 = f10*f14;
+	f22 = f7*f15;
+	f23 = f4*f10;
+	f18 = f18+f19;
+	f19 = f9*f16;
+	f20 = f20+f21;
+	f21 = f9*f17;
+	f22 = f22+f23;
+	f23 = f1*f9;
+	f18 = f18+f19;
+	f19 = f22+f23;
+	f20 = f20+f21;
+	f18 = f18-f19;
+	f19 = f20-f19;
+	f20 = f18*f19;
+	f21 =                         0;
+_1: do {
+if(!(f20 >=f21)) //_LBB559_11
+{
+	r4 = heap32[(r3+9)];
+	r4 = r4 & 1;
+if(!(r4 ==0)) //_LBB559_3
+{
+	if(f18 >f21) //_LBB559_11
+{
+break _1;
+}
+}
+	f19 = f18-f19;
+	f19 = f18/f19;
+	f20 = heapFloat[(r3+10)];
+if(!(f20 <=f19)) //_LBB559_11
+{
+	f20 =                         1;
+	f22 = f20-f19;
+	f16 = f16*f22;
+	f17 = f17*f19;
+	f12 = f12*f22;
+	f14 = f14*f19;
+	f11 = f11*f22;
+	f13 = f13*f19;
+	f16 = f16+f17;
+	f12 = f12+f14;
+	f11 = f11+f13;
+	f1 = f1-f16;
+	f3 = f3-f12;
+	f7 = f7-f11;
+	f0 = f0-f16;
+	f4 = f4-f12;
+	f6 = f6-f11;
+	f13 = f15*f15;
+	f14 = f10*f10;
+	f17 = f4*f0;
+	f22 = f1*f3;
+	f23 = f1*f6;
+	f24 = f7*f0;
+	f13 = f13+f14;
+	f14 = f9*f9;
+	f17 = f17-f22;
+	f22 = f23-f24;
+	f13 = f13+f14;
+	f14 =  -9.9999997473787516e-005;
+	f23 = f7*f3;
+	f24 = f4*f6;
+	f23 = f23-f24;
+	f14 = f13*f14;
+	f17 = f17*f15;
+	f22 = f22*f10;
+	f17 = f17+f22;
+	f22 = f23*f9;
+	f17 = f17+f22;
+if(!(f17 <f14)) //_LBB559_11
+{
+	f2 = f2-f16;
+	f5 = f5-f12;
+	f8 = f8-f11;
+	f11 = f3*f2;
+	f12 = f0*f5;
+	f0 = f0*f8;
+	f16 = f6*f2;
+	f11 = f11-f12;
+	f0 = f0-f16;
+	f6 = f6*f5;
+	f3 = f3*f8;
+	f11 = f11*f15;
+	f0 = f0*f10;
+	f3 = f6-f3;
+	f0 = f11+f0;
+	f3 = f3*f9;
+	f0 = f0+f3;
+if(!(f0 <f14)) //_LBB559_11
+{
+	f0 = f5*f1;
+	f3 = f2*f4;
+	f2 = f2*f7;
+	f1 = f8*f1;
+	f0 = f0-f3;
+	f1 = f2-f1;
+	f2 = f8*f4;
+	f3 = f5*f7;
+	f0 = f0*f15;
+	f1 = f1*f10;
+	f2 = f2-f3;
+	f0 = f0+f1;
+	f1 = f2*f9;
+	f0 = f0+f1;
+if(!(f0 <f14)) //_LBB559_11
+{
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	heapFloat[(g0)] = f13;
+	sqrtf(i7);
+	f0 = f20/f_g0;
+	f1 = heapFloat[(fp+-8)];
+	f1 = f1*f0;
+	heapFloat[(fp+-8)] = f1;
+	f2 = heapFloat[(r1+1)];
+	f2 = f2*f0;
+	heapFloat[(r1+1)] = f2;
+	f3 = heapFloat[(r1+2)];
+	f0 = f3*f0;
+	heapFloat[(r1+2)] = f0;
+	r1 = heap32[(r3)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	r6 = heap32[(r3+9)];
+	r6 = r6 & 2;
+	if(r6 !=0) //_LBB559_9
+{
+__label__ = 9;
+}
+else{
+	if(f18 >f21) //_LBB559_10
+{
+__label__ = 10;
+}
+else{
+__label__ = 9;
+}
+}
+if (__label__ == 9){
+	r0 = sp + -16;
+	f1 = -f1;
+	r6 = r0 >> 2;
+	f2 = -f2;
+	heapFloat[(fp+-4)] = f1;
+	f0 = -f0;
+	heapFloat[(r6+1)] = f2;
+	heapFloat[(r6+2)] = f0;
+	heap32[(r6+3)] = 0;
+}
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heapFloat[(g0+2)] = f19;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	heapFloat[(r3+10)] = f_g0;
+}
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN28btTriangleConvexcastCallbackC2EPK13btConvexShapeRK11btTransformS5_S5_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV28btTriangleConvexcastCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+1)];
+	heap32[(r0)] = r1;
+	r1 = r2 >> 2;
+	heap32[(r0+1)] = r3;
+	heap32[(r0+2)] = heap32[(r1)];
+	heap32[(r0+3)] = heap32[(r1+1)];
+	heap32[(r0+4)] = heap32[(r1+2)];
+	heap32[(r0+5)] = heap32[(r1+3)];
+	heap32[(r0+6)] = heap32[(r1+4)];
+	heap32[(r0+7)] = heap32[(r1+5)];
+	heap32[(r0+8)] = heap32[(r1+6)];
+	heap32[(r0+9)] = heap32[(r1+7)];
+	heap32[(r0+10)] = heap32[(r1+8)];
+	heap32[(r0+11)] = heap32[(r1+9)];
+	heap32[(r0+12)] = heap32[(r1+10)];
+	heap32[(r0+13)] = heap32[(r1+11)];
+	heap32[(r0+14)] = heap32[(r1+12)];
+	heap32[(r0+15)] = heap32[(r1+13)];
+	r2 = heap32[(fp+3)];
+	heap32[(r0+16)] = heap32[(r1+14)];
+	r2 = r2 >> 2;
+	heap32[(r0+17)] = heap32[(r1+15)];
+	heap32[(r0+18)] = heap32[(r2)];
+	heap32[(r0+19)] = heap32[(r2+1)];
+	heap32[(r0+20)] = heap32[(r2+2)];
+	heap32[(r0+21)] = heap32[(r2+3)];
+	heap32[(r0+22)] = heap32[(r2+4)];
+	heap32[(r0+23)] = heap32[(r2+5)];
+	heap32[(r0+24)] = heap32[(r2+6)];
+	heap32[(r0+25)] = heap32[(r2+7)];
+	heap32[(r0+26)] = heap32[(r2+8)];
+	heap32[(r0+27)] = heap32[(r2+9)];
+	heap32[(r0+28)] = heap32[(r2+10)];
+	heap32[(r0+29)] = heap32[(r2+11)];
+	heap32[(r0+30)] = heap32[(r2+12)];
+	heap32[(r0+31)] = heap32[(r2+13)];
+	r1 = heap32[(fp+4)];
+	heap32[(r0+32)] = heap32[(r2+14)];
+	r1 = r1 >> 2;
+	heap32[(r0+33)] = heap32[(r2+15)];
+	heap32[(r0+34)] = heap32[(r1)];
+	heap32[(r0+35)] = heap32[(r1+1)];
+	heap32[(r0+36)] = heap32[(r1+2)];
+	heap32[(r0+37)] = heap32[(r1+3)];
+	heap32[(r0+38)] = heap32[(r1+4)];
+	heap32[(r0+39)] = heap32[(r1+5)];
+	heap32[(r0+40)] = heap32[(r1+6)];
+	heap32[(r0+41)] = heap32[(r1+7)];
+	heap32[(r0+42)] = heap32[(r1+8)];
+	heap32[(r0+43)] = heap32[(r1+9)];
+	heap32[(r0+44)] = heap32[(r1+10)];
+	heap32[(r0+45)] = heap32[(r1+11)];
+	heap32[(r0+46)] = heap32[(r1+12)];
+	heap32[(r0+47)] = heap32[(r1+13)];
+	heap32[(r0+48)] = heap32[(r1+14)];
+	heap32[(r0+49)] = heap32[(r1+15)];
+	heap32[(r0+50)] = 1065353216;
+	heap32[(r0+51)] = heap32[(fp+5)];
+	return;
+}
+
+function _ZN28btTriangleConvexcastCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN28btTriangleConvexcastCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV18btTriangleCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -696;var g0 = i7>>2; // save stack
+	r0 = sp + -104;
+	r1 = r0 >> 2;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 1065353216;
+	heap32[(r1+4)] = 1065353216;
+	r2 = _ZTV15btTriangleShape;
+	heap32[(r1+5)] = 1065353216;
+	r2 = (r2 + 8)|0;
+	heap32[(r1+6)] = 0;
+	r3 = heap32[(fp+1)];
+	heap32[(fp+-26)] = r2;
+	r2 = r3 >> 2;
+	heap32[(r1+1)] = 1;
+	heap32[(r1+13)] = heap32[(r2)];
+	heap32[(r1+14)] = heap32[(r2+1)];
+	heap32[(r1+15)] = heap32[(r2+2)];
+	heap32[(r1+16)] = heap32[(r2+3)];
+	heap32[(r1+17)] = heap32[(r2+4)];
+	heap32[(r1+18)] = heap32[(r2+5)];
+	heap32[(r1+19)] = heap32[(r2+6)];
+	heap32[(r1+20)] = heap32[(r2+7)];
+	heap32[(r1+21)] = heap32[(r2+8)];
+	heap32[(r1+22)] = heap32[(r2+9)];
+	r3 = heap32[(fp)];
+	heap32[(r1+23)] = heap32[(r2+10)];
+	r4 = sp + -464;
+	r5 = r3 >> 2;
+	heap32[(r1+24)] = heap32[(r2+11)];
+	r2 = r4 >> 2;
+	heap32[(r1+11)] = heap32[(r5+51)];
+	r1 = _ZTV30btGjkEpaPenetrationDepthSolver;
+	r6 = 0;
+	heap32[(r2+77)] = 953267991;
+	r1 = (r1 + 8)|0;
+	heap8[sp+-132] = r6;
+	heap32[(fp+-118)] = r1;
+	r1 = _ZTV27btContinuousConvexCollision;
+	r2 = sp + -496;
+	r6 = heap32[(r5+1)];
+	r1 = (r1 + 8)|0;
+	r7 = r2 >> 2;
+	heap32[(fp+-124)] = r1;
+	r1 = sp + -472;
+	heap32[(r7+1)] = r4;
+	heap32[(r7+2)] = r1;
+	r1 = _ZTVN12btConvexCast10CastResultE;
+	heap32[(r7+3)] = r6;
+	r4 = sp + -672;
+	r1 = (r1 + 8)|0;
+	heap32[(r7+4)] = r0;
+	r0 = r4 >> 2;
+	heap32[(fp+-168)] = r1;
+	heap32[(r0+42)] = 0;
+	heap32[(r0+43)] = 0;
+	heap32[(r0+41)] = 1065353216;
+	r1 = (r3 + 136)|0;
+	r6 = (r3 + 8)|0;
+	r7 = (r3 + 72)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r1;
+	heap32[(g0+5)] = r4;
+	_ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(i7);
+	r1 = r_g0;
+if(!(r1 ==0)) //_LBB563_4
+{
+	f0 = heapFloat[(r0+33)];
+	f1 = heapFloat[(r0+34)];
+	f2 = heapFloat[(r0+35)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	f1 =   9.9999997473787516e-005;
+if(!(f0 <=f1)) //_LBB563_4
+{
+	f1 = heapFloat[(r0+41)];
+	f2 = heapFloat[(r5+50)];
+if(!(f1 >=f2)) //_LBB563_4
+{
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f1 =                         1;
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r0+33)];
+	f1 = f1*f0;
+	heapFloat[(r0+33)] = f1;
+	f1 = heapFloat[(r0+34)];
+	f1 = f1*f0;
+	heapFloat[(r0+34)] = f1;
+	f1 = heapFloat[(r0+35)];
+	f0 = f1*f0;
+	heapFloat[(r0+35)] = f0;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	f0 = heapFloat[(r0+41)];
+	r0 = (r4 + 132)|0;
+	r4 = (r4 + 148)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heapFloat[(g0+3)] = f0;
+	heap32[(g0+4)] = r1;
+	heap32[(g0+5)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+}
+}
+	return;
+}
+
+function _ZN22btSubsimplexConvexCastD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN22btSubsimplexConvexCastD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV12btConvexCast;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -240;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = 0;
+	r3 = r1 >> 2;
+	heap8[r1+312] = r2;
+	r4 = 1;
+	heap32[(r3)] = 0;
+	heap8[r1+356] = r4;
+	heap32[(r3+73)] = 1566444395;
+	heap32[(r3+74)] = 1566444395;
+	heap32[(r3+75)] = 1566444395;
+	heap32[(r3+76)] = 0;
+	heap8[r1+352] = r2;
+	heap32[(r3+84)] = 0;
+	heap32[(r3+85)] = 0;
+	heap32[(r3+86)] = 0;
+	heap32[(r3+87)] = 0;
+	r3 = heapU8[r1+332];
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+2)];
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+3)];
+	r3 = r3 & 240;
+	heap8[r1+332] = r3;
+	r1 = r5 >> 2;
+	r3 = r8 >> 2;
+	r5 = r6 >> 2;
+	r6 = r7 >> 2;
+	f0 = heapFloat[(r1+12)];
+	f1 = heapFloat[(r5+12)];
+	f2 = heapFloat[(r3+12)];
+	f3 = heapFloat[(r6+12)];
+	f4 = heapFloat[(r1+13)];
+	f5 = heapFloat[(r5+13)];
+	f6 = heapFloat[(r3+13)];
+	f7 = heapFloat[(r6+13)];
+	r7 = heap32[(r0+2)];
+	f1 = f1-f0;
+	f3 = f3-f2;
+	f1 = f1-f3;
+	heapFloat[(fp+-50)] = f1;
+	f3 = heapFloat[(r1+14)];
+	f8 = heapFloat[(r5+14)];
+	f9 = heapFloat[(r3+14)];
+	f10 = heapFloat[(r6+14)];
+	r8 = r7 >> 2;
+	f5 = f5-f4;
+	f7 = f7-f6;
+	f5 = f5-f7;
+	heapFloat[(fp+-51)] = f5;
+	f7 = heapFloat[(r1+4)];
+	heapFloat[(fp+-42)] = f7;
+	f11 = heapFloat[(r1)];
+	heapFloat[(fp+-43)] = f11;
+	f12 = -f1;
+	r8 = heap32[(r8)];
+	f8 = f8-f3;
+	f10 = f10-f9;
+	f13 = heapFloat[(r1+1)];
+	heapFloat[(fp+-44)] = f13;
+	f14 = heapFloat[(r1+5)];
+	heapFloat[(fp+-45)] = f14;
+	r8 = r8 >> 2;
+	f8 = f8-f10;
+	heapFloat[(fp+-52)] = f8;
+	f10 = heapFloat[(r1+8)];
+	heapFloat[(fp+-46)] = f10;
+	f11 = f11*f12;
+	f7 = f7*f5;
+	f15 = heapFloat[(r1+2)];
+	heapFloat[(fp+-47)] = f15;
+	f16 = heapFloat[(r1+6)];
+	f17 = heapFloat[(r1+9)];
+	f18 = heapFloat[(r1+10)];
+	f19 = heapFloat[(r3)];
+	heapFloat[(fp+-33)] = f19;
+	f19 = heapFloat[(r3+1)];
+	heapFloat[(fp+-34)] = f19;
+	f19 = heapFloat[(r3+2)];
+	heapFloat[(fp+-35)] = f19;
+	f19 = heapFloat[(r3+4)];
+	heapFloat[(fp+-36)] = f19;
+	f19 = heapFloat[(r3+5)];
+	heapFloat[(fp+-37)] = f19;
+	f19 = heapFloat[(r3+6)];
+	heapFloat[(fp+-38)] = f19;
+	f19 = heapFloat[(r3+8)];
+	heapFloat[(fp+-39)] = f19;
+	f19 = heapFloat[(r3+9)];
+	heapFloat[(fp+-40)] = f19;
+	f19 = heapFloat[(r3+10)];
+	heapFloat[(fp+-41)] = f19;
+	r8 = heap32[(r8+15)];
+	f13 = f13*f12;
+	f14 = f14*f5;
+	f7 = f11-f7;
+	f10 = f10*f8;
+	r9 = sp + -112;
+	f11 = f15*f12;
+	f12 = f16*f5;
+	f13 = f13-f14;
+	f14 = f17*f8;
+	f7 = f7-f10;
+	r10 = r9 >> 2;
+	f10 = f11-f12;
+	f11 = f18*f8;
+	f12 = f13-f14;
+	heapFloat[(fp+-28)] = f7;
+	f7 = f10-f11;
+	heapFloat[(r10+1)] = f12;
+	heapFloat[(r10+2)] = f7;
+	heap32[(r10+3)] = 0;
+	r10 = sp + -128;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r7 = heap32[(r0+3)];
+	r8 = r7 >> 2;
+	r8 = heap32[(r8)];
+	f7 = heapFloat[(r3)];
+	f10 = heapFloat[(r3+4)];
+	r9 = r10 >> 2;
+	r8 = r8 >> 2;
+	f11 = heapFloat[(r3+1)];
+	f12 = heapFloat[(r3+5)];
+	f13 = heapFloat[(r3+8)];
+	f7 = f7*f1;
+	f10 = f10*f5;
+	f14 = heapFloat[(r3+2)];
+	f15 = heapFloat[(r3+6)];
+	f19 = heapFloat[(r3+10)];
+	f20 = heapFloat[(r3+9)];
+	r8 = heap32[(r8+15)];
+	f11 = f11*f1;
+	f12 = f12*f5;
+	f7 = f7+f10;
+	f10 = f13*f8;
+	f13 = heapFloat[(r1)];
+	heapFloat[(fp+-48)] = f13;
+	f21 = heapFloat[(fp+-32)];
+	f22 = heapFloat[(r1+4)];
+	f23 = heapFloat[(r1+8)];
+	heapFloat[(fp+-49)] = f23;
+	f24 = heapFloat[(r1+1)];
+	f25 = heapFloat[(r9+1)];
+	f26 = heapFloat[(r1+5)];
+	f27 = heapFloat[(r1+9)];
+	f28 = heapFloat[(r1+2)];
+	f29 = heapFloat[(r9+2)];
+	f30 = heapFloat[(r1+6)];
+	f13 = heapFloat[(r1+10)];
+	heapFloat[(fp+-54)] = f13;
+	f13 = heapFloat[(r1+12)];
+	heapFloat[(fp+-53)] = f13;
+	f13 = heapFloat[(r1+13)];
+	heapFloat[(fp+-56)] = f13;
+	f13 = heapFloat[(r1+14)];
+	heapFloat[(fp+-55)] = f13;
+	r9 = sp + -80;
+	f1 = f14*f1;
+	f5 = f15*f5;
+	f11 = f11+f12;
+	f12 = f20*f8;
+	f7 = f7+f10;
+	r10 = r9 >> 2;
+	f1 = f1+f5;
+	f5 = f19*f8;
+	f8 = f11+f12;
+	heapFloat[(fp+-20)] = f7;
+	f1 = f1+f5;
+	heapFloat[(r10+1)] = f8;
+	heapFloat[(r10+2)] = f1;
+	heap32[(r10+3)] = 0;
+	r10 = sp + -96;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r9;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r7 = r10 >> 2;
+	f1 = heapFloat[(r3)];
+	f5 = heapFloat[(fp+-24)];
+	f7 = heapFloat[(r3+4)];
+	f8 = heapFloat[(r3+1)];
+	f10 = heapFloat[(r7+1)];
+	f11 = heapFloat[(r3+5)];
+	f12 = heapFloat[(r3+8)];
+	f14 = heapFloat[(r3+9)];
+	f13 = heapFloat[(fp+-48)];
+	f13 = f13*f21;
+	f15 = f24*f25;
+	f1 = f1*f5;
+	f8 = f8*f10;
+	f19 = heapFloat[(r3+2)];
+	f20 = heapFloat[(r7+2)];
+	f24 = heapFloat[(r3+6)];
+	f22 = f22*f21;
+	f26 = f26*f25;
+	f7 = f7*f5;
+	f11 = f11*f10;
+	f23 = heapFloat[(r3+10)];
+	f13 = f13+f15;
+	f15 = f28*f29;
+	f1 = f1+f8;
+	f8 = f19*f20;
+	f19 = f22+f26;
+	f22 = f30*f29;
+	f7 = f7+f11;
+	f11 = f24*f20;
+	f24 = heapFloat[(fp+-49)];
+	f21 = f24*f21;
+	f24 = f27*f25;
+	f5 = f12*f5;
+	f10 = f14*f10;
+	f12 = f13+f15;
+	f13 = f19+f22;
+	f1 = f1+f8;
+	f8 = heapFloat[(r3+12)];
+	f7 = f7+f11;
+	f11 = heapFloat[(r3+13)];
+	f14 = f21+f24;
+	f15 = heapFloat[(fp+-54)];
+	f15 = f15*f29;
+	f5 = f5+f10;
+	f10 = f23*f20;
+	f14 = f14+f15;
+	f15 = heapFloat[(fp+-53)];
+	f12 = f12+f15;
+	f1 = f1+f8;
+	f8 = heapFloat[(fp+-56)];
+	f8 = f13+f8;
+	f7 = f7+f11;
+	f5 = f5+f10;
+	f10 = heapFloat[(r3+14)];
+	f1 = f12-f1;
+	f7 = f8-f7;
+	f13 = heapFloat[(fp+-55)];
+	f8 = f14+f13;
+	f5 = f5+f10;
+	f5 = f8-f5;
+	f8 = f1*f1;
+	f10 = f7*f7;
+	f8 = f8+f10;
+	f10 = f5*f5;
+	r7 = heap32[(fp+5)];
+	f8 = f8+f10;
+	r8 = -33;
+	f10 =                         0;
+	heapFloat[(fp+-48)] = f10;
+	heapFloat[(fp+-49)] = f10;
+	f11 = f10;
+_1: while(true){
+	f12 =   9.9999997473787516e-005;
+	if(f8 <=f12) //_LBB566_22
+{
+__label__ = 19;
+break _1;
+}
+else{
+	r8 = (r8 + 1)|0;
+	if(r8 !=0) //_LBB566_1
+{
+	r9 = heap32[(r0+2)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	f8 = -f1;
+	r10 = r10 >> 2;
+	f12 = heapFloat[(fp+-43)];
+	f12 = f12*f8;
+	f13 = heapFloat[(fp+-42)];
+	f13 = f13*f7;
+	r10 = heap32[(r10+15)];
+	f14 = heapFloat[(fp+-44)];
+	f14 = f14*f8;
+	f15 = heapFloat[(fp+-45)];
+	f15 = f15*f7;
+	f12 = f12-f13;
+	f13 = heapFloat[(fp+-46)];
+	f13 = f13*f5;
+	r11 = sp + -48;
+	f19 = heapFloat[(fp+-47)];
+	f8 = f19*f8;
+	f19 = f16*f7;
+	f14 = f14-f15;
+	f15 = f17*f5;
+	f12 = f12-f13;
+	r12 = r11 >> 2;
+	f8 = f8-f19;
+	f13 = f18*f5;
+	f14 = f14-f15;
+	heapFloat[(fp+-12)] = f12;
+	f8 = f8-f13;
+	heapFloat[(r12+1)] = f14;
+	heapFloat[(r12+2)] = f8;
+	heap32[(r12+3)] = 0;
+	r12 = sp + -64;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r9 = heap32[(r0+3)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r11 = r12 >> 2;
+	r10 = r10 >> 2;
+	f8 = heapFloat[(fp+-33)];
+	f8 = f8*f1;
+	f12 = heapFloat[(fp+-36)];
+	f12 = f12*f7;
+	f13 = heapFloat[(fp+-16)];
+	f14 = heapFloat[(r11+1)];
+	f15 = heapFloat[(r11+2)];
+	r10 = heap32[(r10+15)];
+	f19 = heapFloat[(fp+-34)];
+	f19 = f19*f1;
+	f20 = heapFloat[(fp+-37)];
+	f20 = f20*f7;
+	f8 = f8+f12;
+	f12 = heapFloat[(fp+-39)];
+	f12 = f12*f5;
+	r11 = sp + -16;
+	f21 = heapFloat[(fp+-35)];
+	f21 = f21*f1;
+	f22 = heapFloat[(fp+-38)];
+	f22 = f22*f7;
+	f19 = f19+f20;
+	f20 = heapFloat[(fp+-40)];
+	f20 = f20*f5;
+	f8 = f8+f12;
+	r12 = r11 >> 2;
+	f12 = f21+f22;
+	f21 = heapFloat[(fp+-41)];
+	f21 = f21*f5;
+	f19 = f19+f20;
+	heapFloat[(fp+-4)] = f8;
+	f8 = f12+f21;
+	heapFloat[(r12+1)] = f19;
+	heapFloat[(r12+2)] = f8;
+	heap32[(r12+3)] = 0;
+	r12 = sp + -32;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	f12 =                         1;
+	if(f11 >f12) //_LBB566_27
+{
+__label__ = 24;
+break _1;
+}
+else{
+	r9 = r12 >> 2;
+	f8 = heapFloat[(fp+-8)];
+	f19 = heapFloat[(r9+1)];
+	f20 = heapFloat[(r9+2)];
+	f21 = heapFloat[(fp+-43)];
+	f21 = f21*f13;
+	f22 = heapFloat[(fp+-44)];
+	f22 = f22*f14;
+	f23 = heapFloat[(fp+-33)];
+	f23 = f23*f8;
+	f24 = heapFloat[(fp+-34)];
+	f24 = f24*f19;
+	f25 = heapFloat[(fp+-42)];
+	f25 = f25*f13;
+	f26 = heapFloat[(fp+-45)];
+	f26 = f26*f14;
+	f27 = heapFloat[(fp+-36)];
+	f27 = f27*f8;
+	f28 = heapFloat[(fp+-37)];
+	f28 = f28*f19;
+	f21 = f21+f22;
+	f22 = heapFloat[(fp+-47)];
+	f22 = f22*f15;
+	f23 = f23+f24;
+	f24 = heapFloat[(fp+-35)];
+	f24 = f24*f20;
+	f25 = f25+f26;
+	f26 = f16*f15;
+	f27 = f27+f28;
+	f28 = heapFloat[(fp+-38)];
+	f28 = f28*f20;
+	f29 = heapFloat[(fp+-46)];
+	f13 = f29*f13;
+	f14 = f17*f14;
+	f29 = heapFloat[(fp+-39)];
+	f8 = f29*f8;
+	f29 = heapFloat[(fp+-40)];
+	f19 = f29*f19;
+	f21 = f21+f22;
+	f22 = f23+f24;
+	f23 = f25+f26;
+	f24 = f27+f28;
+	f13 = f13+f14;
+	f14 = f18*f15;
+	f8 = f8+f19;
+	f15 = heapFloat[(fp+-41)];
+	f15 = f15*f20;
+	f19 = f21+f0;
+	f20 = f22+f2;
+	f21 = f23+f4;
+	f22 = f24+f6;
+	f13 = f13+f14;
+	f8 = f8+f15;
+	f14 = f19-f20;
+	f15 = f21-f22;
+	f13 = f13+f3;
+	f23 = f8+f9;
+	f24 = f13-f23;
+	f8 = f1*f14;
+	f25 = f7*f15;
+	f8 = f8+f25;
+	f25 = f5*f24;
+	f25 = f8+f25;
+	f8 =                         0;
+	if(f25 >f8) //_LBB566_4
+{
+	f0 = heapFloat[(fp+-50)];
+	f0 = f1*f0;
+	f2 = heapFloat[(fp+-51)];
+	f2 = f7*f2;
+	f0 = f0+f2;
+	f2 = heapFloat[(fp+-52)];
+	f2 = f5*f2;
+	f0 = f0+f2;
+	f2 =  -1.4210854715202004e-014;
+	if(f0 >=f2) //_LBB566_27
+{
+__label__ = 24;
+break _1;
+}
+else{
+	f0 = f25/f0;
+	f11 = f11-f0;
+	f0 = heapFloat[(r5+12)];
+	f2 = heapFloat[(r5+13)];
+	f3 = heapFloat[(r5+14)];
+	f4 = heapFloat[(r6+12)];
+	f6 = heapFloat[(r6+13)];
+	f9 = heapFloat[(r6+14)];
+	f10 = heapFloat[(r1+12)];
+	f12 = f12-f11;
+	f25 = heapFloat[(r1+13)];
+	f26 = heapFloat[(r1+14)];
+	f27 = heapFloat[(r3+12)];
+	f28 = heapFloat[(r3+13)];
+	f29 = heapFloat[(r3+14)];
+	f10 = f10*f12;
+	f0 = f0*f11;
+	f25 = f25*f12;
+	f2 = f2*f11;
+	f26 = f26*f12;
+	f3 = f3*f11;
+	f27 = f27*f12;
+	f30 = f4*f11;
+	f28 = f28*f12;
+	f6 = f6*f11;
+	f12 = f29*f12;
+	f9 = f9*f11;
+	f0 = f10+f0;
+	f4 = f25+f2;
+	f3 = f26+f3;
+	f2 = f27+f30;
+	f6 = f28+f6;
+	f9 = f12+f9;
+	f10 = f1;
+	heapFloat[(fp+-48)] = f7;
+	heapFloat[(fp+-49)] = f5;
+}
+}
+	r9 = heap32[(r0+1)];
+	r10 = r9 >> 2;
+	r11 = heap32[(r10)];
+_10: do {
+	if(r11 >0) //_LBB566_8
+{
+	r12 = -12;
+	f1 = heapFloat[(r10+77)];
+	r13 = (r12 - r9)|0;
+	r14 = 0;
+	r15 = r11;
+	r12 = r14;
+_12: while(true){
+	r16 = -8;
+	r17 = -4;
+	r16 = (r16 - r13)|0;
+	r17 = (r17 - r13)|0;
+	r16 = r16 >> 2;
+	r17 = r17 >> 2;
+	r18 = (r14 - r13)|0;
+	r18 = r18 >> 2;
+	f5 = heapFloat[(r16)];
+	f7 = heapFloat[(r17)];
+	f5 = f14-f5;
+	f7 = f15-f7;
+	f12 = heapFloat[(r18)];
+	f12 = f24-f12;
+	f5 = f5*f5;
+	f7 = f7*f7;
+	f5 = f5+f7;
+	f7 = f12*f12;
+	f5 = f5+f7;
+	r15 = (r15 + -1)|0;
+	r12 = f5 > f1 ? r12 : r4;
+	r13 = (r13 + -16)|0;
+if(!(r15 !=0)) //_LBB566_9
+{
+break _10;
+}
+}
+}
+else{
+	r12 = r2;
+}
+} while(0);
+	f1 = heapFloat[(r10+76)];
+	if(f1 ==f8) //_LBB566_12
+{
+	f1 = heapFloat[(r10+75)];
+if(!(f24 !=f1)) //_LBB566_11
+{
+	f1 = heapFloat[(r10+74)];
+if(!(f15 !=f1)) //_LBB566_11
+{
+	f1 = heapFloat[(r10+73)];
+	r12 = f14 != f1 ? r12 : r4;
+}
+}
+}
+	r12 = r12 & 255;
+	if(r12 ==0) //_LBB566_17
+{
+	heapFloat[(r10+73)] = f14;
+	heapFloat[(r10+74)] = f15;
+	r11 = r11 << 4;
+	heapFloat[(r10+75)] = f24;
+	r11 = (r9 + r11)|0;
+	heap32[(r10+76)] = 0;
+	r11 = r11 >> 2;
+	heap8[r9+356] = r4;
+	heapFloat[(r11+1)] = f14;
+	heapFloat[(r11+2)] = f15;
+	heapFloat[(r11+3)] = f24;
+	heap32[(r11+4)] = 0;
+	r11 = heap32[(r10)];
+	r11 = r11 << 4;
+	r11 = (r9 + r11)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r11+21)] = f19;
+	heapFloat[(r11+22)] = f21;
+	heapFloat[(r11+23)] = f13;
+	heap32[(r11+24)] = 0;
+	r11 = heap32[(r10)];
+	r11 = r11 << 4;
+	r9 = (r9 + r11)|0;
+	r9 = r9 >> 2;
+	heapFloat[(r9+41)] = f20;
+	heapFloat[(r9+42)] = f22;
+	heapFloat[(r9+43)] = f23;
+	heap32[(r9+44)] = 0;
+	r9 = heap32[(r10)];
+	r9 = (r9 + 1)|0;
+	heap32[(r10)] = r9;
+	r9 = heap32[(r0+1)];
+}
+	heap32[(g0)] = r9;
+	_ZN22btVoronoiSimplexSolver28updateClosestVectorAndPointsEv(i7);
+	r10 = r_g0;
+	r9 = r9 >> 2;
+	f1 = heapFloat[(r9+69)];
+	f7 = heapFloat[(r9+70)];
+	f5 = heapFloat[(r9+71)];
+	if(r10 ==0) //_LBB566_20
+{
+continue _1;
+}
+else{
+	f8 = f1*f1;
+	f12 = f7*f7;
+	f8 = f8+f12;
+	f12 = f5*f5;
+	f8 = f8+f12;
+continue _1;
+}
+}
+}
+else{
+__label__ = 19;
+break _1;
+}
+}
+}
+if (__label__ == 19){
+	f0 = f10*f10;
+	f7 = heapFloat[(fp+-48)];
+	f1 = f7*f7;
+	f0 = f0+f1;
+	f1 = heapFloat[(fp+-49)];
+	f1 = f1*f1;
+	f0 = f0+f1;
+	r1 = r7 >> 2;
+	heapFloat[(r1+41)] = f11;
+	f1 =   1.4210854715202004e-014;
+	if(f0 <f1) //_LBB566_24
+{
+	heap32[(r1+33)] = 0;
+	heap32[(r1+34)] = 0;
+	f0 =                         0;
+	heap32[(r1+35)] = 0;
+	heap32[(r1+36)] = 0;
+	f2 = f0;
+	f1 = f0;
+}
+else{
+	heapFloat[(g0)] = f0;
+	f0 =                         1;
+	sqrtf(i7);
+	f0 = f0/f_g0;
+	f1 = f10*f0;
+	f7 = heapFloat[(fp+-48)];
+	f2 = f7*f0;
+	heapFloat[(r1+33)] = f1;
+	f11 = heapFloat[(fp+-49)];
+	f0 = f11*f0;
+	heapFloat[(r1+34)] = f2;
+	heapFloat[(r1+35)] = f0;
+	heap32[(r1+36)] = 0;
+}
+	f3 = heapFloat[(fp+-50)];
+	f1 = f1*f3;
+	f3 = heapFloat[(fp+-51)];
+	f2 = f2*f3;
+	f3 = heapFloat[(r1+43)];
+	f1 = f1+f2;
+	f2 = heapFloat[(fp+-52)];
+	f0 = f0*f2;
+	f0 = f1+f0;
+	f1 = -f3;
+if(!(f0 >=f1)) //_LBB566_27
+{
+	r0 = heap32[(r0+1)];
+	heap32[(g0)] = r0;
+	r0 = r0 >> 2;
+	_ZN22btVoronoiSimplexSolver28updateClosestVectorAndPointsEv(i7);
+	f0 = heapFloat[(r0+68)];
+	f1 = heapFloat[(r0+67)];
+	f2 = heapFloat[(r0+66)];
+	heap32[(r1+37)] = heap32[(r0+65)];
+	heapFloat[(r1+38)] = f2;
+	heapFloat[(r1+39)] = f1;
+	heapFloat[(r1+40)] = f0;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN22btVoronoiSimplexSolver12removeVertexEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	if(r2 >0) //_LBB567_2
+{
+	r3 = heap32[(fp+1)];
+	r2 = (r2 + -1)|0;
+	r3 = r3 << 4;
+	r4 = (r0 + 4)|0;
+	r5 = r2 << 4;
+	r6 = (r4 + r3)|0;
+	r4 = (r4 + r5)|0;
+	r5 = r6 >> 2;
+	r4 = r4 >> 2;
+	heap32[(r1)] = r2;
+	heap32[(r5)] = heap32[(r4)];
+	heap32[(r5+1)] = heap32[(r4+1)];
+	heap32[(r5+2)] = heap32[(r4+2)];
+	heap32[(r5+3)] = heap32[(r4+3)];
+	r2 = heap32[(r1)];
+	r4 = (r0 + 84)|0;
+	r2 = r2 << 4;
+	r5 = (r4 + r3)|0;
+	r2 = (r4 + r2)|0;
+	r4 = r5 >> 2;
+	r2 = r2 >> 2;
+	heap32[(r4)] = heap32[(r2)];
+	heap32[(r4+1)] = heap32[(r2+1)];
+	heap32[(r4+2)] = heap32[(r2+2)];
+	heap32[(r4+3)] = heap32[(r2+3)];
+	r1 = heap32[(r1)];
+	r0 = (r0 + 164)|0;
+	r1 = r1 << 4;
+	r2 = (r0 + r3)|0;
+	r0 = (r0 + r1)|0;
+	r1 = r2 >> 2;
+	r0 = r0 >> 2;
+	heap32[(r1)] = heap32[(r0)];
+	heap32[(r1+1)] = heap32[(r0+1)];
+	heap32[(r1+2)] = heap32[(r0+2)];
+	heap32[(r1+3)] = heap32[(r0+3)];
+	return;
+}
+else{
+	r0 = _2E_str457;
+	r1 = _2E_str1458;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 38;
+	_assert(i7);
+}
+}
+
+function _ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r1 = heapU8[r0+16];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+1)];
+	r1 = r1 & -16;
+	r5 = heap32[(fp)];
+	r2 = r2 >> 2;
+	heap8[r0+16] = r1;
+	r3 = r3 >> 2;
+	r5 = r5 >> 2;
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r2+1)];
+	f1 = heapFloat[(r4+1)];
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r5+1)];
+	f4 = heapFloat[(r2)];
+	f5 = heapFloat[(r4)];
+	f6 = heapFloat[(r3)];
+	f7 = heapFloat[(r5)];
+	f8 = heapFloat[(r2+2)];
+	f9 = heapFloat[(r4+2)];
+	f10 = heapFloat[(r3+2)];
+	f11 = heapFloat[(r5+2)];
+	f12 = f0-f1;
+	f13 = f4-f5;
+	f14 = f6-f5;
+	f15 = f7-f5;
+	f16 = f2-f1;
+	f17 = f3-f1;
+	f18 = f8-f9;
+	f19 = f10-f9;
+	f20 = f11-f9;
+	f21 = f13*f15;
+	f22 = f12*f17;
+	f15 = f14*f15;
+	f17 = f16*f17;
+	f21 = f21+f22;
+	f22 = f18*f20;
+	f15 = f15+f17;
+	f17 = f19*f20;
+	f20 = f21+f22;
+	f15 = f15+f17;
+	f17 =                         0;
+if(!(f20 >f17)) //_LBB568_3
+{
+if(!(f15 >f17)) //_LBB568_3
+{
+	r2 = r0 >> 2;
+	heapFloat[(r2)] = f5;
+	heap32[(r2+1)] = heap32[(r4+1)];
+	heap32[(r2+2)] = heap32[(r4+2)];
+	r1 = r1 | 1;
+	heap32[(r2+3)] = heap32[(r4+3)];
+	heap8[r0+16] = r1;
+	heap32[(r2+5)] = 1065353216;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	return;
+}
+}
+	f21 = f7-f4;
+	f22 = f3-f0;
+	f23 = f13*f21;
+	f24 = f12*f22;
+	f25 = f11-f8;
+	f21 = f14*f21;
+	f22 = f16*f22;
+	f23 = f23+f24;
+	f24 = f18*f25;
+	f21 = f21+f22;
+	f22 = f19*f25;
+	f23 = f23+f24;
+	f21 = f21+f22;
+	if(f23 <f17) //_LBB568_7
+{
+__label__ = 7;
+}
+else{
+	if(f21 >f23) //_LBB568_7
+{
+__label__ = 7;
+}
+else{
+	r3 = r0 >> 2;
+	heapFloat[(r3)] = f4;
+	heap32[(r3+1)] = heap32[(r2+1)];
+	heap32[(r3+2)] = heap32[(r2+2)];
+	r1 = r1 | 2;
+	heap32[(r3+3)] = heap32[(r2+3)];
+	heap8[r0+16] = r1;
+	heap32[(r3+5)] = 0;
+	heap32[(r3+6)] = 1065353216;
+__label__ = 6;
+}
+}
+_8: do {
+if (__label__ == 7){
+	f22 = f20*f21;
+	f24 = f23*f15;
+	f22 = f22-f24;
+if(!(f22 >f17)) //_LBB568_11
+{
+if(!(f20 <f17)) //_LBB568_11
+{
+if(!(f23 >f17)) //_LBB568_11
+{
+	f0 = f20-f23;
+	f0 = f20/f0;
+	f2 = f13*f0;
+	r3 = r0 >> 2;
+	f2 = f5+f2;
+	f3 = f12*f0;
+	f4 = f18*f0;
+	f1 = f1+f3;
+	heapFloat[(r3)] = f2;
+	f2 = f9+f4;
+	heapFloat[(r3+1)] = f1;
+	heapFloat[(r3+2)] = f2;
+	f1 =                         1;
+	r1 = r1 | 3;
+	heap32[(r3+3)] = 0;
+	f1 = f1-f0;
+	heap8[r0+16] = r1;
+	heapFloat[(r3+5)] = f1;
+	heapFloat[(r3+6)] = f0;
+break _8;
+}
+}
+}
+	f7 = f7-f6;
+	f3 = f3-f2;
+	f24 = f14*f7;
+	f25 = f16*f3;
+	f11 = f11-f10;
+	f7 = f13*f7;
+	f3 = f12*f3;
+	f24 = f24+f25;
+	f25 = f19*f11;
+	f3 = f7+f3;
+	f7 = f18*f11;
+	f11 = f24+f25;
+	f3 = f3+f7;
+if(!(f11 <f17)) //_LBB568_14
+{
+if(!(f3 >f11)) //_LBB568_14
+{
+	r2 = r0 >> 2;
+	heapFloat[(r2)] = f6;
+	heap32[(r2+1)] = heap32[(r3+1)];
+	heap32[(r2+2)] = heap32[(r3+2)];
+	r1 = r1 | 4;
+	heap32[(r2+3)] = heap32[(r3+3)];
+	heap8[r0+16] = r1;
+	heap32[(r2+5)] = 0;
+	heap32[(r2+6)] = 0;
+	heap32[(r2+7)] = 1065353216;
+	heap32[(r2+8)] = 0;
+	return;
+}
+}
+	f7 = f3*f15;
+	f20 = f20*f11;
+	f7 = f7-f20;
+	if(f7 >f17) //_LBB568_19
+{
+__label__ = 19;
+}
+else{
+	if(f15 <f17) //_LBB568_19
+{
+__label__ = 19;
+}
+else{
+	if(f11 >f17) //_LBB568_19
+{
+__label__ = 19;
+}
+else{
+	f0 = f15-f11;
+	f0 = f15/f0;
+	f2 = f14*f0;
+	r2 = r0 >> 2;
+	f2 = f5+f2;
+	f3 = f16*f0;
+	f4 = f19*f0;
+	f1 = f1+f3;
+	heapFloat[(r2)] = f2;
+	f2 = f9+f4;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f2;
+	f1 =                         1;
+	r1 = r1 | 5;
+	heap32[(r2+3)] = 0;
+	f1 = f1-f0;
+	heap8[r0+16] = r1;
+	heapFloat[(r2+5)] = f1;
+	heap32[(r2+6)] = 0;
+__label__ = 18;
+}
+}
+}
+if (__label__ == 19){
+	f15 = f23*f11;
+	f20 = f3*f21;
+	f15 = f15-f20;
+if(!(f15 >f17)) //_LBB568_23
+{
+	f20 = f21-f23;
+if(!(f20 <f17)) //_LBB568_23
+{
+	f3 = f3-f11;
+if(!(f3 <f17)) //_LBB568_23
+{
+	f1 = f20+f3;
+	f1 = f20/f1;
+	f5 = f6-f4;
+	f7 = f2-f0;
+	f5 = f5*f1;
+	f9 = f10-f8;
+	f7 = f7*f1;
+	r2 = r0 >> 2;
+	f5 = f4+f5;
+	f9 = f9*f1;
+	f7 = f0+f7;
+	heapFloat[(r2)] = f5;
+	f5 = f8+f9;
+	heapFloat[(r2+1)] = f7;
+	heapFloat[(r2+2)] = f5;
+	r1 = r1 | 6;
+	heap32[(r2+3)] = 0;
+	f5 =                         1;
+	heap8[r0+16] = r1;
+	f5 = f5-f1;
+	heap32[(r2+5)] = 0;
+	heapFloat[(r2+6)] = f5;
+	heapFloat[(r2+7)] = f1;
+	heap32[(r2+8)] = 0;
+	return;
+}
+}
+}
+	f0 = f15+f7;
+	f0 = f0+f22;
+	f2 =                         1;
+	f0 = f2/f0;
+	f3 = f7*f0;
+	f0 = f22*f0;
+	f4 = f13*f3;
+	f6 = f12*f3;
+	f4 = f5+f4;
+	f5 = f14*f0;
+	r2 = r0 >> 2;
+	f4 = f4+f5;
+	f5 = f18*f3;
+	f1 = f1+f6;
+	f6 = f16*f0;
+	f5 = f9+f5;
+	f7 = f19*f0;
+	f1 = f1+f6;
+	heapFloat[(r2)] = f4;
+	f4 = f5+f7;
+	heapFloat[(r2+1)] = f1;
+	heapFloat[(r2+2)] = f4;
+	f1 = f2-f3;
+	r1 = r1 | 7;
+	heap32[(r2+3)] = 0;
+	f1 = f1-f0;
+	heap8[r0+16] = r1;
+	heapFloat[(r2+5)] = f1;
+	heapFloat[(r2+6)] = f3;
+}
+	heapFloat[(r2+7)] = f0;
+	heap32[(r2+8)] = 0;
+	return;
+}
+} while(0);
+	heap32[(r3+7)] = 0;
+	heap32[(r3+8)] = 0;
+	return;
+}
+
+function _ZN22btVoronoiSimplexSolver19pointOutsideOfPlaneERK9btVector3S2_S2_S2_S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	f0 = heapFloat[(fp+5)];
+	f1 = heapFloat[(fp+8)];
+	f2 = heapFloat[(fp+11)];
+	f3 = heapFloat[(fp+4)];
+	f4 = heapFloat[(fp+10)];
+	f5 = heapFloat[(fp+7)];
+	f6 = heapFloat[(fp+3)];
+	f7 = heapFloat[(fp+6)];
+	f8 = heapFloat[(fp+9)];
+	f1 = f1-f0;
+	f4 = f4-f3;
+	f7 = f7-f6;
+	f2 = f2-f0;
+	f5 = f5-f3;
+	f8 = f8-f6;
+	f9 = heapFloat[(fp+12)];
+	f10 = heapFloat[(fp+13)];
+	f11 = f5*f2;
+	f12 = f1*f4;
+	f1 = f1*f8;
+	f2 = f7*f2;
+	f11 = f11-f12;
+	f9 = f9-f6;
+	f1 = f1-f2;
+	f2 = f10-f3;
+	f10 = heapFloat[(fp+14)];
+	f4 = f7*f4;
+	f5 = f5*f8;
+	f4 = f4-f5;
+	f5 = f10-f0;
+	f7 = f9*f11;
+	f2 = f2*f1;
+	f2 = f7+f2;
+	f5 = f5*f4;
+	f2 = f2+f5;
+	f5 = f2*f2;
+	f7 =   9.9999990510468706e-009;
+	if(f5 <f7) //_LBB569_2
+{
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+else{
+	f5 = heapFloat[(fp)];
+	f7 = heapFloat[(fp+1)];
+	f8 = heapFloat[(fp+2)];
+	f5 = f5-f6;
+	f3 = f7-f3;
+	f5 = f5*f11;
+	f1 = f3*f1;
+	f0 = f8-f0;
+	f1 = f5+f1;
+	f0 = f0*f4;
+	f0 = f1+f0;
+	f0 = f0*f2;
+	f1 =                         0;
+	r0 = f0 < f1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN22btVoronoiSimplexSolver14reduceVerticesERK15btUsageBitfield(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r3 = heap32[(fp+1)];
+	if(r2 >3) //_LBB570_2
+{
+	r2 = heapU8[r3];
+	r4 = r2 & 8;
+	if(r4 ==0) //_LBB570_4
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 3;
+	_ZN22btVoronoiSimplexSolver12removeVertexEi(i7);
+	r2 = heap32[(r1)];
+__label__ = 3;
+}
+else{
+__label__ = 5;
+}
+}
+else{
+__label__ = 3;
+}
+if (__label__ == 3){
+	if(r2 >2) //_LBB570_7
+{
+	r2 = heapU8[r3];
+__label__ = 5;
+}
+else{
+__label__ = 7;
+}
+}
+if (__label__ == 5){
+	r4 = r2 & 4;
+	if(r4 ==0) //_LBB570_10
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 2;
+	_ZN22btVoronoiSimplexSolver12removeVertexEi(i7);
+	r2 = heap32[(r1)];
+__label__ = 7;
+}
+else{
+__label__ = 9;
+}
+}
+if (__label__ == 7){
+	if(r2 >1) //_LBB570_13
+{
+	r2 = heapU8[r3];
+__label__ = 9;
+}
+else{
+__label__ = 11;
+}
+}
+if (__label__ == 9){
+	r4 = r2 & 2;
+	if(r4 ==0) //_LBB570_16
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 1;
+	_ZN22btVoronoiSimplexSolver12removeVertexEi(i7);
+	r2 = heap32[(r1)];
+__label__ = 11;
+}
+else{
+__label__ = 13;
+}
+}
+if (__label__ == 11){
+	if(r2 <1) //_LBB570_20
+{
+__label__ = 14;
+}
+else{
+	r2 = heapU8[r3];
+__label__ = 13;
+}
+}
+if (__label__ == 13){
+	r1 = r2 & 1;
+	if(r1 ==0) //_LBB570_21
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	_ZN22btVoronoiSimplexSolver12removeVertexEi(i7);
+	return;
+}
+}
+	return;
+}
+
+function _ZN22btVoronoiSimplexSolver28updateClosestVectorAndPointsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+var __label__ = 0;
+	i7 = sp + -136;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+356];
+	if(r1 !=0) //_LBB571_2
+{
+	r1 = 0;
+	r2 = r0 >> 2;
+	heap8[r0+352] = r1;
+	heap32[(r2+84)] = 0;
+	heap32[(r2+85)] = 0;
+	heap32[(r2+86)] = 0;
+	heap32[(r2+87)] = 0;
+	r3 = heapU8[r0+332];
+	r4 = r3 & -16;
+	heap8[r0+332] = r4;
+	heap8[r0+356] = r1;
+	r5 = heap32[(r2)];
+_3: do {
+	if(r5 >1) //_LBB571_5
+{
+_5: do {
+	if(r5 ==2) //_LBB571_11
+{
+	f0 =                         0;
+	f1 = heapFloat[(r2+2)];
+	f2 = heapFloat[(r2+6)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+3)];
+	f6 = heapFloat[(r2+7)];
+	f2 = f2-f1;
+	f1 = f0-f1;
+	f4 = f4-f3;
+	f3 = f0-f3;
+	f6 = f6-f5;
+	f5 = f0-f5;
+	f3 = f4*f3;
+	f1 = f2*f1;
+	f1 = f3+f1;
+	f3 = f6*f5;
+	f1 = f1+f3;
+	if(f1 <=f0) //_LBB571_15
+{
+	r1 = r4 | 1;
+	heap8[r0+332] = r1;
+	f1 = f0;
+}
+else{
+	f3 = f4*f4;
+	f2 = f2*f2;
+	f2 = f3+f2;
+	f3 = f6*f6;
+	f2 = f2+f3;
+	if(f1 >=f2) //_LBB571_14
+{
+	f1 =                         1;
+	r1 = r4 | 2;
+	heap8[r0+332] = r1;
+}
+else{
+	f1 = f1/f2;
+	r1 = r4 | 3;
+	heap8[r0+332] = r1;
+}
+}
+	f2 =                         1;
+	f2 = f2-f1;
+	heapFloat[(r2+84)] = f2;
+	heapFloat[(r2+85)] = f1;
+	heap32[(r2+86)] = 0;
+	heap32[(r2+87)] = 0;
+	f2 = heapFloat[(r2+25)];
+	f3 = heapFloat[(r2+21)];
+	f2 = f2-f3;
+	f4 = heapFloat[(r2+26)];
+	f5 = heapFloat[(r2+22)];
+	f4 = f4-f5;
+	f2 = f2*f1;
+	f6 = heapFloat[(r2+27)];
+	f7 = heapFloat[(r2+23)];
+	f6 = f6-f7;
+	f4 = f4*f1;
+	f2 = f3+f2;
+	f3 = f6*f1;
+	f4 = f5+f4;
+	heapFloat[(r2+61)] = f2;
+	f3 = f7+f3;
+	heapFloat[(r2+62)] = f4;
+	heapFloat[(r2+63)] = f3;
+	heap32[(r2+64)] = 0;
+	f5 = heapFloat[(r2+45)];
+	f6 = heapFloat[(r2+41)];
+	f5 = f5-f6;
+	f7 = heapFloat[(r2+46)];
+	f8 = heapFloat[(r2+42)];
+	f7 = f7-f8;
+	f5 = f5*f1;
+	f9 = heapFloat[(r2+47)];
+	f10 = heapFloat[(r2+43)];
+	f9 = f9-f10;
+	f7 = f7*f1;
+	f5 = f6+f5;
+	f1 = f9*f1;
+	f6 = f8+f7;
+	heapFloat[(r2+65)] = f5;
+	f1 = f10+f1;
+	heapFloat[(r2+66)] = f6;
+	heapFloat[(r2+67)] = f1;
+	f2 = f2-f5;
+	heap32[(r2+68)] = 0;
+	f4 = f4-f6;
+	heapFloat[(r2+69)] = f2;
+	f1 = f3-f1;
+	heapFloat[(r2+70)] = f4;
+	heapFloat[(r2+71)] = f1;
+	heap32[(r2+72)] = 0;
+	r1 = (r0 + 332)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	_ZN22btVoronoiSimplexSolver14reduceVerticesERK15btUsageBitfield(i7);
+	f1 = heapFloat[(r2+84)];
+	if(f1 >=f0) //_LBB571_18
+{
+	f0 = heapFloat[(r2+85)];
+	f1 =                         0;
+if(!(f0 <f1)) //_LBB571_17
+{
+	f0 = heapFloat[(r2+86)];
+if(!(f0 <f1)) //_LBB571_17
+{
+	f0 = heapFloat[(r2+87)];
+	r1 = f0 >= f1;
+	r1 = r1 & 1;
+break _5;
+}
+}
+}
+	r1 = 0;
+}
+else{
+	if(r5 ==3) //_LBB571_22
+{
+	r1 = sp + -56;
+	r3 = r1 >> 2;
+	heap32[(fp+-14)] = 0;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+	r3 = (r0 + 4)|0;
+	r4 = (r0 + 20)|0;
+	r5 = (r0 + 36)|0;
+	r6 = (r0 + 316)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r6;
+	_ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(i7);
+	f0 = heapFloat[(r2+85)];
+	f1 = heapFloat[(r2+25)];
+	f2 = heapFloat[(r2+84)];
+	f3 = heapFloat[(r2+21)];
+	f4 = heapFloat[(r2+26)];
+	f5 = heapFloat[(r2+22)];
+	f3 = f3*f2;
+	f1 = f1*f0;
+	f6 = heapFloat[(r2+86)];
+	f7 = heapFloat[(r2+29)];
+	f8 = heapFloat[(r2+31)];
+	f9 = heapFloat[(r2+30)];
+	f10 = heapFloat[(r2+27)];
+	f11 = heapFloat[(r2+23)];
+	f5 = f5*f2;
+	f4 = f4*f0;
+	f1 = f3+f1;
+	f3 = f7*f6;
+	f7 = f11*f2;
+	f10 = f10*f0;
+	f4 = f5+f4;
+	f5 = f9*f6;
+	f1 = f1+f3;
+	f3 = f7+f10;
+	f7 = f8*f6;
+	f4 = f4+f5;
+	heapFloat[(r2+61)] = f1;
+	f3 = f3+f7;
+	heapFloat[(r2+62)] = f4;
+	heapFloat[(r2+63)] = f3;
+	heap32[(r2+64)] = 0;
+	f5 = heapFloat[(r2+45)];
+	f7 = heapFloat[(r2+41)];
+	f8 = heapFloat[(r2+49)];
+	f9 = heapFloat[(r2+46)];
+	f10 = heapFloat[(r2+42)];
+	f7 = f7*f2;
+	f5 = f5*f0;
+	f11 = heapFloat[(r2+51)];
+	f12 = heapFloat[(r2+50)];
+	f13 = heapFloat[(r2+47)];
+	f14 = heapFloat[(r2+43)];
+	f10 = f10*f2;
+	f9 = f9*f0;
+	f5 = f7+f5;
+	f7 = f8*f6;
+	f5 = f5+f7;
+	f2 = f14*f2;
+	f0 = f13*f0;
+	f7 = f10+f9;
+	f8 = f12*f6;
+	f7 = f7+f8;
+	heapFloat[(r2+65)] = f5;
+	f0 = f2+f0;
+	f2 = f11*f6;
+	f0 = f0+f2;
+	heapFloat[(r2+66)] = f7;
+	heapFloat[(r2+67)] = f0;
+	f1 = f1-f5;
+	heap32[(r2+68)] = 0;
+	f2 = f4-f7;
+	heapFloat[(r2+69)] = f1;
+	f0 = f3-f0;
+	heapFloat[(r2+70)] = f2;
+	heapFloat[(r2+71)] = f0;
+	heap32[(r2+72)] = 0;
+	r1 = (r0 + 332)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	_ZN22btVoronoiSimplexSolver14reduceVerticesERK15btUsageBitfield(i7);
+	f0 = heapFloat[(r2+84)];
+	f1 =                         0;
+	if(f0 >=f1) //_LBB571_24
+{
+	f0 = heapFloat[(r2+85)];
+if(!(f0 <f1)) //_LBB571_23
+{
+	f0 = heapFloat[(r2+86)];
+if(!(f0 <f1)) //_LBB571_23
+{
+	f0 = heapFloat[(r2+87)];
+	r1 = f0 >= f1;
+	r1 = r1 & 1;
+break _5;
+}
+}
+}
+	r1 = 0;
+}
+else{
+	if(r5 ==4) //_LBB571_28
+{
+	r4 = sp + -72;
+	r5 = r4 >> 2;
+	heap32[(fp+-18)] = 0;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap8[sp+-24] = r1;
+	heap32[(r2+79)] = 0;
+	heap32[(r2+80)] = 0;
+	heap32[(r2+81)] = 0;
+	r3 = r3 | 15;
+	heap32[(r2+82)] = 0;
+	heap8[r0+332] = r3;
+	f0 = heapFloat[(r2+11)];
+	f1 = heapFloat[(r2+7)];
+	f2 = heapFloat[(r2+15)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r2+2)];
+	f5 = heapFloat[(r2+3)];
+	f6 = heapFloat[(r2+5)];
+	f7 = heapFloat[(r2+6)];
+	f8 = heapFloat[(r2+9)];
+	f9 = heapFloat[(r2+10)];
+	f10 = heapFloat[(r2+13)];
+	f11 = heapFloat[(r2+14)];
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heapFloat[(g0+3)] = f3;
+	heapFloat[(g0+4)] = f4;
+	heapFloat[(g0+5)] = f5;
+	heapFloat[(g0+6)] = f6;
+	heapFloat[(g0+7)] = f7;
+	heapFloat[(g0+8)] = f1;
+	heapFloat[(g0+9)] = f8;
+	heapFloat[(g0+10)] = f9;
+	heapFloat[(g0+11)] = f0;
+	heapFloat[(g0+12)] = f10;
+	heapFloat[(g0+13)] = f11;
+	heapFloat[(g0+14)] = f2;
+	_ZN22btVoronoiSimplexSolver19pointOutsideOfPlaneERK9btVector3S2_S2_S2_S2_(i7);
+	r3 = r_g0;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heapFloat[(g0+3)] = f3;
+	heapFloat[(g0+4)] = f4;
+	heapFloat[(g0+5)] = f5;
+	heapFloat[(g0+6)] = f8;
+	heapFloat[(g0+7)] = f9;
+	heapFloat[(g0+8)] = f0;
+	heapFloat[(g0+9)] = f10;
+	heapFloat[(g0+10)] = f11;
+	heapFloat[(g0+11)] = f2;
+	heapFloat[(g0+12)] = f6;
+	heapFloat[(g0+13)] = f7;
+	heapFloat[(g0+14)] = f1;
+	_ZN22btVoronoiSimplexSolver19pointOutsideOfPlaneERK9btVector3S2_S2_S2_S2_(i7);
+	r6 = r_g0;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heapFloat[(g0+3)] = f3;
+	heapFloat[(g0+4)] = f4;
+	heapFloat[(g0+5)] = f5;
+	heapFloat[(g0+6)] = f10;
+	heapFloat[(g0+7)] = f11;
+	heapFloat[(g0+8)] = f2;
+	heapFloat[(g0+9)] = f6;
+	heapFloat[(g0+10)] = f7;
+	heapFloat[(g0+11)] = f1;
+	heapFloat[(g0+12)] = f8;
+	heapFloat[(g0+13)] = f9;
+	heapFloat[(g0+14)] = f0;
+	_ZN22btVoronoiSimplexSolver19pointOutsideOfPlaneERK9btVector3S2_S2_S2_S2_(i7);
+	r7 = r_g0;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heapFloat[(g0+3)] = f6;
+	heapFloat[(g0+4)] = f7;
+	heapFloat[(g0+5)] = f1;
+	heapFloat[(g0+6)] = f10;
+	heapFloat[(g0+7)] = f11;
+	heapFloat[(g0+8)] = f2;
+	heapFloat[(g0+9)] = f8;
+	heapFloat[(g0+10)] = f9;
+	heapFloat[(g0+11)] = f0;
+	heapFloat[(g0+12)] = f3;
+	heapFloat[(g0+13)] = f4;
+	heapFloat[(g0+14)] = f5;
+	r8 = r6 | r3;
+	_ZN22btVoronoiSimplexSolver19pointOutsideOfPlaneERK9btVector3S2_S2_S2_S2_(i7);
+	r9 = r_g0;
+if(!(r8 <0)) //_LBB571_52
+{
+	r10 = r9 | r7;
+if(!(r10 <0)) //_LBB571_52
+{
+	r8 = r8 | r7;
+	r8 = r8 | r9;
+	if(r8 ==0) //_LBB571_53
+{
+	r1 = 1;
+	heap8[r0+312] = r1;
+	heap32[(r2+69)] = 0;
+	heap32[(r2+70)] = 0;
+	heap32[(r2+71)] = 0;
+	heap32[(r2+72)] = 0;
+	r_g0 = r1;
+	return;
+}
+else{
+	r8 = (r0 + 4)|0;
+	r10 = (r0 + 20)|0;
+	r11 = (r0 + 36)|0;
+	r12 = (r0 + 52)|0;
+	if(r3 !=0) //_LBB571_33
+{
+	r3 = sp + -40;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r11;
+	heap32[(g0+4)] = r3;
+	_ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(i7);
+	r3 = r3 >> 2;
+	f1 = heapFloat[(fp+-10)];
+	f0 = heapFloat[(fp+-18)];
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r5+1)];
+	f0 = f1-f0;
+	f3 = f2-f3;
+	f4 = heapFloat[(r3+2)];
+	f5 = heapFloat[(r5+2)];
+	f5 = f4-f5;
+	f0 = f0*f0;
+	f3 = f3*f3;
+	f0 = f0+f3;
+	f3 = f5*f5;
+	f0 = f0+f3;
+	f3 =   3.4028234663852886e+038;
+	if(f0 >=f3) //_LBB571_32
+{
+__label__ = 31;
+}
+else{
+	f3 = heapFloat[(r3+3)];
+	heapFloat[(r2+79)] = f1;
+	heapFloat[(r2+80)] = f2;
+	heapFloat[(r2+81)] = f4;
+	heapFloat[(r2+82)] = f3;
+	r13 = heapU8[sp+-24];
+	r14 = heapU8[r0+332];
+	r15 = r13 & 1;
+	r14 = r14 & 240;
+	r14 = r15 | r14;
+	r15 = r13 & 2;
+	r14 = r14 | r15;
+	r13 = r13 & 4;
+	r13 = r14 | r13;
+	heap8[r0+332] = r13;
+	f1 = heapFloat[(r3+7)];
+	f2 = heapFloat[(r3+6)];
+	heap32[(r2+84)] = heap32[(r3+5)];
+	heapFloat[(r2+85)] = f2;
+	heapFloat[(r2+86)] = f1;
+	heap32[(r2+87)] = 0;
+__label__ = 34;
+}
+}
+else{
+__label__ = 31;
+}
+if (__label__ == 31){
+	f0 =   3.4028234663852886e+038;
+}
+	if(r6 !=0) //_LBB571_37
+{
+	r3 = sp + -40;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r11;
+	heap32[(g0+3)] = r12;
+	heap32[(g0+4)] = r3;
+	_ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(i7);
+	r3 = r3 >> 2;
+	f1 = heapFloat[(fp+-10)];
+	f2 = heapFloat[(fp+-18)];
+	f3 = heapFloat[(r3+1)];
+	f4 = heapFloat[(r5+1)];
+	f2 = f1-f2;
+	f4 = f3-f4;
+	f5 = heapFloat[(r3+2)];
+	f6 = heapFloat[(r5+2)];
+	f6 = f5-f6;
+	f2 = f2*f2;
+	f4 = f4*f4;
+	f2 = f2+f4;
+	f4 = f6*f6;
+	f2 = f2+f4;
+if(!(f2 >=f0)) //_LBB571_36
+{
+	f0 = heapFloat[(r3+3)];
+	heapFloat[(r2+79)] = f1;
+	heapFloat[(r2+80)] = f3;
+	heapFloat[(r2+81)] = f5;
+	heapFloat[(r2+82)] = f0;
+	r6 = heapU8[sp+-24];
+	r13 = heapU8[r0+332];
+	r14 = r6 << 1;
+	r6 = r6 & 1;
+	r13 = r13 & 240;
+	r6 = r6 | r13;
+	r13 = r14 & 4;
+	r6 = r6 | r13;
+	r13 = r14 & 8;
+	r6 = r6 | r13;
+	heap8[r0+332] = r6;
+	f0 = heapFloat[(r3+7)];
+	f1 = heapFloat[(r3+6)];
+	heap32[(r2+84)] = heap32[(r3+5)];
+	heap32[(r2+85)] = 0;
+	heapFloat[(r2+86)] = f1;
+	heapFloat[(r2+87)] = f0;
+	f0 = f2;
+}
+}
+	if(r7 !=0) //_LBB571_41
+{
+	r3 = sp + -40;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r3;
+	_ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(i7);
+	r3 = r3 >> 2;
+	f1 = heapFloat[(fp+-10)];
+	f2 = heapFloat[(fp+-18)];
+	f3 = heapFloat[(r3+1)];
+	f4 = heapFloat[(r5+1)];
+	f2 = f1-f2;
+	f4 = f3-f4;
+	f5 = heapFloat[(r3+2)];
+	f6 = heapFloat[(r5+2)];
+	f6 = f5-f6;
+	f2 = f2*f2;
+	f4 = f4*f4;
+	f2 = f2+f4;
+	f4 = f6*f6;
+	f2 = f2+f4;
+if(!(f2 >=f0)) //_LBB571_40
+{
+	f0 = heapFloat[(r3+3)];
+	heapFloat[(r2+79)] = f1;
+	heapFloat[(r2+80)] = f3;
+	heapFloat[(r2+81)] = f5;
+	heapFloat[(r2+82)] = f0;
+	r6 = heapU8[sp+-24];
+	r7 = heapU8[r0+332];
+	r8 = r6 >>> 1;
+	r13 = r6 & 1;
+	r7 = r7 & 240;
+	r6 = r6 << 2;
+	r7 = r13 | r7;
+	r8 = r8 & 2;
+	r7 = r7 | r8;
+	r6 = r6 & 8;
+	r6 = r7 | r6;
+	heap8[r0+332] = r6;
+	f0 = heapFloat[(r3+6)];
+	f1 = heapFloat[(r3+7)];
+	heap32[(r2+84)] = heap32[(r3+5)];
+	heapFloat[(r2+85)] = f1;
+	heap32[(r2+86)] = 0;
+	heapFloat[(r2+87)] = f0;
+	f0 = f2;
+}
+}
+if(!(r9 ==0)) //_LBB571_46
+{
+	r3 = sp + -40;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r11;
+	heap32[(g0+4)] = r3;
+	_ZN22btVoronoiSimplexSolver22closestPtPointTriangleERK9btVector3S2_S2_S2_R25btSubSimplexClosestResult(i7);
+	r3 = r3 >> 2;
+	f1 = heapFloat[(fp+-10)];
+	f2 = heapFloat[(fp+-18)];
+	f3 = heapFloat[(r3+1)];
+	f4 = heapFloat[(r5+1)];
+	f2 = f1-f2;
+	f4 = f3-f4;
+	f5 = heapFloat[(r3+2)];
+	f6 = heapFloat[(r5+2)];
+	f6 = f5-f6;
+	f2 = f2*f2;
+	f4 = f4*f4;
+	f2 = f2+f4;
+	f4 = f6*f6;
+	f2 = f2+f4;
+if(!(f2 >=f0)) //_LBB571_46
+{
+	f0 = heapFloat[(r3+3)];
+	heapFloat[(r2+79)] = f1;
+	heapFloat[(r2+80)] = f3;
+	heapFloat[(r2+81)] = f5;
+	heapFloat[(r2+82)] = f0;
+	r4 = heapU8[sp+-24];
+	r5 = heapU8[r0+332];
+	r6 = r4 << 1;
+	r6 = r6 & 2;
+	r5 = r5 & 240;
+	r7 = r4 << 2;
+	r5 = r6 | r5;
+	r4 = r4 & 4;
+	r4 = r5 | r4;
+	r5 = r7 & 8;
+	r4 = r4 | r5;
+	heap8[r0+332] = r4;
+	f0 = heapFloat[(r3+6)];
+	f1 = heapFloat[(r3+7)];
+	f2 = heapFloat[(r3+5)];
+	heap32[(r2+84)] = 0;
+	heapFloat[(r2+85)] = f2;
+	heapFloat[(r2+86)] = f1;
+	heapFloat[(r2+87)] = f0;
+}
+}
+	f0 = heapFloat[(r2+85)];
+	f1 = heapFloat[(r2+25)];
+	f2 = heapFloat[(r2+84)];
+	f3 = heapFloat[(r2+21)];
+	f4 = heapFloat[(r2+26)];
+	f5 = heapFloat[(r2+22)];
+	f3 = f3*f2;
+	f1 = f1*f0;
+	f6 = heapFloat[(r2+86)];
+	f7 = heapFloat[(r2+29)];
+	f8 = heapFloat[(r2+30)];
+	f9 = heapFloat[(r2+27)];
+	f10 = heapFloat[(r2+23)];
+	f5 = f5*f2;
+	f4 = f4*f0;
+	f1 = f3+f1;
+	f3 = f7*f6;
+	f7 = heapFloat[(r2+87)];
+	f11 = heapFloat[(r2+33)];
+	f12 = heapFloat[(r2+35)];
+	f13 = heapFloat[(r2+34)];
+	f14 = heapFloat[(r2+31)];
+	f10 = f10*f2;
+	f9 = f9*f0;
+	f4 = f5+f4;
+	f5 = f8*f6;
+	f1 = f1+f3;
+	f3 = f11*f7;
+	f8 = f10+f9;
+	f9 = f14*f6;
+	f4 = f4+f5;
+	f5 = f13*f7;
+	f1 = f1+f3;
+	f3 = f8+f9;
+	f8 = f12*f7;
+	f4 = f4+f5;
+	heapFloat[(r2+61)] = f1;
+	f3 = f3+f8;
+	heapFloat[(r2+62)] = f4;
+	heapFloat[(r2+63)] = f3;
+	heap32[(r2+64)] = 0;
+	f5 = heapFloat[(r2+45)];
+	f8 = heapFloat[(r2+41)];
+	f9 = heapFloat[(r2+49)];
+	f10 = heapFloat[(r2+46)];
+	f11 = heapFloat[(r2+42)];
+	f8 = f8*f2;
+	f5 = f5*f0;
+	f12 = heapFloat[(r2+53)];
+	f13 = heapFloat[(r2+50)];
+	f14 = heapFloat[(r2+47)];
+	f15 = heapFloat[(r2+43)];
+	f11 = f11*f2;
+	f10 = f10*f0;
+	f5 = f8+f5;
+	f8 = f9*f6;
+	f9 = heapFloat[(r2+55)];
+	f16 = heapFloat[(r2+54)];
+	f17 = heapFloat[(r2+51)];
+	f2 = f15*f2;
+	f0 = f14*f0;
+	f10 = f11+f10;
+	f11 = f13*f6;
+	f5 = f5+f8;
+	f8 = f12*f7;
+	f5 = f5+f8;
+	f0 = f2+f0;
+	f2 = f17*f6;
+	f6 = f10+f11;
+	f8 = f16*f7;
+	f6 = f6+f8;
+	heapFloat[(r2+65)] = f5;
+	f0 = f0+f2;
+	f2 = f9*f7;
+	f0 = f0+f2;
+	heapFloat[(r2+66)] = f6;
+	heapFloat[(r2+67)] = f0;
+	f1 = f1-f5;
+	heap32[(r2+68)] = 0;
+	f2 = f4-f6;
+	heapFloat[(r2+69)] = f1;
+	f0 = f3-f0;
+	heapFloat[(r2+70)] = f2;
+	heapFloat[(r2+71)] = f0;
+	heap32[(r2+72)] = 0;
+	r3 = (r0 + 332)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	_ZN22btVoronoiSimplexSolver14reduceVerticesERK15btUsageBitfield(i7);
+	f0 = heapFloat[(r2+84)];
+	f1 =                         0;
+	if(f0 >=f1) //_LBB571_48
+{
+	f0 = heapFloat[(r2+85)];
+	if(f0 <f1) //_LBB571_47
+{
+break _5;
+}
+else{
+	f0 = heapFloat[(r2+86)];
+	if(f0 <f1) //_LBB571_47
+{
+break _5;
+}
+else{
+	f0 = heapFloat[(r2+87)];
+	r1 = f0 >= f1;
+	r1 = r1 & 1;
+break _5;
+}
+}
+}
+else{
+break _5;
+}
+}
+}
+}
+	r2 = 1;
+	heap8[r0+352] = r2;
+	r2 = 0;
+	heap8[r0+312] = r2;
+	r_g0 = r2;
+	return;
+}
+else{
+__label__ = 8;
+break _3;
+}
+}
+}
+} while(0);
+	heap8[r0+312] = r1;
+	r0 = r1 & 255;
+	r_g0 = r0;
+	return;
+}
+else{
+	if(r5 ==0) //_LBB571_8
+{
+__label__ = 8;
+}
+else{
+	if(r5 ==1) //_LBB571_10
+{
+	f0 = heapFloat[(r2+21)];
+	heapFloat[(r2+61)] = f0;
+	f1 = heapFloat[(r2+22)];
+	heapFloat[(r2+62)] = f1;
+	f2 = heapFloat[(r2+23)];
+	heapFloat[(r2+63)] = f2;
+	heap32[(r2+64)] = heap32[(r2+24)];
+	f3 = heapFloat[(r2+41)];
+	heapFloat[(r2+65)] = f3;
+	f4 = heapFloat[(r2+42)];
+	heapFloat[(r2+66)] = f4;
+	f5 = heapFloat[(r2+43)];
+	heapFloat[(r2+67)] = f5;
+	f0 = f0-f3;
+	heap32[(r2+68)] = heap32[(r2+44)];
+	f1 = f1-f4;
+	heapFloat[(r2+69)] = f0;
+	f0 = f2-f5;
+	heapFloat[(r2+70)] = f1;
+	heapFloat[(r2+71)] = f0;
+	r1 = 0;
+	heap32[(r2+72)] = 0;
+	heap8[r0+352] = r1;
+	heap8[r0+332] = r4;
+	heap32[(r2+84)] = 1065353216;
+	heap32[(r2+85)] = 0;
+	heap32[(r2+86)] = 0;
+	heap32[(r2+87)] = 0;
+	r1 = 1;
+__label__ = 9;
+}
+else{
+__label__ = 8;
+}
+}
+}
+} while(0);
+if (__label__ == 8){
+	r1 = 0;
+}
+	heap8[r0+312] = r1;
+	r_g0 = r1;
+	return;
+}
+else{
+	r0 = heapU8[r0+312];
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN16btCollisionWorld27ClosestConvexResultCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN16btCollisionWorld27ClosestConvexResultCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN16btCollisionWorld27ClosestConvexResultCallback15addSingleResultERNS_17LocalConvexResultEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp)];
+	f0 = heapFloat[(r0+10)];
+	r1 = r1 >> 2;
+	f1 = heapFloat[(r1+1)];
+	if(f0 <=f1) //_LBB574_2
+{
+	r2 = heap32[(fp+2)];
+	heapFloat[(r1+1)] = f0;
+	r3 = heap32[(r0)];
+	heap32[(r1+19)] = r3;
+	if(r2 ==0) //_LBB574_4
+{
+	r2 = r3 >> 2;
+	f0 = heapFloat[(r0+2)];
+	f1 = heapFloat[(r2+1)];
+	f2 = heapFloat[(r0+3)];
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r0+4)];
+	f7 = heapFloat[(r2+3)];
+	f8 = heapFloat[(r2+9)];
+	f9 = heapFloat[(r2+10)];
+	f10 = heapFloat[(r2+11)];
+	f11 = heapFloat[(r2+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f11*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f10*f6;
+	f3 = f4+f5;
+	heapFloat[(r1+11)] = f1;
+	f0 = f0+f2;
+	heapFloat[(r1+12)] = f3;
+	heapFloat[(r1+13)] = f0;
+	heap32[(r1+14)] = 0;
+}
+else{
+	heap32[(r1+11)] = heap32[(r0+2)];
+	heap32[(r1+12)] = heap32[(r0+3)];
+	heap32[(r1+13)] = heap32[(r0+4)];
+	heap32[(r1+14)] = heap32[(r0+5)];
+}
+	heap32[(r1+15)] = heap32[(r0+6)];
+	heap32[(r1+16)] = heap32[(r0+7)];
+	heap32[(r1+17)] = heap32[(r0+8)];
+	heap32[(r1+18)] = heap32[(r0+9)];
+	f0 = heapFloat[(r0+10)];
+	f_g0 = f0;
+	return;
+}
+else{
+	r0 = _2E_str36;
+	r1 = _2E_str4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 384;
+	_assert(i7);
+}
+}
+
+function _ZNK21btConeTwistConstraint28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 204;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK21btConeTwistConstraint9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	_ZNK17btTypedConstraint9serializeEPvP12btSerializer(i7);
+	heap32[(r1+11)] = heap32[(r0+72)];
+	heap32[(r1+12)] = heap32[(r0+73)];
+	heap32[(r1+13)] = heap32[(r0+74)];
+	heap32[(r1+14)] = heap32[(r0+75)];
+	heap32[(r1+15)] = heap32[(r0+76)];
+	heap32[(r1+16)] = heap32[(r0+77)];
+	heap32[(r1+17)] = heap32[(r0+78)];
+	heap32[(r1+18)] = heap32[(r0+79)];
+	heap32[(r1+19)] = heap32[(r0+80)];
+	heap32[(r1+20)] = heap32[(r0+81)];
+	heap32[(r1+21)] = heap32[(r0+82)];
+	heap32[(r1+22)] = heap32[(r0+83)];
+	heap32[(r1+23)] = heap32[(r0+84)];
+	heap32[(r1+24)] = heap32[(r0+85)];
+	heap32[(r1+25)] = heap32[(r0+86)];
+	heap32[(r1+26)] = heap32[(r0+87)];
+	heap32[(r1+27)] = heap32[(r0+88)];
+	heap32[(r1+28)] = heap32[(r0+89)];
+	heap32[(r1+29)] = heap32[(r0+90)];
+	heap32[(r1+30)] = heap32[(r0+91)];
+	heap32[(r1+31)] = heap32[(r0+92)];
+	heap32[(r1+32)] = heap32[(r0+93)];
+	heap32[(r1+33)] = heap32[(r0+94)];
+	heap32[(r1+34)] = heap32[(r0+95)];
+	heap32[(r1+35)] = heap32[(r0+96)];
+	heap32[(r1+36)] = heap32[(r0+97)];
+	heap32[(r1+37)] = heap32[(r0+98)];
+	heap32[(r1+38)] = heap32[(r0+99)];
+	heap32[(r1+39)] = heap32[(r0+100)];
+	heap32[(r1+40)] = heap32[(r0+101)];
+	heap32[(r1+41)] = heap32[(r0+102)];
+	heap32[(r1+42)] = heap32[(r0+103)];
+	heap32[(r1+43)] = heap32[(r0+108)];
+	heap32[(r1+44)] = heap32[(r0+109)];
+	heap32[(r1+45)] = heap32[(r0+110)];
+	heap32[(r1+46)] = heap32[(r0+104)];
+	heap32[(r1+47)] = heap32[(r0+105)];
+	heap32[(r1+48)] = heap32[(r0+106)];
+	heap32[(r1+49)] = heap32[(r0+107)];
+	r0 = _2E_str239;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN21btConeTwistConstraintD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btConeTwistConstraint;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN21btConeTwistConstraintD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV21btConeTwistConstraint;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN21btConeTwistConstraint13buildJacobianEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -216;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+515];
+if(!(r1 ==0)) //_LBB579_14
+{
+	r1 = r0 >> 2;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+127)] = 0;
+	heap32[(r1+126)] = 0;
+	heap32[(r1+141)] = 0;
+	heap32[(r1+142)] = 0;
+	heap32[(r1+143)] = 0;
+	heap32[(r1+144)] = 0;
+	r2 = heapU8[r0+512];
+if(!(r2 !=0)) //_LBB579_13
+{
+	r2 = heap32[(r1+6)];
+	r3 = heap32[(r1+5)];
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r2+5)];
+	f1 = heapFloat[(r1+100)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r2+6)];
+	f4 = heapFloat[(r1+101)];
+	f5 = heapFloat[(r2+2)];
+	f6 = heapFloat[(r3+5)];
+	f7 = heapFloat[(r1+84)];
+	f8 = heapFloat[(r3+1)];
+	f9 = heapFloat[(r3+6)];
+	f10 = heapFloat[(r1+85)];
+	f11 = heapFloat[(r3+2)];
+	f12 = heapFloat[(r2+9)];
+	f13 = heapFloat[(r2+10)];
+	f14 = heapFloat[(r3+9)];
+	f15 = heapFloat[(r3+10)];
+	f0 = f0*f1;
+	f3 = f3*f4;
+	f16 = heapFloat[(r2+7)];
+	f17 = heapFloat[(r1+102)];
+	f18 = heapFloat[(r2+3)];
+	f6 = f6*f7;
+	f9 = f9*f10;
+	f19 = heapFloat[(r3+7)];
+	f20 = heapFloat[(r1+86)];
+	f21 = heapFloat[(r3+3)];
+	f2 = f2*f1;
+	f5 = f5*f4;
+	f8 = f8*f7;
+	f11 = f11*f10;
+	f22 = heapFloat[(r2+11)];
+	f23 = heapFloat[(r3+11)];
+	f1 = f12*f1;
+	f4 = f13*f4;
+	f7 = f14*f7;
+	f10 = f15*f10;
+	f0 = f0+f3;
+	f3 = f16*f17;
+	f6 = f6+f9;
+	f9 = f19*f20;
+	f2 = f2+f5;
+	f5 = f18*f17;
+	f8 = f8+f11;
+	f11 = f21*f20;
+	f1 = f1+f4;
+	f4 = f22*f17;
+	f7 = f7+f10;
+	f10 = f23*f20;
+	f0 = f0+f3;
+	f3 = heapFloat[(r2+14)];
+	f6 = f6+f9;
+	f9 = heapFloat[(r3+14)];
+	f2 = f2+f5;
+	f5 = heapFloat[(r2+13)];
+	f8 = f8+f11;
+	f11 = heapFloat[(r3+13)];
+	f0 = f0+f3;
+	f3 = f6+f9;
+	f2 = f2+f5;
+	f5 = f8+f11;
+	f1 = f1+f4;
+	f4 = heapFloat[(r2+15)];
+	f6 = f7+f10;
+	f7 = heapFloat[(r3+15)];
+	f8 = f0-f3;
+	f9 = f2-f5;
+	f1 = f1+f4;
+	f4 = f6+f7;
+	f6 = f1-f4;
+	f7 = f9*f9;
+	f10 = f8*f8;
+	f7 = f7+f10;
+	f10 = f6*f6;
+	f7 = f7+f10;
+	f10 =   1.1920928955078125e-007;
+	if(f7 >f10) //_LBB579_4
+{
+	heapFloat[(g0)] = f7;
+	f10 =                         1;
+	sqrtf(i7);
+	f11 = f10/f_g0;
+	r2 = sp + -176;
+	f7 = f9*f11;
+	f8 = f8*f11;
+	r3 = r2 >> 2;
+	heapFloat[(fp+-44)] = f7;
+	f6 = f6*f11;
+	heapFloat[(r3+1)] = f8;
+	r2 = (r2 + 8)|0;
+	heapFloat[(r3+2)] = f6;
+	heap32[(r3+3)] = 0;
+	f9 =                         0;
+	if(f6 <f9) //_LBB579_6
+{
+	f9 = -f6;
+}
+else{
+	f9 = f6;
+}
+	f11 =       0.70710676908493042;
+	if(f9 >f11) //_LBB579_9
+{
+	f7 = f8*f8;
+	f8 = f6*f6;
+	f7 = f7+f8;
+	heapFloat[(g0)] = f7;
+	sqrtf(i7);
+	heap32[(r3+4)] = 0;
+	f6 = heapFloat[(r3+2)];
+	f8 = f10/f_g0;
+	f6 = -f6;
+	f6 = f8*f6;
+	heapFloat[(r3+5)] = f6;
+	f9 = heapFloat[(r3+1)];
+	f9 = f9*f8;
+	f7 = f7*f8;
+	heapFloat[(r3+6)] = f9;
+	heapFloat[(r3+8)] = f7;
+	f7 = heapFloat[(fp+-44)];
+	f8 = -f7;
+	f8 = f9*f8;
+	f7 = f7*f6;
+	heapFloat[(r3+9)] = f8;
+	heapFloat[(r3+10)] = f7;
+__label__ = 10;
+}
+else{
+__label__ = 9;
+}
+}
+else{
+	r2 = sp + -176;
+	r3 = r2 >> 2;
+	heap32[(fp+-44)] = 1065353216;
+	heap32[(r3+1)] = 0;
+	r2 = (r2 + 8)|0;
+	f7 =                         1;
+	f8 =                         0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+__label__ = 9;
+}
+if (__label__ == 9){
+	f6 = f7*f7;
+	f7 = f8*f8;
+	f6 = f6+f7;
+	r3 = sp + -176;
+	heapFloat[(g0)] = f6;
+	r3 = r3 >> 2;
+	sqrtf(i7);
+	f8 =                         1;
+	f9 = heapFloat[(r3+1)];
+	f7 = f8/f_g0;
+	f8 = -f9;
+	f8 = f7*f8;
+	heapFloat[(r3+4)] = f8;
+	f9 = heapFloat[(fp+-44)];
+	f9 = f9*f7;
+	heapFloat[(r3+5)] = f9;
+	r2 = r2 >> 2;
+	heap32[(r3+6)] = 0;
+	f10 = heapFloat[(r2)];
+	f11 = -f10;
+	f9 = f9*f11;
+	f8 = f10*f8;
+	heapFloat[(r3+8)] = f9;
+	f6 = f6*f7;
+	heapFloat[(r3+9)] = f8;
+	heapFloat[(r3+10)] = f6;
+}
+	r2 = (r0 + 36)|0;
+	r3 = 0;
+_16: while(true){
+	r4 = heap32[(r1+5)];
+	r5 = r4 >> 2;
+	r6 = sp + -128;
+	r7 = r6 >> 2;
+	heap32[(fp+-32)] = heap32[(r5+1)];
+	heap32[(r7+1)] = heap32[(r5+5)];
+	heap32[(r7+2)] = heap32[(r5+9)];
+	heap32[(r7+3)] = 0;
+	heap32[(r7+4)] = heap32[(r5+2)];
+	heap32[(r7+5)] = heap32[(r5+6)];
+	heap32[(r7+6)] = heap32[(r5+10)];
+	heap32[(r7+7)] = 0;
+	heap32[(r7+8)] = heap32[(r5+3)];
+	heap32[(r7+9)] = heap32[(r5+7)];
+	heap32[(r7+10)] = heap32[(r5+11)];
+	heap32[(r7+11)] = 0;
+	r7 = heap32[(r1+6)];
+	r8 = sp + -80;
+	r9 = r7 >> 2;
+	r10 = r8 >> 2;
+	heap32[(fp+-20)] = heap32[(r9+1)];
+	heap32[(r10+1)] = heap32[(r9+5)];
+	heap32[(r10+2)] = heap32[(r9+9)];
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = heap32[(r9+2)];
+	heap32[(r10+5)] = heap32[(r9+6)];
+	heap32[(r10+6)] = heap32[(r9+10)];
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = heap32[(r9+3)];
+	heap32[(r10+9)] = heap32[(r9+7)];
+	heap32[(r10+10)] = heap32[(r9+11)];
+	heap32[(r10+11)] = 0;
+	f6 = heapFloat[(r5+13)];
+	f7 = heapFloat[(r5+15)];
+	f8 = heapFloat[(r5+14)];
+	r10 = sp + -32;
+	f6 = f5-f6;
+	r11 = r10 >> 2;
+	f8 = f3-f8;
+	heapFloat[(fp+-8)] = f6;
+	f6 = f4-f7;
+	heapFloat[(r11+1)] = f8;
+	heapFloat[(r11+2)] = f6;
+	heap32[(r11+3)] = 0;
+	f6 = heapFloat[(r9+13)];
+	f7 = heapFloat[(r9+15)];
+	f8 = heapFloat[(r9+14)];
+	r11 = sp + -16;
+	f6 = f2-f6;
+	r12 = r11 >> 2;
+	f8 = f0-f8;
+	heapFloat[(fp+-4)] = f6;
+	f6 = f1-f7;
+	heapFloat[(r12+1)] = f8;
+	heapFloat[(r12+2)] = f6;
+	heap32[(r12+3)] = 0;
+	f6 = heapFloat[(r9+84)];
+	f7 = heapFloat[(r5+84)];
+	r5 = sp + -176;
+	r5 = (r5 + r3)|0;
+	r4 = (r4 + 388)|0;
+	r7 = (r7 + 388)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r11;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r4;
+	heapFloat[(g0+7)] = f7;
+	heap32[(g0+8)] = r7;
+	heapFloat[(g0+9)] = f6;
+	r3 = (r3 + 16)|0;
+	r2 = (r2 + 84)|0;
+	_ZN15btJacobianEntryC2ERK11btMatrix3x3S2_RK9btVector3S5_S5_S5_fS5_f(i7);
+if(!(r3 !=48)) //_LBB579_12
+{
+break _16;
+}
+}
+}
+	r2 = heap32[(r1+6)];
+	r1 = heap32[(r1+5)];
+	r3 = (r1 + 4)|0;
+	r4 = (r2 + 4)|0;
+	r1 = (r1 + 256)|0;
+	r2 = (r2 + 256)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r2;
+	_ZN21btConeTwistConstraint14calcAngleInfo2ERK11btTransformS2_RK11btMatrix3x3S5_(i7);
+}
+	return;
+}
+
+function _ZN21btConeTwistConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU8[r0+515];
+	if(r2 ==0) //_LBB580_2
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 3;
+	r2 = r0 >> 2;
+	heap32[(r1+1)] = 3;
+	r3 = heap32[(r2+6)];
+	r4 = heap32[(r2+5)];
+	r5 = (r4 + 4)|0;
+	r6 = (r3 + 4)|0;
+	r4 = (r4 + 256)|0;
+	r3 = (r3 + 256)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r3;
+	_ZN21btConeTwistConstraint14calcAngleInfo2ERK11btTransformS2_RK11btMatrix3x3S5_(i7);
+	r3 = heapU8[r0+514];
+if(!(r3 ==0)) //_LBB580_6
+{
+	r3 = heap32[(r1)];
+	r4 = (r3 + 1)|0;
+	heap32[(r1)] = r4;
+	r4 = heap32[(r1+1)];
+	r5 = (r4 + -1)|0;
+	heap32[(r1+1)] = r5;
+	f0 = heapFloat[(r2+111)];
+	f1 = heapFloat[(r2+108)];
+if(!(f1 >=f0)) //_LBB580_6
+{
+	f1 = heapFloat[(r2+109)];
+if(!(f1 >=f0)) //_LBB580_6
+{
+	r2 = (r3 + 2)|0;
+	r3 = (r4 + -2)|0;
+	heap32[(r1)] = r2;
+	heap32[(r1+1)] = r3;
+}
+}
+}
+	r0 = heapU8[r0+513];
+if(!(r0 ==0)) //_LBB580_8
+{
+	r0 = heap32[(r1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1)] = r0;
+	r0 = heap32[(r1+1)];
+	r0 = (r0 + -1)|0;
+	heap32[(r1+1)] = r0;
+}
+	return;
+}
+else{
+	r0 = r1 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	return;
+}
+}
+
+function _ZN21btConeTwistConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+6)];
+	r3 = heap32[(r1+5)];
+	r4 = (r3 + 4)|0;
+	r5 = (r2 + 4)|0;
+	r6 = (r3 + 256)|0;
+	r7 = (r2 + 256)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r7;
+	_ZN21btConeTwistConstraint14calcAngleInfo2ERK11btTransformS2_RK11btMatrix3x3S5_(i7);
+	r4 = heapU8[r0+515];
+	if(r4 ==0) //_LBB581_2
+{
+	r4 = heap32[(fp+1)];
+	r5 = r4 >> 2;
+	r6 = heap32[(r5+2)];
+	r6 = r6 >> 2;
+	heap32[(r6)] = 1065353216;
+	r6 = heap32[(r5+6)];
+	r7 = heap32[(r5+2)];
+	r6 = r6 << 2;
+	r6 = (r6 + r7)|0;
+	r6 = r6 >> 2;
+	heap32[(r6+1)] = 1065353216;
+	r6 = heap32[(r5+6)];
+	r7 = heap32[(r5+2)];
+	r6 = r6 << 3;
+	r6 = (r6 + r7)|0;
+	r6 = r6 >> 2;
+	heap32[(r6+2)] = 1065353216;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3+9)];
+	f1 = heapFloat[(r1+84)];
+	f2 = heapFloat[(r3+5)];
+	f3 = heapFloat[(r3+10)];
+	f4 = heapFloat[(r1+85)];
+	f5 = heapFloat[(r3+6)];
+	r6 = heap32[(r5+6)];
+	f6 = heapFloat[(r3+1)];
+	f7 = heapFloat[(r3+2)];
+	r7 = heap32[(r5+3)];
+	f2 = f2*f1;
+	f5 = f5*f4;
+	f0 = f0*f1;
+	f3 = f3*f4;
+	f8 = heapFloat[(r3+11)];
+	f9 = heapFloat[(r1+86)];
+	f10 = heapFloat[(r3+7)];
+	f11 = heapFloat[(r3+3)];
+	f2 = f2+f5;
+	f5 = f10*f9;
+	r8 = r7 >> 2;
+	f0 = f0+f3;
+	f3 = f8*f9;
+	f2 = f2+f5;
+	f0 = f0+f3;
+	heap32[(r8)] = 0;
+	r9 = r6 << 2;
+	f3 = -f2;
+	heapFloat[(r8+1)] = f0;
+	r9 = (r7 + r9)|0;
+	heapFloat[(r8+2)] = f3;
+	r9 = r9 >> 2;
+	f1 = f6*f1;
+	f3 = f7*f4;
+	f4 = -f0;
+	heap32[(r8+3)] = 0;
+	heapFloat[(r9)] = f4;
+	f1 = f1+f3;
+	f3 = f11*f9;
+	r6 = r6 << 3;
+	f1 = f1+f3;
+	heap32[(r9+1)] = 0;
+	r8 = (r6 + r7)|0;
+	r6 = r6 | 4;
+	heapFloat[(r9+2)] = f1;
+	r6 = (r7 + r6)|0;
+	r7 = r8 >> 2;
+	heap32[(r9+3)] = 0;
+	r6 = r6 >> 2;
+	f3 = -f1;
+	heapFloat[(r7)] = f2;
+	heapFloat[(r6)] = f3;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	r2 = r2 >> 2;
+	f3 = heapFloat[(r2+9)];
+	f4 = heapFloat[(r1+100)];
+	f5 = heapFloat[(r2+10)];
+	f6 = heapFloat[(r1+101)];
+	f3 = f3*f4;
+	f5 = f5*f6;
+	f7 = heapFloat[(r2+11)];
+	f8 = heapFloat[(r1+102)];
+	r6 = heap32[(r5+6)];
+	f9 = heapFloat[(r2+5)];
+	f10 = heapFloat[(r2+6)];
+	f11 = heapFloat[(r2+7)];
+	f12 = heapFloat[(r2+1)];
+	f13 = heapFloat[(r2+2)];
+	f14 = heapFloat[(r2+3)];
+	r7 = heap32[(r5+5)];
+	f3 = f3+f5;
+	f5 = f7*f8;
+	f3 = f3+f5;
+	r8 = r7 >> 2;
+	f5 = f9*f4;
+	f7 = f10*f6;
+	f5 = f5+f7;
+	f7 = f11*f8;
+	f9 = -f3;
+	heap32[(r8)] = 0;
+	f5 = f5+f7;
+	r9 = r6 << 2;
+	heapFloat[(r8+1)] = f9;
+	r9 = (r7 + r9)|0;
+	heapFloat[(r8+2)] = f5;
+	f4 = f12*f4;
+	f6 = f13*f6;
+	f4 = f4+f6;
+	f6 = f14*f8;
+	r9 = r9 >> 2;
+	heap32[(r8+3)] = 0;
+	f4 = f4+f6;
+	heapFloat[(r9)] = f3;
+	r6 = r6 << 3;
+	f6 = -f4;
+	heap32[(r9+1)] = 0;
+	r8 = (r6 + r7)|0;
+	r6 = r6 | 4;
+	heapFloat[(r9+2)] = f6;
+	r6 = (r7 + r6)|0;
+	r7 = r8 >> 2;
+	f6 = -f5;
+	heap32[(r9+3)] = 0;
+	r6 = r6 >> 2;
+	heapFloat[(r7)] = f6;
+	heapFloat[(r6)] = f4;
+	heap32[(r7+2)] = 0;
+	heap32[(r7+3)] = 0;
+	r6 = heapU8[r0+580];
+	r6 = r6 & 2;
+	if(r6 ==0) //_LBB581_4
+{
+	r4 = (r4 + 4)|0;
+}
+else{
+	r4 = (r0 + 588)|0;
+}
+	f6 = heapFloat[(r2+13)];
+	r4 = r4 >> 2;
+	f4 = f4+f6;
+	f1 = f4-f1;
+	f4 = heapFloat[(r3+13)];
+	f6 = heapFloat[(r4)];
+	f7 = heapFloat[(r5)];
+	r4 = heap32[(r5+7)];
+	f6 = f7*f6;
+	f1 = f1-f4;
+	r4 = r4 >> 2;
+	f1 = f1*f6;
+	heapFloat[(r4)] = f1;
+	r4 = heap32[(r5+9)];
+	r4 = r4 >> 2;
+	heap32[(r4)] = -8388609;
+	r4 = heap32[(r5+10)];
+	r4 = r4 >> 2;
+	heap32[(r4)] = 2139095039;
+	r4 = heapU8[r0+580];
+	r4 = r4 & 1;
+if(!(r4 ==0)) //_LBB581_7
+{
+	r4 = heap32[(r5+8)];
+	r4 = r4 >> 2;
+	heap32[(r4)] = heap32[(r1+146)];
+}
+	f1 = heapFloat[(r2+14)];
+	r4 = heap32[(r5+6)];
+	f1 = f5+f1;
+	r4 = r4 << 2;
+	r6 = heap32[(r5+7)];
+	f4 = heapFloat[(r3+14)];
+	f1 = f1-f2;
+	r4 = (r6 + r4)|0;
+	f1 = f1-f4;
+	r4 = r4 >> 2;
+	f1 = f1*f6;
+	heapFloat[(r4)] = f1;
+	r4 = heap32[(r5+6)];
+	r6 = heap32[(r5+9)];
+	r4 = r4 << 2;
+	r4 = (r6 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = -8388609;
+	r4 = heap32[(r5+6)];
+	r6 = heap32[(r5+10)];
+	r4 = r4 << 2;
+	r4 = (r6 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = 2139095039;
+	r4 = heapU8[r0+580];
+	r4 = r4 & 1;
+if(!(r4 ==0)) //_LBB581_25
+{
+	r4 = heap32[(r5+6)];
+	r6 = heap32[(r5+8)];
+	r4 = r4 << 2;
+	r4 = (r6 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = heap32[(r1+146)];
+}
+	f1 = heapFloat[(r2+15)];
+	r2 = heap32[(r5+6)];
+	f3 = f3+f1;
+	r2 = r2 << 3;
+	r4 = heap32[(r5+7)];
+	f1 = heapFloat[(r3+15)];
+	f0 = f3-f0;
+	r2 = (r4 + r2)|0;
+	f0 = f0-f1;
+	r2 = r2 >> 2;
+	f0 = f0*f6;
+	heapFloat[(r2)] = f0;
+	r2 = heap32[(r5+6)];
+	r4 = heap32[(r5+9)];
+	r2 = r2 << 3;
+	r2 = (r4 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = -8388609;
+	r2 = heap32[(r5+6)];
+	r4 = heap32[(r5+10)];
+	r2 = r2 << 3;
+	r2 = (r4 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 2139095039;
+	r2 = heapU8[r0+580];
+	r2 = r2 & 1;
+if(!(r2 ==0)) //_LBB581_8
+{
+	r2 = heap32[(r5+6)];
+	r4 = heap32[(r5+8)];
+	r2 = r2 << 3;
+	r2 = (r4 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+146)];
+}
+	r2 = heap32[(r5+6)];
+	r4 = (r2 * 3)|0;
+	r6 = heapU8[r0+514];
+_16: do {
+	if(r6 !=0) //_LBB581_10
+{
+	f0 = heapFloat[(r1+111)];
+	r6 = heap32[(r5+3)];
+	r7 = heap32[(r5+5)];
+	f3 = heapFloat[(r1+108)];
+if(!(f3 >=f0)) //_LBB581_13
+{
+	f3 = heapFloat[(r1+109)];
+if(!(f3 >=f0)) //_LBB581_13
+{
+	f0 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r1+73)];
+	f6 = heapFloat[(r3+2)];
+	f1 = heapFloat[(r1+77)];
+	r8 = (r4 + 1)|0;
+	f2 = heapFloat[(r3+5)];
+	f4 = heapFloat[(r3+6)];
+	r9 = r4 << 2;
+	f5 = f3*f0;
+	f7 = f1*f6;
+	f8 = heapFloat[(r3+3)];
+	f9 = heapFloat[(r1+81)];
+	f10 = heapFloat[(r1+74)];
+	f11 = heapFloat[(r3+9)];
+	f12 = heapFloat[(r1+78)];
+	f13 = heapFloat[(r3+10)];
+	r10 = (r4 + 2)|0;
+	r8 = r8 << 2;
+	r11 = (r6 + r9)|0;
+	f14 = heapFloat[(r3+11)];
+	f15 = heapFloat[(r1+82)];
+	f16 = heapFloat[(r3+7)];
+	f17 = f3*f2;
+	f18 = f1*f4;
+	f5 = f5+f7;
+	f7 = f9*f8;
+	r2 = (r2 + r4)|0;
+	r3 = r10 << 2;
+	r4 = (r6 + r8)|0;
+	f5 = f5+f7;
+	f3 = f3*f11;
+	f1 = f1*f13;
+	f7 = f17+f18;
+	f17 = f9*f16;
+	r10 = r11 >> 2;
+	r11 = (r2 + 1)|0;
+	r12 = r2 << 2;
+	r13 = (r6 + r3)|0;
+	f7 = f7+f17;
+	f0 = f10*f0;
+	f6 = f12*f6;
+	f3 = f3+f1;
+	f1 = f9*f14;
+	r4 = r4 >> 2;
+	heapFloat[(r10)] = f5;
+	r10 = (r2 + 2)|0;
+	r11 = r11 << 2;
+	r14 = (r6 + r12)|0;
+	f3 = f3+f1;
+	f1 = f10*f2;
+	f2 = f12*f4;
+	f0 = f0+f6;
+	f6 = f15*f8;
+	r13 = r13 >> 2;
+	heapFloat[(r4)] = f7;
+	r4 = r10 << 2;
+	r10 = (r6 + r11)|0;
+	f0 = f0+f6;
+	f6 = f10*f11;
+	f4 = f12*f13;
+	f1 = f1+f2;
+	f2 = f15*f16;
+	r14 = r14 >> 2;
+	heapFloat[(r13)] = f3;
+	r6 = (r6 + r4)|0;
+	f1 = f1+f2;
+	f6 = f6+f4;
+	f2 = f15*f14;
+	r10 = r10 >> 2;
+	heapFloat[(r14)] = f0;
+	r13 = (r7 + r9)|0;
+	f6 = f6+f2;
+	r6 = r6 >> 2;
+	heapFloat[(r10)] = f1;
+	r8 = (r7 + r8)|0;
+	r10 = r13 >> 2;
+	f2 = -f5;
+	heapFloat[(r6)] = f6;
+	r3 = (r7 + r3)|0;
+	r6 = r8 >> 2;
+	f4 = -f7;
+	heapFloat[(r10)] = f2;
+	r8 = (r7 + r12)|0;
+	r3 = r3 >> 2;
+	f2 = -f3;
+	heapFloat[(r6)] = f4;
+	r6 = (r7 + r11)|0;
+	r8 = r8 >> 2;
+	f4 = -f0;
+	heapFloat[(r3)] = f2;
+	r3 = (r7 + r4)|0;
+	r4 = r6 >> 2;
+	f2 = -f1;
+	heapFloat[(r8)] = f4;
+	r3 = r3 >> 2;
+	f4 = -f6;
+	heapFloat[(r4)] = f2;
+	heapFloat[(r3)] = f4;
+	f2 = heapFloat[(r1+112)];
+	f4 = heapFloat[(r1+113)];
+	f8 = heapFloat[(r1+114)];
+	f2 = f2*f5;
+	f4 = f4*f7;
+	r3 = heap32[(r5+7)];
+	f2 = f2+f4;
+	f3 = f8*f3;
+	f4 = heapFloat[(r5)];
+	f5 = heapFloat[(r1+106)];
+	r3 = (r3 + r9)|0;
+	f3 = f2+f3;
+	f2 = f4*f5;
+	r3 = r3 >> 2;
+	f3 = f3*f2;
+	heapFloat[(r3)] = f3;
+	f3 = heapFloat[(r1+112)];
+	f4 = heapFloat[(r1+113)];
+	f5 = heapFloat[(r1+114)];
+	f0 = f3*f0;
+	f3 = f4*f1;
+	r3 = heap32[(r5+7)];
+	f0 = f0+f3;
+	f3 = f5*f6;
+	r3 = (r3 + r12)|0;
+	f0 = f0+f3;
+	r3 = r3 >> 2;
+	f0 = f0*f2;
+	heapFloat[(r3)] = f0;
+	r3 = heap32[(r5+9)];
+	r3 = (r3 + r9)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = -8388609;
+	r3 = heap32[(r5+10)];
+	r3 = (r3 + r9)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 2139095039;
+	r3 = heap32[(r5+9)];
+	r3 = (r3 + r12)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = -8388609;
+	r3 = heap32[(r5+10)];
+	r3 = (r3 + r12)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 2139095039;
+	r3 = heap32[(r5+6)];
+	r4 = (r3 + r2)|0;
+break _16;
+}
+}
+	r2 = (r4 + 1)|0;
+	r3 = r4 << 2;
+	f0 = heapFloat[(r1+106)];
+	f3 = heapFloat[(r1+112)];
+	r8 = (r4 + 2)|0;
+	r2 = r2 << 2;
+	r9 = (r6 + r3)|0;
+	f3 = f3*f0;
+	f6 = heapFloat[(r1+114)];
+	f1 = heapFloat[(r1+113)];
+	r8 = r8 << 2;
+	r10 = (r6 + r2)|0;
+	f1 = f1*f0;
+	f3 = f3*f0;
+	r9 = r9 >> 2;
+	r6 = (r6 + r8)|0;
+	f6 = f6*f0;
+	f1 = f1*f0;
+	r10 = r10 >> 2;
+	heapFloat[(r9)] = f3;
+	r9 = (r7 + r3)|0;
+	f0 = f6*f0;
+	r6 = r6 >> 2;
+	heapFloat[(r10)] = f1;
+	r2 = (r7 + r2)|0;
+	r9 = r9 >> 2;
+	f3 = -f3;
+	heapFloat[(r6)] = f0;
+	r6 = (r7 + r8)|0;
+	r2 = r2 >> 2;
+	f6 = -f1;
+	heapFloat[(r9)] = f3;
+	r6 = r6 >> 2;
+	f0 = -f0;
+	heapFloat[(r2)] = f6;
+	heapFloat[(r6)] = f0;
+	r2 = heap32[(r5+7)];
+	f0 = heapFloat[(r5)];
+	f3 = heapFloat[(r1+105)];
+	r2 = (r2 + r3)|0;
+	f6 = heapFloat[(r1+123)];
+	f0 = f0*f3;
+	r2 = r2 >> 2;
+	f0 = f6*f0;
+	heapFloat[(r2)] = f0;
+	r2 = heapU8[r0+580];
+	r2 = r2 & 4;
+if(!(r2 ==0)) //_LBB581_15
+{
+	r2 = heap32[(r5+8)];
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+148)];
+}
+	r2 = heap32[(r5+9)];
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+	r2 = heap32[(r5+10)];
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 2139095039;
+	r2 = heap32[(r5+6)];
+	r4 = (r2 + r4)|0;
+}
+} while(0);
+	r2 = heapU8[r0+513];
+	if(r2 ==0) //_LBB581_28
+{
+	return;
+}
+else{
+	r2 = (r4 + 1)|0;
+	r3 = r4 << 2;
+	r6 = heap32[(r5+3)];
+	f0 = heapFloat[(r1+106)];
+	f3 = heapFloat[(r1+116)];
+	r4 = (r4 + 2)|0;
+	r2 = r2 << 2;
+	r7 = heap32[(r5+5)];
+	r8 = (r6 + r3)|0;
+	f3 = f3*f0;
+	f6 = heapFloat[(r1+118)];
+	f1 = heapFloat[(r1+117)];
+	r4 = r4 << 2;
+	r9 = (r6 + r2)|0;
+	f1 = f1*f0;
+	f3 = f3*f0;
+	r8 = r8 >> 2;
+	r6 = (r6 + r4)|0;
+	f6 = f6*f0;
+	f1 = f1*f0;
+	r9 = r9 >> 2;
+	heapFloat[(r8)] = f3;
+	r8 = (r7 + r3)|0;
+	f0 = f6*f0;
+	r6 = r6 >> 2;
+	heapFloat[(r9)] = f1;
+	r2 = (r7 + r2)|0;
+	r8 = r8 >> 2;
+	f3 = -f3;
+	heapFloat[(r6)] = f0;
+	r4 = (r7 + r4)|0;
+	r2 = r2 >> 2;
+	f6 = -f1;
+	heapFloat[(r8)] = f3;
+	r4 = r4 >> 2;
+	f0 = -f0;
+	heapFloat[(r2)] = f6;
+	heapFloat[(r4)] = f0;
+	r2 = heap32[(r5+7)];
+	f0 = heapFloat[(r5)];
+	f3 = heapFloat[(r1+105)];
+	r2 = (r2 + r3)|0;
+	f6 = heapFloat[(r1+124)];
+	f0 = f0*f3;
+	r2 = r2 >> 2;
+	f0 = f6*f0;
+	heapFloat[(r2)] = f0;
+	r0 = heapU8[r0+580];
+	r0 = r0 & 4;
+if(!(r0 ==0)) //_LBB581_19
+{
+	r0 = heap32[(r5+8)];
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = heap32[(r1+148)];
+}
+	f0 = heapFloat[(r1+110)];
+	f3 =                         0;
+	if(f0 <=f3) //_LBB581_24
+{
+	r0 = heap32[(r5+9)];
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+}
+else{
+	r0 = heap32[(r5+9)];
+	f0 = heapFloat[(r1+124)];
+	if(f0 <=f3) //_LBB581_23
+{
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+	r0 = heap32[(r5+10)];
+	r3 = (r0 + r3)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 0;
+	return;
+}
+else{
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+}
+}
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 2139095039;
+	return;
+}
+}
+else{
+	r0 = _2E_str1149;
+	r1 = _2E_str24;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 126;
+	_assert(i7);
+}
+}
+
+function _ZN21btConeTwistConstraint23solveConstraintObsoleteER11btRigidBodyS1_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -624;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+515];
+if(!(r1 ==0)) //_LBB582_52
+{
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	f0 = heapFloat[(fp+3)];
+	heapFloat[(fp+-117)] = f0;
+	r3 = r0 >> 2;
+	r4 = heapU8[r0+512];
+if(!(r4 !=0)) //_LBB582_8
+{
+	r4 = heap32[(r3+5)];
+	r5 = heap32[(r3+6)];
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	f0 = heapFloat[(r4+9)];
+	f1 = heapFloat[(r3+84)];
+	f2 = heapFloat[(r4+5)];
+	f3 = heapFloat[(r4+1)];
+	f4 = heapFloat[(r4+10)];
+	f5 = heapFloat[(r3+85)];
+	f6 = heapFloat[(r4+6)];
+	f7 = heapFloat[(r4+2)];
+	f8 = heapFloat[(r5+9)];
+	f9 = heapFloat[(r3+100)];
+	f10 = heapFloat[(r5+5)];
+	f11 = heapFloat[(r5+1)];
+	f12 = heapFloat[(r5+10)];
+	f13 = heapFloat[(r3+101)];
+	f14 = heapFloat[(r5+6)];
+	f15 = heapFloat[(r5+2)];
+	f0 = f0*f1;
+	f4 = f4*f5;
+	f16 = heapFloat[(r4+11)];
+	f17 = heapFloat[(r3+86)];
+	f18 = heapFloat[(r4+7)];
+	f19 = heapFloat[(r4+3)];
+	f2 = f2*f1;
+	f6 = f6*f5;
+	f1 = f3*f1;
+	f3 = f7*f5;
+	f5 = f8*f9;
+	f7 = f12*f13;
+	f8 = heapFloat[(r5+11)];
+	f12 = heapFloat[(r3+102)];
+	f20 = heapFloat[(r5+7)];
+	f21 = heapFloat[(r5+3)];
+	f10 = f10*f9;
+	f14 = f14*f13;
+	f9 = f11*f9;
+	f11 = f15*f13;
+	f0 = f0+f4;
+	f4 = f16*f17;
+	f2 = f2+f6;
+	f6 = f18*f17;
+	f1 = f1+f3;
+	f3 = f19*f17;
+	f5 = f5+f7;
+	f7 = f8*f12;
+	f8 = f10+f14;
+	f10 = f20*f12;
+	f9 = f9+f11;
+	f11 = f21*f12;
+	f12 = heapFloat[(r4+15)];
+	f0 = f0+f4;
+	f4 = heapFloat[(r4+14)];
+	f2 = f2+f6;
+	f6 = heapFloat[(r4+13)];
+	f1 = f1+f3;
+	f3 = heapFloat[(r5+15)];
+	f5 = f5+f7;
+	f7 = heapFloat[(r5+14)];
+	f8 = f8+f10;
+	f10 = heapFloat[(r5+13)];
+	f9 = f9+f11;
+	f0 = f0+f12;
+	heapFloat[(fp+-119)] = f0;
+	f0 = f2+f4;
+	heapFloat[(fp+-121)] = f0;
+	f1 = f1+f6;
+	heapFloat[(fp+-120)] = f1;
+	f0 = f5+f3;
+	heapFloat[(fp+-122)] = f0;
+	f0 = f8+f7;
+	heapFloat[(fp+-123)] = f0;
+	f1 = f9+f10;
+	r4 = r1 >> 2;
+	r5 = r2 >> 2;
+	f2 = heapFloat[(r4+80)];
+	f5 = heapFloat[(r4+130)];
+	f8 = heapFloat[(r5+80)];
+	f9 = heapFloat[(r5+130)];
+	f11 = heapFloat[(r4+81)];
+	f13 = heapFloat[(r4+131)];
+	f14 = heapFloat[(r4+82)];
+	f15 = heapFloat[(r4+132)];
+	f16 = heapFloat[(r5+81)];
+	f17 = heapFloat[(r5+131)];
+	f18 = heapFloat[(r5+82)];
+	f19 = heapFloat[(r5+132)];
+	f20 = heapFloat[(fp+-120)];
+	f6 = f20-f6;
+	f10 = f1-f10;
+	f11 = f11+f13;
+	f0 = heapFloat[(fp+-119)];
+	f12 = f0-f12;
+	f2 = f2+f5;
+	f0 = heapFloat[(fp+-121)];
+	f4 = f0-f4;
+	f5 = f14+f15;
+	f13 = f16+f17;
+	f0 = heapFloat[(fp+-122)];
+	f3 = f0-f3;
+	f8 = f8+f9;
+	f0 = heapFloat[(fp+-123)];
+	f7 = f0-f7;
+	f9 = f18+f19;
+	f14 = heapFloat[(r4+78)];
+	f15 = heapFloat[(r4+128)];
+	f16 = f2*f4;
+	f17 = f11*f6;
+	f18 = heapFloat[(r5+78)];
+	f19 = heapFloat[(r5+128)];
+	f21 = f8*f7;
+	f22 = f13*f10;
+	f23 = heapFloat[(r4+77)];
+	f24 = heapFloat[(r4+127)];
+	f25 = f5*f6;
+	f2 = f2*f12;
+	f26 = heapFloat[(r5+77)];
+	f27 = heapFloat[(r5+127)];
+	f28 = f9*f10;
+	f8 = f8*f3;
+	f29 = heapFloat[(r4+76)];
+	f30 = heapFloat[(r4+126)];
+	f11 = f11*f12;
+	f5 = f5*f4;
+	f0 = heapFloat[(r5+76)];
+	f20 = heapFloat[(r5+126)];
+	f13 = f13*f3;
+	f9 = f9*f7;
+	f14 = f14+f15;
+	f15 = f16-f17;
+	f16 = f18+f19;
+	f17 = f21-f22;
+	f18 = f23+f24;
+	f2 = f25-f2;
+	f19 = f26+f27;
+	f8 = f28-f8;
+	f21 = f29+f30;
+	f5 = f11-f5;
+	f0 = f0+f20;
+	f9 = f13-f9;
+	f11 = f14+f15;
+	f13 = f16+f17;
+	f2 = f18+f2;
+	f8 = f19+f8;
+	f5 = f21+f5;
+	f0 = f0+f9;
+	f9 = f11-f13;
+	f2 = f2-f8;
+	heapFloat[(fp+-118)] = f2;
+	f0 = f5-f0;
+	f2 = heapFloat[(fp+-119)];
+	f5 = heapFloat[(fp+-122)];
+	f2 = f2-f5;
+	f5 = heapFloat[(fp+-121)];
+	f8 = heapFloat[(fp+-123)];
+	f5 = f5-f8;
+	f8 = heapFloat[(fp+-120)];
+	f1 = f8-f1;
+	r6 = 0;
+_5: while(true){
+	r7 = (r6 * -21)|0;
+	r8 = r7 << 2;
+	r8 = (r0 + r8)|0;
+	r8 = r8 >> 2;
+	f8 = heapFloat[(r8+9)];
+	f11 = heapFloat[(r8+10)];
+	f13 = heapFloat[(r8+11)];
+	f14 = f1*f8;
+	f15 = f5*f11;
+	f14 = f14+f15;
+	f15 = f2*f13;
+	f14 = f14+f15;
+	f15 =      -0.30000001192092896;
+	f16 = f8*f0;
+	f17 = heapFloat[(fp+-118)];
+	f17 = f11*f17;
+	f14 = f14*f15;
+	f15 = f16+f17;
+	f16 = f13*f9;
+	f17 =                         1;
+	f18 = heapFloat[(r8+29)];
+	f19 = heapFloat[(fp+-117)];
+	f14 = f14/f19;
+	f17 = f17/f18;
+	f15 = f15+f16;
+	f14 = f14*f17;
+	f15 = f15*f17;
+	f14 = f14-f15;
+	f15 = heapFloat[(r3+7)];
+	f15 = f15+f14;
+	heapFloat[(r3+7)] = f15;
+	f15 = heapFloat[(r4+84)];
+	f16 =                         0;
+if(!(f15 ==f16)) //_LBB582_5
+{
+	r9 = heap32[(r3+5)];
+	r9 = r9 >> 2;
+	f15 = f6*f11;
+	f17 = f4*f8;
+	f18 = f12*f8;
+	f19 = f6*f13;
+	f20 = f4*f13;
+	f21 = f12*f11;
+	f15 = f15-f17;
+	f17 = f18-f19;
+	f18 = f20-f21;
+	f19 = heapFloat[(r9+84)];
+	f20 = f8*f19;
+	f20 = f20*f14;
+	f21 = heapFloat[(r4+126)];
+	f22 = heapFloat[(r9+65)];
+	f23 = heapFloat[(r9+64)];
+	f24 = heapFloat[(r9+69)];
+	f25 = heapFloat[(r9+68)];
+	f26 = heapFloat[(r9+73)];
+	f27 = heapFloat[(r9+72)];
+	f28 = heapFloat[(r9+66)];
+	f29 = heapFloat[(r9+70)];
+	f30 = heapFloat[(r9+74)];
+	f20 = f21+f20;
+	f21 = f11*f19;
+	heapFloat[(r4+126)] = f20;
+	f20 = f21*f14;
+	f21 = heapFloat[(r4+127)];
+	f20 = f21+f20;
+	f19 = f13*f19;
+	heapFloat[(r4+127)] = f20;
+	f19 = f19*f14;
+	f20 = heapFloat[(r4+128)];
+	f19 = f20+f19;
+	heapFloat[(r4+128)] = f19;
+	f19 = f23*f18;
+	f20 = f22*f17;
+	f21 = heapFloat[(r4+134)];
+	f19 = f19+f20;
+	f20 = f28*f15;
+	f19 = f19+f20;
+	f20 = f21*f14;
+	f21 = heapFloat[(r4+136)];
+	f22 = heapFloat[(r4+135)];
+	f23 = heapFloat[(r4+130)];
+	f19 = f19*f20;
+	f20 = f25*f18;
+	f24 = f24*f17;
+	f20 = f20+f24;
+	f24 = f29*f15;
+	f19 = f23+f19;
+	heapFloat[(r4+130)] = f19;
+	f19 = f20+f24;
+	f20 = f22*f14;
+	f18 = f27*f18;
+	f17 = f26*f17;
+	f19 = f19*f20;
+	f20 = heapFloat[(r4+131)];
+	f19 = f20+f19;
+	f17 = f18+f17;
+	f15 = f30*f15;
+	heapFloat[(r4+131)] = f19;
+	f15 = f17+f15;
+	f17 = f21*f14;
+	f15 = f15*f17;
+	f17 = heapFloat[(r4+132)];
+	f15 = f17+f15;
+	heapFloat[(r4+132)] = f15;
+}
+	f15 = heapFloat[(r5+84)];
+if(!(f15 ==f16)) //_LBB582_7
+{
+	f15 = f10*f11;
+	f16 = f7*f8;
+	f8 = f3*f8;
+	f17 = f10*f13;
+	f13 = f7*f13;
+	f11 = f3*f11;
+	f15 = f15-f16;
+	f8 = f8-f17;
+	f11 = f13-f11;
+	r9 = heap32[(r3+6)];
+	r9 = r9 >> 2;
+	f13 = -f14;
+	f14 = heapFloat[(r9+84)];
+	r10 = r7 << 2;
+	r10 = (r0 + r10)|0;
+	r10 = r10 >> 2;
+	r7 = r7 << 2;
+	r7 = (r0 + r7)|0;
+	f16 = heapFloat[(r10+9)];
+	r7 = r7 >> 2;
+	f16 = f16*f14;
+	f17 = heapFloat[(r7+10)];
+	f18 = heapFloat[(r8+11)];
+	f16 = f16*f13;
+	f19 = heapFloat[(r5+126)];
+	f20 = heapFloat[(r9+65)];
+	f21 = heapFloat[(r9+64)];
+	f22 = heapFloat[(r9+69)];
+	f23 = heapFloat[(r9+68)];
+	f24 = heapFloat[(r9+73)];
+	f25 = heapFloat[(r9+72)];
+	f26 = heapFloat[(r9+66)];
+	f27 = heapFloat[(r9+70)];
+	f28 = heapFloat[(r9+74)];
+	f16 = f19+f16;
+	f17 = f17*f14;
+	heapFloat[(r5+126)] = f16;
+	f16 = f17*f13;
+	f17 = heapFloat[(r5+127)];
+	f16 = f17+f16;
+	f14 = f18*f14;
+	heapFloat[(r5+127)] = f16;
+	f14 = f14*f13;
+	f16 = heapFloat[(r5+128)];
+	f14 = f16+f14;
+	heapFloat[(r5+128)] = f14;
+	f14 = f21*f11;
+	f16 = f20*f8;
+	f17 = heapFloat[(r5+134)];
+	f14 = f14+f16;
+	f16 = f26*f15;
+	f14 = f14+f16;
+	f16 = f17*f13;
+	f17 = heapFloat[(r5+136)];
+	f18 = heapFloat[(r5+135)];
+	f19 = heapFloat[(r5+130)];
+	f14 = f14*f16;
+	f16 = f23*f11;
+	f20 = f22*f8;
+	f16 = f16+f20;
+	f20 = f27*f15;
+	f14 = f19+f14;
+	heapFloat[(r5+130)] = f14;
+	f14 = f16+f20;
+	f16 = f18*f13;
+	f11 = f25*f11;
+	f8 = f24*f8;
+	f14 = f14*f16;
+	f16 = heapFloat[(r5+131)];
+	f14 = f16+f14;
+	f8 = f11+f8;
+	f11 = f28*f15;
+	heapFloat[(r5+131)] = f14;
+	f8 = f8+f11;
+	f11 = f17*f13;
+	f8 = f8*f11;
+	f11 = heapFloat[(r5+132)];
+	f8 = f11+f8;
+	heapFloat[(r5+132)] = f8;
+}
+	r6 = (r6 + -1)|0;
+if(!(r6 !=-3)) //_LBB582_3
+{
+break _5;
+}
+}
+}
+	r4 = heapU8[r0+540];
+_14: do {
+	if(r4 ==0) //_LBB582_29
+{
+	f0 = heapFloat[(r3+107)];
+	f1 =   1.1920928955078125e-007;
+	if(f0 <=f1) //_LBB582_35
+{
+break _14;
+}
+else{
+	r4 = r2 >> 2;
+	r5 = r1 >> 2;
+	f0 = heapFloat[(r4+81)];
+	f2 = heapFloat[(r4+131)];
+	f3 = heapFloat[(r5+81)];
+	f4 = heapFloat[(r5+131)];
+	f5 = heapFloat[(r4+80)];
+	f6 = heapFloat[(r4+130)];
+	f7 = heapFloat[(r5+80)];
+	f8 = heapFloat[(r5+130)];
+	f9 = heapFloat[(r4+82)];
+	f10 = heapFloat[(r4+132)];
+	f11 = heapFloat[(r5+82)];
+	f12 = heapFloat[(r5+132)];
+	f0 = f0+f2;
+	f2 = f3+f4;
+	f3 = f5+f6;
+	f4 = f7+f8;
+	f0 = f0-f2;
+	f2 = f3-f4;
+	f3 = f9+f10;
+	f4 = f11+f12;
+	f3 = f3-f4;
+	f4 = f2*f2;
+	f5 = f0*f0;
+	f4 = f4+f5;
+	f5 = f3*f3;
+	f4 = f4+f5;
+	if(f4 <=f1) //_LBB582_35
+{
+break _14;
+}
+else{
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	r6 = heap32[(r3+5)];
+	r7 = heap32[(r3+6)];
+	f4 =                         1;
+	r6 = r6 >> 2;
+	r7 = r7 >> 2;
+	f1 = f4/f_g0;
+	f5 = heapFloat[(r6+64)];
+	f6 = f2*f1;
+	f7 = heapFloat[(r6+65)];
+	f8 = heapFloat[(r7+64)];
+	f9 = heapFloat[(r7+65)];
+	f10 = heapFloat[(r6+68)];
+	f11 = f0*f1;
+	f12 = heapFloat[(r6+69)];
+	f13 = heapFloat[(r7+68)];
+	f14 = heapFloat[(r7+69)];
+	f15 = heapFloat[(r6+66)];
+	f16 = heapFloat[(r6+70)];
+	f17 = heapFloat[(r7+66)];
+	f18 = heapFloat[(r7+70)];
+	f5 = f5*f6;
+	f10 = f10*f11;
+	f19 = heapFloat[(r6+72)];
+	f1 = f3*f1;
+	f20 = heapFloat[(r6+73)];
+	f21 = heapFloat[(r7+72)];
+	f22 = heapFloat[(r7+73)];
+	f7 = f7*f6;
+	f12 = f12*f11;
+	f8 = f8*f6;
+	f13 = f13*f11;
+	f9 = f9*f6;
+	f14 = f14*f11;
+	f23 = heapFloat[(r6+74)];
+	f24 = heapFloat[(r7+74)];
+	f5 = f5+f10;
+	f10 = f19*f1;
+	f7 = f7+f12;
+	f12 = f20*f1;
+	f15 = f15*f6;
+	f16 = f16*f11;
+	f8 = f8+f13;
+	f13 = f21*f1;
+	f9 = f9+f14;
+	f14 = f22*f1;
+	f17 = f17*f6;
+	f18 = f18*f11;
+	f5 = f5+f10;
+	f7 = f7+f12;
+	f8 = f8+f13;
+	f9 = f9+f14;
+	f10 = f15+f16;
+	f12 = f23*f1;
+	f13 = f17+f18;
+	f14 = f24*f1;
+	f10 = f10+f12;
+	f12 = f13+f14;
+	f5 = f6*f5;
+	f7 = f11*f7;
+	f6 = f6*f8;
+	f8 = f11*f9;
+	f5 = f5+f7;
+	f7 = f1*f10;
+	f6 = f6+f8;
+	f1 = f1*f12;
+	f5 = f5+f7;
+	f1 = f6+f1;
+	f1 = f5+f1;
+	f5 = heapFloat[(r3+107)];
+	f1 = f4/f1;
+	f1 = f5*f1;
+	f0 = f0*f1;
+	f2 = f2*f1;
+	f1 = f3*f1;
+	f3 = f2*f2;
+	f5 = f0*f0;
+	f3 = f3+f5;
+	f5 = f1*f1;
+	f3 = f3+f5;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+	f4 = f4/f3;
+	f1 = f1*f4;
+	f0 = f0*f4;
+	f2 = f2*f4;
+	f4 = heapFloat[(r5+84)];
+	f5 =                         0;
+if(!(f4 ==f5)) //_LBB582_33
+{
+	r6 = heap32[(r3+5)];
+	r6 = r6 >> 2;
+	f4 = f3*f5;
+	f6 = heapFloat[(r5+126)];
+	f7 = heapFloat[(r6+65)];
+	f8 = heapFloat[(r6+64)];
+	f9 = heapFloat[(r6+69)];
+	f10 = heapFloat[(r6+68)];
+	f11 = heapFloat[(r6+73)];
+	f12 = heapFloat[(r6+72)];
+	f13 = heapFloat[(r6+66)];
+	f14 = heapFloat[(r6+70)];
+	f15 = heapFloat[(r6+74)];
+	f6 = f6+f4;
+	heapFloat[(r5+126)] = f6;
+	f6 = heapFloat[(r5+127)];
+	f6 = f6+f4;
+	heapFloat[(r5+127)] = f6;
+	f6 = heapFloat[(r5+128)];
+	f4 = f6+f4;
+	heapFloat[(r5+128)] = f4;
+	f4 = f8*f2;
+	f6 = f7*f0;
+	f7 = heapFloat[(r5+134)];
+	f4 = f4+f6;
+	f6 = f13*f1;
+	f4 = f4+f6;
+	f6 = f7*f3;
+	f7 = heapFloat[(r5+136)];
+	f8 = heapFloat[(r5+135)];
+	f13 = heapFloat[(r5+130)];
+	f4 = f4*f6;
+	f6 = f10*f2;
+	f9 = f9*f0;
+	f6 = f6+f9;
+	f9 = f14*f1;
+	f4 = f13+f4;
+	heapFloat[(r5+130)] = f4;
+	f4 = f6+f9;
+	f6 = f8*f3;
+	f8 = f12*f2;
+	f9 = f11*f0;
+	f4 = f4*f6;
+	f6 = heapFloat[(r5+131)];
+	f4 = f6+f4;
+	f6 = f8+f9;
+	f8 = f15*f1;
+	heapFloat[(r5+131)] = f4;
+	f4 = f6+f8;
+	f6 = f7*f3;
+	f4 = f4*f6;
+	f6 = heapFloat[(r5+132)];
+	f4 = f6+f4;
+	heapFloat[(r5+132)] = f4;
+}
+	f4 = heapFloat[(r4+84)];
+	if(f4 ==f5) //_LBB582_35
+{
+break _14;
+}
+else{
+	f4 = -f3;
+	r5 = heap32[(r3+6)];
+	r5 = r5 >> 2;
+	f5 =                        -0;
+	f3 = f3*f5;
+	f5 = heapFloat[(r4+126)];
+	f6 = heapFloat[(r5+65)];
+	f7 = heapFloat[(r5+64)];
+	f8 = heapFloat[(r5+69)];
+	f9 = heapFloat[(r5+68)];
+	f10 = heapFloat[(r5+73)];
+	f11 = heapFloat[(r5+72)];
+	f12 = heapFloat[(r5+66)];
+	f13 = heapFloat[(r5+70)];
+	f14 = heapFloat[(r5+74)];
+	f5 = f5+f3;
+	heapFloat[(r4+126)] = f5;
+	f5 = heapFloat[(r4+127)];
+	f5 = f5+f3;
+	heapFloat[(r4+127)] = f5;
+	f5 = heapFloat[(r4+128)];
+	f3 = f5+f3;
+	heapFloat[(r4+128)] = f3;
+	f3 = f7*f2;
+	f5 = f6*f0;
+	f3 = f3+f5;
+	f5 = f12*f1;
+	f6 = heapFloat[(r4+134)];
+	f3 = f3+f5;
+	f5 = f6*f4;
+	f6 = heapFloat[(r4+136)];
+	f7 = heapFloat[(r4+135)];
+	f12 = heapFloat[(r4+130)];
+	f3 = f3*f5;
+	f5 = f9*f2;
+	f8 = f8*f0;
+	f5 = f5+f8;
+	f8 = f13*f1;
+	f3 = f12+f3;
+	heapFloat[(r4+130)] = f3;
+	f3 = f5+f8;
+	f5 = f7*f4;
+	f2 = f11*f2;
+	f0 = f10*f0;
+	f3 = f3*f5;
+	f5 = heapFloat[(r4+131)];
+	f3 = f5+f3;
+	f0 = f2+f0;
+	f1 = f14*f1;
+	heapFloat[(r4+131)] = f3;
+	f0 = f0+f1;
+	f1 = f6*f4;
+	f0 = f0*f1;
+	f1 = heapFloat[(r4+132)];
+	f0 = f1+f0;
+	heapFloat[(r4+132)] = f0;
+}
+}
+}
+}
+else{
+	r4 = heap32[(r3+5)];
+	r5 = sp + -112;
+	r4 = r4 >> 2;
+	r6 = r5 >> 2;
+	heap32[(fp+-28)] = heap32[(r4+1)];
+	heap32[(r6+1)] = heap32[(r4+2)];
+	heap32[(r6+2)] = heap32[(r4+3)];
+	heap32[(r6+3)] = heap32[(r4+4)];
+	heap32[(r6+4)] = heap32[(r4+5)];
+	heap32[(r6+5)] = heap32[(r4+6)];
+	heap32[(r6+6)] = heap32[(r4+7)];
+	heap32[(r6+7)] = heap32[(r4+8)];
+	heap32[(r6+8)] = heap32[(r4+9)];
+	heap32[(r6+9)] = heap32[(r4+10)];
+	heap32[(r6+10)] = heap32[(r4+11)];
+	heap32[(r6+11)] = heap32[(r4+12)];
+	heap32[(r6+12)] = heap32[(r4+13)];
+	heap32[(r6+13)] = heap32[(r4+14)];
+	heap32[(r6+14)] = heap32[(r4+15)];
+	heap32[(r6+15)] = heap32[(r4+16)];
+	r4 = heap32[(r3+6)];
+	r6 = sp + -176;
+	r4 = r4 >> 2;
+	r7 = r6 >> 2;
+	heap32[(fp+-44)] = heap32[(r4+1)];
+	heap32[(r7+1)] = heap32[(r4+2)];
+	heap32[(r7+2)] = heap32[(r4+3)];
+	heap32[(r7+3)] = heap32[(r4+4)];
+	heap32[(r7+4)] = heap32[(r4+5)];
+	heap32[(r7+5)] = heap32[(r4+6)];
+	heap32[(r7+6)] = heap32[(r4+7)];
+	heap32[(r7+7)] = heap32[(r4+8)];
+	heap32[(r7+8)] = heap32[(r4+9)];
+	heap32[(r7+9)] = heap32[(r4+10)];
+	heap32[(r7+10)] = heap32[(r4+11)];
+	heap32[(r7+11)] = heap32[(r4+12)];
+	heap32[(r7+12)] = heap32[(r4+13)];
+	heap32[(r7+13)] = heap32[(r4+14)];
+	heap32[(r7+14)] = heap32[(r4+15)];
+	r8 = r1 >> 2;
+	heap32[(r7+15)] = heap32[(r4+16)];
+	f0 = heapFloat[(r8+82)];
+	f1 = heapFloat[(r8+132)];
+	f2 = heapFloat[(r8+81)];
+	f3 = heapFloat[(r8+131)];
+	f4 = heapFloat[(r8+80)];
+	f5 = heapFloat[(r8+130)];
+	r4 = sp + -192;
+	f4 = f4+f5;
+	r7 = r4 >> 2;
+	f2 = f2+f3;
+	heapFloat[(fp+-48)] = f4;
+	f0 = f0+f1;
+	heapFloat[(r7+1)] = f2;
+	heapFloat[(r7+2)] = f0;
+	r9 = r2 >> 2;
+	heap32[(r7+3)] = 0;
+	f0 = heapFloat[(r9+82)];
+	f1 = heapFloat[(r9+132)];
+	f2 = heapFloat[(r9+81)];
+	f3 = heapFloat[(r9+131)];
+	f4 = heapFloat[(r9+80)];
+	f5 = heapFloat[(r9+130)];
+	r10 = sp + -208;
+	f4 = f4+f5;
+	f2 = f2+f3;
+	heapFloat[(fp+-52)] = f4;
+	r11 = r10 >> 2;
+	f0 = f0+f1;
+	heapFloat[(r11+1)] = f2;
+	heapFloat[(r11+2)] = f0;
+	r12 = sp + -272;
+	heap32[(r11+3)] = 0;
+	r13 = r12 >> 2;
+	heap32[(fp+-68)] = 1065353216;
+	heap32[(r13+1)] = 0;
+	heap32[(r13+2)] = 0;
+	heap32[(r13+3)] = 0;
+	heap32[(r13+4)] = 0;
+	heap32[(r13+5)] = 1065353216;
+	heap32[(r13+6)] = 0;
+	heap32[(r13+7)] = 0;
+	heap32[(r13+8)] = 0;
+	heap32[(r13+9)] = 0;
+	heap32[(r13+10)] = 1065353216;
+	heap32[(r13+11)] = 0;
+	heap32[(r13+12)] = 0;
+	heap32[(r13+13)] = 0;
+	heap32[(r13+14)] = 0;
+	heap32[(r13+15)] = 0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = r4;
+	f0 = heapFloat[(fp+-117)];
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r12;
+	r4 = sp + -336;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	r12 = r4 >> 2;
+	heap32[(fp+-84)] = 1065353216;
+	heap32[(r12+1)] = 0;
+	heap32[(r12+2)] = 0;
+	heap32[(r12+3)] = 0;
+	heap32[(r12+4)] = 0;
+	heap32[(r12+5)] = 1065353216;
+	heap32[(r12+6)] = 0;
+	heap32[(r12+7)] = 0;
+	heap32[(r12+8)] = 0;
+	heap32[(r12+9)] = 0;
+	heap32[(r12+10)] = 1065353216;
+	heap32[(r12+11)] = 0;
+	heap32[(r12+12)] = 0;
+	heap32[(r12+13)] = 0;
+	heap32[(r12+14)] = 0;
+	heap32[(r12+15)] = 0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	heap32[(g0+3)] = 0;
+	heap32[(g0+4)] = r10;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r4;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	f1 = heapFloat[(r3+136)];
+	f2 = heapFloat[(r3+137)];
+	f3 = heapFloat[(r3+138)];
+	f4 = f1*f1;
+	f5 = f2*f2;
+	f6 = heapFloat[(r3+139)];
+	f4 = f4+f5;
+	f5 = f3*f3;
+	f4 = f4+f5;
+	f5 = f6*f6;
+	f7 =                         2;
+	f4 = f4+f5;
+	f4 = f7/f4;
+	f5 = f3*f4;
+	f7 = f2*f4;
+	f4 = f1*f4;
+	f3 = f3*f5;
+	f8 = f1*f4;
+	f9 = f2*f7;
+	f0 =                         1;
+	heapFloat[(fp+-118)] = f0;
+	f10 = f9+f3;
+	f3 = f8+f3;
+	f11 = f1*f7;
+	f12 = f6*f5;
+	f10 = f0-f10;
+	f0 = heapFloat[(r3+92)];
+	heapFloat[(fp+-131)] = f0;
+	f13 = f11-f12;
+	f0 = heapFloat[(r3+88)];
+	heapFloat[(fp+-120)] = f0;
+	f11 = f11+f12;
+	f12 = heapFloat[(r3+93)];
+	heapFloat[(fp+-132)] = f12;
+	f0 = heapFloat[(fp+-118)];
+	f3 = f0-f3;
+	f0 = heapFloat[(r3+89)];
+	heapFloat[(fp+-121)] = f0;
+	f1 = f1*f5;
+	f7 = f6*f7;
+	f2 = f2*f5;
+	f4 = f6*f4;
+	f5 = f1+f7;
+	f6 = heapFloat[(r3+96)];
+	heapFloat[(fp+-129)] = f6;
+	f12 = f2-f4;
+	f14 = heapFloat[(r3+97)];
+	heapFloat[(fp+-136)] = f14;
+	f8 = f8+f9;
+	f0 = heapFloat[(fp+-120)];
+	f9 = f10*f0;
+	f0 = heapFloat[(fp+-121)];
+	f15 = f11*f0;
+	f0 = heapFloat[(fp+-120)];
+	f16 = f13*f0;
+	f0 = heapFloat[(fp+-121)];
+	f17 = f3*f0;
+	f0 = heapFloat[(fp+-131)];
+	f18 = f10*f0;
+	f19 = heapFloat[(fp+-132)];
+	f20 = f11*f19;
+	f21 = f13*f0;
+	f22 = f3*f19;
+	f1 = f1-f7;
+	f7 = heapFloat[(r3+94)];
+	heapFloat[(fp+-137)] = f7;
+	f2 = f2+f4;
+	f0 = heapFloat[(r3+90)];
+	heapFloat[(fp+-133)] = f0;
+	f0 = heapFloat[(fp+-118)];
+	f4 = f0-f8;
+	f6 = heapFloat[(r3+98)];
+	heapFloat[(fp+-130)] = f6;
+	f7 = f9+f15;
+	f0 = heapFloat[(fp+-133)];
+	f8 = f1*f0;
+	f9 = f16+f17;
+	f14 = f2*f0;
+	f0 = heapFloat[(fp+-120)];
+	f15 = f5*f0;
+	f0 = heapFloat[(fp+-121)];
+	f16 = f12*f0;
+	f17 = f18+f20;
+	f18 = heapFloat[(fp+-137)];
+	f19 = f1*f18;
+	f20 = f21+f22;
+	f21 = f2*f18;
+	f0 = heapFloat[(fp+-131)];
+	f22 = f5*f0;
+	f23 = heapFloat[(fp+-132)];
+	f24 = f12*f23;
+	f6 = heapFloat[(fp+-129)];
+	f10 = f10*f6;
+	f25 = heapFloat[(fp+-136)];
+	f11 = f11*f25;
+	f13 = f13*f6;
+	f3 = f3*f25;
+	f0 = f7+f8;
+	heapFloat[(fp+-124)] = f0;
+	f6 = heapFloat[(r3+72)];
+	f7 = f17+f19;
+	heapFloat[(fp+-134)] = f7;
+	f0 = f9+f14;
+	heapFloat[(fp+-125)] = f0;
+	f7 = heapFloat[(r3+73)];
+	f8 = f20+f21;
+	heapFloat[(fp+-139)] = f8;
+	f9 = f15+f16;
+	f0 = heapFloat[(fp+-133)];
+	f14 = f4*f0;
+	f15 = f22+f24;
+	f16 = f4*f18;
+	f10 = f10+f11;
+	f11 = heapFloat[(fp+-130)];
+	f1 = f1*f11;
+	f3 = f13+f3;
+	f2 = f2*f11;
+	f13 = heapFloat[(fp+-129)];
+	f5 = f5*f13;
+	f12 = f12*f25;
+	f17 = heapFloat[(r3+76)];
+	f1 = f10+f1;
+	heapFloat[(fp+-138)] = f1;
+	f10 = heapFloat[(r3+77)];
+	f2 = f3+f2;
+	heapFloat[(fp+-123)] = f2;
+	f0 = heapFloat[(fp+-124)];
+	f3 = f6*f0;
+	f0 = heapFloat[(fp+-125)];
+	f19 = f7*f0;
+	f0 = f9+f14;
+	heapFloat[(fp+-126)] = f0;
+	f1 = heapFloat[(r3+74)];
+	f0 = f15+f16;
+	heapFloat[(fp+-127)] = f0;
+	f2 = heapFloat[(fp+-134)];
+	f8 = f6*f2;
+	f9 = heapFloat[(fp+-139)];
+	f11 = f7*f9;
+	f5 = f5+f12;
+	f12 = heapFloat[(fp+-130)];
+	f4 = f4*f12;
+	f13 = heapFloat[(r3+80)];
+	f14 = heapFloat[(r3+81)];
+	f15 = heapFloat[(r3+78)];
+	f4 = f5+f4;
+	heapFloat[(fp+-122)] = f4;
+	f0 = heapFloat[(fp+-124)];
+	f5 = f17*f0;
+	f0 = heapFloat[(fp+-125)];
+	f16 = f10*f0;
+	f18 = f17*f2;
+	f20 = f10*f9;
+	f3 = f3+f19;
+	f0 = heapFloat[(fp+-126)];
+	f19 = f1*f0;
+	f8 = f8+f11;
+	f0 = heapFloat[(fp+-127)];
+	f11 = f1*f0;
+	f21 = heapFloat[(fp+-138)];
+	f22 = f6*f21;
+	f2 = heapFloat[(fp+-123)];
+	f23 = f7*f2;
+	f24 = heapFloat[(r3+82)];
+	f0 = heapFloat[(fp+-124)];
+	f25 = f13*f0;
+	f0 = heapFloat[(fp+-125)];
+	f26 = f14*f0;
+	f2 = heapFloat[(fp+-134)];
+	f27 = f13*f2;
+	f28 = f14*f9;
+	f5 = f5+f16;
+	f0 = heapFloat[(fp+-126)];
+	f16 = f15*f0;
+	f18 = f18+f20;
+	f0 = heapFloat[(fp+-127)];
+	f20 = f15*f0;
+	f29 = f17*f21;
+	f2 = heapFloat[(fp+-123)];
+	f30 = f10*f2;
+	f3 = f3+f19;
+	f19 = heapFloat[(fp+-84)];
+	heapFloat[(fp+-140)] = f19;
+	f0 = f8+f11;
+	heapFloat[(fp+-135)] = f0;
+	f2 = heapFloat[(r12+1)];
+	heapFloat[(fp+-128)] = f2;
+	f4 = f22+f23;
+	f8 = heapFloat[(fp+-122)];
+	f9 = f1*f8;
+	f5 = f5+f16;
+	f0 = f18+f20;
+	heapFloat[(fp+-119)] = f0;
+	f2 = f25+f26;
+	f0 = heapFloat[(fp+-126)];
+	f8 = f24*f0;
+	f11 = f27+f28;
+	f0 = heapFloat[(fp+-127)];
+	f12 = f24*f0;
+	f16 = f13*f21;
+	f18 = heapFloat[(fp+-123)];
+	f19 = f14*f18;
+	f20 = f29+f30;
+	f22 = heapFloat[(fp+-122)];
+	f23 = f15*f22;
+	f25 = heapFloat[(fp+-140)];
+	f26 = f3*f25;
+	f0 = heapFloat[(fp+-135)];
+	f27 = heapFloat[(fp+-128)];
+	f28 = f0*f27;
+	f4 = f4+f9;
+	f9 = heapFloat[(r12+2)];
+	f29 = heapFloat[(r3+86)];
+	f30 = heapFloat[(r3+85)];
+	f0 = heapFloat[(r12+8)];
+	heapFloat[(fp+-141)] = f0;
+	f2 = f2+f8;
+	f8 = heapFloat[(r12+4)];
+	f0 = heapFloat[(r12+9)];
+	f11 = f11+f12;
+	f12 = heapFloat[(r12+5)];
+	f20 = f20+f23;
+	f18 = heapFloat[(r12+10)];
+	heapFloat[(fp+-148)] = f18;
+	f21 = heapFloat[(r12+6)];
+	f22 = heapFloat[(r3+84)];
+	f16 = f16+f19;
+	f19 = heapFloat[(fp+-122)];
+	f23 = f24*f19;
+	f27 = f5*f25;
+	f19 = heapFloat[(fp+-119)];
+	f18 = heapFloat[(fp+-128)];
+	f18 = f19*f18;
+	f26 = f26+f28;
+	f28 = f4*f9;
+	f19 = heapFloat[(r3+102)];
+	heapFloat[(fp+-142)] = f19;
+	f19 = heapFloat[(r3+101)];
+	heapFloat[(fp+-143)] = f19;
+	f19 = heapFloat[(r3+100)];
+	heapFloat[(fp+-145)] = f19;
+	f19 = heapFloat[(r12+14)];
+	heapFloat[(fp+-144)] = f19;
+	f19 = heapFloat[(r12+13)];
+	heapFloat[(fp+-146)] = f19;
+	f19 = heapFloat[(r12+12)];
+	heapFloat[(fp+-147)] = f19;
+	f16 = f16+f23;
+	r4 = sp + -400;
+	f23 = f2*f25;
+	f19 = heapFloat[(fp+-128)];
+	f19 = f11*f19;
+	f18 = f27+f18;
+	f27 = f20*f9;
+	f26 = f26+f28;
+	f22 = -f22;
+	r10 = r4 >> 2;
+	f19 = f23+f19;
+	f23 = f16*f9;
+	f18 = f18+f27;
+	heapFloat[(fp+-100)] = f26;
+	f6 = f6*f22;
+	f17 = f17*f30;
+	f7 = f7*f22;
+	f10 = f10*f30;
+	f26 = f3*f8;
+	f27 = heapFloat[(fp+-135)];
+	f28 = f27*f12;
+	f19 = f19+f23;
+	heapFloat[(r10+1)] = f18;
+	f18 =                         0;
+	heapFloat[(r10+2)] = f19;
+	f6 = f6-f17;
+	f13 = f13*f29;
+	f7 = f7-f10;
+	f10 = f14*f29;
+	f1 = f1*f22;
+	f14 = f15*f30;
+	f15 = f5*f8;
+	f19 = heapFloat[(fp+-119)];
+	f17 = f19*f12;
+	f22 = f26+f28;
+	f23 = f4*f21;
+	f6 = f6-f13;
+	f7 = f7-f10;
+	f10 = heapFloat[(fp+-120)];
+	f10 = f10*f18;
+	f13 = heapFloat[(fp+-121)];
+	f13 = f13*f18;
+	f26 = heapFloat[(fp+-131)];
+	f26 = f26*f18;
+	f28 = heapFloat[(fp+-132)];
+	f28 = f28*f18;
+	f1 = f1-f14;
+	f14 = f24*f29;
+	f24 = f2*f8;
+	f29 = f11*f12;
+	f15 = f15+f17;
+	f17 = f20*f21;
+	f22 = f22+f23;
+	heap32[(r10+3)] = 0;
+	f1 = f1-f14;
+	f14 = heapFloat[(fp+-124)];
+	f14 = f14*f6;
+	f23 = heapFloat[(fp+-125)];
+	f23 = f23*f7;
+	f10 = f10+f13;
+	f13 = heapFloat[(fp+-133)];
+	f13 = f13*f18;
+	f30 = heapFloat[(fp+-134)];
+	f30 = f30*f6;
+	f19 = heapFloat[(fp+-139)];
+	f19 = f19*f7;
+	f26 = f26+f28;
+	f28 = heapFloat[(fp+-137)];
+	f28 = f28*f18;
+	f25 = heapFloat[(fp+-129)];
+	f25 = f25*f18;
+	f27 = heapFloat[(fp+-136)];
+	f27 = f27*f18;
+	f24 = f24+f29;
+	f29 = f16*f21;
+	f15 = f15+f17;
+	heapFloat[(r10+4)] = f22;
+	f10 = f10+f13;
+	f13 = f26+f28;
+	f14 = f14+f23;
+	f17 = heapFloat[(fp+-126)];
+	f17 = f17*f1;
+	f19 = f30+f19;
+	f22 = heapFloat[(fp+-127)];
+	f22 = f22*f1;
+	f23 = heapFloat[(fp+-138)];
+	f6 = f23*f6;
+	f23 = heapFloat[(fp+-123)];
+	f7 = f23*f7;
+	f23 = f25+f27;
+	f25 = heapFloat[(fp+-130)];
+	f25 = f25*f18;
+	f26 = heapFloat[(fp+-141)];
+	f27 = f3*f26;
+	f28 = heapFloat[(fp+-135)];
+	f30 = f28*f0;
+	f24 = f24+f29;
+	heapFloat[(r10+5)] = f15;
+	f15 = f23+f25;
+	heapFloat[(r10+6)] = f24;
+	f14 = f14+f17;
+	f17 = heapFloat[(fp+-145)];
+	f10 = f10+f17;
+	f17 = f19+f22;
+	f19 = heapFloat[(fp+-143)];
+	f13 = f13+f19;
+	f6 = f6+f7;
+	f19 = heapFloat[(fp+-122)];
+	f1 = f19*f1;
+	f7 = f5*f26;
+	f19 = heapFloat[(fp+-119)];
+	f22 = f19*f0;
+	f23 = f27+f30;
+	f24 = heapFloat[(fp+-148)];
+	f25 = f4*f24;
+	f13 = f17+f13;
+	f10 = f14+f10;
+	f1 = f6+f1;
+	f19 = heapFloat[(fp+-142)];
+	f6 = f15+f19;
+	f14 = f2*f26;
+	f15 = f11*f0;
+	f7 = f7+f22;
+	f17 = f20*f24;
+	f19 = f23+f25;
+	heap32[(r10+7)] = 0;
+	f1 = f1+f6;
+	f25 = heapFloat[(fp+-140)];
+	f6 = f25*f10;
+	f22 = heapFloat[(fp+-128)];
+	f22 = f22*f13;
+	f14 = f14+f15;
+	f15 = f16*f24;
+	f7 = f7+f17;
+	heapFloat[(r10+8)] = f19;
+	f8 = f8*f10;
+	f12 = f12*f13;
+	f6 = f6+f22;
+	f9 = f9*f1;
+	f14 = f14+f15;
+	heapFloat[(r10+9)] = f7;
+	f6 = f6+f9;
+	heapFloat[(r10+10)] = f14;
+	f7 = f26*f10;
+	f0 = f0*f13;
+	f8 = f8+f12;
+	f9 = f21*f1;
+	f8 = f8+f9;
+	f0 = f7+f0;
+	f7 = f24*f1;
+	f19 = heapFloat[(fp+-147)];
+	f6 = f6+f19;
+	heap32[(r10+11)] = 0;
+	f0 = f0+f7;
+	f19 = heapFloat[(fp+-146)];
+	f7 = f8+f19;
+	heapFloat[(r10+12)] = f6;
+	f19 = heapFloat[(fp+-144)];
+	f0 = f0+f19;
+	heapFloat[(r10+13)] = f7;
+	heapFloat[(r10+14)] = f0;
+	heap32[(r10+15)] = 0;
+	f0 = heapFloat[(fp+-68)];
+	f6 = heapFloat[(r13+1)];
+	f7 = heapFloat[(r13+2)];
+	f8 = f3*f0;
+	f9 = f5*f6;
+	f12 = heapFloat[(r13+8)];
+	f14 = heapFloat[(r13+9)];
+	f15 = heapFloat[(r13+10)];
+	f17 = heapFloat[(r13+4)];
+	f19 = heapFloat[(r13+5)];
+	f21 = heapFloat[(r13+6)];
+	f22 = f28*f0;
+	f23 = heapFloat[(fp+-119)];
+	f24 = f23*f6;
+	f8 = f8+f9;
+	f9 = f2*f7;
+	f25 = heapFloat[(r13+14)];
+	f26 = heapFloat[(r13+13)];
+	f27 = heapFloat[(r13+12)];
+	r10 = sp + -464;
+	f29 = f4*f0;
+	f30 = f20*f6;
+	f22 = f22+f24;
+	f24 = f11*f7;
+	f8 = f8+f9;
+	r12 = r10 >> 2;
+	f9 = f29+f30;
+	f29 = f16*f7;
+	f22 = f22+f24;
+	heapFloat[(fp+-116)] = f8;
+	f8 = f3*f17;
+	f24 = f5*f19;
+	f9 = f9+f29;
+	heapFloat[(r12+1)] = f22;
+	heapFloat[(r12+2)] = f9;
+	f9 = f28*f17;
+	f22 = f23*f19;
+	f8 = f8+f24;
+	f24 = f2*f21;
+	f29 = f4*f17;
+	f30 = f20*f19;
+	f9 = f9+f22;
+	f22 = f11*f21;
+	f8 = f8+f24;
+	heap32[(r12+3)] = 0;
+	f10 = -f10;
+	f24 = f29+f30;
+	f29 = f16*f21;
+	f9 = f9+f22;
+	heapFloat[(r12+4)] = f8;
+	f8 = f3*f10;
+	f22 = f28*f13;
+	f30 = f5*f10;
+	f23 = f23*f13;
+	f3 = f3*f12;
+	f5 = f5*f14;
+	f24 = f24+f29;
+	heapFloat[(r12+5)] = f9;
+	heapFloat[(r12+6)] = f24;
+	f8 = f8-f22;
+	f9 = f4*f1;
+	f22 = f30-f23;
+	f23 = f20*f1;
+	f10 = f2*f10;
+	f13 = f11*f13;
+	f24 = f28*f12;
+	f28 = heapFloat[(fp+-119)];
+	f28 = f28*f14;
+	f3 = f3+f5;
+	f2 = f2*f15;
+	f5 = f8-f9;
+	f8 = f22-f23;
+	f9 = f10-f13;
+	f1 = f16*f1;
+	f4 = f4*f12;
+	f10 = f20*f14;
+	f13 = f24+f28;
+	f11 = f11*f15;
+	f2 = f3+f2;
+	heap32[(r12+7)] = 0;
+	f1 = f9-f1;
+	f0 = f0*f5;
+	f3 = f6*f8;
+	f4 = f4+f10;
+	f6 = f16*f15;
+	f9 = f13+f11;
+	heapFloat[(r12+8)] = f2;
+	f2 = f17*f5;
+	f10 = f19*f8;
+	f0 = f0+f3;
+	f3 = f7*f1;
+	f4 = f4+f6;
+	heapFloat[(r12+9)] = f9;
+	f0 = f0+f3;
+	heapFloat[(r12+10)] = f4;
+	f3 = f12*f5;
+	f4 = f14*f8;
+	f2 = f2+f10;
+	f5 = f21*f1;
+	f2 = f2+f5;
+	f3 = f3+f4;
+	f1 = f15*f1;
+	f0 = f0+f27;
+	heap32[(r12+11)] = 0;
+	f1 = f3+f1;
+	f2 = f2+f26;
+	heapFloat[(r12+12)] = f0;
+	f0 = f1+f25;
+	heapFloat[(r12+13)] = f2;
+	heapFloat[(r12+14)] = f0;
+	heap32[(r12+15)] = 0;
+	r12 = sp + -16;
+	r13 = sp + -20;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r13;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	r4 = r12 >> 2;
+	f0 = heapFloat[(r4+2)];
+	f1 = heapFloat[(fp+-5)];
+	f2 = heapFloat[(r4+1)];
+	f3 = heapFloat[(fp+-4)];
+	r4 = sp + -40;
+	r5 = sp + -44;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	f2 = f2*f1;
+	f5 = heapFloat[(fp+-118)];
+	f4 = heapFloat[(fp+-117)];
+	f4 = f5/f4;
+	f3 = f3*f1;
+	r4 = r4 >> 2;
+	f0 = f0*f1;
+	f1 = f2*f4;
+	f2 = heapFloat[(r7+1)];
+	f3 = f3*f4;
+	f5 = heapFloat[(fp+-48)];
+	f1 = f1-f2;
+	f2 = f3-f5;
+	f0 = f0*f4;
+	f3 = heapFloat[(r7+2)];
+	f5 = heapFloat[(r4+2)];
+	f6 = heapFloat[(fp+-11)];
+	f7 = heapFloat[(r4+1)];
+	f8 = heapFloat[(fp+-10)];
+	f0 = f0-f3;
+	f3 = f5*f6;
+	f5 = f7*f6;
+	f6 = f8*f6;
+	f7 = f2*f2;
+	f8 = f1*f1;
+	f7 = f7+f8;
+	f8 = f0*f0;
+	f3 = f3*f4;
+	f9 = heapFloat[(r11+2)];
+	f5 = f5*f4;
+	f10 = heapFloat[(r11+1)];
+	f4 = f6*f4;
+	f6 = heapFloat[(fp+-52)];
+	f7 = f7+f8;
+	f3 = f3-f9;
+	f5 = f5-f10;
+	f4 = f4-f6;
+	f6 =   1.1920928955078125e-007;
+	if(f7 >f6) //_LBB582_11
+{
+	heapFloat[(g0)] = f7;
+	sqrtf(i7);
+	r4 = heap32[(r3+5)];
+	r4 = r4 >> 2;
+	f7 = heapFloat[(fp+-118)];
+	f18 = f7/f_g0;
+	f7 = f2*f18;
+	f8 = heapFloat[(r4+64)];
+	f9 = heapFloat[(r4+65)];
+	f10 = f1*f18;
+	f11 = heapFloat[(r4+68)];
+	f12 = heapFloat[(r4+69)];
+	f13 = f0*f18;
+	f18 = heapFloat[(r4+72)];
+	f14 = heapFloat[(r4+73)];
+	f15 = heapFloat[(r4+66)];
+	f16 = heapFloat[(r4+70)];
+	f8 = f8*f7;
+	f11 = f11*f10;
+	f9 = f9*f7;
+	f12 = f12*f10;
+	f17 = heapFloat[(r4+74)];
+	f8 = f8+f11;
+	f18 = f18*f13;
+	f9 = f9+f12;
+	f11 = f14*f13;
+	f12 = f15*f7;
+	f14 = f16*f10;
+	f18 = f8+f18;
+	f8 = f9+f11;
+	f9 = f12+f14;
+	f11 = f17*f13;
+	f9 = f9+f11;
+	f18 = f7*f18;
+	f8 = f10*f8;
+	f18 = f18+f8;
+	f8 = f13*f9;
+	f18 = f18+f8;
+}
+	f8 = f4*f4;
+	f9 = f5*f5;
+	f8 = f8+f9;
+	f9 = f3*f3;
+	f8 = f8+f9;
+	if(f8 >f6) //_LBB582_14
+{
+	heapFloat[(g0)] = f8;
+	sqrtf(i7);
+	r4 = heap32[(r3+6)];
+	r4 = r4 >> 2;
+	f9 = heapFloat[(fp+-118)];
+	f8 = f9/f_g0;
+	f9 = f4*f8;
+	f11 = heapFloat[(r4+64)];
+	f12 = heapFloat[(r4+65)];
+	f14 = f5*f8;
+	f15 = heapFloat[(r4+68)];
+	f16 = heapFloat[(r4+69)];
+	f17 = f3*f8;
+	f8 = heapFloat[(r4+72)];
+	f19 = heapFloat[(r4+73)];
+	f20 = heapFloat[(r4+66)];
+	f21 = heapFloat[(r4+70)];
+	f11 = f11*f9;
+	f15 = f15*f14;
+	f12 = f12*f9;
+	f16 = f16*f14;
+	f22 = heapFloat[(r4+74)];
+	f11 = f11+f15;
+	f8 = f8*f17;
+	f12 = f12+f16;
+	f15 = f19*f17;
+	f16 = f20*f9;
+	f19 = f21*f14;
+	f8 = f11+f8;
+	f11 = f12+f15;
+	f12 = f16+f19;
+	f15 = f22*f17;
+	f12 = f12+f15;
+	f8 = f9*f8;
+	f11 = f14*f11;
+	f8 = f8+f11;
+	f11 = f17*f12;
+	f8 = f8+f11;
+}
+else{
+	f8 =                         0;
+}
+	f10 = f10*f18;
+	f11 = f14*f8;
+	f7 = f7*f18;
+	f9 = f9*f8;
+	f10 = f10+f11;
+	f7 = f7+f9;
+	f9 = f13*f18;
+	f8 = f17*f8;
+	f8 = f9+f8;
+	f9 = f7*f7;
+	f11 = f10*f10;
+	f9 = f9+f11;
+	f11 = f8*f8;
+	f9 = f9+f11;
+if(!(f9 <=f6)) //_LBB582_35
+{
+	heapFloat[(g0)] = f9;
+	sqrtf(i7);
+	r4 = heap32[(r3+5)];
+	r5 = heap32[(r3+6)];
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	f9 = heapFloat[(fp+-118)];
+	f6 = f9/f_g0;
+	f11 = heapFloat[(r4+64)];
+	f7 = f7*f6;
+	f12 = heapFloat[(r4+65)];
+	f13 = heapFloat[(r5+64)];
+	f14 = heapFloat[(r5+65)];
+	f15 = heapFloat[(r4+68)];
+	f10 = f10*f6;
+	f16 = heapFloat[(r4+69)];
+	f17 = heapFloat[(r5+68)];
+	f18 = heapFloat[(r5+69)];
+	f19 = heapFloat[(r4+66)];
+	f20 = heapFloat[(r4+70)];
+	f21 = heapFloat[(r5+66)];
+	f22 = heapFloat[(r5+70)];
+	f11 = f11*f7;
+	f15 = f15*f10;
+	f23 = heapFloat[(r4+72)];
+	f6 = f8*f6;
+	f8 = heapFloat[(r4+73)];
+	f24 = heapFloat[(r5+72)];
+	f25 = heapFloat[(r5+73)];
+	f12 = f12*f7;
+	f16 = f16*f10;
+	f13 = f13*f7;
+	f17 = f17*f10;
+	f14 = f14*f7;
+	f18 = f18*f10;
+	f26 = heapFloat[(r4+74)];
+	f27 = heapFloat[(r5+74)];
+	f11 = f11+f15;
+	f15 = f23*f6;
+	f12 = f12+f16;
+	f8 = f8*f6;
+	f16 = f19*f7;
+	f19 = f20*f10;
+	f13 = f13+f17;
+	f17 = f24*f6;
+	f14 = f14+f18;
+	f18 = f25*f6;
+	f20 = f21*f7;
+	f21 = f22*f10;
+	f11 = f11+f15;
+	f8 = f12+f8;
+	f12 = f13+f17;
+	f13 = f14+f18;
+	f14 = f16+f19;
+	f15 = f26*f6;
+	f16 = f20+f21;
+	f17 = f27*f6;
+	f14 = f14+f15;
+	f15 = f16+f17;
+	f11 = f7*f11;
+	f8 = f10*f8;
+	f7 = f7*f12;
+	f10 = f10*f13;
+	f8 = f11+f8;
+	f11 = f6*f14;
+	f7 = f7+f10;
+	f6 = f6*f15;
+	f8 = f8+f11;
+	f6 = f7+f6;
+	f7 = f8+f6;
+	f7 = f7*f7;
+	f0 = f0*f8;
+	f3 = f3*f6;
+	f1 = f1*f8;
+	f5 = f5*f6;
+	f2 = f2*f8;
+	f4 = f4*f6;
+	f0 = f0-f3;
+	f3 = f9/f7;
+	f1 = f1-f5;
+	f2 = f2-f4;
+	f4 = heapFloat[(r3+140)];
+	f0 = f0*f3;
+	f1 = f1*f3;
+	f2 = f2*f3;
+	f3 =                         0;
+	if(f4 >=f3) //_LBB582_18
+{
+	r4 = heapU8[r0+541];
+	if(r4 !=0) //_LBB582_20
+{
+	f4 = f4/f8;
+}
+	f5 = heapFloat[(r3+141)];
+	f6 = heapFloat[(r3+142)];
+	f5 = f5+f2;
+	f6 = f6+f1;
+	f7 = heapFloat[(r3+143)];
+	f7 = f7+f0;
+	f8 = f5*f5;
+	f9 = f6*f6;
+	f8 = f8+f9;
+	f9 = f7*f7;
+	f8 = f8+f9;
+	heapFloat[(g0)] = f8;
+	sqrtf(i7);
+	f9 = f_g0;
+	if(f9 >f4) //_LBB582_23
+{
+	heapFloat[(g0)] = f8;
+	sqrtf(i7);
+	f1 = heapFloat[(fp+-118)];
+	f0 = f1/f_g0;
+	f1 = f7*f0;
+	f2 = f6*f0;
+	f0 = f5*f0;
+	f7 = heapFloat[(r3+143)];
+	f1 = f1*f4;
+	f6 = heapFloat[(r3+142)];
+	f2 = f2*f4;
+	f5 = heapFloat[(r3+141)];
+	f4 = f0*f4;
+	f0 = f1-f7;
+	f1 = f2-f6;
+	f2 = f4-f5;
+}
+else{
+	f5 = heapFloat[(r3+141)];
+	f6 = heapFloat[(r3+142)];
+	f7 = heapFloat[(r3+143)];
+}
+	f4 = f5+f2;
+	f5 = f6+f1;
+	heapFloat[(r3+141)] = f4;
+	f4 = f7+f0;
+	heapFloat[(r3+142)] = f5;
+	heapFloat[(r3+143)] = f4;
+}
+	f4 = f2*f2;
+	f5 = f1*f1;
+	f4 = f4+f5;
+	f5 = f0*f0;
+	f4 = f4+f5;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+	f5 = heapFloat[(fp+-118)];
+	f5 = f5/f4;
+	f0 = f0*f5;
+	f1 = f1*f5;
+	f2 = f2*f5;
+	f5 = heapFloat[(r8+84)];
+if(!(f5 ==f3)) //_LBB582_27
+{
+	r4 = heap32[(r3+5)];
+	r4 = r4 >> 2;
+	f5 = f4*f3;
+	f6 = heapFloat[(r8+126)];
+	f7 = heapFloat[(r4+65)];
+	f8 = heapFloat[(r4+64)];
+	f9 = heapFloat[(r4+69)];
+	f10 = heapFloat[(r4+68)];
+	f11 = heapFloat[(r4+73)];
+	f12 = heapFloat[(r4+72)];
+	f13 = heapFloat[(r4+66)];
+	f14 = heapFloat[(r4+70)];
+	f15 = heapFloat[(r4+74)];
+	f6 = f6+f5;
+	heapFloat[(r8+126)] = f6;
+	f6 = heapFloat[(r8+127)];
+	f6 = f6+f5;
+	heapFloat[(r8+127)] = f6;
+	f6 = heapFloat[(r8+128)];
+	f5 = f6+f5;
+	heapFloat[(r8+128)] = f5;
+	f5 = f8*f2;
+	f6 = f7*f1;
+	f7 = heapFloat[(r8+134)];
+	f5 = f5+f6;
+	f6 = f13*f0;
+	f5 = f5+f6;
+	f6 = f7*f4;
+	f7 = heapFloat[(r8+136)];
+	f8 = heapFloat[(r8+135)];
+	f13 = heapFloat[(r8+130)];
+	f5 = f5*f6;
+	f6 = f10*f2;
+	f9 = f9*f1;
+	f6 = f6+f9;
+	f9 = f14*f0;
+	f5 = f13+f5;
+	heapFloat[(r8+130)] = f5;
+	f5 = f6+f9;
+	f6 = f8*f4;
+	f8 = f12*f2;
+	f9 = f11*f1;
+	f5 = f5*f6;
+	f6 = heapFloat[(r8+131)];
+	f5 = f6+f5;
+	f6 = f8+f9;
+	f8 = f15*f0;
+	heapFloat[(r8+131)] = f5;
+	f5 = f6+f8;
+	f6 = f7*f4;
+	f5 = f5*f6;
+	f6 = heapFloat[(r8+132)];
+	f5 = f6+f5;
+	heapFloat[(r8+132)] = f5;
+}
+	f5 = heapFloat[(r9+84)];
+if(!(f5 ==f3)) //_LBB582_35
+{
+	f3 = -f4;
+	r4 = heap32[(r3+6)];
+	r4 = r4 >> 2;
+	f5 =                        -0;
+	f4 = f4*f5;
+	f5 = heapFloat[(r9+126)];
+	f6 = heapFloat[(r4+65)];
+	f7 = heapFloat[(r4+64)];
+	f8 = heapFloat[(r4+69)];
+	f9 = heapFloat[(r4+68)];
+	f10 = heapFloat[(r4+73)];
+	f11 = heapFloat[(r4+72)];
+	f12 = heapFloat[(r4+66)];
+	f13 = heapFloat[(r4+70)];
+	f14 = heapFloat[(r4+74)];
+	f5 = f5+f4;
+	heapFloat[(r9+126)] = f5;
+	f5 = heapFloat[(r9+127)];
+	f5 = f5+f4;
+	heapFloat[(r9+127)] = f5;
+	f5 = heapFloat[(r9+128)];
+	f4 = f5+f4;
+	heapFloat[(r9+128)] = f4;
+	f4 = f7*f2;
+	f5 = f6*f1;
+	f4 = f4+f5;
+	f5 = f12*f0;
+	f6 = heapFloat[(r9+134)];
+	f4 = f4+f5;
+	f5 = f6*f3;
+	f6 = heapFloat[(r9+136)];
+	f7 = heapFloat[(r9+135)];
+	f12 = heapFloat[(r9+130)];
+	f4 = f4*f5;
+	f5 = f9*f2;
+	f8 = f8*f1;
+	f5 = f5+f8;
+	f8 = f13*f0;
+	f4 = f12+f4;
+	heapFloat[(r9+130)] = f4;
+	f4 = f5+f8;
+	f5 = f7*f3;
+	f2 = f11*f2;
+	f1 = f10*f1;
+	f4 = f4*f5;
+	f5 = heapFloat[(r9+131)];
+	f4 = f5+f4;
+	f1 = f2+f1;
+	f0 = f14*f0;
+	heapFloat[(r9+131)] = f4;
+	f0 = f1+f0;
+	f1 = f6*f3;
+	f0 = f0*f1;
+	f1 = heapFloat[(r9+132)];
+	f0 = f1+f0;
+	heapFloat[(r9+132)] = f0;
+}
+}
+}
+} while(0);
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r1+82)];
+	f1 = heapFloat[(r1+132)];
+	f2 = heapFloat[(r1+81)];
+	f3 = heapFloat[(r1+131)];
+	f4 = heapFloat[(r1+80)];
+	f5 = heapFloat[(r1+130)];
+	f6 = heapFloat[(r2+82)];
+	f7 = heapFloat[(r2+132)];
+	f8 = heapFloat[(r2+81)];
+	f9 = heapFloat[(r2+131)];
+	f10 = heapFloat[(r2+80)];
+	f11 = heapFloat[(r2+130)];
+	f0 = f0+f1;
+	f1 = f2+f3;
+	f2 = f4+f5;
+	f3 = f6+f7;
+	f4 = f8+f9;
+	f5 = f10+f11;
+	r4 = heapU8[r0+514];
+if(!(r4 ==0)) //_LBB582_43
+{
+	f6 = heapFloat[(r3+129)];
+	f7 = heapFloat[(r3+123)];
+	f8 = heapFloat[(r3+112)];
+	f9 = f5-f2;
+	f10 = heapFloat[(r3+113)];
+	f11 = f4-f1;
+	f12 = heapFloat[(r3+114)];
+	f13 = f3-f0;
+	f9 = f9*f8;
+	f11 = f11*f10;
+	f7 = f6*f7;
+	f14 = heapFloat[(r3+105)];
+	f9 = f9+f11;
+	f11 = f13*f12;
+	f7 = f7*f14;
+	f9 = f9+f11;
+	f11 = heapFloat[(fp+-117)];
+	f7 = f7/f11;
+	f11 =                         0;
+	if(f9 >f11) //_LBB582_38
+{
+	f6 = f6*f9;
+	f9 = heapFloat[(r3+106)];
+	f6 = f6*f9;
+	f7 = f6+f7;
+}
+	f6 = heapFloat[(r3+120)];
+	f9 = heapFloat[(r3+126)];
+	f6 = f6*f7;
+	f6 = f9+f6;
+	f6 = f6 > f11 ? f6 : f11;
+	heapFloat[(r3+126)] = f6;
+	f6 = f6-f9;
+	f7 = f8*f6;
+	f8 = heapFloat[(r3+131)];
+	f9 = f10*f6;
+	f10 = heapFloat[(r3+132)];
+	f13 = heapFloat[(r3+133)];
+	f6 = f12*f6;
+	f12 = f7*f8;
+	f14 = f9*f10;
+	f12 = f12+f14;
+	f14 = f6*f13;
+	f12 = f12+f14;
+	f10 = f10*f12;
+	f8 = f8*f12;
+	f12 = f13*f12;
+	f9 = f9-f10;
+	f7 = f7-f8;
+	f6 = f6-f12;
+	f8 = f7*f7;
+	f10 = f9*f9;
+	f8 = f8+f10;
+	f10 = f6*f6;
+	f8 = f8+f10;
+	heapFloat[(g0)] = f8;
+	sqrtf(i7);
+	f8 = f_g0;
+	f10 =                         1;
+	f10 = f10/f8;
+	f6 = f6*f10;
+	f9 = f9*f10;
+	f7 = f7*f10;
+	f10 = heapFloat[(r1+84)];
+if(!(f10 ==f11)) //_LBB582_41
+{
+	r4 = heap32[(r3+5)];
+	r4 = r4 >> 2;
+	f10 = f8*f11;
+	f12 = heapFloat[(r1+126)];
+	f13 = heapFloat[(r4+65)];
+	f14 = heapFloat[(r4+64)];
+	f15 = heapFloat[(r4+69)];
+	f16 = heapFloat[(r4+68)];
+	f17 = heapFloat[(r4+73)];
+	f18 = heapFloat[(r4+72)];
+	f19 = heapFloat[(r4+66)];
+	f20 = heapFloat[(r4+70)];
+	f21 = heapFloat[(r4+74)];
+	f12 = f12+f10;
+	heapFloat[(r1+126)] = f12;
+	f12 = heapFloat[(r1+127)];
+	f12 = f12+f10;
+	heapFloat[(r1+127)] = f12;
+	f12 = heapFloat[(r1+128)];
+	f10 = f12+f10;
+	heapFloat[(r1+128)] = f10;
+	f10 = f14*f7;
+	f12 = f13*f9;
+	f13 = heapFloat[(r1+134)];
+	f10 = f10+f12;
+	f12 = f19*f6;
+	f10 = f10+f12;
+	f12 = f13*f8;
+	f13 = heapFloat[(r1+136)];
+	f14 = heapFloat[(r1+135)];
+	f19 = heapFloat[(r1+130)];
+	f10 = f10*f12;
+	f12 = f16*f7;
+	f15 = f15*f9;
+	f12 = f12+f15;
+	f15 = f20*f6;
+	f10 = f19+f10;
+	heapFloat[(r1+130)] = f10;
+	f10 = f12+f15;
+	f12 = f14*f8;
+	f14 = f18*f7;
+	f15 = f17*f9;
+	f10 = f10*f12;
+	f12 = heapFloat[(r1+131)];
+	f10 = f12+f10;
+	f12 = f14+f15;
+	f14 = f21*f6;
+	heapFloat[(r1+131)] = f10;
+	f10 = f12+f14;
+	f12 = f13*f8;
+	f10 = f10*f12;
+	f12 = heapFloat[(r1+132)];
+	f10 = f12+f10;
+	heapFloat[(r1+132)] = f10;
+}
+	f10 = heapFloat[(r2+84)];
+if(!(f10 ==f11)) //_LBB582_43
+{
+	f10 = -f8;
+	r4 = heap32[(r3+6)];
+	r4 = r4 >> 2;
+	f11 =                        -0;
+	f8 = f8*f11;
+	f11 = heapFloat[(r2+126)];
+	f12 = heapFloat[(r4+65)];
+	f13 = heapFloat[(r4+64)];
+	f14 = heapFloat[(r4+69)];
+	f15 = heapFloat[(r4+68)];
+	f16 = heapFloat[(r4+73)];
+	f17 = heapFloat[(r4+72)];
+	f18 = heapFloat[(r4+66)];
+	f19 = heapFloat[(r4+70)];
+	f20 = heapFloat[(r4+74)];
+	f11 = f11+f8;
+	heapFloat[(r2+126)] = f11;
+	f11 = heapFloat[(r2+127)];
+	f11 = f11+f8;
+	heapFloat[(r2+127)] = f11;
+	f11 = heapFloat[(r2+128)];
+	f8 = f11+f8;
+	heapFloat[(r2+128)] = f8;
+	f8 = f13*f7;
+	f11 = f12*f9;
+	f8 = f8+f11;
+	f11 = f18*f6;
+	f12 = heapFloat[(r2+134)];
+	f8 = f8+f11;
+	f11 = f12*f10;
+	f12 = heapFloat[(r2+136)];
+	f13 = heapFloat[(r2+135)];
+	f18 = heapFloat[(r2+130)];
+	f8 = f8*f11;
+	f11 = f15*f7;
+	f14 = f14*f9;
+	f11 = f11+f14;
+	f14 = f19*f6;
+	f8 = f18+f8;
+	heapFloat[(r2+130)] = f8;
+	f8 = f11+f14;
+	f11 = f13*f10;
+	f7 = f17*f7;
+	f9 = f16*f9;
+	f8 = f8*f11;
+	f11 = heapFloat[(r2+131)];
+	f8 = f11+f8;
+	f7 = f7+f9;
+	f6 = f20*f6;
+	heapFloat[(r2+131)] = f8;
+	f6 = f7+f6;
+	f7 = f12*f10;
+	f6 = f6*f7;
+	f7 = heapFloat[(r2+132)];
+	f6 = f7+f6;
+	heapFloat[(r2+132)] = f6;
+}
+}
+	r0 = heapU8[r0+513];
+if(!(r0 ==0)) //_LBB582_52
+{
+	f6 = heapFloat[(r3+130)];
+	f7 = heapFloat[(r3+124)];
+	f8 = heapFloat[(r3+116)];
+	f2 = f5-f2;
+	f5 = heapFloat[(r3+117)];
+	f1 = f4-f1;
+	f4 = heapFloat[(r3+118)];
+	f0 = f3-f0;
+	f2 = f2*f8;
+	f1 = f1*f5;
+	f3 = f6*f7;
+	f7 = heapFloat[(r3+105)];
+	f1 = f2+f1;
+	f0 = f0*f4;
+	f2 = f3*f7;
+	f0 = f1+f0;
+	f1 = heapFloat[(fp+-117)];
+	f1 = f2/f1;
+	f2 =                         0;
+	if(f0 >f2) //_LBB582_46
+{
+	f0 = f6*f0;
+	f3 = heapFloat[(r3+106)];
+	f0 = f0*f3;
+	f1 = f0+f1;
+}
+	f0 = heapFloat[(r3+121)];
+	f3 = heapFloat[(r3+127)];
+	f0 = f0*f1;
+	f0 = f3+f0;
+	f0 = f0 > f2 ? f0 : f2;
+	heapFloat[(r3+127)] = f0;
+	f0 = f0-f3;
+	f1 = heapFloat[(r1+84)];
+	if(f1 !=f2) //_LBB582_49
+{
+	r0 = heap32[(r3+5)];
+	r0 = r0 >> 2;
+	f1 = f0*f2;
+	f3 = heapFloat[(r1+126)];
+	f6 = heapFloat[(r0+65)];
+	f7 = heapFloat[(r0+64)];
+	f9 = heapFloat[(r0+69)];
+	f10 = heapFloat[(r0+68)];
+	f11 = heapFloat[(r0+73)];
+	f12 = heapFloat[(r0+72)];
+	f13 = heapFloat[(r0+66)];
+	f14 = heapFloat[(r0+70)];
+	f15 = heapFloat[(r0+74)];
+	f3 = f3+f1;
+	heapFloat[(r1+126)] = f3;
+	f3 = heapFloat[(r1+127)];
+	f3 = f3+f1;
+	heapFloat[(r1+127)] = f3;
+	f3 = heapFloat[(r1+128)];
+	f1 = f3+f1;
+	heapFloat[(r1+128)] = f1;
+	f1 = f7*f8;
+	f3 = f6*f5;
+	f6 = heapFloat[(r1+134)];
+	f1 = f1+f3;
+	f3 = f13*f4;
+	f1 = f1+f3;
+	f3 = f6*f0;
+	f6 = heapFloat[(r1+136)];
+	f7 = heapFloat[(r1+135)];
+	f13 = heapFloat[(r1+130)];
+	f1 = f1*f3;
+	f3 = f10*f8;
+	f9 = f9*f5;
+	f3 = f3+f9;
+	f9 = f14*f4;
+	f1 = f13+f1;
+	heapFloat[(r1+130)] = f1;
+	f1 = f3+f9;
+	f3 = f7*f0;
+	f8 = f12*f8;
+	f5 = f11*f5;
+	f1 = f1*f3;
+	f3 = heapFloat[(r1+131)];
+	f1 = f3+f1;
+	f5 = f8+f5;
+	f4 = f15*f4;
+	heapFloat[(r1+131)] = f1;
+	f4 = f5+f4;
+	f5 = f6*f0;
+	f4 = f4*f5;
+	f5 = heapFloat[(r1+132)];
+	f4 = f5+f4;
+	heapFloat[(r1+132)] = f4;
+	f8 = heapFloat[(r3+116)];
+	f5 = heapFloat[(r3+117)];
+	f4 = heapFloat[(r3+118)];
+}
+	f1 = heapFloat[(r2+84)];
+if(!(f1 ==f2)) //_LBB582_52
+{
+	f1 = -f0;
+	r0 = heap32[(r3+6)];
+	r0 = r0 >> 2;
+	f2 =                        -0;
+	f0 = f0*f2;
+	f2 = heapFloat[(r2+126)];
+	f3 = heapFloat[(r0+65)];
+	f6 = heapFloat[(r0+64)];
+	f7 = heapFloat[(r0+69)];
+	f9 = heapFloat[(r0+68)];
+	f10 = heapFloat[(r0+73)];
+	f11 = heapFloat[(r0+72)];
+	f12 = heapFloat[(r0+66)];
+	f13 = heapFloat[(r0+70)];
+	f14 = heapFloat[(r0+74)];
+	f2 = f2+f0;
+	heapFloat[(r2+126)] = f2;
+	f2 = heapFloat[(r2+127)];
+	f2 = f2+f0;
+	heapFloat[(r2+127)] = f2;
+	f2 = heapFloat[(r2+128)];
+	f0 = f2+f0;
+	heapFloat[(r2+128)] = f0;
+	f0 = f6*f8;
+	f2 = f3*f5;
+	f0 = f0+f2;
+	f2 = f12*f4;
+	f3 = heapFloat[(r2+134)];
+	f0 = f0+f2;
+	f2 = f3*f1;
+	f3 = heapFloat[(r2+136)];
+	f6 = heapFloat[(r2+135)];
+	f12 = heapFloat[(r2+130)];
+	f0 = f0*f2;
+	f2 = f9*f8;
+	f7 = f7*f5;
+	f2 = f2+f7;
+	f7 = f13*f4;
+	f0 = f12+f0;
+	heapFloat[(r2+130)] = f0;
+	f0 = f2+f7;
+	f2 = f6*f1;
+	f6 = f11*f8;
+	f5 = f10*f5;
+	f0 = f0*f2;
+	f2 = heapFloat[(r2+131)];
+	f0 = f2+f0;
+	f2 = f6+f5;
+	f4 = f14*f4;
+	heapFloat[(r2+131)] = f0;
+	f0 = f2+f4;
+	f1 = f3*f1;
+	f0 = f0*f1;
+	f1 = heapFloat[(r2+132)];
+	f0 = f1+f0;
+	heapFloat[(r2+132)] = f0;
+}
+}
+}
+	return;
+}
+
+function _ZN21btConeTwistConstraint8setParamEifi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	f0 = heapFloat[(fp+2)];
+	r2 = heap32[(fp+3)];
+	r3 = (r0 + -3)|0;
+	if(uint(r3) <uint(2)) //_LBB583_5
+{
+	if(uint(r2) >uint(2)) //_LBB583_7
+{
+	r0 = r1 >> 2;
+	heapFloat[(r0+148)] = f0;
+	r1 = heap32[(r0+145)];
+	r1 = r1 | 4;
+	heap32[(r0+145)] = r1;
+	return;
+}
+else{
+	r1 = r1 >> 2;
+	heapFloat[(r1+146)] = f0;
+	r0 = heap32[(r1+145)];
+	r0 = r0 | 1;
+	heap32[(r1+145)] = r0;
+	return;
+}
+}
+else{
+	r0 = (r0 + -1)|0;
+	if(uint(r0) >uint(1)) //_LBB583_8
+{
+	r0 = _2E_str10;
+	r1 = _2E_str24;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1066;
+	_assert(i7);
+}
+else{
+	if(uint(r2) >uint(2)) //_LBB583_4
+{
+	r1 = r1 >> 2;
+	heapFloat[(r1+105)] = f0;
+	return;
+}
+else{
+	r1 = r1 >> 2;
+	heapFloat[(r1+147)] = f0;
+	r2 = heap32[(r1+145)];
+	r2 = r2 | 2;
+	heap32[(r1+145)] = r2;
+	return;
+}
+}
+}
+}
+
+function _ZNK21btConeTwistConstraint8getParamEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+	r3 = (r0 + -3)|0;
+	if(uint(r3) <uint(2)) //_LBB584_9
+{
+	if(uint(r2) >uint(2)) //_LBB584_13
+{
+	r0 = (r2 + -3)|0;
+	if(uint(r0) >uint(2)) //_LBB584_17
+{
+	r1 = _2E_str10;
+	r0 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 1107;
+	_assert(i7);
+}
+else{
+	r0 = heapU8[r1+580];
+	r0 = r0 & 4;
+	if(r0 !=0) //_LBB584_16
+{
+	r1 = (r1 + 592)|0;
+}
+else{
+	r1 = _2E_str543;
+	r0 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 1102;
+	_assert(i7);
+}
+}
+}
+else{
+	r2 = heapU8[r1+580];
+	r2 = r2 & 1;
+	if(r2 != 0) //_LBB584_12
+{
+	r1 = (r1 + 584)|0;
+}
+else{
+	r1 = _2E_str442;
+	r2 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1097;
+	_assert(i7);
+}
+}
+}
+else{
+	r0 = (r0 + -1)|0;
+	if(uint(r0) >uint(1)) //_LBB584_18
+{
+	r1 = _2E_str10;
+	r0 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 1111;
+	_assert(i7);
+}
+else{
+	if(uint(r2) >uint(2)) //_LBB584_6
+{
+	r2 = (r2 + -3)|0;
+	if(uint(r2) >uint(2)) //_LBB584_8
+{
+	r1 = _2E_str10;
+	r2 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1090;
+	_assert(i7);
+}
+else{
+	r1 = (r1 + 420)|0;
+}
+}
+else{
+	r2 = heapU8[r1+580];
+	r2 = r2 & 2;
+	if(r2 !=0) //_LBB584_5
+{
+	r1 = (r1 + 588)|0;
+}
+else{
+	r1 = _2E_str1340;
+	r2 = _2E_str24;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1081;
+	_assert(i7);
+}
+}
+}
+}
+	r0 = r1 >> 2;
+	f0 = heapFloat[(r0)];
+	f_g0 = f0;
+	return;
+}
+
+function _ZN15btJacobianEntryC2ERK11btMatrix3x3S2_RK9btVector3S5_S5_S5_fS5_f(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+5)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r0)];
+	heapFloat[(r1)] = f0;
+	f1 = heapFloat[(r0+1)];
+	heapFloat[(r1+1)] = f1;
+	f2 = heapFloat[(r0+2)];
+	r2 = heap32[(fp+3)];
+	heapFloat[(r1+2)] = f2;
+	r2 = r2 >> 2;
+	heap32[(r1+3)] = heap32[(r0+3)];
+	f3 = heapFloat[(r2)];
+	f4 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2+2)];
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	f6 = f4*f2;
+	f7 = f5*f1;
+	f5 = f5*f0;
+	f8 = f3*f2;
+	f6 = f6-f7;
+	f7 = heapFloat[(r0)];
+	f5 = f5-f8;
+	f8 = heapFloat[(r0+1)];
+	f3 = f3*f1;
+	f4 = f4*f0;
+	f9 = heapFloat[(r0+4)];
+	f10 = heapFloat[(r0+5)];
+	f7 = f7*f6;
+	f8 = f8*f5;
+	f3 = f3-f4;
+	f4 = heapFloat[(r0+2)];
+	f11 = heapFloat[(r0+8)];
+	f12 = heapFloat[(r0+9)];
+	f13 = heapFloat[(r0+10)];
+	f14 = heapFloat[(r0+6)];
+	f9 = f9*f6;
+	f10 = f10*f5;
+	f7 = f7+f8;
+	f4 = f4*f3;
+	f6 = f11*f6;
+	f5 = f12*f5;
+	f8 = f9+f10;
+	f9 = f14*f3;
+	f4 = f7+f4;
+	f5 = f6+f5;
+	f3 = f13*f3;
+	f6 = f8+f9;
+	heapFloat[(r1+4)] = f4;
+	f3 = f5+f3;
+	heapFloat[(r1+5)] = f6;
+	r0 = heap32[(fp+4)];
+	heapFloat[(r1+6)] = f3;
+	r0 = r0 >> 2;
+	heap32[(r1+7)] = 0;
+	f5 = heapFloat[(r0)];
+	f7 = heapFloat[(r0+1)];
+	f8 = heapFloat[(r0+2)];
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	f9 = f8*f1;
+	f10 = f7*f2;
+	f2 = f5*f2;
+	f8 = f8*f0;
+	f9 = f9-f10;
+	f10 = heapFloat[(r0)];
+	f2 = f2-f8;
+	f8 = heapFloat[(r0+1)];
+	f0 = f7*f0;
+	f1 = f5*f1;
+	f5 = heapFloat[(r0+4)];
+	f7 = heapFloat[(r0+5)];
+	f10 = f10*f9;
+	f8 = f8*f2;
+	f0 = f0-f1;
+	f1 = heapFloat[(r0+2)];
+	f11 = heapFloat[(r0+8)];
+	f12 = heapFloat[(r0+9)];
+	f13 = heapFloat[(r0+10)];
+	f14 = heapFloat[(r0+6)];
+	f5 = f5*f9;
+	f7 = f7*f2;
+	f8 = f10+f8;
+	f1 = f1*f0;
+	f9 = f11*f9;
+	f2 = f12*f2;
+	f5 = f5+f7;
+	f7 = f14*f0;
+	f1 = f8+f1;
+	f2 = f9+f2;
+	f0 = f13*f0;
+	f5 = f5+f7;
+	heapFloat[(r1+8)] = f1;
+	f0 = f2+f0;
+	heapFloat[(r1+9)] = f5;
+	r0 = heap32[(fp+6)];
+	heapFloat[(r1+10)] = f0;
+	r0 = r0 >> 2;
+	heap32[(r1+11)] = 0;
+	f2 = heapFloat[(r0+2)];
+	f7 = heapFloat[(r0+1)];
+	f8 = heapFloat[(r0)];
+	f8 = f8*f4;
+	f7 = f7*f6;
+	heapFloat[(r1+12)] = f8;
+	f2 = f2*f3;
+	heapFloat[(r1+13)] = f7;
+	r0 = heap32[(fp+8)];
+	heapFloat[(r1+14)] = f2;
+	r0 = r0 >> 2;
+	heap32[(r1+15)] = 0;
+	f9 = heapFloat[(r0+2)];
+	f10 = heapFloat[(r0+1)];
+	f11 = heapFloat[(r0)];
+	f4 = f8*f4;
+	f6 = f7*f6;
+	f7 = f10*f5;
+	f8 = f11*f1;
+	f4 = f4+f6;
+	f2 = f2*f3;
+	f3 = f9*f0;
+	heapFloat[(r1+16)] = f8;
+	f2 = f4+f2;
+	f4 = heapFloat[(fp+7)];
+	f1 = f8*f1;
+	f5 = f7*f5;
+	heapFloat[(r1+17)] = f7;
+	f2 = f2+f4;
+	f4 = heapFloat[(fp+9)];
+	f1 = f1+f5;
+	f0 = f3*f0;
+	heapFloat[(r1+18)] = f3;
+	f2 = f2+f4;
+	f0 = f1+f0;
+	f0 = f2+f0;
+	heap32[(r1+19)] = 0;
+	f1 =                         0;
+	heapFloat[(r1+20)] = f0;
+	if(f0 >f1) //_LBB585_2
+{
+	return;
+}
+else{
+	r0 = _2E_str846;
+	r1 = _2E_str947;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 53;
+	_assert(i7);
+}
+}
+
+function _ZNK21btConeTwistConstraint16GetPointForAngleEff(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	f0 = heapFloat[(fp+2)];
+	heapFloat[(g0)] = f0;
+	cosf(i7);
+	f1 = f_g0;
+	r0 = heap32[(fp+1)];
+	heapFloat[(g0)] = f0;
+	sinf(i7);
+	f0 = f_g0;
+	r0 = r0 >> 2;
+	r1 = heap32[(fp)];
+	f2 = heapFloat[(fp+3)];
+	f3 = f1; //fstod f1, f3
+	f3 = Math.abs(f3);
+	f4 =   1.1920928955078125e-007;
+	if(f3 >f4) //_LBB586_2
+{
+	f3 = heapFloat[(r0+109)];
+	f4 = heapFloat[(r0+108)];
+	f5 = f0*f0;
+	f6 = f1*f1;
+	f5 = f5/f6;
+	f4 = f4*f4;
+	f6 =                         1;
+	f3 = f3*f3;
+	f4 = f5/f4;
+	f3 = f6/f3;
+	f5 = f5+f6;
+	f3 = f4+f3;
+	f3 = f5/f3;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+}
+else{
+	f3 = heapFloat[(r0+108)];
+}
+	f4 =                         0;
+	f5 = f1*f1;
+	f5 = f5+f4;
+	f6 = f0*f0;
+	f5 = f5+f6;
+	heapFloat[(g0)] = f5;
+	sqrtf(i7);
+	f5 = f_g0;
+	if(f5 !=f4) //_LBB586_5
+{
+	f6 =                       0.5;
+	f3 = f3*f6;
+	heapFloat[(g0)] = f3;
+	sinf(i7);
+	f5 = f_g0/f5;
+	f6 = f5*f4;
+	heapFloat[(g0)] = f3;
+	f0 = -f0;
+	f1 = f1*f5;
+	cosf(i7);
+	f7 = -f6;
+	f0 = f5*f0;
+	f5 = f_g0*f2;
+	f8 = f1*f4;
+	f7 = f2*f7;
+	f5 = f5+f8;
+	f9 = f0*f4;
+	f7 = f7-f8;
+	f8 = f0*f2;
+	f10 = f_g0*f4;
+	f5 = f5-f9;
+	f7 = f7-f9;
+	f4 = f6*f4;
+	f8 = f10+f8;
+	f8 = f8-f4;
+	f9 = f5*f_g0;
+	f11 = f7*f6;
+	f4 = f10+f4;
+	f2 = f1*f2;
+	f2 = f4-f2;
+	f4 = f8*f_g0;
+	f10 = f7*f1;
+	f9 = f9-f11;
+	f11 = f8*f0;
+	f3 = f2*f_g0;
+	f7 = f7*f0;
+	f4 = f4-f10;
+	f10 = f2*f6;
+	f9 = f9-f11;
+	f2 = f2*f1;
+	r0 = r1 >> 2;
+	f2 = f9+f2;
+	f3 = f3-f7;
+	f1 = f5*f1;
+	f4 = f4-f10;
+	f0 = f5*f0;
+	f1 = f3-f1;
+	f3 = f8*f6;
+	f0 = f4+f0;
+	heapFloat[(r0)] = f2;
+	f1 = f1+f3;
+	heapFloat[(r0+1)] = f0;
+	heapFloat[(r0+2)] = f1;
+	heap32[(r0+3)] = 0;
+	return;
+}
+else{
+	r1 = _2E_str115;
+	r0 = _2E_str685;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 61;
+	_assert(i7);
+}
+}
+
+function _ZN21btConeTwistConstraint14calcAngleInfo2ERK11btTransformS2_RK11btMatrix3x3S5_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -384;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	heap32[(r1+123)] = 0;
+	r2 = 0;
+	heap32[(r1+122)] = 0;
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	heap8[r0+513] = r2;
+	heap8[r0+514] = r2;
+	r2 = heapU8[r0+540];
+	if(r2 ==0) //_LBB587_7
+{
+__label__ = 6;
+}
+else{
+	r2 = heapU8[r0+515];
+	if(r2 !=0) //_LBB587_7
+{
+__label__ = 6;
+}
+else{
+	f0 = heapFloat[(r1+136)];
+	f1 = heapFloat[(r1+137)];
+	f2 = heapFloat[(r1+138)];
+	f3 = f0*f0;
+	f4 = f1*f1;
+	f5 = heapFloat[(r1+139)];
+	f3 = f3+f4;
+	f4 = f2*f2;
+	f3 = f3+f4;
+	f4 = f5*f5;
+	f6 =                         2;
+	f3 = f3+f4;
+	r4 = r4 >> 2;
+	f3 = f6/f3;
+	f4 = f2*f3;
+	f6 = f1*f3;
+	f3 = f0*f3;
+	f7 = heapFloat[(r4)];
+	heapFloat[(fp+-48)] = f7;
+	f7 = heapFloat[(r1+89)];
+	heapFloat[(fp+-64)] = f7;
+	f7 = heapFloat[(r1+88)];
+	heapFloat[(fp+-66)] = f7;
+	f8 = heapFloat[(r4+1)];
+	heapFloat[(fp+-49)] = f8;
+	f9 = heapFloat[(r1+93)];
+	heapFloat[(fp+-65)] = f9;
+	f7 = heapFloat[(r1+92)];
+	heapFloat[(fp+-67)] = f7;
+	f8 = heapFloat[(r1+90)];
+	heapFloat[(fp+-54)] = f8;
+	f9 = heapFloat[(r1+94)];
+	heapFloat[(fp+-55)] = f9;
+	f2 = f2*f4;
+	f10 = f0*f3;
+	f11 = f1*f6;
+	f12 = heapFloat[(fp+-66)];
+	f7 = heapFloat[(fp+-48)];
+	f13 = f12*f7;
+	f7 = heapFloat[(fp+-67)];
+	f8 = heapFloat[(fp+-49)];
+	f14 = f7*f8;
+	f15 = heapFloat[(fp+-64)];
+	f7 = heapFloat[(fp+-48)];
+	f16 = f15*f7;
+	f9 = heapFloat[(fp+-65)];
+	f17 = f9*f8;
+	f18 = heapFloat[(r4+2)];
+	heapFloat[(fp+-83)] = f18;
+	f19 = heapFloat[(r1+97)];
+	heapFloat[(fp+-80)] = f19;
+	f20 = heapFloat[(r1+96)];
+	heapFloat[(fp+-81)] = f20;
+	r3 = r3 >> 2;
+	f21 = heapFloat[(r1+98)];
+	heapFloat[(fp+-77)] = f21;
+	f22 = f11+f2;
+	f23 =                         1;
+	heapFloat[(fp+-76)] = f23;
+	f2 = f10+f2;
+	f24 = f0*f6;
+	f25 = f5*f4;
+	f13 = f13+f14;
+	f14 = f20*f18;
+	f16 = f16+f17;
+	f17 = f19*f18;
+	f8 = heapFloat[(fp+-54)];
+	f26 = f8*f7;
+	f9 = heapFloat[(fp+-55)];
+	f8 = heapFloat[(fp+-49)];
+	f27 = f9*f8;
+	f22 = f23-f22;
+	heapFloat[(fp+-78)] = f22;
+	f13 = f13+f14;
+	heapFloat[(fp+-50)] = f13;
+	f14 = f24-f25;
+	heapFloat[(fp+-52)] = f14;
+	f24 = f24+f25;
+	heapFloat[(fp+-79)] = f24;
+	f16 = f16+f17;
+	heapFloat[(fp+-51)] = f16;
+	f2 = f23-f2;
+	heapFloat[(fp+-53)] = f2;
+	f0 = f0*f4;
+	f6 = f5*f6;
+	f1 = f1*f4;
+	f3 = f5*f3;
+	f4 = f26+f27;
+	f5 = f21*f18;
+	f2 = heapFloat[(r3)];
+	heapFloat[(fp+-40)] = f2;
+	f7 = heapFloat[(r1+73)];
+	f8 = heapFloat[(r1+72)];
+	f2 = heapFloat[(r3+1)];
+	heapFloat[(fp+-41)] = f2;
+	f9 = heapFloat[(r1+77)];
+	f12 = heapFloat[(r1+76)];
+	f13 = heapFloat[(r4+4)];
+	heapFloat[(fp+-59)] = f13;
+	f14 = heapFloat[(r4+5)];
+	heapFloat[(fp+-60)] = f14;
+	f15 = heapFloat[(r3+4)];
+	heapFloat[(fp+-68)] = f15;
+	f16 = heapFloat[(r3+5)];
+	heapFloat[(fp+-69)] = f16;
+	f17 = heapFloat[(r1+74)];
+	f18 = heapFloat[(r1+78)];
+	f19 = f0+f6;
+	heapFloat[(fp+-56)] = f19;
+	f20 = f1-f3;
+	heapFloat[(fp+-58)] = f20;
+	f10 = f10+f11;
+	f2 = heapFloat[(fp+-40)];
+	f11 = f8*f2;
+	f2 = heapFloat[(fp+-41)];
+	f21 = f12*f2;
+	f13 = heapFloat[(fp+-50)];
+	f23 = f22*f13;
+	f16 = heapFloat[(fp+-51)];
+	f25 = f24*f16;
+	f0 = f0-f6;
+	heapFloat[(fp+-61)] = f0;
+	f4 = f4+f5;
+	heapFloat[(fp+-57)] = f4;
+	f1 = f1+f3;
+	heapFloat[(fp+-62)] = f1;
+	f2 = heapFloat[(fp+-40)];
+	f3 = f7*f2;
+	f2 = heapFloat[(fp+-41)];
+	f5 = f9*f2;
+	f14 = heapFloat[(fp+-52)];
+	f6 = f14*f13;
+	f2 = heapFloat[(fp+-53)];
+	f26 = f2*f16;
+	f0 = heapFloat[(r3+2)];
+	heapFloat[(fp+-71)] = f0;
+	f1 = heapFloat[(r1+81)];
+	f2 = heapFloat[(r1+80)];
+	f4 = heapFloat[(r3+8)];
+	heapFloat[(fp+-38)] = f4;
+	f13 = heapFloat[(r3+9)];
+	heapFloat[(fp+-39)] = f13;
+	f14 = heapFloat[(r4+6)];
+	heapFloat[(fp+-37)] = f14;
+	f15 = heapFloat[(r3+6)];
+	heapFloat[(fp+-70)] = f15;
+	f0 = heapFloat[(r1+82)];
+	heapFloat[(fp+-82)] = f0;
+	f4 = heapFloat[(fp+-76)];
+	f10 = f4-f10;
+	heapFloat[(fp+-63)] = f10;
+	f14 = heapFloat[(fp+-66)];
+	f13 = heapFloat[(fp+-59)];
+	f15 = f14*f13;
+	f16 = heapFloat[(fp+-67)];
+	f14 = heapFloat[(fp+-60)];
+	f19 = f16*f14;
+	f20 = heapFloat[(fp+-64)];
+	f22 = f20*f13;
+	f24 = heapFloat[(fp+-65)];
+	f27 = f24*f14;
+	f28 = heapFloat[(fp+-68)];
+	f29 = f8*f28;
+	f16 = heapFloat[(fp+-69)];
+	f30 = f12*f16;
+	f0 = f7*f28;
+	f4 = f9*f16;
+	f11 = f11+f21;
+	heapFloat[(fp+-42)] = f11;
+	f21 = heapFloat[(fp+-71)];
+	f10 = f2*f21;
+	heapFloat[(fp+-43)] = f10;
+	f10 = f23+f25;
+	heapFloat[(fp+-44)] = f10;
+	f13 = heapFloat[(fp+-61)];
+	f11 = heapFloat[(fp+-57)];
+	f14 = f13*f11;
+	f3 = f3+f5;
+	f5 = f1*f21;
+	f6 = f6+f26;
+	f16 = heapFloat[(fp+-62)];
+	f20 = f16*f11;
+	f23 = heapFloat[(fp+-40)];
+	f24 = f17*f23;
+	f25 = heapFloat[(fp+-41)];
+	f26 = f18*f25;
+	f28 = heapFloat[(fp+-56)];
+	f13 = heapFloat[(fp+-50)];
+	f10 = f28*f13;
+	f11 = heapFloat[(fp+-58)];
+	f16 = heapFloat[(fp+-51)];
+	f11 = f11*f16;
+	f13 = heapFloat[(r3+10)];
+	heapFloat[(fp+-72)] = f13;
+	f15 = f15+f19;
+	f13 = heapFloat[(fp+-81)];
+	f19 = heapFloat[(fp+-37)];
+	f13 = f13*f19;
+	f22 = f22+f27;
+	f19 = heapFloat[(fp+-80)];
+	f27 = heapFloat[(fp+-37)];
+	f16 = f19*f27;
+	f19 = heapFloat[(fp+-54)];
+	f21 = heapFloat[(fp+-59)];
+	f19 = f19*f21;
+	f21 = heapFloat[(fp+-55)];
+	f23 = heapFloat[(fp+-60)];
+	f21 = f21*f23;
+	f23 = heapFloat[(fp+-38)];
+	f8 = f8*f23;
+	f23 = heapFloat[(fp+-39)];
+	f12 = f12*f23;
+	f23 = heapFloat[(fp+-38)];
+	f7 = f7*f23;
+	f23 = heapFloat[(fp+-39)];
+	f9 = f9*f23;
+	f29 = f29+f30;
+	f30 = heapFloat[(fp+-70)];
+	f23 = f2*f30;
+	f0 = f0+f4;
+	f4 = f1*f30;
+	f28 = heapFloat[(fp+-68)];
+	f25 = f17*f28;
+	f27 = heapFloat[(fp+-69)];
+	f27 = f18*f27;
+	f28 = heapFloat[(fp+-42)];
+	f30 = heapFloat[(fp+-43)];
+	f28 = f28+f30;
+	f30 = heapFloat[(fp+-44)];
+	f14 = f30+f14;
+	heapFloat[(fp+-73)] = f14;
+	f3 = f3+f5;
+	f5 = f6+f20;
+	heapFloat[(fp+-42)] = f5;
+	f6 = f24+f26;
+	f20 = heapFloat[(fp+-82)];
+	f14 = heapFloat[(fp+-71)];
+	f24 = f20*f14;
+	f10 = f10+f11;
+	f26 = heapFloat[(fp+-63)];
+	f11 = heapFloat[(fp+-57)];
+	f30 = f26*f11;
+	f5 = f15+f13;
+	heapFloat[(fp+-44)] = f5;
+	f5 = f22+f16;
+	heapFloat[(fp+-45)] = f5;
+	f11 = f29+f23;
+	f0 = f0+f4;
+	f4 = f19+f21;
+	f21 = heapFloat[(fp+-77)];
+	f13 = heapFloat[(fp+-37)];
+	f14 = f21*f13;
+	f8 = f8+f12;
+	f13 = heapFloat[(fp+-72)];
+	f2 = f2*f13;
+	f7 = f7+f9;
+	f1 = f1*f13;
+	f23 = heapFloat[(fp+-38)];
+	f9 = f17*f23;
+	f23 = heapFloat[(fp+-39)];
+	f12 = f18*f23;
+	f15 = f25+f27;
+	f16 = heapFloat[(fp+-70)];
+	f17 = f20*f16;
+	f18 = heapFloat[(fp+-73)];
+	f19 = f28*f18;
+	f5 = heapFloat[(fp+-42)];
+	f22 = f3*f5;
+	f6 = f6+f24;
+	f10 = f10+f30;
+	heapFloat[(fp+-43)] = f10;
+	f4 = f4+f14;
+	heapFloat[(fp+-74)] = f4;
+	f14 = heapFloat[(r1+84)];
+	f24 = heapFloat[(r1+85)];
+	f25 = heapFloat[(r1+86)];
+	f4 = heapFloat[(r4+8)];
+	heapFloat[(fp+-46)] = f4;
+	f5 = heapFloat[(r1+100)];
+	heapFloat[(fp+-85)] = f5;
+	f4 = heapFloat[(r4+9)];
+	heapFloat[(fp+-47)] = f4;
+	f5 = heapFloat[(r1+101)];
+	heapFloat[(fp+-86)] = f5;
+	f10 = heapFloat[(r4+10)];
+	heapFloat[(fp+-75)] = f10;
+	f13 = heapFloat[(r1+102)];
+	heapFloat[(fp+-84)] = f13;
+	f2 = f8+f2;
+	f1 = f7+f1;
+	f7 = f15+f17;
+	f8 = heapFloat[(fp+-78)];
+	f5 = heapFloat[(fp+-44)];
+	f15 = f8*f5;
+	f16 = heapFloat[(fp+-79)];
+	f5 = heapFloat[(fp+-45)];
+	f17 = f16*f5;
+	f18 = heapFloat[(fp+-52)];
+	f5 = heapFloat[(fp+-44)];
+	f20 = f18*f5;
+	f21 = heapFloat[(fp+-53)];
+	f5 = heapFloat[(fp+-45)];
+	f23 = f21*f5;
+	f9 = f9+f12;
+	f12 = heapFloat[(fp+-82)];
+	f13 = heapFloat[(fp+-72)];
+	f12 = f12*f13;
+	f18 = heapFloat[(fp+-73)];
+	f26 = f11*f18;
+	f5 = heapFloat[(fp+-42)];
+	f27 = f0*f5;
+	f19 = f19+f22;
+	f10 = heapFloat[(fp+-43)];
+	f22 = f6*f10;
+	f29 = heapFloat[(r3+14)];
+	heapFloat[(fp+-82)] = f29;
+	f30 = heapFloat[(r3+13)];
+	heapFloat[(fp+-87)] = f30;
+	f4 = heapFloat[(r3+12)];
+	heapFloat[(fp+-89)] = f4;
+	f4 = heapFloat[(r4+14)];
+	heapFloat[(fp+-88)] = f4;
+	f4 = heapFloat[(r4+13)];
+	heapFloat[(fp+-90)] = f4;
+	f4 = heapFloat[(r4+12)];
+	heapFloat[(fp+-91)] = f4;
+	r3 = sp + -128;
+	f9 = f9+f12;
+	f12 = heapFloat[(fp+-66)];
+	f4 = heapFloat[(fp+-46)];
+	f12 = f12*f4;
+	f4 = heapFloat[(fp+-67)];
+	f5 = heapFloat[(fp+-47)];
+	f4 = f4*f5;
+	f5 = heapFloat[(fp+-64)];
+	f8 = heapFloat[(fp+-46)];
+	f5 = f5*f8;
+	f8 = heapFloat[(fp+-65)];
+	f10 = heapFloat[(fp+-47)];
+	f8 = f8*f10;
+	f15 = f15+f17;
+	f13 = heapFloat[(fp+-61)];
+	f17 = heapFloat[(fp+-74)];
+	f10 = f13*f17;
+	f20 = f20+f23;
+	f16 = heapFloat[(fp+-62)];
+	f23 = f16*f17;
+	f13 = heapFloat[(fp+-56)];
+	f16 = heapFloat[(fp+-44)];
+	f13 = f13*f16;
+	f16 = heapFloat[(fp+-58)];
+	f17 = heapFloat[(fp+-45)];
+	f16 = f16*f17;
+	f17 = f2*f18;
+	f18 = heapFloat[(fp+-42)];
+	f18 = f1*f18;
+	f26 = f26+f27;
+	f27 = heapFloat[(fp+-43)];
+	f21 = f7*f27;
+	f19 = f19+f22;
+	f10 = f15+f10;
+	f15 = f20+f23;
+	r4 = r3 >> 2;
+	f20 = heapFloat[(fp+-40)];
+	f20 = f20*f14;
+	f22 = heapFloat[(fp+-41)];
+	f22 = f22*f24;
+	f4 = f12+f4;
+	f12 = heapFloat[(fp+-81)];
+	f23 = heapFloat[(fp+-75)];
+	f12 = f12*f23;
+	f5 = f5+f8;
+	f8 = heapFloat[(fp+-80)];
+	f8 = f8*f23;
+	f23 = heapFloat[(fp+-54)];
+	f27 = heapFloat[(fp+-46)];
+	f23 = f23*f27;
+	f27 = heapFloat[(fp+-55)];
+	f29 = heapFloat[(fp+-47)];
+	f27 = f27*f29;
+	f13 = f13+f16;
+	f16 = heapFloat[(fp+-63)];
+	f29 = heapFloat[(fp+-74)];
+	f16 = f16*f29;
+	f17 = f17+f18;
+	f18 = heapFloat[(fp+-43)];
+	f18 = f9*f18;
+	f21 = f26+f21;
+	heapFloat[(fp+-32)] = f19;
+	f4 = f4+f12;
+	f5 = f5+f8;
+	f8 = f13+f16;
+	f12 = f20+f22;
+	f13 = heapFloat[(fp+-71)];
+	f13 = f13*f25;
+	f16 = heapFloat[(fp+-68)];
+	f16 = f16*f14;
+	f19 = heapFloat[(fp+-69)];
+	f19 = f19*f24;
+	f20 = f23+f27;
+	f22 = heapFloat[(fp+-77)];
+	f23 = heapFloat[(fp+-75)];
+	f22 = f22*f23;
+	f26 = f28*f10;
+	f27 = f3*f15;
+	f17 = f17+f18;
+	heapFloat[(r4+1)] = f21;
+	f18 = f20+f22;
+	f12 = f12+f13;
+	heapFloat[(r4+2)] = f17;
+	f13 = f16+f19;
+	f16 = heapFloat[(fp+-70)];
+	f16 = f16*f25;
+	f17 = heapFloat[(fp+-38)];
+	f14 = f17*f14;
+	f17 = heapFloat[(fp+-39)];
+	f17 = f17*f24;
+	f19 = heapFloat[(fp+-78)];
+	f19 = f19*f4;
+	f20 = heapFloat[(fp+-79)];
+	f20 = f20*f5;
+	f21 = heapFloat[(fp+-52)];
+	f21 = f21*f4;
+	f22 = heapFloat[(fp+-53)];
+	f22 = f22*f5;
+	f24 = f11*f10;
+	f23 = f0*f15;
+	f26 = f26+f27;
+	f27 = f6*f8;
+	f29 = heapFloat[(fp+-89)];
+	f12 = f12+f29;
+	f13 = f13+f16;
+	f14 = f14+f17;
+	f16 = heapFloat[(fp+-72)];
+	f16 = f16*f25;
+	f17 = f19+f20;
+	f19 = heapFloat[(fp+-61)];
+	f19 = f19*f18;
+	f20 = f21+f22;
+	f21 = heapFloat[(fp+-62)];
+	f21 = f21*f18;
+	f22 = heapFloat[(fp+-56)];
+	f22 = f22*f4;
+	f25 = heapFloat[(fp+-58)];
+	f25 = f25*f5;
+	f29 = f2*f10;
+	f30 = f1*f15;
+	f23 = f24+f23;
+	f24 = f7*f8;
+	f26 = f26+f27;
+	heap32[(r4+3)] = 0;
+	f12 = -f12;
+	f27 = heapFloat[(fp+-87)];
+	f13 = f13+f27;
+	f17 = f17+f19;
+	f19 = f20+f21;
+	f14 = f14+f16;
+	f16 = f22+f25;
+	f20 = heapFloat[(fp+-63)];
+	f20 = f20*f18;
+	f21 = f29+f30;
+	f22 = f9*f8;
+	f23 = f23+f24;
+	heapFloat[(r4+4)] = f26;
+	f29 = heapFloat[(fp+-82)];
+	f14 = f14+f29;
+	f16 = f16+f20;
+	f20 = f28*f12;
+	f24 = f11*f13;
+	f25 = f3*f12;
+	f26 = f0*f13;
+	f27 = f28*f17;
+	f3 = f3*f19;
+	f21 = f21+f22;
+	heapFloat[(r4+5)] = f23;
+	f22 =                         0;
+	heapFloat[(r4+6)] = f21;
+	f20 = f20-f24;
+	f21 = f2*f14;
+	f23 = f25-f26;
+	f24 = f1*f14;
+	f12 = f6*f12;
+	f13 = f7*f13;
+	f25 = heapFloat[(fp+-48)];
+	f26 = heapFloat[(fp+-85)];
+	f25 = f25*f26;
+	f28 = heapFloat[(fp+-49)];
+	f29 = heapFloat[(fp+-86)];
+	f28 = f28*f29;
+	f11 = f11*f17;
+	f0 = f0*f19;
+	f3 = f27+f3;
+	f6 = f6*f16;
+	f20 = f20-f21;
+	f21 = f23-f24;
+	f23 = heapFloat[(fp+-59)];
+	f23 = f23*f26;
+	f24 = heapFloat[(fp+-60)];
+	f24 = f24*f29;
+	f12 = f12-f13;
+	f13 = f9*f14;
+	f14 = heapFloat[(fp+-50)];
+	f14 = f14*f22;
+	f27 = heapFloat[(fp+-51)];
+	f27 = f27*f22;
+	f25 = f25+f28;
+	f28 = heapFloat[(fp+-83)];
+	f30 = heapFloat[(fp+-84)];
+	f28 = f28*f30;
+	f2 = f2*f17;
+	f1 = f1*f19;
+	f0 = f11+f0;
+	f7 = f7*f16;
+	f3 = f3+f6;
+	heap32[(r4+7)] = 0;
+	f6 = f12-f13;
+	f11 = f25+f28;
+	f12 = heapFloat[(fp+-46)];
+	f12 = f12*f26;
+	f13 = heapFloat[(fp+-47)];
+	f13 = f13*f29;
+	f25 = heapFloat[(fp+-44)];
+	f25 = f25*f22;
+	f26 = heapFloat[(fp+-45)];
+	f26 = f26*f22;
+	f23 = f23+f24;
+	f24 = heapFloat[(fp+-37)];
+	f24 = f24*f30;
+	f28 = heapFloat[(fp+-73)];
+	f28 = f28*f20;
+	f29 = heapFloat[(fp+-42)];
+	f29 = f29*f21;
+	f14 = f14+f27;
+	f27 = heapFloat[(fp+-57)];
+	f27 = f27*f22;
+	f1 = f2+f1;
+	f2 = f9*f16;
+	f0 = f0+f7;
+	heapFloat[(r4+8)] = f3;
+	f3 = f23+f24;
+	f4 = f4*f22;
+	f5 = f5*f22;
+	f7 = f12+f13;
+	f23 = heapFloat[(fp+-75)];
+	f9 = f23*f30;
+	f10 = f10*f20;
+	f12 = f15*f21;
+	f13 = f25+f26;
+	f15 = heapFloat[(fp+-74)];
+	f15 = f15*f22;
+	f23 = f28+f29;
+	f24 = heapFloat[(fp+-43)];
+	f24 = f24*f6;
+	f14 = f14+f27;
+	f25 = heapFloat[(fp+-91)];
+	f11 = f11+f25;
+	f1 = f1+f2;
+	heapFloat[(r4+9)] = f0;
+	f0 = f7+f9;
+	heapFloat[(r4+10)] = f1;
+	f1 = f17*f20;
+	f2 = f19*f21;
+	f4 = f4+f5;
+	f5 = f18*f22;
+	f7 = f10+f12;
+	f8 = f8*f6;
+	f9 = f13+f15;
+	f10 = heapFloat[(fp+-90)];
+	f3 = f3+f10;
+	f10 = f23+f24;
+	f11 = f14+f11;
+	f1 = f1+f2;
+	f2 = f16*f6;
+	f4 = f4+f5;
+	f5 = heapFloat[(fp+-88)];
+	f0 = f0+f5;
+	f5 = f7+f8;
+	f3 = f9+f3;
+	f6 = f10+f11;
+	heap32[(r4+11)] = 0;
+	f1 = f1+f2;
+	f0 = f4+f0;
+	f2 = f5+f3;
+	heapFloat[(r4+12)] = f6;
+	f0 = f1+f0;
+	heapFloat[(r4+13)] = f2;
+	heapFloat[(r4+14)] = f0;
+	heap32[(r4+15)] = 0;
+	r4 = sp + -144;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r3 = r4 >> 2;
+	f0 = heapFloat[(r3+2)];
+	f1 = heapFloat[(r3+1)];
+	f2 = heapFloat[(fp+-36)];
+	heapFloat[(r1+112)] = f2;
+	heapFloat[(r1+113)] = f1;
+	heapFloat[(r1+114)] = f0;
+	heap32[(r1+115)] = 0;
+	f2 = f2*f2;
+	f1 = f1*f1;
+	f1 = f2+f1;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f4 = heapFloat[(fp+-76)];
+	f0 = f4/f_g0;
+	f1 = heapFloat[(r1+112)];
+	f1 = f1*f0;
+	heapFloat[(r1+112)] = f1;
+	f1 = heapFloat[(r1+113)];
+	f1 = f1*f0;
+	heapFloat[(r1+113)] = f1;
+	f1 = heapFloat[(r1+114)];
+	f0 = f1*f0;
+	heapFloat[(r1+114)] = f0;
+	f0 = heapFloat[(r3+3)];
+	f1 =                        -1;
+	f0 = f0 < f1 ? f1 : f0;
+	f0 = f0 > f4 ? f4 : f0;
+	heapFloat[(g0)] = f0;
+	acosf(i7);
+	f0 = f_g0+f_g0;
+	heapFloat[(r1+123)] = f0;
+	if(f0 <f22) //_LBB587_4
+{
+	f0 = -f0;
+}
+	f1 =   1.1920928955078125e-007;
+	if(f0 <f1) //_LBB587_83
+{
+__label__ = 72;
+}
+else{
+	r1 = 1;
+	heap8[r0+514] = r1;
+	return;
+}
+}
+}
+_8: do {
+if (__label__ == 6){
+	r2 = heap32[(fp+3)];
+	r5 = heap32[(fp+4)];
+	r6 = sp + -64;
+	r7 = (r0 + 288)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r6;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r7 = sp + -48;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r7 = r7 >> 2;
+	r6 = r6 >> 2;
+	f0 = heapFloat[(r7+3)];
+	f1 = heapFloat[(r6+3)];
+	f2 = heapFloat[(fp+-12)];
+	f3 = heapFloat[(fp+-16)];
+	f4 = heapFloat[(r7+1)];
+	f5 = heapFloat[(r6+1)];
+	f6 = heapFloat[(r7+2)];
+	f7 = heapFloat[(r6+2)];
+	r6 = sp + -32;
+	r7 = (r0 + 352)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r6;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r7 = sp + -16;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	_ZNK11btMatrix3x311getRotationER12btQuaternion(i7);
+	r6 = r6 >> 2;
+	r7 = r7 >> 2;
+	f8 = heapFloat[(r7+3)];
+	f9 = heapFloat[(r6+3)];
+	f10 = heapFloat[(fp+-4)];
+	f11 = heapFloat[(r6+1)];
+	f12 = heapFloat[(r7+1)];
+	f13 = heapFloat[(fp+-8)];
+	f14 = heapFloat[(r6+2)];
+	f15 = heapFloat[(r7+2)];
+	f16 = f8*f9;
+	f17 = f10*f13;
+	f18 = f0*f3;
+	f19 = f2*f1;
+	f20 = f0*f1;
+	f21 = f2*f3;
+	f22 = f8*f13;
+	f23 = f10*f9;
+	f24 = f8*f11;
+	f25 = f12*f9;
+	f26 = f0*f5;
+	f27 = f4*f1;
+	f16 = f16-f17;
+	f17 = f12*f11;
+	f18 = f18+f19;
+	f19 = f4*f7;
+	f20 = f20-f21;
+	f21 = f4*f5;
+	f22 = f22+f23;
+	f23 = f12*f14;
+	f0 = f0*f7;
+	f1 = f6*f1;
+	f24 = f24+f25;
+	f25 = f15*f13;
+	f26 = f26+f27;
+	f27 = f6*f3;
+	f8 = f8*f14;
+	f9 = f15*f9;
+	f16 = f16-f17;
+	f17 = f15*f14;
+	f18 = f18+f19;
+	f19 = f6*f5;
+	f20 = f20-f21;
+	f6 = f6*f7;
+	f21 = f22+f23;
+	f15 = f15*f11;
+	f0 = f0+f1;
+	f1 = f2*f5;
+	f5 = f24+f25;
+	f14 = f10*f14;
+	f22 = f26+f27;
+	f2 = f2*f7;
+	f7 = f8+f9;
+	f8 = f10*f11;
+	f9 = f21-f15;
+	heapFloat[(fp+-46)] = f9;
+	f10 = f18-f19;
+	heapFloat[(fp+-49)] = f10;
+	f5 = f5-f14;
+	heapFloat[(fp+-45)] = f5;
+	f6 = f20-f6;
+	heapFloat[(fp+-52)] = f6;
+	f11 = f16-f17;
+	heapFloat[(fp+-48)] = f11;
+	f2 = f22-f2;
+	heapFloat[(fp+-50)] = f2;
+	f0 = f0+f1;
+	f1 = f4*f3;
+	f3 = f7+f8;
+	f4 = f12*f13;
+	f3 = f3-f4;
+	heapFloat[(fp+-47)] = f3;
+	f0 = f0-f1;
+	heapFloat[(fp+-51)] = f0;
+	f1 = f11*f2;
+	f4 = f6*f5;
+	f7 = f11*f6;
+	f8 = f10*f9;
+	f12 = f11*f10;
+	f13 = f6*f9;
+	f1 = f1-f4;
+	f4 = f10*f3;
+	f7 = f7+f8;
+	f8 = f2*f5;
+	f11 = f11*f0;
+	f6 = f6*f3;
+	f12 = f12-f13;
+	f13 = f0*f5;
+	f1 = f1-f4;
+	f4 = f0*f9;
+	f7 = f7+f8;
+	f0 = f0*f3;
+	f6 = f11-f6;
+	f8 = f2*f9;
+	f11 = f12-f13;
+	f2 = f2*f3;
+	f2 = f11+f2;
+	f1 = f1+f4;
+	f4 =                         0;
+	f0 = f7+f0;
+	f6 = f6-f8;
+	f7 = f10*f5;
+	f6 = f6+f7;
+	f7 = f1*f4;
+	f8 = -f2;
+	f10 = f0*f4;
+	f11 = f2*f4;
+	f12 = f10+f6;
+	f8 = f8-f7;
+	f13 = f6*f4;
+	f7 = f0+f7;
+	f8 = f8-f13;
+	f7 = f7-f13;
+	f12 = f12-f11;
+	f10 = f10+f11;
+	f10 = f10-f1;
+	f11 = f7*f0;
+	f13 = f8*f2;
+	f14 = f12*f0;
+	f15 = f8*f1;
+	f11 = f11-f13;
+	f13 = f12*f6;
+	f14 = f14-f15;
+	f15 = f10*f2;
+	f16 = f10*f0;
+	f8 = f8*f6;
+	f11 = f11-f13;
+	f10 = f10*f1;
+	f13 = f14-f15;
+	f14 = f7*f6;
+	f8 = f16-f8;
+	f7 = f7*f1;
+	f10 = f11+f10;
+	f11 = f13+f14;
+	f7 = f8-f7;
+	f8 = f12*f2;
+	f7 = f7+f8;
+	f8 = f10*f10;
+	f12 = f11*f11;
+	f8 = f8+f12;
+	f12 = f7*f7;
+	f8 = f8+f12;
+	heapFloat[(g0)] = f8;
+	f8 =                         1;
+	sqrtf(i7);
+	f12 = f8/f_g0;
+	f11 = f11*f12;
+	f7 = f7*f12;
+	f10 = f10*f12;
+	f12 = f11*f4;
+	f13 = f7*f4;
+	f14 = f10+f12;
+	f14 = f14+f13;
+	f3 = -f3;
+	heapFloat[(fp+-43)] = f3;
+	f3 = -f5;
+	heapFloat[(fp+-44)] = f3;
+	f3 = -f9;
+	heapFloat[(fp+-42)] = f3;
+	f3 =      -0.99999988079071045;
+	if(f14 >=f3) //_LBB587_9
+{
+	f3 = f14+f8;
+	f3 = f3+f3;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f10 = f10*f4;
+	f5 =                       0.5;
+	f11 = f11-f10;
+	f9 = f8/f_g0;
+	f7 = f10-f7;
+	f13 = f13-f12;
+	f12 = f_g0*f5;
+	f11 = f11*f9;
+	f10 = f7*f9;
+	f7 = f13*f9;
+}
+else{
+	f7 =                        -0;
+	f10 =                         1;
+	f11 =                         0;
+	f12 = f11;
+}
+	f3 = f7*f7;
+	f5 = f10*f10;
+	f3 = f3+f5;
+	f5 = f11*f11;
+	f3 = f3+f5;
+	f5 = f12*f12;
+	f3 = f3+f5;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f_g0;
+	if(f3 !=f4) //_LBB587_12
+{
+	f3 = f8/f3;
+	f5 = f12*f3;
+	f7 = f7*f3;
+	f9 = f10*f3;
+	f3 = f11*f3;
+	f10 = f5*f1;
+	f11 = f0*f9;
+	f12 = f5*f2;
+	f13 = f0*f7;
+	f14 = f5*f6;
+	f15 = f0*f3;
+	f10 = f10-f11;
+	f11 = f2*f3;
+	f12 = f12-f13;
+	f13 = f6*f9;
+	f0 = f5*f0;
+	f16 = f2*f7;
+	f14 = f14-f15;
+	f15 = f1*f7;
+	f10 = f10-f11;
+	f11 = f6*f7;
+	f12 = f12-f13;
+	f13 = f1*f3;
+	f10 = f10+f11;
+	f11 = f12+f13;
+	f0 = f0+f16;
+	f1 = f1*f9;
+	f12 = f14-f15;
+	f2 = f2*f9;
+	f2 = f12+f2;
+	f12 = f11*f11;
+	f13 = f10*f10;
+	f0 = f0+f1;
+	f1 = f6*f3;
+	f0 = f0+f1;
+	f1 = f12+f13;
+	f6 = f2*f2;
+	f1 = f1+f6;
+	f6 = f0*f0;
+	f1 = f1+f6;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f1 = f_g0;
+	if(f1 !=f4) //_LBB587_14
+{
+	f1 = f8/f1;
+	f6 = heapFloat[(r1+108)];
+	heapFloat[(fp+-40)] = f6;
+	f12 = heapFloat[(r1+111)];
+	f11 = f11*f1;
+	heapFloat[(fp+-37)] = f11;
+	f10 = f10*f1;
+	heapFloat[(fp+-38)] = f10;
+	f2 = f2*f1;
+	heapFloat[(fp+-39)] = f2;
+	f0 = f0*f1;
+	heapFloat[(fp+-41)] = f0;
+	if(f6 <f12) //_LBB587_33
+{
+__label__ = 27;
+}
+else{
+	f0 = heapFloat[(r1+109)];
+	if(f0 <f12) //_LBB587_33
+{
+__label__ = 27;
+}
+else{
+	f12 =                        -1;
+	f12 = f5 < f12 ? f12 : f5;
+	f12 = f12 > f8 ? f8 : f12;
+	heapFloat[(g0)] = f12;
+	acosf(i7);
+	f12 = f_g0+f_g0;
+	f0 =   1.1920928955078125e-007;
+	if(f12 >f0) //_LBB587_18
+{
+	f4 = f7*f7;
+	f0 = f9*f9;
+	f4 = f4+f0;
+	f0 = f3*f3;
+	f4 = f4+f0;
+	heapFloat[(g0)] = f4;
+	f4 =                         1;
+	sqrtf(i7);
+	f0 = f4/f_g0;
+	f1 = f9*f0;
+	f2 = f7*f0;
+	f0 = f3*f0;
+	f3 = f1; //fstod f1, f3
+	f3 = Math.abs(f3);
+	f5 =   1.1920928955078125e-007;
+	if(f3 >f5) //_LBB587_20
+{
+	f3 = heapFloat[(r1+109)];
+	f5 = heapFloat[(r1+108)];
+	f6 = f0*f0;
+	f7 = f1*f1;
+	f6 = f6/f7;
+	f5 = f5*f5;
+	f3 = f3*f3;
+	f5 = f6/f5;
+	f3 = f4/f3;
+	f4 = f6+f4;
+	f3 = f5+f3;
+	f4 = f4/f3;
+	heapFloat[(g0)] = f4;
+	sqrtf(i7);
+	f4 = f_g0;
+}
+else{
+	f4 = heapFloat[(r1+108)];
+}
+}
+	f3 = heapFloat[(r1+104)];
+	f5 = f3*f4;
+	if(f5 >=f12) //_LBB587_67
+{
+__label__ = 58;
+}
+else{
+	r3 = 1;
+	heap8[r0+514] = r3;
+if(!(f12 >=f4)) //_LBB587_24
+{
+	f6 =       0.99999988079071045;
+	if(f3 <f6) //_LBB587_25
+{
+	f8 = f12-f5;
+	f3 = f4-f5;
+	f8 = f8/f3;
+}
+}
+	f12 = f12-f5;
+	heapFloat[(r1+129)] = f8;
+	f3 = f1; //fstod f1, f3
+	heapFloat[(r1+123)] = f12;
+	f12 = Math.abs(f3);
+	f3 =   1.1920928955078125e-007;
+	if(f12 >f3) //_LBB587_28
+{
+	f0 = -f0;
+	f12 = heapFloat[(r1+109)];
+	f3 = heapFloat[(r1+108)];
+	f12 = f12/f3;
+	f3 = f0/f1;
+	f12 = f12*f3;
+	f12 = f12*f1;
+	f12 = f12; //fstod f12, f12
+	f12 = Math.abs(f12);
+	f12 = f12; //fdtos f12, f12
+	f3 =                         0;
+	if(f0 <=f3) //_LBB587_30
+{
+	f12 = -f12;
+}
+	f0 = f2*f2;
+	f3 = f1*f1;
+	f0 = f0+f3;
+	f3 = f12*f12;
+	f0 = f0+f3;
+	heapFloat[(g0)] = f0;
+	f0 =                         1;
+	sqrtf(i7);
+	f0 = f0/f_g0;
+	f12 = -f12;
+	f2 = f2*f0;
+	f1 = f1*f0;
+	f0 = f0*f12;
+}
+	f12 = -f2;
+	f3 = -f1;
+	f4 = heapFloat[(fp+-46)];
+	f5 = f2*f4;
+	f6 = heapFloat[(fp+-45)];
+	f7 = f6*f1;
+	f8 = heapFloat[(fp+-48)];
+	f12 = f8*f12;
+	f9 = f6*f0;
+	f10 = -f0;
+	f5 = f5+f7;
+	f7 = heapFloat[(fp+-47)];
+	f11 = f7*f0;
+	f12 = f12-f9;
+	f9 = f7*f1;
+	f3 = f8*f3;
+	f7 = f7*f2;
+	f12 = f12+f9;
+	f5 = f5+f11;
+	f3 = f3-f7;
+	f0 = f4*f0;
+	f7 = f8*f10;
+	f1 = f4*f1;
+	f0 = f3+f0;
+	f3 = heapFloat[(fp+-42)];
+	f4 = f5*f3;
+	f9 = f12*f8;
+	f1 = f7-f1;
+	f2 = f6*f2;
+	f1 = f1+f2;
+	f2 = heapFloat[(fp+-44)];
+	f6 = f5*f2;
+	f7 = f0*f8;
+	f4 = f4+f9;
+	f9 = heapFloat[(fp+-43)];
+	f10 = f0*f9;
+	f5 = f5*f9;
+	f8 = f1*f8;
+	f6 = f6+f7;
+	f7 = f1*f3;
+	f4 = f4+f10;
+	f1 = f1*f2;
+	f1 = f4-f1;
+	f4 = f5+f8;
+	f2 = f12*f2;
+	f5 = f6+f7;
+	f12 = f12*f9;
+	f2 = f4+f2;
+	f0 = f0*f3;
+	f12 = f5-f12;
+	heapFloat[(r1+112)] = f1;
+	f0 = f2-f0;
+	heapFloat[(r1+113)] = f12;
+	heapFloat[(r1+114)] = f0;
+	heap32[(r1+115)] = 0;
+	heap32[(r1+131)] = 0;
+	heap32[(r1+132)] = 0;
+	heap32[(r1+133)] = 0;
+	r3 = r2 >> 2;
+	heap32[(r1+134)] = 0;
+	r4 = r5 >> 2;
+	f2 = heapFloat[(r3+1)];
+	f3 = heapFloat[(r3+5)];
+	f4 = heapFloat[(r3)];
+	f5 = heapFloat[(r3+4)];
+	f6 = heapFloat[(r4+1)];
+	f7 = heapFloat[(r4+5)];
+	f8 = heapFloat[(r4)];
+	f9 = heapFloat[(r4+4)];
+	f10 = heapFloat[(r3+2)];
+	f11 = heapFloat[(r3+6)];
+	f13 = heapFloat[(r3+9)];
+	f14 = heapFloat[(r3+8)];
+	f15 = heapFloat[(r4+2)];
+	f16 = heapFloat[(r4+6)];
+	f17 = heapFloat[(r4+9)];
+	f18 = heapFloat[(r4+8)];
+	f4 = f4*f1;
+	f5 = f5*f12;
+	f2 = f2*f1;
+	f3 = f3*f12;
+	f8 = f8*f1;
+	f9 = f9*f12;
+	f6 = f6*f1;
+	f7 = f7*f12;
+	f19 = heapFloat[(r3+10)];
+	f20 = heapFloat[(r4+10)];
+	f4 = f4+f5;
+	f5 = f14*f0;
+	f2 = f2+f3;
+	f3 = f13*f0;
+	f10 = f10*f1;
+	f11 = f11*f12;
+	f8 = f8+f9;
+	f9 = f18*f0;
+	f6 = f6+f7;
+	f7 = f17*f0;
+	f13 = f15*f1;
+	f14 = f16*f12;
+	f4 = f4+f5;
+	f2 = f2+f3;
+	f3 = f8+f9;
+	f5 = f6+f7;
+	f6 = f10+f11;
+	f7 = f19*f0;
+	f8 = f13+f14;
+	f9 = f20*f0;
+	f6 = f6+f7;
+	f7 = f8+f9;
+	f4 = f1*f4;
+	f2 = f12*f2;
+	f1 = f1*f3;
+	f12 = f12*f5;
+	f2 = f4+f2;
+	f3 = f0*f6;
+	f12 = f1+f12;
+	f0 = f0*f7;
+	f1 = f2+f3;
+	f12 = f12+f0;
+	f0 =                         1;
+	f12 = f1+f12;
+	f12 = f0/f12;
+	heapFloat[(r1+120)] = f12;
+__label__ = 58;
+}
+}
+}
+_37: do {
+if (__label__ == 27){
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r1+72)];
+	f1 = heapFloat[(r3)];
+	f2 = heapFloat[(r1+73)];
+	f3 = heapFloat[(r3+4)];
+	f4 = heapFloat[(r1+74)];
+	f5 = heapFloat[(r1+76)];
+	f6 = heapFloat[(r3+1)];
+	f7 = heapFloat[(r1+77)];
+	f8 = heapFloat[(r3+5)];
+	f9 = heapFloat[(r1+78)];
+	f10 = heapFloat[(r4)];
+	f11 = heapFloat[(r1+88)];
+	f13 = heapFloat[(r4+4)];
+	heapFloat[(fp+-55)] = f13;
+	f14 = heapFloat[(r4+1)];
+	f15 = heapFloat[(r1+92)];
+	f13 = heapFloat[(r4+5)];
+	heapFloat[(fp+-56)] = f13;
+	f16 = heapFloat[(r3+8)];
+	f17 = heapFloat[(r3+9)];
+	f18 = heapFloat[(r4+8)];
+	heapFloat[(fp+-53)] = f18;
+	f19 = heapFloat[(r4+9)];
+	heapFloat[(fp+-54)] = f19;
+	f13 = f1*f0;
+	heapFloat[(fp+-57)] = f13;
+	f13 = f6*f5;
+	heapFloat[(fp+-61)] = f13;
+	f18 = f3*f0;
+	heapFloat[(fp+-59)] = f18;
+	f13 = f8*f5;
+	heapFloat[(fp+-62)] = f13;
+	f18 = heapFloat[(r1+80)];
+	f19 = heapFloat[(r3+2)];
+	f20 = heapFloat[(r1+81)];
+	f21 = heapFloat[(r3+6)];
+	f22 = heapFloat[(r1+82)];
+	f23 = f1*f2;
+	f24 = f6*f7;
+	f25 = f3*f2;
+	f26 = f8*f7;
+	f10 = f10*f11;
+	heapFloat[(fp+-60)] = f10;
+	f10 = f14*f15;
+	heapFloat[(fp+-63)] = f10;
+	f10 = heapFloat[(r4+2)];
+	heapFloat[(fp+-64)] = f10;
+	f13 = heapFloat[(r1+96)];
+	f14 = heapFloat[(r4+6)];
+	heapFloat[(fp+-58)] = f14;
+	f1 = f1*f4;
+	f6 = f6*f9;
+	f27 = heapFloat[(fp+-55)];
+	f27 = f27*f11;
+	f28 = heapFloat[(fp+-56)];
+	f28 = f28*f15;
+	f3 = f3*f4;
+	f8 = f8*f9;
+	f29 = heapFloat[(r3+10)];
+	f30 = heapFloat[(r4+10)];
+	heapFloat[(fp+-55)] = f30;
+	f10 = heapFloat[(fp+-57)];
+	f14 = heapFloat[(fp+-61)];
+	f10 = f10+f14;
+	heapFloat[(fp+-56)] = f10;
+	f14 = f19*f18;
+	f10 = heapFloat[(fp+-59)];
+	f30 = heapFloat[(fp+-62)];
+	f10 = f10+f30;
+	f30 = f21*f18;
+	f0 = f16*f0;
+	heapFloat[(fp+-57)] = f0;
+	f0 = f17*f5;
+	heapFloat[(fp+-59)] = f0;
+	f5 = f23+f24;
+	f23 = f19*f20;
+	f24 = f25+f26;
+	f25 = f21*f20;
+	f2 = f16*f2;
+	f7 = f17*f7;
+	f26 = heapFloat[(fp+-60)];
+	f0 = heapFloat[(fp+-63)];
+	f0 = f26+f0;
+	f26 = heapFloat[(fp+-64)];
+	f26 = f26*f13;
+	f1 = f1+f6;
+	f6 = f19*f22;
+	f19 = f27+f28;
+	f27 = heapFloat[(fp+-58)];
+	f27 = f27*f13;
+	f3 = f3+f8;
+	f8 = f21*f22;
+	f21 = heapFloat[(fp+-53)];
+	f11 = f21*f11;
+	f21 = heapFloat[(fp+-54)];
+	f15 = f21*f15;
+	f4 = f16*f4;
+	f9 = f17*f9;
+	f16 = heapFloat[(fp+-56)];
+	f14 = f16+f14;
+	f0 = f0+f26;
+	f5 = f5+f23;
+	f1 = f1+f6;
+	f6 = f10+f30;
+	f10 = f19+f27;
+	f16 = f24+f25;
+	f3 = f3+f8;
+	f8 = heapFloat[(fp+-57)];
+	f17 = heapFloat[(fp+-59)];
+	f8 = f8+f17;
+	f17 = f29*f18;
+	f2 = f2+f7;
+	f7 = f29*f20;
+	f11 = f11+f15;
+	f30 = heapFloat[(fp+-55)];
+	f13 = f30*f13;
+	f4 = f4+f9;
+	f9 = f29*f22;
+	f8 = f8+f17;
+	f11 = f11+f13;
+	f2 = f2+f7;
+	f4 = f4+f9;
+	f7 = f0*f5;
+	f9 = f10*f16;
+	f13 = f0*f1;
+	f15 = f10*f3;
+	f7 = f7+f9;
+	f9 = f11*f2;
+	f13 = f13+f15;
+	f15 = f11*f4;
+	f7 = f7+f9;
+	f9 = f13+f15;
+	f13 = heapFloat[(fp+-40)];
+if(!(f13 >=f12)) //_LBB587_44
+{
+	f13 = heapFloat[(r1+109)];
+if(!(f13 >=f12)) //_LBB587_44
+{
+	f1 =                         0;
+	if(f7 <f1) //_LBB587_37
+{
+	f7 = -f7;
+}
+	f2 =   1.1920928955078125e-007;
+if(!(f7 >=f2)) //_LBB587_43
+{
+	if(f9 <f1) //_LBB587_41
+{
+	f9 = -f9;
+}
+	if(f9 <f2) //_LBB587_67
+{
+break _37;
+}
+}
+	f1 = f10*f8;
+	f2 = f11*f6;
+	f1 = f1-f2;
+	r3 = 1;
+	f2 = f11*f14;
+	f3 = f0*f8;
+	f2 = f2-f3;
+	f0 = f0*f6;
+	f3 = f10*f14;
+	f1 = -f1;
+	heap8[r0+514] = r3;
+	f0 = f0-f3;
+	f2 = -f2;
+	heapFloat[(r1+112)] = f1;
+	f0 = -f0;
+	heapFloat[(r1+113)] = f2;
+	heapFloat[(r1+114)] = f0;
+	heap32[(r1+115)] = 0;
+break _37;
+}
+}
+	f13 = f0*f14;
+	f15 = f10*f6;
+	f13 = f13+f15;
+	f15 = f11*f8;
+	f13 = f13+f15;
+	f15 = heapFloat[(fp+-40)];
+_52: do {
+	if(f15 >=f12) //_LBB587_56
+{
+	f15 =                         0;
+	if(f9 <f15) //_LBB587_58
+{
+	f17 = -f9;
+}
+else{
+	f17 = f9;
+}
+	f18 =   1.1920928955078125e-007;
+	if(f17 <f18) //_LBB587_49
+{
+break _52;
+}
+else{
+	r3 = 1;
+	heap8[r0+514] = r3;
+	f17 = heapFloat[(fp+-40)];
+	if(f17 <f12) //_LBB587_49
+{
+break _52;
+}
+else{
+	heapFloat[(g0)] = f7;
+	heapFloat[(g0+1)] = f13;
+	atan2f(i7);
+	f9 = f_g0;
+	f12 = heapFloat[(r1+108)];
+	if(f12 >=f9) //_LBB587_63
+{
+	f17 = -f12;
+	if(f9 <f17) //_LBB587_65
+{
+	heapFloat[(g0)] = f12;
+	cosf(i7);
+	f13 = f_g0;
+	f7 = heapFloat[(r1+108)];
+	heapFloat[(g0)] = f7;
+	sinf(i7);
+	f7 = -f_g0;
+	f9 =                         0;
+}
+else{
+	f9 = f15;
+}
+}
+else{
+	heapFloat[(g0)] = f12;
+	cosf(i7);
+	f13 = f_g0;
+	f9 = heapFloat[(r1+108)];
+	heapFloat[(g0)] = f9;
+	f9 =                         0;
+	sinf(i7);
+	f7 = f_g0;
+}
+}
+}
+}
+else{
+	f15 =                         0;
+	if(f7 <f15) //_LBB587_47
+{
+	f17 = -f7;
+}
+else{
+	f17 = f7;
+}
+	f18 =   1.1920928955078125e-007;
+	if(f17 >=f18) //_LBB587_50
+{
+	r3 = 1;
+	heap8[r0+514] = r3;
+	f17 = heapFloat[(r1+109)];
+if(!(f17 <f12)) //_LBB587_49
+{
+	heapFloat[(g0)] = f9;
+	heapFloat[(g0+1)] = f13;
+	atan2f(i7);
+	f7 = f_g0;
+	f12 = heapFloat[(r1+109)];
+	if(f12 >=f7) //_LBB587_53
+{
+	f17 = -f12;
+	if(f7 <f17) //_LBB587_55
+{
+	heapFloat[(g0)] = f12;
+	cosf(i7);
+	f13 = f_g0;
+	f7 = heapFloat[(r1+109)];
+	heapFloat[(g0)] = f7;
+	sinf(i7);
+	f9 = -f_g0;
+	f7 =                         0;
+}
+else{
+	f7 = f15;
+}
+}
+else{
+	heapFloat[(g0)] = f12;
+	cosf(i7);
+	f13 = f_g0;
+	f7 = heapFloat[(r1+109)];
+	heapFloat[(g0)] = f7;
+	f7 =                         0;
+	sinf(i7);
+	f9 = f_g0;
+}
+}
+}
+}
+} while(0);
+	f12 = f14*f13;
+	f5 = f5*f7;
+	f6 = f6*f13;
+	f14 = f16*f7;
+	f5 = f12+f5;
+	f1 = f1*f9;
+	f6 = f6+f14;
+	f3 = f3*f9;
+	f8 = f8*f13;
+	f2 = f2*f7;
+	f1 = f5+f1;
+	f3 = f6+f3;
+	f2 = f8+f2;
+	f4 = f4*f9;
+	f2 = f2+f4;
+	f4 = f1*f1;
+	f5 = f3*f3;
+	f4 = f4+f5;
+	f5 = f2*f2;
+	f4 = f4+f5;
+	heapFloat[(g0)] = f4;
+	f4 =                         1;
+	sqrtf(i7);
+	f5 = f4/f_g0;
+	f2 = f2*f5;
+	f3 = f3*f5;
+	f1 = f1*f5;
+	f5 = f10*f2;
+	f6 = f11*f3;
+	f5 = f5-f6;
+	f6 = f11*f1;
+	f2 = f0*f2;
+	f2 = f6-f2;
+	f6 = -f5;
+	f0 = f0*f3;
+	f1 = f10*f1;
+	f0 = f0-f1;
+	f1 = -f2;
+	heapFloat[(r1+112)] = f6;
+	f3 = -f0;
+	heapFloat[(r1+113)] = f1;
+	heapFloat[(r1+114)] = f3;
+	heap32[(r1+115)] = 0;
+	f1 = f5*f5;
+	f2 = f2*f2;
+	f1 = f1+f2;
+	f0 = f0*f0;
+	f0 = f1+f0;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	heapFloat[(r1+123)] = f_g0;
+	f0 = heapFloat[(r1+112)];
+	f1 = heapFloat[(r1+113)];
+	f2 = heapFloat[(r1+114)];
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f4/f_g0;
+	f1 = heapFloat[(r1+112)];
+	f1 = f1*f0;
+	heapFloat[(r1+112)] = f1;
+	f1 = heapFloat[(r1+113)];
+	f1 = f1*f0;
+	heapFloat[(r1+113)] = f1;
+	f1 = heapFloat[(r1+114)];
+	f0 = f1*f0;
+	heapFloat[(r1+114)] = f0;
+}
+} while(0);
+	f0 = heapFloat[(r1+110)];
+	f1 =                         0;
+	if(f0 <f1) //_LBB587_82
+{
+	heap32[(r1+125)] = 0;
+break _8;
+}
+else{
+	f0 =                        -1;
+	f1 = heapFloat[(fp+-41)];
+	f1 = f1 < f0 ? f0 : f1;
+	f2 =                         1;
+	f1 = f1 > f2 ? f2 : f1;
+	heapFloat[(g0)] = f1;
+	acosf(i7);
+	f1 = f_g0+f_g0;
+	heapFloat[(r1+125)] = f1;
+	f3 =        3.1415927410125732;
+	if(f1 >f3) //_LBB587_70
+{
+	f1 = heapFloat[(fp+-41)];
+	f1 = -f1;
+	f1 = f1 < f0 ? f0 : f1;
+	f0 =                         1;
+	f1 = f1 > f0 ? f0 : f1;
+	heapFloat[(g0)] = f1;
+	acosf(i7);
+	f0 = heapFloat[(fp+-39)];
+	f0 = -f0;
+	heapFloat[(fp+-39)] = f0;
+	f0 = heapFloat[(fp+-38)];
+	f0 = -f0;
+	heapFloat[(fp+-38)] = f0;
+	f0 = heapFloat[(fp+-37)];
+	f0 = -f0;
+	heapFloat[(fp+-37)] = f0;
+	f1 = f_g0+f_g0;
+	heapFloat[(r1+125)] = f1;
+}
+	f0 =   1.1920928955078125e-007;
+	if(f1 >f0) //_LBB587_73
+{
+	f1 = heapFloat[(fp+-37)];
+	f0 = f1*f1;
+	f3 = heapFloat[(fp+-38)];
+	f4 = f3*f3;
+	f0 = f0+f4;
+	f4 = heapFloat[(fp+-39)];
+	f5 = f4*f4;
+	f0 = f0+f5;
+	heapFloat[(g0)] = f0;
+	f0 =                         1;
+	sqrtf(i7);
+	f0 = f0/f_g0;
+	f1 = f1*f0;
+	heapFloat[(fp+-37)] = f1;
+	f3 = f3*f0;
+	heapFloat[(fp+-38)] = f3;
+	f4 = f4*f0;
+	heapFloat[(fp+-39)] = f4;
+	f1 = heapFloat[(r1+125)];
+}
+	f0 = heapFloat[(r1+110)];
+	f3 = heapFloat[(r1+104)];
+	f4 = f0*f3;
+if(!(f1 <=f4)) //_LBB587_80
+{
+	r3 = 1;
+	heap8[r0+513] = r3;
+	if(f1 >=f0) //_LBB587_77
+{
+__label__ = 66;
+}
+else{
+	f5 =       0.99999988079071045;
+	if(f3 <f5) //_LBB587_78
+{
+	f3 = f1-f4;
+	f0 = f0-f4;
+	f0 = f3/f0;
+__label__ = 68;
+}
+else{
+__label__ = 66;
+}
+}
+if (__label__ == 66){
+	f0 = f2;
+}
+	f3 = heapFloat[(fp+-37)];
+	f5 = -f3;
+	f6 = heapFloat[(fp+-38)];
+	f7 = -f6;
+	f8 = heapFloat[(fp+-46)];
+	f9 = f3*f8;
+	f10 = heapFloat[(fp+-45)];
+	f11 = f10*f6;
+	f12 = heapFloat[(fp+-48)];
+	f5 = f12*f5;
+	f13 = heapFloat[(fp+-39)];
+	f14 = f10*f13;
+	f15 = -f13;
+	f9 = f9+f11;
+	f11 = heapFloat[(fp+-47)];
+	f16 = f11*f13;
+	f5 = f5-f14;
+	f14 = f11*f6;
+	f7 = f12*f7;
+	f11 = f11*f3;
+	f5 = f5+f14;
+	f9 = f9+f16;
+	f7 = f7-f11;
+	f11 = f8*f13;
+	f13 = f12*f15;
+	f6 = f8*f6;
+	f7 = f7+f11;
+	f8 = heapFloat[(fp+-42)];
+	f11 = f9*f8;
+	f14 = f5*f12;
+	f6 = f13-f6;
+	f3 = f10*f3;
+	f3 = f6+f3;
+	f6 = heapFloat[(fp+-44)];
+	f10 = f9*f6;
+	f13 = f7*f12;
+	f11 = f11+f14;
+	f14 = heapFloat[(fp+-43)];
+	f15 = f7*f14;
+	f9 = f9*f14;
+	f12 = f3*f12;
+	f10 = f10+f13;
+	f13 = f3*f8;
+	f11 = f11+f15;
+	f3 = f3*f6;
+	f1 = f1-f4;
+	heapFloat[(r1+130)] = f0;
+	f0 = f9+f12;
+	f4 = f5*f6;
+	f6 = f10+f13;
+	f5 = f5*f14;
+	f3 = f11-f3;
+	heapFloat[(r1+124)] = f1;
+	f0 = f0+f4;
+	f1 = f7*f8;
+	f4 = f6-f5;
+	heapFloat[(r1+116)] = f3;
+	f0 = f0-f1;
+	heapFloat[(r1+117)] = f4;
+	heapFloat[(r1+118)] = f0;
+	r2 = r2 >> 2;
+	heap32[(r1+119)] = 0;
+	r3 = r5 >> 2;
+	f1 = heapFloat[(r2+1)];
+	f5 = heapFloat[(r2+5)];
+	f6 = heapFloat[(r2)];
+	f7 = heapFloat[(r2+4)];
+	f8 = heapFloat[(r3+1)];
+	f9 = heapFloat[(r3+5)];
+	f10 = heapFloat[(r3)];
+	f11 = heapFloat[(r3+4)];
+	f12 = heapFloat[(r2+2)];
+	f13 = heapFloat[(r2+6)];
+	f14 = heapFloat[(r2+9)];
+	f15 = heapFloat[(r2+8)];
+	f16 = heapFloat[(r3+2)];
+	f17 = heapFloat[(r3+6)];
+	f18 = heapFloat[(r3+9)];
+	f19 = heapFloat[(r3+8)];
+	f6 = f6*f3;
+	f7 = f7*f4;
+	f1 = f1*f3;
+	f5 = f5*f4;
+	f10 = f10*f3;
+	f11 = f11*f4;
+	f8 = f8*f3;
+	f9 = f9*f4;
+	f20 = heapFloat[(r2+10)];
+	f21 = heapFloat[(r3+10)];
+	f6 = f6+f7;
+	f7 = f15*f0;
+	f1 = f1+f5;
+	f5 = f14*f0;
+	f12 = f12*f3;
+	f13 = f13*f4;
+	f10 = f10+f11;
+	f11 = f19*f0;
+	f8 = f8+f9;
+	f9 = f18*f0;
+	f14 = f16*f3;
+	f15 = f17*f4;
+	f6 = f6+f7;
+	f1 = f1+f5;
+	f5 = f10+f11;
+	f7 = f8+f9;
+	f8 = f12+f13;
+	f9 = f20*f0;
+	f10 = f14+f15;
+	f11 = f21*f0;
+	f8 = f8+f9;
+	f9 = f10+f11;
+	f6 = f3*f6;
+	f1 = f4*f1;
+	f3 = f3*f5;
+	f4 = f4*f7;
+	f1 = f6+f1;
+	f5 = f0*f8;
+	f3 = f3+f4;
+	f0 = f0*f9;
+	f1 = f1+f5;
+	f0 = f3+f0;
+	f0 = f1+f0;
+	f0 = f2/f0;
+	heapFloat[(r1+121)] = f0;
+}
+	r0 = heapU8[r0+514];
+	if(r0 ==0) //_LBB587_83
+{
+break _8;
+}
+else{
+	f0 = heapFloat[(fp+-37)];
+	f1 = -f0;
+	f2 = heapFloat[(fp+-38)];
+	f3 = -f2;
+	f4 = heapFloat[(fp+-52)];
+	f1 = f4*f1;
+	f6 = heapFloat[(fp+-39)];
+	f5 = heapFloat[(fp+-50)];
+	f7 = f5*f6;
+	f8 = heapFloat[(fp+-49)];
+	f9 = f0*f8;
+	f10 = f5*f2;
+	f11 = -f6;
+	f1 = f1-f7;
+	f7 = heapFloat[(fp+-51)];
+	f12 = f7*f2;
+	f9 = f9+f10;
+	f10 = f7*f6;
+	f3 = f4*f3;
+	f13 = f7*f0;
+	f1 = f1+f12;
+	f9 = f9+f10;
+	f3 = f3-f13;
+	f6 = f8*f6;
+	f10 = f4*f11;
+	f2 = f8*f2;
+	f3 = f3+f6;
+	f6 = f1*f4;
+	f11 = f9*f8;
+	f2 = f10-f2;
+	f0 = f5*f0;
+	f0 = f2+f0;
+	f2 = f3*f4;
+	f10 = f9*f5;
+	f6 = f6-f11;
+	f11 = f3*f7;
+	f4 = f0*f4;
+	f9 = f9*f7;
+	f2 = f2-f10;
+	f10 = f0*f8;
+	f6 = f6-f11;
+	f0 = f0*f5;
+	f0 = f6+f0;
+	f4 = f4-f9;
+	f5 = f1*f5;
+	f2 = f2-f10;
+	f1 = f1*f7;
+	f4 = f4-f5;
+	f3 = f3*f8;
+	f1 = f2+f1;
+	heapFloat[(r1+131)] = f0;
+	f0 = f4+f3;
+	heapFloat[(r1+132)] = f1;
+	heapFloat[(r1+133)] = f0;
+	heap32[(r1+134)] = 0;
+	return;
+}
+}
+}
+}
+	r0 = _2E_str584;
+	r1 = _2E_str685;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 188;
+	_assert(i7);
+}
+} while(0);
+	return;
+}
+
+function _ZN15btJacobianEntryC2ERK9btVector3RK11btMatrix3x3S5_S2_S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(r0+2)] = 0;
+	r1 = r1 >> 2;
+	heap32[(r0+3)] = 0;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r2)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r2+4)];
+	f5 = heapFloat[(r2+5)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r1+2)];
+	f7 = heapFloat[(r2+2)];
+	f8 = heapFloat[(r2+8)];
+	f9 = heapFloat[(r2+9)];
+	f10 = heapFloat[(r2+10)];
+	f11 = heapFloat[(r2+6)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f11*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f10*f6;
+	f3 = f4+f5;
+	heapFloat[(r0+4)] = f1;
+	f0 = f0+f2;
+	heapFloat[(r0+5)] = f3;
+	heapFloat[(r0+6)] = f0;
+	heap32[(r0+7)] = 0;
+	r2 = heap32[(fp+3)];
+	r2 = r2 >> 2;
+	f2 = heapFloat[(r1)];
+	f2 = -f2;
+	f4 = heapFloat[(r2)];
+	f5 = heapFloat[(r1+1)];
+	f6 = heapFloat[(r2+1)];
+	f7 = heapFloat[(r2+4)];
+	f8 = heapFloat[(r2+5)];
+	f4 = f4*f2;
+	f6 = f6*f5;
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r2+2)];
+	f11 = heapFloat[(r2+8)];
+	f12 = heapFloat[(r2+9)];
+	f13 = heapFloat[(r2+10)];
+	f14 = heapFloat[(r2+6)];
+	f7 = f7*f2;
+	f8 = f8*f5;
+	f4 = f4-f6;
+	f6 = f10*f9;
+	f2 = f11*f2;
+	f5 = f12*f5;
+	f7 = f7-f8;
+	f8 = f14*f9;
+	f4 = f4-f6;
+	f2 = f2-f5;
+	f5 = f13*f9;
+	f6 = f7-f8;
+	heapFloat[(r0+8)] = f4;
+	f2 = f2-f5;
+	heapFloat[(r0+9)] = f6;
+	r1 = heap32[(fp+4)];
+	heapFloat[(r0+10)] = f2;
+	r1 = r1 >> 2;
+	heap32[(r0+11)] = 0;
+	f5 = heapFloat[(r1+2)];
+	f7 = heapFloat[(r1+1)];
+	f8 = heapFloat[(r1)];
+	f8 = f8*f1;
+	f7 = f7*f3;
+	heapFloat[(r0+12)] = f8;
+	f5 = f5*f0;
+	heapFloat[(r0+13)] = f7;
+	r1 = heap32[(fp+5)];
+	heapFloat[(r0+14)] = f5;
+	r1 = r1 >> 2;
+	heap32[(r0+15)] = 0;
+	f9 = heapFloat[(r1+2)];
+	f10 = heapFloat[(r1+1)];
+	f11 = heapFloat[(r1)];
+	f10 = f10*f6;
+	f11 = f11*f4;
+	f9 = f9*f2;
+	heapFloat[(r0+16)] = f11;
+	f1 = f8*f1;
+	f3 = f7*f3;
+	f4 = f11*f4;
+	f6 = f10*f6;
+	heapFloat[(r0+17)] = f10;
+	f1 = f1+f3;
+	f0 = f5*f0;
+	f3 = f4+f6;
+	f2 = f9*f2;
+	heapFloat[(r0+18)] = f9;
+	f0 = f1+f0;
+	f1 = f3+f2;
+	f0 = f0+f1;
+	heap32[(r0+19)] = 0;
+	f1 =                         0;
+	heapFloat[(r0+20)] = f0;
+	if(f0 >f1) //_LBB588_2
+{
+	return;
+}
+else{
+	r0 = _2E_str846;
+	r1 = _2E_str947;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 70;
+	_assert(i7);
+}
+}
+
+function _Z21btAdjustAngleToLimitsfff(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	f0 = heapFloat[(fp+1)];
+	f1 = heapFloat[(fp+2)];
+	f2 = heapFloat[(fp)];
+_1: do {
+if(!(f0 >=f1)) //_LBB589_39
+{
+	if(f2 >=f0) //_LBB589_20
+{
+	if(f2 <=f1) //_LBB589_39
+{
+break _1;
+}
+else{
+	f1 = f2-f1;
+	heapFloat[(g0)] = f1;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f1 = f_g0;
+	f3 =       -3.1415927410125732;
+	if(f1 >=f3) //_LBB589_23
+{
+	f4 =        3.1415927410125732;
+	if(f1 >f4) //_LBB589_25
+{
+	f4 =       -6.2831854820251465;
+	f1 = f1+f4;
+}
+}
+else{
+	f4 =        6.2831854820251465;
+	f1 = f1+f4;
+}
+	f4 =                         0;
+	if(f1 <f4) //_LBB589_28
+{
+	f1 = -f1;
+}
+	f0 = f2-f0;
+	heapFloat[(g0)] = f0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f0 = f_g0;
+	if(f0 >=f3) //_LBB589_31
+{
+	f3 =        3.1415927410125732;
+	if(f0 >f3) //_LBB589_33
+{
+	f3 =       -6.2831854820251465;
+	f0 = f0+f3;
+}
+}
+else{
+	f3 =        6.2831854820251465;
+	f0 = f0+f3;
+}
+	if(f0 <f4) //_LBB589_36
+{
+	f0 = -f0;
+}
+	if(f0 >=f1) //_LBB589_39
+{
+break _1;
+}
+else{
+	f0 =       -6.2831854820251465;
+	f2 = f2+f0;
+}
+}
+}
+else{
+	f0 = f0-f2;
+	heapFloat[(g0)] = f0;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f0 = f_g0;
+	f3 =       -3.1415927410125732;
+	if(f0 >=f3) //_LBB589_4
+{
+	f4 =        3.1415927410125732;
+	if(f0 >f4) //_LBB589_6
+{
+	f4 =       -6.2831854820251465;
+	f0 = f0+f4;
+}
+}
+else{
+	f4 =        6.2831854820251465;
+	f0 = f0+f4;
+}
+	f4 =                         0;
+	if(f0 <f4) //_LBB589_9
+{
+	f0 = -f0;
+}
+	f1 = f1-f2;
+	heapFloat[(g0)] = f1;
+	heap32[(g0+1)] = 1086918619;
+	fmodf(i7);
+	f1 = f_g0;
+	if(f1 >=f3) //_LBB589_12
+{
+	f3 =        3.1415927410125732;
+	if(f1 >f3) //_LBB589_14
+{
+	f3 =       -6.2831854820251465;
+	f1 = f1+f3;
+}
+}
+else{
+	f3 =        6.2831854820251465;
+	f1 = f1+f3;
+}
+	if(f1 <f4) //_LBB589_17
+{
+	f1 = -f1;
+}
+if(!(f0 <f1)) //_LBB589_39
+{
+	f0 =        6.2831854820251465;
+	f0 = f2+f0;
+	f_g0 = f0;
+	return;
+}
+}
+}
+} while(0);
+	f_g0 = f2;
+	return;
+}
+
+function _ZNK17btHingeConstraint28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 212;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK17btHingeConstraint9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	r1 = r1 >> 2;
+	r2 = r0 >> 2;
+	_ZNK17btTypedConstraint9serializeEPvP12btSerializer(i7);
+	heap32[(r1+11)] = heap32[(r2+135)];
+	heap32[(r1+12)] = heap32[(r2+136)];
+	heap32[(r1+13)] = heap32[(r2+137)];
+	heap32[(r1+14)] = heap32[(r2+138)];
+	heap32[(r1+15)] = heap32[(r2+139)];
+	heap32[(r1+16)] = heap32[(r2+140)];
+	heap32[(r1+17)] = heap32[(r2+141)];
+	heap32[(r1+18)] = heap32[(r2+142)];
+	heap32[(r1+19)] = heap32[(r2+143)];
+	heap32[(r1+20)] = heap32[(r2+144)];
+	heap32[(r1+21)] = heap32[(r2+145)];
+	heap32[(r1+22)] = heap32[(r2+146)];
+	heap32[(r1+23)] = heap32[(r2+147)];
+	heap32[(r1+24)] = heap32[(r2+148)];
+	heap32[(r1+25)] = heap32[(r2+149)];
+	heap32[(r1+26)] = heap32[(r2+150)];
+	heap32[(r1+27)] = heap32[(r2+151)];
+	heap32[(r1+28)] = heap32[(r2+152)];
+	heap32[(r1+29)] = heap32[(r2+153)];
+	heap32[(r1+30)] = heap32[(r2+154)];
+	heap32[(r1+31)] = heap32[(r2+155)];
+	heap32[(r1+32)] = heap32[(r2+156)];
+	heap32[(r1+33)] = heap32[(r2+157)];
+	heap32[(r1+34)] = heap32[(r2+158)];
+	heap32[(r1+35)] = heap32[(r2+159)];
+	heap32[(r1+36)] = heap32[(r2+160)];
+	heap32[(r1+37)] = heap32[(r2+161)];
+	heap32[(r1+38)] = heap32[(r2+162)];
+	heap32[(r1+39)] = heap32[(r2+163)];
+	heap32[(r1+40)] = heap32[(r2+164)];
+	heap32[(r1+41)] = heap32[(r2+165)];
+	heap32[(r1+42)] = heap32[(r2+166)];
+	r3 = heapU8[r0+720];
+	heap32[(r1+44)] = r3;
+	r3 = heapU8[r0+721];
+	heap32[(r1+45)] = r3;
+	heap32[(r1+47)] = heap32[(r2+168)];
+	heap32[(r1+46)] = heap32[(r2+167)];
+	r0 = heapU8[r0+725];
+	heap32[(r1+43)] = r0;
+	heap32[(r1+48)] = heap32[(r2+172)];
+	heap32[(r1+49)] = heap32[(r2+173)];
+	heap32[(r1+50)] = heap32[(r2+169)];
+	heap32[(r1+51)] = heap32[(r2+170)];
+	heap32[(r1+52)] = heap32[(r2+171)];
+	r0 = _2E_str29;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN17btHingeConstraintD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btHingeConstraint;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN17btHingeConstraintD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV17btHingeConstraint;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN17btHingeConstraint13buildJacobianEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -552;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+723];
+if(!(r1 ==0)) //_LBB594_25
+{
+	r1 = r0 >> 2;
+	heap32[(r1+7)] = 0;
+	heap32[(r1+182)] = 0;
+	r2 = heapU8[r0+720];
+if(!(r2 !=0)) //_LBB594_13
+{
+	r2 = heap32[(r1+6)];
+	r3 = heap32[(r1+5)];
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r2+5)];
+	f1 = heapFloat[(r1+163)];
+	f2 = heapFloat[(r2+1)];
+	f3 = heapFloat[(r2+6)];
+	f4 = heapFloat[(r1+164)];
+	f5 = heapFloat[(r2+2)];
+	f6 = heapFloat[(r3+5)];
+	f7 = heapFloat[(r1+147)];
+	f8 = heapFloat[(r3+1)];
+	f9 = heapFloat[(r3+6)];
+	f10 = heapFloat[(r1+148)];
+	f11 = heapFloat[(r3+2)];
+	f12 = heapFloat[(r2+9)];
+	f13 = heapFloat[(r2+10)];
+	f14 = heapFloat[(r3+9)];
+	f15 = heapFloat[(r3+10)];
+	f0 = f0*f1;
+	f3 = f3*f4;
+	f16 = heapFloat[(r2+7)];
+	f17 = heapFloat[(r1+165)];
+	f18 = heapFloat[(r2+3)];
+	f6 = f6*f7;
+	f9 = f9*f10;
+	f19 = heapFloat[(r3+7)];
+	f20 = heapFloat[(r1+149)];
+	f21 = heapFloat[(r3+3)];
+	f2 = f2*f1;
+	f5 = f5*f4;
+	f8 = f8*f7;
+	f11 = f11*f10;
+	f22 = heapFloat[(r2+11)];
+	f23 = heapFloat[(r3+11)];
+	f1 = f12*f1;
+	f4 = f13*f4;
+	f7 = f14*f7;
+	f10 = f15*f10;
+	f0 = f0+f3;
+	f3 = f16*f17;
+	f6 = f6+f9;
+	f9 = f19*f20;
+	f2 = f2+f5;
+	f5 = f18*f17;
+	f8 = f8+f11;
+	f11 = f21*f20;
+	f1 = f1+f4;
+	f4 = f22*f17;
+	f7 = f7+f10;
+	f10 = f23*f20;
+	f0 = f0+f3;
+	f3 = heapFloat[(r2+14)];
+	f6 = f6+f9;
+	f9 = heapFloat[(r3+14)];
+	f2 = f2+f5;
+	f5 = heapFloat[(r2+13)];
+	f8 = f8+f11;
+	f11 = heapFloat[(r3+13)];
+	f0 = f0+f3;
+	f3 = f6+f9;
+	f2 = f2+f5;
+	f5 = f8+f11;
+	f1 = f1+f4;
+	f4 = heapFloat[(r2+15)];
+	f6 = f7+f10;
+	f7 = heapFloat[(r3+15)];
+	f8 = f0-f3;
+	f9 = f2-f5;
+	f1 = f1+f4;
+	f4 = f6+f7;
+	f6 = f1-f4;
+	f7 = f9*f9;
+	f10 = f8*f8;
+	f7 = f7+f10;
+	f10 = f6*f6;
+	f7 = f7+f10;
+	f10 =   1.1920928955078125e-007;
+	if(f7 >f10) //_LBB594_4
+{
+	heapFloat[(g0)] = f7;
+	f10 =                         1;
+	sqrtf(i7);
+	f11 = f10/f_g0;
+	r2 = sp + -512;
+	f7 = f9*f11;
+	f8 = f8*f11;
+	r3 = r2 >> 2;
+	heapFloat[(fp+-128)] = f7;
+	f6 = f6*f11;
+	heapFloat[(r3+1)] = f8;
+	r2 = (r2 + 8)|0;
+	heapFloat[(r3+2)] = f6;
+	heap32[(r3+3)] = 0;
+	f9 =                         0;
+	if(f6 <f9) //_LBB594_6
+{
+	f9 = -f6;
+}
+else{
+	f9 = f6;
+}
+	f11 =       0.70710676908493042;
+	if(f9 >f11) //_LBB594_9
+{
+	f7 = f8*f8;
+	f8 = f6*f6;
+	f7 = f7+f8;
+	heapFloat[(g0)] = f7;
+	sqrtf(i7);
+	heap32[(r3+4)] = 0;
+	f6 = heapFloat[(r3+2)];
+	f8 = f10/f_g0;
+	f6 = -f6;
+	f6 = f8*f6;
+	heapFloat[(r3+5)] = f6;
+	f9 = heapFloat[(r3+1)];
+	f9 = f9*f8;
+	f7 = f7*f8;
+	heapFloat[(r3+6)] = f9;
+	heapFloat[(r3+8)] = f7;
+	f7 = heapFloat[(fp+-128)];
+	f8 = -f7;
+	f8 = f9*f8;
+	f7 = f7*f6;
+	heapFloat[(r3+9)] = f8;
+	heapFloat[(r3+10)] = f7;
+__label__ = 10;
+}
+else{
+__label__ = 9;
+}
+}
+else{
+	r2 = sp + -512;
+	r3 = r2 >> 2;
+	heap32[(fp+-128)] = 1065353216;
+	heap32[(r3+1)] = 0;
+	r2 = (r2 + 8)|0;
+	f7 =                         1;
+	f8 =                         0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = 0;
+__label__ = 9;
+}
+if (__label__ == 9){
+	f6 = f7*f7;
+	f7 = f8*f8;
+	f6 = f6+f7;
+	r3 = sp + -512;
+	heapFloat[(g0)] = f6;
+	r3 = r3 >> 2;
+	sqrtf(i7);
+	f8 =                         1;
+	f9 = heapFloat[(r3+1)];
+	f7 = f8/f_g0;
+	f8 = -f9;
+	f8 = f7*f8;
+	heapFloat[(r3+4)] = f8;
+	f9 = heapFloat[(fp+-128)];
+	f9 = f9*f7;
+	heapFloat[(r3+5)] = f9;
+	r2 = r2 >> 2;
+	heap32[(r3+6)] = 0;
+	f10 = heapFloat[(r2)];
+	f11 = -f10;
+	f9 = f9*f11;
+	f8 = f10*f8;
+	heapFloat[(r3+8)] = f9;
+	f6 = f6*f7;
+	heapFloat[(r3+9)] = f8;
+	heapFloat[(r3+10)] = f6;
+}
+	r2 = (r0 + 36)|0;
+	r3 = 0;
+_16: while(true){
+	r4 = heap32[(r1+5)];
+	r5 = r4 >> 2;
+	r6 = sp + -416;
+	r7 = r6 >> 2;
+	heap32[(fp+-104)] = heap32[(r5+1)];
+	heap32[(r7+1)] = heap32[(r5+5)];
+	heap32[(r7+2)] = heap32[(r5+9)];
+	heap32[(r7+3)] = 0;
+	heap32[(r7+4)] = heap32[(r5+2)];
+	heap32[(r7+5)] = heap32[(r5+6)];
+	heap32[(r7+6)] = heap32[(r5+10)];
+	heap32[(r7+7)] = 0;
+	heap32[(r7+8)] = heap32[(r5+3)];
+	heap32[(r7+9)] = heap32[(r5+7)];
+	heap32[(r7+10)] = heap32[(r5+11)];
+	heap32[(r7+11)] = 0;
+	r7 = heap32[(r1+6)];
+	r8 = sp + -368;
+	r9 = r7 >> 2;
+	r10 = r8 >> 2;
+	heap32[(fp+-92)] = heap32[(r9+1)];
+	heap32[(r10+1)] = heap32[(r9+5)];
+	heap32[(r10+2)] = heap32[(r9+9)];
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = heap32[(r9+2)];
+	heap32[(r10+5)] = heap32[(r9+6)];
+	heap32[(r10+6)] = heap32[(r9+10)];
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = heap32[(r9+3)];
+	heap32[(r10+9)] = heap32[(r9+7)];
+	heap32[(r10+10)] = heap32[(r9+11)];
+	heap32[(r10+11)] = 0;
+	f6 = heapFloat[(r5+13)];
+	f7 = heapFloat[(r5+15)];
+	f8 = heapFloat[(r5+14)];
+	r10 = sp + -320;
+	f6 = f5-f6;
+	r11 = r10 >> 2;
+	f8 = f3-f8;
+	heapFloat[(fp+-80)] = f6;
+	f6 = f4-f7;
+	heapFloat[(r11+1)] = f8;
+	heapFloat[(r11+2)] = f6;
+	heap32[(r11+3)] = 0;
+	f6 = heapFloat[(r9+13)];
+	f7 = heapFloat[(r9+15)];
+	f8 = heapFloat[(r9+14)];
+	r11 = sp + -304;
+	f6 = f2-f6;
+	r12 = r11 >> 2;
+	f8 = f0-f8;
+	heapFloat[(fp+-76)] = f6;
+	f6 = f1-f7;
+	heapFloat[(r12+1)] = f8;
+	heapFloat[(r12+2)] = f6;
+	heap32[(r12+3)] = 0;
+	f6 = heapFloat[(r9+84)];
+	f7 = heapFloat[(r5+84)];
+	r5 = sp + -512;
+	r5 = (r5 + r3)|0;
+	r4 = (r4 + 388)|0;
+	r7 = (r7 + 388)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r11;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r4;
+	heapFloat[(g0+7)] = f7;
+	heap32[(g0+8)] = r7;
+	heapFloat[(g0+9)] = f6;
+	r3 = (r3 + 16)|0;
+	r2 = (r2 + 84)|0;
+	_ZN15btJacobianEntryC2ERK11btMatrix3x3S2_RK9btVector3S5_S5_S5_fS5_f(i7);
+if(!(r3 !=48)) //_LBB594_12
+{
+break _16;
+}
+}
+}
+	f0 = heapFloat[(r1+145)];
+	f1 = heapFloat[(r1+137)];
+	f2 = heapFloat[(r1+141)];
+	f3 =                         0;
+	if(f0 <f3) //_LBB594_15
+{
+	f4 = -f0;
+}
+else{
+	f4 = f0;
+}
+	f5 =       0.70710676908493042;
+	if(f4 <=f5) //_LBB594_18
+{
+	f4 = f1*f1;
+	f6 = f2*f2;
+	f5 = f4+f6;
+	heapFloat[(g0)] = f5;
+	f4 =                         1;
+	sqrtf(i7);
+	f7 = f4/f_g0;
+	f2 = -f2;
+	f4 = f7*f2;
+	f6 = f1*f7;
+	f1 = -f0;
+	f2 = f6*f1;
+	f0 = f0*f4;
+	f1 = f5*f7;
+}
+else{
+	f3 = f2*f2;
+	f4 = f0*f0;
+	f4 = f3+f4;
+	heapFloat[(g0)] = f4;
+	f3 =                         1;
+	sqrtf(i7);
+	f5 = f3/f_g0;
+	f0 = -f0;
+	f6 = f5*f0;
+	f3 = f2*f5;
+	f0 = -f1;
+	f2 = f4*f5;
+	f0 = f3*f0;
+	f1 = f1*f6;
+	f4 =                         0;
+}
+	r2 = heap32[(r1+5)];
+	r3 = r2 >> 2;
+	f5 = heapFloat[(r3+2)];
+	f7 = heapFloat[(r3+1)];
+	f8 = heapFloat[(r3+6)];
+	f9 = heapFloat[(r3+5)];
+	f10 = heapFloat[(r3+3)];
+	f11 = f7*f4;
+	f12 = f5*f6;
+	f13 = heapFloat[(r3+11)];
+	f14 = heapFloat[(r3+7)];
+	f15 = heapFloat[(r3+10)];
+	f16 = heapFloat[(r3+9)];
+	f17 = f9*f4;
+	f18 = f8*f6;
+	f11 = f11+f12;
+	f12 = f10*f3;
+	r3 = sp + -432;
+	f4 = f16*f4;
+	f6 = f15*f6;
+	f17 = f17+f18;
+	f18 = f14*f3;
+	f11 = f11+f12;
+	r4 = r3 >> 2;
+	f4 = f4+f6;
+	f3 = f13*f3;
+	f6 = f17+f18;
+	heapFloat[(fp+-108)] = f11;
+	f11 = f7*f2;
+	f12 = f5*f0;
+	f3 = f4+f3;
+	heapFloat[(r4+1)] = f6;
+	heapFloat[(r4+2)] = f3;
+	f3 = f9*f2;
+	f4 = f8*f0;
+	f6 = f11+f12;
+	f11 = f10*f1;
+	r5 = sp + -448;
+	f2 = f16*f2;
+	f0 = f15*f0;
+	f3 = f3+f4;
+	f4 = f14*f1;
+	f6 = f6+f11;
+	heap32[(r4+3)] = 0;
+	r4 = r5 >> 2;
+	f0 = f2+f0;
+	f1 = f13*f1;
+	f2 = f3+f4;
+	heapFloat[(fp+-112)] = f6;
+	f0 = f0+f1;
+	heapFloat[(r4+1)] = f2;
+	heapFloat[(r4+2)] = f0;
+	heap32[(r4+3)] = 0;
+	f0 = heapFloat[(r1+137)];
+	f1 = heapFloat[(r1+141)];
+	f2 = heapFloat[(r1+145)];
+	f3 = f7*f0;
+	f4 = f5*f1;
+	f6 = f9*f0;
+	f11 = f8*f1;
+	f3 = f3+f4;
+	f4 = f10*f2;
+	r4 = sp + -464;
+	f0 = f16*f0;
+	f1 = f15*f1;
+	f6 = f6+f11;
+	f11 = f14*f2;
+	f3 = f3+f4;
+	r6 = r4 >> 2;
+	f0 = f0+f1;
+	f1 = f13*f2;
+	f2 = f6+f11;
+	heapFloat[(fp+-116)] = f3;
+	f0 = f0+f1;
+	heapFloat[(r6+1)] = f2;
+	heapFloat[(r6+2)] = f0;
+	r7 = sp + -288;
+	heap32[(r6+3)] = 0;
+	r6 = r7 >> 2;
+	heapFloat[(fp+-72)] = f7;
+	heapFloat[(r6+1)] = f9;
+	heapFloat[(r6+2)] = f16;
+	heap32[(r6+3)] = 0;
+	heapFloat[(r6+4)] = f5;
+	heapFloat[(r6+5)] = f8;
+	heapFloat[(r6+6)] = f15;
+	heap32[(r6+7)] = 0;
+	heapFloat[(r6+8)] = f10;
+	heapFloat[(r6+9)] = f14;
+	heapFloat[(r6+10)] = f13;
+	heap32[(r6+11)] = 0;
+	r6 = heap32[(r1+6)];
+	r8 = sp + -240;
+	r9 = r6 >> 2;
+	r10 = r8 >> 2;
+	heap32[(fp+-60)] = heap32[(r9+1)];
+	heap32[(r10+1)] = heap32[(r9+5)];
+	heap32[(r10+2)] = heap32[(r9+9)];
+	heap32[(r10+3)] = 0;
+	heap32[(r10+4)] = heap32[(r9+2)];
+	heap32[(r10+5)] = heap32[(r9+6)];
+	heap32[(r10+6)] = heap32[(r9+10)];
+	heap32[(r10+7)] = 0;
+	heap32[(r10+8)] = heap32[(r9+3)];
+	heap32[(r10+9)] = heap32[(r9+7)];
+	heap32[(r10+10)] = heap32[(r9+11)];
+	heap32[(r10+11)] = 0;
+	r9 = (r0 + 288)|0;
+	r2 = (r2 + 388)|0;
+	r6 = (r6 + 388)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r8;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r6;
+	_ZN15btJacobianEntryC2ERK9btVector3RK11btMatrix3x3S5_S2_S2_(i7);
+	r2 = heap32[(r1+5)];
+	r3 = sp + -192;
+	r6 = r2 >> 2;
+	r7 = r3 >> 2;
+	heap32[(fp+-48)] = heap32[(r6+1)];
+	heap32[(r7+1)] = heap32[(r6+5)];
+	heap32[(r7+2)] = heap32[(r6+9)];
+	heap32[(r7+3)] = 0;
+	heap32[(r7+4)] = heap32[(r6+2)];
+	heap32[(r7+5)] = heap32[(r6+6)];
+	heap32[(r7+6)] = heap32[(r6+10)];
+	heap32[(r7+7)] = 0;
+	heap32[(r7+8)] = heap32[(r6+3)];
+	heap32[(r7+9)] = heap32[(r6+7)];
+	heap32[(r7+10)] = heap32[(r6+11)];
+	heap32[(r7+11)] = 0;
+	r6 = heap32[(r1+6)];
+	r7 = sp + -144;
+	r8 = r6 >> 2;
+	r9 = r7 >> 2;
+	heap32[(fp+-36)] = heap32[(r8+1)];
+	heap32[(r9+1)] = heap32[(r8+5)];
+	heap32[(r9+2)] = heap32[(r8+9)];
+	heap32[(r9+3)] = 0;
+	heap32[(r9+4)] = heap32[(r8+2)];
+	heap32[(r9+5)] = heap32[(r8+6)];
+	heap32[(r9+6)] = heap32[(r8+10)];
+	heap32[(r9+7)] = 0;
+	heap32[(r9+8)] = heap32[(r8+3)];
+	heap32[(r9+9)] = heap32[(r8+7)];
+	heap32[(r9+10)] = heap32[(r8+11)];
+	heap32[(r9+11)] = 0;
+	r8 = (r0 + 372)|0;
+	r2 = (r2 + 388)|0;
+	r6 = (r6 + 388)|0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r6;
+	_ZN15btJacobianEntryC2ERK9btVector3RK11btMatrix3x3S5_S2_S2_(i7);
+	r2 = heap32[(r1+5)];
+	r3 = sp + -96;
+	r5 = r2 >> 2;
+	r6 = r3 >> 2;
+	heap32[(fp+-24)] = heap32[(r5+1)];
+	heap32[(r6+1)] = heap32[(r5+5)];
+	heap32[(r6+2)] = heap32[(r5+9)];
+	heap32[(r6+3)] = 0;
+	heap32[(r6+4)] = heap32[(r5+2)];
+	heap32[(r6+5)] = heap32[(r5+6)];
+	heap32[(r6+6)] = heap32[(r5+10)];
+	heap32[(r6+7)] = 0;
+	heap32[(r6+8)] = heap32[(r5+3)];
+	heap32[(r6+9)] = heap32[(r5+7)];
+	heap32[(r6+10)] = heap32[(r5+11)];
+	heap32[(r6+11)] = 0;
+	r5 = heap32[(r1+6)];
+	r6 = sp + -48;
+	r7 = r5 >> 2;
+	r8 = r6 >> 2;
+	heap32[(fp+-12)] = heap32[(r7+1)];
+	heap32[(r8+1)] = heap32[(r7+5)];
+	heap32[(r8+2)] = heap32[(r7+9)];
+	heap32[(r8+3)] = 0;
+	heap32[(r8+4)] = heap32[(r7+2)];
+	heap32[(r8+5)] = heap32[(r7+6)];
+	heap32[(r8+6)] = heap32[(r7+10)];
+	heap32[(r8+7)] = 0;
+	heap32[(r8+8)] = heap32[(r7+3)];
+	heap32[(r8+9)] = heap32[(r7+7)];
+	heap32[(r8+10)] = heap32[(r7+11)];
+	heap32[(r8+11)] = 0;
+	r7 = (r0 + 456)|0;
+	r2 = (r2 + 388)|0;
+	r5 = (r5 + 388)|0;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r5;
+	_ZN15btJacobianEntryC2ERK9btVector3RK11btMatrix3x3S5_S2_S2_(i7);
+	heap32[(r1+177)] = 0;
+	r2 = heap32[(r1+6)];
+	r3 = heap32[(r1+5)];
+	r3 = (r3 + 4)|0;
+	r2 = (r2 + 4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	_ZN17btHingeConstraint13getHingeAngleERK11btTransformS2_(i7);
+	f0 = f_g0;
+	heapFloat[(r1+178)] = f0;
+	heap32[(r1+176)] = 0;
+	r2 = 0;
+	heap32[(r1+175)] = 0;
+	heap8[r0+722] = r2;
+	f1 = heapFloat[(r1+172)];
+	f2 = heapFloat[(r1+173)];
+if(!(f1 >f2)) //_LBB594_24
+{
+	heapFloat[(g0)] = f0;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	_Z21btAdjustAngleToLimitsfff(i7);
+	f0 = f_g0;
+	heapFloat[(r1+178)] = f0;
+	f1 = heapFloat[(r1+172)];
+	if(f0 >f1) //_LBB594_22
+{
+	f1 = heapFloat[(r1+173)];
+if(!(f0 <f1)) //_LBB594_24
+{
+	f0 = f1-f0;
+	heapFloat[(r1+176)] = f0;
+	r2 = 1;
+	heap32[(r1+175)] = -1082130432;
+	heap8[r0+722] = r2;
+}
+}
+else{
+	f0 = f1-f0;
+	heapFloat[(r1+176)] = f0;
+	r2 = 1;
+	heap32[(r1+175)] = 1065353216;
+	heap8[r0+722] = r2;
+}
+}
+	r0 = heap32[(r1+5)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r1+137)];
+	f1 = heapFloat[(r0+5)];
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r1+141)];
+	f4 = heapFloat[(r0+6)];
+	f5 = heapFloat[(r0+2)];
+	f6 = heapFloat[(r0+9)];
+	f7 = heapFloat[(r0+10)];
+	r2 = heap32[(r1+6)];
+	f2 = f2*f0;
+	f5 = f5*f3;
+	f1 = f1*f0;
+	f4 = f4*f3;
+	f8 = heapFloat[(r1+145)];
+	f9 = heapFloat[(r0+7)];
+	f10 = heapFloat[(r0+3)];
+	r2 = r2 >> 2;
+	f11 = heapFloat[(r0+11)];
+	f0 = f6*f0;
+	f3 = f7*f3;
+	f2 = f2+f5;
+	f5 = f10*f8;
+	f1 = f1+f4;
+	f4 = f9*f8;
+	f0 = f0+f3;
+	f3 = f11*f8;
+	f2 = f2+f5;
+	f5 = heapFloat[(r0+65)];
+	f6 = heapFloat[(r0+64)];
+	f7 = heapFloat[(r2+65)];
+	f8 = heapFloat[(r2+64)];
+	f1 = f1+f4;
+	f4 = heapFloat[(r0+69)];
+	f9 = heapFloat[(r0+68)];
+	f10 = heapFloat[(r2+69)];
+	f11 = heapFloat[(r2+68)];
+	f12 = heapFloat[(r0+66)];
+	f13 = heapFloat[(r0+70)];
+	f14 = heapFloat[(r2+66)];
+	f15 = heapFloat[(r2+70)];
+	f6 = f6*f2;
+	f9 = f9*f1;
+	f5 = f5*f2;
+	f4 = f4*f1;
+	f8 = f8*f2;
+	f11 = f11*f1;
+	f7 = f7*f2;
+	f10 = f10*f1;
+	f0 = f0+f3;
+	f3 = heapFloat[(r0+73)];
+	f16 = heapFloat[(r0+72)];
+	f17 = heapFloat[(r2+73)];
+	f18 = heapFloat[(r2+72)];
+	f19 = heapFloat[(r0+74)];
+	f20 = heapFloat[(r2+74)];
+	f6 = f6+f9;
+	f9 = f16*f0;
+	f4 = f5+f4;
+	f3 = f3*f0;
+	f5 = f12*f2;
+	f12 = f13*f1;
+	f8 = f8+f11;
+	f11 = f18*f0;
+	f7 = f7+f10;
+	f10 = f17*f0;
+	f13 = f14*f2;
+	f14 = f15*f1;
+	f6 = f6+f9;
+	f3 = f4+f3;
+	f4 = f8+f11;
+	f7 = f7+f10;
+	f5 = f5+f12;
+	f8 = f19*f0;
+	f9 = f13+f14;
+	f10 = f20*f0;
+	f5 = f5+f8;
+	f8 = f9+f10;
+	f6 = f2*f6;
+	f3 = f1*f3;
+	f2 = f2*f4;
+	f1 = f1*f7;
+	f3 = f6+f3;
+	f4 = f0*f5;
+	f1 = f2+f1;
+	f0 = f0*f8;
+	f2 = f3+f4;
+	f0 = f1+f0;
+	f1 =                         1;
+	f0 = f2+f0;
+	f0 = f1/f0;
+	heapFloat[(r1+174)] = f0;
+}
+	return;
+}
+
+function _ZN17btHingeConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU8[r0+723];
+	if(r2 ==0) //_LBB595_2
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 5;
+	heap32[(r1+1)] = 1;
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+6)];
+	r4 = heap32[(r2+5)];
+	r4 = (r4 + 4)|0;
+	r3 = (r3 + 4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r3;
+	_ZN17btHingeConstraint13getHingeAngleERK11btTransformS2_(i7);
+	f0 = f_g0;
+	heapFloat[(r2+178)] = f0;
+	heap32[(r2+176)] = 0;
+	r3 = 0;
+	heap32[(r2+175)] = 0;
+	heap8[r0+722] = r3;
+	f1 = heapFloat[(r2+172)];
+	f2 = heapFloat[(r2+173)];
+	if(f1 >f2) //_LBB595_8
+{
+__label__ = 8;
+}
+else{
+	heapFloat[(g0)] = f0;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	_Z21btAdjustAngleToLimitsfff(i7);
+	f0 = f_g0;
+	heapFloat[(r2+178)] = f0;
+	f1 = heapFloat[(r2+172)];
+	if(f0 >f1) //_LBB595_5
+{
+	f1 = heapFloat[(r2+173)];
+	if(f0 <f1) //_LBB595_7
+{
+	r2 = heapU8[r0+722];
+	if(r2 !=0) //_LBB595_10
+{
+__label__ = 10;
+}
+else{
+__label__ = 8;
+}
+}
+else{
+	f0 = f1-f0;
+	heapFloat[(r2+176)] = f0;
+	r3 = 1;
+	heap32[(r2+175)] = -1082130432;
+	heap8[r0+722] = r3;
+__label__ = 10;
+}
+}
+else{
+	f0 = f1-f0;
+	heapFloat[(r2+176)] = f0;
+	r3 = 1;
+	heap32[(r2+175)] = 1065353216;
+	heap8[r0+722] = r3;
+__label__ = 10;
+}
+}
+if (__label__ == 8){
+	r0 = heapU8[r0+721];
+if(!(r0 !=0)) //_LBB595_10
+{
+	return;
+}
+}
+	r0 = heap32[(r1)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1)] = r0;
+	r0 = heap32[(r1+1)];
+	r0 = (r0 + -1)|0;
+	heap32[(r1+1)] = r0;
+	return;
+}
+else{
+	r0 = r1 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(r0+1)] = 0;
+	return;
+}
+}
+
+function _ZN17btHingeConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -136;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(r1+6)];
+	r4 = heap32[(r1+5)];
+	r5 = heapU8[r0+723];
+	r6 = heapU8[r0+724];
+_1: do {
+	if(r6 ==0) //_LBB596_60
+{
+	r5 = r5 & 255;
+	if(r5 ==0) //_LBB596_62
+{
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r1+147)];
+	f1 = heapFloat[(r4+9)];
+	f2 = heapFloat[(r4+5)];
+	f3 = heapFloat[(r4+1)];
+	f4 = heapFloat[(r1+148)];
+	f5 = heapFloat[(r4+10)];
+	f6 = heapFloat[(r4+6)];
+	f7 = heapFloat[(r4+2)];
+	f8 = heapFloat[(r1+163)];
+	f9 = heapFloat[(r3+9)];
+	heapFloat[(fp+-3)] = f9;
+	f10 = heapFloat[(r3+5)];
+	heapFloat[(fp+-2)] = f10;
+	f11 = heapFloat[(r3+1)];
+	heapFloat[(fp+-1)] = f11;
+	f12 = heapFloat[(r1+164)];
+	f13 = heapFloat[(r3+10)];
+	f14 = heapFloat[(r3+6)];
+	f9 = heapFloat[(r3+2)];
+	heapFloat[(fp+-7)] = f9;
+	f10 = heapFloat[(r1+137)];
+	f11 = heapFloat[(r1+141)];
+	f15 = heapFloat[(r1+136)];
+	f16 = heapFloat[(r1+140)];
+	f17 = heapFloat[(r1+135)];
+	f18 = heapFloat[(r1+139)];
+	f19 = heapFloat[(r1+153)];
+	f20 = heapFloat[(r1+157)];
+	f21 = f1*f0;
+	f22 = f5*f4;
+	f23 = f2*f0;
+	f24 = f6*f4;
+	f0 = f3*f0;
+	f4 = f7*f4;
+	f25 = heapFloat[(r1+149)];
+	f26 = heapFloat[(r4+11)];
+	f27 = heapFloat[(r4+7)];
+	f28 = heapFloat[(r4+3)];
+	f9 = heapFloat[(fp+-3)];
+	f29 = f9*f8;
+	heapFloat[(fp+-8)] = f29;
+	f30 = f13*f12;
+	heapFloat[(fp+-10)] = f30;
+	f9 = heapFloat[(fp+-2)];
+	f9 = f9*f8;
+	heapFloat[(fp+-9)] = f9;
+	f9 = f14*f12;
+	heapFloat[(fp+-12)] = f9;
+	f9 = heapFloat[(fp+-1)];
+	f8 = f9*f8;
+	heapFloat[(fp+-11)] = f8;
+	f9 = heapFloat[(fp+-7)];
+	f12 = f9*f12;
+	heapFloat[(fp+-13)] = f12;
+	f8 = heapFloat[(r1+165)];
+	f9 = heapFloat[(r3+11)];
+	heapFloat[(fp+-4)] = f9;
+	f9 = heapFloat[(r3+7)];
+	heapFloat[(fp+-6)] = f9;
+	f9 = heapFloat[(r3+3)];
+	heapFloat[(fp+-5)] = f9;
+	f9 = heapFloat[(r1+145)];
+	f12 = heapFloat[(r1+144)];
+	f29 = heapFloat[(r1+143)];
+	f30 = heapFloat[(r1+161)];
+	f21 = f21+f22;
+	heapFloat[(fp+-15)] = f21;
+	f22 = f26*f25;
+	f21 = f23+f24;
+	heapFloat[(fp+-16)] = f21;
+	f23 = f27*f25;
+	f0 = f0+f4;
+	heapFloat[(fp+-14)] = f0;
+	f0 = f28*f25;
+	heapFloat[(fp+-23)] = f0;
+	f0 = f10*f1;
+	heapFloat[(fp+-24)] = f0;
+	f4 = f11*f5;
+	f21 = f15*f1;
+	heapFloat[(fp+-18)] = f21;
+	f24 = f16*f5;
+	f1 = f17*f1;
+	heapFloat[(fp+-20)] = f1;
+	f5 = f18*f5;
+	f25 = f10*f2;
+	heapFloat[(fp+-17)] = f25;
+	f0 = f11*f6;
+	f1 = f15*f2;
+	heapFloat[(fp+-19)] = f1;
+	f1 = f16*f6;
+	heapFloat[(fp+-28)] = f1;
+	f2 = f17*f2;
+	heapFloat[(fp+-21)] = f2;
+	f1 = f18*f6;
+	heapFloat[(fp+-29)] = f1;
+	f2 = f10*f3;
+	heapFloat[(fp+-25)] = f2;
+	f6 = f11*f7;
+	f10 = f15*f3;
+	heapFloat[(fp+-26)] = f10;
+	f11 = f16*f7;
+	f3 = f17*f3;
+	heapFloat[(fp+-22)] = f3;
+	f7 = f18*f7;
+	f15 = heapFloat[(fp+-8)];
+	f16 = heapFloat[(fp+-10)];
+	f15 = f15+f16;
+	heapFloat[(fp+-27)] = f15;
+	f16 = heapFloat[(fp+-4)];
+	f17 = f16*f8;
+	f18 = heapFloat[(fp+-9)];
+	f21 = heapFloat[(fp+-12)];
+	f18 = f18+f21;
+	heapFloat[(fp+-8)] = f18;
+	f21 = heapFloat[(fp+-6)];
+	f25 = f21*f8;
+	f1 = heapFloat[(fp+-11)];
+	f2 = heapFloat[(fp+-13)];
+	f1 = f1+f2;
+	heapFloat[(fp+-9)] = f1;
+	f2 = heapFloat[(fp+-5)];
+	f1 = f2*f8;
+	heapFloat[(fp+-11)] = f1;
+	f2 = heapFloat[(fp+-3)];
+	f2 = f19*f2;
+	heapFloat[(fp+-3)] = f2;
+	f1 = f20*f13;
+	heapFloat[(fp+-12)] = f1;
+	f2 = heapFloat[(fp+-2)];
+	f2 = f19*f2;
+	heapFloat[(fp+-10)] = f2;
+	f1 = f20*f14;
+	heapFloat[(fp+-13)] = f1;
+	f2 = heapFloat[(fp+-1)];
+	f2 = f19*f2;
+	heapFloat[(fp+-2)] = f2;
+	f3 = heapFloat[(fp+-7)];
+	f1 = f20*f3;
+	heapFloat[(fp+-30)] = f1;
+	r5 = r2 >> 2;
+	f2 = heapFloat[(r4+15)];
+	f3 = heapFloat[(fp+-15)];
+	f3 = f3+f22;
+	heapFloat[(fp+-7)] = f3;
+	f8 = heapFloat[(r4+14)];
+	f10 = heapFloat[(fp+-16)];
+	f1 = f10+f23;
+	heapFloat[(fp+-15)] = f1;
+	f1 = heapFloat[(r4+13)];
+	heapFloat[(fp+-1)] = f1;
+	f3 = heapFloat[(fp+-14)];
+	f10 = heapFloat[(fp+-23)];
+	f3 = f3+f10;
+	heapFloat[(fp+-16)] = f3;
+	f10 = heapFloat[(fp+-24)];
+	f4 = f10+f4;
+	heapFloat[(fp+-14)] = f4;
+	f1 = f9*f26;
+	heapFloat[(fp+-23)] = f1;
+	f3 = heapFloat[(fp+-18)];
+	f1 = f3+f24;
+	heapFloat[(fp+-18)] = f1;
+	f3 = f12*f26;
+	f4 = heapFloat[(fp+-20)];
+	f4 = f4+f5;
+	f5 = f29*f26;
+	f10 = heapFloat[(fp+-17)];
+	f0 = f10+f0;
+	f10 = f9*f27;
+	f13 = heapFloat[(fp+-19)];
+	f14 = heapFloat[(fp+-28)];
+	f13 = f13+f14;
+	f14 = f12*f27;
+	f15 = heapFloat[(fp+-21)];
+	f16 = heapFloat[(fp+-29)];
+	f15 = f15+f16;
+	f16 = f29*f27;
+	f18 = heapFloat[(fp+-25)];
+	f6 = f18+f6;
+	f9 = f9*f28;
+	f18 = heapFloat[(fp+-26)];
+	f11 = f18+f11;
+	f12 = f12*f28;
+	f18 = heapFloat[(fp+-22)];
+	f7 = f18+f7;
+	f18 = f29*f28;
+	f19 = heapFloat[(fp+-27)];
+	f17 = f19+f17;
+	f19 = heapFloat[(r3+15)];
+	f20 = heapFloat[(fp+-8)];
+	f20 = f20+f25;
+	f21 = heapFloat[(r3+14)];
+	f22 = heapFloat[(fp+-9)];
+	f23 = heapFloat[(fp+-11)];
+	f22 = f22+f23;
+	f23 = heapFloat[(r3+13)];
+	f24 = heapFloat[(fp+-3)];
+	f25 = heapFloat[(fp+-12)];
+	f24 = f24+f25;
+	f25 = heapFloat[(fp+-4)];
+	f25 = f30*f25;
+	f26 = heapFloat[(fp+-10)];
+	f27 = heapFloat[(fp+-13)];
+	f26 = f26+f27;
+	f27 = heapFloat[(fp+-6)];
+	f27 = f30*f27;
+	f28 = heapFloat[(fp+-2)];
+	f29 = heapFloat[(fp+-30)];
+	f28 = f28+f29;
+	f29 = heapFloat[(fp+-5)];
+	f29 = f30*f29;
+	r6 = heap32[(r5+6)];
+	f30 = heapFloat[(fp+-7)];
+	f30 = f30+f2;
+	heapFloat[(fp+-2)] = f30;
+	f30 = heapFloat[(fp+-15)];
+	f30 = f30+f8;
+	heapFloat[(fp+-3)] = f30;
+	f30 = heapFloat[(fp+-16)];
+	f1 = heapFloat[(fp+-1)];
+	f1 = f30+f1;
+	heapFloat[(fp+-4)] = f1;
+	f1 = heapFloat[(fp+-14)];
+	f30 = heapFloat[(fp+-23)];
+	f1 = f1+f30;
+	f30 = heapFloat[(fp+-18)];
+	f3 = f30+f3;
+	f4 = f4+f5;
+	f0 = f0+f10;
+	f5 = f13+f14;
+	f10 = f15+f16;
+	f6 = f6+f9;
+	f9 = f11+f12;
+	f7 = f7+f18;
+	f11 = f17+f19;
+	f12 = f20+f21;
+	f13 = f22+f23;
+	f14 = f24+f25;
+	f15 = f26+f27;
+	f16 = f28+f29;
+	r7 = heapU8[r0+720];
+	if(r7 ==0) //_LBB596_64
+{
+	r7 = heap32[(r5+2)];
+	r7 = r7 >> 2;
+	heap32[(r7)] = 1065353216;
+	r7 = r6 << 2;
+	r8 = heap32[(r5+2)];
+	r7 = (r7 + r8)|0;
+	r7 = r7 >> 2;
+	heap32[(r7+1)] = 1065353216;
+	r7 = r6 << 3;
+	r8 = heap32[(r5+2)];
+	r7 = (r7 + r8)|0;
+	r7 = r7 >> 2;
+	heap32[(r7+2)] = 1065353216;
+	f2 = heapFloat[(r4+15)];
+	f8 = heapFloat[(r4+14)];
+	f17 = heapFloat[(r4+13)];
+	heapFloat[(fp+-1)] = f17;
+}
+	r7 = heap32[(r5+3)];
+	r8 = r7 >> 2;
+	f17 = heapFloat[(fp+-3)];
+	f8 = f17-f8;
+	f17 = heapFloat[(fp+-2)];
+	f2 = f17-f2;
+	heap32[(r8)] = 0;
+	r9 = (r6 + 1)|0;
+	r10 = r6 << 2;
+	f17 = -f8;
+	heapFloat[(r8+1)] = f2;
+	r11 = (r6 + 2)|0;
+	r9 = r9 << 2;
+	r12 = (r7 + r10)|0;
+	heapFloat[(r8+2)] = f17;
+	r13 = (r6 + 3)|0;
+	r11 = r11 << 2;
+	r14 = (r7 + r9)|0;
+	r12 = r12 >> 2;
+	f2 = -f2;
+	heap32[(r8+3)] = 0;
+	r8 = r13 << 2;
+	r13 = (r7 + r11)|0;
+	r14 = r14 >> 2;
+	heapFloat[(r12)] = f2;
+	r12 = r6 << 3;
+	r15 = (r7 + r8)|0;
+	f17 = heapFloat[(fp+-4)];
+	f2 = heapFloat[(fp+-1)];
+	f2 = f17-f2;
+	r13 = r13 >> 2;
+	heap32[(r14)] = 0;
+	r14 = r12 | 4;
+	r16 = (r7 + r12)|0;
+	r15 = r15 >> 2;
+	heapFloat[(r13)] = f2;
+	r13 = (r12 + 8)|0;
+	r17 = (r7 + r14)|0;
+	r16 = r16 >> 2;
+	heap32[(r15)] = 0;
+	r15 = (r12 + 12)|0;
+	r18 = (r7 + r13)|0;
+	r17 = r17 >> 2;
+	f2 = -f2;
+	heapFloat[(r16)] = f8;
+	r7 = (r7 + r15)|0;
+	r16 = r18 >> 2;
+	heapFloat[(r17)] = f2;
+	r7 = r7 >> 2;
+	heap32[(r16)] = 0;
+	heap32[(r7)] = 0;
+	r7 = heap32[(r5+5)];
+	f2 = heapFloat[(r3+15)];
+	f8 = heapFloat[(r3+14)];
+	f17 = heapFloat[(r3+13)];
+	f2 = f11-f2;
+	r16 = r7 >> 2;
+	f18 = -f2;
+	heap32[(r16)] = 0;
+	f8 = f12-f8;
+	heapFloat[(r16+1)] = f18;
+	r17 = (r7 + r10)|0;
+	heapFloat[(r16+2)] = f8;
+	r9 = (r7 + r9)|0;
+	r17 = r17 >> 2;
+	heap32[(r16+3)] = 0;
+	f17 = f13-f17;
+	r11 = (r7 + r11)|0;
+	r9 = r9 >> 2;
+	heapFloat[(r17)] = f2;
+	r8 = (r7 + r8)|0;
+	r11 = r11 >> 2;
+	f2 = -f17;
+	heap32[(r9)] = 0;
+	r9 = (r7 + r12)|0;
+	r8 = r8 >> 2;
+	heapFloat[(r11)] = f2;
+	r11 = (r7 + r14)|0;
+	r9 = r9 >> 2;
+	f2 = -f8;
+	heap32[(r8)] = 0;
+	r8 = (r7 + r13)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r9)] = f2;
+	r7 = (r7 + r15)|0;
+	r8 = r8 >> 2;
+	heapFloat[(r11)] = f17;
+	r7 = r7 >> 2;
+	heap32[(r8)] = 0;
+	heap32[(r7)] = 0;
+	f2 = heapFloat[(r5)];
+	f8 = heapFloat[(r5+1)];
+	f2 = f2*f8;
+	r7 = heapU8[r0+720];
+if(!(r7 !=0)) //_LBB596_67
+{
+	r6 = r6 << 1;
+	r7 = heap32[(r5+7)];
+	f8 = heapFloat[(fp+-4)];
+	f8 = f13-f8;
+	r7 = r7 >> 2;
+	f8 = f8*f2;
+	heapFloat[(r7)] = f8;
+	r7 = heap32[(r5+7)];
+	r7 = (r7 + r10)|0;
+	f8 = heapFloat[(fp+-3)];
+	f8 = f12-f8;
+	r7 = r7 >> 2;
+	f8 = f8*f2;
+	heapFloat[(r7)] = f8;
+	r6 = r6 << 2;
+	r7 = heap32[(r5+7)];
+	r6 = (r7 + r6)|0;
+	f8 = heapFloat[(fp+-2)];
+	f8 = f11-f8;
+	r6 = r6 >> 2;
+	f8 = f8*f2;
+	heapFloat[(r6)] = f8;
+}
+	r2 = (r2 + 4)|0;
+	r6 = heap32[(r5+6)];
+	r7 = (r6 * 3)|0;
+	r8 = heap32[(r5+3)];
+	r9 = r7 << 2;
+	r8 = (r8 + r9)|0;
+	r8 = r8 >> 2;
+	r10 = (r7 + 1)|0;
+	heapFloat[(r8)] = f7;
+	r8 = r10 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r8)|0;
+	r10 = r10 >> 2;
+	r7 = (r7 + 2)|0;
+	heapFloat[(r10)] = f10;
+	r7 = r7 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r7)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r10)] = f4;
+	r6 = r6 << 4;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r6)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r10)] = f9;
+	r10 = r6 | 4;
+	r11 = heap32[(r5+3)];
+	r11 = (r11 + r10)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r11)] = f5;
+	r11 = r6 | 8;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r11)|0;
+	r12 = r12 >> 2;
+	heapFloat[(r12)] = f3;
+	r12 = heap32[(r5+5)];
+	r12 = (r12 + r9)|0;
+	r12 = r12 >> 2;
+	f8 = -f7;
+	heapFloat[(r12)] = f8;
+	r12 = heap32[(r5+5)];
+	r8 = (r12 + r8)|0;
+	r8 = r8 >> 2;
+	f8 = -f10;
+	heapFloat[(r8)] = f8;
+	r8 = heap32[(r5+5)];
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	f8 = -f4;
+	heapFloat[(r7)] = f8;
+	r7 = heap32[(r5+5)];
+	r7 = (r7 + r6)|0;
+	r7 = r7 >> 2;
+	f8 = -f9;
+	heapFloat[(r7)] = f8;
+	r7 = heap32[(r5+5)];
+	r7 = (r7 + r10)|0;
+	r7 = r7 >> 2;
+	f8 = -f5;
+	heapFloat[(r7)] = f8;
+	r7 = heap32[(r5+5)];
+	r7 = (r7 + r11)|0;
+	f8 = f0*f14;
+	f11 = f1*f15;
+	f12 = f1*f16;
+	f13 = f6*f14;
+	f8 = f8-f11;
+	f11 = f12-f13;
+	f12 = f6*f15;
+	f13 = f0*f16;
+	r7 = r7 >> 2;
+	f14 = -f3;
+	f12 = f12-f13;
+	heapFloat[(r7)] = f14;
+	f7 = f8*f7;
+	f10 = f11*f10;
+	r7 = heap32[(r5+7)];
+	f7 = f7+f10;
+	f4 = f12*f4;
+	r7 = (r7 + r9)|0;
+	f4 = f7+f4;
+	r7 = r7 >> 2;
+	f4 = f4*f2;
+	heapFloat[(r7)] = f4;
+	f4 = f8*f9;
+	f5 = f11*f5;
+	r7 = heap32[(r5+7)];
+	f4 = f4+f5;
+	f3 = f12*f3;
+	r6 = (r7 + r6)|0;
+	f3 = f4+f3;
+	r6 = r6 >> 2;
+	f2 = f3*f2;
+	heapFloat[(r6)] = f2;
+	r6 = heapU8[r0+722];
+	if(r6 !=0) //_LBB596_69
+{
+	f2 = heapFloat[(r1+176)];
+	f3 = heapFloat[(r1+179)];
+	f2 = f2*f3;
+	f3 =                         0;
+	r6 = 1;
+	r7 = 2;
+	r6 = f2 > f3 ? r6 : r7;
+}
+else{
+	f2 =                         0;
+	r6 = 0;
+}
+	r7 = heapU8[r0+721];
+	r8 = 0;
+	r9 = r7 != r8;
+	r9 = r9 & 1;
+	r9 = r9 | r6;
+	if(r9 ==0) //_LBB596_59
+{
+__label__ = 54;
+break _1;
+}
+else{
+	r9 = heap32[(r5+6)];
+	r9 = (r9 * 5)|0;
+	r10 = heap32[(r5+3)];
+	r11 = r9 << 2;
+	r10 = (r10 + r11)|0;
+	r10 = r10 >> 2;
+	r12 = (r9 + 1)|0;
+	heapFloat[(r10)] = f6;
+	r10 = r12 << 2;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r10)|0;
+	r12 = r12 >> 2;
+	r9 = (r9 + 2)|0;
+	heapFloat[(r12)] = f0;
+	r9 = r9 << 2;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r9)|0;
+	r12 = r12 >> 2;
+	heapFloat[(r12)] = f1;
+	r12 = heap32[(r5+5)];
+	r12 = (r12 + r11)|0;
+	r12 = r12 >> 2;
+	f3 = -f6;
+	heapFloat[(r12)] = f3;
+	r12 = heap32[(r5+5)];
+	r10 = (r12 + r10)|0;
+	r10 = r10 >> 2;
+	f3 = -f0;
+	heapFloat[(r10)] = f3;
+	r10 = heap32[(r5+5)];
+	r9 = (r10 + r9)|0;
+	r9 = r9 >> 2;
+	f3 = -f1;
+	heapFloat[(r9)] = f3;
+	r9 = heap32[(r5+7)];
+	r9 = (r9 + r11)|0;
+	f3 = heapFloat[(r1+172)];
+	f4 = heapFloat[(r1+173)];
+	r9 = r9 >> 2;
+	heap32[(r9)] = 0;
+	r9 = r6 != r8;
+	r10 = f3 == f4;
+	r12 = heap32[(r1+183)];
+	r9 = r9 & r10;
+	r10 = r12 & 2;
+	if(r10 !=0) //_LBB596_73
+{
+	r2 = (r0 + 744)|0;
+}
+	r2 = r2 >> 2;
+	f5 = heapFloat[(r2)];
+	r2 = r7 == r8;
+	r2 = r9 | r2;
+if(!(r2 != 0)) //_LBB596_91
+{
+	r2 = r12 & 4;
+if(!(r2 ==0)) //_LBB596_77
+{
+	r2 = heap32[(r5+8)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+184)];
+}
+	f7 =                         1;
+	f8 =                         0;
+	f9 = heapFloat[(r1+167)];
+_24: do {
+	if(f3 <f4) //_LBB596_79
+{
+	f10 = heapFloat[(r1+178)];
+	f11 = heapFloat[(r5)];
+	f11 = f11*f5;
+	f11 = f9/f11;
+	if(f11 >=f8) //_LBB596_84
+{
+	if(f11 >f8) //_LBB596_86
+{
+if(!(f10 >f4)) //_LBB596_89
+{
+	f8 = f4-f11;
+if(!(f8 >=f10)) //_LBB596_89
+{
+	f7 = f4-f10;
+	f8 = f7/f11;
+break _24;
+}
+}
+	f8 =                         0;
+	f8 = f10 > f4 ? f8 : f7;
+}
+else{
+break _24;
+}
+}
+else{
+if(!(f10 <f3)) //_LBB596_83
+{
+	f8 = f3-f11;
+if(!(f8 <=f10)) //_LBB596_83
+{
+	f7 = f3-f10;
+	f8 = f7/f11;
+break _24;
+}
+}
+	f8 =                         0;
+	f8 = f10 < f3 ? f8 : f7;
+}
+}
+else{
+	f8 = f3 > f4 ? f7 : f8;
+}
+} while(0);
+	r2 = heap32[(r5+7)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	f7 = f9*f8;
+	f8 = heapFloat[(r1+179)];
+	f9 = heapFloat[(r2)];
+	f7 = f7*f8;
+	f7 = f9+f7;
+	heapFloat[(r2)] = f7;
+	r2 = heap32[(r5+9)];
+	f7 = heapFloat[(r1+168)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	f7 = -f7;
+	heapFloat[(r2)] = f7;
+	r2 = heap32[(r5+10)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+168)];
+}
+	if(r6 ==0) //_LBB596_59
+{
+__label__ = 54;
+break _1;
+}
+else{
+	r2 = heap32[(r5+7)];
+	r2 = (r2 + r11)|0;
+	f7 = heapFloat[(r5)];
+	r2 = r2 >> 2;
+	f5 = f7*f5;
+	f7 = heapFloat[(r2)];
+	f2 = f5*f2;
+	f2 = f7+f2;
+	heapFloat[(r2)] = f2;
+	r0 = heapU8[r0+732];
+	r0 = r0 & 1;
+if(!(r0 ==0)) //_LBB596_94
+{
+	r0 = heap32[(r5+8)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = heap32[(r1+185)];
+}
+	if(f3 !=f4) //_LBB596_96
+{
+	r0 = heap32[(r5+9)];
+	if(r6 !=1) //_LBB596_98
+{
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+}
+else{
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 2139095039;
+}
+}
+else{
+	r0 = heap32[(r5+9)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 2139095039;
+}
+	f2 = heapFloat[(r1+171)];
+	f3 =                         0;
+	if(f2 <=f3) //_LBB596_107
+{
+__label__ = 53;
+break _1;
+}
+else{
+	f4 = heapFloat[(r4+80)];
+	f5 = heapFloat[(r3+80)];
+	f7 = heapFloat[(r4+81)];
+	f8 = heapFloat[(r3+81)];
+	f4 = f4*f6;
+	f7 = f7*f0;
+	f9 = heapFloat[(r4+82)];
+	f10 = heapFloat[(r3+82)];
+	f5 = f5*f6;
+	f0 = f8*f0;
+	f4 = f4+f7;
+	f6 = f9*f1;
+	f0 = f5+f0;
+	f1 = f10*f1;
+	f4 = f4+f6;
+	f0 = f0+f1;
+	f0 = f4-f0;
+	if(r6 !=1) //_LBB596_104
+{
+	if(f0 <=f3) //_LBB596_107
+{
+__label__ = 53;
+break _1;
+}
+else{
+	r0 = heap32[(r5+7)];
+	f1 = -f2;
+	r0 = (r0 + r11)|0;
+	f0 = f0*f1;
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0)];
+	if(f1 <=f0) //_LBB596_107
+{
+__label__ = 53;
+break _1;
+}
+else{
+	heapFloat[(r0)] = f0;
+__label__ = 53;
+break _1;
+}
+}
+}
+else{
+	if(f0 >=f3) //_LBB596_107
+{
+__label__ = 53;
+break _1;
+}
+else{
+	r0 = heap32[(r5+7)];
+	f2 = -f2;
+	r0 = (r0 + r11)|0;
+	f0 = f0*f2;
+	r0 = r0 >> 2;
+	f2 = heapFloat[(r0)];
+	if(f2 >=f0) //_LBB596_107
+{
+__label__ = 53;
+break _1;
+}
+else{
+	heapFloat[(r0)] = f0;
+__label__ = 53;
+break _1;
+}
+}
+}
+}
+}
+}
+}
+else{
+	r0 = _2E_str1149;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 331;
+	_assert(i7);
+}
+}
+else{
+	r5 = r5 & 255;
+	if(r5 ==0) //_LBB596_3
+{
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	f0 = heapFloat[(r3+9)];
+	heapFloat[(fp+-5)] = f0;
+	f1 = heapFloat[(r1+163)];
+	f0 = heapFloat[(r3+5)];
+	heapFloat[(fp+-6)] = f0;
+	f2 = heapFloat[(r3+1)];
+	heapFloat[(fp+-4)] = f2;
+	f0 = heapFloat[(r3+10)];
+	heapFloat[(fp+-7)] = f0;
+	f2 = heapFloat[(r1+164)];
+	f0 = heapFloat[(r3+6)];
+	heapFloat[(fp+-8)] = f0;
+	f3 = heapFloat[(r3+2)];
+	heapFloat[(fp+-9)] = f3;
+	f4 = heapFloat[(r4+9)];
+	f5 = heapFloat[(r1+147)];
+	f6 = heapFloat[(r4+5)];
+	f7 = heapFloat[(r4+1)];
+	f8 = heapFloat[(r4+10)];
+	f9 = heapFloat[(r1+148)];
+	f10 = heapFloat[(r4+6)];
+	f11 = heapFloat[(r4+2)];
+	f0 = heapFloat[(fp+-5)];
+	f12 = f0*f1;
+	f0 = heapFloat[(fp+-7)];
+	f13 = f0*f2;
+	f14 = heapFloat[(r3+11)];
+	heapFloat[(fp+-2)] = f14;
+	f15 = heapFloat[(r1+165)];
+	f16 = heapFloat[(r3+7)];
+	heapFloat[(fp+-3)] = f16;
+	f17 = heapFloat[(r3+3)];
+	heapFloat[(fp+-1)] = f17;
+	f18 = f4*f5;
+	f19 = f8*f9;
+	f20 = heapFloat[(r4+11)];
+	f21 = heapFloat[(r1+149)];
+	f22 = heapFloat[(r4+7)];
+	f23 = heapFloat[(r4+3)];
+	f0 = heapFloat[(fp+-6)];
+	f24 = f0*f1;
+	f0 = heapFloat[(fp+-8)];
+	f25 = f0*f2;
+	f26 = f6*f5;
+	f27 = f10*f9;
+	f28 = heapFloat[(fp+-4)];
+	f1 = f28*f1;
+	f2 = f3*f2;
+	f5 = f7*f5;
+	f9 = f11*f9;
+	f29 = heapFloat[(r1+137)];
+	f30 = heapFloat[(r1+141)];
+	f0 = heapFloat[(r1+136)];
+	f3 = heapFloat[(r1+140)];
+	f14 = heapFloat[(r1+153)];
+	f16 = heapFloat[(r1+157)];
+	f12 = f12+f13;
+	heapFloat[(fp+-14)] = f12;
+	f13 = heapFloat[(fp+-2)];
+	f17 = f13*f15;
+	f18 = f18+f19;
+	f19 = f20*f21;
+	f24 = f24+f25;
+	f25 = heapFloat[(fp+-3)];
+	f28 = f25*f15;
+	f26 = f26+f27;
+	f27 = f22*f21;
+	f1 = f1+f2;
+	heapFloat[(fp+-10)] = f1;
+	f2 = heapFloat[(fp+-1)];
+	f15 = f2*f15;
+	f5 = f5+f9;
+	heapFloat[(fp+-12)] = f5;
+	f9 = f23*f21;
+	f21 = heapFloat[(r1+145)];
+	f1 = heapFloat[(r1+144)];
+	f2 = heapFloat[(r1+161)];
+	f5 = heapFloat[(r3+84)];
+	f12 = heapFloat[(r4+84)];
+	f13 =   1.1920928955078125e-007;
+	heapFloat[(fp+-11)] = f13;
+	f25 = f29*f4;
+	heapFloat[(fp+-13)] = f25;
+	f25 = f30*f8;
+	f4 = f0*f4;
+	heapFloat[(fp+-16)] = f4;
+	f8 = f3*f8;
+	f4 = f29*f6;
+	heapFloat[(fp+-15)] = f4;
+	f4 = f30*f10;
+	f6 = f0*f6;
+	heapFloat[(fp+-18)] = f6;
+	f10 = f3*f10;
+	f29 = f29*f7;
+	f30 = f30*f11;
+	f0 = f0*f7;
+	heapFloat[(fp+-17)] = f0;
+	f3 = f3*f11;
+	f7 = heapFloat[(fp+-5)];
+	f0 = f14*f7;
+	heapFloat[(fp+-19)] = f0;
+	f6 = heapFloat[(fp+-7)];
+	f6 = f16*f6;
+	f7 = heapFloat[(fp+-6)];
+	f7 = f14*f7;
+	heapFloat[(fp+-5)] = f7;
+	f11 = heapFloat[(fp+-8)];
+	f11 = f16*f11;
+	f0 = heapFloat[(fp+-4)];
+	f0 = f14*f0;
+	heapFloat[(fp+-4)] = f0;
+	f14 = heapFloat[(fp+-9)];
+	f14 = f16*f14;
+	f16 = heapFloat[(fp+-14)];
+	f16 = f16+f17;
+	f17 = heapFloat[(r3+15)];
+	f18 = f18+f19;
+	f19 = heapFloat[(r4+15)];
+	f24 = f24+f28;
+	f28 = heapFloat[(r3+14)];
+	f26 = f26+f27;
+	f27 = heapFloat[(r4+14)];
+	f0 = heapFloat[(fp+-10)];
+	f0 = f0+f15;
+	f15 = heapFloat[(r3+13)];
+	f7 = heapFloat[(fp+-12)];
+	f7 = f7+f9;
+	f9 = heapFloat[(r4+13)];
+	r5 = r2 >> 2;
+	f16 = f16+f17;
+	f17 = f18+f19;
+	f18 = f24+f28;
+	f19 = f26+f27;
+	f0 = f0+f15;
+	f7 = f7+f9;
+	f9 = heapFloat[(fp+-13)];
+	f9 = f9+f25;
+	f15 = f21*f20;
+	f24 = heapFloat[(fp+-16)];
+	f8 = f24+f8;
+	f20 = f1*f20;
+	f24 = heapFloat[(fp+-15)];
+	f4 = f24+f4;
+	f24 = f21*f22;
+	f25 = heapFloat[(fp+-18)];
+	f10 = f25+f10;
+	f22 = f1*f22;
+	f25 = f29+f30;
+	f21 = f21*f23;
+	f26 = heapFloat[(fp+-17)];
+	f3 = f26+f3;
+	f1 = f1*f23;
+	f23 = heapFloat[(fp+-19)];
+	f6 = f23+f6;
+	f23 = heapFloat[(fp+-2)];
+	f23 = f2*f23;
+	f26 = heapFloat[(fp+-5)];
+	f11 = f26+f11;
+	f26 = heapFloat[(fp+-3)];
+	f26 = f2*f26;
+	f27 = heapFloat[(fp+-4)];
+	f14 = f27+f14;
+	f27 = heapFloat[(fp+-1)];
+	f2 = f2*f27;
+	r6 = f12 < f13;
+	r7 = f5 < f13;
+	f12 = f12+f5;
+	r8 = heap32[(r5+6)];
+	f9 = f9+f15;
+	heapFloat[(fp+-3)] = f9;
+	f8 = f8+f20;
+	f4 = f4+f24;
+	heapFloat[(fp+-2)] = f4;
+	f4 = f10+f22;
+	f9 = f25+f21;
+	heapFloat[(fp+-4)] = f9;
+	f1 = f3+f1;
+	f3 = f6+f23;
+	heapFloat[(fp+-7)] = f3;
+	f3 = f11+f26;
+	heapFloat[(fp+-6)] = f3;
+	f2 = f14+f2;
+	heapFloat[(fp+-5)] = f2;
+	f2 = f16-f17;
+	heapFloat[(fp+-8)] = f2;
+	f2 = f18-f19;
+	heapFloat[(fp+-9)] = f2;
+	f2 = f0-f7;
+	heapFloat[(fp+-10)] = f2;
+	r6 = r6 | r7;
+	f2 =                         0;
+	if(f12 >f2) //_LBB596_5
+{
+	f5 = f5/f12;
+}
+else{
+	f5 =                       0.5;
+}
+	f3 =                         1;
+	heapFloat[(fp+-1)] = f3;
+	f6 = f3-f5;
+	f9 = heapFloat[(fp+-4)];
+	f9 = f9*f5;
+	f10 = heapFloat[(fp+-5)];
+	f10 = f10*f6;
+	f11 = heapFloat[(fp+-2)];
+	f11 = f11*f5;
+	f12 = heapFloat[(fp+-6)];
+	f12 = f12*f6;
+	f9 = f9+f10;
+	f10 = f11+f12;
+	f11 = heapFloat[(fp+-3)];
+	f11 = f11*f5;
+	f12 = heapFloat[(fp+-7)];
+	f12 = f12*f6;
+	f11 = f11+f12;
+	f12 = f9*f9;
+	f13 = f10*f10;
+	f12 = f12+f13;
+	f13 = f11*f11;
+	f12 = f12+f13;
+	heapFloat[(g0)] = f12;
+	sqrtf(i7);
+	f3 = f3/f_g0;
+	f12 = heapFloat[(r3+13)];
+	f13 = heapFloat[(r3+14)];
+	f14 = heapFloat[(r4+13)];
+	f15 = heapFloat[(r4+14)];
+	f9 = f9*f3;
+	f0 = f0-f12;
+	f7 = f7-f14;
+	f10 = f10*f3;
+	f12 = f18-f13;
+	f13 = f19-f15;
+	f14 = heapFloat[(r3+15)];
+	f15 = heapFloat[(r4+15)];
+	f3 = f11*f3;
+	f11 = f16-f14;
+	f14 = f17-f15;
+	f15 = f0*f9;
+	f16 = f12*f10;
+	f17 = f7*f9;
+	f18 = f13*f10;
+	f15 = f15+f16;
+	f16 = f11*f3;
+	f17 = f17+f18;
+	f18 = f14*f3;
+	f15 = f15+f16;
+	f16 = f17+f18;
+	f17 = f10*f15;
+	f18 = f10*f16;
+	f19 = f9*f15;
+	f20 = f9*f16;
+	f15 = f3*f15;
+	f16 = f3*f16;
+	f12 = f12-f17;
+	f13 = f13-f18;
+	f0 = f0-f19;
+	f7 = f7-f20;
+	f11 = f11-f15;
+	f14 = f14-f16;
+	f21 = f12*f5;
+	f22 = f13*f6;
+	f23 = f0*f5;
+	f24 = f7*f6;
+	f21 = f21+f22;
+	f22 = f23+f24;
+	f23 = f11*f5;
+	f24 = f14*f6;
+	f15 = f16-f15;
+	f16 = f18-f17;
+	f17 = f20-f19;
+	f18 = f23+f24;
+	f19 = f22*f22;
+	f20 = f21*f21;
+	f23 = f15*f5;
+	f24 = f16*f5;
+	f25 = f17*f5;
+	f15 = f15*f6;
+	f16 = f16*f6;
+	f17 = f17*f6;
+	f19 = f19+f20;
+	f20 = f18*f18;
+	f19 = f19+f20;
+	r7 = r8 << 1;
+	f14 = f14+f23;
+	f13 = f13+f24;
+	f7 = f7+f25;
+	f11 = f11-f15;
+	f12 = f12-f16;
+	f0 = f0-f17;
+	f15 = heapFloat[(fp+-11)];
+	if(f19 >f15) //_LBB596_8
+{
+	heapFloat[(g0)] = f19;
+	sqrtf(i7);
+	f4 = heapFloat[(fp+-1)];
+	f8 = f4/f_g0;
+	f1 = f22*f8;
+	f4 = f21*f8;
+	f8 = f18*f8;
+}
+	r9 = heap32[(r5+3)];
+	f15 = f13*f8;
+	f16 = f14*f4;
+	r9 = r9 >> 2;
+	f15 = f15-f16;
+	heapFloat[(r9)] = f15;
+	r9 = heap32[(r5+3)];
+	f15 = f14*f1;
+	f16 = f7*f8;
+	r9 = r9 >> 2;
+	f15 = f15-f16;
+	heapFloat[(r9+1)] = f15;
+	r9 = heap32[(r5+3)];
+	f15 = f7*f4;
+	f16 = f13*f1;
+	r9 = r9 >> 2;
+	f15 = f15-f16;
+	heapFloat[(r9+2)] = f15;
+	f15 = f12*f8;
+	f16 = f11*f4;
+	f15 = f15-f16;
+	r9 = heap32[(r5+5)];
+	r9 = r9 >> 2;
+	f15 = -f15;
+	heapFloat[(r9)] = f15;
+	f15 = f11*f1;
+	f16 = f0*f8;
+	f15 = f15-f16;
+	r9 = heap32[(r5+5)];
+	f16 = f10*f8;
+	f17 = f3*f4;
+	f18 = f9*f4;
+	f19 = f10*f1;
+	f20 = f3*f1;
+	f21 = f9*f8;
+	r9 = r9 >> 2;
+	f15 = -f15;
+	f16 = f16-f17;
+	f17 = f18-f19;
+	f18 = f20-f21;
+	heapFloat[(r9+1)] = f15;
+	f15 = f0*f4;
+	f19 = f12*f1;
+	f15 = f15-f19;
+	r9 = heap32[(r5+5)];
+	f19 = f7*f18;
+	f20 = f13*f16;
+	f21 = f14*f16;
+	f22 = f7*f17;
+	f23 = f13*f17;
+	f24 = f14*f18;
+	f25 = f0*f18;
+	f26 = f12*f16;
+	f27 = f11*f16;
+	f28 = f0*f17;
+	f29 = f12*f17;
+	f30 = f11*f18;
+	f19 = f19-f20;
+	f20 = f21-f22;
+	f21 = f23-f24;
+	f22 = f25-f26;
+	f23 = f27-f28;
+	f24 = f29-f30;
+	r9 = r9 >> 2;
+	f15 = -f15;
+	heapFloat[(r9+2)] = f15;
+	if(r6 != 0) //_LBB596_11
+{
+	r9 = heapU8[r0+722];
+if(!(r9 ==0)) //_LBB596_10
+{
+	f24 = f24*f6;
+	f23 = f23*f6;
+	f22 = f22*f6;
+	f21 = f21*f5;
+	f20 = f20*f5;
+	f19 = f19*f5;
+}
+}
+	r9 = r8 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r9)|0;
+	r10 = r10 >> 2;
+	r11 = (r8 + 1)|0;
+	heapFloat[(r10)] = f21;
+	r10 = r11 << 2;
+	r11 = heap32[(r5+3)];
+	r11 = (r11 + r10)|0;
+	r11 = r11 >> 2;
+	r12 = (r8 + 2)|0;
+	heapFloat[(r11)] = f20;
+	r11 = r12 << 2;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r11)|0;
+	r12 = r12 >> 2;
+	heapFloat[(r12)] = f19;
+	r12 = heap32[(r5+5)];
+	r12 = (r12 + r9)|0;
+	r12 = r12 >> 2;
+	f15 = -f24;
+	heapFloat[(r12)] = f15;
+	r12 = heap32[(r5+5)];
+	r10 = (r12 + r10)|0;
+	r10 = r10 >> 2;
+	f15 = -f23;
+	heapFloat[(r10)] = f15;
+	r10 = heap32[(r5+5)];
+	r10 = (r10 + r11)|0;
+	f15 = f7*f10;
+	f19 = f13*f9;
+	f20 = f14*f9;
+	f7 = f7*f3;
+	f13 = f13*f3;
+	f14 = f14*f10;
+	f21 = f0*f10;
+	f23 = f12*f9;
+	f24 = f11*f9;
+	f0 = f0*f3;
+	f12 = f12*f3;
+	f11 = f11*f10;
+	f15 = f15-f19;
+	f7 = f20-f7;
+	f13 = f13-f14;
+	f14 = f21-f23;
+	f0 = f24-f0;
+	f11 = f12-f11;
+	r10 = r10 >> 2;
+	f12 = -f22;
+	heapFloat[(r10)] = f12;
+	if(r6 != 0) //_LBB596_15
+{
+	f11 = f11*f6;
+	f0 = f0*f6;
+	f14 = f14*f6;
+	f13 = f13*f5;
+	f7 = f7*f5;
+	f15 = f15*f5;
+}
+	r6 = r7 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r6)|0;
+	r10 = r10 >> 2;
+	r11 = r7 | 1;
+	heapFloat[(r10)] = f13;
+	r10 = r11 << 2;
+	r11 = heap32[(r5+3)];
+	r11 = (r11 + r10)|0;
+	r11 = r11 >> 2;
+	r7 = (r7 + 2)|0;
+	heapFloat[(r11)] = f7;
+	r7 = r7 << 2;
+	r11 = heap32[(r5+3)];
+	r11 = (r11 + r7)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r11)] = f15;
+	r11 = heap32[(r5+5)];
+	r11 = (r11 + r6)|0;
+	r11 = r11 >> 2;
+	f5 = -f11;
+	heapFloat[(r11)] = f5;
+	r11 = heap32[(r5+5)];
+	r11 = (r11 + r10)|0;
+	r11 = r11 >> 2;
+	f0 = -f0;
+	heapFloat[(r11)] = f0;
+	r11 = heap32[(r5+5)];
+	r7 = (r11 + r7)|0;
+	r7 = r7 >> 2;
+	f0 = -f14;
+	heapFloat[(r7)] = f0;
+	r7 = heapU8[r0+720];
+if(!(r7 !=0)) //_LBB596_18
+{
+	f0 = heapFloat[(r5)];
+	f5 = heapFloat[(r5+1)];
+	f0 = f0*f5;
+	r7 = heap32[(r5+2)];
+	r7 = r7 >> 2;
+	heapFloat[(r7)] = f1;
+	r7 = heap32[(r5+2)];
+	r7 = r7 >> 2;
+	heapFloat[(r7+1)] = f4;
+	r7 = heap32[(r5+2)];
+	r7 = r7 >> 2;
+	heapFloat[(r7+2)] = f8;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r9)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7)] = f16;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r9)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7+1)] = f18;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r9)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7+2)] = f17;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r6)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7)] = f9;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r10)|0;
+	r7 = r7 >> 2;
+	heapFloat[(r7)] = f10;
+	r7 = heap32[(r5+2)];
+	r7 = (r7 + r6)|0;
+	r7 = r7 >> 2;
+	f5 = heapFloat[(fp+-10)];
+	f6 = f1*f5;
+	f7 = heapFloat[(fp+-9)];
+	f11 = f4*f7;
+	heapFloat[(r7+2)] = f3;
+	f6 = f6+f11;
+	f11 = heapFloat[(fp+-8)];
+	f12 = f8*f11;
+	r7 = heap32[(r5+7)];
+	f6 = f6+f12;
+	r7 = r7 >> 2;
+	f6 = f6*f0;
+	heapFloat[(r7)] = f6;
+	f6 = f16*f5;
+	f12 = f18*f7;
+	r7 = heap32[(r5+7)];
+	f6 = f6+f12;
+	f12 = f17*f11;
+	r7 = (r7 + r9)|0;
+	f6 = f6+f12;
+	r7 = r7 >> 2;
+	f6 = f6*f0;
+	heapFloat[(r7)] = f6;
+	f5 = f9*f5;
+	f6 = f10*f7;
+	r7 = heap32[(r5+7)];
+	f5 = f5+f6;
+	f6 = f3*f11;
+	r6 = (r7 + r6)|0;
+	f5 = f5+f6;
+	r6 = r6 >> 2;
+	f0 = f5*f0;
+	heapFloat[(r6)] = f0;
+}
+	r2 = (r2 + 4)|0;
+	r6 = (r8 * 3)|0;
+	r7 = r6 << 2;
+	r9 = heap32[(r5+3)];
+	r9 = (r9 + r7)|0;
+	r9 = r9 >> 2;
+	r10 = (r6 + 1)|0;
+	heapFloat[(r9)] = f1;
+	r9 = r10 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r9)|0;
+	r10 = r10 >> 2;
+	r6 = (r6 + 2)|0;
+	heapFloat[(r10)] = f4;
+	r6 = r6 << 2;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r6)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r10)] = f8;
+	r8 = r8 << 4;
+	r10 = heap32[(r5+3)];
+	r10 = (r10 + r8)|0;
+	r10 = r10 >> 2;
+	heapFloat[(r10)] = f16;
+	r10 = r8 | 4;
+	r11 = heap32[(r5+3)];
+	r11 = (r11 + r10)|0;
+	r11 = r11 >> 2;
+	heapFloat[(r11)] = f18;
+	r11 = r8 | 8;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r11)|0;
+	r12 = r12 >> 2;
+	heapFloat[(r12)] = f17;
+	r12 = heap32[(r5+5)];
+	r12 = (r12 + r7)|0;
+	r12 = r12 >> 2;
+	f0 = -f1;
+	heapFloat[(r12)] = f0;
+	r12 = heap32[(r5+5)];
+	r9 = (r12 + r9)|0;
+	r9 = r9 >> 2;
+	f0 = -f4;
+	heapFloat[(r9)] = f0;
+	r9 = heap32[(r5+5)];
+	r6 = (r9 + r6)|0;
+	r6 = r6 >> 2;
+	f0 = -f8;
+	heapFloat[(r6)] = f0;
+	r6 = heap32[(r5+5)];
+	r6 = (r6 + r8)|0;
+	r6 = r6 >> 2;
+	f0 = -f16;
+	heapFloat[(r6)] = f0;
+	r6 = heap32[(r5+5)];
+	r6 = (r6 + r10)|0;
+	r6 = r6 >> 2;
+	f0 = -f18;
+	heapFloat[(r6)] = f0;
+	r6 = heap32[(r5+5)];
+	r6 = (r6 + r11)|0;
+	f5 = heapFloat[(fp+-7)];
+	f0 = heapFloat[(fp+-2)];
+	f6 = f0*f5;
+	f11 = heapFloat[(fp+-6)];
+	f7 = heapFloat[(fp+-3)];
+	f12 = f7*f11;
+	f13 = heapFloat[(fp+-5)];
+	f7 = f7*f13;
+	f14 = heapFloat[(fp+-4)];
+	f5 = f14*f5;
+	f6 = f6-f12;
+	f5 = f7-f5;
+	f7 = f14*f11;
+	f0 = f0*f13;
+	r6 = r6 >> 2;
+	f11 = -f17;
+	heapFloat[(r6)] = f11;
+	f0 = f7-f0;
+	f1 = f6*f1;
+	f4 = f5*f4;
+	r6 = heap32[(r5+7)];
+	f1 = f1+f4;
+	f4 = f0*f8;
+	f7 = heapFloat[(r5)];
+	f8 = heapFloat[(r5+1)];
+	r6 = (r6 + r7)|0;
+	f1 = f1+f4;
+	f4 = f7*f8;
+	r6 = r6 >> 2;
+	f1 = f1*f4;
+	heapFloat[(r6)] = f1;
+	f1 = f6*f16;
+	f5 = f5*f18;
+	r6 = heap32[(r5+7)];
+	f1 = f1+f5;
+	f0 = f0*f17;
+	r6 = (r6 + r8)|0;
+	f0 = f1+f0;
+	r6 = r6 >> 2;
+	f0 = f0*f4;
+	heapFloat[(r6)] = f0;
+	r6 = heapU8[r0+722];
+	if(r6 !=0) //_LBB596_20
+{
+	f0 = heapFloat[(r1+176)];
+	f1 = heapFloat[(r1+179)];
+	f0 = f0*f1;
+	r6 = 1;
+	r7 = 2;
+	r6 = f0 > f2 ? r6 : r7;
+}
+else{
+	f0 =                         0;
+	r6 = 0;
+}
+	r7 = heapU8[r0+721];
+	r8 = 0;
+	r9 = r7 != r8;
+	r9 = r9 & 1;
+	r9 = r9 | r6;
+	if(r9 ==0) //_LBB596_59
+{
+__label__ = 54;
+}
+else{
+	r9 = heap32[(r5+6)];
+	r9 = (r9 * 5)|0;
+	r10 = heap32[(r5+3)];
+	r11 = r9 << 2;
+	r10 = (r10 + r11)|0;
+	r10 = r10 >> 2;
+	r12 = (r9 + 1)|0;
+	heapFloat[(r10)] = f9;
+	r10 = r12 << 2;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r10)|0;
+	r12 = r12 >> 2;
+	r9 = (r9 + 2)|0;
+	heapFloat[(r12)] = f10;
+	r9 = r9 << 2;
+	r12 = heap32[(r5+3)];
+	r12 = (r12 + r9)|0;
+	r12 = r12 >> 2;
+	heapFloat[(r12)] = f3;
+	r12 = heap32[(r5+5)];
+	r12 = (r12 + r11)|0;
+	r12 = r12 >> 2;
+	f1 = -f9;
+	heapFloat[(r12)] = f1;
+	r12 = heap32[(r5+5)];
+	r10 = (r12 + r10)|0;
+	r10 = r10 >> 2;
+	f1 = -f10;
+	heapFloat[(r10)] = f1;
+	r10 = heap32[(r5+5)];
+	r9 = (r10 + r9)|0;
+	r9 = r9 >> 2;
+	f1 = -f3;
+	heapFloat[(r9)] = f1;
+	r9 = heap32[(r5+7)];
+	r9 = (r9 + r11)|0;
+	f1 = heapFloat[(r1+172)];
+	f4 = heapFloat[(r1+173)];
+	r9 = r9 >> 2;
+	heap32[(r9)] = 0;
+	r9 = r6 != r8;
+	r10 = f1 == f4;
+	r12 = heap32[(r1+183)];
+	r9 = r9 & r10;
+	r10 = r12 & 2;
+	if(r10 !=0) //_LBB596_24
+{
+	r2 = (r0 + 744)|0;
+}
+	r2 = r2 >> 2;
+	f5 = heapFloat[(r2)];
+	r2 = r7 == r8;
+	r2 = r9 | r2;
+if(!(r2 != 0)) //_LBB596_42
+{
+	r2 = r12 & 4;
+if(!(r2 ==0)) //_LBB596_28
+{
+	r2 = heap32[(r5+8)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+184)];
+}
+	f6 = heapFloat[(r1+167)];
+_94: do {
+	if(f1 <f4) //_LBB596_30
+{
+	f7 = heapFloat[(r1+178)];
+	f8 = heapFloat[(r5)];
+	f8 = f8*f5;
+	f8 = f6/f8;
+	if(f8 >=f2) //_LBB596_35
+{
+	if(f8 >f2) //_LBB596_37
+{
+if(!(f7 >f4)) //_LBB596_40
+{
+	f2 = f4-f8;
+if(!(f2 >=f7)) //_LBB596_40
+{
+	f2 = f4-f7;
+	f2 = f2/f8;
+break _94;
+}
+}
+	f2 =                         0;
+	f8 = heapFloat[(fp+-1)];
+	f2 = f7 > f4 ? f2 : f8;
+}
+else{
+break _94;
+}
+}
+else{
+if(!(f7 <f1)) //_LBB596_34
+{
+	f2 = f1-f8;
+if(!(f2 <=f7)) //_LBB596_34
+{
+	f2 = f1-f7;
+	f2 = f2/f8;
+break _94;
+}
+}
+	f2 =                         0;
+	f8 = heapFloat[(fp+-1)];
+	f2 = f7 < f1 ? f2 : f8;
+}
+}
+else{
+	f7 = heapFloat[(fp+-1)];
+	f2 = f1 > f4 ? f7 : f2;
+}
+} while(0);
+	r2 = heap32[(r5+7)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	f2 = f6*f2;
+	f6 = heapFloat[(r1+179)];
+	f7 = heapFloat[(r2)];
+	f2 = f2*f6;
+	f2 = f7+f2;
+	heapFloat[(r2)] = f2;
+	r2 = heap32[(r5+9)];
+	f2 = heapFloat[(r1+168)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	f2 = -f2;
+	heapFloat[(r2)] = f2;
+	r2 = heap32[(r5+10)];
+	r2 = (r2 + r11)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = heap32[(r1+168)];
+}
+	if(r6 ==0) //_LBB596_59
+{
+__label__ = 54;
+}
+else{
+	r2 = heap32[(r5+7)];
+	r2 = (r2 + r11)|0;
+	f2 = heapFloat[(r5)];
+	r2 = r2 >> 2;
+	f2 = f2*f5;
+	f5 = heapFloat[(r2)];
+	f0 = f2*f0;
+	f0 = f5+f0;
+	heapFloat[(r2)] = f0;
+	r0 = heapU8[r0+732];
+	r0 = r0 & 1;
+if(!(r0 ==0)) //_LBB596_45
+{
+	r0 = heap32[(r5+8)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = heap32[(r1+185)];
+}
+	if(f1 !=f4) //_LBB596_47
+{
+	r0 = heap32[(r5+9)];
+	if(r6 !=1) //_LBB596_49
+{
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+}
+else{
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 2139095039;
+}
+}
+else{
+	r0 = heap32[(r5+9)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = -8388609;
+	r0 = heap32[(r5+10)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 2139095039;
+}
+	f0 = heapFloat[(r1+171)];
+	f1 =                         0;
+	if(f0 <=f1) //_LBB596_58
+{
+__label__ = 53;
+}
+else{
+	f2 = heapFloat[(r4+80)];
+	f4 = heapFloat[(r3+80)];
+	f5 = heapFloat[(r4+81)];
+	f6 = heapFloat[(r3+81)];
+	f2 = f2*f9;
+	f5 = f5*f10;
+	f7 = heapFloat[(r4+82)];
+	f8 = heapFloat[(r3+82)];
+	f4 = f4*f9;
+	f6 = f6*f10;
+	f2 = f2+f5;
+	f5 = f7*f3;
+	f4 = f4+f6;
+	f3 = f8*f3;
+	f2 = f2+f5;
+	f3 = f4+f3;
+	f2 = f2-f3;
+	if(r6 !=1) //_LBB596_55
+{
+	if(f2 <=f1) //_LBB596_58
+{
+__label__ = 53;
+}
+else{
+	r0 = heap32[(r5+7)];
+	f0 = -f0;
+	r0 = (r0 + r11)|0;
+	f0 = f2*f0;
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0)];
+	if(f1 <=f0) //_LBB596_58
+{
+__label__ = 53;
+}
+else{
+	heapFloat[(r0)] = f0;
+__label__ = 53;
+}
+}
+}
+else{
+	if(f2 >=f1) //_LBB596_58
+{
+__label__ = 53;
+}
+else{
+	r0 = heap32[(r5+7)];
+	f0 = -f0;
+	r0 = (r0 + r11)|0;
+	f0 = f2*f0;
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0)];
+	if(f1 >=f0) //_LBB596_58
+{
+__label__ = 53;
+}
+else{
+	heapFloat[(r0)] = f0;
+__label__ = 53;
+}
+}
+}
+}
+}
+}
+}
+else{
+	r0 = _2E_str1149;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 682;
+	_assert(i7);
+}
+}
+} while(0);
+if (__label__ == 53){
+	r0 = heap32[(r5+7)];
+	r0 = (r0 + r11)|0;
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f1 = heapFloat[(r1+170)];
+	f0 = f0*f1;
+	heapFloat[(r0)] = f0;
+}
+	return;
+}
+
+function _ZN17btHingeConstraint8setParamEifi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+if(!(r0 ==-1)) //_LBB597_2
+{
+	if(r0 !=5) //_LBB597_9
+{
+	r0 = _2E_str10;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 969;
+	_assert(i7);
+}
+}
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	f0 = heapFloat[(fp+2)];
+	if(r1 ==4) //_LBB597_6
+{
+	r0 = r0 >> 2;
+	heapFloat[(r0+185)] = f0;
+	r1 = heap32[(r0+183)];
+	r1 = r1 | 1;
+	heap32[(r0+183)] = r1;
+	return;
+}
+else{
+	if(r1 ==3) //_LBB597_7
+{
+	r0 = r0 >> 2;
+	heapFloat[(r0+184)] = f0;
+	r1 = heap32[(r0+183)];
+	r1 = r1 | 4;
+	heap32[(r0+183)] = r1;
+	return;
+}
+else{
+	if(r1 !=2) //_LBB597_8
+{
+	r0 = _2E_str10;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 964;
+	_assert(i7);
+}
+else{
+	r0 = r0 >> 2;
+	heapFloat[(r0+186)] = f0;
+	r1 = heap32[(r0+183)];
+	r1 = r1 | 2;
+	heap32[(r0+183)] = r1;
+	return;
+}
+}
+}
+}
+
+function _ZNK17btHingeConstraint8getParamEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+if(!(r0 ==-1)) //_LBB598_2
+{
+	if(r0 !=5) //_LBB598_15
+{
+	r0 = _2E_str10;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 999;
+	_assert(i7);
+}
+}
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	if(r1 ==4) //_LBB598_8
+{
+	r1 = heapU8[r0+732];
+	r1 = r1 & 1;
+	if(r1 != 0) //_LBB598_10
+{
+	r0 = (r0 + 740)|0;
+}
+else{
+	r0 = _2E_str332;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 986;
+	_assert(i7);
+}
+}
+else{
+	if(r1 ==3) //_LBB598_11
+{
+	r1 = heapU8[r0+732];
+	r1 = r1 & 4;
+	if(r1 !=0) //_LBB598_13
+{
+	r0 = (r0 + 736)|0;
+}
+else{
+	r0 = _2E_str433;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 990;
+	_assert(i7);
+}
+}
+else{
+	if(r1 !=2) //_LBB598_14
+{
+	r0 = _2E_str10;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 994;
+	_assert(i7);
+}
+else{
+	r1 = heapU8[r0+732];
+	r1 = r1 & 2;
+	if(r1 !=0) //_LBB598_7
+{
+	r0 = (r0 + 744)|0;
+}
+else{
+	r0 = _2E_str130;
+	r1 = _2E_str231;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 982;
+	_assert(i7);
+}
+}
+}
+}
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0)];
+	f_g0 = f0;
+	return;
+}
+
+function _ZN17btHingeConstraint13getHingeAngleERK11btTransformS2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+135)];
+	f1 = heapFloat[(r0+4)];
+	f2 = heapFloat[(r0)];
+	f3 = heapFloat[(r2+136)];
+	f4 = heapFloat[(r2+139)];
+	f5 = heapFloat[(r0+5)];
+	f6 = heapFloat[(r0+1)];
+	f7 = heapFloat[(r2+140)];
+	f8 = heapFloat[(r2+152)];
+	f9 = heapFloat[(r1+4)];
+	f10 = heapFloat[(r1)];
+	f11 = heapFloat[(r2+156)];
+	f12 = heapFloat[(r1+5)];
+	f13 = heapFloat[(r1+1)];
+	f14 = heapFloat[(r0+8)];
+	f15 = heapFloat[(r0+9)];
+	f16 = heapFloat[(r1+8)];
+	f17 = heapFloat[(r1+9)];
+	f18 = f2*f0;
+	f19 = f6*f4;
+	f20 = f1*f0;
+	f21 = f5*f4;
+	f10 = f10*f8;
+	f13 = f13*f11;
+	f2 = f2*f3;
+	f6 = f6*f7;
+	f9 = f9*f8;
+	f12 = f12*f11;
+	f1 = f1*f3;
+	f5 = f5*f7;
+	f22 = heapFloat[(r2+143)];
+	f23 = heapFloat[(r0+6)];
+	f24 = heapFloat[(r0+2)];
+	f25 = heapFloat[(r2+144)];
+	f26 = heapFloat[(r2+160)];
+	f27 = heapFloat[(r1+6)];
+	f28 = heapFloat[(r1+2)];
+	f29 = heapFloat[(r0+10)];
+	f30 = heapFloat[(r1+10)];
+	f18 = f18+f19;
+	f19 = f24*f22;
+	f20 = f20+f21;
+	f21 = f23*f22;
+	f0 = f14*f0;
+	f4 = f15*f4;
+	f10 = f10+f13;
+	f13 = f28*f26;
+	f2 = f2+f6;
+	f6 = f24*f25;
+	f9 = f9+f12;
+	f12 = f27*f26;
+	f1 = f1+f5;
+	f5 = f23*f25;
+	f8 = f16*f8;
+	f11 = f17*f11;
+	f3 = f14*f3;
+	f7 = f15*f7;
+	f14 = f18+f19;
+	f10 = f10+f13;
+	f2 = f2+f6;
+	f6 = f20+f21;
+	f9 = f9+f12;
+	f1 = f1+f5;
+	f0 = f0+f4;
+	f4 = f29*f22;
+	f5 = f8+f11;
+	f8 = f30*f26;
+	f3 = f3+f7;
+	f7 = f29*f25;
+	f11 = f10*f14;
+	f6 = f9*f6;
+	f0 = f0+f4;
+	f4 = f5+f8;
+	f3 = f3+f7;
+	f2 = f10*f2;
+	f1 = f9*f1;
+	f5 = f11+f6;
+	f0 = f4*f0;
+	f1 = f2+f1;
+	f2 = f4*f3;
+	f0 = f5+f0;
+	f1 = f1+f2;
+	heapFloat[(g0)] = f0;
+	heapFloat[(g0+1)] = f1;
+	atan2f(i7);
+	f1 = heapFloat[(r2+179)];
+	f0 = f1*f_g0;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN18btConstraintSolver12prepareSolveEii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN18btConstraintSolver9allSolvedERK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+2)];
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r1+4)];
+	f1 = heapFloat[(r0+126)];
+	f2 = heapFloat[(r1+5)];
+	f3 = heapFloat[(r0+127)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r0+130)];
+	f6 = heapFloat[(r1+1)];
+	f7 = heapFloat[(r0+131)];
+	f8 = heapFloat[(r2+126)];
+	f9 = heapFloat[(r2+127)];
+	f10 = heapFloat[(r1+6)];
+	f11 = heapFloat[(r0+128)];
+	f1 = f0*f1;
+	f3 = f2*f3;
+	f4 = f4*f5;
+	f5 = f6*f7;
+	f6 = heapFloat[(r1+2)];
+	f7 = heapFloat[(r0+132)];
+	f12 = heapFloat[(r1+8)];
+	f13 = heapFloat[(r2+130)];
+	f14 = heapFloat[(r1+9)];
+	f15 = heapFloat[(r2+131)];
+	f16 = heapFloat[(r2+128)];
+	f1 = f1+f3;
+	f3 = f10*f11;
+	f4 = f4+f5;
+	f5 = f6*f7;
+	f6 = f12*f13;
+	f7 = f14*f15;
+	f11 = heapFloat[(r1+10)];
+	f12 = heapFloat[(r2+132)];
+	f8 = f0*f8;
+	f9 = f2*f9;
+	f13 = heapFloat[(r1+21)];
+	f14 = heapFloat[(r1+30)];
+	f1 = f1+f3;
+	f3 = f4+f5;
+	f4 = f6+f7;
+	f5 = f11*f12;
+	f6 = f8+f9;
+	f7 = f10*f16;
+	f8 = heapFloat[(r1+29)];
+	f9 = f13*f14;
+	f1 = f1+f3;
+	f3 = heapFloat[(r1+23)];
+	f4 = f4+f5;
+	f5 = f6+f7;
+	f4 = f4-f5;
+	f5 = f8-f9;
+	f1 = f3*f1;
+	f1 = f5-f1;
+	f3 = f3*f4;
+	f1 = f1-f3;
+	f3 = heapFloat[(r1+31)];
+	f4 = f13+f1;
+	if(f3 <=f4) //_LBB602_2
+{
+	f3 = heapFloat[(r1+32)];
+	if(f3 >=f4) //_LBB602_4
+{
+	heapFloat[(r1+21)] = f4;
+}
+else{
+	f1 = f3-f13;
+	heapFloat[(r1+21)] = f3;
+}
+}
+else{
+	f1 = f3-f13;
+	heapFloat[(r1+21)] = f3;
+}
+	f3 = heapFloat[(r0+84)];
+	f4 =                         0;
+if(!(f3 ==f4)) //_LBB602_7
+{
+	f3 = heapFloat[(r0+138)];
+	f0 = f0*f3;
+	f0 = f0*f1;
+	f3 = heapFloat[(r0+126)];
+	f5 = heapFloat[(r0+139)];
+	f6 = heapFloat[(r0+140)];
+	f0 = f3+f0;
+	f2 = f2*f5;
+	heapFloat[(r0+126)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r0+127)];
+	f0 = f2+f0;
+	f2 = f10*f6;
+	heapFloat[(r0+127)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r0+128)];
+	f0 = f2+f0;
+	heapFloat[(r0+128)] = f0;
+	f0 = heapFloat[(r0+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r1+12)];
+	f3 = heapFloat[(r0+136)];
+	f5 = heapFloat[(r0+135)];
+	f0 = f2*f0;
+	f2 = heapFloat[(r0+130)];
+	f6 = heapFloat[(r1+14)];
+	f7 = heapFloat[(r1+13)];
+	f0 = f2+f0;
+	f2 = f5*f1;
+	heapFloat[(r0+130)] = f0;
+	f0 = f7*f2;
+	f2 = heapFloat[(r0+131)];
+	f0 = f2+f0;
+	f2 = f3*f1;
+	heapFloat[(r0+131)] = f0;
+	f0 = f6*f2;
+	f2 = heapFloat[(r0+132)];
+	f0 = f2+f0;
+	heapFloat[(r0+132)] = f0;
+}
+	f0 = heapFloat[(r2+84)];
+if(!(f0 ==f4)) //_LBB602_9
+{
+	f0 = heapFloat[(r1+4)];
+	f2 = heapFloat[(r2+138)];
+	f0 = f2*f0;
+	f0 = f0*f1;
+	f2 = heapFloat[(r2+126)];
+	f3 = heapFloat[(r1+5)];
+	f4 = heapFloat[(r2+139)];
+	f5 = heapFloat[(r1+6)];
+	f6 = heapFloat[(r2+140)];
+	f0 = f2-f0;
+	f2 = f4*f3;
+	heapFloat[(r2+126)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r2+127)];
+	f0 = f2-f0;
+	f2 = f6*f5;
+	heapFloat[(r2+127)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r2+128)];
+	f0 = f2-f0;
+	heapFloat[(r2+128)] = f0;
+	f0 = heapFloat[(r2+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r1+16)];
+	f3 = heapFloat[(r2+136)];
+	f4 = heapFloat[(r2+135)];
+	f0 = f2*f0;
+	f2 = heapFloat[(r2+130)];
+	f5 = heapFloat[(r1+18)];
+	f6 = heapFloat[(r1+17)];
+	f0 = f2+f0;
+	f2 = f4*f1;
+	heapFloat[(r2+130)] = f0;
+	f0 = f6*f2;
+	f2 = heapFloat[(r2+131)];
+	f0 = f2+f0;
+	f1 = f3*f1;
+	heapFloat[(r2+131)] = f0;
+	f0 = f5*f1;
+	f1 = heapFloat[(r2+132)];
+	f0 = f1+f0;
+	heapFloat[(r2+132)] = f0;
+}
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver36resolveSingleConstraintRowLowerLimitER11btRigidBodyS1_RK18btSolverConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+2)];
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r1+4)];
+	f1 = heapFloat[(r0+126)];
+	f2 = heapFloat[(r1+5)];
+	f3 = heapFloat[(r0+127)];
+	f4 = heapFloat[(r1)];
+	f5 = heapFloat[(r0+130)];
+	f6 = heapFloat[(r1+1)];
+	f7 = heapFloat[(r0+131)];
+	f8 = heapFloat[(r2+126)];
+	f9 = heapFloat[(r2+127)];
+	f10 = heapFloat[(r1+6)];
+	f11 = heapFloat[(r0+128)];
+	f1 = f0*f1;
+	f3 = f2*f3;
+	f4 = f4*f5;
+	f5 = f6*f7;
+	f6 = heapFloat[(r1+2)];
+	f7 = heapFloat[(r0+132)];
+	f12 = heapFloat[(r1+8)];
+	f13 = heapFloat[(r2+130)];
+	f14 = heapFloat[(r1+9)];
+	f15 = heapFloat[(r2+131)];
+	f16 = heapFloat[(r2+128)];
+	f1 = f1+f3;
+	f3 = f10*f11;
+	f4 = f4+f5;
+	f5 = f6*f7;
+	f6 = f12*f13;
+	f7 = f14*f15;
+	f11 = heapFloat[(r1+10)];
+	f12 = heapFloat[(r2+132)];
+	f8 = f0*f8;
+	f9 = f2*f9;
+	f13 = heapFloat[(r1+21)];
+	f14 = heapFloat[(r1+30)];
+	f1 = f1+f3;
+	f3 = f4+f5;
+	f4 = f6+f7;
+	f5 = f11*f12;
+	f6 = f8+f9;
+	f7 = f10*f16;
+	f8 = heapFloat[(r1+29)];
+	f9 = f13*f14;
+	f1 = f1+f3;
+	f3 = heapFloat[(r1+23)];
+	f4 = f4+f5;
+	f5 = f6+f7;
+	f4 = f4-f5;
+	f5 = f8-f9;
+	f1 = f3*f1;
+	f1 = f5-f1;
+	f3 = f3*f4;
+	f1 = f1-f3;
+	f3 = heapFloat[(r1+31)];
+	f4 = f13+f1;
+	if(f3 >f4) //_LBB603_2
+{
+	f1 = f3-f13;
+	f4 = f3;
+}
+	heapFloat[(r1+21)] = f4;
+	f3 = heapFloat[(r0+84)];
+	f4 =                         0;
+if(!(f3 ==f4)) //_LBB603_5
+{
+	f3 = heapFloat[(r0+138)];
+	f0 = f0*f3;
+	f0 = f0*f1;
+	f3 = heapFloat[(r0+126)];
+	f5 = heapFloat[(r0+139)];
+	f6 = heapFloat[(r0+140)];
+	f0 = f3+f0;
+	f2 = f2*f5;
+	heapFloat[(r0+126)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r0+127)];
+	f0 = f2+f0;
+	f2 = f10*f6;
+	heapFloat[(r0+127)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r0+128)];
+	f0 = f2+f0;
+	heapFloat[(r0+128)] = f0;
+	f0 = heapFloat[(r0+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r1+12)];
+	f3 = heapFloat[(r0+136)];
+	f5 = heapFloat[(r0+135)];
+	f0 = f2*f0;
+	f2 = heapFloat[(r0+130)];
+	f6 = heapFloat[(r1+14)];
+	f7 = heapFloat[(r1+13)];
+	f0 = f2+f0;
+	f2 = f5*f1;
+	heapFloat[(r0+130)] = f0;
+	f0 = f7*f2;
+	f2 = heapFloat[(r0+131)];
+	f0 = f2+f0;
+	f2 = f3*f1;
+	heapFloat[(r0+131)] = f0;
+	f0 = f6*f2;
+	f2 = heapFloat[(r0+132)];
+	f0 = f2+f0;
+	heapFloat[(r0+132)] = f0;
+}
+	f0 = heapFloat[(r2+84)];
+if(!(f0 ==f4)) //_LBB603_7
+{
+	f0 = heapFloat[(r1+4)];
+	f2 = heapFloat[(r2+138)];
+	f0 = f2*f0;
+	f0 = f0*f1;
+	f2 = heapFloat[(r2+126)];
+	f3 = heapFloat[(r1+5)];
+	f4 = heapFloat[(r2+139)];
+	f5 = heapFloat[(r1+6)];
+	f6 = heapFloat[(r2+140)];
+	f0 = f2-f0;
+	f2 = f4*f3;
+	heapFloat[(r2+126)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r2+127)];
+	f0 = f2-f0;
+	f2 = f6*f5;
+	heapFloat[(r2+127)] = f0;
+	f0 = f2*f1;
+	f2 = heapFloat[(r2+128)];
+	f0 = f2-f0;
+	heapFloat[(r2+128)] = f0;
+	f0 = heapFloat[(r2+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r1+16)];
+	f3 = heapFloat[(r2+136)];
+	f4 = heapFloat[(r2+135)];
+	f0 = f2*f0;
+	f2 = heapFloat[(r2+130)];
+	f5 = heapFloat[(r1+18)];
+	f6 = heapFloat[(r1+17)];
+	f0 = f2+f0;
+	f2 = f4*f1;
+	heapFloat[(r2+130)] = f0;
+	f0 = f6*f2;
+	f2 = heapFloat[(r2+131)];
+	f0 = f2+f0;
+	f1 = f3*f1;
+	heapFloat[(r2+131)] = f0;
+	f0 = f5*f1;
+	f1 = heapFloat[(r2+132)];
+	f0 = f1+f0;
+	heapFloat[(r2+132)] = f0;
+}
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver43resolveSplitPenetrationImpulseCacheFriendlyER11btRigidBodyS1_RK18btSolverConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+33)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB604_8
+{
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = gNumSplitImpulseRecoveries;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r2 = r2 >> 2;
+	f2 = heapFloat[(r0+4)];
+	f3 = heapFloat[(r1+142)];
+	f4 = heapFloat[(r0+5)];
+	f5 = heapFloat[(r1+143)];
+	f6 = heapFloat[(r0)];
+	f7 = heapFloat[(r1+146)];
+	f8 = heapFloat[(r0+1)];
+	f9 = heapFloat[(r1+147)];
+	f10 = heapFloat[(r2+142)];
+	f11 = heapFloat[(r2+143)];
+	f12 = heapFloat[(r0+6)];
+	f13 = heapFloat[(r1+144)];
+	f3 = f2*f3;
+	f5 = f4*f5;
+	f6 = f6*f7;
+	f7 = f8*f9;
+	f8 = heapFloat[(r0+2)];
+	f9 = heapFloat[(r1+148)];
+	f14 = heapFloat[(r0+8)];
+	f15 = heapFloat[(r2+146)];
+	f16 = heapFloat[(r0+9)];
+	f17 = heapFloat[(r2+147)];
+	f18 = heapFloat[(r2+144)];
+	f3 = f3+f5;
+	f5 = f12*f13;
+	f6 = f6+f7;
+	f7 = f8*f9;
+	f8 = f14*f15;
+	f9 = f16*f17;
+	f13 = heapFloat[(r0+10)];
+	f14 = heapFloat[(r2+148)];
+	f10 = f2*f10;
+	f11 = f4*f11;
+	f15 = heapFloat[(r0+20)];
+	f16 = heapFloat[(r0+30)];
+	f3 = f3+f5;
+	f5 = f6+f7;
+	f6 = f8+f9;
+	f7 = f13*f14;
+	f8 = f10+f11;
+	f9 = f12*f18;
+	f10 = f15*f16;
+	f3 = f3+f5;
+	f5 = heapFloat[(r0+23)];
+	f6 = f6+f7;
+	f7 = f8+f9;
+	f6 = f6-f7;
+	f0 = f0-f10;
+	f3 = f5*f3;
+	f0 = f0-f3;
+	f3 = f5*f6;
+	f0 = f0-f3;
+	f3 = heapFloat[(r0+31)];
+	f5 = f15+f0;
+	if(f3 >f5) //_LBB604_3
+{
+	f0 = f3-f15;
+	f5 = f3;
+}
+	heapFloat[(r0+20)] = f5;
+	f3 = heapFloat[(r1+84)];
+if(!(f3 ==f1)) //_LBB604_6
+{
+	f3 = heapFloat[(r1+138)];
+	f2 = f2*f3;
+	f2 = f2*f0;
+	f3 = heapFloat[(r1+142)];
+	f5 = heapFloat[(r1+139)];
+	f6 = heapFloat[(r1+140)];
+	f2 = f3+f2;
+	f3 = f4*f5;
+	heapFloat[(r1+142)] = f2;
+	f2 = f3*f0;
+	f3 = heapFloat[(r1+143)];
+	f2 = f3+f2;
+	f3 = f12*f6;
+	heapFloat[(r1+143)] = f2;
+	f2 = f3*f0;
+	f3 = heapFloat[(r1+144)];
+	f2 = f3+f2;
+	heapFloat[(r1+144)] = f2;
+	f2 = heapFloat[(r1+134)];
+	f2 = f2*f0;
+	f3 = heapFloat[(r0+12)];
+	f4 = heapFloat[(r1+136)];
+	f5 = heapFloat[(r1+135)];
+	f2 = f3*f2;
+	f3 = heapFloat[(r1+146)];
+	f6 = heapFloat[(r0+14)];
+	f7 = heapFloat[(r0+13)];
+	f2 = f3+f2;
+	f3 = f5*f0;
+	heapFloat[(r1+146)] = f2;
+	f2 = f7*f3;
+	f3 = heapFloat[(r1+147)];
+	f2 = f3+f2;
+	f3 = f4*f0;
+	heapFloat[(r1+147)] = f2;
+	f2 = f6*f3;
+	f3 = heapFloat[(r1+148)];
+	f2 = f3+f2;
+	heapFloat[(r1+148)] = f2;
+}
+	f2 = heapFloat[(r2+84)];
+if(!(f2 ==f1)) //_LBB604_8
+{
+	f1 = heapFloat[(r0+4)];
+	f2 = heapFloat[(r2+138)];
+	f1 = f2*f1;
+	f1 = f1*f0;
+	f2 = heapFloat[(r2+142)];
+	f3 = heapFloat[(r0+5)];
+	f4 = heapFloat[(r2+139)];
+	f5 = heapFloat[(r0+6)];
+	f6 = heapFloat[(r2+140)];
+	f1 = f2-f1;
+	f2 = f4*f3;
+	heapFloat[(r2+142)] = f1;
+	f1 = f2*f0;
+	f2 = heapFloat[(r2+143)];
+	f1 = f2-f1;
+	f2 = f6*f5;
+	heapFloat[(r2+143)] = f1;
+	f1 = f2*f0;
+	f2 = heapFloat[(r2+144)];
+	f1 = f2-f1;
+	heapFloat[(r2+144)] = f1;
+	f1 = heapFloat[(r2+134)];
+	f1 = f1*f0;
+	f2 = heapFloat[(r0+16)];
+	f3 = heapFloat[(r2+136)];
+	f4 = heapFloat[(r2+135)];
+	f1 = f2*f1;
+	f2 = heapFloat[(r2+146)];
+	f5 = heapFloat[(r0+18)];
+	f6 = heapFloat[(r0+17)];
+	f1 = f2+f1;
+	f2 = f4*f0;
+	heapFloat[(r2+146)] = f1;
+	f1 = f6*f2;
+	f2 = heapFloat[(r2+147)];
+	f1 = f2+f1;
+	f0 = f3*f0;
+	heapFloat[(r2+147)] = f1;
+	f0 = f5*f0;
+	f1 = heapFloat[(r2+148)];
+	f0 = f1+f0;
+	heapFloat[(r2+148)] = f0;
+}
+}
+	return;
+}
+
+function _Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB605_2
+{
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+45)];
+	if(r1 !=0) //_LBB605_3
+{
+	r1 = heap32[(fp+1)];
+	r1 = r1 >> 2;
+	f0 = heapFloat[(r1)];
+	f1 = heapFloat[(r0+2)];
+	f2 = heapFloat[(r0+1)];
+	f3 = heapFloat[(r1+1)];
+	f4 = heapFloat[(r0+6)];
+	f5 = heapFloat[(r0+5)];
+	f6 = heapFloat[(r0+3)];
+	f7 = heapFloat[(r0+7)];
+	f8 = f2*f0;
+	f9 = f5*f3;
+	f10 = f1*f0;
+	f11 = f4*f3;
+	f12 = heapFloat[(r1+2)];
+	f13 = heapFloat[(r0+10)];
+	f14 = heapFloat[(r0+9)];
+	f15 = heapFloat[(r0+11)];
+	f8 = f8+f9;
+	f9 = f14*f12;
+	f10 = f10+f11;
+	f11 = f13*f12;
+	f0 = f6*f0;
+	f3 = f7*f3;
+	f8 = f8+f9;
+	f9 = heapFloat[(r0+41)];
+	f10 = f10+f11;
+	f11 = heapFloat[(r0+42)];
+	f0 = f0+f3;
+	f3 = f15*f12;
+	f8 = f8*f9;
+	f9 = f10*f11;
+	f10 = heapFloat[(r0+43)];
+	f0 = f0+f3;
+	f0 = f0*f10;
+	f2 = f2*f8;
+	f1 = f1*f9;
+	f3 = f5*f8;
+	f4 = f4*f9;
+	f1 = f2+f1;
+	f2 = f6*f0;
+	f5 = f14*f8;
+	f6 = f13*f9;
+	f3 = f3+f4;
+	f4 = f7*f0;
+	f1 = f1+f2;
+	f2 = f5+f6;
+	f0 = f15*f0;
+	f3 = f3+f4;
+	heapFloat[(r1)] = f1;
+	f0 = f2+f0;
+	heapFloat[(r1+1)] = f3;
+	heapFloat[(r1+2)] = f0;
+	heap32[(r1+3)] = 0;
+	return;
+}
+}
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver5resetEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	heap32[(r0+31)] = 0;
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver45solveGroupCacheFriendlySplitImpulseIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+7)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+11)];
+_1: do {
+if(!(r2 ==0)) //_LBB607_14
+{
+	r2 = heap32[(fp)];
+	r0 = heapU8[r0+61];
+	r3 = heap32[(r1+5)];
+	r0 = r0 & 1;
+	if(r0 != 0) //_LBB607_3
+{
+if(!(r3 <1)) //_LBB607_14
+{
+	r0 = 0;
+_6: while(true){
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+2)];
+if(!(r4 <1)) //_LBB607_8
+{
+	r5 = 0;
+_10: while(true){
+	r6 = heap32[(r3+19)];
+	r7 = r5 << 2;
+	r6 = (r6 + r7)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r6 = (r6 * 136)|0;
+	r7 = heap32[(r3+4)];
+	r6 = (r7 + r6)|0;
+	r7 = r6 >> 2;
+	r8 = heap32[(r7+27)];
+	r7 = heap32[(r7+26)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r6;
+	r5 = (r5 + 1)|0;
+	_ZN35btSequentialImpulseConstraintSolver43resolveSplitPenetrationImpulseCacheFriendlyER11btRigidBodyS1_RK18btSolverConstraint(i7);
+if(!(r4 !=r5)) //_LBB607_7
+{
+break _10;
+}
+}
+}
+	r0 = (r0 + 1)|0;
+	r3 = heap32[(r1+5)];
+	if(r3 >r0) //_LBB607_5
+{
+continue _6;
+}
+else{
+break _1;
+}
+}
+}
+}
+else{
+	if(r3 >0) //_LBB607_9
+{
+	r0 = 0;
+_15: while(true){
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+2)];
+if(!(r4 <1)) //_LBB607_13
+{
+	r5 = 0;
+_19: while(true){
+	r6 = heap32[(r3+19)];
+	r7 = r5 << 2;
+	r6 = (r6 + r7)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r6 = (r6 * 136)|0;
+	r7 = heap32[(r3+4)];
+	r6 = (r7 + r6)|0;
+	r7 = r6 >> 2;
+	r8 = heap32[(r7+27)];
+	r7 = heap32[(r7+26)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r6;
+	r5 = (r5 + 1)|0;
+	_ZN35btSequentialImpulseConstraintSolver43resolveSplitPenetrationImpulseCacheFriendlyER11btRigidBodyS1_RK18btSolverConstraint(i7);
+if(!(r4 !=r5)) //_LBB607_12
+{
+break _19;
+}
+}
+}
+	r0 = (r0 + 1)|0;
+	r3 = heap32[(r1+5)];
+	if(r3 >r0) //_LBB607_10
+{
+continue _15;
+}
+else{
+break _1;
+}
+}
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolverD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV35btSequentialImpulseConstraintSolver;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+29)];
+if(!(r1 ==0)) //_LBB608_4
+{
+	r3 = heapU8[r0+120];
+if(!(r3 ==0)) //_LBB608_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+29)] = 0;
+}
+	r1 = 1;
+	heap8[r0+120] = r1;
+	heap32[(r2+29)] = 0;
+	heap32[(r2+27)] = 0;
+	heap32[(r2+28)] = 0;
+	r3 = heap32[(r2+24)];
+if(!(r3 ==0)) //_LBB608_8
+{
+	r4 = heapU8[r0+100];
+if(!(r4 ==0)) //_LBB608_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+24)] = 0;
+}
+	heap8[r0+100] = r1;
+	heap32[(r2+24)] = 0;
+	heap32[(r2+22)] = 0;
+	heap32[(r2+23)] = 0;
+	r3 = heap32[(r2+19)];
+if(!(r3 ==0)) //_LBB608_12
+{
+	r4 = heapU8[r0+80];
+if(!(r4 ==0)) //_LBB608_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+19)] = 0;
+}
+	heap8[r0+80] = r1;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+17)] = 0;
+	heap32[(r2+18)] = 0;
+	r3 = heap32[(r2+14)];
+if(!(r3 ==0)) //_LBB608_16
+{
+	r4 = heapU8[r0+60];
+if(!(r4 ==0)) //_LBB608_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+14)] = 0;
+}
+	heap8[r0+60] = r1;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	r3 = heap32[(r2+9)];
+if(!(r3 ==0)) //_LBB608_20
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB608_19
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+9)] = 0;
+}
+	heap8[r0+40] = r1;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB608_24
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB608_23
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolverD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV35btSequentialImpulseConstraintSolver;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+29)];
+if(!(r1 ==0)) //_LBB609_4
+{
+	r3 = heapU8[r0+120];
+if(!(r3 ==0)) //_LBB609_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+29)] = 0;
+}
+	r1 = 1;
+	heap8[r0+120] = r1;
+	heap32[(r2+29)] = 0;
+	heap32[(r2+27)] = 0;
+	heap32[(r2+28)] = 0;
+	r3 = heap32[(r2+24)];
+if(!(r3 ==0)) //_LBB609_8
+{
+	r4 = heapU8[r0+100];
+if(!(r4 ==0)) //_LBB609_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+24)] = 0;
+}
+	heap8[r0+100] = r1;
+	heap32[(r2+24)] = 0;
+	heap32[(r2+22)] = 0;
+	heap32[(r2+23)] = 0;
+	r3 = heap32[(r2+19)];
+if(!(r3 ==0)) //_LBB609_12
+{
+	r4 = heapU8[r0+80];
+if(!(r4 ==0)) //_LBB609_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+19)] = 0;
+}
+	heap8[r0+80] = r1;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+17)] = 0;
+	heap32[(r2+18)] = 0;
+	r3 = heap32[(r2+14)];
+if(!(r3 ==0)) //_LBB609_16
+{
+	r4 = heapU8[r0+60];
+if(!(r4 ==0)) //_LBB609_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+14)] = 0;
+}
+	heap8[r0+60] = r1;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+12)] = 0;
+	heap32[(r2+13)] = 0;
+	r3 = heap32[(r2+9)];
+if(!(r3 ==0)) //_LBB609_20
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB609_19
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+9)] = 0;
+}
+	heap8[r0+40] = r1;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+7)] = 0;
+	heap32[(r2+8)] = 0;
+	r3 = heap32[(r2+4)];
+if(!(r3 ==0)) //_LBB609_24
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB609_23
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+4)] = 0;
+}
+	heap8[r0+20] = r1;
+	heap32[(r2+4)] = 0;
+	heap32[(r2+2)] = 0;
+	heap32[(r2+3)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver10solveGroupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAllocP12btDispatcher(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = _2E_str450;
+	r1 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	if(r1 !=0) //_LBB610_2
+{
+	r0 = heap32[(fp+2)];
+	if(r0 !=0) //_LBB610_4
+{
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+3)];
+	r4 = heap32[(fp+4)];
+	r5 = heap32[(fp+5)];
+	r6 = heap32[(fp+6)];
+	r7 = heap32[(fp+7)];
+	r8 = heap32[(fp+8)];
+	r9 = heap32[(fp+9)];
+	r10 = r2 >> 2;
+	r11 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+8)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r6;
+	heap32[(g0+7)] = r7;
+	heap32[(g0+8)] = r8;
+	heap32[(g0+9)] = r9;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r11 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+9)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r6;
+	heap32[(g0+7)] = r7;
+	heap32[(g0+8)] = r8;
+	heap32[(g0+9)] = r9;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r4;
+	heap32[(g0+5)] = r5;
+	heap32[(g0+6)] = r6;
+	heap32[(g0+7)] = r7;
+	heap32[(g0+8)] = r8;
+	heap32[(g0+9)] = r9;
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_5: do {
+if(!(r3 !=0)) //_LBB610_10
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB610_7
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB610_10
+{
+break _5;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+else{
+	r0 = _2E_str753;
+	r1 = _2E_str652;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1186;
+	_assert(i7);
+}
+}
+else{
+	r1 = _2E_str551;
+	r0 = _2E_str652;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 1185;
+	_assert(i7);
+}
+}
+
+function _ZN35btSequentialImpulseConstraintSolver29solveGroupCacheFriendlyFinishEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -504;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+7)];
+	r5 = heap32[(r1+2)];
+	r6 = 0;
+_1: while(true){
+	if(r6 <r5) //_LBB611_1
+{
+	r7 = (r6 * 34)|0;
+	r8 = heap32[(r1+4)];
+	r7 = r7 << 2;
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7+28)];
+	if(r8 !=0) //_LBB611_3
+{
+	r8 = r8 >> 2;
+	heap32[(r8+28)] = heap32[(r7+21)];
+	r9 = heapU8[r4+60];
+	r9 = r9 & 8;
+if(!(r9 ==0)) //_LBB611_5
+{
+	r9 = heap32[(r7+25)];
+	r10 = heap32[(r1+14)];
+	r9 = (r9 * 136)|0;
+	r9 = (r10 + r9)|0;
+	r9 = r9 >> 2;
+	heap32[(r8+30)] = heap32[(r9+21)];
+	r7 = heap32[(r7+25)];
+	r9 = heap32[(r1+14)];
+	r7 = (r7 * 136)|0;
+	r7 = (r7 + r9)|0;
+	r7 = r7 >> 2;
+	heap32[(r8+31)] = heap32[(r7+55)];
+}
+	r6 = (r6 + 1)|0;
+continue _1;
+}
+else{
+__label__ = 2;
+break _1;
+}
+}
+else{
+__label__ = 7;
+break _1;
+}
+}
+switch(__label__ ){//multiple entries
+case 7:
+	r5 = heap32[(r1+7)];
+_10: do {
+if(!(r5 <1)) //_LBB611_10
+{
+	r6 = 0;
+_12: while(true){
+	r7 = (r6 * 34)|0;
+	r8 = heap32[(r1+9)];
+	r7 = r7 << 2;
+	r7 = (r8 + r7)|0;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7+28)];
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r8+7)];
+	f1 = heapFloat[(r7+21)];
+	r6 = (r6 + 1)|0;
+	f0 = f1+f0;
+	heapFloat[(r8+7)] = f0;
+	if(r5 !=r6) //_LBB611_9
+{
+continue _12;
+}
+else{
+break _10;
+}
+}
+}
+} while(0);
+	r4 = r4 >> 2;
+	r5 = heap32[(r4+11)];
+_15: do {
+	if(r5 !=0) //_LBB611_13
+{
+if(!(r3 <1)) //_LBB611_24
+{
+__label__ = 13; //SET chanka
+_17: while(true){
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r6 = heapU8[r5+232];
+	r6 = r6 & 2;
+if(!(r6 ==0)) //_LBB611_18
+{
+if(!(r5 ==0)) //_LBB611_18
+{
+	r6 = r5 >> 2;
+	f0 = heapFloat[(r6+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB611_18
+{
+	f0 = heapFloat[(r4+3)];
+	f1 = heapFloat[(r6+78)];
+	f2 = heapFloat[(r6+128)];
+	f3 = heapFloat[(r6+77)];
+	f4 = heapFloat[(r6+127)];
+	f5 = heapFloat[(r6+76)];
+	f6 = heapFloat[(r6+126)];
+	f5 = f5+f6;
+	f3 = f3+f4;
+	heapFloat[(r6+76)] = f5;
+	f1 = f1+f2;
+	heapFloat[(r6+77)] = f3;
+	heapFloat[(r6+78)] = f1;
+	heap32[(r6+79)] = 0;
+	f1 = heapFloat[(r6+82)];
+	f2 = heapFloat[(r6+132)];
+	f3 = heapFloat[(r6+81)];
+	f4 = heapFloat[(r6+131)];
+	f5 = heapFloat[(r6+80)];
+	f6 = heapFloat[(r6+130)];
+	f5 = f5+f6;
+	f3 = f3+f4;
+	heapFloat[(r6+80)] = f5;
+	f1 = f1+f2;
+	heapFloat[(r6+81)] = f3;
+	heapFloat[(r6+82)] = f1;
+	heap32[(r6+83)] = 0;
+	f1 = heapFloat[(r6+142)];
+	f2 = heapFloat[(r6+143)];
+	f3 = heapFloat[(r6+144)];
+	r7 = sp + -64;
+	r8 = (r5 + 4)|0;
+	r5 = (r5 + 584)|0;
+	heap32[(g0)] = r8;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	heapFloat[(g0+3)] = f3;
+	heap32[(g0+4)] = r5;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r7;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	r5 = r7 >> 2;
+	heap32[(r6+1)] = heap32[(fp+-16)];
+	heap32[(r6+2)] = heap32[(r5+1)];
+	heap32[(r6+3)] = heap32[(r5+2)];
+	heap32[(r6+4)] = heap32[(r5+3)];
+	heap32[(r6+5)] = heap32[(r5+4)];
+	heap32[(r6+6)] = heap32[(r5+5)];
+	heap32[(r6+7)] = heap32[(r5+6)];
+	heap32[(r6+8)] = heap32[(r5+7)];
+	heap32[(r6+9)] = heap32[(r5+8)];
+	heap32[(r6+10)] = heap32[(r5+9)];
+	heap32[(r6+11)] = heap32[(r5+10)];
+	heap32[(r6+12)] = heap32[(r5+11)];
+	heap32[(r6+13)] = heap32[(r5+12)];
+	heap32[(r6+14)] = heap32[(r5+13)];
+	heap32[(r6+15)] = heap32[(r5+14)];
+	heap32[(r6+16)] = heap32[(r5+15)];
+}
+}
+}
+	r3 = (r3 + -1)|0;
+	r2 = (r2 + 4)|0;
+	if(r3 ==0) //_LBB611_24
+{
+break _15;
+}
+else{
+continue _17;
+}
+}
+}
+}
+else{
+if(!(r3 <1)) //_LBB611_24
+{
+__label__ = 18; //SET chanka
+_25: while(true){
+	r4 = r2 >> 2;
+	r4 = heap32[(r4)];
+	r5 = heapU8[r4+232];
+	r5 = r5 & 2;
+if(!(r5 ==0)) //_LBB611_23
+{
+if(!(r4 ==0)) //_LBB611_23
+{
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r4+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB611_23
+{
+	f0 = heapFloat[(r4+78)];
+	f1 = heapFloat[(r4+128)];
+	f2 = heapFloat[(r4+77)];
+	f3 = heapFloat[(r4+127)];
+	f4 = heapFloat[(r4+76)];
+	f5 = heapFloat[(r4+126)];
+	f4 = f4+f5;
+	f2 = f2+f3;
+	heapFloat[(r4+76)] = f4;
+	f0 = f0+f1;
+	heapFloat[(r4+77)] = f2;
+	heapFloat[(r4+78)] = f0;
+	heap32[(r4+79)] = 0;
+	f0 = heapFloat[(r4+82)];
+	f1 = heapFloat[(r4+132)];
+	f2 = heapFloat[(r4+81)];
+	f3 = heapFloat[(r4+131)];
+	f4 = heapFloat[(r4+80)];
+	f5 = heapFloat[(r4+130)];
+	f4 = f4+f5;
+	f2 = f2+f3;
+	heapFloat[(r4+80)] = f4;
+	f0 = f0+f1;
+	heapFloat[(r4+81)] = f2;
+	heapFloat[(r4+82)] = f0;
+	heap32[(r4+83)] = 0;
+}
+}
+}
+	r3 = (r3 + -1)|0;
+	r2 = (r2 + 4)|0;
+	if(r3 !=0) //_LBB611_19
+{
+continue _25;
+}
+else{
+break _15;
+}
+}
+}
+}
+} while(0);
+	r2 = heap32[(r1+2)];
+_33: do {
+if(!(r2 >-1)) //_LBB611_33
+{
+	r3 = heap32[(r1+3)];
+if(!(r3 >-1)) //_LBB611_31
+{
+	r3 = heap32[(r1+4)];
+if(!(r3 ==0)) //_LBB611_30
+{
+	r4 = heapU8[r0+20];
+if(!(r4 ==0)) //_LBB611_29
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+4)] = 0;
+}
+	r3 = 1;
+	heap8[r0+20] = r3;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+3)] = 0;
+}
+	r3 = (r2 * 136)|0;
+_44: while(true){
+	r4 = heap32[(r1+4)];
+	r4 = (r4 + r3)|0;
+	r5 = sp + -472;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 136;
+	r2 = (r2 + 1)|0;
+	r3 = (r3 + 136)|0;
+	memcpy(i7);
+	if(r2 !=0) //_LBB611_32
+{
+continue _44;
+}
+else{
+break _33;
+}
+}
+}
+} while(0);
+	heap32[(r1+2)] = 0;
+	r2 = heap32[(r1+7)];
+_47: do {
+if(!(r2 >-1)) //_LBB611_42
+{
+	r3 = heap32[(r1+8)];
+if(!(r3 >-1)) //_LBB611_40
+{
+	r3 = heap32[(r1+9)];
+if(!(r3 ==0)) //_LBB611_39
+{
+	r4 = heapU8[r0+40];
+if(!(r4 ==0)) //_LBB611_38
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+9)] = 0;
+}
+	r3 = 1;
+	heap8[r0+40] = r3;
+	heap32[(r1+9)] = 0;
+	heap32[(r1+8)] = 0;
+}
+	r3 = (r2 * 136)|0;
+_58: while(true){
+	r4 = heap32[(r1+9)];
+	r4 = (r4 + r3)|0;
+	r5 = sp + -336;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 136;
+	r2 = (r2 + 1)|0;
+	r3 = (r3 + 136)|0;
+	memcpy(i7);
+	if(r2 !=0) //_LBB611_41
+{
+continue _58;
+}
+else{
+break _47;
+}
+}
+}
+} while(0);
+	heap32[(r1+7)] = 0;
+	r2 = heap32[(r1+12)];
+_61: do {
+if(!(r2 >-1)) //_LBB611_51
+{
+	r3 = heap32[(r1+13)];
+if(!(r3 >-1)) //_LBB611_49
+{
+	r3 = heap32[(r1+14)];
+if(!(r3 ==0)) //_LBB611_48
+{
+	r4 = heapU8[r0+60];
+if(!(r4 ==0)) //_LBB611_47
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+14)] = 0;
+}
+	r3 = 1;
+	heap8[r0+60] = r3;
+	heap32[(r1+14)] = 0;
+	heap32[(r1+13)] = 0;
+}
+	r0 = (r2 * 136)|0;
+_72: while(true){
+	r3 = heap32[(r1+14)];
+	r3 = (r3 + r0)|0;
+	r4 = sp + -200;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 136;
+	r2 = (r2 + 1)|0;
+	r0 = (r0 + 136)|0;
+	memcpy(i7);
+	if(r2 !=0) //_LBB611_50
+{
+continue _72;
+}
+else{
+break _61;
+}
+}
+}
+} while(0);
+	heap32[(r1+12)] = 0;
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+break;
+case 2:
+	r0 = _2E_str955;
+	r1 = _2E_str652;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1129;
+	_assert(i7);
+break;
+}
+}
+
+function _ZN35btSequentialImpulseConstraintSolver28solveGroupCacheFriendlySetupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+var __label__ = 0;
+	i7 = sp + -584;var g0 = i7>>2; // save stack
+	r0 = _2E_str1056;
+	r1 = heap32[(fp+6)];
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp+4)];
+	heap32[(fp+-133)] = r0;
+	r2 = 0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r0 = (r2 - r0)|0;
+_1: do {
+if(!(r1 ==r0)) //_LBB612_269
+{
+	r0 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	heap32[(fp+-132)] = r5;
+	r5 = heap32[(fp+5)];
+	heap32[(fp+-127)] = r5;
+	r5 = heap32[(fp+7)];
+	r6 = r5 >> 2;
+	r7 = heap32[(r6+11)];
+_3: do {
+	if(r7 !=0) //_LBB612_4
+{
+if(!(r4 <1)) //_LBB612_14
+{
+__label__ = 4; //SET chanka
+_5: while(true){
+	r7 = r3 >> 2;
+	r7 = heap32[(r7)];
+	r8 = heapU8[r7+232];
+	r8 = r8 & 2;
+if(!(r8 ==0)) //_LBB612_8
+{
+if(!(r7 ==0)) //_LBB612_8
+{
+	r7 = r7 >> 2;
+	heap32[(r7+126)] = 0;
+	heap32[(r7+127)] = 0;
+	heap32[(r7+128)] = 0;
+	heap32[(r7+129)] = 0;
+	heap32[(r7+130)] = 0;
+	heap32[(r7+131)] = 0;
+	heap32[(r7+132)] = 0;
+	heap32[(r7+133)] = 0;
+	heap32[(r7+142)] = 0;
+	heap32[(r7+143)] = 0;
+	heap32[(r7+144)] = 0;
+	heap32[(r7+145)] = 0;
+	heap32[(r7+146)] = 0;
+	heap32[(r7+147)] = 0;
+	heap32[(r7+148)] = 0;
+	heap32[(r7+149)] = 0;
+}
+}
+	r4 = (r4 + -1)|0;
+	r3 = (r3 + 4)|0;
+	if(r4 ==0) //_LBB612_14
+{
+break _3;
+}
+else{
+continue _5;
+}
+}
+}
+}
+else{
+if(!(r4 <1)) //_LBB612_14
+{
+__label__ = 8; //SET chanka
+_12: while(true){
+	r7 = r3 >> 2;
+	r7 = heap32[(r7)];
+	r8 = heapU8[r7+232];
+	r8 = r8 & 2;
+if(!(r8 ==0)) //_LBB612_12
+{
+if(!(r7 ==0)) //_LBB612_12
+{
+	r7 = r7 >> 2;
+	heap32[(r7+126)] = 0;
+	heap32[(r7+127)] = 0;
+	heap32[(r7+128)] = 0;
+	heap32[(r7+129)] = 0;
+	heap32[(r7+130)] = 0;
+	heap32[(r7+131)] = 0;
+	heap32[(r7+132)] = 0;
+	heap32[(r7+133)] = 0;
+}
+}
+	r4 = (r4 + -1)|0;
+	r3 = (r3 + 4)|0;
+	if(r4 ==0) //_LBB612_14
+{
+break _3;
+}
+}
+}
+}
+} while(0);
+_19: do {
+	if(r1 <1) //_LBB612_40
+{
+	r4 = r0 >> 2;
+	r3 = heap32[(r4+27)];
+_21: do {
+if(!(r3 >r1)) //_LBB612_59
+{
+if(!(r3 >=r1)) //_LBB612_59
+{
+	r7 = heap32[(r4+28)];
+if(!(r7 >=r1)) //_LBB612_58
+{
+	if(r1 !=0) //_LBB612_45
+{
+	r7 = gNumAlignedAllocs;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r9 = r1 << 3;
+	r8 = (r8 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r7)] = r8;
+	r7 = (r9 + 16)|0;
+	heap32[(g0)] = r7;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB612_47
+{
+	r8 = (r7 + 4)|0;
+	r8 = (r2 - r8)|0;
+	r8 = r8 & 15;
+	r8 = (r7 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r7;
+	r7 = r9;
+}
+}
+else{
+	r7 = 0;
+}
+	r8 = (r0 + 116)|0;
+	if(r3 <1) //_LBB612_50
+{
+	r2 = r8 >> 2;
+	r9 = heap32[(r2)];
+}
+else{
+_33: while(true){
+	r9 = r8 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r2 << 3;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r7 + r10)|0;
+	r12 = heap32[(r11+1)];
+	r11 = heap32[(r11)];
+	r10 = r10 >> 2;
+	r2 = (r2 + 1)|0;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = r12;
+if(!(r3 !=r2)) //_LBB612_51
+{
+break _33;
+}
+}
+	r8 = (r0 + 116)|0;
+}
+if(!(r9 ==0)) //_LBB612_57
+{
+	r2 = heapU8[r0+120];
+if(!(r2 ==0)) //_LBB612_56
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r10 = heap32[(r2)];
+	r10 = (r10 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r2)] = r10;
+	r2 = heap32[(r9+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+}
+	r2 = r8 >> 2;
+	heap32[(r2)] = 0;
+}
+	r2 = 1;
+	r8 = r8 >> 2;
+	heap8[r0+120] = r2;
+	heap32[(r8)] = r7;
+	heap32[(r4+28)] = r1;
+	if(r3 >=r1) //_LBB612_59
+{
+break _21;
+}
+}
+_43: while(true){
+	r2 = r3 << 3;
+	r7 = heap32[(r4+29)];
+	r2 = (r7 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = (r3 + 1)|0;
+	heap32[(r2)] = 0;
+	heap32[(r2+1)] = 0;
+if(!(r1 !=r3)) //_LBB612_58
+{
+break _21;
+}
+}
+}
+}
+} while(0);
+	r3 = 0;
+	heap32[(r4+27)] = r1;
+}
+else{
+	r2 = 0;
+_47: while(true){
+	r3 = r2 << 2;
+	r4 = heap32[(fp+-127)];
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	r2 = (r2 + 1)|0;
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	if(r1 ==r2) //_LBB612_16
+{
+break _47;
+}
+}
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+27)];
+_50: do {
+if(!(r3 >r1)) //_LBB612_35
+{
+if(!(r3 >=r1)) //_LBB612_35
+{
+	r4 = heap32[(r2+28)];
+if(!(r4 >=r1)) //_LBB612_34
+{
+	if(r1 !=0) //_LBB612_21
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r7 = heap32[(r4)];
+	r8 = r1 << 3;
+	r7 = (r7 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r4)] = r7;
+	r4 = (r8 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB612_23
+{
+	r7 = 0;
+	r8 = (r4 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r4 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r4;
+	r4 = r8;
+}
+}
+else{
+	r4 = 0;
+}
+	r7 = (r0 + 116)|0;
+	if(r3 <1) //_LBB612_26
+{
+	r8 = r7 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_63: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 3;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r4 + r10)|0;
+	r12 = heap32[(r11+1)];
+	r11 = heap32[(r11)];
+	r10 = r10 >> 2;
+	r8 = (r8 + 1)|0;
+	heap32[(r10)] = r11;
+	heap32[(r10+1)] = r12;
+if(!(r3 !=r8)) //_LBB612_27
+{
+break _63;
+}
+}
+	r7 = (r0 + 116)|0;
+}
+if(!(r9 ==0)) //_LBB612_33
+{
+	r8 = heapU8[r0+120];
+if(!(r8 ==0)) //_LBB612_32
+{
+	r8 = gNumAlignedFree;
+	r8 = r8 >> 2;
+	r10 = heap32[(r8)];
+	r10 = (r10 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r8)] = r10;
+	r8 = heap32[(r9+-1)];
+	heap32[(g0)] = r8;
+	free(i7);
+}
+	r8 = r7 >> 2;
+	heap32[(r8)] = 0;
+}
+	r8 = 1;
+	r7 = r7 >> 2;
+	heap8[r0+120] = r8;
+	heap32[(r7)] = r4;
+	heap32[(r2+28)] = r1;
+	if(r3 >=r1) //_LBB612_35
+{
+break _50;
+}
+}
+_73: while(true){
+	r4 = r3 << 3;
+	r7 = heap32[(r2+29)];
+	r4 = (r7 + r4)|0;
+	r4 = r4 >> 2;
+	r3 = (r3 + 1)|0;
+	heap32[(r4)] = 0;
+	heap32[(r4+1)] = 0;
+if(!(r1 !=r3)) //_LBB612_34
+{
+break _50;
+}
+}
+}
+}
+} while(0);
+	heap32[(r2+27)] = r1;
+	if(r1 >0) //_LBB612_37
+{
+	r4 = 0;
+	r7 = heap32[(fp+-127)];
+	r8 = r1;
+	r3 = r4;
+_78: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+4)];
+	r11 = heap32[(r2+29)];
+	r11 = (r11 + r4)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r11;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r9 = r11 >> 2;
+	r9 = heap32[(r9)];
+	r8 = (r8 + -1)|0;
+	r3 = (r9 + r3)|0;
+	r4 = (r4 + 8)|0;
+	r7 = (r7 + 4)|0;
+if(!(r8 !=0)) //_LBB612_38
+{
+break _19;
+}
+}
+}
+else{
+	r3 = 0;
+}
+}
+} while(0);
+	r2 = r0 >> 2;
+	r4 = heap32[(r2+7)];
+_82: do {
+if(!(r4 >r3)) //_LBB612_80
+{
+if(!(r4 >=r3)) //_LBB612_80
+{
+	r7 = heap32[(r2+8)];
+if(!(r7 >=r3)) //_LBB612_78
+{
+	if(r3 !=0) //_LBB612_65
+{
+	r7 = gNumAlignedAllocs;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7)];
+	r9 = (r3 * 136)|0;
+	r8 = (r8 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r7)] = r8;
+	r7 = (r9 + 16)|0;
+	heap32[(g0)] = r7;
+	malloc(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB612_67
+{
+	r8 = 0;
+	r9 = (r7 + 4)|0;
+	r8 = (r8 - r9)|0;
+	r8 = r8 & 15;
+	r8 = (r7 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r7;
+	r7 = r9;
+}
+}
+else{
+	r7 = 0;
+}
+	r8 = (r0 + 36)|0;
+	if(r4 <1) //_LBB612_70
+{
+	r9 = r8 >> 2;
+	r11 = heap32[(r9)];
+}
+else{
+	r9 = 0;
+	r10 = r4;
+_95: while(true){
+	r11 = r8 >> 2;
+	r11 = heap32[(r11)];
+	r12 = (r7 + r9)|0;
+	r13 = (r11 + r9)|0;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r13;
+	heap32[(g0+2)] = 136;
+	r10 = (r10 + -1)|0;
+	r9 = (r9 + 136)|0;
+	memcpy(i7);
+if(!(r10 !=0)) //_LBB612_71
+{
+break _95;
+}
+}
+	r8 = (r0 + 36)|0;
+}
+if(!(r11 ==0)) //_LBB612_77
+{
+	r9 = heapU8[r0+40];
+if(!(r9 ==0)) //_LBB612_76
+{
+	r9 = gNumAlignedFree;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r10 = (r10 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r9)] = r10;
+	r9 = heap32[(r11+-1)];
+	heap32[(g0)] = r9;
+	free(i7);
+}
+	r9 = r8 >> 2;
+	heap32[(r9)] = 0;
+}
+	r9 = 1;
+	r8 = r8 >> 2;
+	heap8[r0+40] = r9;
+	heap32[(r8)] = r7;
+	heap32[(r2+8)] = r3;
+	if(r4 >=r3) //_LBB612_80
+{
+break _82;
+}
+}
+	r7 = (r3 - r4)|0;
+	r4 = (r4 * 136)|0;
+_106: while(true){
+	r8 = heap32[(r2+9)];
+	r8 = (r8 + r4)|0;
+	r9 = sp + -448;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r9;
+	heap32[(g0+2)] = 136;
+	r7 = (r7 + -1)|0;
+	r4 = (r4 + 136)|0;
+	memcpy(i7);
+if(!(r7 !=0)) //_LBB612_79
+{
+break _82;
+}
+}
+}
+}
+} while(0);
+	r4 = 0;
+	heap32[(r2+7)] = r3;
+	r7 = r4;
+_109: while(true){
+	if(r4 <r1) //_LBB612_81
+{
+	r8 = heap32[(r2+29)];
+	r9 = r4 << 3;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+	if(r10 !=0) //_LBB612_83
+{
+	if(r7 <r3) //_LBB612_85
+{
+	r11 = r4 << 1;
+	r12 = r4 << 2;
+	r13 = heap32[(fp+-127)];
+	r12 = (r13 + r12)|0;
+	r12 = r12 >> 2;
+	r13 = heap32[(r12)];
+	r14 = r13 >> 2;
+	r15 = heap32[(r2+9)];
+	r16 = heap32[(r14+5)];
+	r17 = heap32[(r14+6)];
+if(!(r10 <1)) //_LBB612_90
+{
+	r10 = (r7 * 136)|0;
+	r10 = (r15 + r10)|0;
+	r18 = 0;
+	r19 = r18;
+_117: while(true){
+	r20 = (r19 * 34)|0;
+	r21 = 136;
+	r22 = r18;
+_119: while(true){
+	r21 = (r21 + -1)|0;
+	r23 = (r22 + 1)|0;
+	r22 = (r10 + r22)|0;
+	r24 = (r19 * 136)|0;
+	heap8[r22+r24] = r18;
+	r22 = r23;
+if(!(r21 !=0)) //_LBB612_88
+{
+break _119;
+}
+}
+	r21 = r20 << 2;
+	r22 = r20 << 2;
+	r21 = (r10 + r21)|0;
+	r23 = r20 << 2;
+	r22 = (r10 + r22)|0;
+	r21 = r21 >> 2;
+	r24 = r20 << 2;
+	r23 = (r10 + r23)|0;
+	r22 = r22 >> 2;
+	heap32[(r21+31)] = -8388609;
+	r21 = r20 << 2;
+	r24 = (r10 + r24)|0;
+	r23 = r23 >> 2;
+	heap32[(r22+32)] = 2139095039;
+	r20 = r20 << 2;
+	r21 = (r10 + r21)|0;
+	r22 = r24 >> 2;
+	heap32[(r23+21)] = 0;
+	r20 = (r10 + r20)|0;
+	r23 = r11 << 2;
+	r21 = r21 >> 2;
+	heap32[(r22+20)] = 0;
+	r22 = (r8 + r23)|0;
+	r19 = (r19 + 1)|0;
+	r20 = r20 >> 2;
+	heap32[(r21+26)] = r16;
+	r21 = r22 >> 2;
+	heap32[(r20+27)] = r17;
+	r20 = heap32[(r21)];
+if(!(r20 >r19)) //_LBB612_87
+{
+break _117;
+}
+}
+}
+	r10 = r16 >> 2;
+	heap32[(r10+126)] = 0;
+	heap32[(r10+127)] = 0;
+	heap32[(r10+128)] = 0;
+	heap32[(r10+129)] = 0;
+	heap32[(r10+130)] = 0;
+	heap32[(r10+131)] = 0;
+	heap32[(r10+132)] = 0;
+	heap32[(r10+133)] = 0;
+	r16 = r17 >> 2;
+	heap32[(r16+126)] = 0;
+	heap32[(r16+127)] = 0;
+	heap32[(r16+128)] = 0;
+	heap32[(r16+129)] = 0;
+	heap32[(r16+130)] = 0;
+	heap32[(r16+131)] = 0;
+	heap32[(r16+132)] = 0;
+	heap32[(r16+133)] = 0;
+	f0 =                         1;
+	f1 = heapFloat[(r6+3)];
+	r17 = sp + -504;
+	f1 = f0/f1;
+	r18 = (r7 * 136)|0;
+	r15 = (r15 + r18)|0;
+	r18 = r17 >> 2;
+	heapFloat[(fp+-126)] = f1;
+	r19 = (r15 + 16)|0;
+	heap32[(r18+1)] = heap32[(r6+8)];
+	heap32[(r18+2)] = r19;
+	heap32[(r18+3)] = r15;
+	r19 = (r15 + 32)|0;
+	heap32[(r18+4)] = 0;
+	heap32[(r18+5)] = r19;
+	r19 = (r15 + 116)|0;
+	heap32[(r18+6)] = 34;
+	r20 = r15 >> 2;
+	heap32[(r18+7)] = r19;
+	heap32[(r20+30)] = heap32[(r6+10)];
+	r19 = (r15 + 120)|0;
+	heap32[(r18+13)] = heap32[(r6+1)];
+	r20 = (r15 + 124)|0;
+	heap32[(r18+8)] = r19;
+	r19 = (r15 + 128)|0;
+	heap32[(r18+9)] = r20;
+	heap32[(r18+10)] = r19;
+	r19 = heap32[(r6+5)];
+	heap32[(r18+12)] = r19;
+	r12 = heap32[(r12)];
+	r19 = r12 >> 2;
+	r19 = heap32[(r19)];
+	r19 = r19 >> 2;
+	r19 = heap32[(r19+5)];
+	r11 = r11 << 2;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r17;
+	r8 = (r8 + r11)|0;
+	r8 = r8 >> 2;
+	__FUNCTION_TABLE__[(r19)>>2](i7);
+	r11 = heap32[(r8)];
+_123: do {
+if(!(r11 <1)) //_LBB612_93
+{
+	r11 = 0;
+_125: while(true){
+	r12 = (r11 * 34)|0;
+	r12 = r12 << 2;
+	r12 = (r15 + r12)|0;
+	r12 = r12 >> 2;
+	heap32[(r12+28)] = r13;
+	r17 = heap32[(r14+5)];
+	r17 = r17 >> 2;
+	f1 = heapFloat[(r12)];
+	f2 = heapFloat[(r17+64)];
+	f3 = heapFloat[(r12+1)];
+	f4 = heapFloat[(r17+65)];
+	f5 = heapFloat[(r17+68)];
+	f6 = heapFloat[(r17+69)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f7 = heapFloat[(r12+2)];
+	f8 = heapFloat[(r17+66)];
+	f9 = heapFloat[(r17+72)];
+	f10 = heapFloat[(r17+73)];
+	f11 = heapFloat[(r17+70)];
+	f5 = f5*f1;
+	f6 = f6*f3;
+	f2 = f2+f4;
+	f4 = f8*f7;
+	f8 = heapFloat[(r17+74)];
+	f9 = f9*f1;
+	f10 = f10*f3;
+	f5 = f5+f6;
+	f6 = f11*f7;
+	f2 = f2+f4;
+	f4 = heapFloat[(r17+134)];
+	f11 = heapFloat[(r17+136)];
+	f12 = heapFloat[(r17+135)];
+	f5 = f5+f6;
+	f6 = f9+f10;
+	f8 = f8*f7;
+	f2 = f2*f4;
+	f4 = f6+f8;
+	f5 = f5*f12;
+	heapFloat[(r12+12)] = f2;
+	f2 = f4*f11;
+	heapFloat[(r12+13)] = f5;
+	heapFloat[(r12+14)] = f2;
+	heap32[(r12+15)] = 0;
+	r17 = heap32[(r14+6)];
+	r17 = r17 >> 2;
+	f2 = heapFloat[(r12+8)];
+	f4 = heapFloat[(r17+64)];
+	f5 = heapFloat[(r12+9)];
+	f6 = heapFloat[(r17+65)];
+	f8 = heapFloat[(r17+68)];
+	f9 = heapFloat[(r17+69)];
+	f4 = f4*f2;
+	f6 = f6*f5;
+	f10 = heapFloat[(r12+10)];
+	f11 = heapFloat[(r17+66)];
+	f12 = heapFloat[(r17+72)];
+	f13 = heapFloat[(r17+73)];
+	f14 = heapFloat[(r17+70)];
+	f8 = f8*f2;
+	f9 = f9*f5;
+	f4 = f4+f6;
+	f6 = f11*f10;
+	f11 = heapFloat[(r17+74)];
+	f12 = f12*f2;
+	f13 = f13*f5;
+	f8 = f8+f9;
+	f9 = f14*f10;
+	f4 = f4+f6;
+	f6 = heapFloat[(r17+134)];
+	f14 = heapFloat[(r17+136)];
+	f15 = heapFloat[(r17+135)];
+	f8 = f8+f9;
+	f9 = f12+f13;
+	f11 = f11*f10;
+	f4 = f4*f6;
+	f6 = f9+f11;
+	f8 = f8*f15;
+	heapFloat[(r12+16)] = f4;
+	f4 = f6*f14;
+	heapFloat[(r12+17)] = f8;
+	heapFloat[(r12+18)] = f4;
+	heap32[(r12+19)] = 0;
+	f4 = heapFloat[(r10+68)];
+	f6 = heapFloat[(r10+69)];
+	f8 = heapFloat[(r10+64)];
+	f9 = heapFloat[(r10+65)];
+	f11 = heapFloat[(r10+72)];
+	f12 = heapFloat[(r10+73)];
+	f13 = heapFloat[(r10+70)];
+	f14 = heapFloat[(r10+66)];
+	f8 = f8*f1;
+	f9 = f9*f3;
+	f4 = f4*f1;
+	f6 = f6*f3;
+	f15 = heapFloat[(r10+74)];
+	f16 = heapFloat[(r16+68)];
+	f17 = heapFloat[(r16+69)];
+	f18 = heapFloat[(r16+64)];
+	f19 = heapFloat[(r16+65)];
+	f8 = f8+f9;
+	f9 = f14*f7;
+	f4 = f4+f6;
+	f6 = f13*f7;
+	f11 = f11*f1;
+	f12 = f12*f3;
+	f13 = heapFloat[(r10+84)];
+	f14 = heapFloat[(r12+5)];
+	f20 = heapFloat[(r12+4)];
+	f21 = heapFloat[(r16+84)];
+	f22 = heapFloat[(r12+6)];
+	f8 = f8+f9;
+	f4 = f4+f6;
+	f6 = f20*f13;
+	f9 = f14*f13;
+	f23 = heapFloat[(r16+72)];
+	f24 = heapFloat[(r16+73)];
+	f25 = heapFloat[(r16+70)];
+	f26 = heapFloat[(r16+66)];
+	f18 = f18*f2;
+	f19 = f19*f5;
+	f16 = f16*f2;
+	f17 = f17*f5;
+	f11 = f11+f12;
+	f12 = f15*f7;
+	f15 = heapFloat[(r16+74)];
+	f27 = f20*f21;
+	f28 = f14*f21;
+	f11 = f11+f12;
+	f12 = f22*f13;
+	f13 = f18+f19;
+	f18 = f26*f10;
+	f16 = f16+f17;
+	f17 = f25*f10;
+	f19 = f23*f2;
+	f23 = f24*f5;
+	f8 = f8*f1;
+	f4 = f4*f3;
+	f6 = f6*f20;
+	f9 = f9*f14;
+	f13 = f13+f18;
+	f16 = f16+f17;
+	f17 = f22*f21;
+	f18 = f19+f23;
+	f15 = f15*f10;
+	f19 = f27*f20;
+	f21 = f28*f14;
+	f4 = f8+f4;
+	f8 = f11*f7;
+	f6 = f6+f9;
+	f9 = f12*f22;
+	f11 = f18+f15;
+	f12 = f13*f2;
+	f13 = f16*f5;
+	f15 = f19+f21;
+	f16 = f17*f22;
+	f4 = f4+f8;
+	f6 = f6+f9;
+	f8 = f12+f13;
+	f9 = f11*f10;
+	f11 = f15+f16;
+	f4 = f4+f6;
+	f6 = f8+f9;
+	f4 = f11+f4;
+	f4 = f6+f4;
+	f4 = f0/f4;
+	heapFloat[(r12+23)] = f4;
+	f6 = heapFloat[(r10+76)];
+	f8 = heapFloat[(r10+77)];
+	f9 = heapFloat[(r10+80)];
+	f11 = heapFloat[(r10+81)];
+	f12 = heapFloat[(r16+80)];
+	f13 = heapFloat[(r16+81)];
+	f15 = heapFloat[(r16+76)];
+	f16 = heapFloat[(r16+77)];
+	f17 = heapFloat[(r10+78)];
+	f18 = heapFloat[(r10+82)];
+	f19 = heapFloat[(r16+82)];
+	f21 = heapFloat[(r16+78)];
+	f6 = f20*f6;
+	f8 = f14*f8;
+	f1 = f1*f9;
+	f3 = f3*f11;
+	f2 = f2*f12;
+	f5 = f5*f13;
+	f9 = f20*f15;
+	f11 = f14*f16;
+	f6 = f6+f8;
+	f8 = f22*f17;
+	f1 = f1+f3;
+	f3 = f7*f18;
+	f2 = f2+f5;
+	f5 = f10*f19;
+	f7 = f9+f11;
+	f9 = f22*f21;
+	f6 = f6+f8;
+	f1 = f1+f3;
+	f2 = f2+f5;
+	f3 = f7+f9;
+	f1 = f6+f1;
+	f2 = f2-f3;
+	f1 = f1+f2;
+	f2 = heapFloat[(r18+13)];
+	f3 =                         0;
+	f1 = f2*f1;
+	f2 = heapFloat[(r12+29)];
+	f1 = f3-f1;
+	f2 = f4*f2;
+	f1 = f4*f1;
+	f1 = f2+f1;
+	r11 = (r11 + 1)|0;
+	heapFloat[(r12+29)] = f1;
+	heap32[(r12+21)] = 0;
+	r12 = heap32[(r8)];
+if(!(r12 >r11)) //_LBB612_92
+{
+break _123;
+}
+}
+}
+} while(0);
+	r8 = heap32[(r2+29)];
+	r8 = (r8 + r9)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+}
+else{
+__label__ = 78;
+break _109;
+}
+}
+else{
+	r8 = 0;
+}
+	r7 = (r8 + r7)|0;
+	r4 = (r4 + 1)|0;
+}
+else{
+__label__ = 90;
+break _109;
+}
+}
+switch(__label__ ){//multiple entries
+case 90:
+	r1 = heap32[(fp+-133)];
+_132: do {
+if(!(r1 <1)) //_LBB612_225
+{
+_133: while(true){
+	r1 = heap32[(fp+-132)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	heap32[(fp+-128)] = r1;
+	r1 = r1 >> 2;
+	heap32[(fp+-127)] = r1;
+	r3 = heap32[(r1+277)];
+	r1 = heap32[(r1+278)];
+	r4 = heapU8[r3+232];
+	r4 = r4 & 2;
+	if(r4 !=0) //_LBB612_99
+{
+	r4 = r3;
+}
+else{
+	r4 = 0;
+}
+	r7 = heapU8[r1+232];
+	r7 = r7 & 2;
+	if(r7 !=0) //_LBB612_102
+{
+	r7 = r1;
+}
+else{
+	r7 = 0;
+}
+	if(r4 ==0) //_LBB612_105
+{
+__label__ = 99;
+}
+else{
+	r4 = r4 >> 2;
+	f0 = heapFloat[(r4+84)];
+	f1 =                         0;
+	if(f0 !=f1) //_LBB612_107
+{
+__label__ = 101;
+}
+else{
+__label__ = 99;
+}
+}
+if (__label__ == 99){
+	if(r7 ==0) //_LBB612_224
+{
+__label__ = 216;
+}
+else{
+	r4 = r7 >> 2;
+	f0 = heapFloat[(r4+84)];
+	f1 =                         0;
+	if(f0 ==f1) //_LBB612_224
+{
+__label__ = 216;
+}
+else{
+__label__ = 101;
+}
+}
+}
+if (__label__ == 101){
+	r4 = heap32[(fp+-128)];
+	r7 = (r4 + 4)|0;
+	heap32[(fp+-129)] = r7;
+	r7 = (r4 + 152)|0;
+	heap32[(fp+-130)] = r7;
+	r4 = (r4 + 168)|0;
+	heap32[(fp+-131)] = r4;
+	r4 = 0;
+	r7 = r4;
+_150: while(true){
+	r8 = heap32[(fp+-127)];
+	r8 = heap32[(r8+279)];
+	if(r8 >r7) //_LBB612_108
+{
+	r8 = heap32[(fp+-128)];
+	r8 = (r8 + r4)|0;
+	r9 = r8 >> 2;
+	f0 = heapFloat[(r9+21)];
+	r10 = heap32[(fp+-127)];
+	f1 = heapFloat[(r10+281)];
+_153: do {
+if(!(f0 >f1)) //_LBB612_222
+{
+	r10 = heap32[(fp+-129)];
+	r10 = (r10 + r4)|0;
+	r11 = heap32[(fp+-131)];
+	r11 = (r11 + r4)|0;
+	r12 = heap32[(fp+-130)];
+	r12 = (r12 + r4)|0;
+	r13 = heap32[(r2+3)];
+	r14 = heap32[(r2+2)];
+	if(r13 ==r14) //_LBB612_111
+{
+	r15 = 1;
+	r16 = r14 << 1;
+	r16 = r14 == 0 ? r15 : r16;
+	if(r13 >=r16) //_LBB612_110
+{
+__label__ = 104;
+}
+else{
+	if(r16 !=0) //_LBB612_114
+{
+	r13 = gNumAlignedAllocs;
+	r13 = r13 >> 2;
+	r17 = heap32[(r13)];
+	r18 = (r16 * 136)|0;
+	r17 = (r17 + 1)|0;
+	r18 = r18 | 3;
+	heap32[(r13)] = r17;
+	r13 = (r18 + 16)|0;
+	heap32[(g0)] = r13;
+	malloc(i7);
+	r17 = r_g0;
+	if(r17 !=0) //_LBB612_116
+{
+	r13 = 0;
+	r18 = (r17 + 4)|0;
+	r13 = (r13 - r18)|0;
+	r13 = r13 & 15;
+	r13 = (r17 + r13)|0;
+	r18 = (r13 + 4)|0;
+	r13 = r13 >> 2;
+	heap32[(r13)] = r17;
+	r17 = r18;
+}
+}
+else{
+	r17 = 0;
+}
+	if(r14 <1) //_LBB612_119
+{
+	r19 = heap32[(r2+4)];
+}
+else{
+	r13 = 0;
+	r18 = r14;
+_166: while(true){
+	r19 = heap32[(r2+4)];
+	r20 = (r17 + r13)|0;
+	r21 = (r19 + r13)|0;
+	heap32[(g0)] = r20;
+	heap32[(g0+1)] = r21;
+	heap32[(g0+2)] = 136;
+	r18 = (r18 + -1)|0;
+	r13 = (r13 + 136)|0;
+	memcpy(i7);
+if(!(r18 !=0)) //_LBB612_120
+{
+break _166;
+}
+}
+}
+	if(r19 !=0) //_LBB612_123
+{
+	r13 = heapU8[r0+20];
+	if(r13 !=0) //_LBB612_125
+{
+	r13 = gNumAlignedFree;
+	r13 = r13 >> 2;
+	r18 = heap32[(r13)];
+	r18 = (r18 + 1)|0;
+	r19 = r19 >> 2;
+	heap32[(r13)] = r18;
+	r13 = heap32[(r19+-1)];
+	heap32[(g0)] = r13;
+	free(i7);
+	r13 = heap32[(r2+2)];
+}
+else{
+	r13 = r14;
+}
+	heap32[(r2+4)] = 0;
+}
+else{
+	r13 = r14;
+}
+	heap8[r0+20] = r15;
+	heap32[(r2+4)] = r17;
+	heap32[(r2+3)] = r16;
+__label__ = 121;
+}
+}
+else{
+__label__ = 104;
+}
+if (__label__ == 104){
+	r13 = r14;
+}
+	r13 = (r13 + 1)|0;
+	heap32[(r2+2)] = r13;
+	r13 = heapU8[r3+232];
+	r15 = heapU8[r1+232];
+	r13 = r13 & 2;
+	r16 = 0;
+	r15 = r15 & 2;
+	r13 = r13 == 0 ? r16 : r3;
+	r17 = heap32[(r2+4)];
+	r15 = r15 == 0 ? r16 : r1;
+	if(r13 ==0) //_LBB612_130
+{
+	r18 = _ZGVZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r19 = heapU8[r18];
+if(!(r19 !=0)) //_LBB612_132
+{
+	r19 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r20 = r19 >> 2;
+	heap32[(r20+41)] = 1065353216;
+	heap32[(r20+42)] = 1065353216;
+	heap32[(r20+43)] = 1065353216;
+	heap32[(r20+44)] = 0;
+	heap32[(r20+45)] = 0;
+	heap32[(r20+46)] = 1566444395;
+	heap32[(r20+47)] = 0;
+	heap32[(r20+48)] = 0;
+	heap32[(r20+49)] = 0;
+	heap32[(r20+50)] = 0;
+	heap32[(r20+51)] = 1;
+	heap32[(r20+52)] = -1;
+	heap32[(r20+53)] = -1;
+	heap32[(r20+54)] = 1;
+	heap32[(r20+55)] = 0;
+	heap32[(r20+56)] = 1056964608;
+	heap32[(r20+57)] = 0;
+	heap32[(r20+58)] = 1;
+	heap32[(r20+59)] = 0;
+	heap32[(r20+60)] = 1065353216;
+	heap32[(r20+61)] = 0;
+	heap32[(r20+62)] = 0;
+	heap32[(r20+63)] = 0;
+	heap32[(r20+1)] = 1065353216;
+	heap32[(r20+2)] = 0;
+	heap32[(r20+3)] = 0;
+	heap32[(r20+4)] = 0;
+	heap32[(r20+5)] = 0;
+	heap32[(r20+6)] = 1065353216;
+	heap32[(r20+7)] = 0;
+	heap32[(r20+8)] = 0;
+	heap32[(r20+9)] = 0;
+	heap32[(r20+10)] = 0;
+	heap32[(r20+11)] = 1065353216;
+	heap32[(r20+12)] = 0;
+	heap32[(r20+13)] = 0;
+	heap32[(r20+14)] = 0;
+	r21 = _ZTV11btRigidBody;
+	heap32[(r20+15)] = 0;
+	r21 = (r21 + 8)|0;
+	heap32[(r20+16)] = 0;
+	r22 = 1;
+	heap32[(r20)] = r21;
+	heap8[r19+492] = r22;
+	heap32[(r20+122)] = 0;
+	heap32[(r20+120)] = 0;
+	r21 = sp + -280;
+	heap32[(r20+121)] = 0;
+	r20 = r21 >> 2;
+	heap32[(fp+-70)] = 0;
+	heap32[(r20+1)] = 0;
+	heap32[(r20+18)] = 0;
+	heap32[(r20+19)] = 0;
+	heap32[(r20+20)] = 0;
+	heap32[(r20+21)] = 0;
+	heap32[(r20+22)] = 0;
+	heap32[(r20+23)] = 0;
+	heap32[(r20+24)] = 0;
+	heap32[(r20+25)] = 1056964608;
+	heap32[(r20+26)] = 0;
+	heap32[(r20+27)] = 1061997773;
+	heap32[(r20+28)] = 1065353216;
+	heap8[sp+-164] = r16;
+	heap32[(r20+30)] = 1000593162;
+	heap32[(r20+31)] = 1008981770;
+	heap32[(r20+32)] = 1008981770;
+	heap32[(r20+33)] = 1008981770;
+	heap32[(r20+2)] = 1065353216;
+	heap32[(r20+3)] = 0;
+	heap32[(r20+4)] = 0;
+	heap32[(r20+5)] = 0;
+	heap32[(r20+6)] = 0;
+	heap32[(r20+7)] = 1065353216;
+	heap32[(r20+8)] = 0;
+	heap32[(r20+9)] = 0;
+	heap32[(r20+10)] = 0;
+	heap32[(r20+11)] = 0;
+	heap32[(r20+12)] = 1065353216;
+	heap32[(r20+13)] = 0;
+	heap32[(r20+14)] = 0;
+	heap32[(r20+15)] = 0;
+	heap32[(r20+16)] = 0;
+	heap32[(r20+17)] = 0;
+	heap32[(g0)] = r19;
+	heap32[(g0+1)] = r21;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	heap8[r18] = r22;
+}
+	r18 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r19 = r18 >> 2;
+	r20 = heap32[(r19+51)];
+	r20 = r20 | 1;
+	heap32[(r19+51)] = r20;
+	heap32[(r19+84)] = 0;
+	f0 =                         0;
+	f1 = heapFloat[(r19+95)];
+	f2 = heapFloat[(r19+94)];
+	f3 = heapFloat[(r19+93)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r19+89)] = f3;
+	f1 = f1*f0;
+	heapFloat[(r19+90)] = f2;
+	heapFloat[(r19+91)] = f1;
+	heap32[(r19+92)] = 0;
+	heap32[(r19+97)] = 0;
+	heap32[(r19+98)] = 0;
+	heap32[(r19+99)] = 0;
+	heap32[(r19+100)] = 0;
+	f1 = heapFloat[(r19+87)];
+	f2 = heapFloat[(r19+86)];
+	f3 = heapFloat[(r19+85)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r19+138)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r19+139)] = f2;
+	heapFloat[(r19+140)] = f0;
+	heap32[(r19+141)] = 0;
+}
+else{
+	r18 = r13;
+}
+	r19 = (r14 * 136)|0;
+	r17 = (r17 + r19)|0;
+	r17 = r17 >> 2;
+	heap32[(r17+26)] = r18;
+	if(r15 ==0) //_LBB612_135
+{
+	r18 = _ZGVZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r19 = heapU8[r18];
+if(!(r19 !=0)) //_LBB612_137
+{
+	r19 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r20 = r19 >> 2;
+	heap32[(r20+41)] = 1065353216;
+	heap32[(r20+42)] = 1065353216;
+	heap32[(r20+43)] = 1065353216;
+	heap32[(r20+44)] = 0;
+	heap32[(r20+45)] = 0;
+	heap32[(r20+46)] = 1566444395;
+	heap32[(r20+47)] = 0;
+	heap32[(r20+48)] = 0;
+	heap32[(r20+49)] = 0;
+	heap32[(r20+50)] = 0;
+	heap32[(r20+51)] = 1;
+	heap32[(r20+52)] = -1;
+	heap32[(r20+53)] = -1;
+	heap32[(r20+54)] = 1;
+	heap32[(r20+55)] = 0;
+	heap32[(r20+56)] = 1056964608;
+	heap32[(r20+57)] = 0;
+	heap32[(r20+58)] = 1;
+	heap32[(r20+59)] = 0;
+	heap32[(r20+60)] = 1065353216;
+	heap32[(r20+61)] = 0;
+	heap32[(r20+62)] = 0;
+	heap32[(r20+63)] = 0;
+	heap32[(r20+1)] = 1065353216;
+	heap32[(r20+2)] = 0;
+	heap32[(r20+3)] = 0;
+	heap32[(r20+4)] = 0;
+	heap32[(r20+5)] = 0;
+	heap32[(r20+6)] = 1065353216;
+	heap32[(r20+7)] = 0;
+	heap32[(r20+8)] = 0;
+	heap32[(r20+9)] = 0;
+	heap32[(r20+10)] = 0;
+	heap32[(r20+11)] = 1065353216;
+	heap32[(r20+12)] = 0;
+	heap32[(r20+13)] = 0;
+	heap32[(r20+14)] = 0;
+	r21 = _ZTV11btRigidBody;
+	heap32[(r20+15)] = 0;
+	r21 = (r21 + 8)|0;
+	heap32[(r20+16)] = 0;
+	r22 = 1;
+	heap32[(r20)] = r21;
+	heap8[r19+492] = r22;
+	heap32[(r20+122)] = 0;
+	heap32[(r20+120)] = 0;
+	r21 = sp + -144;
+	heap32[(r20+121)] = 0;
+	r20 = r21 >> 2;
+	heap32[(fp+-36)] = 0;
+	heap32[(r20+1)] = 0;
+	heap32[(r20+18)] = 0;
+	heap32[(r20+19)] = 0;
+	heap32[(r20+20)] = 0;
+	heap32[(r20+21)] = 0;
+	heap32[(r20+22)] = 0;
+	heap32[(r20+23)] = 0;
+	heap32[(r20+24)] = 0;
+	heap32[(r20+25)] = 1056964608;
+	heap32[(r20+26)] = 0;
+	heap32[(r20+27)] = 1061997773;
+	heap32[(r20+28)] = 1065353216;
+	heap8[sp+-28] = r16;
+	heap32[(r20+30)] = 1000593162;
+	heap32[(r20+31)] = 1008981770;
+	heap32[(r20+32)] = 1008981770;
+	heap32[(r20+33)] = 1008981770;
+	heap32[(r20+2)] = 1065353216;
+	heap32[(r20+3)] = 0;
+	heap32[(r20+4)] = 0;
+	heap32[(r20+5)] = 0;
+	heap32[(r20+6)] = 0;
+	heap32[(r20+7)] = 1065353216;
+	heap32[(r20+8)] = 0;
+	heap32[(r20+9)] = 0;
+	heap32[(r20+10)] = 0;
+	heap32[(r20+11)] = 0;
+	heap32[(r20+12)] = 1065353216;
+	heap32[(r20+13)] = 0;
+	heap32[(r20+14)] = 0;
+	heap32[(r20+15)] = 0;
+	heap32[(r20+16)] = 0;
+	heap32[(r20+17)] = 0;
+	heap32[(g0)] = r19;
+	heap32[(g0+1)] = r21;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	heap8[r18] = r22;
+}
+	r18 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r19 = r18 >> 2;
+	r20 = heap32[(r19+51)];
+	r20 = r20 | 1;
+	heap32[(r19+51)] = r20;
+	heap32[(r19+84)] = 0;
+	f0 =                         0;
+	f1 = heapFloat[(r19+95)];
+	f2 = heapFloat[(r19+94)];
+	f3 = heapFloat[(r19+93)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r19+89)] = f3;
+	f1 = f1*f0;
+	heapFloat[(r19+90)] = f2;
+	heapFloat[(r19+91)] = f1;
+	heap32[(r19+92)] = 0;
+	heap32[(r19+97)] = 0;
+	heap32[(r19+98)] = 0;
+	heap32[(r19+99)] = 0;
+	heap32[(r19+100)] = 0;
+	f1 = heapFloat[(r19+87)];
+	f2 = heapFloat[(r19+86)];
+	f3 = heapFloat[(r19+85)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r19+138)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r19+139)] = f2;
+	heapFloat[(r19+140)] = f0;
+	heap32[(r19+141)] = 0;
+}
+else{
+	r18 = r15;
+}
+	heap32[(r17+27)] = r18;
+	r18 = r1 >> 2;
+	heap32[(r17+28)] = r10;
+	r19 = r3 >> 2;
+	r20 = heap32[(r19+58)];
+	r21 = heap32[(r18+58)];
+	f0 = heapFloat[(r9+15)];
+	f1 = heapFloat[(r19+15)];
+	f2 = heapFloat[(r9+14)];
+	f3 = heapFloat[(r19+14)];
+	f4 = heapFloat[(r9+13)];
+	f5 = heapFloat[(r19+13)];
+	r19 = sp + -296;
+	f4 = f4-f5;
+	f2 = f2-f3;
+	r22 = r19 >> 2;
+	heapFloat[(fp+-74)] = f4;
+	f0 = f0-f1;
+	heapFloat[(r22+1)] = f2;
+	heapFloat[(r22+2)] = f0;
+	heap32[(r22+3)] = 0;
+	f1 = heapFloat[(r9+11)];
+	f3 = heapFloat[(r18+15)];
+	f5 = heapFloat[(r9+10)];
+	f6 = heapFloat[(r18+14)];
+	f7 = heapFloat[(r9+9)];
+	f8 = heapFloat[(r18+13)];
+	r18 = sp + -312;
+	f7 = f7-f8;
+	f5 = f5-f6;
+	r22 = r18 >> 2;
+	heapFloat[(fp+-78)] = f7;
+	f1 = f1-f3;
+	heapFloat[(r22+1)] = f5;
+	heapFloat[(r22+2)] = f1;
+	r23 = r8 >> 2;
+	heap32[(r22+3)] = 0;
+	r22 = r8 >> 2;
+	r24 = r8 >> 2;
+	r20 = r20 & 2;
+	r21 = r21 & 2;
+	r20 = r20 == 0 ? r16 : r3;
+	r16 = r21 == 0 ? r16 : r1;
+	if(r20 ==0) //_LBB612_140
+{
+	heap32[(r17+12)] = 0;
+	heap32[(r17+13)] = 0;
+	f3 =                         0;
+	heap32[(r17+14)] = 0;
+	heap32[(r17+15)] = 0;
+	f6 = f3;
+	f8 = f3;
+}
+else{
+	f3 = heapFloat[(r23+17)];
+	f6 = heapFloat[(r22+19)];
+	f8 = heapFloat[(r24+18)];
+	f9 = f4*f8;
+	f10 = f2*f3;
+	f3 = f0*f3;
+	f11 = f4*f6;
+	f6 = f2*f6;
+	f8 = f0*f8;
+	f9 = f9-f10;
+	f3 = f3-f11;
+	f6 = f6-f8;
+	r21 = r20 >> 2;
+	f8 = heapFloat[(r21+64)];
+	f10 = heapFloat[(r21+65)];
+	f11 = heapFloat[(r21+68)];
+	f12 = heapFloat[(r21+69)];
+	f8 = f8*f6;
+	f10 = f10*f3;
+	f13 = heapFloat[(r21+66)];
+	f14 = heapFloat[(r21+72)];
+	f15 = heapFloat[(r21+73)];
+	f16 = heapFloat[(r21+70)];
+	f11 = f11*f6;
+	f12 = f12*f3;
+	f8 = f8+f10;
+	f10 = f13*f9;
+	f13 = heapFloat[(r21+74)];
+	f6 = f14*f6;
+	f3 = f15*f3;
+	f11 = f11+f12;
+	f12 = f16*f9;
+	f8 = f8+f10;
+	f10 = heapFloat[(r21+134)];
+	f14 = heapFloat[(r21+136)];
+	f15 = heapFloat[(r21+135)];
+	f11 = f11+f12;
+	f8 = f8*f10;
+	f3 = f6+f3;
+	f6 = f13*f9;
+	f3 = f3+f6;
+	f6 = f11*f15;
+	heapFloat[(r17+12)] = f8;
+	f3 = f3*f14;
+	heapFloat[(r17+13)] = f6;
+	heapFloat[(r17+14)] = f3;
+	heap32[(r17+15)] = 0;
+}
+	if(r16 ==0) //_LBB612_143
+{
+	heap32[(r17+16)] = 0;
+	heap32[(r17+17)] = 0;
+	f10 =                         0;
+	heap32[(r17+18)] = 0;
+	heap32[(r17+19)] = 0;
+	f11 = f10;
+	f9 = f10;
+}
+else{
+	f9 = heapFloat[(r24+18)];
+	f10 = heapFloat[(r23+17)];
+	f11 = heapFloat[(r22+19)];
+	f12 = f5*f11;
+	f13 = f1*f9;
+	r21 = r16 >> 2;
+	f12 = f12-f13;
+	f13 = f1*f10;
+	f11 = f7*f11;
+	f12 = -f12;
+	f14 = heapFloat[(r21+64)];
+	f11 = f13-f11;
+	f13 = heapFloat[(r21+65)];
+	f9 = f7*f9;
+	f10 = f5*f10;
+	f15 = heapFloat[(r21+68)];
+	f16 = heapFloat[(r21+69)];
+	f14 = f14*f12;
+	f13 = f13*f11;
+	f9 = f9-f10;
+	f10 = heapFloat[(r21+66)];
+	f17 = heapFloat[(r21+72)];
+	f18 = heapFloat[(r21+73)];
+	f19 = heapFloat[(r21+70)];
+	f15 = f15*f12;
+	f16 = f16*f11;
+	f13 = f14-f13;
+	f10 = f10*f9;
+	f14 = heapFloat[(r21+74)];
+	f12 = f17*f12;
+	f11 = f18*f11;
+	f15 = f15-f16;
+	f16 = f19*f9;
+	f10 = f13-f10;
+	f13 = heapFloat[(r21+134)];
+	f17 = heapFloat[(r21+136)];
+	f18 = heapFloat[(r21+135)];
+	f15 = f15-f16;
+	f10 = f10*f13;
+	f11 = f12-f11;
+	f9 = f14*f9;
+	f9 = f11-f9;
+	f11 = f15*f18;
+	heapFloat[(r17+16)] = f10;
+	f9 = f9*f17;
+	heapFloat[(r17+17)] = f11;
+	heapFloat[(r17+18)] = f9;
+	heap32[(r17+19)] = 0;
+}
+	if(r20 !=0) //_LBB612_146
+{
+	f12 = f6*f0;
+	f13 = f3*f2;
+	f3 = f3*f4;
+	f14 = f8*f0;
+	f15 = heapFloat[(r23+17)];
+	f12 = f12-f13;
+	f13 = heapFloat[(r24+18)];
+	f3 = f3-f14;
+	f8 = f8*f2;
+	f6 = f6*f4;
+	f12 = f15*f12;
+	f3 = f13*f3;
+	f13 = heapFloat[(r22+19)];
+	f6 = f8-f6;
+	r21 = r20 >> 2;
+	f3 = f12+f3;
+	f6 = f13*f6;
+	f8 = heapFloat[(r21+84)];
+	f3 = f3+f6;
+	f3 = f8+f3;
+}
+else{
+	f3 =                         0;
+}
+	if(r16 !=0) //_LBB612_149
+{
+	f6 = f5*f9;
+	f8 = f1*f11;
+	f12 = f1*f10;
+	f9 = f7*f9;
+	f13 = heapFloat[(r23+17)];
+	f6 = f6-f8;
+	f8 = heapFloat[(r24+18)];
+	f9 = f12-f9;
+	f11 = f7*f11;
+	f10 = f5*f10;
+	f6 = f13*f6;
+	f9 = f8*f9;
+	f8 = heapFloat[(r22+19)];
+	f10 = f11-f10;
+	r21 = r16 >> 2;
+	f9 = f6+f9;
+	f6 = f8*f10;
+	f8 = heapFloat[(r21+84)];
+	f9 = f9+f6;
+	f9 = f8+f9;
+}
+else{
+	f9 =                         0;
+}
+	f6 =                         1;
+	f3 = f3+f9;
+	f3 = f6/f3;
+	heapFloat[(r17+23)] = f3;
+	f3 = heapFloat[(r23+17)];
+	heapFloat[(r17+4)] = f3;
+	f8 = heapFloat[(r24+18)];
+	heapFloat[(r17+5)] = f8;
+	f9 = heapFloat[(r22+19)];
+	heapFloat[(r17+6)] = f9;
+	heap32[(r17+7)] = heap32[(r9+20)];
+	f10 = heapFloat[(r22+19)];
+	f11 = heapFloat[(r24+18)];
+	f12 = heapFloat[(r23+17)];
+	f13 = f2*f10;
+	f14 = f0*f11;
+	f15 = f0*f12;
+	f10 = f4*f10;
+	f13 = f13-f14;
+	f11 = f4*f11;
+	f12 = f2*f12;
+	f10 = f15-f10;
+	heapFloat[(r17)] = f13;
+	f11 = f11-f12;
+	heapFloat[(r17+1)] = f10;
+	heapFloat[(r17+2)] = f11;
+	heap32[(r17+3)] = 0;
+	f10 = heapFloat[(r24+18)];
+	f11 = heapFloat[(r22+19)];
+	f12 = heapFloat[(r23+17)];
+	f13 = f1*f10;
+	f14 = f5*f11;
+	f11 = f7*f11;
+	f15 = f1*f12;
+	f13 = f13-f14;
+	f12 = f5*f12;
+	f10 = f7*f10;
+	f11 = f11-f15;
+	heapFloat[(r17+8)] = f13;
+	f10 = f12-f10;
+	heapFloat[(r17+9)] = f11;
+	heapFloat[(r17+10)] = f10;
+	heap32[(r17+11)] = 0;
+	if(r20 !=0) //_LBB612_152
+{
+	r21 = r20 >> 2;
+	f10 = heapFloat[(r21+81)];
+	f11 = heapFloat[(r21+80)];
+	f12 = heapFloat[(r21+82)];
+	f13 = f11*f2;
+	f14 = f10*f4;
+	f4 = f12*f4;
+	f11 = f11*f0;
+	f0 = f10*f0;
+	f2 = f12*f2;
+	f10 = heapFloat[(r21+78)];
+	f12 = f13-f14;
+	f13 = heapFloat[(r21+77)];
+	f11 = f4-f11;
+	f14 = heapFloat[(r21+76)];
+	f0 = f0-f2;
+	f4 = f10+f12;
+	f2 = f13+f11;
+	f0 = f14+f0;
+}
+else{
+	f0 =                         0;
+	f2 = f0;
+	f4 = f0;
+}
+	if(r16 !=0) //_LBB612_155
+{
+	r21 = r16 >> 2;
+	f10 = heapFloat[(r21+81)];
+	f11 = heapFloat[(r21+80)];
+	f12 = heapFloat[(r21+82)];
+	f13 = f11*f5;
+	f14 = f10*f7;
+	f7 = f12*f7;
+	f11 = f11*f1;
+	f1 = f10*f1;
+	f5 = f12*f5;
+	f10 = heapFloat[(r21+78)];
+	f12 = f13-f14;
+	f13 = heapFloat[(r21+77)];
+	f11 = f7-f11;
+	f14 = heapFloat[(r21+76)];
+	f1 = f1-f5;
+	f7 = f10+f12;
+	f5 = f13+f11;
+	f1 = f14+f1;
+}
+else{
+	f1 =                         0;
+	f5 = f1;
+	f7 = f1;
+}
+	f0 = f0-f1;
+	f1 = f2-f5;
+	f2 = heapFloat[(r23+17)];
+	f5 = heapFloat[(r24+18)];
+	f4 = f4-f7;
+	f7 = heapFloat[(r22+19)];
+	f2 = f2*f0;
+	f5 = f5*f1;
+	f2 = f2+f5;
+	f5 = f7*f4;
+	f7 = heapFloat[(r9+21)];
+	f10 = heapFloat[(r6+13)];
+	f2 = f2+f5;
+	f5 = f7+f10;
+	heap32[(r17+22)] = heap32[(r9+22)];
+	r21 = heap32[(r9+37)];
+	r25 = heap32[(r6+16)];
+	if(r21 >r25) //_LBB612_159
+{
+__label__ = 151;
+}
+else{
+	f7 = heapFloat[(r9+23)];
+	f10 = -f2;
+	f7 = f7*f10;
+	f10 =                         0;
+	if(f7 <=f10) //_LBB612_159
+{
+__label__ = 151;
+}
+else{
+__label__ = 152;
+}
+}
+if (__label__ == 151){
+	f7 =                         0;
+}
+	r21 = heapU8[r5+60];
+	r21 = r21 & 4;
+	if(r21 ==0) //_LBB612_167
+{
+	heap32[(r17+21)] = 0;
+}
+else{
+	f10 = heapFloat[(r9+29)];
+	f11 = heapFloat[(r6+14)];
+	f10 = f10*f11;
+	heapFloat[(r17+21)] = f10;
+if(!(r20 ==0)) //_LBB612_164
+{
+	r21 = r20 >> 2;
+	f11 = heapFloat[(r21+84)];
+	f12 =                         0;
+if(!(f11 ==f12)) //_LBB612_164
+{
+	f3 = f3*f11;
+	f12 = heapFloat[(r21+85)];
+	f3 = f3*f12;
+	f3 = f3*f10;
+	f12 = heapFloat[(r21+126)];
+	f13 = heapFloat[(r21+86)];
+	f14 = heapFloat[(r21+87)];
+	f8 = f8*f11;
+	f3 = f12+f3;
+	f8 = f8*f13;
+	heapFloat[(r21+126)] = f3;
+	f3 = f8*f10;
+	f8 = heapFloat[(r21+127)];
+	f9 = f9*f11;
+	f3 = f8+f3;
+	f8 = f9*f14;
+	heapFloat[(r21+127)] = f3;
+	f3 = f8*f10;
+	f8 = heapFloat[(r21+128)];
+	f3 = f8+f3;
+	heapFloat[(r21+128)] = f3;
+	f3 = heapFloat[(r21+134)];
+	f3 = f3*f10;
+	f8 = heapFloat[(r17+12)];
+	f9 = heapFloat[(r21+136)];
+	f11 = heapFloat[(r21+135)];
+	f3 = f8*f3;
+	f8 = heapFloat[(r21+130)];
+	f12 = heapFloat[(r17+14)];
+	f13 = heapFloat[(r17+13)];
+	f3 = f8+f3;
+	f8 = f11*f10;
+	heapFloat[(r21+130)] = f3;
+	f3 = f13*f8;
+	f8 = heapFloat[(r21+131)];
+	f3 = f8+f3;
+	f8 = f9*f10;
+	heapFloat[(r21+131)] = f3;
+	f3 = f12*f8;
+	f8 = heapFloat[(r21+132)];
+	f3 = f8+f3;
+	heapFloat[(r21+132)] = f3;
+}
+}
+if(!(r16 ==0)) //_LBB612_168
+{
+	r21 = r16 >> 2;
+	f3 = heapFloat[(r21+84)];
+	f8 =                         0;
+if(!(f3 ==f8)) //_LBB612_168
+{
+	f8 = heapFloat[(r17+21)];
+	f8 = -f8;
+	f9 = heapFloat[(r17+4)];
+	f9 = f9*f3;
+	f10 = heapFloat[(r21+85)];
+	f9 = f9*f10;
+	f10 = heapFloat[(r17+5)];
+	f11 = heapFloat[(r17+6)];
+	f9 = f9*f8;
+	f12 = heapFloat[(r21+126)];
+	f13 = heapFloat[(r21+86)];
+	f14 = heapFloat[(r21+87)];
+	f15 = heapFloat[(r17+16)];
+	f16 = heapFloat[(r17+17)];
+	f17 = heapFloat[(r17+18)];
+	f10 = f10*f3;
+	f9 = f12+f9;
+	f10 = f10*f13;
+	heapFloat[(r21+126)] = f9;
+	f9 = f10*f8;
+	f10 = heapFloat[(r21+127)];
+	f3 = f11*f3;
+	f9 = f10+f9;
+	f3 = f3*f14;
+	heapFloat[(r21+127)] = f9;
+	f3 = f3*f8;
+	f9 = heapFloat[(r21+128)];
+	f3 = f9+f3;
+	heapFloat[(r21+128)] = f3;
+	f3 = heapFloat[(r21+134)];
+	f3 = f3*f8;
+	f9 = heapFloat[(r21+136)];
+	f10 = heapFloat[(r21+135)];
+	f11 = heapFloat[(r21+130)];
+	f3 = f3*f15;
+	f3 = f11-f3;
+	f10 = f10*f8;
+	heapFloat[(r21+130)] = f3;
+	f3 = f10*f16;
+	f10 = heapFloat[(r21+131)];
+	f3 = f10-f3;
+	f8 = f9*f8;
+	heapFloat[(r21+131)] = f3;
+	f3 = f8*f17;
+	f8 = heapFloat[(r21+132)];
+	f3 = f8-f3;
+	heapFloat[(r21+132)] = f3;
+}
+}
+}
+	heap32[(r17+20)] = 0;
+	if(r20 !=0) //_LBB612_170
+{
+	r21 = r20 >> 2;
+	f9 = heapFloat[(r21+76)];
+	f8 = heapFloat[(r21+77)];
+	f3 = heapFloat[(r21+78)];
+}
+else{
+	f3 =                         0;
+	f8 = f3;
+	f9 = f3;
+}
+	f10 = heapFloat[(r17+4)];
+	f11 = heapFloat[(r17+5)];
+	f12 = heapFloat[(r17+6)];
+	f9 = f10*f9;
+	f8 = f11*f8;
+	f8 = f9+f8;
+	f3 = f12*f3;
+	f3 = f8+f3;
+	if(r20 !=0) //_LBB612_173
+{
+	r20 = r20 >> 2;
+	f13 = heapFloat[(r20+80)];
+	f9 = heapFloat[(r20+81)];
+	f8 = heapFloat[(r20+82)];
+}
+else{
+	f8 =                         0;
+	f9 = f8;
+	f13 = f8;
+}
+	f14 = heapFloat[(r17)];
+	f15 = heapFloat[(r17+1)];
+	f13 = f14*f13;
+	f9 = f15*f9;
+	f14 = heapFloat[(r17+2)];
+	f9 = f13+f9;
+	f8 = f14*f8;
+	f8 = f9+f8;
+	f3 = f3+f8;
+	if(r16 !=0) //_LBB612_176
+{
+	r20 = r16 >> 2;
+	f13 = heapFloat[(r20+80)];
+	f9 = heapFloat[(r20+81)];
+	f8 = heapFloat[(r20+82)];
+}
+else{
+	f8 =                         0;
+	f9 = f8;
+	f13 = f8;
+}
+	f14 = heapFloat[(r17+8)];
+	f15 = heapFloat[(r17+9)];
+	f13 = f14*f13;
+	f9 = f15*f9;
+	f14 = heapFloat[(r17+10)];
+	f9 = f13+f9;
+	f8 = f14*f8;
+	f8 = f9+f8;
+	if(r16 !=0) //_LBB612_179
+{
+	r16 = r16 >> 2;
+	f14 = heapFloat[(r16+76)];
+	f13 = heapFloat[(r16+77)];
+	f9 = heapFloat[(r16+78)];
+}
+else{
+	f9 =                         0;
+	f13 = f9;
+	f14 = f9;
+}
+	f10 = f10*f14;
+	f11 = f11*f13;
+	f10 = f10+f11;
+	f9 = f12*f9;
+	f9 = f10+f9;
+	f10 = heapFloat[(r6+8)];
+	f11 = -f5;
+	f8 = f8-f9;
+	f9 = f10*f11;
+	f10 = heapFloat[(r6+3)];
+	f3 = f3+f8;
+	f8 = f9/f10;
+	f9 = heapFloat[(r17+23)];
+	f3 = f7-f3;
+	f7 = f9*f8;
+	f3 = f9*f3;
+	r16 = heap32[(r6+11)];
+	if(r16 ==0) //_LBB612_182
+{
+__label__ = 174;
+}
+else{
+	f8 = heapFloat[(r6+12)];
+	if(f8 >=f5) //_LBB612_183
+{
+	heapFloat[(r17+29)] = f3;
+	heapFloat[(r17+33)] = f7;
+__label__ = 176;
+}
+else{
+__label__ = 174;
+}
+}
+if (__label__ == 174){
+	f3 = f7+f3;
+	heapFloat[(r17+29)] = f3;
+	heap32[(r17+33)] = 0;
+}
+	heap32[(r17+30)] = 0;
+	heap32[(r17+31)] = 0;
+	heap32[(r17+32)] = 1343554297;
+	r16 = heap32[(r2+12)];
+	heap32[(r17+25)] = r16;
+	r16 = heapU8[r5+60];
+	r16 = r16 & 32;
+	if(r16 ==0) //_LBB612_186
+{
+__label__ = 178;
+}
+else{
+	r16 = heapU8[r8+120];
+	if(r16 !=0) //_LBB612_200
+{
+	r16 = r8 >> 2;
+	f0 = heapFloat[(r9+35)];
+	f1 = heapFloat[(r16+33)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heapFloat[(g0+9)] = f1;
+	heapFloat[(g0+10)] = f0;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+	r12 = heapU8[r5+60];
+	r12 = r12 & 16;
+	if(r12 ==0) //_LBB612_202
+{
+__label__ = 194;
+}
+else{
+	r12 = r8 >> 2;
+	r8 = r8 >> 2;
+	f0 = heapFloat[(r12+36)];
+	f1 = heapFloat[(r8+34)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heapFloat[(g0+9)] = f1;
+	heapFloat[(g0+10)] = f0;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+__label__ = 194;
+}
+}
+else{
+__label__ = 178;
+}
+}
+_259: do {
+if (__label__ == 178){
+	f3 = heapFloat[(r23+17)];
+	f5 = heapFloat[(r22+19)];
+	f7 = heapFloat[(r24+18)];
+	f8 = f3*f2;
+	f0 = f0-f8;
+	f8 = f7*f2;
+	r16 = r8 >> 2;
+	f1 = f1-f8;
+	f2 = f5*f2;
+	r20 = r8 >> 2;
+	heapFloat[(r16+38)] = f0;
+	f2 = f4-f2;
+	r21 = r8 >> 2;
+	heapFloat[(r20+39)] = f1;
+	r25 = r8 >> 2;
+	heapFloat[(r21+40)] = f2;
+	heap32[(r25+41)] = 0;
+	r25 = heapU8[r5+60];
+	r25 = r25 & 64;
+if(!(r25 !=0)) //_LBB612_191
+{
+	f0 = f0*f0;
+	f1 = f1*f1;
+	f0 = f0+f1;
+	f1 = f2*f2;
+	f0 = f0+f1;
+	f1 =   1.1920928955078125e-007;
+if(!(f0 <=f1)) //_LBB612_191
+{
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f3 = f6/f_g0;
+	f5 = heapFloat[(r16+38)];
+	f5 = f5*f3;
+	heapFloat[(r16+38)] = f5;
+	f7 = heapFloat[(r20+39)];
+	f7 = f7*f3;
+	heapFloat[(r20+39)] = f7;
+	f0 = heapFloat[(r21+40)];
+	f3 = f0*f3;
+	heapFloat[(r21+40)] = f3;
+	r16 = heapU8[r5+60];
+	r16 = r16 & 16;
+if(!(r16 ==0)) //_LBB612_190
+{
+	f0 = heapFloat[(r22+19)];
+	f1 = heapFloat[(r24+18)];
+	f2 = heapFloat[(r23+17)];
+	f4 = f7*f0;
+	f8 = f3*f1;
+	f4 = f4-f8;
+	f3 = f3*f2;
+	f0 = f5*f0;
+	r16 = r8 >> 2;
+	f3 = f3-f0;
+	f5 = f5*f1;
+	f7 = f7*f2;
+	r20 = r8 >> 2;
+	heapFloat[(r16+42)] = f4;
+	f5 = f5-f7;
+	r21 = r8 >> 2;
+	heapFloat[(r20+43)] = f3;
+	f7 = f4*f4;
+	f3 = f3*f3;
+	r22 = r8 >> 2;
+	heapFloat[(r21+44)] = f5;
+	heap32[(r22+45)] = 0;
+	f3 = f7+f3;
+	f5 = f5*f5;
+	f3 = f3+f5;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f3 = f6/f_g0;
+	f5 = heapFloat[(r16+42)];
+	f5 = f5*f3;
+	heapFloat[(r16+42)] = f5;
+	f5 = heapFloat[(r20+43)];
+	f5 = f5*f3;
+	heapFloat[(r20+43)] = f5;
+	f5 = heapFloat[(r21+44)];
+	f3 = f5*f3;
+	heapFloat[(r21+44)] = f3;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r11;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r11;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 0;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+}
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r12;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r12;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 0;
+	r10 = 1;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+	heap8[r8+120] = r10;
+break _259;
+}
+}
+	f0 =                         0;
+	if(f5 <f0) //_LBB612_193
+{
+	f0 = -f5;
+}
+else{
+	f0 = f5;
+}
+	f1 =       0.70710676908493042;
+	if(f0 <=f1) //_LBB612_196
+{
+	f3 = f3*f3;
+	f0 = f7*f7;
+	f3 = f3+f0;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	f1 = heapFloat[(r24+18)];
+	f0 = f6/f_g0;
+	f1 = -f1;
+	f1 = f0*f1;
+	heapFloat[(r16+38)] = f1;
+	f2 = heapFloat[(r23+17)];
+	f2 = f2*f0;
+	heapFloat[(r20+39)] = f2;
+	heap32[(r21+40)] = 0;
+	f4 = heapFloat[(r22+19)];
+	f5 = -f4;
+	r16 = r8 >> 2;
+	f2 = f2*f5;
+	f3 = f3*f0;
+	r20 = r8 >> 2;
+	f0 = f4*f1;
+	heapFloat[(r16+42)] = f2;
+	heapFloat[(r20+43)] = f0;
+}
+else{
+	f3 = f7*f7;
+	f7 = f5*f5;
+	f3 = f3+f7;
+	heapFloat[(g0)] = f3;
+	sqrtf(i7);
+	heap32[(r16+38)] = 0;
+	f0 = heapFloat[(r22+19)];
+	f6 = f6/f_g0;
+	f7 = -f0;
+	f7 = f6*f7;
+	heapFloat[(r20+39)] = f7;
+	f0 = heapFloat[(r24+18)];
+	f0 = f0*f6;
+	r16 = r8 >> 2;
+	f3 = f3*f6;
+	heapFloat[(r21+40)] = f0;
+	heapFloat[(r16+42)] = f3;
+	f3 = heapFloat[(r23+17)];
+	f6 = -f3;
+	f3 = f3*f7;
+	r16 = r8 >> 2;
+	f6 = f0*f6;
+	heapFloat[(r16+43)] = f6;
+}
+	r16 = r8 >> 2;
+	heapFloat[(r16+44)] = f3;
+	r16 = heapU8[r5+60];
+	r16 = r16 & 16;
+if(!(r16 ==0)) //_LBB612_199
+{
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r11;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r11;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 0;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+}
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r12;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r12;
+	_Z24applyAnisotropicFrictionP17btCollisionObjectR9btVector3(i7);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r14;
+	heap32[(g0+3)] = r10;
+	heap32[(g0+4)] = r19;
+	heap32[(g0+5)] = r18;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = 1065353216;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 0;
+	r10 = 1;
+	_ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(i7);
+	heap8[r8+120] = r10;
+}
+} while(0);
+	r8 = heap32[(r6+15)];
+	r10 = heap32[(r17+25)];
+	r11 = heap32[(r2+14)];
+	r12 = r8 & 8;
+	if(r12 ==0) //_LBB612_220
+{
+	r8 = (r10 * 136)|0;
+	r8 = (r11 + r8)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+21)] = 0;
+	r8 = heapU8[r5+60];
+	r8 = r8 & 16;
+	if(r8 ==0) //_LBB612_222
+{
+break _153;
+}
+else{
+	r8 = heap32[(r17+25)];
+	r9 = heap32[(r2+14)];
+	r8 = (r8 * 136)|0;
+	r8 = (r8 + r9)|0;
+	r8 = r8 >> 2;
+	heap32[(r8+55)] = 0;
+}
+}
+else{
+	r8 = r8 & 4;
+	if(r8 ==0) //_LBB612_210
+{
+	r10 = (r10 * 136)|0;
+	r10 = (r11 + r10)|0;
+	r10 = r10 >> 2;
+	heap32[(r10+21)] = 0;
+}
+else{
+	r10 = (r10 * 136)|0;
+	r10 = (r11 + r10)|0;
+	f0 = heapFloat[(r9+31)];
+	f1 = heapFloat[(r6+14)];
+	f0 = f0*f1;
+	r10 = r10 >> 2;
+	heapFloat[(r10+21)] = f0;
+if(!(r13 ==0)) //_LBB612_207
+{
+	r11 = r13 >> 2;
+	f1 = heapFloat[(r11+84)];
+	f2 =                         0;
+if(!(f1 ==f2)) //_LBB612_207
+{
+	f2 = heapFloat[(r10+4)];
+	f2 = f2*f1;
+	f3 = heapFloat[(r11+85)];
+	f2 = f2*f3;
+	f3 = heapFloat[(r10+5)];
+	f4 = heapFloat[(r10+6)];
+	f2 = f2*f0;
+	f5 = heapFloat[(r11+126)];
+	f6 = heapFloat[(r11+86)];
+	f7 = heapFloat[(r11+87)];
+	f3 = f3*f1;
+	f2 = f5+f2;
+	f3 = f3*f6;
+	heapFloat[(r11+126)] = f2;
+	f2 = f3*f0;
+	f3 = heapFloat[(r11+127)];
+	f1 = f4*f1;
+	f2 = f3+f2;
+	f1 = f1*f7;
+	heapFloat[(r11+127)] = f2;
+	f1 = f1*f0;
+	f2 = heapFloat[(r11+128)];
+	f1 = f2+f1;
+	heapFloat[(r11+128)] = f1;
+	f1 = heapFloat[(r11+134)];
+	f1 = f1*f0;
+	f2 = heapFloat[(r10+12)];
+	f3 = heapFloat[(r11+136)];
+	f4 = heapFloat[(r11+135)];
+	f1 = f2*f1;
+	f2 = heapFloat[(r11+130)];
+	f5 = heapFloat[(r10+14)];
+	f6 = heapFloat[(r10+13)];
+	f1 = f2+f1;
+	f2 = f4*f0;
+	heapFloat[(r11+130)] = f1;
+	f1 = f6*f2;
+	f2 = heapFloat[(r11+131)];
+	f1 = f2+f1;
+	f0 = f3*f0;
+	heapFloat[(r11+131)] = f1;
+	f0 = f5*f0;
+	f1 = heapFloat[(r11+132)];
+	f0 = f1+f0;
+	heapFloat[(r11+132)] = f0;
+}
+}
+if(!(r15 ==0)) //_LBB612_211
+{
+	r11 = r15 >> 2;
+	f0 = heapFloat[(r11+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB612_211
+{
+	f1 = heapFloat[(r10+21)];
+	f1 = -f1;
+	f2 = heapFloat[(r10+4)];
+	f2 = f2*f0;
+	f3 = heapFloat[(r11+85)];
+	f2 = f2*f3;
+	f3 = heapFloat[(r10+5)];
+	f4 = heapFloat[(r10+6)];
+	f2 = f2*f1;
+	f5 = heapFloat[(r11+126)];
+	f6 = heapFloat[(r11+86)];
+	f7 = heapFloat[(r11+87)];
+	f8 = heapFloat[(r10+16)];
+	f9 = heapFloat[(r10+17)];
+	f10 = heapFloat[(r10+18)];
+	f3 = f3*f0;
+	f2 = f5+f2;
+	f3 = f3*f6;
+	heapFloat[(r11+126)] = f2;
+	f2 = f3*f1;
+	f3 = heapFloat[(r11+127)];
+	f0 = f4*f0;
+	f2 = f3+f2;
+	f0 = f0*f7;
+	heapFloat[(r11+127)] = f2;
+	f0 = f0*f1;
+	f2 = heapFloat[(r11+128)];
+	f0 = f2+f0;
+	heapFloat[(r11+128)] = f0;
+	f0 = heapFloat[(r11+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r11+136)];
+	f3 = heapFloat[(r11+135)];
+	f4 = heapFloat[(r11+130)];
+	f0 = f0*f8;
+	f0 = f4-f0;
+	f3 = f3*f1;
+	heapFloat[(r11+130)] = f0;
+	f0 = f3*f9;
+	f3 = heapFloat[(r11+131)];
+	f0 = f3-f0;
+	f1 = f2*f1;
+	heapFloat[(r11+131)] = f0;
+	f0 = f1*f10;
+	f1 = heapFloat[(r11+132)];
+	f0 = f1-f0;
+	heapFloat[(r11+132)] = f0;
+}
+}
+}
+	r10 = heap32[(r6+15)];
+	r11 = r10 & 16;
+if(!(r11 ==0)) //_LBB612_222
+{
+	r11 = heap32[(r17+25)];
+	r17 = heap32[(r2+14)];
+	r10 = r10 & 4;
+	if(r10 ==0) //_LBB612_219
+{
+	r10 = (r11 * 136)|0;
+	r10 = (r17 + r10)|0;
+	r10 = r10 >> 2;
+	heap32[(r10+55)] = 0;
+}
+else{
+	r11 = (r11 * 136)|0;
+	r11 = (r17 + r11)|0;
+	f0 = heapFloat[(r9+32)];
+	f1 = heapFloat[(r6+14)];
+	f0 = f0*f1;
+	r11 = r11 >> 2;
+	heapFloat[(r11+55)] = f0;
+if(!(r13 ==0)) //_LBB612_216
+{
+	r17 = r13 >> 2;
+	f1 = heapFloat[(r17+84)];
+	f2 =                         0;
+if(!(f1 ==f2)) //_LBB612_216
+{
+	f2 = heapFloat[(r11+38)];
+	f2 = f2*f1;
+	f3 = heapFloat[(r11+39)];
+	f4 = heapFloat[(r11+40)];
+	f5 = heapFloat[(r17+126)];
+	f2 = f2*f0;
+	f2 = f5+f2;
+	f3 = f3*f1;
+	heapFloat[(r17+126)] = f2;
+	f2 = f3*f0;
+	f3 = heapFloat[(r17+127)];
+	f2 = f3+f2;
+	f1 = f4*f1;
+	heapFloat[(r17+127)] = f2;
+	f1 = f1*f0;
+	f2 = heapFloat[(r17+128)];
+	f1 = f2+f1;
+	heapFloat[(r17+128)] = f1;
+	f1 = heapFloat[(r17+134)];
+	f1 = f1*f0;
+	f2 = heapFloat[(r11+46)];
+	f3 = heapFloat[(r17+136)];
+	f4 = heapFloat[(r17+135)];
+	f1 = f2*f1;
+	f2 = heapFloat[(r17+130)];
+	f5 = heapFloat[(r11+48)];
+	f6 = heapFloat[(r11+47)];
+	f1 = f2+f1;
+	f2 = f4*f0;
+	heapFloat[(r17+130)] = f1;
+	f1 = f6*f2;
+	f2 = heapFloat[(r17+131)];
+	f1 = f2+f1;
+	f0 = f3*f0;
+	heapFloat[(r17+131)] = f1;
+	f0 = f5*f0;
+	f1 = heapFloat[(r17+132)];
+	f0 = f1+f0;
+	heapFloat[(r17+132)] = f0;
+}
+}
+if(!(r15 ==0)) //_LBB612_222
+{
+	r17 = r15 >> 2;
+	f0 = heapFloat[(r17+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB612_222
+{
+	f1 = heapFloat[(r11+55)];
+	f1 = -f1;
+	f2 = heapFloat[(r11+38)];
+	f2 = f2*f0;
+	f3 = heapFloat[(r11+39)];
+	f4 = heapFloat[(r11+40)];
+	f2 = f2*f1;
+	f5 = heapFloat[(r17+126)];
+	f6 = heapFloat[(r11+50)];
+	f7 = heapFloat[(r11+51)];
+	f8 = heapFloat[(r11+52)];
+	f2 = f5+f2;
+	f3 = f3*f0;
+	heapFloat[(r17+126)] = f2;
+	f2 = f3*f1;
+	f3 = heapFloat[(r17+127)];
+	f2 = f3+f2;
+	f0 = f4*f0;
+	heapFloat[(r17+127)] = f2;
+	f0 = f0*f1;
+	f2 = heapFloat[(r17+128)];
+	f0 = f2+f0;
+	heapFloat[(r17+128)] = f0;
+	f0 = heapFloat[(r17+134)];
+	f0 = f0*f1;
+	f2 = heapFloat[(r17+136)];
+	f3 = heapFloat[(r17+135)];
+	f4 = heapFloat[(r17+130)];
+	f0 = f0*f6;
+	f0 = f4-f0;
+	f3 = f3*f1;
+	heapFloat[(r17+130)] = f0;
+	f0 = f3*f7;
+	f3 = heapFloat[(r17+131)];
+	f0 = f3-f0;
+	f1 = f2*f1;
+	heapFloat[(r17+131)] = f0;
+	f0 = f1*f8;
+	f1 = heapFloat[(r17+132)];
+	f0 = f1-f0;
+	heapFloat[(r17+132)] = f0;
+}
+}
+}
+}
+}
+}
+} while(0);
+	r7 = (r7 + 1)|0;
+	r4 = (r4 + 276)|0;
+}
+else{
+break _150;
+}
+}
+}
+	r1 = heap32[(fp+-133)];
+	r1 = (r1 + -1)|0;
+	heap32[(fp+-133)] = r1;
+	r3 = heap32[(fp+-132)];
+	r3 = (r3 + 4)|0;
+	heap32[(fp+-132)] = r3;
+if(!(r1 !=0)) //_LBB612_97
+{
+break _132;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r2+17)];
+	r3 = heap32[(r2+2)];
+	r4 = heap32[(r2+12)];
+_307: do {
+if(!(r1 >r3)) //_LBB612_244
+{
+if(!(r1 >=r3)) //_LBB612_244
+{
+	r5 = heap32[(r2+18)];
+if(!(r5 >=r3)) //_LBB612_243
+{
+	if(r3 !=0) //_LBB612_230
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r7 = r3 << 2;
+	r6 = (r6 + 1)|0;
+	r7 = r7 | 3;
+	heap32[(r5)] = r6;
+	r5 = (r7 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB612_232
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+}
+else{
+	r5 = 0;
+}
+	r6 = (r0 + 76)|0;
+	if(r1 <1) //_LBB612_235
+{
+	r7 = r6 >> 2;
+	r8 = heap32[(r7)];
+}
+else{
+	r7 = 0;
+_320: while(true){
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r7 << 2;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r5 + r9)|0;
+	r10 = heap32[(r10)];
+	r7 = (r7 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r10;
+if(!(r1 !=r7)) //_LBB612_236
+{
+break _320;
+}
+}
+	r6 = (r0 + 76)|0;
+}
+if(!(r8 ==0)) //_LBB612_242
+{
+	r7 = heapU8[r0+80];
+if(!(r7 ==0)) //_LBB612_241
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r9 = heap32[(r7)];
+	r9 = (r9 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r7)] = r9;
+	r7 = heap32[(r8+-1)];
+	heap32[(g0)] = r7;
+	free(i7);
+}
+	r7 = r6 >> 2;
+	heap32[(r7)] = 0;
+}
+	r7 = 1;
+	r6 = r6 >> 2;
+	heap8[r0+80] = r7;
+	heap32[(r6)] = r5;
+	heap32[(r2+18)] = r3;
+	if(r1 >=r3) //_LBB612_244
+{
+break _307;
+}
+}
+_330: while(true){
+	r5 = r1 << 2;
+	r6 = heap32[(r2+19)];
+	r5 = (r6 + r5)|0;
+	r1 = (r1 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r5)] = 0;
+if(!(r3 !=r1)) //_LBB612_243
+{
+break _307;
+}
+}
+}
+}
+} while(0);
+	heap32[(r2+17)] = r3;
+	r1 = heap32[(r2+22)];
+_333: do {
+if(!(r1 >r4)) //_LBB612_263
+{
+if(!(r1 >=r4)) //_LBB612_263
+{
+	r5 = heap32[(r2+23)];
+if(!(r5 >=r4)) //_LBB612_262
+{
+	if(r4 !=0) //_LBB612_249
+{
+	r5 = gNumAlignedAllocs;
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r7 = r4 << 2;
+	r6 = (r6 + 1)|0;
+	r7 = r7 | 3;
+	heap32[(r5)] = r6;
+	r5 = (r7 + 16)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB612_251
+{
+	r6 = 0;
+	r7 = (r5 + 4)|0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 & 15;
+	r6 = (r5 + r6)|0;
+	r7 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r5;
+	r5 = r7;
+}
+}
+else{
+	r5 = 0;
+}
+	r6 = (r0 + 96)|0;
+	if(r1 <1) //_LBB612_254
+{
+	r7 = r6 >> 2;
+	r8 = heap32[(r7)];
+}
+else{
+	r7 = 0;
+_346: while(true){
+	r8 = r6 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r7 << 2;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r5 + r9)|0;
+	r10 = heap32[(r10)];
+	r7 = (r7 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r10;
+if(!(r1 !=r7)) //_LBB612_255
+{
+break _346;
+}
+}
+	r6 = (r0 + 96)|0;
+}
+if(!(r8 ==0)) //_LBB612_261
+{
+	r7 = heapU8[r0+100];
+if(!(r7 ==0)) //_LBB612_260
+{
+	r7 = gNumAlignedFree;
+	r7 = r7 >> 2;
+	r9 = heap32[(r7)];
+	r9 = (r9 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r7)] = r9;
+	r7 = heap32[(r8+-1)];
+	heap32[(g0)] = r7;
+	free(i7);
+}
+	r7 = r6 >> 2;
+	heap32[(r7)] = 0;
+}
+	r7 = 1;
+	r6 = r6 >> 2;
+	heap8[r0+100] = r7;
+	heap32[(r6)] = r5;
+	heap32[(r2+23)] = r4;
+	if(r1 >=r4) //_LBB612_263
+{
+break _333;
+}
+}
+_356: while(true){
+	r0 = r1 << 2;
+	r5 = heap32[(r2+24)];
+	r0 = (r5 + r0)|0;
+	r1 = (r1 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+if(!(r4 !=r1)) //_LBB612_262
+{
+break _333;
+}
+}
+}
+}
+} while(0);
+	heap32[(r2+22)] = r4;
+_359: do {
+if(!(r3 <1)) //_LBB612_266
+{
+	r0 = 0;
+_361: while(true){
+	r1 = r0 << 2;
+	r5 = heap32[(r2+19)];
+	r1 = (r5 + r1)|0;
+	r5 = (r0 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	r0 = r5;
+if(!(r3 !=r5)) //_LBB612_265
+{
+break _359;
+}
+}
+}
+} while(0);
+	if(r4 <1) //_LBB612_269
+{
+break _1;
+}
+else{
+	r0 = 0;
+_365: while(true){
+	r1 = r0 << 2;
+	r3 = heap32[(r2+24)];
+	r1 = (r3 + r1)|0;
+	r3 = (r0 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	r0 = r3;
+if(!(r4 !=r3)) //_LBB612_268
+{
+break _1;
+}
+}
+}
+break;
+case 78:
+	r8 = _2E_str1157;
+	r0 = _2E_str652;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 813;
+	_assert(i7);
+break;
+}
+}
+} while(0);
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_369: do {
+if(!(r3 !=0)) //_LBB612_275
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB612_272
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB612_275
+{
+break _369;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver33solveGroupCacheFriendlyIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = _2E_str854;
+	r1 = heap32[(fp+7)];
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp)];
+	r2 = heap32[(fp+5)];
+	r3 = heap32[(fp+6)];
+	r4 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r5 = heap32[(r4+5)];
+if(!(r5 <1)) //_LBB613_64
+{
+	r5 = 0;
+_3: while(true){
+	r6 = r0 >> 2;
+	r7 = heap32[(r4+15)];
+	r8 = r7 & 1;
+	if(r8 != 0) //_LBB613_4
+{
+	r8 = r5 & 7;
+if(!(r8 !=0)) //_LBB613_3
+{
+	r7 = heap32[(r6+2)];
+	r8 = heap32[(r6+12)];
+if(!(r7 <1)) //_LBB613_19
+{
+	r9 = 0;
+	r7 = (r9 - r7)|0;
+	r9 = 1;
+_10: while(true){
+	r10 = heap32[(r6+19)];
+	r11 = r9 << 2;
+	r11 = (r10 + r11)|0;
+	r11 = r11 >> 2;
+	r12 = heap32[(r6+31)];
+	r13 = heap32[(r11+-1)];
+	r12 = (r12 * 1664525)|0;
+	r12 = (r12 + 1013904223)|0;
+	heap32[(r6+31)] = r12;
+	if(uint(r9) <uint(65537)) //_LBB613_9
+{
+	r14 = r12 >>> 16;
+	r12 = r14 ^ r12;
+	if(uint(r9) <uint(257)) //_LBB613_11
+{
+	r14 = r12 >>> 8;
+	r12 = r14 ^ r12;
+	if(uint(r9) <uint(17)) //_LBB613_13
+{
+	r14 = r12 >>> 4;
+	r12 = r14 ^ r12;
+	if(uint(r9) <uint(5)) //_LBB613_15
+{
+	r14 = r12 >>> 2;
+	r12 = r14 ^ r12;
+	if(uint(r9) <uint(3)) //_LBB613_17
+{
+	r14 = r12 >>> 1;
+	r12 = r14 ^ r12;
+}
+}
+}
+}
+}
+	r12 = Math.floor(uint(r12) % uint(r9));
+	r12 = r12 << 2;
+	r10 = (r10 + r12)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+	heap32[(r11+-1)] = r10;
+	r10 = heap32[(r6+19)];
+	r10 = (r10 + r12)|0;
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r13;
+	r10 = (r7 + r9)|0;
+if(!(r10 !=1)) //_LBB613_7
+{
+break _10;
+}
+}
+}
+_20: do {
+if(!(r8 <1)) //_LBB613_33
+{
+	r7 = 0;
+	r7 = (r7 - r8)|0;
+	r8 = 1;
+_22: while(true){
+	r9 = heap32[(r6+24)];
+	r10 = r8 << 2;
+	r10 = (r9 + r10)|0;
+	r10 = r10 >> 2;
+	r11 = heap32[(r6+31)];
+	r12 = heap32[(r10+-1)];
+	r11 = (r11 * 1664525)|0;
+	r11 = (r11 + 1013904223)|0;
+	heap32[(r6+31)] = r11;
+	if(uint(r8) <uint(65537)) //_LBB613_23
+{
+	r13 = r11 >>> 16;
+	r11 = r13 ^ r11;
+	if(uint(r8) <uint(257)) //_LBB613_25
+{
+	r13 = r11 >>> 8;
+	r11 = r13 ^ r11;
+	if(uint(r8) <uint(17)) //_LBB613_27
+{
+	r13 = r11 >>> 4;
+	r11 = r13 ^ r11;
+	if(uint(r8) <uint(5)) //_LBB613_29
+{
+	r13 = r11 >>> 2;
+	r11 = r13 ^ r11;
+	if(uint(r8) <uint(3)) //_LBB613_31
+{
+	r13 = r11 >>> 1;
+	r11 = r13 ^ r11;
+}
+}
+}
+}
+}
+	r11 = Math.floor(uint(r11) % uint(r8));
+	r11 = r11 << 2;
+	r9 = (r9 + r11)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	heap32[(r10+-1)] = r9;
+	r9 = heap32[(r6+24)];
+	r9 = (r9 + r11)|0;
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r12;
+	r9 = (r7 + r8)|0;
+if(!(r9 !=1)) //_LBB613_21
+{
+break _20;
+}
+}
+}
+} while(0);
+	r7 = heap32[(r4+15)];
+}
+}
+	r8 = heap32[(r6+7)];
+	r7 = r7 & 256;
+_33: do {
+	if(r7 !=0) //_LBB613_37
+{
+_35: do {
+if(!(r8 <1)) //_LBB613_40
+{
+	r7 = 0;
+	r8 = r7;
+_37: while(true){
+	r9 = (r8 * 34)|0;
+	r10 = heap32[(r6+9)];
+	r9 = r9 << 2;
+	r9 = (r10 + r9)|0;
+	r9 = r9 >> 2;
+	r11 = heap32[(r9+27)];
+	r9 = heap32[(r9+26)];
+	r10 = (r10 + r7)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r10;
+	r8 = (r8 + 1)|0;
+	r7 = (r7 + 136)|0;
+	_ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint(i7);
+	r9 = heap32[(r6+7)];
+if(!(r9 >r8)) //_LBB613_39
+{
+break _35;
+}
+}
+}
+} while(0);
+_40: do {
+if(!(r3 <1)) //_LBB613_43
+{
+	r7 = r2;
+	r8 = r3;
+_42: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r9 >> 2;
+	r11 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+6)];
+	f0 = heapFloat[(r4+3)];
+	r12 = heap32[(r10+6)];
+	r10 = heap32[(r10+5)];
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r12;
+	heapFloat[(g0+3)] = f0;
+	r8 = (r8 + -1)|0;
+	r7 = (r7 + 4)|0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+if(!(r8 !=0)) //_LBB613_42
+{
+break _40;
+}
+}
+}
+} while(0);
+	r7 = heap32[(r6+2)];
+_45: do {
+if(!(r7 <1)) //_LBB613_46
+{
+	r8 = 0;
+_47: while(true){
+	r9 = heap32[(r6+19)];
+	r10 = r8 << 2;
+	r9 = (r9 + r10)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r9 = (r9 * 136)|0;
+	r10 = heap32[(r6+4)];
+	r9 = (r10 + r9)|0;
+	r10 = r9 >> 2;
+	r11 = heap32[(r10+27)];
+	r10 = heap32[(r10+26)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	r8 = (r8 + 1)|0;
+	_ZN35btSequentialImpulseConstraintSolver36resolveSingleConstraintRowLowerLimitER11btRigidBodyS1_RK18btSolverConstraint(i7);
+if(!(r7 !=r8)) //_LBB613_45
+{
+break _45;
+}
+}
+}
+} while(0);
+	r7 = heap32[(r6+12)];
+	if(r7 <1) //_LBB613_63
+{
+break _33;
+}
+else{
+	r8 = 0;
+_51: while(true){
+	r9 = heap32[(r6+24)];
+	r10 = r8 << 2;
+	r9 = (r9 + r10)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r10 = heap32[(r6+14)];
+	r9 = (r9 * 136)|0;
+	r9 = (r10 + r9)|0;
+	r10 = r9 >> 2;
+	r11 = heap32[(r10+25)];
+	r12 = heap32[(r6+4)];
+	r11 = (r11 * 136)|0;
+	r11 = (r12 + r11)|0;
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r11+21)];
+	f1 =                         0;
+if(!(f0 <=f1)) //_LBB613_50
+{
+	f1 = heapFloat[(r10+22)];
+	f0 = f1*f0;
+	f1 = -f0;
+	heapFloat[(r10+31)] = f1;
+	heapFloat[(r10+32)] = f0;
+	r11 = heap32[(r10+27)];
+	r10 = heap32[(r10+26)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	_ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint(i7);
+}
+	r8 = (r8 + 1)|0;
+	if(r7 ==r8) //_LBB613_63
+{
+break _33;
+}
+else{
+continue _51;
+}
+}
+}
+}
+else{
+_57: do {
+if(!(r8 <1)) //_LBB613_52
+{
+	r8 = 0;
+	r7 = r8;
+_59: while(true){
+	r9 = (r7 * 34)|0;
+	r10 = heap32[(r6+9)];
+	r9 = r9 << 2;
+	r9 = (r10 + r9)|0;
+	r9 = r9 >> 2;
+	r11 = heap32[(r9+27)];
+	r9 = heap32[(r9+26)];
+	r10 = (r10 + r8)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r10;
+	r7 = (r7 + 1)|0;
+	r8 = (r8 + 136)|0;
+	_ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint(i7);
+	r9 = heap32[(r6+7)];
+if(!(r9 >r7)) //_LBB613_51
+{
+break _57;
+}
+}
+}
+} while(0);
+_62: do {
+if(!(r3 <1)) //_LBB613_55
+{
+	r7 = r2;
+	r8 = r3;
+_64: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r9 >> 2;
+	r11 = heap32[(r10)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+6)];
+	f0 = heapFloat[(r4+3)];
+	r12 = heap32[(r10+6)];
+	r10 = heap32[(r10+5)];
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r12;
+	heapFloat[(g0+3)] = f0;
+	r8 = (r8 + -1)|0;
+	r7 = (r7 + 4)|0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+if(!(r8 !=0)) //_LBB613_54
+{
+break _62;
+}
+}
+}
+} while(0);
+	r7 = heap32[(r6+2)];
+_67: do {
+if(!(r7 <1)) //_LBB613_58
+{
+	r8 = 0;
+_69: while(true){
+	r9 = heap32[(r6+19)];
+	r10 = r8 << 2;
+	r9 = (r9 + r10)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r9 = (r9 * 136)|0;
+	r10 = heap32[(r6+4)];
+	r9 = (r10 + r9)|0;
+	r10 = r9 >> 2;
+	r11 = heap32[(r10+27)];
+	r10 = heap32[(r10+26)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	r8 = (r8 + 1)|0;
+	_ZN35btSequentialImpulseConstraintSolver36resolveSingleConstraintRowLowerLimitER11btRigidBodyS1_RK18btSolverConstraint(i7);
+if(!(r7 !=r8)) //_LBB613_57
+{
+break _67;
+}
+}
+}
+} while(0);
+	r7 = heap32[(r6+12)];
+if(!(r7 <1)) //_LBB613_63
+{
+	r8 = 0;
+_73: while(true){
+	r9 = heap32[(r6+24)];
+	r10 = r8 << 2;
+	r9 = (r9 + r10)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r10 = heap32[(r6+14)];
+	r9 = (r9 * 136)|0;
+	r9 = (r10 + r9)|0;
+	r10 = r9 >> 2;
+	r11 = heap32[(r10+25)];
+	r12 = heap32[(r6+4)];
+	r11 = (r11 * 136)|0;
+	r11 = (r12 + r11)|0;
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r11+21)];
+	f1 =                         0;
+if(!(f0 <=f1)) //_LBB613_62
+{
+	f1 = heapFloat[(r10+22)];
+	f0 = f1*f0;
+	f1 = -f0;
+	heapFloat[(r10+31)] = f1;
+	heapFloat[(r10+32)] = f0;
+	r11 = heap32[(r10+27)];
+	r10 = heap32[(r10+26)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	heap32[(g0+2)] = r9;
+	_ZN35btSequentialImpulseConstraintSolver33resolveSingleConstraintRowGenericER11btRigidBodyS1_RK18btSolverConstraint(i7);
+}
+	r8 = (r8 + 1)|0;
+if(!(r7 !=r8)) //_LBB613_60
+{
+break _33;
+}
+}
+}
+}
+} while(0);
+	r5 = (r5 + 1)|0;
+	r6 = heap32[(r4+5)];
+	if(r6 >r5) //_LBB613_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r6 = heap32[(fp+3)];
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+8)];
+	r9 = heap32[(fp+9)];
+	r10 = r0 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r6;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r2;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r1;
+	heap32[(g0+8)] = r8;
+	heap32[(g0+9)] = r9;
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_80: do {
+if(!(r3 !=0)) //_LBB613_70
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB613_67
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB613_70
+{
+break _80;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN35btSequentialImpulseConstraintSolver21addFrictionConstraintERK9btVector3P11btRigidBodyS4_iR15btManifoldPointS2_S2_P17btCollisionObjectS8_fff(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+var __label__ = 0;
+	i7 = sp + -288;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+13)];
+	r3 = heap32[(r1+12)];
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	r6 = heap32[(fp+3)];
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+5)];
+	r9 = heap32[(fp+6)];
+	r10 = heap32[(fp+7)];
+	f0 = heapFloat[(fp+8)];
+	f1 = heapFloat[(fp+9)];
+	f2 = heapFloat[(fp+10)];
+	if(r2 ==r3) //_LBB614_2
+{
+	r11 = 1;
+	r12 = r3 << 1;
+	r12 = r3 == 0 ? r11 : r12;
+	if(r2 >=r12) //_LBB614_1
+{
+__label__ = 1;
+}
+else{
+	if(r12 !=0) //_LBB614_5
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r13 = heap32[(r2)];
+	r14 = (r12 * 136)|0;
+	r13 = (r13 + 1)|0;
+	r14 = r14 | 3;
+	heap32[(r2)] = r13;
+	r2 = (r14 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r13 = r_g0;
+	if(r13 !=0) //_LBB614_7
+{
+	r2 = 0;
+	r14 = (r13 + 4)|0;
+	r2 = (r2 - r14)|0;
+	r2 = r2 & 15;
+	r2 = (r13 + r2)|0;
+	r14 = (r2 + 4)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r13;
+	r13 = r14;
+}
+}
+else{
+	r13 = 0;
+}
+	r14 = (r0 + 56)|0;
+	if(r3 <1) //_LBB614_10
+{
+	r2 = r14 >> 2;
+	r16 = heap32[(r2)];
+}
+else{
+	r2 = 0;
+	r15 = r3;
+_12: while(true){
+	r16 = r14 >> 2;
+	r16 = heap32[(r16)];
+	r17 = (r13 + r2)|0;
+	r18 = (r16 + r2)|0;
+	heap32[(g0)] = r17;
+	heap32[(g0+1)] = r18;
+	heap32[(g0+2)] = 136;
+	r15 = (r15 + -1)|0;
+	r2 = (r2 + 136)|0;
+	memcpy(i7);
+if(!(r15 !=0)) //_LBB614_11
+{
+break _12;
+}
+}
+	r14 = (r0 + 56)|0;
+}
+	if(r16 !=0) //_LBB614_15
+{
+	r2 = heapU8[r0+60];
+	if(r2 !=0) //_LBB614_17
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r15 = heap32[(r2)];
+	r15 = (r15 + 1)|0;
+	r16 = r16 >> 2;
+	heap32[(r2)] = r15;
+	r2 = heap32[(r16+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+	r2 = heap32[(r1+12)];
+}
+else{
+	r2 = r3;
+}
+	r15 = r14 >> 2;
+	heap32[(r15)] = 0;
+}
+else{
+	r2 = r3;
+}
+	r14 = r14 >> 2;
+	heap8[r0+60] = r11;
+	heap32[(r14)] = r13;
+	heap32[(r1+13)] = r12;
+__label__ = 19;
+}
+}
+else{
+__label__ = 1;
+}
+if (__label__ == 1){
+	r2 = r3;
+}
+	r0 = (r2 + 1)|0;
+	heap32[(r1+12)] = r0;
+	r0 = heap32[(r1+14)];
+	r1 = (r3 * 136)|0;
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0+25)] = r5;
+	r1 = heapU8[r9+232];
+	r1 = r1 & 2;
+if(!(r1 !=0)) //_LBB614_22
+{
+	r9 = 0;
+}
+	r1 = heapU8[r10+232];
+	r1 = r1 & 2;
+if(!(r1 !=0)) //_LBB614_24
+{
+	r10 = 0;
+}
+	r1 = r4 >> 2;
+	heap32[(r0+4)] = heap32[(r1)];
+	heap32[(r0+5)] = heap32[(r1+1)];
+	heap32[(r0+6)] = heap32[(r1+2)];
+	heap32[(r0+7)] = heap32[(r1+3)];
+	if(r9 ==0) //_LBB614_26
+{
+	r2 = _ZGVZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r3 = heapU8[r2];
+if(!(r3 !=0)) //_LBB614_28
+{
+	r3 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r4 = r3 >> 2;
+	heap32[(r4+41)] = 1065353216;
+	heap32[(r4+42)] = 1065353216;
+	heap32[(r4+43)] = 1065353216;
+	heap32[(r4+44)] = 0;
+	heap32[(r4+45)] = 0;
+	heap32[(r4+46)] = 1566444395;
+	heap32[(r4+47)] = 0;
+	heap32[(r4+48)] = 0;
+	heap32[(r4+49)] = 0;
+	heap32[(r4+50)] = 0;
+	heap32[(r4+51)] = 1;
+	heap32[(r4+52)] = -1;
+	heap32[(r4+53)] = -1;
+	heap32[(r4+54)] = 1;
+	heap32[(r4+55)] = 0;
+	heap32[(r4+56)] = 1056964608;
+	heap32[(r4+57)] = 0;
+	heap32[(r4+58)] = 1;
+	heap32[(r4+59)] = 0;
+	heap32[(r4+60)] = 1065353216;
+	heap32[(r4+61)] = 0;
+	heap32[(r4+62)] = 0;
+	heap32[(r4+63)] = 0;
+	heap32[(r4+1)] = 1065353216;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = 1065353216;
+	heap32[(r4+7)] = 0;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 0;
+	heap32[(r4+11)] = 1065353216;
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	r5 = _ZTV11btRigidBody;
+	heap32[(r4+15)] = 0;
+	r5 = (r5 + 8)|0;
+	heap32[(r4+16)] = 0;
+	r11 = 1;
+	heap32[(r4)] = r5;
+	heap8[r3+492] = r11;
+	heap32[(r4+122)] = 0;
+	heap32[(r4+120)] = 0;
+	r5 = sp + -272;
+	heap32[(r4+121)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-68)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+18)] = 0;
+	heap32[(r4+19)] = 0;
+	heap32[(r4+20)] = 0;
+	heap32[(r4+21)] = 0;
+	heap32[(r4+22)] = 0;
+	heap32[(r4+23)] = 0;
+	heap32[(r4+24)] = 0;
+	heap32[(r4+25)] = 1056964608;
+	heap32[(r4+26)] = 0;
+	heap32[(r4+27)] = 1061997773;
+	r12 = 0;
+	heap32[(r4+28)] = 1065353216;
+	heap8[sp+-156] = r12;
+	heap32[(r4+30)] = 1000593162;
+	heap32[(r4+31)] = 1008981770;
+	heap32[(r4+32)] = 1008981770;
+	heap32[(r4+33)] = 1008981770;
+	heap32[(r4+2)] = 1065353216;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = 0;
+	heap32[(r4+7)] = 1065353216;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 0;
+	heap32[(r4+11)] = 0;
+	heap32[(r4+12)] = 1065353216;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	heap32[(r4+15)] = 0;
+	heap32[(r4+16)] = 0;
+	heap32[(r4+17)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	heap8[r2] = r11;
+}
+	r2 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+51)];
+	r4 = r4 | 1;
+	heap32[(r3+51)] = r4;
+	heap32[(r3+84)] = 0;
+	f3 =                         0;
+	f4 = heapFloat[(r3+95)];
+	f5 = heapFloat[(r3+94)];
+	f6 = heapFloat[(r3+93)];
+	f6 = f6*f3;
+	f5 = f5*f3;
+	heapFloat[(r3+89)] = f6;
+	f4 = f4*f3;
+	heapFloat[(r3+90)] = f5;
+	heapFloat[(r3+91)] = f4;
+	heap32[(r3+92)] = 0;
+	heap32[(r3+97)] = 0;
+	heap32[(r3+98)] = 0;
+	heap32[(r3+99)] = 0;
+	heap32[(r3+100)] = 0;
+	f4 = heapFloat[(r3+87)];
+	f5 = heapFloat[(r3+86)];
+	f6 = heapFloat[(r3+85)];
+	f6 = f6*f3;
+	f5 = f5*f3;
+	heapFloat[(r3+138)] = f6;
+	f3 = f4*f3;
+	heapFloat[(r3+139)] = f5;
+	heapFloat[(r3+140)] = f3;
+	heap32[(r3+141)] = 0;
+}
+else{
+	r2 = r9;
+}
+	heap32[(r0+26)] = r2;
+	if(r10 ==0) //_LBB614_31
+{
+	r2 = _ZGVZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r3 = heapU8[r2];
+if(!(r3 !=0)) //_LBB614_33
+{
+	r3 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r4 = r3 >> 2;
+	heap32[(r4+41)] = 1065353216;
+	heap32[(r4+42)] = 1065353216;
+	heap32[(r4+43)] = 1065353216;
+	heap32[(r4+44)] = 0;
+	heap32[(r4+45)] = 0;
+	heap32[(r4+46)] = 1566444395;
+	heap32[(r4+47)] = 0;
+	heap32[(r4+48)] = 0;
+	heap32[(r4+49)] = 0;
+	heap32[(r4+50)] = 0;
+	heap32[(r4+51)] = 1;
+	heap32[(r4+52)] = -1;
+	heap32[(r4+53)] = -1;
+	heap32[(r4+54)] = 1;
+	heap32[(r4+55)] = 0;
+	heap32[(r4+56)] = 1056964608;
+	heap32[(r4+57)] = 0;
+	heap32[(r4+58)] = 1;
+	heap32[(r4+59)] = 0;
+	heap32[(r4+60)] = 1065353216;
+	heap32[(r4+61)] = 0;
+	heap32[(r4+62)] = 0;
+	heap32[(r4+63)] = 0;
+	heap32[(r4+1)] = 1065353216;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = 1065353216;
+	heap32[(r4+7)] = 0;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 0;
+	heap32[(r4+11)] = 1065353216;
+	heap32[(r4+12)] = 0;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	r5 = _ZTV11btRigidBody;
+	heap32[(r4+15)] = 0;
+	r5 = (r5 + 8)|0;
+	heap32[(r4+16)] = 0;
+	r11 = 1;
+	heap32[(r4)] = r5;
+	heap8[r3+492] = r11;
+	heap32[(r4+122)] = 0;
+	heap32[(r4+120)] = 0;
+	r5 = sp + -136;
+	heap32[(r4+121)] = 0;
+	r4 = r5 >> 2;
+	heap32[(fp+-34)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+18)] = 0;
+	heap32[(r4+19)] = 0;
+	heap32[(r4+20)] = 0;
+	heap32[(r4+21)] = 0;
+	heap32[(r4+22)] = 0;
+	heap32[(r4+23)] = 0;
+	heap32[(r4+24)] = 0;
+	heap32[(r4+25)] = 1056964608;
+	heap32[(r4+26)] = 0;
+	heap32[(r4+27)] = 1061997773;
+	r12 = 0;
+	heap32[(r4+28)] = 1065353216;
+	heap8[sp+-20] = r12;
+	heap32[(r4+30)] = 1000593162;
+	heap32[(r4+31)] = 1008981770;
+	heap32[(r4+32)] = 1008981770;
+	heap32[(r4+33)] = 1008981770;
+	heap32[(r4+2)] = 1065353216;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	heap32[(r4+6)] = 0;
+	heap32[(r4+7)] = 1065353216;
+	heap32[(r4+8)] = 0;
+	heap32[(r4+9)] = 0;
+	heap32[(r4+10)] = 0;
+	heap32[(r4+11)] = 0;
+	heap32[(r4+12)] = 1065353216;
+	heap32[(r4+13)] = 0;
+	heap32[(r4+14)] = 0;
+	heap32[(r4+15)] = 0;
+	heap32[(r4+16)] = 0;
+	heap32[(r4+17)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	_ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(i7);
+	heap8[r2] = r11;
+}
+	r2 = _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed;
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+51)];
+	r4 = r4 | 1;
+	heap32[(r3+51)] = r4;
+	heap32[(r3+84)] = 0;
+	f3 =                         0;
+	f4 = heapFloat[(r3+95)];
+	f5 = heapFloat[(r3+94)];
+	f6 = heapFloat[(r3+93)];
+	f6 = f6*f3;
+	f5 = f5*f3;
+	heapFloat[(r3+89)] = f6;
+	f4 = f4*f3;
+	heapFloat[(r3+90)] = f5;
+	heapFloat[(r3+91)] = f4;
+	heap32[(r3+92)] = 0;
+	heap32[(r3+97)] = 0;
+	heap32[(r3+98)] = 0;
+	heap32[(r3+99)] = 0;
+	heap32[(r3+100)] = 0;
+	f4 = heapFloat[(r3+87)];
+	f5 = heapFloat[(r3+86)];
+	f6 = heapFloat[(r3+85)];
+	f6 = f6*f3;
+	f5 = f5*f3;
+	heapFloat[(r3+138)] = f6;
+	f3 = f4*f3;
+	heapFloat[(r3+139)] = f5;
+	heapFloat[(r3+140)] = f3;
+	heap32[(r3+141)] = 0;
+}
+else{
+	r2 = r10;
+}
+	r3 = r6 >> 2;
+	heap32[(r0+27)] = r2;
+	heap32[(r0+22)] = heap32[(r3+21)];
+	heap32[(r0+28)] = 0;
+	heap32[(r0+21)] = 0;
+	heap32[(r0+20)] = 0;
+	r2 = r7 >> 2;
+	f3 = heapFloat[(r0+5)];
+	f4 = heapFloat[(r2+2)];
+	f5 = heapFloat[(r0+6)];
+	f6 = heapFloat[(r2+1)];
+	f7 = heapFloat[(r0+4)];
+	f8 = heapFloat[(r2)];
+	f9 = f6*f5;
+	f10 = f4*f3;
+	f9 = f9-f10;
+	f4 = f4*f7;
+	f10 = f8*f5;
+	f4 = f4-f10;
+	heapFloat[(r0)] = f9;
+	f8 = f8*f3;
+	f6 = f6*f7;
+	f6 = f8-f6;
+	heapFloat[(r0+1)] = f4;
+	heapFloat[(r0+2)] = f6;
+	heap32[(r0+3)] = 0;
+	if(r9 ==0) //_LBB614_36
+{
+	heap32[(r0+12)] = 0;
+	heap32[(r0+13)] = 0;
+	f10 =                         0;
+	heap32[(r0+14)] = 0;
+	heap32[(r0+15)] = 0;
+	f11 = f10;
+	f8 = f10;
+}
+else{
+	r3 = r9 >> 2;
+	f8 = heapFloat[(r3+64)];
+	f10 = heapFloat[(r3+65)];
+	f11 = heapFloat[(r3+68)];
+	f12 = heapFloat[(r3+69)];
+	f8 = f8*f9;
+	f10 = f10*f4;
+	f13 = heapFloat[(r3+66)];
+	f14 = heapFloat[(r3+72)];
+	f15 = heapFloat[(r3+73)];
+	f16 = heapFloat[(r3+70)];
+	f11 = f11*f9;
+	f12 = f12*f4;
+	f8 = f8+f10;
+	f10 = f13*f6;
+	f13 = heapFloat[(r3+74)];
+	f14 = f14*f9;
+	f15 = f15*f4;
+	f11 = f11+f12;
+	f12 = f16*f6;
+	f8 = f8+f10;
+	f10 = heapFloat[(r3+134)];
+	f16 = heapFloat[(r3+136)];
+	f17 = heapFloat[(r3+135)];
+	f11 = f11+f12;
+	f8 = f8*f10;
+	f10 = f14+f15;
+	f12 = f13*f6;
+	f10 = f10+f12;
+	f11 = f11*f17;
+	heapFloat[(r0+12)] = f8;
+	f10 = f10*f16;
+	heapFloat[(r0+13)] = f11;
+	heapFloat[(r0+14)] = f10;
+	heap32[(r0+15)] = 0;
+}
+	r3 = r8 >> 2;
+	f12 = heapFloat[(r3+2)];
+	f13 = heapFloat[(r3+1)];
+	f14 = heapFloat[(r3)];
+	f15 = f12*f3;
+	f16 = f13*f5;
+	f15 = f15-f16;
+	f16 = f14*f5;
+	f12 = f12*f7;
+	f12 = f16-f12;
+	heapFloat[(r0+8)] = f15;
+	f13 = f13*f7;
+	f14 = f14*f3;
+	f13 = f13-f14;
+	heapFloat[(r0+9)] = f12;
+	heapFloat[(r0+10)] = f13;
+	heap32[(r0+11)] = 0;
+	if(r10 ==0) //_LBB614_39
+{
+	heap32[(r0+16)] = 0;
+	heap32[(r0+17)] = 0;
+	f14 =                         0;
+	heap32[(r0+18)] = 0;
+	heap32[(r0+19)] = 0;
+	f17 = f14;
+	f16 = f14;
+}
+else{
+	r4 = r10 >> 2;
+	f14 = heapFloat[(r4+64)];
+	f16 = heapFloat[(r4+65)];
+	f17 = heapFloat[(r4+68)];
+	f18 = heapFloat[(r4+69)];
+	f14 = f14*f15;
+	f16 = f16*f12;
+	f19 = heapFloat[(r4+66)];
+	f20 = heapFloat[(r4+72)];
+	f21 = heapFloat[(r4+73)];
+	f22 = heapFloat[(r4+70)];
+	f17 = f17*f15;
+	f18 = f18*f12;
+	f14 = f14+f16;
+	f16 = f19*f13;
+	f19 = heapFloat[(r4+74)];
+	f20 = f20*f15;
+	f21 = f21*f12;
+	f17 = f17+f18;
+	f18 = f22*f13;
+	f14 = f14+f16;
+	f16 = heapFloat[(r4+134)];
+	f22 = heapFloat[(r4+136)];
+	f23 = heapFloat[(r4+135)];
+	f17 = f17+f18;
+	f14 = f14*f16;
+	f16 = f20+f21;
+	f18 = f19*f13;
+	f16 = f16+f18;
+	f17 = f17*f23;
+	heapFloat[(r0+16)] = f14;
+	f16 = f16*f22;
+	heapFloat[(r0+17)] = f17;
+	heapFloat[(r0+18)] = f16;
+	heap32[(r0+19)] = 0;
+}
+	if(r9 !=0) //_LBB614_42
+{
+	f18 = heapFloat[(r2+1)];
+	f19 = heapFloat[(r2+2)];
+	f20 = heapFloat[(r2)];
+	f21 = f11*f19;
+	f22 = f10*f18;
+	f10 = f10*f20;
+	f19 = f8*f19;
+	f23 = heapFloat[(r1)];
+	f21 = f21-f22;
+	f22 = heapFloat[(r1+1)];
+	f10 = f10-f19;
+	f8 = f8*f18;
+	f11 = f11*f20;
+	f18 = f23*f21;
+	f10 = f22*f10;
+	f19 = heapFloat[(r1+2)];
+	f8 = f8-f11;
+	r2 = r9 >> 2;
+	f10 = f18+f10;
+	f8 = f19*f8;
+	f11 = heapFloat[(r2+84)];
+	f8 = f10+f8;
+	f8 = f11+f8;
+}
+else{
+	f8 =                         0;
+}
+	if(r10 !=0) //_LBB614_45
+{
+	f10 = heapFloat[(r3+2)];
+	f11 = heapFloat[(r3)];
+	f18 = heapFloat[(r3+1)];
+	f19 = f18*f16;
+	f20 = f10*f17;
+	f10 = f10*f14;
+	f16 = f11*f16;
+	f21 = heapFloat[(r1)];
+	f19 = f19-f20;
+	f20 = heapFloat[(r1+1)];
+	f10 = f10-f16;
+	f11 = f11*f17;
+	f14 = f18*f14;
+	f16 = f21*f19;
+	f10 = f20*f10;
+	f17 = heapFloat[(r1+2)];
+	f14 = f11-f14;
+	r1 = r10 >> 2;
+	f10 = f16+f10;
+	f14 = f17*f14;
+	f11 = heapFloat[(r1+84)];
+	f14 = f10+f14;
+	f14 = f11+f14;
+}
+else{
+	f14 =                         0;
+}
+	f8 = f8+f14;
+	f0 = f0/f8;
+	heapFloat[(r0+23)] = f0;
+	if(r9 !=0) //_LBB614_48
+{
+	r1 = r9 >> 2;
+	f8 = heapFloat[(r1+76)];
+	f10 = heapFloat[(r1+77)];
+	f8 = f7*f8;
+	f10 = f3*f10;
+	f11 = heapFloat[(r1+78)];
+	f8 = f8+f10;
+	f10 = f5*f11;
+	f10 = f8+f10;
+	f14 = heapFloat[(r1+80)];
+	f11 = heapFloat[(r1+81)];
+	f8 = heapFloat[(r1+82)];
+}
+else{
+	f8 =                         0;
+	f10 = f7*f8;
+	f11 = f3*f8;
+	f10 = f10+f11;
+	f11 = f5*f8;
+	f10 = f10+f11;
+	f11 = f8;
+	f14 = f8;
+}
+	f9 = f9*f14;
+	f4 = f4*f11;
+	f4 = f9+f4;
+	f6 = f6*f8;
+	f4 = f4+f6;
+	f4 = f10+f4;
+	if(r10 !=0) //_LBB614_51
+{
+	r1 = r10 >> 2;
+	f6 = heapFloat[(r1+80)];
+	f8 = heapFloat[(r1+81)];
+	f6 = f15*f6;
+	f12 = f12*f8;
+	f15 = heapFloat[(r1+82)];
+	f6 = f6+f12;
+	f12 = f13*f15;
+	f12 = f6+f12;
+	f15 = heapFloat[(r1+76)];
+	f13 = heapFloat[(r1+77)];
+	f6 = heapFloat[(r1+78)];
+}
+else{
+	f6 =                         0;
+	f15 = f15*f6;
+	f12 = f12*f6;
+	f12 = f15+f12;
+	f13 = f13*f6;
+	f12 = f12+f13;
+	f13 = f6;
+	f15 = f6;
+}
+	f7 = f7*f15;
+	f3 = f3*f13;
+	f3 = f7+f3;
+	f5 = f5*f6;
+	f3 = f3+f5;
+	f3 = f12-f3;
+	f3 = f4+f3;
+	f1 = f1-f3;
+	f0 = f0*f1;
+	heapFloat[(r0+29)] = f0;
+	heapFloat[(r0+30)] = f2;
+	heap32[(r0+31)] = 0;
+	heap32[(r0+32)] = 1343554297;
+	return;
+}
+
+function _ZNK17btTypedConstraint9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp)];
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r4 = r2 >> 2;
+	r3 = heap32[(r3+7)];
+	r5 = heap32[(r4+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	r5 = heap32[(fp+1)];
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r5 = r5 >> 2;
+	heap32[(r5)] = r_g0;
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	r6 = heap32[(r4+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(r5+1)] = r_g0;
+	r3 = heap32[(r1)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+10)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r_g0;
+	r6 = heap32[(r1)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0;
+	heap32[(r5+2)] = r6;
+if(!(r6 ==0)) //_LBB615_2
+{
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+12)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	r0 = heap32[(r4+1)];
+	heap32[(r5+3)] = r0;
+	r0 = heapU8[r2+16];
+	heap32[(r5+6)] = r0;
+	r0 = heap32[(r4+3)];
+	heap32[(r5+5)] = r0;
+	r0 = heap32[(r4+2)];
+	heap32[(r5+4)] = r0;
+	heap32[(r5+7)] = heap32[(r4+7)];
+	heap32[(r5+8)] = heap32[(r4+8)];
+	heap32[(r5+9)] = 0;
+	r0 = heap32[(r4+5)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+120)];
+if(!(r1 <1)) //_LBB615_7
+{
+	r1 = 0;
+_6: while(true){
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+122)];
+	r3 = r1 << 2;
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+if(!(r0 !=r2)) //_LBB615_6
+{
+	heap32[(r5+9)] = 1;
+}
+	r1 = (r1 + 1)|0;
+	r0 = heap32[(r4+5)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3+120)];
+	if(r3 >r1) //_LBB615_4
+{
+continue _6;
+}
+else{
+break _6;
+}
+}
+}
+	r0 = heap32[(r4+6)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+120)];
+_12: do {
+if(!(r1 <1)) //_LBB615_12
+{
+	r1 = 0;
+_14: while(true){
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+122)];
+	r3 = r1 << 2;
+	r0 = (r0 + r3)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+if(!(r0 !=r2)) //_LBB615_11
+{
+	heap32[(r5+9)] = 1;
+}
+	r1 = (r1 + 1)|0;
+	r0 = heap32[(r4+6)];
+	r3 = r0 >> 2;
+	r3 = heap32[(r3+120)];
+	if(r3 >r1) //_LBB615_9
+{
+continue _14;
+}
+else{
+break _12;
+}
+}
+}
+} while(0);
+	r0 = _2E_str76;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld11setNumTasksEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld14updateVehiclesEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = _2E_str289;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+63)];
+if(!(r2 <1)) //_LBB617_3
+{
+	f0 = heapFloat[(fp+1)];
+	r2 = 0;
+_3: while(true){
+	r3 = heap32[(r0+65)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heapFloat[(g0+2)] = f0;
+	r2 = (r2 + 1)|0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = heap32[(r0+63)];
+	if(r3 >r2) //_LBB617_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_6: do {
+if(!(r3 !=0)) //_LBB617_9
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB617_6
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB617_9
+{
+break _6;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN15btDynamicsWorld13addConstraintEP17btTypedConstraintb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btDynamicsWorld16removeConstraintEP17btTypedConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK15btDynamicsWorld17getNumConstraintsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btDynamicsWorld13getConstraintEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK15btDynamicsWorld13getConstraintEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN15btDynamicsWorld10addVehicleEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btDynamicsWorld13removeVehicleEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btDynamicsWorld12addCharacterEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN15btDynamicsWorld15removeCharacterEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZNK23btDiscreteDynamicsWorld12getWorldTypeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 2;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK23btDiscreteDynamicsWorld10getGravityEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r0)] = heap32[(r1+56)];
+	heap32[(r0+1)] = heap32[(r1+57)];
+	heap32[(r0+2)] = heap32[(r1+58)];
+	heap32[(r0+3)] = heap32[(r1+59)];
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld10addVehicleEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+15)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld13removeVehicleEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+16)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld12addCharacterEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+15)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld15removeCharacterEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+16)];
+	r2 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN34btClosestNotMeConvexResultCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN34btClosestNotMeConvexResultCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK34btClosestNotMeConvexResultCallback14needsCollisionEP17btBroadphaseProxy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r1 >> 2;
+	r3 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r4 = heap32[(r3+20)];
+	if(r2 !=r4) //_LBB635_2
+{
+	r5 = heapU16[(r0+10)>>1];
+	r6 = heapU16[(r1+4)>>1];
+	r5 = r5 & r6;
+	r5 = r5 & 65535;
+	if(r5 ==0) //_LBB635_1
+{
+__label__ = 1;
+}
+else{
+	r5 = heapU16[(r1+6)>>1];
+	r0 = heapU16[(r0+8)>>1];
+	r0 = r5 & r0;
+	r0 = r0 & 65535;
+	if(r0 ==0) //_LBB635_1
+{
+__label__ = 1;
+}
+else{
+	r0 = heap32[(r3+23)];
+	r5 = r0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB635_6
+{
+	r0 = sp + -24;
+	r2 = 1;
+	r4 = r0 >> 2;
+	heap8[sp+-8] = r2;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	r5 = heap32[(r3+22)];
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r3 = heap32[(r3+20)];
+	r6 = r6 >> 2;
+	r3 = r3 >> 2;
+	r6 = heap32[(r6+13)];
+	r3 = heap32[(r3+47)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r1 = r_g0;
+_7: do {
+if(!(r1 ==0)) //_LBB635_21
+{
+	r1 = r1 >> 2;
+	r3 = heap32[(r1+2)];
+if(!(r3 ==0)) //_LBB635_21
+{
+	r3 = heap32[(r4+1)];
+if(!(r3 >-1)) //_LBB635_17
+{
+	r5 = heap32[(r4+2)];
+	if(r5 <0) //_LBB635_11
+{
+	r5 = heap32[(r4+3)];
+if(!(r5 ==0)) //_LBB635_15
+{
+	r6 = heapU8[sp+-8];
+if(!(r6 ==0)) //_LBB635_14
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r7 = (r7 + 1)|0;
+	r5 = r5 >> 2;
+	heap32[(r6)] = r7;
+	r5 = heap32[(r5+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	heap32[(r4+3)] = 0;
+}
+	heap8[sp+-8] = r2;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+2)] = 0;
+}
+_20: while(true){
+	r2 = r3 << 2;
+	r5 = heap32[(r4+3)];
+	r2 = (r5 + r2)|0;
+	r3 = (r3 + 1)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+if(!(r3 !=0)) //_LBB635_16
+{
+break _20;
+}
+}
+}
+	heap32[(r4+1)] = 0;
+	r1 = heap32[(r1+2)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = heap32[(r4+1)];
+	r1 = 0;
+_23: while(true){
+	if(r0 >r1) //_LBB635_18
+{
+	r2 = heap32[(r4+3)];
+	r3 = r1 << 2;
+	r3 = (r2 + r3)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+279)];
+	if(r3 >0) //_LBB635_25
+{
+break _23;
+}
+else{
+	r1 = (r1 + 1)|0;
+}
+}
+else{
+break _7;
+}
+}
+if(!(r2 ==0)) //_LBB635_29
+{
+	r0 = heapU8[sp+-8];
+if(!(r0 ==0)) //_LBB635_28
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	r2 = r2 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+} while(0);
+	r0 = heap32[(r4+3)];
+if(!(r0 ==0)) //_LBB635_24
+{
+	r2 = heapU8[sp+-8];
+if(!(r2 ==0)) //_LBB635_24
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r1 = heap32[(r2)];
+	r1 = (r1 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r2)] = r1;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+}
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = 1;
+__label__ = 28;
+}
+}
+}
+}
+else{
+__label__ = 1;
+}
+if (__label__ == 1){
+	r0 = 0;
+}
+	r0 = r0 & 255;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN34btClosestNotMeConvexResultCallback15addSingleResultERN16btCollisionWorld17LocalConvexResultEb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp)];
+	r3 = heap32[(r1)];
+	r4 = r2 >> 2;
+	r5 = heap32[(r4+20)];
+if(!(r3 ==r5)) //_LBB636_4
+{
+	r3 = heapU8[r3+204];
+	r3 = r3 & 4;
+if(!(r3 !=0)) //_LBB636_4
+{
+	f0 = heapFloat[(r4+7)];
+	f1 = heapFloat[(r4+3)];
+	f2 = heapFloat[(r4+8)];
+	f3 = heapFloat[(r4+4)];
+	f4 = heapFloat[(r1+2)];
+	f0 = f0-f1;
+	f1 = heapFloat[(r1+3)];
+	f2 = f2-f3;
+	f3 = heapFloat[(r4+9)];
+	f5 = heapFloat[(r4+5)];
+	f0 = f4*f0;
+	f1 = f1*f2;
+	f2 = heapFloat[(r1+4)];
+	f3 = f3-f5;
+	f4 = heapFloat[(r4+21)];
+	f0 = f0+f1;
+	f1 = f2*f3;
+	f0 = f0+f1;
+	f1 = -f4;
+if(!(f0 >=f1)) //_LBB636_4
+{
+	r1 = heap32[(fp+2)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	_ZN16btCollisionWorld27ClosestConvexResultCallback15addSingleResultERNS_17LocalConvexResultEb(i7);
+	return;
+}
+}
+}
+	f0 =                         1;
+	f_g0 = f0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld19getConstraintSolverEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+44)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK23btDiscreteDynamicsWorld17getNumConstraintsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+47)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld13getConstraintEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r0 = heap32[(r0+49)];
+	r1 = r1 << 2;
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld11clearForcesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+52)];
+if(!(r1 <1)) //_LBB640_3
+{
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+54)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r1 = (r1 + 1)|0;
+	heap32[(r2+101)] = 0;
+	heap32[(r2+102)] = 0;
+	heap32[(r2+103)] = 0;
+	heap32[(r2+104)] = 0;
+	heap32[(r2+105)] = 0;
+	heap32[(r2+106)] = 0;
+	heap32[(r2+107)] = 0;
+	heap32[(r2+108)] = 0;
+	r2 = heap32[(r0+52)];
+	if(r2 >r1) //_LBB640_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZNK23btDiscreteDynamicsWorld13getConstraintEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r0 = heap32[(r0+49)];
+	r1 = r1 << 2;
+	r0 = (r0 + r1)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld12removeActionEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+63)];
+	r3 = 0;
+_1: while(true){
+	if(r2 >r3) //_LBB642_1
+{
+	r4 = heap32[(r0+65)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r4 !=r1) //_LBB642_3
+{
+	r3 = (r3 + 1)|0;
+continue _1;
+}
+else{
+__label__ = 5;
+break _1;
+}
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+if (__label__ == 4){
+	r3 = r2;
+}
+if(!(r2 <=r3)) //_LBB642_8
+{
+	r1 = (r2 + -1)|0;
+	r2 = r3 << 2;
+	r3 = heap32[(r0+65)];
+	r1 = r1 << 2;
+	r2 = (r3 + r2)|0;
+	r3 = (r3 + r1)|0;
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r2)];
+	r3 = heap32[(r3)];
+	heap32[(r2)] = r3;
+	r2 = heap32[(r0+65)];
+	r1 = (r2 + r1)|0;
+	r1 = r1 >> 2;
+	heap32[(r1)] = r4;
+	r1 = heap32[(r0+63)];
+	r1 = (r1 + -1)|0;
+	heap32[(r0+63)] = r1;
+}
+	return;
+}
+
+function _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+21)];
+if(!(r1 ==0)) //_LBB643_4
+{
+	r3 = heapU8[r0+88];
+if(!(r3 ==0)) //_LBB643_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+21)] = 0;
+}
+	r1 = 1;
+	heap8[r0+88] = r1;
+	heap32[(r2+21)] = 0;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+20)] = 0;
+	r3 = heap32[(r2+16)];
+if(!(r3 ==0)) //_LBB643_8
+{
+	r4 = heapU8[r0+68];
+if(!(r4 ==0)) //_LBB643_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+16)] = 0;
+}
+	heap8[r0+68] = r1;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 0;
+	r3 = heap32[(r2+11)];
+if(!(r3 ==0)) //_LBB643_12
+{
+	r4 = heapU8[r0+48];
+if(!(r4 ==0)) //_LBB643_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	return;
+}
+
+function _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+21)];
+if(!(r1 ==0)) //_LBB644_4
+{
+	r3 = heapU8[r0+88];
+if(!(r3 ==0)) //_LBB644_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+21)] = 0;
+}
+	r1 = 1;
+	heap8[r0+88] = r1;
+	heap32[(r2+21)] = 0;
+	heap32[(r2+19)] = 0;
+	heap32[(r2+20)] = 0;
+	r3 = heap32[(r2+16)];
+if(!(r3 ==0)) //_LBB644_8
+{
+	r4 = heapU8[r0+68];
+if(!(r4 ==0)) //_LBB644_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+16)] = 0;
+}
+	heap8[r0+68] = r1;
+	heap32[(r2+16)] = 0;
+	heap32[(r2+14)] = 0;
+	heap32[(r2+15)] = 0;
+	r3 = heap32[(r2+11)];
+if(!(r3 ==0)) //_LBB644_12
+{
+	r4 = heapU8[r0+48];
+if(!(r4 ==0)) //_LBB644_11
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+11)] = 0;
+}
+	heap8[r0+48] = r1;
+	heap32[(r2+11)] = 0;
+	heap32[(r2+9)] = 0;
+	heap32[(r2+10)] = 0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback13ProcessIslandEPP17btCollisionObjectiPP20btPersistentManifoldii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+5)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = heap32[(fp+4)];
+	r7 = heap32[(r1+4)];
+_1: do {
+	if(r2 <0) //_LBB645_2
+{
+	r0 = 0;
+	r0 = (r0 - r6)|0;
+	if(r7 ==r0) //_LBB645_87
+{
+break _1;
+}
+else{
+	r0 = heap32[(r1+2)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	r8 = heap32[(r1+7)];
+	r9 = heap32[(r1+6)];
+	r10 = heap32[(r1+5)];
+	r11 = heap32[(r1+1)];
+	r1 = heap32[(r1+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r6;
+	heap32[(g0+5)] = r1;
+	heap32[(g0+6)] = r7;
+	heap32[(g0+7)] = r11;
+	heap32[(g0+8)] = r10;
+	heap32[(g0+9)] = r9;
+	heap32[(g0+10)] = r8;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+}
+else{
+	r8 = 1;
+	r9 = 4;
+	r10 = 0;
+_5: while(true){
+	if(r7 >r10) //_LBB645_4
+{
+	r11 = heap32[(r1+3)];
+	r12 = r10 << 2;
+	r12 = (r11 + r12)|0;
+	r12 = r12 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r13 = heap32[(r12+5)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+52)];
+	if(r13 <0) //_LBB645_6
+{
+	r13 = heap32[(r12+6)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+52)];
+}
+	r10 = (r10 + 1)|0;
+	r9 = (r9 + -4)|0;
+	r8 = (r8 + -1)|0;
+	if(r13 ==r2) //_LBB645_10
+{
+__label__ = 9;
+break _5;
+}
+else{
+__label__ = 7;
+}
+}
+else{
+__label__ = 8;
+break _5;
+}
+}
+_11: do {
+switch(__label__ ){//multiple entries
+case 9:
+	r10 = r7 > r10 ? r7 : r10;
+	r7 = (r11 - r9)|0;
+	r9 = (r10 + r8)|0;
+	r8 = 0;
+	r10 = r7;
+_13: while(true){
+	r11 = r10 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r12 = heap32[(r11+5)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+52)];
+	if(r12 <0) //_LBB645_13
+{
+	r12 = heap32[(r11+6)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+52)];
+}
+	r11 = r12 == r2;
+	r11 = r11 & 1;
+	r9 = (r9 + -1)|0;
+	r8 = (r11 + r8)|0;
+	r10 = (r10 + 4)|0;
+if(!(r9 !=0)) //_LBB645_11
+{
+break _11;
+}
+}
+break;
+case 8:
+	r7 = 0;
+	r8 = r7;
+break;
+}
+} while(0);
+	r2 = heap32[(r1+1)];
+	r9 = r2 >> 2;
+	r9 = heap32[(r9+17)];
+	if(r9 <2) //_LBB645_17
+{
+	r0 = 0;
+	r0 = (r0 - r6)|0;
+	if(r8 ==r0) //_LBB645_87
+{
+break _1;
+}
+else{
+	r0 = heap32[(r1+2)];
+	r9 = r0 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+3)];
+	r10 = heap32[(r1+7)];
+	r11 = heap32[(r1+6)];
+	r1 = heap32[(r1+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r6;
+	heap32[(g0+5)] = r7;
+	heap32[(g0+6)] = r8;
+	heap32[(g0+7)] = r2;
+	heap32[(g0+8)] = r1;
+	heap32[(g0+9)] = r11;
+	heap32[(g0+10)] = r10;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	return;
+}
+}
+else{
+_24: do {
+	if(r4 >0) //_LBB645_19
+{
+	r2 = heap32[(r1+9)];
+_26: while(true){
+	r9 = heap32[(r1+10)];
+	if(r9 ==r2) //_LBB645_22
+{
+	r10 = 1;
+	r11 = r2 << 1;
+	r11 = r2 == 0 ? r10 : r11;
+if(!(r9 >=r11)) //_LBB645_21
+{
+	if(r11 !=0) //_LBB645_25
+{
+	r9 = gNumAlignedAllocs;
+	r9 = r9 >> 2;
+	r12 = heap32[(r9)];
+	r13 = r11 << 2;
+	r12 = (r12 + 1)|0;
+	r13 = r13 | 3;
+	heap32[(r9)] = r12;
+	r9 = (r13 + 16)|0;
+	heap32[(g0)] = r9;
+	malloc(i7);
+	r9 = r_g0;
+	if(r9 !=0) //_LBB645_27
+{
+	r12 = 0;
+	r13 = (r9 + 4)|0;
+	r12 = (r12 - r13)|0;
+	r12 = r12 & 15;
+	r12 = (r9 + r12)|0;
+	r13 = (r12 + 4)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = r9;
+	r9 = r13;
+}
+}
+else{
+	r9 = 0;
+}
+	if(r2 <1) //_LBB645_30
+{
+	r13 = heap32[(r1+11)];
+}
+else{
+	r12 = 0;
+_39: while(true){
+	r13 = heap32[(r1+11)];
+	r14 = r12 << 2;
+	r15 = (r13 + r14)|0;
+	r15 = r15 >> 2;
+	r14 = (r9 + r14)|0;
+	r15 = heap32[(r15)];
+	r12 = (r12 + 1)|0;
+	r14 = r14 >> 2;
+	heap32[(r14)] = r15;
+if(!(r2 !=r12)) //_LBB645_31
+{
+break _39;
+}
+}
+}
+	if(r13 !=0) //_LBB645_34
+{
+	r12 = heapU8[r0+48];
+	if(r12 !=0) //_LBB645_36
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r12 = heap32[(r2)];
+	r12 = (r12 + 1)|0;
+	r13 = r13 >> 2;
+	heap32[(r2)] = r12;
+	r2 = heap32[(r13+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+	r2 = heap32[(r1+9)];
+}
+	heap32[(r1+11)] = 0;
+}
+	heap8[r0+48] = r10;
+	heap32[(r1+11)] = r9;
+	heap32[(r1+10)] = r11;
+}
+}
+	r9 = r3 >> 2;
+	r2 = r2 << 2;
+	r10 = heap32[(r1+11)];
+	r2 = (r10 + r2)|0;
+	r9 = heap32[(r9)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r9;
+	r2 = heap32[(r1+9)];
+	r2 = (r2 + 1)|0;
+	r4 = (r4 + -1)|0;
+	r3 = (r3 + 4)|0;
+	heap32[(r1+9)] = r2;
+if(!(r4 !=0)) //_LBB645_20
+{
+break _24;
+}
+}
+}
+} while(0);
+_50: do {
+if(!(r6 <1)) //_LBB645_62
+{
+	r2 = heap32[(r1+14)];
+_52: while(true){
+	r3 = heap32[(r1+15)];
+	if(r3 ==r2) //_LBB645_44
+{
+	r4 = 1;
+	r9 = r2 << 1;
+	r9 = r2 == 0 ? r4 : r9;
+if(!(r3 >=r9)) //_LBB645_43
+{
+	if(r9 !=0) //_LBB645_47
+{
+	r3 = gNumAlignedAllocs;
+	r3 = r3 >> 2;
+	r10 = heap32[(r3)];
+	r11 = r9 << 2;
+	r10 = (r10 + 1)|0;
+	r11 = r11 | 3;
+	heap32[(r3)] = r10;
+	r3 = (r11 + 16)|0;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB645_49
+{
+	r10 = 0;
+	r11 = (r3 + 4)|0;
+	r10 = (r10 - r11)|0;
+	r10 = r10 & 15;
+	r10 = (r3 + r10)|0;
+	r11 = (r10 + 4)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r3;
+	r3 = r11;
+}
+}
+else{
+	r3 = 0;
+}
+	if(r2 <1) //_LBB645_52
+{
+	r11 = heap32[(r1+16)];
+}
+else{
+	r10 = 0;
+_65: while(true){
+	r11 = heap32[(r1+16)];
+	r12 = r10 << 2;
+	r13 = (r11 + r12)|0;
+	r13 = r13 >> 2;
+	r12 = (r3 + r12)|0;
+	r13 = heap32[(r13)];
+	r10 = (r10 + 1)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = r13;
+if(!(r2 !=r10)) //_LBB645_53
+{
+break _65;
+}
+}
+}
+	if(r11 !=0) //_LBB645_56
+{
+	r10 = heapU8[r0+68];
+	if(r10 !=0) //_LBB645_58
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r10 = heap32[(r2)];
+	r10 = (r10 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r2)] = r10;
+	r2 = heap32[(r11+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+	r2 = heap32[(r1+14)];
+}
+	heap32[(r1+16)] = 0;
+}
+	heap8[r0+68] = r4;
+	heap32[(r1+16)] = r3;
+	heap32[(r1+15)] = r9;
+}
+}
+	r3 = r5 >> 2;
+	r2 = r2 << 2;
+	r4 = heap32[(r1+16)];
+	r2 = (r4 + r2)|0;
+	r3 = heap32[(r3)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r3;
+	r2 = heap32[(r1+14)];
+	r2 = (r2 + 1)|0;
+	r6 = (r6 + -1)|0;
+	r5 = (r5 + 4)|0;
+	heap32[(r1+14)] = r2;
+if(!(r6 !=0)) //_LBB645_42
+{
+break _50;
+}
+}
+}
+} while(0);
+_76: do {
+	if(r8 >0) //_LBB645_64
+{
+	r2 = heap32[(r1+19)];
+_78: while(true){
+	r3 = heap32[(r1+20)];
+	if(r3 ==r2) //_LBB645_67
+{
+	r4 = 1;
+	r5 = r2 << 1;
+	r5 = r2 == 0 ? r4 : r5;
+if(!(r3 >=r5)) //_LBB645_66
+{
+	if(r5 !=0) //_LBB645_70
+{
+	r3 = gNumAlignedAllocs;
+	r3 = r3 >> 2;
+	r6 = heap32[(r3)];
+	r9 = r5 << 2;
+	r6 = (r6 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r3)] = r6;
+	r3 = (r9 + 16)|0;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB645_72
+{
+	r6 = 0;
+	r9 = (r3 + 4)|0;
+	r6 = (r6 - r9)|0;
+	r6 = r6 & 15;
+	r6 = (r3 + r6)|0;
+	r9 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = r3;
+	r3 = r9;
+}
+}
+else{
+	r3 = 0;
+}
+	if(r2 <1) //_LBB645_75
+{
+	r9 = heap32[(r1+21)];
+}
+else{
+	r6 = 0;
+_91: while(true){
+	r9 = heap32[(r1+21)];
+	r10 = r6 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r3 + r10)|0;
+	r11 = heap32[(r11)];
+	r6 = (r6 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r2 !=r6)) //_LBB645_76
+{
+break _91;
+}
+}
+}
+	if(r9 !=0) //_LBB645_79
+{
+	r6 = heapU8[r0+88];
+	if(r6 !=0) //_LBB645_81
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r6 = heap32[(r2)];
+	r6 = (r6 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r2)] = r6;
+	r2 = heap32[(r9+-1)];
+	heap32[(g0)] = r2;
+	free(i7);
+	r2 = heap32[(r1+19)];
+}
+	heap32[(r1+21)] = 0;
+}
+	heap8[r0+88] = r4;
+	heap32[(r1+21)] = r3;
+	heap32[(r1+20)] = r5;
+}
+}
+	r3 = r7 >> 2;
+	r2 = r2 << 2;
+	r4 = heap32[(r1+21)];
+	r2 = (r4 + r2)|0;
+	r3 = heap32[(r3)];
+	r2 = r2 >> 2;
+	heap32[(r2)] = r3;
+	r2 = heap32[(r1+19)];
+	r2 = (r2 + 1)|0;
+	r8 = (r8 + -1)|0;
+	r7 = (r7 + 4)|0;
+	heap32[(r1+19)] = r2;
+if(!(r8 !=0)) //_LBB645_65
+{
+break _76;
+}
+}
+}
+else{
+	r2 = heap32[(r1+19)];
+}
+} while(0);
+	r3 = heap32[(r1+1)];
+	r3 = r3 >> 2;
+	r1 = heap32[(r1+14)];
+	r1 = (r1 + r2)|0;
+	r2 = heap32[(r3+17)];
+if(!(r1 <=r2)) //_LBB645_87
+{
+	heap32[(g0)] = r0;
+	_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback18processConstraintsEv(i7);
+}
+}
+}
+} while(0);
+	return;
+}
+
+function _ZN20btAlignedObjectArrayIP17btTypedConstraintE17quickSortInternalI33btSortConstraintOnIslandPredicateEEvT_ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = (r0 + r1)|0;
+	r3 = r2 >>> 31;
+	r4 = heap32[(fp)];
+	r2 = (r2 + r3)|0;
+	r3 = r4 >> 2;
+	r2 = r2 & 2147483646;
+	r5 = heap32[(r3+3)];
+	r2 = r2 << 1;
+	r2 = (r5 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r5 = r1;
+	r6 = r0;
+_1: while(true){
+	r7 = r2 >> 2;
+	r8 = heap32[(r7+5)];
+	r8 = r8 >> 2;
+	r9 = heap32[(r3+3)];
+	r8 = heap32[(r8+52)];
+_3: while(true){
+	r10 = r5 << 2;
+	r10 = (r9 + r10)|0;
+	r10 = r10 >> 2;
+	r11 = heap32[(r10)];
+	if(r8 <0) //_LBB646_5
+{
+	r12 = heap32[(r7+6)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+52)];
+}
+else{
+	r12 = r8;
+}
+	r13 = r11 >> 2;
+	r14 = heap32[(r13+5)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+52)];
+	if(r14 <0) //_LBB646_8
+{
+	r14 = heap32[(r13+6)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+52)];
+}
+	if(r14 <r12) //_LBB646_2
+{
+	r5 = (r5 + 1)|0;
+continue _3;
+}
+else{
+break _3;
+}
+}
+_13: while(true){
+	r12 = r6 << 2;
+	r13 = (r9 + r12)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r14 = r13 >> 2;
+	r15 = heap32[(r14+5)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+52)];
+	if(r15 <0) //_LBB646_13
+{
+	r15 = heap32[(r14+6)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+52)];
+}
+	if(r8 <0) //_LBB646_16
+{
+	r14 = heap32[(r7+6)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+52)];
+}
+else{
+	r14 = r8;
+}
+	if(r14 <r15) //_LBB646_10
+{
+	r6 = (r6 + -1)|0;
+continue _13;
+}
+else{
+break _13;
+}
+}
+	if(r5 <=r6) //_LBB646_20
+{
+	heap32[(r10)] = r13;
+	r7 = heap32[(r3+3)];
+	r7 = (r7 + r12)|0;
+	r5 = (r5 + 1)|0;
+	r6 = (r6 + -1)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r11;
+}
+	if(r5 <=r6) //_LBB646_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+if(!(r6 <=r1)) //_LBB646_24
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r6;
+	_ZN20btAlignedObjectArrayIP17btTypedConstraintE17quickSortInternalI33btSortConstraintOnIslandPredicateEEvT_ii(i7);
+}
+if(!(r5 >=r0)) //_LBB646_26
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r0;
+	_ZN20btAlignedObjectArrayIP17btTypedConstraintE17quickSortInternalI33btSortConstraintOnIslandPredicateEEvT_ii(i7);
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld9serializeEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+8)];
+	r3 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r4 = r3 >> 2;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r4+2)];
+if(!(r2 <1)) //_LBB647_5
+{
+	r2 = 0;
+_3: while(true){
+	r5 = heap32[(r4+4)];
+	r6 = r2 << 2;
+	r5 = (r5 + r6)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r6 = heapU8[r5+232];
+	r6 = r6 & 2;
+if(!(r6 ==0)) //_LBB647_4
+{
+	r6 = r5 >> 2;
+	r7 = heap32[(r6)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+4)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r7 = r_g0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r8 = r7 >> 2;
+	r6 = heap32[(r6+5)];
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1497645650;
+	heap32[(g0+4)] = r5;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+}
+	r2 = (r2 + 1)|0;
+	r5 = heap32[(r4+2)];
+	if(r5 >r2) //_LBB647_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r2 = heap32[(r4+47)];
+_9: do {
+if(!(r2 <1)) //_LBB647_8
+{
+	r2 = 0;
+_11: while(true){
+	r5 = r2 << 2;
+	r6 = heap32[(r4+49)];
+	r5 = (r6 + r5)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r6 = r5 >> 2;
+	r7 = heap32[(r6)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r7 = r_g0;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r8 = r7 >> 2;
+	r6 = heap32[(r6+10)];
+	r8 = heap32[(r8+2)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+5)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1397641027;
+	heap32[(g0+4)] = r5;
+	r2 = (r2 + 1)|0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r5 = heap32[(r4+47)];
+	if(r5 >r2) //_LBB647_7
+{
+continue _11;
+}
+else{
+break _9;
+}
+}
+}
+} while(0);
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	_ZN16btCollisionWorld25serializeCollisionObjectsEP12btSerializer(i7);
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+9)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld19setConstraintSolverEP18btConstraintSolver(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+245];
+if(!(r1 ==0)) //_LBB648_3
+{
+	r1 = r0 >> 2;
+	r1 = heap32[(r1+44)];
+if(!(r1 ==0)) //_LBB648_3
+{
+	r2 = gNumAlignedFree;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r3 = (r3 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r2)] = r3;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heap32[(fp+1)];
+	r2 = 0;
+	r3 = r0 >> 2;
+	heap8[r0+245] = r2;
+	heap32[(r3+44)] = r1;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld25predictUnconstraintMotionEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = _2E_str87;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r1 = heap32[(r0+52)];
+if(!(r1 <1)) //_LBB649_5
+{
+	f0 = heapFloat[(fp+1)];
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+54)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r3 = heapU8[r2+204];
+	r3 = r3 & 3;
+if(!(r3 !=0)) //_LBB649_4
+{
+	heap32[(g0)] = r2;
+	heapFloat[(g0+1)] = f0;
+	_ZN11btRigidBody19integrateVelocitiesEf(i7);
+	heap32[(g0)] = r2;
+	heapFloat[(g0+1)] = f0;
+	_ZN11btRigidBody12applyDampingEf(i7);
+	r3 = r2 >> 2;
+	f1 = heapFloat[(r3+76)];
+	f2 = heapFloat[(r3+77)];
+	f3 = heapFloat[(r3+78)];
+	r3 = (r2 + 4)|0;
+	r4 = (r2 + 320)|0;
+	r2 = (r2 + 68)|0;
+	heap32[(g0)] = r3;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	heapFloat[(g0+3)] = f3;
+	heap32[(g0+4)] = r4;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r2;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+52)];
+	if(r2 >r1) //_LBB649_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_9: do {
+if(!(r3 !=0)) //_LBB649_11
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB649_8
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB649_11
+{
+break _9;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld26calculateSimulationIslandsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = _2E_str188;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r0 = r1 >> 2;
+	r2 = heap32[(r0+45)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	r4 = heap32[(r0+6)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r4;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = heap32[(r0+47)];
+if(!(r2 <1)) //_LBB650_21
+{
+	r3 = 0;
+_3: while(true){
+	r4 = heap32[(r0+49)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r5 = heap32[(r4+5)];
+_5: do {
+if(!(r5 ==0)) //_LBB650_20
+{
+	r6 = heapU8[r5+204];
+	r6 = r6 & 3;
+if(!(r6 !=0)) //_LBB650_20
+{
+	r4 = heap32[(r4+6)];
+if(!(r4 ==0)) //_LBB650_20
+{
+	r6 = heapU8[r4+204];
+	r6 = r6 & 3;
+if(!(r6 !=0)) //_LBB650_20
+{
+	r5 = r5 >> 2;
+	r6 = heap32[(r5+54)];
+	if(r6 ==2) //_LBB650_8
+{
+__label__ = 8;
+}
+else{
+	if(r6 !=5) //_LBB650_10
+{
+__label__ = 10;
+}
+else{
+__label__ = 8;
+}
+}
+if (__label__ == 8){
+	r6 = r4 >> 2;
+	r6 = heap32[(r6+54)];
+	if(r6 ==2) //_LBB650_20
+{
+break _5;
+}
+else{
+	if(r6 ==5) //_LBB650_20
+{
+break _5;
+}
+}
+}
+	r6 = heap32[(r0+45)];
+	r5 = heap32[(r5+52)];
+	r6 = r6 >> 2;
+	r7 = heap32[(r6+4)];
+	r8 = r5 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r4 = r4 >> 2;
+	r8 = heap32[(r8)];
+	r4 = heap32[(r4+52)];
+if(!(r8 ==r5)) //_LBB650_12
+{
+_17: while(true){
+	r8 = r8 << 3;
+	r5 = r5 << 3;
+	r8 = (r7 + r8)|0;
+	r5 = (r7 + r5)|0;
+	r7 = r8 >> 2;
+	r5 = r5 >> 2;
+	r8 = heap32[(r7)];
+	heap32[(r5)] = r8;
+	r5 = heap32[(r7)];
+	r7 = heap32[(r6+4)];
+	r8 = r5 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+if(!(r8 !=r5)) //_LBB650_13
+{
+break _17;
+}
+}
+}
+	r8 = r4 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+_20: do {
+if(!(r8 ==r4)) //_LBB650_16
+{
+_21: while(true){
+	r8 = r8 << 3;
+	r4 = r4 << 3;
+	r8 = (r7 + r8)|0;
+	r4 = (r7 + r4)|0;
+	r7 = r8 >> 2;
+	r4 = r4 >> 2;
+	r8 = heap32[(r7)];
+	heap32[(r4)] = r8;
+	r4 = heap32[(r7)];
+	r7 = heap32[(r6+4)];
+	r8 = r4 << 3;
+	r8 = (r7 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+if(!(r8 !=r4)) //_LBB650_17
+{
+break _20;
+}
+}
+}
+} while(0);
+if(!(r5 ==r4)) //_LBB650_20
+{
+	r5 = r5 << 3;
+	r7 = (r7 + r5)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r4;
+	r6 = heap32[(r6+4)];
+	r4 = r4 << 3;
+	r4 = (r6 + r4)|0;
+	r5 = (r6 + r5)|0;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r4+1)];
+	r5 = heap32[(r5+1)];
+	r5 = (r5 + r6)|0;
+	heap32[(r4+1)] = r5;
+}
+}
+}
+}
+}
+} while(0);
+	r3 = (r3 + 1)|0;
+	if(r2 !=r3) //_LBB650_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = heap32[(r0+45)];
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_27: do {
+if(!(r3 !=0)) //_LBB650_27
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB650_24
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB650_27
+{
+break _27;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback18processConstraintsEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+14)];
+	r3 = heap32[(r1+19)];
+	r4 = (r3 + r2)|0;
+if(!(r4 <1)) //_LBB651_2
+{
+	r4 = heap32[(r1+2)];
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+3)];
+	r6 = heap32[(r1+7)];
+	r7 = heap32[(r1+6)];
+	r8 = heap32[(r1+5)];
+	r9 = heap32[(r1+1)];
+	r10 = heap32[(r1+21)];
+	r11 = heap32[(r1+16)];
+	r12 = heap32[(r1+9)];
+	r13 = heap32[(r1+11)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r13;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r11;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r10;
+	heap32[(g0+6)] = r3;
+	heap32[(g0+7)] = r9;
+	heap32[(g0+8)] = r8;
+	heap32[(g0+9)] = r7;
+	heap32[(g0+10)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r2 = heap32[(r1+9)];
+if(!(r2 >-1)) //_LBB651_10
+{
+	r3 = heap32[(r1+10)];
+if(!(r3 >-1)) //_LBB651_9
+{
+	r3 = heap32[(r1+11)];
+if(!(r3 ==0)) //_LBB651_8
+{
+	r4 = heapU8[r0+48];
+if(!(r4 ==0)) //_LBB651_7
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+11)] = 0;
+}
+	r3 = 1;
+	heap8[r0+48] = r3;
+	heap32[(r1+11)] = 0;
+	heap32[(r1+10)] = 0;
+}
+_14: while(true){
+	r3 = r2 << 2;
+	r4 = heap32[(r1+11)];
+	r3 = (r4 + r3)|0;
+	r2 = (r2 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 0;
+	if(r2 !=0) //_LBB651_9
+{
+continue _14;
+}
+else{
+break _14;
+}
+}
+}
+	heap32[(r1+9)] = 0;
+	r2 = heap32[(r1+14)];
+_17: do {
+if(!(r2 >-1)) //_LBB651_18
+{
+	r3 = heap32[(r1+15)];
+if(!(r3 >-1)) //_LBB651_17
+{
+	r3 = heap32[(r1+16)];
+if(!(r3 ==0)) //_LBB651_16
+{
+	r4 = heapU8[r0+68];
+if(!(r4 ==0)) //_LBB651_15
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+16)] = 0;
+}
+	r3 = 1;
+	heap8[r0+68] = r3;
+	heap32[(r1+16)] = 0;
+	heap32[(r1+15)] = 0;
+}
+_27: while(true){
+	r3 = r2 << 2;
+	r4 = heap32[(r1+16)];
+	r3 = (r4 + r3)|0;
+	r2 = (r2 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = 0;
+	if(r2 !=0) //_LBB651_17
+{
+continue _27;
+}
+else{
+break _17;
+}
+}
+}
+} while(0);
+	heap32[(r1+14)] = 0;
+	r2 = heap32[(r1+19)];
+_30: do {
+if(!(r2 >-1)) //_LBB651_26
+{
+	r3 = heap32[(r1+20)];
+if(!(r3 >-1)) //_LBB651_25
+{
+	r3 = heap32[(r1+21)];
+if(!(r3 ==0)) //_LBB651_24
+{
+	r4 = heapU8[r0+88];
+if(!(r4 ==0)) //_LBB651_23
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r1+21)] = 0;
+}
+	r3 = 1;
+	heap8[r0+88] = r3;
+	heap32[(r1+21)] = 0;
+	heap32[(r1+20)] = 0;
+}
+_40: while(true){
+	r0 = r2 << 2;
+	r3 = heap32[(r1+21)];
+	r0 = (r3 + r0)|0;
+	r2 = (r2 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	if(r2 !=0) //_LBB651_25
+{
+continue _40;
+}
+else{
+break _30;
+}
+}
+}
+} while(0);
+	heap32[(r1+19)] = 0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld9addActionEP17btActionInterface(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+64)];
+	r3 = heap32[(r1+63)];
+	r4 = heap32[(fp+1)];
+	if(r2 ==r3) //_LBB652_2
+{
+	r5 = 1;
+	r6 = r3 << 1;
+	r6 = r3 == 0 ? r5 : r6;
+if(!(r2 >=r6)) //_LBB652_1
+{
+	if(r6 !=0) //_LBB652_5
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r7 = heap32[(r2)];
+	r8 = r6 << 2;
+	r7 = (r7 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r2)] = r7;
+	r2 = (r8 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB652_7
+{
+	r7 = 0;
+	r8 = (r2 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r2 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = 0;
+}
+	r7 = (r0 + 260)|0;
+	if(r3 <1) //_LBB652_10
+{
+	r8 = r7 >> 2;
+	r9 = heap32[(r8)];
+}
+else{
+	r8 = 0;
+_12: while(true){
+	r9 = r7 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r8 << 2;
+	r11 = (r9 + r10)|0;
+	r11 = r11 >> 2;
+	r10 = (r2 + r10)|0;
+	r11 = heap32[(r11)];
+	r8 = (r8 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r11;
+if(!(r3 !=r8)) //_LBB652_11
+{
+break _12;
+}
+}
+	r7 = (r0 + 260)|0;
+}
+	if(r9 !=0) //_LBB652_15
+{
+	r8 = heapU8[r0+264];
+	if(r8 !=0) //_LBB652_17
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r8 = heap32[(r3)];
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r3)] = r8;
+	r3 = heap32[(r9+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+	r3 = heap32[(r1+63)];
+}
+	r8 = r7 >> 2;
+	heap32[(r8)] = 0;
+}
+	r7 = r7 >> 2;
+	heap8[r0+264] = r5;
+	heap32[(r7)] = r2;
+	heap32[(r1+64)] = r6;
+}
+}
+	r0 = r3 << 2;
+	r2 = heap32[(r1+65)];
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r4;
+	r0 = heap32[(r1+63)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1+63)] = r0;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld19integrateTransformsEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+var __label__ = 0;
+	i7 = sp + -264;var g0 = i7>>2; // save stack
+	r0 = _2E_str794;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+52)];
+if(!(r2 <1)) //_LBB653_19
+{
+	f0 = heapFloat[(fp+1)];
+	r2 = 0;
+	r15 = -1;
+_3: while(true){
+	r3 = heap32[(r0+54)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	heap32[(r4+60)] = 1065353216;
+	r5 = heap32[(r4+54)];
+if(!(r5 ==2)) //_LBB653_18
+{
+if(!(r5 ==5)) //_LBB653_18
+{
+	r5 = heapU8[r3+204];
+	r5 = r5 & 3;
+if(!(r5 !=0)) //_LBB653_18
+{
+	f1 = heapFloat[(r4+76)];
+	f2 = heapFloat[(r4+77)];
+	f3 = heapFloat[(r4+78)];
+	r5 = (r3 + 320)|0;
+	r6 = (r3 + 4)|0;
+	r7 = sp + -80;
+	heap32[(g0)] = r6;
+	heapFloat[(g0+1)] = f1;
+	heapFloat[(g0+2)] = f2;
+	heapFloat[(g0+3)] = f3;
+	heap32[(g0+4)] = r5;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r7;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	f1 = heapFloat[(r4+62)];
+	f1 = f1*f1;
+	f2 =                         0;
+_9: do {
+if(!(f1 ==f2)) //_LBB653_17
+{
+	r8 = r7 >> 2;
+	f2 = heapFloat[(r8+14)];
+	f3 = heapFloat[(r4+15)];
+	f4 = heapFloat[(r8+13)];
+	f5 = heapFloat[(r4+14)];
+	f6 = heapFloat[(r8+12)];
+	f7 = heapFloat[(r4+13)];
+	f2 = f2-f3;
+	f3 = f4-f5;
+	f4 = f6-f7;
+	f4 = f4*f4;
+	f3 = f3*f3;
+	f3 = f4+f3;
+	f2 = f2*f2;
+	f2 = f3+f2;
+if(!(f1 >=f2)) //_LBB653_17
+{
+	r9 = _2E_str895;
+	heap32[(g0)] = r9;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r9 = heap32[(r4+48)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+1)];
+if(!(r9 >19)) //_LBB653_11
+{
+	r9 = gNumClampedCcdMotions;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r10 = (r10 + 1)|0;
+	heap32[(r9)] = r10;
+	r9 = heap32[(r0+20)];
+	r10 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+9)];
+	r11 = heap32[(r0+6)];
+	r12 = sp + -176;
+	heap32[(g0)] = r9;
+	r9 = r12 >> 2;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r13 = 1;
+	heap32[(r9+1)] = 1065353216;
+	r14 = _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE;
+	heap16[(sp+-168)>>1] = r13;
+	r13 = (r14 + 8)|0;
+	heap16[(sp+-166)>>1] = r15;
+	heap32[(fp+-44)] = r13;
+	heap32[(r9+3)] = heap32[(r4+13)];
+	heap32[(r9+4)] = heap32[(r4+14)];
+	heap32[(r9+5)] = heap32[(r4+15)];
+	heap32[(r9+6)] = heap32[(r4+16)];
+	heap32[(r9+7)] = heap32[(r8+12)];
+	heap32[(r9+8)] = heap32[(r8+13)];
+	heap32[(r9+9)] = heap32[(r8+14)];
+	r14 = _ZTV34btClosestNotMeConvexResultCallback;
+	heap32[(r9+10)] = heap32[(r8+15)];
+	r8 = (r14 + 8)|0;
+	heap32[(r9+19)] = 0;
+	heap32[(fp+-44)] = r8;
+	heap32[(r9+20)] = r3;
+	heap32[(r9+21)] = 0;
+	heap32[(r9+22)] = r_g0;
+	r8 = sp + -232;
+	heap32[(r9+23)] = r11;
+	r10 = r8 >> 2;
+	f1 = heapFloat[(r4+61)];
+	heap32[(r10+2)] = 0;
+	heap32[(r10+3)] = 1065353216;
+	heap32[(r10+4)] = 1065353216;
+	r11 = _ZTV13btSphereShape;
+	heap32[(r10+5)] = 1065353216;
+	r11 = (r11 + 8)|0;
+	heap32[(r10+6)] = 0;
+	heap32[(fp+-58)] = r11;
+	heap32[(r10+1)] = 8;
+	heapFloat[(r10+7)] = f1;
+	heapFloat[(r10+11)] = f1;
+	r10 = heap32[(r4+47)];
+	r10 = heapU16[(r10+4)>>1];
+	heap16[(sp+-168)>>1] = r10;
+	r10 = heap32[(r4+47)];
+	r10 = heapU16[(r10+6)>>1];
+	heap16[(sp+-166)>>1] = r10;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r12;
+	heap32[(g0+5)] = 0;
+	_ZNK16btCollisionWorld15convexSweepTestEPK13btConvexShapeRK11btTransformS5_RNS_20ConvexResultCallbackEf(i7);
+	f1 = heapFloat[(r9+1)];
+	f2 =                         1;
+if(!(f1 >=f2)) //_LBB653_10
+{
+	heapFloat[(r4+60)] = f1;
+	f2 = heapFloat[(r4+76)];
+	f3 = heapFloat[(r4+77)];
+	f4 = heapFloat[(r4+78)];
+	f1 = f1*f0;
+	heap32[(g0)] = r6;
+	heapFloat[(g0+1)] = f2;
+	heapFloat[(g0+2)] = f3;
+	heapFloat[(g0+3)] = f4;
+	heap32[(g0+4)] = r5;
+	heapFloat[(g0+5)] = f1;
+	heap32[(g0+6)] = r7;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	heap32[(r4+60)] = 0;
+}
+	r4 = _ZTV13btConvexShape;
+	r4 = (r4 + 8)|0;
+	heap32[(fp+-58)] = r4;
+	heap32[(fp+-44)] = r13;
+}
+	r4 = _ZN15CProfileManager11CurrentNodeE;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = r5 >> 2;
+	r8 = heap32[(r6+4)];
+	r8 = (r8 + -1)|0;
+	heap32[(r6+4)] = r8;
+if(!(r8 !=0)) //_LBB653_17
+{
+	r8 = heap32[(r6+1)];
+	if(r8 !=0) //_LBB653_14
+{
+	r5 = sp + -8;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 0;
+	r8 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+	r8 = r8 >> 2;
+	r5 = r5 >> 2;
+	r9 = heap32[(fp+-2)];
+	r10 = heap32[(r8)];
+	r9 = (r9 - r10)|0;
+	r5 = heap32[(r5+1)];
+	r8 = heap32[(r8+1)];
+	r5 = (r5 - r8)|0;
+	r8 = (r9 * 1000000)|0;
+	r5 = (r5 + r8)|0;
+	r8 = heap32[(r6+3)];
+	r5 = (r5 - r8)|0;
+	f1 = uint(r5); //fuitos r5, f1
+	f2 =                      1000;
+	f3 = heapFloat[(r6+2)];
+	f1 = f1/f2;
+	f1 = f3+f1;
+	heapFloat[(r6+2)] = f1;
+	r5 = heap32[(r6+4)];
+	if(r5 !=0) //_LBB653_17
+{
+break _9;
+}
+else{
+	r5 = heap32[(r4)];
+}
+}
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+5)];
+	heap32[(r4)] = r5;
+}
+}
+}
+} while(0);
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	_ZN11btRigidBody18proceedToTransformERK11btTransform(i7);
+}
+}
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r0+52)];
+	if(r3 >r2) //_LBB653_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_26: do {
+if(!(r3 !=0)) //_LBB653_25
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB653_22
+{
+	r1 = sp + -16;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-4)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB653_25
+{
+break _26;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfo(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -168;var g0 = i7>>2; // save stack
+	r0 = _2E_str996;
+	heap32[(g0)] = r0;
+	r0 = sp + -48;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r1 = 1;
+	r2 = r0 >> 2;
+	heap8[sp+-32] = r1;
+	heap32[(r2+3)] = 0;
+	r3 = heap32[(fp)];
+	heap32[(r2+1)] = 0;
+	r4 = r3 >> 2;
+	heap32[(r2+2)] = 0;
+	r5 = heap32[(r4+47)];
+if(!(r5 <1)) //_LBB654_7
+{
+	r6 = gNumAlignedAllocs;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	r8 = r5 << 2;
+	r7 = (r7 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r6)] = r7;
+	r6 = (r8 + 16)|0;
+	heap32[(g0)] = r6;
+	malloc(i7);
+	r6 = r_g0;
+	if(r6 !=0) //_LBB654_3
+{
+	r7 = 0;
+	r8 = (r6 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r6 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r6;
+	r6 = r8;
+}
+	r7 = 1;
+	heap8[sp+-32] = r7;
+	r7 = (r7 - r5)|0;
+	r8 = 0;
+	heap32[(r2+3)] = r6;
+	heap32[(r2+2)] = r5;
+_6: while(true){
+	r9 = r8 << 2;
+	r6 = (r6 - r9)|0;
+	r6 = r6 >> 2;
+	heap32[(r6)] = 0;
+	if(r7 ==r8) //_LBB654_7
+{
+break _6;
+}
+else{
+	r6 = heap32[(r2+3)];
+	r8 = (r8 + -1)|0;
+continue _6;
+}
+}
+}
+	heap32[(r2+1)] = r5;
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+24)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r5 = r_g0;
+_10: do {
+if(!(r5 <1)) //_LBB654_10
+{
+	r5 = 0;
+_12: while(true){
+	r6 = r5 << 2;
+	r7 = heap32[(r4+49)];
+	r7 = (r7 + r6)|0;
+	r7 = r7 >> 2;
+	r8 = heap32[(r2+3)];
+	r6 = (r8 + r6)|0;
+	r7 = heap32[(r7)];
+	r6 = r6 >> 2;
+	heap32[(r6)] = r7;
+	r6 = heap32[(r4)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+24)];
+	r5 = (r5 + 1)|0;
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = r_g0;
+	if(r6 >r5) //_LBB654_9
+{
+continue _12;
+}
+else{
+break _10;
+}
+}
+}
+} while(0);
+	r5 = heap32[(r2+1)];
+if(!(r5 <2)) //_LBB654_12
+{
+	r5 = (r5 + -1)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r5;
+	_ZN20btAlignedObjectArrayIP17btTypedConstraintE17quickSortInternalI33btSortConstraintOnIslandPredicateEEvT_ii(i7);
+}
+	r0 = heap32[(fp+1)];
+	r5 = heap32[(r4)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+24)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB654_14
+{
+	r3 = heap32[(r2+3)];
+}
+else{
+	r3 = 0;
+}
+	r5 = heap32[(r4+6)];
+	r6 = heap32[(r4+44)];
+	r7 = _ZTVZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback;
+	r8 = heap32[(r4+19)];
+	r9 = heap32[(r4+21)];
+	r10 = heap32[(r2+1)];
+	r11 = sp + -144;
+	r7 = (r7 + 8)|0;
+	r12 = r11 >> 2;
+	heap32[(fp+-36)] = r7;
+	heap32[(r12+1)] = r0;
+	heap32[(r12+2)] = r6;
+	heap32[(r12+3)] = r3;
+	heap32[(r12+4)] = r10;
+	heap32[(r12+5)] = r9;
+	heap32[(r12+6)] = r8;
+	heap32[(r12+7)] = r5;
+	heap8[sp+-96] = r1;
+	heap32[(r12+11)] = 0;
+	heap32[(r12+9)] = 0;
+	heap32[(r12+10)] = 0;
+	heap8[sp+-76] = r1;
+	heap32[(r12+16)] = 0;
+	heap32[(r12+14)] = 0;
+	heap32[(r12+15)] = 0;
+	heap8[sp+-56] = r1;
+	heap32[(r12+21)] = 0;
+	heap32[(r12+19)] = 0;
+	r3 = r6 >> 2;
+	heap32[(r12+20)] = 0;
+	r6 = r5 >> 2;
+	r3 = heap32[(r3)];
+	r6 = heap32[(r6)];
+	r3 = r3 >> 2;
+	r6 = r6 >> 2;
+	r3 = heap32[(r3+2)];
+	r6 = heap32[(r6+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r6 = heap32[(r4+2)];
+	r8 = heap32[(r4+44)];
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = heap32[(r4+45)];
+	r5 = heap32[(r4+6)];
+	r6 = _2E_str155;
+	heap32[(g0)] = r6;
+	r6 = r3 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r8 = heap32[(r6+7)];
+_22: do {
+if(!(r8 >-1)) //_LBB654_23
+{
+	r9 = heap32[(r6+8)];
+if(!(r9 >-1)) //_LBB654_22
+{
+	r9 = heap32[(r6+9)];
+if(!(r9 ==0)) //_LBB654_21
+{
+	r10 = heapU8[r3+40];
+if(!(r10 ==0)) //_LBB654_20
+{
+	r10 = gNumAlignedFree;
+	r10 = r10 >> 2;
+	r13 = heap32[(r10)];
+	r13 = (r13 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r10)] = r13;
+	r9 = heap32[(r9+-1)];
+	heap32[(g0)] = r9;
+	free(i7);
+}
+	heap32[(r6+9)] = 0;
+}
+	r9 = 1;
+	heap8[r3+40] = r9;
+	heap32[(r6+9)] = 0;
+	heap32[(r6+8)] = 0;
+}
+_32: while(true){
+	r9 = r8 << 2;
+	r10 = heap32[(r6+9)];
+	r9 = (r10 + r9)|0;
+	r8 = (r8 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = 0;
+	if(r8 !=0) //_LBB654_22
+{
+continue _32;
+}
+else{
+break _22;
+}
+}
+}
+} while(0);
+	heap32[(r6+7)] = 0;
+	r8 = heap32[(r6+2)];
+	if(r8 >0) //_LBB654_25
+{
+	r9 = 0;
+_37: while(true){
+	r10 = heap32[(r6+4)];
+	r13 = r9 << 3;
+	r13 = (r10 + r13)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r14 = r9 << 1;
+	if(r9 ==r13) //_LBB654_28
+{
+	r16 = r9;
+}
+else{
+	r15 = r10;
+	r16 = r9;
+_42: while(true){
+	r13 = r13 << 3;
+	r16 = r16 << 3;
+	r13 = (r15 + r13)|0;
+	r15 = (r15 + r16)|0;
+	r13 = r13 >> 2;
+	r15 = r15 >> 2;
+	r16 = heap32[(r13)];
+	heap32[(r15)] = r16;
+	r16 = heap32[(r13)];
+	r15 = heap32[(r6+4)];
+	r13 = r16 << 3;
+	r13 = (r15 + r13)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+if(!(r13 !=r16)) //_LBB654_29
+{
+break _42;
+}
+}
+}
+	r13 = r14 << 2;
+	r10 = (r10 + r13)|0;
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r16;
+if(!(r8 !=r9)) //_LBB654_26
+{
+break _37;
+}
+}
+	r8 = heap32[(r6+2)];
+	if(r8 >1) //_LBB654_33
+{
+	r9 = (r3 + 4)|0;
+	r8 = (r8 + -1)|0;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r8;
+	_ZN20btAlignedObjectArrayI9btElementE17quickSortInternalI31btUnionFindElementSortPredicateEEvT_ii(i7);
+	r8 = heap32[(r6+2)];
+}
+}
+	r9 = 0;
+_48: while(true){
+	r10 = r9;
+	if(r10 <r8) //_LBB654_35
+{
+	r13 = heap32[(r6+4)];
+	r9 = r10 << 3;
+	r9 = (r13 + r9)|0;
+	r9 = r9 >> 2;
+	r14 = heap32[(r9)];
+	r15 = (r10 + 1)|0;
+_51: while(true){
+	r9 = r15;
+	if(r9 >=r8) //_LBB654_46
+{
+break _51;
+}
+else{
+	r15 = r9 << 3;
+	r15 = (r13 + r15)|0;
+	r16 = r15 >> 2;
+	r15 = (r9 + 1)|0;
+	r16 = heap32[(r16)];
+if(!(r16 ==r14)) //_LBB654_36
+{
+break _51;
+}
+}
+}
+	r16 = 1;
+	r15 = r10;
+_55: while(true){
+	if(r15 <r9) //_LBB654_38
+{
+	r17 = r15 << 3;
+	r17 = (r13 + r17)|0;
+	r17 = r17 >> 2;
+	r17 = heap32[(r17+1)];
+	r18 = heap32[(r4+4)];
+	r17 = r17 << 2;
+	r17 = (r18 + r17)|0;
+	r17 = r17 >> 2;
+	r17 = heap32[(r17)];
+	r17 = r17 >> 2;
+	r18 = heap32[(r17+52)];
+	if(r18 ==r14) //_LBB654_42
+{
+	r17 = heap32[(r17+54)];
+	r18 = 0;
+	if(r17 ==4) //_LBB654_44
+{
+	r16 = r18;
+}
+else{
+	r16 = r17 == 1 ? r18 : r16;
+}
+}
+else{
+	if(r18 !=-1) //_LBB654_41
+{
+__label__ = 37;
+break _48;
+}
+}
+	r15 = (r15 + 1)|0;
+}
+else{
+break _55;
+}
+}
+	r13 = r16 & 255;
+	if(r13 ==0) //_LBB654_50
+{
+_67: while(true){
+	if(r10 <r9) //_LBB654_58
+{
+	r13 = heap32[(r6+4)];
+	r15 = r10 << 3;
+	r13 = (r13 + r15)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+1)];
+	r15 = heap32[(r4+4)];
+	r13 = r13 << 2;
+	r13 = (r15 + r13)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r15 = heap32[(r13+52)];
+	if(r15 ==r14) //_LBB654_61
+{
+	r15 = heap32[(r13+54)];
+if(!(r15 !=2)) //_LBB654_63
+{
+	heap32[(r13+54)] = 3;
+	heap32[(r13+55)] = 0;
+}
+}
+else{
+if(!(r15 ==-1)) //_LBB654_63
+{
+__label__ = 54;
+break _48;
+}
+}
+	r10 = (r10 + 1)|0;
+continue _67;
+}
+else{
+continue _48;
+}
+}
+}
+else{
+_75: while(true){
+	if(r10 <r9) //_LBB654_51
+{
+	r13 = heap32[(r6+4)];
+	r15 = r10 << 3;
+	r13 = (r13 + r15)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+1)];
+	r15 = heap32[(r4+4)];
+	r13 = r13 << 2;
+	r13 = (r15 + r13)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r15 = heap32[(r13+52)];
+	if(r15 ==r14) //_LBB654_54
+{
+	r15 = heap32[(r13+54)];
+	r15 = (r15 + -4)|0;
+if(!(uint(r15) <uint(2))) //_LBB654_56
+{
+	heap32[(r13+54)] = 2;
+}
+}
+else{
+if(!(r15 ==-1)) //_LBB654_56
+{
+__label__ = 47;
+break _48;
+}
+}
+	r10 = (r10 + 1)|0;
+continue _75;
+}
+else{
+continue _48;
+}
+}
+}
+}
+else{
+__label__ = 60;
+break _48;
+}
+}
+switch(__label__ ){//multiple entries
+case 37:
+	r0 = _2E_str1156;
+	r1 = _2E_str2157;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 242;
+	_assert(i7);
+break;
+case 54:
+	r0 = _2E_str1156;
+	r1 = _2E_str2157;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 290;
+	_assert(i7);
+break;
+case 60:
+	r8 = r5 >> 2;
+	r9 = heap32[(r8)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r9 = r_g0;
+_87: do {
+if(!(r9 <1)) //_LBB654_104
+{
+	r10 = 0;
+_89: while(true){
+	r13 = heap32[(r8)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+10)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r10;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r13 = r_g0;
+	r14 = r13 >> 2;
+	r15 = heap32[(r14+277)];
+	r14 = heap32[(r14+278)];
+	if(r15 ==0) //_LBB654_70
+{
+__label__ = 64;
+}
+else{
+	r16 = r15 >> 2;
+	r16 = heap32[(r16+54)];
+	if(r16 !=2) //_LBB654_72
+{
+__label__ = 66;
+}
+else{
+__label__ = 64;
+}
+}
+if (__label__ == 64){
+	if(r14 ==0) //_LBB654_103
+{
+__label__ = 95;
+}
+else{
+	r16 = r14 >> 2;
+	r16 = heap32[(r16+54)];
+	if(r16 ==2) //_LBB654_103
+{
+__label__ = 95;
+}
+else{
+__label__ = 66;
+}
+}
+}
+if (__label__ == 66){
+	r16 = heapU8[r15+204];
+	r16 = r16 & 2;
+if(!(r16 ==0)) //_LBB654_78
+{
+	r16 = r15 >> 2;
+	r16 = heap32[(r16+54)];
+if(!(r16 ==2)) //_LBB654_78
+{
+	r16 = heapU8[r14+204];
+	r16 = r16 & 3;
+if(!(r16 !=0)) //_LBB654_78
+{
+	r16 = r14 >> 2;
+	r17 = heap32[(r16+54)];
+	r17 = (r17 + -4)|0;
+if(!(uint(r17) <uint(2))) //_LBB654_77
+{
+	heap32[(r16+54)] = 1;
+}
+	heap32[(r16+55)] = 0;
+}
+}
+}
+	r16 = heapU8[r14+204];
+	r16 = r16 & 2;
+if(!(r16 ==0)) //_LBB654_84
+{
+	r16 = r14 >> 2;
+	r16 = heap32[(r16+54)];
+if(!(r16 ==2)) //_LBB654_84
+{
+	r16 = heapU8[r15+204];
+	r16 = r16 & 3;
+if(!(r16 !=0)) //_LBB654_84
+{
+	r16 = r15 >> 2;
+	r17 = heap32[(r16+54)];
+	r17 = (r17 + -4)|0;
+if(!(uint(r17) <uint(2))) //_LBB654_83
+{
+	heap32[(r16+54)] = 1;
+}
+	heap32[(r16+55)] = 0;
+}
+}
+}
+	r16 = heapU8[r3+64];
+if(!(r16 ==0)) //_LBB654_103
+{
+	r16 = heap32[(r8)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+7)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r15;
+	heap32[(g0+2)] = r14;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+	r14 = r_g0;
+if(!(r14 ==0)) //_LBB654_103
+{
+	r14 = heap32[(r6+8)];
+	r15 = heap32[(r6+7)];
+	if(r14 ==r15) //_LBB654_88
+{
+	r16 = 1;
+	r17 = r15 << 1;
+	r17 = r15 == 0 ? r16 : r17;
+if(!(r14 >=r17)) //_LBB654_87
+{
+	if(r17 !=0) //_LBB654_91
+{
+	r14 = gNumAlignedAllocs;
+	r14 = r14 >> 2;
+	r18 = heap32[(r14)];
+	r19 = r17 << 2;
+	r18 = (r18 + 1)|0;
+	r19 = r19 | 3;
+	heap32[(r14)] = r18;
+	r14 = (r19 + 16)|0;
+	heap32[(g0)] = r14;
+	malloc(i7);
+	r14 = r_g0;
+	if(r14 !=0) //_LBB654_93
+{
+	r15 = 0;
+	r18 = (r14 + 4)|0;
+	r15 = (r15 - r18)|0;
+	r15 = r15 & 15;
+	r15 = (r14 + r15)|0;
+	r18 = r15 >> 2;
+	heap32[(r18)] = r14;
+	r14 = (r15 + 4)|0;
+	r15 = heap32[(r6+7)];
+}
+}
+else{
+	r14 = 0;
+}
+if(!(r15 <1)) //_LBB654_97
+{
+	r18 = 0;
+_126: while(true){
+	r19 = r18 << 2;
+	r20 = heap32[(r6+9)];
+	r20 = (r20 + r19)|0;
+	r20 = r20 >> 2;
+	r19 = (r14 + r19)|0;
+	r20 = heap32[(r20)];
+	r18 = (r18 + 1)|0;
+	r19 = r19 >> 2;
+	heap32[(r19)] = r20;
+if(!(r15 !=r18)) //_LBB654_96
+{
+break _126;
+}
+}
+}
+	r15 = heap32[(r6+9)];
+if(!(r15 ==0)) //_LBB654_101
+{
+	r18 = heapU8[r3+40];
+if(!(r18 ==0)) //_LBB654_100
+{
+	r18 = gNumAlignedFree;
+	r18 = r18 >> 2;
+	r19 = heap32[(r18)];
+	r19 = (r19 + 1)|0;
+	r15 = r15 >> 2;
+	heap32[(r18)] = r19;
+	r15 = heap32[(r15+-1)];
+	heap32[(g0)] = r15;
+	free(i7);
+}
+	heap32[(r6+9)] = 0;
+}
+	heap8[r3+40] = r16;
+	heap32[(r6+9)] = r14;
+	heap32[(r6+8)] = r17;
+	r15 = heap32[(r6+7)];
+}
+}
+	r14 = r15 << 2;
+	r15 = heap32[(r6+9)];
+	r14 = (r15 + r14)|0;
+	r14 = r14 >> 2;
+	heap32[(r14)] = r13;
+	r13 = heap32[(r6+7)];
+	r13 = (r13 + 1)|0;
+	heap32[(r6+7)] = r13;
+}
+}
+}
+	r10 = (r10 + 1)|0;
+	if(r9 !=r10) //_LBB654_68
+{
+continue _89;
+}
+else{
+break _87;
+}
+}
+}
+} while(0);
+	r9 = _ZN15CProfileManager11CurrentNodeE;
+	r9 = r9 >> 2;
+	r10 = heap32[(r9)];
+	r13 = r10 >> 2;
+	r14 = heap32[(r13+4)];
+	r14 = (r14 + -1)|0;
+	heap32[(r13+4)] = r14;
+_138: do {
+if(!(r14 !=0)) //_LBB654_110
+{
+	r14 = heap32[(r13+1)];
+	if(r14 !=0) //_LBB654_107
+{
+	r10 = sp + -24;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = 0;
+	r14 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r14 = r14 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r10 = r10 >> 2;
+	r15 = heap32[(fp+-6)];
+	r16 = heap32[(r14)];
+	r15 = (r15 - r16)|0;
+	r10 = heap32[(r10+1)];
+	r14 = heap32[(r14+1)];
+	r10 = (r10 - r14)|0;
+	r14 = (r15 * 1000000)|0;
+	r10 = (r10 + r14)|0;
+	r14 = heap32[(r13+3)];
+	r10 = (r10 - r14)|0;
+	f0 = uint(r10); //fuitos r10, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r13+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r13+2)] = f0;
+	r10 = heap32[(r13+4)];
+	if(r10 !=0) //_LBB654_110
+{
+break _138;
+}
+else{
+	r10 = heap32[(r9)];
+}
+}
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+5)];
+	heap32[(r9)] = r10;
+}
+} while(0);
+	r10 = heap32[(r6+2)];
+	r13 = _2E_str3158;
+	heap32[(g0)] = r13;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r13 = heapU8[r3+64];
+_145: do {
+	if(r13 !=0) //_LBB654_112
+{
+	r5 = heap32[(r6+7)];
+if(!(r5 <2)) //_LBB654_114
+{
+	r8 = (r3 + 24)|0;
+	r13 = (r5 + -1)|0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r13;
+	_ZN20btAlignedObjectArrayIP20btPersistentManifoldE17quickSortInternalI33btPersistentManifoldSortPredicateEEvT_ii(i7);
+}
+if(!(r10 <1)) //_LBB654_163
+{
+	r8 = 0;
+	r13 = r8;
+	r14 = r8;
+_151: while(true){
+	r15 = heap32[(r6+4)];
+	r16 = r14 << 3;
+	r15 = (r15 + r16)|0;
+	r15 = r15 >> 2;
+	r15 = heap32[(r15)];
+	r16 = r8;
+_153: while(true){
+	if(r14 >=r10) //_LBB654_139
+{
+break _153;
+}
+else{
+	r17 = heap32[(r6+4)];
+	r18 = r14 << 3;
+	r17 = (r17 + r18)|0;
+	r17 = r17 >> 2;
+	r18 = heap32[(r17)];
+	if(r18 ==r15) //_LBB654_117
+{
+	r17 = heap32[(r17+1)];
+	r18 = heap32[(r4+4)];
+	r17 = r17 << 2;
+	r17 = (r18 + r17)|0;
+	r17 = r17 >> 2;
+	r18 = heap32[(r6+13)];
+	r19 = heap32[(r6+12)];
+	r17 = heap32[(r17)];
+	if(r18 ==r19) //_LBB654_119
+{
+	r20 = 1;
+	r21 = r19 << 1;
+	r21 = r19 == 0 ? r20 : r21;
+if(!(r18 >=r21)) //_LBB654_118
+{
+	if(r21 !=0) //_LBB654_122
+{
+	r18 = gNumAlignedAllocs;
+	r18 = r18 >> 2;
+	r22 = heap32[(r18)];
+	r23 = r21 << 2;
+	r22 = (r22 + 1)|0;
+	r23 = r23 | 3;
+	heap32[(r18)] = r22;
+	r18 = (r23 + 16)|0;
+	heap32[(g0)] = r18;
+	malloc(i7);
+	r18 = r_g0;
+	if(r18 !=0) //_LBB654_124
+{
+	r19 = 0;
+	r22 = (r18 + 4)|0;
+	r19 = (r19 - r22)|0;
+	r19 = r19 & 15;
+	r19 = (r18 + r19)|0;
+	r22 = r19 >> 2;
+	heap32[(r22)] = r18;
+	r18 = (r19 + 4)|0;
+	r19 = heap32[(r6+12)];
+}
+}
+else{
+	r18 = 0;
+}
+if(!(r19 <1)) //_LBB654_128
+{
+	r22 = 0;
+_167: while(true){
+	r23 = r22 << 2;
+	r24 = heap32[(r6+14)];
+	r24 = (r24 + r23)|0;
+	r24 = r24 >> 2;
+	r23 = (r18 + r23)|0;
+	r24 = heap32[(r24)];
+	r22 = (r22 + 1)|0;
+	r23 = r23 >> 2;
+	heap32[(r23)] = r24;
+if(!(r19 !=r22)) //_LBB654_127
+{
+break _167;
+}
+}
+}
+	r19 = heap32[(r6+14)];
+if(!(r19 ==0)) //_LBB654_132
+{
+	r22 = heapU8[r3+60];
+if(!(r22 ==0)) //_LBB654_131
+{
+	r22 = gNumAlignedFree;
+	r22 = r22 >> 2;
+	r23 = heap32[(r22)];
+	r23 = (r23 + 1)|0;
+	r19 = r19 >> 2;
+	heap32[(r22)] = r23;
+	r19 = heap32[(r19+-1)];
+	heap32[(g0)] = r19;
+	free(i7);
+}
+	heap32[(r6+14)] = 0;
+}
+	heap8[r3+60] = r20;
+	heap32[(r6+14)] = r18;
+	heap32[(r6+13)] = r21;
+	r19 = heap32[(r6+12)];
+}
+}
+	r18 = r19 << 2;
+	r19 = heap32[(r6+14)];
+	r18 = (r19 + r18)|0;
+	r18 = r18 >> 2;
+	heap32[(r18)] = r17;
+	r18 = heap32[(r6+12)];
+	r18 = (r18 + 1)|0;
+	r17 = r17 >> 2;
+	heap32[(r6+12)] = r18;
+	r17 = heap32[(r17+54)];
+	if(r17 !=2) //_LBB654_135
+{
+	r18 = 1;
+	r16 = r17 == 5 ? r18 : r16;
+}
+else{
+	r16 = 1;
+}
+	r14 = (r14 + 1)|0;
+}
+else{
+break _153;
+}
+}
+}
+_182: do {
+	if(r13 <r5) //_LBB654_141
+{
+	r17 = heap32[(r6+9)];
+	r19 = r13 << 2;
+	r18 = (r17 + r19)|0;
+	r20 = r18 >> 2;
+	r20 = heap32[(r20)];
+	r20 = r20 >> 2;
+	r21 = heap32[(r20+277)];
+	r21 = r21 >> 2;
+	r21 = heap32[(r21+52)];
+	if(r21 <0) //_LBB654_143
+{
+	r21 = heap32[(r20+278)];
+	r21 = r21 >> 2;
+	r21 = heap32[(r21+52)];
+}
+	if(r21 !=r15) //_LBB654_140
+{
+__label__ = 129;
+}
+else{
+	r19 = (r17 + r19)|0;
+	r20 = 1;
+_188: while(true){
+	r17 = r20;
+	r1 = (r13 + r17)|0;
+	if(r1 >=r5) //_LBB654_151
+{
+__label__ = 138;
+break _182;
+}
+else{
+	r20 = r17 << 2;
+	r20 = (r19 + r20)|0;
+	r20 = r20 >> 2;
+	r20 = heap32[(r20)];
+	r20 = r20 >> 2;
+	r21 = heap32[(r20+277)];
+	r21 = r21 >> 2;
+	r21 = heap32[(r21+52)];
+	if(r21 <0) //_LBB654_149
+{
+	r20 = heap32[(r20+278)];
+	r20 = r20 >> 2;
+	r21 = heap32[(r20+52)];
+}
+	r20 = (r17 + 1)|0;
+if(!(r21 ==r15)) //_LBB654_146
+{
+__label__ = 138;
+break _182;
+}
+}
+}
+}
+}
+else{
+__label__ = 129;
+}
+} while(0);
+if (__label__ == 129){
+	r17 = 0;
+	r18 = r17;
+}
+	r16 = r16 & 255;
+if(!(r16 !=0)) //_LBB654_153
+{
+	r16 = heap32[(fp+-36)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+2)];
+	r19 = heap32[(r6+12)];
+	r20 = heap32[(r6+14)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r20;
+	heap32[(g0+2)] = r19;
+	heap32[(g0+3)] = r18;
+	heap32[(g0+4)] = r17;
+	heap32[(g0+5)] = r15;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+}
+	r15 = heap32[(r6+12)];
+_200: do {
+if(!(r15 >-1)) //_LBB654_162
+{
+	r16 = heap32[(r6+13)];
+	if(r16 <0) //_LBB654_156
+{
+	r16 = heap32[(r6+14)];
+if(!(r16 ==0)) //_LBB654_160
+{
+	r18 = heapU8[r3+60];
+if(!(r18 ==0)) //_LBB654_159
+{
+	r18 = gNumAlignedFree;
+	r18 = r18 >> 2;
+	r19 = heap32[(r18)];
+	r19 = (r19 + 1)|0;
+	r16 = r16 >> 2;
+	heap32[(r18)] = r19;
+	r16 = heap32[(r16+-1)];
+	heap32[(g0)] = r16;
+	free(i7);
+}
+	heap32[(r6+14)] = 0;
+}
+	r16 = 1;
+	heap8[r3+60] = r16;
+	heap32[(r6+14)] = 0;
+	heap32[(r6+13)] = 0;
+}
+_210: while(true){
+	r16 = r15 << 2;
+	r18 = heap32[(r6+14)];
+	r16 = (r18 + r16)|0;
+	r15 = (r15 + 1)|0;
+	r16 = r16 >> 2;
+	heap32[(r16)] = 0;
+if(!(r15 !=0)) //_LBB654_161
+{
+break _200;
+}
+}
+}
+} while(0);
+	r13 = r17 == 0 ? r13 : r1;
+	heap32[(r6+12)] = 0;
+	if(r14 <r10) //_LBB654_116
+{
+continue _151;
+}
+else{
+break _145;
+}
+}
+}
+}
+else{
+	r1 = heap32[(r8)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+11)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r_g0;
+	r3 = heap32[(r8)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+9)];
+	heap32[(g0)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r6 = heap32[(fp+-36)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+2)];
+	r10 = heap32[(r4+2)];
+	r5 = heap32[(r4+4)];
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r_g0;
+	heap32[(g0+5)] = -1;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+}
+} while(0);
+	r1 = heap32[(r9)];
+	r3 = r1 >> 2;
+	r5 = heap32[(r3+4)];
+	r5 = (r5 + -1)|0;
+	heap32[(r3+4)] = r5;
+_215: do {
+if(!(r5 !=0)) //_LBB654_169
+{
+	r5 = heap32[(r3+1)];
+	if(r5 !=0) //_LBB654_166
+{
+	r1 = sp + -16;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r5 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r1 = r1 >> 2;
+	r6 = heap32[(fp+-4)];
+	r8 = heap32[(r5)];
+	r6 = (r6 - r8)|0;
+	r1 = heap32[(r1+1)];
+	r5 = heap32[(r5+1)];
+	r1 = (r1 - r5)|0;
+	r5 = (r6 * 1000000)|0;
+	r1 = (r1 + r5)|0;
+	r5 = heap32[(r3+3)];
+	r1 = (r1 - r5)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r3+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r3+2)] = f0;
+	r1 = heap32[(r3+4)];
+	if(r1 !=0) //_LBB654_169
+{
+break _215;
+}
+else{
+	r1 = heap32[(r9)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r9)] = r1;
+}
+} while(0);
+	heap32[(g0)] = r11;
+	_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback18processConstraintsEv(i7);
+	r1 = heap32[(r4+44)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+4)];
+	r5 = heap32[(r4+19)];
+	r4 = heap32[(r4+21)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap32[(fp+-36)] = r7;
+	r0 = heap32[(r12+21)];
+if(!(r0 ==0)) //_LBB654_173
+{
+	r1 = heapU8[sp+-56];
+if(!(r1 ==0)) //_LBB654_172
+{
+	r1 = gNumAlignedFree;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = (r3 + 1)|0;
+	r0 = r0 >> 2;
+	heap32[(r1)] = r3;
+	r0 = heap32[(r0+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	heap32[(r12+21)] = 0;
+}
+	r0 = 1;
+	heap8[sp+-56] = r0;
+	heap32[(r12+21)] = 0;
+	heap32[(r12+19)] = 0;
+	heap32[(r12+20)] = 0;
+	r1 = heap32[(r12+16)];
+if(!(r1 ==0)) //_LBB654_177
+{
+	r3 = heapU8[sp+-76];
+if(!(r3 ==0)) //_LBB654_176
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r12+16)] = 0;
+}
+	heap8[sp+-76] = r0;
+	heap32[(r12+16)] = 0;
+	heap32[(r12+14)] = 0;
+	heap32[(r12+15)] = 0;
+	r1 = heap32[(r12+11)];
+if(!(r1 ==0)) //_LBB654_181
+{
+	r3 = heapU8[sp+-96];
+if(!(r3 ==0)) //_LBB654_180
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r12+11)] = 0;
+}
+	heap8[sp+-96] = r0;
+	heap32[(r12+11)] = 0;
+	heap32[(r12+9)] = 0;
+	heap32[(r12+10)] = 0;
+	r1 = heap32[(r2+3)];
+if(!(r1 ==0)) //_LBB654_185
+{
+	r3 = heapU8[sp+-32];
+if(!(r3 ==0)) //_LBB654_184
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+3)] = 0;
+}
+	heap8[sp+-32] = r0;
+	heap32[(r2+3)] = 0;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+2)] = 0;
+	r0 = heap32[(r9)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+4)];
+	r2 = (r2 + -1)|0;
+	heap32[(r1+4)] = r2;
+_246: do {
+if(!(r2 !=0)) //_LBB654_191
+{
+	r2 = heap32[(r1+1)];
+	if(r2 !=0) //_LBB654_188
+{
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r2 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r0 = r0 >> 2;
+	r3 = heap32[(fp+-2)];
+	r4 = heap32[(r2)];
+	r3 = (r3 - r4)|0;
+	r0 = heap32[(r0+1)];
+	r2 = heap32[(r2+1)];
+	r0 = (r0 - r2)|0;
+	r2 = (r3 * 1000000)|0;
+	r0 = (r0 + r2)|0;
+	r2 = heap32[(r1+3)];
+	r0 = (r0 - r2)|0;
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r1+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r1+2)] = f0;
+	r0 = heap32[(r1+4)];
+	if(r0 !=0) //_LBB654_191
+{
+break _246;
+}
+else{
+	r0 = heap32[(r9)];
+}
+}
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(r9)] = r0;
+}
+} while(0);
+	return;
+break;
+case 47:
+	r0 = _2E_str1156;
+	r1 = _2E_str2157;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 269;
+	_assert(i7);
+break;
+}
+}
+
+function _ZN23btDiscreteDynamicsWorld16removeConstraintEP17btTypedConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0+47)];
+	r3 = 0;
+_1: while(true){
+	if(r2 >r3) //_LBB655_1
+{
+	r4 = heap32[(r0+49)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r4 !=r1) //_LBB655_3
+{
+	r3 = (r3 + 1)|0;
+continue _1;
+}
+else{
+__label__ = 5;
+break _1;
+}
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+if (__label__ == 4){
+	r3 = r2;
+}
+if(!(r2 <=r3)) //_LBB655_8
+{
+	r2 = (r2 + -1)|0;
+	r3 = r3 << 2;
+	r4 = heap32[(r0+49)];
+	r2 = r2 << 2;
+	r3 = (r4 + r3)|0;
+	r4 = (r4 + r2)|0;
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	r5 = heap32[(r3)];
+	r4 = heap32[(r4)];
+	heap32[(r3)] = r4;
+	r3 = heap32[(r0+49)];
+	r2 = (r3 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r5;
+	r2 = heap32[(r0+47)];
+	r2 = (r2 + -1)|0;
+	heap32[(r0+47)] = r2;
+}
+	r0 = r1 >> 2;
+	r2 = heap32[(r0+5)];
+	r2 = r2 >> 2;
+	r3 = heap32[(r2+120)];
+	r4 = 0;
+_11: while(true){
+	if(r3 >r4) //_LBB655_9
+{
+	r5 = heap32[(r2+122)];
+	r6 = r4 << 2;
+	r5 = (r5 + r6)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	if(r5 !=r1) //_LBB655_11
+{
+	r4 = (r4 + 1)|0;
+continue _11;
+}
+else{
+__label__ = 12;
+break _11;
+}
+}
+else{
+__label__ = 11;
+break _11;
+}
+}
+if (__label__ == 11){
+	r4 = r3;
+}
+	if(r3 >r4) //_LBB655_16
+{
+	r3 = (r3 + -1)|0;
+	r4 = r4 << 2;
+	r5 = heap32[(r2+122)];
+	r3 = r3 << 2;
+	r4 = (r5 + r4)|0;
+	r5 = (r5 + r3)|0;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r4)];
+	r5 = heap32[(r5)];
+	heap32[(r4)] = r5;
+	r4 = heap32[(r2+122)];
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r6;
+	r3 = heap32[(r2+120)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+120)] = r3;
+}
+	r4 = 0;
+	r3 = r3 > r4;
+	r3 = r3 & 1;
+	heap32[(r2+63)] = r3;
+	r0 = heap32[(r0+6)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0+120)];
+_21: while(true){
+	if(r2 >r4) //_LBB655_18
+{
+	r3 = heap32[(r0+122)];
+	r5 = r4 << 2;
+	r3 = (r3 + r5)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	if(r3 !=r1) //_LBB655_20
+{
+	r4 = (r4 + 1)|0;
+continue _21;
+}
+else{
+__label__ = 19;
+break _21;
+}
+}
+else{
+__label__ = 18;
+break _21;
+}
+}
+if (__label__ == 18){
+	r4 = r2;
+}
+	if(r2 >r4) //_LBB655_25
+{
+	r2 = (r2 + -1)|0;
+	r1 = r4 << 2;
+	r3 = heap32[(r0+122)];
+	r2 = r2 << 2;
+	r1 = (r3 + r1)|0;
+	r3 = (r3 + r2)|0;
+	r1 = r1 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r1)];
+	r3 = heap32[(r3)];
+	heap32[(r1)] = r3;
+	r1 = heap32[(r0+122)];
+	r2 = (r1 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r4;
+	r2 = heap32[(r0+120)];
+	r2 = (r2 + -1)|0;
+	heap32[(r0+120)] = r2;
+}
+	r1 = 0;
+	r1 = r2 > r1;
+	r1 = r1 & 1;
+	heap32[(r0+63)] = r1;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld13addConstraintEP17btTypedConstraintb(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+48)];
+	r3 = heap32[(r1+47)];
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(fp+2)];
+	if(r2 ==r3) //_LBB656_2
+{
+	r6 = 1;
+	r7 = r3 << 1;
+	r7 = r3 == 0 ? r6 : r7;
+if(!(r2 >=r7)) //_LBB656_1
+{
+	if(r7 !=0) //_LBB656_5
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r8 = heap32[(r2)];
+	r9 = r7 << 2;
+	r8 = (r8 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r2)] = r8;
+	r2 = (r9 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB656_7
+{
+	r8 = 0;
+	r9 = (r2 + 4)|0;
+	r8 = (r8 - r9)|0;
+	r8 = r8 & 15;
+	r8 = (r2 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r2;
+	r2 = r9;
+}
+}
+else{
+	r2 = 0;
+}
+	r8 = (r0 + 196)|0;
+	if(r3 <1) //_LBB656_10
+{
+	r9 = r8 >> 2;
+	r10 = heap32[(r9)];
+}
+else{
+	r9 = 0;
+_12: while(true){
+	r10 = r8 >> 2;
+	r10 = heap32[(r10)];
+	r11 = r9 << 2;
+	r12 = (r10 + r11)|0;
+	r12 = r12 >> 2;
+	r11 = (r2 + r11)|0;
+	r12 = heap32[(r12)];
+	r9 = (r9 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r12;
+if(!(r3 !=r9)) //_LBB656_11
+{
+break _12;
+}
+}
+	r8 = (r0 + 196)|0;
+}
+	if(r10 !=0) //_LBB656_15
+{
+	r9 = heapU8[r0+200];
+	if(r9 !=0) //_LBB656_17
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r9 = heap32[(r3)];
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r3)] = r9;
+	r3 = heap32[(r10+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+	r3 = heap32[(r1+47)];
+}
+	r9 = r8 >> 2;
+	heap32[(r9)] = 0;
+}
+	r8 = r8 >> 2;
+	heap8[r0+200] = r6;
+	heap32[(r8)] = r2;
+	heap32[(r1+48)] = r7;
+}
+}
+	r0 = r3 << 2;
+	r2 = heap32[(r1+49)];
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r4;
+	r0 = heap32[(r1+47)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1+47)] = r0;
+if(!(r5 ==0)) //_LBB656_22
+{
+	r0 = r4 >> 2;
+	r1 = heap32[(r0+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	_ZN11btRigidBody16addConstraintRefEP17btTypedConstraint(i7);
+	r0 = heap32[(r0+6)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	_ZN11btRigidBody16addConstraintRefEP17btTypedConstraint(i7);
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld21updateActivationStateEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str1097;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r1 = heap32[(r0+52)];
+if(!(r1 <1)) //_LBB657_25
+{
+	f0 = heapFloat[(fp+1)];
+	r1 = gDisableDeactivation;
+	r1 = heapU8[r1];
+	r2 = 0;
+_3: while(true){
+	r3 = heap32[(r0+54)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+_5: do {
+if(!(r3 ==0)) //_LBB657_24
+{
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+54)];
+if(!(r5 ==4)) //_LBB657_24
+{
+_8: do {
+	if(r5 !=2) //_LBB657_6
+{
+	f1 = heapFloat[(r4+76)];
+	f2 = heapFloat[(r4+77)];
+	f3 = heapFloat[(r4+78)];
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f4 = heapFloat[(r4+116)];
+	f1 = f1+f2;
+	f2 = f3*f3;
+	f1 = f1+f2;
+	f2 = f4*f4;
+	if(f1 >=f2) //_LBB657_9
+{
+__label__ = 8;
+}
+else{
+	f1 = heapFloat[(r4+80)];
+	f2 = heapFloat[(r4+81)];
+	f3 = heapFloat[(r4+82)];
+	f1 = f1*f1;
+	f2 = f2*f2;
+	f4 = heapFloat[(r4+117)];
+	f1 = f1+f2;
+	f2 = f3*f3;
+	f1 = f1+f2;
+	f2 = f4*f4;
+	if(f1 >=f2) //_LBB657_9
+{
+__label__ = 8;
+}
+else{
+	f1 = heapFloat[(r4+55)];
+	f1 = f1+f0;
+	heapFloat[(r4+55)] = f1;
+__label__ = 10;
+}
+}
+if (__label__ == 8){
+	r6 = (r5 + -4)|0;
+	heap32[(r4+55)] = 0;
+if(!(uint(r6) <uint(2))) //_LBB657_11
+{
+	r5 = 0;
+	heap32[(r4+54)] = 0;
+break _8;
+}
+}
+	if(r5 ==4) //_LBB657_24
+{
+break _5;
+}
+}
+} while(0);
+	r6 = r1 & 255;
+_18: do {
+if(!(r6 !=0)) //_LBB657_22
+{
+	r6 = (r5 + -2)|0;
+if(!(uint(r6) <uint(2))) //_LBB657_15
+{
+	f1 = heapFloat[(r4+55)];
+	f2 =                         2;
+	if(f1 <=f2) //_LBB657_22
+{
+break _18;
+}
+}
+	r3 = heapU8[r3+204];
+	r3 = r3 & 3;
+	if(r3 ==0) //_LBB657_18
+{
+	if(r5 ==2) //_LBB657_21
+{
+	heap32[(r4+76)] = 0;
+	heap32[(r4+77)] = 0;
+	heap32[(r4+78)] = 0;
+	heap32[(r4+79)] = 0;
+	heap32[(r4+80)] = 0;
+	heap32[(r4+81)] = 0;
+	heap32[(r4+82)] = 0;
+	heap32[(r4+83)] = 0;
+break _5;
+}
+else{
+	if(r5 !=1) //_LBB657_24
+{
+break _5;
+}
+else{
+	heap32[(r4+54)] = 3;
+break _5;
+}
+}
+}
+else{
+	r5 = (r5 + -4)|0;
+	if(uint(r5) <uint(2)) //_LBB657_24
+{
+break _5;
+}
+else{
+	heap32[(r4+54)] = 2;
+break _5;
+}
+}
+}
+} while(0);
+	r3 = (r5 + -4)|0;
+if(!(uint(r3) <uint(2))) //_LBB657_24
+{
+	heap32[(r4+54)] = 1;
+}
+}
+}
+} while(0);
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r0+52)];
+	if(r3 >r2) //_LBB657_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_35: do {
+if(!(r3 !=0)) //_LBB657_31
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB657_28
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB657_31
+{
+break _35;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld28internalSingleStepSimulationEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = _2E_str1198;
+	r1 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+24)];
+	f0 = heapFloat[(fp+1)];
+if(!(r2 ==0)) //_LBB658_2
+{
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+33)];
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	heapFloat[(r0+7)] = f0;
+	heap32[(r0+8)] = 0;
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	heap32[(r0+12)] = r_g0;
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+10)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+35)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	heapFloat[(r0+29)] = f0;
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+36)];
+	r3 = (r1 + 104)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = heap32[(r0)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+34)];
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = _2E_str289;
+	heap32[(g0)] = r2;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r2 = heap32[(r0+63)];
+if(!(r2 <1)) //_LBB658_5
+{
+	r2 = 0;
+_6: while(true){
+	r3 = heap32[(r0+65)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heapFloat[(g0+2)] = f0;
+	r2 = (r2 + 1)|0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = heap32[(r0+63)];
+	if(r3 >r2) //_LBB658_4
+{
+continue _6;
+}
+else{
+break _6;
+}
+}
+}
+	r2 = _ZN15CProfileManager11CurrentNodeE;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+4)];
+	r5 = (r5 + -1)|0;
+	heap32[(r4+4)] = r5;
+_9: do {
+if(!(r5 !=0)) //_LBB658_11
+{
+	r5 = heap32[(r4+1)];
+	if(r5 !=0) //_LBB658_8
+{
+	r3 = sp + -16;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	r5 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r3 = r3 >> 2;
+	r6 = heap32[(fp+-4)];
+	r7 = heap32[(r5)];
+	r6 = (r6 - r7)|0;
+	r3 = heap32[(r3+1)];
+	r5 = heap32[(r5+1)];
+	r3 = (r3 - r5)|0;
+	r5 = (r6 * 1000000)|0;
+	r3 = (r3 + r5)|0;
+	r5 = heap32[(r4+3)];
+	r3 = (r3 - r5)|0;
+	f1 = uint(r3); //fuitos r3, f1
+	f2 =                      1000;
+	f3 = heapFloat[(r4+2)];
+	f1 = f1/f2;
+	f1 = f3+f1;
+	heapFloat[(r4+2)] = f1;
+	r3 = heap32[(r4+4)];
+	if(r3 !=0) //_LBB658_11
+{
+break _9;
+}
+else{
+	r3 = heap32[(r2)];
+}
+}
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	heap32[(r2)] = r3;
+}
+} while(0);
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f0;
+	_ZN23btDiscreteDynamicsWorld21updateActivationStateEf(i7);
+	r0 = heap32[(r0+23)];
+if(!(r0 ==0)) //_LBB658_13
+{
+	heap32[(g0)] = r1;
+	heapFloat[(g0+1)] = f0;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+	r0 = heap32[(r2)];
+	r1 = r0 >> 2;
+	r3 = heap32[(r1+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r1+4)] = r3;
+_19: do {
+if(!(r3 !=0)) //_LBB658_19
+{
+	r3 = heap32[(r1+1)];
+	if(r3 !=0) //_LBB658_16
+{
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r0 = r0 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r0 = heap32[(r0+1)];
+	r3 = heap32[(r3+1)];
+	r0 = (r0 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r0 = (r0 + r3)|0;
+	r3 = heap32[(r1+3)];
+	r0 = (r0 - r3)|0;
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r1+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r1+2)] = f0;
+	r0 = heap32[(r1+4)];
+	if(r0 !=0) //_LBB658_19
+{
+break _19;
+}
+else{
+	r0 = heap32[(r2)];
+}
+}
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(r2)] = r0;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBodyss(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+51)];
+	r3 = heap32[(fp)];
+	r4 = r2 & 3;
+if(!(r4 !=0)) //_LBB659_5
+{
+	r4 = heapU8[r0+496];
+	r4 = r4 & 1;
+if(!(r4 != 0)) //_LBB659_5
+{
+	f0 = heapFloat[(r1+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB659_4
+{
+	r4 = r3 >> 2;
+	f1 =                         1;
+	f0 = f1/f0;
+	f1 = heapFloat[(r4+58)];
+	f2 = heapFloat[(r4+57)];
+	f3 = heapFloat[(r4+56)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r1+89)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r1+90)] = f2;
+	heapFloat[(r1+91)] = f0;
+	heap32[(r1+92)] = 0;
+}
+	r4 = r3 >> 2;
+	heap32[(r1+93)] = heap32[(r4+56)];
+	heap32[(r1+94)] = heap32[(r4+57)];
+	heap32[(r1+95)] = heap32[(r4+58)];
+	heap32[(r1+96)] = heap32[(r4+59)];
+}
+}
+	r4 = heap32[(r1+48)];
+if(!(r4 ==0)) //_LBB659_31
+{
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r2 = r2 & 1;
+_10: do {
+	if(r2 != 0) //_LBB659_28
+{
+	r2 = heap32[(r1+54)];
+	r2 = (r2 + -4)|0;
+	if(uint(r2) <uint(2)) //_LBB659_30
+{
+break _10;
+}
+else{
+	heap32[(r1+54)] = 2;
+}
+}
+else{
+	r1 = r3 >> 2;
+	r2 = heap32[(r1+53)];
+	r6 = heap32[(r1+52)];
+	if(r2 ==r6) //_LBB659_9
+{
+	r7 = 1;
+	r8 = r6 << 1;
+	r8 = r6 == 0 ? r7 : r8;
+if(!(r2 >=r8)) //_LBB659_8
+{
+	if(r8 !=0) //_LBB659_12
+{
+	r2 = gNumAlignedAllocs;
+	r2 = r2 >> 2;
+	r9 = heap32[(r2)];
+	r10 = r8 << 2;
+	r9 = (r9 + 1)|0;
+	r10 = r10 | 3;
+	heap32[(r2)] = r9;
+	r2 = (r10 + 16)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(r2 !=0) //_LBB659_14
+{
+	r9 = 0;
+	r10 = (r2 + 4)|0;
+	r9 = (r9 - r10)|0;
+	r9 = r9 & 15;
+	r9 = (r2 + r9)|0;
+	r10 = (r9 + 4)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r2;
+	r2 = r10;
+}
+}
+else{
+	r2 = 0;
+}
+	r9 = (r3 + 216)|0;
+	if(r6 <1) //_LBB659_17
+{
+	r10 = r9 >> 2;
+	r11 = heap32[(r10)];
+}
+else{
+	r10 = 0;
+_25: while(true){
+	r11 = r9 >> 2;
+	r11 = heap32[(r11)];
+	r12 = r10 << 2;
+	r13 = (r11 + r12)|0;
+	r13 = r13 >> 2;
+	r12 = (r2 + r12)|0;
+	r13 = heap32[(r13)];
+	r10 = (r10 + 1)|0;
+	r12 = r12 >> 2;
+	heap32[(r12)] = r13;
+if(!(r6 !=r10)) //_LBB659_18
+{
+break _25;
+}
+}
+	r9 = (r3 + 216)|0;
+}
+	if(r11 !=0) //_LBB659_22
+{
+	r10 = heapU8[r3+220];
+	if(r10 !=0) //_LBB659_24
+{
+	r6 = gNumAlignedFree;
+	r6 = r6 >> 2;
+	r10 = heap32[(r6)];
+	r10 = (r10 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r6)] = r10;
+	r6 = heap32[(r11+-1)];
+	heap32[(g0)] = r6;
+	free(i7);
+	r6 = heap32[(r1+52)];
+}
+	r10 = r9 >> 2;
+	heap32[(r10)] = 0;
+}
+	r9 = r9 >> 2;
+	heap8[r3+220] = r7;
+	heap32[(r9)] = r2;
+	heap32[(r1+53)] = r8;
+}
+}
+	r2 = r6 << 2;
+	r6 = heap32[(r1+54)];
+	r2 = (r6 + r2)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = r0;
+	r2 = heap32[(r1+52)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+52)] = r2;
+}
+} while(0);
+	r1 = r3 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+8)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBody(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+51)];
+	r3 = heap32[(fp)];
+	r4 = r2 & 3;
+if(!(r4 !=0)) //_LBB660_5
+{
+	r4 = heapU8[r0+496];
+	r4 = r4 & 1;
+if(!(r4 != 0)) //_LBB660_5
+{
+	f0 = heapFloat[(r1+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB660_4
+{
+	r4 = r3 >> 2;
+	f1 =                         1;
+	f0 = f1/f0;
+	f1 = heapFloat[(r4+58)];
+	f2 = heapFloat[(r4+57)];
+	f3 = heapFloat[(r4+56)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r1+89)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r1+90)] = f2;
+	heapFloat[(r1+91)] = f0;
+	heap32[(r1+92)] = 0;
+}
+	r4 = r3 >> 2;
+	heap32[(r1+93)] = heap32[(r4+56)];
+	heap32[(r1+94)] = heap32[(r4+57)];
+	heap32[(r1+95)] = heap32[(r4+58)];
+	heap32[(r1+96)] = heap32[(r4+59)];
+}
+}
+	r4 = heap32[(r1+48)];
+if(!(r4 ==0)) //_LBB660_32
+{
+	r4 = r2 & 1;
+_10: do {
+	if(r4 != 0) //_LBB660_28
+{
+	r4 = heap32[(r1+54)];
+	r4 = (r4 + -4)|0;
+	if(uint(r4) >uint(1)) //_LBB660_30
+{
+	heap32[(r1+54)] = 2;
+}
+else{
+break _10;
+}
+}
+else{
+	r2 = r3 >> 2;
+	r4 = heap32[(r2+53)];
+	r5 = heap32[(r2+52)];
+	if(r4 ==r5) //_LBB660_9
+{
+	r6 = 1;
+	r7 = r5 << 1;
+	r7 = r5 == 0 ? r6 : r7;
+if(!(r4 >=r7)) //_LBB660_8
+{
+	if(r7 !=0) //_LBB660_12
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r8 = heap32[(r4)];
+	r9 = r7 << 2;
+	r8 = (r8 + 1)|0;
+	r9 = r9 | 3;
+	heap32[(r4)] = r8;
+	r4 = (r9 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB660_14
+{
+	r8 = 0;
+	r9 = (r4 + 4)|0;
+	r8 = (r8 - r9)|0;
+	r8 = r8 & 15;
+	r8 = (r4 + r8)|0;
+	r9 = (r8 + 4)|0;
+	r8 = r8 >> 2;
+	heap32[(r8)] = r4;
+	r4 = r9;
+}
+}
+else{
+	r4 = 0;
+}
+	r8 = (r3 + 216)|0;
+	if(r5 <1) //_LBB660_17
+{
+	r9 = r8 >> 2;
+	r10 = heap32[(r9)];
+}
+else{
+	r9 = 0;
+_25: while(true){
+	r10 = r8 >> 2;
+	r10 = heap32[(r10)];
+	r11 = r9 << 2;
+	r12 = (r10 + r11)|0;
+	r12 = r12 >> 2;
+	r11 = (r4 + r11)|0;
+	r12 = heap32[(r12)];
+	r9 = (r9 + 1)|0;
+	r11 = r11 >> 2;
+	heap32[(r11)] = r12;
+if(!(r5 !=r9)) //_LBB660_18
+{
+break _25;
+}
+}
+	r8 = (r3 + 216)|0;
+}
+	if(r10 !=0) //_LBB660_22
+{
+	r9 = heapU8[r3+220];
+	if(r9 !=0) //_LBB660_24
+{
+	r5 = gNumAlignedFree;
+	r5 = r5 >> 2;
+	r9 = heap32[(r5)];
+	r9 = (r9 + 1)|0;
+	r10 = r10 >> 2;
+	heap32[(r5)] = r9;
+	r5 = heap32[(r10+-1)];
+	heap32[(g0)] = r5;
+	free(i7);
+	r5 = heap32[(r2+52)];
+}
+	r9 = r8 >> 2;
+	heap32[(r9)] = 0;
+}
+	r8 = r8 >> 2;
+	heap8[r3+220] = r6;
+	heap32[(r8)] = r4;
+	heap32[(r2+53)] = r7;
+}
+}
+	r4 = r5 << 2;
+	r5 = heap32[(r2+54)];
+	r4 = (r5 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r0;
+	r4 = heap32[(r2+52)];
+	r4 = (r4 + 1)|0;
+	heap32[(r2+52)] = r4;
+	r2 = heap32[(r1+51)];
+}
+} while(0);
+	r1 = r3 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+8)];
+	r4 = 2;
+	r5 = 1;
+	r2 = r2 & 3;
+	r6 = -3;
+	r7 = -1;
+	r4 = r2 != 0 ? r4 : r5;
+	r2 = r2 != 0 ? r6 : r7;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld10setGravityERK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r0+56)] = heap32[(r1)];
+	heap32[(r0+57)] = heap32[(r1+1)];
+	heap32[(r0+58)] = heap32[(r1+2)];
+	heap32[(r0+59)] = heap32[(r1+3)];
+	r2 = heap32[(r0+52)];
+if(!(r2 <1)) //_LBB661_9
+{
+	r2 = 0;
+_3: while(true){
+	r3 = heap32[(r0+54)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	r5 = heap32[(r4+54)];
+if(!(r5 ==2)) //_LBB661_8
+{
+if(!(r5 ==5)) //_LBB661_8
+{
+	r3 = heapU8[r3+496];
+	r3 = r3 & 1;
+if(!(r3 != 0)) //_LBB661_8
+{
+	f0 = heapFloat[(r4+84)];
+	f1 =                         0;
+if(!(f0 ==f1)) //_LBB661_7
+{
+	f1 =                         1;
+	f0 = f1/f0;
+	f1 = heapFloat[(r1+2)];
+	f2 = heapFloat[(r1+1)];
+	f3 = heapFloat[(r1)];
+	f3 = f3*f0;
+	f2 = f2*f0;
+	heapFloat[(r4+89)] = f3;
+	f0 = f1*f0;
+	heapFloat[(r4+90)] = f2;
+	heapFloat[(r4+91)] = f0;
+	heap32[(r4+92)] = 0;
+}
+	heap32[(r4+93)] = heap32[(r1)];
+	heap32[(r4+94)] = heap32[(r1+1)];
+	heap32[(r4+95)] = heap32[(r1+2)];
+	heap32[(r4+96)] = heap32[(r1+3)];
+}
+}
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r0+52)];
+	if(r3 >r2) //_LBB661_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld15removeRigidBodyEP11btRigidBody(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(r1+52)];
+	r4 = 0;
+_1: while(true){
+	if(r3 >r4) //_LBB662_1
+{
+	r5 = heap32[(r1+54)];
+	r6 = r4 << 2;
+	r5 = (r5 + r6)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	if(r5 !=r2) //_LBB662_3
+{
+	r4 = (r4 + 1)|0;
+continue _1;
+}
+else{
+__label__ = 5;
+break _1;
+}
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+if (__label__ == 4){
+	r4 = r3;
+}
+if(!(r3 <=r4)) //_LBB662_8
+{
+	r3 = (r3 + -1)|0;
+	r4 = r4 << 2;
+	r5 = heap32[(r1+54)];
+	r3 = r3 << 2;
+	r4 = (r5 + r4)|0;
+	r5 = (r5 + r3)|0;
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r4)];
+	r5 = heap32[(r5)];
+	heap32[(r4)] = r5;
+	r4 = heap32[(r1+54)];
+	r3 = (r4 + r3)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r6;
+	r3 = heap32[(r1+52)];
+	r3 = (r3 + -1)|0;
+	heap32[(r1+52)] = r3;
+}
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	_ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld21removeCollisionObjectEP17btCollisionObject(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heapU8[r0+232];
+	r2 = r2 & 2;
+if(!(r2 ==0)) //_LBB663_3
+{
+if(!(r0 ==0)) //_LBB663_3
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+21)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	_ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld18addCollisionObjectEP17btCollisionObjectss(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	_ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld14stepSimulationEfif(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	_ZN15CProfileManager5ResetEv(i7);
+	r0 = _2E_str1299;
+	r1 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp)];
+	f0 = heapFloat[(fp+1)];
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	if(r1 ==0) //_LBB665_4
+{
+	r1 = r0 >> 2;
+	f1 =                         0;
+	heapFloat[(r1+60)] = f0;
+	if(f0 <f1) //_LBB665_6
+{
+	f1 = -f0;
+}
+else{
+	f1 = f0;
+}
+	f2 =   1.1920928955078125e-007;
+	if(f1 >=f2) //_LBB665_9
+{
+	r1 = 1;
+	f1 = f0;
+	r3 = r1;
+}
+else{
+	r1 = 0;
+	f1 = f0;
+	r3 = r1;
+}
+}
+else{
+	f1 = heapFloat[(fp+3)];
+	r2 = r0 >> 2;
+	f2 = heapFloat[(r2+60)];
+	f0 = f2+f0;
+	heapFloat[(r2+60)] = f0;
+	if(f0 >=f1) //_LBB665_3
+{
+	f2 = f0/f1;
+	r3 = f2|0;
+	f2 = r3; //fitos r3, f2
+	f2 = f2*f1;
+	f0 = f0-f2;
+	heapFloat[(r2+60)] = f0;
+}
+else{
+	r3 = 0;
+}
+}
+	r2 = r0 >> 2;
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+if(!(r4 ==0)) //_LBB665_12
+{
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r4 = r_g0 >>> 4;
+	r5 = gDisableDeactivation;
+	r4 = r4 & 1;
+	heap8[r5] = r4;
+}
+	if(r3 ==0) //_LBB665_16
+{
+	r1 = heap32[(r2)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+19)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+}
+else{
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r5 = r3 > r1 ? r1 : r3;
+	r4 = heap32[(r4+38)];
+	f0 = r5; //fitos r5, f0
+	f0 = f0*f1;
+	heap32[(g0)] = r0;
+	heapFloat[(g0+1)] = f0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+40)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+if(!(r5 <1)) //_LBB665_17
+{
+	r4 = r3 ^ -1;
+	r1 = r1 ^ -1;
+	r1 = r4 > r1 ? r4 : r1;
+	r1 = r1 ^ -1;
+_22: while(true){
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+37)];
+	heap32[(g0)] = r0;
+	heapFloat[(g0+1)] = f1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+19)];
+	r1 = (r1 + -1)|0;
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	if(r1 ==0) //_LBB665_17
+{
+break _22;
+}
+else{
+continue _22;
+}
+}
+}
+}
+	r1 = heap32[(r2)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+28)];
+	heap32[(g0)] = r0;
+	r0 = _ZN15CProfileManager12FrameCounterE;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = _ZN15CProfileManager11CurrentNodeE;
+	r1 = (r1 + 1)|0;
+	r2 = r2 >> 2;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2)];
+	r1 = r0 >> 2;
+	r4 = heap32[(r1+4)];
+	r4 = (r4 + -1)|0;
+	heap32[(r1+4)] = r4;
+_25: do {
+if(!(r4 !=0)) //_LBB665_23
+{
+	r4 = heap32[(r1+1)];
+	if(r4 !=0) //_LBB665_20
+{
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r4 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r0 = r0 >> 2;
+	r5 = heap32[(fp+-2)];
+	r6 = heap32[(r4)];
+	r5 = (r5 - r6)|0;
+	r0 = heap32[(r0+1)];
+	r4 = heap32[(r4+1)];
+	r0 = (r0 - r4)|0;
+	r4 = (r5 * 1000000)|0;
+	r0 = (r0 + r4)|0;
+	r4 = heap32[(r1+3)];
+	r0 = (r0 - r4)|0;
+	f0 = uint(r0); //fuitos r0, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r1+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r1+2)] = f0;
+	r0 = heap32[(r1+4)];
+	if(r0 !=0) //_LBB665_23
+{
+break _25;
+}
+else{
+	r0 = heap32[(r2)];
+}
+}
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(r2)] = r0;
+}
+} while(0);
+	r_g0 = r3;
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld28synchronizeSingleMotionStateEP11btRigidBody(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+var __label__ = 0;
+	i7 = sp + -96;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	if(r0 !=0) //_LBB666_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+118)];
+if(!(r2 ==0)) //_LBB666_4
+{
+	r2 = heapU8[r0+204];
+	r2 = r2 & 3;
+	if(r2 ==0) //_LBB666_5
+{
+	r2 = heap32[(fp)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+60)];
+	f1 = heapFloat[(r1+60)];
+	f2 = heapFloat[(r1+33)];
+	f3 = heapFloat[(r1+34)];
+	f4 = heapFloat[(r1+35)];
+	r2 = sp + -64;
+	r3 = (r0 + 68)|0;
+	r0 = (r0 + 148)|0;
+	f0 = f0*f1;
+	heap32[(g0)] = r3;
+	heapFloat[(g0+1)] = f2;
+	heapFloat[(g0+2)] = f3;
+	heapFloat[(g0+3)] = f4;
+	heap32[(g0+4)] = r0;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = r2;
+	_ZN15btTransformUtil18integrateTransformERK11btTransformRK9btVector3S5_fRS0_(i7);
+	r0 = heap32[(r1+118)];
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	return;
+}
+}
+	return;
+}
+else{
+	r0 = _2E_str13100;
+	r1 = _2E_str1461;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 184;
+	_assert(i7);
+}
+}
+
+function _ZN23btDiscreteDynamicsWorld23synchronizeMotionStatesEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _2E_str1562;
+	heap32[(g0)] = r0;
+	r0 = heap32[(fp)];
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r1 = heapU8[r0+246];
+_1: do {
+	if(r1 !=0) //_LBB667_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+2)];
+if(!(r2 <1)) //_LBB667_13
+{
+	r2 = 0;
+_4: while(true){
+	r3 = heap32[(r1+4)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = heapU8[r3+232];
+	r4 = r4 & 2;
+if(!(r4 ==0)) //_LBB667_7
+{
+if(!(r3 ==0)) //_LBB667_7
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	_ZN23btDiscreteDynamicsWorld28synchronizeSingleMotionStateEP11btRigidBody(i7);
+}
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r1+2)];
+	if(r3 >r2) //_LBB667_4
+{
+continue _4;
+}
+else{
+break _1;
+}
+}
+}
+}
+else{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+52)];
+	if(r2 >0) //_LBB667_8
+{
+	r2 = 0;
+_12: while(true){
+	r3 = heap32[(r1+54)];
+	r4 = r2 << 2;
+	r3 = (r3 + r4)|0;
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+54)];
+if(!(r4 ==2)) //_LBB667_12
+{
+if(!(r4 ==5)) //_LBB667_12
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	_ZN23btDiscreteDynamicsWorld28synchronizeSingleMotionStateEP11btRigidBody(i7);
+}
+}
+	r2 = (r2 + 1)|0;
+	r3 = heap32[(r1+52)];
+	if(r3 >r2) //_LBB667_9
+{
+continue _12;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_19: do {
+if(!(r3 !=0)) //_LBB667_19
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB667_16
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB667_19
+{
+break _19;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld12applyGravityEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+52)];
+if(!(r1 <1)) //_LBB668_7
+{
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+54)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+54)];
+if(!(r4 ==2)) //_LBB668_6
+{
+if(!(r4 ==5)) //_LBB668_6
+{
+	r2 = heapU8[r2+204];
+	r2 = r2 & 3;
+if(!(r2 !=0)) //_LBB668_6
+{
+	f0 = heapFloat[(r3+89)];
+	f1 = heapFloat[(r3+85)];
+	f0 = f0*f1;
+	f1 = heapFloat[(r3+101)];
+	f2 = heapFloat[(r3+91)];
+	f3 = heapFloat[(r3+87)];
+	f4 = heapFloat[(r3+90)];
+	f5 = heapFloat[(r3+86)];
+	f0 = f1+f0;
+	heapFloat[(r3+101)] = f0;
+	f0 = f4*f5;
+	f1 = heapFloat[(r3+102)];
+	f0 = f1+f0;
+	heapFloat[(r3+102)] = f0;
+	f0 = f2*f3;
+	f1 = heapFloat[(r3+103)];
+	f0 = f1+f0;
+	heapFloat[(r3+103)] = f0;
+}
+}
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+52)];
+	if(r2 >r1) //_LBB668_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld14debugDrawWorldEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+	var f20;
+	var f21;
+	var f22;
+	var f23;
+	var f24;
+	var f25;
+	var f26;
+	var f27;
+	var f28;
+	var f29;
+	var f30;
+var __label__ = 0;
+	i7 = sp + -824;var g0 = i7>>2; // save stack
+	r0 = _2E_str16101;
+	heap32[(g0)] = r0;
+	_ZN15CProfileManager13Start_ProfileEPKc(i7);
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorld14debugDrawWorldEv(i7);
+	r1 = r0 >> 2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+if(!(r2 ==0)) //_LBB669_53
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0 & 6144;
+if(!(r2 ==0)) //_LBB669_53
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+24)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r3 = (r2 + -1)|0;
+if(!(r3 <0)) //_LBB669_53
+{
+	r3 = sp + -296;
+	r4 = sp + -392;
+	r5 = (r3 + 48)|0;
+	r6 = (r4 + 48)|0;
+	r2 = (r2 + -1)|0;
+_5: while(true){
+	r7 = r2;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+25)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r9 = r_g0 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r8 = r_g0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r10 = r_g0 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+	r9 = r_g0;
+	r10 = r2 >> 2;
+	f0 = heapFloat[(r10+8)];
+	heapFloat[(fp+-191)] = f0;
+	f1 =                         0;
+	heapFloat[(fp+-192)] = f1;
+_7: do {
+if(!(f0 <=f1)) //_LBB669_52
+{
+	r8 = r8 >>> 11;
+	r9 = r9 >>> 12;
+	r8 = r8 & 1;
+	r9 = r9 & 1;
+	r10 = r2 >> 2;
+	r11 = heap32[(r10+1)];
+	if(r11 >4) //_LBB669_8
+{
+	if(r11 ==5) //_LBB669_20
+{
+	r11 = heap32[(r10+5)];
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r11+1)];
+	f1 = heapFloat[(r10+72)];
+	f2 = heapFloat[(r11+2)];
+	f3 = heapFloat[(r10+76)];
+	f4 = heapFloat[(r10+73)];
+	f5 = heapFloat[(r10+77)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r11+3)];
+	f9 = heapFloat[(r10+80)];
+	f10 = heapFloat[(r11+9)];
+	f11 = heapFloat[(r10+84)];
+	f12 = heapFloat[(r11+5)];
+	f13 = heapFloat[(r10+74)];
+	f14 = heapFloat[(r11+10)];
+	f15 = heapFloat[(r10+85)];
+	f16 = heapFloat[(r11+6)];
+	f17 = heapFloat[(r10+78)];
+	f18 = heapFloat[(r11+11)];
+	f19 = heapFloat[(r10+86)];
+	f20 = heapFloat[(r11+7)];
+	f21 = heapFloat[(r10+82)];
+	f22 = heapFloat[(r10+81)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r11+15)];
+	f26 = heapFloat[(r11+14)];
+	f27 = heapFloat[(r11+13)];
+	f28 = f13*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	r11 = r4 >> 2;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(fp+-98)] = f6;
+	f6 = f1*f12;
+	f24 = f3*f16;
+	f7 = f7+f28;
+	heapFloat[(r11+1)] = f23;
+	heapFloat[(r11+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f9*f20;
+	f28 = f13*f12;
+	f29 = f17*f16;
+	f7 = f7+f23;
+	f23 = f22*f20;
+	f6 = f6+f24;
+	heap32[(r11+3)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f20;
+	f7 = f7+f23;
+	heapFloat[(r11+4)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f14;
+	f6 = f24+f28;
+	heapFloat[(r11+5)] = f7;
+	heapFloat[(r11+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f1 = f1+f3;
+	f3 = f9*f18;
+	f6 = f13*f10;
+	f7 = f17*f14;
+	f4 = f4+f5;
+	f5 = f22*f18;
+	f1 = f1+f3;
+	heap32[(r11+7)] = 0;
+	f0 = f0*f11;
+	f2 = f2*f15;
+	f3 = f6+f7;
+	f6 = f21*f18;
+	f4 = f4+f5;
+	heapFloat[(r11+8)] = f1;
+	f1 = f12*f11;
+	f5 = f16*f15;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r11+9)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r11+10)] = f3;
+	f2 = f10*f11;
+	f3 = f14*f15;
+	f1 = f1+f5;
+	f4 = f20*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f18*f19;
+	f0 = f0+f27;
+	heap32[(r11+11)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r11+12)] = f0;
+	f0 = f2+f25;
+	heapFloat[(r11+13)] = f1;
+	heapFloat[(r11+14)] = f0;
+	heap32[(r11+15)] = 0;
+if(!(r8 ==0)) //_LBB669_22
+{
+	r12 = heap32[(r1)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	r13 = r_g0 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+}
+	r12 = heap32[(r10+6)];
+	r12 = r12 >> 2;
+	f0 = heapFloat[(r12+1)];
+	f1 = heapFloat[(r10+88)];
+	f2 = heapFloat[(r12+2)];
+	f3 = heapFloat[(r10+92)];
+	f4 = heapFloat[(r10+89)];
+	f5 = heapFloat[(r10+93)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r12+3)];
+	f9 = heapFloat[(r10+96)];
+	f10 = heapFloat[(r12+9)];
+	f11 = heapFloat[(r10+100)];
+	f12 = heapFloat[(r12+5)];
+	f13 = heapFloat[(r10+90)];
+	f14 = heapFloat[(r12+10)];
+	f15 = heapFloat[(r10+101)];
+	f16 = heapFloat[(r12+6)];
+	f17 = heapFloat[(r10+94)];
+	f18 = heapFloat[(r12+11)];
+	f19 = heapFloat[(r10+102)];
+	f20 = heapFloat[(r12+7)];
+	f21 = heapFloat[(r10+98)];
+	f22 = heapFloat[(r10+97)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r12+15)];
+	f26 = heapFloat[(r12+14)];
+	f27 = heapFloat[(r12+13)];
+	f28 = f13*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(fp+-98)] = f6;
+	f6 = f1*f12;
+	f24 = f3*f16;
+	f7 = f7+f28;
+	heapFloat[(r11+1)] = f23;
+	heapFloat[(r11+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f9*f20;
+	f28 = f13*f12;
+	f29 = f17*f16;
+	f7 = f7+f23;
+	f23 = f22*f20;
+	f6 = f6+f24;
+	heap32[(r11+3)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f20;
+	f7 = f7+f23;
+	heapFloat[(r11+4)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f14;
+	f6 = f24+f28;
+	heapFloat[(r11+5)] = f7;
+	heapFloat[(r11+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f1 = f1+f3;
+	f3 = f9*f18;
+	f6 = f13*f10;
+	f7 = f17*f14;
+	f4 = f4+f5;
+	f5 = f22*f18;
+	f1 = f1+f3;
+	heap32[(r11+7)] = 0;
+	f0 = f0*f11;
+	f2 = f2*f15;
+	f3 = f6+f7;
+	f6 = f21*f18;
+	f4 = f4+f5;
+	heapFloat[(r11+8)] = f1;
+	f1 = f12*f11;
+	f5 = f16*f15;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r11+9)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r11+10)] = f3;
+	f2 = f10*f11;
+	f3 = f14*f15;
+	f1 = f1+f5;
+	f4 = f20*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f18*f19;
+	f0 = f0+f27;
+	heap32[(r11+11)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r11+12)] = f0;
+	f0 = f2+f25;
+	heapFloat[(r11+13)] = f1;
+	heapFloat[(r11+14)] = f0;
+	heap32[(r11+15)] = 0;
+if(!(r8 ==0)) //_LBB669_24
+{
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+}
+	if(r9 ==0) //_LBB669_52
+{
+break _7;
+}
+else{
+	r8 = sp + -408;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1086506843;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+3)] = f0;
+	_ZNK21btConeTwistConstraint16GetPointForAngleEff(i7);
+	r9 = r8 >> 2;
+	f0 = heapFloat[(fp+-102)];
+	f1 = heapFloat[(fp+-98)];
+	f2 = heapFloat[(r9+1)];
+	f3 = heapFloat[(r11+1)];
+	f4 = heapFloat[(r11+4)];
+	f5 = heapFloat[(r11+5)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r9+2)];
+	f7 = heapFloat[(r11+2)];
+	f8 = heapFloat[(r11+8)];
+	f9 = heapFloat[(r11+9)];
+	f10 = heapFloat[(r11+6)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r11+10)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r11+12)];
+	f8 = heapFloat[(r11+14)];
+	f9 = heapFloat[(r11+13)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(fp+-102)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r9+1)] = f2;
+	r12 = 0;
+	heapFloat[(r9+2)] = f0;
+	heap32[(r9+3)] = 0;
+_20: while(true){
+	f0 = r12; //fitos r12, f0
+	f1 =        6.2831850051879883;
+	f0 = f0*f1;
+	f1 =                        32;
+	r13 = sp + -472;
+	f0 = f0/f1;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r2;
+	heapFloat[(g0+2)] = f0;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+3)] = f0;
+	_ZNK21btConeTwistConstraint16GetPointForAngleEff(i7);
+	r14 = r13 >> 2;
+	f0 = heapFloat[(fp+-118)];
+	f1 = heapFloat[(fp+-98)];
+	f2 = heapFloat[(r14+1)];
+	f3 = heapFloat[(r11+1)];
+	f4 = heapFloat[(r11+4)];
+	f5 = heapFloat[(r11+5)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r14+2)];
+	f7 = heapFloat[(r11+2)];
+	f8 = heapFloat[(r11+8)];
+	f9 = heapFloat[(r11+9)];
+	f10 = heapFloat[(r11+6)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r11+10)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r11+12)];
+	f8 = heapFloat[(r11+14)];
+	f9 = heapFloat[(r11+13)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(fp+-118)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r14+1)] = f2;
+	heapFloat[(r14+2)] = f0;
+	heap32[(r14+3)] = 0;
+	r15 = heap32[(r1)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	r16 = r_g0 >> 2;
+	r16 = heap32[(r16)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+2)];
+	r17 = sp + -152;
+	r18 = r17 >> 2;
+	heap32[(fp+-38)] = 0;
+	heap32[(r18+1)] = 0;
+	heap32[(r18+2)] = 0;
+	heap32[(r18+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r17;
+	r15 = r12 & 3;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+if(!(r15 !=0)) //_LBB669_28
+{
+	r15 = heap32[(r1)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	r16 = r_g0 >> 2;
+	r16 = heap32[(r16)];
+	r16 = r16 >> 2;
+	r16 = heap32[(r16+2)];
+	r17 = sp + -136;
+	r18 = r17 >> 2;
+	heap32[(fp+-34)] = 0;
+	heap32[(r18+1)] = 0;
+	heap32[(r18+2)] = 0;
+	heap32[(r18+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r17;
+	__FUNCTION_TABLE__[(r16)>>2](i7);
+}
+	heap32[(fp+-102)] = heap32[(fp+-118)];
+	heap32[(r9+1)] = heap32[(r14+1)];
+	r12 = (r12 + 1)|0;
+	heap32[(r9+2)] = heap32[(r14+2)];
+	heap32[(r9+3)] = heap32[(r14+3)];
+if(!(r12 !=32)) //_LBB669_26
+{
+break _20;
+}
+}
+	r2 = heap32[(r10+6)];
+	f0 = heapFloat[(r10+110)];
+	heapFloat[(fp+-193)] = f0;
+	f0 = heapFloat[(r10+125)];
+	heapFloat[(fp+-194)] = f0;
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+84)];
+	f1 = heapFloat[(fp+-192)];
+	if(f0 <=f1) //_LBB669_31
+{
+	r2 = heap32[(r10+5)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r10+84)];
+	f1 = heapFloat[(r2+9)];
+	f2 = heapFloat[(r2+5)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r10+85)];
+	f5 = heapFloat[(r2+10)];
+	f6 = heapFloat[(r2+6)];
+	f8 = heapFloat[(r2+2)];
+	f12 = heapFloat[(r10+74)];
+	f13 = heapFloat[(r10+78)];
+	f14 = heapFloat[(r10+73)];
+	f15 = heapFloat[(r10+77)];
+	f7 = heapFloat[(r10+72)];
+	f9 = heapFloat[(r10+76)];
+	f10 = f1*f0;
+	f11 = f5*f4;
+	f16 = f2*f0;
+	f17 = f6*f4;
+	f0 = f3*f0;
+	f4 = f8*f4;
+	f18 = heapFloat[(r10+86)];
+	f19 = heapFloat[(r2+11)];
+	f20 = heapFloat[(r2+7)];
+	f21 = heapFloat[(r2+3)];
+	f22 = heapFloat[(r10+82)];
+	f23 = heapFloat[(r10+81)];
+	f24 = heapFloat[(r10+80)];
+	f10 = f10+f11;
+	f11 = f19*f18;
+	f16 = f16+f17;
+	f17 = f20*f18;
+	f0 = f0+f4;
+	heapFloat[(fp+-192)] = f0;
+	f4 = f21*f18;
+	f18 = f12*f1;
+	f25 = f13*f5;
+	f26 = f14*f1;
+	f27 = f15*f5;
+	f1 = f7*f1;
+	f5 = f9*f5;
+	f28 = f12*f2;
+	f29 = f13*f6;
+	f30 = f14*f2;
+	f0 = f15*f6;
+	f2 = f7*f2;
+	f6 = f9*f6;
+	f12 = f12*f3;
+	f13 = f13*f8;
+	f14 = f14*f3;
+	f15 = f15*f8;
+	f3 = f7*f3;
+	f8 = f9*f8;
+	f7 = f10+f11;
+	f9 = heapFloat[(r2+15)];
+	f10 = f16+f17;
+	f11 = heapFloat[(r2+14)];
+	f16 = heapFloat[(fp+-192)];
+	f4 = f16+f4;
+	f16 = heapFloat[(r2+13)];
+	f17 = f18+f25;
+	f18 = f22*f19;
+	f25 = f26+f27;
+	f26 = f23*f19;
+	f1 = f1+f5;
+	f5 = f24*f19;
+	f19 = f28+f29;
+	f27 = f22*f20;
+	f0 = f30+f0;
+	f28 = f23*f20;
+	f2 = f2+f6;
+	f6 = f24*f20;
+	f20 = f12+f13;
+	f22 = f22*f21;
+	f29 = f14+f15;
+	f23 = f23*f21;
+	f3 = f3+f8;
+	f21 = f24*f21;
+	f12 = f7+f9;
+	f13 = f10+f11;
+	f4 = f4+f16;
+	f14 = f17+f18;
+	f15 = f25+f26;
+	f1 = f1+f5;
+	f5 = f19+f27;
+	f0 = f0+f28;
+	f2 = f2+f6;
+	f6 = f20+f22;
+	f8 = f29+f23;
+	f3 = f3+f21;
+}
+else{
+	f0 = heapFloat[(r10+100)];
+	f1 = heapFloat[(r2+9)];
+	f2 = heapFloat[(r2+5)];
+	f3 = heapFloat[(r2+1)];
+	f4 = heapFloat[(r10+101)];
+	f5 = heapFloat[(r2+10)];
+	f6 = heapFloat[(r2+6)];
+	f7 = heapFloat[(r2+2)];
+	f8 = heapFloat[(r10+90)];
+	f9 = heapFloat[(r10+94)];
+	f10 = heapFloat[(r10+89)];
+	f11 = heapFloat[(r10+93)];
+	f12 = heapFloat[(r10+88)];
+	f13 = heapFloat[(r10+92)];
+	f14 = f1*f0;
+	f15 = f5*f4;
+	f16 = f2*f0;
+	f17 = f6*f4;
+	f0 = f3*f0;
+	f4 = f7*f4;
+	f18 = heapFloat[(r10+102)];
+	f19 = heapFloat[(r2+11)];
+	f20 = heapFloat[(r2+7)];
+	f21 = heapFloat[(r2+3)];
+	f22 = heapFloat[(r10+98)];
+	f23 = heapFloat[(r10+97)];
+	f24 = heapFloat[(r10+96)];
+	f14 = f14+f15;
+	f15 = f19*f18;
+	f16 = f16+f17;
+	f17 = f20*f18;
+	f0 = f0+f4;
+	heapFloat[(fp+-192)] = f0;
+	f4 = f21*f18;
+	f18 = f8*f1;
+	f25 = f9*f5;
+	f26 = f10*f1;
+	f27 = f11*f5;
+	f1 = f12*f1;
+	f5 = f13*f5;
+	f28 = f8*f2;
+	f29 = f9*f6;
+	f30 = f10*f2;
+	f0 = f11*f6;
+	f2 = f12*f2;
+	f6 = f13*f6;
+	f8 = f8*f3;
+	f9 = f9*f7;
+	f10 = f10*f3;
+	f11 = f11*f7;
+	f3 = f12*f3;
+	f7 = f13*f7;
+	f12 = f14+f15;
+	f13 = heapFloat[(r2+15)];
+	f14 = f16+f17;
+	f15 = heapFloat[(r2+14)];
+	f16 = heapFloat[(fp+-192)];
+	f4 = f16+f4;
+	f16 = heapFloat[(r2+13)];
+	f17 = f18+f25;
+	f18 = f22*f19;
+	f25 = f26+f27;
+	f26 = f23*f19;
+	f1 = f1+f5;
+	f5 = f24*f19;
+	f19 = f28+f29;
+	f27 = f22*f20;
+	f0 = f30+f0;
+	f28 = f23*f20;
+	f2 = f2+f6;
+	f6 = f24*f20;
+	f8 = f8+f9;
+	f9 = f22*f21;
+	f10 = f10+f11;
+	f11 = f23*f21;
+	f3 = f3+f7;
+	f7 = f24*f21;
+	f12 = f12+f13;
+	f13 = f14+f15;
+	f4 = f4+f16;
+	f14 = f17+f18;
+	f15 = f25+f26;
+	f1 = f1+f5;
+	f5 = f19+f27;
+	f0 = f0+f28;
+	f2 = f2+f6;
+	f6 = f8+f9;
+	f8 = f10+f11;
+	f3 = f3+f7;
+}
+	heapFloat[(fp+-98)] = f3;
+	heapFloat[(r11+1)] = f8;
+	heapFloat[(r11+2)] = f6;
+	heap32[(r11+3)] = 0;
+	heapFloat[(r11+4)] = f2;
+	heapFloat[(r11+5)] = f0;
+	heapFloat[(r11+6)] = f5;
+	heap32[(r11+7)] = 0;
+	heapFloat[(r11+8)] = f1;
+	heapFloat[(r11+9)] = f15;
+	heapFloat[(r11+10)] = f14;
+	heap32[(r11+11)] = 0;
+	heapFloat[(r11+12)] = f4;
+	heapFloat[(r11+13)] = f13;
+	heapFloat[(r11+14)] = f12;
+	r2 = sp + -424;
+	heap32[(r11+15)] = 0;
+	r8 = r2 >> 2;
+	heapFloat[(fp+-106)] = f4;
+	heapFloat[(r8+1)] = f13;
+	heapFloat[(r8+2)] = f12;
+	r9 = sp + -440;
+	heap32[(r8+3)] = 0;
+	r8 = r9 >> 2;
+	heapFloat[(fp+-110)] = f3;
+	heapFloat[(r8+1)] = f2;
+	heapFloat[(r8+2)] = f1;
+	r10 = sp + -456;
+	heap32[(r8+3)] = 0;
+	r8 = r10 >> 2;
+	heapFloat[(fp+-114)] = f8;
+	heapFloat[(r8+1)] = f0;
+	heapFloat[(r8+2)] = f15;
+	heap32[(r8+3)] = 0;
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r11 = r_g0 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+15)];
+	r12 = sp + -120;
+	r13 = r12 >> 2;
+	heap32[(fp+-30)] = 0;
+	heap32[(r13+1)] = 0;
+	heap32[(r13+2)] = 0;
+	heap32[(r13+3)] = 0;
+	f0 = heapFloat[(fp+-194)];
+	f1 = -f0;
+	f2 = heapFloat[(fp+-193)];
+	f1 = f1-f2;
+	f0 = f2-f0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r10;
+	f2 = heapFloat[(fp+-191)];
+	heapFloat[(g0+4)] = f2;
+	heapFloat[(g0+5)] = f2;
+	heapFloat[(g0+6)] = f1;
+	heapFloat[(g0+7)] = f0;
+	heap32[(g0+8)] = r12;
+	heap32[(g0+9)] = 1;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+}
+}
+else{
+	if(r11 ==6) //_LBB669_33
+{
+	r11 = sp + -536;
+	r12 = r11 >> 2;
+	heap32[(fp+-134)] = heap32[(r10+263)];
+	heap32[(r12+1)] = heap32[(r10+264)];
+	heap32[(r12+2)] = heap32[(r10+265)];
+	heap32[(r12+3)] = heap32[(r10+266)];
+	heap32[(r12+4)] = heap32[(r10+267)];
+	heap32[(r12+5)] = heap32[(r10+268)];
+	heap32[(r12+6)] = heap32[(r10+269)];
+	heap32[(r12+7)] = heap32[(r10+270)];
+	heap32[(r12+8)] = heap32[(r10+271)];
+	heap32[(r12+9)] = heap32[(r10+272)];
+	heap32[(r12+10)] = heap32[(r10+273)];
+	heap32[(r12+11)] = heap32[(r10+274)];
+	heap32[(r12+12)] = heap32[(r10+275)];
+	heap32[(r12+13)] = heap32[(r10+276)];
+	heap32[(r12+14)] = heap32[(r10+277)];
+	heap32[(r12+15)] = heap32[(r10+278)];
+if(!(r8 ==0)) //_LBB669_35
+{
+	r13 = heap32[(r1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r14 = r_g0 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+}
+	heap32[(fp+-134)] = heap32[(r10+279)];
+	heap32[(r12+1)] = heap32[(r10+280)];
+	heap32[(r12+2)] = heap32[(r10+281)];
+	heap32[(r12+3)] = heap32[(r10+282)];
+	heap32[(r12+4)] = heap32[(r10+283)];
+	heap32[(r12+5)] = heap32[(r10+284)];
+	heap32[(r12+6)] = heap32[(r10+285)];
+	heap32[(r12+7)] = heap32[(r10+286)];
+	heap32[(r12+8)] = heap32[(r10+287)];
+	heap32[(r12+9)] = heap32[(r10+288)];
+	heap32[(r12+10)] = heap32[(r10+289)];
+	heap32[(r12+11)] = heap32[(r10+290)];
+	heap32[(r12+12)] = heap32[(r10+291)];
+	heap32[(r12+13)] = heap32[(r10+292)];
+	heap32[(r12+14)] = heap32[(r10+293)];
+	heap32[(r12+15)] = heap32[(r10+294)];
+if(!(r8 ==0)) //_LBB669_37
+{
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r13 = r_g0 >> 2;
+	r13 = heap32[(r13)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+}
+	if(r9 ==0) //_LBB669_52
+{
+break _7;
+}
+else{
+	r2 = (r2 + 1164)|0;
+	f0 = heapFloat[(r10+263)];
+	heapFloat[(fp+-134)] = f0;
+	heap32[(r12+1)] = heap32[(r10+264)];
+	f1 = heapFloat[(r10+265)];
+	heapFloat[(r12+2)] = f1;
+	heap32[(r12+3)] = heap32[(r10+266)];
+	f2 = heapFloat[(r10+267)];
+	heapFloat[(r12+4)] = f2;
+	heap32[(r12+5)] = heap32[(r10+268)];
+	f3 = heapFloat[(r10+269)];
+	heapFloat[(r12+6)] = f3;
+	heap32[(r12+7)] = heap32[(r10+270)];
+	f4 = heapFloat[(r10+271)];
+	heapFloat[(r12+8)] = f4;
+	heap32[(r12+9)] = heap32[(r10+272)];
+	f5 = heapFloat[(r10+273)];
+	heapFloat[(r12+10)] = f5;
+	heap32[(r12+11)] = heap32[(r10+274)];
+	heap32[(r12+12)] = heap32[(r10+275)];
+	heap32[(r12+13)] = heap32[(r10+276)];
+	heap32[(r12+14)] = heap32[(r10+277)];
+	r8 = sp + -552;
+	heap32[(r12+15)] = heap32[(r10+278)];
+	r9 = r8 >> 2;
+	heapFloat[(fp+-138)] = f1;
+	heapFloat[(r9+1)] = f3;
+	heapFloat[(r9+2)] = f5;
+	heap32[(r9+3)] = 0;
+	r9 = sp + -568;
+	heapFloat[(fp+-142)] = f0;
+	r13 = r9 >> 2;
+	heapFloat[(r13+1)] = f2;
+	heapFloat[(r13+2)] = f4;
+	heap32[(r13+3)] = 0;
+	r14 = heap32[(r1)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+4)];
+	f0 = heapFloat[(r10+230)];
+	f1 = heapFloat[(r10+231)];
+	f2 = heapFloat[(r10+246)];
+	f3 = heapFloat[(r10+247)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	r15 = r_g0 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+16)];
+	r16 = sp + -104;
+	r17 = r16 >> 2;
+	heap32[(fp+-26)] = 0;
+	heap32[(r17+1)] = 0;
+	heap32[(r17+2)] = 0;
+	heap32[(r17+3)] = 0;
+	f4 =       0.89999997615814209;
+	f5 = heapFloat[(fp+-191)];
+	f4 = f5*f4;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r9;
+	heapFloat[(g0+4)] = f4;
+	heapFloat[(g0+5)] = f0;
+	heapFloat[(g0+6)] = f1;
+	heapFloat[(g0+7)] = f2;
+	heapFloat[(g0+8)] = f3;
+	heap32[(g0+9)] = r16;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	f0 = heapFloat[(r12+9)];
+	f1 = heapFloat[(r12+5)];
+	heap32[(fp+-142)] = heap32[(r12+1)];
+	heapFloat[(r13+1)] = f1;
+	heapFloat[(r13+2)] = f0;
+	heap32[(r13+3)] = 0;
+	f0 = heapFloat[(r10+296)];
+	f1 = heapFloat[(r10+297)];
+	heapFloat[(g0)] = f0;
+	cosf(i7);
+	f2 = f_g0;
+	heapFloat[(g0)] = f0;
+	sinf(i7);
+	f0 = f_g0;
+	heapFloat[(g0)] = f1;
+	cosf(i7);
+	f3 = f_g0;
+	heapFloat[(g0)] = f1;
+	sinf(i7);
+	f4 = heapFloat[(fp+-142)];
+	f5 = f2*f3;
+	f6 = heapFloat[(r13+1)];
+	f7 = f2*f_g0;
+	f8 = heapFloat[(r13+2)];
+	f5 = f5*f4;
+	f7 = f7*f6;
+	f9 = f3*f0;
+	f10 = f_g0*f0;
+	f5 = f5+f7;
+	f0 = f8*f0;
+	r8 = sp + -584;
+	f7 = f9*f4;
+	f9 = f10*f6;
+	f3 = f6*f3;
+	f1 = f4*f_g0;
+	f0 = f5-f0;
+	r9 = r8 >> 2;
+	f4 = f7+f9;
+	f2 = f8*f2;
+	f1 = f3-f1;
+	heapFloat[(fp+-146)] = f0;
+	f0 = f4+f2;
+	heapFloat[(r9+1)] = f1;
+	heapFloat[(r9+2)] = f0;
+	f0 = heapFloat[(r10+279)];
+	heapFloat[(fp+-134)] = f0;
+	heap32[(r12+1)] = heap32[(r10+280)];
+	heap32[(r12+2)] = heap32[(r10+281)];
+	heap32[(r12+3)] = heap32[(r10+282)];
+	f1 = heapFloat[(r10+283)];
+	heapFloat[(r12+4)] = f1;
+	heap32[(r12+5)] = heap32[(r10+284)];
+	heap32[(r12+6)] = heap32[(r10+285)];
+	heap32[(r12+7)] = heap32[(r10+286)];
+	f2 = heapFloat[(r10+287)];
+	heapFloat[(r12+8)] = f2;
+	heap32[(r12+9)] = heap32[(r10+288)];
+	heap32[(r12+10)] = heap32[(r10+289)];
+	heap32[(r12+11)] = heap32[(r10+290)];
+	heap32[(r12+12)] = heap32[(r10+291)];
+	heap32[(r12+13)] = heap32[(r10+292)];
+	heap32[(r12+14)] = heap32[(r10+293)];
+	r9 = sp + -600;
+	f0 = -f0;
+	heap32[(r12+15)] = heap32[(r10+294)];
+	r13 = r9 >> 2;
+	f1 = -f1;
+	heapFloat[(fp+-150)] = f0;
+	f0 = -f2;
+	heapFloat[(r13+1)] = f1;
+	heapFloat[(r13+2)] = f0;
+	heap32[(r13+3)] = 0;
+	f0 = heapFloat[(r10+214)];
+	f1 = heapFloat[(r10+215)];
+	if(f0 <=f1) //_LBB669_40
+{
+if(!(f0 >=f1)) //_LBB669_42
+{
+	r13 = heap32[(r1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r14 = r_g0 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+15)];
+	r15 = sp + -72;
+	r16 = r15 >> 2;
+	heap32[(fp+-18)] = 0;
+	heap32[(r16+1)] = 0;
+	heap32[(r16+2)] = 0;
+	heap32[(r16+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	f2 = heapFloat[(fp+-191)];
+	heapFloat[(g0+4)] = f2;
+	heapFloat[(g0+5)] = f2;
+	heapFloat[(g0+6)] = f0;
+	heapFloat[(g0+7)] = f1;
+	heap32[(g0+8)] = r15;
+	heap32[(g0+9)] = 1;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+}
+}
+else{
+	r13 = heap32[(r1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r14 = r_g0 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+15)];
+	r15 = sp + -88;
+	r16 = r15 >> 2;
+	heap32[(fp+-22)] = 0;
+	heap32[(r16+1)] = 0;
+	heap32[(r16+2)] = 0;
+	heap32[(r16+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r8;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+4)] = f0;
+	heapFloat[(g0+5)] = f0;
+	heap32[(g0+6)] = -1068953637;
+	heap32[(g0+7)] = 1078530011;
+	heap32[(g0+8)] = r15;
+	heap32[(g0+9)] = 0;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+}
+	heap32[(fp+-134)] = heap32[(r10+263)];
+	heap32[(r12+1)] = heap32[(r10+264)];
+	heap32[(r12+2)] = heap32[(r10+265)];
+	heap32[(r12+3)] = heap32[(r10+266)];
+	heap32[(r12+4)] = heap32[(r10+267)];
+	heap32[(r12+5)] = heap32[(r10+268)];
+	heap32[(r12+6)] = heap32[(r10+269)];
+	heap32[(r12+7)] = heap32[(r10+270)];
+	heap32[(r12+8)] = heap32[(r10+271)];
+	heap32[(r12+9)] = heap32[(r10+272)];
+	heap32[(r12+10)] = heap32[(r10+273)];
+	heap32[(r12+11)] = heap32[(r10+274)];
+	heap32[(r12+12)] = heap32[(r10+275)];
+	heap32[(r12+13)] = heap32[(r10+276)];
+	heap32[(r12+14)] = heap32[(r10+277)];
+	r2 = sp + -616;
+	heap32[(r12+15)] = heap32[(r10+278)];
+	r8 = r2 >> 2;
+	heap32[(fp+-154)] = heap32[(r10+167)];
+	heap32[(r8+1)] = heap32[(r10+168)];
+	heap32[(r8+2)] = heap32[(r10+169)];
+	r9 = sp + -632;
+	heap32[(r8+3)] = heap32[(r10+170)];
+	r8 = r9 >> 2;
+	heap32[(fp+-158)] = heap32[(r10+171)];
+	heap32[(r8+1)] = heap32[(r10+172)];
+	heap32[(r8+2)] = heap32[(r10+173)];
+	heap32[(r8+3)] = heap32[(r10+174)];
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r10 = r_g0 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+18)];
+	r12 = sp + -56;
+	r13 = r12 >> 2;
+	heap32[(fp+-14)] = 0;
+	heap32[(r13+1)] = 0;
+	heap32[(r13+2)] = 0;
+	heap32[(r13+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r11;
+	heap32[(g0+4)] = r12;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+}
+}
+else{
+	if(r11 ==7) //_LBB669_43
+{
+	r11 = sp + -696;
+	r12 = r11 >> 2;
+	heap32[(fp+-174)] = heap32[(r10+203)];
+	heap32[(r12+1)] = heap32[(r10+204)];
+	heap32[(r12+2)] = heap32[(r10+205)];
+	heap32[(r12+3)] = heap32[(r10+206)];
+	heap32[(r12+4)] = heap32[(r10+207)];
+	heap32[(r12+5)] = heap32[(r10+208)];
+	heap32[(r12+6)] = heap32[(r10+209)];
+	heap32[(r12+7)] = heap32[(r10+210)];
+	heap32[(r12+8)] = heap32[(r10+211)];
+	heap32[(r12+9)] = heap32[(r10+212)];
+	heap32[(r12+10)] = heap32[(r10+213)];
+	heap32[(r12+11)] = heap32[(r10+214)];
+	heap32[(r12+12)] = heap32[(r10+215)];
+	heap32[(r12+13)] = heap32[(r10+216)];
+	heap32[(r12+14)] = heap32[(r10+217)];
+	heap32[(r12+15)] = heap32[(r10+218)];
+if(!(r8 ==0)) //_LBB669_45
+{
+	r13 = heap32[(r1)];
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r13)>>2](i7);
+	r14 = r_g0 >> 2;
+	r14 = heap32[(r14)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+}
+	heap32[(fp+-174)] = heap32[(r10+219)];
+	heap32[(r12+1)] = heap32[(r10+220)];
+	heap32[(r12+2)] = heap32[(r10+221)];
+	heap32[(r12+3)] = heap32[(r10+222)];
+	heap32[(r12+4)] = heap32[(r10+223)];
+	heap32[(r12+5)] = heap32[(r10+224)];
+	heap32[(r12+6)] = heap32[(r10+225)];
+	heap32[(r12+7)] = heap32[(r10+226)];
+	heap32[(r12+8)] = heap32[(r10+227)];
+	heap32[(r12+9)] = heap32[(r10+228)];
+	heap32[(r12+10)] = heap32[(r10+229)];
+	heap32[(r12+11)] = heap32[(r10+230)];
+	heap32[(r12+12)] = heap32[(r10+231)];
+	heap32[(r12+13)] = heap32[(r10+232)];
+	heap32[(r12+14)] = heap32[(r10+233)];
+	heap32[(r12+15)] = heap32[(r10+234)];
+if(!(r8 ==0)) //_LBB669_47
+{
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r11;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+}
+	if(r9 ==0) //_LBB669_52
+{
+break _7;
+}
+else{
+	r8 = (r2 + 924)|0;
+	r9 = heapU8[r2+168];
+	if(r9 ==0) //_LBB669_50
+{
+	r2 = (r2 + 876)|0;
+}
+else{
+	r2 = (r2 + 812)|0;
+}
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+1)];
+	f1 = heapFloat[(r10+43)];
+	f2 = heapFloat[(r2)];
+	f3 = heapFloat[(r2+2)];
+	f4 = heapFloat[(r2+5)];
+	f5 = heapFloat[(r2+4)];
+	f6 = f2*f1;
+	f7 = heapFloat[(fp+-192)];
+	f8 = f0*f7;
+	f9 = heapFloat[(r2+6)];
+	f10 = heapFloat[(r2+9)];
+	f11 = heapFloat[(r2+8)];
+	f12 = f5*f1;
+	f13 = f4*f7;
+	f6 = f6+f8;
+	f3 = f3*f7;
+	f14 = heapFloat[(r2+10)];
+	f1 = f11*f1;
+	f15 = f10*f7;
+	f12 = f12+f13;
+	f9 = f9*f7;
+	f6 = f6+f3;
+	f16 = heapFloat[(r2+12)];
+	f17 = heapFloat[(r2+13)];
+	f18 = heapFloat[(r2+14)];
+	r2 = sp + -712;
+	f12 = f12+f9;
+	f1 = f1+f15;
+	f7 = f14*f7;
+	f6 = f6+f16;
+	f1 = f1+f7;
+	r9 = r2 >> 2;
+	f12 = f12+f17;
+	heapFloat[(fp+-178)] = f6;
+	f1 = f1+f18;
+	heapFloat[(r9+1)] = f12;
+	heapFloat[(r9+2)] = f1;
+	heap32[(r9+3)] = 0;
+	f1 = heapFloat[(r10+44)];
+	f6 = f2*f1;
+	f12 = f5*f1;
+	f6 = f6+f8;
+	f1 = f11*f1;
+	f8 = f12+f13;
+	f3 = f6+f3;
+	r9 = sp + -728;
+	f1 = f1+f15;
+	f6 = f8+f9;
+	f3 = f3+f16;
+	f1 = f1+f7;
+	r11 = r9 >> 2;
+	f6 = f6+f17;
+	heapFloat[(fp+-182)] = f3;
+	f1 = f1+f18;
+	heapFloat[(r11+1)] = f6;
+	heapFloat[(r11+2)] = f1;
+	heap32[(r11+3)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+2)];
+	r13 = sp + -40;
+	r14 = r13 >> 2;
+	heap32[(fp+-10)] = 0;
+	heap32[(r14+1)] = 0;
+	heap32[(r14+2)] = 0;
+	heap32[(r14+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r13;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	r2 = sp + -744;
+	r9 = r2 >> 2;
+	heapFloat[(fp+-186)] = f2;
+	heapFloat[(r9+1)] = f5;
+	heapFloat[(r9+2)] = f11;
+	r11 = sp + -760;
+	heap32[(r9+3)] = 0;
+	r9 = r11 >> 2;
+	heapFloat[(fp+-190)] = f0;
+	heapFloat[(r9+1)] = f4;
+	heapFloat[(r9+2)] = f10;
+	heap32[(r9+3)] = 0;
+	r9 = heap32[(r1)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+4)];
+	f0 = heapFloat[(r10+45)];
+	f1 = heapFloat[(r10+46)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r10 = r_g0 >> 2;
+	r10 = heap32[(r10)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+15)];
+	r12 = sp + -24;
+	r13 = r12 >> 2;
+	heap32[(fp+-6)] = 0;
+	heap32[(r13+1)] = 0;
+	heap32[(r13+2)] = 0;
+	heap32[(r13+3)] = 0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r11;
+	f2 = heapFloat[(fp+-191)];
+	heapFloat[(g0+4)] = f2;
+	heapFloat[(g0+5)] = f2;
+	heapFloat[(g0+6)] = f0;
+	heapFloat[(g0+7)] = f1;
+	heap32[(g0+8)] = r12;
+	heap32[(g0+9)] = 1;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r10)>>2](i7);
+}
+}
+else{
+break _7;
+}
+}
+}
+}
+else{
+	if(r11 ==3) //_LBB669_11
+{
+	r2 = sp + -232;
+	r9 = r2 >> 2;
+	heap32[(fp+-58)] = 1065353216;
+	heap32[(r9+1)] = 0;
+	heap32[(r9+2)] = 0;
+	heap32[(r9+3)] = 0;
+	heap32[(r9+4)] = 0;
+	heap32[(r9+5)] = 1065353216;
+	heap32[(r9+6)] = 0;
+	heap32[(r9+7)] = 0;
+	heap32[(r9+8)] = 0;
+	heap32[(r9+9)] = 0;
+	heap32[(r9+10)] = 1065353216;
+	heap32[(r9+11)] = 0;
+	heap32[(r9+12)] = 0;
+	heap32[(r9+13)] = 0;
+	heap32[(r9+14)] = 0;
+	heap32[(r9+15)] = 0;
+	r11 = heap32[(r10+5)];
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r10+72)];
+	f1 = heapFloat[(r11+1)];
+	f2 = heapFloat[(r10+73)];
+	f3 = heapFloat[(r11+2)];
+	f4 = heapFloat[(r11+5)];
+	f5 = heapFloat[(r11+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r10+74)];
+	f7 = heapFloat[(r11+3)];
+	f8 = heapFloat[(r11+9)];
+	f9 = heapFloat[(r11+10)];
+	f10 = heapFloat[(r11+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r11+11)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r11+13)];
+	f8 = heapFloat[(r11+15)];
+	f9 = heapFloat[(r11+14)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(r9+12)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r9+13)] = f2;
+	heapFloat[(r9+14)] = f0;
+	heap32[(r9+15)] = 0;
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+	r11 = heap32[(r10+6)];
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r10+76)];
+	f1 = heapFloat[(r11+1)];
+	f2 = heapFloat[(r10+77)];
+	f3 = heapFloat[(r11+2)];
+	f4 = heapFloat[(r11+5)];
+	f5 = heapFloat[(r11+6)];
+	f1 = f1*f0;
+	f3 = f3*f2;
+	f6 = heapFloat[(r10+78)];
+	f7 = heapFloat[(r11+3)];
+	f8 = heapFloat[(r11+9)];
+	f9 = heapFloat[(r11+10)];
+	f10 = heapFloat[(r11+7)];
+	f4 = f4*f0;
+	f5 = f5*f2;
+	f1 = f1+f3;
+	f3 = f7*f6;
+	f7 = heapFloat[(r11+11)];
+	f0 = f8*f0;
+	f2 = f9*f2;
+	f4 = f4+f5;
+	f5 = f10*f6;
+	f1 = f1+f3;
+	f3 = heapFloat[(r11+13)];
+	f8 = heapFloat[(r11+15)];
+	f9 = heapFloat[(r11+14)];
+	f4 = f4+f5;
+	f0 = f0+f2;
+	f2 = f7*f6;
+	f1 = f1+f3;
+	f0 = f0+f2;
+	f2 = f4+f9;
+	heapFloat[(r9+12)] = f1;
+	f0 = f0+f8;
+	heapFloat[(r9+13)] = f2;
+	heapFloat[(r9+14)] = f0;
+	heap32[(r9+15)] = 0;
+if(!(r8 ==0)) //_LBB669_52
+{
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r9 = r_g0 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r2;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+}
+else{
+	if(r11 ==4) //_LBB669_13
+{
+	r2 = heap32[(r10+5)];
+	r2 = r2 >> 2;
+	f0 = heapFloat[(r2+1)];
+	f1 = heapFloat[(r10+135)];
+	f2 = heapFloat[(r2+2)];
+	f3 = heapFloat[(r10+139)];
+	f4 = heapFloat[(r10+136)];
+	f5 = heapFloat[(r10+140)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r2+3)];
+	f9 = heapFloat[(r10+143)];
+	f10 = heapFloat[(r2+9)];
+	f11 = heapFloat[(r10+147)];
+	f12 = heapFloat[(r2+5)];
+	f13 = heapFloat[(r10+137)];
+	f14 = heapFloat[(r2+10)];
+	f15 = heapFloat[(r10+148)];
+	f16 = heapFloat[(r2+6)];
+	f17 = heapFloat[(r10+141)];
+	f18 = heapFloat[(r2+11)];
+	f19 = heapFloat[(r10+149)];
+	f20 = heapFloat[(r2+7)];
+	f21 = heapFloat[(r10+145)];
+	f22 = heapFloat[(r10+144)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r2+15)];
+	f26 = heapFloat[(r2+14)];
+	f27 = heapFloat[(r2+13)];
+	f28 = f13*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	r2 = r3 >> 2;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(fp+-74)] = f6;
+	f6 = f1*f12;
+	f24 = f3*f16;
+	f7 = f7+f28;
+	heapFloat[(r2+1)] = f23;
+	heapFloat[(r2+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f9*f20;
+	f28 = f13*f12;
+	f29 = f17*f16;
+	f7 = f7+f23;
+	f23 = f22*f20;
+	f6 = f6+f24;
+	heap32[(r2+3)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f20;
+	f7 = f7+f23;
+	heapFloat[(r2+4)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f14;
+	f6 = f24+f28;
+	heapFloat[(r2+5)] = f7;
+	heapFloat[(r2+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f1 = f1+f3;
+	f3 = f9*f18;
+	f6 = f13*f10;
+	f7 = f17*f14;
+	f4 = f4+f5;
+	f5 = f22*f18;
+	f1 = f1+f3;
+	heap32[(r2+7)] = 0;
+	f0 = f0*f11;
+	f2 = f2*f15;
+	f3 = f6+f7;
+	f6 = f21*f18;
+	f4 = f4+f5;
+	heapFloat[(r2+8)] = f1;
+	f1 = f12*f11;
+	f5 = f16*f15;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r2+9)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r2+10)] = f3;
+	f2 = f10*f11;
+	f3 = f14*f15;
+	f1 = f1+f5;
+	f4 = f20*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f18*f19;
+	f0 = f0+f27;
+	heap32[(r2+11)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r2+12)] = f0;
+	f0 = f2+f25;
+	heapFloat[(r2+13)] = f1;
+	heapFloat[(r2+14)] = f0;
+	heap32[(r2+15)] = 0;
+if(!(r8 ==0)) //_LBB669_15
+{
+	r11 = heap32[(r1)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r12 = r_g0 >> 2;
+	r12 = heap32[(r12)];
+	r12 = r12 >> 2;
+	r12 = heap32[(r12+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r3;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r12)>>2](i7);
+}
+	r11 = heap32[(r10+6)];
+	r11 = r11 >> 2;
+	f0 = heapFloat[(r11+1)];
+	f1 = heapFloat[(r10+151)];
+	f2 = heapFloat[(r11+2)];
+	f3 = heapFloat[(r10+155)];
+	f4 = heapFloat[(r10+152)];
+	f5 = heapFloat[(r10+156)];
+	f6 = f1*f0;
+	f7 = f3*f2;
+	f8 = heapFloat[(r11+3)];
+	f9 = heapFloat[(r10+159)];
+	f10 = heapFloat[(r11+9)];
+	f11 = heapFloat[(r10+163)];
+	f12 = heapFloat[(r11+5)];
+	f13 = heapFloat[(r10+153)];
+	f14 = heapFloat[(r11+10)];
+	f15 = heapFloat[(r10+164)];
+	f16 = heapFloat[(r11+6)];
+	f17 = heapFloat[(r10+157)];
+	f18 = heapFloat[(r11+11)];
+	f19 = heapFloat[(r10+165)];
+	f20 = heapFloat[(r11+7)];
+	f21 = heapFloat[(r10+161)];
+	f22 = heapFloat[(r10+160)];
+	f23 = f4*f0;
+	f24 = f5*f2;
+	f6 = f6+f7;
+	f7 = f9*f8;
+	f25 = heapFloat[(r11+15)];
+	f26 = heapFloat[(r11+14)];
+	f27 = heapFloat[(r11+13)];
+	f28 = f13*f0;
+	f29 = f17*f2;
+	f23 = f23+f24;
+	f24 = f22*f8;
+	f6 = f6+f7;
+	f7 = f28+f29;
+	f28 = f21*f8;
+	f23 = f23+f24;
+	heapFloat[(fp+-74)] = f6;
+	f6 = f1*f12;
+	f24 = f3*f16;
+	f7 = f7+f28;
+	heapFloat[(r2+1)] = f23;
+	heapFloat[(r2+2)] = f7;
+	f7 = f4*f12;
+	f23 = f5*f16;
+	f6 = f6+f24;
+	f24 = f9*f20;
+	f28 = f13*f12;
+	f29 = f17*f16;
+	f7 = f7+f23;
+	f23 = f22*f20;
+	f6 = f6+f24;
+	heap32[(r2+3)] = 0;
+	f24 = f28+f29;
+	f28 = f21*f20;
+	f7 = f7+f23;
+	heapFloat[(r2+4)] = f6;
+	f1 = f1*f10;
+	f3 = f3*f14;
+	f6 = f24+f28;
+	heapFloat[(r2+5)] = f7;
+	heapFloat[(r2+6)] = f6;
+	f4 = f4*f10;
+	f5 = f5*f14;
+	f1 = f1+f3;
+	f3 = f9*f18;
+	f6 = f13*f10;
+	f7 = f17*f14;
+	f4 = f4+f5;
+	f5 = f22*f18;
+	f1 = f1+f3;
+	heap32[(r2+7)] = 0;
+	f0 = f0*f11;
+	f2 = f2*f15;
+	f3 = f6+f7;
+	f6 = f21*f18;
+	f4 = f4+f5;
+	heapFloat[(r2+8)] = f1;
+	f1 = f12*f11;
+	f5 = f16*f15;
+	f0 = f0+f2;
+	f2 = f8*f19;
+	f3 = f3+f6;
+	heapFloat[(r2+9)] = f4;
+	f0 = f0+f2;
+	heapFloat[(r2+10)] = f3;
+	f2 = f10*f11;
+	f3 = f14*f15;
+	f1 = f1+f5;
+	f4 = f20*f19;
+	f1 = f1+f4;
+	f2 = f2+f3;
+	f3 = f18*f19;
+	f0 = f0+f27;
+	heap32[(r2+11)] = 0;
+	f2 = f2+f3;
+	f1 = f1+f26;
+	heapFloat[(r2+12)] = f0;
+	f0 = f2+f25;
+	heapFloat[(r2+13)] = f1;
+	heapFloat[(r2+14)] = f0;
+	heap32[(r2+15)] = 0;
+if(!(r8 ==0)) //_LBB669_17
+{
+	r8 = heap32[(r1)];
+	r8 = r8 >> 2;
+	r8 = heap32[(r8+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r11 = r_g0 >> 2;
+	r11 = heap32[(r11)];
+	r11 = r11 >> 2;
+	r11 = heap32[(r11+14)];
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r3;
+	f0 = heapFloat[(fp+-191)];
+	heapFloat[(g0+2)] = f0;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+}
+	f0 = heapFloat[(r10+172)];
+	f1 = heapFloat[(r10+173)];
+if(!(f0 ==f1)) //_LBB669_52
+{
+if(!(r9 ==0)) //_LBB669_52
+{
+	r8 = sp + -312;
+	r9 = r8 >> 2;
+	heap32[(fp+-78)] = heap32[(r2+2)];
+	heap32[(r9+1)] = heap32[(r2+6)];
+	heap32[(r9+2)] = heap32[(r2+10)];
+	r10 = sp + -328;
+	heap32[(r9+3)] = 0;
+	r9 = r10 >> 2;
+	heap32[(fp+-82)] = heap32[(fp+-74)];
+	heap32[(r9+1)] = heap32[(r2+4)];
+	heap32[(r9+2)] = heap32[(r2+8)];
+	heap32[(r9+3)] = 0;
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r9 = r_g0 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+15)];
+	r11 = sp + -168;
+	r12 = r11 >> 2;
+	heap32[(fp+-42)] = 0;
+	heap32[(r12+1)] = 0;
+	heap32[(r12+2)] = 0;
+	heap32[(r12+3)] = 0;
+	f2 =        6.2831854820251465;
+	r12 = f0 <= f1;
+	f3 = heapFloat[(fp+-192)];
+	f3 = f0 > f1 ? f3 : f0;
+	f0 = f0 > f1 ? f2 : f1;
+	r12 = r12 & 1;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r8;
+	heap32[(g0+3)] = r10;
+	f1 = heapFloat[(fp+-191)];
+	heapFloat[(g0+4)] = f1;
+	heapFloat[(g0+5)] = f1;
+	heapFloat[(g0+6)] = f3;
+	heapFloat[(g0+7)] = f0;
+	heap32[(g0+8)] = r11;
+	heap32[(g0+9)] = r12;
+	heap32[(g0+10)] = 1092616192;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+}
+}
+}
+}
+}
+}
+} while(0);
+	r2 = (r7 + -1)|0;
+	if(r7 !=0) //_LBB669_4
+{
+continue _5;
+}
+else{
+break _5;
+}
+}
+}
+}
+}
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+_74: do {
+if(!(r2 ==0)) //_LBB669_60
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = r_g0 & 3;
+if(!(r2 ==0)) //_LBB669_60
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0;
+if(!(r2 ==0)) //_LBB669_60
+{
+	r2 = heap32[(r1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = r_g0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+12)];
+	heap32[(g0)] = r_g0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB669_60
+{
+	r0 = heap32[(r1+63)];
+if(!(r0 <1)) //_LBB669_60
+{
+	r0 = 0;
+_80: while(true){
+	r2 = heap32[(r1+65)];
+	r3 = r0 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+3)];
+	r4 = heap32[(r1+21)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	r0 = (r0 + 1)|0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = heap32[(r1+63)];
+	if(r2 >r0) //_LBB669_59
+{
+continue _80;
+}
+else{
+break _74;
+}
+}
+}
+}
+}
+}
+}
+} while(0);
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r3 = (r3 + -1)|0;
+	heap32[(r2+4)] = r3;
+_83: do {
+if(!(r3 !=0)) //_LBB669_66
+{
+	r3 = heap32[(r2+1)];
+	if(r3 !=0) //_LBB669_63
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r3 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	r4 = heap32[(fp+-2)];
+	r5 = heap32[(r3)];
+	r4 = (r4 - r5)|0;
+	r1 = heap32[(r1+1)];
+	r3 = heap32[(r3+1)];
+	r1 = (r1 - r3)|0;
+	r3 = (r4 * 1000000)|0;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(r2+3)];
+	r1 = (r1 - r3)|0;
+	f0 = uint(r1); //fuitos r1, f0
+	f1 =                      1000;
+	f2 = heapFloat[(r2+2)];
+	f0 = f0/f1;
+	f0 = f2+f0;
+	heapFloat[(r2+2)] = f0;
+	r1 = heap32[(r2+4)];
+	if(r1 !=0) //_LBB669_66
+{
+break _83;
+}
+else{
+	r1 = heap32[(r0)];
+}
+}
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+5)];
+	heap32[(r0)] = r1;
+}
+} while(0);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorld18saveKinematicStateEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+2)];
+if(!(r1 <1)) //_LBB670_11
+{
+	f0 = heapFloat[(fp+1)];
+	f1 =                         1;
+	f1 = f1/f0;
+	r1 = 0;
+_3: while(true){
+	r2 = heap32[(r0+4)];
+	r3 = r1 << 2;
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r3 = heapU8[r2+232];
+	r3 = r3 & 2;
+if(!(r3 ==0)) //_LBB670_10
+{
+if(!(r2 ==0)) //_LBB670_10
+{
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+54)];
+if(!(r4 ==2)) //_LBB670_10
+{
+	r4 = heapU8[r2+204];
+	r4 = r4 & 2;
+if(!(r4 ==0)) //_LBB670_10
+{
+	f2 =                         0;
+if(!(f0 ==f2)) //_LBB670_10
+{
+	r4 = heap32[(r3+118)];
+if(!(r4 ==0)) //_LBB670_9
+{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r6 = (r2 + 4)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	f2 = heapFloat[(r3+13)];
+	f3 = heapFloat[(r3+29)];
+	f2 = f2-f3;
+	f3 = heapFloat[(r3+15)];
+	f4 = heapFloat[(r3+31)];
+	f5 = heapFloat[(r3+14)];
+	f6 = heapFloat[(r3+30)];
+	f5 = f5-f6;
+	f2 = f2*f1;
+	f3 = f3-f4;
+	f4 = f5*f1;
+	heapFloat[(r3+76)] = f2;
+	f2 = f3*f1;
+	heapFloat[(r3+77)] = f4;
+	heapFloat[(r3+78)] = f2;
+	heap32[(r3+79)] = 0;
+	r4 = sp + -16;
+	r5 = (r2 + 68)|0;
+	r2 = (r2 + 4)|0;
+	r6 = sp + -20;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r6;
+	_ZN15btTransformUtil22calculateDiffAxisAngleERK11btTransformS2_R9btVector3Rf(i7);
+	r2 = r4 >> 2;
+	f2 = heapFloat[(fp+-5)];
+	f3 = heapFloat[(fp+-4)];
+	f3 = f3*f2;
+	f4 = heapFloat[(r2+2)];
+	f5 = heapFloat[(r2+1)];
+	f5 = f5*f2;
+	f3 = f3*f1;
+	f2 = f4*f2;
+	f4 = f5*f1;
+	heapFloat[(r3+80)] = f3;
+	f2 = f2*f1;
+	heapFloat[(r3+81)] = f4;
+	heapFloat[(r3+82)] = f2;
+	heap32[(r3+83)] = 0;
+	heap32[(r3+33)] = heap32[(r3+76)];
+	heap32[(r3+34)] = heap32[(r3+77)];
+	heap32[(r3+35)] = heap32[(r3+78)];
+	heap32[(r3+36)] = heap32[(r3+79)];
+	heapFloat[(r3+37)] = f3;
+	heapFloat[(r3+38)] = f4;
+	heapFloat[(r3+39)] = f2;
+	heap32[(r3+40)] = 0;
+	heap32[(r3+17)] = heap32[(r3+1)];
+	heap32[(r3+18)] = heap32[(r3+2)];
+	heap32[(r3+19)] = heap32[(r3+3)];
+	heap32[(r3+20)] = heap32[(r3+4)];
+	heap32[(r3+21)] = heap32[(r3+5)];
+	heap32[(r3+22)] = heap32[(r3+6)];
+	heap32[(r3+23)] = heap32[(r3+7)];
+	heap32[(r3+24)] = heap32[(r3+8)];
+	heap32[(r3+25)] = heap32[(r3+9)];
+	heap32[(r3+26)] = heap32[(r3+10)];
+	heap32[(r3+27)] = heap32[(r3+11)];
+	heap32[(r3+28)] = heap32[(r3+12)];
+	heap32[(r3+29)] = heap32[(r3+13)];
+	heap32[(r3+30)] = heap32[(r3+14)];
+	heap32[(r3+31)] = heap32[(r3+15)];
+	heap32[(r3+32)] = heap32[(r3+16)];
+}
+}
+}
+}
+}
+	r1 = (r1 + 1)|0;
+	r2 = heap32[(r0+2)];
+	if(r2 >r1) //_LBB670_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN15btDynamicsWorldD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV15btDynamicsWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorldD2Ev(i7);
+	return;
+}
+
+function _ZN15btDynamicsWorldD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV15btDynamicsWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorldD2Ev(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorldD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btDiscreteDynamicsWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+244];
+if(!(r1 ==0)) //_LBB673_3
+{
+	r1 = heap32[(r2+45)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+45)];
+if(!(r1 ==0)) //_LBB673_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heapU8[r0+245];
+if(!(r1 ==0)) //_LBB673_6
+{
+	r1 = heap32[(r2+44)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+44)];
+if(!(r1 ==0)) //_LBB673_6
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heap32[(r2+65)];
+if(!(r1 ==0)) //_LBB673_10
+{
+	r3 = heapU8[r0+264];
+if(!(r3 ==0)) //_LBB673_9
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+65)] = 0;
+}
+	r1 = 1;
+	heap8[r0+264] = r1;
+	heap32[(r2+65)] = 0;
+	heap32[(r2+63)] = 0;
+	heap32[(r2+64)] = 0;
+	r3 = heap32[(r2+54)];
+if(!(r3 ==0)) //_LBB673_14
+{
+	r4 = heapU8[r0+220];
+if(!(r4 ==0)) //_LBB673_13
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+54)] = 0;
+}
+	heap8[r0+220] = r1;
+	heap32[(r2+54)] = 0;
+	heap32[(r2+52)] = 0;
+	heap32[(r2+53)] = 0;
+	r3 = heap32[(r2+49)];
+if(!(r3 ==0)) //_LBB673_18
+{
+	r4 = heapU8[r0+200];
+if(!(r4 ==0)) //_LBB673_17
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+49)] = 0;
+}
+	heap8[r0+200] = r1;
+	heap32[(r2+49)] = 0;
+	r1 = _ZTV15btDynamicsWorld;
+	heap32[(r2+47)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+48)] = 0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorldD2Ev(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorldD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(g0)] = r0;
+	_ZN23btDiscreteDynamicsWorldD2Ev(i7);
+	return;
+}
+
+function _ZN23btDiscreteDynamicsWorldD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV23btDiscreteDynamicsWorld;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heapU8[r0+244];
+if(!(r1 ==0)) //_LBB675_3
+{
+	r1 = heap32[(r2+45)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+45)];
+if(!(r1 ==0)) //_LBB675_3
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heapU8[r0+245];
+if(!(r1 ==0)) //_LBB675_6
+{
+	r1 = heap32[(r2+44)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r1 = heap32[(r2+44)];
+if(!(r1 ==0)) //_LBB675_6
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+}
+	r1 = heap32[(r2+65)];
+if(!(r1 ==0)) //_LBB675_10
+{
+	r3 = heapU8[r0+264];
+if(!(r3 ==0)) //_LBB675_9
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+65)] = 0;
+}
+	r1 = 1;
+	heap8[r0+264] = r1;
+	heap32[(r2+65)] = 0;
+	heap32[(r2+63)] = 0;
+	heap32[(r2+64)] = 0;
+	r3 = heap32[(r2+54)];
+if(!(r3 ==0)) //_LBB675_14
+{
+	r4 = heapU8[r0+220];
+if(!(r4 ==0)) //_LBB675_13
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+54)] = 0;
+}
+	heap8[r0+220] = r1;
+	heap32[(r2+54)] = 0;
+	heap32[(r2+52)] = 0;
+	heap32[(r2+53)] = 0;
+	r3 = heap32[(r2+49)];
+if(!(r3 ==0)) //_LBB675_18
+{
+	r4 = heapU8[r0+200];
+if(!(r4 ==0)) //_LBB675_17
+{
+	r4 = gNumAlignedFree;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r5 = (r5 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r4)] = r5;
+	r3 = heap32[(r3+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+}
+	heap32[(r2+49)] = 0;
+}
+	heap8[r0+200] = r1;
+	heap32[(r2+49)] = 0;
+	r1 = _ZTV15btDynamicsWorld;
+	heap32[(r2+47)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+48)] = 0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZN16btCollisionWorldD2Ev(i7);
+	return;
+}
+
+function _ZN11btRigidBody12setMassPropsEfRK9btVector3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(fp+1)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(r0+51)];
+	f1 =                         0;
+	if(f0 !=f1) //_LBB676_2
+{
+	r2 = r2 & -2;
+	f2 =                         1;
+	f2 = f2/f0;
+	heap32[(r0+51)] = r2;
+	heapFloat[(r0+84)] = f2;
+}
+else{
+	r2 = r2 | 1;
+	f2 =                         0;
+	heap32[(r0+51)] = r2;
+	heap32[(r0+84)] = 0;
+}
+	f3 = heapFloat[(r0+95)];
+	f4 = heapFloat[(r0+94)];
+	f5 = heapFloat[(r0+93)];
+	f5 = f5*f0;
+	f4 = f4*f0;
+	heapFloat[(r0+89)] = f5;
+	f0 = f3*f0;
+	heapFloat[(r0+90)] = f4;
+	heapFloat[(r0+91)] = f0;
+	r1 = r1 >> 2;
+	heap32[(r0+92)] = 0;
+	f0 = heapFloat[(r1+2)];
+	if(f0 !=f1) //_LBB676_5
+{
+	f3 =                         1;
+	f0 = f3/f0;
+}
+else{
+	f0 = f1;
+}
+	f3 = heapFloat[(r1+1)];
+	if(f3 !=f1) //_LBB676_8
+{
+	f1 =                         1;
+	f3 = f1/f3;
+}
+else{
+	f3 =                         0;
+}
+	f1 = heapFloat[(r1)];
+	f4 =                         0;
+	if(f1 !=f4) //_LBB676_11
+{
+	f4 =                         1;
+	f4 = f4/f1;
+}
+	heapFloat[(r0+97)] = f4;
+	heapFloat[(r0+98)] = f3;
+	heapFloat[(r0+99)] = f0;
+	heap32[(r0+100)] = 0;
+	f0 = heapFloat[(r0+87)];
+	f1 = heapFloat[(r0+86)];
+	f3 = heapFloat[(r0+85)];
+	f3 = f3*f2;
+	f1 = f1*f2;
+	heapFloat[(r0+138)] = f3;
+	f0 = f0*f2;
+	heapFloat[(r0+139)] = f1;
+	heapFloat[(r0+140)] = f0;
+	heap32[(r0+141)] = 0;
+	return;
+}
+
+function _ZN11btRigidBody19updateInertiaTensorEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+	var f16;
+	var f17;
+	var f18;
+	var f19;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	f0 = heapFloat[(r0+1)];
+	f1 = heapFloat[(r0+97)];
+	f2 = heapFloat[(r0+2)];
+	f3 = heapFloat[(r0+98)];
+	f4 = f0*f1;
+	f5 = f2*f3;
+	f6 = heapFloat[(r0+3)];
+	f7 = heapFloat[(r0+99)];
+	f8 = heapFloat[(r0+5)];
+	f9 = heapFloat[(r0+6)];
+	f10 = f6*f7;
+	f11 = f0*f4;
+	f12 = f2*f5;
+	f13 = heapFloat[(r0+9)];
+	f14 = heapFloat[(r0+10)];
+	f15 = heapFloat[(r0+7)];
+	f16 = heapFloat[(r0+11)];
+	f17 = f8*f4;
+	f18 = f9*f5;
+	f11 = f11+f12;
+	f12 = f6*f10;
+	f4 = f13*f4;
+	f5 = f14*f5;
+	f17 = f17+f18;
+	f18 = f15*f10;
+	f11 = f11+f12;
+	f12 = f8*f1;
+	f19 = f9*f3;
+	f4 = f4+f5;
+	f5 = f16*f10;
+	f10 = f17+f18;
+	heapFloat[(r0+64)] = f11;
+	f11 = f15*f7;
+	f17 = f0*f12;
+	f18 = f2*f19;
+	f4 = f4+f5;
+	heapFloat[(r0+65)] = f10;
+	heapFloat[(r0+66)] = f4;
+	f4 = f8*f12;
+	f5 = f9*f19;
+	f10 = f17+f18;
+	f17 = f6*f11;
+	f12 = f13*f12;
+	f18 = f14*f19;
+	f4 = f4+f5;
+	f5 = f15*f11;
+	f10 = f10+f17;
+	heap32[(r0+67)] = 0;
+	f1 = f13*f1;
+	f3 = f14*f3;
+	f12 = f12+f18;
+	f11 = f16*f11;
+	f4 = f4+f5;
+	heapFloat[(r0+68)] = f10;
+	f5 = f16*f7;
+	f0 = f0*f1;
+	f2 = f2*f3;
+	f7 = f12+f11;
+	heapFloat[(r0+69)] = f4;
+	heapFloat[(r0+70)] = f7;
+	f4 = f8*f1;
+	f7 = f9*f3;
+	f0 = f0+f2;
+	f2 = f6*f5;
+	f1 = f13*f1;
+	f3 = f14*f3;
+	f4 = f4+f7;
+	f6 = f15*f5;
+	f0 = f0+f2;
+	heap32[(r0+71)] = 0;
+	f1 = f1+f3;
+	f2 = f16*f5;
+	f3 = f4+f6;
+	heapFloat[(r0+72)] = f0;
+	f0 = f1+f2;
+	heapFloat[(r0+73)] = f3;
+	heapFloat[(r0+74)] = f0;
+	heap32[(r0+75)] = 0;
+	return;
+}
+
+function _ZN11btRigidBody18proceedToTransformERK11btTransform(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heapU8[r0+204];
+	r2 = r2 & 3;
+	if(r2 ==0) //_LBB678_2
+{
+	r2 = r0 >> 2;
+	r24 = r1 >> 2;
+	heap32[(r2+17)] = heap32[(r24)];
+	heap32[(r2+18)] = heap32[(r24+1)];
+	heap32[(r2+19)] = heap32[(r24+2)];
+	heap32[(r2+20)] = heap32[(r24+3)];
+	heap32[(r2+21)] = heap32[(r24+4)];
+	heap32[(r2+22)] = heap32[(r24+5)];
+	heap32[(r2+23)] = heap32[(r24+6)];
+	heap32[(r2+24)] = heap32[(r24+7)];
+	heap32[(r2+25)] = heap32[(r24+8)];
+	heap32[(r2+26)] = heap32[(r24+9)];
+	heap32[(r2+27)] = heap32[(r24+10)];
+	heap32[(r2+28)] = heap32[(r24+11)];
+	heap32[(r2+29)] = heap32[(r24+12)];
+	heap32[(r2+30)] = heap32[(r24+13)];
+	r15 = (r1 + 4)|0;
+	r16 = (r1 + 8)|0;
+	r17 = (r1 + 12)|0;
+	r18 = (r1 + 16)|0;
+	r19 = (r1 + 20)|0;
+	r20 = (r1 + 24)|0;
+	r21 = (r1 + 28)|0;
+	r22 = (r1 + 32)|0;
+	r23 = (r1 + 36)|0;
+	r3 = (r1 + 40)|0;
+	heap32[(fp+-10)] = r3;
+	r3 = (r1 + 44)|0;
+	heap32[(fp+-4)] = r3;
+	r3 = (r1 + 48)|0;
+	heap32[(fp+-7)] = r3;
+	r3 = (r1 + 52)|0;
+	heap32[(fp+-6)] = r3;
+	r3 = (r1 + 56)|0;
+	heap32[(fp+-9)] = r3;
+	r3 = (r1 + 60)|0;
+	heap32[(fp+-8)] = r3;
+	r3 = (r0 + 4)|0;
+	r4 = (r0 + 8)|0;
+	r5 = (r0 + 12)|0;
+	r6 = (r0 + 16)|0;
+	r7 = (r0 + 20)|0;
+	r8 = (r0 + 24)|0;
+	r9 = (r0 + 28)|0;
+	r10 = (r0 + 32)|0;
+	r11 = (r0 + 36)|0;
+	r12 = (r0 + 40)|0;
+	r13 = (r0 + 44)|0;
+	r14 = (r0 + 48)|0;
+	r25 = (r0 + 52)|0;
+	heap32[(fp+-5)] = r25;
+	r25 = (r0 + 56)|0;
+	heap32[(fp+-3)] = r25;
+	r25 = (r0 + 60)|0;
+	heap32[(fp+-2)] = r25;
+	r25 = (r0 + 64)|0;
+	heap32[(fp+-1)] = r25;
+	heap32[(r2+31)] = heap32[(r24+14)];
+	heap32[(r2+32)] = heap32[(r24+15)];
+}
+else{
+	r2 = r0 >> 2;
+	heap32[(r2+17)] = heap32[(r2+1)];
+	heap32[(r2+18)] = heap32[(r2+2)];
+	heap32[(r2+19)] = heap32[(r2+3)];
+	heap32[(r2+20)] = heap32[(r2+4)];
+	heap32[(r2+21)] = heap32[(r2+5)];
+	heap32[(r2+22)] = heap32[(r2+6)];
+	heap32[(r2+23)] = heap32[(r2+7)];
+	heap32[(r2+24)] = heap32[(r2+8)];
+	heap32[(r2+25)] = heap32[(r2+9)];
+	heap32[(r2+26)] = heap32[(r2+10)];
+	heap32[(r2+27)] = heap32[(r2+11)];
+	heap32[(r2+28)] = heap32[(r2+12)];
+	heap32[(r2+29)] = heap32[(r2+13)];
+	heap32[(r2+30)] = heap32[(r2+14)];
+	r3 = (r0 + 4)|0;
+	r4 = (r0 + 8)|0;
+	r5 = (r0 + 12)|0;
+	r6 = (r0 + 16)|0;
+	r7 = (r0 + 20)|0;
+	r8 = (r0 + 24)|0;
+	r9 = (r0 + 28)|0;
+	r10 = (r0 + 32)|0;
+	r11 = (r0 + 36)|0;
+	r12 = (r0 + 40)|0;
+	r13 = (r0 + 44)|0;
+	r14 = (r0 + 48)|0;
+	r15 = (r0 + 52)|0;
+	heap32[(fp+-5)] = r15;
+	r15 = (r0 + 56)|0;
+	heap32[(fp+-3)] = r15;
+	r15 = (r0 + 60)|0;
+	heap32[(fp+-2)] = r15;
+	r15 = (r0 + 64)|0;
+	heap32[(fp+-1)] = r15;
+	r15 = (r1 + 4)|0;
+	r16 = (r1 + 8)|0;
+	r17 = (r1 + 12)|0;
+	r18 = (r1 + 16)|0;
+	r19 = (r1 + 20)|0;
+	r20 = (r1 + 24)|0;
+	r21 = (r1 + 28)|0;
+	r22 = (r1 + 32)|0;
+	r23 = (r1 + 36)|0;
+	r24 = (r1 + 40)|0;
+	heap32[(fp+-10)] = r24;
+	r24 = (r1 + 44)|0;
+	heap32[(fp+-4)] = r24;
+	r24 = (r1 + 48)|0;
+	heap32[(fp+-7)] = r24;
+	r24 = (r1 + 52)|0;
+	heap32[(fp+-6)] = r24;
+	r24 = (r1 + 56)|0;
+	heap32[(fp+-9)] = r24;
+	r24 = (r1 + 60)|0;
+	heap32[(fp+-8)] = r24;
+	heap32[(r2+31)] = heap32[(r2+15)];
+	heap32[(r2+32)] = heap32[(r2+16)];
+}
+	r2 = r0 >> 2;
+	heap32[(r2+33)] = heap32[(r2+76)];
+	heap32[(r2+34)] = heap32[(r2+77)];
+	heap32[(r2+35)] = heap32[(r2+78)];
+	heap32[(r2+36)] = heap32[(r2+79)];
+	heap32[(r2+37)] = heap32[(r2+80)];
+	heap32[(r2+38)] = heap32[(r2+81)];
+	heap32[(r2+39)] = heap32[(r2+82)];
+	r3 = r3 >> 2;
+	r1 = r1 >> 2;
+	heap32[(r2+40)] = heap32[(r2+83)];
+	r2 = r4 >> 2;
+	r4 = r15 >> 2;
+	heap32[(r3)] = heap32[(r1)];
+	r1 = r5 >> 2;
+	r3 = r16 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = r6 >> 2;
+	r4 = r17 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = r7 >> 2;
+	r3 = r18 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = r8 >> 2;
+	r4 = r19 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = r9 >> 2;
+	r3 = r20 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = r10 >> 2;
+	r4 = r21 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = r11 >> 2;
+	r3 = r22 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = r12 >> 2;
+	r4 = r23 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = r13 >> 2;
+	r3 = heap32[(fp+-10)];
+	r3 = r3 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = r14 >> 2;
+	r4 = heap32[(fp+-4)];
+	r4 = r4 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = heap32[(fp+-5)];
+	r1 = r1 >> 2;
+	r3 = heap32[(fp+-7)];
+	r3 = r3 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = heap32[(fp+-3)];
+	r2 = r2 >> 2;
+	r4 = heap32[(fp+-6)];
+	r4 = r4 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	r1 = heap32[(fp+-2)];
+	r1 = r1 >> 2;
+	r3 = heap32[(fp+-9)];
+	r3 = r3 >> 2;
+	heap32[(r2)] = heap32[(r4)];
+	r2 = heap32[(fp+-1)];
+	r2 = r2 >> 2;
+	r4 = heap32[(fp+-8)];
+	r4 = r4 >> 2;
+	heap32[(r1)] = heap32[(r3)];
+	heap32[(r2)] = heap32[(r4)];
+	heap32[(g0)] = r0;
+	_ZN11btRigidBody19updateInertiaTensorEv(i7);
+	return;
+}
+
+function _ZNK11btRigidBody28calculateSerializeBufferSizeEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 480;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK11btRigidBody21serializeSingleObjectEP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r3 = r1 >> 2;
+	r4 = heap32[(r3)];
+	r5 = heap32[(r2)];
+	r4 = r4 >> 2;
+	r5 = r5 >> 2;
+	r4 = heap32[(r4+4)];
+	r5 = heap32[(r5+4)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = 1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r_g0;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r5 = r4 >> 2;
+	r2 = heap32[(r2+5)];
+	r5 = heap32[(r5+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r_g0;
+	heap32[(g0+3)] = 1497645650;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+
+function _ZN11btRigidBody24checkCollideWithOverrideEP17btCollisionObject(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heapU8[r0+232];
+	r1 = r1 & 2;
+_1: do {
+	if(r1 !=0) //_LBB681_2
+{
+	if(r0 ==0) //_LBB681_1
+{
+__label__ = 1;
+}
+else{
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1+120)];
+	r3 = 0;
+_4: while(true){
+	if(r2 >r3) //_LBB681_4
+{
+	r4 = heap32[(r1+122)];
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r5 = heap32[(r4+5)];
+	if(r5 !=r0) //_LBB681_6
+{
+	r4 = heap32[(r4+6)];
+	if(r4 ==r0) //_LBB681_5
+{
+break _4;
+}
+else{
+	r3 = (r3 + 1)|0;
+}
+}
+else{
+break _4;
+}
+}
+else{
+__label__ = 1;
+break _1;
+}
+}
+	r0 = 0;
+__label__ = 9;
+}
+}
+else{
+__label__ = 1;
+}
+} while(0);
+if (__label__ == 1){
+	r0 = 1;
+}
+	r0 = r0 & 255;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11btRigidBody14setupRigidBodyERKNS_27btRigidBodyConstructionInfoE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+	var f12;
+	var f13;
+	var f14;
+	var f15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	heap32[(r1+58)] = 2;
+	heap32[(r1+76)] = 0;
+	heap32[(r1+77)] = 0;
+	heap32[(r1+78)] = 0;
+	heap32[(r1+79)] = 0;
+	heap32[(r1+80)] = 0;
+	heap32[(r1+81)] = 0;
+	heap32[(r1+82)] = 0;
+	heap32[(r1+83)] = 0;
+	heap32[(r1+134)] = 1065353216;
+	heap32[(r1+135)] = 1065353216;
+	heap32[(r1+136)] = 1065353216;
+	heap32[(r1+137)] = 0;
+	heap32[(r1+85)] = 1065353216;
+	heap32[(r1+86)] = 1065353216;
+	heap32[(r1+87)] = 1065353216;
+	heap32[(r1+88)] = 0;
+	heap32[(r1+89)] = 0;
+	heap32[(r1+90)] = 0;
+	heap32[(r1+91)] = 0;
+	heap32[(r1+92)] = 0;
+	heap32[(r1+93)] = 0;
+	heap32[(r1+94)] = 0;
+	heap32[(r1+95)] = 0;
+	heap32[(r1+96)] = 0;
+	heap32[(r1+101)] = 0;
+	heap32[(r1+102)] = 0;
+	heap32[(r1+103)] = 0;
+	heap32[(r1+104)] = 0;
+	heap32[(r1+105)] = 0;
+	heap32[(r1+106)] = 0;
+	heap32[(r1+107)] = 0;
+	heap32[(r1+108)] = 0;
+	heap32[(r1+109)] = 0;
+	r2 = heap32[(fp+1)];
+	heap32[(r1+110)] = 1056964608;
+	r3 = r2 >> 2;
+	heap32[(r1+116)] = heap32[(r3+27)];
+	heap32[(r1+117)] = heap32[(r3+28)];
+	r4 = heap32[(r3+1)];
+	heap32[(r1+118)] = r4;
+	heap32[(r1+150)] = 0;
+	heap32[(r1+151)] = 0;
+	r5 = heapU8[r2+116];
+	heap8[r0+444] = r5;
+	heap32[(r1+112)] = heap32[(r3+30)];
+	heap32[(r1+113)] = heap32[(r3+31)];
+	heap32[(r1+114)] = heap32[(r3+32)];
+	heap32[(r1+115)] = heap32[(r3+33)];
+	if(r4 ==0) //_LBB682_2
+{
+	f0 = heapFloat[(r3+2)];
+	heapFloat[(r1+1)] = f0;
+	f1 = heapFloat[(r3+3)];
+	heapFloat[(r1+2)] = f1;
+	f2 = heapFloat[(r3+4)];
+	heapFloat[(r1+3)] = f2;
+	f3 = heapFloat[(r3+5)];
+	heapFloat[(r1+4)] = f3;
+	f4 = heapFloat[(r3+6)];
+	heapFloat[(r1+5)] = f4;
+	f5 = heapFloat[(r3+7)];
+	heapFloat[(r1+6)] = f5;
+	f6 = heapFloat[(r3+8)];
+	heapFloat[(r1+7)] = f6;
+	f7 = heapFloat[(r3+9)];
+	heapFloat[(r1+8)] = f7;
+	f8 = heapFloat[(r3+10)];
+	heapFloat[(r1+9)] = f8;
+	f9 = heapFloat[(r3+11)];
+	heapFloat[(r1+10)] = f9;
+	f10 = heapFloat[(r3+12)];
+	heapFloat[(r1+11)] = f10;
+	f11 = heapFloat[(r3+13)];
+	heapFloat[(r1+12)] = f11;
+	f12 = heapFloat[(r3+14)];
+	heapFloat[(r1+13)] = f12;
+	f13 = heapFloat[(r3+15)];
+	heapFloat[(r1+14)] = f13;
+	f14 = heapFloat[(r3+16)];
+	heapFloat[(r1+15)] = f14;
+	f15 = heapFloat[(r3+17)];
+	heapFloat[(r1+16)] = f15;
+}
+else{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r6 = (r0 + 4)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r6;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	f0 = heapFloat[(r1+1)];
+	f1 = heapFloat[(r1+2)];
+	f2 = heapFloat[(r1+3)];
+	f3 = heapFloat[(r1+4)];
+	f4 = heapFloat[(r1+5)];
+	f5 = heapFloat[(r1+6)];
+	f6 = heapFloat[(r1+7)];
+	f7 = heapFloat[(r1+8)];
+	f8 = heapFloat[(r1+9)];
+	f9 = heapFloat[(r1+10)];
+	f10 = heapFloat[(r1+11)];
+	f11 = heapFloat[(r1+12)];
+	f12 = heapFloat[(r1+13)];
+	f13 = heapFloat[(r1+14)];
+	f14 = heapFloat[(r1+15)];
+	f15 = heapFloat[(r1+16)];
+}
+	heapFloat[(r1+17)] = f0;
+	heapFloat[(r1+18)] = f1;
+	heapFloat[(r1+19)] = f2;
+	heapFloat[(r1+20)] = f3;
+	heapFloat[(r1+21)] = f4;
+	heapFloat[(r1+22)] = f5;
+	heapFloat[(r1+23)] = f6;
+	heapFloat[(r1+24)] = f7;
+	heapFloat[(r1+25)] = f8;
+	heapFloat[(r1+26)] = f9;
+	heapFloat[(r1+27)] = f10;
+	heapFloat[(r1+28)] = f11;
+	heapFloat[(r1+29)] = f12;
+	heapFloat[(r1+30)] = f13;
+	heapFloat[(r1+31)] = f14;
+	heapFloat[(r1+32)] = f15;
+	heap32[(r1+33)] = 0;
+	heap32[(r1+34)] = 0;
+	heap32[(r1+35)] = 0;
+	heap32[(r1+36)] = 0;
+	heap32[(r1+37)] = 0;
+	heap32[(r1+38)] = 0;
+	heap32[(r1+39)] = 0;
+	heap32[(r1+40)] = 0;
+	heap32[(r1+56)] = heap32[(r3+25)];
+	heap32[(r1+57)] = heap32[(r3+26)];
+	r4 = heap32[(r1)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+3)];
+	r5 = heap32[(r3+18)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	r5 = _ZL8uniqueId;
+	r5 = r5 >> 2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = heap32[(r5)];
+	r6 = (r4 + 1)|0;
+	heap32[(r1+125)] = r4;
+	heap32[(r5)] = r6;
+	f0 = heapFloat[(r3)];
+	r2 = (r2 + 76)|0;
+	heap32[(g0)] = r0;
+	heapFloat[(g0+1)] = f0;
+	heap32[(g0+2)] = r2;
+	_ZN11btRigidBody12setMassPropsEfRK9btVector3(i7);
+	f0 = heapFloat[(r3+23)];
+	f1 = heapFloat[(r3+24)];
+	f2 =                         0;
+	if(f0 >=f2) //_LBB682_5
+{
+	f3 =                         1;
+	f0 = f0 > f3 ? f3 : f0;
+}
+else{
+	f0 = f2;
+}
+	heapFloat[(r1+109)] = f0;
+	if(f1 >=f2) //_LBB682_8
+{
+	f0 =                         1;
+	f1 = f1 > f0 ? f0 : f1;
+}
+else{
+	f1 =                         0;
+}
+	heapFloat[(r1+110)] = f1;
+	heap32[(g0)] = r0;
+	_ZN11btRigidBody19updateInertiaTensorEv(i7);
+	heap32[(r1+124)] = 0;
+	heap32[(r1+126)] = 0;
+	heap32[(r1+127)] = 0;
+	heap32[(r1+128)] = 0;
+	heap32[(r1+129)] = 0;
+	heap32[(r1+130)] = 0;
+	heap32[(r1+131)] = 0;
+	heap32[(r1+132)] = 0;
+	heap32[(r1+133)] = 0;
+	f0 = heapFloat[(r1+87)];
+	f1 = heapFloat[(r1+84)];
+	f2 = heapFloat[(r1+86)];
+	f3 = heapFloat[(r1+85)];
+	f3 = f3*f1;
+	f2 = f2*f1;
+	heapFloat[(r1+138)] = f3;
+	f0 = f0*f1;
+	heapFloat[(r1+139)] = f2;
+	heapFloat[(r1+140)] = f0;
+	heap32[(r1+141)] = 0;
+	heap32[(r1+142)] = 0;
+	heap32[(r1+143)] = 0;
+	heap32[(r1+144)] = 0;
+	heap32[(r1+145)] = 0;
+	heap32[(r1+146)] = 0;
+	heap32[(r1+147)] = 0;
+	heap32[(r1+148)] = 0;
+	heap32[(r1+149)] = 0;
+	return;
+}
+
+function _ZN11btRigidBodyD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV11btRigidBody;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+120)];
+	if(r1 ==0) //_LBB683_2
+{
+	r1 = heap32[(r2+122)];
+if(!(r1 ==0)) //_LBB683_6
+{
+	r3 = heapU8[r0+492];
+if(!(r3 ==0)) //_LBB683_5
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+122)] = 0;
+}
+	r1 = 1;
+	heap8[r0+492] = r1;
+	heap32[(r2+122)] = 0;
+	r1 = _ZTV17btCollisionObject;
+	heap32[(r2+120)] = 0;
+	r1 = (r1 + 8)|0;
+	heap32[(r2+121)] = 0;
+	heap32[(r2)] = r1;
+if(!(r0 ==0)) //_LBB683_8
+{
+	r0 = gNumAlignedFree;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	r0 = heap32[(r2+-1)];
+	heap32[(g0)] = r0;
+	free(i7);
+}
+	return;
+}
+else{
+	r0 = _2E_str248;
+	r2 = _2E_str34955;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 175;
+	_assert(i7);
+}
+}
+
+function _ZN11btRigidBodyD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTV11btRigidBody;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	r1 = heap32[(r2+120)];
+	if(r1 ==0) //_LBB684_2
+{
+	r1 = heap32[(r2+122)];
+if(!(r1 ==0)) //_LBB684_6
+{
+	r3 = heapU8[r0+492];
+if(!(r3 ==0)) //_LBB684_5
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1)|0;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r4;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	free(i7);
+}
+	heap32[(r2+122)] = 0;
+}
+	r1 = 1;
+	heap8[r0+492] = r1;
+	heap32[(r2+122)] = 0;
+	r0 = _ZTV17btCollisionObject;
+	heap32[(r2+120)] = 0;
+	r0 = (r0 + 8)|0;
+	heap32[(r2+121)] = 0;
+	heap32[(r2)] = r0;
+	return;
+}
+else{
+	r0 = _2E_str248;
+	r2 = _2E_str34955;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 175;
+	_assert(i7);
+}
+}
+
+function _ZNK11btRigidBody9serializeEPvP12btSerializer(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	r1 = r1 >> 2;
+	r2 = r0 >> 2;
+	_ZNK17btCollisionObject9serializeEPvP12btSerializer(i7);
+	heap32[(r1+62)] = heap32[(r2+64)];
+	heap32[(r1+63)] = heap32[(r2+65)];
+	heap32[(r1+64)] = heap32[(r2+66)];
+	heap32[(r1+65)] = heap32[(r2+67)];
+	heap32[(r1+66)] = heap32[(r2+68)];
+	heap32[(r1+67)] = heap32[(r2+69)];
+	heap32[(r1+68)] = heap32[(r2+70)];
+	heap32[(r1+69)] = heap32[(r2+71)];
+	heap32[(r1+70)] = heap32[(r2+72)];
+	heap32[(r1+71)] = heap32[(r2+73)];
+	heap32[(r1+72)] = heap32[(r2+74)];
+	heap32[(r1+73)] = heap32[(r2+75)];
+	heap32[(r1+74)] = heap32[(r2+76)];
+	heap32[(r1+75)] = heap32[(r2+77)];
+	heap32[(r1+76)] = heap32[(r2+78)];
+	heap32[(r1+77)] = heap32[(r2+79)];
+	heap32[(r1+78)] = heap32[(r2+80)];
+	heap32[(r1+79)] = heap32[(r2+81)];
+	heap32[(r1+80)] = heap32[(r2+82)];
+	heap32[(r1+81)] = heap32[(r2+83)];
+	heap32[(r1+110)] = heap32[(r2+84)];
+	heap32[(r1+82)] = heap32[(r2+134)];
+	heap32[(r1+83)] = heap32[(r2+135)];
+	heap32[(r1+84)] = heap32[(r2+136)];
+	heap32[(r1+85)] = heap32[(r2+137)];
+	heap32[(r1+86)] = heap32[(r2+85)];
+	heap32[(r1+87)] = heap32[(r2+86)];
+	heap32[(r1+88)] = heap32[(r2+87)];
+	heap32[(r1+89)] = heap32[(r2+88)];
+	heap32[(r1+90)] = heap32[(r2+89)];
+	heap32[(r1+91)] = heap32[(r2+90)];
+	heap32[(r1+92)] = heap32[(r2+91)];
+	heap32[(r1+93)] = heap32[(r2+92)];
+	heap32[(r1+94)] = heap32[(r2+93)];
+	heap32[(r1+95)] = heap32[(r2+94)];
+	heap32[(r1+96)] = heap32[(r2+95)];
+	heap32[(r1+97)] = heap32[(r2+96)];
+	heap32[(r1+98)] = heap32[(r2+97)];
+	heap32[(r1+99)] = heap32[(r2+98)];
+	heap32[(r1+100)] = heap32[(r2+99)];
+	heap32[(r1+101)] = heap32[(r2+100)];
+	heap32[(r1+102)] = heap32[(r2+101)];
+	heap32[(r1+103)] = heap32[(r2+102)];
+	heap32[(r1+104)] = heap32[(r2+103)];
+	heap32[(r1+105)] = heap32[(r2+104)];
+	heap32[(r1+106)] = heap32[(r2+105)];
+	heap32[(r1+107)] = heap32[(r2+106)];
+	heap32[(r1+108)] = heap32[(r2+107)];
+	heap32[(r1+109)] = heap32[(r2+108)];
+	heap32[(r1+111)] = heap32[(r2+109)];
+	heap32[(r1+112)] = heap32[(r2+110)];
+	r0 = heapU8[r0+444];
+	heap32[(r1+119)] = r0;
+	heap32[(r1+113)] = heap32[(r2+112)];
+	heap32[(r1+114)] = heap32[(r2+113)];
+	heap32[(r1+115)] = heap32[(r2+114)];
+	heap32[(r1+116)] = heap32[(r2+115)];
+	heap32[(r1+117)] = heap32[(r2+116)];
+	heap32[(r1+118)] = heap32[(r2+117)];
+	r0 = _2E_str4144;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11btRigidBody16addConstraintRefEP17btTypedConstraint(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(r1+120)];
+	r4 = 0;
+_1: while(true){
+	if(r3 >r4) //_LBB686_1
+{
+	r5 = heap32[(r1+122)];
+	r6 = r4 << 2;
+	r5 = (r5 + r6)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	if(r5 !=r2) //_LBB686_3
+{
+	r4 = (r4 + 1)|0;
+continue _1;
+}
+else{
+__label__ = 5;
+break _1;
+}
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+if (__label__ == 4){
+	r4 = r3;
+}
+if(!(r3 !=r4)) //_LBB686_27
+{
+	r4 = heap32[(r1+121)];
+	if(r4 ==r3) //_LBB686_9
+{
+	r5 = 1;
+	r6 = r3 << 1;
+	r6 = r3 == 0 ? r5 : r6;
+if(!(r4 >=r6)) //_LBB686_8
+{
+	if(r6 !=0) //_LBB686_12
+{
+	r4 = gNumAlignedAllocs;
+	r4 = r4 >> 2;
+	r7 = heap32[(r4)];
+	r8 = r6 << 2;
+	r7 = (r7 + 1)|0;
+	r8 = r8 | 3;
+	heap32[(r4)] = r7;
+	r4 = (r8 + 16)|0;
+	heap32[(g0)] = r4;
+	malloc(i7);
+	r4 = r_g0;
+	if(r4 !=0) //_LBB686_14
+{
+	r7 = 0;
+	r8 = (r4 + 4)|0;
+	r7 = (r7 - r8)|0;
+	r7 = r7 & 15;
+	r7 = (r4 + r7)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r4;
+	r4 = r8;
+}
+}
+else{
+	r4 = 0;
+}
+_18: do {
+	if(r3 <1) //_LBB686_17
+{
+	r8 = heap32[(r1+122)];
+}
+else{
+	r7 = 0;
+_21: while(true){
+	r8 = heap32[(r1+122)];
+	r9 = r7 << 2;
+	r10 = (r8 + r9)|0;
+	r10 = r10 >> 2;
+	r9 = (r4 + r9)|0;
+	r10 = heap32[(r10)];
+	r7 = (r7 + 1)|0;
+	r9 = r9 >> 2;
+	heap32[(r9)] = r10;
+if(!(r3 !=r7)) //_LBB686_18
+{
+break _18;
+}
+}
+}
+} while(0);
+	if(r8 !=0) //_LBB686_21
+{
+	r7 = heapU8[r0+492];
+	if(r7 !=0) //_LBB686_23
+{
+	r3 = gNumAlignedFree;
+	r3 = r3 >> 2;
+	r7 = heap32[(r3)];
+	r7 = (r7 + 1)|0;
+	r8 = r8 >> 2;
+	heap32[(r3)] = r7;
+	r3 = heap32[(r8+-1)];
+	heap32[(g0)] = r3;
+	free(i7);
+	r3 = heap32[(r1+120)];
+}
+	heap32[(r1+122)] = 0;
+}
+	heap8[r0+492] = r5;
+	heap32[(r1+122)] = r4;
+	heap32[(r1+121)] = r6;
+}
+}
+	r0 = r3 << 2;
+	r3 = heap32[(r1+122)];
+	r0 = (r3 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r1+120)];
+	r0 = (r0 + 1)|0;
+	heap32[(r1+120)] = r0;
+}
+	heap32[(r1+63)] = 1;
+	return;
+}
+
+function _ZN11btRigidBody19integrateVelocitiesEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+	var f9;
+	var f10;
+	var f11;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+204];
+	r1 = r1 & 3;
+if(!(r1 !=0)) //_LBB687_3
+{
+	f0 = heapFloat[(fp+1)];
+	r0 = r0 >> 2;
+	f1 = heapFloat[(r0+84)];
+	f1 = f1*f0;
+	f2 = heapFloat[(r0+101)];
+	f3 = heapFloat[(r0+103)];
+	f4 = heapFloat[(r0+102)];
+	f5 = heapFloat[(r0+76)];
+	f2 = f2*f1;
+	f2 = f5+f2;
+	heapFloat[(r0+76)] = f2;
+	f2 = f4*f1;
+	f4 = heapFloat[(r0+77)];
+	f2 = f4+f2;
+	heapFloat[(r0+77)] = f2;
+	f1 = f3*f1;
+	f2 = heapFloat[(r0+78)];
+	f1 = f2+f1;
+	heapFloat[(r0+78)] = f1;
+	f1 = heapFloat[(r0+105)];
+	f2 = heapFloat[(r0+64)];
+	f3 = heapFloat[(r0+106)];
+	f4 = heapFloat[(r0+65)];
+	f2 = f2*f1;
+	f4 = f4*f3;
+	f5 = heapFloat[(r0+107)];
+	f6 = heapFloat[(r0+66)];
+	f2 = f2+f4;
+	f4 = f6*f5;
+	f2 = f2+f4;
+	f4 = heapFloat[(r0+68)];
+	f6 = heapFloat[(r0+69)];
+	f7 = heapFloat[(r0+72)];
+	f8 = heapFloat[(r0+73)];
+	f9 = heapFloat[(r0+74)];
+	f10 = heapFloat[(r0+70)];
+	f11 = heapFloat[(r0+80)];
+	f2 = f2*f0;
+	f4 = f4*f1;
+	f6 = f6*f3;
+	f2 = f11+f2;
+	f4 = f4+f6;
+	f6 = f10*f5;
+	f4 = f4+f6;
+	heapFloat[(r0+80)] = f2;
+	f1 = f7*f1;
+	f3 = f8*f3;
+	f4 = f4*f0;
+	f6 = heapFloat[(r0+81)];
+	f4 = f6+f4;
+	f1 = f1+f3;
+	f3 = f9*f5;
+	f1 = f1+f3;
+	heapFloat[(r0+81)] = f4;
+	f1 = f1*f0;
+	f3 = heapFloat[(r0+82)];
+	f1 = f3+f1;
+	f2 = f2*f2;
+	f3 = f4*f4;
+	heapFloat[(r0+82)] = f1;
+	f2 = f2+f3;
+	f1 = f1*f1;
+	f1 = f2+f1;
+	heapFloat[(g0)] = f1;
+	sqrtf(i7);
+	f1 = f_g0;
+	f2 = f1*f0;
+	f3 =        1.5707963705062866;
+if(!(f2 <=f3)) //_LBB687_3
+{
+	f0 = f3/f0;
+	f0 = f0/f1;
+	f1 = heapFloat[(r0+80)];
+	f1 = f1*f0;
+	heapFloat[(r0+80)] = f1;
+	f1 = heapFloat[(r0+81)];
+	f1 = f1*f0;
+	heapFloat[(r0+81)] = f1;
+	f1 = heapFloat[(r0+82)];
+	f0 = f1*f0;
+	heapFloat[(r0+82)] = f0;
+}
+}
+	return;
+}
+
+function _ZN11btRigidBody12applyDampingEf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+	var f4;
+	var f5;
+	var f6;
+	var f7;
+	var f8;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	f0 = heapFloat[(r1+109)];
+	f1 =                         1;
+	f2 = heapFloat[(fp+1)];
+	f0 = f1-f0;
+	heapFloat[(g0)] = f0;
+	heapFloat[(g0+1)] = f2;
+	powf(i7);
+	f3 = heapFloat[(r1+76)];
+	f3 = f3*f_g0;
+	heapFloat[(r1+76)] = f3;
+	f3 = heapFloat[(r1+77)];
+	f3 = f3*f_g0;
+	heapFloat[(r1+77)] = f3;
+	f3 = heapFloat[(r1+78)];
+	f0 = f3*f_g0;
+	heapFloat[(r1+78)] = f0;
+	f0 = heapFloat[(r1+110)];
+	f0 = f1-f0;
+	heapFloat[(g0)] = f0;
+	heapFloat[(g0+1)] = f2;
+	powf(i7);
+	f2 = heapFloat[(r1+80)];
+	f2 = f2*f_g0;
+	heapFloat[(r1+80)] = f2;
+	f3 = heapFloat[(r1+81)];
+	f3 = f3*f_g0;
+	heapFloat[(r1+81)] = f3;
+	f4 = heapFloat[(r1+82)];
+	f0 = f4*f_g0;
+	heapFloat[(r1+82)] = f0;
+	r0 = heapU8[r0+444];
+if(!(r0 ==0)) //_LBB688_14
+{
+	f4 = f2*f2;
+	f5 = f3*f3;
+	f6 = heapFloat[(r1+76)];
+	f4 = f4+f5;
+	f5 = f0*f0;
+	f4 = f4+f5;
+	f5 = heapFloat[(r1+114)];
+	if(f4 <f5) //_LBB688_3
+{
+	f4 = heapFloat[(r1+77)];
+	f5 = heapFloat[(r1+78)];
+	f7 = f6*f6;
+	f8 = f4*f4;
+	f7 = f7+f8;
+	f8 = f5*f5;
+	f7 = f7+f8;
+	f8 = heapFloat[(r1+113)];
+	if(f7 <f8) //_LBB688_5
+{
+	f7 = heapFloat[(r1+112)];
+	f2 = f2*f7;
+	f3 = f3*f7;
+	heapFloat[(r1+80)] = f2;
+	f0 = f0*f7;
+	heapFloat[(r1+81)] = f3;
+	f6 = f6*f7;
+	heapFloat[(r1+82)] = f0;
+	f4 = f4*f7;
+	heapFloat[(r1+76)] = f6;
+	f5 = f5*f7;
+	heapFloat[(r1+77)] = f4;
+	heapFloat[(r1+78)] = f5;
+}
+}
+else{
+	f4 = heapFloat[(r1+77)];
+	f5 = heapFloat[(r1+78)];
+}
+	f0 = f6*f6;
+	f2 = f4*f4;
+	f0 = f0+f2;
+	f2 = f5*f5;
+	f0 = f0+f2;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f2 = heapFloat[(r1+109)];
+if(!(f2 <=f0)) //_LBB688_10
+{
+	f2 =      0.004999999888241291;
+	if(f0 <=f2) //_LBB688_9
+{
+	heap32[(r1+76)] = 0;
+	heap32[(r1+77)] = 0;
+	heap32[(r1+78)] = 0;
+	heap32[(r1+79)] = 0;
+}
+else{
+	f0 = heapFloat[(r1+76)];
+	f3 = heapFloat[(r1+77)];
+	f4 = heapFloat[(r1+78)];
+	f0 = f0*f0;
+	f3 = f3*f3;
+	f0 = f0+f3;
+	f3 = f4*f4;
+	f0 = f0+f3;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f1/f_g0;
+	f3 = heapFloat[(r1+76)];
+	f4 = heapFloat[(r1+77)];
+	f5 = f3*f0;
+	f6 = heapFloat[(r1+78)];
+	f7 = f4*f0;
+	f5 = f5*f2;
+	f0 = f6*f0;
+	f7 = f7*f2;
+	f3 = f3-f5;
+	f0 = f0*f2;
+	f2 = f4-f7;
+	heapFloat[(r1+76)] = f3;
+	f0 = f6-f0;
+	heapFloat[(r1+77)] = f2;
+	heapFloat[(r1+78)] = f0;
+}
+}
+	f0 = heapFloat[(r1+80)];
+	f2 = heapFloat[(r1+81)];
+	f3 = heapFloat[(r1+82)];
+	f0 = f0*f0;
+	f2 = f2*f2;
+	f0 = f0+f2;
+	f2 = f3*f3;
+	f0 = f0+f2;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f_g0;
+	f2 = heapFloat[(r1+110)];
+if(!(f2 <=f0)) //_LBB688_14
+{
+	f2 =      0.004999999888241291;
+	if(f0 <=f2) //_LBB688_13
+{
+	heap32[(r1+80)] = 0;
+	heap32[(r1+81)] = 0;
+	heap32[(r1+82)] = 0;
+	heap32[(r1+83)] = 0;
+}
+else{
+	f0 = heapFloat[(r1+80)];
+	f3 = heapFloat[(r1+81)];
+	f4 = heapFloat[(r1+82)];
+	f0 = f0*f0;
+	f3 = f3*f3;
+	f0 = f0+f3;
+	f3 = f4*f4;
+	f0 = f0+f3;
+	heapFloat[(g0)] = f0;
+	sqrtf(i7);
+	f0 = f1/f_g0;
+	f1 = heapFloat[(r1+80)];
+	f3 = heapFloat[(r1+81)];
+	f4 = f1*f0;
+	f5 = heapFloat[(r1+82)];
+	f6 = f3*f0;
+	f4 = f4*f2;
+	f0 = f5*f0;
+	f6 = f6*f2;
+	f1 = f1-f4;
+	f0 = f0*f2;
+	f2 = f3-f6;
+	heapFloat[(r1+80)] = f1;
+	f0 = f5-f0;
+	heapFloat[(r1+81)] = f2;
+	heapFloat[(r1+82)] = f0;
+	return;
+}
+}
+}
+	return;
+}
+
+function _GLOBAL__I__ZN7btClockC2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZL13gProfileClock_2E_0;
+	heap32[(g0)] = 8;
+	r0 = r0 >> 2;
+	_Znwj(i7);
+	heap32[(r0)] = r_g0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = 0;
+	r0 = _ZN15CProfileManager4RootE;
+	r1 = r0 >> 2;
+	r2 = _2E_str729;
+	gettimeofday(i7);
+	heap32[(r1)] = r2;
+	heap32[(r1+1)] = 0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+5)] = 0;
+	heap32[(r1+6)] = 0;
+	heap32[(r1+7)] = 0;
+	heap32[(g0)] = r0;
+	_ZN12CProfileNode5ResetEv(i7);
+	return;
+}
+
+function _GLOBAL__D__ZN7btClockC2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZN15CProfileManager4RootE;
+	r1 = _ZL13gProfileClock_2E_0;
+	heap32[(g0)] = r0;
+	r0 = r1 >> 2;
+	_ZN12CProfileNodeD1Ev(i7);
+	r0 = heap32[(r0)];
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN12CProfileNode5ResetEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+_1: while(true){
+	r0 = r0 >> 2;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	r1 = heap32[(r0+6)];
+if(!(r1 ==0)) //_LBB691_3
+{
+	heap32[(g0)] = r1;
+	_ZN12CProfileNode5ResetEv(i7);
+}
+	r0 = heap32[(r0+7)];
+	if(r0 !=0) //_LBB691_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	return;
+}
+
+function _ZN12CProfileNodeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+6)];
+if(!(r1 ==0)) //_LBB692_2
+{
+	heap32[(g0)] = r1;
+	_ZN12CProfileNodeD1Ev(i7);
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+}
+	r0 = heap32[(r0+7)];
+if(!(r0 ==0)) //_LBB692_4
+{
+	heap32[(g0)] = r0;
+	_ZN12CProfileNodeD1Ev(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+}
+	return;
+}
+
+function _ZN15CProfileManager13Start_ProfileEPKc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _ZN15CProfileManager11CurrentNodeE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp)];
+	r3 = r1 >> 2;
+	r4 = heap32[(r3)];
+	if(r4 !=r2) //_LBB693_2
+{
+	r4 = (r1 + 24)|0;
+_3: while(true){
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r4 !=0) //_LBB693_3
+{
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	if(r5 !=r2) //_LBB693_5
+{
+	r4 = (r4 + 28)|0;
+}
+else{
+__label__ = 3;
+break _3;
+}
+}
+else{
+__label__ = 6;
+break _3;
+}
+}
+switch(__label__ ){//multiple entries
+case 6:
+	heap32[(g0)] = 32;
+	_Znwj(i7);
+	r4 = r_g0;
+	r5 = r4 >> 2;
+	heap32[(r5)] = r2;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	heap32[(r5+4)] = 0;
+	heap32[(r5+5)] = r1;
+	heap32[(r5+6)] = 0;
+	heap32[(r5+7)] = 0;
+	heap32[(g0)] = r4;
+	_ZN12CProfileNode5ResetEv(i7);
+	r1 = heap32[(r3+6)];
+	heap32[(r5+7)] = r1;
+	heap32[(r3+6)] = r4;
+	r1 = r4;
+break;
+case 3:
+	r1 = r4;
+break;
+}
+	heap32[(r0)] = r1;
+}
+	r0 = r1 >> 2;
+	r1 = heap32[(r0+1)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0+1)] = r1;
+	r1 = heap32[(r0+4)];
+	r2 = (r1 + 1)|0;
+	heap32[(r0+4)] = r2;
+if(!(r1 !=0)) //_LBB693_11
+{
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	r2 = _ZL13gProfileClock_2E_0;
+	gettimeofday(i7);
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r1 = r1 >> 2;
+	r3 = heap32[(fp+-2)];
+	r4 = heap32[(r2)];
+	r3 = (r3 - r4)|0;
+	r1 = heap32[(r1+1)];
+	r2 = heap32[(r2+1)];
+	r1 = (r1 - r2)|0;
+	r2 = (r3 * 1000000)|0;
+	r1 = (r1 + r2)|0;
+	heap32[(r0+3)] = r1;
+}
+	return;
+}
+
+function _ZN15CProfileManager5ResetEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = _ZL13gProfileClock_2E_0;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	r1 = _ZN15CProfileManager4RootE;
+	heap32[(g0)] = r1;
+	r1 = r1 >> 2;
+	_ZN12CProfileNode5ResetEv(i7);
+	r2 = heap32[(r1+1)];
+	r2 = (r2 + 1)|0;
+	heap32[(r1+1)] = r2;
+	r2 = heap32[(r1+4)];
+	r3 = (r2 + 1)|0;
+	heap32[(r1+4)] = r3;
+if(!(r2 !=0)) //_LBB694_2
+{
+	r2 = sp + -16;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r2 = r2 >> 2;
+	r3 = heap32[(fp+-4)];
+	r4 = heap32[(r0)];
+	r3 = (r3 - r4)|0;
+	r2 = heap32[(r2+1)];
+	r0 = heap32[(r0+1)];
+	r0 = (r2 - r0)|0;
+	r2 = (r3 * 1000000)|0;
+	r0 = (r0 + r2)|0;
+	heap32[(r1+3)] = r0;
+}
+	r0 = _ZN15CProfileManager12FrameCounterE;
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	return;
+}
+
+function _GLOBAL__I__ZN4__rw9__catfindEPNS_8__rw_catE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZN4__rwL12__rw_catlistE_2E_0;
+	r1 = _ZN4__rwL12__rw_catlistE_2E_1;
+	r0 = r0 >> 2;
+	r2 = _ZN4__rwL12__rw_catlistE_2E_2;
+	r1 = r1 >> 2;
+	heap32[(r0)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r1)] = 0;
+	heap32[(r2)] = 0;
+	heap32[(g0)] = 136;
+	_Znwj(i7);
+	r3 = r_g0;
+if(!(r3 !=0)) //_LBB695_3
+{
+	heap32[(g0)] = 3;
+	_ZN4__rw10__rw_throwEiz(i7);
+}
+	r4 = (r3 + 136)|0;
+	heap32[(g0)] = 0;
+	_ZdlPv(i7);
+	r5 = heap32[(r0)];
+	if(r5 ==0) //_LBB695_6
+{
+	r8 = r3;
+}
+else{
+	r6 = r5;
+	r7 = r3;
+_9: while(true){
+	r9 = r6 >> 2;
+	r6 = (r6 + 4)|0;
+	r8 = (r7 + 4)|0;
+	r7 = r7 >> 2;
+	r9 = heap32[(r9)];
+	heap32[(r7)] = r9;
+	r7 = r8;
+	if(r6 !=0) //_LBB695_7
+{
+continue _9;
+}
+else{
+break _9;
+}
+}
+}
+	r6 = 0;
+_12: while(true){
+	r7 = r6 << 2;
+	r7 = (r8 + r7)|0;
+	r6 = (r6 + 1)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = 0;
+	if(r6 !=2) //_LBB695_9
+{
+continue _12;
+}
+else{
+break _12;
+}
+}
+	r6 = heap32[(r1)];
+	if(r6 ==0) //_LBB695_12
+{
+	r6 = (r8 + 8)|0;
+	heap32[(r0)] = r3;
+	heap32[(r1)] = r6;
+	heap32[(r2)] = r4;
+	heap32[(g0)] = r5;
+	_ZdlPv(i7);
+	return;
+}
+else{
+	abort(i7);
+}
+}
+
+function _GLOBAL__D__ZN4__rw9__catfindEPNS_8__rw_catE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZN4__rwL12__rw_catlistE_2E_0;
+	r1 = _ZN4__rwL12__rw_catlistE_2E_1;
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0)];
+	r2 = heap32[(r1)];
+	r3 = (r2 - r0)|0;
+	r3 = r3 >> 2;
+if(!(r3 ==0)) //_LBB696_2
+{
+	r3 = r3 << 2;
+	r2 = (r2 - r3)|0;
+	heap32[(r1)] = r2;
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN4__rwL13__rw_vfmtwhatEPcjPKcS0_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = _ZN4__rwL16__rw_what_refcntE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r4 = (r1 + 1)|0;
+	heap32[(r0)] = r4;
+	if(r1 !=0) //_LBB697_2
+{
+	heap32[(g0)] = 256;
+	_Znaj(i7);
+	r1 = r_g0;
+	r4 = heap32[(r0)];
+	r4 = (r4 + -1)|0;
+	heap32[(r0)] = r4;
+}
+else{
+	r1 = _ZN4__rwL13__rw_what_bufE;
+}
+	r4 = 256;
+	r12 = swrite__index__;
+_5: while(true){
+	r5 = sp + -16;
+	heap32[(fp+-8)] = r3;
+	r6 = r5 >> 2;
+	heap32[(fp+-7)] = r3;
+	r7 = (r4 + -1)|0;
+	r8 = 0;
+	heap32[(r6+1)] = 0;
+	r9 = sp + -24;
+	r10 = r4 == 0 ? r8 : r7;
+	heap32[(fp+-4)] = r1;
+	r11 = r9 >> 2;
+	heap32[(r6+2)] = r10;
+	heap32[(r11+1)] = r12;
+	heap32[(fp+-6)] = r5;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	__v_printf(i7);
+	r5 = r_g0;
+_7: do {
+if(!(r1 ==0)) //_LBB697_11
+{
+if(!(r4 ==0)) //_LBB697_11
+{
+if(!(r5 <0)) //_LBB697_11
+{
+if(!(r4 ==-1)) //_LBB697_10
+{
+if(!(uint(r5) <uint(r4))) //_LBB697_10
+{
+	heap8[r1+r7] = r8;
+break _7;
+}
+}
+	heap8[r1+r5] = r8;
+}
+}
+}
+} while(0);
+	r5 = r5 < 0 ? r8 : r5;
+	r5 = r7 > r5 ? r5 : r8;
+	if(r5 !=0) //_LBB697_13
+{
+	if(r4 >r5) //_LBB697_20
+{
+break _5;
+}
+else{
+	r4 = (r5 + 1)|0;
+}
+}
+else{
+	r4 = r4 << 1;
+}
+	r5 = _ZN4__rwL13__rw_what_bufE;
+	if(r1 !=r5) //_LBB697_17
+{
+if(!(r1 ==0)) //_LBB697_19
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+}
+else{
+	r1 = heap32[(r0)];
+	r1 = (r1 + -1)|0;
+	heap32[(r0)] = r1;
+}
+	heap32[(g0)] = r4;
+	_Znaj(i7);
+	r1 = r_g0;
+continue _5;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN4__rw10__rw_throwEiz(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -64;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	if(r0 >4) //_LBB698_9
+{
+	r1 = (sp + 4)|0;
+	heap32[(fp+-7)] = r1;
+	r2 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E7__fname;
+	heap32[(fp+-9)] = r1;
+	r2 = r2 >> 2;
+	heap32[(fp+-8)] = r1;
+	r3 = heap32[(r2)];
+if(!(r3 !=0)) //_LBB698_41
+{
+	r3 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E6buffer;
+	r4 = 0;
+_5: while(true){
+	r5 = heapU8[r3];
+	r4 = r5 == 58 ? r3 : r4;
+	if(r5 !=0) //_LBB698_13
+{
+	r5 = (r3 + 1)|0;
+	r6 = heapU8[r3+1];
+	r4 = r6 == 58 ? r5 : r4;
+	if(r6 !=0) //_LBB698_15
+{
+	r5 = (r3 + 2)|0;
+	r6 = heapU8[r3+2];
+	r4 = r6 == 58 ? r5 : r4;
+	if(r6 !=0) //_LBB698_17
+{
+	r5 = (r3 + 3)|0;
+	r6 = heapU8[r3+3];
+	r4 = r6 == 58 ? r5 : r4;
+	if(r6 !=0) //_LBB698_19
+{
+	r3 = (r3 + 4)|0;
+}
+else{
+break _5;
+}
+}
+else{
+break _5;
+}
+}
+else{
+break _5;
+}
+}
+else{
+break _5;
+}
+}
+_12: do {
+if(!(r4 ==0)) //_LBB698_24
+{
+	r3 = 0;
+	heap8[r4] = r3;
+	r3 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E8__catset;
+	r4 = (r4 + 1)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	sscanf(i7);
+	r4 = r_g0;
+	r3 = r3 >> 2;
+if(!(r4 !=1)) //_LBB698_23
+{
+	r4 = heap32[(r3)];
+	if(r4 >0) //_LBB698_24
+{
+break _12;
+}
+}
+	heap32[(r3)] = 1;
+}
+} while(0);
+	r3 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E4msgs;
+	r4 = r3 >> 2;
+	heap32[(r4+1)] = 0;
+	heap32[(r4+2)] = 0;
+	heap32[(r4+3)] = 0;
+	heap32[(r4+4)] = 0;
+	heap32[(r4+5)] = 0;
+	r5 = _ZTVSt8messagesIcE;
+	heap32[(r4+6)] = 0;
+	r5 = (r5 + 8)|0;
+	heap32[(r4+7)] = 0;
+	r6 = _ZN4__rwL22__rw_classic_once_initE_2E_0_2E_b;
+	heap32[(r4)] = r5;
+	r5 = heapU8[r6];
+if(!(r5 != 0)) //_LBB698_29
+{
+	_ZN4__rw11__rw_locale11_C_get_bodyEPS0_S1_PKciPKNS_10__rw_facetE(i7);
+	r5 = r_g0;
+	r7 = _ZN4__rwL12__rw_classicE;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r5;
+if(!(r5 !=0)) //_LBB698_28
+{
+	r5 = _2E_str12102177;
+	r7 = _2E_str10100175;
+	r8 = _2E_str538;
+	heap32[(g0)] = 19;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r8;
+	_ZN4__rw10__rw_throwEiz(i7);
+}
+	r5 = 1;
+	heap8[r6] = r5;
+}
+	r5 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E6buffer;
+	r6 = heapU8[r5];
+	if(r6 ==0) //_LBB698_31
+{
+	r6 = _ZNSs11_C_null_refE;
+	r7 = 0;
+	r6 = (r6 + 12)|0;
+}
+else{
+	r6 = 0;
+_28: while(true){
+	r7 = (r5 - r6)|0;
+	r6 = (r6 + -1)|0;
+	r7 = heapU8[r7+1];
+if(!(r7 !=0)) //_LBB698_32
+{
+break _28;
+}
+}
+	r7 = 0;
+	r7 = (r7 - r6)|0;
+	if(r6 !=0) //_LBB698_35
+{
+	r6 = 32;
+	r6 = uint(r7) > uint(r6) ? r7 : r6;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r7;
+	_ZNSs10_C_get_repEjj(i7);
+	r6 = (r_g0 + 12)|0;
+}
+else{
+	r6 = _ZNSs11_C_null_refE;
+	r6 = (r6 + 12)|0;
+}
+}
+	heap32[(fp+-4)] = r6;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r7;
+	memcpy(i7);
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+2)];
+	r6 = sp + -16;
+	r7 = _ZN4__rwL12__rw_classicE;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r3 = r_g0;
+	r4 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E5__cat;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r3;
+	r3 = heap32[(fp+-4)];
+	r3 = (r3 + -12)|0;
+	r4 = _ZNSs11_C_null_refE;
+if(!(r3 ==r4)) //_LBB698_40
+{
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r6 = (r4 + -1)|0;
+	heap32[(r3)] = r6;
+if(!(r4 >0)) //_LBB698_40
+{
+	r3 = heap32[(fp+-4)];
+	r3 = (r3 + -12)|0;
+	heap32[(g0)] = r3;
+	_ZdlPv(i7);
+}
+}
+	heap32[(fp+-4)] = 0;
+	heap32[(r2)] = r5;
+}
+	r2 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E5__cat;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	if(r2 !=-1) //_LBB698_43
+{
+	r3 = _ZNSs11_C_null_refE;
+	r4 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E4msgs;
+	r5 = (r3 + 12)|0;
+	r6 = r4 >> 2;
+	heap32[(fp+-2)] = r5;
+	r5 = _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E8__catset;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r5 = r5 >> 2;
+	r6 = heap32[(r6+3)];
+	r5 = heap32[(r5)];
+	r7 = sp + -24;
+	r8 = sp + -8;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r0;
+	heap32[(g0+5)] = r8;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r2 = heap32[(fp+-2)];
+	r2 = (r2 + -12)|0;
+if(!(r2 ==r3)) //_LBB698_47
+{
+	r2 = r2 >> 2;
+	r4 = heap32[(r2)];
+	r5 = (r4 + -1)|0;
+	heap32[(r2)] = r5;
+if(!(r4 >0)) //_LBB698_47
+{
+	r2 = heap32[(fp+-2)];
+	r2 = (r2 + -12)|0;
+	heap32[(g0)] = r2;
+	_ZdlPv(i7);
+}
+}
+	heap32[(fp+-2)] = 0;
+	r2 = heap32[(fp+-6)];
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+-1)];
+	if(r4 !=0) //_LBB698_49
+{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r1;
+	_ZN4__rwL13__rw_vfmtwhatEPcjPKcS0_(i7);
+	r1 = r_g0;
+	r2 = heap32[(fp+-6)];
+}
+else{
+	r1 = 0;
+}
+	r2 = (r2 + -12)|0;
+if(!(r2 ==r3)) //_LBB698_54
+{
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r4 = (r3 + -1)|0;
+	heap32[(r2)] = r4;
+if(!(r3 >0)) //_LBB698_54
+{
+	r2 = heap32[(fp+-6)];
+	r2 = (r2 + -12)|0;
+	heap32[(g0)] = r2;
+	_ZdlPv(i7);
+}
+}
+	heap32[(fp+-6)] = 0;
+	if(r1 ==0) //_LBB698_56
+{
+__label__ = 50;
+}
+else{
+__label__ = 51;
+}
+}
+else{
+__label__ = 50;
+}
+if (__label__ == 50){
+	r1 = 24;
+	r2 = 0;
+	r0 = uint(r0) > uint(r1) ? r2 : r0;
+	r1 = _ZZN4__rw10__rw_throwEizE6errors;
+	r2 = r0 << 2;
+	r1 = (r1 + r2)|0;
+	r1 = r1 >> 2;
+	r2 = heap32[(fp+-7)];
+	r1 = heap32[(r1)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	_ZN4__rwL13__rw_vfmtwhatEPcjPKcS0_(i7);
+	r1 = r_g0;
+	if(r1 ==0) //_LBB698_60
+{
+	if(r0 ==2) //_LBB698_65
+{
+	r0 = _2E_str47;
+}
+else{
+	if(r0 ==1) //_LBB698_64
+{
+	r0 = _2E_str15132;
+}
+else{
+	if(r0 !=0) //_LBB698_66
+{
+	r0 = _2E_str5134;
+}
+else{
+	r0 = _2E_str4131;
+}
+}
+}
+	heap32[(g0)] = r0;
+	fprintf(i7);
+__label__ = 62;
+}
+else{
+__label__ = 51;
+}
+}
+if (__label__ == 51){
+	heap32[(g0)] = r1;
+	r0 = _ZN4__rwL13__rw_what_bufE;
+	fprintf(i7);
+	if(r1 !=r0) //_LBB698_59
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+else{
+	r0 = _ZN4__rwL16__rw_what_refcntE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r1 = (r1 + -1)|0;
+	heap32[(r0)] = r1;
+}
+}
+	abort(i7);
+}
+else{
+	if(r0 ==2) //_LBB698_6
+{
+	r0 = _2E_str47;
+}
+else{
+	if(r0 ==1) //_LBB698_5
+{
+	r0 = _2E_str15132;
+}
+else{
+	if(r0 !=0) //_LBB698_7
+{
+	r0 = _2E_str5134;
+}
+else{
+	r0 = _2E_str4131;
+}
+}
+}
+	heap32[(g0)] = r0;
+	fprintf(i7);
+	abort(i7);
+}
+}
+
+function _ZN4__rw10__rw_facetD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN4__rw10__rw_facetE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	heap32[(r0+5)] = -1;
+	r1 = heap32[(r0+1)];
+	r2 = heap32[(r0+2)];
+if(!(r1 ==r2)) //_LBB699_3
+{
+if(!(r1 ==0)) //_LBB699_3
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+}
+	r1 = _ZZN4__rw10__rw_facetD4EvE9destroyed;
+	heap32[(r0+1)] = r1;
+	r1 = heap32[(r0+4)];
+if(!(r1 !=-1)) //_LBB699_5
+{
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+}
+	return;
+}
+
+function _ZN4__rw10__rw_facetD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN4__rw10__rw_facetE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(r2+5)] = -1;
+	r1 = heap32[(r2+1)];
+	r3 = heap32[(r2+2)];
+if(!(r1 ==r3)) //_LBB700_3
+{
+if(!(r1 ==0)) //_LBB700_3
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+}
+	r1 = _ZZN4__rw10__rw_facetD4EvE9destroyed;
+	heap32[(r2+1)] = r1;
+	r1 = heap32[(r2+4)];
+if(!(r1 !=-1)) //_LBB700_5
+{
+	r1 = heap32[(r2+3)];
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_E(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE12n_std_facets;
+	r1 = _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE10std_facets;
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(fp)];
+	r3 = heap32[(r0)];
+	r4 = heap32[(r1)];
+_1: do {
+	if(r2 ==0) //_LBB701_24
+{
+	r5 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r6 = heap32[(fp+3)];
+	r7 = _2E_str538;
+	r8 = r2 == 0 ? r7 : r2;
+	r9 = r3;
+_3: while(true){
+	r10 = r9;
+	if(r10 ==0) //_LBB701_34
+{
+__label__ = 34;
+break _3;
+}
+else{
+	r9 = r10 << 1;
+	r11 = r9 & -4;
+	r12 = (r4 + r11)|0;
+	r9 = r12 >> 2;
+	r13 = heap32[(r9)];
+	r14 = r13 >> 2;
+	r15 = heap32[(r14+5)];
+	r9 = r10 >>> 1;
+	if(r15 !=r5) //_LBB701_27
+{
+	r15 = (r15 - r5)|0;
+}
+else{
+	r15 = heap32[(r14+1)];
+	r15 = r15 == 0 ? r7 : r15;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r15;
+	strcmp(i7);
+	r15 = r_g0;
+}
+	if(r15 <0) //_LBB701_31
+{
+__label__ = 31;
+}
+else{
+	if(r15 <1) //_LBB701_32
+{
+__label__ = 32;
+break _3;
+}
+else{
+	r4 = (r11 + r4)|0;
+	r10 = (r10 + -1)|0;
+	r4 = (r4 + 4)|0;
+	r9 = (r10 - r9)|0;
+}
+}
+}
+}
+if (__label__ == 32){
+if(!(r12 ==0)) //_LBB701_34
+{
+	r2 = heap32[(r14+6)];
+	r2 = (r2 + 1)|0;
+	heap32[(r14+6)] = r2;
+	r_g0 = r13;
+	return;
+}
+}
+	r4 = _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE17std_facet_bufsize;
+	r4 = r4 >> 2;
+	r7 = heap32[(r4)];
+if(!(r3 !=r7)) //_LBB701_39
+{
+	r3 = r3 << 3;
+	heap32[(g0)] = r3;
+	_Znaj(i7);
+	r3 = r_g0;
+	r7 = heap32[(r1)];
+	r8 = heap32[(r0)];
+	r8 = r8 << 2;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	memcpy(i7);
+	r8 = _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE13std_facet_buf;
+if(!(r7 ==r8)) //_LBB701_38
+{
+if(!(r7 ==0)) //_LBB701_38
+{
+	heap32[(g0)] = r7;
+	_ZdaPv(i7);
+}
+}
+	heap32[(r1)] = r3;
+	r3 = heap32[(r4)];
+	r3 = r3 << 1;
+	heap32[(r4)] = r3;
+}
+	r3 = r5 & 1;
+	r4 = 0;
+	r2 = r3 == 0 ? r2 : r4;
+	heap32[(g0)] = 1;
+	heap32[(g0+1)] = r2;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r2 = r_g0;
+	r3 = (r5 + 1)|0;
+	r4 = r3 >>> 31;
+	r6 = r2 >> 2;
+	r3 = (r3 + r4)|0;
+	r4 = heap32[(r6+7)];
+	r4 = r4 >> 2;
+	r3 = r3 >> 1;
+	heap32[(r4)] = r3;
+	r3 = heap32[(r6+5)];
+if(!(r3 ==r5)) //_LBB701_41
+{
+	r3 = r2 >> 2;
+	heap32[(r3+5)] = r5;
+}
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+6)];
+if(!(r4 ==1)) //_LBB701_43
+{
+	heap32[(r3+6)] = 1;
+}
+	r3 = heap32[(r0)];
+	r1 = heap32[(r1)];
+	r4 = r3 << 2;
+	r4 = (r1 + r4)|0;
+	r4 = r4 >> 2;
+	r5 = (r3 + 1)|0;
+	heap32[(r4)] = r2;
+	heap32[(r0)] = r5;
+	r0 = (r3 + -1)|0;
+	if(uint(r0) <uint(2147483645)) //_LBB701_45
+{
+	r0 = cmpfacets__index__;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r0;
+	quicksort(i7);
+}
+}
+else{
+	r5 = r3;
+	r6 = r4;
+_31: while(true){
+	r7 = r5;
+	if(r7 ==0) //_LBB701_23
+{
+__label__ = 23;
+break _31;
+}
+else{
+	r5 = r7 << 1;
+	r8 = r5 & -4;
+	r9 = (r6 + r8)|0;
+	r5 = r9 >> 2;
+	r5 = heap32[(r5)];
+	r10 = r2 >> 2;
+	r11 = r5 >> 2;
+	r12 = heap32[(r10+5)];
+	r13 = heap32[(r11+5)];
+	r5 = r7 >>> 1;
+	if(r12 !=r13) //_LBB701_4
+{
+	r12 = (r13 - r12)|0;
+}
+else{
+	r12 = heap32[(r11+1)];
+	r13 = heap32[(r10+1)];
+	r10 = _2E_str538;
+	r13 = r13 == 0 ? r10 : r13;
+	r12 = r12 == 0 ? r10 : r12;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r12;
+	strcmp(i7);
+	r12 = r_g0;
+}
+	if(r12 <0) //_LBB701_8
+{
+__label__ = 8;
+}
+else{
+	if(r12 <1) //_LBB701_9
+{
+__label__ = 9;
+break _31;
+}
+else{
+	r6 = (r8 + r6)|0;
+	r7 = (r7 + -1)|0;
+	r6 = (r6 + 4)|0;
+	r5 = (r7 - r5)|0;
+}
+}
+}
+}
+if (__label__ == 9){
+if(!(r9 ==0)) //_LBB701_23
+{
+	r2 = (r9 - r4)|0;
+	r5 = r2 & -4;
+	r6 = (r4 + r5)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r7 = r6 >> 2;
+	r8 = heap32[(r7+6)];
+	r8 = (r8 + -1)|0;
+	heap32[(r7+6)] = r8;
+	if(r8 ==0) //_LBB701_12
+{
+	r2 = r2 >> 2;
+	r8 = (r3 + -1)|0;
+	heap32[(r0)] = r8;
+	if(uint(r8) >uint(207)) //_LBB701_17
+{
+__label__ = 17;
+}
+else{
+	r0 = _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE13std_facet_buf;
+	if(r4 ==r0) //_LBB701_17
+{
+__label__ = 17;
+}
+else{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r5;
+	r3 = r2 << 2;
+	r5 = (r3 + r4)|0;
+	r2 = (r8 - r2)|0;
+	memcpy(i7);
+	r3 = (r0 + r3)|0;
+	r8 = (r5 + 4)|0;
+	r2 = r2 << 2;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+if(!(r4 ==0)) //_LBB701_16
+{
+	heap32[(g0)] = r4;
+	_ZdaPv(i7);
+}
+	heap32[(r1)] = r0;
+__label__ = 20;
+}
+}
+_51: do {
+if (__label__ == 17){
+	r0 = (r8 - r2)|0;
+	r0 = r0 << 2;
+if(!(r0 ==0)) //_LBB701_20
+{
+	r0 = r3 << 2;
+	r2 = r2 << 2;
+	r0 = (r0 + -4)|0;
+	r1 = (r2 + r4)|0;
+	r2 = (r0 - r2)|0;
+	r0 = (r1 + 4)|0;
+_54: while(true){
+	r1 = heapU8[r0];
+	r2 = (r2 + -1)|0;
+	r3 = (r0 + 1)|0;
+	heap8[r0+-4] = r1;
+	r0 = r3;
+if(!(r2 !=0)) //_LBB701_19
+{
+break _51;
+}
+}
+}
+}
+} while(0);
+	r2 = heap32[(r7+1)];
+if(!(r2 ==0)) //_LBB701_11
+{
+if(!(r6 ==0)) //_LBB701_11
+{
+	r2 = heap32[(r7)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r2 = 0;
+	r_g0 = r2;
+	return;
+}
+}
+}
+	r2 = 0;
+break _1;
+}
+}
+	r0 = r2 >> 2;
+	r1 = heap32[(r0+6)];
+	r1 = (r1 + -1)|0;
+	heap32[(r0+6)] = r1;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r_g0 = r2;
+	return;
+}
+
+function cmpfacets(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0)];
+	r1 = heap32[(r1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(r0+5)];
+	r3 = heap32[(r1+5)];
+	if(r2 !=r3) //_LBB702_2
+{
+	r0 = (r3 - r2)|0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r2 = heap32[(r1+1)];
+	r3 = heap32[(r0+1)];
+	r0 = _2E_str538;
+	r3 = r3 == 0 ? r0 : r3;
+	r2 = r2 == 0 ? r0 : r2;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	strcmp(i7);
+	return;
+}
+}
+
+function _ZN4__rwL16__rw_expand_nameERNS_14__rw_pod_arrayIcLj256EEEPKc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+var __label__ = 0;
+	i7 = sp + -640;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = 0;
+	r3 = r1;
+_1: while(true){
+	r4 = r2 << 2;
+	r5 = heapU8[r3];
+	if(r5 !=59) //_LBB703_3
+{
+	if(r5 !=0) //_LBB703_5
+{
+	r5 = heapU8[r3+1];
+	if(r5 ==59) //_LBB703_14
+{
+__label__ = 14;
+break _1;
+}
+else{
+	if(r5 ==0) //_LBB703_4
+{
+__label__ = 4;
+break _1;
+}
+else{
+	r5 = heapU8[r3+2];
+	if(r5 !=59) //_LBB703_9
+{
+	if(r5 ==0) //_LBB703_4
+{
+__label__ = 4;
+break _1;
+}
+else{
+	r5 = heapU8[r3+3];
+	if(r5 !=59) //_LBB703_12
+{
+	if(r5 ==0) //_LBB703_4
+{
+__label__ = 4;
+break _1;
+}
+else{
+	r2 = (r2 + 1)|0;
+	r3 = (r3 + 4)|0;
+continue _1;
+}
+}
+else{
+__label__ = 11;
+break _1;
+}
+}
+}
+else{
+__label__ = 8;
+break _1;
+}
+}
+}
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+else{
+__label__ = 2;
+break _1;
+}
+}
+switch(__label__ ){//multiple entries
+case 14:
+	r2 = (r3 + 1)|0;
+break;
+case 4:
+	r2 = 0;
+break;
+case 2:
+	r2 = (r1 + r4)|0;
+break;
+case 11:
+	r2 = r4 | 3;
+	r2 = (r1 + r2)|0;
+break;
+case 8:
+	r2 = r4 | 2;
+	r2 = (r1 + r2)|0;
+break;
+}
+_18: do {
+	if(r2 ==r1) //_LBB703_17
+{
+	r3 = (r1 + 1)|0;
+	r4 = (r1 + 3)|0;
+	r5 = 0;
+	r2 = r3;
+_20: while(true){
+	r6 = heapU8[r4+-2];
+	if(r6 ==59) //_LBB703_21
+{
+__label__ = 19;
+break _20;
+}
+else{
+	if(r6 !=0) //_LBB703_22
+{
+	r6 = heapU8[r4+-1];
+	if(r6 ==0) //_LBB703_20
+{
+__label__ = 90;
+break _18;
+}
+else{
+	r7 = r5 << 2;
+	if(r6 !=59) //_LBB703_25
+{
+	r6 = heapU8[r4];
+	if(r6 ==0) //_LBB703_20
+{
+__label__ = 90;
+break _18;
+}
+else{
+	if(r6 !=59) //_LBB703_28
+{
+	r6 = heapU8[r4+1];
+	if(r6 ==0) //_LBB703_20
+{
+__label__ = 90;
+break _18;
+}
+else{
+	if(r6 !=59) //_LBB703_31
+{
+	r5 = (r5 + 1)|0;
+	r4 = (r4 + 4)|0;
+	r2 = (r2 + 4)|0;
+}
+else{
+__label__ = 27;
+break _20;
+}
+}
+}
+else{
+__label__ = 32;
+break _18;
+}
+}
+}
+else{
+__label__ = 22;
+break _20;
+}
+}
+}
+else{
+__label__ = 90;
+break _18;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 19:
+	r1 = r3;
+__label__ = 29;
+break _18;
+break;
+case 27:
+	r2 = r7 | 3;
+	r1 = (r2 + r1)|0;
+	r4 = (r1 + 1)|0;
+__label__ = 32;
+break _18;
+break;
+case 22:
+	r2 = r7 | 1;
+	r1 = (r2 + r1)|0;
+	r4 = (r1 + 1)|0;
+__label__ = 32;
+break;
+}
+}
+else{
+__label__ = 29;
+}
+} while(0);
+if (__label__ == 29){
+	if(r2 ==0) //_LBB703_34
+{
+	r3 = r1;
+__label__ = 90;
+}
+else{
+	r4 = r2;
+	r3 = r1;
+__label__ = 32;
+}
+}
+_39: do {
+switch(__label__ ){//multiple entries
+case 90:
+	r7 = heapU8[r3];
+	if(r7 ==0) //_LBB703_98
+{
+	r0 = sp + -624;
+	r0 = r0 >> 2;
+	heap32[(r0+20)] = 0;
+	heap32[(r0+22)] = 0;
+	heap32[(r0+21)] = 0;
+__label__ = 73;
+break _39;
+}
+else{
+	r7 = 1;
+__label__ = 93;
+break _39;
+}
+break;
+case 32:
+	r1 = sp + -264;
+	r2 = sp + -528;
+	r5 = (r1 + 8)|0;
+	r6 = (r2 + 8)|0;
+	r7 = 1;
+	r8 = 0;
+_45: while(true){
+	if(r4 ==0) //_LBB703_39
+{
+	r4 = heapU8[r3];
+_49: do {
+	if(r4 !=0) //_LBB703_41
+{
+	r9 = (r3 + 1)|0;
+	r10 = 0;
+_51: while(true){
+	r4 = (r10 + 1)|0;
+	r11 = heapU8[r9+r10];
+	r10 = r4;
+if(!(r11 !=0)) //_LBB703_42
+{
+break _49;
+}
+}
+}
+else{
+	r4 = 0;
+}
+} while(0);
+	r4 = (r3 + r4)|0;
+}
+	r9 = (r4 - r3)|0;
+	heap32[(fp+-66)] = r9;
+	if(uint(r9) >uint(255)) //_LBB703_46
+{
+	r10 = (r9 + 1)|0;
+	heap32[(g0)] = r10;
+	_Znaj(i7);
+	r10 = r_g0;
+}
+else{
+	r10 = r5;
+}
+	r11 = r1 >> 2;
+	heap32[(r11+1)] = r10;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r9;
+	memcpy(i7);
+	r9 = heap32[(r11+1)];
+	r10 = heap32[(fp+-66)];
+	r12 = 0;
+	heap8[r9+r10] = r12;
+	r9 = r2 >> 2;
+	heap32[(fp+-132)] = 0;
+	heap32[(r9+1)] = r6;
+	heap8[sp+-520] = r12;
+	r10 = _ZN4__rw9__rw_catsE;
+	r13 = (r8 * 12)|0;
+	r10 = (r10 + r13)|0;
+	r13 = heap32[(r11+1)];
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r13;
+	heap32[(g0+2)] = r2;
+	_ZN4__rw16__rw_locale_nameEiPKcRNS_14__rw_pod_arrayIcLj256EEE(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB703_50
+{
+	r13 = heapU8[r10];
+_63: do {
+	if(r13 !=0) //_LBB703_52
+{
+	r14 = (r10 + 1)|0;
+_65: while(true){
+	r13 = (r12 + 1)|0;
+	r15 = heapU8[r14+r12];
+	r12 = r13;
+if(!(r15 !=0)) //_LBB703_53
+{
+break _63;
+}
+}
+}
+else{
+	r13 = 0;
+}
+} while(0);
+	r12 = r7 & 255;
+_69: do {
+if(!(r12 ==0)) //_LBB703_56
+{
+	if(r8 !=0) //_LBB703_57
+{
+	r7 = r0 >> 2;
+	r7 = heap32[(r7+1)];
+	r12 = r7;
+	r14 = r10;
+	r15 = r13;
+_72: while(true){
+	if(r15 !=0) //_LBB703_58
+{
+	r15 = (r15 + -1)|0;
+	r16 = (r14 + 1)|0;
+	r17 = (r12 + 1)|0;
+	r18 = heapU8[r12];
+	r19 = heapU8[r14];
+	r12 = r17;
+	r14 = r16;
+	if(r18 !=r19) //_LBB703_62
+{
+__label__ = 57;
+break _72;
+}
+else{
+__label__ = 54;
+}
+}
+else{
+__label__ = 55;
+break _72;
+}
+}
+if (__label__ == 55){
+	r7 = heapU8[r7+r13];
+if(!(r7 !=59)) //_LBB703_62
+{
+	r7 = 1;
+break _69;
+}
+}
+	r7 = 0;
+}
+}
+} while(0);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r13;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+	r8 = (r8 + 1)|0;
+	if(r8 !=6) //_LBB703_66
+{
+	r10 = heapU8[r4];
+	if(r10 !=0) //_LBB703_68
+{
+	r3 = _2E_str785;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+	r3 = (r4 + 1)|0;
+	r4 = 2;
+}
+else{
+	r4 = 1;
+}
+}
+else{
+	r4 = 1;
+	r8 = 6;
+}
+}
+else{
+	r4 = 0;
+}
+	r9 = heap32[(r9+1)];
+if(!(r9 ==r6)) //_LBB703_73
+{
+if(!(r9 ==0)) //_LBB703_73
+{
+	heap32[(g0)] = r9;
+	_ZdaPv(i7);
+}
+}
+	if(r4 ==1) //_LBB703_79
+{
+__label__ = 74;
+break _45;
+}
+else{
+	if(r4 !=0) //_LBB703_83
+{
+	r4 = heap32[(r11+1)];
+	if(r4 ==r5) //_LBB703_85
+{
+__label__ = 79;
+}
+else{
+	if(r4 !=0) //_LBB703_86
+{
+	r10 = 0;
+	heap32[(g0)] = r4;
+	_ZdaPv(i7);
+	r9 = r3;
+__label__ = 81;
+}
+else{
+__label__ = 79;
+}
+}
+if (__label__ == 79){
+	r10 = 0;
+	r9 = r3;
+}
+_101: while(true){
+	r4 = r10 << 2;
+	r11 = r4 | 3;
+	r12 = r4 | 2;
+	r13 = heapU8[r9];
+	r4 = (r3 + r4)|0;
+	r11 = (r3 + r11)|0;
+	r12 = (r3 + r12)|0;
+	if(r13 ==59) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r4 = 0;
+	if(r13 ==0) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r13 = heapU8[r9+1];
+	if(r13 ==59) //_LBB703_36
+{
+break _101;
+}
+else{
+	r4 = 0;
+	if(r13 ==0) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r13 = heapU8[r9+2];
+	r4 = r12;
+	if(r13 ==59) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r4 = 0;
+	if(r13 ==0) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r12 = heapU8[r9+3];
+	r4 = r11;
+	if(r12 ==59) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r4 = 0;
+	if(r12 ==0) //_LBB703_37
+{
+continue _45;
+}
+else{
+	r10 = (r10 + 1)|0;
+	r9 = (r9 + 4)|0;
+}
+}
+}
+}
+}
+}
+}
+}
+}
+	r4 = (r9 + 1)|0;
+continue _45;
+}
+else{
+__label__ = 70;
+break _45;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 74:
+	r1 = heap32[(r11+1)];
+	if(r1 ==r5) //_LBB703_81
+{
+__label__ = 93;
+break _39;
+}
+else{
+	if(r1 !=0) //_LBB703_82
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+__label__ = 93;
+break _39;
+}
+else{
+__label__ = 93;
+break _39;
+}
+}
+break;
+case 70:
+	r0 = heap32[(r11+1)];
+	if(r0 ==r5) //_LBB703_78
+{
+__label__ = 73;
+}
+else{
+	if(r0 ==0) //_LBB703_78
+{
+__label__ = 73;
+}
+else{
+	heap32[(g0)] = r0;
+	_ZdaPv(i7);
+__label__ = 73;
+}
+}
+break;
+}
+break;
+}
+} while(0);
+_119: do {
+if (__label__ == 93){
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r4 = heapU8[r2];
+	if(r4 ==0) //_LBB703_117
+{
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r0;
+	_ZN4__rw16__rw_locale_nameEiPKcRNS_14__rw_pod_arrayIcLj256EEE(i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB703_78
+{
+break _119;
+}
+}
+else{
+	r3 = r7 & 255;
+if(!(r3 ==0)) //_LBB703_118
+{
+	r3 = 0;
+	r4 = r2;
+_125: while(true){
+	r5 = r3 << 2;
+	r6 = heapU8[r4];
+	if(r6 !=59) //_LBB703_104
+{
+	if(r6 !=0) //_LBB703_106
+{
+	r6 = heapU8[r4+1];
+	if(r6 ==59) //_LBB703_115
+{
+__label__ = 109;
+break _125;
+}
+else{
+	if(r6 ==0) //_LBB703_105
+{
+__label__ = 99;
+break _125;
+}
+else{
+	r6 = heapU8[r4+2];
+	if(r6 !=59) //_LBB703_110
+{
+	if(r6 ==0) //_LBB703_105
+{
+__label__ = 99;
+break _125;
+}
+else{
+	r6 = heapU8[r4+3];
+	if(r6 !=59) //_LBB703_113
+{
+	if(r6 ==0) //_LBB703_105
+{
+__label__ = 99;
+break _125;
+}
+else{
+	r3 = (r3 + 1)|0;
+	r4 = (r4 + 4)|0;
+}
+}
+else{
+__label__ = 106;
+break _125;
+}
+}
+}
+else{
+__label__ = 103;
+break _125;
+}
+}
+}
+}
+else{
+__label__ = 99;
+break _125;
+}
+}
+else{
+__label__ = 97;
+break _125;
+}
+}
+switch(__label__ ){//multiple entries
+case 109:
+	r3 = (r4 + 1)|0;
+break;
+case 99:
+	r3 = 0;
+break;
+case 97:
+	r3 = (r2 + r5)|0;
+break;
+case 106:
+	r3 = r5 | 3;
+	r3 = (r2 + r3)|0;
+break;
+case 103:
+	r3 = r5 | 2;
+	r3 = (r2 + r3)|0;
+break;
+}
+	r3 = (r3 - r2)|0;
+	heap32[(r1+1)] = r2;
+	heap32[(r1)] = r3;
+	r3 = _2E_str26;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+}
+}
+	r0 = heap32[(r1+1)];
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function cmplocales(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0)];
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r0 = r0 >> 2;
+	r1 = heap32[(r1+38)];
+	r0 = heap32[(r0+38)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	strcmp(i7);
+	return;
+}
+
+function _ZN4__rw11__rw_localeD2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+38)];
+	r3 = (r0 + 112)|0;
+	if(r2 ==r3) //_LBB705_2
+{
+__label__ = 2;
+}
+else{
+	if(r2 !=0) //_LBB705_3
+{
+	r3 = 0;
+	heap32[(g0)] = r2;
+	_ZdaPv(i7);
+__label__ = 4;
+}
+else{
+__label__ = 2;
+}
+}
+if (__label__ == 2){
+	r3 = 0;
+}
+_6: while(true){
+	r2 = r3 << 2;
+	r2 = (r0 - r2)|0;
+	r2 = r2 >> 2;
+	r4 = 0;
+	r2 = heap32[(r2)];
+if(!(r2 ==0)) //_LBB705_10
+{
+	r5 = r2 >> 2;
+	r6 = heap32[(r5+5)];
+	if(r6 ==0) //_LBB705_7
+{
+	r2 = heap32[(r5+6)];
+	r2 = (r2 + -1)|0;
+	heap32[(r5+6)] = r2;
+if(!(r2 !=0)) //_LBB705_10
+{
+	r2 = (r4 - r3)|0;
+	r2 = r2 << 2;
+	r2 = (r0 + r2)|0;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+if(!(r2 ==0)) //_LBB705_10
+{
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+1)];
+	heap32[(g0)] = r2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+}
+}
+else{
+	r5 = heap32[(r5+1)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = 0;
+	_ZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_E(i7);
+}
+}
+	r3 = (r3 + -1)|0;
+	if(r3 !=-26) //_LBB705_4
+{
+continue _6;
+}
+else{
+break _6;
+}
+}
+	r0 = heap32[(r1+26)];
+	r2 = heap32[(r1+27)];
+_17: do {
+if(!(r2 ==0)) //_LBB705_13
+{
+_18: while(true){
+	r2 = r4 << 2;
+	r0 = (r0 + r2)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r3 = heap32[(r0+6)];
+	r3 = (r3 + -1)|0;
+	heap32[(r0+6)] = r3;
+if(!(r3 !=0)) //_LBB705_17
+{
+	r0 = heap32[(r1+26)];
+	r0 = (r0 + r2)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+if(!(r0 ==0)) //_LBB705_17
+{
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+1)];
+	heap32[(g0)] = r0;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+}
+	r4 = (r4 + 1)|0;
+	r0 = heap32[(r1+26)];
+	r2 = heap32[(r1+27)];
+	if(r4 !=r2) //_LBB705_14
+{
+continue _18;
+}
+else{
+break _17;
+}
+}
+}
+} while(0);
+if(!(r0 ==0)) //_LBB705_20
+{
+	heap32[(g0)] = r0;
+	_ZdaPv(i7);
+}
+	return;
+}
+
+function _ZN4__rw11__rw_localeC2EPKc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -280;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	heap32[(r1+26)] = 0;
+	heap32[(r1+27)] = 0;
+	heap32[(r1+39)] = 1;
+	r2 = heap32[(fp+1)];
+	heap32[(r1+40)] = 0;
+	heap32[(r1+41)] = 0;
+	r3 = heapU8[r2];
+	if(r3 ==0) //_LBB706_2
+{
+	r3 = sp + -264;
+	r4 = 0;
+	r5 = r3 >> 2;
+	r6 = (r0 + 112)|0;
+	heap8[sp+-256] = r4;
+	heap32[(r5+1)] = r6;
+	heap32[(fp+-66)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	r2 = (r3 + 8)|0;
+	_ZN4__rwL16__rw_expand_nameERNS_14__rw_pod_arrayIcLj256EEEPKc(i7);
+	r3 = r_g0;
+	heap32[(r1+38)] = r3;
+	heap32[(r5+1)] = r2;
+}
+else{
+	r3 = 1;
+_5: while(true){
+	r4 = (r3 + 1)|0;
+	r5 = heapU8[r2+r3];
+	r3 = r4;
+if(!(r5 !=0)) //_LBB706_4
+{
+break _5;
+}
+}
+	if(uint(r4) >uint(39)) //_LBB706_7
+{
+	heap32[(g0)] = r4;
+	_Znaj(i7);
+	r3 = r_g0;
+}
+else{
+	r3 = (r0 + 112)|0;
+}
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	memcpy(i7);
+	heap32[(r1+38)] = r3;
+}
+	r2 = 0;
+	heap32[(r1+40)] = 67108863;
+	heap32[(r1+41)] = 0;
+_13: while(true){
+	r4 = (r3 - r2)|0;
+	r5 = heapU8[r4];
+	if(r5 ==0) //_LBB706_43
+{
+__label__ = 41;
+break _13;
+}
+else{
+	if(r5 ==59) //_LBB706_20
+{
+__label__ = 20;
+break _13;
+}
+else{
+	r5 = heapU8[r4+1];
+	if(r5 ==0) //_LBB706_43
+{
+__label__ = 41;
+break _13;
+}
+else{
+	if(r5 !=59) //_LBB706_15
+{
+	r5 = heapU8[r4+2];
+	if(r5 ==0) //_LBB706_43
+{
+__label__ = 41;
+break _13;
+}
+else{
+	if(r5 ==59) //_LBB706_14
+{
+__label__ = 14;
+break _13;
+}
+else{
+	r4 = heapU8[r4+3];
+	if(r4 ==0) //_LBB706_43
+{
+__label__ = 41;
+break _13;
+}
+else{
+	if(r4 ==59) //_LBB706_14
+{
+__label__ = 14;
+break _13;
+}
+else{
+	r2 = (r2 + -4)|0;
+continue _13;
+}
+}
+}
+}
+}
+else{
+__label__ = 14;
+break _13;
+}
+}
+}
+}
+}
+if (__label__ == 20){
+	if(r3 ==r2) //_LBB706_43
+{
+__label__ = 41;
+}
+else{
+__label__ = 14;
+}
+}
+_25: do {
+switch(__label__ ){//multiple entries
+case 41:
+	r2 = heapU8[r3];
+if(!(r2 !=67)) //_LBB706_45
+{
+	r2 = heapU8[r3+1];
+	if(r2 ==0) //_LBB706_46
+{
+break _25;
+}
+}
+	heap32[(r1+41)] = 67108863;
+break;
+case 14:
+	r2 = 0;
+	r4 = r2;
+_31: while(true){
+	r5 = heapU8[r3];
+	if(r5 ==0) //_LBB706_46
+{
+break _25;
+}
+else{
+	if(r2 !=-6) //_LBB706_21
+{
+	r5 = r5 & 255;
+	if(r5 !=67) //_LBB706_24
+{
+__label__ = 23;
+}
+else{
+	r5 = heapU8[r3+1];
+	if(r5 !=59) //_LBB706_24
+{
+__label__ = 23;
+}
+else{
+__label__ = 24;
+}
+}
+if (__label__ == 23){
+	r5 = (r2 * -3)|0;
+	r6 = _ZN4__rw9__rw_catsE;
+	r5 = r5 << 2;
+	r5 = (r6 + r5)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+2)];
+	r4 = r5 | r4;
+	heap32[(r1+41)] = r4;
+}
+	r5 = 0;
+	r6 = r3;
+_40: while(true){
+	r7 = heapU8[r6];
+	if(r7 ==0) //_LBB706_46
+{
+break _25;
+}
+else{
+	if(r7 ==59) //_LBB706_37
+{
+__label__ = 36;
+break _40;
+}
+else{
+	r7 = heapU8[r6+1];
+	if(r7 ==0) //_LBB706_46
+{
+break _25;
+}
+else{
+	if(r7 ==59) //_LBB706_39
+{
+__label__ = 37;
+break _40;
+}
+else{
+	r7 = heapU8[r6+2];
+	if(r7 ==0) //_LBB706_46
+{
+break _25;
+}
+else{
+	r8 = r5 << 2;
+	if(r7 !=59) //_LBB706_33
+{
+	r7 = heapU8[r6+3];
+	if(r7 ==0) //_LBB706_46
+{
+break _25;
+}
+else{
+	if(r7 !=59) //_LBB706_36
+{
+	r5 = (r5 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 34;
+break _40;
+}
+}
+}
+else{
+__label__ = 31;
+break _40;
+}
+}
+}
+}
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 36:
+	if(r6 ==0) //_LBB706_46
+{
+break _25;
+}
+break;
+case 37:
+	r6 = (r6 + 1)|0;
+break;
+case 34:
+	r5 = r8 | 3;
+	r6 = (r3 + r5)|0;
+break;
+case 31:
+	r5 = r8 | 2;
+	r6 = (r3 + r5)|0;
+break;
+}
+	r3 = (r6 + 1)|0;
+	r2 = (r2 + -1)|0;
+continue _31;
+}
+else{
+break _25;
+}
+}
+}
+break;
+}
+} while(0);
+	r1 = 104;
+	r3 = 0;
+_57: while(true){
+	r2 = (r1 + -1)|0;
+	r1 = (r0 - r1)|0;
+	heap8[r1+104] = r3;
+	r1 = r2;
+	if(r2 !=0) //_LBB706_47
+{
+continue _57;
+}
+else{
+break _57;
+}
+}
+	return;
+}
+
+function _ZN4__rw11__rw_locale9_C_manageEPS0_PKc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+var __label__ = 0;
+	i7 = sp + -280;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	if(r0 !=0) //_LBB707_9
+{
+	r2 = heapU8[r0];
+	if(r2 ==67) //_LBB707_11
+{
+	r2 = heapU8[r0+1];
+	r3 = 0;
+	r2 = r2 != r3;
+}
+else{
+	r2 = 1;
+}
+	r3 = sp + -264;
+	r4 = (r3 + 8)|0;
+	r5 = _2E_str538;
+	r6 = r3 >> 2;
+	heap32[(fp+-66)] = 0;
+	r0 = r2 != 0 ? r0 : r5;
+	r7 = 0;
+	heap32[(r6+1)] = r4;
+	heap8[sp+-256] = r7;
+	if(r1 !=0) //_LBB707_14
+{
+__label__ = 19;
+}
+else{
+	if(r2 != 0) //_LBB707_15
+{
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	_ZN4__rwL16__rw_expand_nameERNS_14__rw_pod_arrayIcLj256EEEPKc(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB707_18
+{
+	r2 = heapU8[r0];
+	if(r2 ==67) //_LBB707_20
+{
+	r2 = heapU8[r0+1];
+	if(r2 !=0) //_LBB707_19
+{
+__label__ = 19;
+}
+else{
+	r0 = r5;
+__label__ = 19;
+}
+}
+else{
+__label__ = 19;
+}
+}
+else{
+__label__ = 15;
+}
+}
+else{
+__label__ = 19;
+}
+}
+_14: do {
+if (__label__ == 19){
+	r2 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE9n_locales;
+	r3 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE7locales;
+	r2 = r2 >> 2;
+	r3 = r3 >> 2;
+	r5 = heap32[(r2)];
+	r8 = heap32[(r3)];
+	if(r1 ==0) //_LBB707_24
+{
+	r7 = r5;
+_18: while(true){
+	r9 = r7;
+	if(r9 ==0) //_LBB707_53
+{
+__label__ = 49;
+break _18;
+}
+else{
+	r1 = r9 << 1;
+	r10 = r1 & -4;
+	r11 = (r8 + r10)|0;
+	r1 = r11 >> 2;
+	r1 = heap32[(r1)];
+	r12 = r1 >> 2;
+	r7 = heap32[(r12+38)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	strcmp(i7);
+	r13 = r_g0;
+	r7 = r9 >>> 1;
+	if(r13 <0) //_LBB707_50
+{
+__label__ = 46;
+}
+else{
+	if(r13 <1) //_LBB707_51
+{
+__label__ = 47;
+break _18;
+}
+else{
+	r1 = (r10 + r8)|0;
+	r9 = (r9 + -1)|0;
+	r8 = (r1 + 4)|0;
+	r7 = (r9 - r7)|0;
+}
+}
+}
+}
+if (__label__ == 47){
+if(!(r11 ==0)) //_LBB707_53
+{
+	r0 = heap32[(r12+39)];
+	r0 = (r0 + 1)|0;
+	heap32[(r12+39)] = r0;
+__label__ = 65;
+break _14;
+}
+}
+	r1 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE14locale_bufsize;
+	r1 = r1 >> 2;
+	r7 = heap32[(r1)];
+if(!(r5 !=r7)) //_LBB707_59
+{
+	r5 = r5 << 3;
+	heap32[(g0)] = r5;
+	_Znaj(i7);
+	r5 = r_g0;
+	r7 = heap32[(r3)];
+	r8 = heap32[(r2)];
+	r8 = r8 << 2;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	memcpy(i7);
+	r8 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE10locale_buf;
+if(!(r7 ==r8)) //_LBB707_58
+{
+if(!(r7 ==0)) //_LBB707_58
+{
+	heap32[(g0)] = r7;
+	_ZdaPv(i7);
+}
+}
+	heap32[(r3)] = r5;
+	r5 = heap32[(r1)];
+	r5 = r5 << 1;
+	heap32[(r1)] = r5;
+}
+	r1 = heapU8[r0];
+	if(r1 !=67) //_LBB707_65
+{
+__label__ = 61;
+}
+else{
+	r1 = heapU8[r0+1];
+	if(r1 !=0) //_LBB707_65
+{
+__label__ = 61;
+}
+else{
+	r1 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE7classic;
+	r5 = r1 >> 2;
+	r1 = heap32[(r5)];
+	if(r1 !=0) //_LBB707_64
+{
+	r0 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE12classic_body;
+	r0 = r0 >> 2;
+	r5 = heap32[(r0+39)];
+	r5 = (r5 + 1)|0;
+	heap32[(r0+39)] = r5;
+__label__ = 63;
+}
+else{
+	r1 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE12classic_body;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	_ZN4__rw11__rw_localeC2EPKc(i7);
+	heap32[(r5)] = r1;
+__label__ = 63;
+}
+}
+}
+if (__label__ == 61){
+	heap32[(g0)] = 172;
+	_Znwj(i7);
+	r1 = r_g0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	_ZN4__rw11__rw_localeC2EPKc(i7);
+}
+	r0 = heap32[(r2)];
+	r3 = heap32[(r3)];
+	r5 = r0 << 2;
+	r5 = (r3 + r5)|0;
+	r5 = r5 >> 2;
+	r7 = (r0 + 1)|0;
+	heap32[(r5)] = r1;
+	heap32[(r2)] = r7;
+	r2 = (r0 + -1)|0;
+	if(uint(r2) <uint(2147483645)) //_LBB707_69
+{
+	r2 = cmplocales__index__;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r2;
+	quicksort(i7);
+__label__ = 65;
+}
+else{
+__label__ = 65;
+}
+}
+else{
+	r9 = r5;
+	r10 = r8;
+_48: while(true){
+	r11 = r9;
+	if(r11 ==0) //_LBB707_46
+{
+__label__ = 42;
+break _48;
+}
+else{
+	r9 = r11 << 1;
+	r12 = r9 & -4;
+	r13 = (r10 + r12)|0;
+	r9 = r13 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+38)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r9;
+	strcmp(i7);
+	r14 = r_g0;
+	r9 = r11 >>> 1;
+	if(r14 <0) //_LBB707_28
+{
+__label__ = 25;
+}
+else{
+	if(r14 <1) //_LBB707_29
+{
+__label__ = 26;
+break _48;
+}
+else{
+	r10 = (r12 + r10)|0;
+	r11 = (r11 + -1)|0;
+	r10 = (r10 + 4)|0;
+	r9 = (r11 - r9)|0;
+}
+}
+}
+}
+if (__label__ == 26){
+if(!(r13 ==0)) //_LBB707_46
+{
+	r1 = (r13 - r8)|0;
+	r0 = r1 & -4;
+	r9 = (r8 + r0)|0;
+	r9 = r9 >> 2;
+	r9 = heap32[(r9)];
+	r10 = r9 >> 2;
+	r11 = heap32[(r10+39)];
+	r11 = (r11 + -1)|0;
+	heap32[(r10+39)] = r11;
+	if(r11 !=0) //_LBB707_17
+{
+__label__ = 15;
+break _14;
+}
+else{
+	r1 = r1 >> 2;
+	r11 = (r5 + -1)|0;
+	heap32[(r2)] = r11;
+	if(uint(r11) >uint(3)) //_LBB707_36
+{
+__label__ = 33;
+}
+else{
+	r2 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE10locale_buf;
+	if(r8 ==r2) //_LBB707_36
+{
+__label__ = 33;
+}
+else{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r0;
+	r0 = r1 << 2;
+	r5 = (r0 + r8)|0;
+	r1 = (r11 - r1)|0;
+	memcpy(i7);
+	r0 = (r2 + r0)|0;
+	r5 = (r5 + 4)|0;
+	r1 = r1 << 2;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r1;
+	memcpy(i7);
+if(!(r8 ==0)) //_LBB707_35
+{
+	heap32[(g0)] = r8;
+	_ZdaPv(i7);
+}
+	r1 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE14locale_bufsize;
+	r1 = r1 >> 2;
+	heap32[(r3)] = r2;
+	heap32[(r1)] = 8;
+__label__ = 36;
+}
+}
+_63: do {
+if (__label__ == 33){
+	r0 = (r11 - r1)|0;
+	r0 = r0 << 2;
+if(!(r0 ==0)) //_LBB707_39
+{
+	r0 = r5 << 2;
+	r1 = r1 << 2;
+	r0 = (r0 + -4)|0;
+	r2 = (r1 + r8)|0;
+	r1 = (r0 - r1)|0;
+	r0 = (r2 + 4)|0;
+_66: while(true){
+	r2 = heapU8[r0];
+	r1 = (r1 + -1)|0;
+	r3 = (r0 + 1)|0;
+	heap8[r0+-4] = r2;
+	r0 = r3;
+if(!(r1 !=0)) //_LBB707_38
+{
+break _63;
+}
+}
+}
+}
+} while(0);
+	r1 = heap32[(r10+38)];
+	r0 = heapU8[r1];
+	if(r0 ==67) //_LBB707_41
+{
+	r1 = heapU8[r1+1];
+	r7 = 0;
+	r7 = r1 == r7;
+}
+	if(r7 != 0) //_LBB707_17
+{
+__label__ = 15;
+break _14;
+}
+else{
+	if(r9 ==0) //_LBB707_17
+{
+__label__ = 15;
+break _14;
+}
+else{
+	heap32[(g0)] = r9;
+	_ZN4__rw11__rw_localeD2Ev(i7);
+	heap32[(g0)] = r9;
+	r1 = 0;
+	_ZdlPv(i7);
+__label__ = 65;
+break _14;
+}
+}
+}
+}
+}
+	r0 = r1 >> 2;
+	r2 = heap32[(r0+39)];
+	r1 = 0;
+	r2 = (r2 + -1)|0;
+	heap32[(r0+39)] = r2;
+__label__ = 65;
+}
+}
+} while(0);
+if (__label__ == 15){
+	r1 = 0;
+}
+	r0 = heap32[(r6+1)];
+if(!(r0 ==r4)) //_LBB707_73
+{
+if(!(r0 ==0)) //_LBB707_73
+{
+	heap32[(g0)] = r0;
+	_ZdaPv(i7);
+}
+}
+	r_g0 = r1;
+	return;
+}
+else{
+	r0 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE6global;
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+_84: do {
+	if(r2 ==0) //_LBB707_3
+{
+	r3 = _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE5ginit;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	if(r4 !=0) //_LBB707_5
+{
+_87: while(true){
+	r4 = heap32[(r3)];
+if(!(r4 <1000)) //_LBB707_5
+{
+break _84;
+}
+}
+}
+else{
+	r2 = (r4 + 1)|0;
+	heap32[(r3)] = r2;
+	r2 = _2E_str538;
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = r2;
+	_ZN4__rw11__rw_locale9_C_manageEPS0_PKc(i7);
+	r2 = r_g0;
+	heap32[(r0)] = r2;
+	r4 = heap32[(r3)];
+	r4 = (r4 + 1000)|0;
+	heap32[(r3)] = r4;
+}
+}
+} while(0);
+	if(r1 ==0) //_LBB707_8
+{
+	r0 = r2 >> 2;
+	r1 = heap32[(r0+39)];
+	r1 = (r1 + 1)|0;
+	heap32[(r0+39)] = r1;
+	r_g0 = r2;
+	return;
+}
+else{
+	r3 = r1 >> 2;
+	r4 = heap32[(r3+39)];
+	r4 = (r4 + 1)|0;
+	heap32[(r3+39)] = r4;
+	heap32[(r0)] = r1;
+	r_g0 = r2;
+	return;
+}
+}
+}
+
+function _ZN4__rw11__rw_locale11_C_get_bodyEPS0_S1_PKciPKNS_10__rw_facetE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -304;var g0 = i7>>2; // save stack
+	r0 = sp + -264;
+	r1 = (r0 + 8)|0;
+	r2 = r0 >> 2;
+	heap32[(fp+-66)] = 0;
+	r3 = 0;
+	heap32[(r2+1)] = r1;
+	heap8[sp+-256] = r3;
+	r4 = _2E_str538;
+	r5 = _2E_str292167;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 3;
+	strncmp(i7);
+	r5 = r_g0;
+_1: do {
+	if(r5 ==0) //_LBB708_2
+{
+	r4 = sp + -288;
+	r5 = r4 >> 2;
+	heap32[(fp+-72)] = 0;
+	heap32[(r5+1)] = 0;
+	heap32[(r5+2)] = 0;
+	heap32[(r5+3)] = 0;
+	r6 = 4;
+	heap32[(r5+4)] = 0;
+	heap32[(r5+5)] = 0;
+_3: while(true){
+	r6 = (r6 + -4)|0;
+if(!(r6 !=0)) //_LBB708_3
+{
+break _3;
+}
+}
+	r5 = _2E_str538;
+_6: while(true){
+	r6 = heapU8[r5];
+	if(r6 ==0) //_LBB708_48
+{
+__label__ = 44;
+break _6;
+}
+else{
+	r6 = r3;
+	r7 = r3;
+_9: while(true){
+	r8 = (r5 + r6)|0;
+	r9 = heapU8[r5+r6];
+	if(r9 ==59) //_LBB708_17
+{
+__label__ = 16;
+break _9;
+}
+else{
+	if(r9 !=0) //_LBB708_8
+{
+	r9 = heapU8[r8+1];
+	if(r9 ==0) //_LBB708_7
+{
+__label__ = 6;
+break _9;
+}
+else{
+	if(r9 ==59) //_LBB708_21
+{
+__label__ = 18;
+break _9;
+}
+else{
+	r9 = heapU8[r8+2];
+	if(r9 ==0) //_LBB708_7
+{
+__label__ = 6;
+break _9;
+}
+else{
+	r10 = r7 << 2;
+	if(r9 !=59) //_LBB708_13
+{
+	r8 = heapU8[r8+3];
+	if(r8 ==0) //_LBB708_7
+{
+__label__ = 6;
+break _9;
+}
+else{
+	if(r8 !=59) //_LBB708_16
+{
+	r7 = (r7 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 14;
+break _9;
+}
+}
+}
+else{
+__label__ = 11;
+break _9;
+}
+}
+}
+}
+}
+else{
+__label__ = 6;
+break _9;
+}
+}
+}
+_19: do {
+switch(__label__ ){//multiple entries
+case 16:
+	if(r8 ==0) //_LBB708_7
+{
+__label__ = 6;
+break _19;
+}
+else{
+__label__ = 19;
+break _19;
+}
+break;
+case 18:
+	r8 = (r8 + 1)|0;
+__label__ = 19;
+break _19;
+break;
+case 14:
+	r6 = r10 | 3;
+	r8 = (r5 + r6)|0;
+__label__ = 19;
+break _19;
+break;
+case 11:
+	r6 = r10 | 2;
+	r8 = (r5 + r6)|0;
+__label__ = 19;
+break;
+}
+} while(0);
+_24: do {
+if (__label__ == 6){
+	r6 = r5;
+_26: while(true){
+	r8 = (r6 + 1)|0;
+	r7 = heapU8[r6+1];
+	r6 = r8;
+if(!(r7 !=0)) //_LBB708_19
+{
+break _24;
+}
+}
+}
+} while(0);
+	r6 = 0;
+	r7 = r6;
+_29: while(true){
+	r9 = (r5 + r6)|0;
+	r10 = heapU8[r5+r6];
+	if(r10 ==61) //_LBB708_35
+{
+__label__ = 32;
+break _29;
+}
+else{
+	if(r10 !=0) //_LBB708_26
+{
+	r10 = heapU8[r9+1];
+	if(r10 ==0) //_LBB708_25
+{
+__label__ = 22;
+break _6;
+}
+else{
+	if(r10 ==61) //_LBB708_37
+{
+__label__ = 33;
+break _29;
+}
+else{
+	r10 = heapU8[r9+2];
+	if(r10 ==0) //_LBB708_25
+{
+__label__ = 22;
+break _6;
+}
+else{
+	r11 = r7 << 2;
+	if(r10 !=61) //_LBB708_31
+{
+	r9 = heapU8[r9+3];
+	if(r9 ==0) //_LBB708_25
+{
+__label__ = 22;
+break _6;
+}
+else{
+	if(r9 !=61) //_LBB708_34
+{
+	r7 = (r7 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 30;
+break _29;
+}
+}
+}
+else{
+__label__ = 27;
+break _29;
+}
+}
+}
+}
+}
+else{
+__label__ = 22;
+break _6;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 32:
+	if(r9 ==0) //_LBB708_25
+{
+__label__ = 22;
+break _6;
+}
+break;
+case 33:
+	r9 = (r9 + 1)|0;
+break;
+case 30:
+	r6 = r11 | 3;
+	r9 = (r5 + r6)|0;
+break;
+case 27:
+	r6 = r11 | 2;
+	r9 = (r5 + r6)|0;
+break;
+}
+	r6 = (r9 - r5)|0;
+	r7 = 0;
+_45: while(true){
+	if(r7 !=-6) //_LBB708_39
+{
+	r10 = (r7 * -3)|0;
+	r11 = _ZN4__rw9__rw_catsE;
+	r10 = r10 << 2;
+	r10 = (r11 + r10)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10+1)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	strncmp(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB708_42
+{
+	r7 = (r7 + -1)|0;
+}
+else{
+__label__ = 36;
+break _45;
+}
+}
+else{
+__label__ = 40;
+break _45;
+}
+}
+if (__label__ == 36){
+	r6 = r7 << 2;
+	r6 = (r4 - r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	if(r6 !=0) //_LBB708_25
+{
+__label__ = 22;
+break _6;
+}
+else{
+	r6 = 0;
+	r6 = (r6 - r7)|0;
+	r6 = r6 << 2;
+	r6 = (r4 + r6)|0;
+	r6 = r6 >> 2;
+	r7 = (r9 + 1)|0;
+	heap32[(r6)] = r7;
+}
+}
+	r6 = heapU8[r8];
+	r5 = r8;
+	if(r6 ==0) //_LBB708_46
+{
+__label__ = 42;
+}
+else{
+	r5 = (r8 + 1)|0;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 44:
+	r3 = 0;
+	r5 = r3;
+_56: while(true){
+	if(r5 !=-6) //_LBB708_49
+{
+	r6 = (r3 - r5)|0;
+	r6 = r6 << 2;
+	r6 = (r4 + r6)|0;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+	if(r7 ==0) //_LBB708_51
+{
+	r7 = _2E_str538;
+	heap32[(r6)] = r7;
+}
+	r6 = 0;
+	r8 = r6;
+_62: while(true){
+	r9 = heapU8[r7+r6];
+	if(r9 ==0) //_LBB708_66
+{
+__label__ = 60;
+break _62;
+}
+else{
+	r10 = (r7 + r6)|0;
+	if(r9 ==59) //_LBB708_64
+{
+__label__ = 59;
+break _62;
+}
+else{
+	r9 = heapU8[r10+1];
+	if(r9 ==0) //_LBB708_66
+{
+__label__ = 60;
+break _62;
+}
+else{
+	if(r9 ==59) //_LBB708_71
+{
+__label__ = 65;
+break _62;
+}
+else{
+	r9 = heapU8[r10+2];
+	if(r9 ==0) //_LBB708_66
+{
+__label__ = 60;
+break _62;
+}
+else{
+	r11 = r8 << 2;
+	if(r9 !=59) //_LBB708_60
+{
+	r10 = heapU8[r10+3];
+	if(r10 ==0) //_LBB708_66
+{
+__label__ = 60;
+break _62;
+}
+else{
+	if(r10 !=59) //_LBB708_63
+{
+	r8 = (r8 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 57;
+break _62;
+}
+}
+}
+else{
+__label__ = 54;
+break _62;
+}
+}
+}
+}
+}
+}
+}
+_72: do {
+switch(__label__ ){//multiple entries
+case 59:
+	if(r10 ==0) //_LBB708_66
+{
+__label__ = 60;
+break _72;
+}
+else{
+__label__ = 66;
+break _72;
+}
+break;
+case 65:
+	r10 = (r10 + 1)|0;
+__label__ = 66;
+break _72;
+break;
+case 57:
+	r6 = r11 | 3;
+	r10 = (r7 + r6)|0;
+__label__ = 66;
+break _72;
+break;
+case 54:
+	r6 = r11 | 2;
+	r10 = (r7 + r6)|0;
+__label__ = 66;
+break;
+}
+} while(0);
+if (__label__ == 60){
+	r10 = heapU8[r7];
+_79: do {
+	if(r10 !=0) //_LBB708_68
+{
+	r6 = (r7 + 1)|0;
+	r8 = 0;
+_81: while(true){
+	r10 = (r8 + 1)|0;
+	r9 = heapU8[r6+r8];
+	r8 = r10;
+if(!(r9 !=0)) //_LBB708_69
+{
+break _79;
+}
+}
+}
+else{
+	r10 = 0;
+}
+} while(0);
+	r10 = (r7 + r10)|0;
+}
+	r6 = (r10 - r7)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r6;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+	r6 = _2E_str785;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 1;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+	r5 = (r5 + -1)|0;
+}
+else{
+break _56;
+}
+}
+	r4 = heap32[(r2+1)];
+	if(r4 ==0) //_LBB708_78
+{
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 0;
+	_ZN4__rw11__rw_locale9_C_manageEPS0_PKc(i7);
+	r4 = r_g0;
+__label__ = 73;
+break _1;
+}
+else{
+__label__ = 72;
+break _1;
+}
+break;
+case 22:
+	r4 = 0;
+__label__ = 73;
+break;
+}
+}
+else{
+__label__ = 72;
+}
+} while(0);
+if (__label__ == 72){
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = r4;
+	_ZN4__rw11__rw_locale9_C_manageEPS0_PKc(i7);
+	r4 = r_g0;
+}
+	r0 = heap32[(r2+1)];
+if(!(r0 ==r1)) //_LBB708_83
+{
+if(!(r0 ==0)) //_LBB708_83
+{
+	heap32[(g0)] = r0;
+	_ZdaPv(i7);
+}
+}
+	r_g0 = r4;
+	return;
+}
+
+function _ZNSt6localeD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+27)];
+_1: do {
+if(!(r3 !=0)) //_LBB709_86
+{
+	r3 = heap32[(r2+40)];
+	r3 = r3 & 67108863;
+if(!(r3 !=67108863)) //_LBB709_86
+{
+	r3 = heap32[(r2+41)];
+	r4 = r3 & 8193;
+if(!(r4 ==0)) //_LBB709_4
+{
+	if(r4 !=8193) //_LBB709_86
+{
+break _1;
+}
+}
+	r4 = r3 & 49158;
+if(!(r4 ==0)) //_LBB709_6
+{
+	if(r4 !=49158) //_LBB709_86
+{
+break _1;
+}
+}
+	r4 = r3 & 983160;
+if(!(r4 ==0)) //_LBB709_8
+{
+	if(r4 !=983160) //_LBB709_86
+{
+break _1;
+}
+}
+	r4 = r3 & 7340928;
+if(!(r4 ==0)) //_LBB709_10
+{
+	if(r4 !=7340928) //_LBB709_86
+{
+break _1;
+}
+}
+	r4 = r3 & 25168896;
+if(!(r4 ==0)) //_LBB709_12
+{
+	if(r4 !=25168896) //_LBB709_86
+{
+break _1;
+}
+}
+	r3 = r3 & 33558528;
+if(!(r3 ==0)) //_LBB709_14
+{
+	if(r3 !=33558528) //_LBB709_86
+{
+break _1;
+}
+}
+	r3 = heap32[(r2+38)];
+	r4 = _2E_str538;
+	r5 = r3 == 0 ? r4 : r3;
+	r6 = heapU8[r5];
+	if(r6 ==59) //_LBB709_16
+{
+	r5 = (r5 + 1)|0;
+}
+	r6 = 0;
+	r7 = r6;
+_25: while(true){
+	r8 = heapU8[r5+r6];
+	if(r8 ==0) //_LBB709_33
+{
+__label__ = 31;
+break _25;
+}
+else{
+	r9 = (r5 + r6)|0;
+	if(r8 ==59) //_LBB709_29
+{
+__label__ = 28;
+break _25;
+}
+else{
+	r8 = heapU8[r9+1];
+	if(r8 ==0) //_LBB709_33
+{
+__label__ = 31;
+break _25;
+}
+else{
+	if(r8 ==59) //_LBB709_31
+{
+__label__ = 29;
+break _25;
+}
+else{
+	r8 = heapU8[r9+2];
+	if(r8 ==0) //_LBB709_33
+{
+__label__ = 31;
+break _25;
+}
+else{
+	r10 = r7 << 2;
+	if(r8 !=59) //_LBB709_25
+{
+	r9 = heapU8[r9+3];
+	if(r9 ==0) //_LBB709_33
+{
+__label__ = 31;
+break _25;
+}
+else{
+	if(r9 !=59) //_LBB709_28
+{
+	r7 = (r7 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 26;
+break _25;
+}
+}
+}
+else{
+__label__ = 23;
+break _25;
+}
+}
+}
+}
+}
+}
+}
+_35: do {
+switch(__label__ ){//multiple entries
+case 28:
+	if(r9 ==0) //_LBB709_33
+{
+__label__ = 31;
+break _35;
+}
+else{
+__label__ = 30;
+break _35;
+}
+break;
+case 29:
+	r9 = (r9 + 1)|0;
+__label__ = 30;
+break _35;
+break;
+case 26:
+	r6 = r10 | 3;
+	r9 = (r5 + r6)|0;
+__label__ = 30;
+break _35;
+break;
+case 23:
+	r6 = r10 | 2;
+	r9 = (r5 + r6)|0;
+__label__ = 30;
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 31:
+	r6 = heapU8[r5];
+	if(r6 !=0) //_LBB709_35
+{
+	r7 = (r5 + 1)|0;
+	r8 = 0;
+_44: while(true){
+	r6 = (r8 + 1)|0;
+	r9 = heapU8[r7+r8];
+	r8 = r6;
+if(!(r9 !=0)) //_LBB709_36
+{
+break _44;
+}
+}
+	r9 = 0;
+	r7 = r9;
+	r8 = r9;
+}
+else{
+	r9 = 0;
+	r6 = r9;
+	r7 = r9;
+	r8 = r9;
+}
+break;
+case 30:
+	r6 = (r9 - r5)|0;
+	r7 = 0;
+	r8 = r7;
+break;
+}
+_49: while(true){
+	if(r7 !=26) //_LBB709_38
+{
+	r10 = r7 << 2;
+	r10 = (r1 + r10)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+_52: do {
+	if(r10 !=0) //_LBB709_40
+{
+	r10 = r10 >> 2;
+	r11 = heap32[(r10+7)];
+	r11 = r11 >> 2;
+	r10 = heap32[(r10+1)];
+	r12 = 0;
+	r13 = r10 != r12;
+	r11 = heap32[(r11)];
+	r13 = r13 & 1;
+	r11 = r11 << 1;
+	r11 = r13 | r11;
+	r11 = (r11 + -1)|0;
+	r13 = 53;
+	r11 = uint(r11) < uint(r13) ? r11 : r12;
+	if(r11 >36) //_LBB709_43
+{
+	r11 = (r11 + -37)|0;
+if(!(uint(r11) >uint(8))) //_LBB709_45
+{
+	r13 = 1;
+	r11 = r13 << r11;
+	r11 = r11 & 325;
+	if(r11 !=0) //_LBB709_39
+{
+break _52;
+}
+}
+}
+else{
+if(!(uint(r11) >uint(19))) //_LBB709_45
+{
+	r13 = 1;
+	r11 = r13 << r11;
+	r11 = r11 & 665600;
+	if(r11 !=0) //_LBB709_39
+{
+break _52;
+}
+}
+}
+	r11 = 1;
+	r11 = r11 << r7;
+_60: while(true){
+	if(r9 ==0) //_LBB709_75
+{
+break _60;
+}
+else{
+	r13 = _ZN4__rw9__rw_catsE;
+	r14 = (r8 * 12)|0;
+	r13 = (r13 + r14)|0;
+	r13 = r13 >> 2;
+	r13 = heap32[(r13+2)];
+	r13 = r13 & r11;
+	if(r13 ==0) //_LBB709_46
+{
+	r5 = heapU8[r9];
+	if(r5 ==0) //_LBB709_48
+{
+	if(r3 !=0) //_LBB709_50
+{
+	r8 = 0;
+	r5 = r3;
+}
+else{
+	r8 = 0;
+	r5 = r4;
+}
+}
+else{
+	r5 = (r9 + 1)|0;
+	r8 = (r8 + 1)|0;
+}
+	r6 = heapU8[r5];
+	if(r6 ==59) //_LBB709_53
+{
+	r5 = (r5 + 1)|0;
+}
+	r6 = r12;
+	r13 = r12;
+_74: while(true){
+	r14 = heapU8[r5+r6];
+	if(r14 ==0) //_LBB709_70
+{
+__label__ = 65;
+break _74;
+}
+else{
+	r9 = (r5 + r6)|0;
+	if(r14 ==59) //_LBB709_66
+{
+__label__ = 62;
+break _74;
+}
+else{
+	r14 = heapU8[r9+1];
+	if(r14 ==0) //_LBB709_70
+{
+__label__ = 65;
+break _74;
+}
+else{
+	if(r14 ==59) //_LBB709_68
+{
+__label__ = 63;
+break _74;
+}
+else{
+	r14 = heapU8[r9+2];
+	if(r14 ==0) //_LBB709_70
+{
+__label__ = 65;
+break _74;
+}
+else{
+	r15 = r13 << 2;
+	if(r14 !=59) //_LBB709_62
+{
+	r9 = heapU8[r9+3];
+	if(r9 ==0) //_LBB709_70
+{
+__label__ = 65;
+break _74;
+}
+else{
+	if(r9 !=59) //_LBB709_65
+{
+	r13 = (r13 + 1)|0;
+	r6 = (r6 + 4)|0;
+}
+else{
+__label__ = 60;
+break _74;
+}
+}
+}
+else{
+__label__ = 57;
+break _74;
+}
+}
+}
+}
+}
+}
+}
+_84: do {
+switch(__label__ ){//multiple entries
+case 62:
+	if(r9 ==0) //_LBB709_70
+{
+__label__ = 65;
+break _84;
+}
+else{
+__label__ = 64;
+break _84;
+}
+break;
+case 63:
+	r9 = (r9 + 1)|0;
+__label__ = 64;
+break _84;
+break;
+case 60:
+	r6 = r15 | 3;
+	r9 = (r5 + r6)|0;
+__label__ = 64;
+break _84;
+break;
+case 57:
+	r6 = r15 | 2;
+	r9 = (r5 + r6)|0;
+__label__ = 64;
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 65:
+	r9 = _2E_str26;
+	r6 = 0;
+	r13 = heapU8[r5];
+	if(r13 ==0) //_LBB709_73
+{
+continue _60;
+}
+else{
+	r13 = (r5 + 1)|0;
+	r14 = 0;
+_92: while(true){
+	r6 = (r14 + 1)|0;
+	r9 = _2E_str26;
+	r15 = heapU8[r13+r14];
+	r14 = r6;
+if(!(r15 !=0)) //_LBB709_72
+{
+continue _60;
+}
+}
+}
+break;
+case 64:
+	r6 = (r9 - r5)|0;
+break;
+}
+}
+else{
+break _60;
+}
+}
+}
+	r11 = _2E_str538;
+	r10 = r10 == 0 ? r11 : r10;
+	r11 = heapU8[r10];
+_96: do {
+	if(r11 !=0) //_LBB709_77
+{
+	r12 = (r10 + 1)|0;
+	r13 = 0;
+_98: while(true){
+	r11 = (r13 + 1)|0;
+	r14 = heapU8[r12+r13];
+	r13 = r11;
+if(!(r14 !=0)) //_LBB709_78
+{
+break _96;
+}
+}
+}
+else{
+	r11 = 0;
+}
+} while(0);
+	if(r11 !=r6) //_LBB709_86
+{
+break _1;
+}
+else{
+	r11 = 0;
+_103: while(true){
+	r12 = (r6 + r11)|0;
+	if(r12 !=0) //_LBB709_81
+{
+	r12 = (r5 - r11)|0;
+	r13 = (r10 - r11)|0;
+	r11 = (r11 + -1)|0;
+	r12 = heapU8[r12];
+	r13 = heapU8[r13];
+	if(r12 !=r13) //_LBB709_86
+{
+break _1;
+}
+}
+else{
+break _52;
+}
+}
+}
+}
+} while(0);
+	r7 = (r7 + 1)|0;
+}
+else{
+break _49;
+}
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	_ZN4__rw11__rw_locale9_C_manageEPS0_PKc(i7);
+	return;
+}
+}
+} while(0);
+	r1 = heap32[(r2+39)];
+	r1 = (r1 + -1)|0;
+	heap32[(r2+39)] = r1;
+if(!(r1 !=0)) //_LBB709_89
+{
+	r0 = heap32[(r0)];
+if(!(r0 ==0)) //_LBB709_89
+{
+	heap32[(g0)] = r0;
+	_ZN4__rw11__rw_localeD2Ev(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+}
+}
+	return;
+}
+
+function _ZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE4init_2E_b;
+	r1 = heapU8[r0];
+if(!(r1 != 0)) //_LBB710_5
+{
+	r1 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize;
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+if(!(r1 ==0)) //_LBB710_4
+{
+	r2 = 0;
+_5: while(true){
+	r3 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs;
+	r3 = r3 >> 2;
+	r4 = r2 << 3;
+	r3 = heap32[(r3)];
+	r3 = (r3 + r4)|0;
+	r2 = (r2 + 1)|0;
+	r3 = r3 >> 2;
+	heap32[(r3)] = -1;
+if(!(uint(r2) <uint(r1))) //_LBB710_3
+{
+break _5;
+}
+}
+}
+	r1 = 1;
+	heap8[r0] = r1;
+}
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r2 = heap32[(r0)];
+_9: do {
+	if(r2 !=-1) //_LBB710_27
+{
+	if(r1 !=0) //_LBB710_30
+{
+	r3 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE10n_catalogs;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+	r5 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs;
+	r4 = (r4 + -1)|0;
+	r5 = r5 >> 2;
+	heap32[(r3)] = r4;
+	r3 = heap32[(r5)];
+	r2 = r2 << 3;
+	r2 = (r3 + r2)|0;
+	r4 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11largest_cat;
+	r2 = r2 >> 2;
+	heap32[(r2)] = -1;
+	r2 = r4 >> 2;
+	r0 = heap32[(r0)];
+	r4 = heap32[(r2)];
+	if(r0 ==r4) //_LBB710_32
+{
+__label__ = 33; //SET chanka
+_13: while(true){
+	if(r0 >-1) //_LBB710_33
+{
+	r6 = r0 << 3;
+	r6 = (r3 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	if(r6 ==-1) //_LBB710_35
+{
+	r0 = (r0 + -1)|0;
+}
+else{
+__label__ = 31;
+break _13;
+}
+}
+else{
+__label__ = 34;
+break _13;
+}
+}
+switch(__label__ ){//multiple entries
+case 34:
+	r0 = r4;
+break;
+case 31:
+	heap32[(r2)] = r0;
+break;
+}
+	if(uint(r0) >uint(3)) //_LBB710_31
+{
+__label__ = 40;
+break _9;
+}
+else{
+	r0 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11catalog_buf;
+	if(r3 ==r0) //_LBB710_31
+{
+__label__ = 40;
+break _9;
+}
+else{
+	r2 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 64;
+	memcpy(i7);
+if(!(r3 ==0)) //_LBB710_42
+{
+	heap32[(g0)] = r3;
+	_ZdaPv(i7);
+}
+	heap32[(r5)] = r0;
+__label__ = 40;
+break _9;
+}
+}
+}
+else{
+__label__ = 40;
+break _9;
+}
+}
+else{
+	r0 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	if(uint(r2) >=uint(r0)) //_LBB710_7
+{
+__label__ = 7;
+break _9;
+}
+else{
+	r0 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r1 = r2 << 3;
+	r0 = (r0 + r1)|0;
+	r_g0 = r0;
+	return;
+}
+}
+}
+else{
+	if(r1 !=0) //_LBB710_8
+{
+	r2 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE10n_catalogs;
+	r2 = r2 >> 2;
+	r3 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize;
+	r4 = heap32[(r2)];
+	r3 = r3 >> 2;
+	r5 = heap32[(r3)];
+	if(r4 ==r5) //_LBB710_12
+{
+	r4 = r4 << 4;
+	r5 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs;
+	heap32[(g0)] = r4;
+	_Znaj(i7);
+	r4 = r_g0;
+	r5 = r5 >> 2;
+	r6 = heap32[(r2)];
+	r7 = heap32[(r5)];
+	r8 = r6 << 3;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r7;
+	heap32[(g0+2)] = r8;
+	memcpy(i7);
+	r8 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11catalog_buf;
+if(!(r7 ==r8)) //_LBB710_14
+{
+	if(r7 !=0) //_LBB710_15
+{
+	heap32[(g0)] = r7;
+	_ZdaPv(i7);
+	r6 = heap32[(r2)];
+}
+}
+	heap32[(r5)] = r4;
+	r5 = heap32[(r3)];
+	r5 = r5 << 1;
+	heap32[(r3)] = r5;
+_36: do {
+if(!(uint(r6) >=uint(r5))) //_LBB710_20
+{
+	r3 = (r6 + 1)|0;
+_38: while(true){
+	r7 = r3 << 3;
+	r7 = (r4 + r7)|0;
+	r7 = r7 >> 2;
+	heap32[(r7+-2)] = -1;
+	if(uint(r3) >=uint(r5)) //_LBB710_20
+{
+break _36;
+}
+else{
+	r3 = (r3 + 1)|0;
+}
+}
+}
+} while(0);
+	r3 = r6 << 3;
+	r3 = (r4 + r3)|0;
+	heap32[(r0)] = r6;
+	r3 = (r3 + 4)|0;
+	r5 = (r1 + 4)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 4;
+	memcpy(i7);
+	r3 = heap32[(r0)];
+	r3 = r3 << 3;
+	r5 = r1 >> 2;
+	r3 = (r4 + r3)|0;
+	r4 = heap32[(r5)];
+	r3 = r3 >> 2;
+	heap32[(r3)] = r4;
+	r0 = heap32[(r0)];
+	r3 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11largest_cat;
+	r3 = r3 >> 2;
+	r4 = heap32[(r3)];
+if(!(uint(r0) <=uint(r4))) //_LBB710_22
+{
+	heap32[(r3)] = r0;
+}
+	r0 = (r6 + 1)|0;
+	heap32[(r2)] = r0;
+	r_g0 = r1;
+	return;
+}
+else{
+	r3 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs;
+	r3 = r3 >> 2;
+	heap32[(r0)] = 0;
+	r3 = heap32[(r3)];
+	r5 = r3 >> 2;
+	r5 = heap32[(r5)];
+_46: do {
+	if(r5 !=-1) //_LBB710_11
+{
+	r5 = 0;
+_48: while(true){
+	r6 = r5 << 3;
+	r6 = (r3 + r6)|0;
+	r5 = (r5 + 1)|0;
+	r6 = r6 >> 2;
+	heap32[(r0)] = r5;
+	r6 = heap32[(r6+2)];
+if(!(r6 !=-1)) //_LBB710_23
+{
+break _46;
+}
+}
+}
+else{
+	r5 = 0;
+}
+} while(0);
+	r6 = _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11largest_cat;
+	r6 = r6 >> 2;
+	r7 = heap32[(r6)];
+if(!(uint(r5) <=uint(r7))) //_LBB710_26
+{
+	heap32[(r6)] = r5;
+}
+	r5 = r5 << 3;
+	r5 = (r3 + r5)|0;
+	r5 = (r5 + 4)|0;
+	r6 = (r1 + 4)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = 4;
+	memcpy(i7);
+	r0 = heap32[(r0)];
+	r0 = r0 << 3;
+	r5 = r1 >> 2;
+	r0 = (r3 + r0)|0;
+	r3 = heap32[(r5)];
+	r0 = r0 >> 2;
+	r4 = (r4 + 1)|0;
+	heap32[(r0)] = r3;
+	heap32[(r2)] = r4;
+	r_g0 = r1;
+	return;
+}
+}
+else{
+__label__ = 7;
+}
+}
+} while(0);
+if (__label__ == 7){
+	r1 = 0;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN4__rw14__rw_cat_closeEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	heap32[(fp+-1)] = r0;
+if(!(r0 <0)) //_LBB711_20
+{
+	r0 = sp + -4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	_ZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataE(i7);
+	r1 = r_g0;
+if(!(r1 ==0)) //_LBB711_20
+{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+if(!(r2 ==-1)) //_LBB711_20
+{
+	r3 = _ZN4__rwL12__rw_catlistE_2E_1;
+	r4 = _ZN4__rwL12__rw_catlistE_2E_0;
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = heap32[(r3)];
+	r6 = (r6 - r5)|0;
+	r6 = r6 >> 2;
+	r7 = 0;
+_5: while(true){
+	if(uint(r6) >uint(r7)) //_LBB711_9
+{
+	r8 = r7 << 2;
+	r8 = (r5 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+	if(r8 ==0) //_LBB711_8
+{
+__label__ = 7;
+break _5;
+}
+else{
+	if(r8 !=r2) //_LBB711_6
+{
+	r7 = (r7 + 1)|0;
+}
+else{
+__label__ = 9;
+break _5;
+}
+}
+}
+else{
+__label__ = 7;
+break _5;
+}
+}
+if (__label__ == 7){
+	r7 = r6;
+}
+_13: do {
+if(!(uint(r6) <=uint(r7))) //_LBB711_19
+{
+	r2 = r7 << 2;
+	r6 = (r5 + r2)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	if(r6 !=0) //_LBB711_13
+{
+	heap32[(g0)] = r6;
+	_ZdlPv(i7);
+	r5 = heap32[(r4)];
+}
+	r2 = (r5 + r2)|0;
+	r4 = (r7 + 1)|0;
+	r2 = r2 >> 2;
+	heap32[(r2)] = 0;
+_18: while(true){
+	r2 = heap32[(r3)];
+	r2 = (r2 - r5)|0;
+	r2 = r2 >> 2;
+	if(uint(r2) <=uint(r4)) //_LBB711_19
+{
+break _13;
+}
+else{
+	r2 = r4 << 2;
+	r2 = (r5 + r2)|0;
+	r6 = r2 >> 2;
+	r2 = heap32[(r6)];
+	if(r2 !=0) //_LBB711_15
+{
+	r4 = (r4 + 1)|0;
+	heap32[(r6+-1)] = r2;
+}
+else{
+break _18;
+}
+}
+}
+	heap32[(r6)] = 0;
+}
+} while(0);
+	r2 = (r1 + 4)|0;
+	heap32[(g0)] = r2;
+	_ZNSt6localeD1Ev(i7);
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	_ZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataE(i7);
+	return;
+}
+}
+}
+	r0 = _2E_str115180;
+	r1 = _2E_str1116181;
+	heap32[(g0)] = 7;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	_ZN4__rw10__rw_throwEiz(i7);
+	return;
+}
+
+function _ZN4__rw16__rw_locale_nameEiPKcRNS_14__rw_pod_arrayIcLj256EEE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -368;var g0 = i7>>2; // save stack
+	r0 = _ZZN4__rw16__rw_locale_nameEiPKcRNS_14__rw_pod_arrayIcLj256EEEE11locale_root;
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heapU8[r0];
+	r5 = 0;
+	heap8[sp+-259] = r5;
+	r6 = heapU8[r2];
+_1: do {
+	if(r6 !=0) //_LBB712_2
+{
+	r7 = (r2 + 1)|0;
+_3: while(true){
+	r6 = (r5 + 1)|0;
+	r8 = heapU8[r7+r5];
+	r5 = r6;
+	if(r8 !=0) //_LBB712_3
+{
+continue _3;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	r6 = 0;
+}
+} while(0);
+	r4 = r4 & 255;
+_7: do {
+	if(r4 !=0) //_LBB712_6
+{
+	r4 = (r6 + 1)|0;
+	r5 = (r0 + 1)|0;
+_9: while(true){
+	r4 = (r4 + 1)|0;
+	r7 = (r5 + 1)|0;
+	r8 = heapU8[r5];
+	r5 = r7;
+if(!(r8 !=0)) //_LBB712_7
+{
+break _9;
+}
+}
+	if(uint(r4) >uint(258)) //_LBB712_5
+{
+__label__ = 5;
+}
+else{
+	r4 = sp + -259;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	strcpy(i7);
+	r0 = heapU8[sp+-259];
+_13: do {
+	if(r0 !=0) //_LBB712_11
+{
+	r0 = (r4 + 1)|0;
+	r7 = 0;
+_15: while(true){
+	r5 = (r7 + 1)|0;
+	r8 = heapU8[r0+r7];
+	r7 = r5;
+if(!(r8 !=0)) //_LBB712_12
+{
+break _13;
+}
+}
+}
+else{
+	r5 = 0;
+}
+} while(0);
+	r7 = 47;
+	r0 = (r5 + 1)|0;
+	r8 = 0;
+	heap8[r4+r5] = r7;
+	heap8[r4+r0] = r8;
+	r5 = heapU8[sp+-259];
+	if(r5 !=0) //_LBB712_15
+{
+	r5 = (r4 + 1)|0;
+_21: while(true){
+	r4 = (r8 + 1)|0;
+	r7 = heapU8[r5+r8];
+	r8 = r4;
+	if(r7 !=0) //_LBB712_16
+{
+continue _21;
+}
+else{
+__label__ = 17;
+break _7;
+}
+}
+}
+else{
+	r4 = 0;
+__label__ = 17;
+}
+}
+}
+else{
+__label__ = 5;
+}
+} while(0);
+if (__label__ == 5){
+	r0 = 0;
+	r4 = r0;
+}
+	r4 = (r4 + r6)|0;
+if(!(uint(r4) >uint(258))) //_LBB712_33
+{
+	r4 = sp + -259;
+	r0 = (r4 + r0)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	strcpy(i7);
+	r0 = _2E_str37683;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB712_28
+{
+	r1 = heapU8[r2];
+_31: do {
+	if(r1 !=0) //_LBB712_30
+{
+	r0 = (r2 + 1)|0;
+	r4 = 0;
+_33: while(true){
+	r1 = (r4 + 1)|0;
+	r5 = heapU8[r0+r4];
+	r4 = r1;
+if(!(r5 !=0)) //_LBB712_31
+{
+break _31;
+}
+}
+}
+else{
+	r1 = 0;
+}
+} while(0);
+	r0 = r3 >> 2;
+	heap32[(r0)] = 0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	_ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(i7);
+	r1 = heap32[(r0+1)];
+	r_g0 = r1;
+	return;
+}
+else{
+	r2 = _2E_str1648;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	fopen(i7);
+	r2 = r_g0;
+if(!(r2 ==0)) //_LBB712_33
+{
+	if(uint(r2) <uint(10)) //_LBB712_22
+{
+	r3 = _ZL13s_file_stdout;
+	r0 = r3 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+7)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+}
+else{
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r3 = r2;
+}
+	r0 = r3 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+5)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	if(uint(r2) >uint(9)) //_LBB712_25
+{
+	r3 = r2;
+}
+else{
+	r3 = _ZL13s_file_stdout;
+}
+	r0 = r3 >> 2;
+	r0 = heap32[(r0)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+if(!(uint(r2) <uint(10))) //_LBB712_33
+{
+	heap32[(g0)] = r3;
+	_ZdlPv(i7);
+}
+}
+}
+}
+	r0 = sp + -352;
+	r0 = r0 >> 2;
+	heap32[(r0+20)] = 0;
+	heap32[(r0+22)] = r1;
+	heap32[(r0+21)] = 0;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNKSt8messagesIcE8do_closeEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	_ZN4__rw14__rw_cat_closeEi(i7);
+	return;
+}
+
+function _ZNKSt8messagesIcE6do_getEiiiRKSs(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	heap32[(fp+-1)] = r0;
+if(!(r0 <0)) //_LBB714_8
+{
+	r0 = sp + -4;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	_ZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataE(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB714_8
+{
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+if(!(r0 ==-1)) //_LBB714_8
+{
+	r1 = _ZN4__rwL12__rw_catlistE_2E_1;
+	r2 = _ZN4__rwL12__rw_catlistE_2E_0;
+	r1 = r1 >> 2;
+	r2 = r2 >> 2;
+	r2 = heap32[(r2)];
+	r1 = heap32[(r1)];
+	r1 = (r1 - r2)|0;
+	r1 = r1 >> 2;
+	r3 = 0;
+_5: while(true){
+	if(uint(r1) <=uint(r3)) //_LBB714_8
+{
+break _5;
+}
+else{
+	r4 = r3 << 2;
+	r4 = (r2 + r4)|0;
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r4 ==0) //_LBB714_8
+{
+break _5;
+}
+else{
+	if(r4 !=r0) //_LBB714_4
+{
+	r3 = (r3 + 1)|0;
+continue _5;
+}
+else{
+break _5;
+}
+}
+}
+}
+}
+}
+}
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+5)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+-3)];
+	if(r4 ==-1) //_LBB714_11
+{
+	r2 = heap32[(r3+-1)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r2;
+	_ZNSs10_C_get_repEjj(i7);
+	r0 = r0 >> 2;
+	r3 = (r_g0 + 12)|0;
+	heap32[(r0)] = r3;
+	r0 = heap32[(r1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+}
+else{
+	r1 = (r2 + -12)|0;
+	r0 = r0 >> 2;
+	r3 = _ZNSs11_C_null_refE;
+	heap32[(r0)] = r2;
+if(!(r1 ==r3)) //_LBB714_12
+{
+	r0 = r1 >> 2;
+	r1 = (r4 + 1)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+}
+	return;
+}
+
+function _ZNKSt8messagesIcE7do_openERKSsRKSt6locale(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	heap32[(g0)] = 1;
+	_Znwj(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB715_2
+{
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+}
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNSt8messagesIcED0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN4__rw10__rw_facetE;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(r2+5)] = -1;
+	r1 = heap32[(r2+1)];
+	r3 = heap32[(r2+2)];
+if(!(r1 ==r3)) //_LBB716_3
+{
+if(!(r1 ==0)) //_LBB716_3
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+}
+	r1 = _ZZN4__rw10__rw_facetD4EvE9destroyed;
+	heap32[(r2+1)] = r1;
+	r1 = heap32[(r2+4)];
+if(!(r1 !=-1)) //_LBB716_5
+{
+	r1 = heap32[(r2+3)];
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+}
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNSt8messagesIcED1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVN4__rw10__rw_facetE;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	heap32[(r0+5)] = -1;
+	r1 = heap32[(r0+1)];
+	r2 = heap32[(r0+2)];
+if(!(r1 ==r2)) //_LBB717_3
+{
+if(!(r1 ==0)) //_LBB717_3
+{
+	heap32[(g0)] = r1;
+	_ZdaPv(i7);
+}
+}
+	r1 = _ZZN4__rw10__rw_facetD4EvE9destroyed;
+	heap32[(r0+1)] = r1;
+	r1 = heap32[(r0+4)];
+if(!(r1 !=-1)) //_LBB717_5
+{
+	r0 = heap32[(r0+3)];
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+}
+	return;
+}
+
+function _ZN4__rw14__rw_pod_arrayIcLj256EE6appendEPKcj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(r1)];
+	r4 = (r3 + r2)|0;
+	r5 = heap32[(fp+1)];
+	if(uint(r4) >uint(255)) //_LBB718_2
+{
+	r3 = (r4 + 1)|0;
+	heap32[(g0)] = r3;
+	_Znaj(i7);
+	r7 = r_g0;
+	r3 = heap32[(r1)];
+	r6 = heap32[(r1+1)];
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r3;
+	memcpy(i7);
+	r3 = heap32[(r1+1)];
+	r6 = (r0 + 8)|0;
+if(!(r3 ==r6)) //_LBB718_5
+{
+if(!(r3 ==0)) //_LBB718_5
+{
+	heap32[(g0)] = r3;
+	_ZdaPv(i7);
+}
+}
+	r6 = (r0 + 4)|0;
+	heap32[(r1+1)] = r7;
+	r3 = heap32[(r1)];
+}
+else{
+	r6 = (r0 + 4)|0;
+	r7 = heap32[(r1+1)];
+}
+	r3 = (r7 + r3)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r2 = r6 >> 2;
+	heap32[(r1)] = r4;
+	r1 = heap32[(r2)];
+	r2 = 0;
+	heap8[r1+r4] = r2;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNSs10_C_get_repEjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+_1: do {
+	if(uint(r0) <uint(-13)) //_LBB719_4
+{
+	if(uint(r0) <uint(r1)) //_LBB719_6
+{
+	r2 = _2E_str4362;
+	r3 = _2E_str3361;
+	heap32[(g0)] = 8;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r0;
+	_ZN4__rw10__rw_throwEiz(i7);
+__label__ = 6;
+break _1;
+}
+else{
+__label__ = 6;
+break _1;
+}
+}
+else{
+	if(uint(r1) >uint(-14)) //_LBB719_3
+{
+	r0 = _2E_str2360;
+	r2 = _2E_str3361;
+	heap32[(g0)] = 8;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = -14;
+	_ZN4__rw10__rw_throwEiz(i7);
+	r0 = r1;
+__label__ = 8;
+}
+else{
+	r0 = r1;
+__label__ = 6;
+}
+}
+} while(0);
+if (__label__ == 6){
+	if(r0 ==0) //_LBB719_9
+{
+	r0 = _ZNSs11_C_null_refE;
+	r_g0 = r0;
+	return;
+}
+}
+	r2 = (r0 + 14)|0;
+	heap32[(g0)] = r2;
+	_Znwj(i7);
+	r2 = r_g0;
+if(!(r2 !=0)) //_LBB719_12
+{
+	heap32[(g0)] = 3;
+	_ZN4__rw10__rw_throwEiz(i7);
+}
+	r3 = r2 >> 2;
+	heap32[(r3)] = 0;
+	heap32[(r3+1)] = r0;
+	r0 = (r1 + r2)|0;
+	r4 = 0;
+	heap32[(r3+2)] = r1;
+	heap8[r0+12] = r4;
+	r_g0 = r2;
+	return;
+}
+
+function _ZNKSt9type_info15__is_function_pEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNSt9type_infoD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNSt9type_infoD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function block_merge_next(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+1)];
+	r2 = (r2 + -4)|0;
+	r2 = r2 & -4;
+	r3 = (r0 + 8)|0;
+	r4 = (r2 + 4)|0;
+	r4 = (r3 + r4)|0;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+	r6 = r5 & 1;
+if(!(r6 ==0)) //_LBB723_9
+{
+	r6 = heap32[(fp)];
+	r7 = (r3 + r2)|0;
+	r8 = r5 & -4;
+	if(uint(r8) >uint(255)) //_LBB723_3
+{
+	r5 = r8 >>> 1;
+	r5 = r8 | r5;
+	r9 = r5 >>> 2;
+	r5 = r5 | r9;
+	r9 = r5 >>> 4;
+	r5 = r5 | r9;
+	r9 = r5 >>> 8;
+	r5 = r5 | r9;
+	r9 = r5 >>> 16;
+	r5 = r5 | r9;
+	r9 = r5 ^ -1;
+	r10 = 1431655765;
+	r9 = r9 >>> 1;
+	r5 = r10 & (~r5);
+	r9 = r9 & 1431655765;
+	r5 = (r5 + r9)|0;
+	r9 = r5 >>> 2;
+	r5 = r5 & 858993459;
+	r9 = r9 & 858993459;
+	r5 = (r5 + r9)|0;
+	r9 = r5 >>> 4;
+	r5 = r5 & 252645135;
+	r9 = r9 & 252645135;
+	r5 = (r5 + r9)|0;
+	r9 = r5 >>> 8;
+	r5 = r5 & 16711935;
+	r9 = r9 & 16711935;
+	r5 = (r5 + r9)|0;
+	r9 = r5 & 65535;
+	r5 = r5 >>> 16;
+	r10 = 26;
+	r5 = (r9 + r5)|0;
+	r9 = (r10 - r5)|0;
+	r8 = r8 >>> r9;
+	r9 = 24;
+	r8 = r8 ^ 32;
+	r5 = (r9 - r5)|0;
+}
+else{
+	r8 = r5 >>> 3;
+	r5 = 0;
+}
+	r2 = (r2 + r3)|0;
+	r2 = r2 >> 2;
+	r9 = r5 << 7;
+	r10 = heap32[(r2+2)];
+	r2 = heap32[(r2+3)];
+	r9 = (r6 + r9)|0;
+	r11 = r8 << 2;
+	r9 = (r9 + r11)|0;
+	r11 = r10 >> 2;
+	r12 = r2 >> 2;
+	heap32[(r11+3)] = r2;
+	r2 = r9 >> 2;
+	heap32[(r12+2)] = r10;
+	r2 = heap32[(r2+24)];
+if(!(r2 !=r7)) //_LBB723_8
+{
+	r2 = (r9 + 96)|0;
+	r2 = r2 >> 2;
+	r7 = block_null;
+	heap32[(r2)] = r10;
+if(!(r10 !=r7)) //_LBB723_8
+{
+	r2 = r5 << 2;
+	r2 = (r6 + r2)|0;
+	r2 = r2 >> 2;
+	r7 = 1;
+	r8 = r7 << r8;
+	r9 = heap32[(r2+1)];
+	r8 = r9 & (~r8);
+	heap32[(r2+1)] = r8;
+if(!(r8 !=0)) //_LBB723_8
+{
+	r2 = r6 >> 2;
+	r5 = r7 << r5;
+	r6 = heap32[(r2)];
+	r5 = r6 & (~r5);
+	heap32[(r2)] = r5;
+}
+}
+}
+	r2 = heap32[(r4)];
+	r4 = heap32[(r1+1)];
+	r2 = r2 & -4;
+	r2 = (r2 + r4)|0;
+	r4 = r2 & -4;
+	r3 = (r3 + r4)|0;
+	r2 = (r2 + 4)|0;
+	r3 = r3 >> 2;
+	heap32[(r1+1)] = r2;
+	heap32[(r3)] = r0;
+}
+	r_g0 = r0;
+	return;
+}
+
+function tlsf_free(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+if(!(r0 ==0)) //_LBB724_15
+{
+	r1 = heap32[(fp)];
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+-1)];
+	r4 = s_current_memory;
+	r5 = (r3 + -4)|0;
+	r4 = r4 >> 2;
+	r5 = r5 & -4;
+	r6 = heap32[(r4)];
+	r3 = r3 & -4;
+	r5 = (r0 + r5)|0;
+	r3 = (r6 - r3)|0;
+	r0 = (r0 + -8)|0;
+	r5 = r5 >> 2;
+	heap32[(r4)] = r3;
+	heap32[(r5)] = r0;
+	r3 = heap32[(r5+1)];
+	r3 = r3 | 2;
+	heap32[(r5+1)] = r3;
+	r3 = heap32[(r2+-1)];
+	r4 = r3 | 1;
+	heap32[(r2+-1)] = r4;
+	r3 = r3 & 2;
+	if(r3 !=0) //_LBB724_3
+{
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+1)];
+	r5 = r4 & -4;
+	if(uint(r5) >uint(255)) //_LBB724_5
+{
+	r4 = r5 >>> 1;
+	r4 = r5 | r4;
+	r6 = r4 >>> 2;
+	r4 = r4 | r6;
+	r6 = r4 >>> 4;
+	r4 = r4 | r6;
+	r6 = r4 >>> 8;
+	r4 = r4 | r6;
+	r6 = r4 >>> 16;
+	r4 = r4 | r6;
+	r6 = r4 ^ -1;
+	r7 = 1431655765;
+	r6 = r6 >>> 1;
+	r4 = r7 & (~r4);
+	r6 = r6 & 1431655765;
+	r4 = (r4 + r6)|0;
+	r6 = r4 >>> 2;
+	r4 = r4 & 858993459;
+	r6 = r6 & 858993459;
+	r4 = (r4 + r6)|0;
+	r6 = r4 >>> 4;
+	r4 = r4 & 252645135;
+	r6 = r6 & 252645135;
+	r4 = (r4 + r6)|0;
+	r6 = r4 >>> 8;
+	r4 = r4 & 16711935;
+	r6 = r6 & 16711935;
+	r4 = (r4 + r6)|0;
+	r6 = r4 & 65535;
+	r4 = r4 >>> 16;
+	r7 = 26;
+	r4 = (r6 + r4)|0;
+	r6 = (r7 - r4)|0;
+	r5 = r5 >>> r6;
+	r6 = 24;
+	r5 = r5 ^ 32;
+	r4 = (r6 - r4)|0;
+}
+else{
+	r5 = r4 >>> 3;
+	r4 = 0;
+}
+	r6 = r4 << 7;
+	r7 = heap32[(r3+2)];
+	r8 = heap32[(r3+3)];
+	r6 = (r1 + r6)|0;
+	r9 = r5 << 2;
+	r6 = (r6 + r9)|0;
+	r9 = r7 >> 2;
+	r10 = r8 >> 2;
+	heap32[(r9+3)] = r8;
+	r8 = r6 >> 2;
+	heap32[(r10+2)] = r7;
+	r8 = heap32[(r8+24)];
+if(!(r8 !=r0)) //_LBB724_10
+{
+	r6 = (r6 + 96)|0;
+	r6 = r6 >> 2;
+	r8 = block_null;
+	heap32[(r6)] = r7;
+if(!(r7 !=r8)) //_LBB724_10
+{
+	r6 = r4 << 2;
+	r6 = (r1 + r6)|0;
+	r6 = r6 >> 2;
+	r7 = 1;
+	r5 = r7 << r5;
+	r8 = heap32[(r6+1)];
+	r5 = r8 & (~r5);
+	heap32[(r6+1)] = r5;
+if(!(r5 !=0)) //_LBB724_10
+{
+	r5 = r1 >> 2;
+	r4 = r7 << r4;
+	r6 = heap32[(r5)];
+	r4 = r6 & (~r4);
+	heap32[(r5)] = r4;
+}
+}
+}
+	r4 = (r0 + 8)|0;
+	r2 = heap32[(r2+-1)];
+	r5 = heap32[(r3+1)];
+	r2 = r2 & -4;
+	r2 = (r2 + r5)|0;
+	r5 = r2 & -4;
+	r4 = (r4 + r5)|0;
+	r2 = (r2 + 4)|0;
+	r4 = r4 >> 2;
+	heap32[(r3+1)] = r2;
+	heap32[(r4)] = r0;
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	block_merge_next(i7);
+	r0 = r_g0;
+	r2 = r0 >> 2;
+	r2 = heap32[(r2+1)];
+	r3 = r2 & -4;
+	if(uint(r3) >uint(255)) //_LBB724_13
+{
+	r2 = r3 >>> 1;
+	r2 = r3 | r2;
+	r4 = r2 >>> 2;
+	r2 = r2 | r4;
+	r4 = r2 >>> 4;
+	r2 = r2 | r4;
+	r4 = r2 >>> 8;
+	r2 = r2 | r4;
+	r4 = r2 >>> 16;
+	r2 = r2 | r4;
+	r4 = r2 ^ -1;
+	r5 = 1431655765;
+	r4 = r4 >>> 1;
+	r2 = r5 & (~r2);
+	r4 = r4 & 1431655765;
+	r2 = (r2 + r4)|0;
+	r4 = r2 >>> 2;
+	r2 = r2 & 858993459;
+	r4 = r4 & 858993459;
+	r2 = (r2 + r4)|0;
+	r4 = r2 >>> 4;
+	r2 = r2 & 252645135;
+	r4 = r4 & 252645135;
+	r2 = (r2 + r4)|0;
+	r4 = r2 >>> 8;
+	r2 = r2 & 16711935;
+	r4 = r4 & 16711935;
+	r2 = (r2 + r4)|0;
+	r4 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r5 = 26;
+	r2 = (r4 + r2)|0;
+	r4 = (r5 - r2)|0;
+	r3 = r3 >>> r4;
+	r4 = 24;
+	r3 = r3 ^ 32;
+	r2 = (r4 - r2)|0;
+}
+else{
+	r3 = r2 >>> 3;
+	r2 = 0;
+}
+	r4 = r2 << 7;
+	r4 = (r1 + r4)|0;
+	r5 = r3 << 2;
+	r4 = (r4 + r5)|0;
+	r4 = r4 >> 2;
+	r5 = heap32[(r4+24)];
+	r6 = r0 >> 2;
+	r7 = block_null;
+	heap32[(r6+2)] = r5;
+	r5 = r5 >> 2;
+	heap32[(r6+3)] = r7;
+	heap32[(r5+3)] = r0;
+	r5 = 1;
+	r6 = r1 >> 2;
+	heap32[(r4+24)] = r0;
+	r0 = r2 << 2;
+	r2 = r5 << r2;
+	r4 = heap32[(r6)];
+	r0 = (r1 + r0)|0;
+	r1 = r4 | r2;
+	r0 = r0 >> 2;
+	heap32[(r6)] = r1;
+	r1 = r5 << r3;
+	r2 = heap32[(r0+1)];
+	r1 = r2 | r1;
+	heap32[(r0+1)] = r1;
+}
+	return;
+}
+
+function block_prepare_used(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	if(r0 ==0) //_LBB725_8
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r1 = heap32[(fp+2)];
+	r2 = r0 >> 2;
+	r3 = heap32[(r2+1)];
+	r4 = r3 & -4;
+	r5 = (r1 + 16)|0;
+	if(uint(r4) >=uint(r5)) //_LBB725_3
+{
+	r3 = heap32[(fp)];
+	r5 = (r0 + 8)|0;
+	r6 = (r5 + r1)|0;
+	r7 = r6 >> 2;
+	r8 = -4;
+	r9 = heap32[(r7)];
+	r8 = (r8 - r1)|0;
+	r9 = r9 & 3;
+	r4 = (r8 + r4)|0;
+	r4 = r9 | r4;
+	heap32[(r7)] = r4;
+	r4 = heap32[(r2+1)];
+	r4 = r4 & 3;
+	r4 = r4 | r1;
+	heap32[(r2+1)] = r4;
+	r4 = heap32[(r7)];
+	r4 = (r4 + -4)|0;
+	r8 = (r1 + 4)|0;
+	r4 = r4 & -4;
+	r1 = (r1 + 8)|0;
+	r9 = (r4 + r8)|0;
+	r4 = (r4 + r1)|0;
+	r9 = (r5 + r9)|0;
+	r4 = (r5 + r4)|0;
+	r6 = (r6 + -4)|0;
+	r9 = r9 >> 2;
+	r4 = r4 >> 2;
+	heap32[(r9)] = r6;
+	r9 = heap32[(r4)];
+	r9 = r9 | 2;
+	heap32[(r4)] = r9;
+	r4 = heap32[(r7)];
+	r4 = r4 | 1;
+	heap32[(r7)] = r4;
+	r4 = heap32[(r2+1)];
+	r4 = (r4 + -4)|0;
+	r4 = r4 & -4;
+	r4 = (r5 + r4)|0;
+	r4 = r4 >> 2;
+	heap32[(r4)] = r0;
+	r4 = heap32[(r7)];
+	r9 = r4 & -4;
+	r10 = r4 | 2;
+	heap32[(r7)] = r10;
+	if(uint(r9) >uint(255)) //_LBB725_5
+{
+	r4 = r9 >>> 1;
+	r4 = r9 | r4;
+	r7 = r4 >>> 2;
+	r4 = r4 | r7;
+	r7 = r4 >>> 4;
+	r4 = r4 | r7;
+	r7 = r4 >>> 8;
+	r4 = r4 | r7;
+	r7 = r4 >>> 16;
+	r4 = r4 | r7;
+	r7 = r4 ^ -1;
+	r10 = 1431655765;
+	r7 = r7 >>> 1;
+	r4 = r10 & (~r4);
+	r7 = r7 & 1431655765;
+	r4 = (r4 + r7)|0;
+	r7 = r4 >>> 2;
+	r4 = r4 & 858993459;
+	r7 = r7 & 858993459;
+	r4 = (r4 + r7)|0;
+	r7 = r4 >>> 4;
+	r4 = r4 & 252645135;
+	r7 = r7 & 252645135;
+	r4 = (r4 + r7)|0;
+	r7 = r4 >>> 8;
+	r4 = r4 & 16711935;
+	r7 = r7 & 16711935;
+	r4 = (r4 + r7)|0;
+	r7 = r4 & 65535;
+	r4 = r4 >>> 16;
+	r10 = 26;
+	r4 = (r7 + r4)|0;
+	r7 = (r10 - r4)|0;
+	r9 = r9 >>> r7;
+	r7 = 24;
+	r9 = r9 ^ 32;
+	r4 = (r7 - r4)|0;
+}
+else{
+	r9 = r4 >>> 3;
+	r4 = 0;
+}
+	r7 = r4 << 7;
+	r7 = (r3 + r7)|0;
+	r10 = r9 << 2;
+	r7 = (r7 + r10)|0;
+	r7 = r7 >> 2;
+	r8 = (r5 + r8)|0;
+	r1 = (r5 + r1)|0;
+	r5 = heap32[(r7+24)];
+	r8 = r8 >> 2;
+	r1 = r1 >> 2;
+	r10 = block_null;
+	heap32[(r8)] = r5;
+	r5 = r5 >> 2;
+	heap32[(r1)] = r10;
+	heap32[(r5+3)] = r6;
+	r1 = 1;
+	r5 = r3 >> 2;
+	heap32[(r7+24)] = r6;
+	r6 = r4 << 2;
+	r4 = r1 << r4;
+	r7 = heap32[(r5)];
+	r3 = (r3 + r6)|0;
+	r4 = r7 | r4;
+	r3 = r3 >> 2;
+	heap32[(r5)] = r4;
+	r1 = r1 << r9;
+	r4 = heap32[(r3+1)];
+	r1 = r4 | r1;
+	heap32[(r3+1)] = r1;
+	r3 = heap32[(r2+1)];
+}
+	r1 = r3 & -4;
+	r0 = (r0 + 8)|0;
+	r1 = (r0 + r1)|0;
+	r1 = r1 >> 2;
+	r3 = heap32[(r1)];
+	r3 = r3 & -3;
+	heap32[(r1)] = r3;
+	r1 = heap32[(r2+1)];
+	r1 = r1 & -2;
+	heap32[(r2+1)] = r1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function block_locate_free(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+_1: do {
+if(!(r0 ==0)) //_LBB726_16
+{
+	r1 = heap32[(fp)];
+	if(uint(r0) >uint(31)) //_LBB726_3
+{
+	r2 = r0 >>> 1;
+	r2 = r0 | r2;
+	r3 = r2 >>> 2;
+	r2 = r2 | r3;
+	r3 = r2 >>> 4;
+	r2 = r2 | r3;
+	r3 = r2 >>> 8;
+	r2 = r2 | r3;
+	r3 = r2 >>> 16;
+	r2 = r2 | r3;
+	r3 = r2 ^ -1;
+	r4 = 1431655765;
+	r3 = r3 >>> 1;
+	r2 = r4 & (~r2);
+	r3 = r3 & 1431655765;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 2;
+	r2 = r2 & 858993459;
+	r3 = r3 & 858993459;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 4;
+	r2 = r2 & 252645135;
+	r3 = r3 & 252645135;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 8;
+	r2 = r2 & 16711935;
+	r3 = r3 & 16711935;
+	r2 = (r2 + r3)|0;
+	r3 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r5 = 26;
+	r2 = (r3 + r2)|0;
+	r3 = 1;
+	r2 = (r5 - r2)|0;
+	r2 = r3 << r2;
+	r0 = (r0 + r2)|0;
+	r0 = (r0 + -1)|0;
+	if(uint(r0) >uint(255)) //_LBB726_5
+{
+	r2 = r0 >>> 1;
+	r2 = r0 | r2;
+	r3 = r2 >>> 2;
+	r2 = r2 | r3;
+	r3 = r2 >>> 4;
+	r2 = r2 | r3;
+	r3 = r2 >>> 8;
+	r2 = r2 | r3;
+	r3 = r2 >>> 16;
+	r2 = r2 | r3;
+	r3 = r2 ^ -1;
+	r3 = r3 >>> 1;
+	r4 = r4 & (~r2);
+	r2 = r3 & 1431655765;
+	r4 = (r4 + r2)|0;
+	r2 = r4 >>> 2;
+	r4 = r4 & 858993459;
+	r2 = r2 & 858993459;
+	r4 = (r4 + r2)|0;
+	r2 = r4 >>> 4;
+	r4 = r4 & 252645135;
+	r2 = r2 & 252645135;
+	r4 = (r4 + r2)|0;
+	r2 = r4 >>> 8;
+	r4 = r4 & 16711935;
+	r2 = r2 & 16711935;
+	r4 = (r4 + r2)|0;
+	r2 = r4 & 65535;
+	r4 = r4 >>> 16;
+	r4 = (r2 + r4)|0;
+	r2 = (r5 - r4)|0;
+	r0 = r0 >>> r2;
+	r2 = 24;
+	r0 = r0 ^ 32;
+	r4 = (r2 - r4)|0;
+__label__ = 5;
+}
+else{
+__label__ = 3;
+}
+}
+else{
+__label__ = 3;
+}
+if (__label__ == 3){
+	r0 = r0 >>> 3;
+	r4 = 0;
+}
+	r2 = r4 << 2;
+	r2 = (r1 + r2)|0;
+	r2 = r2 >> 2;
+	r3 = -1;
+	r2 = heap32[(r2+1)];
+	r0 = r3 << r0;
+	r0 = r2 & r0;
+	if(r0 ==0) //_LBB726_8
+{
+	r0 = r1 >> 2;
+	r4 = (r4 + 1)|0;
+	r0 = heap32[(r0)];
+	r4 = r3 << r4;
+	r0 = r0 & r4;
+	if(r0 ==0) //_LBB726_16
+{
+break _1;
+}
+else{
+	r4 = (r0 + -1)|0;
+	r0 = r4 & (~r0);
+	r4 = r0 >>> 1;
+	r0 = r0 & 1431655765;
+	r4 = r4 & 1431655765;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 2;
+	r0 = r0 & 858993459;
+	r4 = r4 & 858993459;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 4;
+	r0 = r0 & 252645135;
+	r4 = r4 & 252645135;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 8;
+	r0 = r0 & 16711935;
+	r4 = r4 & 16711935;
+	r0 = (r0 + r4)|0;
+	r4 = r0 & 65535;
+	r0 = r0 >>> 16;
+	r4 = (r4 + r0)|0;
+	r0 = r4 << 2;
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+}
+}
+	r2 = (r0 + -1)|0;
+	r2 = r2 & (~r0);
+	r5 = r2 >>> 1;
+	r2 = r2 & 1431655765;
+	r5 = r5 & 1431655765;
+	r2 = (r2 + r5)|0;
+	r5 = r2 >>> 2;
+	r2 = r2 & 858993459;
+	r5 = r5 & 858993459;
+	r2 = (r2 + r5)|0;
+	r5 = r2 >>> 4;
+	r2 = r2 & 252645135;
+	r5 = r5 & 252645135;
+	r2 = (r2 + r5)|0;
+	r5 = r2 >>> 8;
+	r2 = r2 & 16711935;
+	r5 = r5 & 16711935;
+	r2 = (r2 + r5)|0;
+	r5 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r2 = (r5 + r2)|0;
+	r0 = r0 == 0 ? r3 : r2;
+	r2 = r4 << 7;
+	r2 = (r1 + r2)|0;
+	r3 = r0 << 2;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >> 2;
+	r3 = heap32[(r3+24)];
+if(!(r3 ==0)) //_LBB726_16
+{
+	r2 = (r2 + 96)|0;
+	r5 = r3 >> 2;
+	r6 = heap32[(r5+2)];
+	r5 = heap32[(r5+3)];
+	r7 = r6 >> 2;
+	r8 = r5 >> 2;
+	heap32[(r7+3)] = r5;
+	r2 = r2 >> 2;
+	heap32[(r8+2)] = r6;
+	r5 = heap32[(r2)];
+if(!(r5 !=r3)) //_LBB726_15
+{
+	r5 = block_null;
+	heap32[(r2)] = r6;
+if(!(r6 !=r5)) //_LBB726_15
+{
+	r2 = r4 << 2;
+	r2 = (r1 + r2)|0;
+	r2 = r2 >> 2;
+	r5 = 1;
+	r0 = r5 << r0;
+	r6 = heap32[(r2+1)];
+	r0 = r6 & (~r0);
+	heap32[(r2+1)] = r0;
+if(!(r0 !=0)) //_LBB726_15
+{
+	r0 = r1 >> 2;
+	r1 = r5 << r4;
+	r2 = heap32[(r0)];
+	r1 = r2 & (~r1);
+	heap32[(r0)] = r1;
+}
+}
+}
+	r_g0 = r3;
+	return;
+}
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function tlsf_malloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = (r0 + -1)|0;
+	if(uint(r2) <uint(1073741823)) //_LBB727_2
+{
+	r0 = (r0 + 7)|0;
+	r0 = r0 & -8;
+	r2 = 12;
+	r0 = uint(r0) < uint(r2) ? r2 : r0;
+}
+else{
+	r0 = 0;
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	block_locate_free(i7);
+	r2 = r_g0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r0;
+	r0 = s_current_memory;
+	block_prepare_used(i7);
+	r1 = r_g0;
+	r2 = r2 >> 2;
+	r0 = r0 >> 2;
+	r2 = heap32[(r2+1)];
+	r3 = heap32[(r0)];
+	r2 = r2 & -4;
+	r2 = (r3 + r2)|0;
+	r3 = s_max_memory;
+	r3 = r3 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3)];
+if(!(uint(r2) <=uint(r0))) //_LBB727_5
+{
+	heap32[(r3)] = r2;
+}
+	r_g0 = r1;
+	return;
+}
+
+function tlsf_realloc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+if(!(r0 ==0)) //_LBB728_3
+{
+if(!(r2 !=0)) //_LBB728_3
+{
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	tlsf_free(i7);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+	if(r0 !=0) //_LBB728_10
+{
+	r3 = r0 >> 2;
+	r4 = heap32[(r3+-1)];
+	r5 = r4 & -4;
+	r6 = (r0 + r5)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+	r7 = r6 & -4;
+	r7 = (r5 + r7)|0;
+	r8 = (r2 + -1)|0;
+	r9 = (r0 + -8)|0;
+	r7 = (r7 + 4)|0;
+	if(uint(r8) <uint(1073741823)) //_LBB728_12
+{
+	r10 = (r2 + 7)|0;
+	r10 = r10 & -8;
+	r11 = 12;
+	r10 = uint(r10) < uint(r11) ? r11 : r10;
+}
+else{
+	r10 = 0;
+}
+_11: do {
+	if(uint(r10) >uint(r5)) //_LBB728_15
+{
+	r4 = r6 & 1;
+if(!(r4 ==0)) //_LBB728_17
+{
+	if(uint(r10) <=uint(r7)) //_LBB728_24
+{
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r9;
+	block_merge_next(i7);
+	r4 = heap32[(r3+-1)];
+	r4 = r4 & -4;
+	r4 = (r0 + r4)|0;
+	r4 = r4 >> 2;
+	r9 = heap32[(r4)];
+	r9 = r9 & -3;
+	heap32[(r4)] = r9;
+	r4 = heap32[(r3+-1)];
+	r4 = r4 & -2;
+	heap32[(r3+-1)] = r4;
+break _11;
+}
+}
+	if(uint(r8) <uint(1073741823)) //_LBB728_19
+{
+	r3 = (r2 + 7)|0;
+	r3 = r3 & -8;
+	r4 = 12;
+	r3 = uint(r3) < uint(r4) ? r4 : r3;
+}
+else{
+	r3 = 0;
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r3;
+	block_locate_free(i7);
+	r4 = r_g0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r3;
+	r3 = s_current_memory;
+	block_prepare_used(i7);
+	r9 = r_g0;
+	r4 = r4 >> 2;
+	r3 = r3 >> 2;
+	r4 = heap32[(r4+1)];
+	r10 = heap32[(r3)];
+	r4 = r4 & -4;
+	r4 = (r10 + r4)|0;
+	r10 = s_max_memory;
+	r10 = r10 >> 2;
+	heap32[(r3)] = r4;
+	r3 = heap32[(r10)];
+if(!(uint(r4) <=uint(r3))) //_LBB728_22
+{
+	heap32[(r10)] = r4;
+}
+	if(r9 ==0) //_LBB728_34
+{
+	r_g0 = r9;
+	return;
+}
+else{
+	r3 = uint(r5) >= uint(r2) ? r2 : r5;
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	memcpy(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	tlsf_free(i7);
+	r_g0 = r9;
+	return;
+}
+}
+} while(0);
+	r9 = s_current_memory;
+	r9 = r9 >> 2;
+	r2 = heap32[(r9)];
+	r2 = (r2 - r5)|0;
+	r5 = r4 & -4;
+	heap32[(r9)] = r2;
+	r6 = (r10 + 16)|0;
+	if(uint(r5) >=uint(r6)) //_LBB728_27
+{
+	r4 = (r0 + r10)|0;
+	r6 = r4 >> 2;
+	r7 = -4;
+	r8 = heap32[(r6)];
+	r7 = (r7 - r10)|0;
+	r8 = r8 & 3;
+	r5 = (r7 + r5)|0;
+	r5 = r8 | r5;
+	heap32[(r6)] = r5;
+	r5 = heap32[(r3+-1)];
+	r5 = r5 & 3;
+	r5 = r5 | r10;
+	heap32[(r3+-1)] = r5;
+	r5 = heap32[(r6)];
+	r5 = (r5 + -4)|0;
+	r5 = r5 & -4;
+	r5 = (r10 + r5)|0;
+	r5 = (r5 + r0)|0;
+	r4 = (r4 + -4)|0;
+	r5 = r5 >> 2;
+	heap32[(r5+1)] = r4;
+	r7 = heap32[(r5+2)];
+	r7 = r7 | 2;
+	heap32[(r5+2)] = r7;
+	r5 = heap32[(r6)];
+	r5 = r5 | 1;
+	r5 = r5 & -3;
+	heap32[(r6)] = r5;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r4;
+	block_merge_next(i7);
+	r4 = r_g0;
+	r5 = r4 >> 2;
+	r5 = heap32[(r5+1)];
+	r6 = r5 & -4;
+	if(uint(r6) >uint(255)) //_LBB728_29
+{
+	r5 = r6 >>> 1;
+	r5 = r6 | r5;
+	r7 = r5 >>> 2;
+	r5 = r5 | r7;
+	r7 = r5 >>> 4;
+	r5 = r5 | r7;
+	r7 = r5 >>> 8;
+	r5 = r5 | r7;
+	r7 = r5 >>> 16;
+	r5 = r5 | r7;
+	r7 = r5 ^ -1;
+	r8 = 1431655765;
+	r7 = r7 >>> 1;
+	r5 = r8 & (~r5);
+	r7 = r7 & 1431655765;
+	r5 = (r5 + r7)|0;
+	r7 = r5 >>> 2;
+	r5 = r5 & 858993459;
+	r7 = r7 & 858993459;
+	r5 = (r5 + r7)|0;
+	r7 = r5 >>> 4;
+	r5 = r5 & 252645135;
+	r7 = r7 & 252645135;
+	r5 = (r5 + r7)|0;
+	r7 = r5 >>> 8;
+	r5 = r5 & 16711935;
+	r7 = r7 & 16711935;
+	r5 = (r5 + r7)|0;
+	r7 = r5 & 65535;
+	r5 = r5 >>> 16;
+	r8 = 26;
+	r5 = (r7 + r5)|0;
+	r7 = (r8 - r5)|0;
+	r6 = r6 >>> r7;
+	r7 = 24;
+	r6 = r6 ^ 32;
+	r5 = (r7 - r5)|0;
+}
+else{
+	r6 = r5 >>> 3;
+	r5 = 0;
+}
+	r7 = r5 << 7;
+	r7 = (r1 + r7)|0;
+	r8 = r6 << 2;
+	r7 = (r7 + r8)|0;
+	r7 = r7 >> 2;
+	r8 = heap32[(r7+24)];
+	r10 = r4 >> 2;
+	r11 = block_null;
+	heap32[(r10+2)] = r8;
+	r8 = r8 >> 2;
+	heap32[(r10+3)] = r11;
+	heap32[(r8+3)] = r4;
+	r8 = 1;
+	r10 = r1 >> 2;
+	heap32[(r7+24)] = r4;
+	r4 = r5 << 2;
+	r5 = r8 << r5;
+	r7 = heap32[(r10)];
+	r4 = (r1 + r4)|0;
+	r1 = r7 | r5;
+	r4 = r4 >> 2;
+	heap32[(r10)] = r1;
+	r1 = r8 << r6;
+	r5 = heap32[(r4+1)];
+	r1 = r5 | r1;
+	heap32[(r4+1)] = r1;
+	r4 = heap32[(r3+-1)];
+}
+	r1 = r4 & -4;
+	r1 = (r2 + r1)|0;
+	r2 = s_max_memory;
+	r2 = r2 >> 2;
+	heap32[(r9)] = r1;
+	r9 = heap32[(r2)];
+if(!(uint(r1) <=uint(r9))) //_LBB728_33
+{
+	heap32[(r2)] = r1;
+}
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = (r2 + -1)|0;
+	if(uint(r0) <uint(1073741823)) //_LBB728_6
+{
+	r0 = (r2 + 7)|0;
+	r0 = r0 & -8;
+	r2 = 12;
+	r0 = uint(r0) < uint(r2) ? r2 : r0;
+}
+else{
+	r0 = 0;
+}
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	block_locate_free(i7);
+	r2 = r_g0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r0;
+	r0 = s_current_memory;
+	block_prepare_used(i7);
+	r1 = r_g0;
+	r2 = r2 >> 2;
+	r0 = r0 >> 2;
+	r2 = heap32[(r2+1)];
+	r3 = heap32[(r0)];
+	r2 = r2 & -4;
+	r2 = (r3 + r2)|0;
+	r3 = s_max_memory;
+	r3 = r3 >> 2;
+	heap32[(r0)] = r2;
+	r0 = heap32[(r3)];
+if(!(uint(r2) <=uint(r0))) //_LBB728_9
+{
+	heap32[(r3)] = r2;
+}
+	r_g0 = r1;
+	return;
+}
+}
+
+function tlsf_create(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = (r0 + -3048)|0;
+	r1 = r0 & -8;
+	r2 = (r1 + -12)|0;
+	if(uint(r2) <uint(1073741813)) //_LBB729_2
+{
+	r2 = heap32[(fp)];
+	r3 = block_null;
+	r4 = r3 >> 2;
+	heap32[(r4+2)] = r3;
+	r5 = -1;
+	r6 = r2 >> 2;
+	heap32[(r4+3)] = r3;
+	heap32[(r6)] = 0;
+_3: while(true){
+	r4 = r5 << 2;
+	r7 = r5 << 7;
+	r4 = (r2 - r4)|0;
+	r7 = (r2 - r7)|0;
+	r4 = r4 >> 2;
+	r7 = r7 >> 2;
+	heap32[(r4)] = 0;
+	heap32[(r7+-8)] = r3;
+	heap32[(r7+-7)] = r3;
+	heap32[(r7+-6)] = r3;
+	heap32[(r7+-5)] = r3;
+	heap32[(r7+-4)] = r3;
+	heap32[(r7+-3)] = r3;
+	heap32[(r7+-2)] = r3;
+	heap32[(r7+-1)] = r3;
+	heap32[(r7)] = r3;
+	heap32[(r7+1)] = r3;
+	heap32[(r7+2)] = r3;
+	heap32[(r7+3)] = r3;
+	heap32[(r7+4)] = r3;
+	heap32[(r7+5)] = r3;
+	heap32[(r7+6)] = r3;
+	heap32[(r7+7)] = r3;
+	heap32[(r7+8)] = r3;
+	heap32[(r7+9)] = r3;
+	heap32[(r7+10)] = r3;
+	heap32[(r7+11)] = r3;
+	heap32[(r7+12)] = r3;
+	heap32[(r7+13)] = r3;
+	heap32[(r7+14)] = r3;
+	heap32[(r7+15)] = r3;
+	heap32[(r7+16)] = r3;
+	heap32[(r7+17)] = r3;
+	heap32[(r7+18)] = r3;
+	heap32[(r7+19)] = r3;
+	heap32[(r7+20)] = r3;
+	heap32[(r7+21)] = r3;
+	r5 = (r5 + -1)|0;
+	heap32[(r7+22)] = r3;
+	heap32[(r7+23)] = r3;
+if(!(r5 !=-24)) //_LBB729_3
+{
+break _3;
+}
+}
+	r4 = r0 | 1;
+	r5 = (r2 + 3036)|0;
+	r4 = r4 & -7;
+	heap32[(r6+760)] = r4;
+	if(uint(r1) >uint(255)) //_LBB729_6
+{
+	r0 = r1 >>> 1;
+	r0 = r1 | r0;
+	r4 = r0 >>> 2;
+	r0 = r0 | r4;
+	r4 = r0 >>> 4;
+	r0 = r0 | r4;
+	r4 = r0 >>> 8;
+	r0 = r0 | r4;
+	r4 = r0 >>> 16;
+	r0 = r0 | r4;
+	r4 = r0 ^ -1;
+	r7 = 1431655765;
+	r4 = r4 >>> 1;
+	r0 = r7 & (~r0);
+	r4 = r4 & 1431655765;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 2;
+	r0 = r0 & 858993459;
+	r4 = r4 & 858993459;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 4;
+	r0 = r0 & 252645135;
+	r4 = r4 & 252645135;
+	r0 = (r0 + r4)|0;
+	r4 = r0 >>> 8;
+	r0 = r0 & 16711935;
+	r4 = r4 & 16711935;
+	r0 = (r0 + r4)|0;
+	r4 = r0 & 65535;
+	r0 = r0 >>> 16;
+	r7 = 26;
+	r0 = (r4 + r0)|0;
+	r4 = (r7 - r0)|0;
+	r1 = r1 >>> r4;
+	r4 = 24;
+	r1 = r1 ^ 32;
+	r0 = (r4 - r0)|0;
+}
+else{
+	r1 = r0 >>> 3;
+	r0 = 0;
+}
+	r4 = r0 << 7;
+	r4 = (r2 + r4)|0;
+	r7 = r1 << 2;
+	r4 = (r4 + r7)|0;
+	r4 = r4 >> 2;
+	r7 = heap32[(r4+24)];
+	heap32[(r6+761)] = r7;
+	r7 = r7 >> 2;
+	heap32[(r6+762)] = r3;
+	heap32[(r7+3)] = r5;
+	r3 = 1;
+	heap32[(r4+24)] = r5;
+	r4 = r0 << 2;
+	r0 = r3 << r0;
+	r7 = heap32[(r6)];
+	r4 = (r2 + r4)|0;
+	r0 = r7 | r0;
+	r4 = r4 >> 2;
+	heap32[(r6)] = r0;
+	r0 = r3 << r1;
+	r1 = heap32[(r4+1)];
+	r0 = r1 | r0;
+	heap32[(r4+1)] = r0;
+	r0 = heap32[(r6+760)];
+	r0 = (r0 + 3040)|0;
+	r0 = r0 & -4;
+	r0 = (r2 + r0)|0;
+	r0 = r0 >> 2;
+	heap32[(r0)] = r5;
+	heap32[(r0+1)] = 2;
+	r_g0 = r2;
+	return;
+}
+else{
+	r0 = _2E_str643;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 3060;
+	heap32[(g0+2)] = 1073744872;
+	printf(i7);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _stricmp(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r5 = 26;
+_1: while(true){
+	r2 = heap8[r1];
+	r3 = heap8[r0];
+	r4 = (r2 + -65)|0;
+	r2 = (r2 + -33)|0;
+	r6 = (r3 + -65)|0;
+	r3 = (r3 + -33)|0;
+	r2 = uint(r4) < uint(r5) ? r2 : r4;
+	r3 = uint(r6) < uint(r5) ? r3 : r6;
+	if(r2 !=r3) //_LBB730_3
+{
+break _1;
+}
+else{
+	r0 = (r0 + 1)|0;
+	r1 = (r1 + 1)|0;
+	if(r3 !=-65) //_LBB730_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+}
+	r0 = (r3 - r2)|0;
+	r_g0 = r0;
+	return;
+}
+
+function strcasecmp(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r5 = 26;
+_1: while(true){
+	r2 = heap8[r1];
+	r3 = heap8[r0];
+	r4 = (r2 + -65)|0;
+	r2 = (r2 + -33)|0;
+	r6 = (r3 + -65)|0;
+	r3 = (r3 + -33)|0;
+	r2 = uint(r4) < uint(r5) ? r2 : r4;
+	r3 = uint(r6) < uint(r5) ? r3 : r6;
+	if(r2 !=r3) //_LBB731_3
+{
+break _1;
+}
+else{
+	r1 = (r1 + 1)|0;
+	r0 = (r0 + 1)|0;
+	if(r3 !=-65) //_LBB731_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+}
+	r0 = (r3 - r2)|0;
+	r_g0 = r0;
+	return;
+}
+
+function strcpy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r1 ^ r0;
+	r2 = r2 & 3;
+_1: do {
+	if(r2 ==0) //_LBB732_2
+{
+	r2 = r0 & 3;
+	if(r2 !=0) //_LBB732_4
+{
+	r2 = r0 | -4;
+_5: while(true){
+	if(r2 !=0) //_LBB732_7
+{
+	r3 = heapU8[r1];
+	r4 = (r0 + 1)|0;
+	r1 = (r1 + 1)|0;
+	r2 = (r2 + 1)|0;
+	heap8[r0] = r3;
+	r0 = r4;
+if(!(r3 !=0)) //_LBB732_5
+{
+break _1;
+}
+}
+else{
+break _5;
+}
+}
+}
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r3 = r2 & -2139062144;
+	r3 = r3 ^ -2139062144;
+	r4 = (r2 + -16843009)|0;
+	r3 = r3 & r4;
+_9: do {
+	if(r3 ==0) //_LBB732_11
+{
+	r1 = (r1 + 4)|0;
+_11: while(true){
+	r3 = r0 >> 2;
+	r4 = r1 >> 2;
+	heap32[(r3)] = r2;
+	r2 = heap32[(r4)];
+	r3 = r2 & -2139062144;
+	r0 = (r0 + 4)|0;
+	r1 = (r1 + 4)|0;
+	r3 = r3 ^ -2139062144;
+	r4 = (r2 + -16843009)|0;
+	r3 = r3 & r4;
+if(!(r3 ==0)) //_LBB732_15
+{
+break _9;
+}
+}
+}
+} while(0);
+	r1 = r2 & 255;
+	heap8[r0] = r2;
+if(!(r1 ==0)) //_LBB732_8
+{
+	r0 = (r0 + 1)|0;
+_15: while(true){
+	r2 = r2 >>> 8;
+	r1 = (r0 + 1)|0;
+	heap8[r0] = r2;
+	r3 = r2 & 255;
+	r0 = r1;
+	if(r3 ==0) //_LBB732_8
+{
+break _1;
+}
+else{
+continue _15;
+}
+}
+}
+}
+else{
+_17: while(true){
+	r2 = heapU8[r1];
+	r3 = (r0 + 1)|0;
+	r1 = (r1 + 1)|0;
+	heap8[r0] = r2;
+	r0 = r3;
+	if(r2 ==0) //_LBB732_8
+{
+break _1;
+}
+else{
+continue _17;
+}
+}
+}
+} while(0);
+	return;
+}
+
+function strcmp(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r1 ^ r0;
+	r2 = r2 & 3;
+_1: do {
+	if(r2 ==0) //_LBB733_7
+{
+	r2 = r0 & 3;
+_3: do {
+	if(r2 !=0) //_LBB733_9
+{
+	r2 = r0 | -4;
+_5: while(true){
+	if(r2 !=0) //_LBB733_10
+{
+	r3 = heapU8[r0];
+	r4 = heapU8[r1];
+	if(r3 ==0) //_LBB733_12
+{
+break _5;
+}
+else{
+	r5 = r4 & 255;
+	if(r3 ==r5) //_LBB733_13
+{
+	r0 = (r0 + 1)|0;
+	r1 = (r1 + 1)|0;
+	r2 = (r2 + 1)|0;
+}
+else{
+break _5;
+}
+}
+}
+else{
+break _3;
+}
+}
+	r0 = r3 << 24;
+	r1 = r4 << 24;
+break _1;
+}
+} while(0);
+_11: while(true){
+	r2 = r0 >> 2;
+	r2 = heap32[(r2)];
+	r3 = r1 >> 2;
+	r4 = r2 & -2139062144;
+	r3 = heap32[(r3)];
+	r4 = r4 ^ -2139062144;
+	r5 = (r2 + -16843009)|0;
+	r4 = r4 & r5;
+	if(r4 !=0) //_LBB733_18
+{
+break _11;
+}
+else{
+	r4 = r3 & -2139062144;
+	r4 = r4 ^ -2139062144;
+	r5 = (r3 + -16843009)|0;
+	r4 = r4 & r5;
+	if(r4 !=0) //_LBB733_18
+{
+break _11;
+}
+else{
+	r0 = (r0 + 4)|0;
+	r1 = (r1 + 4)|0;
+if(!(r2 ==r3)) //_LBB733_15
+{
+break _11;
+}
+}
+}
+}
+	r0 = r2 & 255;
+_16: do {
+if(!(r0 ==0)) //_LBB733_21
+{
+	r0 = r2 & 255;
+	r1 = r3 & 255;
+if(!(r0 !=r1)) //_LBB733_21
+{
+__label__ = 19; //SET chanka
+_18: while(true){
+	r2 = r2 >>> 8;
+	r3 = r3 >>> 8;
+	r0 = r2 & 255;
+	if(r0 ==0) //_LBB733_24
+{
+break _16;
+}
+else{
+	r1 = r3 & 255;
+if(!(r0 ==r1)) //_LBB733_22
+{
+break _16;
+}
+}
+}
+}
+}
+} while(0);
+	r2 = r2 & 255;
+	r3 = r3 & 255;
+	r2 = (r2 - r3)|0;
+	r_g0 = r2;
+	return;
+}
+else{
+_22: while(true){
+	r2 = heapU8[r0];
+	r3 = heapU8[r1];
+	if(r2 ==0) //_LBB733_5
+{
+break _22;
+}
+else{
+	r4 = r3 & 255;
+	if(r2 ==r4) //_LBB733_2
+{
+	r0 = (r0 + 1)|0;
+	r1 = (r1 + 1)|0;
+}
+else{
+break _22;
+}
+}
+}
+	r0 = r2 << 24;
+	r1 = r3 << 24;
+}
+} while(0);
+	r0 = r0 >> 24;
+	r1 = r1 >> 24;
+	r0 = (r0 - r1)|0;
+	r_g0 = r0;
+	return;
+}
+
+function memmove(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+_1: do {
+if(!(r0 ==r1)) //_LBB734_8
+{
+	r2 = heap32[(fp+2)];
+	if(uint(r0) <=uint(r1)) //_LBB734_5
+{
+if(!(r2 ==0)) //_LBB734_8
+{
+	r3 = 0;
+	r2 = (r3 - r2)|0;
+_6: while(true){
+	r3 = (r0 - r2)|0;
+	r4 = (r2 + 1)|0;
+	r2 = (r1 - r2)|0;
+	r3 = heapU8[r3+-1];
+	heap8[r2+-1] = r3;
+	r2 = r4;
+	if(r4 !=0) //_LBB734_7
+{
+continue _6;
+}
+else{
+break _1;
+}
+}
+}
+}
+else{
+if(!(r2 ==0)) //_LBB734_8
+{
+	r3 = r1;
+_10: while(true){
+	r4 = heapU8[r0];
+	r2 = (r2 + -1)|0;
+	r5 = (r3 + 1)|0;
+	r0 = (r0 + 1)|0;
+	heap8[r3] = r4;
+	r3 = r5;
+	if(r2 ==0) //_LBB734_8
+{
+break _1;
+}
+else{
+continue _10;
+}
+}
+}
+}
+}
+} while(0);
+	r_g0 = r1;
+	return;
+}
+
+function strncasecmp(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = 0;
+	r7 = 26;
+_1: while(true){
+	if(r3 >=r2) //_LBB735_5
+{
+__label__ = 5;
+break _1;
+}
+else{
+	r4 = heap8[r1+r3];
+	r5 = heap8[r0+r3];
+	r6 = (r4 + -65)|0;
+	r4 = (r4 + -33)|0;
+	r8 = (r5 + -65)|0;
+	r5 = (r5 + -33)|0;
+	r4 = uint(r6) < uint(r7) ? r4 : r6;
+	r5 = uint(r8) < uint(r7) ? r5 : r8;
+	if(r4 !=r5) //_LBB735_4
+{
+__label__ = 4;
+break _1;
+}
+else{
+	r3 = (r3 + 1)|0;
+	if(r5 !=-65) //_LBB735_1
+{
+continue _1;
+}
+else{
+__label__ = 4;
+break _1;
+}
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 5:
+	r0 = 0;
+	r_g0 = r0;
+	return;
+break;
+case 4:
+	r0 = (r5 - r4)|0;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function strncmp(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	if(uint(r0) >uint(3)) //_LBB736_2
+{
+	r5 = r0 >>> 2;
+	r1 = (r1 + 2)|0;
+_3: while(true){
+	r3 = heapU8[r1+-2];
+	r4 = heapU8[r2];
+	if(r3 ==0) //_LBB736_5
+{
+__label__ = 5;
+break _3;
+}
+else{
+	r6 = r4 & 255;
+	if(r3 ==r6) //_LBB736_6
+{
+	r3 = heapU8[r1+-1];
+	r4 = heapU8[r2+1];
+	if(r3 ==0) //_LBB736_8
+{
+__label__ = 5;
+break _3;
+}
+else{
+	r6 = r4 & 255;
+	if(r3 ==r6) //_LBB736_9
+{
+	r3 = heapU8[r1];
+	r4 = heapU8[r2+2];
+	if(r3 ==0) //_LBB736_11
+{
+__label__ = 5;
+break _3;
+}
+else{
+	r6 = r4 & 255;
+	if(r3 ==r6) //_LBB736_12
+{
+	r3 = heapU8[r1+1];
+	r4 = heapU8[r2+3];
+	if(r3 ==0) //_LBB736_14
+{
+__label__ = 5;
+break _3;
+}
+else{
+	r6 = r4 & 255;
+	if(r3 ==r6) //_LBB736_15
+{
+	r5 = (r5 + -1)|0;
+	r1 = (r1 + 4)|0;
+	r2 = (r2 + 4)|0;
+	if(r5 !=0) //_LBB736_3
+{
+__label__ = 3;
+}
+else{
+__label__ = 13;
+break _3;
+}
+}
+else{
+__label__ = 5;
+break _3;
+}
+}
+}
+else{
+__label__ = 5;
+break _3;
+}
+}
+}
+else{
+__label__ = 5;
+break _3;
+}
+}
+}
+else{
+__label__ = 5;
+break _3;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 5:
+	r1 = r4 & 255;
+	r1 = (r3 - r1)|0;
+	r_g0 = r1;
+	return;
+break;
+case 13:
+	r0 = r0 & 3;
+	r1 = (r1 + -2)|0;
+break;
+}
+}
+else{
+	r3 = 0;
+	r4 = r3;
+}
+_17: while(true){
+	if(r0 !=0) //_LBB736_17
+{
+	r3 = heapU8[r1];
+	r4 = heapU8[r2];
+	if(r3 ==0) //_LBB736_19
+{
+__label__ = 16;
+break _17;
+}
+else{
+	r5 = r4 & 255;
+	if(r3 ==r5) //_LBB736_20
+{
+	r0 = (r0 + -1)|0;
+	r1 = (r1 + 1)|0;
+	r2 = (r2 + 1)|0;
+continue _17;
+}
+else{
+__label__ = 16;
+break _17;
+}
+}
+}
+else{
+__label__ = 19;
+break _17;
+}
+}
+switch(__label__ ){//multiple entries
+case 16:
+	r0 = r4 & 255;
+	r0 = (r3 - r0)|0;
+	r_g0 = r0;
+	return;
+break;
+case 19:
+	r0 = r3 & 255;
+	r1 = r4 & 255;
+	r0 = (r0 - r1)|0;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function quicksort(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var r24;
+	var r25;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	heap32[(fp+-4)] = r0;
+	r1 = heap32[(fp+1)];
+	heap32[(fp+-3)] = r1;
+if(!(r0 <=r1)) //_LBB737_37
+{
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+3)];
+	r2 = 4;
+	r3 = heap32[(fp+-4)];
+	r4 = r3 << 2;
+	r5 = (r0 + r4)|0;
+	r6 = -4;
+	r7 = -8;
+	r2 = (r2 - r0)|0;
+	r3 = (r3 + -1)|0;
+	r8 = (r0 + 4)|0;
+	r6 = (r6 - r0)|0;
+	heap32[(fp+-1)] = r6;
+	r6 = (r5 + -4)|0;
+	heap32[(fp+-2)] = r6;
+	r6 = (r7 - r0)|0;
+	r2 = (r2 - r4)|0;
+	heap32[(fp+-6)] = r2;
+_3: while(true){
+	r2 = heap32[(fp+-3)];
+	r4 = (r2 + -1)|0;
+	r7 = (r2 + 1)|0;
+	r9 = -1;
+	r10 = -2;
+	heap32[(fp+-5)] = r2;
+	r2 = heap32[(fp+-4)];
+	r11 = r4;
+_5: while(true){
+	r12 = r4 << 2;
+	r13 = (r0 + r12)|0;
+	r14 = (r12 + 4)|0;
+	r15 = heap32[(fp+-1)];
+	r15 = (r15 - r12)|0;
+	r16 = (r8 + r12)|0;
+	r12 = (r6 - r12)|0;
+_7: while(true){
+	r17 = r12;
+	r18 = r16;
+	r19 = r15;
+	r20 = r14;
+	r21 = r4;
+	r22 = r13;
+	if(r3 ==r21) //_LBB737_6
+{
+break _7;
+}
+else{
+	r4 = (r0 + r20)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	r13 = (r22 + 4)|0;
+	r4 = (r21 + 1)|0;
+	r14 = (r20 + 4)|0;
+	r15 = (r19 + -4)|0;
+	r16 = (r18 + 4)|0;
+	r12 = (r17 + -4)|0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r23 = r_g0;
+if(!(r23 <0)) //_LBB737_4
+{
+break _7;
+}
+}
+}
+	r4 = r2 << 2;
+	r12 = (r0 + r4)|0;
+	r13 = 0;
+	r14 = (r13 - r12)|0;
+	r4 = (r21 + 1)|0;
+	r15 = (r12 + -4)|0;
+	r16 = r14;
+_11: while(true){
+	r23 = r14;
+	r24 = r16;
+	r25 = r2;
+	r2 = (r15 + r13)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	r13 = (r13 + -4)|0;
+	r2 = (r25 + -1)|0;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r14 = r_g0;
+	if(r14 >-1) //_LBB737_9
+{
+break _11;
+}
+else{
+	r16 = (r24 + 4)|0;
+	r14 = (r23 + 4)|0;
+if(!(r7 !=r25)) //_LBB737_7
+{
+break _11;
+}
+}
+}
+	if(r4 >=r2) //_LBB737_20
+{
+break _5;
+}
+else{
+	r17 = 0;
+_16: while(true){
+	r22 = (r17 - r19)|0;
+	r14 = (r17 - r24)|0;
+	r15 = heapU8[r22];
+	r14 = heapU8[r14+-4];
+	r16 = (r17 + 1)|0;
+	r17 = (r17 - r23)|0;
+	heap8[r22] = r14;
+	heap8[r17+-4] = r15;
+	r17 = r16;
+if(!(r16 !=4)) //_LBB737_11
+{
+break _16;
+}
+}
+	r17 = (r0 + r20)|0;
+	heap32[(g0)] = r17;
+	heap32[(g0+1)] = r5;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r17 = r_g0;
+_19: do {
+	if(r17 ==0) //_LBB737_14
+{
+	r17 = r11 << 2;
+	r11 = (r11 + 1)|0;
+	r17 = (r8 + r17)|0;
+	r22 = 0;
+_21: while(true){
+	r14 = (r18 - r22)|0;
+	r15 = (r17 - r22)|0;
+	r16 = heapU8[r15];
+	r19 = heapU8[r14];
+	r22 = (r22 + -1)|0;
+	heap8[r15] = r19;
+	heap8[r14] = r16;
+if(!(r22 !=-4)) //_LBB737_15
+{
+break _19;
+}
+}
+}
+} while(0);
+	r17 = (r12 + r13)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r17;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r17 = r_g0;
+if(!(r17 !=0)) //_LBB737_3
+{
+	r4 = (r21 + 1)|0;
+	r17 = 0;
+_25: while(true){
+	r18 = heap32[(fp+-2)];
+	r18 = (r17 + r18)|0;
+	r21 = r10 << 2;
+	r18 = (r18 - r21)|0;
+	r21 = (r17 + r12)|0;
+	r21 = heapU8[r21+r13];
+	r22 = heapU8[r18+-8];
+	r14 = (r17 + r12)|0;
+	r17 = (r17 + 1)|0;
+	heap8[r14+r13] = r22;
+	heap8[r18+-8] = r21;
+	if(r17 ==4) //_LBB737_18
+{
+break _25;
+}
+}
+	r10 = (r10 + 1)|0;
+	r9 = (r9 + 1)|0;
+}
+}
+}
+	r2 = heap32[(fp+-4)];
+	r2 = (r2 - r10)|0;
+	r4 = 0;
+	r2 = (r2 + -2)|0;
+	r7 = (r4 - r22)|0;
+_29: while(true){
+	r12 = (r5 - r4)|0;
+	r13 = (r18 - r4)|0;
+	r14 = heapU8[r13];
+	r15 = heapU8[r12];
+	r4 = (r4 + -1)|0;
+	heap8[r13] = r15;
+	heap8[r12] = r14;
+if(!(r4 !=-4)) //_LBB737_21
+{
+break _29;
+}
+}
+	r4 = (r21 + 2)|0;
+	r12 = heap32[(fp+-3)];
+	if(r12 <r11) //_LBB737_24
+{
+	r13 = r12 << 2;
+	r14 = 0;
+	r13 = (r0 + r13)|0;
+	r13 = (r14 - r13)|0;
+	r12 = (r11 - r12)|0;
+_34: while(true){
+	r15 = r14;
+_36: while(true){
+	r16 = (r15 - r7)|0;
+	r18 = (r15 - r13)|0;
+	r19 = heapU8[r18];
+	r20 = heapU8[r16];
+	r15 = (r15 + 1)|0;
+	heap8[r18] = r20;
+	heap8[r16] = r19;
+if(!(r15 !=4)) //_LBB737_26
+{
+break _36;
+}
+}
+	r12 = (r12 + -1)|0;
+	r13 = (r13 + -4)|0;
+	r7 = (r7 + 4)|0;
+if(!(r12 !=0)) //_LBB737_25
+{
+break _34;
+}
+}
+	r7 = heap32[(fp+-3)];
+	r7 = (r7 - r11)|0;
+	r7 = (r7 + r21)|0;
+}
+else{
+	r7 = r21;
+}
+	if(r3 >r2) //_LBB737_35
+{
+	r2 = heap32[(fp+-6)];
+_44: while(true){
+	r4 = 0;
+_46: while(true){
+	r11 = (r4 - r2)|0;
+	r12 = (r4 - r17)|0;
+	r13 = heapU8[r12];
+	r14 = heapU8[r11];
+	r4 = (r4 + 1)|0;
+	heap8[r12] = r14;
+	heap8[r11] = r13;
+if(!(r4 !=4)) //_LBB737_30
+{
+break _46;
+}
+}
+	r9 = (r9 + -1)|0;
+	r17 = (r17 + -4)|0;
+	r2 = (r2 + 4)|0;
+if(!(r9 !=0)) //_LBB737_29
+{
+break _44;
+}
+}
+	r2 = (r10 + r21)|0;
+	r2 = (r2 + 3)|0;
+	heap32[(fp+-3)] = r2;
+}
+else{
+	heap32[(fp+-3)] = r4;
+}
+	heap32[(g0)] = r0;
+	r2 = heap32[(fp+-5)];
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r7;
+	heap32[(g0+3)] = r1;
+	quicksort(i7);
+	r4 = heap32[(fp+-3)];
+	r2 = heap32[(fp+-4)];
+	if(r4 <r2) //_LBB737_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function __dtostr(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	f0 = llvm_readDouble((sp));
+	r0 = sp + -8;
+	llvm_writeDouble((sp+-8),f0);
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(fp+4)];
+	r4 = heap32[(fp+5)];
+	r5 = heap32[(fp+6)];
+	r6 = heap32[(fp+-2)];
+	if(r0 >2146435071) //_LBB738_3
+{
+	r7 = r0 ^ 2146959360;
+	r7 = r6 | r7;
+	if(r7 ==0) //_LBB738_13
+{
+__label__ = 13;
+}
+else{
+	r7 = r0 ^ 2146435072;
+	r6 = r6 | r7;
+	if(r6 !=0) //_LBB738_21
+{
+__label__ = 20;
+}
+else{
+__label__ = 5;
+}
+}
+}
+else{
+	r7 = r0 ^ -1048576;
+	r7 = r6 | r7;
+	if(r7 ==0) //_LBB738_5
+{
+__label__ = 5;
+}
+else{
+	r7 = r0 ^ -524288;
+	r6 = r6 | r7;
+	if(r6 ==0) //_LBB738_13
+{
+__label__ = 13;
+}
+else{
+__label__ = 20;
+}
+}
+}
+_6: do {
+switch(__label__ ){//multiple entries
+case 13:
+	if(r2 >0) //_LBB738_15
+{
+	r0 = (r2 + -1)|0;
+	r3 = 2;
+	r4 = 0;
+	r5 = (r2 + 2)|0;
+	r0 = uint(r0) > uint(r3) ? r0 : r3;
+	r3 = (r4 - r2)|0;
+	r0 = (r5 - r0)|0;
+	r4 = _2E_str9655;
+	r5 = r1;
+_10: while(true){
+	r6 = heapU8[r4];
+	r0 = (r0 + -1)|0;
+	r7 = (r5 + 1)|0;
+	r4 = (r4 + 1)|0;
+	heap8[r5] = r6;
+	r5 = r7;
+if(!(r0 !=0)) //_LBB738_16
+{
+break _10;
+}
+}
+	r0 = -3;
+	r4 = 3;
+	r0 = uint(r3) > uint(r0) ? r2 : r4;
+}
+else{
+	r0 = 0;
+}
+	if(r0 >=r2) //_LBB738_20
+{
+	r_g0 = r0;
+	return;
+}
+else{
+__label__ = 11;
+break _6;
+}
+break;
+case 20:
+	f1 =                         0;
+	if(f0 !=f1) //_LBB738_32
+{
+	r0 = r0 >>> 20;
+	r0 = r0 & 2047;
+	r0 = (r0 + -1023)|0;
+	f2 = r0; //fitod r0, f2
+	f3 =        0.3010299956639812;
+	f2 = f2*f3;
+	r0 = f2|0;
+	r6 = (r0 + 1)|0;
+	if(f0 <f1) //_LBB738_34
+{
+	f1 = -f0;
+	r2 = (r2 + -1)|0;
+	r7 = (r1 + 1)|0;
+	r8 = 45;
+	heap8[r1] = r8;
+}
+else{
+	r7 = r1;
+	f1 = f0;
+}
+_23: do {
+	if(r4 ==0) //_LBB738_37
+{
+	f2 =                       0.5;
+}
+else{
+	f2 =                       0.5;
+	r8 = r4;
+	f3 =       0.10000000000000001;
+_26: while(true){
+	r8 = (r8 + -1)|0;
+	f2 = f2*f3;
+if(!(r8 !=0)) //_LBB738_38
+{
+break _23;
+}
+}
+}
+} while(0);
+	f1 = f1+f2;
+	f2 =                         1;
+	if(f1 <f2) //_LBB738_41
+{
+	r2 = (r2 + -1)|0;
+	r8 = (r7 + 1)|0;
+	r9 = 48;
+	heap8[r7] = r9;
+	r7 = r8;
+}
+_32: do {
+	if(r6 >0) //_LBB738_44
+{
+_34: do {
+	if(uint(r6) >uint(10)) //_LBB738_46
+{
+	r0 = (r0 + 1)|0;
+	f2 =                        10;
+	f3 =               10000000000;
+_36: while(true){
+	r0 = (r0 + -10)|0;
+	f2 = f2*f3;
+if(!(uint(r0) >uint(10))) //_LBB738_47
+{
+break _34;
+}
+}
+}
+else{
+	f2 =                        10;
+	r0 = r6;
+}
+} while(0);
+	if(uint(r0) >uint(1)) //_LBB738_50
+{
+	r0 = (r0 + -1)|0;
+	f3 =                        10;
+_42: while(true){
+	r0 = (r0 + -1)|0;
+	f2 = f2*f3;
+if(!(r0 !=0)) //_LBB738_51
+{
+break _42;
+}
+}
+	r0 = 1;
+}
+else{
+	r0 = 1;
+}
+_46: while(true){
+	f3 =       0.90000000000000002;
+	if(f2 >f3) //_LBB738_53
+{
+	f3 = f1/f2;
+	r8 = f3|0;
+	if(r0 ==0) //_LBB738_56
+{
+__label__ = 52;
+}
+else{
+	r9 = r8 & 255;
+	if(r9 !=0) //_LBB738_56
+{
+__label__ = 52;
+}
+else{
+__label__ = 64;
+}
+}
+if (__label__ == 52){
+	r0 = (r8 + 48)|0;
+	heap8[r7] = r0;
+	if(r2 !=0) //_LBB738_70
+{
+	r0 = r8 << 24;
+	r0 = r0 >> 24;
+	f3 = r0; //fitod r0, f3
+	f3 = f3*f2;
+	r7 = (r7 + 1)|0;
+	f1 = f1-f3;
+	r2 = (r2 + -1)|0;
+	r0 = 0;
+}
+else{
+break _46;
+}
+}
+	f3 =                        10;
+	f2 = f2/f3;
+}
+else{
+__label__ = 66;
+break _32;
+}
+}
+	f0 = f0/f2;
+	llvm_writeDouble((i7),f0);
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r2;
+	heap32[(g0+4)] = r3;
+	heap32[(g0+5)] = r4;
+	heap32[(g0+6)] = 0;
+	__dtostr(i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB738_92
+{
+__label__ = 83;
+}
+else{
+	r3 = (r0 + r7)|0;
+	r7 = (r3 + 1)|0;
+	if(r2 !=r0) //_LBB738_60
+{
+	r3 = (r3 + 2)|0;
+	r4 = 101;
+	heap8[r7] = r4;
+	r7 = r3;
+}
+	r2 = (r2 + -1)|0;
+	r3 = (r2 - r0)|0;
+_60: do {
+	if(r6 <1000) //_LBB738_66
+{
+	if(r6 <100) //_LBB738_93
+{
+	if(r6 >9) //_LBB738_95
+{
+__label__ = 90;
+break _60;
+}
+else{
+__label__ = 91;
+break _60;
+}
+}
+else{
+__label__ = 87;
+break _60;
+}
+}
+else{
+	if(r2 !=r0) //_LBB738_64
+{
+	r0 = (r6 / 1000)|0;
+	r2 = (r7 + 1)|0;
+	r0 = (r0 + 48)|0;
+	heap8[r7] = r0;
+	r7 = r2;
+}
+	r3 = (r3 + -1)|0;
+	r6 = (r6 % 1000)|0;
+__label__ = 87;
+}
+} while(0);
+if (__label__ == 87){
+	if(r3 !=0) //_LBB738_97
+{
+	r0 = (r6 / 100)|0;
+	r2 = (r7 + 1)|0;
+	r0 = (r0 + 48)|0;
+	heap8[r7] = r0;
+	r7 = r2;
+}
+	r3 = (r3 + -1)|0;
+	r6 = (r6 % 100)|0;
+__label__ = 90;
+}
+if (__label__ == 90){
+	if(r3 !=0) //_LBB738_101
+{
+	r0 = (r6 / 10)|0;
+	r2 = (r7 + 1)|0;
+	r0 = (r0 + 48)|0;
+	heap8[r7] = r0;
+	r7 = r2;
+}
+	r3 = (r3 + -1)|0;
+	r6 = (r6 % 10)|0;
+}
+	if(r3 !=0) //_LBB738_68
+{
+	r0 = (r6 + 48)|0;
+	heap8[r7] = r0;
+	if(r3 ==1) //_LBB738_92
+{
+__label__ = 83;
+}
+else{
+	r7 = (r7 + 1)|0;
+__label__ = 82;
+}
+}
+else{
+__label__ = 82;
+}
+}
+}
+else{
+	f2 =       0.10000000000000001;
+__label__ = 66;
+}
+} while(0);
+_81: do {
+if (__label__ == 66){
+	if(r7 ==r1) //_LBB738_75
+{
+	if(r2 ==0) //_LBB738_92
+{
+__label__ = 83;
+break _81;
+}
+else{
+	r2 = (r2 + -1)|0;
+	r6 = (r7 + 1)|0;
+	r0 = 48;
+	heap8[r7] = r0;
+	r7 = r6;
+}
+}
+if(!(r4 !=0)) //_LBB738_80
+{
+	r6 = 1;
+	r6 = (r6 - r1)|0;
+	r6 = (r6 + r7)|0;
+if(!(uint(r6) <uint(r3))) //_LBB738_80
+{
+__label__ = 82;
+break _81;
+}
+}
+	if(r2 ==0) //_LBB738_92
+{
+__label__ = 83;
+}
+else{
+	r6 = (r2 + -1)|0;
+	r0 = (r7 + 1)|0;
+	r2 = 46;
+	heap8[r7] = r2;
+	if(r5 ==0) //_LBB738_83
+{
+if(!(r4 !=0)) //_LBB738_85
+{
+	r3 = (r1 + r3)|0;
+	r3 = (r3 + 1)|0;
+	r4 = (r3 - r0)|0;
+}
+}
+else{
+	r3 = r4 == 0 ? r3 : r4;
+	r3 = (r1 + r3)|0;
+	r3 = (r3 + 1)|0;
+	r4 = (r3 - r0)|0;
+}
+	if(uint(r4) >uint(r6)) //_LBB738_92
+{
+__label__ = 83;
+}
+else{
+	if(r4 !=0) //_LBB738_88
+{
+	r3 = (r4 + 1)|0;
+	r6 = (r7 + 1)|0;
+	f3 =                        10;
+_99: while(true){
+	f0 = f1/f2;
+	r0 = f0|0;
+	r2 = r0 << 24;
+	r2 = r2 >> 24;
+	f0 = r2; //fitod r2, f0
+	f0 = f0*f2;
+	r4 = (r4 + -1)|0;
+	f2 = f2/f3;
+	f1 = f1-f0;
+	r2 = (r6 + 1)|0;
+	r0 = (r0 + 48)|0;
+	heap8[r6] = r0;
+	r6 = r2;
+if(!(r4 !=0)) //_LBB738_89
+{
+break _99;
+}
+}
+	r7 = (r7 + r3)|0;
+__label__ = 82;
+}
+else{
+	r7 = r0;
+__label__ = 82;
+}
+}
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 83:
+	r1 = 0;
+	r_g0 = r1;
+	return;
+break;
+case 82:
+	r3 = 0;
+	heap8[r7] = r3;
+	r1 = (r7 - r1)|0;
+	r_g0 = r1;
+	return;
+break;
+}
+}
+else{
+	r3 = 1;
+	r5 = (r4 + 2)|0;
+	r4 = r4 == 0 ? r3 : r5;
+	r5 = 8;
+	r2 = uint(r4) > uint(r2) ? r5 : r4;
+	if(r2 ==0) //_LBB738_24
+{
+__label__ = 23;
+}
+else{
+	if(r0 <0) //_LBB738_25
+{
+	r0 = 45;
+	heap8[r1] = r0;
+	r0 = r3;
+__label__ = 25;
+}
+else{
+__label__ = 23;
+}
+}
+if (__label__ == 23){
+	r0 = 0;
+}
+	if(uint(r0) <uint(r2)) //_LBB738_28
+{
+	r5 = 48;
+_115: while(true){
+	r4 = (r0 + 1)|0;
+	heap8[r1+r0] = r5;
+	r0 = r4;
+if(!(r2 !=r4)) //_LBB738_29
+{
+break _115;
+}
+}
+	r0 = r2;
+}
+	r2 = 2;
+	r4 = heapU8[r1];
+	r2 = r4 == 48 ? r3 : r2;
+	r3 = 46;
+	r4 = 0;
+	heap8[r1+r2] = r3;
+	heap8[r1+r0] = r4;
+	r_g0 = r0;
+	return;
+}
+break;
+case 5:
+	if(r2 >0) //_LBB738_7
+{
+	r0 = (r2 + -1)|0;
+	r3 = 2;
+	r4 = 0;
+	r5 = (r2 + 2)|0;
+	r0 = uint(r0) > uint(r3) ? r0 : r3;
+	r3 = (r4 - r2)|0;
+	r0 = (r5 - r0)|0;
+	r4 = _2E_str7654;
+	r5 = r1;
+_122: while(true){
+	r6 = heapU8[r4];
+	r0 = (r0 + -1)|0;
+	r7 = (r5 + 1)|0;
+	r4 = (r4 + 1)|0;
+	heap8[r5] = r6;
+	r5 = r7;
+if(!(r0 !=0)) //_LBB738_8
+{
+break _122;
+}
+}
+	r0 = -3;
+	r4 = 3;
+	r0 = uint(r3) > uint(r0) ? r2 : r4;
+}
+else{
+	r0 = 0;
+}
+	if(r0 >=r2) //_LBB738_12
+{
+__label__ = 12;
+}
+else{
+__label__ = 11;
+}
+break;
+}
+} while(0);
+if (__label__ == 11){
+	r2 = 0;
+	heap8[r1+r0] = r2;
+	r0 = (r0 + 1)|0;
+}
+	r_g0 = r0;
+	return;
+}
+
+function write_pad(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	if(r0 >0) //_LBB739_2
+{
+	r1 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r2 = heap32[(r1)];
+	r2 = (r2 + r0)|0;
+	if(uint(r2) >=uint(r0)) //_LBB739_4
+{
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+3)];
+	if(uint(r0) >uint(15)) //_LBB739_6
+{
+	r4 = 48;
+	r4 = r3 == r4;
+	r4 = r4 & 1;
+	r5 = _ZL8pad_line;
+	r4 = r4 << 5;
+	r4 = (r5 + r4)|0;
+	r5 = 0;
+_7: while(true){
+	r6 = r2 >> 2;
+	r7 = heap32[(r6+1)];
+	r6 = heap32[(r6)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 16;
+	heap32[(g0+2)] = r6;
+	r5 = (r5 + -16)|0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	r6 = (r0 + r5)|0;
+if(!(uint(r6) >uint(15))) //_LBB739_7
+{
+break _7;
+}
+}
+	r0 = 0;
+	r4 = (r0 - r5)|0;
+	if(r6 ==0) //_LBB739_10
+{
+__label__ = 11;
+}
+else{
+	r0 = r6;
+__label__ = 10;
+}
+}
+else{
+	r4 = 0;
+__label__ = 10;
+}
+if (__label__ == 10){
+	r5 = 48;
+	r2 = r2 >> 2;
+	r3 = r3 == r5;
+	r3 = r3 & 1;
+	r5 = heap32[(r2+1)];
+	r2 = heap32[(r2)];
+	r6 = _ZL8pad_line;
+	r3 = r3 << 5;
+	r3 = (r6 + r3)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	r4 = (r4 + r0)|0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+	r0 = heap32[(r1)];
+	r0 = (r0 + r4)|0;
+	heap32[(r1)] = r0;
+	r0 = 0;
+}
+else{
+	r0 = -1;
+}
+}
+else{
+	r0 = 0;
+}
+	r_g0 = r0;
+	return;
+}
+
+function sgetc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heapU8[r1];
+	r1 = (r1 + 1)|0;
+	heap32[(r0)] = r1;
+	if(r2 ==0) //_LBB740_2
+{
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r_g0 = r2;
+	return;
+}
+}
+
+function sputc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = (r1 + -1)|0;
+	heap32[(r0)] = r2;
+	r0 = heapU8[r1+-1];
+	r1 = heap32[(fp)];
+	r2 = -1;
+	r0 = r0 == r1 ? r1 : r2;
+	r_g0 = r0;
+	return;
+}
+
+function memset(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB742_3
+{
+	r2 = heap32[(fp+1)];
+	r3 = r1;
+_3: while(true){
+	r0 = (r0 + -1)|0;
+	r4 = (r3 + 1)|0;
+	heap8[r3] = r2;
+	r3 = r4;
+	if(r0 !=0) //_LBB742_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	r_g0 = r1;
+	return;
+}
+
+function memcpy(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = r1 ^ r0;
+	r3 = r3 & 3;
+_1: do {
+	if(r3 !=0) //_LBB743_2
+{
+__label__ = 2;
+}
+else{
+	if(uint(r2) >uint(4)) //_LBB743_3
+{
+	r3 = r0 & 3;
+	if(r3 !=0) //_LBB743_5
+{
+	r3 = (r3 + -5)|0;
+	r4 = r2 ^ -1;
+	r3 = uint(r3) < uint(r4) ? r4 : r3;
+	r4 = (r3 + r2)|0;
+	r3 = r3 ^ -1;
+	r4 = (r4 + 1)|0;
+	r6 = (r1 + r3)|0;
+	r5 = (r0 + r3)|0;
+	r3 = r0 | -4;
+	r7 = r0;
+_6: while(true){
+	if(r3 ==0) //_LBB743_9
+{
+break _6;
+}
+else{
+	if(r2 ==0) //_LBB743_20
+{
+__label__ = 19;
+break _1;
+}
+else{
+	r8 = heapU8[r1];
+	r2 = (r2 + -1)|0;
+	r3 = (r3 + 1)|0;
+	r1 = (r1 + 1)|0;
+	r9 = (r7 + 1)|0;
+	heap8[r7] = r8;
+	r7 = r9;
+}
+}
+}
+	if(r4 ==-1) //_LBB743_20
+{
+__label__ = 19;
+break _1;
+}
+else{
+	r2 = r4;
+	r1 = r6;
+}
+}
+else{
+	r5 = r0;
+}
+	if(uint(r2) >uint(3)) //_LBB743_13
+{
+	r6 = r5;
+	r4 = r1;
+_16: while(true){
+	r7 = r4 >> 2;
+	r2 = (r2 + -4)|0;
+	r4 = (r4 + 4)|0;
+	r3 = (r6 + 4)|0;
+	r6 = r6 >> 2;
+	r7 = heap32[(r7)];
+	heap32[(r6)] = r7;
+	r6 = r3;
+	if(uint(r2) >uint(3)) //_LBB743_14
+{
+continue _16;
+}
+else{
+__label__ = 15;
+break _1;
+}
+}
+}
+else{
+	r4 = r1;
+	r3 = r5;
+__label__ = 15;
+}
+}
+else{
+__label__ = 2;
+}
+}
+} while(0);
+if (__label__ == 2){
+	r3 = 0;
+	r4 = r3;
+	r5 = r0;
+__label__ = 15;
+}
+_21: do {
+if (__label__ == 15){
+if(!(r2 ==0)) //_LBB743_20
+{
+	if(r3 !=0) //_LBB743_18
+{
+	r1 = r4;
+	r5 = r3;
+}
+_26: while(true){
+	r3 = heapU8[r1];
+	r2 = (r2 + -1)|0;
+	r4 = (r5 + 1)|0;
+	r1 = (r1 + 1)|0;
+	heap8[r5] = r3;
+	r5 = r4;
+	if(r2 !=0) //_LBB743_19
+{
+continue _26;
+}
+else{
+break _21;
+}
+}
+}
+}
+} while(0);
+	r_g0 = r0;
+	return;
+}
+
+function swrite(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+1)];
+	r2 = heap32[(r0+2)];
+	r3 = heap32[(fp+1)];
+if(!(r2 ==r1)) //_LBB744_5
+{
+	r2 = (r2 - r1)|0;
+	r4 = heap32[(r0)];
+	r2 = uint(r2) < uint(r3) ? r2 : r3;
+	if(r4 !=0) //_LBB744_3
+{
+	r5 = heap32[(fp)];
+	r1 = (r4 + r1)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r1 = heap32[(r0+1)];
+	r4 = heap32[(r0)];
+	r1 = (r1 + r2)|0;
+	r5 = 0;
+	heap8[r4+r1] = r5;
+	r1 = heap32[(r0+1)];
+}
+	r1 = (r1 + r2)|0;
+	heap32[(r0+1)] = r1;
+}
+	r_g0 = r3;
+	return;
+}
+
+function __sync_fetch_and_add_4(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(r0)];
+	r1 = (r2 + r1)|0;
+	heap32[(r0)] = r1;
+	r_g0 = r2;
+	return;
+}
+
+function __muldi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	if(r0 <0) //_LBB746_2
+{
+	r5 = 0;
+	r4 = 1;
+	r0 = (r5 - r0)|0;
+	r6 = r1 != 0 ? r4 : r5;
+	r1 = (r5 - r1)|0;
+	r0 = (r0 - r6)|0;
+}
+else{
+	r4 = 0;
+}
+	if(r3 <0) //_LBB746_5
+{
+	r5 = 0;
+	r6 = 1;
+	r3 = (r5 - r3)|0;
+	r6 = r2 != 0 ? r6 : r5;
+	r4 = r4 ^ 1;
+	r2 = (r5 - r2)|0;
+	r3 = (r3 - r6)|0;
+}
+	r5 = r2 & 65535;
+	r6 = r1 & 65535;
+	r7 = r3 | r0;
+	r8 = (r5 * r6)|0;
+	r9 = r2 | r1;
+	r9 = r9 >>> 16;
+	if(r9 !=0) //_LBB746_8
+{
+	r9 = r1 >>> 16;
+	r10 = r2 >>> 16;
+	r11 = (r10 - r5)|0;
+	r12 = (r5 - r10)|0;
+	r13 = (r6 - r9)|0;
+	r14 = (r9 - r6)|0;
+	r15 = (r10 * r9)|0;
+	r11 = uint(r5) < uint(r10) ? r11 : r12;
+	r12 = uint(r9) < uint(r6) ? r13 : r14;
+	r11 = (r11 * r12)|0;
+	r12 = r15 >>> 16;
+	r12 = (r12 + r15)|0;
+	r13 = r15 << 16;
+	r14 = r11 << 16;
+	r6 = uint(r9) < uint(r6);
+	r5 = uint(r5) < uint(r10);
+	r5 = r6 ^ r5;
+	r5 = r5 & 1;
+	if(r5 ==0) //_LBB746_10
+{
+	r5 = (r14 + r13)|0;
+	r6 = uint(r5) < uint(r13);
+	r11 = r11 >>> 16;
+	r11 = (r11 + r12)|0;
+	r6 = r6 & 1;
+	r11 = (r11 + r6)|0;
+}
+else{
+	r5 = (r13 - r14)|0;
+	r11 = r11 >>> 16;
+	r14 = -1;
+	r6 = 0;
+	r11 = (r12 - r11)|0;
+	r12 = uint(r5) > uint(r13) ? r14 : r6;
+	r11 = (r11 + r12)|0;
+}
+	r6 = r8 << 16;
+	r6 = (r5 + r6)|0;
+	r9 = (r6 + r8)|0;
+	r5 = uint(r6) < uint(r5);
+	r6 = r8 >>> 16;
+	r8 = uint(r9) < uint(r8);
+	r6 = (r11 + r6)|0;
+	r5 = r5 & 1;
+	r5 = (r6 + r5)|0;
+	r8 = r8 & 1;
+	r5 = (r5 + r8)|0;
+	r8 = r9;
+}
+else{
+	r5 = 0;
+}
+	if(r7 !=0) //_LBB746_14
+{
+	r6 = (r3 - r2)|0;
+	r7 = (r2 - r3)|0;
+	r9 = (r1 - r0)|0;
+	r10 = (r0 - r1)|0;
+	r6 = uint(r2) < uint(r3) ? r6 : r7;
+	r7 = uint(r0) < uint(r1) ? r9 : r10;
+	r1 = uint(r0) < uint(r1);
+	r2 = uint(r2) < uint(r3);
+	r9 = 0;
+	r6 = (r6 * r7)|0;
+	r1 = r1 ^ r2;
+	r2 = (r9 - r6)|0;
+	r1 = r1 != 0 ? r2 : r6;
+	r0 = (r3 * r0)|0;
+	r0 = (r1 + r0)|0;
+	r0 = (r0 + r8)|0;
+	r5 = (r0 + r5)|0;
+}
+	r0 = 0;
+	r1 = 1;
+	r2 = (r0 - r5)|0;
+	r1 = r8 != 0 ? r1 : r0;
+	r0 = (r0 - r8)|0;
+	r1 = (r2 - r1)|0;
+	r0 = r4 == 0 ? r8 : r0;
+	r1 = r4 == 0 ? r5 : r1;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+
+function __fixdfdi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = sp + 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >>> 20;
+	r1 = r1 & 2047;
+	r2 = (r1 + -1023)|0;
+	if(r2 <0) //_LBB747_5
+{
+	r0 = 0;
+	r_g0 = r0;
+	r_g1 = r0;
+	return;
+}
+else{
+	r3 = heap32[(fp)];
+	r4 = r0 & 1048575;
+	r0 = r0 >> 31;
+	r4 = r4 | 1048576;
+	if(r2 <53) //_LBB747_3
+{
+	r2 = 1075;
+	r1 = (r2 - r1)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+	r1 = r_g0;
+	r3 = r_g1;
+}
+else{
+	r1 = (r1 + -1075)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+	r1 = r_g0;
+	r3 = r_g1;
+}
+	r2 = r3 ^ r0;
+	r1 = r1 ^ r0;
+	r3 = 1;
+	r4 = 0;
+	r2 = (r2 - r0)|0;
+	r3 = uint(r1) < uint(r0) ? r3 : r4;
+	r0 = (r1 - r0)|0;
+	r1 = (r2 - r3)|0;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+}
+
+function __floatdidf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var f0;
+	var f1;
+	var f2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	f0 = r0; //fitod r0, f0
+	f1 =                4294967296;
+	f2 = uint(r1); //fuitod r1, f2
+	f0 = f0*f1;
+	f0 = f2+f0;
+	f_g0 = f0;
+	return;
+}
+
+function __lshrdi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 & 32;
+	if(r2 ==0) //_LBB749_2
+{
+	r2 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB749_4
+{
+	r3 = 32;
+	r3 = (r3 - r0)|0;
+	r3 = r1 << r3;
+	r2 = r2 >>> r0;
+	r2 = r3 | r2;
+	r1 = r1 >>> r0;
+}
+	r_g0 = r2;
+	r_g1 = r1;
+	return;
+}
+else{
+	r0 = (r0 + -32)|0;
+	r0 = r1 >>> r0;
+	r1 = 0;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+}
+
+function __fixsfdi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >>> 23;
+	r1 = r1 & 255;
+	r2 = (r1 + -127)|0;
+	if(r2 <0) //_LBB750_5
+{
+	r0 = 0;
+	r_g0 = r0;
+	r_g1 = r0;
+	return;
+}
+else{
+	r3 = r0 & 8388607;
+	r0 = r0 >> 31;
+	r3 = r3 | 8388608;
+	r4 = 0;
+	if(r2 <24) //_LBB750_3
+{
+	r2 = 150;
+	r1 = (r2 - r1)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+	r1 = r_g0;
+	r3 = r_g1;
+}
+else{
+	r1 = (r1 + -150)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+	r1 = r_g0;
+	r3 = r_g1;
+}
+	r2 = r3 ^ r0;
+	r1 = r1 ^ r0;
+	r3 = 1;
+	r2 = (r2 - r0)|0;
+	r3 = uint(r1) < uint(r0) ? r3 : r4;
+	r0 = (r1 - r0)|0;
+	r1 = (r2 - r3)|0;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+}
+
+function __ashldi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+	r2 = r0 & 32;
+	if(r2 ==0) //_LBB751_2
+{
+	r2 = heap32[(fp+1)];
+if(!(r0 ==0)) //_LBB751_4
+{
+	r3 = 32;
+	r3 = (r3 - r0)|0;
+	r2 = r2 << r0;
+	r3 = r1 >>> r3;
+	r1 = r1 << r0;
+	r2 = r2 | r3;
+}
+	r_g0 = r1;
+	r_g1 = r2;
+	return;
+}
+else{
+	r0 = (r0 + -32)|0;
+	r2 = 0;
+	r0 = r1 << r0;
+	r_g0 = r2;
+	r_g1 = r0;
+	return;
+}
+}
+
+function __ashrdi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 & 32;
+	if(r2 ==0) //_LBB752_2
+{
+	r2 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB752_4
+{
+	r3 = 32;
+	r3 = (r3 - r0)|0;
+	r3 = r1 << r3;
+	r2 = r2 >>> r0;
+	r2 = r3 | r2;
+	r1 = r1 >> r0;
+}
+	r_g0 = r2;
+	r_g1 = r1;
+	return;
+}
+else{
+	r0 = (r0 + -32)|0;
+	r0 = r1 >> r0;
+	r1 = r1 >> 31;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+}
+
+function __fixunsdfdi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = sp + 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >>> 20;
+	r1 = r1 & 2047;
+	r2 = (r1 + -1023)|0;
+if(!(r2 <0)) //_LBB753_5
+{
+if(!(r0 <0)) //_LBB753_5
+{
+	r3 = heap32[(fp)];
+	r0 = r0 & 1048575;
+	r0 = r0 | 1048576;
+	if(r2 <53) //_LBB753_4
+{
+	r2 = 1075;
+	r1 = (r2 - r1)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+	return;
+}
+else{
+	r1 = (r1 + -1075)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+	return;
+}
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	r_g1 = r0;
+	return;
+}
+
+function __fixunssfdi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >>> 23;
+	r1 = r1 & 255;
+	r2 = (r1 + -127)|0;
+if(!(r2 <0)) //_LBB754_5
+{
+if(!(r0 <0)) //_LBB754_5
+{
+	r0 = r0 & 8388607;
+	r0 = r0 | 8388608;
+	r3 = 0;
+	if(r2 <24) //_LBB754_4
+{
+	r2 = 150;
+	r1 = (r2 - r1)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+	return;
+}
+else{
+	r1 = (r1 + -150)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+	return;
+}
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	r_g1 = r0;
+	return;
+}
+
+function _ZNK14CFileInterface12IsFileSystemEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout5freadEPvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout5ftellEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout4feofEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout5fseekEli(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout6ungetcEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout6fflushEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileStdout6fcloseEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK11CFileSystem12IsFileSystemEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileSystem5freadEPvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r0;
+	mandreel_fread(i7);
+	return;
+}
+
+function _ZN11CFileSystem6fwriteEPKvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileSystem6fflushEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN11CFileSystem6fcloseEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	heap32[(g0)] = r0;
+	mandreel_fclose(i7);
+	return;
+}
+
+function _ZN11CFileSystem5ftellEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	heap32[(g0)] = r0;
+	mandreel_ftell(i7);
+	return;
+}
+
+function _ZN11CFileSystem4feofEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	heap32[(g0)] = r0;
+	mandreel_feof(i7);
+	return;
+}
+
+function _ZN11CFileSystem5fseekEli(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	mandreel_fseek(i7);
+	return;
+}
+
+function _ZN11CFileSystem6ungetcEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(fp+1)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	mandreel_ungetc(i7);
+	return;
+}
+
+function _ZN7CFileLS5freadEPvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(r0+4)];
+	r4 = heap32[(r0+2)];
+	r2 = (r2 * r1)|0;
+	r5 = (r3 + r2)|0;
+	r6 = (r4 - r3)|0;
+	r2 = r5 > r4 ? r6 : r2;
+	if(r2 <0) //_LBB772_2
+{
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(r0+6)];
+	r3 = (r5 + r3)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r3 = heap32[(r0+4)];
+	r3 = (r3 + r2)|0;
+	heap32[(r0+4)] = r3;
+	r0 = Math.floor(uint(r2) /uint(r1));
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN7CFileLS5ftellEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN7CFileLS4feofEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+4)];
+	r0 = heap32[(r0+2)];
+	r0 = r1 >= r0;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN7CFileLS5fseekEli(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+_1: do {
+	if(r0 ==0) //_LBB775_4
+{
+	r1 = r1 >> 2;
+}
+else{
+	if(r0 ==1) //_LBB775_6
+{
+	r0 = r1 >> 2;
+	r1 = heap32[(r0+4)];
+	r1 = (r1 + r2)|0;
+	heap32[(r0+4)] = r1;
+}
+else{
+if(!(r0 !=2)) //_LBB775_7
+{
+	r1 = r1 >> 2;
+	r0 = heap32[(r1+2)];
+	r2 = (r0 + r2)|0;
+break _1;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	heap32[(r1+4)] = r2;
+	r1 = 0;
+	r_g0 = r1;
+	return;
+}
+
+function _ZN7CFileLS6ungetcEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10CFileCloud5freadEPvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	r3 = heap32[(r0+4)];
+	r4 = heap32[(r0+2)];
+	r2 = (r2 * r1)|0;
+	r5 = (r3 + r2)|0;
+	r6 = (r4 - r3)|0;
+	r2 = r5 > r4 ? r6 : r2;
+	if(r2 <0) //_LBB777_2
+{
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+else{
+	r4 = heap32[(fp+1)];
+	r5 = heap32[(r0+6)];
+	r3 = (r5 + r3)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r3 = heap32[(r0+4)];
+	r3 = (r3 + r2)|0;
+	heap32[(r0+4)] = r3;
+	r0 = Math.floor(uint(r2) /uint(r1));
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN10CFileCloud5ftellEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+4)];
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10CFileCloud4feofEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+4)];
+	r0 = heap32[(r0+2)];
+	r0 = r1 >= r0;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10CFileCloud5fseekEli(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+_1: do {
+	if(r0 ==0) //_LBB780_4
+{
+	r1 = r1 >> 2;
+}
+else{
+	if(r0 ==1) //_LBB780_6
+{
+	r0 = r1 >> 2;
+	r1 = heap32[(r0+4)];
+	r1 = (r1 + r2)|0;
+	heap32[(r0+4)] = r1;
+}
+else{
+if(!(r0 !=2)) //_LBB780_7
+{
+	r1 = r1 >> 2;
+	r0 = heap32[(r1+2)];
+	r2 = (r0 + r2)|0;
+break _1;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	heap32[(r1+4)] = r2;
+	r1 = 0;
+	r_g0 = r1;
+	return;
+}
+
+function _ZN10CFileCloud6ungetcEi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = -1;
+	r_g0 = r0;
+	return;
+}
+
+function __fwrite(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+if(!(uint(r0) >uint(9))) //_LBB782_2
+{
+	r0 = _ZL13s_file_stdout;
+}
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = r2;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+
+function _ZN7CFileLS6fwriteEPKvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+3)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+1)];
+	r2 = (r1 * r2)|0;
+	r4 = heap32[(r0+4)];
+	r5 = (r4 + r2)|0;
+	r6 = heap32[(r0+3)];
+	if(r5 >r6) //_LBB783_2
+{
+	r4 = (r2 + r4)|0;
+	r4 = (r4 + 131072)|0;
+	heap32[(r0+3)] = r4;
+	r5 = heap32[(r0+6)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	realloc(i7);
+	r5 = r_g0;
+	heap32[(r0+6)] = r5;
+	r4 = heap32[(r0+4)];
+}
+else{
+	r5 = heap32[(r0+6)];
+}
+	r4 = (r5 + r4)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r3 = heap32[(r0+4)];
+	r2 = (r3 + r2)|0;
+	heap32[(r0+4)] = r2;
+	r3 = heap32[(r0+5)];
+if(!(r2 <=r3)) //_LBB783_5
+{
+	heap32[(r0+5)] = r2;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN7CFileLS6fflushEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+5];
+if(!(r1 ==0)) //_LBB784_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+	r1 = heap32[(r1+6)];
+	r0 = (r0 + 28)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	mandreel_writels(i7);
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN7CFileLS6fcloseEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+5];
+if(!(r1 ==0)) //_LBB785_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+	r1 = heap32[(r1+6)];
+	r3 = (r0 + 28)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	mandreel_writels(i7);
+}
+	r1 = 0;
+	r2 = r0 >> 2;
+	heap8[r0+4] = r1;
+	r0 = heap32[(r2+6)];
+	heap32[(g0)] = r0;
+	free(i7);
+	r_g0 = r1;
+	return;
+}
+
+function _ZN10CFileCloud6fwriteEPKvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+3)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+1)];
+	r2 = (r1 * r2)|0;
+	r4 = heap32[(r0+4)];
+	r5 = (r4 + r2)|0;
+	r6 = heap32[(r0+3)];
+	if(r5 >r6) //_LBB786_2
+{
+	r4 = (r2 + r4)|0;
+	r4 = (r4 + 131072)|0;
+	heap32[(r0+3)] = r4;
+	r5 = heap32[(r0+6)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	realloc(i7);
+	r5 = r_g0;
+	heap32[(r0+6)] = r5;
+	r4 = heap32[(r0+4)];
+}
+else{
+	r5 = heap32[(r0+6)];
+}
+	r4 = (r5 + r4)|0;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r2;
+	memcpy(i7);
+	r3 = heap32[(r0+4)];
+	r2 = (r3 + r2)|0;
+	heap32[(r0+4)] = r2;
+	r3 = heap32[(r0+5)];
+if(!(r2 <=r3)) //_LBB786_5
+{
+	heap32[(r0+5)] = r2;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN10CFileCloud6fflushEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+5];
+if(!(r1 ==0)) //_LBB787_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+	r3 = r2 << 1;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r4 = r_g0;
+	r1 = heap32[(r1+6)];
+	r5 = sp + -4;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r5;
+	_ZN12mandreel_b64L11b64_encode_EPKhjPcjjPNS_6B64_RCE(i7);
+	r0 = (r0 + 28)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r_g0;
+	mandreel_writecloud(i7);
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10CFileCloud6fcloseEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0+5];
+if(!(r1 ==0)) //_LBB788_2
+{
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+5)];
+	r3 = r2 << 1;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r4 = r_g0;
+	r1 = heap32[(r1+6)];
+	r5 = sp + -4;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r5;
+	_ZN12mandreel_b64L11b64_encode_EPKhjPcjjPNS_6B64_RCE(i7);
+	r2 = (r0 + 28)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r_g0;
+	mandreel_writecloud(i7);
+	heap32[(g0)] = r4;
+	free(i7);
+}
+	r1 = 0;
+	r2 = r0 >> 2;
+	heap8[r0+4] = r1;
+	r0 = heap32[(r2+6)];
+	heap32[(g0)] = r0;
+	free(i7);
+	r_g0 = r1;
+	return;
+}
+
+function __sync_val_compare_and_swap_4(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0)];
+	r2 = heap32[(fp+1)];
+if(!(r1 !=r2)) //_LBB789_2
+{
+	r2 = heap32[(fp+2)];
+	heap32[(r0)] = r2;
+}
+	r_g0 = r1;
+	return;
+}
+
+function _ZN11CFileStdout6fwriteEPKvjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16392;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+3)];
+	r0 = (r1 * r0)|0;
+	if(r0 !=0) //_LBB790_2
+{
+	r2 = heap32[(fp+1)];
+	r3 = sp + -16384;
+	r4 = r0;
+_3: while(true){
+	r5 = heapU8[r2];
+	r4 = (r4 + -1)|0;
+	r2 = (r2 + 1)|0;
+	r6 = (r3 + 1)|0;
+	heap8[r3] = r5;
+	r3 = r6;
+if(!(r4 !=0)) //_LBB790_3
+{
+break _3;
+}
+}
+	r2 = sp + -16384;
+	r0 = (r2 + r0)|0;
+}
+else{
+	r0 = sp + -16384;
+}
+	r2 = 0;
+	heap8[r0] = r2;
+	r0 = sp + -16384;
+	heap32[(g0)] = r0;
+	puts(i7);
+	r_g0 = r1;
+	return;
+}
+
+function fopen(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -2064;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heapU8[r0];
+	r2 = 46;
+	r3 = 92;
+	r4 = heapU8[r0+1];
+	r5 = 47;
+	r1 = r1 == r2;
+	r2 = r4 == r3;
+	r1 = r1 & r2;
+	r2 = r4 == r5;
+	r1 = r1 | r2;
+	r2 = (r0 + 1)|0;
+	r1 = r1 != 0 ? r2 : r0;
+	r2 = heapU8[r1];
+	r3 = heap32[(fp+1)];
+_1: do {
+	if(r2 !=0) //_LBB791_2
+{
+	r4 = sp + -2048;
+	r1 = (r1 + 1)|0;
+	r6 = 0;
+	r8 = 26;
+_3: while(true){
+	r7 = r2 & 255;
+	if(r7 ==47) //_LBB791_5
+{
+__label__ = 5;
+}
+else{
+	if(r7 !=92) //_LBB791_8
+{
+	r6 = r2 << 24;
+	r6 = r6 >> 24;
+	r7 = (r6 + -65)|0;
+	r9 = (r2 + 32)|0;
+	r10 = (r4 + 1)|0;
+	r6 = 0;
+	r2 = uint(r7) < uint(r8) ? r9 : r2;
+	heap8[r4] = r2;
+	r4 = r10;
+__label__ = 9;
+}
+else{
+__label__ = 5;
+}
+}
+if (__label__ == 5){
+	r2 = r6 & 255;
+	heap8[r4] = r5;
+	if(r2 ==0) //_LBB791_7
+{
+	r4 = (r4 + 1)|0;
+	r6 = 1;
+}
+else{
+	r6 = 1;
+}
+}
+	r2 = heapU8[r1];
+	if(r2 !=0) //_LBB791_11
+{
+	r1 = (r1 + 1)|0;
+continue _3;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	r4 = sp + -2048;
+}
+} while(0);
+	r1 = 0;
+	heap8[r4] = r1;
+	r2 = sp + -2048;
+	r4 = _2E_str33679;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 4;
+	strncmp(i7);
+	r4 = r_g0;
+_17: do {
+	if(r4 !=0) //_LBB791_29
+{
+	r4 = _2E_str34680;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = 4;
+	strncmp(i7);
+	r4 = r_g0;
+	if(r4 ==0) //_LBB791_31
+{
+	heap32[(g0)] = 0;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	r0 = _2E_str31677;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+_21: do {
+	if(r0 !=0) //_LBB791_33
+{
+	r0 = _2E_str4651;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB791_32
+{
+__label__ = 30;
+}
+else{
+	r0 = _2E_str5652;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB791_36
+{
+	r0 = _2E_str32678;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB791_35
+{
+	r4 = heapU8[r3];
+	r0 = 119;
+	r3 = 114;
+	r0 = r4 == r0;
+	r5 = r4 == r3;
+	r3 = r0 & 1;
+	r0 = r5 & 1;
+	if(r4 ==114) //_LBB791_39
+{
+__label__ = 36;
+break _21;
+}
+else{
+__label__ = 38;
+break _21;
+}
+}
+}
+	r0 = 1;
+	r1 = 0;
+	r3 = r0;
+__label__ = 38;
+}
+}
+else{
+__label__ = 30;
+}
+} while(0);
+if (__label__ == 30){
+	r0 = 1;
+	r3 = r0;
+__label__ = 36;
+}
+if (__label__ == 36){
+	heap32[(g0)] = r2;
+	mandreel_opencloud(i7);
+	r1 = r_g0;
+	if(r1 ==-1) //_LBB791_41
+{
+	r4 = 0;
+break _17;
+}
+}
+	heap32[(g0)] = 284;
+	_Znwj(i7);
+	r4 = r_g0;
+	r5 = _ZTV10CFileCloud;
+	r6 = r4 >> 2;
+	r5 = (r5 + 8)|0;
+	r7 = 1;
+	heap32[(r6)] = r5;
+	heap8[r4+4] = r7;
+	heap32[(r6+4)] = 0;
+	heap32[(r6+6)] = 0;
+	heap32[(r6+2)] = r1;
+	heap8[r4+5] = r3;
+	heap8[r4+6] = r0;
+	heap32[(r6+5)] = 0;
+	r0 = (r4 + 28)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	strcpy(i7);
+	if(r1 ==0) //_LBB791_44
+{
+	r0 = r3 & 255;
+	if(r0 ==0) //_LBB791_46
+{
+break _17;
+}
+else{
+	r0 = r4 >> 2;
+	heap32[(r0+3)] = 131072;
+	heap32[(g0)] = 131072;
+	malloc(i7);
+	heap32[(r0+6)] = r_g0;
+}
+}
+else{
+	r3 = (r1 + 131072)|0;
+	r2 = r4 >> 2;
+	heap32[(r2+3)] = r3;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	heap32[(r2+6)] = r_g0;
+	r3 = (r1 + 4)|0;
+	heap32[(g0)] = r3;
+	malloc(i7);
+	r3 = r_g0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r1;
+	mandreel_readcloud(i7);
+	r0 = heap32[(r2+3)];
+	r5 = heap32[(r2+6)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r0;
+	_ZN12mandreel_b6410b64_decodeEPKcjPvj(i7);
+	r0 = r_g0;
+	heap32[(g0)] = r3;
+	free(i7);
+	heap32[(r2+2)] = r0;
+	heap32[(r2+5)] = r0;
+}
+}
+else{
+	r1 = r3;
+_39: while(true){
+	r4 = heapU8[r1];
+	if(r4 ==0) //_LBB791_51
+{
+__label__ = 46;
+break _39;
+}
+else{
+	if(r4 ==87) //_LBB791_50
+{
+__label__ = 45;
+break _39;
+}
+else{
+	r1 = (r1 + 1)|0;
+	if(r4 !=119) //_LBB791_47
+{
+__label__ = 42;
+}
+else{
+__label__ = 45;
+break _39;
+}
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 46:
+	r0 = heapU8[sp+-2048];
+	if(r0 !=47) //_LBB791_53
+{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	mandreel_fopen(i7);
+	r2 = r_g0;
+}
+else{
+	r2 = (r2 + 1)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	mandreel_fopen(i7);
+	r2 = r_g0;
+}
+	if(r2 ==0) //_LBB791_56
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	heap32[(g0)] = 8;
+	r0 = _ZTV11CFileSystem;
+	_Znwj(i7);
+	r3 = r_g0 >> 2;
+	r0 = (r0 + 8)|0;
+	heap32[(r3)] = r0;
+	heap32[(r3+1)] = r2;
+	return;
+}
+break;
+case 45:
+	r2 = _2E_str35681;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	printf(i7);
+	r2 = 0;
+	r_g0 = r2;
+	return;
+break;
+}
+}
+}
+else{
+	heap32[(g0)] = 0;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	r0 = _2E_str31677;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+_54: do {
+	if(r0 !=0) //_LBB791_15
+{
+	r0 = _2E_str4651;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+	if(r0 ==0) //_LBB791_14
+{
+__label__ = 13;
+}
+else{
+	r0 = _2E_str5652;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+	if(r0 !=0) //_LBB791_18
+{
+	r0 = _2E_str32678;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+if(!(r0 ==0)) //_LBB791_17
+{
+	r3 = heapU8[r3];
+	r0 = 119;
+	r1 = 114;
+	r0 = r3 == r0;
+	r4 = r3 == r1;
+	r1 = r0 & 1;
+	r0 = r4 & 1;
+	if(r3 ==114) //_LBB791_21
+{
+__label__ = 20;
+break _54;
+}
+else{
+	r3 = 0;
+__label__ = 22;
+break _54;
+}
+}
+}
+	r0 = 1;
+	r3 = 0;
+	r1 = r0;
+__label__ = 22;
+}
+}
+else{
+__label__ = 13;
+}
+} while(0);
+if (__label__ == 13){
+	r0 = 1;
+	r1 = r0;
+__label__ = 20;
+}
+if (__label__ == 20){
+	heap32[(g0)] = r2;
+	mandreel_openls(i7);
+	r3 = r_g0;
+	if(r3 ==-1) //_LBB791_23
+{
+	r4 = 0;
+break _17;
+}
+}
+	heap32[(g0)] = 284;
+	_Znwj(i7);
+	r4 = r_g0;
+	r5 = _ZTV7CFileLS;
+	r6 = r4 >> 2;
+	r5 = (r5 + 8)|0;
+	r7 = 1;
+	heap32[(r6)] = r5;
+	heap8[r4+4] = r7;
+	heap32[(r6+4)] = 0;
+	heap32[(r6+6)] = 0;
+	heap32[(r6+2)] = r3;
+	heap8[r4+5] = r1;
+	heap8[r4+6] = r0;
+	heap32[(r6+5)] = 0;
+	r0 = (r4 + 28)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	strcpy(i7);
+	if(r3 ==0) //_LBB791_26
+{
+	r0 = r1 & 255;
+if(!(r0 ==0)) //_LBB791_28
+{
+	r0 = r4 >> 2;
+	heap32[(r0+3)] = 131072;
+	heap32[(g0)] = 131072;
+	malloc(i7);
+	heap32[(r0+6)] = r_g0;
+}
+}
+else{
+	r1 = (r3 + 131072)|0;
+	r2 = r4 >> 2;
+	heap32[(r2+3)] = r1;
+	heap32[(g0)] = r1;
+	malloc(i7);
+	heap32[(r2+6)] = r_g0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r_g0;
+	heap32[(g0+2)] = r3;
+	mandreel_readls(i7);
+	heap32[(r2+5)] = r3;
+}
+}
+} while(0);
+	heap32[(g0)] = 1;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	r_g0 = r4;
+	return;
+}
+
+function strtoul(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap8[r0];
+	r2 = r1 << 2;
+	r3 = my_ctype;
+	r2 = (r2 + r3)|0;
+	r4 = heap32[(fp+1)];
+	r2 = heapU8[r2+4];
+	r2 = r2 & 8;
+	if(r2 ==0) //_LBB792_2
+{
+	r2 = r0;
+}
+else{
+	r2 = r0;
+_4: while(true){
+	r1 = heap8[r2+1];
+	r5 = r1 << 2;
+	r5 = (r5 + r3)|0;
+	r2 = (r2 + 1)|0;
+	r5 = heapU8[r5+4];
+	r5 = r5 & 8;
+	if(r5 !=0) //_LBB792_3
+{
+continue _4;
+}
+else{
+break _4;
+}
+}
+}
+	r1 = r1 & 255;
+	if(r1 ==43) //_LBB792_8
+{
+	r2 = (r2 + 1)|0;
+	r1 = 0;
+}
+else{
+	if(r1 ==45) //_LBB792_7
+{
+	r2 = (r2 + 1)|0;
+	r1 = 1;
+}
+else{
+	r1 = 0;
+}
+}
+	r3 = 0;
+	r5 = r3;
+	r6 = r3;
+	r11 = -1;
+_14: while(true){
+	r8 = (r2 - r3)|0;
+	r7 = heapU8[r8];
+	if(r7 ==0) //_LBB792_14
+{
+break _14;
+}
+else{
+	if(uint(r7) <uint(65)) //_LBB792_10
+{
+	r9 = r7 & 255;
+	r10 = 58;
+	r7 = (r7 + -48)|0;
+	r7 = uint(r9) < uint(r10) ? r7 : r11;
+	r7 = r7 & 255;
+	if(uint(r7) >uint(9)) //_LBB792_14
+{
+break _14;
+}
+else{
+	r8 = r6 & 255;
+	r8 = (r8 * 10)|0;
+	r7 = (r7 + r8)|0;
+	r6 = r6 >>> 8;
+	r8 = r7 >>> 8;
+	r6 = (r6 * 10)|0;
+	r6 = (r8 + r6)|0;
+	r8 = 16777215;
+	r9 = 1;
+	r10 = r6 << 8;
+	r7 = r7 & 255;
+	r5 = uint(r6) > uint(r8) ? r9 : r5;
+	r6 = r10 | r7;
+	r3 = (r3 + -1)|0;
+continue _14;
+}
+}
+else{
+break _14;
+}
+}
+}
+	if(r3 ==0) //_LBB792_16
+{
+	_errno(i7);
+	r6 = 0;
+	r8 = r_g0 >> 2;
+	heap32[(r8)] = 22;
+	r8 = r0;
+}
+if(!(r4 ==0)) //_LBB792_19
+{
+	r0 = r4 >> 2;
+	heap32[(r0)] = r8;
+}
+	if(r5 ==0) //_LBB792_21
+{
+	r0 = 0;
+	r0 = (r0 - r6)|0;
+	r0 = r1 == 0 ? r6 : r0;
+	r_g0 = r0;
+	return;
+}
+else{
+	_errno(i7);
+	r1 = r_g0 >> 2;
+	heap32[(r1)] = 34;
+	r1 = -1;
+	r_g0 = r1;
+	return;
+}
+}
+
+function strtol(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap8[r0];
+	r2 = r1 << 2;
+	r3 = my_ctype;
+	r2 = (r2 + r3)|0;
+	r4 = heap32[(fp+1)];
+	r2 = heapU8[r2+4];
+	r2 = r2 & 8;
+	if(r2 ==0) //_LBB793_2
+{
+	r2 = r0;
+}
+else{
+	r2 = r0;
+_4: while(true){
+	r1 = heap8[r2+1];
+	r5 = r1 << 2;
+	r5 = (r5 + r3)|0;
+	r2 = (r2 + 1)|0;
+	r5 = heapU8[r5+4];
+	r5 = r5 & 8;
+	if(r5 !=0) //_LBB793_3
+{
+continue _4;
+}
+else{
+break _4;
+}
+}
+}
+	r1 = r1 & 255;
+	if(r1 ==45) //_LBB793_6
+{
+	r1 = heap8[r2+1];
+	r1 = r1 << 2;
+	r3 = (r1 + r3)|0;
+	r3 = heapU16[(r3+4)>>1];
+	r3 = r3 & 263;
+	if(r3 ==0) //_LBB793_5
+{
+__label__ = 5;
+}
+else{
+	r2 = (r2 + 1)|0;
+	r3 = -1;
+__label__ = 8;
+}
+}
+else{
+__label__ = 5;
+}
+if (__label__ == 5){
+	r3 = 0;
+}
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	strtoul(i7);
+	r1 = r_g0;
+if(!(r4 ==0)) //_LBB793_11
+{
+	r4 = r4 >> 2;
+	r5 = heap32[(r4)];
+if(!(r5 !=r2)) //_LBB793_11
+{
+	heap32[(r4)] = r0;
+}
+}
+	if(r1 >-1) //_LBB793_16
+{
+	r0 = 0;
+	r0 = (r0 - r1)|0;
+	r0 = r3 == 0 ? r1 : r0;
+	r_g0 = r0;
+	return;
+}
+else{
+	_errno(i7);
+	r0 = r_g0;
+if(!(r1 !=-2147483648)) //_LBB793_15
+{
+if(!(r3 ==0)) //_LBB793_15
+{
+	r0 = r0 >> 2;
+	heap32[(r0)] = 0;
+	r_g0 = r1;
+	return;
+}
+}
+	r1 = r0 >> 2;
+	r0 = 2147483647;
+	r2 = -2147483648;
+	heap32[(r1)] = 34;
+	r1 = r3 == 0 ? r0 : r2;
+	r_g0 = r1;
+	return;
+}
+}
+
+function __floatundidf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 | r1;
+	if(r2 ==0) //_LBB794_12
+{
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+else{
+	r2 = r0 >>> 1;
+	r3 = r1 >>> 1;
+	r2 = r0 | r2;
+	r3 = r1 | r3;
+	r4 = r2 >>> 2;
+	r5 = r3 >>> 2;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 4;
+	r5 = r3 >>> 4;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 8;
+	r5 = r3 >>> 8;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 16;
+	r5 = r3 >>> 16;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 ^ -1;
+	r5 = 1431655765;
+	r6 = r3 ^ -1;
+	r4 = r4 >>> 1;
+	r6 = r6 >>> 1;
+	r2 = r5 & (~r2);
+	r4 = r4 & 1431655765;
+	r2 = (r2 + r4)|0;
+	r3 = r5 & (~r3);
+	r4 = r6 & 1431655765;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 2;
+	r5 = r3 >>> 2;
+	r2 = r2 & 858993459;
+	r4 = r4 & 858993459;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 858993459;
+	r4 = r5 & 858993459;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 4;
+	r5 = r3 >>> 4;
+	r2 = r2 & 252645135;
+	r4 = r4 & 252645135;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 252645135;
+	r4 = r5 & 252645135;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 8;
+	r5 = r3 >>> 8;
+	r2 = r2 & 16711935;
+	r4 = r4 & 16711935;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 16711935;
+	r4 = r5 & 16711935;
+	r3 = (r3 + r4)|0;
+	r4 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r2 = (r4 + r2)|0;
+	r4 = r3 & 65535;
+	r3 = r3 >>> 16;
+	r3 = (r4 + r3)|0;
+	r2 = (r2 + 32)|0;
+	r4 = 64;
+	r2 = r1 != 0 ? r3 : r2;
+	r3 = 63;
+	r4 = (r4 - r2)|0;
+	r2 = (r3 - r2)|0;
+	if(r4 <54) //_LBB794_10
+{
+	r3 = 53;
+	r3 = (r3 - r4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__ashldi3(i7);
+	r3 = r_g0;
+	r1 = r_g1;
+}
+else{
+	if(r4 ==54) //_LBB794_5
+{
+	r1 = r1 << 1;
+	r3 = r0 >>> 31;
+	r0 = r0 << 1;
+	r1 = r1 | r3;
+}
+else{
+	if(r4 !=55) //_LBB794_6
+{
+	r3 = (r4 + -55)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__lshrdi3(i7);
+	r3 = r_g0;
+	r5 = r_g1;
+	r6 = 119;
+	r6 = (r6 - r4)|0;
+	heap32[(g0)] = -1;
+	heap32[(g0+1)] = -1;
+	heap32[(g0+2)] = r6;
+	__lshrdi3(i7);
+	r0 = r_g0 & r0;
+	r1 = r_g1 & r1;
+	r0 = r0 | r1;
+	r1 = 0;
+	r0 = r0 != r1;
+	r0 = r0 & 1;
+	r0 = r0 | r3;
+	r1 = r5;
+}
+}
+	r3 = r0 >>> 2;
+	r3 = r3 & 1;
+	r0 = r3 | r0;
+	r3 = (r0 + 1)|0;
+	r5 = 1;
+	r6 = 0;
+	r0 = uint(r3) < uint(r0) ? r5 : r6;
+	r0 = r3 == 0 ? r5 : r0;
+	r0 = (r1 + r0)|0;
+	r1 = r0 >>> 2;
+	r5 = r1 & 2097152;
+	if(r5 !=0) //_LBB794_9
+{
+	r1 = r3 >>> 3;
+	r2 = r0 << 29;
+	r3 = r1 | r2;
+	r1 = r0 >>> 3;
+	r2 = r4;
+}
+else{
+	r3 = r3 >>> 2;
+	r0 = r0 << 30;
+	r3 = r3 | r0;
+}
+}
+	r0 = r2 << 20;
+	r2 = sp + -8;
+	r1 = r1 & 1048575;
+	r0 = (r0 + 1072693248)|0;
+	r2 = r2 >> 2;
+	r0 = r1 | r0;
+	heap32[(fp+-2)] = r3;
+	heap32[(r2+1)] = r0;
+	f0 = llvm_readDouble((sp+-8));
+	f_g0 = f0;
+	return;
+}
+}
+
+function __udivmoddi4(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+_1: do {
+	if(r0 !=0) //_LBB795_10
+{
+_3: do {
+	if(r3 !=0) //_LBB795_27
+{
+	if(r4 !=0) //_LBB795_34
+{
+	r5 = r4 >>> 1;
+	r6 = r0 >>> 1;
+	r5 = r4 | r5;
+	r6 = r0 | r6;
+	r7 = r5 >>> 2;
+	r9 = r6 >>> 2;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 4;
+	r9 = r6 >>> 4;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 8;
+	r9 = r6 >>> 8;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 16;
+	r9 = r6 >>> 16;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 ^ -1;
+	r9 = r6 ^ -1;
+	r8 = 1431655765;
+	r7 = r7 >>> 1;
+	r9 = r9 >>> 1;
+	r5 = r8 & (~r5);
+	r7 = r7 & 1431655765;
+	r6 = r8 & (~r6);
+	r9 = r9 & 1431655765;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 2;
+	r9 = r6 >>> 2;
+	r5 = r5 & 858993459;
+	r7 = r7 & 858993459;
+	r6 = r6 & 858993459;
+	r9 = r9 & 858993459;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 4;
+	r9 = r6 >>> 4;
+	r5 = r5 & 252645135;
+	r7 = r7 & 252645135;
+	r6 = r6 & 252645135;
+	r9 = r9 & 252645135;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 8;
+	r9 = r6 >>> 8;
+	r5 = r5 & 16711935;
+	r7 = r7 & 16711935;
+	r6 = r6 & 16711935;
+	r9 = r9 & 16711935;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 & 65535;
+	r5 = r5 >>> 16;
+	r9 = r6 & 65535;
+	r6 = r6 >>> 16;
+	r5 = (r7 + r5)|0;
+	r6 = (r9 + r6)|0;
+	r5 = (r5 - r6)|0;
+	if(uint(r5) <uint(32)) //_LBB795_37
+{
+	r6 = 31;
+	r7 = (r5 + 1)|0;
+	r9 = (r5 + -31)|0;
+	r5 = (r6 - r5)|0;
+	r6 = r2 >>> r7;
+	r8 = r9 >> 31;
+	r10 = r0 >>> r7;
+	r6 = r6 & r8;
+	r0 = r0 << r5;
+	r9 = 0;
+	r2 = r2 << r5;
+	r5 = r6 | r0;
+	r6 = r10 & r8;
+__label__ = 39;
+break _3;
+}
+else{
+	if(r1 ==0) //_LBB795_7
+{
+__label__ = 7;
+break _1;
+}
+else{
+	r5 = r1 >> 2;
+	heap32[(r5)] = r2;
+	heap32[(r5+1)] = r0;
+	r2 = 0;
+	r_g0 = r2;
+	r_g1 = r2;
+	return;
+}
+}
+}
+else{
+	r5 = (r3 + -1)|0;
+	r6 = r5 & r3;
+	if(r6 !=0) //_LBB795_38
+{
+	r5 = r3 >>> 1;
+	r6 = r0 >>> 1;
+	r5 = r3 | r5;
+	r6 = r0 | r6;
+	r7 = r5 >>> 2;
+	r9 = r6 >>> 2;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 4;
+	r9 = r6 >>> 4;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 8;
+	r9 = r6 >>> 8;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 >>> 16;
+	r9 = r6 >>> 16;
+	r5 = r5 | r7;
+	r6 = r6 | r9;
+	r7 = r5 ^ -1;
+	r9 = r6 ^ -1;
+	r8 = 1431655765;
+	r7 = r7 >>> 1;
+	r9 = r9 >>> 1;
+	r5 = r8 & (~r5);
+	r7 = r7 & 1431655765;
+	r6 = r8 & (~r6);
+	r9 = r9 & 1431655765;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 2;
+	r9 = r6 >>> 2;
+	r5 = r5 & 858993459;
+	r7 = r7 & 858993459;
+	r6 = r6 & 858993459;
+	r9 = r9 & 858993459;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 4;
+	r9 = r6 >>> 4;
+	r5 = r5 & 252645135;
+	r7 = r7 & 252645135;
+	r6 = r6 & 252645135;
+	r9 = r9 & 252645135;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 >>> 8;
+	r9 = r6 >>> 8;
+	r5 = r5 & 16711935;
+	r7 = r7 & 16711935;
+	r6 = r6 & 16711935;
+	r9 = r9 & 16711935;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r9)|0;
+	r7 = r5 & 65535;
+	r5 = r5 >>> 16;
+	r9 = r6 & 65535;
+	r6 = r6 >>> 16;
+	r5 = (r7 + r5)|0;
+	r6 = (r9 + r6)|0;
+	r5 = (r5 - r6)|0;
+	r6 = 31;
+	r7 = (r5 + 33)|0;
+	r9 = r5 ^ -1;
+	r8 = (r5 + 1)|0;
+	r6 = (r6 - r5)|0;
+	r10 = -2;
+	r10 = (r10 - r5)|0;
+	r11 = r0 << r6;
+	r12 = r2 >>> r8;
+	r13 = r2 >>> r7;
+	r14 = r0 << r9;
+	r11 = r11 | r12;
+	r12 = r9 >> 31;
+	r9 = r2 << r9;
+	r5 = r5 >> 31;
+	r13 = r13 | r14;
+	r14 = r8 >> 31;
+	r8 = r0 >>> r8;
+	r10 = r10 >> 31;
+	r2 = r2 << r6;
+	r0 = r0 >>> r7;
+	r6 = r11 & r12;
+	r5 = r9 & r5;
+	r11 = r13 & r14;
+	r8 = r8 & r10;
+	r9 = r2 & r12;
+	r2 = r6 | r5;
+	r5 = r11 | r8;
+	r6 = r0 & r14;
+	if(r7 ==0) //_LBB795_40
+{
+	r0 = 0;
+	r3 = r0;
+__label__ = 42;
+break _3;
+}
+else{
+__label__ = 39;
+break _3;
+}
+}
+else{
+if(!(r1 ==0)) //_LBB795_31
+{
+	r1 = r1 >> 2;
+	r4 = r5 & r2;
+	heap32[(r1)] = r4;
+	heap32[(r1+1)] = 0;
+}
+	if(r3 !=1) //_LBB795_33
+{
+	r1 = r5 & (~r3);
+	r3 = r1 >>> 1;
+	r1 = r1 & 1431655765;
+	r3 = r3 & 1431655765;
+	r1 = (r1 + r3)|0;
+	r3 = r1 >>> 2;
+	r1 = r1 & 858993459;
+	r3 = r3 & 858993459;
+	r1 = (r1 + r3)|0;
+	r3 = r1 >>> 4;
+	r1 = r1 & 252645135;
+	r3 = r3 & 252645135;
+	r1 = (r1 + r3)|0;
+	r3 = r1 >>> 8;
+	r1 = r1 & 16711935;
+	r3 = r3 & 16711935;
+	r1 = (r1 + r3)|0;
+	r3 = r1 & 65535;
+	r1 = r1 >>> 16;
+	r1 = (r3 + r1)|0;
+	r3 = 32;
+	r3 = (r3 - r1)|0;
+	r3 = r0 << r3;
+	r2 = r2 >>> r1;
+	r2 = r3 | r2;
+	r0 = r0 >>> r1;
+__label__ = 44;
+break _1;
+}
+else{
+__label__ = 44;
+break _1;
+}
+}
+}
+}
+else{
+	if(r4 !=0) //_LBB795_15
+{
+	if(r2 !=0) //_LBB795_19
+{
+	r5 = (r4 + -1)|0;
+	r6 = r5 & r4;
+	if(r6 !=0) //_LBB795_23
+{
+	r5 = r4 >>> 1;
+	r6 = r0 >>> 1;
+	r5 = r4 | r5;
+	r6 = r0 | r6;
+	r7 = r5 >>> 2;
+	r8 = r6 >>> 2;
+	r5 = r5 | r7;
+	r6 = r6 | r8;
+	r7 = r5 >>> 4;
+	r8 = r6 >>> 4;
+	r5 = r5 | r7;
+	r6 = r6 | r8;
+	r7 = r5 >>> 8;
+	r8 = r6 >>> 8;
+	r5 = r5 | r7;
+	r6 = r6 | r8;
+	r7 = r5 >>> 16;
+	r8 = r6 >>> 16;
+	r5 = r5 | r7;
+	r6 = r6 | r8;
+	r7 = r5 ^ -1;
+	r8 = r6 ^ -1;
+	r9 = 1431655765;
+	r7 = r7 >>> 1;
+	r8 = r8 >>> 1;
+	r5 = r9 & (~r5);
+	r7 = r7 & 1431655765;
+	r6 = r9 & (~r6);
+	r8 = r8 & 1431655765;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r8)|0;
+	r7 = r5 >>> 2;
+	r8 = r6 >>> 2;
+	r5 = r5 & 858993459;
+	r7 = r7 & 858993459;
+	r6 = r6 & 858993459;
+	r8 = r8 & 858993459;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r8)|0;
+	r7 = r5 >>> 4;
+	r8 = r6 >>> 4;
+	r5 = r5 & 252645135;
+	r7 = r7 & 252645135;
+	r6 = r6 & 252645135;
+	r8 = r8 & 252645135;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r8)|0;
+	r7 = r5 >>> 8;
+	r8 = r6 >>> 8;
+	r5 = r5 & 16711935;
+	r7 = r7 & 16711935;
+	r6 = r6 & 16711935;
+	r8 = r8 & 16711935;
+	r5 = (r5 + r7)|0;
+	r6 = (r6 + r8)|0;
+	r7 = r5 & 65535;
+	r5 = r5 >>> 16;
+	r8 = r6 & 65535;
+	r6 = r6 >>> 16;
+	r5 = (r7 + r5)|0;
+	r6 = (r8 + r6)|0;
+	r5 = (r5 - r6)|0;
+	if(uint(r5) <uint(31)) //_LBB795_26
+{
+	r6 = 31;
+	r7 = (r5 + 1)|0;
+	r5 = (r6 - r5)|0;
+	r6 = r0 << r5;
+	r8 = r2 >>> r7;
+	r9 = 0;
+	r2 = r2 << r5;
+	r5 = r6 | r8;
+	r6 = r0 >>> r7;
+__label__ = 39;
+break _3;
+}
+else{
+	if(r1 ==0) //_LBB795_7
+{
+__label__ = 7;
+break _1;
+}
+else{
+	r1 = r1 >> 2;
+	heap32[(r1)] = r2;
+	heap32[(r1+1)] = r0;
+__label__ = 9;
+break _1;
+}
+}
+}
+else{
+if(!(r1 ==0)) //_LBB795_22
+{
+	r1 = r1 >> 2;
+	r3 = r5 & r0;
+	heap32[(r1)] = r2;
+	heap32[(r1+1)] = r3;
+}
+	r1 = (r4 + -1)|0;
+	r1 = r1 & (~r4);
+	r2 = r1 >>> 1;
+	r1 = r1 & 1431655765;
+	r2 = r2 & 1431655765;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 2;
+	r1 = r1 & 858993459;
+	r2 = r2 & 858993459;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 4;
+	r1 = r1 & 252645135;
+	r2 = r2 & 252645135;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 8;
+	r1 = r1 & 16711935;
+	r2 = r2 & 16711935;
+	r1 = (r1 + r2)|0;
+	r2 = r1 & 65535;
+	r1 = r1 >>> 16;
+	r1 = (r2 + r1)|0;
+	r0 = r0 >>> r1;
+__label__ = 5;
+break _1;
+}
+}
+else{
+if(!(r1 ==0)) //_LBB795_18
+{
+	r1 = r1 >> 2;
+	r2 = Math.floor(uint(r0) % uint(r4));
+	heap32[(r1)] = 0;
+	heap32[(r1+1)] = r2;
+}
+	r0 = Math.floor(uint(r0) /uint(r4));
+__label__ = 5;
+break _1;
+}
+}
+else{
+if(!(r1 ==0)) //_LBB795_14
+{
+	r1 = r1 >> 2;
+	r2 = Math.floor(uint(r0) % uint(r3));
+	heap32[(r1)] = r2;
+	heap32[(r1+1)] = 0;
+}
+	r0 = Math.floor(uint(r0) /uint(r3));
+__label__ = 5;
+break _1;
+}
+}
+} while(0);
+if (__label__ == 39){
+	r8 = (r3 + -1)|0;
+	r10 = 0;
+	r11 = 1;
+	r0 = uint(r8) < uint(r3) ? r11 : r10;
+	r0 = r3 != 0 ? r11 : r0;
+	r0 = (r4 + r0)|0;
+	r12 = (r0 + -1)|0;
+	r13 = r10;
+_45: while(true){
+	r0 = r5 << 1;
+	r14 = r2 >>> 31;
+	r6 = r6 << 1;
+	r5 = r5 >>> 31;
+	r14 = r0 | r14;
+	r0 = r6 | r5;
+	r5 = (r12 - r0)|0;
+	r6 = uint(r8) < uint(r14) ? r11 : r10;
+	r5 = (r5 - r6)|0;
+	r5 = r5 >> 31;
+	r6 = r5 & r3;
+	r15 = r5 & r4;
+	r16 = r9 << 1;
+	r2 = r2 << 1;
+	r17 = r9 >>> 31;
+	r15 = (r0 - r15)|0;
+	r18 = uint(r14) < uint(r6) ? r11 : r10;
+	r7 = (r7 + -1)|0;
+	r0 = r5 & 1;
+	r9 = r13 | r16;
+	r2 = r2 | r17;
+	r5 = (r14 - r6)|0;
+	r6 = (r15 - r18)|0;
+	r13 = r0;
+if(!(r7 !=0)) //_LBB795_42
+{
+break _45;
+}
+}
+	r3 = 0;
+}
+	r2 = r2 << 1;
+	r4 = r9 >>> 31;
+	r7 = r9 << 1;
+	r4 = r2 | r4;
+	r2 = r0 | r7;
+	r0 = r3 | r4;
+	if(r1 !=0) //_LBB795_46
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = r5;
+	heap32[(r1+1)] = r6;
+__label__ = 44;
+break _1;
+}
+else{
+__label__ = 44;
+break _1;
+}
+}
+else{
+	if(r4 !=0) //_LBB795_6
+{
+	if(r1 !=0) //_LBB795_8
+{
+	r0 = r1 >> 2;
+	heap32[(r0)] = r2;
+	heap32[(r0+1)] = 0;
+__label__ = 9;
+break _1;
+}
+else{
+__label__ = 7;
+break _1;
+}
+}
+else{
+if(!(r1 ==0)) //_LBB795_4
+{
+	r0 = r1 >> 2;
+	r1 = Math.floor(uint(r2) % uint(r3));
+	heap32[(r0)] = r1;
+	heap32[(r0+1)] = 0;
+}
+	r0 = Math.floor(uint(r2) /uint(r3));
+__label__ = 5;
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 7:
+	r2 = 0;
+	r0 = r2;
+break;
+case 9:
+	r0 = 0;
+	r_g0 = r0;
+	r_g1 = r0;
+	return;
+break;
+case 5:
+	r1 = 0;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+break;
+}
+	r_g0 = r2;
+	r_g1 = r0;
+	return;
+}
+
+function __umoddi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(fp+3)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = r4;
+	heap32[(g0+4)] = r0;
+	__udivmoddi4(i7);
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+-2)];
+	r0 = heap32[(r0+1)];
+	r_g0 = r1;
+	r_g1 = r0;
+	return;
+}
+
+function __moddi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 31;
+	r3 = heap32[(fp+2)];
+	r4 = r1 >> 31;
+	r5 = heap32[(fp)];
+	r1 = r4 ^ r1;
+	r5 = r4 ^ r5;
+	r0 = r2 ^ r0;
+	r3 = r2 ^ r3;
+	r6 = 1;
+	r7 = 0;
+	r1 = (r1 - r4)|0;
+	r8 = uint(r5) < uint(r4) ? r6 : r7;
+	r0 = (r0 - r2)|0;
+	r9 = uint(r3) < uint(r2) ? r6 : r7;
+	r10 = sp + -8;
+	r5 = (r5 - r4)|0;
+	r1 = (r1 - r8)|0;
+	r2 = (r3 - r2)|0;
+	r0 = (r0 - r9)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r0;
+	heap32[(g0+4)] = r10;
+	__udivmoddi4(i7);
+	r0 = r10 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(fp+-2)];
+	r1 = r1 ^ r4;
+	r0 = r0 ^ r4;
+	r0 = (r0 - r4)|0;
+	r2 = uint(r1) < uint(r4) ? r6 : r7;
+	r1 = (r1 - r4)|0;
+	r0 = (r0 - r2)|0;
+	r_g0 = r1;
+	r_g1 = r0;
+	return;
+}
+
+function __divdi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp+1)];
+	r2 = r1 >> 31;
+	r3 = heap32[(fp)];
+	r4 = r0 >> 31;
+	r5 = heap32[(fp+2)];
+	r6 = r2 ^ r1;
+	r3 = r2 ^ r3;
+	r7 = r4 ^ r0;
+	r5 = r4 ^ r5;
+	r8 = 1;
+	r9 = 0;
+	r6 = (r6 - r2)|0;
+	r10 = uint(r3) < uint(r2) ? r8 : r9;
+	r7 = (r7 - r4)|0;
+	r11 = uint(r5) < uint(r4) ? r8 : r9;
+	r2 = (r3 - r2)|0;
+	r3 = (r6 - r10)|0;
+	r4 = (r5 - r4)|0;
+	r5 = (r7 - r11)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = 0;
+	r0 = r0 ^ r1;
+	__udivmoddi4(i7);
+	r0 = r0 >> 31;
+	r1 = r_g0 ^ r0;
+	r2 = r_g1 ^ r0;
+	r2 = (r2 - r0)|0;
+	r3 = uint(r1) < uint(r0) ? r8 : r9;
+	r0 = (r1 - r0)|0;
+	r1 = (r2 - r3)|0;
+	r_g0 = r0;
+	r_g1 = r1;
+	return;
+}
+
+function __udivdi3(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = 0;
+	__udivmoddi4(i7);
+	return;
+}
+
+function sscanf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var f0;
+	var f1;
+	var f2;
+	var f3;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = (sp + 4)|0;
+	r1 = heap32[(fp)];
+	heap32[(fp+-5)] = r0;
+	heap32[(fp+-4)] = r1;
+	heap32[(fp+-1)] = r0;
+	r0 = sp + -16;
+	heap32[(g0)] = r0;
+	r1 = 1;
+	r2 = 0;
+	r3 = _2E_str7136;
+	sgetc(i7);
+	r4 = r_g0;
+	f3 =                        10;
+	r20 = 255;
+_1: while(true){
+	r5 = heapU8[r3];
+	if(r5 !=0) //_LBB800_1
+{
+	r5 = r5 << 24;
+	r5 = r5 >> 24;
+	r6 = (r3 + 1)|0;
+	if(r5 >31) //_LBB800_4
+{
+	if(r5 ==32) //_LBB800_7
+{
+__label__ = 7;
+}
+else{
+	if(r5 ==37) //_LBB800_8
+{
+	r5 = -1;
+	r7 = 0;
+	r8 = r7;
+	r9 = r7;
+	r10 = r7;
+	r11 = r7;
+_8: while(true){
+	r12 = heap8[r6];
+if(!(r12 ==110)) //_LBB800_17
+{
+	if(r4 ==-1) //_LBB800_187
+{
+__label__ = 168;
+break _1;
+}
+}
+	if(r12 >103) //_LBB800_31
+{
+	if(r12 >111) //_LBB800_38
+{
+	if(r12 >114) //_LBB800_41
+{
+__label__ = 40;
+break _8;
+}
+else{
+	if(r12 ==112) //_LBB800_59
+{
+__label__ = 52;
+break _8;
+}
+else{
+if(!(r12 ==113)) //_LBB800_45
+{
+__label__ = 168;
+break _1;
+}
+}
+}
+}
+else{
+	if(r12 >107) //_LBB800_35
+{
+	if(r12 ==108) //_LBB800_55
+{
+	r3 = 1;
+	r10 = r10 & 255;
+	r11 = r10 == 0 ? r11 : r3;
+	r6 = (r6 + 1)|0;
+	r10 = r3;
+continue _8;
+}
+else{
+__label__ = 35;
+break _8;
+}
+}
+else{
+	if(r12 ==104) //_LBB800_53
+{
+	r6 = (r6 + 1)|0;
+	r9 = 1;
+continue _8;
+}
+else{
+__label__ = 33;
+break _8;
+}
+}
+}
+}
+else{
+	if(r12 >75) //_LBB800_25
+{
+	if(r12 >98) //_LBB800_28
+{
+__label__ = 27;
+break _8;
+}
+else{
+if(!(r12 ==76)) //_LBB800_45
+{
+__label__ = 26;
+break _8;
+}
+}
+}
+else{
+	if(r12 >41) //_LBB800_22
+{
+	if(r12 ==42) //_LBB800_46
+{
+	r6 = (r6 + 1)|0;
+	r8 = 1;
+continue _8;
+}
+else{
+	r5 = (r12 + -48)|0;
+	if(uint(r5) <uint(10)) //_LBB800_57
+{
+	r5 = sp + -8;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	strtol(i7);
+	r5 = r_g0;
+	r6 = heap32[(fp+-2)];
+	r7 = 1;
+continue _8;
+}
+else{
+__label__ = 23;
+break _8;
+}
+}
+}
+else{
+__label__ = 19;
+break _8;
+}
+}
+}
+	r6 = (r6 + 1)|0;
+	r11 = 1;
+}
+_36: do {
+switch(__label__ ){//multiple entries
+case 40:
+	if(r12 ==115) //_LBB800_165
+{
+	r8 = r8 & 255;
+if(!(r8 !=0)) //_LBB800_167
+{
+	r3 = sp + -4;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r3 = r_g0 >> 2;
+	r3 = heap32[(r3)];
+	heap32[(fp+-2)] = r3;
+}
+	r3 = (r6 + 1)|0;
+	r6 = r4 << 2;
+	r7 = my_ctype;
+	r6 = (r6 + r7)|0;
+	r6 = heapU8[r6+4];
+	r6 = r6 & 8;
+_43: do {
+	if(r6 ==0) //_LBB800_169
+{
+	r6 = r4;
+}
+else{
+_45: while(true){
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r6 = r_g0;
+	r4 = r6 << 2;
+	r4 = (r4 + r7)|0;
+	r1 = (r1 + 1)|0;
+	r4 = heapU8[r4+4];
+	r4 = r4 & 8;
+if(!(r4 !=0)) //_LBB800_170
+{
+break _43;
+}
+}
+}
+} while(0);
+	r4 = -1;
+	if(r6 ==-1) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r4 = r6;
+_49: while(true){
+	if(r4 ==-1) //_LBB800_180
+{
+break _49;
+}
+else{
+	if(r5 ==0) //_LBB800_180
+{
+break _49;
+}
+else{
+	r6 = r4 << 2;
+	r6 = (r6 + r7)|0;
+	r6 = heapU8[r6+4];
+	r6 = r6 & 8;
+	if(r6 ==0) //_LBB800_173
+{
+if(!(r8 !=0)) //_LBB800_175
+{
+	r6 = heap32[(fp+-2)];
+	heap8[r6] = r4;
+}
+	if(r4 ==0) //_LBB800_180
+{
+break _49;
+}
+else{
+	r4 = heap32[(fp+-2)];
+	r4 = (r4 + 1)|0;
+	heap32[(fp+-2)] = r4;
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	r5 = (r5 + -1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+}
+}
+else{
+break _49;
+}
+}
+}
+}
+	if(r8 !=0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r2 = (r2 + 1)|0;
+	r5 = heap32[(fp+-2)];
+	r6 = 0;
+	heap8[r5] = r6;
+continue _1;
+}
+}
+}
+else{
+	if(r12 ==117) //_LBB800_60
+{
+__label__ = 53;
+break _36;
+}
+else{
+	if(r12 ==120) //_LBB800_59
+{
+__label__ = 52;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+}
+}
+break;
+case 35:
+	if(r12 ==110) //_LBB800_182
+{
+	r3 = (r6 + 1)|0;
+	r5 = r8 & 255;
+	if(r5 !=0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r5 = sp + -4;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r6 = (r1 + -1)|0;
+	heap32[(r5)] = r6;
+continue _1;
+}
+}
+else{
+	if(r12 ==111) //_LBB800_44
+{
+	r13 = 8;
+__label__ = 55;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+}
+break;
+case 33:
+	if(r12 ==105) //_LBB800_60
+{
+__label__ = 53;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+break;
+case 27:
+	if(r12 ==99) //_LBB800_155
+{
+	r3 = (r6 + 1)|0;
+	r6 = r8 & 255;
+	if(r6 ==0) //_LBB800_157
+{
+	r8 = sp + -4;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r8 = r_g0 >> 2;
+	r8 = heap32[(r8)];
+	r2 = (r2 + 1)|0;
+	heap32[(fp+-2)] = r8;
+}
+	r8 = r7 & 255;
+	r7 = 1;
+	r5 = r8 == 0 ? r7 : r5;
+	if(r5 ==0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	if(r4 ==-1) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r5 = (r5 + -1)|0;
+_77: while(true){
+if(!(r6 !=0)) //_LBB800_163
+{
+	r8 = heap32[(fp+-2)];
+	r7 = (r8 + 1)|0;
+	heap8[r8] = r4;
+	heap32[(fp+-2)] = r7;
+}
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+	if(r5 ==0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r5 = (r5 + -1)|0;
+	if(r4 !=-1) //_LBB800_161
+{
+continue _77;
+}
+else{
+continue _1;
+}
+}
+}
+}
+}
+}
+else{
+	if(r12 ==100) //_LBB800_61
+{
+	r13 = 10;
+__label__ = 55;
+break _36;
+}
+else{
+	r5 = (r12 + -101)|0;
+	if(uint(r5) <uint(3)) //_LBB800_48
+{
+__label__ = 46;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+}
+}
+break;
+case 26:
+	if(r12 ==88) //_LBB800_59
+{
+__label__ = 52;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+break;
+case 23:
+	if(r12 ==69) //_LBB800_48
+{
+__label__ = 46;
+break _36;
+}
+else{
+__label__ = 168;
+break _1;
+}
+break;
+case 19:
+	if(r12 ==0) //_LBB800_6
+{
+__label__ = 6;
+break _1;
+}
+else{
+	if(r12 ==37) //_LBB800_51
+{
+	r5 = r4 & 255;
+	if(r5 !=r12) //_LBB800_187
+{
+__label__ = 168;
+break _1;
+}
+else{
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	r3 = (r6 + 1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+continue _1;
+}
+}
+else{
+__label__ = 168;
+break _1;
+}
+}
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 53:
+	r13 = 0;
+break;
+case 52:
+	r13 = 16;
+break;
+case 46:
+	r5 = r4 << 2;
+	r7 = my_ctype;
+	r5 = (r5 + r7)|0;
+	r5 = heapU8[r5+4];
+	r3 = (r6 + 1)|0;
+	r5 = r5 & 8;
+_97: do {
+if(!(r5 ==0)) //_LBB800_50
+{
+_98: while(true){
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r4 = r_g0;
+	r5 = r4 << 2;
+	r5 = (r5 + r7)|0;
+	r1 = (r1 + 1)|0;
+	r5 = heapU8[r5+4];
+	r5 = r5 & 8;
+if(!(r5 !=0)) //_LBB800_111
+{
+break _97;
+}
+}
+}
+} while(0);
+	if(r4 ==45) //_LBB800_114
+{
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	r5 = 1;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	r5 = 0;
+}
+	if(r4 ==43) //_LBB800_117
+{
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+}
+	r6 = (r4 + -48)|0;
+_108: do {
+	if(uint(r6) >uint(9)) //_LBB800_120
+{
+	f0 =                         0;
+	r6 = r1;
+}
+else{
+	f0 =                         0;
+	r6 = r1;
+_111: while(true){
+	r4 = (r4 + -48)|0;
+	f1 =                        10;
+	heap32[(g0)] = r0;
+	f0 = f0*f1;
+	f1 = r4; //fitod r4, f1
+	sgetc(i7);
+	r4 = r_g0;
+	f0 = f0+f1;
+	r6 = (r6 + 1)|0;
+	r7 = (r4 + -48)|0;
+if(!(uint(r7) <uint(10))) //_LBB800_121
+{
+break _108;
+}
+}
+}
+} while(0);
+_114: do {
+	if(r4 ==46) //_LBB800_124
+{
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r4 = r_g0;
+	r1 = (r1 + 1)|0;
+	r7 = (r4 + -48)|0;
+	if(uint(r7) <uint(10)) //_LBB800_126
+{
+	r6 = (r6 + 1)|0;
+	f1 =       0.10000000000000001;
+_118: while(true){
+	r4 = (r4 + -48)|0;
+	f2 = r4; //fitod r4, f2
+	heap32[(g0)] = r0;
+	f2 = f2*f1;
+	sgetc(i7);
+	r4 = r_g0;
+	f0 = f2+f0;
+	f1 = f1/f3;
+	r6 = (r6 + 1)|0;
+	r7 = (r4 + -48)|0;
+if(!(uint(r7) <uint(10))) //_LBB800_127
+{
+break _114;
+}
+}
+}
+else{
+	r6 = (r6 + 1)|0;
+}
+}
+} while(0);
+	if(r1 ==r6) //_LBB800_73
+{
+__label__ = 172;
+break _1;
+}
+else{
+	r1 = r4 | 32;
+_123: do {
+	if(r1 ==101) //_LBB800_131
+{
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r1 = r_g0;
+	if(r1 ==45) //_LBB800_135
+{
+	heap32[(g0)] = r0;
+	f1 =       0.10000000000000001;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	if(r1 ==43) //_LBB800_136
+{
+	heap32[(g0)] = r0;
+	f1 =                        10;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	if(r1 !=-1) //_LBB800_137
+{
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	f0 =                         0;
+	sputc(i7);
+	r1 = r6;
+break _123;
+}
+else{
+	r1 = (r6 + 1)|0;
+	f0 =                         0;
+break _123;
+}
+}
+}
+	r7 = (r6 + 2)|0;
+	r1 = (r4 + -48)|0;
+_135: do {
+	if(uint(r1) <uint(10)) //_LBB800_140
+{
+	r1 = (r6 + 2)|0;
+	r6 = 0;
+_137: while(true){
+	r6 = (r6 * 10)|0;
+	heap32[(g0)] = r0;
+	r6 = (r4 + r6)|0;
+	sgetc(i7);
+	r4 = r_g0;
+	r6 = (r6 + -48)|0;
+	r1 = (r1 + 1)|0;
+	r9 = (r4 + -48)|0;
+if(!(uint(r9) <uint(10))) //_LBB800_141
+{
+break _135;
+}
+}
+}
+else{
+	r6 = 0;
+	r1 = r7;
+}
+} while(0);
+	if(r7 ==r1) //_LBB800_73
+{
+__label__ = 172;
+break _1;
+}
+else{
+if(!(r6 ==0)) //_LBB800_145
+{
+__label__ = 130; //SET chanka
+_142: while(true){
+	r6 = (r6 + -1)|0;
+	f0 = f0*f1;
+if(!(r6 !=0)) //_LBB800_146
+{
+break _123;
+}
+}
+}
+}
+}
+else{
+	r1 = r6;
+}
+} while(0);
+	if(r5 !=0) //_LBB800_149
+{
+	f0 = -f0;
+}
+	r5 = r8 & 255;
+	if(r5 !=0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r5 = sp + -4;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r5 = r_g0;
+	r6 = r10 & 255;
+	if(r6 ==0) //_LBB800_153
+{
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	f0 = f0; //fdtos f0, f0
+	heapFloat[(r5)] = f0;
+}
+else{
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	llvm_writeDouble((r5),f0);
+}
+	r2 = (r2 + 1)|0;
+continue _1;
+}
+}
+break;
+}
+	r3 = r4 << 2;
+	r14 = my_ctype;
+	r3 = (r3 + r14)|0;
+	r15 = heapU8[r3+4];
+	r3 = (r6 + 1)|0;
+	r6 = r15 & 8;
+_155: do {
+if(!(r6 ==0)) //_LBB800_64
+{
+_156: while(true){
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r4 = r_g0;
+	r6 = r4 << 2;
+	r6 = (r6 + r14)|0;
+	r1 = (r1 + 1)|0;
+	r6 = heapU8[r6+4];
+	r6 = r6 & 8;
+if(!(r6 !=0)) //_LBB800_65
+{
+break _155;
+}
+}
+}
+} while(0);
+	if(r4 ==45) //_LBB800_68
+{
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	r6 = 1;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	r6 = 0;
+}
+	if(r4 ==43) //_LBB800_71
+{
+	heap32[(g0)] = r0;
+	r14 = (r1 + 1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	r14 = r1;
+}
+	if(r4 !=-1) //_LBB800_74
+{
+	r7 = r7 & 255;
+_168: do {
+	if(r7 ==0) //_LBB800_76
+{
+	if(r13 !=16) //_LBB800_79
+{
+__label__ = 68;
+}
+else{
+	if(r4 !=48) //_LBB800_79
+{
+__label__ = 68;
+}
+else{
+__label__ = 72;
+}
+}
+_172: do {
+if (__label__ == 68){
+if(!(r13 !=0)) //_LBB800_82
+{
+	r7 = 48;
+	r7 = r4 != r7;
+if(!(r7 != 0)) //_LBB800_82
+{
+	r13 = 8;
+break _172;
+}
+}
+	r7 = 10;
+	r13 = r13 != 0 ? r13 : r7;
+	r1 = r14;
+break _168;
+}
+} while(0);
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r4 = r_g0;
+	r7 = r4 | 32;
+	if(r7 ==120) //_LBB800_85
+{
+	heap32[(g0)] = r0;
+	r1 = (r14 + 2)|0;
+	r13 = 16;
+	sgetc(i7);
+	r4 = r_g0;
+}
+else{
+	r1 = (r14 + 1)|0;
+}
+}
+else{
+	r1 = r14;
+}
+} while(0);
+	r7 = 0;
+	r15 = r7;
+	r16 = r7;
+_184: while(true){
+	if(r5 ==0) //_LBB800_97
+{
+break _184;
+}
+else{
+	if(r4 !=-1) //_LBB800_87
+{
+	r17 = r4 & 255;
+	r18 = r17 | 32;
+	if(uint(r18) <uint(97)) //_LBB800_89
+{
+	r18 = 58;
+	r19 = (r17 + -48)|0;
+	r17 = uint(r17) < uint(r18) ? r19 : r20;
+}
+else{
+	r17 = (r18 + -87)|0;
+}
+	if(uint(r17) >=uint(r13)) //_LBB800_97
+{
+break _184;
+}
+else{
+	heap32[(g0)] = r15;
+	heap32[(g0+1)] = r16;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r7;
+	__muldi3(i7);
+	r4 = r_g0;
+	r18 = r_g1;
+	r15 = uint(r4) >= uint(r15);
+	r19 = uint(r18) >= uint(r16);
+	r15 = r18 == r16 ? r15 : r19;
+	if(r15 != 0) //_LBB800_93
+{
+	r15 = (r17 + r4)|0;
+	r16 = 1;
+	r17 = uint(r15) < uint(r17) ? r16 : r7;
+	r4 = uint(r15) < uint(r4) ? r16 : r17;
+	r16 = (r18 + r4)|0;
+}
+else{
+	r15 = -1;
+	r16 = r15;
+}
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	r5 = (r5 + -1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+}
+}
+else{
+break _184;
+}
+}
+}
+	if(r14 ==r1) //_LBB800_73
+{
+__label__ = 172;
+break _1;
+}
+else{
+	r5 = r12 | 32;
+if(!(uint(r5) >uint(111))) //_LBB800_100
+{
+	if(r16 >-1) //_LBB800_101
+{
+	r5 = 1;
+	r12 = (r7 - r16)|0;
+	r5 = r15 != 0 ? r5 : r7;
+	r7 = (r7 - r15)|0;
+	r5 = (r12 - r5)|0;
+	r15 = r6 != 0 ? r7 : r15;
+	r16 = r6 != 0 ? r5 : r16;
+}
+}
+	r5 = r8 & 255;
+	if(r5 !=0) //_LBB800_186
+{
+continue _1;
+}
+else{
+	r5 = r11 & 255;
+	if(r5 ==0) //_LBB800_105
+{
+	r5 = r10 & 255;
+	if(r5 ==0) //_LBB800_107
+{
+	r5 = sp + -4;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r5 = r_g0;
+	r7 = r9 & 255;
+	if(r7 ==0) //_LBB800_109
+{
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r15;
+}
+else{
+	r5 = r5 >> 2;
+	r5 = heap32[(r5)];
+	heap16[(r5)>>1] = r15;
+}
+}
+else{
+	r5 = sp + -4;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r15;
+}
+}
+else{
+	r5 = sp + -4;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r5 = r_g0 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	heap32[(r5)] = r15;
+	heap32[(r5+1)] = r16;
+}
+	r5 = uint(r14) < uint(r1);
+	r5 = r5 & 1;
+	r2 = (r5 + r2)|0;
+continue _1;
+}
+}
+}
+else{
+__label__ = 172;
+break _1;
+}
+}
+else{
+__label__ = 165;
+}
+}
+}
+else{
+	if(r5 ==0) //_LBB800_6
+{
+__label__ = 6;
+break _1;
+}
+else{
+	r7 = (r5 + -9)|0;
+	if(uint(r7) <uint(5)) //_LBB800_7
+{
+__label__ = 7;
+}
+else{
+__label__ = 165;
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 7:
+	r3 = (r3 + 1)|0;
+_218: while(true){
+	r5 = heapU8[r3];
+	if(r5 ==0) //_LBB800_13
+{
+break _218;
+}
+else{
+	r5 = r5 << 24;
+	r5 = r5 >> 24;
+	r5 = r5 << 2;
+	r6 = my_ctype;
+	r5 = (r5 + r6)|0;
+	r5 = heapU8[r5+4];
+	r5 = r5 & 8;
+	if(r5 ==0) //_LBB800_13
+{
+break _218;
+}
+else{
+	r3 = (r3 + 1)|0;
+}
+}
+}
+	r6 = r4 << 2;
+	r5 = my_ctype;
+	r6 = (r6 + r5)|0;
+	r6 = heapU8[r6+4];
+	r6 = r6 & 8;
+	if(r6 ==0) //_LBB800_186
+{
+continue _1;
+}
+else{
+__label__ = 12; //SET chanka
+_223: while(true){
+	heap32[(g0)] = r0;
+	sgetc(i7);
+	r4 = r_g0;
+	r6 = r4 << 2;
+	r6 = (r6 + r5)|0;
+	r1 = (r1 + 1)|0;
+	r6 = heapU8[r6+4];
+	r6 = r6 & 8;
+	if(r6 ==0) //_LBB800_186
+{
+continue _1;
+}
+}
+}
+break;
+case 165:
+	r3 = r4 & 255;
+	if(r3 !=r5) //_LBB800_187
+{
+__label__ = 168;
+break _1;
+}
+else{
+	heap32[(g0)] = r0;
+	r1 = (r1 + 1)|0;
+	sgetc(i7);
+	r4 = r_g0;
+	r3 = r6;
+continue _1;
+}
+break;
+}
+}
+else{
+__label__ = 168;
+break _1;
+}
+}
+_227: do {
+switch(__label__ ){//multiple entries
+case 168:
+if(!(r4 >-1)) //_LBB800_190
+{
+if(!(r2 !=0)) //_LBB800_190
+{
+	r2 = -1;
+break _227;
+}
+}
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	sputc(i7);
+break;
+case 6:
+	r2 = 0;
+break;
+}
+} while(0);
+	r_g0 = r2;
+	return;
+}
+
+function __v_printf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+	var f0;
+	var f1;
+var __label__ = 0;
+	i7 = sp + -184;var g0 = i7>>2; // save stack
+	r0 = sp + -136;
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r0 = (r0 + 1)|0;
+	heap32[(fp+-1)] = r1;
+	heap32[(fp+-2)] = 0;
+_1: while(true){
+	r4 = heapU8[r3];
+	if(r4 ==0) //_LBB801_209
+{
+__label__ = 197;
+break _1;
+}
+else{
+	r1 = 0;
+	r5 = r4;
+_4: while(true){
+	r5 = r5 & 255;
+	if(r5 ==0) //_LBB801_4
+{
+break _4;
+}
+else{
+	if(r5 !=37) //_LBB801_1
+{
+	r5 = (r3 - r1)|0;
+	r5 = heapU8[r5+1];
+	r1 = (r1 + -1)|0;
+}
+else{
+break _4;
+}
+}
+}
+	r5 = 0;
+	if(r1 !=0) //_LBB801_6
+{
+	r4 = (r5 - r1)|0;
+	if(r4 <0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r6 = heap32[(fp+-2)];
+	r7 = (r6 - r1)|0;
+	if(uint(r7) <uint(r6)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r6 = (r3 - r1)|0;
+	r7 = r2 >> 2;
+	r8 = heap32[(r7+1)];
+	r7 = heap32[(r7)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r7;
+	__FUNCTION_TABLE__[(r8)>>2](i7);
+	r4 = heap32[(fp+-2)];
+	r4 = (r4 - r1)|0;
+	r1 = (r3 - r1)|0;
+	heap32[(fp+-2)] = r4;
+	r4 = heapU8[r1];
+	r3 = r6;
+}
+}
+}
+	r1 = r4 & 255;
+	if(r1 !=37) //_LBB801_207
+{
+continue _1;
+}
+else{
+	r3 = (r3 + 1)|0;
+	r1 = 32;
+	r4 = r5;
+	r6 = r5;
+	r7 = r5;
+	r8 = r5;
+	r9 = r5;
+	r10 = r5;
+	r11 = r5;
+_15: while(true){
+	r12 = r4;
+	r13 = r3;
+	r14 = heapU8[r13];
+	r3 = (r13 + 1)|0;
+	heap8[sp+-145] = r14;
+_17: do {
+	if(r14 >99) //_LBB801_29
+{
+	if(r14 >110) //_LBB801_37
+{
+	if(r14 >114) //_LBB801_41
+{
+	if(r14 >119) //_LBB801_44
+{
+	if(r14 ==122) //_LBB801_47
+{
+__label__ = 50;
+break _17;
+}
+else{
+__label__ = 44;
+break _15;
+}
+}
+else{
+__label__ = 41;
+break _15;
+}
+}
+else{
+	if(r14 ==111) //_LBB801_105
+{
+__label__ = 99;
+break _15;
+}
+else{
+	if(r14 ==112) //_LBB801_97
+{
+__label__ = 91;
+break _15;
+}
+else{
+	if(r14 ==113) //_LBB801_53
+{
+__label__ = 49;
+break _17;
+}
+else{
+continue _1;
+}
+}
+}
+}
+}
+else{
+	if(r14 >104) //_LBB801_34
+{
+	if(r14 ==105) //_LBB801_108
+{
+__label__ = 102;
+break _15;
+}
+else{
+	if(r14 ==106) //_LBB801_53
+{
+__label__ = 49;
+break _17;
+}
+else{
+	if(r14 ==108) //_LBB801_47
+{
+__label__ = 50;
+break _17;
+}
+else{
+continue _1;
+}
+}
+}
+}
+else{
+	if(r14 ==100) //_LBB801_108
+{
+__label__ = 102;
+break _15;
+}
+else{
+	r4 = (r14 + -102)|0;
+	if(uint(r4) <uint(2)) //_LBB801_135
+{
+__label__ = 129;
+break _15;
+}
+else{
+	if(r14 ==104) //_LBB801_48
+{
+__label__ = 48;
+break _17;
+}
+else{
+continue _1;
+}
+}
+}
+}
+}
+}
+else{
+	if(r14 >44) //_LBB801_20
+{
+	if(r14 >75) //_LBB801_24
+{
+	if(r14 >97) //_LBB801_27
+{
+__label__ = 26;
+break _15;
+}
+else{
+	if(r14 ==76) //_LBB801_53
+{
+__label__ = 49;
+break _17;
+}
+else{
+__label__ = 25;
+break _15;
+}
+}
+}
+else{
+	r4 = 1;
+	if(r14 ==45) //_LBB801_11
+{
+continue _15;
+}
+else{
+	if(r14 ==46) //_LBB801_61
+{
+	r4 = heapU8[r3];
+	if(r4 !=42) //_LBB801_63
+{
+	r4 = sp + -144;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	strtol(i7);
+	r14 = 0;
+	r11 = r_g0 < 0 ? r14 : r_g0;
+	r3 = heap32[(fp+-36)];
+}
+else{
+	r4 = sp + -4;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r4 = r_g0 >> 2;
+	r4 = heap32[(r4)];
+	r14 = 0;
+	r11 = r4 < 0 ? r14 : r4;
+	r3 = (r13 + 2)|0;
+}
+	r8 = 1;
+	r4 = r12;
+	if(uint(r11) >uint(10240)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+continue _15;
+}
+}
+else{
+	r4 = (r14 + -48)|0;
+	if(uint(r4) <uint(10)) //_LBB801_57
+{
+	r4 = r8 & 255;
+	if(r4 !=0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r4 = sp + -144;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r4;
+	strtoul(i7);
+	r10 = r_g0;
+	if(uint(r10) >uint(10240)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r8 = 0;
+	r4 = r12 & 255;
+	r13 = heapU8[sp+-145];
+	r14 = 48;
+	r13 = r13 == r14;
+	r4 = r4 == r8;
+	r4 = r13 & r4;
+	r1 = r4 != 0 ? r14 : r1;
+	r3 = heap32[(fp+-36)];
+	r4 = r12;
+continue _15;
+}
+}
+}
+else{
+continue _1;
+}
+}
+}
+}
+}
+else{
+	if(r14 >36) //_LBB801_17
+{
+	if(r14 ==37) //_LBB801_66
+{
+__label__ = 62;
+break _15;
+}
+else{
+	if(r14 ==42) //_LBB801_60
+{
+	r4 = sp + -4;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r4 = r_g0 >> 2;
+	r4 = heap32[(r4)];
+	r13 = r4 >> 31;
+	r14 = (r4 + r13)|0;
+	r15 = 1;
+	r10 = r14 ^ r13;
+	r4 = r4 < 0 ? r15 : r12;
+	if(uint(r10) >uint(10240)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+continue _15;
+}
+}
+else{
+	if(r14 ==43) //_LBB801_56
+{
+	r7 = 1;
+	r4 = r12;
+continue _15;
+}
+else{
+continue _1;
+}
+}
+}
+}
+else{
+	if(r14 ==0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	if(r14 ==32) //_LBB801_55
+{
+	r6 = 1;
+	r4 = r12;
+continue _15;
+}
+else{
+	if(r14 ==35) //_LBB801_51
+{
+	r5 = 255;
+__label__ = 48;
+}
+else{
+continue _1;
+}
+}
+}
+}
+}
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 49:
+	r9 = (r9 + 1)|0;
+break;
+case 48:
+	r9 = (r9 + -1)|0;
+	r4 = r12;
+continue _15;
+break;
+}
+	r9 = (r9 + 1)|0;
+	r4 = r12;
+}
+_71: do {
+switch(__label__ ){//multiple entries
+case 26:
+	if(r14 ==98) //_LBB801_49
+{
+	r4 = 0;
+	r13 = 2;
+	r14 = r4;
+	r15 = r4;
+__label__ = 104;
+break _71;
+}
+else{
+	if(r14 ==99) //_LBB801_65
+{
+	r1 = sp + -4;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r1 = r_g0 >> 2;
+	r1 = heap32[(r1)];
+	heap8[sp+-145] = r1;
+__label__ = 62;
+break _71;
+}
+else{
+continue _1;
+}
+}
+break;
+case 25:
+	if(r14 ==88) //_LBB801_50
+{
+__label__ = 92;
+break _71;
+}
+else{
+continue _1;
+}
+break;
+case 44:
+	if(r14 !=120) //_LBB801_207
+{
+continue _1;
+}
+else{
+	r4 = 0;
+__label__ = 93;
+break _71;
+}
+break;
+case 41:
+	if(r14 ==115) //_LBB801_68
+{
+	r1 = sp + -4;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r1 = r_g0 >> 2;
+	r4 = _2E_str38684;
+	r1 = heap32[(r1)];
+	r1 = r1 == 0 ? r4 : r1;
+	heap32[(fp+-36)] = r1;
+	r4 = heapU8[r1];
+_83: do {
+	if(r4 !=0) //_LBB801_70
+{
+	r4 = (r1 + 1)|0;
+	r14 = 0;
+_85: while(true){
+	r1 = (r14 + 1)|0;
+	r6 = heapU8[r4+r14];
+	r14 = r1;
+if(!(r6 !=0)) //_LBB801_71
+{
+break _83;
+}
+}
+}
+else{
+	r1 = 0;
+}
+} while(0);
+	r16 = 0;
+	r4 = r8 & 255;
+	r4 = r4 != r16;
+	r14 = uint(r1) > uint(r11);
+	r4 = r4 & r14;
+	r14 = 32;
+	r4 = r4 != 0 ? r11 : r1;
+	r1 = r14;
+	r8 = r16;
+	r11 = r16;
+__label__ = 69;
+break _71;
+}
+else{
+	if(r14 ==117) //_LBB801_109
+{
+	r4 = 0;
+	r13 = 10;
+	r14 = r4;
+	r15 = r4;
+__label__ = 104;
+break _71;
+}
+else{
+continue _1;
+}
+}
+break;
+case 99:
+	r4 = r5 & 255;
+	if(r4 !=0) //_LBB801_107
+{
+	r5 = 1;
+	r4 = 0;
+	r13 = 8;
+	r14 = 48;
+	heap8[sp+-135] = r14;
+	r14 = r4;
+	r15 = r5;
+__label__ = 104;
+break _71;
+}
+else{
+	r4 = 0;
+	r13 = 8;
+	r14 = r4;
+	r5 = r4;
+	r15 = r4;
+__label__ = 104;
+break _71;
+}
+break;
+case 91:
+	r14 = 120;
+	r5 = 2;
+	r9 = 1;
+	heap8[sp+-145] = r14;
+__label__ = 92;
+break _71;
+break;
+case 102:
+	r4 = 0;
+	r14 = 1;
+	r13 = 10;
+	r15 = r4;
+__label__ = 104;
+break _71;
+break;
+case 129:
+	r4 = sp + -4;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 8;
+	my_arg_test(i7);
+	f0 = llvm_readDouble((r_g0));
+	heap32[(fp+-36)] = r0;
+	r4 = 103;
+	r4 = r14 == r4;
+	r8 = r8 & 255;
+	r16 = 1;
+	r9 = 6;
+	r10 = r10 == 0 ? r16 : r10;
+	r11 = r8 == 0 ? r9 : r11;
+	r4 = r4 & 1;
+	f1 =                         0;
+	r9 = r7 & 255;
+	r13 = 0;
+	llvm_writeDouble((i7),f0);
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = 127;
+	heap32[(g0+4)] = r10;
+	heap32[(g0+5)] = r11;
+	heap32[(g0+6)] = r4;
+	r4 = r9 != r13;
+	r16 = f0 < f1;
+	r4 = r4 | r16;
+	r16 = r4 & 1;
+	__dtostr(i7);
+	r4 = r_g0;
+_98: do {
+	if(r8 !=0) //_LBB801_137
+{
+	r8 = heap32[(fp+-36)];
+	r15 = r13;
+_100: while(true){
+	r17 = heapU8[r8+r13];
+	if(r17 ==0) //_LBB801_161
+{
+__label__ = 151;
+break _100;
+}
+else{
+	r18 = (r8 + r13)|0;
+	if(r17 ==46) //_LBB801_149
+{
+__label__ = 142;
+break _100;
+}
+else{
+	r17 = heapU8[r18+1];
+	if(r17 ==0) //_LBB801_161
+{
+__label__ = 151;
+break _100;
+}
+else{
+	r19 = r15 << 2;
+	if(r17 !=46) //_LBB801_143
+{
+	r17 = heapU8[r18+2];
+	if(r17 ==0) //_LBB801_161
+{
+__label__ = 151;
+break _100;
+}
+else{
+	if(r17 !=46) //_LBB801_146
+{
+	r17 = heapU8[r18+3];
+	if(r17 ==0) //_LBB801_161
+{
+__label__ = 151;
+break _100;
+}
+else{
+	if(r17 ==46) //_LBB801_151
+{
+__label__ = 143;
+break _100;
+}
+else{
+	r15 = (r15 + 1)|0;
+	r13 = (r13 + 4)|0;
+}
+}
+}
+else{
+__label__ = 138;
+break _100;
+}
+}
+}
+else{
+__label__ = 135;
+break _100;
+}
+}
+}
+}
+}
+_110: do {
+switch(__label__ ){//multiple entries
+case 142:
+	if(r18 ==0) //_LBB801_161
+{
+__label__ = 151;
+break _110;
+}
+else{
+__label__ = 144;
+break _110;
+}
+break;
+case 143:
+	r18 = (r18 + 3)|0;
+__label__ = 144;
+break _110;
+break;
+case 138:
+	r4 = r19 | 2;
+	r18 = (r8 + r4)|0;
+__label__ = 144;
+break _110;
+break;
+case 135:
+	r4 = r19 | 1;
+	r18 = (r8 + r4)|0;
+__label__ = 144;
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 151:
+	r5 = r5 & 255;
+	if(r5 ==0) //_LBB801_136
+{
+break _98;
+}
+else{
+	r5 = 46;
+	heap8[r8+r4] = r5;
+	r5 = heap32[(fp+-36)];
+	r4 = (r4 + r5)|0;
+	r5 = 0;
+	heap8[r4+1] = r5;
+}
+break;
+case 144:
+	if(r11 !=0) //_LBB801_155
+{
+__label__ = 146;
+}
+else{
+	r4 = r5 & 255;
+	if(r4 !=0) //_LBB801_155
+{
+__label__ = 146;
+}
+else{
+__label__ = 147;
+}
+}
+if (__label__ == 146){
+	r18 = (r18 + 1)|0;
+}
+_123: while(true){
+	r4 = r11;
+	if(r4 !=0) //_LBB801_158
+{
+	r11 = (r4 + -1)|0;
+	r5 = (r18 + 1)|0;
+	r8 = heapU8[r18+1];
+	r18 = r5;
+	if(r8 !=0) //_LBB801_156
+{
+__label__ = 147;
+}
+else{
+__label__ = 149;
+break _123;
+}
+}
+else{
+__label__ = 150;
+break _123;
+}
+}
+if (__label__ == 149){
+	r18 = r5;
+}
+	r5 = 0;
+	heap8[r18] = r5;
+	r11 = r4;
+break;
+}
+}
+} while(0);
+_130: do {
+if(!(r14 !=103)) //_LBB801_199
+{
+	r4 = heap32[(fp+-36)];
+	r5 = 0;
+	r8 = r5;
+_132: while(true){
+	r14 = heapU8[r4+r5];
+	if(r14 ==0) //_LBB801_199
+{
+break _130;
+}
+else{
+	r13 = (r4 + r5)|0;
+	if(r14 ==46) //_LBB801_176
+{
+__label__ = 166;
+break _132;
+}
+else{
+	r14 = heapU8[r13+1];
+	if(r14 ==0) //_LBB801_199
+{
+break _130;
+}
+else{
+	r15 = r8 << 2;
+	if(r14 !=46) //_LBB801_170
+{
+	r14 = heapU8[r13+2];
+	if(r14 ==0) //_LBB801_199
+{
+break _130;
+}
+else{
+	if(r14 !=46) //_LBB801_173
+{
+	r14 = heapU8[r13+3];
+	if(r14 ==0) //_LBB801_199
+{
+break _130;
+}
+else{
+	if(r14 ==46) //_LBB801_178
+{
+__label__ = 167;
+break _132;
+}
+else{
+	r8 = (r8 + 1)|0;
+	r5 = (r5 + 4)|0;
+}
+}
+}
+else{
+__label__ = 162;
+break _132;
+}
+}
+}
+else{
+__label__ = 159;
+break _132;
+}
+}
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 166:
+	if(r13 ==0) //_LBB801_199
+{
+break _130;
+}
+break;
+case 167:
+	r13 = (r13 + 3)|0;
+break;
+case 162:
+	r5 = r15 | 2;
+	r13 = (r4 + r5)|0;
+break;
+case 159:
+	r5 = r15 | 1;
+	r13 = (r4 + r5)|0;
+break;
+}
+	r4 = 0;
+	r5 = r13;
+_148: while(true){
+	r8 = heapU8[r5];
+	if(r8 !=101) //_LBB801_182
+{
+	if(r8 !=0) //_LBB801_184
+{
+	r8 = r4 << 2;
+	r14 = heapU8[r5+1];
+	if(r14 !=101) //_LBB801_186
+{
+	if(r14 ==0) //_LBB801_183
+{
+__label__ = 171;
+break _148;
+}
+else{
+	r14 = heapU8[r5+2];
+	if(r14 !=101) //_LBB801_189
+{
+	if(r14 ==0) //_LBB801_183
+{
+__label__ = 171;
+break _148;
+}
+else{
+	r14 = heapU8[r5+3];
+	if(r14 !=101) //_LBB801_192
+{
+	if(r14 ==0) //_LBB801_183
+{
+__label__ = 171;
+break _148;
+}
+else{
+	r4 = (r4 + 1)|0;
+	r5 = (r5 + 4)|0;
+}
+}
+else{
+__label__ = 179;
+break _148;
+}
+}
+}
+else{
+__label__ = 176;
+break _148;
+}
+}
+}
+else{
+__label__ = 173;
+break _148;
+}
+}
+else{
+__label__ = 171;
+break _148;
+}
+}
+else{
+__label__ = 182;
+break _148;
+}
+}
+switch(__label__ ){//multiple entries
+case 171:
+	r5 = 0;
+break;
+case 179:
+	r4 = r8 | 3;
+	r5 = (r13 + r4)|0;
+break;
+case 176:
+	r4 = r8 | 2;
+	r5 = (r13 + r4)|0;
+break;
+case 173:
+	r4 = r8 | 1;
+	r5 = (r13 + r4)|0;
+break;
+}
+_163: while(true){
+	r4 = (r13 + 1)|0;
+	r8 = heapU8[r13+1];
+	r13 = r4;
+if(!(r8 !=0)) //_LBB801_194
+{
+break _163;
+}
+}
+	r4 = r5 == 0 ? r4 : r5;
+_166: while(true){
+	r8 = heapU8[r4+-1];
+	r4 = (r4 + -1)|0;
+if(!(r8 ==48)) //_LBB801_196
+{
+break _166;
+}
+}
+	r14 = (r4 + 1)|0;
+	r4 = r8 == 46 ? r4 : r14;
+	r8 = 0;
+	heap8[r4] = r8;
+if(!(r5 ==0)) //_LBB801_199
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	strcpy(i7);
+}
+}
+} while(0);
+	r4 = r7 | r6;
+	r4 = r4 & 255;
+if(!(r4 ==0)) //_LBB801_202
+{
+if(!(f0 <f1)) //_LBB801_202
+{
+	r4 = heap32[(fp+-36)];
+	r5 = (r4 + -1)|0;
+	r8 = 32;
+	r14 = 43;
+	r8 = r9 == 0 ? r8 : r14;
+	heap32[(fp+-36)] = r5;
+	heap8[r4+-1] = r8;
+}
+}
+	r4 = heap32[(fp+-36)];
+	r5 = heapU8[r4];
+_175: do {
+	if(r5 !=0) //_LBB801_204
+{
+	r5 = (r4 + 1)|0;
+	r8 = 0;
+_177: while(true){
+	r4 = (r8 + 1)|0;
+	r14 = heapU8[r5+r8];
+	r8 = r4;
+if(!(r14 !=0)) //_LBB801_205
+{
+break _175;
+}
+}
+}
+else{
+	r4 = 0;
+}
+} while(0);
+	r10 = uint(r10) < uint(r4) ? r4 : r10;
+	r14 = 48;
+	r5 = 0;
+	r8 = r5;
+__label__ = 69;
+break;
+}
+} while(0);
+switch(__label__ ){//multiple entries
+case 62:
+	r1 = heap32[(fp+-2)];
+	if(r1 ==-1) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r1 = r2 >> 2;
+	r4 = heap32[(r1+1)];
+	r1 = heap32[(r1)];
+	r5 = sp + -145;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 1;
+	heap32[(g0+2)] = r1;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r1 = heap32[(fp+-2)];
+	r1 = (r1 + 1)|0;
+	heap32[(fp+-2)] = r1;
+continue _1;
+}
+break;
+case 92:
+	r4 = r14 & 255;
+	r13 = 88;
+	r4 = r4 == r13;
+	r4 = r4 & 1;
+__label__ = 93;
+break;
+}
+if (__label__ == 93){
+	r5 = r5 & 255;
+	if(r5 !=0) //_LBB801_101
+{
+	r13 = 48;
+	r5 = 2;
+	heap8[sp+-135] = r13;
+	heap8[sp+-134] = r14;
+	r15 = r5;
+}
+else{
+	r5 = 0;
+	r15 = r5;
+}
+	if(uint(r11) >uint(r10)) //_LBB801_104
+{
+	r14 = 0;
+	r13 = 16;
+	r10 = r11;
+__label__ = 104;
+}
+else{
+	r14 = 0;
+	r13 = 16;
+__label__ = 104;
+}
+}
+_194: do {
+if (__label__ == 104){
+	heap32[(fp+-36)] = r0;
+	r16 = sp + -4;
+	heap32[(g0)] = r16;
+	heap32[(g0+1)] = 4;
+	my_arg_test(i7);
+	r17 = r_g0 >> 2;
+	r18 = r14 & 255;
+	r16 = 0;
+	r17 = heap32[(r17)];
+	r18 = r18 != r16;
+	r19 = r17 < r16;
+	r20 = (r16 - r17)|0;
+	r18 = r18 & r19;
+	r9 = r9 << 24;
+	r17 = r18 != 0 ? r20 : r17;
+	r9 = r9 >> 24;
+	r19 = r17 & 65535;
+	r17 = r9 < 0 ? r19 : r17;
+	r19 = heap32[(fp+-36)];
+	r20 = r17 & 255;
+	r21 = 2;
+	r9 = r9 < -1 ? r20 : r17;
+	r17 = r18 != 0 ? r21 : r14;
+	r14 = (r19 + r15)|0;
+	heap8[r14+122] = r16;
+	if(r9 !=0) //_LBB801_112
+{
+	r18 = (r13 + -1)|0;
+	r19 = 35;
+	r20 = 10;
+	r18 = uint(r18) > uint(r19) ? r20 : r13;
+	r4 = r4 & 255;
+	r13 = 39;
+	r19 = 7;
+	r4 = r4 == 0 ? r13 : r19;
+	r19 = (r15 + 121)|0;
+	r20 = -122;
+_198: while(true){
+	r13 = Math.floor(uint(r9) % uint(r18));
+	r13 = (r13 + 48)|0;
+	r22 = r13 & 255;
+	r23 = 57;
+	r22 = uint(r22) > uint(r23) ? r4 : r16;
+	r23 = (r20 + 1)|0;
+	r13 = (r13 + r22)|0;
+	r20 = (r14 - r20)|0;
+	heap8[r20+-1] = r13;
+	if(r19 <=r15) //_LBB801_115
+{
+break _198;
+}
+else{
+	r9 = Math.floor(uint(r9) /uint(r18));
+	r19 = (r19 + -1)|0;
+	r20 = r23;
+if(!(r9 !=0)) //_LBB801_113
+{
+break _198;
+}
+}
+}
+	r18 = (r23 + 122)|0;
+	r9 = (r14 - r23)|0;
+}
+else{
+	r4 = (r15 + r19)|0;
+	r13 = 48;
+	r9 = (r4 + 121)|0;
+	r18 = 1;
+	heap8[r4+121] = r13;
+}
+_204: do {
+if(!(r9 ==r14)) //_LBB801_125
+{
+	if(uint(r9) <=uint(r14)) //_LBB801_122
+{
+if(!(r18 ==-1)) //_LBB801_125
+{
+	r4 = (r16 - r18)|0;
+_209: while(true){
+	r13 = r4;
+	r19 = (r9 - r13)|0;
+	r4 = (r13 + 1)|0;
+	r20 = (r14 - r13)|0;
+	r19 = heapU8[r19];
+	heap8[r20] = r19;
+if(!(r13 !=0)) //_LBB801_124
+{
+break _204;
+}
+}
+}
+}
+else{
+if(!(r18 ==-1)) //_LBB801_125
+{
+	r4 = (r9 + 1)|0;
+	r9 = r18;
+_213: while(true){
+	heap8[r14] = r13;
+	if(r9 ==0) //_LBB801_125
+{
+break _204;
+}
+else{
+	r13 = heapU8[r4];
+	r4 = (r4 + 1)|0;
+	r9 = (r9 + -1)|0;
+	r14 = (r14 + 1)|0;
+}
+}
+}
+}
+}
+} while(0);
+	r4 = 1;
+	r4 = r18 != r4;
+	r4 = r4 & 1;
+	r14 = r8 ^ 1;
+	r4 = r4 | r14;
+	r4 = r4 & 255;
+	if(r4 !=0) //_LBB801_128
+{
+__label__ = 122;
+}
+else{
+	r4 = heap32[(fp+-36)];
+	r4 = heapU8[r4+r15];
+	if(r4 !=48) //_LBB801_128
+{
+__label__ = 122;
+}
+else{
+	r4 = r5 << 24;
+	r5 = 0;
+	r4 = r4 >> 24;
+	r14 = r11 == r5;
+	r4 = r4 > r5;
+	r4 = r14 | r4;
+	r4 = r4 != 0 ? r5 : r15;
+__label__ = 123;
+}
+}
+if (__label__ == 122){
+	r4 = (r18 + r15)|0;
+}
+	r14 = r17 & 255;
+	if(r14 ==2) //_LBB801_132
+{
+	r6 = heap32[(fp+-36)];
+	r7 = (r6 + -1)|0;
+	r4 = (r4 + 1)|0;
+	r14 = 48;
+	r16 = 45;
+	heap32[(fp+-36)] = r7;
+	heap8[r6+-1] = r16;
+	r16 = r21;
+}
+else{
+	if(r14 !=0) //_LBB801_133
+{
+	r14 = r7 | r6;
+	r14 = r14 & 255;
+if(!(r14 ==0)) //_LBB801_131
+{
+	r6 = heap32[(fp+-36)];
+	r16 = (r6 + -1)|0;
+	r7 = r7 & 255;
+	r9 = 32;
+	r13 = 43;
+	r4 = (r4 + 1)|0;
+	r14 = 48;
+	r7 = r7 == 0 ? r9 : r13;
+	heap32[(fp+-36)] = r16;
+	heap8[r6+-1] = r7;
+	r16 = r17;
+break _194;
+}
+}
+	r14 = 48;
+}
+}
+} while(0);
+	r6 = heap32[(fp+-36)];
+	r7 = r11 | r10;
+	if(r7 !=0) //_LBB801_77
+{
+	r7 = 0;
+	r5 = r5 << 24;
+	r5 = r5 >> 24;
+	if(r5 <1) //_LBB801_79
+{
+	r9 = r16 & 255;
+	r5 = r9 != r7;
+	r5 = r5 & 1;
+	if(r9 !=0) //_LBB801_81
+{
+__label__ = 75;
+}
+else{
+__label__ = 76;
+}
+}
+else{
+__label__ = 75;
+}
+if (__label__ == 75){
+	r4 = (r4 - r5)|0;
+	r10 = (r10 - r5)|0;
+	r9 = (r6 + r5)|0;
+	heap32[(fp+-36)] = r9;
+}
+	r8 = r8 & 255;
+	r9 = r8 != r7;
+	r7 = r10 == r7;
+	r7 = r9 & r7;
+	r7 = r7 != 0 ? r11 : r10;
+	r8 = r8 == 0 ? r4 : r11;
+	r9 = r12 & 255;
+if(!(r9 !=0)) //_LBB801_85
+{
+	r10 = r1 & 255;
+if(!(r10 !=32)) //_LBB801_85
+{
+	r11 = sp + -8;
+	r12 = (r7 - r8)|0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r12;
+	heap32[(g0+3)] = r10;
+	write_pad(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+}
+}
+if(!(r5 ==0)) //_LBB801_89
+{
+	if(r5 <0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r10 = heap32[(fp+-2)];
+	r11 = (r10 + r5)|0;
+	if(uint(r11) <uint(r10)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r10 = r2 >> 2;
+	r11 = heap32[(r10+1)];
+	r10 = heap32[(r10)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r10;
+	__FUNCTION_TABLE__[(r11)>>2](i7);
+	r6 = heap32[(fp+-2)];
+	r5 = (r6 + r5)|0;
+	heap32[(fp+-2)] = r5;
+}
+}
+}
+if(!(r9 !=0)) //_LBB801_92
+{
+	r5 = r1 & 255;
+if(!(r5 ==32)) //_LBB801_92
+{
+	r6 = sp + -8;
+	r10 = (r7 - r8)|0;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r5;
+	write_pad(i7);
+	r5 = r_g0;
+	if(r5 !=0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+}
+}
+	r5 = sp + -8;
+	r6 = (r8 - r4)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r14;
+	write_pad(i7);
+	r14 = r_g0;
+	if(r14 !=0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	if(r4 <0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r14 = heap32[(fp+-2)];
+	r6 = (r14 + r4)|0;
+	if(uint(r6) <uint(r14)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r14 = r2 >> 2;
+	r6 = heap32[(r14+1)];
+	r14 = heap32[(r14)];
+	r10 = heap32[(fp+-36)];
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r14;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r14 = heap32[(fp+-2)];
+	r4 = (r14 + r4)|0;
+	heap32[(fp+-2)] = r4;
+	if(r9 ==0) //_LBB801_207
+{
+continue _1;
+}
+else{
+	r4 = (r7 - r8)|0;
+	r14 = r1 & 255;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r14;
+	write_pad(i7);
+	r4 = r_g0;
+	if(r4 ==0) //_LBB801_207
+{
+continue _1;
+}
+else{
+__label__ = 198;
+break _1;
+}
+}
+}
+}
+}
+}
+else{
+	if(r4 <0) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r14 = heap32[(fp+-2)];
+	r1 = (r14 + r4)|0;
+	if(uint(r1) <uint(r14)) //_LBB801_210
+{
+__label__ = 198;
+break _1;
+}
+else{
+	r14 = r2 >> 2;
+	r1 = heap32[(r14+1)];
+	r14 = heap32[(r14)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r14;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r14 = heap32[(fp+-2)];
+	r4 = (r14 + r4)|0;
+	heap32[(fp+-2)] = r4;
+continue _1;
+}
+}
+}
+}
+}
+}
+switch(__label__ ){//multiple entries
+case 197:
+	r0 = heap32[(fp+-2)];
+	r_g0 = r0;
+	return;
+break;
+case 198:
+	r0 = -1;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function fprintf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	r1 = r0 >> 2;
+	r2 = __fwrite__index__;
+	heap32[(fp+-3)] = sp;
+	heap32[(r1+1)] = r2;
+	heap32[(fp+-2)] = 3;
+	r1 = _2E_str3133;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = sp;
+	__v_printf(i7);
+	return;
+}
+
+function vsnprintf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = sp + -16;
+	r1 = heap32[(fp+1)];
+	r2 = r0 >> 2;
+	r3 = heap32[(fp)];
+	heap32[(r2+1)] = 0;
+	r4 = (r1 + -1)|0;
+	r5 = 0;
+	r6 = sp + -24;
+	r7 = r1 == 0 ? r5 : r4;
+	heap32[(fp+-4)] = r3;
+	r8 = r6 >> 2;
+	r9 = swrite__index__;
+	heap32[(r2+2)] = r7;
+	heap32[(r8+1)] = r9;
+	heap32[(fp+-6)] = r0;
+	r0 = heap32[(fp+2)];
+	r2 = heap32[(fp+3)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	__v_printf(i7);
+	r0 = r_g0;
+if(!(r3 ==0)) //_LBB803_7
+{
+if(!(r1 ==0)) //_LBB803_7
+{
+if(!(r0 <0)) //_LBB803_7
+{
+if(!(r1 ==-1)) //_LBB803_6
+{
+if(!(uint(r0) <uint(r1))) //_LBB803_6
+{
+	heap8[r3+r4] = r5;
+	r_g0 = r0;
+	return;
+}
+}
+	heap8[r3+r0] = r5;
+}
+}
+}
+	r_g0 = r0;
+	return;
+}
+
+function sprintf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -48;var g0 = i7>>2; // save stack
+	r0 = (sp + 8)|0;
+	r1 = sp + -16;
+	r2 = r1 >> 2;
+	heap32[(fp+-7)] = r0;
+	r3 = heap32[(fp)];
+	heap32[(r2+1)] = 0;
+	r4 = sp + -24;
+	heap32[(fp+-4)] = r3;
+	r5 = r4 >> 2;
+	r6 = swrite__index__;
+	heap32[(r2+2)] = -2;
+	heap32[(r5+1)] = r6;
+	heap32[(fp+-6)] = r1;
+	r1 = heap32[(fp+1)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r0;
+	__v_printf(i7);
+	r0 = r_g0;
+if(!(r3 ==0)) //_LBB804_3
+{
+if(!(r0 <0)) //_LBB804_3
+{
+	r1 = 0;
+	heap8[r3+r0] = r1;
+}
+}
+	r_g0 = r0;
+	return;
+}
+
+function _ZN12mandreel_b64L11b64_encode_EPKhjPcjjPNS_6B64_RCE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = (r0 + 2)|0;
+	r2 = heap32[(fp+4)];
+	r1 = Math.floor(uint(r1) / uint(3));
+	r3 = heap32[(fp+2)];
+	r1 = r1 << 2;
+	r4 = r2 >> 2;
+	heap32[(r4)] = 0;
+_1: do {
+if(!(r3 ==0)) //_LBB805_20
+{
+	r5 = heap32[(fp+3)];
+	if(uint(r1) <=uint(r5)) //_LBB805_3
+{
+	r4 = heap32[(fp)];
+	if(uint(r0) >uint(2)) //_LBB805_5
+{
+	r5 = (r3 + r5)|0;
+	r6 = 0;
+	r12 = _ZN12mandreel_b64L9b64_charsE;
+_7: while(true){
+	r7 = heapU8[r4];
+	r8 = heapU8[r4+1];
+	r9 = r7 << 4;
+	r10 = heapU8[r4+2];
+	r11 = r8 << 2;
+	r9 = r9 & 48;
+	r8 = r8 >>> 4;
+	r7 = r7 >>> 2;
+	r8 = r9 | r8;
+	r9 = r11 & 60;
+	r11 = r10 >>> 6;
+	r7 = heapU8[r12+r7];
+	r9 = r9 | r11;
+	r8 = heapU8[r12+r8];
+	heap8[r3] = r7;
+	r7 = r10 & 63;
+	r9 = heapU8[r12+r9];
+	heap8[r3+1] = r8;
+	r8 = (r3 + 4)|0;
+	r6 = (r6 + 4)|0;
+	r7 = heapU8[r12+r7];
+	heap8[r3+2] = r9;
+	heap8[r3+3] = r7;
+	if(r8 ==r5) //_LBB805_8
+{
+__label__ = 7;
+}
+else{
+	if(r6 ==0) //_LBB805_9
+{
+	r7 = 13;
+	r8 = (r3 + 6)|0;
+	r6 = 0;
+	r9 = 10;
+	heap8[r3+4] = r7;
+	heap8[r3+5] = r9;
+	r3 = r8;
+__label__ = 9;
+}
+else{
+__label__ = 7;
+}
+}
+if (__label__ == 7){
+	r3 = r8;
+}
+	r0 = (r0 + -3)|0;
+	r4 = (r4 + 3)|0;
+if(!(uint(r0) >uint(2))) //_LBB805_6
+{
+break _7;
+}
+}
+}
+if(!(r0 ==0)) //_LBB805_20
+{
+	r5 = 0;
+_17: while(true){
+	r6 = sp + -3;
+	r7 = (r4 - r5)|0;
+	r8 = (r5 + -1)|0;
+	r5 = (r6 - r5)|0;
+	r7 = heapU8[r7];
+	heap8[r5] = r7;
+	r7 = (r0 + r8)|0;
+	r5 = r8;
+if(!(r7 !=0)) //_LBB805_13
+{
+break _17;
+}
+}
+	if(r0 !=3) //_LBB805_16
+{
+	r4 = 3;
+	r5 = (r4 - r0)|0;
+	r8 = 0;
+_22: while(true){
+	r7 = (r5 + -1)|0;
+	r5 = (r6 - r5)|0;
+	heap8[r5+3] = r8;
+	r5 = r7;
+if(!(r7 !=0)) //_LBB805_17
+{
+break _22;
+}
+}
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 3;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = 12;
+	heap32[(g0+4)] = r2;
+	r0 = (r4 - r0)|0;
+	_ZN12mandreel_b64L11b64_encode_EPKhjPcjjPNS_6B64_RCE(i7);
+	r4 = 61;
+_25: while(true){
+	r2 = (r0 + -1)|0;
+	r0 = (r3 - r0)|0;
+	heap8[r0+4] = r4;
+	r0 = r2;
+	if(r2 !=0) //_LBB805_19
+{
+continue _25;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = 3;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = 12;
+	heap32[(g0+4)] = r2;
+	_ZN12mandreel_b64L11b64_encode_EPKhjPcjjPNS_6B64_RCE(i7);
+	r_g0 = r1;
+	return;
+}
+}
+}
+else{
+	heap32[(r4)] = 1;
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+}
+} while(0);
+	r_g0 = r1;
+	return;
+}
+
+function _ZN12mandreel_b6410b64_decodeEPKcjPvj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = r0 & 3;
+	r2 = 0;
+	r1 = r1 != r2;
+	r1 = r1 & 1;
+	r3 = r0 >>> 2;
+	r1 = (r1 + r3)|0;
+	r3 = heap32[(fp+2)];
+	r1 = (r1 * 3)|0;
+	if(r3 !=0) //_LBB806_2
+{
+	r4 = heap32[(fp+3)];
+	if(uint(r1) <=uint(r4)) //_LBB806_4
+{
+	r1 = heap32[(fp)];
+	r4 = r3;
+	r5 = r2;
+_5: while(true){
+	if(r0 !=0) //_LBB806_5
+{
+	r6 = heapU8[r1];
+	if(r6 !=61) //_LBB806_7
+{
+	r7 = _ZN12mandreel_b64L11b64_indexesE;
+	r6 = heapU8[r7+r6];
+	if(r6 !=255) //_LBB806_9
+{
+	r5 = 0;
+	r7 = sp + -4;
+	heap8[r7+r2] = r6;
+__label__ = 8;
+}
+else{
+__label__ = 15;
+}
+}
+else{
+	r5 = (r5 + 1)|0;
+	r6 = sp + -4;
+	r7 = 0;
+	heap8[r6+r2] = r7;
+__label__ = 8;
+}
+if (__label__ == 8){
+	r2 = (r2 + 1)|0;
+	if(r2 ==4) //_LBB806_12
+{
+	r2 = heapU8[sp+-3];
+	r6 = heapU8[sp+-4];
+	r2 = r2 >>> 4;
+	r2 = r2 & 3;
+	r6 = r6 << 2;
+	r2 = r2 | r6;
+	heap8[r4] = r2;
+	if(r5 !=2) //_LBB806_14
+{
+	r2 = heapU8[sp+-2];
+	r6 = heapU8[sp+-3];
+	r2 = r2 >>> 2;
+	r2 = r2 & 15;
+	r6 = r6 << 4;
+	r2 = r2 | r6;
+	heap8[r4+1] = r2;
+	if(r5 !=1) //_LBB806_16
+{
+	r2 = heapU8[sp+-2];
+	r7 = heapU8[sp+-1];
+	r2 = r2 << 6;
+	r6 = (r4 + 3)|0;
+	r2 = (r2 + r7)|0;
+	heap8[r4+2] = r2;
+	if(r5 ==0) //_LBB806_18
+{
+	r2 = 0;
+	r4 = r6;
+	r5 = r2;
+}
+else{
+__label__ = 18;
+break _5;
+}
+}
+else{
+__label__ = 12;
+break _5;
+}
+}
+else{
+__label__ = 10;
+break _5;
+}
+}
+}
+	r0 = (r0 + -1)|0;
+	r1 = (r1 + 1)|0;
+}
+else{
+__label__ = 17;
+break _5;
+}
+}
+switch(__label__ ){//multiple entries
+case 17:
+	r6 = r4;
+break;
+case 12:
+	r6 = (r4 + 2)|0;
+break;
+case 10:
+	r6 = (r4 + 1)|0;
+break;
+}
+	r1 = (r6 - r3)|0;
+}
+else{
+	r1 = 0;
+}
+}
+	r_g0 = r1;
+	return;
+}
+
+function __mandreel_internal_SetResolution(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _ZL25s_mandreel_internal_width;
+	r1 = _ZL26s_mandreel_internal_height;
+	r0 = r0 >> 2;
+	r2 = heap32[(fp)];
+	r1 = r1 >> 2;
+	r3 = heap32[(fp+1)];
+	heap32[(r0)] = r2;
+	heap32[(r1)] = r3;
+	return;
+}
+
+function __keyEvent(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function __mouseDoubleClick(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function __mouseMove(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function __resize(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function __mouseButton(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function __mouseWheelDelta(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function iMandreel_TextureAsync_IsCompressed(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+var __label__ = 0;
+	i7 = sp + -1032;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = sp + -1024;
+	r4 = 0;
+_1: while(true){
+	r5 = heapU8[r0];
+	if(r5 ==0) //_LBB814_5
+{
+break _1;
+}
+else{
+	r6 = r5 << 24;
+	r6 = r6 >> 24;
+	r6 = (r6 + -65)|0;
+	r7 = 26;
+	r8 = (r5 + 32)|0;
+	r5 = uint(r6) < uint(r7) ? r8 : r5;
+	r6 = r5 & 255;
+	r7 = 47;
+	r5 = r6 == 92 ? r7 : r5;
+	r0 = (r0 + 1)|0;
+	r6 = r5 & 255;
+if(!(r6 !=47)) //_LBB814_4
+{
+	r6 = r4 & 255;
+	r4 = r5;
+	if(r6 ==47) //_LBB814_1
+{
+continue _1;
+}
+}
+	r4 = (r3 + 1)|0;
+	heap8[r3] = r5;
+	r3 = r4;
+	r4 = r5;
+continue _1;
+}
+}
+	r0 = _ZL24g_pFirstTextureAsyncInfo;
+	r4 = 0;
+	heap8[r3] = r4;
+_8: while(true){
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	if(r0 !=0) //_LBB814_6
+{
+	r3 = sp + -1024;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r3 = r_g0;
+	if(r3 !=0) //_LBB814_8
+{
+	r0 = (r0 + 280)|0;
+continue _8;
+}
+else{
+__label__ = 7;
+break _8;
+}
+}
+else{
+__label__ = 10;
+break _8;
+}
+}
+switch(__label__ ){//multiple entries
+case 10:
+	r0 = -1;
+	r_g0 = r0;
+	return;
+break;
+case 7:
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r3 = heap32[(r0+65)];
+	heap32[(r1)] = r3;
+	r1 = r2 >> 2;
+	r2 = heap32[(r0+66)];
+	heap32[(r1)] = r2;
+	r0 = heap32[(r0+67)];
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function iMandreel_TextureAsync_GetPackOffset(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -1032;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+3)];
+	r4 = sp + -1024;
+	r5 = 0;
+_1: while(true){
+	r6 = heapU8[r0];
+	if(r6 ==0) //_LBB815_5
+{
+break _1;
+}
+else{
+	r7 = r6 << 24;
+	r7 = r7 >> 24;
+	r7 = (r7 + -65)|0;
+	r8 = 26;
+	r9 = (r6 + 32)|0;
+	r6 = uint(r7) < uint(r8) ? r9 : r6;
+	r7 = r6 & 255;
+	r8 = 47;
+	r6 = r7 == 92 ? r8 : r6;
+	r0 = (r0 + 1)|0;
+	r7 = r6 & 255;
+if(!(r7 !=47)) //_LBB815_4
+{
+	r7 = r5 & 255;
+	r5 = r6;
+	if(r7 ==47) //_LBB815_1
+{
+continue _1;
+}
+}
+	r5 = (r4 + 1)|0;
+	heap8[r4] = r6;
+	r4 = r5;
+	r5 = r6;
+continue _1;
+}
+}
+	r0 = _ZL24g_pFirstTextureAsyncInfo;
+	r5 = 0;
+	heap8[r4] = r5;
+_8: while(true){
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	if(r0 !=0) //_LBB815_6
+{
+	r4 = sp + -1024;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r4 = r_g0;
+if(!(r4 !=0)) //_LBB815_9
+{
+	r4 = r0 >> 2;
+	r5 = heap32[(r4+64)];
+if(!(r5 ==-1)) //_LBB815_9
+{
+__label__ = 8;
+break _8;
+}
+}
+	r0 = (r0 + 280)|0;
+continue _8;
+}
+else{
+__label__ = 11;
+break _8;
+}
+}
+switch(__label__ ){//multiple entries
+case 11:
+	r0 = 0;
+	r_g0 = r0;
+	return;
+break;
+case 8:
+	r0 = r1 >> 2;
+	r1 = heap32[(r4+68)];
+	heap32[(r0)] = r1;
+	r0 = r2 >> 2;
+	r1 = heap32[(r4+69)];
+	heap32[(r0)] = r1;
+	r0 = heap32[(r4+64)];
+	r1 = _ZL17g_apPackFileNames;
+	r0 = r0 << 2;
+	r0 = (r1 + r0)|0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	strcpy(i7);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+
+function _Z31MandreelDefaultDebugMsgCallbackiPKc(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	heap32[(g0)] = r0;
+	__sandbox_OutputDebugString(i7);
+	return;
+}
+
+function printf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16408;var g0 = i7>>2; // save stack
+	r0 = (sp + 4)|0;
+	heap32[(fp+-4097)] = r0;
+	r1 = sp + -16384;
+	r2 = heap32[(fp)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 16384;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r0;
+	r0 = g_msgcallback;
+	r0 = r0 >> 2;
+	vsnprintf(i7);
+	r0 = heap32[(r0)];
+if(!(r0 ==0)) //_LBB817_2
+{
+	heap32[(g0)] = r1;
+	__sandbox_OutputDebugString(i7);
+}
+	return;
+}
+
+function _printf_error(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16408;var g0 = i7>>2; // save stack
+	r0 = (sp + 4)|0;
+	heap32[(fp+-4097)] = r0;
+	r1 = sp + -16384;
+	r2 = heap32[(fp)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 16384;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r0;
+	r0 = g_msgcallback;
+	r0 = r0 >> 2;
+	vsnprintf(i7);
+	r0 = heap32[(r0)];
+if(!(r0 ==0)) //_LBB818_2
+{
+	heap32[(g0)] = r1;
+	__sandbox_OutputDebugString(i7);
+}
+	return;
+}
+
+function _printf_warning(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -16408;var g0 = i7>>2; // save stack
+	r0 = (sp + 4)|0;
+	heap32[(fp+-4097)] = r0;
+	r1 = sp + -16384;
+	r2 = heap32[(fp)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 16384;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r0;
+	r0 = g_msgcallback;
+	r0 = r0 >> 2;
+	vsnprintf(i7);
+	r0 = heap32[(r0)];
+if(!(r0 ==0)) //_LBB819_2
+{
+	heap32[(g0)] = r1;
+	__sandbox_OutputDebugString(i7);
+}
+	return;
+}
+
+function __mandreel_internal_preupdate(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r1 = _ZGVZ21Mandreel_GetTickCountE7s_first;
+	gettimeofday(i7);
+	r2 = heapU8[r1];
+if(!(r2 !=0)) //_LBB820_2
+{
+	r2 = heap32[(fp+-2)];
+	r3 = r2 >> 31;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1000000;
+	heap32[(g0+3)] = 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	__muldi3(i7);
+	r4 = 1;
+	r5 = (r_g0 + r0)|0;
+	r6 = 0;
+	r7 = r0 >> 31;
+	r2 = uint(r5) < uint(r_g0) ? r4 : r6;
+	r6 = _ZZ21Mandreel_GetTickCountE7s_first;
+	r3 = (r_g1 + r7)|0;
+	r0 = uint(r5) < uint(r0) ? r4 : r2;
+	r2 = r6 >> 2;
+	r0 = (r3 + r0)|0;
+	heap32[(r2)] = r5;
+	heap32[(r2+1)] = r0;
+	heap8[r1] = r4;
+}
+	r0 = _ZZ29__mandreel_internal_preupdateE8s_bfirst_2E_b;
+	r1 = heapU8[r0];
+if(!(r1 != 0)) //_LBB820_4
+{
+	r1 = 1;
+	heap8[r0] = r1;
+}
+	return;
+}
+
+function __mandreel_internal_update(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = -32788;
+_1: while(true){
+	r1 = _ZL10s_aSockets;
+	r1 = (r1 - r0)|0;
+	r2 = heapU8[r1];
+if(!(r2 ==0)) //_LBB821_3
+{
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+-1)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 2048;
+	js_mandreel_flash_tcp_update(i7);
+}
+	r0 = (r0 + -32792)|0;
+	if(r0 !=-295124) //_LBB821_1
+{
+continue _1;
+}
+else{
+break _1;
+}
+}
+	r0 = _ZL7g_bInit_2E_b;
+	r1 = heapU8[r0];
+	if(r1 != 0) //_LBB821_6
+{
+	mandreel_audio_update(i7);
+	r1 = sp + -8;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	gettimeofday(i7);
+	r2 = heap32[(fp+-2)];
+	r3 = r2 >> 31;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1000000;
+	heap32[(g0+3)] = 0;
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+1)];
+	__muldi3(i7);
+	r4 = (r_g0 + r1)|0;
+	r5 = 1;
+	r6 = 0;
+	r7 = r1 >> 31;
+	r2 = uint(r4) < uint(r_g0) ? r5 : r6;
+	r3 = (r_g1 + r7)|0;
+	r1 = uint(r4) < uint(r1) ? r5 : r2;
+	r1 = (r3 + r1)|0;
+	r2 = _ZGVZ21Mandreel_GetTickCountE7s_first;
+	r3 = heapU8[r2];
+if(!(r3 !=0)) //_LBB821_8
+{
+	r3 = _ZZ21Mandreel_GetTickCountE7s_first;
+	r3 = r3 >> 2;
+	heap32[(r3)] = r4;
+	heap32[(r3+1)] = r1;
+	heap8[r2] = r5;
+}
+	r2 = _ZZ21Mandreel_GetTickCountE7s_first;
+	r2 = r2 >> 2;
+	r3 = heap32[(r2)];
+	r2 = heap32[(r2+1)];
+	r1 = (r1 - r2)|0;
+	r2 = uint(r4) < uint(r3) ? r5 : r6;
+	r3 = (r4 - r3)|0;
+	r1 = (r1 - r2)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 1000;
+	heap32[(g0+3)] = 0;
+	__udivdi3(i7);
+	r1 = r_g0;
+	r2 = _ZL11g_aChannels;
+_12: while(true){
+	if(r6 <32) //_LBB821_9
+{
+	r3 = r2 >> 2;
+	r4 = heap32[(r3+72)];
+if(!(r4 !=1)) //_LBB821_33
+{
+	r4 = _ZL11g_aChannels;
+	r7 = (r6 * 292)|0;
+	r4 = (r4 + r7)|0;
+	r7 = heapU8[r4+268];
+if(!(r7 !=0)) //_LBB821_33
+{
+	r7 = heap32[(r3+71)];
+	if(r7 ==-1) //_LBB821_13
+{
+	r7 = heapU8[r0];
+	if(r7 !=1) //_LBB821_15
+{
+__label__ = 14;
+break _12;
+}
+else{
+	r7 = _ZL21g_pFirstSoundDuration;
+_21: while(true){
+	r7 = r7 >> 2;
+	r7 = heap32[(r7)];
+	if(r7 !=0) //_LBB821_16
+{
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r2;
+	strcmp(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB821_18
+{
+	r7 = (r7 + 260)|0;
+}
+else{
+__label__ = 16;
+break _21;
+}
+}
+else{
+__label__ = 19;
+break _21;
+}
+}
+switch(__label__ ){//multiple entries
+case 19:
+	r7 = _2E_str3224;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r2;
+	r7 = 0;
+	_printf_warning(i7);
+break;
+case 16:
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+64)];
+break;
+}
+	heap32[(r3+71)] = r7;
+}
+}
+	r8 = heap32[(r3+70)];
+	r7 = (r8 + r7)|0;
+if(!(uint(r7) >uint(r1))) //_LBB821_33
+{
+	r7 = heapU8[r0];
+	if(r7 != 0) //_LBB821_25
+{
+	r7 = (r6 + -1)|0;
+if(!(uint(r7) >uint(30))) //_LBB821_33
+{
+	r7 = heapU8[r4+269];
+if(!(r7 !=0)) //_LBB821_33
+{
+if(!(uint(r6) >uint(31))) //_LBB821_29
+{
+	r7 = heap32[(r3+68)];
+	r8 = heap32[(r3+69)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r8;
+	heap32[(g0+2)] = r7;
+	mandreel_audio_stopChannel(i7);
+	heap32[(r3+72)] = 0;
+	heap32[(r3+68)] = -1;
+}
+	r3 = _ZL15g_iFreeChannels;
+	r3 = r3 >> 2;
+	heap8[r4+269] = r5;
+	r4 = heap32[(r3)];
+	r7 = (r4 + -1)|0;
+_37: do {
+if(!(r7 <0)) //_LBB821_32
+{
+	r7 = r4;
+_39: while(true){
+	r8 = _ZL15g_aFreeChannels;
+	r9 = r7 << 2;
+	r8 = (r8 + r9)|0;
+	r8 = r8 >> 2;
+	r9 = heap32[(r8+-1)];
+	r7 = (r7 + -1)|0;
+	heap32[(r8)] = r9;
+if(!(r7 !=0)) //_LBB821_31
+{
+break _37;
+}
+}
+}
+} while(0);
+	r7 = _ZL15g_aFreeChannels;
+	r7 = r7 >> 2;
+	r4 = (r4 + 1)|0;
+	heap32[(r7)] = r6;
+	heap32[(r3)] = r4;
+}
+}
+}
+else{
+__label__ = 23;
+break _12;
+}
+}
+}
+}
+	r6 = (r6 + 1)|0;
+	r2 = (r2 + 292)|0;
+}
+else{
+__label__ = 34;
+break _12;
+}
+}
+switch(__label__ ){//multiple entries
+case 34:
+	return;
+break;
+case 14:
+	r7 = _2E_str221;
+	r0 = _2E_str1222;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 341;
+	_assert(i7);
+break;
+case 23:
+	r0 = _2E_str221;
+	r1 = _2E_str1222;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 621;
+	_assert(i7);
+break;
+}
+}
+else{
+	r0 = _2E_str221;
+	r1 = _2E_str1222;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = 361;
+	_assert(i7);
+}
+}
+
+function __mandreel_internal_init(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+var __label__ = 0;
+	i7 = sp + -2456;var g0 = i7>>2; // save stack
+	r0 = __mandreel_internal_SetResolution__index__;
+	r1 = _ZZ24__mandreel_internal_initE54s_723478567_mandreel___mandreel_internal_SetResolution;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	r0 = iMandreel_TextureAsync_IsCompressed__index__;
+	r1 = _ZZ24__mandreel_internal_initE56s_723478567_mandreel_iMandreel_TextureAsync_IsCompressed;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	r0 = iMandreel_TextureAsync_GetPackOffset__index__;
+	r1 = _ZZ24__mandreel_internal_initE57s_723478567_mandreel_iMandreel_TextureAsync_GetPackOffset;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	r0 = __resize__index__;
+	r1 = _ZZ24__mandreel_internal_initE29s_723478567_mandreel___resize;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	r0 = imandreel_restore_glcontext__index__;
+	r1 = _ZZ24__mandreel_internal_initE48s_723478567_mandreel_imandreel_restore_glcontext;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	r0 = imandreel_viewport_resize__index__;
+	r1 = _ZZ24__mandreel_internal_initE46s_723478567_mandreel_imandreel_viewport_resize;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	r0 = g_msgcallback;
+	r0 = r0 >> 2;
+	r1 = _Z31MandreelDefaultDebugMsgCallbackiPKc__index__;
+	iMandreelRegisterExternalCallback(i7);
+	r2 = _ZL7g_bInit_2E_b;
+	heap32[(r0)] = r1;
+	r0 = heapU8[r2];
+	if(r0 !=1) //_LBB822_2
+{
+	r0 = 1;
+	heap8[r2] = r0;
+	r1 = 0;
+	mandreel_audio_isLogEnabled(i7);
+	r2 = r_g0 != r1;
+	r3 = _ZL6g_bLog;
+	r2 = r2 & 1;
+	heap8[r3] = r2;
+	mandreel_audio_useMusicFunctions(i7);
+	r2 = heapU8[r3];
+	if(r2 !=0) //_LBB822_4
+{
+	r2 = _2E_str35256;
+	heap32[(g0)] = r2;
+	printf(i7);
+}
+else{
+	r1 = 0;
+}
+_6: while(true){
+	r2 = (r1 * 73)|0;
+	r3 = _ZL11g_aChannels;
+	r2 = r2 << 2;
+	r2 = (r3 + r2)|0;
+	r4 = (r1 * 292)|0;
+	r2 = r2 >> 2;
+	r5 = _ZL15g_aFreeChannels;
+	r6 = r1 << 2;
+	r5 = (r5 + r6)|0;
+	r3 = (r3 + r4)|0;
+	heap32[(r2+69)] = r1;
+	r2 = (r1 + 1)|0;
+	r4 = r5 >> 2;
+	heap8[r3+269] = r0;
+	heap32[(r4)] = r1;
+	r1 = r2;
+if(!(r2 !=32)) //_LBB822_5
+{
+break _6;
+}
+}
+	r1 = _ZL15g_iFreeChannels;
+	r1 = r1 >> 2;
+	heap32[(r1)] = 32;
+	mandreel_audio_init(i7);
+	r1 = _2E_str22243;
+	heap32[(g0)] = r1;
+	printf(i7);
+	heap32[(g0)] = 0;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	r1 = _2E_str779;
+	r2 = _2E_str1648;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	fopen(i7);
+	r3 = r_g0;
+	heap32[(g0)] = 1;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	if(r3 ==0) //_LBB822_19
+{
+	r4 = _2E_str24245;
+	r5 = 0;
+	heap32[(g0)] = r4;
+	_printf_error(i7);
+	r4 = r5;
+}
+else{
+	if(uint(r3) <uint(10)) //_LBB822_9
+{
+	r4 = _ZL13s_file_stdout;
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+7)];
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+}
+else{
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+7)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	r4 = r3;
+}
+	r5 = r4 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+5)];
+	heap32[(g0)] = r4;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	r4 = r_g0;
+	if(uint(r3) >uint(9)) //_LBB822_12
+{
+	r5 = r3;
+}
+else{
+	r5 = _ZL13s_file_stdout;
+}
+	r6 = r5 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+7)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	r5 = (r4 + 1)|0;
+	heap32[(g0)] = r5;
+	malloc(i7);
+	r5 = r_g0;
+	if(uint(r3) <uint(10)) //_LBB822_15
+{
+	r6 = _ZL13s_file_stdout;
+	r7 = r6 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+1)];
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = r4;
+	r8 = 0;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	heap8[r5+r4] = r8;
+}
+else{
+	r6 = r3 >> 2;
+	r6 = heap32[(r6)];
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = r4;
+	r7 = 0;
+	__FUNCTION_TABLE__[(r6)>>2](i7);
+	heap8[r5+r4] = r7;
+	r6 = r3;
+}
+	r7 = r6 >> 2;
+	r7 = heap32[(r7)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+4)];
+	heap32[(g0)] = r6;
+	__FUNCTION_TABLE__[(r7)>>2](i7);
+	if(uint(r3) >uint(9)) //_LBB822_18
+{
+	heap32[(g0)] = r6;
+	_ZdlPv(i7);
+}
+}
+	r3 = sp + -128;
+	heap32[(g0)] = r3;
+	mandreel_audio_getAudioDriverName(i7);
+	r6 = _2E_str4225;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r6;
+	strcmp(i7);
+	r3 = r_g0;
+if(!(r5 ==0)) //_LBB822_198
+{
+_28: do {
+if(!(r4 <1)) //_LBB822_197
+{
+	r6 = sp + -1408;
+	r7 = (r6 + 1)|0;
+	r8 = (r5 + 1)|0;
+	r9 = 0;
+_30: while(true){
+	r10 = (r5 + r9)|0;
+	r11 = heapU8[r5+r9];
+if(!(r11 ==13)) //_LBB822_25
+{
+	if(r9 <r4) //_LBB822_26
+{
+	r11 = r9;
+_35: while(true){
+	r9 = (r11 + 1)|0;
+	r11 = heapU8[r8+r11];
+	if(r11 ==13) //_LBB822_29
+{
+break _35;
+}
+else{
+	r11 = r9;
+if(!(r9 <r4)) //_LBB822_27
+{
+break _35;
+}
+}
+}
+}
+}
+	r11 = _ZL10strtok_pos;
+	r12 = 0;
+	r11 = r11 >> 2;
+	heap8[r5+r9] = r12;
+	r13 = heap32[(r11)];
+	r9 = (r9 + 2)|0;
+	r10 = r10 == 0 ? r13 : r10;
+_39: while(true){
+	r13 = heapU8[r10];
+	if(r13 ==0) //_LBB822_47
+{
+__label__ = 44;
+break _39;
+}
+else{
+	r14 = r12;
+_42: while(true){
+	if(r14 ==-1) //_LBB822_36
+{
+__label__ = 34;
+break _39;
+}
+else{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r13 & 255;
+	r15 = heapU8[r15];
+	if(r16 !=r15) //_LBB822_30
+{
+	r14 = (r14 + -1)|0;
+}
+else{
+break _42;
+}
+}
+}
+	r10 = (r10 + 1)|0;
+}
+}
+_47: do {
+if (__label__ == 34){
+	if(r13 ==0) //_LBB822_47
+{
+__label__ = 44;
+}
+else{
+	r12 = r10;
+_50: while(true){
+	r13 = heapU8[r12];
+	if(r13 ==0) //_LBB822_44
+{
+break _50;
+}
+else{
+	r14 = r0;
+_53: while(true){
+	if(r14 !=0) //_LBB822_38
+{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r13 & 255;
+	r15 = heapU8[r15+1];
+	if(r16 ==r15) //_LBB822_44
+{
+break _50;
+}
+else{
+	r14 = (r14 + -1)|0;
+}
+}
+else{
+break _53;
+}
+}
+	r12 = (r12 + 1)|0;
+}
+}
+	r13 = heapU8[r12];
+	if(r13 !=0) //_LBB822_46
+{
+	r13 = (r12 + 1)|0;
+	r14 = 0;
+	heap8[r12] = r14;
+	r12 = r13;
+}
+	heap32[(r11)] = r12;
+	r13 = _2E_str26247;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r10;
+	strcmp(i7);
+	r13 = r_g0;
+	if(r13 !=0) //_LBB822_71
+{
+	r13 = _2E_str29250;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r10;
+	strcmp(i7);
+	r13 = r_g0;
+	if(r13 !=0) //_LBB822_154
+{
+	if(r3 !=0) //_LBB822_70
+{
+__label__ = 66;
+break _47;
+}
+else{
+	r13 = _2E_str32253;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r10;
+	strcmp(i7);
+	r13 = r_g0;
+	if(r13 !=0) //_LBB822_176
+{
+	r13 = _2E_str33254;
+	heap32[(g0)] = r13;
+	heap32[(g0+1)] = r10;
+	strcmp(i7);
+	r10 = r_g0;
+	if(r10 !=0) //_LBB822_70
+{
+__label__ = 66;
+break _47;
+}
+else{
+__label__ = 173; //SET chanka
+_69: while(true){
+	r10 = heapU8[r12];
+	if(r10 ==0) //_LBB822_184
+{
+__label__ = 175;
+break _69;
+}
+else{
+	r13 = 0;
+_72: while(true){
+	if(r13 ==-1) //_LBB822_185
+{
+__label__ = 176;
+break _69;
+}
+else{
+	r14 = _2E_str4133;
+	r14 = (r14 - r13)|0;
+	r15 = r10 & 255;
+	r14 = heapU8[r14];
+	if(r15 !=r14) //_LBB822_178
+{
+	r13 = (r13 + -1)|0;
+}
+else{
+break _72;
+}
+}
+}
+	r12 = (r12 + 1)|0;
+}
+}
+if (__label__ == 176){
+	if(r10 ==0) //_LBB822_184
+{
+__label__ = 175;
+}
+else{
+	r13 = r12;
+_80: while(true){
+	r10 = heapU8[r13];
+	if(r10 ==0) //_LBB822_193
+{
+break _80;
+}
+else{
+	r14 = 1;
+_83: while(true){
+	if(r14 !=0) //_LBB822_187
+{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r10 & 255;
+	r15 = heapU8[r15+1];
+	if(r16 ==r15) //_LBB822_193
+{
+break _80;
+}
+else{
+	r14 = (r14 + -1)|0;
+}
+}
+else{
+break _83;
+}
+}
+	r13 = (r13 + 1)|0;
+}
+}
+	r10 = heapU8[r13];
+	if(r10 !=0) //_LBB822_195
+{
+	r14 = (r13 + 1)|0;
+	r10 = 0;
+	heap8[r13] = r10;
+	r10 = r12;
+	r12 = r14;
+__label__ = 187;
+}
+else{
+	r10 = r12;
+	r12 = r13;
+__label__ = 187;
+}
+}
+}
+if (__label__ == 175){
+	r10 = 0;
+}
+	heap32[(r11)] = r12;
+	r11 = sp + -384;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r10;
+	strcpy(i7);
+__label__ = 66;
+break _47;
+}
+}
+else{
+_95: while(true){
+	r10 = heapU8[r12];
+	if(r10 ==0) //_LBB822_163
+{
+__label__ = 155;
+break _95;
+}
+else{
+	r13 = 0;
+_98: while(true){
+	if(r13 ==-1) //_LBB822_164
+{
+__label__ = 156;
+break _95;
+}
+else{
+	r14 = _2E_str4133;
+	r14 = (r14 - r13)|0;
+	r15 = r10 & 255;
+	r14 = heapU8[r14];
+	if(r15 !=r14) //_LBB822_157
+{
+	r13 = (r13 + -1)|0;
+}
+else{
+break _98;
+}
+}
+}
+	r12 = (r12 + 1)|0;
+}
+}
+if (__label__ == 156){
+	if(r10 ==0) //_LBB822_163
+{
+__label__ = 155;
+}
+else{
+	r13 = r12;
+_106: while(true){
+	r10 = heapU8[r13];
+	if(r10 ==0) //_LBB822_172
+{
+break _106;
+}
+else{
+	r14 = 1;
+_109: while(true){
+	if(r14 !=0) //_LBB822_166
+{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r10 & 255;
+	r15 = heapU8[r15+1];
+	if(r16 ==r15) //_LBB822_172
+{
+break _106;
+}
+else{
+	r14 = (r14 + -1)|0;
+}
+}
+else{
+break _109;
+}
+}
+	r13 = (r13 + 1)|0;
+}
+}
+	r10 = heapU8[r13];
+	if(r10 !=0) //_LBB822_174
+{
+	r14 = (r13 + 1)|0;
+	r10 = 0;
+	heap8[r13] = r10;
+	r10 = r12;
+	r12 = r14;
+__label__ = 167;
+}
+else{
+	r10 = r12;
+	r12 = r13;
+__label__ = 167;
+}
+}
+}
+if (__label__ == 155){
+	r10 = 0;
+}
+	heap32[(r11)] = r12;
+	r11 = sp + -2432;
+	r12 = _2E_str12233;
+	r13 = sp + -384;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r13;
+	heap32[(g0+3)] = r10;
+	sprintf(i7);
+	heap32[(g0)] = r11;
+	mandreel_add_valid_fopenfile(i7);
+__label__ = 66;
+break _47;
+}
+}
+}
+else{
+	r10 = (r12 + 1)|0;
+	r13 = 0;
+	r14 = r12;
+_122: while(true){
+	r15 = heapU8[r12+r13];
+	if(r15 ==0) //_LBB822_90
+{
+__label__ = 85;
+break _122;
+}
+else{
+	r16 = 0;
+_125: while(true){
+	if(r16 ==-1) //_LBB822_79
+{
+__label__ = 75;
+break _122;
+}
+else{
+	r17 = _2E_str4133;
+	r17 = (r17 - r16)|0;
+	r18 = r15 & 255;
+	r17 = heapU8[r17];
+	if(r18 !=r17) //_LBB822_73
+{
+	r16 = (r16 + -1)|0;
+}
+else{
+break _125;
+}
+}
+}
+	r13 = (r13 + 1)|0;
+	r14 = (r14 + 1)|0;
+	r10 = (r10 + 1)|0;
+}
+}
+_130: do {
+if (__label__ == 75){
+	if(r15 ==0) //_LBB822_90
+{
+__label__ = 85;
+}
+else{
+	r15 = (r12 + r13)|0;
+_133: while(true){
+	r16 = heapU8[r14];
+	if(r16 ==0) //_LBB822_87
+{
+break _133;
+}
+else{
+	r17 = 1;
+_136: while(true){
+	if(r17 !=0) //_LBB822_81
+{
+	r18 = _2E_str4133;
+	r18 = (r18 - r17)|0;
+	r19 = r16 & 255;
+	r18 = heapU8[r18+1];
+	if(r19 ==r18) //_LBB822_87
+{
+break _133;
+}
+else{
+	r17 = (r17 + -1)|0;
+}
+}
+else{
+break _136;
+}
+}
+	r14 = (r14 + 1)|0;
+}
+}
+	r16 = heapU8[r14];
+	if(r16 !=0) //_LBB822_89
+{
+	r16 = (r14 + 1)|0;
+	r17 = 0;
+	heap8[r14] = r17;
+	r14 = r16;
+}
+	r17 = 0;
+	r16 = r15 == r17;
+	heap32[(r11)] = r14;
+_145: while(true){
+	r18 = heapU8[r14];
+	if(r18 ==0) //_LBB822_109
+{
+__label__ = 103;
+break _145;
+}
+else{
+	r19 = r17;
+_148: while(true){
+	if(r19 ==-1) //_LBB822_98
+{
+__label__ = 93;
+break _145;
+}
+else{
+	r20 = _2E_str4133;
+	r20 = (r20 - r19)|0;
+	r21 = r18 & 255;
+	r20 = heapU8[r20];
+	if(r21 !=r20) //_LBB822_92
+{
+	r19 = (r19 + -1)|0;
+}
+else{
+break _148;
+}
+}
+}
+	r14 = (r14 + 1)|0;
+}
+}
+if (__label__ == 93){
+if(!(r18 ==0)) //_LBB822_109
+{
+	r17 = r14;
+_156: while(true){
+	r18 = heapU8[r17];
+	if(r18 ==0) //_LBB822_106
+{
+break _156;
+}
+else{
+	r19 = 1;
+_159: while(true){
+	if(r19 !=0) //_LBB822_100
+{
+	r20 = _2E_str4133;
+	r20 = (r20 - r19)|0;
+	r21 = r18 & 255;
+	r20 = heapU8[r20+1];
+	if(r21 ==r20) //_LBB822_106
+{
+break _156;
+}
+else{
+	r19 = (r19 + -1)|0;
+}
+}
+else{
+break _159;
+}
+}
+	r17 = (r17 + 1)|0;
+}
+}
+	r18 = heapU8[r17];
+	if(r18 !=0) //_LBB822_108
+{
+	r18 = (r17 + 1)|0;
+	r19 = 0;
+	heap8[r17] = r19;
+	r17 = r18;
+}
+	heap32[(r11)] = r17;
+_168: while(true){
+	r18 = heapU8[r17];
+	if(r18 ==0) //_LBB822_128
+{
+__label__ = 121;
+break _168;
+}
+else{
+	r19 = 0;
+_171: while(true){
+	if(r19 ==-1) //_LBB822_117
+{
+__label__ = 111;
+break _168;
+}
+else{
+	r20 = _2E_str4133;
+	r20 = (r20 - r19)|0;
+	r21 = r18 & 255;
+	r20 = heapU8[r20];
+	if(r21 !=r20) //_LBB822_111
+{
+	r19 = (r19 + -1)|0;
+}
+else{
+break _171;
+}
+}
+}
+	r17 = (r17 + 1)|0;
+}
+}
+if (__label__ == 111){
+if(!(r18 ==0)) //_LBB822_128
+{
+	r15 = r17;
+_179: while(true){
+	r16 = heapU8[r15];
+	if(r16 ==0) //_LBB822_125
+{
+break _179;
+}
+else{
+	r18 = 1;
+_182: while(true){
+	if(r18 !=0) //_LBB822_119
+{
+	r19 = _2E_str4133;
+	r19 = (r19 - r18)|0;
+	r20 = r16 & 255;
+	r19 = heapU8[r19+1];
+	if(r20 ==r19) //_LBB822_125
+{
+break _179;
+}
+else{
+	r18 = (r18 + -1)|0;
+}
+}
+else{
+break _182;
+}
+}
+	r15 = (r15 + 1)|0;
+}
+}
+	r16 = heapU8[r15];
+	if(r16 !=0) //_LBB822_127
+{
+	r16 = (r15 + 1)|0;
+	r18 = 0;
+	heap8[r15] = r18;
+	r15 = r16;
+}
+	heap32[(r11)] = r15;
+	heap32[(g0)] = 264;
+	_Znwj(i7);
+	r11 = r_g0;
+	heap32[(g0)] = r17;
+	heap32[(g0+1)] = 0;
+	r15 = 0;
+	r16 = -1;
+	r17 = r11 >> 2;
+	strtol(i7);
+	heap32[(r17+64)] = r_g0;
+_191: while(true){
+	r17 = r15;
+	r18 = heapU8[r10+r17];
+	if(r18 !=46) //_LBB822_133
+{
+	if(r18 ==0) //_LBB822_137
+{
+break _191;
+}
+else{
+if(!(r18 ==47)) //_LBB822_136
+{
+	r15 = (r17 + 1)|0;
+	if(r18 !=92) //_LBB822_131
+{
+continue _191;
+}
+}
+	r16 = -1;
+}
+}
+else{
+	r16 = r17;
+}
+	r15 = (r17 + 1)|0;
+}
+	if(r16 ==-1) //_LBB822_143
+{
+	r10 = (r12 + r13)|0;
+	r12 = _2E_str12233;
+	r10 = (r10 + 1)|0;
+	r15 = _2E_str2131;
+	heap32[(g0)] = r6;
+	heap32[(g0+1)] = r12;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r15;
+	sprintf(i7);
+}
+else{
+_205: do {
+	if(r16 >0) //_LBB822_140
+{
+	r10 = (r12 + 1)|0;
+	r12 = 0;
+_207: while(true){
+	r15 = (r12 + r10)|0;
+	r17 = (r12 + 1)|0;
+	r15 = heapU8[r15+r13];
+	heap8[r6+r12] = r15;
+	r12 = r17;
+if(!(r16 !=r17)) //_LBB822_141
+{
+break _205;
+}
+}
+}
+else{
+	r16 = 0;
+}
+} while(0);
+	r10 = (r6 + r16)|0;
+	r12 = _2E_str2131;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r12;
+	strcpy(i7);
+}
+	r10 = heapU8[sp+-1408];
+_212: do {
+	if(r10 ==0) //_LBB822_146
+{
+	r15 = r11;
+}
+else{
+	r12 = r7;
+	r15 = r11;
+_215: while(true){
+	r16 = r10 & 255;
+	if(r16 !=92) //_LBB822_149
+{
+	r16 = r10 << 24;
+	r16 = r16 >> 24;
+	r16 = (r16 + -65)|0;
+	r13 = 26;
+	r17 = (r10 + 32)|0;
+	r10 = uint(r16) < uint(r13) ? r17 : r10;
+}
+else{
+	r10 = 47;
+}
+	heap8[r15] = r10;
+	r10 = heapU8[r12];
+	r15 = (r15 + 1)|0;
+	r12 = (r12 + 1)|0;
+if(!(r10 !=0)) //_LBB822_147
+{
+break _212;
+}
+}
+}
+} while(0);
+	r10 = _ZL21g_pFirstSoundDuration;
+	r12 = 0;
+	r10 = r10 >> 2;
+	heap8[r15] = r12;
+	r12 = r11 >> 2;
+	r15 = heap32[(r10)];
+	heap32[(r12+65)] = r15;
+	heap32[(r10)] = r11;
+	r10 = heapU8[r14];
+	if(r10 ==48) //_LBB822_70
+{
+__label__ = 66;
+break _47;
+}
+else{
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = 0;
+	mandreel_audio_createBuffer(i7);
+__label__ = 66;
+break _47;
+}
+}
+}
+	heap32[(r11)] = r17;
+__label__ = 146;
+break _130;
+}
+}
+	heap32[(r11)] = r14;
+__label__ = 146;
+}
+}
+} while(0);
+if (__label__ == 85){
+	r16 = 1;
+	r15 = 0;
+	r10 = (r12 + r13)|0;
+	heap32[(r11)] = r10;
+}
+	r10 = _2E_str30251;
+	r11 = _2E_str31252;
+	r10 = r16 != 0 ? r10 : r15;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r10;
+	_printf_warning(i7);
+__label__ = 66;
+break _47;
+}
+}
+else{
+_228: while(true){
+	r10 = heapU8[r12];
+	if(r10 ==0) //_LBB822_56
+{
+__label__ = 52;
+break _228;
+}
+else{
+	r13 = 0;
+_231: while(true){
+	if(r13 ==-1) //_LBB822_57
+{
+__label__ = 53;
+break _228;
+}
+else{
+	r14 = _2E_str4133;
+	r14 = (r14 - r13)|0;
+	r15 = r10 & 255;
+	r14 = heapU8[r14];
+	if(r15 !=r14) //_LBB822_50
+{
+	r13 = (r13 + -1)|0;
+}
+else{
+break _231;
+}
+}
+}
+	r12 = (r12 + 1)|0;
+}
+}
+if (__label__ == 53){
+	if(r10 ==0) //_LBB822_56
+{
+__label__ = 52;
+}
+else{
+	r13 = r12;
+_239: while(true){
+	r10 = heapU8[r13];
+	if(r10 ==0) //_LBB822_65
+{
+break _239;
+}
+else{
+	r14 = 1;
+_242: while(true){
+	if(r14 !=0) //_LBB822_59
+{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r10 & 255;
+	r15 = heapU8[r15+1];
+	if(r16 ==r15) //_LBB822_65
+{
+break _239;
+}
+else{
+	r14 = (r14 + -1)|0;
+}
+}
+else{
+break _242;
+}
+}
+	r13 = (r13 + 1)|0;
+}
+}
+	r10 = heapU8[r13];
+	if(r10 !=0) //_LBB822_67
+{
+	r14 = (r13 + 1)|0;
+	r10 = 0;
+	heap8[r13] = r10;
+	r10 = r12;
+	r12 = r14;
+__label__ = 64;
+}
+else{
+	r10 = r12;
+	r12 = r13;
+__label__ = 64;
+}
+}
+}
+if (__label__ == 52){
+	r10 = 0;
+}
+	heap32[(r11)] = r12;
+	r11 = _2E_str27248;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r11;
+	strcmp(i7);
+	r12 = r_g0;
+	if(r12 ==0) //_LBB822_70
+{
+__label__ = 66;
+}
+else{
+	r12 = _2E_str28249;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r10;
+	heap32[(g0+2)] = r11;
+	_printf_error(i7);
+__label__ = 66;
+}
+}
+}
+}
+} while(0);
+if (__label__ == 44){
+	heap32[(r11)] = r10;
+}
+if(!(r9 <r4)) //_LBB822_23
+{
+break _28;
+}
+}
+}
+} while(0);
+	heap32[(g0)] = r5;
+	free(i7);
+}
+	__mandreel_internal_CreateWindow(i7);
+	heap32[(g0)] = 0;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r2;
+	fopen(i7);
+	r0 = r_g0;
+	heap32[(g0)] = 1;
+	_Z30mandreel_fopen_enable_checkfatb(i7);
+if(!(r0 ==0)) //_LBB822_389
+{
+	if(uint(r0) <uint(10)) //_LBB822_201
+{
+	r1 = _ZL13s_file_stdout;
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+7)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+}
+else{
+	r1 = r0 >> 2;
+	r1 = heap32[(r1)];
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+7)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 2;
+	__FUNCTION_TABLE__[(r1)>>2](i7);
+	r1 = r0;
+}
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	heap32[(g0)] = r1;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	r1 = r_g0;
+	if(uint(r0) >uint(9)) //_LBB822_204
+{
+	r2 = r0;
+}
+else{
+	r2 = _ZL13s_file_stdout;
+}
+	r3 = r2 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = 0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r2 = (r1 + 1)|0;
+	heap32[(g0)] = r2;
+	malloc(i7);
+	r2 = r_g0;
+	if(uint(r0) <uint(10)) //_LBB822_207
+{
+	r3 = _ZL13s_file_stdout;
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = r1;
+	r5 = 0;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+	heap8[r2+r1] = r5;
+}
+else{
+	r3 = r0 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+1)];
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = 1;
+	heap32[(g0+3)] = r1;
+	r4 = 0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	heap8[r2+r1] = r4;
+	r3 = r0;
+}
+	r4 = r3 >> 2;
+	r4 = heap32[(r4)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+4)];
+	heap32[(g0)] = r3;
+	__FUNCTION_TABLE__[(r4)>>2](i7);
+if(!(uint(r0) <uint(10))) //_LBB822_210
+{
+	heap32[(g0)] = r3;
+	_ZdlPv(i7);
+}
+if(!(r2 ==0)) //_LBB822_389
+{
+	r0 = (r2 + 1)|0;
+	r3 = -1;
+	r4 = 0;
+	r5 = r4;
+_278: while(true){
+	r6 = r3;
+_280: while(true){
+	if(r5 <r1) //_LBB822_212
+{
+	r3 = (r2 + r5)|0;
+	r7 = heapU8[r2+r5];
+	if(r7 ==13) //_LBB822_214
+{
+	r7 = r5;
+}
+else{
+_285: while(true){
+	r7 = (r5 + 1)|0;
+	r5 = heapU8[r0+r5];
+	if(r5 ==13) //_LBB822_217
+{
+break _285;
+}
+else{
+	r5 = r7;
+if(!(r7 <r1)) //_LBB822_215
+{
+break _285;
+}
+}
+}
+}
+	r5 = _ZL10strtok_pos;
+	r8 = 0;
+	r9 = r5 >> 2;
+	heap8[r2+r7] = r8;
+	r10 = heap32[(r9)];
+	r5 = (r7 + 2)|0;
+	r3 = r3 == 0 ? r10 : r3;
+_289: while(true){
+	r7 = heapU8[r3];
+	if(r7 ==0) //_LBB822_235
+{
+__label__ = 224;
+break _289;
+}
+else{
+	r10 = r8;
+_292: while(true){
+	if(r10 ==-1) //_LBB822_224
+{
+__label__ = 214;
+break _289;
+}
+else{
+	r11 = _2E_str4133;
+	r11 = (r11 - r10)|0;
+	r12 = r7 & 255;
+	r11 = heapU8[r11];
+	if(r12 !=r11) //_LBB822_218
+{
+	r10 = (r10 + -1)|0;
+}
+else{
+break _292;
+}
+}
+}
+	r3 = (r3 + 1)|0;
+}
+}
+if (__label__ == 214){
+if(!(r7 ==0)) //_LBB822_235
+{
+	r7 = r3;
+_300: while(true){
+	r8 = heapU8[r7];
+	if(r8 ==0) //_LBB822_232
+{
+break _300;
+}
+else{
+	r10 = 1;
+_303: while(true){
+	if(r10 !=0) //_LBB822_226
+{
+	r11 = _2E_str4133;
+	r11 = (r11 - r10)|0;
+	r12 = r8 & 255;
+	r11 = heapU8[r11+1];
+	if(r12 ==r11) //_LBB822_232
+{
+break _300;
+}
+else{
+	r10 = (r10 + -1)|0;
+}
+}
+else{
+break _303;
+}
+}
+	r7 = (r7 + 1)|0;
+}
+}
+	r8 = heapU8[r7];
+	if(r8 !=0) //_LBB822_234
+{
+	r8 = (r7 + 1)|0;
+	r10 = 0;
+	heap8[r7] = r10;
+	r7 = r8;
+}
+	heap32[(r9)] = r7;
+	r8 = _2E_str3782;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB822_341
+{
+	r8 = _2E_str5784;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r8 = r_g0;
+	if(r8 !=0) //_LBB822_385
+{
+	r7 = _2E_str6785;
+	heap32[(g0)] = r7;
+	heap32[(g0+1)] = r3;
+	r3 = -1;
+	strcmp(i7);
+	r7 = r_g0;
+	if(r7 !=0) //_LBB822_387
+{
+continue _280;
+}
+else{
+continue _278;
+}
+}
+else{
+break _280;
+}
+}
+else{
+_315: while(true){
+	r3 = heapU8[r7];
+	if(r3 ==0) //_LBB822_255
+{
+__label__ = 242;
+break _315;
+}
+else{
+	r8 = 0;
+_318: while(true){
+	if(r8 ==-1) //_LBB822_244
+{
+__label__ = 232;
+break _315;
+}
+else{
+	r10 = _2E_str4133;
+	r10 = (r10 - r8)|0;
+	r11 = r3 & 255;
+	r10 = heapU8[r10];
+	if(r11 !=r10) //_LBB822_238
+{
+	r8 = (r8 + -1)|0;
+}
+else{
+break _318;
+}
+}
+}
+	r7 = (r7 + 1)|0;
+}
+}
+_323: do {
+if (__label__ == 232){
+	if(r3 ==0) //_LBB822_255
+{
+__label__ = 242;
+}
+else{
+	r3 = r7;
+_326: while(true){
+	r8 = heapU8[r3];
+	if(r8 ==0) //_LBB822_252
+{
+break _326;
+}
+else{
+	r10 = 1;
+_329: while(true){
+	if(r10 !=0) //_LBB822_246
+{
+	r11 = _2E_str4133;
+	r11 = (r11 - r10)|0;
+	r12 = r8 & 255;
+	r11 = heapU8[r11+1];
+	if(r12 ==r11) //_LBB822_252
+{
+break _326;
+}
+else{
+	r10 = (r10 + -1)|0;
+}
+}
+else{
+break _329;
+}
+}
+	r3 = (r3 + 1)|0;
+}
+}
+	r8 = heapU8[r3];
+	if(r8 !=0) //_LBB822_254
+{
+	r8 = (r3 + 1)|0;
+	r10 = 0;
+	heap8[r3] = r10;
+	r3 = r8;
+}
+	heap32[(r9)] = r3;
+_338: while(true){
+	r8 = heapU8[r3];
+	if(r8 ==0) //_LBB822_274
+{
+__label__ = 260;
+break _338;
+}
+else{
+	r10 = 0;
+_341: while(true){
+	if(r10 ==-1) //_LBB822_263
+{
+__label__ = 250;
+break _338;
+}
+else{
+	r11 = _2E_str4133;
+	r11 = (r11 - r10)|0;
+	r12 = r8 & 255;
+	r11 = heapU8[r11];
+	if(r12 !=r11) //_LBB822_257
+{
+	r10 = (r10 + -1)|0;
+}
+else{
+break _341;
+}
+}
+}
+	r3 = (r3 + 1)|0;
+}
+}
+if (__label__ == 250){
+if(!(r8 ==0)) //_LBB822_274
+{
+	r8 = r3;
+_349: while(true){
+	r10 = heapU8[r8];
+	if(r10 ==0) //_LBB822_271
+{
+break _349;
+}
+else{
+	r11 = 1;
+_352: while(true){
+	if(r11 !=0) //_LBB822_265
+{
+	r12 = _2E_str4133;
+	r12 = (r12 - r11)|0;
+	r13 = r10 & 255;
+	r12 = heapU8[r12+1];
+	if(r13 ==r12) //_LBB822_271
+{
+break _349;
+}
+else{
+	r11 = (r11 + -1)|0;
+}
+}
+else{
+break _352;
+}
+}
+	r8 = (r8 + 1)|0;
+}
+}
+	r10 = heapU8[r8];
+	if(r10 !=0) //_LBB822_273
+{
+	r10 = (r8 + 1)|0;
+	r11 = 0;
+	heap8[r8] = r11;
+	r8 = r10;
+}
+	heap32[(r9)] = r8;
+_361: while(true){
+	r10 = heapU8[r8];
+	if(r10 ==0) //_LBB822_293
+{
+__label__ = 278;
+break _361;
+}
+else{
+	r11 = 0;
+_364: while(true){
+	if(r11 ==-1) //_LBB822_282
+{
+__label__ = 268;
+break _361;
+}
+else{
+	r12 = _2E_str4133;
+	r12 = (r12 - r11)|0;
+	r13 = r10 & 255;
+	r12 = heapU8[r12];
+	if(r13 !=r12) //_LBB822_276
+{
+	r11 = (r11 + -1)|0;
+}
+else{
+break _364;
+}
+}
+}
+	r8 = (r8 + 1)|0;
+}
+}
+if (__label__ == 268){
+if(!(r10 ==0)) //_LBB822_293
+{
+	r10 = r8;
+_372: while(true){
+	r11 = heapU8[r10];
+	if(r11 ==0) //_LBB822_290
+{
+break _372;
+}
+else{
+	r12 = 1;
+_375: while(true){
+	if(r12 !=0) //_LBB822_284
+{
+	r13 = _2E_str4133;
+	r13 = (r13 - r12)|0;
+	r14 = r11 & 255;
+	r13 = heapU8[r13+1];
+	if(r14 ==r13) //_LBB822_290
+{
+break _372;
+}
+else{
+	r12 = (r12 + -1)|0;
+}
+}
+else{
+break _375;
+}
+}
+	r10 = (r10 + 1)|0;
+}
+}
+	r11 = heapU8[r10];
+	if(r11 !=0) //_LBB822_292
+{
+	r11 = (r10 + 1)|0;
+	r12 = 0;
+	heap8[r10] = r12;
+	r10 = r11;
+}
+	heap32[(r9)] = r10;
+_384: while(true){
+	r11 = heapU8[r10];
+	if(r11 ==0) //_LBB822_312
+{
+__label__ = 296;
+break _384;
+}
+else{
+	r12 = 0;
+_387: while(true){
+	if(r12 ==-1) //_LBB822_301
+{
+__label__ = 286;
+break _384;
+}
+else{
+	r13 = _2E_str4133;
+	r13 = (r13 - r12)|0;
+	r14 = r11 & 255;
+	r13 = heapU8[r13];
+	if(r14 !=r13) //_LBB822_295
+{
+	r12 = (r12 + -1)|0;
+}
+else{
+break _387;
+}
+}
+}
+	r10 = (r10 + 1)|0;
+}
+}
+if (__label__ == 286){
+if(!(r11 ==0)) //_LBB822_312
+{
+	r11 = r10;
+_395: while(true){
+	r12 = heapU8[r11];
+	if(r12 ==0) //_LBB822_309
+{
+break _395;
+}
+else{
+	r13 = 1;
+_398: while(true){
+	if(r13 !=0) //_LBB822_303
+{
+	r14 = _2E_str4133;
+	r14 = (r14 - r13)|0;
+	r15 = r12 & 255;
+	r14 = heapU8[r14+1];
+	if(r15 ==r14) //_LBB822_309
+{
+break _395;
+}
+else{
+	r13 = (r13 + -1)|0;
+}
+}
+else{
+break _398;
+}
+}
+	r11 = (r11 + 1)|0;
+}
+}
+	r12 = heapU8[r11];
+	if(r12 !=0) //_LBB822_311
+{
+	r12 = (r11 + 1)|0;
+	r13 = 0;
+	heap8[r11] = r13;
+	r11 = r12;
+}
+	heap32[(r9)] = r11;
+_407: while(true){
+	r12 = heapU8[r11];
+	if(r12 ==0) //_LBB822_331
+{
+__label__ = 314;
+break _407;
+}
+else{
+	r13 = 0;
+_410: while(true){
+	if(r13 ==-1) //_LBB822_320
+{
+__label__ = 304;
+break _407;
+}
+else{
+	r14 = _2E_str4133;
+	r14 = (r14 - r13)|0;
+	r15 = r12 & 255;
+	r14 = heapU8[r14];
+	if(r15 !=r14) //_LBB822_314
+{
+	r13 = (r13 + -1)|0;
+}
+else{
+break _410;
+}
+}
+}
+	r11 = (r11 + 1)|0;
+}
+}
+if (__label__ == 304){
+if(!(r12 ==0)) //_LBB822_331
+{
+	r12 = r11;
+_418: while(true){
+	r13 = heapU8[r12];
+	if(r13 ==0) //_LBB822_328
+{
+break _418;
+}
+else{
+	r14 = 1;
+_421: while(true){
+	if(r14 !=0) //_LBB822_322
+{
+	r15 = _2E_str4133;
+	r15 = (r15 - r14)|0;
+	r16 = r13 & 255;
+	r15 = heapU8[r15+1];
+	if(r16 ==r15) //_LBB822_328
+{
+break _418;
+}
+else{
+	r14 = (r14 + -1)|0;
+}
+}
+else{
+break _421;
+}
+}
+	r12 = (r12 + 1)|0;
+}
+}
+	r13 = heapU8[r12];
+	if(r13 !=0) //_LBB822_330
+{
+	r13 = (r12 + 1)|0;
+	r14 = 0;
+	heap8[r12] = r14;
+	r12 = r13;
+}
+	heap32[(r9)] = r12;
+	if(r8 ==0) //_LBB822_340
+{
+__label__ = 323;
+break _323;
+}
+else{
+	if(r11 ==0) //_LBB822_340
+{
+__label__ = 323;
+break _323;
+}
+else{
+	heap32[(g0)] = 284;
+	_Znwj(i7);
+	r9 = r_g0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = 0;
+	r3 = r9 >> 2;
+	strtol(i7);
+	heap32[(r3+65)] = r_g0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = 0;
+	strtol(i7);
+	heap32[(r3+66)] = r_g0;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = 0;
+	strtol(i7);
+	heap32[(r3+67)] = r_g0;
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = 0;
+	strtol(i7);
+	heap32[(r3+69)] = r_g0;
+	r7 = (r7 + 1)|0;
+	r8 = 0;
+	heap32[(r3+68)] = r4;
+	heap32[(r3+64)] = r6;
+	r3 = r9;
+_432: while(true){
+	r10 = heapU8[r7];
+	if(r10 ==0) //_LBB822_339
+{
+break _432;
+}
+else{
+	r11 = r10 << 24;
+	r11 = r11 >> 24;
+	r11 = (r11 + -65)|0;
+	r12 = 26;
+	r13 = (r10 + 32)|0;
+	r10 = uint(r11) < uint(r12) ? r13 : r10;
+	r11 = r10 & 255;
+	r12 = 47;
+	r10 = r11 == 92 ? r12 : r10;
+	r7 = (r7 + 1)|0;
+	r11 = r10 & 255;
+if(!(r11 !=47)) //_LBB822_338
+{
+	r11 = r8 & 255;
+	r8 = r10;
+	if(r11 ==47) //_LBB822_335
+{
+continue _432;
+}
+}
+	r8 = (r3 + 1)|0;
+	heap8[r3] = r10;
+	r3 = r8;
+	r8 = r10;
+}
+}
+	r7 = _ZL24g_pFirstTextureAsyncInfo;
+	r8 = 0;
+	r7 = r7 >> 2;
+	heap8[r3] = r8;
+	r3 = r9 >> 2;
+	r8 = heap32[(r7)];
+	heap32[(r3+70)] = r8;
+	heap32[(r7)] = r9;
+	r3 = heap32[(r3+69)];
+	r4 = (r3 + r4)|0;
+continue _280;
+}
+}
+}
+}
+	heap32[(r9)] = r11;
+__label__ = 323;
+break _323;
+}
+}
+	heap32[(r9)] = r10;
+__label__ = 323;
+break _323;
+}
+}
+	heap32[(r9)] = r8;
+__label__ = 323;
+break _323;
+}
+}
+	heap32[(r9)] = r3;
+__label__ = 323;
+}
+}
+} while(0);
+if (__label__ == 242){
+	heap32[(r9)] = r7;
+}
+	r3 = _2E_str4783;
+	heap32[(g0)] = r3;
+	_printf_warning(i7);
+continue _280;
+}
+}
+}
+	heap32[(r9)] = r3;
+}
+else{
+break _278;
+}
+}
+_447: while(true){
+	r3 = heapU8[r7];
+	if(r3 ==0) //_LBB822_349
+{
+__label__ = 331;
+break _447;
+}
+else{
+	r4 = 0;
+_450: while(true){
+	if(r4 ==-1) //_LBB822_350
+{
+__label__ = 332;
+break _447;
+}
+else{
+	r8 = _2E_str4133;
+	r8 = (r8 - r4)|0;
+	r10 = r3 & 255;
+	r8 = heapU8[r8];
+	if(r10 !=r8) //_LBB822_343
+{
+	r4 = (r4 + -1)|0;
+}
+else{
+break _450;
+}
+}
+}
+	r7 = (r7 + 1)|0;
+}
+}
+if (__label__ == 332){
+	if(r3 ==0) //_LBB822_349
+{
+__label__ = 331;
+}
+else{
+	r3 = r7;
+_458: while(true){
+	r4 = heapU8[r3];
+	if(r4 ==0) //_LBB822_358
+{
+break _458;
+}
+else{
+	r8 = 1;
+_461: while(true){
+	if(r8 !=0) //_LBB822_352
+{
+	r10 = _2E_str4133;
+	r10 = (r10 - r8)|0;
+	r11 = r4 & 255;
+	r10 = heapU8[r10+1];
+	if(r11 ==r10) //_LBB822_358
+{
+break _458;
+}
+else{
+	r8 = (r8 + -1)|0;
+}
+}
+else{
+break _461;
+}
+}
+	r3 = (r3 + 1)|0;
+}
+}
+	r4 = heapU8[r3];
+	if(r4 !=0) //_LBB822_360
+{
+	r8 = (r3 + 1)|0;
+	r4 = 0;
+	heap8[r3] = r4;
+	r4 = r7;
+	r7 = r8;
+__label__ = 343;
+}
+else{
+	r4 = r7;
+	r7 = r3;
+__label__ = 343;
+}
+}
+}
+if (__label__ == 331){
+	r4 = 0;
+}
+	heap32[(r9)] = r7;
+_473: while(true){
+	r3 = heapU8[r7];
+	if(r3 ==0) //_LBB822_368
+{
+__label__ = 359;
+break _473;
+}
+else{
+	r8 = 0;
+_476: while(true){
+	if(r8 ==-1) //_LBB822_369
+{
+__label__ = 350;
+break _473;
+}
+else{
+	r10 = _2E_str4133;
+	r10 = (r10 - r8)|0;
+	r11 = r3 & 255;
+	r10 = heapU8[r10];
+	if(r11 !=r10) //_LBB822_362
+{
+	r8 = (r8 + -1)|0;
+}
+else{
+break _476;
+}
+}
+}
+	r7 = (r7 + 1)|0;
+}
+}
+if (__label__ == 350){
+if(!(r3 ==0)) //_LBB822_368
+{
+_483: while(true){
+	r3 = heapU8[r7];
+	if(r3 ==0) //_LBB822_377
+{
+break _483;
+}
+else{
+	r8 = 1;
+_486: while(true){
+	if(r8 !=0) //_LBB822_371
+{
+	r10 = _2E_str4133;
+	r10 = (r10 - r8)|0;
+	r11 = r3 & 255;
+	r10 = heapU8[r10+1];
+	if(r11 ==r10) //_LBB822_377
+{
+break _483;
+}
+else{
+	r8 = (r8 + -1)|0;
+}
+}
+else{
+break _486;
+}
+}
+	r7 = (r7 + 1)|0;
+}
+}
+	r3 = heapU8[r7];
+	if(r3 !=0) //_LBB822_379
+{
+	r3 = (r7 + 1)|0;
+	r8 = 0;
+	heap8[r7] = r8;
+	r7 = r3;
+}
+}
+}
+	r3 = (r6 + 1)|0;
+	heap32[(r9)] = r7;
+	r7 = heapU8[r4];
+_494: do {
+	if(r7 ==0) //_LBB822_382
+{
+	r8 = 1;
+}
+else{
+	r7 = 1;
+_497: while(true){
+	r8 = (r7 + 1)|0;
+	r9 = heapU8[r4+r7];
+	r7 = r8;
+if(!(r9 !=0)) //_LBB822_383
+{
+break _494;
+}
+}
+}
+} while(0);
+	r7 = _ZL17g_apPackFileNames;
+	r6 = r6 << 2;
+	r6 = (r7 + r6)|0;
+	heap32[(g0)] = r8;
+	r6 = r6 >> 2;
+	_Znaj(i7);
+	heap32[(r6+1)] = r_g0;
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r4;
+	r4 = 0;
+	strcpy(i7);
+}
+	heap32[(g0)] = r2;
+	free(i7);
+}
+}
+	r0 = sp + -2440;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r1 = _ZGVZ21Mandreel_GetTickCountE7s_first;
+	gettimeofday(i7);
+	r2 = heapU8[r1];
+if(!(r2 !=0)) //_LBB822_391
+{
+	r2 = heap32[(fp+-610)];
+	r3 = r2 >> 31;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1000000;
+	heap32[(g0+3)] = 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	__muldi3(i7);
+	r4 = 1;
+	r5 = (r_g0 + r0)|0;
+	r6 = 0;
+	r7 = r0 >> 31;
+	r2 = uint(r5) < uint(r_g0) ? r4 : r6;
+	r6 = _ZZ21Mandreel_GetTickCountE7s_first;
+	r3 = (r_g1 + r7)|0;
+	r0 = uint(r5) < uint(r0) ? r4 : r2;
+	r2 = r6 >> 2;
+	r0 = (r3 + r0)|0;
+	heap32[(r2)] = r5;
+	heap32[(r2+1)] = r0;
+	heap8[r1] = r4;
+}
+	return;
+}
+else{
+	r2 = _2E_str34255;
+	r0 = _2E_str1222;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = 307;
+	_assert(i7);
+}
+}
+
+function __forceSuperLink(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	__mandreel_internal_init(i7);
+	r0 = sp + -8;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	r1 = _ZGVZ21Mandreel_GetTickCountE7s_first;
+	gettimeofday(i7);
+	r2 = heapU8[r1];
+if(!(r2 !=0)) //_LBB823_2
+{
+	r2 = heap32[(fp+-2)];
+	r3 = r2 >> 31;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = 1000000;
+	heap32[(g0+3)] = 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	__muldi3(i7);
+	r4 = 1;
+	r5 = (r_g0 + r0)|0;
+	r6 = 0;
+	r7 = r0 >> 31;
+	r2 = uint(r5) < uint(r_g0) ? r4 : r6;
+	r6 = _ZZ21Mandreel_GetTickCountE7s_first;
+	r3 = (r_g1 + r7)|0;
+	r0 = uint(r5) < uint(r0) ? r4 : r2;
+	r2 = r6 >> 2;
+	r0 = (r3 + r0)|0;
+	heap32[(r2)] = r5;
+	heap32[(r2+1)] = r0;
+	heap8[r1] = r4;
+}
+	r0 = _ZZ29__mandreel_internal_preupdateE8s_bfirst_2E_b;
+	r1 = heapU8[r0];
+if(!(r1 != 0)) //_LBB823_4
+{
+	r1 = 1;
+	heap8[r0] = r1;
+}
+	return;
+}
+
+function _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = sp + -16;
+	r1 = r0 >> 2;
+	heap32[(fp+-4)] = 0;
+	heap32[(r1+1)] = 0;
+	r2 = heap32[(fp)];
+	heap32[(r1+2)] = 16;
+	r3 = r2 >> 2;
+	heap32[(r1+3)] = 0;
+	r4 = heap32[(fp+2)];
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r4 = r4 >> 2;
+	r3 = heap32[(r3+5)];
+	r5 = heap32[(r4)];
+	r6 = heap32[(fp+1)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r6;
+	heap32[(g0+2)] = r5;
+	heap32[(g0+3)] = r0;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	r0 = heap32[(r1+1)];
+	r0 = r0 & 6;
+	if(r0 !=6) //_LBB824_2
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r0 = heap32[(fp+-4)];
+	heap32[(r4)] = r0;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r1 = heap32[(fp+2)];
+	r2 = 6;
+	r3 = 1;
+	r0 = r0 == r1 ? r2 : r3;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNKSt9type_info10__do_catchEPKS_PPvj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(r1+1)];
+	r2 = _2E_str26;
+	r0 = r0 == 0 ? r2 : r0;
+	r1 = r1 == 0 ? r2 : r1;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r2 = r_g0;
+	if(r2 <0) //_LBB826_2
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	strcmp(i7);
+	r0 = r_g0 >>> 31;
+	r0 = r0 ^ 1;
+	r_g0 = r0;
+	return;
+}
+}
+
+function _ZN10__cxxabiv117__class_type_infoD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN10__cxxabiv117__class_type_infoD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(r1+1)];
+	r2 = _2E_str26;
+	r0 = r0 == 0 ? r2 : r0;
+	r1 = r1 == 0 ? r2 : r1;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r2 = r_g0;
+	if(r2 >-1) //_LBB829_2
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	r0 = -1;
+	strcmp(i7);
+	r0 = r_g0 > r0;
+}
+else{
+	r0 = 0;
+}
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = r1 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = heap32[(r1+1)];
+	r2 = _2E_str26;
+	r0 = r0 == 0 ? r2 : r0;
+	r1 = r1 == 0 ? r2 : r1;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r2 = r_g0;
+if(!(r2 <0)) //_LBB830_3
+{
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	strcmp(i7);
+	r0 = r_g0;
+if(!(r0 <0)) //_LBB830_3
+{
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+3)];
+	r1 = r1 >> 2;
+	heap32[(r1)] = r0;
+	heap32[(r1+3)] = 8;
+	heap32[(r1+1)] = 6;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp+2)];
+	r3 = heap32[(fp+7)];
+	r0 = heap32[(r0+1)];
+	r4 = heap32[(fp+6)];
+if(!(r1 !=r4)) //_LBB831_3
+{
+	r4 = heap32[(fp+5)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	r5 = _2E_str26;
+	r4 = r4 == 0 ? r5 : r4;
+	r5 = r0 == 0 ? r5 : r0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r6 = r_g0;
+if(!(r6 <0)) //_LBB831_3
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	strcmp(i7);
+	r4 = r_g0;
+	if(r4 >-1) //_LBB831_5
+{
+	r1 = r3 >> 2;
+	heap32[(r1+2)] = r2;
+	r1 = 0;
+	r_g0 = r1;
+	return;
+}
+}
+}
+	r4 = heap32[(fp+3)];
+	r4 = r4 >> 2;
+	r4 = heap32[(r4+1)];
+	r5 = _2E_str26;
+	r4 = r4 == 0 ? r5 : r4;
+	r0 = r0 == 0 ? r5 : r0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r5 = r_g0;
+if(!(r5 <0)) //_LBB831_7
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	strcmp(i7);
+	r0 = r_g0;
+if(!(r0 <0)) //_LBB831_7
+{
+	r0 = r3 >> 2;
+	heap32[(r0)] = r1;
+	heap32[(r0+1)] = r2;
+	heap32[(r0+3)] = 1;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10__cxxabiv120__si_class_type_infoD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function _ZN10__cxxabiv120__si_class_type_infoD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(r2+1)];
+	r3 = heap32[(r1+1)];
+	r4 = _2E_str26;
+	r2 = r2 == 0 ? r4 : r2;
+	r3 = r3 == 0 ? r4 : r3;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	strcmp(i7);
+	r6 = r_g0;
+if(!(r6 <0)) //_LBB834_2
+{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r2 = r_g0;
+	if(r2 >-1) //_LBB834_3
+{
+	r0 = r5 >> 2;
+	heap32[(r0)] = r4;
+	heap32[(r0+3)] = 8;
+	heap32[(r0+1)] = 6;
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+}
+	r1 = heap32[(r1+2)];
+	r2 = r1 >> 2;
+	r2 = heap32[(r2)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+5)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r5;
+	__FUNCTION_TABLE__[(r2)>>2](i7);
+	return;
+}
+
+function _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+3)];
+	r1 = heap32[(fp)];
+	r2 = r0 >> 2;
+	r1 = r1 >> 2;
+	r2 = heap32[(r2+1)];
+	r3 = heap32[(r1+1)];
+	r4 = _2E_str26;
+	r2 = r2 == 0 ? r4 : r2;
+	r3 = r3 == 0 ? r4 : r3;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	r5 = heap32[(fp+1)];
+	r6 = heap32[(fp+2)];
+	r7 = heap32[(fp+4)];
+	r8 = heap32[(fp+6)];
+	r9 = heap32[(fp+7)];
+	strcmp(i7);
+	r10 = r_g0;
+	if(r10 <0) //_LBB835_6
+{
+__label__ = 6;
+}
+else{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r2 = r_g0;
+	if(r2 <0) //_LBB835_6
+{
+__label__ = 6;
+}
+else{
+	r0 = r9 >> 2;
+	heap32[(r0)] = r7;
+	heap32[(r0+1)] = r6;
+	if(r5 <0) //_LBB835_4
+{
+	if(r5 !=-2) //_LBB835_11
+{
+__label__ = 11;
+}
+else{
+	heap32[(r0+3)] = 1;
+__label__ = 11;
+}
+}
+else{
+	r1 = (r7 + r5)|0;
+	r3 = 6;
+	r4 = 1;
+	r1 = r1 == r8 ? r3 : r4;
+	heap32[(r0+3)] = r1;
+__label__ = 11;
+}
+}
+}
+_8: do {
+if (__label__ == 6){
+	r2 = heap32[(fp+5)];
+if(!(r7 !=r8)) //_LBB835_9
+{
+	r10 = r2 >> 2;
+	r10 = heap32[(r10+1)];
+	r4 = r10 == 0 ? r4 : r10;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r10 = r_g0;
+if(!(r10 <0)) //_LBB835_9
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	strcmp(i7);
+	r3 = r_g0;
+	if(r3 >-1) //_LBB835_10
+{
+	r0 = r9 >> 2;
+	heap32[(r0+2)] = r6;
+break _8;
+}
+}
+}
+	r1 = heap32[(r1+2)];
+	r3 = r1 >> 2;
+	r3 = heap32[(r3)];
+	r3 = r3 >> 2;
+	r3 = heap32[(r3+6)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r5;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r0;
+	heap32[(g0+4)] = r7;
+	heap32[(g0+5)] = r2;
+	heap32[(g0+6)] = r8;
+	heap32[(g0+7)] = r9;
+	__FUNCTION_TABLE__[(r3)>>2](i7);
+	return;
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r1 = heap32[(fp+2)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+3)];
+if(!(r0 !=r1)) //_LBB836_3
+{
+	r4 = r3 >> 2;
+	r5 = r2 >> 2;
+	r4 = heap32[(r4+1)];
+	r5 = heap32[(r5+1)];
+	r6 = _2E_str26;
+	r4 = r4 == 0 ? r6 : r4;
+	r5 = r5 == 0 ? r6 : r5;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r6 = r_g0;
+if(!(r6 <0)) //_LBB836_3
+{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	strcmp(i7);
+	r4 = r_g0;
+	if(r4 >-1) //_LBB836_4
+{
+	r0 = 6;
+	r_g0 = r0;
+	return;
+}
+}
+}
+	r4 = heap32[(fp+1)];
+	r2 = r2 >> 2;
+	r2 = heap32[(r2+2)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+7)];
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r0;
+	__FUNCTION_TABLE__[(r5)>>2](i7);
+	return;
+}
+
+function _ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = r0 >> 2;
+	r3 = r1 >> 2;
+	r2 = heap32[(r2+1)];
+	r4 = heap32[(r3+1)];
+	r5 = _2E_str26;
+	r2 = r2 == 0 ? r5 : r2;
+	r4 = r4 == 0 ? r5 : r4;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r2;
+	r6 = heap32[(fp+2)];
+	r7 = heap32[(fp+3)];
+	strcmp(i7);
+	r8 = r_g0;
+	if(r8 <0) //_LBB837_3
+{
+__label__ = 3;
+}
+else{
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r2 = r_g0;
+	if(r2 <0) //_LBB837_3
+{
+__label__ = 3;
+}
+else{
+	r0 = r7 >> 2;
+	heap32[(r0)] = r6;
+	heap32[(r0+3)] = 8;
+	heap32[(r0+1)] = 6;
+__label__ = 39;
+}
+}
+_4: do {
+if (__label__ == 3){
+	r2 = r7 >> 2;
+	r4 = heap32[(r2+2)];
+	r7 = r4 & 16;
+	if(r7 !=0) //_LBB837_5
+{
+	r4 = heap32[(r3+2)];
+}
+	r3 = heap32[(r3+3)];
+	r7 = r4 & 1;
+	r3 = (r3 + 1)|0;
+_9: while(true){
+	if(r3 !=1) //_LBB837_7
+{
+	r8 = sp + -16;
+	r9 = r8 >> 2;
+	heap32[(fp+-4)] = 0;
+	r10 = r3 << 3;
+	heap32[(r9+1)] = 0;
+	r10 = (r1 + r10)|0;
+	heap32[(r9+2)] = r4;
+	r10 = r10 >> 2;
+	heap32[(r9+3)] = 0;
+	r10 = heap32[(r10+1)];
+	r11 = r10 & 2;
+	if(r7 !=0) //_LBB837_10
+{
+__label__ = 9;
+}
+else{
+	r12 = r11 >>> 1;
+	if(r12 != 0) //_LBB837_10
+{
+__label__ = 9;
+}
+else{
+__label__ = 8;
+}
+}
+if (__label__ == 9){
+	r12 = r3 << 1;
+	r13 = r10 & 1;
+	if(r6 !=0) //_LBB837_12
+{
+	r10 = r10 >> 8;
+	if(r13 != 0) //_LBB837_14
+{
+	r14 = r6 >> 2;
+	r14 = heap32[(r14)];
+	r10 = (r14 + r10)|0;
+	r10 = r10 >> 2;
+	r10 = heap32[(r10)];
+}
+	r10 = (r6 + r10)|0;
+}
+else{
+	r10 = 0;
+}
+	r12 = r12 << 2;
+	r12 = (r1 + r12)|0;
+	r12 = r12 >> 2;
+	r14 = heap32[(r12)];
+	r15 = r14 >> 2;
+	r15 = heap32[(r15)];
+	r15 = r15 >> 2;
+	r15 = heap32[(r15+5)];
+	heap32[(g0)] = r14;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r8;
+	__FUNCTION_TABLE__[(r15)>>2](i7);
+	r8 = r_g0;
+if(!(r8 ==0)) //_LBB837_9
+{
+	r8 = heap32[(r9+3)];
+if(!(r8 !=8)) //_LBB837_19
+{
+	if(r13 != 0) //_LBB837_20
+{
+	r8 = heap32[(r12)];
+	heap32[(r9+3)] = r8;
+}
+}
+	r10 = heap32[(r9+1)];
+if(!(r10 <4)) //_LBB837_23
+{
+	if(r11 ==0) //_LBB837_24
+{
+	r10 = r10 & -3;
+	heap32[(r9+1)] = r10;
+}
+}
+	r11 = heap32[(r2+3)];
+	if(r11 !=0) //_LBB837_31
+{
+	r9 = heap32[(r2)];
+	r12 = heap32[(fp+-4)];
+	if(r9 ==r12) //_LBB837_33
+{
+	if(r9 ==0) //_LBB837_35
+{
+	if(r8 ==8) //_LBB837_39
+{
+__label__ = 35;
+break _9;
+}
+else{
+	if(r11 ==8) //_LBB837_39
+{
+__label__ = 35;
+break _9;
+}
+else{
+	r9 = r11 >> 2;
+	r8 = r8 >> 2;
+	r9 = heap32[(r9+1)];
+	r8 = heap32[(r8+1)];
+	r9 = r9 == 0 ? r5 : r9;
+	r8 = r8 == 0 ? r5 : r8;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r9;
+	strcmp(i7);
+	r11 = r_g0;
+	if(r11 <0) //_LBB837_39
+{
+__label__ = 35;
+break _9;
+}
+else{
+	heap32[(g0)] = r9;
+	heap32[(g0+1)] = r8;
+	strcmp(i7);
+	r8 = r_g0;
+	if(r8 >-1) //_LBB837_40
+{
+	r8 = heap32[(r2+1)];
+	r8 = r10 | r8;
+	heap32[(r2+1)] = r8;
+}
+else{
+__label__ = 35;
+break _9;
+}
+}
+}
+}
+}
+else{
+	r8 = heap32[(r2+1)];
+	r8 = r10 | r8;
+	heap32[(r2+1)] = r8;
+}
+}
+else{
+__label__ = 28;
+break _9;
+}
+}
+else{
+	r11 = heap32[(fp+-4)];
+	heap32[(r2)] = r11;
+	heap32[(r2+1)] = r10;
+	r11 = heap32[(r9+2)];
+	heap32[(r2+2)] = r11;
+	heap32[(r2+3)] = r8;
+	if(r10 <4) //_LBB837_43
+{
+break _4;
+}
+else{
+	r8 = r10 & 2;
+	if(r8 ==0) //_LBB837_29
+{
+	r8 = r10 & 1;
+	if(r8 ==0) //_LBB837_43
+{
+break _4;
+}
+else{
+	r8 = heapU8[r1+8];
+	r8 = r8 & 2;
+	if(r8 ==0) //_LBB837_43
+{
+break _4;
+}
+}
+}
+else{
+	r8 = heapU8[r1+8];
+	r8 = r8 & 1;
+	if(r8 ==0) //_LBB837_43
+{
+break _4;
+}
+}
+}
+}
+}
+}
+	r3 = (r3 + -1)|0;
+continue _9;
+}
+else{
+__label__ = 38;
+break _9;
+}
+}
+switch(__label__ ){//multiple entries
+case 38:
+	r0 = heap32[(r2+1)];
+	r1 = 0;
+	r0 = r0 != r1;
+	r0 = r0 & 1;
+	r_g0 = r0;
+	return;
+break;
+case 28:
+	heap32[(r2)] = 0;
+break;
+}
+	heap32[(r2+1)] = 2;
+}
+} while(0);
+	r0 = 1;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+	var r17;
+	var r18;
+	var r19;
+	var r20;
+	var r21;
+	var r22;
+	var r23;
+var __label__ = 0;
+	i7 = sp + -56;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+7)];
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+4)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+1)];
+	r4 = heap32[(fp+2)];
+	r5 = heap32[(fp+3)];
+	r6 = heap32[(fp+4)];
+	r7 = heap32[(fp+5)];
+	r8 = heap32[(fp+6)];
+	r9 = r1 & 16;
+	if(r9 !=0) //_LBB838_2
+{
+	r1 = r2 >> 2;
+	r1 = heap32[(r1+2)];
+	heap32[(r0+4)] = r1;
+}
+	r9 = r2 >> 2;
+	r10 = heap32[(r9+1)];
+	if(r6 !=r8) //_LBB838_6
+{
+__label__ = 5;
+}
+else{
+	r11 = r7 >> 2;
+	r11 = heap32[(r11+1)];
+	r12 = _2E_str26;
+	r11 = r11 == 0 ? r12 : r11;
+	r12 = r10 == 0 ? r12 : r10;
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r11;
+	strcmp(i7);
+	r13 = r_g0;
+	if(r13 <0) //_LBB838_6
+{
+__label__ = 5;
+}
+else{
+	heap32[(g0)] = r11;
+	heap32[(g0+1)] = r12;
+	strcmp(i7);
+	r11 = r_g0;
+	if(r11 >-1) //_LBB838_8
+{
+	heap32[(r0+2)] = r4;
+__label__ = 8;
+}
+else{
+__label__ = 5;
+}
+}
+}
+_8: do {
+if (__label__ == 5){
+	r11 = r5 >> 2;
+	r12 = heap32[(r11+1)];
+	r13 = _2E_str26;
+	r12 = r12 == 0 ? r13 : r12;
+	r10 = r10 == 0 ? r13 : r10;
+	heap32[(g0)] = r10;
+	heap32[(g0+1)] = r12;
+	strcmp(i7);
+	r13 = r_g0;
+	if(r13 <0) //_LBB838_15
+{
+__label__ = 14;
+}
+else{
+	heap32[(g0)] = r12;
+	heap32[(g0+1)] = r10;
+	strcmp(i7);
+	r10 = r_g0;
+	if(r10 <0) //_LBB838_15
+{
+__label__ = 14;
+}
+else{
+	heap32[(r0)] = r6;
+	heap32[(r0+1)] = r4;
+	if(r3 <0) //_LBB838_12
+{
+	if(r3 ==-2) //_LBB838_14
+{
+	heap32[(r0+3)] = 1;
+	r9 = 0;
+	r_g0 = r9;
+	return;
+}
+else{
+__label__ = 12;
+}
+}
+else{
+	r1 = (r6 + r3)|0;
+	r2 = 6;
+	r3 = 1;
+	r1 = r1 == r8 ? r2 : r3;
+	heap32[(r0+3)] = r1;
+break _8;
+}
+}
+}
+_17: do {
+if (__label__ == 14){
+	r10 = heap32[(r9+3)];
+	r12 = r1 & 2;
+	r9 = 0;
+	r13 = r1;
+_19: while(true){
+	r14 = r13 & 3;
+_21: while(true){
+	r15 = r9;
+	r9 = r10 << 3;
+	r9 = (r2 + r9)|0;
+	r20 = 0;
+_23: while(true){
+	r16 = r20;
+	if(r10 !=r16) //_LBB838_16
+{
+	r17 = sp + -24;
+	r18 = r17 >> 2;
+	heap32[(fp+-6)] = 0;
+	heap32[(r18+1)] = 0;
+	heap32[(r18+2)] = 0;
+	r19 = r16 << 3;
+	r19 = (r9 - r19)|0;
+	heap32[(r18+3)] = 0;
+	r19 = r19 >> 2;
+	heap32[(r18+4)] = r13;
+	r20 = heap32[(r19+3)];
+	r21 = r20 & 1;
+	r22 = r20 >> 8;
+	if(r21 != 0) //_LBB838_18
+{
+	r23 = r6 >> 2;
+	r23 = heap32[(r23)];
+	r22 = (r23 + r22)|0;
+	r22 = r22 >> 2;
+	r22 = heap32[(r22)];
+}
+	r20 = r20 & 2;
+	if(r20 ==0) //_LBB838_21
+{
+	if(r3 !=-2) //_LBB838_23
+{
+__label__ = 21;
+break _23;
+}
+else{
+	r20 = (r16 + 1)|0;
+	if(r14 ==0) //_LBB838_88
+{
+continue _23;
+}
+else{
+__label__ = 21;
+break _23;
+}
+}
+}
+else{
+__label__ = 18;
+break _23;
+}
+}
+else{
+__label__ = 77;
+break _19;
+}
+}
+switch(__label__ ){//multiple entries
+case 21:
+	r9 = r4 & -3;
+break;
+case 18:
+	r9 = r4;
+break;
+}
+	r20 = heap32[(r19+2)];
+	r19 = r20 >> 2;
+	r19 = heap32[(r19)];
+	r19 = r19 >> 2;
+	r19 = heap32[(r19+6)];
+	r9 = r21 | r9;
+	r21 = (r6 + r22)|0;
+	heap32[(g0)] = r20;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r9;
+	heap32[(g0+3)] = r5;
+	heap32[(g0+4)] = r21;
+	heap32[(g0+5)] = r7;
+	heap32[(g0+6)] = r8;
+	heap32[(g0+7)] = r17;
+	__FUNCTION_TABLE__[(r19)>>2](i7);
+	r9 = r_g0;
+	r20 = heap32[(r0+2)];
+	r17 = heap32[(r18+2)];
+	r20 = r17 | r20;
+	heap32[(r0+2)] = r20;
+	r17 = heap32[(r18+3)];
+	if(r17 ==2) //_LBB838_26
+{
+__label__ = 24;
+break _19;
+}
+else{
+	if(r17 !=6) //_LBB838_27
+{
+	r19 = (r10 + -1)|0;
+	r10 = heap32[(r0)];
+	r21 = r15 & 255;
+	if(r21 !=0) //_LBB838_34
+{
+__label__ = 30;
+break _21;
+}
+else{
+	if(r10 !=0) //_LBB838_35
+{
+__label__ = 31;
+break _21;
+}
+else{
+	r10 = heap32[(fp+-6)];
+	heap32[(r0)] = r10;
+	r15 = heap32[(r18+1)];
+	heap32[(r0+1)] = r15;
+	if(r10 !=0) //_LBB838_31
+{
+	r10 = (r19 - r16)|0;
+	if(r20 ==0) //_LBB838_87
+{
+continue _21;
+}
+else{
+__label__ = 29;
+break _21;
+}
+}
+else{
+__label__ = 73;
+break _21;
+}
+}
+}
+}
+else{
+__label__ = 24;
+break _19;
+}
+}
+}
+_40: do {
+switch(__label__ ){//multiple entries
+case 30:
+	if(r10 ==0) //_LBB838_37
+{
+	r14 = heap32[(fp+-6)];
+	r10 = 0;
+__label__ = 36;
+break _40;
+}
+else{
+__label__ = 31;
+break _40;
+}
+break;
+case 29:
+	r10 = heapU8[r2+8];
+	r10 = r10 & 1;
+	if(r10 != 0) //_LBB838_30
+{
+__label__ = 73;
+}
+else{
+__label__ = 78;
+break _17;
+}
+break;
+}
+} while(0);
+if (__label__ == 31){
+	r14 = heap32[(fp+-6)];
+	if(r10 !=r14) //_LBB838_38
+{
+	if(r14 !=0) //_LBB838_40
+{
+__label__ = 39;
+}
+else{
+	if(r9 ==0) //_LBB838_41
+{
+__label__ = 36;
+}
+else{
+__label__ = 39;
+}
+}
+}
+else{
+	r9 = heap32[(r0+1)];
+	r10 = heap32[(r18+1)];
+	r9 = r10 | r9;
+	heap32[(r0+1)] = r9;
+	r9 = r15;
+__label__ = 73;
+}
+}
+_50: do {
+if (__label__ == 36){
+if(!(r14 ==0)) //_LBB838_44
+{
+if(!(r21 ==0)) //_LBB838_44
+{
+__label__ = 39;
+break _50;
+}
+}
+	r9 = r15;
+__label__ = 73;
+}
+} while(0);
+if (__label__ == 39){
+	r9 = heap32[(r0+3)];
+_57: do {
+	if(r20 >3) //_LBB838_47
+{
+	r14 = r20 & 1;
+if(!(r14 ==0)) //_LBB838_52
+{
+if(!(r12 ==0)) //_LBB838_52
+{
+	r13 = r1;
+__label__ = 43;
+break _57;
+}
+}
+	r13 = r14 == 0 ? r13 : r1;
+	r10 = 1;
+	r9 = r9 == 0 ? r10 : r9;
+	if(r17 ==0) //_LBB838_54
+{
+	r17 = r10;
+__label__ = 64;
+}
+else{
+__label__ = 64;
+}
+}
+else{
+__label__ = 43;
+}
+} while(0);
+_64: do {
+if (__label__ == 43){
+	if(r9 <1) //_LBB838_55
+{
+_68: do {
+if(!(r17 <4)) //_LBB838_59
+{
+	r9 = r17 & 1;
+	if(r9 != 0) //_LBB838_58
+{
+	r9 = heapU8[r2+8];
+	r9 = r9 & 2;
+if(!(r9 ==0)) //_LBB838_57
+{
+break _68;
+}
+}
+	r9 = 1;
+break _64;
+}
+} while(0);
+	if(r3 <0) //_LBB838_61
+{
+	if(r3 !=-2) //_LBB838_63
+{
+	r9 = heap32[(r11)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+7)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r8;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r9 = r_g0;
+}
+else{
+	r9 = 1;
+}
+}
+else{
+	r9 = (r10 + r3)|0;
+	r10 = 6;
+	r14 = 1;
+	r9 = r9 == r8 ? r10 : r14;
+}
+}
+	if(r17 <1) //_LBB838_66
+{
+	if(r9 <4) //_LBB838_70
+{
+__label__ = 60;
+}
+else{
+	r10 = r9 & 1;
+	if(r10 != 0) //_LBB838_69
+{
+	r10 = heapU8[r2+8];
+	r10 = r10 & 2;
+	if(r10 ==0) //_LBB838_68
+{
+__label__ = 58;
+}
+else{
+__label__ = 60;
+}
+}
+else{
+__label__ = 58;
+}
+}
+if (__label__ == 60){
+	r10 = heap32[(fp+-6)];
+	if(r3 <0) //_LBB838_72
+{
+if(!(r3 ==-2)) //_LBB838_68
+{
+	r14 = heap32[(r11)];
+	r14 = r14 >> 2;
+	r14 = heap32[(r14+7)];
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r3;
+	heap32[(g0+2)] = r10;
+	heap32[(g0+3)] = r7;
+	heap32[(g0+4)] = r8;
+	__FUNCTION_TABLE__[(r14)>>2](i7);
+	r17 = r_g0;
+break _64;
+}
+}
+else{
+	r10 = (r10 + r3)|0;
+	r14 = 6;
+	r17 = 1;
+	r17 = r10 == r8 ? r14 : r17;
+break _64;
+}
+}
+	r17 = 1;
+}
+}
+} while(0);
+	r10 = r9 ^ r17;
+	if(r10 <4) //_LBB838_81
+{
+	r9 = r9 & r17;
+	heap32[(r0)] = 0;
+	if(r9 <4) //_LBB838_83
+{
+	r9 = 1;
+	heap32[(r0+3)] = 1;
+}
+else{
+__label__ = 71;
+break _19;
+}
+}
+else{
+	if(r17 >3) //_LBB838_77
+{
+	r9 = heap32[(fp+-6)];
+	heap32[(r0)] = r9;
+	r9 = heap32[(r18+1)];
+	r15 = 0;
+	heap32[(r0+1)] = r9;
+	r9 = r17;
+}
+	heap32[(r0+3)] = r9;
+	r10 = r9 & 2;
+	if(r10 !=0) //_LBB838_13
+{
+__label__ = 12;
+break _17;
+}
+else{
+	r9 = r9 & 1;
+	if(r9 ==0) //_LBB838_13
+{
+__label__ = 12;
+break _17;
+}
+else{
+	r9 = r15;
+}
+}
+}
+}
+	r10 = (r19 - r16)|0;
+	if(r20 !=4) //_LBB838_86
+{
+continue _19;
+}
+else{
+__label__ = 78;
+break _17;
+}
+}
+switch(__label__ ){//multiple entries
+case 24:
+	r20 = heap32[(fp+-6)];
+	heap32[(r0)] = r20;
+	r20 = heap32[(r18+1)];
+	heap32[(r0+1)] = r20;
+	heap32[(r0+3)] = r17;
+	r_g0 = r9;
+	return;
+break;
+case 71:
+	heap32[(r0+3)] = 2;
+	r9 = 1;
+	r_g0 = r9;
+	return;
+break;
+case 77:
+	r9 = r15;
+__label__ = 78;
+break;
+}
+}
+} while(0);
+if (__label__ == 12){
+	r9 = 0;
+}
+	r0 = r9 & 255;
+	r_g0 = r0;
+	return;
+}
+} while(0);
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+4)];
+	r2 = heap32[(fp)];
+	r3 = heap32[(fp+3)];
+	if(r0 !=r1) //_LBB839_4
+{
+__label__ = 4;
+}
+else{
+	r4 = r3 >> 2;
+	r5 = r2 >> 2;
+	r4 = heap32[(r4+1)];
+	r5 = heap32[(r5+1)];
+	r6 = _2E_str26;
+	r4 = r4 == 0 ? r6 : r4;
+	r5 = r5 == 0 ? r6 : r5;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r4;
+	strcmp(i7);
+	r6 = r_g0;
+	if(r6 <0) //_LBB839_4
+{
+__label__ = 4;
+}
+else{
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r5;
+	strcmp(i7);
+	r4 = r_g0;
+	if(r4 <0) //_LBB839_4
+{
+__label__ = 4;
+}
+else{
+	r0 = 6;
+__label__ = 15;
+}
+}
+}
+if (__label__ == 4){
+	r4 = heap32[(fp+1)];
+	r5 = r2 >> 2;
+	r5 = heap32[(r5+3)];
+	r5 = (r5 + 1)|0;
+_7: while(true){
+	if(r5 !=1) //_LBB839_5
+{
+	r6 = r5 << 3;
+	r6 = (r2 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6+1)];
+	r7 = r6 & 2;
+_10: do {
+	if(r7 !=0) //_LBB839_7
+{
+	r7 = r6 & 1;
+if(!(r7 ==0)) //_LBB839_9
+{
+	if(r4 ==-3) //_LBB839_6
+{
+break _10;
+}
+}
+	r8 = r5 << 1;
+	r6 = r6 >> 8;
+	if(r7 != 0) //_LBB839_11
+{
+	r9 = r0 >> 2;
+	r9 = heap32[(r9)];
+	r6 = (r9 + r6)|0;
+	r6 = r6 >> 2;
+	r6 = heap32[(r6)];
+}
+	r8 = r8 << 2;
+	r8 = (r2 + r8)|0;
+	r8 = r8 >> 2;
+	r8 = heap32[(r8)];
+	r9 = r8 >> 2;
+	r9 = heap32[(r9)];
+	r9 = r9 >> 2;
+	r9 = heap32[(r9+7)];
+	r6 = (r0 + r6)|0;
+	heap32[(g0)] = r8;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r6;
+	heap32[(g0+3)] = r3;
+	heap32[(g0+4)] = r1;
+	__FUNCTION_TABLE__[(r9)>>2](i7);
+	r6 = r_g0;
+if(!(r6 <4)) //_LBB839_6
+{
+__label__ = 12;
+break _7;
+}
+}
+} while(0);
+	r5 = (r5 + -1)|0;
+continue _7;
+}
+else{
+__label__ = 14;
+break _7;
+}
+}
+switch(__label__ ){//multiple entries
+case 14:
+	r0 = 1;
+break;
+case 12:
+	r0 = r6 | r7;
+	r_g0 = r0;
+	return;
+break;
+}
+}
+	r_g0 = r0;
+	return;
+}
+
+function _ZN10__cxxabiv121__vmi_class_type_infoD0Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r2 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r2)] = r1;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	return;
+}
+
+function _ZN10__cxxabiv121__vmi_class_type_infoD1Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = _ZTVSt9type_info;
+	r0 = r0 >> 2;
+	r1 = (r1 + 8)|0;
+	heap32[(r0)] = r1;
+	return;
+}
+
+function __extendsfdf2(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 & 2147483647;
+	r2 = r0 & -2147483648;
+	r3 = (r1 + -8388608)|0;
+	if(uint(r3) >uint(2130706431)) //_LBB842_2
+{
+	if(uint(r1) <uint(2139095040)) //_LBB842_4
+{
+	if(r1 !=0) //_LBB842_6
+{
+	r0 = r1 >>> 1;
+	r0 = r1 | r0;
+	r3 = r0 >>> 2;
+	r0 = r0 | r3;
+	r3 = r0 >>> 4;
+	r0 = r0 | r3;
+	r3 = r0 >>> 8;
+	r0 = r0 | r3;
+	r3 = r0 >>> 16;
+	r0 = r0 | r3;
+	r3 = r0 ^ -1;
+	r4 = 1431655765;
+	r3 = r3 >>> 1;
+	r0 = r4 & (~r0);
+	r3 = r3 & 1431655765;
+	r0 = (r0 + r3)|0;
+	r3 = r0 >>> 2;
+	r0 = r0 & 858993459;
+	r3 = r3 & 858993459;
+	r0 = (r0 + r3)|0;
+	r3 = r0 >>> 4;
+	r0 = r0 & 252645135;
+	r3 = r3 & 252645135;
+	r0 = (r0 + r3)|0;
+	r3 = r0 >>> 8;
+	r0 = r0 & 16711935;
+	r3 = r3 & 16711935;
+	r0 = (r0 + r3)|0;
+	r3 = r0 & 65535;
+	r0 = r0 >>> 16;
+	r0 = (r3 + r0)|0;
+	r3 = (r0 + 21)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r3;
+	r3 = 905;
+	__ashldi3(i7);
+	r1 = r_g0;
+	r0 = (r3 - r0)|0;
+	r3 = r_g1 ^ 1048576;
+	r0 = r0 << 20;
+	r0 = r3 | r0;
+}
+else{
+	r1 = 0;
+	r0 = r1;
+}
+}
+else{
+	r1 = r0 >>> 3;
+	r3 = r1 & 524288;
+	r1 = r0 & 4194303;
+	r0 = r3 | 2146435072;
+}
+}
+else{
+	r0 = r1 >>> 3;
+	r1 = r1 << 29;
+	r0 = (r0 + 939524096)|0;
+}
+	r3 = sp + -8;
+	r3 = r3 >> 2;
+	r0 = r0 | r2;
+	heap32[(fp+-2)] = r1;
+	heap32[(r3+1)] = r0;
+	f0 = llvm_readDouble((sp+-8));
+	f_g0 = f0;
+	return;
+}
+
+function __fixdfsi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = sp + 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >>> 20;
+	r1 = r1 & 2047;
+	r2 = r0 & 1048575;
+	r3 = -1;
+	r4 = 1;
+	r5 = (r1 + -1023)|0;
+	r0 = r0 < 0 ? r3 : r4;
+	r3 = heap32[(fp)];
+	r2 = r2 | 1048576;
+	if(uint(r5) >uint(51)) //_LBB843_2
+{
+	if(r5 <0) //_LBB843_5
+{
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+else{
+	r1 = (r1 + -1075)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+}
+}
+else{
+	r5 = 1075;
+	r1 = (r5 - r1)|0;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+}
+	heap32[(g0)] = r_g0;
+	heap32[(g0+1)] = r_g1;
+	heap32[(g0+2)] = r0;
+	heap32[(g0+3)] = r0;
+	__muldi3(i7);
+	return;
+}
+
+function __floatsidf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	if(r0 !=0) //_LBB844_2
+{
+	r1 = r0 >> 31;
+	r2 = (r0 + r1)|0;
+	r1 = r2 ^ r1;
+	r2 = r1 >>> 1;
+	r2 = r1 | r2;
+	r3 = r2 >>> 2;
+	r2 = r2 | r3;
+	r3 = r2 >>> 4;
+	r2 = r2 | r3;
+	r3 = r2 >>> 8;
+	r2 = r2 | r3;
+	r3 = r2 >>> 16;
+	r2 = r2 | r3;
+	r3 = r2 ^ -1;
+	r4 = 1431655765;
+	r3 = r3 >>> 1;
+	r2 = r4 & (~r2);
+	r3 = r3 & 1431655765;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 2;
+	r2 = r2 & 858993459;
+	r3 = r3 & 858993459;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 4;
+	r2 = r2 & 252645135;
+	r3 = r3 & 252645135;
+	r2 = (r2 + r3)|0;
+	r3 = r2 >>> 8;
+	r2 = r2 & 16711935;
+	r3 = r3 & 16711935;
+	r2 = (r2 + r3)|0;
+	r3 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r4 = 31;
+	r2 = (r3 + r2)|0;
+	r3 = 52;
+	r4 = (r4 - r2)|0;
+	r3 = (r3 - r4)|0;
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r3;
+	r1 = 1054;
+	__ashldi3(i7);
+	r1 = (r1 - r2)|0;
+	r2 = r_g1 ^ 1048576;
+	r1 = r1 << 20;
+	r4 = sp + -8;
+	r1 = (r2 + r1)|0;
+	r0 = r0 & -2147483648;
+	r2 = r4 >> 2;
+	r0 = r1 | r0;
+	heap32[(fp+-2)] = r_g0;
+	heap32[(r2+1)] = r0;
+	f0 = llvm_readDouble((sp+-8));
+	f_g0 = f0;
+	return;
+}
+else{
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+}
+
+function __floatunsidf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	if(r0 !=0) //_LBB845_2
+{
+	r1 = r0 >>> 1;
+	r1 = r0 | r1;
+	r2 = r1 >>> 2;
+	r1 = r1 | r2;
+	r2 = r1 >>> 4;
+	r1 = r1 | r2;
+	r2 = r1 >>> 8;
+	r1 = r1 | r2;
+	r2 = r1 >>> 16;
+	r1 = r1 | r2;
+	r2 = r1 ^ -1;
+	r3 = 1431655765;
+	r2 = r2 >>> 1;
+	r1 = r3 & (~r1);
+	r2 = r2 & 1431655765;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 2;
+	r1 = r1 & 858993459;
+	r2 = r2 & 858993459;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 4;
+	r1 = r1 & 252645135;
+	r2 = r2 & 252645135;
+	r1 = (r1 + r2)|0;
+	r2 = r1 >>> 8;
+	r1 = r1 & 16711935;
+	r2 = r2 & 16711935;
+	r1 = (r1 + r2)|0;
+	r2 = r1 & 65535;
+	r1 = r1 >>> 16;
+	r3 = 31;
+	r1 = (r2 + r1)|0;
+	r2 = 52;
+	r3 = (r3 - r1)|0;
+	r2 = (r2 - r3)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = 0;
+	heap32[(g0+2)] = r2;
+	r0 = 1054;
+	__ashldi3(i7);
+	r0 = (r0 - r1)|0;
+	r1 = sp + -8;
+	r3 = r_g1 ^ 1048576;
+	r0 = r0 << 20;
+	r1 = r1 >> 2;
+	r0 = (r3 + r0)|0;
+	heap32[(fp+-2)] = r_g0;
+	heap32[(r1+1)] = r0;
+	f0 = llvm_readDouble((sp+-8));
+	f_g0 = f0;
+	return;
+}
+else{
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+}
+
+function __truncdfsf2(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = sp + 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 & 2147483647;
+	r2 = heap32[(fp)];
+	r3 = (r1 + -940572672)|0;
+	r4 = (r1 + -1206910976)|0;
+_1: do {
+	if(uint(r3) >=uint(r4)) //_LBB846_6
+{
+	r3 = 0;
+	r4 = 2146435072;
+	r5 = r2 == r3;
+	r4 = uint(r1) < uint(r4);
+	r4 = r1 == 2146435072 ? r5 : r4;
+	if(r4 != 0) //_LBB846_8
+{
+	r4 = 1206910976;
+	r4 = uint(r1) < uint(r4);
+	r4 = r1 == 1206910976 ? r5 : r4;
+	if(r4 != 0) //_LBB846_10
+{
+	r4 = 897;
+	r1 = r1 >>> 20;
+	r1 = (r4 - r1)|0;
+	if(r1 <53) //_LBB846_12
+{
+	r4 = r0 & 1048575;
+	r4 = r4 | 1048576;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__lshrdi3(i7);
+	r5 = r_g0;
+	r6 = r_g1;
+	r7 = 64;
+	r1 = (r7 - r1)|0;
+	heap32[(g0)] = r2;
+	heap32[(g0+1)] = r4;
+	heap32[(g0+2)] = r1;
+	__ashldi3(i7);
+	r1 = r_g0 | r_g1;
+	r1 = r1 != r3;
+	r1 = r1 & 1;
+	r2 = r5 & 536870911;
+	r4 = r5 >>> 29;
+	r5 = r6 << 3;
+	r1 = r1 | r2;
+	r2 = r4 | r5;
+	if(uint(r1) <uint(268435457)) //_LBB846_14
+{
+	r1 = r1 ^ 268435456;
+	r3 = r1 | r3;
+	if(r3 ==0) //_LBB846_16
+{
+	r3 = r2 & 1;
+	r3 = (r3 + r2)|0;
+}
+else{
+	r3 = r2;
+}
+}
+else{
+	r3 = (r2 + 1)|0;
+}
+}
+else{
+break _1;
+}
+}
+else{
+	r3 = 2139095040;
+}
+}
+else{
+	r1 = r2 & 4194303;
+	r3 = r1 | 2143289344;
+}
+}
+else{
+	r1 = r2 >>> 29;
+	r3 = r0 << 3;
+	r1 = r1 | r3;
+	r2 = r2 & 536870911;
+	if(uint(r2) <uint(268435457)) //_LBB846_3
+{
+	r3 = (r1 + 1073741824)|0;
+	r1 = 0;
+	r2 = r2 ^ 268435456;
+	r1 = r2 | r1;
+	if(r1 ==0) //_LBB846_5
+{
+	r1 = r3 & 1;
+	r3 = (r1 + r3)|0;
+}
+}
+else{
+	r3 = (r1 + 1073741825)|0;
+}
+}
+} while(0);
+	r0 = r0 & -2147483648;
+	r0 = r3 | r0;
+	heap32[(fp+-1)] = r0;
+	f0 = heapFloat[(fp+-1)];
+	f_g0 = f0;
+	return;
+}
+
+function __fixunsdfsi(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = sp + 0;
+	r0 = r0 >> 2;
+	r0 = heap32[(r0+1)];
+	r1 = r0 >>> 20;
+	r1 = r1 & 2047;
+	r2 = (r1 + -1023)|0;
+if(!(r2 <0)) //_LBB847_3
+{
+if(!(r0 <0)) //_LBB847_3
+{
+	r2 = heap32[(fp)];
+	r2 = r2 >>> 21;
+	r0 = r0 << 11;
+	r0 = r2 | r0;
+	r2 = 1054;
+	r0 = r0 | -2147483648;
+	r1 = (r2 - r1)|0;
+	r0 = r0 >>> r1;
+	r_g0 = r0;
+	return;
+}
+}
+	r0 = 0;
+	r_g0 = r0;
+	return;
+}
+
+function __floatundisf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 | r1;
+	if(r2 ==0) //_LBB848_12
+{
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+else{
+	r2 = r0 >>> 1;
+	r3 = r1 >>> 1;
+	r2 = r0 | r2;
+	r3 = r1 | r3;
+	r4 = r2 >>> 2;
+	r5 = r3 >>> 2;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 4;
+	r5 = r3 >>> 4;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 8;
+	r5 = r3 >>> 8;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 >>> 16;
+	r5 = r3 >>> 16;
+	r2 = r2 | r4;
+	r3 = r3 | r5;
+	r4 = r2 ^ -1;
+	r5 = 1431655765;
+	r6 = r3 ^ -1;
+	r4 = r4 >>> 1;
+	r6 = r6 >>> 1;
+	r2 = r5 & (~r2);
+	r4 = r4 & 1431655765;
+	r2 = (r2 + r4)|0;
+	r3 = r5 & (~r3);
+	r4 = r6 & 1431655765;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 2;
+	r5 = r3 >>> 2;
+	r2 = r2 & 858993459;
+	r4 = r4 & 858993459;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 858993459;
+	r4 = r5 & 858993459;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 4;
+	r5 = r3 >>> 4;
+	r2 = r2 & 252645135;
+	r4 = r4 & 252645135;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 252645135;
+	r4 = r5 & 252645135;
+	r3 = (r3 + r4)|0;
+	r4 = r2 >>> 8;
+	r5 = r3 >>> 8;
+	r2 = r2 & 16711935;
+	r4 = r4 & 16711935;
+	r2 = (r2 + r4)|0;
+	r3 = r3 & 16711935;
+	r4 = r5 & 16711935;
+	r3 = (r3 + r4)|0;
+	r4 = r2 & 65535;
+	r2 = r2 >>> 16;
+	r2 = (r4 + r2)|0;
+	r4 = r3 & 65535;
+	r3 = r3 >>> 16;
+	r3 = (r4 + r3)|0;
+	r2 = (r2 + 32)|0;
+	r4 = 64;
+	r2 = r1 != 0 ? r3 : r2;
+	r3 = 63;
+	r4 = (r4 - r2)|0;
+	r2 = (r3 - r2)|0;
+	if(r4 <25) //_LBB848_10
+{
+	r3 = 24;
+	r3 = (r3 - r4)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__ashldi3(i7);
+	r1 = r_g0;
+}
+else{
+	if(r4 ==25) //_LBB848_5
+{
+	r1 = r1 << 1;
+	r3 = r0 >>> 31;
+	r0 = r0 << 1;
+	r1 = r1 | r3;
+}
+else{
+	if(r4 !=26) //_LBB848_6
+{
+	r3 = (r4 + -26)|0;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	heap32[(g0+2)] = r3;
+	__lshrdi3(i7);
+	r3 = r_g0;
+	r5 = r_g1;
+	r6 = 90;
+	r6 = (r6 - r4)|0;
+	heap32[(g0)] = -1;
+	heap32[(g0+1)] = -1;
+	heap32[(g0+2)] = r6;
+	__lshrdi3(i7);
+	r0 = r_g0 & r0;
+	r1 = r_g1 & r1;
+	r0 = r0 | r1;
+	r1 = 0;
+	r0 = r0 != r1;
+	r0 = r0 & 1;
+	r0 = r0 | r3;
+	r1 = r5;
+}
+}
+	r3 = r0 >>> 2;
+	r3 = r3 & 1;
+	r0 = r3 | r0;
+	r3 = (r0 + 1)|0;
+	r5 = 1;
+	r6 = 0;
+	r0 = uint(r3) < uint(r0) ? r5 : r6;
+	r0 = r3 == 0 ? r5 : r0;
+	r0 = (r1 + r0)|0;
+	r1 = r3 >>> 2;
+	r5 = r0 << 30;
+	r1 = r1 | r5;
+	r5 = r1 & 16777216;
+	if(r5 !=0) //_LBB848_9
+{
+	r1 = r3 >>> 3;
+	r0 = r0 << 29;
+	r1 = r1 | r0;
+	r2 = r4;
+}
+}
+	r0 = r2 << 23;
+	r0 = (r0 + 1065353216)|0;
+	r1 = r1 & 8388607;
+	r0 = r0 | r1;
+	heap32[(fp+-1)] = r0;
+	f0 = heapFloat[(fp+-1)];
+	f_g0 = f0;
+	return;
+}
+}
+
+function __floatdisf(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var f0;
+var __label__ = 0;
+	i7 = sp + -24;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = heap32[(fp+1)];
+	r2 = r0 | r1;
+	if(r2 ==0) //_LBB849_12
+{
+	f0 =                         0;
+	f_g0 = f0;
+	return;
+}
+else{
+	r2 = r1 >> 31;
+	r1 = r2 ^ r1;
+	r0 = r2 ^ r0;
+	r3 = 1;
+	r4 = 0;
+	r5 = (r0 - r2)|0;
+	r1 = (r1 - r2)|0;
+	r0 = uint(r0) < uint(r2) ? r3 : r4;
+	r0 = (r1 - r0)|0;
+	r1 = r5 >>> 1;
+	r6 = r0 >>> 1;
+	r1 = r5 | r1;
+	r6 = r0 | r6;
+	r7 = r1 >>> 2;
+	r8 = r6 >>> 2;
+	r1 = r1 | r7;
+	r6 = r6 | r8;
+	r7 = r1 >>> 4;
+	r8 = r6 >>> 4;
+	r1 = r1 | r7;
+	r6 = r6 | r8;
+	r7 = r1 >>> 8;
+	r8 = r6 >>> 8;
+	r1 = r1 | r7;
+	r6 = r6 | r8;
+	r7 = r1 >>> 16;
+	r8 = r6 >>> 16;
+	r1 = r1 | r7;
+	r6 = r6 | r8;
+	r7 = r1 ^ -1;
+	r8 = 1431655765;
+	r9 = r6 ^ -1;
+	r7 = r7 >>> 1;
+	r9 = r9 >>> 1;
+	r1 = r8 & (~r1);
+	r7 = r7 & 1431655765;
+	r1 = (r1 + r7)|0;
+	r6 = r8 & (~r6);
+	r7 = r9 & 1431655765;
+	r6 = (r6 + r7)|0;
+	r7 = r1 >>> 2;
+	r8 = r6 >>> 2;
+	r1 = r1 & 858993459;
+	r7 = r7 & 858993459;
+	r1 = (r1 + r7)|0;
+	r6 = r6 & 858993459;
+	r7 = r8 & 858993459;
+	r6 = (r6 + r7)|0;
+	r7 = r1 >>> 4;
+	r8 = r6 >>> 4;
+	r1 = r1 & 252645135;
+	r7 = r7 & 252645135;
+	r1 = (r1 + r7)|0;
+	r6 = r6 & 252645135;
+	r7 = r8 & 252645135;
+	r6 = (r6 + r7)|0;
+	r7 = r1 >>> 8;
+	r8 = r6 >>> 8;
+	r1 = r1 & 16711935;
+	r7 = r7 & 16711935;
+	r1 = (r1 + r7)|0;
+	r6 = r6 & 16711935;
+	r7 = r8 & 16711935;
+	r6 = (r6 + r7)|0;
+	r7 = r1 & 65535;
+	r1 = r1 >>> 16;
+	r1 = (r7 + r1)|0;
+	r7 = r6 & 65535;
+	r6 = r6 >>> 16;
+	r6 = (r7 + r6)|0;
+	r1 = (r1 + 32)|0;
+	r7 = 64;
+	r1 = r0 != 0 ? r6 : r1;
+	r6 = 63;
+	r7 = (r7 - r1)|0;
+	r1 = (r6 - r1)|0;
+	if(r7 <25) //_LBB849_10
+{
+	r3 = 24;
+	r3 = (r3 - r7)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r3;
+	__ashldi3(i7);
+	r5 = r_g0;
+}
+else{
+	if(r7 ==25) //_LBB849_5
+{
+	r0 = r0 << 1;
+	r6 = r5 >>> 31;
+	r5 = r5 << 1;
+	r0 = r0 | r6;
+}
+else{
+	if(r7 !=26) //_LBB849_6
+{
+	r6 = (r7 + -26)|0;
+	heap32[(g0)] = r5;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r6;
+	__lshrdi3(i7);
+	r6 = r_g0;
+	r8 = r_g1;
+	r9 = 90;
+	r9 = (r9 - r7)|0;
+	heap32[(g0)] = -1;
+	heap32[(g0+1)] = -1;
+	heap32[(g0+2)] = r9;
+	__lshrdi3(i7);
+	r5 = r_g0 & r5;
+	r0 = r_g1 & r0;
+	r0 = r5 | r0;
+	r0 = r0 != r4;
+	r0 = r0 & 1;
+	r5 = r0 | r6;
+	r0 = r8;
+}
+}
+	r6 = r5 >>> 2;
+	r6 = r6 & 1;
+	r5 = r6 | r5;
+	r6 = (r5 + 1)|0;
+	r5 = uint(r6) < uint(r5) ? r3 : r4;
+	r5 = r6 == 0 ? r3 : r5;
+	r0 = (r0 + r5)|0;
+	r5 = r6 >>> 2;
+	r3 = r0 << 30;
+	r5 = r5 | r3;
+	r3 = r5 & 16777216;
+	if(r3 !=0) //_LBB849_9
+{
+	r0 = r0 >> 2;
+	r5 = r5 >>> 1;
+	r0 = r0 << 31;
+	r5 = r5 | r0;
+	r1 = r7;
+}
+}
+	r0 = r1 << 23;
+	r1 = r5 & 8388607;
+	r2 = r2 & -2147483648;
+	r1 = r1 | r2;
+	r0 = (r0 + 1065353216)|0;
+	r0 = r1 | r0;
+	heap32[(fp+-1)] = r0;
+	f0 = heapFloat[(fp+-1)];
+	f_g0 = f0;
+	return;
+}
+}
+
+function _GLOBAL__I__mandreel_create_tcp_socket(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = mandreel_flash_tcp_onError__index__;
+	r1 = _ZZL32_mandreel_init_tcp_socket_librayvE47s_723478567_mandreel_mandreel_flash_tcp_onError;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r1;
+	iMandreelRegisterExternalCallback(i7);
+	return;
+}
+
+function mandreel_flash_tcp_onConnect(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function mandreel_flash_tcp_onError(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function mandreel_flash_tcp_receive_callbak(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -32784;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+	r1 = heap32[(fp)];
+	r2 = heapU8[r0];
+_1: do {
+	if(r2 !=0) //_LBB853_2
+{
+	r3 = (r0 + 1)|0;
+	r4 = 0;
+_3: while(true){
+	r2 = (r4 + 1)|0;
+	r5 = heapU8[r3+r4];
+	r4 = r2;
+	if(r5 !=0) //_LBB853_3
+{
+continue _3;
+}
+else{
+break _1;
+}
+}
+}
+else{
+	r2 = 0;
+}
+} while(0);
+	r3 = sp + -32768;
+	heap32[(g0)] = r0;
+	heap32[(g0+1)] = r2;
+	heap32[(g0+2)] = r3;
+	heap32[(g0+3)] = 32768;
+	r0 = _ZL10s_aSockets;
+	r2 = 0;
+	_ZN12mandreel_b6410b64_decodeEPKcjPvj(i7);
+	r4 = r_g0;
+	r6 = _ZL10s_aSockets;
+_7: while(true){
+	if(uint(r2) <uint(8)) //_LBB853_5
+{
+	r5 = (r2 * 8198)|0;
+	r5 = r5 << 2;
+	r5 = (r6 + r5)|0;
+	r5 = r5 >> 2;
+	r5 = heap32[(r5+8196)];
+	if(r5 !=r1) //_LBB853_7
+{
+	r2 = (r2 + 1)|0;
+	r0 = (r0 + 32792)|0;
+continue _7;
+}
+else{
+__label__ = 9;
+break _7;
+}
+}
+else{
+__label__ = 8;
+break _7;
+}
+}
+if (__label__ == 8){
+	r0 = 0;
+}
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+8194)];
+	if(r4 >0) //_LBB853_12
+{
+	r5 = r4;
+_16: while(true){
+	r6 = (r2 + 1)|0;
+	r5 = (r5 + -1)|0;
+	r6 = r6 & 32767;
+	r7 = (r3 + 1)|0;
+	r3 = heapU8[r3];
+	heap8[r0+r2] = r3;
+	r3 = r7;
+	r2 = r6;
+if(!(r5 !=0)) //_LBB853_13
+{
+break _16;
+}
+}
+	r2 = r6;
+}
+	heap32[(r1+8194)] = r2;
+	r0 = heap32[(r1+8192)];
+	r0 = (r0 + r4)|0;
+	heap32[(r1+8192)] = r0;
+	return;
+}
+
+function _GLOBAL__D__ZN8OpenGLES12OpenGLESUtil15getCurrentErrorEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	heap32[(g0)] = 0;
+	_Z41__static_initialization_and_destruction_0ii(i7);
+	return;
+}
+
+function _ZNSt5dequeIjSaIjEE5eraseESt15__rw_deque_iterIjiPjRjS0_ES5_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+4)];
+	r0 = r0 >> 2;
+	r1 = heap32[(fp)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	r4 = heap32[(r0)];
+	r5 = heap32[(fp+3)];
+	r6 = heap32[(r0+1)];
+	r7 = r4 | r3;
+	if(r7 !=0) //_LBB855_2
+{
+	r7 = r6 >> 2;
+	r8 = (r6 - r5)|0;
+	r9 = r5 >> 2;
+	r8 = r8 << 3;
+	r9 = heap32[(r9)];
+	r7 = heap32[(r7)];
+	r7 = (r4 - r7)|0;
+	r8 = (r8 + -32)|0;
+	r9 = (r9 + 128)|0;
+	r9 = (r9 - r3)|0;
+	r7 = r7 >> 2;
+	r8 = r8 & -32;
+	r7 = (r7 + r8)|0;
+	r8 = r9 >> 2;
+	r7 = (r7 + r8)|0;
+}
+else{
+	r7 = (r4 - r3)|0;
+	r7 = r7 >> 2;
+}
+	r8 = r2 >> 2;
+	r9 = heap32[(r8)];
+	r10 = heap32[(r8+1)];
+	r11 = r3 | r9;
+	if(r11 !=0) //_LBB855_5
+{
+	r11 = (r5 - r10)|0;
+	r12 = r5 >> 2;
+	r13 = r10 >> 2;
+	r11 = r11 << 3;
+	r13 = heap32[(r13)];
+	r12 = heap32[(r12)];
+	r11 = (r11 + -32)|0;
+	r12 = (r3 - r12)|0;
+	r13 = (r13 + 128)|0;
+	r13 = (r13 - r9)|0;
+	r11 = r11 & -32;
+	r12 = r12 >> 2;
+	r11 = (r11 + r12)|0;
+	r12 = r13 >> 2;
+	r11 = (r11 + r12)|0;
+}
+else{
+	r11 = (r3 - r9)|0;
+	r11 = r11 >> 2;
+}
+	r2 = (r2 + 8)|0;
+	r12 = heap32[(r8+2)];
+	r13 = heap32[(r8+3)];
+	r14 = r12 | r4;
+	if(r14 !=0) //_LBB855_8
+{
+	r14 = (r13 - r6)|0;
+	r15 = r13 >> 2;
+	r16 = r6 >> 2;
+	r14 = r14 << 3;
+	r16 = heap32[(r16)];
+	r15 = heap32[(r15)];
+	r14 = (r14 + -32)|0;
+	r15 = (r12 - r15)|0;
+	r16 = (r16 + 128)|0;
+	r16 = (r16 - r4)|0;
+	r14 = r14 & -32;
+	r15 = r15 >> 2;
+	r14 = (r14 + r15)|0;
+	r15 = r16 >> 2;
+	r14 = (r14 + r15)|0;
+}
+else{
+	r14 = (r12 - r4)|0;
+	r14 = r14 >> 2;
+}
+	if(r11 >=r14) //_LBB855_36
+{
+	r0 = (r5 + 4)|0;
+	r9 = r3;
+_15: while(true){
+	r10 = r4 | r12;
+	if(r10 !=0) //_LBB855_44
+{
+	r10 = r6 >> 2;
+	r11 = (r6 - r13)|0;
+	r14 = r13 >> 2;
+	r11 = r11 << 3;
+	r14 = heap32[(r14)];
+	r10 = heap32[(r10)];
+	r10 = (r4 - r10)|0;
+	r11 = (r11 + -32)|0;
+	r14 = (r14 + 128)|0;
+	r14 = (r14 - r12)|0;
+	r10 = r10 >> 2;
+	r11 = r11 & -32;
+	r10 = (r10 + r11)|0;
+	r11 = r14 >> 2;
+	r10 = (r10 + r11)|0;
+}
+else{
+	r10 = (r4 - r12)|0;
+	r10 = r10 >> 2;
+}
+	if(r10 !=0) //_LBB855_37
+{
+	r10 = r4 >> 2;
+	r11 = r9 >> 2;
+	r10 = heap32[(r10)];
+	r4 = (r4 + 4)|0;
+	r14 = r6 >> 2;
+	heap32[(r11)] = r10;
+	r10 = heap32[(r14)];
+	r10 = (r10 + 128)|0;
+	if(r4 ==r10) //_LBB855_39
+{
+	r6 = (r6 + 4)|0;
+	r4 = heap32[(r14+1)];
+}
+	r10 = r0 >> 2;
+	r9 = (r9 + 4)|0;
+	r11 = heap32[(r10+-1)];
+	r11 = (r11 + 128)|0;
+if(!(r9 !=r11)) //_LBB855_42
+{
+	r9 = heap32[(r10)];
+	r0 = (r0 + 4)|0;
+}
+}
+else{
+break _15;
+}
+}
+_27: do {
+if(!(r7 ==0)) //_LBB855_59
+{
+	r0 = heap32[(r8+2)];
+_29: while(true){
+	r0 = (r0 + -4)|0;
+	heap32[(r8+2)] = r0;
+	r4 = heap32[(r8+3)];
+	r6 = heap32[(r8+1)];
+	if(r6 !=r4) //_LBB855_51
+{
+__label__ = 45;
+}
+else{
+	r6 = heap32[(r8)];
+	if(r6 !=r0) //_LBB855_51
+{
+__label__ = 45;
+}
+else{
+	r0 = r4 >> 2;
+	r4 = heap32[(r0)];
+__label__ = 47;
+}
+}
+if (__label__ == 45){
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	if(r0 ==r4) //_LBB855_53
+{
+__label__ = 47;
+}
+else{
+__label__ = 46;
+}
+}
+_36: do {
+if (__label__ == 47){
+	heap32[(g0)] = r4;
+	_ZdlPv(i7);
+	r0 = heap32[(r8+3)];
+	r4 = heap32[(r8+1)];
+if(!(r4 !=r0)) //_LBB855_58
+{
+	r4 = heap32[(r8)];
+	r6 = heap32[(r8+2)];
+if(!(r4 !=r6)) //_LBB855_58
+{
+	r0 = heap32[(r8+4)];
+	r0 = (r0 + -4)|0;
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = r2;
+	heap32[(r8)] = 0;
+	heap32[(r8+1)] = r2;
+	r0 = 0;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+5)] = 0;
+break _36;
+}
+}
+	r4 = r0 >> 2;
+	r6 = (r0 + -4)|0;
+	heap32[(r4)] = 0;
+	heap32[(r8+3)] = r6;
+	r0 = heap32[(r4+-1)];
+	r0 = (r0 + 128)|0;
+	heap32[(r8+2)] = r0;
+	heap32[(r8+3)] = r6;
+}
+} while(0);
+	r7 = (r7 + -1)|0;
+	if(r7 ==0) //_LBB855_59
+{
+break _27;
+}
+}
+}
+} while(0);
+	r0 = r1 >> 2;
+	heap32[(r0)] = r3;
+	heap32[(r0+1)] = r5;
+	return;
+}
+else{
+_44: while(true){
+	r12 = r9 | r3;
+	if(r12 !=0) //_LBB855_20
+{
+	r12 = r10 >> 2;
+	r13 = (r10 - r5)|0;
+	r11 = r5 >> 2;
+	r13 = r13 << 3;
+	r11 = heap32[(r11)];
+	r12 = heap32[(r12)];
+	r12 = (r9 - r12)|0;
+	r13 = (r13 + -32)|0;
+	r11 = (r11 + 128)|0;
+	r11 = (r11 - r3)|0;
+	r12 = r12 >> 2;
+	r13 = r13 & -32;
+	r12 = (r12 + r13)|0;
+	r13 = r11 >> 2;
+	r12 = (r12 + r13)|0;
+}
+else{
+	r12 = (r9 - r3)|0;
+	r12 = r12 >> 2;
+}
+	if(r12 !=0) //_LBB855_11
+{
+	r12 = r6 >> 2;
+	r13 = heap32[(r12)];
+	if(r4 ==r13) //_LBB855_13
+{
+	r4 = heap32[(r12+-1)];
+	r6 = (r6 + -4)|0;
+	r4 = (r4 + 128)|0;
+}
+	r12 = r5 >> 2;
+	r4 = (r4 + -4)|0;
+	r13 = heap32[(r12)];
+	if(r3 ==r13) //_LBB855_16
+{
+	r3 = heap32[(r12+-1)];
+	r5 = (r5 + -4)|0;
+	r3 = (r3 + 128)|0;
+}
+	r12 = r3 >> 2;
+	r3 = (r3 + -4)|0;
+	r13 = r4 >> 2;
+	r12 = heap32[(r12+-1)];
+	heap32[(r13)] = r12;
+}
+else{
+break _44;
+}
+}
+_58: do {
+if(!(r7 ==0)) //_LBB855_35
+{
+	r3 = heap32[(r8)];
+_60: while(true){
+	r3 = (r3 + 4)|0;
+	heap32[(r8)] = r3;
+	r4 = heap32[(r8+1)];
+	r5 = heap32[(r8+3)];
+	if(r4 !=r5) //_LBB855_27
+{
+__label__ = 24;
+}
+else{
+	r5 = r2 >> 2;
+	r5 = heap32[(r5)];
+	if(r3 !=r5) //_LBB855_27
+{
+__label__ = 24;
+}
+else{
+	r3 = r4 >> 2;
+	r4 = heap32[(r3)];
+__label__ = 26;
+}
+}
+if (__label__ == 24){
+	r4 = r4 >> 2;
+	r4 = heap32[(r4)];
+	r5 = (r4 + 128)|0;
+	if(r3 ==r5) //_LBB855_29
+{
+__label__ = 26;
+}
+else{
+__label__ = 25;
+}
+}
+_67: do {
+if (__label__ == 26){
+	heap32[(g0)] = r4;
+	_ZdlPv(i7);
+	r3 = heap32[(r8+1)];
+	r4 = heap32[(r8+3)];
+if(!(r3 !=r4)) //_LBB855_34
+{
+	r4 = heap32[(r8)];
+	r5 = heap32[(r8+2)];
+if(!(r4 !=r5)) //_LBB855_34
+{
+	r3 = heap32[(r8+4)];
+	r3 = (r3 + -4)|0;
+	heap32[(g0)] = r3;
+	_ZdlPv(i7);
+	heap32[(r8+2)] = 0;
+	heap32[(r8+3)] = r2;
+	heap32[(r8)] = 0;
+	heap32[(r8+1)] = r2;
+	r3 = 0;
+	heap32[(r8+4)] = 0;
+	heap32[(r8+5)] = 0;
+break _67;
+}
+}
+	r4 = r3 >> 2;
+	r5 = (r3 + 4)|0;
+	heap32[(r4)] = 0;
+	heap32[(r8+1)] = r5;
+	r3 = heap32[(r4+1)];
+	heap32[(r8)] = r3;
+	heap32[(r8+1)] = r5;
+}
+} while(0);
+	r7 = (r7 + -1)|0;
+	if(r7 ==0) //_LBB855_35
+{
+break _58;
+}
+}
+}
+} while(0);
+	r1 = r1 >> 2;
+	r2 = heap32[(r0)];
+	heap32[(r1)] = r2;
+	r2 = heap32[(r0+1)];
+	heap32[(r1+1)] = r2;
+	return;
+}
+}
+
+function _Z41__static_initialization_and_destruction_0ii(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+var __label__ = 0;
+	i7 = sp + -80;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	if(r0 ==0) //_LBB856_16
+{
+	r0 = _ZL13s_fifo_errors;
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+2)];
+	r3 = sp + -24;
+	heap32[(fp+-6)] = r2;
+	r2 = r3 >> 2;
+	r4 = heap32[(r1+3)];
+	heap32[(r2+1)] = r4;
+	r2 = heap32[(r1)];
+	r1 = heap32[(r1+1)];
+	r4 = sp + -32;
+}
+else{
+	if(r0 !=1) //_LBB856_17
+{
+	return;
+}
+else{
+	r0 = sp + -56;
+	r1 = r0 >> 2;
+	r2 = (r0 + 8)|0;
+	heap32[(r1+2)] = 0;
+	heap32[(r1+3)] = r2;
+	heap32[(fp+-14)] = 0;
+	heap32[(r1+1)] = r2;
+	r2 = _ZL13s_fifo_errors;
+	heap32[(r1+4)] = 0;
+	r3 = r2 >> 2;
+	heap32[(r1+5)] = 0;
+	r4 = (r2 + 8)|0;
+	heap32[(r3+2)] = 0;
+	heap32[(r3+3)] = r4;
+	heap32[(r3)] = 0;
+	heap32[(r3+1)] = r4;
+	r5 = 0;
+	heap32[(r3+4)] = 0;
+	heap32[(r3+5)] = 0;
+	r6 = r4;
+	r7 = r5;
+_7: while(true){
+	if(r7 !=0) //_LBB856_12
+{
+	r8 = (r2 + 8)|0;
+	r8 = (r8 - r6)|0;
+	r9 = r6 >> 2;
+	r8 = r8 << 3;
+	r9 = heap32[(r9)];
+	r10 = 0;
+	r11 = heap32[(r3+2)];
+	r10 = (r10 - r11)|0;
+	r8 = (r8 + -32)|0;
+	r9 = (r9 + 128)|0;
+	r9 = (r9 - r7)|0;
+	r10 = r10 >> 2;
+	r8 = r8 & -32;
+	r8 = (r10 + r8)|0;
+	r9 = r9 >> 2;
+	r8 = (r8 + r9)|0;
+}
+else{
+	r8 = 0;
+	r8 = (r8 - r7)|0;
+	r8 = r8 >> 2;
+}
+	if(r8 !=0) //_LBB856_3
+{
+	r8 = r4 >> 2;
+	r9 = heap32[(r8)];
+	if(r5 ==r9) //_LBB856_5
+{
+	r5 = heap32[(r8+-1)];
+	r4 = (r4 + -4)|0;
+	r5 = (r5 + 128)|0;
+}
+	r8 = r6 >> 2;
+	r5 = (r5 + -4)|0;
+	r9 = heap32[(r8)];
+	if(r7 ==r9) //_LBB856_8
+{
+	r7 = heap32[(r8+-1)];
+	r6 = (r6 + -4)|0;
+	r7 = (r7 + 128)|0;
+}
+	r8 = r7 >> 2;
+	r7 = (r7 + -4)|0;
+	r9 = r5 >> 2;
+	r8 = heap32[(r8+-1)];
+	heap32[(r9)] = r8;
+}
+else{
+break _7;
+}
+}
+	r2 = heap32[(r1+2)];
+	r3 = sp + -8;
+	heap32[(fp+-2)] = r2;
+	r2 = r3 >> 2;
+	r4 = heap32[(r1+3)];
+	heap32[(r2+1)] = r4;
+	r2 = heap32[(fp+-14)];
+	r1 = heap32[(r1+1)];
+	r4 = sp + -16;
+}
+}
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r2;
+	heap32[(g0+3)] = r1;
+	heap32[(g0+4)] = r3;
+	_ZNSt5dequeIjSaIjEE5eraseESt15__rw_deque_iterIjiPjRjS0_ES5_(i7);
+	return;
+}
+
+function _GLOBAL__I__ZN5my_gl14glAttachShaderEjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _ZN5my_glL9m_contextE;
+	r1 = r0 >> 2;
+	heap32[(r1+62)] = 0;
+	heap32[(r1+63)] = 0;
+	heap32[(r1+64)] = 0;
+	heap32[(r1+65)] = 0;
+	heap32[(r1+66)] = 0;
+	heap32[(r1+67)] = 0;
+	heap32[(r1+78)] = 0;
+	heap32[(r1+79)] = 0;
+	heap32[(r1+74)] = 0;
+	heap32[(r1+77)] = 0;
+	heap32[(r1+76)] = 0;
+	heap32[(r1+75)] = 0;
+	_ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE11_C_get_linkEv(i7);
+	r2 = r_g0;
+	r3 = r2 >> 2;
+	heap32[(r1+78)] = r2;
+	heap32[(r3+1)] = 0;
+	heap32[(r3+3)] = r2;
+	heap32[(r3+2)] = r2;
+	heap32[(r1)] = 0;
+	heap32[(r1+3)] = 0;
+	heap32[(r1+61)] = 0;
+	heap32[(r1+4)] = 0;
+	heap32[(r1+68)] = 0;
+	heap32[(r1+69)] = 0;
+	r2 = _ZL26s_mandreel_internal_height;
+	r3 = _ZL25s_mandreel_internal_width;
+	heap32[(r1+1)] = 0;
+	r2 = r2 >> 2;
+	heap32[(r1+2)] = 1;
+	r3 = r3 >> 2;
+	r2 = heap32[(r2)];
+	r3 = heap32[(r3)];
+	heap32[(r1+70)] = 0;
+	heap32[(r1+71)] = 0;
+	r4 = 224;
+	heap32[(r1+72)] = r3;
+	heap32[(r1+73)] = r2;
+	r2 = 0;
+_2: while(true){
+	r1 = (r4 + -1)|0;
+	r4 = (r0 - r4)|0;
+	heap8[r4+244] = r2;
+	r4 = r1;
+	if(r1 !=0) //_LBB857_2
+{
+continue _2;
+}
+else{
+break _2;
+}
+}
+	return;
+}
+
+function _GLOBAL__D__ZN5my_gl14glAttachShaderEjj(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -16;var g0 = i7>>2; // save stack
+	r0 = _ZN5my_glL9m_contextE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+78)];
+_1: do {
+if(!(r1 ==0)) //_LBB858_26
+{
+	r2 = r1 >> 2;
+	r3 = heap32[(r0+79)];
+	if(r3 !=0) //_LBB858_5
+{
+	r1 = heap32[(r2+1)];
+	heap32[(g0)] = r1;
+	_ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE8_C_eraseEPNS_17__rw_rb_tree_nodeISB_S6_jS8_EE(i7);
+	r1 = heap32[(r0+78)];
+	r2 = r1 >> 2;
+	heap32[(r2+1)] = 0;
+	heap32[(r2+3)] = r1;
+	heap32[(r2+2)] = r1;
+	heap32[(r0+79)] = 0;
+}
+else{
+	r2 = heap32[(r2+2)];
+if(!(r2 ==r1)) //_LBB858_4
+{
+_6: while(true){
+	r3 = r2;
+	r4 = r3 >> 2;
+	r2 = heap32[(r4+3)];
+_8: do {
+	if(r2 !=0) //_LBB858_10
+{
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+2)];
+	if(r4 ==0) //_LBB858_12
+{
+break _8;
+}
+else{
+__label__ = 8; //SET chanka
+_10: while(true){
+	r2 = r4;
+	r4 = r2 >> 2;
+	r4 = heap32[(r4+2)];
+	if(r4 !=0) //_LBB858_13
+{
+continue _10;
+}
+else{
+break _8;
+}
+}
+}
+}
+else{
+	r4 = heap32[(r4+1)];
+	r2 = r4 >> 2;
+	r2 = heap32[(r2+3)];
+	if(r3 ==r2) //_LBB858_9
+{
+_14: while(true){
+	r2 = r4;
+	r5 = r2 >> 2;
+	r4 = heap32[(r5+1)];
+	r6 = r4 >> 2;
+	r6 = heap32[(r6+3)];
+if(!(r2 ==r6)) //_LBB858_15
+{
+break _14;
+}
+}
+	r5 = heap32[(r5+3)];
+}
+else{
+	r5 = 0;
+	r2 = r3;
+}
+	if(r5 !=r4) //_LBB858_19
+{
+	r2 = r4;
+}
+}
+} while(0);
+	r4 = sp + -8;
+	heap32[(g0)] = r4;
+	heap32[(g0+1)] = r3;
+	_ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE5eraseENS_14__rw_tree_iterIS6_iPS6_RS6_NS_17__rw_rb_tree_nodeISB_S6_jS8_EEEE(i7);
+if(!(r2 !=r1)) //_LBB858_6
+{
+break _6;
+}
+}
+	r1 = heap32[(r0+78)];
+}
+}
+	r2 = r1 >> 2;
+	r3 = heap32[(r0+75)];
+	heap32[(r2+3)] = r3;
+	heap32[(r0+75)] = r1;
+	r1 = heap32[(r0+74)];
+if(!(r1 ==0)) //_LBB858_26
+{
+__label__ = 16; //SET chanka
+_23: while(true){
+	r2 = r1 >> 2;
+	r3 = heap32[(r2)];
+	heap32[(r0+74)] = r3;
+	r2 = heap32[(r2+2)];
+	heap32[(g0)] = r2;
+	_ZdlPv(i7);
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+	r1 = heap32[(r0+74)];
+	if(r1 !=0) //_LBB858_23
+{
+continue _23;
+}
+else{
+break _1;
+}
+}
+}
+}
+} while(0);
+	r1 = heap32[(r0+65)];
+	r2 = heap32[(r0+66)];
+	r3 = (r2 - r1)|0;
+	r3 = r3 >> 5;
+	if(r3 !=0) //_LBB858_28
+{
+	r1 = (r2 + -32)|0;
+	heap32[(r0+66)] = r1;
+	r1 = (r2 + -28)|0;
+	heap32[(g0)] = r1;
+	_ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EED2Ev(i7);
+_31: do {
+if(!(r3 ==1)) //_LBB858_33
+{
+	r1 = (r3 + -1)|0;
+_33: while(true){
+	r2 = heap32[(r0+66)];
+	r3 = (r2 + -32)|0;
+	heap32[(r0+66)] = r3;
+	r2 = (r2 + -28)|0;
+	heap32[(g0)] = r2;
+	_ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EED2Ev(i7);
+	r1 = (r1 + -1)|0;
+if(!(r1 !=0)) //_LBB858_31
+{
+break _31;
+}
+}
+}
+} while(0);
+	r1 = heap32[(r0+65)];
+}
+	heap32[(g0)] = r1;
+	_ZdlPv(i7);
+	r1 = heap32[(r0+63)];
+	r2 = heap32[(r0+62)];
+	r3 = (r1 - r2)|0;
+	r4 = (r3 + 11)|0;
+if(!(uint(r4) <uint(23))) //_LBB858_37
+{
+	r3 = (r3 / -12)|0;
+	r3 = (r3 * 12)|0;
+	r1 = (r1 + r3)|0;
+	heap32[(r0+63)] = r1;
+}
+	heap32[(g0)] = r2;
+	_ZdlPv(i7);
+	return;
+}
+
+function imandreel_restore_glcontext(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function imandreel_viewport_resize(sp)
+{
+	var i7;
+	var fp = sp>>2;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	return;
+}
+
+function _ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE8_C_eraseEPNS_17__rw_rb_tree_nodeISB_S6_jS8_EE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+if(!(r0 ==0)) //_LBB861_2
+{
+_2: while(true){
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+3)];
+	heap32[(g0)] = r2;
+	r2 = _ZN5my_glL9m_contextE;
+	_ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE8_C_eraseEPNS_17__rw_rb_tree_nodeISB_S6_jS8_EE(i7);
+	r2 = r2 >> 2;
+	r3 = heap32[(r1+2)];
+	r4 = heap32[(r2+75)];
+	heap32[(r1+3)] = r4;
+	heap32[(r2+75)] = r0;
+	r0 = r3;
+	if(r3 !=0) //_LBB861_1
+{
+continue _2;
+}
+else{
+break _2;
+}
+}
+}
+	return;
+}
+
+function _ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EE8_C_eraseEPNS_17__rw_rb_tree_nodeIS8_S3_SsS5_EE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+1)];
+if(!(r0 ==0)) //_LBB862_6
+{
+	r1 = heap32[(fp)];
+_3: while(true){
+	r2 = r0;
+	r3 = r2 >> 2;
+	r0 = heap32[(r3+3)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	_ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EE8_C_eraseEPNS_17__rw_rb_tree_nodeIS8_S3_SsS5_EE(i7);
+	r4 = r1 >> 2;
+	r0 = heap32[(r3+2)];
+	r5 = heap32[(r4+1)];
+	heap32[(r3+3)] = r5;
+	r5 = heap32[(r3+4)];
+	r5 = (r5 + -12)|0;
+	r6 = _ZNSs11_C_null_refE;
+if(!(r5 ==r6)) //_LBB862_5
+{
+	r5 = r5 >> 2;
+	r6 = heap32[(r5)];
+	r7 = (r6 + -1)|0;
+	heap32[(r5)] = r7;
+if(!(r6 >0)) //_LBB862_5
+{
+	r5 = heap32[(r3+4)];
+	r5 = (r5 + -12)|0;
+	heap32[(g0)] = r5;
+	_ZdlPv(i7);
+}
+}
+	heap32[(r3+4)] = 0;
+	heap32[(r4+1)] = r2;
+	if(r0 !=0) //_LBB862_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+	return;
+}
+
+function _ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EE5eraseENS_14__rw_tree_iterIS3_iPS3_RS3_NS_17__rw_rb_tree_nodeIS8_S3_SsS5_EEEESF_(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+	var r15;
+	var r16;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp+2)];
+	r1 = heap32[(fp+1)];
+	r0 = r0 >> 2;
+	r2 = r1 >> 2;
+	r3 = heap32[(r2+4)];
+	r4 = heap32[(r0)];
+	r5 = heap32[(fp)];
+	r6 = heap32[(fp+3)];
+	r7 = r3 >> 2;
+	r8 = heap32[(r7+2)];
+if(!(r4 !=r8)) //_LBB863_3
+{
+if(!(r3 !=r6)) //_LBB863_3
+{
+	r8 = heap32[(r2+5)];
+	if(r8 !=0) //_LBB863_4
+{
+	r0 = heap32[(r7+1)];
+	heap32[(g0)] = r1;
+	heap32[(g0+1)] = r0;
+	_ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EE8_C_eraseEPNS_17__rw_rb_tree_nodeIS8_S3_SsS5_EE(i7);
+	r0 = heap32[(r2+4)];
+	r0 = r0 >> 2;
+	heap32[(r0+1)] = 0;
+	r0 = heap32[(r2+4)];
+	r1 = r0 >> 2;
+	heap32[(r1+3)] = r0;
+	heap32[(r1+2)] = r0;
+	heap32[(r2+5)] = 0;
+	r0 = r5 >> 2;
+	r1 = heap32[(r2+4)];
+	heap32[(r0)] = r1;
+	return;
+}
+}
+}
+	r1 = r5 >> 2;
+	heap32[(r1)] = r3;
+if(!(r4 ==r6)) //_LBB863_165
+{
+_7: while(true){
+	r3 = r4 >> 2;
+	r5 = heap32[(r3+3)];
+	if(r5 !=0) //_LBB863_9
+{
+	r7 = r5 >> 2;
+	r7 = heap32[(r7+2)];
+if(!(r7 ==0)) //_LBB863_11
+{
+_12: while(true){
+	r5 = r7;
+	r7 = r5 >> 2;
+	r7 = heap32[(r7+2)];
+if(!(r7 !=0)) //_LBB863_12
+{
+break _12;
+}
+}
+}
+	heap32[(r0)] = r5;
+}
+else{
+	r7 = heap32[(r3+1)];
+	r5 = r7 >> 2;
+	r5 = heap32[(r5+3)];
+	if(r4 ==r5) //_LBB863_8
+{
+_17: while(true){
+	r5 = r7;
+	r8 = r5 >> 2;
+	r7 = heap32[(r8+1)];
+	r9 = r7 >> 2;
+	r9 = heap32[(r9+3)];
+if(!(r5 ==r9)) //_LBB863_14
+{
+break _17;
+}
+}
+	heap32[(r0)] = r5;
+	r8 = heap32[(r8+3)];
+}
+else{
+	r8 = 0;
+	r5 = r4;
+}
+	if(r8 !=r7) //_LBB863_18
+{
+	heap32[(r0)] = r7;
+	r5 = r7;
+}
+}
+	r7 = heap32[(r2+4)];
+	if(r4 !=r7) //_LBB863_21
+{
+	r9 = heap32[(r3+3)];
+_26: do {
+	if(r9 !=0) //_LBB863_25
+{
+	r8 = r9 >> 2;
+	r10 = heap32[(r8+2)];
+	if(r10 ==0) //_LBB863_27
+{
+	r8 = r9;
+}
+else{
+_30: while(true){
+	r8 = r10;
+	r10 = r8 >> 2;
+	r10 = heap32[(r10+2)];
+	if(r10 !=0) //_LBB863_28
+{
+continue _30;
+}
+else{
+break _26;
+}
+}
+}
+}
+else{
+	r8 = heap32[(r3+1)];
+	r10 = r8 >> 2;
+	r10 = heap32[(r10+3)];
+	if(r4 ==r10) //_LBB863_24
+{
+_34: while(true){
+	r11 = r8;
+	r10 = r11 >> 2;
+	r8 = heap32[(r10+1)];
+	r12 = r8 >> 2;
+	r12 = heap32[(r12+3)];
+if(!(r11 ==r12)) //_LBB863_30
+{
+break _34;
+}
+}
+	r10 = heap32[(r10+3)];
+}
+else{
+	r10 = 0;
+	r11 = r4;
+}
+	if(r10 ==r8) //_LBB863_34
+{
+	r8 = r11;
+}
+}
+} while(0);
+	r10 = heap32[(r3+2)];
+	if(r10 !=0) //_LBB863_37
+{
+	if(r9 !=0) //_LBB863_39
+{
+	r11 = r9 >> 2;
+	r12 = heap32[(r11+2)];
+_45: do {
+	if(r12 ==0) //_LBB863_41
+{
+	r11 = r9;
+}
+else{
+_47: while(true){
+	r11 = r12;
+	r12 = r11 >> 2;
+	r12 = heap32[(r12+2)];
+if(!(r12 !=0)) //_LBB863_42
+{
+break _45;
+}
+}
+}
+} while(0);
+	r13 = r11 >> 2;
+	r9 = heap32[(r13+3)];
+	if(r11 !=r4) //_LBB863_45
+{
+	r7 = r10 >> 2;
+	heap32[(r7+1)] = r11;
+	r7 = heap32[(r3+2)];
+	heap32[(r13+2)] = r7;
+	r7 = heap32[(r3+3)];
+	if(r7 !=r11) //_LBB863_47
+{
+	r12 = heap32[(r13+1)];
+	if(r9 !=0) //_LBB863_49
+{
+	r7 = r9 >> 2;
+	heap32[(r7+1)] = r12;
+	r7 = heap32[(r13+1)];
+}
+else{
+	r7 = r12;
+}
+	r7 = r7 >> 2;
+	heap32[(r7+2)] = r9;
+	r7 = heap32[(r3+3)];
+	heap32[(r13+3)] = r7;
+	r7 = heap32[(r3+3)];
+	r7 = r7 >> 2;
+	heap32[(r7+1)] = r11;
+}
+else{
+	r12 = r11;
+}
+	r7 = heap32[(r2+4)];
+	r7 = r7 >> 2;
+	r10 = heap32[(r7+1)];
+	if(r10 !=r4) //_LBB863_53
+{
+	r7 = heap32[(r3+1)];
+	r10 = r7 >> 2;
+	r10 = heap32[(r10+2)];
+	r10 = r10 != r4;
+	r10 = r10 & 1;
+	r10 = r10 << 2;
+	r7 = (r7 + r10)|0;
+	r7 = (r7 + 8)|0;
+	r10 = (r4 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r11;
+}
+else{
+	r10 = (r4 + 4)|0;
+	heap32[(r7+1)] = r11;
+}
+	r7 = r10 >> 2;
+	r7 = heap32[(r7)];
+	heap32[(r13+1)] = r7;
+	r7 = heap32[(r13)];
+	r11 = heap32[(r3)];
+	heap32[(r13)] = r11;
+	heap32[(r3)] = r7;
+__label__ = 66;
+}
+else{
+__label__ = 45;
+}
+}
+else{
+	r12 = heap32[(r3+1)];
+	r11 = r4;
+	r9 = r10;
+__label__ = 47;
+}
+}
+else{
+	r11 = r4;
+__label__ = 45;
+}
+if (__label__ == 45){
+	r12 = r11 >> 2;
+	r12 = heap32[(r12+1)];
+	if(r9 ==0) //_LBB863_57
+{
+	r9 = 0;
+__label__ = 48;
+}
+else{
+__label__ = 47;
+}
+}
+if (__label__ == 47){
+	r7 = r9 >> 2;
+	heap32[(r7+1)] = r12;
+	r7 = heap32[(r2+4)];
+__label__ = 48;
+}
+if (__label__ == 48){
+	r7 = r7 >> 2;
+	r10 = heap32[(r7+1)];
+	if(r10 !=r4) //_LBB863_61
+{
+	r7 = heap32[(r3+1)];
+	r10 = r7 >> 2;
+	r10 = heap32[(r10+2)];
+	r10 = r10 != r4;
+	r10 = r10 & 1;
+	r10 = r10 << 2;
+	r7 = (r7 + r10)|0;
+	r7 = (r7 + 8)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r9;
+}
+else{
+	heap32[(r7+1)] = r9;
+}
+	r7 = heap32[(r2+4)];
+	r7 = r7 >> 2;
+	r10 = heap32[(r7+2)];
+if(!(r10 !=r4)) //_LBB863_70
+{
+	r10 = heap32[(r3+3)];
+	if(r10 !=0) //_LBB863_65
+{
+	r10 = r9 >> 2;
+	r10 = heap32[(r10+2)];
+_80: do {
+	if(r10 ==0) //_LBB863_67
+{
+	r13 = r9;
+}
+else{
+_82: while(true){
+	r13 = r10;
+	r10 = r13 >> 2;
+	r10 = heap32[(r10+2)];
+if(!(r10 !=0)) //_LBB863_68
+{
+break _80;
+}
+}
+}
+} while(0);
+	heap32[(r7+2)] = r13;
+}
+else{
+	r10 = heap32[(r3+1)];
+	heap32[(r7+2)] = r10;
+}
+}
+	r7 = heap32[(r2+4)];
+	r7 = r7 >> 2;
+	r10 = heap32[(r7+3)];
+	if(r10 ==r4) //_LBB863_72
+{
+	r4 = heap32[(r3+2)];
+	if(r4 !=0) //_LBB863_74
+{
+	r4 = r9 >> 2;
+	r4 = heap32[(r4+3)];
+_91: do {
+	if(r4 ==0) //_LBB863_76
+{
+	r3 = r9;
+}
+else{
+_93: while(true){
+	r3 = r4;
+	r4 = r3 >> 2;
+	r4 = heap32[(r4+3)];
+if(!(r4 !=0)) //_LBB863_77
+{
+break _91;
+}
+}
+}
+} while(0);
+	heap32[(r7+3)] = r3;
+	r4 = r11;
+}
+else{
+	r4 = heap32[(r3+1)];
+	heap32[(r7+3)] = r4;
+	r4 = r11;
+}
+}
+else{
+	r4 = r11;
+}
+}
+	r3 = r4 >> 2;
+	r7 = heap32[(r3)];
+_99: do {
+if(!(r7 ==0)) //_LBB863_160
+{
+_100: while(true){
+	r7 = heap32[(r2+4)];
+	r7 = r7 >> 2;
+	r7 = heap32[(r7+1)];
+	if(r7 ==r9) //_LBB863_158
+{
+__label__ = 140;
+break _100;
+}
+else{
+if(!(r9 ==0)) //_LBB863_81
+{
+	r7 = r9 >> 2;
+	r7 = heap32[(r7)];
+if(!(r7 ==1)) //_LBB863_81
+{
+__label__ = 141;
+break _100;
+}
+}
+	r7 = r12 >> 2;
+	r10 = heap32[(r7+2)];
+	if(r10 !=r9) //_LBB863_119
+{
+	r11 = r10 >> 2;
+	r13 = heap32[(r11)];
+	if(r13 ==0) //_LBB863_121
+{
+	heap32[(r11)] = 1;
+	heap32[(r7)] = 0;
+	r10 = heap32[(r7+2)];
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+3)];
+	heap32[(r7+2)] = r13;
+	r13 = heap32[(r11+3)];
+if(!(r13 ==0)) //_LBB863_123
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r12;
+}
+	r13 = heap32[(r7+1)];
+	heap32[(r11+1)] = r13;
+	r13 = heap32[(r2+4)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+1)];
+	if(r14 !=r12) //_LBB863_125
+{
+	r13 = heap32[(r7+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+3)];
+	if(r14 !=r12) //_LBB863_127
+{
+	heap32[(r13+2)] = r10;
+}
+else{
+	heap32[(r13+3)] = r10;
+}
+}
+else{
+	heap32[(r13+1)] = r10;
+}
+	heap32[(r11+3)] = r12;
+	heap32[(r7+1)] = r10;
+	r10 = heap32[(r7+2)];
+}
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+3)];
+if(!(r13 ==0)) //_LBB863_131
+{
+	r13 = r13 >> 2;
+	r14 = heap32[(r13)];
+	if(r14 !=1) //_LBB863_135
+{
+__label__ = 117;
+break _100;
+}
+}
+	r13 = heap32[(r11+2)];
+if(!(r13 ==0)) //_LBB863_134
+{
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+if(!(r13 ==1)) //_LBB863_134
+{
+__label__ = 127;
+break _100;
+}
+}
+	heap32[(r11)] = 0;
+}
+else{
+	r10 = heap32[(r7+3)];
+	r11 = r10 >> 2;
+	r13 = heap32[(r11)];
+	if(r13 ==0) //_LBB863_84
+{
+	heap32[(r11)] = 1;
+	heap32[(r7)] = 0;
+	r10 = heap32[(r7+3)];
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+2)];
+	heap32[(r7+3)] = r13;
+	r13 = heap32[(r11+2)];
+if(!(r13 ==0)) //_LBB863_86
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r12;
+}
+	r13 = heap32[(r7+1)];
+	heap32[(r11+1)] = r13;
+	r13 = heap32[(r2+4)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+1)];
+	if(r14 !=r12) //_LBB863_88
+{
+	r13 = heap32[(r7+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+2)];
+	if(r14 !=r12) //_LBB863_90
+{
+	heap32[(r13+3)] = r10;
+}
+else{
+	heap32[(r13+2)] = r10;
+}
+}
+else{
+	heap32[(r13+1)] = r10;
+}
+	heap32[(r11+2)] = r12;
+	heap32[(r7+1)] = r10;
+	r10 = heap32[(r7+3)];
+}
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+2)];
+if(!(r13 ==0)) //_LBB863_94
+{
+	r13 = r13 >> 2;
+	r14 = heap32[(r13)];
+	if(r14 !=1) //_LBB863_99
+{
+__label__ = 83;
+break _100;
+}
+}
+	r13 = heap32[(r11+3)];
+if(!(r13 ==0)) //_LBB863_97
+{
+	r13 = r13 >> 2;
+	r13 = heap32[(r13)];
+if(!(r13 ==1)) //_LBB863_97
+{
+__label__ = 93;
+break _100;
+}
+}
+	heap32[(r11)] = 0;
+}
+	r10 = heap32[(r7+1)];
+	r9 = r12;
+	r12 = r10;
+}
+}
+_148: do {
+switch(__label__ ){//multiple entries
+case 117:
+	r14 = heap32[(r11+2)];
+if(!(r14 ==0)) //_LBB863_137
+{
+	r14 = r14 >> 2;
+	r14 = heap32[(r14)];
+	if(r14 !=1) //_LBB863_133
+{
+__label__ = 127;
+break _148;
+}
+}
+	heap32[(r13)] = 1;
+	r13 = heap32[(r11+3)];
+	r14 = r13 >> 2;
+	heap32[(r11)] = 0;
+	r15 = heap32[(r14+2)];
+	heap32[(r11+3)] = r15;
+	r15 = heap32[(r14+2)];
+if(!(r15 ==0)) //_LBB863_139
+{
+	r15 = r15 >> 2;
+	heap32[(r15+1)] = r10;
+}
+	r15 = heap32[(r11+1)];
+	heap32[(r14+1)] = r15;
+	r15 = heap32[(r2+4)];
+	r15 = r15 >> 2;
+	r16 = heap32[(r15+1)];
+	if(r16 !=r10) //_LBB863_141
+{
+	r15 = heap32[(r11+1)];
+	r15 = r15 >> 2;
+	r16 = heap32[(r15+2)];
+	if(r16 !=r10) //_LBB863_143
+{
+	heap32[(r15+3)] = r13;
+}
+else{
+	heap32[(r15+2)] = r13;
+}
+}
+else{
+	heap32[(r15+1)] = r13;
+}
+	heap32[(r14+2)] = r10;
+	heap32[(r11+1)] = r13;
+	r10 = heap32[(r7+2)];
+__label__ = 127;
+break _148;
+break;
+case 83:
+	r14 = heap32[(r11+3)];
+if(!(r14 ==0)) //_LBB863_101
+{
+	r14 = r14 >> 2;
+	r14 = heap32[(r14)];
+	if(r14 !=1) //_LBB863_96
+{
+__label__ = 93;
+break _148;
+}
+}
+	heap32[(r13)] = 1;
+	r13 = heap32[(r11+2)];
+	r14 = r13 >> 2;
+	heap32[(r11)] = 0;
+	r15 = heap32[(r14+3)];
+	heap32[(r11+2)] = r15;
+	r15 = heap32[(r14+3)];
+if(!(r15 ==0)) //_LBB863_103
+{
+	r15 = r15 >> 2;
+	heap32[(r15+1)] = r10;
+}
+	r15 = heap32[(r11+1)];
+	heap32[(r14+1)] = r15;
+	r15 = heap32[(r2+4)];
+	r15 = r15 >> 2;
+	r16 = heap32[(r15+1)];
+	if(r16 !=r10) //_LBB863_105
+{
+	r15 = heap32[(r11+1)];
+	r15 = r15 >> 2;
+	r16 = heap32[(r15+3)];
+	if(r16 !=r10) //_LBB863_107
+{
+	heap32[(r15+2)] = r13;
+}
+else{
+	heap32[(r15+3)] = r13;
+}
+}
+else{
+	heap32[(r15+1)] = r13;
+}
+	heap32[(r14+3)] = r10;
+	heap32[(r11+1)] = r13;
+	r10 = heap32[(r7+3)];
+__label__ = 93;
+break;
+}
+} while(0);
+_177: do {
+switch(__label__ ){//multiple entries
+case 127:
+	r10 = r10 >> 2;
+	r11 = heap32[(r7)];
+	heap32[(r10)] = r11;
+	heap32[(r7)] = 1;
+	r10 = heap32[(r10+2)];
+if(!(r10 ==0)) //_LBB863_147
+{
+	r10 = r10 >> 2;
+	heap32[(r10)] = 1;
+}
+	r10 = heap32[(r7+2)];
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+3)];
+	heap32[(r7+2)] = r13;
+	r13 = heap32[(r11+3)];
+if(!(r13 ==0)) //_LBB863_149
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r12;
+}
+	r13 = heap32[(r7+1)];
+	heap32[(r11+1)] = r13;
+	r13 = heap32[(r2+4)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+1)];
+	if(r14 !=r12) //_LBB863_151
+{
+	r13 = heap32[(r7+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+3)];
+	if(r14 !=r12) //_LBB863_153
+{
+	heap32[(r13+2)] = r10;
+}
+else{
+	heap32[(r13+3)] = r10;
+}
+}
+else{
+	heap32[(r13+1)] = r10;
+}
+	heap32[(r11+3)] = r12;
+	heap32[(r7+1)] = r10;
+__label__ = 140;
+break _177;
+break;
+case 93:
+	r10 = r10 >> 2;
+	r11 = heap32[(r7)];
+	heap32[(r10)] = r11;
+	heap32[(r7)] = 1;
+	r10 = heap32[(r10+3)];
+if(!(r10 ==0)) //_LBB863_111
+{
+	r10 = r10 >> 2;
+	heap32[(r10)] = 1;
+}
+	r10 = heap32[(r7+3)];
+	r11 = r10 >> 2;
+	r13 = heap32[(r11+2)];
+	heap32[(r7+3)] = r13;
+	r13 = heap32[(r11+2)];
+if(!(r13 ==0)) //_LBB863_113
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r12;
+}
+	r13 = heap32[(r7+1)];
+	heap32[(r11+1)] = r13;
+	r13 = heap32[(r2+4)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+1)];
+	if(r14 !=r12) //_LBB863_115
+{
+	r13 = heap32[(r7+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+2)];
+	if(r14 !=r12) //_LBB863_117
+{
+	heap32[(r13+3)] = r10;
+}
+else{
+	heap32[(r13+2)] = r10;
+}
+}
+else{
+	heap32[(r13+1)] = r10;
+}
+	heap32[(r11+2)] = r12;
+	heap32[(r7+1)] = r10;
+__label__ = 140;
+break;
+}
+} while(0);
+if (__label__ == 140){
+	if(r9 ==0) //_LBB863_160
+{
+break _99;
+}
+}
+	r7 = r9 >> 2;
+	heap32[(r7)] = 1;
+}
+} while(0);
+	r7 = heap32[(r2+1)];
+	heap32[(r3+3)] = r7;
+	r7 = heap32[(r3+4)];
+	r7 = (r7 + -12)|0;
+	r9 = _ZNSs11_C_null_refE;
+if(!(r7 ==r9)) //_LBB863_163
+{
+	r7 = r7 >> 2;
+	r9 = heap32[(r7)];
+	r10 = (r9 + -1)|0;
+	heap32[(r7)] = r10;
+if(!(r9 >0)) //_LBB863_163
+{
+	r7 = heap32[(r3+4)];
+	r7 = (r7 + -12)|0;
+	heap32[(g0)] = r7;
+	_ZdlPv(i7);
+}
+}
+	heap32[(r3+4)] = 0;
+	heap32[(r2+1)] = r4;
+	r4 = heap32[(r2+5)];
+	r4 = (r4 + -1)|0;
+	heap32[(r2+5)] = r4;
+}
+else{
+	r8 = r7;
+}
+	heap32[(r1)] = r8;
+	r4 = r5;
+	if(r5 !=r6) //_LBB863_5
+{
+continue _7;
+}
+else{
+break _7;
+}
+}
+}
+	return;
+}
+
+function _ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE5eraseENS_14__rw_tree_iterIS6_iPS6_RS6_NS_17__rw_rb_tree_nodeISB_S6_jS8_EEEE(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+	var r7;
+	var r8;
+	var r9;
+	var r10;
+	var r11;
+	var r12;
+	var r13;
+	var r14;
+var __label__ = 0;
+	i7 = sp + 0;var g0 = i7>>2; // save stack
+	r0 = _ZN5my_glL9m_contextE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+78)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp)];
+	if(r1 !=r2) //_LBB864_2
+{
+	r4 = r2 >> 2;
+	r5 = heap32[(r4+3)];
+_3: do {
+	if(r5 !=0) //_LBB864_6
+{
+	r6 = r5 >> 2;
+	r7 = heap32[(r6+2)];
+	if(r7 ==0) //_LBB864_8
+{
+	r6 = r5;
+}
+else{
+_7: while(true){
+	r6 = r7;
+	r7 = r6 >> 2;
+	r7 = heap32[(r7+2)];
+	if(r7 !=0) //_LBB864_9
+{
+continue _7;
+}
+else{
+break _3;
+}
+}
+}
+}
+else{
+	r6 = heap32[(r4+1)];
+	r7 = r6 >> 2;
+	r7 = heap32[(r7+3)];
+	if(r7 ==r2) //_LBB864_5
+{
+_11: while(true){
+	r8 = r6;
+	r7 = r8 >> 2;
+	r6 = heap32[(r7+1)];
+	r9 = r6 >> 2;
+	r9 = heap32[(r9+3)];
+if(!(r8 ==r9)) //_LBB864_11
+{
+break _11;
+}
+}
+	r7 = heap32[(r7+3)];
+}
+else{
+	r7 = 0;
+	r8 = r2;
+}
+	if(r7 ==r6) //_LBB864_15
+{
+	r6 = r8;
+}
+}
+} while(0);
+	r7 = heap32[(r4+2)];
+	if(r7 !=0) //_LBB864_18
+{
+	if(r5 !=0) //_LBB864_20
+{
+	r8 = r5 >> 2;
+	r9 = heap32[(r8+2)];
+_22: do {
+	if(r9 ==0) //_LBB864_22
+{
+	r8 = r5;
+}
+else{
+_24: while(true){
+	r8 = r9;
+	r9 = r8 >> 2;
+	r9 = heap32[(r9+2)];
+if(!(r9 !=0)) //_LBB864_23
+{
+break _22;
+}
+}
+}
+} while(0);
+	r10 = r8 >> 2;
+	r5 = heap32[(r10+3)];
+	if(r8 !=r2) //_LBB864_26
+{
+	r9 = r7 >> 2;
+	heap32[(r9+1)] = r8;
+	r9 = heap32[(r4+2)];
+	heap32[(r10+2)] = r9;
+	r9 = heap32[(r4+3)];
+	if(r9 !=r8) //_LBB864_28
+{
+	r9 = heap32[(r10+1)];
+	if(r5 !=0) //_LBB864_30
+{
+	r7 = r5 >> 2;
+	heap32[(r7+1)] = r9;
+	r7 = heap32[(r10+1)];
+}
+else{
+	r7 = r9;
+}
+	r7 = r7 >> 2;
+	heap32[(r7+2)] = r5;
+	r7 = heap32[(r4+3)];
+	heap32[(r10+3)] = r7;
+	r7 = heap32[(r4+3)];
+	r7 = r7 >> 2;
+	heap32[(r7+1)] = r8;
+}
+else{
+	r9 = r8;
+}
+	r7 = r1 >> 2;
+	r11 = heap32[(r7+1)];
+	if(r11 !=r2) //_LBB864_34
+{
+	r11 = heap32[(r4+1)];
+	r7 = r11 >> 2;
+	r7 = heap32[(r7+2)];
+	r7 = r7 != r2;
+	r7 = r7 & 1;
+	r7 = r7 << 2;
+	r11 = (r11 + r7)|0;
+	r7 = (r11 + 8)|0;
+	r11 = (r2 + 4)|0;
+	r7 = r7 >> 2;
+	heap32[(r7)] = r8;
+}
+else{
+	r11 = (r2 + 4)|0;
+	heap32[(r7+1)] = r8;
+}
+	r8 = r11 >> 2;
+	r8 = heap32[(r8)];
+	heap32[(r10+1)] = r8;
+	r8 = heap32[(r10)];
+	r7 = heap32[(r4)];
+	heap32[(r10)] = r7;
+	heap32[(r4)] = r8;
+__label__ = 51;
+}
+else{
+__label__ = 30;
+}
+}
+else{
+	r9 = heap32[(r4+1)];
+	r8 = r2;
+	r5 = r7;
+__label__ = 32;
+}
+}
+else{
+	r8 = r2;
+__label__ = 30;
+}
+if (__label__ == 30){
+	r9 = r8 >> 2;
+	r9 = heap32[(r9+1)];
+	if(r5 ==0) //_LBB864_38
+{
+	r5 = 0;
+__label__ = 33;
+}
+else{
+__label__ = 32;
+}
+}
+if (__label__ == 32){
+	r7 = r5 >> 2;
+	heap32[(r7+1)] = r9;
+__label__ = 33;
+}
+if (__label__ == 33){
+	r7 = r1 >> 2;
+	r10 = heap32[(r7+1)];
+	if(r10 !=r2) //_LBB864_42
+{
+	r10 = heap32[(r4+1)];
+	r11 = r10 >> 2;
+	r11 = heap32[(r11+2)];
+	r11 = r11 != r2;
+	r11 = r11 & 1;
+	r11 = r11 << 2;
+	r10 = (r10 + r11)|0;
+	r10 = (r10 + 8)|0;
+	r10 = r10 >> 2;
+	heap32[(r10)] = r5;
+}
+else{
+	heap32[(r7+1)] = r5;
+}
+	r10 = heap32[(r7+2)];
+if(!(r10 !=r2)) //_LBB864_51
+{
+	r10 = heap32[(r4+3)];
+	if(r10 !=0) //_LBB864_46
+{
+	r10 = r5 >> 2;
+	r10 = heap32[(r10+2)];
+_57: do {
+	if(r10 ==0) //_LBB864_48
+{
+	r11 = r5;
+}
+else{
+_59: while(true){
+	r11 = r10;
+	r10 = r11 >> 2;
+	r10 = heap32[(r10+2)];
+if(!(r10 !=0)) //_LBB864_49
+{
+break _57;
+}
+}
+}
+} while(0);
+	heap32[(r7+2)] = r11;
+}
+else{
+	r10 = heap32[(r4+1)];
+	heap32[(r7+2)] = r10;
+}
+}
+	r10 = heap32[(r7+3)];
+	if(r10 ==r2) //_LBB864_53
+{
+	r2 = heap32[(r4+2)];
+	if(r2 !=0) //_LBB864_55
+{
+	r2 = r5 >> 2;
+	r2 = heap32[(r2+3)];
+_68: do {
+	if(r2 ==0) //_LBB864_57
+{
+	r4 = r5;
+}
+else{
+_70: while(true){
+	r4 = r2;
+	r2 = r4 >> 2;
+	r2 = heap32[(r2+3)];
+if(!(r2 !=0)) //_LBB864_58
+{
+break _68;
+}
+}
+}
+} while(0);
+	heap32[(r7+3)] = r4;
+	r2 = r8;
+}
+else{
+	r2 = heap32[(r4+1)];
+	heap32[(r7+3)] = r2;
+	r2 = r8;
+}
+}
+else{
+	r2 = r8;
+}
+}
+	r4 = r2 >> 2;
+	r7 = heap32[(r4)];
+_76: do {
+if(!(r7 ==0)) //_LBB864_141
+{
+_77: while(true){
+	r7 = r1 >> 2;
+	r8 = heap32[(r7+1)];
+	if(r8 ==r5) //_LBB864_139
+{
+__label__ = 125;
+break _77;
+}
+else{
+if(!(r5 ==0)) //_LBB864_62
+{
+	r8 = r5 >> 2;
+	r8 = heap32[(r8)];
+if(!(r8 ==1)) //_LBB864_62
+{
+__label__ = 126;
+break _77;
+}
+}
+	r8 = r9 >> 2;
+	r10 = heap32[(r8+2)];
+	if(r10 !=r5) //_LBB864_100
+{
+	r11 = r10 >> 2;
+	r12 = heap32[(r11)];
+	if(r12 ==0) //_LBB864_102
+{
+	heap32[(r11)] = 1;
+	heap32[(r8)] = 0;
+	r10 = heap32[(r8+2)];
+	r11 = r10 >> 2;
+	r12 = heap32[(r11+3)];
+	heap32[(r8+2)] = r12;
+	r12 = heap32[(r11+3)];
+if(!(r12 ==0)) //_LBB864_104
+{
+	r12 = r12 >> 2;
+	heap32[(r12+1)] = r9;
+}
+	r12 = heap32[(r8+1)];
+	heap32[(r11+1)] = r12;
+	r12 = heap32[(r7+1)];
+	if(r12 !=r9) //_LBB864_106
+{
+	r12 = heap32[(r8+1)];
+	r12 = r12 >> 2;
+	r13 = heap32[(r12+3)];
+	if(r13 !=r9) //_LBB864_108
+{
+	heap32[(r12+2)] = r10;
+}
+else{
+	heap32[(r12+3)] = r10;
+}
+}
+else{
+	heap32[(r7+1)] = r10;
+}
+	heap32[(r11+3)] = r9;
+	heap32[(r8+1)] = r10;
+	r10 = heap32[(r8+2)];
+}
+	r11 = r10 >> 2;
+	r12 = heap32[(r11+3)];
+if(!(r12 ==0)) //_LBB864_112
+{
+	r12 = r12 >> 2;
+	r13 = heap32[(r12)];
+	if(r13 !=1) //_LBB864_116
+{
+__label__ = 102;
+break _77;
+}
+}
+	r12 = heap32[(r11+2)];
+if(!(r12 ==0)) //_LBB864_115
+{
+	r12 = r12 >> 2;
+	r12 = heap32[(r12)];
+if(!(r12 ==1)) //_LBB864_115
+{
+__label__ = 112;
+break _77;
+}
+}
+	heap32[(r11)] = 0;
+}
+else{
+	r10 = heap32[(r8+3)];
+	r11 = r10 >> 2;
+	r12 = heap32[(r11)];
+	if(r12 ==0) //_LBB864_65
+{
+	heap32[(r11)] = 1;
+	heap32[(r8)] = 0;
+	r10 = heap32[(r8+3)];
+	r11 = r10 >> 2;
+	r12 = heap32[(r11+2)];
+	heap32[(r8+3)] = r12;
+	r12 = heap32[(r11+2)];
+if(!(r12 ==0)) //_LBB864_67
+{
+	r12 = r12 >> 2;
+	heap32[(r12+1)] = r9;
+}
+	r12 = heap32[(r8+1)];
+	heap32[(r11+1)] = r12;
+	r12 = heap32[(r7+1)];
+	if(r12 !=r9) //_LBB864_69
+{
+	r12 = heap32[(r8+1)];
+	r12 = r12 >> 2;
+	r13 = heap32[(r12+2)];
+	if(r13 !=r9) //_LBB864_71
+{
+	heap32[(r12+3)] = r10;
+}
+else{
+	heap32[(r12+2)] = r10;
+}
+}
+else{
+	heap32[(r7+1)] = r10;
+}
+	heap32[(r11+2)] = r9;
+	heap32[(r8+1)] = r10;
+	r10 = heap32[(r8+3)];
+}
+	r11 = r10 >> 2;
+	r12 = heap32[(r11+2)];
+if(!(r12 ==0)) //_LBB864_75
+{
+	r12 = r12 >> 2;
+	r13 = heap32[(r12)];
+	if(r13 !=1) //_LBB864_80
+{
+__label__ = 68;
+break _77;
+}
+}
+	r12 = heap32[(r11+3)];
+if(!(r12 ==0)) //_LBB864_78
+{
+	r12 = r12 >> 2;
+	r12 = heap32[(r12)];
+if(!(r12 ==1)) //_LBB864_78
+{
+__label__ = 78;
+break _77;
+}
+}
+	heap32[(r11)] = 0;
+}
+	r10 = heap32[(r8+1)];
+	r5 = r9;
+	r9 = r10;
+}
+}
+_125: do {
+switch(__label__ ){//multiple entries
+case 102:
+	r1 = heap32[(r11+2)];
+if(!(r1 ==0)) //_LBB864_118
+{
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	if(r1 !=1) //_LBB864_114
+{
+__label__ = 112;
+break _125;
+}
+}
+	heap32[(r12)] = 1;
+	r1 = heap32[(r11+3)];
+	r12 = r1 >> 2;
+	heap32[(r11)] = 0;
+	r13 = heap32[(r12+2)];
+	heap32[(r11+3)] = r13;
+	r13 = heap32[(r12+2)];
+if(!(r13 ==0)) //_LBB864_120
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r10;
+}
+	r13 = heap32[(r11+1)];
+	heap32[(r12+1)] = r13;
+	r13 = heap32[(r7+1)];
+	if(r13 !=r10) //_LBB864_122
+{
+	r13 = heap32[(r11+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+2)];
+	if(r14 !=r10) //_LBB864_124
+{
+	heap32[(r13+3)] = r1;
+}
+else{
+	heap32[(r13+2)] = r1;
+}
+}
+else{
+	heap32[(r7+1)] = r1;
+}
+	heap32[(r12+2)] = r10;
+	heap32[(r11+1)] = r1;
+	r10 = heap32[(r8+2)];
+__label__ = 112;
+break _125;
+break;
+case 68:
+	r1 = heap32[(r11+3)];
+if(!(r1 ==0)) //_LBB864_82
+{
+	r1 = r1 >> 2;
+	r1 = heap32[(r1)];
+	if(r1 !=1) //_LBB864_77
+{
+__label__ = 78;
+break _125;
+}
+}
+	heap32[(r12)] = 1;
+	r1 = heap32[(r11+2)];
+	r12 = r1 >> 2;
+	heap32[(r11)] = 0;
+	r13 = heap32[(r12+3)];
+	heap32[(r11+2)] = r13;
+	r13 = heap32[(r12+3)];
+if(!(r13 ==0)) //_LBB864_84
+{
+	r13 = r13 >> 2;
+	heap32[(r13+1)] = r10;
+}
+	r13 = heap32[(r11+1)];
+	heap32[(r12+1)] = r13;
+	r13 = heap32[(r7+1)];
+	if(r13 !=r10) //_LBB864_86
+{
+	r13 = heap32[(r11+1)];
+	r13 = r13 >> 2;
+	r14 = heap32[(r13+3)];
+	if(r14 !=r10) //_LBB864_88
+{
+	heap32[(r13+2)] = r1;
+}
+else{
+	heap32[(r13+3)] = r1;
+}
+}
+else{
+	heap32[(r7+1)] = r1;
+}
+	heap32[(r12+3)] = r10;
+	heap32[(r11+1)] = r1;
+	r10 = heap32[(r8+3)];
+__label__ = 78;
+break;
+}
+} while(0);
+_154: do {
+switch(__label__ ){//multiple entries
+case 112:
+	r1 = r10 >> 2;
+	r10 = heap32[(r8)];
+	heap32[(r1)] = r10;
+	heap32[(r8)] = 1;
+	r1 = heap32[(r1+2)];
+if(!(r1 ==0)) //_LBB864_128
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 1;
+}
+	r1 = heap32[(r8+2)];
+	r10 = r1 >> 2;
+	r11 = heap32[(r10+3)];
+	heap32[(r8+2)] = r11;
+	r11 = heap32[(r10+3)];
+if(!(r11 ==0)) //_LBB864_130
+{
+	r11 = r11 >> 2;
+	heap32[(r11+1)] = r9;
+}
+	r11 = heap32[(r8+1)];
+	heap32[(r10+1)] = r11;
+	r11 = heap32[(r7+1)];
+	if(r11 !=r9) //_LBB864_132
+{
+	r7 = heap32[(r8+1)];
+	r7 = r7 >> 2;
+	r11 = heap32[(r7+3)];
+	if(r11 !=r9) //_LBB864_134
+{
+	heap32[(r7+2)] = r1;
+}
+else{
+	heap32[(r7+3)] = r1;
+}
+}
+else{
+	heap32[(r7+1)] = r1;
+}
+	heap32[(r10+3)] = r9;
+	heap32[(r8+1)] = r1;
+__label__ = 125;
+break _154;
+break;
+case 78:
+	r1 = r10 >> 2;
+	r10 = heap32[(r8)];
+	heap32[(r1)] = r10;
+	heap32[(r8)] = 1;
+	r1 = heap32[(r1+3)];
+if(!(r1 ==0)) //_LBB864_92
+{
+	r1 = r1 >> 2;
+	heap32[(r1)] = 1;
+}
+	r1 = heap32[(r8+3)];
+	r10 = r1 >> 2;
+	r11 = heap32[(r10+2)];
+	heap32[(r8+3)] = r11;
+	r11 = heap32[(r10+2)];
+if(!(r11 ==0)) //_LBB864_94
+{
+	r11 = r11 >> 2;
+	heap32[(r11+1)] = r9;
+}
+	r11 = heap32[(r8+1)];
+	heap32[(r10+1)] = r11;
+	r11 = heap32[(r7+1)];
+	if(r11 !=r9) //_LBB864_96
+{
+	r7 = heap32[(r8+1)];
+	r7 = r7 >> 2;
+	r11 = heap32[(r7+2)];
+	if(r11 !=r9) //_LBB864_98
+{
+	heap32[(r7+3)] = r1;
+}
+else{
+	heap32[(r7+2)] = r1;
+}
+}
+else{
+	heap32[(r7+1)] = r1;
+}
+	heap32[(r10+2)] = r9;
+	heap32[(r8+1)] = r1;
+__label__ = 125;
+break;
+}
+} while(0);
+if (__label__ == 125){
+	if(r5 ==0) //_LBB864_141
+{
+break _76;
+}
+}
+	r1 = r5 >> 2;
+	heap32[(r1)] = 1;
+}
+} while(0);
+	r1 = heap32[(r0+75)];
+	heap32[(r4+3)] = r1;
+	heap32[(r0+75)] = r2;
+	r1 = heap32[(r0+79)];
+	r1 = (r1 + -1)|0;
+	r2 = r3 >> 2;
+	heap32[(r0+79)] = r1;
+	heap32[(r2)] = r6;
+	return;
+}
+else{
+	r0 = r3 >> 2;
+	heap32[(r0)] = r1;
+	return;
+}
+}
+
+function _ZN4__rw9__rb_treeIjSt4pairIKjPN5my_gl12TIndexBufferEENS_11__select1stIS6_jEESt4lessIjESaIS6_EE11_C_get_linkEv(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+	var r5;
+	var r6;
+var __label__ = 0;
+	i7 = sp + -8;var g0 = i7>>2; // save stack
+	r0 = _ZN5my_glL9m_contextE;
+	r0 = r0 >> 2;
+	r1 = heap32[(r0+75)];
+	if(r1 ==0) //_LBB865_2
+{
+	r1 = heap32[(r0+76)];
+	r2 = heap32[(r0+77)];
+	if(r1 !=r2) //_LBB865_11
+{
+	r2 = (r1 + 24)|0;
+	heap32[(r0+76)] = r2;
+}
+else{
+	r1 = heap32[(r0+74)];
+	if(r1 !=0) //_LBB865_5
+{
+	r1 = r1 >> 2;
+	r1 = heap32[(r1+1)];
+}
+else{
+	r1 = 0;
+}
+	heap32[(g0)] = 12;
+	_Znwj(i7);
+	r2 = r_g0;
+if(!(r2 !=0)) //_LBB865_8
+{
+	heap32[(g0)] = 3;
+	_ZN4__rw10__rw_throwEiz(i7);
+}
+	r3 = r1 & 1023;
+	r3 = (r3 * 1656)|0;
+	r4 = r1 >>> 10;
+	r3 = r3 >>> 10;
+	r4 = (r4 * 1656)|0;
+	r5 = (r1 + 32)|0;
+	r3 = (r3 + r4)|0;
+	r3 = uint(r5) > uint(r3) ? r5 : r3;
+	r4 = (r1 + 1)|0;
+	r3 = uint(r3) > uint(r1) ? r3 : r4;
+	r4 = (r3 * 24)|0;
+	heap32[(g0)] = r4;
+	_Znwj(i7);
+	r1 = r_g0;
+if(!(r1 !=0)) //_LBB865_10
+{
+	heap32[(g0)] = 3;
+	_ZN4__rw10__rw_throwEiz(i7);
+}
+	r5 = r2 >> 2;
+	heap32[(r5+2)] = r1;
+	r6 = heap32[(r0+74)];
+	heap32[(r5)] = r6;
+	heap32[(r5+1)] = r3;
+	r3 = (r1 + r4)|0;
+	heap32[(r0+74)] = r2;
+	r2 = (r1 + 24)|0;
+	heap32[(r0+77)] = r3;
+	heap32[(r0+76)] = r2;
+}
+}
+else{
+	r2 = r1 >> 2;
+	r2 = heap32[(r2+3)];
+	heap32[(r0+75)] = r2;
+}
+	r0 = r1 >> 2;
+	heap32[(r0+1)] = 0;
+	heap32[(r0+2)] = 0;
+	heap32[(r0+3)] = 0;
+	heap32[(r0)] = 0;
+	r_g0 = r1;
+	return;
+}
+
+function _ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EED2Ev(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+	var r4;
+var __label__ = 0;
+	i7 = sp + -32;var g0 = i7>>2; // save stack
+	r0 = heap32[(fp)];
+	r1 = r0 >> 2;
+	r2 = heap32[(r1+4)];
+if(!(r2 ==0)) //_LBB866_3
+{
+	r3 = r2 >> 2;
+	r3 = heap32[(r3+2)];
+	heap32[(fp+-2)] = r3;
+	r3 = sp + -16;
+	r4 = sp + -8;
+	heap32[(g0)] = r3;
+	heap32[(g0+1)] = r0;
+	heap32[(g0+2)] = r4;
+	heap32[(g0+3)] = r2;
+	_ZN4__rw9__rb_treeISsSt4pairIKSsiENS_11__select1stIS3_SsEESt4lessISsESaIS3_EE5eraseENS_14__rw_tree_iterIS3_iPS3_RS3_NS_17__rw_rb_tree_nodeIS8_S3_SsS5_EEEESF_(i7);
+	r0 = heap32[(r1+4)];
+	r2 = heap32[(r1+1)];
+	r3 = r0 >> 2;
+	heap32[(r3+3)] = r2;
+	heap32[(r1+1)] = r0;
+	r0 = heap32[(r1)];
+if(!(r0 ==0)) //_LBB866_3
+{
+__label__ = 2; //SET chanka
+_3: while(true){
+	r2 = r0 >> 2;
+	r3 = heap32[(r2)];
+	heap32[(r1)] = r3;
+	r2 = heap32[(r2+2)];
+	heap32[(g0)] = r2;
+	_ZdlPv(i7);
+	heap32[(g0)] = r0;
+	_ZdlPv(i7);
+	r0 = heap32[(r1)];
+	if(r0 !=0) //_LBB866_2
+{
+continue _3;
+}
+else{
+break _3;
+}
+}
+}
+}
+	return;
+}
+
+function Mandreel_TextureAsync_Loaded(sp)
+{
+	var i7;
+	var fp = sp>>2;
+	var r0;
+	var r1;
+	var r2;
+	var r3;
+var __label__ = 0;
+	i7 = sp + -40;var g0 = i7>>2; // save stack
+	r0 = 5;
+	r0 = heap32[(r0)];
+	r1 = heap32[(fp)];
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 3553;
+	heap32[(g0+2)] = r1;
+	r2 = 100;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	r0 = heap32[(r2)];
+	r2 = heap32[(fp+1)];
+	r3 = heap32[(fp+2)];
+	heap32[(g0)] = 0;
+	heap32[(g0+1)] = 3553;
+	heap32[(g0+2)] = 0;
+	heap32[(g0+3)] = 6408;
+	heap32[(g0+4)] = r2;
+	heap32[(g0+5)] = r3;
+	heap32[(g0+6)] = 0;
+	heap32[(g0+7)] = 6408;
+	heap32[(g0+8)] = 5121;
+	heap32[(g0+9)] = 0;
+	__FUNCTION_TABLE__[(r0)>>2](i7);
+	heap32[(g0)] = r1;
+	Mandreel_TextureAsync_SetData(i7);
+	return;
+}
+
+var _ZGVZN11btMatrix3x311getIdentityEvE14identityMatrix = Malloc(8);
+var _ZGVZN11btTransform11getIdentityEvE17identityTransform = Malloc(8);
+var Landscape02Vtx = Malloc(23760);
+var _ZTIN16btCollisionWorld17RayResultCallbackE = Malloc(8);
+var _ZTSN16btCollisionWorld17RayResultCallbackE = Malloc(40);
+var _ZTVN16btCollisionWorld24ClosestRayResultCallbackE = Malloc(24);
+var _ZTIN16btCollisionWorld24ClosestRayResultCallbackE = Malloc(12);
+var _ZTSN16btCollisionWorld24ClosestRayResultCallbackE = Malloc(47);
+var _ZTI13btMotionState = Malloc(8);
+var _ZTS13btMotionState = Malloc(16);
+var _ZTV20btDefaultMotionState = Malloc(24);
+var _ZTI20btDefaultMotionState = Malloc(12);
+var _ZTS20btDefaultMotionState = Malloc(23);
+var _ZTI17btTypedConstraint = Malloc(24);
+var _ZTS17btTypedConstraint = Malloc(20);
+var _ZTI13btTypedObject = Malloc(8);
+var _ZTS13btTypedObject = Malloc(16);
+var _ZTV7RagDoll = Malloc(16);
+var _ZTI7RagDoll = Malloc(8);
+var _ZTS7RagDoll = Malloc(9);
+var _ZTV13BenchmarkDemo = Malloc(36);
+var _ZTI13BenchmarkDemo = Malloc(12);
+var _ZTS13BenchmarkDemo = Malloc(16);
+var _ZTI15DemoApplication = Malloc(8);
+var _ZTS15DemoApplication = Malloc(18);
+var _ZL10raycastBar = Malloc(40048);
+var _2E_str3 = Malloc(48);
+var _2E_str4 = Malloc(69);
+var _2E_str5 = Malloc(61);
+var _2E_str6 = Malloc(50);
+var _2E_str7 = Malloc(27);
+var _ZL7TaruVtx = Malloc(516);
+var LandscapeVtx = Malloc(32);
+var Landscape01Vtx = Malloc(24576);
+var Landscape03Vtx = Malloc(24576);
+var Landscape04Vtx = Malloc(25344);
+var Landscape05Vtx = Malloc(26928);
+var Landscape06Vtx = Malloc(27720);
+var Landscape07Vtx = Malloc(26880);
+var Landscape08Vtx = Malloc(26136);
+var LandscapeVtxCount = Malloc(32);
+var LandscapeIdx = Malloc(32);
+var Landscape01Idx = Malloc(23436);
+var Landscape02Idx = Malloc(22620);
+var Landscape03Idx = Malloc(23436);
+var Landscape04Idx = Malloc(24192);
+var Landscape05Idx = Malloc(25740);
+var Landscape06Idx = Malloc(26520);
+var Landscape07Idx = Malloc(25704);
+var Landscape08Idx = Malloc(24960);
+var LandscapeIdxCount = Malloc(32);
+var _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_0_2E_0_2E_0 = Malloc(4);
+var _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_1_2E_0_2E_1 = Malloc(4);
+var _ZZN11btMatrix3x311getIdentityEvE14identityMatrix_2E_0_2E_2_2E_0_2E_2 = Malloc(4);
+var _ZZN11btTransform11getIdentityEvE17identityTransform = Malloc(64);
+var _ZTV14BenchmarkDemo4 = Malloc(36);
+var _ZTI14BenchmarkDemo4 = Malloc(12);
+var _ZTS14BenchmarkDemo4 = Malloc(17);
+var _ZL14benchmarkDemo4 = Malloc(80);
+var _ZTI21btBroadphaseInterface = Malloc(8);
+var _ZTS21btBroadphaseInterface = Malloc(24);
+var _ZTI25btOverlappingPairCallback = Malloc(8);
+var _ZTS25btOverlappingPairCallback = Malloc(28);
+var _ZTI22btOverlappingPairCache = Malloc(12);
+var _ZTS22btOverlappingPairCache = Malloc(25);
+var _ZTV15btNullPairCache = Malloc(76);
+var _ZTI15btNullPairCache = Malloc(12);
+var _ZTS15btNullPairCache = Malloc(18);
+var _2E_str11 = Malloc(36);
+var _2E_str112 = Malloc(67);
+var _2E_str213 = Malloc(18);
+var _2E_str314 = Malloc(18);
+var _ZTV20btAxisSweep3InternalItE = Malloc(64);
+var _ZTI20btAxisSweep3InternalItE = Malloc(12);
+var _ZTS20btAxisSweep3InternalItE = Malloc(26);
+var _ZTV12btAxisSweep3 = Malloc(64);
+var _ZTI12btAxisSweep3 = Malloc(12);
+var _ZTS12btAxisSweep3 = Malloc(15);
+var _ZTV20btCollisionAlgorithm = Malloc(28);
+var _ZTI20btCollisionAlgorithm = Malloc(8);
+var _ZTS20btCollisionAlgorithm = Malloc(23);
+var _ZTIN6btDbvt8ICollideE = Malloc(8);
+var _ZTSN6btDbvt8ICollideE = Malloc(19);
+var _2E_str1118 = Malloc(63);
+var _2E_str22 = Malloc(16);
+var _ZTV18btDbvtTreeCollider = Malloc(36);
+var _ZTI18btDbvtTreeCollider = Malloc(12);
+var _ZTS18btDbvtTreeCollider = Malloc(21);
+var _ZTV19BroadphaseRayTester = Malloc(36);
+var _ZTI19BroadphaseRayTester = Malloc(12);
+var _ZTS19BroadphaseRayTester = Malloc(22);
+var _ZTV20BroadphaseAabbTester = Malloc(36);
+var _ZTI20BroadphaseAabbTester = Malloc(12);
+var _ZTS20BroadphaseAabbTester = Malloc(23);
+var _2E_str18 = Malloc(73);
+var _ZTV16btDbvtBroadphase = Malloc(64);
+var _ZTI16btDbvtBroadphase = Malloc(12);
+var _ZTS16btDbvtBroadphase = Malloc(19);
+var _ZTV12btDispatcher = Malloc(64);
+var _ZTI12btDispatcher = Malloc(8);
+var _ZTS12btDispatcher = Malloc(15);
+var _ZTI21btNodeOverlapCallback = Malloc(8);
+var _ZTS21btNodeOverlapCallback = Malloc(24);
+var _2E_str10 = Malloc(2);
+var _2E_str212 = Malloc(18);
+var _2E_str313 = Malloc(69);
+var _2E_str414 = Malloc(36);
+var _2E_str515 = Malloc(36);
+var _2E_str616 = Malloc(36);
+var _2E_str717 = Malloc(36);
+var _2E_str820 = Malloc(36);
+var _2E_str9 = Malloc(36);
+var gOverlappingPairs = Malloc(4);
+var _ZTI17btOverlapCallback = Malloc(8);
+var _ZTS17btOverlapCallback = Malloc(20);
+var _ZTVZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback = Malloc(20);
+var _ZTIZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback = Malloc(12);
+var _ZTSZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback = Malloc(110);
+var _ZTVZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback = Malloc(20);
+var _ZTIZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback = Malloc(12);
+var _ZTSZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback = Malloc(129);
+var gRemovePairs = Malloc(4);
+var _ZTV28btHashedOverlappingPairCache = Malloc(76);
+var _ZTI28btHashedOverlappingPairCache = Malloc(12);
+var _ZTS28btHashedOverlappingPairCache = Malloc(31);
+var _2E_str121 = Malloc(79);
+var gAddedPairs = Malloc(4);
+var _2E_str222 = Malloc(38);
+var _2E_str323 = Malloc(77);
+var _2E_str424 = Malloc(38);
+var _2E_str525 = Malloc(38);
+var _2E_str626 = Malloc(42);
+var _2E_str727 = Malloc(22);
+var gFindPairs = Malloc(4);
+var _2E_str32 = Malloc(23);
+var _2E_str133 = Malloc(23);
+var _2E_str234 = Malloc(21);
+var _2E_str335 = Malloc(24);
+var _ZTV14btQuantizedBvh = Malloc(36);
+var _ZTI14btQuantizedBvh = Malloc(8);
+var _ZTS14btQuantizedBvh = Malloc(17);
+var _2E_str537 = Malloc(71);
+var _2E_str638 = Malloc(48);
+var _2E_str739 = Malloc(13);
+var _2E_str941 = Malloc(14);
+var _2E_str1143 = Malloc(29);
+var maxIterations = Malloc(4);
+var _2E_str1844 = Malloc(19);
+var _2E_str1921 = Malloc(32);
+var _2E_str21 = Malloc(7);
+var _2E_str2246 = Malloc(13);
+var _ZTV30btActivatingCollisionAlgorithm = Malloc(28);
+var _ZTI30btActivatingCollisionAlgorithm = Malloc(12);
+var _ZTS30btActivatingCollisionAlgorithm = Malloc(33);
+var _2E_str59 = Malloc(14);
+var _2E_str160 = Malloc(69);
+var _ZTV26btBoxBoxCollisionAlgorithm = Malloc(28);
+var _ZTI26btBoxBoxCollisionAlgorithm = Malloc(12);
+var _ZTS26btBoxBoxCollisionAlgorithm = Malloc(29);
+var _ZTI36btDiscreteCollisionDetectorInterface = Malloc(8);
+var _ZTS36btDiscreteCollisionDetectorInterface = Malloc(39);
+var _ZTV16btBoxBoxDetector = Malloc(20);
+var _ZTI16btBoxBoxDetector = Malloc(12);
+var _ZTS16btBoxBoxDetector = Malloc(19);
+var _2E_str65 = Malloc(12);
+var _2E_str166 = Malloc(71);
+var gNumManifold = Malloc(4);
+var _ZTIN36btDiscreteCollisionDetectorInterface6ResultE = Malloc(8);
+var _ZTSN36btDiscreteCollisionDetectorInterface6ResultE = Malloc(48);
+var _ZTV23btCollisionPairCallback = Malloc(20);
+var _ZTI23btCollisionPairCallback = Malloc(12);
+var _ZTS23btCollisionPairCallback = Malloc(26);
+var _2E_str169 = Malloc(45);
+var _2E_str270 = Malloc(26);
+var _2E_str371 = Malloc(14);
+var _2E_str472 = Malloc(34);
+var _2E_str573 = Malloc(76);
+var _ZTV21btCollisionDispatcher = Malloc(64);
+var _ZTI21btCollisionDispatcher = Malloc(12);
+var _ZTS21btCollisionDispatcher = Malloc(24);
+var _2E_str674 = Malloc(23);
+var _2E_str775 = Malloc(6);
+var _2E_str876 = Malloc(6);
+var _2E_str977 = Malloc(73);
+var _ZTV17btCollisionObject = Malloc(36);
+var _ZTI17btCollisionObject = Malloc(8);
+var _ZTS17btCollisionObject = Malloc(20);
+var _2E_str78 = Malloc(27);
+var _ZTIN16btCollisionWorld20ConvexResultCallbackE = Malloc(8);
+var _ZTSN16btCollisionWorld20ConvexResultCallbackE = Malloc(43);
+var _ZTI30btConvexPenetrationDepthSolver = Malloc(8);
+var _ZTS30btConvexPenetrationDepthSolver = Malloc(33);
+var _ZTVN12btConvexCast10CastResultE = Malloc(24);
+var _ZTIN12btConvexCast10CastResultE = Malloc(8);
+var _ZTSN12btConvexCast10CastResultE = Malloc(29);
+var _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2 = Malloc(24);
+var _ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2 = Malloc(12);
+var _ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2 = Malloc(140);
+var _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder = Malloc(24);
+var _ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder = Malloc(12);
+var _ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder = Malloc(164);
+var _ZTI24btBroadphaseAabbCallback = Malloc(8);
+var _ZTS24btBroadphaseAabbCallback = Malloc(27);
+var _ZTI23btBroadphaseRayCallback = Malloc(12);
+var _ZTS23btBroadphaseRayCallback = Malloc(26);
+var _ZTV17DebugDrawcallback = Malloc(44);
+var _ZTI17DebugDrawcallback = Malloc(32);
+var _ZTS17DebugDrawcallback = Malloc(20);
+var _ZTI18btTriangleCallback = Malloc(8);
+var _ZTS18btTriangleCallback = Malloc(21);
+var _ZTI31btInternalTriangleIndexCallback = Malloc(8);
+var _ZTS31btInternalTriangleIndexCallback = Malloc(34);
+var _ZTV16btCollisionWorld = Malloc(56);
+var _ZTI16btCollisionWorld = Malloc(8);
+var _ZTS16btCollisionWorld = Malloc(19);
+var _ZTI16btManifoldResult = Malloc(12);
+var _ZTS16btManifoldResult = Malloc(19);
+var _ZTV21btSingleSweepCallback = Malloc(20);
+var _ZTI21btSingleSweepCallback = Malloc(12);
+var _ZTS21btSingleSweepCallback = Malloc(24);
+var _ZTV19btSingleRayCallback = Malloc(20);
+var _ZTI19btSingleRayCallback = Malloc(12);
+var _ZTS19btSingleRayCallback = Malloc(22);
+var _2E_str382 = Malloc(23);
+var _2E_str483 = Malloc(76);
+var _2E_str584 = Malloc(19);
+var _2E_str685 = Malloc(42);
+var _2E_str786 = Malloc(16);
+var _2E_str887 = Malloc(71);
+var _2E_str988 = Malloc(82);
+var _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0 = Malloc(24);
+var _ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0 = Malloc(12);
+var _ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0 = Malloc(184);
+var _ZTI28btTriangleConvexcastCallback = Malloc(12);
+var _ZTS28btTriangleConvexcastCallback = Malloc(31);
+var _ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback = Malloc(24);
+var _ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback = Malloc(12);
+var _ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback = Malloc(182);
+var _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0 = Malloc(24);
+var _ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0 = Malloc(12);
+var _ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0 = Malloc(156);
+var _ZTI25btTriangleRaycastCallback = Malloc(12);
+var _ZTS25btTriangleRaycastCallback = Malloc(28);
+var _ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback = Malloc(24);
+var _ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback = Malloc(12);
+var _ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback = Malloc(154);
+var _2E_str1089 = Malloc(16);
+var _2E_str1190 = Malloc(34);
+var _2E_str1291 = Malloc(26);
+var _2E_str1392 = Malloc(26);
+var _2E_str1493 = Malloc(20);
+var _ZZN16btCollisionWorld16updateSingleAabbEP17btCollisionObjectE8reportMe_2E_b = Malloc(1);
+var _2E_str1594 = Malloc(49);
+var _2E_str1695 = Malloc(68);
+var _2E_str1796 = Malloc(65);
+var _2E_str1897 = Malloc(9);
+var _2E_str1998 = Malloc(12);
+var _ZTV22btCompoundLeafCallback = Malloc(36);
+var _ZTI22btCompoundLeafCallback = Malloc(12);
+var _ZTS22btCompoundLeafCallback = Malloc(25);
+var _2E_str99 = Malloc(42);
+var _2E_str1100 = Malloc(83);
+var _2E_str2101 = Malloc(43);
+var _2E_str3102 = Malloc(41);
+var _2E_str4103 = Malloc(43);
+var _2E_str5104 = Malloc(43);
+var _2E_str6105 = Malloc(9);
+var _2E_str7106 = Malloc(41);
+var _ZTV28btCompoundCollisionAlgorithm = Malloc(28);
+var _ZTI28btCompoundCollisionAlgorithm = Malloc(12);
+var _ZTS28btCompoundCollisionAlgorithm = Malloc(31);
+var _2E_str109 = Malloc(9);
+var _ZTV24btConvexTriangleCallback = Malloc(20);
+var _ZTI24btConvexTriangleCallback = Malloc(12);
+var _ZTS24btConvexTriangleCallback = Malloc(27);
+var _ZTVZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback = Malloc(20);
+var _ZTIZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback = Malloc(12);
+var _ZTSZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback = Malloc(158);
+var _ZTV15btTriangleShape = Malloc(124);
+var _ZTI15btTriangleShape = Malloc(12);
+var _ZTS15btTriangleShape = Malloc(18);
+var _ZTI23btPolyhedralConvexShape = Malloc(12);
+var _ZTS23btPolyhedralConvexShape = Malloc(26);
+var _ZTI21btConvexInternalShape = Malloc(12);
+var _ZTS21btConvexInternalShape = Malloc(24);
+var _ZTI13btConvexShape = Malloc(12);
+var _ZTS13btConvexShape = Malloc(16);
+var _ZTI16btCollisionShape = Malloc(8);
+var _ZTS16btCollisionShape = Malloc(19);
+var _2E_str1110 = Malloc(26);
+var _2E_str3112 = Malloc(66);
+var _ZTV33btConvexConcaveCollisionAlgorithm = Malloc(28);
+var _ZTI33btConvexConcaveCollisionAlgorithm = Malloc(12);
+var _ZTS33btConvexConcaveCollisionAlgorithm = Malloc(36);
+var _ZTI30btCollisionAlgorithmCreateFunc = Malloc(8);
+var _ZTS30btCollisionAlgorithmCreateFunc = Malloc(33);
+var _ZTVN23btConvexConvexAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN23btConvexConvexAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN23btConvexConvexAlgorithm10CreateFuncE = Malloc(40);
+var _ZTV24btPerturbedContactResult = Malloc(28);
+var _ZTI24btPerturbedContactResult = Malloc(12);
+var _ZTS24btPerturbedContactResult = Malloc(27);
+var _2E_str115 = Malloc(19);
+var _2E_str4119 = Malloc(49);
+var _2E_str5120 = Malloc(78);
+var _ZTV23btConvexConvexAlgorithm = Malloc(28);
+var _ZTI23btConvexConvexAlgorithm = Malloc(12);
+var _ZTS23btConvexConvexAlgorithm = Malloc(26);
+var _ZTV31btConvexPlaneCollisionAlgorithm = Malloc(28);
+var _ZTI31btConvexPlaneCollisionAlgorithm = Malloc(12);
+var _ZTS31btConvexPlaneCollisionAlgorithm = Malloc(34);
+var _ZTVN31btConvexPlaneCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN31btConvexPlaneCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN31btConvexPlaneCollisionAlgorithm10CreateFuncE = Malloc(48);
+var _ZTI24btCollisionConfiguration = Malloc(8);
+var _ZTS24btCollisionConfiguration = Malloc(27);
+var _ZTVN33btConvexConcaveCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN33btConvexConcaveCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN33btConvexConcaveCollisionAlgorithm10CreateFuncE = Malloc(50);
+var _ZTVN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE = Malloc(20);
+var _ZTIN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE = Malloc(12);
+var _ZTSN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE = Malloc(57);
+var _ZTVN28btCompoundCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN28btCompoundCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN28btCompoundCollisionAlgorithm10CreateFuncE = Malloc(45);
+var _ZTVN28btCompoundCollisionAlgorithm17SwappedCreateFuncE = Malloc(20);
+var _ZTIN28btCompoundCollisionAlgorithm17SwappedCreateFuncE = Malloc(12);
+var _ZTSN28btCompoundCollisionAlgorithm17SwappedCreateFuncE = Malloc(52);
+var _ZTVN16btEmptyAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN16btEmptyAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN16btEmptyAlgorithm10CreateFuncE = Malloc(33);
+var _ZTVN32btSphereSphereCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN32btSphereSphereCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN32btSphereSphereCollisionAlgorithm10CreateFuncE = Malloc(49);
+var _ZTVN34btSphereTriangleCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN34btSphereTriangleCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN34btSphereTriangleCollisionAlgorithm10CreateFuncE = Malloc(51);
+var _ZTVN26btBoxBoxCollisionAlgorithm10CreateFuncE = Malloc(20);
+var _ZTIN26btBoxBoxCollisionAlgorithm10CreateFuncE = Malloc(12);
+var _ZTSN26btBoxBoxCollisionAlgorithm10CreateFuncE = Malloc(43);
+var _2E_str128 = Malloc(12);
+var _2E_str1129 = Malloc(42);
+var _ZTV31btDefaultCollisionConfiguration = Malloc(36);
+var _ZTI31btDefaultCollisionConfiguration = Malloc(12);
+var _ZTS31btDefaultCollisionConfiguration = Malloc(34);
+var _ZTV16btEmptyAlgorithm = Malloc(28);
+var _ZTI16btEmptyAlgorithm = Malloc(12);
+var _ZTS16btEmptyAlgorithm = Malloc(19);
+var _ZTV16btManifoldResult = Malloc(28);
+var _2E_str2149 = Malloc(31);
+var _2E_str3150 = Malloc(12);
+var _2E_str5152 = Malloc(71);
+var _2E_str155 = Malloc(28);
+var _2E_str1156 = Malloc(73);
+var _2E_str2157 = Malloc(80);
+var _2E_str3158 = Malloc(15);
+var _ZTV25btSimulationIslandManager = Malloc(24);
+var _ZTI25btSimulationIslandManager = Malloc(8);
+var _ZTS25btSimulationIslandManager = Malloc(28);
+var _ZTV32btSphereSphereCollisionAlgorithm = Malloc(28);
+var _ZTI32btSphereSphereCollisionAlgorithm = Malloc(12);
+var _ZTS32btSphereSphereCollisionAlgorithm = Malloc(35);
+var _ZTV34btSphereTriangleCollisionAlgorithm = Malloc(28);
+var _ZTI34btSphereTriangleCollisionAlgorithm = Malloc(12);
+var _ZTS34btSphereTriangleCollisionAlgorithm = Malloc(37);
+var _ZTV22SphereTriangleDetector = Malloc(20);
+var _ZTI22SphereTriangleDetector = Malloc(12);
+var _ZTS22SphereTriangleDetector = Malloc(25);
+var _2E_str173 = Malloc(4);
+var _2E_str2175 = Malloc(61);
+var _ZTV10btBoxShape = Malloc(124);
+var _ZTI10btBoxShape = Malloc(12);
+var _ZTS10btBoxShape = Malloc(13);
+var _2E_str181 = Malloc(16);
+var _ZTVZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(20);
+var _ZTIZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(12);
+var _ZTSZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(104);
+var _ZTVZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback = Malloc(20);
+var _ZTIZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback = Malloc(12);
+var _ZTSZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback = Malloc(113);
+var _ZTVZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(20);
+var _ZTIZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(12);
+var _ZTSZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback = Malloc(110);
+var _2E_str5186 = Malloc(70);
+var _2E_str6187 = Malloc(49);
+var _2E_str7188 = Malloc(75);
+var _2E_str8189 = Malloc(24);
+var _ZTV22btBvhTriangleMeshShape = Malloc(88);
+var _ZTI22btBvhTriangleMeshShape = Malloc(12);
+var _ZTS22btBvhTriangleMeshShape = Malloc(25);
+var _ZTI19btTriangleMeshShape = Malloc(12);
+var _ZTS19btTriangleMeshShape = Malloc(22);
+var _ZTI14btConcaveShape = Malloc(12);
+var _ZTS14btConcaveShape = Malloc(17);
+var _2E_str194 = Malloc(13);
+var _2E_str4198 = Malloc(72);
+var _2E_str6199 = Malloc(19);
+var _ZTV14btCapsuleShape = Malloc(92);
+var _ZTI14btCapsuleShape = Malloc(12);
+var _ZTS14btCapsuleShape = Malloc(17);
+var _2E_str200 = Malloc(21);
+var _ZTV14btConcaveShape = Malloc(72);
+var _2E_str219 = Malloc(7);
+var _2E_str3222 = Malloc(70);
+var _ZTV17btConvexHullShape = Malloc(120);
+var _ZTI17btConvexHullShape = Malloc(12);
+var _ZTS17btConvexHullShape = Malloc(20);
+var _ZTI34btPolyhedralConvexAabbCachingShape = Malloc(12);
+var _ZTS34btPolyhedralConvexAabbCachingShape = Malloc(37);
+var _2E_str5223 = Malloc(19);
+var _2E_str6224 = Malloc(22);
+var _2E_str6232 = Malloc(19);
+var _ZTV13btConvexShape = Malloc(92);
+var _2E_str6249 = Malloc(13);
+var _2E_str7250 = Malloc(66);
+var _ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback = Malloc(20);
+var _ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback = Malloc(12);
+var _ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback = Malloc(91);
+var _ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback = Malloc(20);
+var _ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback = Malloc(12);
+var _ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback = Malloc(100);
+var _2E_str10306 = Malloc(67);
+var _2E_str18314 = Malloc(36);
+var _2E_str19315 = Malloc(48);
+var _2E_str20316 = Malloc(17);
+var _ZTV14btOptimizedBvh = Malloc(40);
+var _ZTI14btOptimizedBvh = Malloc(12);
+var _ZTS14btOptimizedBvh = Malloc(17);
+var _2E_str7331 = Malloc(74);
+var _ZGVZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEvE11_directions = Malloc(8);
+var _ZZN34btPolyhedralConvexAabbCachingShape15recalcLocalAabbEvE11_directions = Malloc(96);
+var _2E_str342 = Malloc(7);
+var _ZTV13btSphereShape = Malloc(92);
+var _ZTI13btSphereShape = Malloc(12);
+var _ZTS13btSphereShape = Malloc(16);
+var _2E_str349 = Malloc(15);
+var _2E_str1350 = Malloc(27);
+var _2E_str3352 = Malloc(76);
+var _2E_str5354 = Malloc(20);
+var _2E_str6355 = Malloc(44);
+var _2E_str7356 = Malloc(15);
+var _2E_str8357 = Malloc(28);
+var _2E_str9358 = Malloc(61);
+var _ZTV23btStridingMeshInterface = Malloc(68);
+var _ZTI23btStridingMeshInterface = Malloc(8);
+var _ZTS23btStridingMeshInterface = Malloc(26);
+var _ZTV31btInternalTriangleIndexCallback = Malloc(20);
+var _ZTV18btTriangleCallback = Malloc(20);
+var _2E_str367 = Malloc(26);
+var _2E_str1368 = Malloc(79);
+var _ZTV26btTriangleIndexVertexArray = Malloc(68);
+var _ZTI26btTriangleIndexVertexArray = Malloc(12);
+var _ZTS26btTriangleIndexVertexArray = Malloc(29);
+var _2E_str372 = Malloc(13);
+var _ZTV21SupportVertexCallback = Malloc(20);
+var _ZTI21SupportVertexCallback = Malloc(12);
+var _ZTS21SupportVertexCallback = Malloc(24);
+var _ZTVZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback = Malloc(20);
+var _ZTIZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback = Malloc(12);
+var _ZTSZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback = Malloc(102);
+var _2E_str3375 = Malloc(72);
+var _ZTV19btTriangleMeshShape = Malloc(80);
+var _ZTV16btPointCollector = Malloc(28);
+var _ZTI16btPointCollector = Malloc(12);
+var _ZTS16btPointCollector = Malloc(19);
+var _ZTV27btContinuousConvexCollision = Malloc(20);
+var _ZTI27btContinuousConvexCollision = Malloc(12);
+var _ZTS27btContinuousConvexCollision = Malloc(30);
+var _ZTI12btConvexCast = Malloc(8);
+var _ZTS12btConvexCast = Malloc(15);
+var _ZTV12btConvexCast = Malloc(20);
+var _ZTV15btGjkConvexCast = Malloc(20);
+var _ZTI15btGjkConvexCast = Malloc(12);
+var _ZTS15btGjkConvexCast = Malloc(18);
+var _ZZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRjE4imd3 = Malloc(12);
+var _ZZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonEE4i2m3 = Malloc(12);
+var _ZTV30btGjkEpaPenetrationDepthSolver = Malloc(20);
+var _ZTI30btGjkEpaPenetrationDepthSolver = Malloc(12);
+var _ZTS30btGjkEpaPenetrationDepthSolver = Malloc(33);
+var gNumDeepPenetrationChecks = Malloc(4);
+var _ZTV17btGjkPairDetector = Malloc(20);
+var _ZTI17btGjkPairDetector = Malloc(12);
+var _ZTS17btGjkPairDetector = Malloc(20);
+var gNumGjkChecks = Malloc(4);
+var _2E_str425 = Malloc(39);
+var _2E_str1426 = Malloc(71);
+var _2E_str2427 = Malloc(18);
+var _2E_str3428 = Malloc(75);
+var gContactBreakingThreshold = Malloc(4);
+var _2E_str434 = Malloc(52);
+var _2E_str3437 = Malloc(78);
+var _2E_str4438 = Malloc(50);
+var _ZTV28btTriangleConvexcastCallback = Malloc(24);
+var _ZTV22btSubsimplexConvexCast = Malloc(20);
+var _ZTI22btSubsimplexConvexCast = Malloc(12);
+var _ZTS22btSubsimplexConvexCast = Malloc(25);
+var _2E_str457 = Malloc(16);
+var _2E_str1458 = Malloc(80);
+var _ZTVN16btCollisionWorld27ClosestConvexResultCallbackE = Malloc(24);
+var _ZTIN16btCollisionWorld27ClosestConvexResultCallbackE = Malloc(12);
+var _ZTSN16btCollisionWorld27ClosestConvexResultCallbackE = Malloc(50);
+var _2E_str36 = Malloc(51);
+var _2E_str239 = Malloc(26);
+var _ZTV21btConeTwistConstraint = Malloc(52);
+var _ZTI21btConeTwistConstraint = Malloc(12);
+var _ZTS21btConeTwistConstraint = Malloc(24);
+var _2E_str1340 = Malloc(37);
+var _2E_str24 = Malloc(74);
+var _2E_str442 = Malloc(37);
+var _2E_str543 = Malloc(37);
+var _2E_str846 = Malloc(24);
+var _2E_str947 = Malloc(66);
+var _2E_str1149 = Malloc(30);
+var _2E_str29 = Malloc(27);
+var _ZTV17btHingeConstraint = Malloc(52);
+var _ZTI17btHingeConstraint = Malloc(12);
+var _ZTS17btHingeConstraint = Malloc(20);
+var _2E_str130 = Malloc(34);
+var _2E_str231 = Malloc(70);
+var _2E_str332 = Malloc(34);
+var _2E_str433 = Malloc(34);
+var gNumSplitImpulseRecoveries = Malloc(4);
+var _ZTI18btConstraintSolver = Malloc(8);
+var _ZTS18btConstraintSolver = Malloc(21);
+var _ZTV35btSequentialImpulseConstraintSolver = Malloc(48);
+var _ZTI35btSequentialImpulseConstraintSolver = Malloc(12);
+var _ZTS35btSequentialImpulseConstraintSolver = Malloc(38);
+var _ZGVZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed = Malloc(8);
+var _ZZN35btSequentialImpulseConstraintSolver12getFixedBodyEvE7s_fixed = Malloc(608);
+var _2E_str248 = Malloc(27);
+var _2E_str34955 = Malloc(54);
+var _2E_str450 = Malloc(11);
+var _2E_str551 = Malloc(7);
+var _2E_str652 = Malloc(88);
+var _2E_str753 = Malloc(10);
+var _2E_str854 = Malloc(34);
+var _2E_str955 = Malloc(3);
+var _2E_str1056 = Malloc(29);
+var _2E_str1157 = Malloc(24);
+var _2E_str76 = Malloc(22);
+var _ZTI23btDiscreteDynamicsWorld = Malloc(12);
+var _ZTS23btDiscreteDynamicsWorld = Malloc(26);
+var _ZTI15btDynamicsWorld = Malloc(12);
+var _ZTS15btDynamicsWorld = Malloc(18);
+var _ZTIN25btSimulationIslandManager14IslandCallbackE = Malloc(8);
+var _ZTSN25btSimulationIslandManager14IslandCallbackE = Malloc(46);
+var _ZTV34btClosestNotMeConvexResultCallback = Malloc(24);
+var _ZTI34btClosestNotMeConvexResultCallback = Malloc(12);
+var _ZTS34btClosestNotMeConvexResultCallback = Malloc(37);
+var _ZTVZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback = Malloc(20);
+var _ZTIZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback = Malloc(12);
+var _ZTSZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback = Malloc(99);
+var _2E_str87 = Malloc(26);
+var _2E_str188 = Malloc(27);
+var _2E_str289 = Malloc(14);
+var _2E_str794 = Malloc(20);
+var _2E_str895 = Malloc(20);
+var gNumClampedCcdMotions = Malloc(4);
+var _2E_str996 = Malloc(17);
+var _2E_str1097 = Malloc(22);
+var _2E_str1198 = Malloc(29);
+var _2E_str1299 = Malloc(15);
+var _2E_str13100 = Malloc(5);
+var _2E_str1461 = Malloc(68);
+var _2E_str1562 = Malloc(24);
+var _2E_str16101 = Malloc(15);
+var _ZTV15btDynamicsWorld = Malloc(140);
+var _ZTV23btDiscreteDynamicsWorld = Malloc(180);
+var _ZL8uniqueId = Malloc(4);
+var _ZTV11btRigidBody = Malloc(36);
+var _ZTI11btRigidBody = Malloc(12);
+var _ZTS11btRigidBody = Malloc(14);
+var _2E_str4144 = Malloc(21);
+var gDisableDeactivation = Malloc(1);
+var gNumAlignedAllocs = Malloc(4);
+var gNumAlignedFree = Malloc(4);
+var _ZN15CProfileManager12FrameCounterE = Malloc(4);
+var _ZN15CProfileManager4RootE = Malloc(32);
+var _ZL13gProfileClock_2E_0 = Malloc(4);
+var _ZN15CProfileManager11CurrentNodeE = Malloc(4);
+var _2E_str729 = Malloc(5);
+var _ZN4__rwL12__rw_catlistE_2E_0 = Malloc(4);
+var _ZN4__rwL12__rw_catlistE_2E_1 = Malloc(4);
+var _ZN4__rwL12__rw_catlistE_2E_2 = Malloc(4);
+var llvm_2E_eh_2E_catch_2E_all_2E_value = Malloc(4);
+var _ZTIN4__rw10__rw_facetE = Malloc(12);
+var _ZTSN4__rw10__rw_facetE = Malloc(20);
+var _ZTIN4__rw17__rw_synchronizedE = Malloc(8);
+var _ZTSN4__rw17__rw_synchronizedE = Malloc(27);
+var _2E_str4131 = Malloc(10);
+var _2E_str15132 = Malloc(21);
+var _2E_str26 = Malloc(1);
+var _ZN4__rwL13__rw_what_bufE = Malloc(256);
+var _ZN4__rwL16__rw_what_refcntE = Malloc(4);
+var _2E_str3133 = Malloc(16);
+var _2E_str47 = Malloc(25);
+var _2E_str5134 = Malloc(18);
+var _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E7__fname = Malloc(4);
+var _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E6buffer = Malloc(11);
+var _2E_str7136 = Malloc(3);
+var _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E8__catset = Malloc(4);
+var _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E4msgs = Malloc(32);
+var _ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E5__cat = Malloc(4);
+var _ZZN4__rw10__rw_throwEizE6errors = Malloc(100);
+var _2E_str8137 = Malloc(26);
+var _2E_str9138 = Malloc(18);
+var _2E_str10139 = Malloc(29);
+var _2E_str11140 = Malloc(33);
+var _2E_str12141 = Malloc(17);
+var _2E_str138142 = Malloc(20);
+var _2E_str14143 = Malloc(21);
+var _2E_str159144 = Malloc(25);
+var _2E_str16145 = Malloc(51);
+var _2E_str17146 = Malloc(47);
+var _2E_str18147 = Malloc(22);
+var _2E_str19148 = Malloc(44);
+var _2E_str20149 = Malloc(23);
+var _2E_str21150 = Malloc(24);
+var _2E_str22151 = Malloc(39);
+var _2E_str23152 = Malloc(38);
+var _2E_str24153 = Malloc(38);
+var _2E_str25154 = Malloc(29);
+var _2E_str2610 = Malloc(44);
+var _2E_str27 = Malloc(30);
+var _2E_str28155 = Malloc(40);
+var _2E_str29156 = Malloc(26);
+var _2E_str30 = Malloc(27);
+var _2E_str31 = Malloc(30);
+var _2E_str32157 = Malloc(32);
+var _2E_str33 = Malloc(11);
+var _2E_str134 = Malloc(9);
+var _2E_str235 = Malloc(12);
+var _2E_str336 = Malloc(11);
+var _2E_str437 = Malloc(8);
+var _ZTVN4__rw10__rw_facetE = Malloc(16);
+var _2E_str538 = Malloc(2);
+var _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE12n_std_facets = Malloc(4);
+var _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE10std_facets = Malloc(4);
+var _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE13std_facet_buf = Malloc(1664);
+var _ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE17std_facet_bufsize = Malloc(4);
+var _ZZN4__rw10__rw_facetD4EvE9destroyed = Malloc(24);
+var _ZN4__rw9__rw_catsE = Malloc(72);
+var _2E_str785 = Malloc(2);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE6global = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE5ginit = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE9n_locales = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE7locales = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE10locale_buf = Malloc(32);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE14locale_bufsize = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE7classic = Malloc(4);
+var _ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE12classic_body = Malloc(172);
+var _ZN4__rwL22__rw_classic_once_initE_2E_0_2E_b = Malloc(1);
+var _ZN4__rwL12__rw_classicE = Malloc(4);
+var _2E_str292167 = Malloc(4);
+var _2E_str10100175 = Malloc(29);
+var _2E_str12102177 = Malloc(33);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE4init_2E_b = Malloc(1);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs = Malloc(4);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11catalog_buf = Malloc(64);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize = Malloc(4);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE10n_catalogs = Malloc(4);
+var _ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11largest_cat = Malloc(4);
+var _2E_str115180 = Malloc(27);
+var _2E_str1116181 = Malloc(25);
+var _2E_str2131 = Malloc(2);
+var _2E_str4133 = Malloc(2);
+var _ZZN4__rw16__rw_locale_nameEiPKcRNS_14__rw_pod_arrayIcLj256EEEE11locale_root = Malloc(259);
+var _ZNSs11_C_null_refE = Malloc(16);
+var _ZTVSt8messagesIcE = Malloc(28);
+var _ZTISt8messagesIcE = Malloc(32);
+var _ZTSSt8messagesIcE = Malloc(15);
+var _ZTISt13messages_base = Malloc(8);
+var _ZTSSt13messages_base = Malloc(18);
+var _2E_str2360 = Malloc(31);
+var _2E_str3361 = Malloc(48);
+var _2E_str4362 = Malloc(31);
+var _ZTVSt9type_info = Malloc(24);
+var _ZTISt9type_info = Malloc(8);
+var _ZTSSt9type_info = Malloc(13);
+var s_max_memory = Malloc(4);
+var s_current_memory = Malloc(4);
+var block_null = Malloc(16);
+var _2E_str643 = Malloc(57);
+var _2E_str1648 = Malloc(3);
+var _2E_str4651 = Malloc(4);
+var _2E_str5652 = Malloc(4);
+var my_ctype = Malloc(1028);
+var _ZL8nextRand = Malloc(4);
+var _2E_str7654 = Malloc(4);
+var _2E_str9655 = Malloc(4);
+var _ZL8pad_line = Malloc(64);
+var _ZL10strtok_pos = Malloc(4);
+var _ZTI14CFileInterface = Malloc(8);
+var _ZTS14CFileInterface = Malloc(17);
+var _ZTV11CFileSystem = Malloc(44);
+var _ZTI11CFileSystem = Malloc(12);
+var _ZTS11CFileSystem = Malloc(14);
+var _ZL13s_file_stdout = Malloc(4);
+var _ZTV7CFileLS = Malloc(44);
+var _ZTI7CFileLS = Malloc(12);
+var _ZTS7CFileLS = Malloc(9);
+var _ZTV10CFileCloud = Malloc(44);
+var _ZTI10CFileCloud = Malloc(12);
+var _ZTS10CFileCloud = Malloc(13);
+var _ZL10s_aSockets = Malloc(262336);
+var _ZTV11CFileStdout = Malloc(44);
+var _ZTI11CFileStdout = Malloc(12);
+var _ZTS11CFileStdout = Malloc(14);
+var _2E_str31677 = Malloc(4);
+var _2E_str32678 = Malloc(4);
+var _2E_str33679 = Malloc(5);
+var _2E_str34680 = Malloc(8);
+var _2E_str35681 = Malloc(53);
+var _2E_str37683 = Malloc(4);
+var _2E_str38684 = Malloc(7);
+var _ZN12mandreel_b64L9b64_charsE = Malloc(65);
+var _ZN12mandreel_b64L11b64_indexesE = Malloc(256);
+var _ZL25s_mandreel_internal_width = Malloc(4);
+var _ZL26s_mandreel_internal_height = Malloc(4);
+var g_msgcallback = Malloc(4);
+var _ZL24g_pFirstTextureAsyncInfo = Malloc(4);
+var _ZL17g_apPackFileNames = Malloc(1024);
+var _ZGVZ21Mandreel_GetTickCountE7s_first = Malloc(8);
+var _ZZ21Mandreel_GetTickCountE7s_first = Malloc(8);
+var _ZZ29__mandreel_internal_preupdateE8s_bfirst_2E_b = Malloc(1);
+var _2E_str779 = Malloc(13);
+var _2E_str3782 = Malloc(13);
+var _2E_str4783 = Malloc(37);
+var _2E_str5784 = Malloc(12);
+var _2E_str6785 = Malloc(17);
+var _ZZ24__mandreel_internal_initE54s_723478567_mandreel___mandreel_internal_SetResolution = Malloc(4);
+var _ZZ24__mandreel_internal_initE56s_723478567_mandreel_iMandreel_TextureAsync_IsCompressed = Malloc(4);
+var _ZZ24__mandreel_internal_initE57s_723478567_mandreel_iMandreel_TextureAsync_GetPackOffset = Malloc(4);
+var _ZZ24__mandreel_internal_initE29s_723478567_mandreel___resize = Malloc(4);
+var _ZZ24__mandreel_internal_initE48s_723478567_mandreel_imandreel_restore_glcontext = Malloc(4);
+var _ZZ24__mandreel_internal_initE46s_723478567_mandreel_imandreel_viewport_resize = Malloc(4);
+var _ZTVN10__cxxabiv120__si_class_type_infoE = Malloc(40);
+var _ZTIN10__cxxabiv120__si_class_type_infoE = Malloc(12);
+var _ZTSN10__cxxabiv120__si_class_type_infoE = Malloc(37);
+var _ZTIN10__cxxabiv117__class_type_infoE = Malloc(12);
+var _ZTSN10__cxxabiv117__class_type_infoE = Malloc(34);
+var _ZTVN10__cxxabiv117__class_type_infoE = Malloc(40);
+var _ZTVN10__cxxabiv121__vmi_class_type_infoE = Malloc(40);
+var _ZTIN10__cxxabiv121__vmi_class_type_infoE = Malloc(12);
+var _ZTSN10__cxxabiv121__vmi_class_type_infoE = Malloc(38);
+var _ZL11g_aChannels = Malloc(9344);
+var _ZL7g_bInit_2E_b = Malloc(1);
+var _2E_str221 = Malloc(8);
+var _2E_str1222 = Malloc(21);
+var _ZL21g_pFirstSoundDuration = Malloc(4);
+var _2E_str3224 = Malloc(71);
+var _2E_str4225 = Malloc(8);
+var _ZL15g_iFreeChannels = Malloc(4);
+var _ZL15g_aFreeChannels = Malloc(128);
+var _ZL6g_bLog = Malloc(1);
+var _2E_str12233 = Malloc(5);
+var _2E_str22243 = Malloc(21);
+var _2E_str24245 = Malloc(86);
+var _2E_str26247 = Malloc(8);
+var _2E_str27248 = Malloc(4);
+var _2E_str28249 = Malloc(60);
+var _2E_str29250 = Malloc(10);
+var _2E_str30251 = Malloc(3);
+var _2E_str31252 = Malloc(75);
+var _2E_str32253 = Malloc(5);
+var _2E_str33254 = Malloc(4);
+var _2E_str34255 = Malloc(9);
+var _2E_str35256 = Malloc(22);
+var _ZZL32_mandreel_init_tcp_socket_librayvE47s_723478567_mandreel_mandreel_flash_tcp_onError = Malloc(4);
+var _ZL13s_fifo_errors = Malloc(24);
+var _ZN5my_glL9m_contextE = Malloc(324);
+var llvm_2E_global_ctors = Malloc(40);
+var llvm_2E_global_dtors = Malloc(56);
+var llvm_2E_used = Malloc(300);
+function global_init(stackPos)
+{
+initHeap();
+emit_start(Landscape02Vtx)
+emit_32(3279552512);
+emit_32(1077902238);
+emit_32(1122144223);
+emit_32(3279552512);
+emit_32(1074513450);
+emit_32(1122656322);
+emit_32(3279296528);
+emit_32(1070576131);
+emit_32(1122144223);
+emit_32(3279296528);
+emit_32(1069684087);
+emit_32(1122656322);
+emit_32(3279040545);
+emit_32(1062793197);
+emit_32(1122144223);
+emit_32(3279040545);
+emit_32(1059117578);
+emit_32(1122656322);
+emit_32(3278784496);
+emit_32(3207760682);
+emit_32(1122144223);
+emit_32(3278784496);
+emit_32(3205587983);
+emit_32(1122656322);
+emit_32(3278528512);
+emit_32(3223956593);
+emit_32(1122144223);
+emit_32(3278528512);
+emit_32(3221291239);
+emit_32(1122656322);
+emit_32(3278272528);
+emit_32(3228867536);
+emit_32(1122144223);
+emit_32(3278272528);
+emit_32(3227143174);
+emit_32(1122656322);
+emit_32(3278016545);
+emit_32(3229577925);
+emit_32(1122144223);
+emit_32(3278016545);
+emit_32(3228890898);
+emit_32(1122656322);
+emit_32(3277760496);
+emit_32(3232782164);
+emit_32(1122144223);
+emit_32(3277760496);
+emit_32(3231744493);
+emit_32(1122656322);
+emit_32(3277504512);
+emit_32(3233030424);
+emit_32(1122144223);
+emit_32(3277504512);
+emit_32(3231183211);
+emit_32(1122656322);
+emit_32(3277248528);
+emit_32(3231512296);
+emit_32(1122144223);
+emit_32(3277248528);
+emit_32(3226713845);
+emit_32(1122656322);
+emit_32(3276992545);
+emit_32(3225240260);
+emit_32(1122144223);
+emit_32(3276992545);
+emit_32(3222588579);
+emit_32(1122656322);
+emit_32(3276736496);
+emit_32(3223081116);
+emit_32(1122144223);
+emit_32(3276736496);
+emit_32(3218835474);
+emit_32(1122656322);
+emit_32(3276480512);
+emit_32(3217103310);
+emit_32(1122144223);
+emit_32(3276480512);
+emit_32(3214447728);
+emit_32(1122656322);
+emit_32(3276224528);
+emit_32(3188062822);
+emit_32(1122144223);
+emit_32(3276224528);
+emit_32(1046529045);
+emit_32(1122656322);
+emit_32(3275968545);
+emit_32(1065108554);
+emit_32(1122144223);
+emit_32(3275968545);
+emit_32(1070915199);
+emit_32(1122656322);
+emit_32(3275712496);
+emit_32(1078777673);
+emit_32(1122144223);
+emit_32(3275712496);
+emit_32(1082866637);
+emit_32(1122656322);
+emit_32(3275456512);
+emit_32(1083552091);
+emit_32(1122144223);
+emit_32(3275456512);
+emit_32(1087021578);
+emit_32(1122656322);
+emit_32(3275200528);
+emit_32(1086679197);
+emit_32(1122144223);
+emit_32(3275200528);
+emit_32(1090529232);
+emit_32(1122656322);
+emit_32(3274944545);
+emit_32(1090716539);
+emit_32(1122144223);
+emit_32(3274944545);
+emit_32(1092317201);
+emit_32(1122656322);
+emit_32(3274688496);
+emit_32(1091935477);
+emit_32(1122144223);
+emit_32(3274688496);
+emit_32(1093426427);
+emit_32(1122656322);
+emit_32(3274432512);
+emit_32(1092098877);
+emit_32(1122144223);
+emit_32(3274432512);
+emit_32(1094040158);
+emit_32(1122656322);
+emit_32(3274176528);
+emit_32(1094849764);
+emit_32(1122144223);
+emit_32(3274176528);
+emit_32(1095262693);
+emit_32(1122656322);
+emit_32(3273920545);
+emit_32(1097725693);
+emit_32(1122144223);
+emit_32(3273920545);
+emit_32(1097468792);
+emit_32(1122656322);
+emit_32(3273664496);
+emit_32(1099104833);
+emit_32(1122144223);
+emit_32(3273664496);
+emit_32(1099540411);
+emit_32(1122656322);
+emit_32(3273408512);
+emit_32(1100237609);
+emit_32(1122144223);
+emit_32(3273408512);
+emit_32(1100993213);
+emit_32(1122656322);
+emit_32(3273152528);
+emit_32(1102296436);
+emit_32(1122144223);
+emit_32(3273152528);
+emit_32(1102819203);
+emit_32(1122656322);
+emit_32(3272896545);
+emit_32(1104227022);
+emit_32(1122144223);
+emit_32(3272896545);
+emit_32(1104470763);
+emit_32(1122656322);
+emit_32(3272640496);
+emit_32(1105517399);
+emit_32(1122144223);
+emit_32(3272640496);
+emit_32(1105442111);
+emit_32(1122656322);
+emit_32(3272384512);
+emit_32(1106394218);
+emit_32(1122144223);
+emit_32(3272384512);
+emit_32(1106127356);
+emit_32(1122656322);
+emit_32(3272128528);
+emit_32(1107354688);
+emit_32(1122144223);
+emit_32(3272128528);
+emit_32(1106807829);
+emit_32(1122656322);
+emit_32(3271872545);
+emit_32(1107530062);
+emit_32(1122144223);
+emit_32(3271872545);
+emit_32(1107212108);
+emit_32(1122656322);
+emit_32(3271616496);
+emit_32(1107693221);
+emit_32(1122144223);
+emit_32(3271616496);
+emit_32(1107339719);
+emit_32(1122656322);
+emit_32(3271163904);
+emit_32(1108003075);
+emit_32(1122144223);
+emit_32(3271163904);
+emit_32(1108016575);
+emit_32(1122656322);
+emit_32(3270651937);
+emit_32(1108711703);
+emit_32(1122144223);
+emit_32(3270651937);
+emit_32(1108361190);
+emit_32(1122656322);
+emit_32(3270139970);
+emit_32(1108881283);
+emit_32(1122144223);
+emit_32(3270139970);
+emit_32(1108677807);
+emit_32(1122656322);
+emit_32(3269627871);
+emit_32(1108829956);
+emit_32(1122144223);
+emit_32(3269627871);
+emit_32(1108698045);
+emit_32(1122656322);
+emit_32(3269115904);
+emit_32(1108842486);
+emit_32(1122144223);
+emit_32(3269115904);
+emit_32(1108670415);
+emit_32(1122656322);
+emit_32(3268603937);
+emit_32(1108356995);
+emit_32(1122144223);
+emit_32(3268603937);
+emit_32(1108385307);
+emit_32(1122656322);
+emit_32(3268091970);
+emit_32(1107850324);
+emit_32(1122144223);
+emit_32(3268091970);
+emit_32(1107664044);
+emit_32(1122656322);
+emit_32(3267579911);
+emit_32(1107320504);
+emit_32(1122144223);
+emit_32(3267579911);
+emit_32(1106926109);
+emit_32(1122656322);
+emit_32(3267067904);
+emit_32(1106158866);
+emit_32(1122144223);
+emit_32(3267067904);
+emit_32(1105983491);
+emit_32(1122656322);
+emit_32(3266555911);
+emit_32(1106326271);
+emit_32(1122144223);
+emit_32(3266555911);
+emit_32(1105752542);
+emit_32(1122656322);
+emit_32(3266043904);
+emit_32(1105638300);
+emit_32(1122144223);
+emit_32(3266043904);
+emit_32(1105343650);
+emit_32(1122656322);
+emit_32(3265531911);
+emit_32(1104660451);
+emit_32(1122144223);
+emit_32(3265531911);
+emit_32(1104481983);
+emit_32(1122656322);
+emit_32(3265019904);
+emit_32(1103867255);
+emit_32(1122144223);
+emit_32(3265019904);
+emit_32(1103536377);
+emit_32(1122656322);
+emit_32(3264507911);
+emit_32(1102764940);
+emit_32(1122144223);
+emit_32(3264507911);
+emit_32(1102421374);
+emit_32(1122656322);
+emit_32(3263995904);
+emit_32(1101613761);
+emit_32(1122144223);
+emit_32(3263995904);
+emit_32(1101252526);
+emit_32(1122656322);
+emit_32(3263483911);
+emit_32(1100019768);
+emit_32(1122144223);
+emit_32(3263483911);
+emit_32(1099947835);
+emit_32(1122656322);
+emit_32(3262775296);
+emit_32(1099086483);
+emit_32(1122144223);
+emit_32(3262775296);
+emit_32(1099066665);
+emit_32(1122656322);
+emit_32(3261751309);
+emit_32(1097937715);
+emit_32(1122144223);
+emit_32(3261751309);
+emit_32(1097029334);
+emit_32(1122656322);
+emit_32(3260727296);
+emit_32(1097070753);
+emit_32(1122144223);
+emit_32(3260727296);
+emit_32(1095561223);
+emit_32(1122656322);
+emit_32(3259703309);
+emit_32(1096595014);
+emit_32(1122144223);
+emit_32(3259703309);
+emit_32(1095286181);
+emit_32(1122656322);
+emit_32(3258679296);
+emit_32(1095456365);
+emit_32(1122144223);
+emit_32(3258679296);
+emit_32(1094900095);
+emit_32(1122656322);
+emit_32(3257655309);
+emit_32(1093219752);
+emit_32(1122144223);
+emit_32(3257655309);
+emit_32(1093810625);
+emit_32(1122656322);
+emit_32(3256631296);
+emit_32(1092609303);
+emit_32(1122144223);
+emit_32(3256631296);
+emit_32(1093100949);
+emit_32(1122656322);
+emit_32(3255607309);
+emit_32(1093762915);
+emit_32(1122144223);
+emit_32(3255607309);
+emit_32(1093720133);
+emit_32(1122656322);
+emit_32(3254386688);
+emit_32(1094666473);
+emit_32(1122144223);
+emit_32(3254386688);
+emit_32(1094140822);
+emit_32(1122656322);
+emit_32(3252338714);
+emit_32(1094266021);
+emit_32(1122144223);
+emit_32(3252338714);
+emit_32(1093200983);
+emit_32(1122656322);
+emit_32(3250290688);
+emit_32(1093706396);
+emit_32(1122144223);
+emit_32(3250290688);
+emit_32(1093279731);
+emit_32(1122656322);
+emit_32(3248242714);
+emit_32(1095255038);
+emit_32(1122144223);
+emit_32(3248242714);
+emit_32(1095297296);
+emit_32(1122656322);
+emit_32(3245998080);
+emit_32(1096659501);
+emit_32(1122144223);
+emit_32(3245998080);
+emit_32(1096326998);
+emit_32(1122656322);
+emit_32(3241902132);
+emit_32(1097360998);
+emit_32(1122144223);
+emit_32(3241902132);
+emit_32(1097208116);
+emit_32(1122656322);
+emit_32(3237609472);
+emit_32(1097602590);
+emit_32(1122144223);
+emit_32(3237609472);
+emit_32(1098363332);
+emit_32(1122656322);
+emit_32(3229220864);
+emit_32(1098820406);
+emit_32(1122144223);
+emit_32(3229220864);
+emit_32(1098960496);
+emit_32(1122656322);
+emit_32(0);
+emit_32(1099470104);
+emit_32(1122144223);
+emit_32(0);
+emit_32(1099624612);
+emit_32(1122656322);
+emit_32(1081737216);
+emit_32(1100139620);
+emit_32(1122144223);
+emit_32(1081737216);
+emit_32(1100438045);
+emit_32(1122656322);
+emit_32(3279552512);
+emit_32(1083519019);
+emit_32(1121632256);
+emit_32(3279296528);
+emit_32(1074813133);
+emit_32(1121632256);
+emit_32(3279040545);
+emit_32(1064894426);
+emit_32(1121632256);
+emit_32(3278784496);
+emit_32(3220842029);
+emit_32(1121632256);
+emit_32(3278528512);
+emit_32(3224334626);
+emit_32(1121632256);
+emit_32(3278272528);
+emit_32(3228042265);
+emit_32(1121632256);
+emit_32(3278016545);
+emit_32(3230773910);
+emit_32(1121632256);
+emit_32(3277760496);
+emit_32(3234673249);
+emit_32(1121632256);
+emit_32(3277504512);
+emit_32(3235346205);
+emit_32(1121632256);
+emit_32(3277248528);
+emit_32(3233634383);
+emit_32(1121632256);
+emit_32(3276992545);
+emit_32(3231165889);
+emit_32(1121632256);
+emit_32(3276736496);
+emit_32(3226724414);
+emit_32(1121632256);
+emit_32(3276480512);
+emit_32(3221509175);
+emit_32(1121632256);
+emit_32(3276224528);
+emit_32(3212320830);
+emit_32(1121632256);
+emit_32(3275968545);
+emit_32(1049206085);
+emit_32(1121632256);
+emit_32(3275712496);
+emit_32(1073305532);
+emit_32(1121632256);
+emit_32(3275456512);
+emit_32(1077128892);
+emit_32(1121632256);
+emit_32(3275200528);
+emit_32(1082594553);
+emit_32(1121632256);
+emit_32(3274944545);
+emit_32(1084662177);
+emit_32(1121632256);
+emit_32(3274688496);
+emit_32(1089411681);
+emit_32(1121632256);
+emit_32(3274432512);
+emit_32(1092042275);
+emit_32(1121632256);
+emit_32(3274176528);
+emit_32(1095387054);
+emit_32(1121632256);
+emit_32(3273920545);
+emit_32(1097794270);
+emit_32(1121632256);
+emit_32(3273664496);
+emit_32(1099325348);
+emit_32(1121632256);
+emit_32(3273408512);
+emit_32(1100750678);
+emit_32(1121632256);
+emit_32(3273152528);
+emit_32(1101739065);
+emit_32(1121632256);
+emit_32(3272896545);
+emit_32(1103692248);
+emit_32(1121632256);
+emit_32(3272640496);
+emit_32(1105414167);
+emit_32(1121632256);
+emit_32(3272384512);
+emit_32(1106644671);
+emit_32(1121632256);
+emit_32(3272128528);
+emit_32(1107563486);
+emit_32(1121632256);
+emit_32(3271872545);
+emit_32(1107577274);
+emit_32(1121632256);
+emit_32(3271616496);
+emit_32(1107593999);
+emit_32(1121632256);
+emit_32(3271163904);
+emit_32(1108097080);
+emit_32(1121632256);
+emit_32(3270651937);
+emit_32(1108460883);
+emit_32(1121632256);
+emit_32(3270139970);
+emit_32(1108954710);
+emit_32(1121632256);
+emit_32(3269627871);
+emit_32(1109009079);
+emit_32(1121632256);
+emit_32(3269115904);
+emit_32(1108610279);
+emit_32(1121632256);
+emit_32(3268603937);
+emit_32(1108058125);
+emit_32(1121632256);
+emit_32(3268091970);
+emit_32(1107555412);
+emit_32(1121632256);
+emit_32(3267579911);
+emit_32(1106717652);
+emit_32(1121632256);
+emit_32(3267067904);
+emit_32(1106512341);
+emit_32(1121632256);
+emit_32(3266555911);
+emit_32(1106506836);
+emit_32(1121632256);
+emit_32(3266043904);
+emit_32(1105659534);
+emit_32(1121632256);
+emit_32(3265531911);
+emit_32(1105302179);
+emit_32(1121632256);
+emit_32(3265019904);
+emit_32(1104106698);
+emit_32(1121632256);
+emit_32(3264507911);
+emit_32(1102757390);
+emit_32(1121632256);
+emit_32(3263995904);
+emit_32(1101520647);
+emit_32(1121632256);
+emit_32(3263483911);
+emit_32(1100159910);
+emit_32(1121632256);
+emit_32(3262775296);
+emit_32(1099381290);
+emit_32(1121632256);
+emit_32(3261751309);
+emit_32(1098131911);
+emit_32(1121632256);
+emit_32(3260727296);
+emit_32(1097148452);
+emit_32(1121632256);
+emit_32(3259703309);
+emit_32(1096156919);
+emit_32(1121632256);
+emit_32(3258679296);
+emit_32(1095321308);
+emit_32(1121632256);
+emit_32(3257655309);
+emit_32(1094008281);
+emit_32(1121632256);
+emit_32(3256631296);
+emit_32(1093682489);
+emit_32(1121632256);
+emit_32(3255607309);
+emit_32(1094449313);
+emit_32(1121632256);
+emit_32(3254386688);
+emit_32(1095241512);
+emit_32(1121632256);
+emit_32(3252338714);
+emit_32(1095115158);
+emit_32(1121632256);
+emit_32(3250290688);
+emit_32(1095038088);
+emit_32(1121632256);
+emit_32(3248242714);
+emit_32(1095359791);
+emit_32(1121632256);
+emit_32(3245998080);
+emit_32(1096573937);
+emit_32(1121632256);
+emit_32(3241902132);
+emit_32(1097191129);
+emit_32(1121632256);
+emit_32(3237609472);
+emit_32(1097678717);
+emit_32(1121632256);
+emit_32(3229220864);
+emit_32(1098487169);
+emit_32(1121632256);
+emit_32(0);
+emit_32(1099111334);
+emit_32(1121632256);
+emit_32(1081737216);
+emit_32(1099957115);
+emit_32(1121632256);
+emit_32(3279552512);
+emit_32(1084728636);
+emit_32(1121120289);
+emit_32(3279296528);
+emit_32(1077536872);
+emit_32(1121120289);
+emit_32(3279040545);
+emit_32(1049067472);
+emit_32(1121120289);
+emit_32(3278784496);
+emit_32(3197365821);
+emit_32(1121120289);
+emit_32(3278528512);
+emit_32(3211331864);
+emit_32(1121120289);
+emit_32(3278272528);
+emit_32(3222095455);
+emit_32(1121120289);
+emit_32(3278016545);
+emit_32(3228342367);
+emit_32(1121120289);
+emit_32(3277760496);
+emit_32(3232161071);
+emit_32(1121120289);
+emit_32(3277504512);
+emit_32(3233959337);
+emit_32(1121120289);
+emit_32(3277248528);
+emit_32(3232603256);
+emit_32(1121120289);
+emit_32(3276992545);
+emit_32(3231337561);
+emit_32(1121120289);
+emit_32(3276736496);
+emit_32(3226343236);
+emit_32(1121120289);
+emit_32(3276480512);
+emit_32(3222401429);
+emit_32(1121120289);
+emit_32(3276224528);
+emit_32(3217196088);
+emit_32(1121120289);
+emit_32(3275968545);
+emit_32(3174963708);
+emit_32(1121120289);
+emit_32(3275712496);
+emit_32(1071520772);
+emit_32(1121120289);
+emit_32(3275456512);
+emit_32(1076782233);
+emit_32(1121120289);
+emit_32(3275200528);
+emit_32(1082969209);
+emit_32(1121120289);
+emit_32(3274944545);
+emit_32(1085234364);
+emit_32(1121120289);
+emit_32(3274688496);
+emit_32(1089004246);
+emit_32(1121120289);
+emit_32(3274432512);
+emit_32(1092733108);
+emit_32(1121120289);
+emit_32(3274176528);
+emit_32(1095820326);
+emit_32(1121120289);
+emit_32(3273920545);
+emit_32(1098604085);
+emit_32(1121120289);
+emit_32(3273664496);
+emit_32(1099874855);
+emit_32(1121120289);
+emit_32(3273408512);
+emit_32(1100920809);
+emit_32(1121120289);
+emit_32(3273152528);
+emit_32(1101878893);
+emit_32(1121120289);
+emit_32(3272896545);
+emit_32(1103179284);
+emit_32(1121120289);
+emit_32(3272640496);
+emit_32(1105420196);
+emit_32(1121120289);
+emit_32(3272384512);
+emit_32(1107134828);
+emit_32(1121120289);
+emit_32(3272128528);
+emit_32(1107920526);
+emit_32(1121120289);
+emit_32(3271872545);
+emit_32(1108056762);
+emit_32(1121120289);
+emit_32(3271616496);
+emit_32(1107769583);
+emit_32(1121120289);
+emit_32(3271163904);
+emit_32(1107905112);
+emit_32(1121120289);
+emit_32(3270651937);
+emit_32(1108241573);
+emit_32(1121120289);
+emit_32(3270139970);
+emit_32(1108859578);
+emit_32(1121120289);
+emit_32(3269627871);
+emit_32(1109044049);
+emit_32(1121120289);
+emit_32(3269115904);
+emit_32(1108576331);
+emit_32(1121120289);
+emit_32(3268603937);
+emit_32(1107973793);
+emit_32(1121120289);
+emit_32(3268091970);
+emit_32(1107354478);
+emit_32(1121120289);
+emit_32(3267579911);
+emit_32(1106448273);
+emit_32(1121120289);
+emit_32(3267067904);
+emit_32(1106470135);
+emit_32(1121120289);
+emit_32(3266555911);
+emit_32(1106654580);
+emit_32(1121120289);
+emit_32(3266043904);
+emit_32(1106160386);
+emit_32(1121120289);
+emit_32(3265531911);
+emit_32(1105210009);
+emit_32(1121120289);
+emit_32(3265019904);
+emit_32(1104004514);
+emit_32(1121120289);
+emit_32(3264507911);
+emit_32(1102526231);
+emit_32(1121120289);
+emit_32(3263995904);
+emit_32(1101481692);
+emit_32(1121120289);
+emit_32(3263483911);
+emit_32(1100090337);
+emit_32(1121120289);
+emit_32(3262775296);
+emit_32(1099268882);
+emit_32(1121120289);
+emit_32(3261751309);
+emit_32(1098701288);
+emit_32(1121120289);
+emit_32(3260727296);
+emit_32(1097681968);
+emit_32(1121120289);
+emit_32(3259703309);
+emit_32(1096561774);
+emit_32(1121120289);
+emit_32(3258679296);
+emit_32(1095766953);
+emit_32(1121120289);
+emit_32(3257655309);
+emit_32(1094631765);
+emit_32(1121120289);
+emit_32(3256631296);
+emit_32(1094735364);
+emit_32(1121120289);
+emit_32(3255607309);
+emit_32(1094999291);
+emit_32(1121120289);
+emit_32(3254386688);
+emit_32(1095377722);
+emit_32(1121120289);
+emit_32(3252338714);
+emit_32(1095433191);
+emit_32(1121120289);
+emit_32(3250290688);
+emit_32(1095107399);
+emit_32(1121120289);
+emit_32(3248242714);
+emit_32(1095777544);
+emit_32(1121120289);
+emit_32(3245998080);
+emit_32(1096857472);
+emit_32(1121120289);
+emit_32(3241902132);
+emit_32(1097446352);
+emit_32(1121120289);
+emit_32(3237609472);
+emit_32(1097974940);
+emit_32(1121120289);
+emit_32(3229220864);
+emit_32(1098736416);
+emit_32(1121120289);
+emit_32(0);
+emit_32(1099338613);
+emit_32(1121120289);
+emit_32(1081737216);
+emit_32(1099935672);
+emit_32(1121120289);
+emit_32(3279552512);
+emit_32(1082712497);
+emit_32(1120608322);
+emit_32(3279296528);
+emit_32(1077291841);
+emit_32(1120608322);
+emit_32(3279040545);
+emit_32(1073741866);
+emit_32(1120608322);
+emit_32(3278784496);
+emit_32(1070338230);
+emit_32(1120608322);
+emit_32(3278528512);
+emit_32(1056781669);
+emit_32(1120608322);
+emit_32(3278272528);
+emit_32(3219431904);
+emit_32(1120608322);
+emit_32(3278016545);
+emit_32(3224861095);
+emit_32(1120608322);
+emit_32(3277760496);
+emit_32(3231719746);
+emit_32(1120608322);
+emit_32(3277504512);
+emit_32(3233844476);
+emit_32(1120608322);
+emit_32(3277248528);
+emit_32(3232334736);
+emit_32(1120608322);
+emit_32(3276992545);
+emit_32(3229801544);
+emit_32(1120608322);
+emit_32(3276736496);
+emit_32(3228638233);
+emit_32(1120608322);
+emit_32(3276480512);
+emit_32(3223489306);
+emit_32(1120608322);
+emit_32(3276224528);
+emit_32(3213418446);
+emit_32(1120608322);
+emit_32(3275968545);
+emit_32(3202678964);
+emit_32(1120608322);
+emit_32(3275712496);
+emit_32(1069745659);
+emit_32(1120608322);
+emit_32(3275456512);
+emit_32(1079646691);
+emit_32(1120608322);
+emit_32(3275200528);
+emit_32(1083145831);
+emit_32(1120608322);
+emit_32(3274944545);
+emit_32(1087983583);
+emit_32(1120608322);
+emit_32(3274688496);
+emit_32(1091238804);
+emit_32(1120608322);
+emit_32(3274432512);
+emit_32(1093823208);
+emit_32(1120608322);
+emit_32(3274176528);
+emit_32(1097286130);
+emit_32(1120608322);
+emit_32(3273920545);
+emit_32(1099742472);
+emit_32(1120608322);
+emit_32(3273664496);
+emit_32(1100695890);
+emit_32(1120608322);
+emit_32(3273408512);
+emit_32(1101406876);
+emit_32(1120608322);
+emit_32(3273152528);
+emit_32(1102194042);
+emit_32(1120608322);
+emit_32(3272896545);
+emit_32(1103115112);
+emit_32(1120608322);
+emit_32(3272640496);
+emit_32(1105064414);
+emit_32(1120608322);
+emit_32(3272384512);
+emit_32(1107025042);
+emit_32(1120608322);
+emit_32(3272128528);
+emit_32(1107923960);
+emit_32(1120608322);
+emit_32(3271872545);
+emit_32(1108173154);
+emit_32(1120608322);
+emit_32(3271616496);
+emit_32(1108080381);
+emit_32(1120608322);
+emit_32(3271163904);
+emit_32(1107879605);
+emit_32(1120608322);
+emit_32(3270651937);
+emit_32(1108128956);
+emit_32(1120608322);
+emit_32(3270139970);
+emit_32(1108688110);
+emit_32(1120608322);
+emit_32(3269627871);
+emit_32(1108797188);
+emit_32(1120608322);
+emit_32(3269115904);
+emit_32(1108405938);
+emit_32(1120608322);
+emit_32(3268603937);
+emit_32(1107934577);
+emit_32(1120608322);
+emit_32(3268091970);
+emit_32(1107323021);
+emit_32(1120608322);
+emit_32(3267579911);
+emit_32(1106810136);
+emit_32(1120608322);
+emit_32(3267067904);
+emit_32(1106638904);
+emit_32(1120608322);
+emit_32(3266555911);
+emit_32(1106673664);
+emit_32(1120608322);
+emit_32(3266043904);
+emit_32(1106080013);
+emit_32(1120608322);
+emit_32(3265531911);
+emit_32(1104833308);
+emit_32(1120608322);
+emit_32(3265019904);
+emit_32(1103684593);
+emit_32(1120608322);
+emit_32(3264507911);
+emit_32(1102392852);
+emit_32(1120608322);
+emit_32(3263995904);
+emit_32(1101073744);
+emit_32(1120608322);
+emit_32(3263483911);
+emit_32(1099963145);
+emit_32(1120608322);
+emit_32(3262775296);
+emit_32(1099506070);
+emit_32(1120608322);
+emit_32(3261751309);
+emit_32(1099320997);
+emit_32(1120608322);
+emit_32(3260727296);
+emit_32(1098604295);
+emit_32(1120608322);
+emit_32(3259703309);
+emit_32(1097529295);
+emit_32(1120608322);
+emit_32(3258679296);
+emit_32(1096142134);
+emit_32(1120608322);
+emit_32(3257655309);
+emit_32(1094301568);
+emit_32(1120608322);
+emit_32(3256631296);
+emit_32(1094016985);
+emit_32(1120608322);
+emit_32(3255607309);
+emit_32(1095156577);
+emit_32(1120608322);
+emit_32(3254386688);
+emit_32(1095833223);
+emit_32(1120608322);
+emit_32(3252338714);
+emit_32(1095183630);
+emit_32(1120608322);
+emit_32(3250290688);
+emit_32(1094555114);
+emit_32(1120608322);
+emit_32(3248242714);
+emit_32(1096488059);
+emit_32(1120608322);
+emit_32(3245998080);
+emit_32(1097556453);
+emit_32(1120608322);
+emit_32(3241902132);
+emit_32(1097820275);
+emit_32(1120608322);
+emit_32(3237609472);
+emit_32(1097925237);
+emit_32(1120608322);
+emit_32(3229220864);
+emit_32(1098971297);
+emit_32(1120608322);
+emit_32(0);
+emit_32(1099474823);
+emit_32(1120608322);
+emit_32(1081737216);
+emit_32(1099802817);
+emit_32(1120608322);
+emit_32(3279552512);
+emit_32(1082649645);
+emit_32(1120096263);
+emit_32(3279296528);
+emit_32(1081824919);
+emit_32(1120096263);
+emit_32(3279040545);
+emit_32(1078459284);
+emit_32(1120096263);
+emit_32(3278784496);
+emit_32(1074050399);
+emit_32(1120096263);
+emit_32(3278528512);
+emit_32(1053874077);
+emit_32(1120096263);
+emit_32(3278272528);
+emit_32(3211237089);
+emit_32(1120096263);
+emit_32(3278016545);
+emit_32(3223833574);
+emit_32(1120096263);
+emit_32(3277760496);
+emit_32(3229161263);
+emit_32(1120096263);
+emit_32(3277504512);
+emit_32(3233010292);
+emit_32(1120096263);
+emit_32(3277248528);
+emit_32(3229615695);
+emit_32(1120096263);
+emit_32(3276992545);
+emit_32(3222904913);
+emit_32(1120096263);
+emit_32(3276736496);
+emit_32(3222905752);
+emit_32(1120096263);
+emit_32(3276480512);
+emit_32(3220913919);
+emit_32(1120096263);
+emit_32(3276224528);
+emit_32(3216868597);
+emit_32(1120096263);
+emit_32(3275968545);
+emit_32(3184537459);
+emit_32(1120096263);
+emit_32(3275712496);
+emit_32(1071525805);
+emit_32(1120096263);
+emit_32(3275456512);
+emit_32(1080770303);
+emit_32(1120096263);
+emit_32(3275200528);
+emit_32(1084483709);
+emit_32(1120096263);
+emit_32(3274944545);
+emit_32(1089756453);
+emit_32(1120096263);
+emit_32(3274688496);
+emit_32(1092796967);
+emit_32(1120096263);
+emit_32(3274432512);
+emit_32(1095008204);
+emit_32(1120096263);
+emit_32(3274176528);
+emit_32(1098158021);
+emit_32(1120096263);
+emit_32(3273920545);
+emit_32(1100073298);
+emit_32(1120096263);
+emit_32(3273664496);
+emit_32(1101265424);
+emit_32(1120096263);
+emit_32(3273408512);
+emit_32(1101989413);
+emit_32(1120096263);
+emit_32(3273152528);
+emit_32(1102698565);
+emit_32(1120096263);
+emit_32(3272896545);
+emit_32(1103242776);
+emit_32(1120096263);
+emit_32(3272640496);
+emit_32(1105297356);
+emit_32(1120096263);
+emit_32(3272384512);
+emit_32(1106908126);
+emit_32(1120096263);
+emit_32(3272128528);
+emit_32(1107640530);
+emit_32(1120096263);
+emit_32(3271872545);
+emit_32(1108166312);
+emit_32(1120096263);
+emit_32(3271616496);
+emit_32(1108109138);
+emit_32(1120096263);
+emit_32(3271163904);
+emit_32(1108037206);
+emit_32(1120096263);
+emit_32(3270651937);
+emit_32(1107897483);
+emit_32(1120096263);
+emit_32(3270139970);
+emit_32(1108473492);
+emit_32(1120096263);
+emit_32(3269627871);
+emit_32(1108658461);
+emit_32(1120096263);
+emit_32(3269115904);
+emit_32(1108380326);
+emit_32(1120096263);
+emit_32(3268603937);
+emit_32(1107921522);
+emit_32(1120096263);
+emit_32(3268091970);
+emit_32(1106710574);
+emit_32(1120096263);
+emit_32(3267579911);
+emit_32(1106304880);
+emit_32(1120096263);
+emit_32(3267067904);
+emit_32(1106736788);
+emit_32(1120096263);
+emit_32(3266555911);
+emit_32(1106706484);
+emit_32(1120096263);
+emit_32(3266043904);
+emit_32(1105732829);
+emit_32(1120096263);
+emit_32(3265531911);
+emit_32(1104837607);
+emit_32(1120096263);
+emit_32(3265019904);
+emit_32(1103630801);
+emit_32(1120096263);
+emit_32(3264507911);
+emit_32(1101868093);
+emit_32(1120096263);
+emit_32(3263995904);
+emit_32(1100220622);
+emit_32(1120096263);
+emit_32(3263483911);
+emit_32(1100302254);
+emit_32(1120096263);
+emit_32(3262775296);
+emit_32(1100039691);
+emit_32(1120096263);
+emit_32(3261751309);
+emit_32(1099705090);
+emit_32(1120096263);
+emit_32(3260727296);
+emit_32(1099085329);
+emit_32(1120096263);
+emit_32(3259703309);
+emit_32(1097718982);
+emit_32(1120096263);
+emit_32(3258679296);
+emit_32(1096390122);
+emit_32(1120096263);
+emit_32(3257655309);
+emit_32(1094580175);
+emit_32(1120096263);
+emit_32(3256631296);
+emit_32(1094186959);
+emit_32(1120096263);
+emit_32(3255607309);
+emit_32(1094206987);
+emit_32(1120096263);
+emit_32(3254386688);
+emit_32(1095299288);
+emit_32(1120096263);
+emit_32(3252338714);
+emit_32(1094941095);
+emit_32(1120096263);
+emit_32(3250290688);
+emit_32(1093925968);
+emit_32(1120096263);
+emit_32(3248242714);
+emit_32(1096010747);
+emit_32(1120096263);
+emit_32(3245998080);
+emit_32(1096357826);
+emit_32(1120096263);
+emit_32(3241902132);
+emit_32(1096902246);
+emit_32(1120096263);
+emit_32(3237609472);
+emit_32(1097501612);
+emit_32(1120096263);
+emit_32(3229220864);
+emit_32(1097992765);
+emit_32(1120096263);
+emit_32(0);
+emit_32(1098723413);
+emit_32(1120096263);
+emit_32(1081737216);
+emit_32(1099965451);
+emit_32(1120096263);
+emit_32(3279552512);
+emit_32(1084093765);
+emit_32(1119584256);
+emit_32(3279296528);
+emit_32(1080036510);
+emit_32(1119584256);
+emit_32(3279040545);
+emit_32(1077455125);
+emit_32(1119584256);
+emit_32(3278784496);
+emit_32(1074567724);
+emit_32(1119584256);
+emit_32(3278528512);
+emit_32(1069156863);
+emit_32(1119584256);
+emit_32(3278272528);
+emit_32(3189431842);
+emit_32(1119584256);
+emit_32(3278016545);
+emit_32(3213554929);
+emit_32(1119584256);
+emit_32(3277760496);
+emit_32(3222450418);
+emit_32(1119584256);
+emit_32(3277504512);
+emit_32(3228929486);
+emit_32(1119584256);
+emit_32(3277248528);
+emit_32(3224323217);
+emit_32(1119584256);
+emit_32(3276992545);
+emit_32(3222046465);
+emit_32(1119584256);
+emit_32(3276736496);
+emit_32(3194181137);
+emit_32(1119584256);
+emit_32(3276480512);
+emit_32(3186726281);
+emit_32(1119584256);
+emit_32(3276224528);
+emit_32(3191098290);
+emit_32(1119584256);
+emit_32(3275968545);
+emit_32(1068055354);
+emit_32(1119584256);
+emit_32(3275712496);
+emit_32(1076438426);
+emit_32(1119584256);
+emit_32(3275456512);
+emit_32(1080984464);
+emit_32(1119584256);
+emit_32(3275200528);
+emit_32(1085878651);
+emit_32(1119584256);
+emit_32(3274944545);
+emit_32(1091668447);
+emit_32(1119584256);
+emit_32(3274688496);
+emit_32(1094171545);
+emit_32(1119584256);
+emit_32(3274432512);
+emit_32(1095963561);
+emit_32(1119584256);
+emit_32(3274176528);
+emit_32(1098572104);
+emit_32(1119584256);
+emit_32(3273920545);
+emit_32(1099948045);
+emit_32(1119584256);
+emit_32(3273664496);
+emit_32(1101407873);
+emit_32(1119584256);
+emit_32(3273408512);
+emit_32(1102835876);
+emit_32(1119584256);
+emit_32(3273152528);
+emit_32(1103744310);
+emit_32(1119584256);
+emit_32(3272896545);
+emit_32(1104117655);
+emit_32(1119584256);
+emit_32(3272640496);
+emit_32(1105300868);
+emit_32(1119584256);
+emit_32(3272384512);
+emit_32(1107290803);
+emit_32(1119584256);
+emit_32(3272128528);
+emit_32(1107707508);
+emit_32(1119584256);
+emit_32(3271872545);
+emit_32(1108008685);
+emit_32(1119584256);
+emit_32(3271616496);
+emit_32(1108120935);
+emit_32(1119584256);
+emit_32(3271163904);
+emit_32(1108077052);
+emit_32(1119584256);
+emit_32(3270651937);
+emit_32(1107924641);
+emit_32(1119584256);
+emit_32(3270139970);
+emit_32(1108147044);
+emit_32(1119584256);
+emit_32(3269627871);
+emit_32(1108350311);
+emit_32(1119584256);
+emit_32(3269115904);
+emit_32(1108146651);
+emit_32(1119584256);
+emit_32(3268603937);
+emit_32(1107677466);
+emit_32(1119584256);
+emit_32(3268091970);
+emit_32(1106442034);
+emit_32(1119584256);
+emit_32(3267579911);
+emit_32(1106619400);
+emit_32(1119584256);
+emit_32(3267067904);
+emit_32(1106902463);
+emit_32(1119584256);
+emit_32(3266555911);
+emit_32(1106534780);
+emit_32(1119584256);
+emit_32(3266043904);
+emit_32(1105512733);
+emit_32(1119584256);
+emit_32(3265531911);
+emit_32(1104509036);
+emit_32(1119584256);
+emit_32(3265019904);
+emit_32(1103188250);
+emit_32(1119584256);
+emit_32(3264507911);
+emit_32(1101665927);
+emit_32(1119584256);
+emit_32(3263995904);
+emit_32(1100910743);
+emit_32(1119584256);
+emit_32(3263483911);
+emit_32(1100740139);
+emit_32(1119584256);
+emit_32(3262775296);
+emit_32(1100127981);
+emit_32(1119584256);
+emit_32(3261751309);
+emit_32(1100010121);
+emit_32(1119584256);
+emit_32(3260727296);
+emit_32(1099477968);
+emit_32(1119584256);
+emit_32(3259703309);
+emit_32(1097874171);
+emit_32(1119584256);
+emit_32(3258679296);
+emit_32(1096345453);
+emit_32(1119584256);
+emit_32(3257655309);
+emit_32(1093686893);
+emit_32(1119584256);
+emit_32(3256631296);
+emit_32(1093873015);
+emit_32(1119584256);
+emit_32(3255607309);
+emit_32(1093045794);
+emit_32(1119584256);
+emit_32(3254386688);
+emit_32(1093896189);
+emit_32(1119584256);
+emit_32(3252338714);
+emit_32(1094140717);
+emit_32(1119584256);
+emit_32(3250290688);
+emit_32(1094085666);
+emit_32(1119584256);
+emit_32(3248242714);
+emit_32(1094959130);
+emit_32(1119584256);
+emit_32(3245998080);
+emit_32(1096322698);
+emit_32(1119584256);
+emit_32(3241902132);
+emit_32(1097101161);
+emit_32(1119584256);
+emit_32(3237609472);
+emit_32(1096857367);
+emit_32(1119584256);
+emit_32(3229220864);
+emit_32(1096976905);
+emit_32(1119584256);
+emit_32(0);
+emit_32(1098201537);
+emit_32(1119584256);
+emit_32(1081737216);
+emit_32(1099519545);
+emit_32(1119584256);
+emit_32(3279552512);
+emit_32(1085076910);
+emit_32(1119072263);
+emit_32(3279296528);
+emit_32(1081809987);
+emit_32(1119072263);
+emit_32(3279040545);
+emit_32(1077014597);
+emit_32(1119072263);
+emit_32(3278784496);
+emit_32(1075155304);
+emit_32(1119072263);
+emit_32(3278528512);
+emit_32(1069179596);
+emit_32(1119072263);
+emit_32(3278272528);
+emit_32(1056541889);
+emit_32(1119072263);
+emit_32(3278016545);
+emit_32(1062243693);
+emit_32(1119072263);
+emit_32(3277760496);
+emit_32(3195663773);
+emit_32(1119072263);
+emit_32(3277504512);
+emit_32(3221620659);
+emit_32(1119072263);
+emit_32(3277248528);
+emit_32(3216900390);
+emit_32(1119072263);
+emit_32(3276992545);
+emit_32(3207733134);
+emit_32(1119072263);
+emit_32(3276736496);
+emit_32(1061029962);
+emit_32(1119072263);
+emit_32(3276480512);
+emit_32(1067919627);
+emit_32(1119072263);
+emit_32(3276224528);
+emit_32(1069464557);
+emit_32(1119072263);
+emit_32(3275968545);
+emit_32(1076127125);
+emit_32(1119072263);
+emit_32(3275712496);
+emit_32(1080969365);
+emit_32(1119072263);
+emit_32(3275456512);
+emit_32(1083510358);
+emit_32(1119072263);
+emit_32(3275200528);
+emit_32(1088854216);
+emit_32(1119072263);
+emit_32(3274944545);
+emit_32(1092461118);
+emit_32(1119072263);
+emit_32(3274688496);
+emit_32(1095602746);
+emit_32(1119072263);
+emit_32(3274432512);
+emit_32(1097477495);
+emit_32(1119072263);
+emit_32(3274176528);
+emit_32(1099224108);
+emit_32(1119072263);
+emit_32(3273920545);
+emit_32(1100863662);
+emit_32(1119072263);
+emit_32(3273664496);
+emit_32(1102423943);
+emit_32(1119072263);
+emit_32(3273408512);
+emit_32(1103322677);
+emit_32(1119072263);
+emit_32(3273152528);
+emit_32(1104096054);
+emit_32(1119072263);
+emit_32(3272896545);
+emit_32(1104740300);
+emit_32(1119072263);
+emit_32(3272640496);
+emit_32(1105730627);
+emit_32(1119072263);
+emit_32(3272384512);
+emit_32(1107106673);
+emit_32(1119072263);
+emit_32(3272128528);
+emit_32(1107798052);
+emit_32(1119072263);
+emit_32(3271872545);
+emit_32(1107907497);
+emit_32(1119072263);
+emit_32(3271616496);
+emit_32(1108367272);
+emit_32(1119072263);
+emit_32(3271163904);
+emit_32(1108217273);
+emit_32(1119072263);
+emit_32(3270651937);
+emit_32(1108004962);
+emit_32(1119072263);
+emit_32(3270139970);
+emit_32(1107737890);
+emit_32(1119072263);
+emit_32(3269627871);
+emit_32(1107889331);
+emit_32(1119072263);
+emit_32(3269115904);
+emit_32(1107876826);
+emit_32(1119072263);
+emit_32(3268603937);
+emit_32(1107372933);
+emit_32(1119072263);
+emit_32(3268091970);
+emit_32(1106504004);
+emit_32(1119072263);
+emit_32(3267579911);
+emit_32(1106696575);
+emit_32(1119072263);
+emit_32(3267067904);
+emit_32(1107019275);
+emit_32(1119072263);
+emit_32(3266555911);
+emit_32(1106385201);
+emit_32(1119072263);
+emit_32(3266043904);
+emit_32(1105441482);
+emit_32(1119072263);
+emit_32(3265531911);
+emit_32(1104471235);
+emit_32(1119072263);
+emit_32(3265019904);
+emit_32(1103193965);
+emit_32(1119072263);
+emit_32(3264507911);
+emit_32(1102302518);
+emit_32(1119072263);
+emit_32(3263995904);
+emit_32(1101174984);
+emit_32(1119072263);
+emit_32(3263483911);
+emit_32(1100736365);
+emit_32(1119072263);
+emit_32(3262775296);
+emit_32(1100294232);
+emit_32(1119072263);
+emit_32(3261751309);
+emit_32(1099900282);
+emit_32(1119072263);
+emit_32(3260727296);
+emit_32(1099000447);
+emit_32(1119072263);
+emit_32(3259703309);
+emit_32(1098125096);
+emit_32(1119072263);
+emit_32(3258679296);
+emit_32(1096310535);
+emit_32(1119072263);
+emit_32(3257655309);
+emit_32(1094547669);
+emit_32(1119072263);
+emit_32(3256631296);
+emit_32(1092850024);
+emit_32(1119072263);
+emit_32(3255607309);
+emit_32(1092138471);
+emit_32(1119072263);
+emit_32(3254386688);
+emit_32(1092338194);
+emit_32(1119072263);
+emit_32(3252338714);
+emit_32(1093356172);
+emit_32(1119072263);
+emit_32(3250290688);
+emit_32(1094627885);
+emit_32(1119072263);
+emit_32(3248242714);
+emit_32(1095982750);
+emit_32(1119072263);
+emit_32(3245998080);
+emit_32(1095846540);
+emit_32(1119072263);
+emit_32(3241902132);
+emit_32(1095563949);
+emit_32(1119072263);
+emit_32(3237609472);
+emit_32(1095549269);
+emit_32(1119072263);
+emit_32(3229220864);
+emit_32(1096920492);
+emit_32(1119072263);
+emit_32(0);
+emit_32(1097824888);
+emit_32(1119072263);
+emit_32(1081737216);
+emit_32(1098532992);
+emit_32(1119072263);
+emit_32(3279552512);
+emit_32(1086774827);
+emit_32(1118560256);
+emit_32(3279296528);
+emit_32(1083515077);
+emit_32(1118560256);
+emit_32(3279040545);
+emit_32(1079457780);
+emit_32(1118560256);
+emit_32(3278784496);
+emit_32(1073525901);
+emit_32(1118560256);
+emit_32(3278528512);
+emit_32(1058489607);
+emit_32(1118560256);
+emit_32(3278272528);
+emit_32(1073793078);
+emit_32(1118560256);
+emit_32(3278016545);
+emit_32(1074379023);
+emit_32(1118560256);
+emit_32(3277760496);
+emit_32(1061663235);
+emit_32(1118560256);
+emit_32(3277504512);
+emit_32(3201930600);
+emit_32(1118560256);
+emit_32(3277248528);
+emit_32(3204664162);
+emit_32(1118560256);
+emit_32(3276992545);
+emit_32(995186421);
+emit_32(1118560256);
+emit_32(3276736496);
+emit_32(1065832625);
+emit_32(1118560256);
+emit_32(3276480512);
+emit_32(1074242037);
+emit_32(1118560256);
+emit_32(3276224528);
+emit_32(1075791245);
+emit_32(1118560256);
+emit_32(3275968545);
+emit_32(1081708653);
+emit_32(1118560256);
+emit_32(3275712496);
+emit_32(1085735415);
+emit_32(1118560256);
+emit_32(3275456512);
+emit_32(1087198703);
+emit_32(1118560256);
+emit_32(3275200528);
+emit_32(1090399397);
+emit_32(1118560256);
+emit_32(3274944545);
+emit_32(1093618840);
+emit_32(1118560256);
+emit_32(3274688496);
+emit_32(1095966497);
+emit_32(1118560256);
+emit_32(3274432512);
+emit_32(1098679792);
+emit_32(1118560256);
+emit_32(3274176528);
+emit_32(1099796369);
+emit_32(1118560256);
+emit_32(3273920545);
+emit_32(1101123342);
+emit_32(1118560256);
+emit_32(3273664496);
+emit_32(1102326582);
+emit_32(1118560256);
+emit_32(3273408512);
+emit_32(1103526783);
+emit_32(1118560256);
+emit_32(3273152528);
+emit_32(1104500018);
+emit_32(1118560256);
+emit_32(3272896545);
+emit_32(1105044544);
+emit_32(1118560256);
+emit_32(3272640496);
+emit_32(1105840518);
+emit_32(1118560256);
+emit_32(3272384512);
+emit_32(1107014661);
+emit_32(1118560256);
+emit_32(3272128528);
+emit_32(1107845579);
+emit_32(1118560256);
+emit_32(3271872545);
+emit_32(1108007295);
+emit_32(1118560256);
+emit_32(3271616496);
+emit_32(1108389711);
+emit_32(1118560256);
+emit_32(3271163904);
+emit_32(1108469167);
+emit_32(1118560256);
+emit_32(3270651937);
+emit_32(1108186681);
+emit_32(1118560256);
+emit_32(3270139970);
+emit_32(1107912425);
+emit_32(1118560256);
+emit_32(3269627871);
+emit_32(1107694060);
+emit_32(1118560256);
+emit_32(3269115904);
+emit_32(1107557771);
+emit_32(1118560256);
+emit_32(3268603937);
+emit_32(1107185212);
+emit_32(1118560256);
+emit_32(3268091970);
+emit_32(1106863509);
+emit_32(1118560256);
+emit_32(3267579911);
+emit_32(1106786176);
+emit_32(1118560256);
+emit_32(3267067904);
+emit_32(1107049998);
+emit_32(1118560256);
+emit_32(3266555911);
+emit_32(1106706117);
+emit_32(1118560256);
+emit_32(3266043904);
+emit_32(1105274287);
+emit_32(1118560256);
+emit_32(3265531911);
+emit_32(1104108375);
+emit_32(1118560256);
+emit_32(3265019904);
+emit_32(1103313974);
+emit_32(1118560256);
+emit_32(3264507911);
+emit_32(1102052537);
+emit_32(1118560256);
+emit_32(3263995904);
+emit_32(1101026348);
+emit_32(1118560256);
+emit_32(3263483911);
+emit_32(1100975912);
+emit_32(1118560256);
+emit_32(3262775296);
+emit_32(1100160329);
+emit_32(1118560256);
+emit_32(3261751309);
+emit_32(1099423862);
+emit_32(1118560256);
+emit_32(3260727296);
+emit_32(1098504471);
+emit_32(1118560256);
+emit_32(3259703309);
+emit_32(1097455580);
+emit_32(1118560256);
+emit_32(3258679296);
+emit_32(1095484886);
+emit_32(1118560256);
+emit_32(3257655309);
+emit_32(1094881011);
+emit_32(1118560256);
+emit_32(3256631296);
+emit_32(1092725768);
+emit_32(1118560256);
+emit_32(3255607309);
+emit_32(1092211609);
+emit_32(1118560256);
+emit_32(3254386688);
+emit_32(1092698400);
+emit_32(1118560256);
+emit_32(3252338714);
+emit_32(1092845620);
+emit_32(1118560256);
+emit_32(3250290688);
+emit_32(1094266651);
+emit_32(1118560256);
+emit_32(3248242714);
+emit_32(1094578287);
+emit_32(1118560256);
+emit_32(3245998080);
+emit_32(1094619916);
+emit_32(1118560256);
+emit_32(3241902132);
+emit_32(1094198493);
+emit_32(1118560256);
+emit_32(3237609472);
+emit_32(1096808294);
+emit_32(1118560256);
+emit_32(3229220864);
+emit_32(1097696857);
+emit_32(1118560256);
+emit_32(0);
+emit_32(1097643170);
+emit_32(1118560256);
+emit_32(1081737216);
+emit_32(1098479410);
+emit_32(1118560256);
+emit_32(3279552512);
+emit_32(1088302854);
+emit_32(1118048263);
+emit_32(3279296528);
+emit_32(1083747986);
+emit_32(1118048263);
+emit_32(3279040545);
+emit_32(1080542594);
+emit_32(1118048263);
+emit_32(3278784496);
+emit_32(1075852566);
+emit_32(1118048263);
+emit_32(3278528512);
+emit_32(1068737600);
+emit_32(1118048263);
+emit_32(3278272528);
+emit_32(1073988491);
+emit_32(1118048263);
+emit_32(3278016545);
+emit_32(1075493743);
+emit_32(1118048263);
+emit_32(3277760496);
+emit_32(1067344336);
+emit_32(1118048263);
+emit_32(3277504512);
+emit_32(1070348213);
+emit_32(1118048263);
+emit_32(3277248528);
+emit_32(1067476624);
+emit_32(1118048263);
+emit_32(3276992545);
+emit_32(1069849007);
+emit_32(1118048263);
+emit_32(3276736496);
+emit_32(1075129006);
+emit_32(1118048263);
+emit_32(3276480512);
+emit_32(1076245656);
+emit_32(1118048263);
+emit_32(3276224528);
+emit_32(1082664933);
+emit_32(1118048263);
+emit_32(3275968545);
+emit_32(1086033987);
+emit_32(1118048263);
+emit_32(3275712496);
+emit_32(1089567583);
+emit_32(1118048263);
+emit_32(3275456512);
+emit_32(1091286073);
+emit_32(1118048263);
+emit_32(3275200528);
+emit_32(1092256918);
+emit_32(1118048263);
+emit_32(3274944545);
+emit_32(1094223449);
+emit_32(1118048263);
+emit_32(3274688496);
+emit_32(1097132304);
+emit_32(1118048263);
+emit_32(3274432512);
+emit_32(1099059115);
+emit_32(1118048263);
+emit_32(3274176528);
+emit_32(1099766379);
+emit_32(1118048263);
+emit_32(3273920545);
+emit_32(1101236640);
+emit_32(1118048263);
+emit_32(3273664496);
+emit_32(1102554438);
+emit_32(1118048263);
+emit_32(3273408512);
+emit_32(1103664565);
+emit_32(1118048263);
+emit_32(3273152528);
+emit_32(1104878292);
+emit_32(1118048263);
+emit_32(3272896545);
+emit_32(1105616175);
+emit_32(1118048263);
+emit_32(3272640496);
+emit_32(1106382684);
+emit_32(1118048263);
+emit_32(3272384512);
+emit_32(1107450606);
+emit_32(1118048263);
+emit_32(3272128528);
+emit_32(1107817503);
+emit_32(1118048263);
+emit_32(3271872545);
+emit_32(1107947369);
+emit_32(1118048263);
+emit_32(3271616496);
+emit_32(1108283805);
+emit_32(1118048263);
+emit_32(3271163904);
+emit_32(1108371099);
+emit_32(1118048263);
+emit_32(3270651937);
+emit_32(1108326954);
+emit_32(1118048263);
+emit_32(3270139970);
+emit_32(1108075217);
+emit_32(1118048263);
+emit_32(3269627871);
+emit_32(1107641945);
+emit_32(1118048263);
+emit_32(3269115904);
+emit_32(1107268836);
+emit_32(1118048263);
+emit_32(3268603937);
+emit_32(1107004595);
+emit_32(1118048263);
+emit_32(3268091970);
+emit_32(1106919660);
+emit_32(1118048263);
+emit_32(3267579911);
+emit_32(1107317228);
+emit_32(1118048263);
+emit_32(3267067904);
+emit_32(1106983623);
+emit_32(1118048263);
+emit_32(3266555911);
+emit_32(1106392855);
+emit_32(1118048263);
+emit_32(3266043904);
+emit_32(1105271141);
+emit_32(1118048263);
+emit_32(3265531911);
+emit_32(1103878632);
+emit_32(1118048263);
+emit_32(3265019904);
+emit_32(1103197949);
+emit_32(1118048263);
+emit_32(3264507911);
+emit_32(1102375708);
+emit_32(1118048263);
+emit_32(3263995904);
+emit_32(1100616040);
+emit_32(1118048263);
+emit_32(3263483911);
+emit_32(1100311953);
+emit_32(1118048263);
+emit_32(3262775296);
+emit_32(1099845547);
+emit_32(1118048263);
+emit_32(3261751309);
+emit_32(1099214619);
+emit_32(1118048263);
+emit_32(3260727296);
+emit_32(1097535901);
+emit_32(1118048263);
+emit_32(3259703309);
+emit_32(1095712847);
+emit_32(1118048263);
+emit_32(3258679296);
+emit_32(1094870840);
+emit_32(1118048263);
+emit_32(3257655309);
+emit_32(1094035230);
+emit_32(1118048263);
+emit_32(3256631296);
+emit_32(1092438144);
+emit_32(1118048263);
+emit_32(3255607309);
+emit_32(1092567024);
+emit_32(1118048263);
+emit_32(3254386688);
+emit_32(1093416360);
+emit_32(1118048263);
+emit_32(3252338714);
+emit_32(1092845516);
+emit_32(1118048263);
+emit_32(3250290688);
+emit_32(1092728599);
+emit_32(1118048263);
+emit_32(3248242714);
+emit_32(1093978292);
+emit_32(1118048263);
+emit_32(3245998080);
+emit_32(1094248091);
+emit_32(1118048263);
+emit_32(3241902132);
+emit_32(1096725352);
+emit_32(1118048263);
+emit_32(3237609472);
+emit_32(1098118070);
+emit_32(1118048263);
+emit_32(3229220864);
+emit_32(1098579024);
+emit_32(1118048263);
+emit_32(0);
+emit_32(1098875562);
+emit_32(1118048263);
+emit_32(1081737216);
+emit_32(1099413271);
+emit_32(1118048263);
+emit_32(3279552512);
+emit_32(1087158039);
+emit_32(1117536256);
+emit_32(3279296528);
+emit_32(1084423731);
+emit_32(1117536256);
+emit_32(3279040545);
+emit_32(1083252471);
+emit_32(1117536256);
+emit_32(3278784496);
+emit_32(1080977921);
+emit_32(1117536256);
+emit_32(3278528512);
+emit_32(1078047193);
+emit_32(1117536256);
+emit_32(3278272528);
+emit_32(1078022405);
+emit_32(1117536256);
+emit_32(3278016545);
+emit_32(1081630052);
+emit_32(1117536256);
+emit_32(3277760496);
+emit_32(1083124105);
+emit_32(1117536256);
+emit_32(3277504512);
+emit_32(1081459553);
+emit_32(1117536256);
+emit_32(3277248528);
+emit_32(1076823379);
+emit_32(1117536256);
+emit_32(3276992545);
+emit_32(1083284243);
+emit_32(1117536256);
+emit_32(3276736496);
+emit_32(1084323613);
+emit_32(1117536256);
+emit_32(3276480512);
+emit_32(1083093801);
+emit_32(1117536256);
+emit_32(3276224528);
+emit_32(1084912430);
+emit_32(1117536256);
+emit_32(3275968545);
+emit_32(1088711106);
+emit_32(1117536256);
+emit_32(3275712496);
+emit_32(1091460892);
+emit_32(1117536256);
+emit_32(3275456512);
+emit_32(1093026290);
+emit_32(1117536256);
+emit_32(3275200528);
+emit_32(1094050539);
+emit_32(1117536256);
+emit_32(3274944545);
+emit_32(1096188481);
+emit_32(1117536256);
+emit_32(3274688496);
+emit_32(1099085539);
+emit_32(1117536256);
+emit_32(3274432512);
+emit_32(1099851891);
+emit_32(1117536256);
+emit_32(3274176528);
+emit_32(1100504367);
+emit_32(1117536256);
+emit_32(3273920545);
+emit_32(1101748136);
+emit_32(1117536256);
+emit_32(3273664496);
+emit_32(1102868644);
+emit_32(1117536256);
+emit_32(3273408512);
+emit_32(1103833491);
+emit_32(1117536256);
+emit_32(3273152528);
+emit_32(1104656833);
+emit_32(1117536256);
+emit_32(3272896545);
+emit_32(1105628706);
+emit_32(1117536256);
+emit_32(3272640496);
+emit_32(1107011043);
+emit_32(1117536256);
+emit_32(3272384512);
+emit_32(1107650124);
+emit_32(1117536256);
+emit_32(3272128528);
+emit_32(1107880732);
+emit_32(1117536256);
+emit_32(3271872545);
+emit_32(1107976887);
+emit_32(1117536256);
+emit_32(3271616496);
+emit_32(1108276648);
+emit_32(1117536256);
+emit_32(3271163904);
+emit_32(1108202645);
+emit_32(1117536256);
+emit_32(3270651937);
+emit_32(1108292036);
+emit_32(1117536256);
+emit_32(3270139970);
+emit_32(1107942205);
+emit_32(1117536256);
+emit_32(3269627871);
+emit_32(1107800883);
+emit_32(1117536256);
+emit_32(3269115904);
+emit_32(1107311303);
+emit_32(1117536256);
+emit_32(3268603937);
+emit_32(1107125495);
+emit_32(1117536256);
+emit_32(3268091970);
+emit_32(1107112755);
+emit_32(1117536256);
+emit_32(3267579911);
+emit_32(1107267997);
+emit_32(1117536256);
+emit_32(3267067904);
+emit_32(1106890510);
+emit_32(1117536256);
+emit_32(3266555911);
+emit_32(1106494148);
+emit_32(1117536256);
+emit_32(3266043904);
+emit_32(1105071650);
+emit_32(1117536256);
+emit_32(3265531911);
+emit_32(1103864948);
+emit_32(1117536256);
+emit_32(3265019904);
+emit_32(1102783028);
+emit_32(1117536256);
+emit_32(3264507911);
+emit_32(1101893154);
+emit_32(1117536256);
+emit_32(3263995904);
+emit_32(1100313684);
+emit_32(1117536256);
+emit_32(3263483911);
+emit_32(1099645112);
+emit_32(1117536256);
+emit_32(3262775296);
+emit_32(1099500985);
+emit_32(1117536256);
+emit_32(3261751309);
+emit_32(1099174668);
+emit_32(1117536256);
+emit_32(3260727296);
+emit_32(1097807901);
+emit_32(1117536256);
+emit_32(3259703309);
+emit_32(1096000995);
+emit_32(1117536256);
+emit_32(3258679296);
+emit_32(1094151098);
+emit_32(1117536256);
+emit_32(3257655309);
+emit_32(1093022725);
+emit_32(1117536256);
+emit_32(3256631296);
+emit_32(1092315356);
+emit_32(1117536256);
+emit_32(3255607309);
+emit_32(1092666209);
+emit_32(1117536256);
+emit_32(3254386688);
+emit_32(1092956979);
+emit_32(1117536256);
+emit_32(3252338714);
+emit_32(1092948591);
+emit_32(1117536256);
+emit_32(3250290688);
+emit_32(1093567880);
+emit_32(1117536256);
+emit_32(3248242714);
+emit_32(1094483496);
+emit_32(1117536256);
+emit_32(3245998080);
+emit_32(1097010250);
+emit_32(1117536256);
+emit_32(3241902132);
+emit_32(1098491888);
+emit_32(1117536256);
+emit_32(3237609472);
+emit_32(1098958976);
+emit_32(1117536256);
+emit_32(3229220864);
+emit_32(1099244503);
+emit_32(1117536256);
+emit_32(0);
+emit_32(1099580677);
+emit_32(1117536256);
+emit_32(1081737216);
+emit_32(1100388447);
+emit_32(1117536256);
+emit_32(3279552512);
+emit_32(1086400066);
+emit_32(1117024263);
+emit_32(3279296528);
+emit_32(1084596809);
+emit_32(1117024263);
+emit_32(3279040545);
+emit_32(1080887240);
+emit_32(1117024263);
+emit_32(3278784496);
+emit_32(1080830198);
+emit_32(1117024263);
+emit_32(3278528512);
+emit_32(1083401537);
+emit_32(1117024263);
+emit_32(3278272528);
+emit_32(1083235254);
+emit_32(1117024263);
+emit_32(3278016545);
+emit_32(1085484554);
+emit_32(1117024263);
+emit_32(3277760496);
+emit_32(1086866577);
+emit_32(1117024263);
+emit_32(3277504512);
+emit_32(1084469113);
+emit_32(1117024263);
+emit_32(3277248528);
+emit_32(1083540599);
+emit_32(1117024263);
+emit_32(3276992545);
+emit_32(1085825048);
+emit_32(1117024263);
+emit_32(3276736496);
+emit_32(1088012125);
+emit_32(1117024263);
+emit_32(3276480512);
+emit_32(1088318771);
+emit_32(1117024263);
+emit_32(3276224528);
+emit_32(1089174619);
+emit_32(1117024263);
+emit_32(3275968545);
+emit_32(1091189594);
+emit_32(1117024263);
+emit_32(3275712496);
+emit_32(1093050722);
+emit_32(1117024263);
+emit_32(3275456512);
+emit_32(1094514639);
+emit_32(1117024263);
+emit_32(3275200528);
+emit_32(1096242482);
+emit_32(1117024263);
+emit_32(3274944545);
+emit_32(1098453090);
+emit_32(1117024263);
+emit_32(3274688496);
+emit_32(1100090861);
+emit_32(1117024263);
+emit_32(3274432512);
+emit_32(1100571319);
+emit_32(1117024263);
+emit_32(3274176528);
+emit_32(1101691512);
+emit_32(1117024263);
+emit_32(3273920545);
+emit_32(1102911059);
+emit_32(1117024263);
+emit_32(3273664496);
+emit_32(1103791600);
+emit_32(1117024263);
+emit_32(3273408512);
+emit_32(1105004541);
+emit_32(1117024263);
+emit_32(3273152528);
+emit_32(1105668499);
+emit_32(1117024263);
+emit_32(3272896545);
+emit_32(1106514962);
+emit_32(1117024263);
+emit_32(3272640496);
+emit_32(1107399593);
+emit_32(1117024263);
+emit_32(3272384512);
+emit_32(1107645563);
+emit_32(1117024263);
+emit_32(3272128528);
+emit_32(1107768351);
+emit_32(1117024263);
+emit_32(3271872545);
+emit_32(1108103738);
+emit_32(1117024263);
+emit_32(3271616496);
+emit_32(1108013744);
+emit_32(1117024263);
+emit_32(3271163904);
+emit_32(1107916384);
+emit_32(1117024263);
+emit_32(3270651937);
+emit_32(1107875778);
+emit_32(1117024263);
+emit_32(3270139970);
+emit_32(1107601523);
+emit_32(1117024263);
+emit_32(3269627871);
+emit_32(1107312378);
+emit_32(1117024263);
+emit_32(3269115904);
+emit_32(1107317935);
+emit_32(1117024263);
+emit_32(3268603937);
+emit_32(1107418363);
+emit_32(1117024263);
+emit_32(3268091970);
+emit_32(1107103056);
+emit_32(1117024263);
+emit_32(3267579911);
+emit_32(1106756135);
+emit_32(1117024263);
+emit_32(3267067904);
+emit_32(1106586580);
+emit_32(1117024263);
+emit_32(3266555911);
+emit_32(1106229068);
+emit_32(1117024263);
+emit_32(3266043904);
+emit_32(1104905136);
+emit_32(1117024263);
+emit_32(3265531911);
+emit_32(1103773408);
+emit_32(1117024263);
+emit_32(3265019904);
+emit_32(1102876508);
+emit_32(1117024263);
+emit_32(3264507911);
+emit_32(1101347160);
+emit_32(1117024263);
+emit_32(3263995904);
+emit_32(1100029362);
+emit_32(1117024263);
+emit_32(3263483911);
+emit_32(1099777180);
+emit_32(1117024263);
+emit_32(3262775296);
+emit_32(1099578632);
+emit_32(1117024263);
+emit_32(3261751309);
+emit_32(1099224370);
+emit_32(1117024263);
+emit_32(3260727296);
+emit_32(1097535377);
+emit_32(1117024263);
+emit_32(3259703309);
+emit_32(1095910398);
+emit_32(1117024263);
+emit_32(3258679296);
+emit_32(1093599127);
+emit_32(1117024263);
+emit_32(3257655309);
+emit_32(1091981646);
+emit_32(1117024263);
+emit_32(3256631296);
+emit_32(1091797841);
+emit_32(1117024263);
+emit_32(3255607309);
+emit_32(1092352737);
+emit_32(1117024263);
+emit_32(3254386688);
+emit_32(1093028492);
+emit_32(1117024263);
+emit_32(3252338714);
+emit_32(1093454633);
+emit_32(1117024263);
+emit_32(3250290688);
+emit_32(1094245469);
+emit_32(1117024263);
+emit_32(3248242714);
+emit_32(1096330038);
+emit_32(1117024263);
+emit_32(3245998080);
+emit_32(1098523450);
+emit_32(1117024263);
+emit_32(3241902132);
+emit_32(1099109289);
+emit_32(1117024263);
+emit_32(3237609472);
+emit_32(1099818861);
+emit_32(1117024263);
+emit_32(3229220864);
+emit_32(1099945738);
+emit_32(1117024263);
+emit_32(0);
+emit_32(1100568016);
+emit_32(1117024263);
+emit_32(1081737216);
+emit_32(1101362836);
+emit_32(1117024263);
+emit_32(3279552512);
+emit_32(1085174427);
+emit_32(1116512256);
+emit_32(3279296528);
+emit_32(1083887405);
+emit_32(1116512256);
+emit_32(3279040545);
+emit_32(1080456611);
+emit_32(1116512256);
+emit_32(3278784496);
+emit_32(1079046318);
+emit_32(1116512256);
+emit_32(3278528512);
+emit_32(1082259302);
+emit_32(1116512256);
+emit_32(3278272528);
+emit_32(1084889550);
+emit_32(1116512256);
+emit_32(3278016545);
+emit_32(1087704851);
+emit_32(1116512256);
+emit_32(3277760496);
+emit_32(1087804025);
+emit_32(1116512256);
+emit_32(3277504512);
+emit_32(1088280498);
+emit_32(1116512256);
+emit_32(3277248528);
+emit_32(1088103981);
+emit_32(1116512256);
+emit_32(3276992545);
+emit_32(1088351004);
+emit_32(1116512256);
+emit_32(3276736496);
+emit_32(1089973843);
+emit_32(1116512256);
+emit_32(3276480512);
+emit_32(1091239926);
+emit_32(1116512256);
+emit_32(3276224528);
+emit_32(1091632890);
+emit_32(1116512256);
+emit_32(3275968545);
+emit_32(1092700393);
+emit_32(1116512256);
+emit_32(3275712496);
+emit_32(1094925156);
+emit_32(1116512256);
+emit_32(3275456512);
+emit_32(1096876556);
+emit_32(1116512256);
+emit_32(3275200528);
+emit_32(1098626630);
+emit_32(1116512256);
+emit_32(3274944545);
+emit_32(1100164471);
+emit_32(1116512256);
+emit_32(3274688496);
+emit_32(1100745487);
+emit_32(1116512256);
+emit_32(3274432512);
+emit_32(1101472832);
+emit_32(1116512256);
+emit_32(3274176528);
+emit_32(1102779148);
+emit_32(1116512256);
+emit_32(3273920545);
+emit_32(1103935255);
+emit_32(1116512256);
+emit_32(3273664496);
+emit_32(1104701345);
+emit_32(1116512256);
+emit_32(3273408512);
+emit_32(1105539000);
+emit_32(1116512256);
+emit_32(3273152528);
+emit_32(1106980949);
+emit_32(1116512256);
+emit_32(3272896545);
+emit_32(1107434013);
+emit_32(1116512256);
+emit_32(3272640496);
+emit_32(1107566658);
+emit_32(1116512256);
+emit_32(3272384512);
+emit_32(1107582701);
+emit_32(1116512256);
+emit_32(3272128528);
+emit_32(1107757498);
+emit_32(1116512256);
+emit_32(3271872545);
+emit_32(1107869617);
+emit_32(1116512256);
+emit_32(3271616496);
+emit_32(1107687480);
+emit_32(1116512256);
+emit_32(3271163904);
+emit_32(1107868176);
+emit_32(1116512256);
+emit_32(3270651937);
+emit_32(1107680087);
+emit_32(1116512256);
+emit_32(3270139970);
+emit_32(1107380955);
+emit_32(1116512256);
+emit_32(3269627871);
+emit_32(1107328631);
+emit_32(1116512256);
+emit_32(3269115904);
+emit_32(1107472941);
+emit_32(1116512256);
+emit_32(3268603937);
+emit_32(1107494384);
+emit_32(1116512256);
+emit_32(3268091970);
+emit_32(1107424602);
+emit_32(1116512256);
+emit_32(3267579911);
+emit_32(1106664227);
+emit_32(1116512256);
+emit_32(3267067904);
+emit_32(1106309651);
+emit_32(1116512256);
+emit_32(3266555911);
+emit_32(1105564480);
+emit_32(1116512256);
+emit_32(3266043904);
+emit_32(1104468247);
+emit_32(1116512256);
+emit_32(3265531911);
+emit_32(1103524161);
+emit_32(1116512256);
+emit_32(3265019904);
+emit_32(1102766355);
+emit_32(1116512256);
+emit_32(3264507911);
+emit_32(1101285976);
+emit_32(1116512256);
+emit_32(3263995904);
+emit_32(1100106066);
+emit_32(1116512256);
+emit_32(3263483911);
+emit_32(1099771150);
+emit_32(1116512256);
+emit_32(3262775296);
+emit_32(1099629121);
+emit_32(1116512256);
+emit_32(3261751309);
+emit_32(1099071436);
+emit_32(1116512256);
+emit_32(3260727296);
+emit_32(1096827273);
+emit_32(1116512256);
+emit_32(3259703309);
+emit_32(1094327153);
+emit_32(1116512256);
+emit_32(3258679296);
+emit_32(1092289372);
+emit_32(1116512256);
+emit_32(3257655309);
+emit_32(1091186899);
+emit_32(1116512256);
+emit_32(3256631296);
+emit_32(1091068620);
+emit_32(1116512256);
+emit_32(3255607309);
+emit_32(1092988332);
+emit_32(1116512256);
+emit_32(3254386688);
+emit_32(1093789024);
+emit_32(1116512256);
+emit_32(3252338714);
+emit_32(1095575588);
+emit_32(1116512256);
+emit_32(3250290688);
+emit_32(1097077673);
+emit_32(1116512256);
+emit_32(3248242714);
+emit_32(1098285423);
+emit_32(1116512256);
+emit_32(3245998080);
+emit_32(1099366400);
+emit_32(1116512256);
+emit_32(3241902132);
+emit_32(1099809528);
+emit_32(1116512256);
+emit_32(3237609472);
+emit_32(1100308336);
+emit_32(1116512256);
+emit_32(3229220864);
+emit_32(1100857999);
+emit_32(1116512256);
+emit_32(0);
+emit_32(1101690883);
+emit_32(1116512256);
+emit_32(1081737216);
+emit_32(1102550401);
+emit_32(1116512256);
+emit_32(3279552512);
+emit_32(1083244397);
+emit_32(1116000263);
+emit_32(3279296528);
+emit_32(1081021794);
+emit_32(1116000263);
+emit_32(3279040545);
+emit_32(1081320051);
+emit_32(1116000263);
+emit_32(3278784496);
+emit_32(1083021910);
+emit_32(1116000263);
+emit_32(3278528512);
+emit_32(1084294064);
+emit_32(1116000263);
+emit_32(3278272528);
+emit_32(1087656092);
+emit_32(1116000263);
+emit_32(3278016545);
+emit_32(1089797599);
+emit_32(1116000263);
+emit_32(3277760496);
+emit_32(1091098955);
+emit_32(1116000263);
+emit_32(3277504512);
+emit_32(1091272610);
+emit_32(1116000263);
+emit_32(3277248528);
+emit_32(1089866763);
+emit_32(1116000263);
+emit_32(3276992545);
+emit_32(1091139178);
+emit_32(1116000263);
+emit_32(3276736496);
+emit_32(1092341580);
+emit_32(1116000263);
+emit_32(3276480512);
+emit_32(1092757540);
+emit_32(1116000263);
+emit_32(3276224528);
+emit_32(1092728914);
+emit_32(1116000263);
+emit_32(3275968545);
+emit_32(1093810939);
+emit_32(1116000263);
+emit_32(3275712496);
+emit_32(1096373135);
+emit_32(1116000263);
+emit_32(3275456512);
+emit_32(1098378222);
+emit_32(1116000263);
+emit_32(3275200528);
+emit_32(1099724174);
+emit_32(1116000263);
+emit_32(3274944545);
+emit_32(1100967628);
+emit_32(1116000263);
+emit_32(3274688496);
+emit_32(1101558815);
+emit_32(1116000263);
+emit_32(3274432512);
+emit_32(1102315677);
+emit_32(1116000263);
+emit_32(3274176528);
+emit_32(1103940446);
+emit_32(1116000263);
+emit_32(3273920545);
+emit_32(1104679902);
+emit_32(1116000263);
+emit_32(3273664496);
+emit_32(1105155378);
+emit_32(1116000263);
+emit_32(3273408512);
+emit_32(1106194674);
+emit_32(1116000263);
+emit_32(3273152528);
+emit_32(1107343049);
+emit_32(1116000263);
+emit_32(3272896545);
+emit_32(1107838081);
+emit_32(1116000263);
+emit_32(3272640496);
+emit_32(1107954998);
+emit_32(1116000263);
+emit_32(3272384512);
+emit_32(1107867599);
+emit_32(1116000263);
+emit_32(3272128528);
+emit_32(1107645196);
+emit_32(1116000263);
+emit_32(3271872545);
+emit_32(1107550274);
+emit_32(1116000263);
+emit_32(3271616496);
+emit_32(1107544690);
+emit_32(1116000263);
+emit_32(3271163904);
+emit_32(1107694348);
+emit_32(1116000263);
+emit_32(3270651937);
+emit_32(1107550929);
+emit_32(1116000263);
+emit_32(3270139970);
+emit_32(1107424654);
+emit_32(1116000263);
+emit_32(3269627871);
+emit_32(1107580892);
+emit_32(1116000263);
+emit_32(3269115904);
+emit_32(1107466676);
+emit_32(1116000263);
+emit_32(3268603937);
+emit_32(1107518292);
+emit_32(1116000263);
+emit_32(3268091970);
+emit_32(1107507911);
+emit_32(1116000263);
+emit_32(3267579911);
+emit_32(1107068767);
+emit_32(1116000263);
+emit_32(3267067904);
+emit_32(1105975417);
+emit_32(1116000263);
+emit_32(3266555911);
+emit_32(1105550692);
+emit_32(1116000263);
+emit_32(3266043904);
+emit_32(1104364438);
+emit_32(1116000263);
+emit_32(3265531911);
+emit_32(1103311090);
+emit_32(1116000263);
+emit_32(3265019904);
+emit_32(1102266709);
+emit_32(1116000263);
+emit_32(3264507911);
+emit_32(1101111021);
+emit_32(1116000263);
+emit_32(3263995904);
+emit_32(1100245264);
+emit_32(1116000263);
+emit_32(3263483911);
+emit_32(1099460667);
+emit_32(1116000263);
+emit_32(3262775296);
+emit_32(1099464599);
+emit_32(1116000263);
+emit_32(3261751309);
+emit_32(1098898106);
+emit_32(1116000263);
+emit_32(3260727296);
+emit_32(1096169292);
+emit_32(1116000263);
+emit_32(3259703309);
+emit_32(1094572520);
+emit_32(1116000263);
+emit_32(3258679296);
+emit_32(1091595424);
+emit_32(1116000263);
+emit_32(3257655309);
+emit_32(1091557613);
+emit_32(1116000263);
+emit_32(3256631296);
+emit_32(1092673130);
+emit_32(1116000263);
+emit_32(3255607309);
+emit_32(1094406950);
+emit_32(1116000263);
+emit_32(3254386688);
+emit_32(1095233018);
+emit_32(1116000263);
+emit_32(3252338714);
+emit_32(1096870789);
+emit_32(1116000263);
+emit_32(3250290688);
+emit_32(1098084201);
+emit_32(1116000263);
+emit_32(3248242714);
+emit_32(1099279316);
+emit_32(1116000263);
+emit_32(3245998080);
+emit_32(1099851838);
+emit_32(1116000263);
+emit_32(3241902132);
+emit_32(1100485021);
+emit_32(1116000263);
+emit_32(3237609472);
+emit_32(1101521958);
+emit_32(1116000263);
+emit_32(3229220864);
+emit_32(1102417389);
+emit_32(1116000263);
+emit_32(0);
+emit_32(1103083130);
+emit_32(1116000263);
+emit_32(1081737216);
+emit_32(1103917954);
+emit_32(1116000263);
+emit_32(3279552512);
+emit_32(1083552091);
+emit_32(1115291648);
+emit_32(3279296528);
+emit_32(1083005678);
+emit_32(1115291648);
+emit_32(3279040545);
+emit_32(1081863968);
+emit_32(1115291648);
+emit_32(3278784496);
+emit_32(1083192598);
+emit_32(1115291648);
+emit_32(3278528512);
+emit_32(1085321521);
+emit_32(1115291648);
+emit_32(3278272528);
+emit_32(1088639887);
+emit_32(1115291648);
+emit_32(3278016545);
+emit_32(1090626592);
+emit_32(1115291648);
+emit_32(3277760496);
+emit_32(1090904140);
+emit_32(1115291648);
+emit_32(3277504512);
+emit_32(1091130580);
+emit_32(1115291648);
+emit_32(3277248528);
+emit_32(1091114726);
+emit_32(1115291648);
+emit_32(3276992545);
+emit_32(1092567129);
+emit_32(1115291648);
+emit_32(3276736496);
+emit_32(1093130414);
+emit_32(1115291648);
+emit_32(3276480512);
+emit_32(1093467636);
+emit_32(1115291648);
+emit_32(3276224528);
+emit_32(1094287832);
+emit_32(1115291648);
+emit_32(3275968545);
+emit_32(1095800822);
+emit_32(1115291648);
+emit_32(3275712496);
+emit_32(1097484940);
+emit_32(1115291648);
+emit_32(3275456512);
+emit_32(1099294310);
+emit_32(1115291648);
+emit_32(3275200528);
+emit_32(1100172703);
+emit_32(1115291648);
+emit_32(3274944545);
+emit_32(1101504656);
+emit_32(1115291648);
+emit_32(3274688496);
+emit_32(1102638534);
+emit_32(1115291648);
+emit_32(3274432512);
+emit_32(1103640238);
+emit_32(1115291648);
+emit_32(3274176528);
+emit_32(1104536142);
+emit_32(1115291648);
+emit_32(3273920545);
+emit_32(1105040926);
+emit_32(1115291648);
+emit_32(3273664496);
+emit_32(1105781640);
+emit_32(1115291648);
+emit_32(3273408512);
+emit_32(1106871845);
+emit_32(1115291648);
+emit_32(3273152528);
+emit_32(1107552266);
+emit_32(1115291648);
+emit_32(3272896545);
+emit_32(1107681686);
+emit_32(1115291648);
+emit_32(3272640496);
+emit_32(1107745571);
+emit_32(1115291648);
+emit_32(3272384512);
+emit_32(1107728531);
+emit_32(1115291648);
+emit_32(3272128528);
+emit_32(1107564849);
+emit_32(1115291648);
+emit_32(3271872545);
+emit_32(1107489876);
+emit_32(1115291648);
+emit_32(3271616496);
+emit_32(1107455351);
+emit_32(1115291648);
+emit_32(3271163904);
+emit_32(1107468721);
+emit_32(1115291648);
+emit_32(3270651937);
+emit_32(1107084182);
+emit_32(1115291648);
+emit_32(3270139970);
+emit_32(1107222279);
+emit_32(1115291648);
+emit_32(3269627871);
+emit_32(1107484685);
+emit_32(1115291648);
+emit_32(3269115904);
+emit_32(1107529302);
+emit_32(1115291648);
+emit_32(3268603937);
+emit_32(1107488067);
+emit_32(1115291648);
+emit_32(3268091970);
+emit_32(1107407117);
+emit_32(1115291648);
+emit_32(3267579911);
+emit_32(1106883012);
+emit_32(1115291648);
+emit_32(3267067904);
+emit_32(1106605454);
+emit_32(1115291648);
+emit_32(3266555911);
+emit_32(1105505288);
+emit_32(1115291648);
+emit_32(3266043904);
+emit_32(1104212551);
+emit_32(1115291648);
+emit_32(3265531911);
+emit_32(1103004854);
+emit_32(1115291648);
+emit_32(3265019904);
+emit_32(1102070835);
+emit_32(1115291648);
+emit_32(3264507911);
+emit_32(1101098123);
+emit_32(1115291648);
+emit_32(3263995904);
+emit_32(1100325323);
+emit_32(1115291648);
+emit_32(3263483911);
+emit_32(1099328966);
+emit_32(1115291648);
+emit_32(3262775296);
+emit_32(1098611216);
+emit_32(1115291648);
+emit_32(3261751309);
+emit_32(1096735418);
+emit_32(1115291648);
+emit_32(3260727296);
+emit_32(1095838571);
+emit_32(1115291648);
+emit_32(3259703309);
+emit_32(1094605760);
+emit_32(1115291648);
+emit_32(3258679296);
+emit_32(1092525459);
+emit_32(1115291648);
+emit_32(3257655309);
+emit_32(1092767082);
+emit_32(1115291648);
+emit_32(3256631296);
+emit_32(1093983535);
+emit_32(1115291648);
+emit_32(3255607309);
+emit_32(1095249271);
+emit_32(1115291648);
+emit_32(3254386688);
+emit_32(1096927937);
+emit_32(1115291648);
+emit_32(3252338714);
+emit_32(1098207724);
+emit_32(1115291648);
+emit_32(3250290688);
+emit_32(1099233441);
+emit_32(1115291648);
+emit_32(3248242714);
+emit_32(1099875956);
+emit_32(1115291648);
+emit_32(3245998080);
+emit_32(1100637117);
+emit_32(1115291648);
+emit_32(3241902132);
+emit_32(1101503817);
+emit_32(1115291648);
+emit_32(3237609472);
+emit_32(1102802531);
+emit_32(1115291648);
+emit_32(3229220864);
+emit_32(1103593682);
+emit_32(1115291648);
+emit_32(0);
+emit_32(1104232317);
+emit_32(1115291648);
+emit_32(1081737216);
+emit_32(1104775951);
+emit_32(1115291648);
+emit_32(3279552512);
+emit_32(1082632448);
+emit_32(1114267661);
+emit_32(3279296528);
+emit_32(1083847999);
+emit_32(1114267661);
+emit_32(3279040545);
+emit_32(1083453043);
+emit_32(1114267661);
+emit_32(3278784496);
+emit_32(1084836240);
+emit_32(1114267661);
+emit_32(3278528512);
+emit_32(1087335416);
+emit_32(1114267661);
+emit_32(3278272528);
+emit_32(1088125267);
+emit_32(1114267661);
+emit_32(3278016545);
+emit_32(1091016904);
+emit_32(1114267661);
+emit_32(3277760496);
+emit_32(1091320320);
+emit_32(1114267661);
+emit_32(3277504512);
+emit_32(1091823731);
+emit_32(1114267661);
+emit_32(3277248528);
+emit_32(1092277020);
+emit_32(1114267661);
+emit_32(3276992545);
+emit_32(1093461659);
+emit_32(1114267661);
+emit_32(3276736496);
+emit_32(1095052768);
+emit_32(1114267661);
+emit_32(3276480512);
+emit_32(1095490234);
+emit_32(1114267661);
+emit_32(3276224528);
+emit_32(1095508899);
+emit_32(1114267661);
+emit_32(3275968545);
+emit_32(1097193541);
+emit_32(1114267661);
+emit_32(3275712496);
+emit_32(1098984561);
+emit_32(1114267661);
+emit_32(3275456512);
+emit_32(1099457574);
+emit_32(1114267661);
+emit_32(3275200528);
+emit_32(1100590141);
+emit_32(1114267661);
+emit_32(3274944545);
+emit_32(1101940969);
+emit_32(1114267661);
+emit_32(3274688496);
+emit_32(1103512417);
+emit_32(1114267661);
+emit_32(3274432512);
+emit_32(1104276147);
+emit_32(1114267661);
+emit_32(3274176528);
+emit_32(1104819310);
+emit_32(1114267661);
+emit_32(3273920545);
+emit_32(1105352144);
+emit_32(1114267661);
+emit_32(3273664496);
+emit_32(1106559369);
+emit_32(1114267661);
+emit_32(3273408512);
+emit_32(1107364859);
+emit_32(1114267661);
+emit_32(3273152528);
+emit_32(1107533470);
+emit_32(1114267661);
+emit_32(3272896545);
+emit_32(1107506024);
+emit_32(1114267661);
+emit_32(3272640496);
+emit_32(1107420801);
+emit_32(1114267661);
+emit_32(3272384512);
+emit_32(1107402398);
+emit_32(1114267661);
+emit_32(3272128528);
+emit_32(1107706013);
+emit_32(1114267661);
+emit_32(3271872545);
+emit_32(1107658749);
+emit_32(1114267661);
+emit_32(3271616496);
+emit_32(1107586292);
+emit_32(1114267661);
+emit_32(3271163904);
+emit_32(1107376315);
+emit_32(1114267661);
+emit_32(3270651937);
+emit_32(1107428560);
+emit_32(1114267661);
+emit_32(3270139970);
+emit_32(1107381348);
+emit_32(1114267661);
+emit_32(3269627871);
+emit_32(1107411416);
+emit_32(1114267661);
+emit_32(3269115904);
+emit_32(1107441222);
+emit_32(1114267661);
+emit_32(3268603937);
+emit_32(1107539552);
+emit_32(1114267661);
+emit_32(3268091970);
+emit_32(1107219658);
+emit_32(1114267661);
+emit_32(3267579911);
+emit_32(1106732804);
+emit_32(1114267661);
+emit_32(3267067904);
+emit_32(1106474592);
+emit_32(1114267661);
+emit_32(3266555911);
+emit_32(1105371857);
+emit_32(1114267661);
+emit_32(3266043904);
+emit_32(1103908989);
+emit_32(1114267661);
+emit_32(3265531911);
+emit_32(1102613892);
+emit_32(1114267661);
+emit_32(3265019904);
+emit_32(1101793853);
+emit_32(1114267661);
+emit_32(3264507911);
+emit_32(1101568305);
+emit_32(1114267661);
+emit_32(3263995904);
+emit_32(1100542693);
+emit_32(1114267661);
+emit_32(3263483911);
+emit_32(1099317327);
+emit_32(1114267661);
+emit_32(3262775296);
+emit_32(1098087557);
+emit_32(1114267661);
+emit_32(3261751309);
+emit_32(1096945867);
+emit_32(1114267661);
+emit_32(3260727296);
+emit_32(1096008440);
+emit_32(1114267661);
+emit_32(3259703309);
+emit_32(1094604292);
+emit_32(1114267661);
+emit_32(3258679296);
+emit_32(1093760293);
+emit_32(1114267661);
+emit_32(3257655309);
+emit_32(1095498203);
+emit_32(1114267661);
+emit_32(3256631296);
+emit_32(1096500642);
+emit_32(1114267661);
+emit_32(3255607309);
+emit_32(1097453063);
+emit_32(1114267661);
+emit_32(3254386688);
+emit_32(1098431594);
+emit_32(1114267661);
+emit_32(3252338714);
+emit_32(1099318061);
+emit_32(1114267661);
+emit_32(3250290688);
+emit_32(1100353529);
+emit_32(1114267661);
+emit_32(3248242714);
+emit_32(1100897373);
+emit_32(1114267661);
+emit_32(3245998080);
+emit_32(1101979661);
+emit_32(1114267661);
+emit_32(3241902132);
+emit_32(1102434481);
+emit_32(1114267661);
+emit_32(3237609472);
+emit_32(1103617327);
+emit_32(1114267661);
+emit_32(3229220864);
+emit_32(1104375972);
+emit_32(1114267661);
+emit_32(0);
+emit_32(1104908963);
+emit_32(1114267661);
+emit_32(1081737216);
+emit_32(1105382343);
+emit_32(1114267661);
+emit_32(3279552512);
+emit_32(1080567970);
+emit_32(1113243648);
+emit_32(3279296528);
+emit_32(1081431200);
+emit_32(1113243648);
+emit_32(3279040545);
+emit_32(1083053640);
+emit_32(1113243648);
+emit_32(3278784496);
+emit_32(1084804594);
+emit_32(1113243648);
+emit_32(3278528512);
+emit_32(1089344530);
+emit_32(1113243648);
+emit_32(3278272528);
+emit_32(1089662899);
+emit_32(1113243648);
+emit_32(3278016545);
+emit_32(1090822970);
+emit_32(1113243648);
+emit_32(3277760496);
+emit_32(1092219662);
+emit_32(1113243648);
+emit_32(3277504512);
+emit_32(1093309615);
+emit_32(1113243648);
+emit_32(3277248528);
+emit_32(1093760608);
+emit_32(1113243648);
+emit_32(3276992545);
+emit_32(1094942563);
+emit_32(1113243648);
+emit_32(3276736496);
+emit_32(1095970062);
+emit_32(1113243648);
+emit_32(3276480512);
+emit_32(1096808609);
+emit_32(1113243648);
+emit_32(3276224528);
+emit_32(1097144677);
+emit_32(1113243648);
+emit_32(3275968545);
+emit_32(1097732299);
+emit_32(1113243648);
+emit_32(3275712496);
+emit_32(1099213255);
+emit_32(1113243648);
+emit_32(3275456512);
+emit_32(1100077335);
+emit_32(1113243648);
+emit_32(3275200528);
+emit_32(1101037358);
+emit_32(1113243648);
+emit_32(3274944545);
+emit_32(1102522142);
+emit_32(1113243648);
+emit_32(3274688496);
+emit_32(1103670333);
+emit_32(1113243648);
+emit_32(3274432512);
+emit_32(1104447013);
+emit_32(1113243648);
+emit_32(3274176528);
+emit_32(1104860519);
+emit_32(1113243648);
+emit_32(3273920545);
+emit_32(1105841200);
+emit_32(1113243648);
+emit_32(3273664496);
+emit_32(1106724782);
+emit_32(1113243648);
+emit_32(3273408512);
+emit_32(1107646900);
+emit_32(1113243648);
+emit_32(3273152528);
+emit_32(1107527152);
+emit_32(1113243648);
+emit_32(3272896545);
+emit_32(1107447854);
+emit_32(1113243648);
+emit_32(3272640496);
+emit_32(1107457160);
+emit_32(1113243648);
+emit_32(3272384512);
+emit_32(1107532238);
+emit_32(1113243648);
+emit_32(3272128528);
+emit_32(1107881152);
+emit_32(1113243648);
+emit_32(3271872545);
+emit_32(1107776897);
+emit_32(1113243648);
+emit_32(3271616496);
+emit_32(1107520258);
+emit_32(1113243648);
+emit_32(3271163904);
+emit_32(1107733591);
+emit_32(1113243648);
+emit_32(3270651937);
+emit_32(1107557168);
+emit_32(1113243648);
+emit_32(3270139970);
+emit_32(1107429845);
+emit_32(1113243648);
+emit_32(3269627871);
+emit_32(1107409161);
+emit_32(1113243648);
+emit_32(3269115904);
+emit_32(1107202618);
+emit_32(1113243648);
+emit_32(3268603937);
+emit_32(1107218137);
+emit_32(1113243648);
+emit_32(3268091970);
+emit_32(1107106621);
+emit_32(1113243648);
+emit_32(3267579911);
+emit_32(1106476217);
+emit_32(1113243648);
+emit_32(3267067904);
+emit_32(1105687006);
+emit_32(1113243648);
+emit_32(3266555911);
+emit_32(1104462742);
+emit_32(1113243648);
+emit_32(3266043904);
+emit_32(1103481222);
+emit_32(1113243648);
+emit_32(3265531911);
+emit_32(1102608859);
+emit_32(1113243648);
+emit_32(3265019904);
+emit_32(1101715630);
+emit_32(1113243648);
+emit_32(3264507911);
+emit_32(1101203400);
+emit_32(1113243648);
+emit_32(3263995904);
+emit_32(1100648337);
+emit_32(1113243648);
+emit_32(3263483911);
+emit_32(1099410807);
+emit_32(1113243648);
+emit_32(3262775296);
+emit_32(1097508009);
+emit_32(1113243648);
+emit_32(3261751309);
+emit_32(1097324193);
+emit_32(1113243648);
+emit_32(3260727296);
+emit_32(1096121791);
+emit_32(1113243648);
+emit_32(3259703309);
+emit_32(1095057906);
+emit_32(1113243648);
+emit_32(3258679296);
+emit_32(1095394709);
+emit_32(1113243648);
+emit_32(3257655309);
+emit_32(1097088473);
+emit_32(1113243648);
+emit_32(3256631296);
+emit_32(1098581226);
+emit_32(1113243648);
+emit_32(3255607309);
+emit_32(1099014498);
+emit_32(1113243648);
+emit_32(3254386688);
+emit_32(1099554462);
+emit_32(1113243648);
+emit_32(3252338714);
+emit_32(1100356151);
+emit_32(1113243648);
+emit_32(3250290688);
+emit_32(1101134404);
+emit_32(1113243648);
+emit_32(3248242714);
+emit_32(1101886076);
+emit_32(1113243648);
+emit_32(3245998080);
+emit_32(1103145992);
+emit_32(1113243648);
+emit_32(3241902132);
+emit_32(1103709182);
+emit_32(1113243648);
+emit_32(3237609472);
+emit_32(1104517530);
+emit_32(1113243648);
+emit_32(3229220864);
+emit_32(1104959033);
+emit_32(1113243648);
+emit_32(0);
+emit_32(1105369183);
+emit_32(1113243648);
+emit_32(1081737216);
+emit_32(1105831238);
+emit_32(1113243648);
+emit_32(3279552512);
+emit_32(1081067470);
+emit_32(1112219661);
+emit_32(3279296528);
+emit_32(1081676273);
+emit_32(1112219661);
+emit_32(3279040545);
+emit_32(1082388277);
+emit_32(1112219661);
+emit_32(3278784496);
+emit_32(1084582317);
+emit_32(1112219661);
+emit_32(3278528512);
+emit_32(1086962144);
+emit_32(1112219661);
+emit_32(3278272528);
+emit_32(1088882737);
+emit_32(1112219661);
+emit_32(3278016545);
+emit_32(1091161282);
+emit_32(1112219661);
+emit_32(3277760496);
+emit_32(1092751983);
+emit_32(1112219661);
+emit_32(3277504512);
+emit_32(1095008308);
+emit_32(1112219661);
+emit_32(3277248528);
+emit_32(1095060318);
+emit_32(1112219661);
+emit_32(3276992545);
+emit_32(1096171599);
+emit_32(1112219661);
+emit_32(3276736496);
+emit_32(1096970718);
+emit_32(1112219661);
+emit_32(3276480512);
+emit_32(1096845518);
+emit_32(1112219661);
+emit_32(3276224528);
+emit_32(1097664037);
+emit_32(1112219661);
+emit_32(3275968545);
+emit_32(1099269407);
+emit_32(1112219661);
+emit_32(3275712496);
+emit_32(1099766956);
+emit_32(1112219661);
+emit_32(3275456512);
+emit_32(1100617351);
+emit_32(1112219661);
+emit_32(3275200528);
+emit_32(1101396967);
+emit_32(1112219661);
+emit_32(3274944545);
+emit_32(1102752933);
+emit_32(1112219661);
+emit_32(3274688496);
+emit_32(1103879838);
+emit_32(1112219661);
+emit_32(3274432512);
+emit_32(1104593866);
+emit_32(1112219661);
+emit_32(3274176528);
+emit_32(1105083131);
+emit_32(1112219661);
+emit_32(3273920545);
+emit_32(1106256803);
+emit_32(1112219661);
+emit_32(3273664496);
+emit_32(1106808091);
+emit_32(1112219661);
+emit_32(3273408512);
+emit_32(1107450869);
+emit_32(1112219661);
+emit_32(3273152528);
+emit_32(1107444944);
+emit_32(1112219661);
+emit_32(3272896545);
+emit_32(1107418258);
+emit_32(1112219661);
+emit_32(3272640496);
+emit_32(1107742425);
+emit_32(1112219661);
+emit_32(3272384512);
+emit_32(1108019590);
+emit_32(1112219661);
+emit_32(3272128528);
+emit_32(1107796584);
+emit_32(1112219661);
+emit_32(3271872545);
+emit_32(1107736920);
+emit_32(1112219661);
+emit_32(3271616496);
+emit_32(1107725360);
+emit_32(1112219661);
+emit_32(3271163904);
+emit_32(1107830270);
+emit_32(1112219661);
+emit_32(3270651937);
+emit_32(1107833101);
+emit_32(1112219661);
+emit_32(3270139970);
+emit_32(1107955024);
+emit_32(1112219661);
+emit_32(3269627871);
+emit_32(1107743788);
+emit_32(1112219661);
+emit_32(3269115904);
+emit_32(1107368686);
+emit_32(1112219661);
+emit_32(3268603937);
+emit_32(1107312194);
+emit_32(1112219661);
+emit_32(3268091970);
+emit_32(1106815641);
+emit_32(1112219661);
+emit_32(3267579911);
+emit_32(1106204059);
+emit_32(1112219661);
+emit_32(3267067904);
+emit_32(1105597773);
+emit_32(1112219661);
+emit_32(3266555911);
+emit_32(1104651905);
+emit_32(1112219661);
+emit_32(3266043904);
+emit_32(1103516559);
+emit_32(1112219661);
+emit_32(3265531911);
+emit_32(1102993162);
+emit_32(1112219661);
+emit_32(3265019904);
+emit_32(1101898029);
+emit_32(1112219661);
+emit_32(3264507911);
+emit_32(1100758804);
+emit_32(1112219661);
+emit_32(3263995904);
+emit_32(1100657040);
+emit_32(1112219661);
+emit_32(3263483911);
+emit_32(1099876637);
+emit_32(1112219661);
+emit_32(3262775296);
+emit_32(1097071696);
+emit_32(1112219661);
+emit_32(3261751309);
+emit_32(1097587910);
+emit_32(1112219661);
+emit_32(3260727296);
+emit_32(1096851915);
+emit_32(1112219661);
+emit_32(3259703309);
+emit_32(1095734447);
+emit_32(1112219661);
+emit_32(3258679296);
+emit_32(1096755026);
+emit_32(1112219661);
+emit_32(3257655309);
+emit_32(1098731382);
+emit_32(1112219661);
+emit_32(3256631296);
+emit_32(1099251896);
+emit_32(1112219661);
+emit_32(3255607309);
+emit_32(1099497577);
+emit_32(1112219661);
+emit_32(3254386688);
+emit_32(1100323121);
+emit_32(1112219661);
+emit_32(3252338714);
+emit_32(1101464601);
+emit_32(1112219661);
+emit_32(3250290688);
+emit_32(1102066431);
+emit_32(1112219661);
+emit_32(3248242714);
+emit_32(1102544581);
+emit_32(1112219661);
+emit_32(3245998080);
+emit_32(1103985902);
+emit_32(1112219661);
+emit_32(3241902132);
+emit_32(1104242698);
+emit_32(1112219661);
+emit_32(3237609472);
+emit_32(1105399801);
+emit_32(1112219661);
+emit_32(3229220864);
+emit_32(1105617119);
+emit_32(1112219661);
+emit_32(0);
+emit_32(1106104864);
+emit_32(1112219661);
+emit_32(1081737216);
+emit_32(1106473438);
+emit_32(1112219661);
+emit_32(3279552512);
+emit_32(1080840432);
+emit_32(1111195648);
+emit_32(3279296528);
+emit_32(1081651568);
+emit_32(1111195648);
+emit_32(3279040545);
+emit_32(1082066175);
+emit_32(1111195648);
+emit_32(3278784496);
+emit_32(1084264746);
+emit_32(1111195648);
+emit_32(3278528512);
+emit_32(1088920821);
+emit_32(1111195648);
+emit_32(3278272528);
+emit_32(1090060120);
+emit_32(1111195648);
+emit_32(3278016545);
+emit_32(1091098882);
+emit_32(1111195648);
+emit_32(3277760496);
+emit_32(1092897630);
+emit_32(1111195648);
+emit_32(3277504512);
+emit_32(1093865780);
+emit_32(1111195648);
+emit_32(3277248528);
+emit_32(1095144309);
+emit_32(1111195648);
+emit_32(3276992545);
+emit_32(1096518363);
+emit_32(1111195648);
+emit_32(3276736496);
+emit_32(1097299342);
+emit_32(1111195648);
+emit_32(3276480512);
+emit_32(1098421109);
+emit_32(1111195648);
+emit_32(3276224528);
+emit_32(1098491888);
+emit_32(1111195648);
+emit_32(3275968545);
+emit_32(1099350986);
+emit_32(1111195648);
+emit_32(3275712496);
+emit_32(1100200332);
+emit_32(1111195648);
+emit_32(3275456512);
+emit_32(1100698092);
+emit_32(1111195648);
+emit_32(3275200528);
+emit_32(1101450655);
+emit_32(1111195648);
+emit_32(3274944545);
+emit_32(1103069866);
+emit_32(1111195648);
+emit_32(3274688496);
+emit_32(1104305508);
+emit_32(1111195648);
+emit_32(3274432512);
+emit_32(1105027557);
+emit_32(1111195648);
+emit_32(3274176528);
+emit_32(1105330019);
+emit_32(1111195648);
+emit_32(3273920545);
+emit_32(1106064336);
+emit_32(1111195648);
+emit_32(3273664496);
+emit_32(1107261863);
+emit_32(1111195648);
+emit_32(3273408512);
+emit_32(1107667531);
+emit_32(1111195648);
+emit_32(3273152528);
+emit_32(1107670598);
+emit_32(1111195648);
+emit_32(3272896545);
+emit_32(1107641159);
+emit_32(1111195648);
+emit_32(3272640496);
+emit_32(1107722528);
+emit_32(1111195648);
+emit_32(3272384512);
+emit_32(1108132181);
+emit_32(1111195648);
+emit_32(3272128528);
+emit_32(1108041636);
+emit_32(1111195648);
+emit_32(3271872545);
+emit_32(1107852499);
+emit_32(1111195648);
+emit_32(3271616496);
+emit_32(1107940187);
+emit_32(1111195648);
+emit_32(3271163904);
+emit_32(1108075584);
+emit_32(1111195648);
+emit_32(3270651937);
+emit_32(1108051519);
+emit_32(1111195648);
+emit_32(3270139970);
+emit_32(1108131185);
+emit_32(1111195648);
+emit_32(3269627871);
+emit_32(1107856720);
+emit_32(1111195648);
+emit_32(3269115904);
+emit_32(1107481775);
+emit_32(1111195648);
+emit_32(3268603937);
+emit_32(1107354426);
+emit_32(1111195648);
+emit_32(3268091970);
+emit_32(1106901729);
+emit_32(1111195648);
+emit_32(3267579911);
+emit_32(1106228648);
+emit_32(1111195648);
+emit_32(3267067904);
+emit_32(1105262753);
+emit_32(1111195648);
+emit_32(3266555911);
+emit_32(1104721425);
+emit_32(1111195648);
+emit_32(3266043904);
+emit_32(1103674474);
+emit_32(1111195648);
+emit_32(3265531911);
+emit_32(1102786488);
+emit_32(1111195648);
+emit_32(3265019904);
+emit_32(1102197555);
+emit_32(1111195648);
+emit_32(3264507911);
+emit_32(1100931295);
+emit_32(1111195648);
+emit_32(3263995904);
+emit_32(1100417440);
+emit_32(1111195648);
+emit_32(3263483911);
+emit_32(1099561330);
+emit_32(1111195648);
+emit_32(3262775296);
+emit_32(1098381787);
+emit_32(1111195648);
+emit_32(3261751309);
+emit_32(1097372218);
+emit_32(1111195648);
+emit_32(3260727296);
+emit_32(1097540724);
+emit_32(1111195648);
+emit_32(3259703309);
+emit_32(1096128502);
+emit_32(1111195648);
+emit_32(3258679296);
+emit_32(1098525337);
+emit_32(1111195648);
+emit_32(3257655309);
+emit_32(1099283929);
+emit_32(1111195648);
+emit_32(3256631296);
+emit_32(1099669281);
+emit_32(1111195648);
+emit_32(3255607309);
+emit_32(1100104388);
+emit_32(1111195648);
+emit_32(3254386688);
+emit_32(1101177448);
+emit_32(1111195648);
+emit_32(3252338714);
+emit_32(1102411989);
+emit_32(1111195648);
+emit_32(3250290688);
+emit_32(1102859731);
+emit_32(1111195648);
+emit_32(3248242714);
+emit_32(1103261650);
+emit_32(1111195648);
+emit_32(3245998080);
+emit_32(1104208881);
+emit_32(1111195648);
+emit_32(3241902132);
+emit_32(1104930721);
+emit_32(1111195648);
+emit_32(3237609472);
+emit_32(1105910668);
+emit_32(1111195648);
+emit_32(3229220864);
+emit_32(1106135482);
+emit_32(1111195648);
+emit_32(0);
+emit_32(1106438364);
+emit_32(1111195648);
+emit_32(1081737216);
+emit_32(1106707585);
+emit_32(1111195648);
+emit_32(3279552512);
+emit_32(1082299945);
+emit_32(1110171661);
+emit_32(3279296528);
+emit_32(1082335492);
+emit_32(1110171661);
+emit_32(3279040545);
+emit_32(1081611639);
+emit_32(1110171661);
+emit_32(3278784496);
+emit_32(1084483730);
+emit_32(1110171661);
+emit_32(3278528512);
+emit_32(1087813567);
+emit_32(1110171661);
+emit_32(3278272528);
+emit_32(1090011655);
+emit_32(1110171661);
+emit_32(3278016545);
+emit_32(1090662443);
+emit_32(1110171661);
+emit_32(3277760496);
+emit_32(1091411913);
+emit_32(1110171661);
+emit_32(3277504512);
+emit_32(1093599547);
+emit_32(1110171661);
+emit_32(3277248528);
+emit_32(1095137283);
+emit_32(1110171661);
+emit_32(3276992545);
+emit_32(1096248040);
+emit_32(1110171661);
+emit_32(3276736496);
+emit_32(1097581409);
+emit_32(1110171661);
+emit_32(3276480512);
+emit_32(1098493460);
+emit_32(1110171661);
+emit_32(3276224528);
+emit_32(1098645189);
+emit_32(1110171661);
+emit_32(3275968545);
+emit_32(1099528405);
+emit_32(1110171661);
+emit_32(3275712496);
+emit_32(1100673398);
+emit_32(1110171661);
+emit_32(3275456512);
+emit_32(1101618269);
+emit_32(1110171661);
+emit_32(3275200528);
+emit_32(1102431073);
+emit_32(1110171661);
+emit_32(3274944545);
+emit_32(1103528093);
+emit_32(1110171661);
+emit_32(3274688496);
+emit_32(1104554597);
+emit_32(1110171661);
+emit_32(3274432512);
+emit_32(1105069133);
+emit_32(1110171661);
+emit_32(3274176528);
+emit_32(1105654658);
+emit_32(1110171661);
+emit_32(3273920545);
+emit_32(1106835145);
+emit_32(1110171661);
+emit_32(3273664496);
+emit_32(1107634160);
+emit_32(1110171661);
+emit_32(3273408512);
+emit_32(1107894338);
+emit_32(1110171661);
+emit_32(3273152528);
+emit_32(1107815222);
+emit_32(1110171661);
+emit_32(3272896545);
+emit_32(1107886788);
+emit_32(1110171661);
+emit_32(3272640496);
+emit_32(1107869984);
+emit_32(1110171661);
+emit_32(3272384512);
+emit_32(1108048085);
+emit_32(1110171661);
+emit_32(3272128528);
+emit_32(1108254890);
+emit_32(1110171661);
+emit_32(3271872545);
+emit_32(1108213734);
+emit_32(1110171661);
+emit_32(3271616496);
+emit_32(1108197324);
+emit_32(1110171661);
+emit_32(3271163904);
+emit_32(1108442612);
+emit_32(1110171661);
+emit_32(3270651937);
+emit_32(1108195515);
+emit_32(1110171661);
+emit_32(3270139970);
+emit_32(1107913422);
+emit_32(1110171661);
+emit_32(3269627871);
+emit_32(1108099754);
+emit_32(1110171661);
+emit_32(3269115904);
+emit_32(1107690809);
+emit_32(1110171661);
+emit_32(3268603937);
+emit_32(1107419726);
+emit_32(1110171661);
+emit_32(3268091970);
+emit_32(1106916881);
+emit_32(1110171661);
+emit_32(3267579911);
+emit_32(1106123581);
+emit_32(1110171661);
+emit_32(3267067904);
+emit_32(1105152285);
+emit_32(1110171661);
+emit_32(3266555911);
+emit_32(1104426985);
+emit_32(1110171661);
+emit_32(3266043904);
+emit_32(1103754376);
+emit_32(1110171661);
+emit_32(3265531911);
+emit_32(1102897113);
+emit_32(1110171661);
+emit_32(3265019904);
+emit_32(1102036808);
+emit_32(1110171661);
+emit_32(3264507911);
+emit_32(1100742237);
+emit_32(1110171661);
+emit_32(3263995904);
+emit_32(1099863477);
+emit_32(1110171661);
+emit_32(3263483911);
+emit_32(1099645950);
+emit_32(1110171661);
+emit_32(3262775296);
+emit_32(1099481114);
+emit_32(1110171661);
+emit_32(3261751309);
+emit_32(1098210135);
+emit_32(1110171661);
+emit_32(3260727296);
+emit_32(1097645582);
+emit_32(1110171661);
+emit_32(3259703309);
+emit_32(1097853619);
+emit_32(1110171661);
+emit_32(3258679296);
+emit_32(1099526675);
+emit_32(1110171661);
+emit_32(3257655309);
+emit_32(1100018090);
+emit_32(1110171661);
+emit_32(3256631296);
+emit_32(1100522927);
+emit_32(1110171661);
+emit_32(3255607309);
+emit_32(1100845993);
+emit_32(1110171661);
+emit_32(3254386688);
+emit_32(1101870924);
+emit_32(1110171661);
+emit_32(3252338714);
+emit_32(1102805362);
+emit_32(1110171661);
+emit_32(3250290688);
+emit_32(1103401216);
+emit_32(1110171661);
+emit_32(3248242714);
+emit_32(1103731255);
+emit_32(1110171661);
+emit_32(3245998080);
+emit_32(1104590458);
+emit_32(1110171661);
+emit_32(3241902132);
+emit_32(1105688946);
+emit_32(1110171661);
+emit_32(3237609472);
+emit_32(1106199393);
+emit_32(1110171661);
+emit_32(3229220864);
+emit_32(1106912477);
+emit_32(1110171661);
+emit_32(0);
+emit_32(1106977279);
+emit_32(1110171661);
+emit_32(1081737216);
+emit_32(1107240944);
+emit_32(1110171661);
+emit_32(3279552512);
+emit_32(1082717131);
+emit_32(1109147648);
+emit_32(3279296528);
+emit_32(1082557014);
+emit_32(1109147648);
+emit_32(3279040545);
+emit_32(1081304070);
+emit_32(1109147648);
+emit_32(3278784496);
+emit_32(1083792278);
+emit_32(1109147648);
+emit_32(3278528512);
+emit_32(1085314873);
+emit_32(1109147648);
+emit_32(3278272528);
+emit_32(1088245664);
+emit_32(1109147648);
+emit_32(3278016545);
+emit_32(1090788797);
+emit_32(1109147648);
+emit_32(3277760496);
+emit_32(1091410718);
+emit_32(1109147648);
+emit_32(3277504512);
+emit_32(1092169803);
+emit_32(1109147648);
+emit_32(3277248528);
+emit_32(1094073608);
+emit_32(1109147648);
+emit_32(3276992545);
+emit_32(1095322147);
+emit_32(1109147648);
+emit_32(3276736496);
+emit_32(1097073584);
+emit_32(1109147648);
+emit_32(3276480512);
+emit_32(1097631321);
+emit_32(1109147648);
+emit_32(3276224528);
+emit_32(1098886781);
+emit_32(1109147648);
+emit_32(3275968545);
+emit_32(1099653448);
+emit_32(1109147648);
+emit_32(3275712496);
+emit_32(1100796029);
+emit_32(1109147648);
+emit_32(3275456512);
+emit_32(1102110786);
+emit_32(1109147648);
+emit_32(3275200528);
+emit_32(1103014553);
+emit_32(1109147648);
+emit_32(3274944545);
+emit_32(1103661420);
+emit_32(1109147648);
+emit_32(3274688496);
+emit_32(1104730758);
+emit_32(1109147648);
+emit_32(3274432512);
+emit_32(1105461248);
+emit_32(1109147648);
+emit_32(3274176528);
+emit_32(1106228019);
+emit_32(1109147648);
+emit_32(3273920545);
+emit_32(1107398361);
+emit_32(1109147648);
+emit_32(3273664496);
+emit_32(1107773987);
+emit_32(1109147648);
+emit_32(3273408512);
+emit_32(1107908336);
+emit_32(1109147648);
+emit_32(3273152528);
+emit_32(1107942729);
+emit_32(1109147648);
+emit_32(3272896545);
+emit_32(1108010231);
+emit_32(1109147648);
+emit_32(3272640496);
+emit_32(1107850140);
+emit_32(1109147648);
+emit_32(3272384512);
+emit_32(1108057339);
+emit_32(1109147648);
+emit_32(3272128528);
+emit_32(1108245977);
+emit_32(1109147648);
+emit_32(3271872545);
+emit_32(1108269937);
+emit_32(1109147648);
+emit_32(3271616496);
+emit_32(1108532291);
+emit_32(1109147648);
+emit_32(3271163904);
+emit_32(1108595809);
+emit_32(1109147648);
+emit_32(3270651937);
+emit_32(1108363942);
+emit_32(1109147648);
+emit_32(3270139970);
+emit_32(1108139599);
+emit_32(1109147648);
+emit_32(3269627871);
+emit_32(1108065465);
+emit_32(1109147648);
+emit_32(3269115904);
+emit_32(1107970150);
+emit_32(1109147648);
+emit_32(3268603937);
+emit_32(1107690678);
+emit_32(1109147648);
+emit_32(3268091970);
+emit_32(1106957042);
+emit_32(1109147648);
+emit_32(3267579911);
+emit_32(1106262517);
+emit_32(1109147648);
+emit_32(3267067904);
+emit_32(1105527937);
+emit_32(1109147648);
+emit_32(3266555911);
+emit_32(1104380638);
+emit_32(1109147648);
+emit_32(3266043904);
+emit_32(1103529719);
+emit_32(1109147648);
+emit_32(3265531911);
+emit_32(1102593130);
+emit_32(1109147648);
+emit_32(3265019904);
+emit_32(1101585816);
+emit_32(1109147648);
+emit_32(3264507911);
+emit_32(1100545471);
+emit_32(1109147648);
+emit_32(3263995904);
+emit_32(1100004144);
+emit_32(1109147648);
+emit_32(3263483911);
+emit_32(1099601124);
+emit_32(1109147648);
+emit_32(3262775296);
+emit_32(1099485518);
+emit_32(1109147648);
+emit_32(3261751309);
+emit_32(1099132987);
+emit_32(1109147648);
+emit_32(3260727296);
+emit_32(1098562037);
+emit_32(1109147648);
+emit_32(3259703309);
+emit_32(1099204605);
+emit_32(1109147648);
+emit_32(3258679296);
+emit_32(1100206834);
+emit_32(1109147648);
+emit_32(3257655309);
+emit_32(1100697777);
+emit_32(1109147648);
+emit_32(3256631296);
+emit_32(1100970774);
+emit_32(1109147648);
+emit_32(3255607309);
+emit_32(1101185522);
+emit_32(1109147648);
+emit_32(3254386688);
+emit_32(1102281336);
+emit_32(1109147648);
+emit_32(3252338714);
+emit_32(1103401478);
+emit_32(1109147648);
+emit_32(3250290688);
+emit_32(1103912763);
+emit_32(1109147648);
+emit_32(3248242714);
+emit_32(1104404808);
+emit_32(1109147648);
+emit_32(3245998080);
+emit_32(1105352196);
+emit_32(1109147648);
+emit_32(3241902132);
+emit_32(1106248519);
+emit_32(1109147648);
+emit_32(3237609472);
+emit_32(1107362631);
+emit_32(1109147648);
+emit_32(3229220864);
+emit_32(1107724259);
+emit_32(1109147648);
+emit_32(0);
+emit_32(1107777290);
+emit_32(1109147648);
+emit_32(1081737216);
+emit_32(1108060956);
+emit_32(1109147648);
+emit_32(3279552512);
+emit_32(1081790232);
+emit_32(1108123661);
+emit_32(3279296528);
+emit_32(1079535290);
+emit_32(1108123661);
+emit_32(3279040545);
+emit_32(1079065864);
+emit_32(1108123661);
+emit_32(3278784496);
+emit_32(1082272577);
+emit_32(1108123661);
+emit_32(3278528512);
+emit_32(1083963574);
+emit_32(1108123661);
+emit_32(3278272528);
+emit_32(1087349677);
+emit_32(1108123661);
+emit_32(3278016545);
+emit_32(1088785241);
+emit_32(1108123661);
+emit_32(3277760496);
+emit_32(1090741705);
+emit_32(1108123661);
+emit_32(3277504512);
+emit_32(1090749360);
+emit_32(1108123661);
+emit_32(3277248528);
+emit_32(1093053448);
+emit_32(1108123661);
+emit_32(3276992545);
+emit_32(1094660601);
+emit_32(1108123661);
+emit_32(3276736496);
+emit_32(1096196555);
+emit_32(1108123661);
+emit_32(3276480512);
+emit_32(1096902351);
+emit_32(1108123661);
+emit_32(3276224528);
+emit_32(1098391434);
+emit_32(1108123661);
+emit_32(3275968545);
+emit_32(1099380084);
+emit_32(1108123661);
+emit_32(3275712496);
+emit_32(1101235225);
+emit_32(1108123661);
+emit_32(3275456512);
+emit_32(1102578188);
+emit_32(1108123661);
+emit_32(3275200528);
+emit_32(1103112385);
+emit_32(1108123661);
+emit_32(3274944545);
+emit_32(1103997541);
+emit_32(1108123661);
+emit_32(3274688496);
+emit_32(1104833046);
+emit_32(1108123661);
+emit_32(3274432512);
+emit_32(1105701582);
+emit_32(1108123661);
+emit_32(3274176528);
+emit_32(1106849458);
+emit_32(1108123661);
+emit_32(3273920545);
+emit_32(1107522617);
+emit_32(1108123661);
+emit_32(3273664496);
+emit_32(1107703025);
+emit_32(1108123661);
+emit_32(3273408512);
+emit_32(1107971565);
+emit_32(1108123661);
+emit_32(3273152528);
+emit_32(1107971565);
+emit_32(1108123661);
+emit_32(3272896545);
+emit_32(1107873025);
+emit_32(1108123661);
+emit_32(3272640496);
+emit_32(1108008685);
+emit_32(1108123661);
+emit_32(3272384512);
+emit_32(1108230878);
+emit_32(1108123661);
+emit_32(3272128528);
+emit_32(1108292220);
+emit_32(1108123661);
+emit_32(3271872545);
+emit_32(1108636520);
+emit_32(1108123661);
+emit_32(3271616496);
+emit_32(1108671909);
+emit_32(1108123661);
+emit_32(3271163904);
+emit_32(1108573789);
+emit_32(1108123661);
+emit_32(3270651937);
+emit_32(1108191583);
+emit_32(1108123661);
+emit_32(3270139970);
+emit_32(1108044546);
+emit_32(1108123661);
+emit_32(3269627871);
+emit_32(1108195856);
+emit_32(1108123661);
+emit_32(3269115904);
+emit_32(1108061848);
+emit_32(1108123661);
+emit_32(3268603937);
+emit_32(1107692487);
+emit_32(1108123661);
+emit_32(3268091970);
+emit_32(1107358332);
+emit_32(1108123661);
+emit_32(3267579911);
+emit_32(1106436476);
+emit_32(1108123661);
+emit_32(3267067904);
+emit_32(1105876117);
+emit_32(1108123661);
+emit_32(3266555911);
+emit_32(1104926002);
+emit_32(1108123661);
+emit_32(3266043904);
+emit_32(1103527150);
+emit_32(1108123661);
+emit_32(3265531911);
+emit_32(1102838969);
+emit_32(1108123661);
+emit_32(3265019904);
+emit_32(1101768163);
+emit_32(1108123661);
+emit_32(3264507911);
+emit_32(1100951952);
+emit_32(1108123661);
+emit_32(3263995904);
+emit_32(1099817497);
+emit_32(1108123661);
+emit_32(3263483911);
+emit_32(1099592683);
+emit_32(1108123661);
+emit_32(3262775296);
+emit_32(1099523424);
+emit_32(1108123661);
+emit_32(3261751309);
+emit_32(1099184734);
+emit_32(1108123661);
+emit_32(3260727296);
+emit_32(1099580100);
+emit_32(1108123661);
+emit_32(3259703309);
+emit_32(1100319870);
+emit_32(1108123661);
+emit_32(3258679296);
+emit_32(1100702181);
+emit_32(1108123661);
+emit_32(3257655309);
+emit_32(1101110811);
+emit_32(1108123661);
+emit_32(3256631296);
+emit_32(1101752487);
+emit_32(1108123661);
+emit_32(3255607309);
+emit_32(1101832074);
+emit_32(1108123661);
+emit_32(3254386688);
+emit_32(1103107038);
+emit_32(1108123661);
+emit_32(3252338714);
+emit_32(1103861173);
+emit_32(1108123661);
+emit_32(3250290688);
+emit_32(1104152415);
+emit_32(1108123661);
+emit_32(3248242714);
+emit_32(1104902672);
+emit_32(1108123661);
+emit_32(3245998080);
+emit_32(1106376602);
+emit_32(1108123661);
+emit_32(3241902132);
+emit_32(1107508593);
+emit_32(1108123661);
+emit_32(3237609472);
+emit_32(1108028267);
+emit_32(1108123661);
+emit_32(3229220864);
+emit_32(1108316180);
+emit_32(1108123661);
+emit_32(0);
+emit_32(1108600553);
+emit_32(1108123661);
+emit_32(1081737216);
+emit_32(1109011386);
+emit_32(1108123661);
+emit_32(3279552512);
+emit_32(1074938711);
+emit_32(1106903040);
+emit_32(3279296528);
+emit_32(1070708671);
+emit_32(1106903040);
+emit_32(3279040545);
+emit_32(1075430996);
+emit_32(1106903040);
+emit_32(3278784496);
+emit_32(1078754772);
+emit_32(1106903040);
+emit_32(3278528512);
+emit_32(1082105015);
+emit_32(1106903040);
+emit_32(3278272528);
+emit_32(1084220747);
+emit_32(1106903040);
+emit_32(3278016545);
+emit_32(1085553718);
+emit_32(1106903040);
+emit_32(3277760496);
+emit_32(1088135228);
+emit_32(1106903040);
+emit_32(3277504512);
+emit_32(1089208635);
+emit_32(1106903040);
+emit_32(3277248528);
+emit_32(1091931860);
+emit_32(1106903040);
+emit_32(3276992545);
+emit_32(1094402336);
+emit_32(1106903040);
+emit_32(3276736496);
+emit_32(1096213751);
+emit_32(1106903040);
+emit_32(3276480512);
+emit_32(1097279629);
+emit_32(1106903040);
+emit_32(3276224528);
+emit_32(1098783601);
+emit_32(1106903040);
+emit_32(3275968545);
+emit_32(1099888067);
+emit_32(1106903040);
+emit_32(3275712496);
+emit_32(1101525837);
+emit_32(1106903040);
+emit_32(3275456512);
+emit_32(1102857267);
+emit_32(1106903040);
+emit_32(3275200528);
+emit_32(1103317277);
+emit_32(1106903040);
+emit_32(3274944545);
+emit_32(1104193048);
+emit_32(1106903040);
+emit_32(3274688496);
+emit_32(1105188461);
+emit_32(1106903040);
+emit_32(3274432512);
+emit_32(1105975732);
+emit_32(1106903040);
+emit_32(3274176528);
+emit_32(1107142692);
+emit_32(1106903040);
+emit_32(3273920545);
+emit_32(1107580315);
+emit_32(1106903040);
+emit_32(3273664496);
+emit_32(1107715634);
+emit_32(1106903040);
+emit_32(3273408512);
+emit_32(1107697441);
+emit_32(1106903040);
+emit_32(3273152528);
+emit_32(1107818683);
+emit_32(1106903040);
+emit_32(3272896545);
+emit_32(1108195331);
+emit_32(1106903040);
+emit_32(3272640496);
+emit_32(1108463609);
+emit_32(1106903040);
+emit_32(3272384512);
+emit_32(1108323782);
+emit_32(1106903040);
+emit_32(3272128528);
+emit_32(1108524374);
+emit_32(1106903040);
+emit_32(3271872545);
+emit_32(1108820912);
+emit_32(1106903040);
+emit_32(3271616496);
+emit_32(1108768614);
+emit_32(1106903040);
+emit_32(3271163904);
+emit_32(1108591929);
+emit_32(1106903040);
+emit_32(3270651937);
+emit_32(1108250146);
+emit_32(1106903040);
+emit_32(3270139970);
+emit_32(1108083370);
+emit_32(1106903040);
+emit_32(3269627871);
+emit_32(1108183876);
+emit_32(1106903040);
+emit_32(3269115904);
+emit_32(1107985354);
+emit_32(1106903040);
+emit_32(3268603937);
+emit_32(1107793333);
+emit_32(1106903040);
+emit_32(3268091970);
+emit_32(1107344595);
+emit_32(1106903040);
+emit_32(3267579911);
+emit_32(1106660190);
+emit_32(1106903040);
+emit_32(3267067904);
+emit_32(1105863377);
+emit_32(1106903040);
+emit_32(3266555911);
+emit_32(1104810344);
+emit_32(1106903040);
+emit_32(3266043904);
+emit_32(1103848328);
+emit_32(1106903040);
+emit_32(3265531911);
+emit_32(1102592396);
+emit_32(1106903040);
+emit_32(3265019904);
+emit_32(1101769893);
+emit_32(1106903040);
+emit_32(3264507911);
+emit_32(1100719378);
+emit_32(1106903040);
+emit_32(3263995904);
+emit_32(1100007709);
+emit_32(1106903040);
+emit_32(3263483911);
+emit_32(1099495585);
+emit_32(1106903040);
+emit_32(3262775296);
+emit_32(1099523739);
+emit_32(1106903040);
+emit_32(3261751309);
+emit_32(1099506857);
+emit_32(1106903040);
+emit_32(3260727296);
+emit_32(1100188693);
+emit_32(1106903040);
+emit_32(3259703309);
+emit_32(1100974496);
+emit_32(1106903040);
+emit_32(3258679296);
+emit_32(1101640447);
+emit_32(1106903040);
+emit_32(3257655309);
+emit_32(1101639503);
+emit_32(1106903040);
+emit_32(3256631296);
+emit_32(1102123945);
+emit_32(1106903040);
+emit_32(3255607309);
+emit_32(1102739250);
+emit_32(1106903040);
+emit_32(3254386688);
+emit_32(1103471260);
+emit_32(1106903040);
+emit_32(3252338714);
+emit_32(1104291457);
+emit_32(1106903040);
+emit_32(3250290688);
+emit_32(1104973241);
+emit_32(1106903040);
+emit_32(3248242714);
+emit_32(1106462586);
+emit_32(1106903040);
+emit_32(3245998080);
+emit_32(1107570275);
+emit_32(1106903040);
+emit_32(3241902132);
+emit_32(1108078939);
+emit_32(1106903040);
+emit_32(3237609472);
+emit_32(1108626034);
+emit_32(1106903040);
+emit_32(3229220864);
+emit_32(1109189434);
+emit_32(1106903040);
+emit_32(0);
+emit_32(1109489300);
+emit_32(1106903040);
+emit_32(1081737216);
+emit_32(1109770397);
+emit_32(1106903040);
+emit_32(3279552512);
+emit_32(1056202922);
+emit_32(1104855066);
+emit_32(3279296528);
+emit_32(1059176634);
+emit_32(1104855066);
+emit_32(3279040545);
+emit_32(1067152489);
+emit_32(1104855066);
+emit_32(3278784496);
+emit_32(1069776361);
+emit_32(1104855066);
+emit_32(3278528512);
+emit_32(1076809790);
+emit_32(1104855066);
+emit_32(3278272528);
+emit_32(1080678154);
+emit_32(1104855066);
+emit_32(3278016545);
+emit_32(1084300292);
+emit_32(1104855066);
+emit_32(3277760496);
+emit_32(1086892330);
+emit_32(1104855066);
+emit_32(3277504512);
+emit_32(1089616510);
+emit_32(1104855066);
+emit_32(3277248528);
+emit_32(1092235758);
+emit_32(1104855066);
+emit_32(3276992545);
+emit_32(1094086505);
+emit_32(1104855066);
+emit_32(3276736496);
+emit_32(1095456260);
+emit_32(1104855066);
+emit_32(3276480512);
+emit_32(1097209794);
+emit_32(1104855066);
+emit_32(3276224528);
+emit_32(1098815478);
+emit_32(1104855066);
+emit_32(3275968545);
+emit_32(1099901331);
+emit_32(1104855066);
+emit_32(3275712496);
+emit_32(1101448138);
+emit_32(1104855066);
+emit_32(3275456512);
+emit_32(1102457340);
+emit_32(1104855066);
+emit_32(3275200528);
+emit_32(1103405724);
+emit_32(1104855014);
+emit_32(3274944545);
+emit_32(1104703652);
+emit_32(1104855066);
+emit_32(3274688496);
+emit_32(1105909409);
+emit_32(1104855014);
+emit_32(3274432512);
+emit_32(1106485392);
+emit_32(1104855066);
+emit_32(3274176528);
+emit_32(1107410708);
+emit_32(1104855014);
+emit_32(3273920545);
+emit_32(1107950751);
+emit_32(1104855066);
+emit_32(3273664496);
+emit_32(1108072569);
+emit_32(1104855014);
+emit_32(3273408512);
+emit_32(1108067090);
+emit_32(1104855066);
+emit_32(3273152528);
+emit_32(1108270514);
+emit_32(1104855014);
+emit_32(3272896545);
+emit_32(1108617121);
+emit_32(1104855066);
+emit_32(3272640496);
+emit_32(1108893604);
+emit_32(1104855014);
+emit_32(3272384512);
+emit_32(1108708478);
+emit_32(1104855066);
+emit_32(3272128528);
+emit_32(1108458498);
+emit_32(1104855014);
+emit_32(3271872545);
+emit_32(1108616544);
+emit_32(1104855066);
+emit_32(3271616496);
+emit_32(1108674898);
+emit_32(1104855014);
+emit_32(3271163904);
+emit_32(1108489064);
+emit_32(1104855066);
+emit_32(3270651937);
+emit_32(1108208884);
+emit_32(1104855014);
+emit_32(3270139970);
+emit_32(1108168330);
+emit_32(1104855066);
+emit_32(3269627871);
+emit_32(1107919032);
+emit_32(1104855014);
+emit_32(3269115904);
+emit_32(1107884900);
+emit_32(1104855066);
+emit_32(3268603937);
+emit_32(1107737995);
+emit_32(1104855014);
+emit_32(3268091970);
+emit_32(1107388714);
+emit_32(1104855066);
+emit_32(3267579911);
+emit_32(1106305876);
+emit_32(1104855014);
+emit_32(3267067904);
+emit_32(1105456634);
+emit_32(1104855066);
+emit_32(3266555911);
+emit_32(1104695683);
+emit_32(1104855014);
+emit_32(3266043904);
+emit_32(1103610459);
+emit_32(1104855066);
+emit_32(3265531911);
+emit_32(1102562093);
+emit_32(1104855014);
+emit_32(3265019904);
+emit_32(1101922409);
+emit_32(1104855066);
+emit_32(3264507911);
+emit_32(1100403809);
+emit_32(1104855066);
+emit_32(3263995904);
+emit_32(1100079589);
+emit_32(1104855066);
+emit_32(3263483911);
+emit_32(1100150630);
+emit_32(1104855066);
+emit_32(3262775296);
+emit_32(1100309489);
+emit_32(1104855066);
+emit_32(3261751309);
+emit_32(1100247676);
+emit_32(1104855066);
+emit_32(3260727296);
+emit_32(1100564555);
+emit_32(1104855066);
+emit_32(3259703309);
+emit_32(1101442528);
+emit_32(1104855066);
+emit_32(3258679296);
+emit_32(1101848484);
+emit_32(1104855066);
+emit_32(3257655309);
+emit_32(1102017567);
+emit_32(1104855014);
+emit_32(3256631296);
+emit_32(1102603144);
+emit_32(1104855066);
+emit_32(3255607309);
+emit_32(1103556772);
+emit_32(1104855014);
+emit_32(3254386688);
+emit_32(1103988313);
+emit_32(1104855066);
+emit_32(3252338714);
+emit_32(1105183113);
+emit_32(1104855014);
+emit_32(3250290688);
+emit_32(1106410471);
+emit_32(1104855066);
+emit_32(3248242714);
+emit_32(1107817844);
+emit_32(1104855014);
+emit_32(3245998080);
+emit_32(1108265874);
+emit_32(1104855066);
+emit_32(3241902132);
+emit_32(1108848489);
+emit_32(1104855014);
+emit_32(3237609472);
+emit_32(1109428929);
+emit_32(1104855066);
+emit_32(3229220864);
+emit_32(1109814464);
+emit_32(1104855014);
+emit_32(0);
+emit_32(1109989261);
+emit_32(1104855066);
+emit_32(1081737216);
+emit_32(1110109952);
+emit_32(1104855014);
+emit_32(3279552512);
+emit_32(1043753825);
+emit_32(1102807040);
+emit_32(3279296528);
+emit_32(1066019523);
+emit_32(1102807040);
+emit_32(3279040545);
+emit_32(1069754970);
+emit_32(1102807040);
+emit_32(3278784496);
+emit_32(1076201867);
+emit_32(1102807040);
+emit_32(3278528512);
+emit_32(1080094139);
+emit_32(1102807040);
+emit_32(3278272528);
+emit_32(1082614937);
+emit_32(1102807040);
+emit_32(3278016545);
+emit_32(1085915917);
+emit_32(1102807040);
+emit_32(3277760496);
+emit_32(1088968951);
+emit_32(1102807040);
+emit_32(3277504512);
+emit_32(1091412437);
+emit_32(1102807040);
+emit_32(3277248528);
+emit_32(1093562951);
+emit_32(1102807040);
+emit_32(3276992545);
+emit_32(1095461818);
+emit_32(1102807040);
+emit_32(3276736496);
+emit_32(1097780324);
+emit_32(1102807040);
+emit_32(3276480512);
+emit_32(1098541276);
+emit_32(1102807040);
+emit_32(3276224528);
+emit_32(1099184996);
+emit_32(1102807040);
+emit_32(3275968545);
+emit_32(1099512414);
+emit_32(1102807040);
+emit_32(3275712496);
+emit_32(1101300079);
+emit_32(1102807040);
+emit_32(3275456512);
+emit_32(1102630565);
+emit_32(1102807040);
+emit_32(3275200528);
+emit_32(1103513990);
+emit_32(1102807040);
+emit_32(3274944545);
+emit_32(1104603251);
+emit_32(1102807040);
+emit_32(3274688496);
+emit_32(1105499154);
+emit_32(1102807040);
+emit_32(3274432512);
+emit_32(1106400667);
+emit_32(1102807040);
+emit_32(3274176528);
+emit_32(1107499889);
+emit_32(1102807040);
+emit_32(3273920545);
+emit_32(1107983047);
+emit_32(1102807040);
+emit_32(3273664496);
+emit_32(1108263620);
+emit_32(1102807040);
+emit_32(3273408512);
+emit_32(1108637542);
+emit_32(1102807040);
+emit_32(3273152528);
+emit_32(1108628367);
+emit_32(1102807040);
+emit_32(3272896545);
+emit_32(1108868989);
+emit_32(1102807040);
+emit_32(3272640496);
+emit_32(1109049213);
+emit_32(1102807040);
+emit_32(3272384512);
+emit_32(1108849748);
+emit_32(1102807040);
+emit_32(3272128528);
+emit_32(1108540811);
+emit_32(1102807040);
+emit_32(3271872545);
+emit_32(1108655184);
+emit_32(1102807040);
+emit_32(3271616496);
+emit_32(1108572425);
+emit_32(1102807040);
+emit_32(3271163904);
+emit_32(1108411810);
+emit_32(1102807040);
+emit_32(3270651937);
+emit_32(1108042344);
+emit_32(1102807040);
+emit_32(3270139970);
+emit_32(1107971460);
+emit_32(1102807040);
+emit_32(3269627871);
+emit_32(1107793412);
+emit_32(1102807040);
+emit_32(3269115904);
+emit_32(1107689131);
+emit_32(1102807040);
+emit_32(3268603937);
+emit_32(1107563643);
+emit_32(1102807040);
+emit_32(3268091970);
+emit_32(1107010152);
+emit_32(1102807040);
+emit_32(3267579911);
+emit_32(1106032669);
+emit_32(1102807040);
+emit_32(3267067904);
+emit_32(1105136609);
+emit_32(1102807040);
+emit_32(3266555911);
+emit_32(1104406695);
+emit_32(1102807040);
+emit_32(3266043904);
+emit_32(1103385749);
+emit_32(1102807040);
+emit_32(3265531911);
+emit_32(1102373034);
+emit_32(1102807040);
+emit_32(3265019904);
+emit_32(1101728317);
+emit_32(1102807040);
+emit_32(3264507911);
+emit_32(1100615464);
+emit_32(1102807040);
+emit_32(3263995904);
+emit_32(1100840278);
+emit_32(1102807040);
+emit_32(3263483911);
+emit_32(1100652636);
+emit_32(1102807040);
+emit_32(3262775296);
+emit_32(1101193963);
+emit_32(1102807040);
+emit_32(3261751309);
+emit_32(1101527463);
+emit_32(1102807040);
+emit_32(3260727296);
+emit_32(1101300761);
+emit_32(1102807040);
+emit_32(3259703309);
+emit_32(1101861382);
+emit_32(1102807040);
+emit_32(3258679296);
+emit_32(1102090338);
+emit_32(1102807040);
+emit_32(3257655309);
+emit_32(1102730966);
+emit_32(1102807040);
+emit_32(3256631296);
+emit_32(1103554255);
+emit_32(1102807040);
+emit_32(3255607309);
+emit_32(1104113408);
+emit_32(1102807040);
+emit_32(3254386688);
+emit_32(1104786647);
+emit_32(1102807040);
+emit_32(3252338714);
+emit_32(1106105913);
+emit_32(1102807040);
+emit_32(3250290688);
+emit_32(1107509877);
+emit_32(1102807040);
+emit_32(3248242714);
+emit_32(1108222175);
+emit_32(1102807040);
+emit_32(3245998080);
+emit_32(1108925324);
+emit_32(1102807040);
+emit_32(3241902132);
+emit_32(1109456873);
+emit_32(1102807040);
+emit_32(3237609472);
+emit_32(1109851609);
+emit_32(1102807040);
+emit_32(3229220864);
+emit_32(1110277358);
+emit_32(1102807040);
+emit_32(0);
+emit_32(1110377130);
+emit_32(1102807040);
+emit_32(1081737216);
+emit_32(1110619796);
+emit_32(1102807040);
+emit_32(3279552512);
+emit_32(1041074638);
+emit_32(1100759066);
+emit_32(3279296528);
+emit_32(1068712015);
+emit_32(1100759066);
+emit_32(3279040545);
+emit_32(1079048248);
+emit_32(1100759066);
+emit_32(3278784496);
+emit_32(1080674002);
+emit_32(1100759066);
+emit_32(3278528512);
+emit_32(1084030494);
+emit_32(1100759066);
+emit_32(3278272528);
+emit_32(1086394970);
+emit_32(1100759066);
+emit_32(3278016545);
+emit_32(1090514279);
+emit_32(1100759066);
+emit_32(3277760496);
+emit_32(1092005166);
+emit_32(1100759066);
+emit_32(3277504512);
+emit_32(1092661805);
+emit_32(1100759066);
+emit_32(3277248528);
+emit_32(1094882479);
+emit_32(1100759066);
+emit_32(3276992545);
+emit_32(1096495818);
+emit_32(1100759066);
+emit_32(3276736496);
+emit_32(1098656304);
+emit_32(1100759066);
+emit_32(3276480512);
+emit_32(1098988860);
+emit_32(1100759066);
+emit_32(3276224528);
+emit_32(1099485466);
+emit_32(1100759066);
+emit_32(3275968545);
+emit_32(1100054109);
+emit_32(1100759066);
+emit_32(3275712496);
+emit_32(1101363203);
+emit_32(1100759066);
+emit_32(3275456512);
+emit_32(1102623015);
+emit_32(1100759014);
+emit_32(3275200528);
+emit_32(1103260025);
+emit_32(1100759066);
+emit_32(3274944545);
+emit_32(1104497764);
+emit_32(1100759014);
+emit_32(3274688496);
+emit_32(1105320739);
+emit_32(1100759066);
+emit_32(3274432512);
+emit_32(1106586055);
+emit_32(1100759014);
+emit_32(3274176528);
+emit_32(1107523640);
+emit_32(1100759066);
+emit_32(3273920545);
+emit_32(1108105783);
+emit_32(1100759014);
+emit_32(3273664496);
+emit_32(1108678148);
+emit_32(1100759066);
+emit_32(3273408512);
+emit_32(1109027062);
+emit_32(1100759014);
+emit_32(3273152528);
+emit_32(1108942022);
+emit_32(1100759066);
+emit_32(3272896545);
+emit_32(1108995290);
+emit_32(1100759014);
+emit_32(3272640496);
+emit_32(1108955129);
+emit_32(1100759066);
+emit_32(3272384512);
+emit_32(1108906895);
+emit_32(1100759014);
+emit_32(3272128528);
+emit_32(1108765993);
+emit_32(1100759014);
+emit_32(3271872545);
+emit_32(1108661948);
+emit_32(1100759014);
+emit_32(3271616496);
+emit_32(1108494097);
+emit_32(1100759014);
+emit_32(3271163904);
+emit_32(1108408166);
+emit_32(1100759014);
+emit_32(3270651937);
+emit_32(1107959611);
+emit_32(1100759014);
+emit_32(3270139970);
+emit_32(1107654974);
+emit_32(1100759014);
+emit_32(3269627871);
+emit_32(1107500859);
+emit_32(1100759014);
+emit_32(3269115904);
+emit_32(1107220916);
+emit_32(1100759014);
+emit_32(3268603937);
+emit_32(1106950121);
+emit_32(1100759014);
+emit_32(3268091970);
+emit_32(1106110684);
+emit_32(1100759014);
+emit_32(3267579911);
+emit_32(1105572449);
+emit_32(1100759014);
+emit_32(3267067904);
+emit_32(1105141642);
+emit_32(1100759014);
+emit_32(3266555911);
+emit_32(1104163950);
+emit_32(1100759014);
+emit_32(3266043904);
+emit_32(1103388685);
+emit_32(1100759014);
+emit_32(3265531911);
+emit_32(1102762790);
+emit_32(1100759014);
+emit_32(3265019904);
+emit_32(1101771361);
+emit_32(1100759066);
+emit_32(3264507911);
+emit_32(1101188668);
+emit_32(1100759066);
+emit_32(3263995904);
+emit_32(1101103314);
+emit_32(1100759066);
+emit_32(3263483911);
+emit_32(1101520595);
+emit_32(1100759066);
+emit_32(3262775296);
+emit_32(1102173438);
+emit_32(1100759014);
+emit_32(3261751309);
+emit_32(1102239498);
+emit_32(1100759014);
+emit_32(3260727296);
+emit_32(1102454928);
+emit_32(1100759014);
+emit_32(3259703309);
+emit_32(1102538762);
+emit_32(1100759014);
+emit_32(3258679296);
+emit_32(1102868120);
+emit_32(1100759014);
+emit_32(3257655309);
+emit_32(1103304380);
+emit_32(1100759014);
+emit_32(3256631296);
+emit_32(1103894256);
+emit_32(1100759014);
+emit_32(3255607309);
+emit_32(1104606187);
+emit_32(1100759014);
+emit_32(3254386688);
+emit_32(1105706615);
+emit_32(1100759014);
+emit_32(3252338714);
+emit_32(1106778469);
+emit_32(1100759014);
+emit_32(3250290688);
+emit_32(1108039618);
+emit_32(1100759014);
+emit_32(3248242714);
+emit_32(1108668894);
+emit_32(1100759014);
+emit_32(3245998080);
+emit_32(1109286558);
+emit_32(1100759014);
+emit_32(3241902132);
+emit_32(1109804738);
+emit_32(1100759014);
+emit_32(3237609472);
+emit_32(1110243829);
+emit_32(1100759014);
+emit_32(3229220864);
+emit_32(1110734746);
+emit_32(1100759014);
+emit_32(0);
+emit_32(1110902178);
+emit_32(1100759014);
+emit_32(1081737216);
+emit_32(1111203643);
+emit_32(1100759014);
+emit_32(3279552512);
+emit_32(1055720947);
+emit_32(1098514432);
+emit_32(3279296528);
+emit_32(1074391480);
+emit_32(1098514432);
+emit_32(3279040545);
+emit_32(1080839929);
+emit_32(1098514432);
+emit_32(3278784496);
+emit_32(1084004468);
+emit_32(1098514432);
+emit_32(3278528512);
+emit_32(1088331836);
+emit_32(1098514432);
+emit_32(3278272528);
+emit_32(1090916618);
+emit_32(1098514432);
+emit_32(3278016545);
+emit_32(1091793217);
+emit_32(1098514432);
+emit_32(3277760496);
+emit_32(1092681623);
+emit_32(1098514432);
+emit_32(3277504512);
+emit_32(1094343931);
+emit_32(1098514432);
+emit_32(3277248528);
+emit_32(1096031404);
+emit_32(1098514432);
+emit_32(3276992545);
+emit_32(1097722652);
+emit_32(1098514432);
+emit_32(3276736496);
+emit_32(1098892129);
+emit_32(1098514432);
+emit_32(3276480512);
+emit_32(1099445043);
+emit_32(1098514432);
+emit_32(3276224528);
+emit_32(1099878158);
+emit_32(1098514432);
+emit_32(3275968545);
+emit_32(1101192548);
+emit_32(1098514432);
+emit_32(3275712496);
+emit_32(1102096839);
+emit_32(1098514432);
+emit_32(3275456512);
+emit_32(1103322992);
+emit_32(1098514432);
+emit_32(3275200528);
+emit_32(1103921152);
+emit_32(1098514432);
+emit_32(3274944545);
+emit_32(1104725200);
+emit_32(1098514432);
+emit_32(3274688496);
+emit_32(1106297907);
+emit_32(1098514432);
+emit_32(3274432512);
+emit_32(1107190193);
+emit_32(1098514432);
+emit_32(3274176528);
+emit_32(1108005172);
+emit_32(1098514432);
+emit_32(3273920545);
+emit_32(1108650361);
+emit_32(1098514432);
+emit_32(3273664496);
+emit_32(1108785837);
+emit_32(1098514432);
+emit_32(3273408512);
+emit_32(1108769610);
+emit_32(1098514432);
+emit_32(3273152528);
+emit_32(1108817661);
+emit_32(1098514432);
+emit_32(3272896545);
+emit_32(1108831240);
+emit_32(1098514432);
+emit_32(3272640496);
+emit_32(1108859630);
+emit_32(1098514432);
+emit_32(3272384512);
+emit_32(1108733356);
+emit_32(1098514432);
+emit_32(3272128528);
+emit_32(1108612271);
+emit_32(1098514432);
+emit_32(3271872545);
+emit_32(1108465523);
+emit_32(1098514432);
+emit_32(3271616496);
+emit_32(1108386120);
+emit_32(1098514432);
+emit_32(3271163904);
+emit_32(1108193260);
+emit_32(1098514432);
+emit_32(3270651937);
+emit_32(1107694767);
+emit_32(1098514432);
+emit_32(3270139970);
+emit_32(1107326665);
+emit_32(1098514432);
+emit_32(3269627871);
+emit_32(1106737994);
+emit_32(1098514432);
+emit_32(3269115904);
+emit_32(1106158394);
+emit_32(1098514432);
+emit_32(3268603937);
+emit_32(1106202906);
+emit_32(1098514432);
+emit_32(3268091970);
+emit_32(1105578951);
+emit_32(1098514432);
+emit_32(3267579911);
+emit_32(1105052566);
+emit_32(1098514432);
+emit_32(3267067904);
+emit_32(1104895908);
+emit_32(1098514432);
+emit_32(3266555911);
+emit_32(1104074873);
+emit_32(1098514432);
+emit_32(3266043904);
+emit_32(1103133881);
+emit_32(1098514432);
+emit_32(3265531911);
+emit_32(1102465938);
+emit_32(1098514432);
+emit_32(3265019904);
+emit_32(1101262907);
+emit_32(1098514432);
+emit_32(3264507911);
+emit_32(1101530399);
+emit_32(1098514432);
+emit_32(3263995904);
+emit_32(1101685588);
+emit_32(1098514432);
+emit_32(3263483911);
+emit_32(1102353111);
+emit_32(1098514432);
+emit_32(3262775296);
+emit_32(1102607496);
+emit_32(1098514432);
+emit_32(3261751309);
+emit_32(1102688970);
+emit_32(1098514432);
+emit_32(3260727296);
+emit_32(1103199522);
+emit_32(1098514432);
+emit_32(3259703309);
+emit_32(1103396916);
+emit_32(1098514432);
+emit_32(3258679296);
+emit_32(1103692248);
+emit_32(1098514432);
+emit_32(3257655309);
+emit_32(1104150266);
+emit_32(1098514432);
+emit_32(3256631296);
+emit_32(1104605715);
+emit_32(1098514432);
+emit_32(3255607309);
+emit_32(1105125337);
+emit_32(1098514432);
+emit_32(3254386688);
+emit_32(1106191267);
+emit_32(1098514432);
+emit_32(3252338714);
+emit_32(1107529407);
+emit_32(1098514432);
+emit_32(3250290688);
+emit_32(1108420880);
+emit_32(1098514432);
+emit_32(3248242714);
+emit_32(1108934001);
+emit_32(1098514432);
+emit_32(3245998080);
+emit_32(1109548859);
+emit_32(1098514432);
+emit_32(3241902132);
+emit_32(1109995631);
+emit_32(1098514432);
+emit_32(3237609472);
+emit_32(1110790845);
+emit_32(1098514432);
+emit_32(3229220864);
+emit_32(1111318856);
+emit_32(1098514432);
+emit_32(0);
+emit_32(1111747671);
+emit_32(1098514432);
+emit_32(1081737216);
+emit_32(1111812866);
+emit_32(1098514432);
+emit_32(3279552512);
+emit_32(1066749584);
+emit_32(1094418484);
+emit_32(3279296528);
+emit_32(1077908068);
+emit_32(1094418484);
+emit_32(3279040545);
+emit_32(1082923764);
+emit_32(1094418484);
+emit_32(3278784496);
+emit_32(1084680422);
+emit_32(1094418484);
+emit_32(3278528512);
+emit_32(1088094187);
+emit_32(1094418484);
+emit_32(3278272528);
+emit_32(1090882015);
+emit_32(1094418484);
+emit_32(3278016545);
+emit_32(1091863944);
+emit_32(1094418484);
+emit_32(3277760496);
+emit_32(1092512425);
+emit_32(1094418484);
+emit_32(3277504512);
+emit_32(1093582035);
+emit_32(1094418380);
+emit_32(3277248528);
+emit_32(1096483445);
+emit_32(1094418380);
+emit_32(3276992545);
+emit_32(1098671194);
+emit_32(1094418380);
+emit_32(3276736496);
+emit_32(1099029545);
+emit_32(1094418380);
+emit_32(3276480512);
+emit_32(1099564319);
+emit_32(1094418380);
+emit_32(3276224528);
+emit_32(1100538603);
+emit_32(1094418380);
+emit_32(3275968545);
+emit_32(1101777758);
+emit_32(1094418380);
+emit_32(3275712496);
+emit_32(1103112962);
+emit_32(1094418380);
+emit_32(3275456512);
+emit_32(1104081112);
+emit_32(1094418380);
+emit_32(3275200528);
+emit_32(1104685826);
+emit_32(1094418380);
+emit_32(3274944545);
+emit_32(1105332273);
+emit_32(1094418380);
+emit_32(3274688496);
+emit_32(1107088428);
+emit_32(1094418380);
+emit_32(3274432512);
+emit_32(1107461145);
+emit_32(1094418380);
+emit_32(3274176528);
+emit_32(1108070262);
+emit_32(1094418380);
+emit_32(3273920545);
+emit_32(1108560734);
+emit_32(1094418380);
+emit_32(3273664496);
+emit_32(1108646822);
+emit_32(1094418380);
+emit_32(3273408512);
+emit_32(1108781538);
+emit_32(1094418380);
+emit_32(3273152528);
+emit_32(1108714507);
+emit_32(1094418380);
+emit_32(3272896545);
+emit_32(1108628105);
+emit_32(1094418380);
+emit_32(3272640496);
+emit_32(1108772101);
+emit_32(1094418380);
+emit_32(3272384512);
+emit_32(1108535384);
+emit_32(1094418380);
+emit_32(3272128528);
+emit_32(1108471736);
+emit_32(1094418380);
+emit_32(3271872545);
+emit_32(1108149718);
+emit_32(1094418380);
+emit_32(3271616496);
+emit_32(1108005775);
+emit_32(1094418380);
+emit_32(3271163904);
+emit_32(1107845369);
+emit_32(1094418380);
+emit_32(3270651937);
+emit_32(1107488748);
+emit_32(1094418380);
+emit_32(3270139970);
+emit_32(1107065831);
+emit_32(1094418380);
+emit_32(3269627871);
+emit_32(1106640477);
+emit_32(1094418380);
+emit_32(3269115904);
+emit_32(1106331986);
+emit_32(1094418380);
+emit_32(3268603937);
+emit_32(1106202801);
+emit_32(1094418380);
+emit_32(3268091970);
+emit_32(1105489140);
+emit_32(1094418380);
+emit_32(3267579911);
+emit_32(1104258059);
+emit_32(1094418380);
+emit_32(3267067904);
+emit_32(1104173177);
+emit_32(1094418380);
+emit_32(3266555911);
+emit_32(1103722237);
+emit_32(1094418380);
+emit_32(3266043904);
+emit_32(1102993687);
+emit_32(1094418380);
+emit_32(3265531911);
+emit_32(1102417861);
+emit_32(1094418380);
+emit_32(3265019904);
+emit_32(1102043519);
+emit_32(1094418380);
+emit_32(3264507911);
+emit_32(1102232840);
+emit_32(1094418380);
+emit_32(3263995904);
+emit_32(1102313370);
+emit_32(1094418380);
+emit_32(3263483911);
+emit_32(1102548199);
+emit_32(1094418380);
+emit_32(3262775296);
+emit_32(1102923222);
+emit_32(1094418380);
+emit_32(3261751309);
+emit_32(1103187621);
+emit_32(1094418380);
+emit_32(3260727296);
+emit_32(1103562329);
+emit_32(1094418380);
+emit_32(3259703309);
+emit_32(1103808220);
+emit_32(1094418380);
+emit_32(3258679296);
+emit_32(1104024646);
+emit_32(1094418380);
+emit_32(3257655309);
+emit_32(1104470344);
+emit_32(1094418380);
+emit_32(3256631296);
+emit_32(1104938690);
+emit_32(1094418380);
+emit_32(3255607309);
+emit_32(1105867624);
+emit_32(1094418380);
+emit_32(3254386688);
+emit_32(1107251534);
+emit_32(1094418380);
+emit_32(3252338714);
+emit_32(1107872029);
+emit_32(1094418380);
+emit_32(3250290688);
+emit_32(1108547574);
+emit_32(1094418380);
+emit_32(3248242714);
+emit_32(1109195253);
+emit_32(1094418380);
+emit_32(3245998080);
+emit_32(1109741247);
+emit_32(1094418380);
+emit_32(3241902132);
+emit_32(1110512291);
+emit_32(1094418380);
+emit_32(3237609472);
+emit_32(1111292851);
+emit_32(1094418380);
+emit_32(3229220864);
+emit_32(1111810349);
+emit_32(1094418380);
+emit_32(0);
+emit_32(1112081590);
+emit_32(1094418380);
+emit_32(1081737216);
+emit_32(1112309314);
+emit_32(1094418380);
+emit_32(3279552512);
+emit_32(1069773845);
+emit_32(1090125824);
+emit_32(3279296528);
+emit_32(1077819820);
+emit_32(1090125824);
+emit_32(3279040545);
+emit_32(1081179122);
+emit_32(1090125824);
+emit_32(3278784496);
+emit_32(1083831117);
+emit_32(1090125824);
+emit_32(3278528512);
+emit_32(1086208512);
+emit_32(1090125824);
+emit_32(3278272528);
+emit_32(1089372988);
+emit_32(1090125824);
+emit_32(3278016545);
+emit_32(1091534376);
+emit_32(1090125824);
+emit_32(3277760496);
+emit_32(1091959238);
+emit_32(1090125824);
+emit_32(3277504512);
+emit_32(1093016538);
+emit_32(1090125824);
+emit_32(3277248528);
+emit_32(1095828190);
+emit_32(1090125824);
+emit_32(3276992545);
+emit_32(1098471021);
+emit_32(1090125824);
+emit_32(3276736496);
+emit_32(1099512257);
+emit_32(1090125824);
+emit_32(3276480512);
+emit_32(1100641206);
+emit_32(1090125824);
+emit_32(3276224528);
+emit_32(1101920207);
+emit_32(1090125824);
+emit_32(3275968545);
+emit_32(1102579027);
+emit_32(1090125824);
+emit_32(3275712496);
+emit_32(1103724596);
+emit_32(1090125824);
+emit_32(3275456512);
+emit_32(1104932294);
+emit_32(1090125824);
+emit_32(3275200528);
+emit_32(1105540415);
+emit_32(1090125824);
+emit_32(3274944545);
+emit_32(1105706877);
+emit_32(1090125824);
+emit_32(3274688496);
+emit_32(1106838815);
+emit_32(1090125824);
+emit_32(3274432512);
+emit_32(1107416056);
+emit_32(1090125824);
+emit_32(3274176528);
+emit_32(1107934210);
+emit_32(1090125824);
+emit_32(3273920545);
+emit_32(1108321868);
+emit_32(1090125824);
+emit_32(3273664496);
+emit_32(1108477949);
+emit_32(1090125824);
+emit_32(3273408512);
+emit_32(1108606950);
+emit_32(1090125824);
+emit_32(3273152528);
+emit_32(1108594314);
+emit_32(1090125824);
+emit_32(3272896545);
+emit_32(1108861596);
+emit_32(1090125824);
+emit_32(3272640496);
+emit_32(1108850508);
+emit_32(1090125824);
+emit_32(3272384512);
+emit_32(1108746804);
+emit_32(1090125824);
+emit_32(3272128528);
+emit_32(1108418180);
+emit_32(1090125824);
+emit_32(3271872545);
+emit_32(1108132600);
+emit_32(1090125824);
+emit_32(3271616496);
+emit_32(1107751233);
+emit_32(1090125824);
+emit_32(3271163904);
+emit_32(1107845920);
+emit_32(1090125824);
+emit_32(3270651937);
+emit_32(1107711440);
+emit_32(1090125824);
+emit_32(3270139970);
+emit_32(1107541911);
+emit_32(1090125824);
+emit_32(3269627871);
+emit_32(1107305510);
+emit_32(1090125824);
+emit_32(3269115904);
+emit_32(1107014346);
+emit_32(1090125824);
+emit_32(3268603937);
+emit_32(1106519471);
+emit_32(1090125824);
+emit_32(3268091970);
+emit_32(1105586867);
+emit_32(1090125824);
+emit_32(3267579911);
+emit_32(1104817160);
+emit_32(1090125824);
+emit_32(3267067904);
+emit_32(1104215645);
+emit_32(1090125824);
+emit_32(3266555911);
+emit_32(1103400324);
+emit_32(1090125824);
+emit_32(3266043904);
+emit_32(1103065776);
+emit_32(1090125824);
+emit_32(3265531911);
+emit_32(1102978377);
+emit_32(1090125824);
+emit_32(3265019904);
+emit_32(1102293919);
+emit_32(1090125824);
+emit_32(3264507911);
+emit_32(1102336229);
+emit_32(1090125824);
+emit_32(3263995904);
+emit_32(1102542117);
+emit_32(1090125824);
+emit_32(3263483911);
+emit_32(1102806306);
+emit_32(1090125824);
+emit_32(3262775296);
+emit_32(1103245240);
+emit_32(1090125824);
+emit_32(3261751309);
+emit_32(1103200151);
+emit_32(1090125824);
+emit_32(3260727296);
+emit_32(1103241727);
+emit_32(1090125824);
+emit_32(3259703309);
+emit_32(1103758465);
+emit_32(1090125824);
+emit_32(3258679296);
+emit_32(1104333714);
+emit_32(1090125824);
+emit_32(3257655309);
+emit_32(1104589095);
+emit_32(1090125824);
+emit_32(3256631296);
+emit_32(1104963961);
+emit_32(1090125824);
+emit_32(3255607309);
+emit_32(1106480516);
+emit_32(1090125824);
+emit_32(3254386688);
+emit_32(1107703811);
+emit_32(1090125824);
+emit_32(3252338714);
+emit_32(1108381768);
+emit_32(1090125824);
+emit_32(3250290688);
+emit_32(1108898034);
+emit_32(1090125824);
+emit_32(3248242714);
+emit_32(1109345462);
+emit_32(1090125824);
+emit_32(3245998080);
+emit_32(1109947738);
+emit_32(1090125824);
+emit_32(3241902132);
+emit_32(1110798578);
+emit_32(1090125824);
+emit_32(3237609472);
+emit_32(1111401483);
+emit_32(1090125824);
+emit_32(3229220864);
+emit_32(1112005149);
+emit_32(1090125824);
+emit_32(0);
+emit_32(1112489827);
+emit_32(1090125824);
+emit_32(1081737216);
+emit_32(1112605380);
+emit_32(1090125824);
+emit_32(3279552512);
+emit_32(1041185636);
+emit_32(1081737216);
+emit_32(3279296528);
+emit_32(1071476480);
+emit_32(1081737216);
+emit_32(3279040545);
+emit_32(1076263523);
+emit_32(1081737216);
+emit_32(3278784496);
+emit_32(1082158660);
+emit_32(1081737216);
+emit_32(3278528512);
+emit_32(1084513929);
+emit_32(1081737216);
+emit_32(3278272528);
+emit_32(1087785717);
+emit_32(1081737216);
+emit_32(3278016545);
+emit_32(1090972056);
+emit_32(1081737216);
+emit_32(3277760496);
+emit_32(1092442569);
+emit_32(1081737216);
+emit_32(3277504512);
+emit_32(1094046974);
+emit_32(1081737216);
+emit_32(3277248528);
+emit_32(1097043280);
+emit_32(1081737216);
+emit_32(3276992545);
+emit_32(1098999818);
+emit_32(1081737216);
+emit_32(3276736496);
+emit_32(1100434742);
+emit_32(1081737216);
+emit_32(3276480512);
+emit_32(1101659007);
+emit_32(1081737216);
+emit_32(3276224528);
+emit_32(1102608545);
+emit_32(1081737216);
+emit_32(3275968545);
+emit_32(1103417836);
+emit_32(1081737216);
+emit_32(3275712496);
+emit_32(1104053168);
+emit_32(1081737216);
+emit_32(3275456512);
+emit_32(1104973450);
+emit_32(1081737216);
+emit_32(3275200528);
+emit_32(1105837477);
+emit_32(1081737216);
+emit_32(3274944545);
+emit_32(1106081743);
+emit_32(1081737216);
+emit_32(3274688496);
+emit_32(1106636492);
+emit_32(1081737216);
+emit_32(3274432512);
+emit_32(1107002917);
+emit_32(1081737216);
+emit_32(3274176528);
+emit_32(1107580184);
+emit_32(1081737216);
+emit_32(3273920545);
+emit_32(1107983729);
+emit_32(1081737216);
+emit_32(3273664496);
+emit_32(1108213550);
+emit_32(1081737216);
+emit_32(3273408512);
+emit_32(1108715137);
+emit_32(1081737216);
+emit_32(3273152528);
+emit_32(1108987871);
+emit_32(1081737216);
+emit_32(3272896545);
+emit_32(1109130582);
+emit_32(1081737216);
+emit_32(3272640496);
+emit_32(1109075454);
+emit_32(1081737216);
+emit_32(3272384512);
+emit_32(1108764813);
+emit_32(1081737216);
+emit_32(3272128528);
+emit_32(1108391939);
+emit_32(1081737216);
+emit_32(3271872545);
+emit_32(1108080224);
+emit_32(1081737216);
+emit_32(3271616496);
+emit_32(1107854728);
+emit_32(1081737216);
+emit_32(3271163904);
+emit_32(1107912740);
+emit_32(1081737216);
+emit_32(3270651937);
+emit_32(1107731730);
+emit_32(1081737216);
+emit_32(3270139970);
+emit_32(1107480989);
+emit_32(1081737216);
+emit_32(3269627871);
+emit_32(1107400013);
+emit_32(1081737216);
+emit_32(3269115904);
+emit_32(1106814855);
+emit_32(1081737216);
+emit_32(3268603937);
+emit_32(1106747641);
+emit_32(1081737216);
+emit_32(3268091970);
+emit_32(1106153570);
+emit_32(1081737216);
+emit_32(3267579911);
+emit_32(1105450553);
+emit_32(1081737216);
+emit_32(3267067904);
+emit_32(1105015289);
+emit_32(1081737216);
+emit_32(3266555911);
+emit_32(1103926185);
+emit_32(1081737216);
+emit_32(3266043904);
+emit_32(1103220965);
+emit_32(1081737216);
+emit_32(3265531911);
+emit_32(1102714556);
+emit_32(1081737216);
+emit_32(3265019904);
+emit_32(1102293972);
+emit_32(1081737216);
+emit_32(3264507911);
+emit_32(1102696206);
+emit_32(1081737216);
+emit_32(3263995904);
+emit_32(1102841119);
+emit_32(1081737216);
+emit_32(3263483911);
+emit_32(1102940104);
+emit_32(1081737216);
+emit_32(3262775296);
+emit_32(1103457681);
+emit_32(1081737216);
+emit_32(3261751309);
+emit_32(1103885553);
+emit_32(1081737216);
+emit_32(3260727296);
+emit_32(1104135953);
+emit_32(1081737216);
+emit_32(3259703309);
+emit_32(1104254180);
+emit_32(1081737216);
+emit_32(3258679296);
+emit_32(1104598218);
+emit_32(1081737216);
+emit_32(3257655309);
+emit_32(1105055869);
+emit_32(1081737216);
+emit_32(3256631296);
+emit_32(1105830661);
+emit_32(1081737216);
+emit_32(3255607309);
+emit_32(1107186156);
+emit_32(1081737216);
+emit_32(3254386688);
+emit_32(1107890222);
+emit_32(1081737216);
+emit_32(3252338714);
+emit_32(1108342578);
+emit_32(1081737216);
+emit_32(3250290688);
+emit_32(1108968106);
+emit_32(1081737216);
+emit_32(3248242714);
+emit_32(1109363314);
+emit_32(1081737216);
+emit_32(3245998080);
+emit_32(1110217982);
+emit_32(1081737216);
+emit_32(3241902132);
+emit_32(1110836747);
+emit_32(1081737216);
+emit_32(3237609472);
+emit_32(1111340011);
+emit_32(1081737216);
+emit_32(3229220864);
+emit_32(1111989472);
+emit_32(1081737216);
+emit_32(0);
+emit_32(1112547577);
+emit_32(1081737216);
+emit_32(1081737216);
+emit_32(1112701298);
+emit_32(1081737216);
+emit_start(_ZTIN16btCollisionWorld17RayResultCallbackE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN16btCollisionWorld17RayResultCallbackE);
+emit_start(_ZTSN16btCollisionWorld17RayResultCallbackE)
+emit_string('N16btCollisionWorld17RayResultCallbackE\x00');
+emit_start(_ZTVN16btCollisionWorld24ClosestRayResultCallbackE)
+emit_32(0);
+emit_32(_ZTIN16btCollisionWorld24ClosestRayResultCallbackE);
+emit_32(_ZN16btCollisionWorld24ClosestRayResultCallbackD1Ev__index__);
+emit_32(_ZN16btCollisionWorld24ClosestRayResultCallbackD0Ev__index__);
+emit_32(_ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy__index__);
+emit_32(_ZN16btCollisionWorld24ClosestRayResultCallback15addSingleResultERNS_14LocalRayResultEb__index__);
+emit_start(_ZTIN16btCollisionWorld24ClosestRayResultCallbackE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN16btCollisionWorld24ClosestRayResultCallbackE);
+emit_32(_ZTIN16btCollisionWorld17RayResultCallbackE);
+emit_start(_ZTSN16btCollisionWorld24ClosestRayResultCallbackE)
+emit_string('N16btCollisionWorld24ClosestRayResultCallbackE\x00');
+emit_start(_ZTI13btMotionState)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS13btMotionState);
+emit_start(_ZTS13btMotionState)
+emit_string('13btMotionState\x00');
+emit_start(_ZTV20btDefaultMotionState)
+emit_32(0);
+emit_32(_ZTI20btDefaultMotionState);
+emit_32(_ZN20btDefaultMotionStateD1Ev__index__);
+emit_32(_ZN20btDefaultMotionStateD0Ev__index__);
+emit_32(_ZNK20btDefaultMotionState17getWorldTransformER11btTransform__index__);
+emit_32(_ZN20btDefaultMotionState17setWorldTransformERK11btTransform__index__);
+emit_start(_ZTI20btDefaultMotionState)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS20btDefaultMotionState);
+emit_32(_ZTI13btMotionState);
+emit_start(_ZTS20btDefaultMotionState)
+emit_string('20btDefaultMotionState\x00');
+emit_start(_ZTI17btTypedConstraint)
+emit_32(_ZTVN10__cxxabiv121__vmi_class_type_infoE+8);
+emit_32(_ZTS17btTypedConstraint);
+emit_32(0);
+emit_32(1);
+emit_32(_ZTI13btTypedObject);
+emit_32(1026);
+emit_start(_ZTS17btTypedConstraint)
+emit_string('17btTypedConstraint\x00');
+emit_start(_ZTI13btTypedObject)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS13btTypedObject);
+emit_start(_ZTS13btTypedObject)
+emit_string('13btTypedObject\x00');
+emit_start(_ZTV7RagDoll)
+emit_32(0);
+emit_32(_ZTI7RagDoll);
+emit_32(_ZN7RagDollD1Ev__index__);
+emit_32(_ZN7RagDollD0Ev__index__);
+emit_start(_ZTI7RagDoll)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS7RagDoll);
+emit_start(_ZTS7RagDoll)
+emit_string('7RagDoll\x00');
+emit_start(_ZTV13BenchmarkDemo)
+emit_32(0);
+emit_32(_ZTI13BenchmarkDemo);
+emit_32(_ZN15DemoApplication6myinitEv__index__);
+emit_32(_ZN15DemoApplication16getDynamicsWorldEv__index__);
+emit_32(_ZN15DemoApplication20localCreateRigidBodyEfRK11btTransformP16btCollisionShape__index__);
+emit_32(_ZN13BenchmarkDemoD1Ev__index__);
+emit_32(_ZN13BenchmarkDemoD0Ev__index__);
+emit_32(_ZN13BenchmarkDemo20clientMoveAndDisplayEv__index__);
+emit_32(_ZN13BenchmarkDemo15displayCallbackEv__index__);
+emit_start(_ZTI13BenchmarkDemo)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS13BenchmarkDemo);
+emit_32(_ZTI15DemoApplication);
+emit_start(_ZTS13BenchmarkDemo)
+emit_string('13BenchmarkDemo\x00');
+emit_start(_ZTI15DemoApplication)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS15DemoApplication);
+emit_start(_ZTS15DemoApplication)
+emit_string('15DemoApplication\x00');
+emit_start(_2E_str3)
+emit_string('rayResult.m_hitFraction <= m_closestHitFraction\x00');
+emit_start(_2E_str4)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btCollisionWorld.h\x00');
+emit_start(_2E_str5)
+emit_string('(!shape || shape->getShapeType() != INVALID_SHAPE_PROXYTYPE)\x00');
+emit_start(_2E_str6)
+emit_string('../../../../Demos/BenchmarkDemo/BenchmarkDemo.cpp\x00');
+emit_start(_2E_str7)
+emit_string('%d rays in %d ms %d %d %f\x0a\x00');
+emit_start(_ZL7TaruVtx)
+emit_32(1066080005);
+emit_32(3221161467);
+emit_32(0);
+emit_32(1061467093);
+emit_32(3221161467);
+emit_32(3208950741);
+emit_32(1067773497);
+emit_32(873485028);
+emit_32(3215257145);
+emit_32(1072250665);
+emit_32(877448406);
+emit_32(0);
+emit_32(0);
+emit_32(3221161467);
+emit_32(3213563653);
+emit_32(0);
+emit_32(0);
+emit_32(3219734313);
+emit_32(0);
+emit_32(3221161467);
+emit_32(3213563653);
+emit_32(3208950741);
+emit_32(3221161467);
+emit_32(3208950741);
+emit_32(3215257145);
+emit_32(873485028);
+emit_32(3215257145);
+emit_32(0);
+emit_32(0);
+emit_32(3219734313);
+emit_32(3213563653);
+emit_32(3221161467);
+emit_32(876839787);
+emit_32(3219734313);
+emit_32(877448406);
+emit_32(875236717);
+emit_32(3208950741);
+emit_32(3221161467);
+emit_32(1061467109);
+emit_32(3215257145);
+emit_32(881107813);
+emit_32(1067773497);
+emit_32(874053818);
+emit_32(3221161467);
+emit_32(1066080005);
+emit_32(880822819);
+emit_32(881928664);
+emit_32(1072250665);
+emit_32(1061467093);
+emit_32(3221161467);
+emit_32(1061467093);
+emit_32(1067773497);
+emit_32(881107813);
+emit_32(1067773497);
+emit_32(1061467093);
+emit_32(1073677819);
+emit_32(3208950741);
+emit_32(1066080005);
+emit_32(1073677819);
+emit_32(0);
+emit_32(0);
+emit_32(1073677819);
+emit_32(3213563653);
+emit_32(3208950741);
+emit_32(1073677819);
+emit_32(3208950741);
+emit_32(0);
+emit_32(1073677819);
+emit_32(3213563653);
+emit_32(3213563653);
+emit_32(1073677819);
+emit_32(0);
+emit_32(3208950741);
+emit_32(1073677819);
+emit_32(1061467093);
+emit_32(874053818);
+emit_32(1073677819);
+emit_32(1066080005);
+emit_32(1061467093);
+emit_32(1073677819);
+emit_32(1061467093);
+emit_32(874053818);
+emit_32(3221161467);
+emit_32(1066080005);
+emit_32(3208950741);
+emit_32(3221161467);
+emit_32(1061467109);
+emit_32(3213563653);
+emit_32(3221161467);
+emit_32(876839787);
+emit_32(3208950741);
+emit_32(3221161467);
+emit_32(3208950741);
+emit_32(0);
+emit_32(3221161467);
+emit_32(3213563653);
+emit_32(1061467093);
+emit_32(3221161467);
+emit_32(3208950741);
+emit_32(1066080005);
+emit_32(3221161467);
+emit_32(0);
+emit_32(1061467093);
+emit_32(3221161467);
+emit_32(1061467093);
+emit_32(1061467093);
+emit_32(1073677819);
+emit_32(3208950741);
+emit_32(0);
+emit_32(1073677819);
+emit_32(3213563653);
+emit_32(3208950741);
+emit_32(1073677819);
+emit_32(3208950741);
+emit_32(3213563653);
+emit_32(1073677819);
+emit_32(0);
+emit_32(3208950741);
+emit_32(1073677819);
+emit_32(1061467093);
+emit_32(874053818);
+emit_32(1073677819);
+emit_32(1066080005);
+emit_32(1061467093);
+emit_32(1073677819);
+emit_32(1061467093);
+emit_32(1066080005);
+emit_32(1073677819);
+emit_32(0);
+emit_start(LandscapeVtx)
+emit_32(Landscape01Vtx);
+emit_32(Landscape02Vtx);
+emit_32(Landscape03Vtx);
+emit_32(Landscape04Vtx);
+emit_32(Landscape05Vtx);
+emit_32(Landscape06Vtx);
+emit_32(Landscape07Vtx);
+emit_32(Landscape08Vtx);
+emit_start(Landscape01Vtx)
+emit_32(1081737258);
+emit_32(1055384563);
+emit_32(1131812880);
+emit_32(1081737258);
+emit_32(1069740626);
+emit_32(1132068864);
+emit_32(1090125824);
+emit_32(1066883130);
+emit_32(1131812880);
+emit_32(1090125845);
+emit_32(1071685776);
+emit_32(1132068864);
+emit_32(1094418484);
+emit_32(1074283351);
+emit_32(1131812880);
+emit_32(1094418484);
+emit_32(1076361335);
+emit_32(1132068864);
+emit_32(1098514432);
+emit_32(1077997197);
+emit_32(1131812880);
+emit_32(1098514432);
+emit_32(1078893017);
+emit_32(1132068864);
+emit_32(1100759066);
+emit_32(1082022680);
+emit_32(1131812880);
+emit_32(1100759066);
+emit_32(1080588228);
+emit_32(1132068864);
+emit_32(1102807040);
+emit_32(1082313744);
+emit_32(1131812880);
+emit_32(1102807040);
+emit_32(1082635783);
+emit_32(1132068864);
+emit_32(1104855066);
+emit_32(1085939489);
+emit_32(1131812880);
+emit_32(1104855066);
+emit_32(1086186513);
+emit_32(1132068864);
+emit_32(1106903040);
+emit_32(1088145253);
+emit_32(1131812880);
+emit_32(1106903040);
+emit_32(1089137122);
+emit_32(1132068864);
+emit_32(1108123661);
+emit_32(1090785431);
+emit_32(1131812880);
+emit_32(1108123661);
+emit_32(1091174473);
+emit_32(1132068864);
+emit_32(1109147648);
+emit_32(1090923801);
+emit_32(1131812880);
+emit_32(1109147648);
+emit_32(1091237136);
+emit_32(1132068864);
+emit_32(1110171661);
+emit_32(1088312773);
+emit_32(1131812880);
+emit_32(1110171661);
+emit_32(1089928629);
+emit_32(1132068864);
+emit_32(1111195648);
+emit_32(1083403361);
+emit_32(1131812880);
+emit_32(1111195648);
+emit_32(1086579729);
+emit_32(1132068864);
+emit_32(1112219661);
+emit_32(1080632646);
+emit_32(1131812880);
+emit_32(1112219661);
+emit_32(1084500256);
+emit_32(1132068864);
+emit_32(1113243648);
+emit_32(1082171222);
+emit_32(1131812880);
+emit_32(1113243648);
+emit_32(1085286142);
+emit_32(1132068864);
+emit_32(1114267661);
+emit_32(1082256177);
+emit_32(1131812880);
+emit_32(1114267661);
+emit_32(1084896932);
+emit_32(1132068864);
+emit_32(1115291648);
+emit_32(1082088279);
+emit_32(1131812880);
+emit_32(1115291648);
+emit_32(1085314391);
+emit_32(1132068864);
+emit_32(1116000263);
+emit_32(1085158761);
+emit_32(1131812880);
+emit_32(1116000263);
+emit_32(1088003066);
+emit_32(1132068864);
+emit_32(1116512256);
+emit_32(1086405959);
+emit_32(1131812880);
+emit_32(1116512256);
+emit_32(1089298141);
+emit_32(1132068864);
+emit_32(1117024263);
+emit_32(1087104604);
+emit_32(1131812880);
+emit_32(1117024263);
+emit_32(1090687347);
+emit_32(1132068864);
+emit_32(1117536256);
+emit_32(1087885311);
+emit_32(1131812880);
+emit_32(1117536256);
+emit_32(1091275053);
+emit_32(1132068864);
+emit_32(1118048263);
+emit_32(1089217925);
+emit_32(1131812880);
+emit_32(1118048263);
+emit_32(1092734157);
+emit_32(1132068864);
+emit_32(1118560256);
+emit_32(1091544359);
+emit_32(1131812880);
+emit_32(1118560256);
+emit_32(1093101054);
+emit_32(1132068864);
+emit_32(1119072263);
+emit_32(1093751695);
+emit_32(1131812880);
+emit_32(1119072263);
+emit_32(1094336171);
+emit_32(1132068864);
+emit_32(1119584256);
+emit_32(1095057906);
+emit_32(1131812880);
+emit_32(1119584256);
+emit_32(1095906414);
+emit_32(1132068864);
+emit_32(1120096263);
+emit_32(1096387500);
+emit_32(1131812880);
+emit_32(1120096263);
+emit_32(1097119721);
+emit_32(1132068864);
+emit_32(1120608322);
+emit_32(1098446484);
+emit_32(1131812880);
+emit_32(1120608322);
+emit_32(1099405040);
+emit_32(1132068864);
+emit_32(1121120289);
+emit_32(1099429000);
+emit_32(1131812880);
+emit_32(1121120289);
+emit_32(1100058250);
+emit_32(1132068864);
+emit_32(1121632256);
+emit_32(1099896455);
+emit_32(1131812880);
+emit_32(1121632256);
+emit_32(1100747951);
+emit_32(1132068864);
+emit_32(1122144223);
+emit_32(1100443235);
+emit_32(1131812880);
+emit_32(1122144223);
+emit_32(1101491654);
+emit_32(1132068864);
+emit_32(1122656322);
+emit_32(1100473854);
+emit_32(1131812880);
+emit_32(1122656322);
+emit_32(1101038145);
+emit_32(1132068864);
+emit_32(1123168289);
+emit_32(1100215956);
+emit_32(1131812880);
+emit_32(1123168289);
+emit_32(1101301390);
+emit_32(1132068864);
+emit_32(1123680256);
+emit_32(1101082604);
+emit_32(1131812880);
+emit_32(1123680256);
+emit_32(1101605949);
+emit_32(1132068864);
+emit_32(1124132848);
+emit_32(1101268622);
+emit_32(1131812880);
+emit_32(1124132848);
+emit_32(1102212026);
+emit_32(1132068864);
+emit_32(1124388897);
+emit_32(1101640237);
+emit_32(1131812880);
+emit_32(1124388897);
+emit_32(1102532523);
+emit_32(1132068864);
+emit_32(1124644880);
+emit_32(1102204895);
+emit_32(1131812880);
+emit_32(1124644880);
+emit_32(1103346847);
+emit_32(1132068864);
+emit_32(1124900864);
+emit_32(1102705643);
+emit_32(1131812880);
+emit_32(1124900864);
+emit_32(1103273709);
+emit_32(1132068864);
+emit_32(1125156848);
+emit_32(1102314000);
+emit_32(1131812880);
+emit_32(1125156848);
+emit_32(1103265949);
+emit_32(1132068864);
+emit_32(1125412897);
+emit_32(1102386142);
+emit_32(1131812880);
+emit_32(1125412897);
+emit_32(1103012351);
+emit_32(1132068864);
+emit_32(1125668880);
+emit_32(1102880021);
+emit_32(1131812880);
+emit_32(1125668880);
+emit_32(1103173727);
+emit_32(1132068864);
+emit_32(1125924864);
+emit_32(1103727428);
+emit_32(1131812880);
+emit_32(1125924864);
+emit_32(1103580732);
+emit_32(1132068864);
+emit_32(1126180848);
+emit_32(1103758413);
+emit_32(1131812880);
+emit_32(1126180848);
+emit_32(1103482113);
+emit_32(1132068864);
+emit_32(1126436897);
+emit_32(1104015471);
+emit_32(1131812880);
+emit_32(1126436897);
+emit_32(1103163241);
+emit_32(1132068864);
+emit_32(1126692880);
+emit_32(1103273342);
+emit_32(1131812880);
+emit_32(1126692880);
+emit_32(1103421348);
+emit_32(1132068864);
+emit_32(1126948864);
+emit_32(1103651353);
+emit_32(1131812880);
+emit_32(1126948864);
+emit_32(1103608938);
+emit_32(1132068864);
+emit_32(1127204848);
+emit_32(1103631850);
+emit_32(1131812880);
+emit_32(1127204848);
+emit_32(1103515039);
+emit_32(1132068864);
+emit_32(1127460897);
+emit_32(1102883324);
+emit_32(1131812880);
+emit_32(1127460897);
+emit_32(1102412041);
+emit_32(1132068864);
+emit_32(1127716880);
+emit_32(1101507068);
+emit_32(1131812880);
+emit_32(1127716880);
+emit_32(1101349991);
+emit_32(1132068864);
+emit_32(1127972864);
+emit_32(1100875563);
+emit_32(1131812880);
+emit_32(1127972864);
+emit_32(1101021210);
+emit_32(1132068864);
+emit_32(1128228848);
+emit_32(1101251582);
+emit_32(1131812880);
+emit_32(1128228848);
+emit_32(1101209063);
+emit_32(1132068864);
+emit_32(1128484897);
+emit_32(1100876402);
+emit_32(1131812880);
+emit_32(1128484897);
+emit_32(1101824944);
+emit_32(1132068864);
+emit_32(1128740880);
+emit_32(1100846465);
+emit_32(1131812880);
+emit_32(1128740880);
+emit_32(1101829662);
+emit_32(1132068864);
+emit_32(1128996864);
+emit_32(1101043178);
+emit_32(1131812880);
+emit_32(1128996864);
+emit_32(1101204029);
+emit_32(1132068864);
+emit_32(1129252848);
+emit_32(1100934912);
+emit_32(1131812880);
+emit_32(1129252848);
+emit_32(1100678640);
+emit_32(1132068864);
+emit_32(1129508897);
+emit_32(1100716494);
+emit_32(1131812880);
+emit_32(1129508897);
+emit_32(1100794770);
+emit_32(1132068864);
+emit_32(1129764880);
+emit_32(1100633499);
+emit_32(1131812880);
+emit_32(1129764880);
+emit_32(1100531158);
+emit_32(1132068864);
+emit_32(1130020864);
+emit_32(1100357409);
+emit_32(1131812880);
+emit_32(1130020864);
+emit_32(1100965793);
+emit_32(1132068864);
+emit_32(1130276848);
+emit_32(1100382418);
+emit_32(1131812880);
+emit_32(1130276848);
+emit_32(1100936852);
+emit_32(1132068864);
+emit_32(1130532897);
+emit_32(1100142189);
+emit_32(1131812880);
+emit_32(1130532897);
+emit_32(1100410834);
+emit_32(1132068864);
+emit_32(1130788880);
+emit_32(1099421503);
+emit_32(1131812880);
+emit_32(1130788880);
+emit_32(1099690462);
+emit_32(1132068864);
+emit_32(1131044864);
+emit_32(1098506358);
+emit_32(1131812880);
+emit_32(1131044864);
+emit_32(1098996725);
+emit_32(1132068864);
+emit_32(1131300848);
+emit_32(1098434740);
+emit_32(1131812880);
+emit_32(1131300848);
+emit_32(1098247465);
+emit_32(1132068864);
+emit_32(1131556897);
+emit_32(1098117861);
+emit_32(1131812880);
+emit_32(1131556897);
+emit_32(1097891158);
+emit_32(1132068864);
+emit_32(1131812880);
+emit_32(1096949432);
+emit_32(1131812880);
+emit_32(1131812880);
+emit_32(1097085433);
+emit_32(1132068864);
+emit_32(1132068864);
+emit_32(1097236532);
+emit_32(1131812880);
+emit_32(1132068864);
+emit_32(1097193960);
+emit_32(1132068864);
+emit_32(1081737258);
+emit_32(1074643096);
+emit_32(1131556897);
+emit_32(1090125866);
+emit_32(1074941647);
+emit_32(1131556897);
+emit_32(1094418484);
+emit_32(1081645067);
+emit_32(1131556897);
+emit_32(1098514432);
+emit_32(1079576814);
+emit_32(1131556897);
+emit_32(1100759066);
+emit_32(1080655044);
+emit_32(1131556897);
+emit_32(1102807040);
+emit_32(1082425543);
+emit_32(1131556897);
+emit_32(1104855066);
+emit_32(1085781658);
+emit_32(1131556897);
+emit_32(1106903040);
+emit_32(1087711834);
+emit_32(1131556897);
+emit_32(1108123661);
+emit_32(1089079786);
+emit_32(1131556897);
+emit_32(1109147648);
+emit_32(1089855732);
+emit_32(1131556897);
+emit_32(1110171661);
+emit_32(1088401776);
+emit_32(1131556897);
+emit_32(1111195648);
+emit_32(1084013213);
+emit_32(1131556897);
+emit_32(1112219661);
+emit_32(1076464473);
+emit_32(1131556897);
+emit_32(1113243648);
+emit_32(1076936835);
+emit_32(1131556897);
+emit_32(1114267661);
+emit_32(1078376488);
+emit_32(1131556897);
+emit_32(1115291648);
+emit_32(1083428884);
+emit_32(1131556897);
+emit_32(1116000263);
+emit_32(1084998686);
+emit_32(1131556897);
+emit_32(1116512256);
+emit_32(1085103334);
+emit_32(1131556897);
+emit_32(1117024263);
+emit_32(1085114239);
+emit_32(1131556897);
+emit_32(1117536256);
+emit_32(1085358662);
+emit_32(1131556897);
+emit_32(1118048263);
+emit_32(1085033331);
+emit_32(1131556897);
+emit_32(1118560256);
+emit_32(1090041456);
+emit_32(1131556897);
+emit_32(1119072263);
+emit_32(1091993569);
+emit_32(1131556897);
+emit_32(1119584256);
+emit_32(1093969274);
+emit_32(1131556897);
+emit_32(1120096263);
+emit_32(1094791777);
+emit_32(1131556897);
+emit_32(1120608322);
+emit_32(1096921435);
+emit_32(1131556897);
+emit_32(1121120289);
+emit_32(1098017722);
+emit_32(1131556897);
+emit_32(1121632256);
+emit_32(1098852807);
+emit_32(1131556897);
+emit_32(1122144223);
+emit_32(1099349623);
+emit_32(1131556897);
+emit_32(1122656322);
+emit_32(1099542928);
+emit_32(1131556897);
+emit_32(1123168289);
+emit_32(1100094688);
+emit_32(1131556897);
+emit_32(1123680256);
+emit_32(1100410887);
+emit_32(1131556897);
+emit_32(1124132848);
+emit_32(1100650329);
+emit_32(1131556897);
+emit_32(1124388897);
+emit_32(1101060742);
+emit_32(1131556897);
+emit_32(1124644880);
+emit_32(1101440326);
+emit_32(1131556897);
+emit_32(1124900864);
+emit_32(1101720243);
+emit_32(1131556897);
+emit_32(1125156848);
+emit_32(1101846125);
+emit_32(1131556897);
+emit_32(1125412897);
+emit_32(1102182141);
+emit_32(1131556897);
+emit_32(1125668880);
+emit_32(1102845208);
+emit_32(1131556897);
+emit_32(1125924864);
+emit_32(1103549327);
+emit_32(1131556897);
+emit_32(1126180848);
+emit_32(1103862379);
+emit_32(1131556897);
+emit_32(1126436897);
+emit_32(1104116816);
+emit_32(1131556897);
+emit_32(1126692880);
+emit_32(1103549432);
+emit_32(1131556897);
+emit_32(1126948864);
+emit_32(1103788717);
+emit_32(1131556897);
+emit_32(1127204848);
+emit_32(1103809426);
+emit_32(1131556897);
+emit_32(1127460897);
+emit_32(1103218816);
+emit_32(1131556897);
+emit_32(1127716880);
+emit_32(1101572551);
+emit_32(1131556897);
+emit_32(1127972864);
+emit_32(1100781453);
+emit_32(1131556897);
+emit_32(1128228848);
+emit_32(1100996149);
+emit_32(1131556897);
+emit_32(1128484897);
+emit_32(1100798283);
+emit_32(1131556897);
+emit_32(1128740880);
+emit_32(1100454769);
+emit_32(1131556897);
+emit_32(1128996864);
+emit_32(1101100116);
+emit_32(1131556897);
+emit_32(1129252848);
+emit_32(1100635806);
+emit_32(1131556897);
+emit_32(1129508897);
+emit_32(1100423260);
+emit_32(1131556897);
+emit_32(1129764880);
+emit_32(1100375445);
+emit_32(1131556897);
+emit_32(1130020864);
+emit_32(1100374711);
+emit_32(1131556897);
+emit_32(1130276848);
+emit_32(1100128348);
+emit_32(1131556897);
+emit_32(1130532897);
+emit_32(1099813985);
+emit_32(1131556897);
+emit_32(1130788880);
+emit_32(1098580702);
+emit_32(1131556897);
+emit_32(1131044864);
+emit_32(1098117861);
+emit_32(1131556897);
+emit_32(1131300848);
+emit_32(1098142502);
+emit_32(1131556897);
+emit_32(1131556897);
+emit_32(1097315071);
+emit_32(1131556897);
+emit_32(1131812880);
+emit_32(1097397384);
+emit_32(1131556897);
+emit_32(1132068864);
+emit_32(1096997143);
+emit_32(1131556897);
+emit_32(1081737258);
+emit_32(1078120510);
+emit_32(1131300848);
+emit_32(1090125866);
+emit_32(1081645067);
+emit_32(1131300848);
+emit_32(1094418484);
+emit_32(1083207676);
+emit_32(1131300848);
+emit_32(1098514432);
+emit_32(1082548394);
+emit_32(1131300848);
+emit_32(1100759066);
+emit_32(1083149333);
+emit_32(1131300848);
+emit_32(1102807040);
+emit_32(1084467750);
+emit_32(1131300848);
+emit_32(1104855066);
+emit_32(1084194889);
+emit_32(1131300848);
+emit_32(1106903040);
+emit_32(1085853632);
+emit_32(1131300848);
+emit_32(1108123661);
+emit_32(1085123970);
+emit_32(1131300848);
+emit_32(1109147648);
+emit_32(1087285441);
+emit_32(1131300848);
+emit_32(1110171661);
+emit_32(1085386722);
+emit_32(1131300848);
+emit_32(1111195648);
+emit_32(1080853476);
+emit_32(1131300848);
+emit_32(1112219661);
+emit_32(1078285136);
+emit_32(1131300848);
+emit_32(1113243648);
+emit_32(1077796206);
+emit_32(1131300848);
+emit_32(1114267661);
+emit_32(1081903730);
+emit_32(1131300848);
+emit_32(1115291648);
+emit_32(1083632098);
+emit_32(1131300848);
+emit_32(1116000263);
+emit_32(1084393385);
+emit_32(1131300848);
+emit_32(1116512256);
+emit_32(1085051576);
+emit_32(1131300848);
+emit_32(1117024263);
+emit_32(1082744667);
+emit_32(1131300848);
+emit_32(1117536256);
+emit_32(1082567793);
+emit_32(1131300848);
+emit_32(1118048263);
+emit_32(1084454685);
+emit_32(1131300848);
+emit_32(1118560256);
+emit_32(1085247932);
+emit_32(1131300848);
+emit_32(1119072263);
+emit_32(1088549437);
+emit_32(1131300848);
+emit_32(1119584256);
+emit_32(1091234903);
+emit_32(1131300848);
+emit_32(1120096263);
+emit_32(1092613875);
+emit_32(1131300848);
+emit_32(1120608322);
+emit_32(1094687864);
+emit_32(1131300848);
+emit_32(1121120289);
+emit_32(1095660313);
+emit_32(1131300848);
+emit_32(1121632256);
+emit_32(1096595223);
+emit_32(1131300848);
+emit_32(1122144223);
+emit_32(1096407214);
+emit_32(1131300848);
+emit_32(1122656322);
+emit_32(1098896848);
+emit_32(1131300848);
+emit_32(1123168289);
+emit_32(1100002571);
+emit_32(1131300848);
+emit_32(1123680256);
+emit_32(1100330566);
+emit_32(1131300848);
+emit_32(1124132848);
+emit_32(1100556901);
+emit_32(1131300848);
+emit_32(1124388897);
+emit_32(1101046271);
+emit_32(1131300848);
+emit_32(1124644880);
+emit_32(1101210793);
+emit_32(1131300848);
+emit_32(1124900864);
+emit_32(1101438753);
+emit_32(1131300848);
+emit_32(1125156848);
+emit_32(1101639765);
+emit_32(1131300848);
+emit_32(1125412897);
+emit_32(1102320291);
+emit_32(1131300848);
+emit_32(1125668880);
+emit_32(1103059380);
+emit_32(1131300848);
+emit_32(1125924864);
+emit_32(1103640815);
+emit_32(1131300848);
+emit_32(1126180848);
+emit_32(1104063234);
+emit_32(1131300848);
+emit_32(1126436897);
+emit_32(1103970068);
+emit_32(1131300848);
+emit_32(1126692880);
+emit_32(1103293999);
+emit_32(1131300848);
+emit_32(1126948864);
+emit_32(1106602885);
+emit_32(1131300848);
+emit_32(1127204848);
+emit_32(1106714296);
+emit_32(1131300848);
+emit_32(1127460897);
+emit_32(1105856718);
+emit_32(1131300848);
+emit_32(1127716880);
+emit_32(1104477736);
+emit_32(1131300848);
+emit_32(1127972864);
+emit_32(1103475455);
+emit_32(1131300848);
+emit_32(1128228848);
+emit_32(1102947182);
+emit_32(1131300848);
+emit_32(1128484897);
+emit_32(1102778938);
+emit_32(1131300848);
+emit_32(1128740880);
+emit_32(1102741242);
+emit_32(1131300848);
+emit_32(1128996864);
+emit_32(1099705667);
+emit_32(1131300848);
+emit_32(1129252848);
+emit_32(1099651088);
+emit_32(1131300848);
+emit_32(1129508897);
+emit_32(1099707659);
+emit_32(1131300848);
+emit_32(1129764880);
+emit_32(1100081634);
+emit_32(1131300848);
+emit_32(1130020864);
+emit_32(1100312373);
+emit_32(1131300848);
+emit_32(1130276848);
+emit_32(1100150263);
+emit_32(1131300848);
+emit_32(1130532897);
+emit_32(1099562326);
+emit_32(1131300848);
+emit_32(1130788880);
+emit_32(1099117363);
+emit_32(1131300848);
+emit_32(1131044864);
+emit_32(1098383150);
+emit_32(1131300848);
+emit_32(1131300848);
+emit_32(1097461347);
+emit_32(1131300848);
+emit_32(1131556897);
+emit_32(1097130836);
+emit_32(1131300848);
+emit_32(1131812880);
+emit_32(1097046950);
+emit_32(1131300848);
+emit_32(1132068864);
+emit_32(1096949537);
+emit_32(1131300848);
+emit_32(1081737258);
+emit_32(1084629524);
+emit_32(1131044864);
+emit_32(1090125866);
+emit_32(1084086907);
+emit_32(1131044864);
+emit_32(1094418484);
+emit_32(1082202008);
+emit_32(1131044864);
+emit_32(1098514432);
+emit_32(1080912280);
+emit_32(1131044864);
+emit_32(1100759066);
+emit_32(1083063329);
+emit_32(1131044864);
+emit_32(1102807040);
+emit_32(1084485051);
+emit_32(1131044864);
+emit_32(1104855066);
+emit_32(1083389331);
+emit_32(1131044864);
+emit_32(1106903040);
+emit_32(1083284872);
+emit_32(1131044864);
+emit_32(1108123661);
+emit_32(1083776948);
+emit_32(1131044864);
+emit_32(1109147648);
+emit_32(1084114904);
+emit_32(1131044864);
+emit_32(1110171661);
+emit_32(1084297860);
+emit_32(1131044864);
+emit_32(1111195648);
+emit_32(1078278635);
+emit_32(1131044864);
+emit_32(1112219661);
+emit_32(1076164118);
+emit_32(1131044864);
+emit_32(1113243648);
+emit_32(1078294028);
+emit_32(1131044864);
+emit_32(1114267661);
+emit_32(1082183700);
+emit_32(1131044864);
+emit_32(1115291648);
+emit_32(1083337867);
+emit_32(1131044864);
+emit_32(1116000263);
+emit_32(1083538145);
+emit_32(1131044864);
+emit_32(1116512256);
+emit_32(1083307354);
+emit_32(1131044864);
+emit_32(1117024263);
+emit_32(1082616971);
+emit_32(1131044864);
+emit_32(1117536256);
+emit_32(1082459895);
+emit_32(1131044864);
+emit_32(1118048263);
+emit_32(1082553155);
+emit_32(1131044864);
+emit_32(1118560256);
+emit_32(1082740745);
+emit_32(1131044864);
+emit_32(1119072263);
+emit_32(1085377369);
+emit_32(1131044864);
+emit_32(1119584256);
+emit_32(1088549688);
+emit_32(1131044864);
+emit_32(1120096263);
+emit_32(1090805993);
+emit_32(1131044864);
+emit_32(1120608322);
+emit_32(1092446868);
+emit_32(1131044864);
+emit_32(1121120289);
+emit_32(1093587383);
+emit_32(1131044864);
+emit_32(1121632256);
+emit_32(1094483916);
+emit_32(1131044864);
+emit_32(1122144223);
+emit_32(1096648281);
+emit_32(1131044864);
+emit_32(1122656322);
+emit_32(1098439773);
+emit_32(1131044864);
+emit_32(1123168289);
+emit_32(1099378301);
+emit_32(1131044864);
+emit_32(1123680256);
+emit_32(1100113301);
+emit_32(1131044864);
+emit_32(1124132848);
+emit_32(1100821928);
+emit_32(1131044864);
+emit_32(1124388897);
+emit_32(1100695994);
+emit_32(1131044864);
+emit_32(1124644880);
+emit_32(1100654418);
+emit_32(1131044864);
+emit_32(1124900864);
+emit_32(1101348733);
+emit_32(1131044864);
+emit_32(1125156848);
+emit_32(1101846177);
+emit_32(1131044864);
+emit_32(1125412897);
+emit_32(1102171131);
+emit_32(1131044864);
+emit_32(1125668880);
+emit_32(1102926263);
+emit_32(1131044864);
+emit_32(1125924864);
+emit_32(1103561857);
+emit_32(1131044864);
+emit_32(1126180848);
+emit_32(1105011566);
+emit_32(1131044864);
+emit_32(1126436897);
+emit_32(1105956281);
+emit_32(1131044864);
+emit_32(1126692880);
+emit_32(1106074193);
+emit_32(1131044864);
+emit_32(1126948864);
+emit_32(1106288155);
+emit_32(1131044864);
+emit_32(1127204848);
+emit_32(1106414875);
+emit_32(1131044864);
+emit_32(1127460897);
+emit_32(1105582830);
+emit_32(1131044864);
+emit_32(1127716880);
+emit_32(1104515013);
+emit_32(1131044864);
+emit_32(1127972864);
+emit_32(1103803187);
+emit_32(1131044864);
+emit_32(1128228848);
+emit_32(1103189298);
+emit_32(1131044864);
+emit_32(1128484897);
+emit_32(1102339532);
+emit_32(1131044864);
+emit_32(1128740880);
+emit_32(1102167776);
+emit_32(1131044864);
+emit_32(1128996864);
+emit_32(1102179887);
+emit_32(1131044864);
+emit_32(1129252848);
+emit_32(1101976463);
+emit_32(1131044864);
+emit_32(1129508897);
+emit_32(1099672899);
+emit_32(1131044864);
+emit_32(1129764880);
+emit_32(1099572288);
+emit_32(1131044864);
+emit_32(1130020864);
+emit_32(1099410126);
+emit_32(1131044864);
+emit_32(1130276848);
+emit_32(1099232077);
+emit_32(1131044864);
+emit_32(1130532897);
+emit_32(1099661994);
+emit_32(1131044864);
+emit_32(1130788880);
+emit_32(1099398382);
+emit_32(1131044864);
+emit_32(1131044864);
+emit_32(1098507197);
+emit_32(1131044864);
+emit_32(1131300848);
+emit_32(1098737045);
+emit_32(1131044864);
+emit_32(1131556897);
+emit_32(1097951452);
+emit_32(1131044864);
+emit_32(1131812880);
+emit_32(1097046111);
+emit_32(1131044864);
+emit_32(1132068864);
+emit_32(1096926888);
+emit_32(1131044864);
+emit_32(1081737258);
+emit_32(1086083564);
+emit_32(1130788880);
+emit_32(1090125845);
+emit_32(1085231281);
+emit_32(1130788880);
+emit_32(1094418484);
+emit_32(1084350058);
+emit_32(1130788880);
+emit_32(1098514432);
+emit_32(1082346082);
+emit_32(1130788880);
+emit_32(1100759066);
+emit_32(1082352080);
+emit_32(1130788880);
+emit_32(1102807040);
+emit_32(1083015472);
+emit_32(1130788880);
+emit_32(1104855066);
+emit_32(1082714468);
+emit_32(1130788880);
+emit_32(1106903040);
+emit_32(1082667555);
+emit_32(1130788880);
+emit_32(1108123661);
+emit_32(1081440133);
+emit_32(1130788880);
+emit_32(1109147648);
+emit_32(1079509621);
+emit_32(1130788880);
+emit_32(1110171661);
+emit_32(1082472016);
+emit_32(1130788880);
+emit_32(1111195648);
+emit_32(1077273302);
+emit_32(1130788880);
+emit_32(1112219661);
+emit_32(1077242684);
+emit_32(1130788880);
+emit_32(1113243648);
+emit_32(1078266387);
+emit_32(1130788880);
+emit_32(1114267661);
+emit_32(1079519268);
+emit_32(1130788880);
+emit_32(1115291648);
+emit_32(1082332010);
+emit_32(1130788880);
+emit_32(1116000263);
+emit_32(1083509876);
+emit_32(1130788880);
+emit_32(1116512256);
+emit_32(1083089082);
+emit_32(1130788880);
+emit_32(1117024263);
+emit_32(1081681474);
+emit_32(1130788880);
+emit_32(1117536256);
+emit_32(1081604928);
+emit_32(1130788880);
+emit_32(1118048263);
+emit_32(1083484521);
+emit_32(1130788880);
+emit_32(1118560256);
+emit_32(1085967948);
+emit_32(1130788880);
+emit_32(1119072263);
+emit_32(1087165358);
+emit_32(1130788880);
+emit_32(1119584256);
+emit_32(1089804205);
+emit_32(1130788880);
+emit_32(1120096263);
+emit_32(1090592986);
+emit_32(1130788880);
+emit_32(1120608322);
+emit_32(1092476018);
+emit_32(1130788880);
+emit_32(1121120289);
+emit_32(1094570318);
+emit_32(1130788880);
+emit_32(1121632256);
+emit_32(1095714420);
+emit_32(1130788880);
+emit_32(1122144223);
+emit_32(1097098330);
+emit_32(1130788880);
+emit_32(1122656322);
+emit_32(1098580073);
+emit_32(1130788880);
+emit_32(1123168289);
+emit_32(1099541460);
+emit_32(1130788880);
+emit_32(1123680256);
+emit_32(1100022651);
+emit_32(1130788880);
+emit_32(1124132848);
+emit_32(1100679217);
+emit_32(1130788880);
+emit_32(1124388897);
+emit_32(1100590455);
+emit_32(1130788880);
+emit_32(1124644880);
+emit_32(1100445647);
+emit_32(1130788880);
+emit_32(1124900864);
+emit_32(1100992374);
+emit_32(1130788880);
+emit_32(1125156848);
+emit_32(1101812256);
+emit_32(1130788880);
+emit_32(1125412897);
+emit_32(1101911923);
+emit_32(1130788880);
+emit_32(1125668880);
+emit_32(1102583326);
+emit_32(1130788880);
+emit_32(1125924864);
+emit_32(1105586396);
+emit_32(1130788880);
+emit_32(1126180848);
+emit_32(1105418204);
+emit_32(1130788880);
+emit_32(1126436897);
+emit_32(1105539000);
+emit_32(1130788880);
+emit_32(1126692880);
+emit_32(1106015263);
+emit_32(1130788880);
+emit_32(1126948864);
+emit_32(1106032198);
+emit_32(1130788880);
+emit_32(1127204848);
+emit_32(1106139834);
+emit_32(1130788880);
+emit_32(1127460897);
+emit_32(1105229880);
+emit_32(1130788880);
+emit_32(1127716880);
+emit_32(1105009679);
+emit_32(1130788880);
+emit_32(1127972864);
+emit_32(1104632873);
+emit_32(1130788880);
+emit_32(1128228848);
+emit_32(1104045408);
+emit_32(1130788880);
+emit_32(1128484897);
+emit_32(1103027136);
+emit_32(1130788880);
+emit_32(1128740880);
+emit_32(1102134274);
+emit_32(1130788880);
+emit_32(1128996864);
+emit_32(1101980290);
+emit_32(1130788880);
+emit_32(1129252848);
+emit_32(1101929854);
+emit_32(1130788880);
+emit_32(1129508897);
+emit_32(1102202274);
+emit_32(1130788880);
+emit_32(1129764880);
+emit_32(1102297170);
+emit_32(1130788880);
+emit_32(1130020864);
+emit_32(1099118307);
+emit_32(1130788880);
+emit_32(1130276848);
+emit_32(1098962856);
+emit_32(1130788880);
+emit_32(1130532897);
+emit_32(1099408500);
+emit_32(1130788880);
+emit_32(1130788880);
+emit_32(1099424124);
+emit_32(1130788880);
+emit_32(1131044864);
+emit_32(1098958347);
+emit_32(1130788880);
+emit_32(1131300848);
+emit_32(1098882272);
+emit_32(1130788880);
+emit_32(1131556897);
+emit_32(1098200698);
+emit_32(1130788880);
+emit_32(1131812880);
+emit_32(1098164103);
+emit_32(1130788880);
+emit_32(1132068864);
+emit_32(1097566310);
+emit_32(1130788880);
+emit_32(1081737258);
+emit_32(1088205504);
+emit_32(1130532897);
+emit_32(1090125845);
+emit_32(1087556645);
+emit_32(1130532897);
+emit_32(1094418484);
+emit_32(1086398472);
+emit_32(1130532897);
+emit_32(1098514432);
+emit_32(1083645478);
+emit_32(1130532897);
+emit_32(1100759066);
+emit_32(1080639357);
+emit_32(1130532897);
+emit_32(1102807040);
+emit_32(1082880395);
+emit_32(1130532897);
+emit_32(1104855066);
+emit_32(1082376092);
+emit_32(1130532897);
+emit_32(1106903040);
+emit_32(1082783171);
+emit_32(1130532897);
+emit_32(1108123661);
+emit_32(1079715142);
+emit_32(1130532897);
+emit_32(1109147648);
+emit_32(1074967232);
+emit_32(1130532897);
+emit_32(1110171661);
+emit_32(1075751525);
+emit_32(1130532897);
+emit_32(1111195648);
+emit_32(1074864513);
+emit_32(1130532897);
+emit_32(1112219661);
+emit_32(1066352635);
+emit_32(1130532897);
+emit_32(1113243648);
+emit_32(1075556532);
+emit_32(1130532897);
+emit_32(1114267661);
+emit_32(1081657231);
+emit_32(1130532897);
+emit_32(1115291648);
+emit_32(1082114913);
+emit_32(1130532897);
+emit_32(1116000263);
+emit_32(1082771049);
+emit_32(1130532897);
+emit_32(1116512256);
+emit_32(1083047705);
+emit_32(1130532897);
+emit_32(1117024263);
+emit_32(1081671953);
+emit_32(1130532897);
+emit_32(1117536256);
+emit_32(1082383810);
+emit_32(1130532897);
+emit_32(1118048263);
+emit_32(1085344359);
+emit_32(1130532897);
+emit_32(1118560256);
+emit_32(1087131993);
+emit_32(1130532897);
+emit_32(1119072263);
+emit_32(1088001598);
+emit_32(1130532897);
+emit_32(1119584256);
+emit_32(1090829398);
+emit_32(1130532897);
+emit_32(1120096263);
+emit_32(1091029938);
+emit_32(1130532897);
+emit_32(1120608322);
+emit_32(1092548601);
+emit_32(1130532897);
+emit_32(1121120289);
+emit_32(1094257947);
+emit_32(1130532897);
+emit_32(1121632256);
+emit_32(1095812881);
+emit_32(1130532897);
+emit_32(1122144223);
+emit_32(1096665897);
+emit_32(1130532897);
+emit_32(1122656322);
+emit_32(1097826356);
+emit_32(1130532897);
+emit_32(1123168289);
+emit_32(1099106825);
+emit_32(1130532897);
+emit_32(1123680256);
+emit_32(1099535378);
+emit_32(1130532897);
+emit_32(1124132848);
+emit_32(1099629068);
+emit_32(1130532897);
+emit_32(1124388897);
+emit_32(1100012480);
+emit_32(1130532897);
+emit_32(1124644880);
+emit_32(1100315047);
+emit_32(1130532897);
+emit_32(1124900864);
+emit_32(1100226809);
+emit_32(1130532897);
+emit_32(1125156848);
+emit_32(1101404150);
+emit_32(1130532897);
+emit_32(1125412897);
+emit_32(1101559392);
+emit_32(1130532897);
+emit_32(1125668880);
+emit_32(1104381215);
+emit_32(1130532897);
+emit_32(1125924864);
+emit_32(1104769555);
+emit_32(1130532897);
+emit_32(1126180848);
+emit_32(1104830110);
+emit_32(1130532897);
+emit_32(1126436897);
+emit_32(1105225685);
+emit_32(1130532897);
+emit_32(1126692880);
+emit_32(1105543666);
+emit_32(1130532897);
+emit_32(1126948864);
+emit_32(1105381923);
+emit_32(1130532897);
+emit_32(1127204848);
+emit_32(1102960080);
+emit_32(1130532897);
+emit_32(1127460897);
+emit_32(1102636017);
+emit_32(1130532897);
+emit_32(1127716880);
+emit_32(1102352640);
+emit_32(1130532897);
+emit_32(1127972864);
+emit_32(1102376600);
+emit_32(1130532897);
+emit_32(1128228848);
+emit_32(1101985061);
+emit_32(1130532897);
+emit_32(1128484897);
+emit_32(1100996464);
+emit_32(1130532897);
+emit_32(1128740880);
+emit_32(1102569013);
+emit_32(1130532897);
+emit_32(1128996864);
+emit_32(1102092331);
+emit_32(1130532897);
+emit_32(1129252848);
+emit_32(1102309543);
+emit_32(1130532897);
+emit_32(1129508897);
+emit_32(1102185287);
+emit_32(1130532897);
+emit_32(1129764880);
+emit_32(1102249407);
+emit_32(1130532897);
+emit_32(1130020864);
+emit_32(1102463107);
+emit_32(1130532897);
+emit_32(1130276848);
+emit_32(1099451125);
+emit_32(1130532897);
+emit_32(1130532897);
+emit_32(1098977588);
+emit_32(1130532897);
+emit_32(1130788880);
+emit_32(1099393401);
+emit_32(1130532897);
+emit_32(1131044864);
+emit_32(1099525941);
+emit_32(1130532897);
+emit_32(1131300848);
+emit_32(1099608359);
+emit_32(1130532897);
+emit_32(1131556897);
+emit_32(1099010985);
+emit_32(1130532897);
+emit_32(1131812880);
+emit_32(1098150052);
+emit_32(1130532897);
+emit_32(1132068864);
+emit_32(1097996750);
+emit_32(1130532897);
+emit_32(1081737258);
+emit_32(1088030748);
+emit_32(1130276848);
+emit_32(1090125845);
+emit_32(1088922017);
+emit_32(1130276848);
+emit_32(1094418484);
+emit_32(1086531599);
+emit_32(1130276848);
+emit_32(1098514432);
+emit_32(1084132164);
+emit_32(1130276848);
+emit_32(1100759066);
+emit_32(1081632694);
+emit_32(1130276848);
+emit_32(1102807040);
+emit_32(1082276478);
+emit_32(1130276848);
+emit_32(1104855066);
+emit_32(1081735706);
+emit_32(1130276848);
+emit_32(1106903040);
+emit_32(1082304580);
+emit_32(1130276848);
+emit_32(1108123661);
+emit_32(1079035203);
+emit_32(1130276848);
+emit_32(1109147648);
+emit_32(1069837514);
+emit_32(1130276848);
+emit_32(1110171661);
+emit_32(1072973008);
+emit_32(1130276848);
+emit_32(1111195648);
+emit_32(1073616750);
+emit_32(1130276848);
+emit_32(1112219661);
+emit_32(1074356373);
+emit_32(1130276848);
+emit_32(1113243648);
+emit_32(1076853159);
+emit_32(1130276848);
+emit_32(1114267661);
+emit_32(1081069063);
+emit_32(1130276848);
+emit_32(1115291648);
+emit_32(1082137856);
+emit_32(1130276848);
+emit_32(1116000263);
+emit_32(1082943959);
+emit_32(1130276848);
+emit_32(1116512256);
+emit_32(1081841906);
+emit_32(1130276848);
+emit_32(1117024263);
+emit_32(1079724873);
+emit_32(1130276848);
+emit_32(1117536256);
+emit_32(1084345444);
+emit_32(1130276848);
+emit_32(1118048263);
+emit_32(1086294789);
+emit_32(1130276848);
+emit_32(1118560256);
+emit_32(1087434528);
+emit_32(1130276848);
+emit_32(1119072263);
+emit_32(1088073635);
+emit_32(1130276848);
+emit_32(1119584256);
+emit_32(1089448947);
+emit_32(1130276848);
+emit_32(1120096263);
+emit_32(1090721069);
+emit_32(1130276848);
+emit_32(1120608322);
+emit_32(1091918239);
+emit_32(1130276848);
+emit_32(1121120289);
+emit_32(1094547984);
+emit_32(1130276848);
+emit_32(1121632256);
+emit_32(1095883345);
+emit_32(1130276848);
+emit_32(1122144223);
+emit_32(1096699766);
+emit_32(1130276848);
+emit_32(1122656322);
+emit_32(1097650825);
+emit_32(1130276848);
+emit_32(1123168289);
+emit_32(1098292029);
+emit_32(1130276848);
+emit_32(1123680256);
+emit_32(1098586993);
+emit_32(1130276848);
+emit_32(1124132848);
+emit_32(1099015075);
+emit_32(1130276848);
+emit_32(1124388897);
+emit_32(1099448608);
+emit_32(1130276848);
+emit_32(1124644880);
+emit_32(1100240545);
+emit_32(1130276848);
+emit_32(1124900864);
+emit_32(1100411568);
+emit_32(1130276848);
+emit_32(1125156848);
+emit_32(1100717962);
+emit_32(1130276848);
+emit_32(1125412897);
+emit_32(1104106121);
+emit_32(1130276848);
+emit_32(1125668880);
+emit_32(1103981340);
+emit_32(1130276848);
+emit_32(1125924864);
+emit_32(1104173177);
+emit_32(1130276848);
+emit_32(1126180848);
+emit_32(1104308653);
+emit_32(1130276848);
+emit_32(1126436897);
+emit_32(1104718856);
+emit_32(1130276848);
+emit_32(1126692880);
+emit_32(1104731072);
+emit_32(1130276848);
+emit_32(1126948864);
+emit_32(1102448479);
+emit_32(1130276848);
+emit_32(1127204848);
+emit_32(1102776107);
+emit_32(1130276848);
+emit_32(1127460897);
+emit_32(1102622858);
+emit_32(1130276848);
+emit_32(1127716880);
+emit_32(1102367582);
+emit_32(1130276848);
+emit_32(1127972864);
+emit_32(1102063704);
+emit_32(1130276848);
+emit_32(1128228848);
+emit_32(1101966973);
+emit_32(1130276848);
+emit_32(1128484897);
+emit_32(1101031067);
+emit_32(1130276848);
+emit_32(1128740880);
+emit_32(1100260154);
+emit_32(1130276848);
+emit_32(1128996864);
+emit_32(1100108530);
+emit_32(1130276848);
+emit_32(1129252848);
+emit_32(1102466305);
+emit_32(1130276848);
+emit_32(1129508897);
+emit_32(1102042209);
+emit_32(1130276848);
+emit_32(1129764880);
+emit_32(1101779803);
+emit_32(1130276848);
+emit_32(1130020864);
+emit_32(1101832441);
+emit_32(1130276848);
+emit_32(1130276848);
+emit_32(1101855772);
+emit_32(1130276848);
+emit_32(1130532897);
+emit_32(1099854407);
+emit_32(1130276848);
+emit_32(1130788880);
+emit_32(1099755369);
+emit_32(1130276848);
+emit_32(1131044864);
+emit_32(1100126198);
+emit_32(1130276848);
+emit_32(1131300848);
+emit_32(1100210346);
+emit_32(1130276848);
+emit_32(1131556897);
+emit_32(1099599131);
+emit_32(1130276848);
+emit_32(1131812880);
+emit_32(1099312713);
+emit_32(1130276848);
+emit_32(1132068864);
+emit_32(1099215405);
+emit_32(1130276848);
+emit_32(1081737300);
+emit_32(1090545737);
+emit_32(1130020864);
+emit_32(1090125845);
+emit_32(1090779118);
+emit_32(1130020864);
+emit_32(1094418484);
+emit_32(1088257765);
+emit_32(1130020864);
+emit_32(1098514432);
+emit_32(1086032917);
+emit_32(1130020864);
+emit_32(1100759066);
+emit_32(1083317483);
+emit_32(1130020864);
+emit_32(1102807040);
+emit_32(1080833973);
+emit_32(1130020864);
+emit_32(1104855066);
+emit_32(1082686639);
+emit_32(1130020864);
+emit_32(1106903040);
+emit_32(1079520862);
+emit_32(1130020864);
+emit_32(1108123661);
+emit_32(1071421451);
+emit_32(1130020864);
+emit_32(1109147648);
+emit_32(1074673169);
+emit_32(1130020864);
+emit_32(1110171661);
+emit_32(1076755348);
+emit_32(1130020864);
+emit_32(1111195648);
+emit_32(1078551432);
+emit_32(1130020864);
+emit_32(1112219661);
+emit_32(1078159559);
+emit_32(1130020864);
+emit_32(1113243648);
+emit_32(1078755569);
+emit_32(1130020864);
+emit_32(1114267661);
+emit_32(1080798447);
+emit_32(1130020864);
+emit_32(1115291648);
+emit_32(1079415837);
+emit_32(1130020864);
+emit_32(1116000263);
+emit_32(1082138863);
+emit_32(1130020864);
+emit_32(1116512256);
+emit_32(1077619039);
+emit_32(1130020864);
+emit_32(1117024263);
+emit_32(1082948888);
+emit_32(1130020864);
+emit_32(1117536256);
+emit_32(1085399431);
+emit_32(1130020864);
+emit_32(1118048263);
+emit_32(1087137844);
+emit_32(1130020864);
+emit_32(1118560256);
+emit_32(1087057984);
+emit_32(1130020864);
+emit_32(1119072263);
+emit_32(1088011706);
+emit_32(1130020864);
+emit_32(1119584256);
+emit_32(1087547166);
+emit_32(1130020864);
+emit_32(1120096263);
+emit_32(1089001897);
+emit_32(1130020864);
+emit_32(1120608322);
+emit_32(1092274230);
+emit_32(1130020864);
+emit_32(1121120289);
+emit_32(1093489656);
+emit_32(1130020864);
+emit_32(1121632256);
+emit_32(1094888037);
+emit_32(1130020864);
+emit_32(1122144223);
+emit_32(1095981597);
+emit_32(1130020864);
+emit_32(1122656322);
+emit_32(1097071696);
+emit_32(1130020864);
+emit_32(1123168289);
+emit_32(1097539571);
+emit_32(1130020864);
+emit_32(1123680256);
+emit_32(1097094346);
+emit_32(1130020864);
+emit_32(1124132848);
+emit_32(1098861091);
+emit_32(1130020864);
+emit_32(1124388897);
+emit_32(1099278215);
+emit_32(1130020864);
+emit_32(1124644880);
+emit_32(1099782108);
+emit_32(1130020864);
+emit_32(1124900864);
+emit_32(1100389129);
+emit_32(1130020864);
+emit_32(1125156848);
+emit_32(1103220179);
+emit_32(1130020864);
+emit_32(1125412897);
+emit_32(1103665509);
+emit_32(1130020864);
+emit_32(1125668880);
+emit_32(1104112307);
+emit_32(1130020864);
+emit_32(1125924864);
+emit_32(1104257063);
+emit_32(1130020864);
+emit_32(1126180848);
+emit_32(1103372904);
+emit_32(1130020864);
+emit_32(1126436897);
+emit_32(1104276514);
+emit_32(1130020864);
+emit_32(1126692880);
+emit_32(1104476792);
+emit_32(1130020864);
+emit_32(1126948864);
+emit_32(1102277299);
+emit_32(1130020864);
+emit_32(1127204848);
+emit_32(1102993162);
+emit_32(1130020864);
+emit_32(1127460897);
+emit_32(1102760011);
+emit_32(1130020864);
+emit_32(1127716880);
+emit_32(1102172861);
+emit_32(1130020864);
+emit_32(1127972864);
+emit_32(1102165993);
+emit_32(1130020864);
+emit_32(1128228848);
+emit_32(1101400008);
+emit_32(1130020864);
+emit_32(1128484897);
+emit_32(1100749524);
+emit_32(1130020864);
+emit_32(1128740880);
+emit_32(1100733953);
+emit_32(1130020864);
+emit_32(1128996864);
+emit_32(1100153147);
+emit_32(1130020864);
+emit_32(1129252848);
+emit_32(1100010435);
+emit_32(1130020864);
+emit_32(1129508897);
+emit_32(1101004957);
+emit_32(1130020864);
+emit_32(1129764880);
+emit_32(1102164053);
+emit_32(1130020864);
+emit_32(1130020864);
+emit_32(1101850110);
+emit_32(1130020864);
+emit_32(1130276848);
+emit_32(1102364960);
+emit_32(1130020864);
+emit_32(1130532897);
+emit_32(1103265268);
+emit_32(1130020864);
+emit_32(1130788880);
+emit_32(1100508614);
+emit_32(1130020864);
+emit_32(1131044864);
+emit_32(1100302936);
+emit_32(1130020864);
+emit_32(1131300848);
+emit_32(1100358615);
+emit_32(1130020864);
+emit_32(1131556897);
+emit_32(1100122056);
+emit_32(1130020864);
+emit_32(1131812880);
+emit_32(1099275331);
+emit_32(1130020864);
+emit_32(1132068864);
+emit_32(1099473145);
+emit_32(1130020864);
+emit_32(1081737300);
+emit_32(1091835139);
+emit_32(1129764880);
+emit_32(1090125845);
+emit_32(1092274629);
+emit_32(1129764880);
+emit_32(1094418484);
+emit_32(1091485187);
+emit_32(1129764880);
+emit_32(1098514432);
+emit_32(1088227650);
+emit_32(1129764880);
+emit_32(1100759066);
+emit_32(1086589313);
+emit_32(1129764880);
+emit_32(1102807040);
+emit_32(1084191974);
+emit_32(1129764880);
+emit_32(1104855066);
+emit_32(1080611507);
+emit_32(1129764880);
+emit_32(1106903040);
+emit_32(1075926931);
+emit_32(1129764880);
+emit_32(1108123661);
+emit_32(1079228645);
+emit_32(1129764880);
+emit_32(1109147648);
+emit_32(1082222833);
+emit_32(1129764880);
+emit_32(1110171661);
+emit_32(1083146418);
+emit_32(1129764880);
+emit_32(1111195648);
+emit_32(1082983868);
+emit_32(1129764880);
+emit_32(1112219661);
+emit_32(1081162806);
+emit_32(1129764880);
+emit_32(1113243648);
+emit_32(1077328919);
+emit_32(1129764880);
+emit_32(1114267661);
+emit_32(1076126244);
+emit_32(1129764880);
+emit_32(1115291648);
+emit_32(1076114164);
+emit_32(1129764880);
+emit_32(1116000263);
+emit_32(1077220454);
+emit_32(1129764880);
+emit_32(1116512256);
+emit_32(1076896821);
+emit_32(1129764880);
+emit_32(1117024263);
+emit_32(1084289953);
+emit_32(1129764880);
+emit_32(1117536256);
+emit_32(1085902789);
+emit_32(1129764880);
+emit_32(1118048263);
+emit_32(1086392243);
+emit_32(1129764880);
+emit_32(1118560256);
+emit_32(1086899838);
+emit_32(1129764880);
+emit_32(1119072263);
+emit_32(1086675170);
+emit_32(1129764880);
+emit_32(1119584256);
+emit_32(1088147014);
+emit_32(1129764880);
+emit_32(1120096263);
+emit_32(1090408877);
+emit_32(1129764880);
+emit_32(1120608322);
+emit_32(1091709677);
+emit_32(1129764880);
+emit_32(1121120289);
+emit_32(1092234888);
+emit_32(1129764880);
+emit_32(1121632256);
+emit_32(1092967570);
+emit_32(1129764880);
+emit_32(1122144223);
+emit_32(1095135710);
+emit_32(1129764880);
+emit_32(1122656322);
+emit_32(1095795579);
+emit_32(1129764880);
+emit_32(1123168289);
+emit_32(1096420845);
+emit_32(1129764880);
+emit_32(1123680256);
+emit_32(1097142580);
+emit_32(1129764880);
+emit_32(1124132848);
+emit_32(1097919155);
+emit_32(1129764880);
+emit_32(1124388897);
+emit_32(1099013659);
+emit_32(1129764880);
+emit_32(1124644880);
+emit_32(1099826515);
+emit_32(1129764880);
+emit_32(1124900864);
+emit_32(1102949541);
+emit_32(1129764880);
+emit_32(1125156848);
+emit_32(1103290853);
+emit_32(1129764880);
+emit_32(1125412897);
+emit_32(1103584035);
+emit_32(1129764880);
+emit_32(1125668880);
+emit_32(1103730049);
+emit_32(1129764880);
+emit_32(1125924864);
+emit_32(1101436027);
+emit_32(1129764880);
+emit_32(1126180848);
+emit_32(1103412226);
+emit_32(1129764880);
+emit_32(1126436897);
+emit_32(1103699850);
+emit_32(1129764880);
+emit_32(1126692880);
+emit_32(1104185079);
+emit_32(1129764880);
+emit_32(1126948864);
+emit_32(1102131233);
+emit_32(1129764880);
+emit_32(1127204848);
+emit_32(1105054191);
+emit_32(1129764880);
+emit_32(1127460897);
+emit_32(1104932451);
+emit_32(1129764880);
+emit_32(1127716880);
+emit_32(1104496873);
+emit_32(1129764880);
+emit_32(1127972864);
+emit_32(1104477159);
+emit_32(1129764880);
+emit_32(1128228848);
+emit_32(1104320607);
+emit_32(1129764880);
+emit_32(1128484897);
+emit_32(1103549432);
+emit_32(1129764880);
+emit_32(1128740880);
+emit_32(1102911793);
+emit_32(1129764880);
+emit_32(1128996864);
+emit_32(1101627707);
+emit_32(1129764880);
+emit_32(1129252848);
+emit_32(1100874200);
+emit_32(1129764880);
+emit_32(1129508897);
+emit_32(1102213074);
+emit_32(1129764880);
+emit_32(1129764880);
+emit_32(1102331091);
+emit_32(1129764880);
+emit_32(1130020864);
+emit_32(1102551345);
+emit_32(1129764880);
+emit_32(1130276848);
+emit_32(1102696730);
+emit_32(1129764880);
+emit_32(1130532897);
+emit_32(1103568568);
+emit_32(1129764880);
+emit_32(1130788880);
+emit_32(1102851657);
+emit_32(1129764880);
+emit_32(1131044864);
+emit_32(1100504787);
+emit_32(1129764880);
+emit_32(1131300848);
+emit_32(1099935252);
+emit_32(1129764880);
+emit_32(1131556897);
+emit_32(1100381212);
+emit_32(1129764880);
+emit_32(1131812880);
+emit_32(1099598030);
+emit_32(1129764880);
+emit_32(1132068864);
+emit_32(1099324719);
+emit_32(1129764880);
+emit_32(1081737300);
+emit_32(1093216816);
+emit_32(1129508897);
+emit_32(1090125845);
+emit_32(1092417151);
+emit_32(1129508897);
+emit_32(1094418484);
+emit_32(1092298631);
+emit_32(1129508897);
+emit_32(1098514432);
+emit_32(1090960878);
+emit_32(1129508897);
+emit_32(1100759066);
+emit_32(1088614281);
+emit_32(1129508897);
+emit_32(1102807040);
+emit_32(1087275941);
+emit_32(1129508897);
+emit_32(1104855066);
+emit_32(1083352170);
+emit_32(1129508897);
+emit_32(1106903040);
+emit_32(1082781472);
+emit_32(1129508897);
+emit_32(1108123661);
+emit_32(1082625024);
+emit_32(1129508897);
+emit_32(1109147648);
+emit_32(1083756291);
+emit_32(1129508897);
+emit_32(1110171661);
+emit_32(1085301682);
+emit_32(1129508897);
+emit_32(1111195648);
+emit_32(1085254392);
+emit_32(1129508897);
+emit_32(1112219661);
+emit_32(1083183433);
+emit_32(1129508897);
+emit_32(1113243648);
+emit_32(1082262280);
+emit_32(1129508897);
+emit_32(1114267661);
+emit_32(1079746432);
+emit_32(1129508897);
+emit_32(1115291648);
+emit_32(1079747858);
+emit_32(1129508897);
+emit_32(1116000263);
+emit_32(1080629039);
+emit_32(1129508897);
+emit_32(1116512256);
+emit_32(1084566295);
+emit_32(1129508897);
+emit_32(1117024263);
+emit_32(1087852574);
+emit_32(1129508897);
+emit_32(1117536256);
+emit_32(1089342076);
+emit_32(1129508897);
+emit_32(1118048263);
+emit_32(1089066049);
+emit_32(1129508897);
+emit_32(1118560256);
+emit_32(1087464056);
+emit_32(1129508897);
+emit_32(1119072263);
+emit_32(1086240913);
+emit_32(1129508897);
+emit_32(1119584256);
+emit_32(1087270531);
+emit_32(1129508897);
+emit_32(1120096263);
+emit_32(1090862428);
+emit_32(1129508897);
+emit_32(1120608322);
+emit_32(1091412280);
+emit_32(1129508897);
+emit_32(1121120289);
+emit_32(1092239313);
+emit_32(1129508897);
+emit_32(1121632256);
+emit_32(1093054602);
+emit_32(1129508897);
+emit_32(1122144223);
+emit_32(1094389439);
+emit_32(1129508897);
+emit_32(1122656322);
+emit_32(1094766612);
+emit_32(1129508897);
+emit_32(1123168289);
+emit_32(1095867197);
+emit_32(1129508897);
+emit_32(1123680256);
+emit_32(1097324193);
+emit_32(1129508897);
+emit_32(1124132848);
+emit_32(1097994863);
+emit_32(1129508897);
+emit_32(1124388897);
+emit_32(1098508665);
+emit_32(1129508897);
+emit_32(1124644880);
+emit_32(1099390989);
+emit_32(1129508897);
+emit_32(1124900864);
+emit_32(1102819570);
+emit_32(1129508897);
+emit_32(1125156848);
+emit_32(1103456528);
+emit_32(1129508897);
+emit_32(1125412897);
+emit_32(1104213443);
+emit_32(1129508897);
+emit_32(1125668880);
+emit_32(1101924034);
+emit_32(1129508897);
+emit_32(1125924864);
+emit_32(1101395290);
+emit_32(1129508897);
+emit_32(1126180848);
+emit_32(1103179599);
+emit_32(1129508897);
+emit_32(1126436897);
+emit_32(1104174855);
+emit_32(1129508897);
+emit_32(1126692880);
+emit_32(1103711856);
+emit_32(1129508897);
+emit_32(1126948864);
+emit_32(1101427166);
+emit_32(1129508897);
+emit_32(1127204848);
+emit_32(1104341946);
+emit_32(1129508897);
+emit_32(1127460897);
+emit_32(1103905266);
+emit_32(1129508897);
+emit_32(1127716880);
+emit_32(1104351225);
+emit_32(1129508897);
+emit_32(1127972864);
+emit_32(1104338538);
+emit_32(1129508897);
+emit_32(1128228848);
+emit_32(1104240391);
+emit_32(1129508897);
+emit_32(1128484897);
+emit_32(1104134537);
+emit_32(1129508897);
+emit_32(1128740880);
+emit_32(1103285715);
+emit_32(1129508897);
+emit_32(1128996864);
+emit_32(1103034843);
+emit_32(1129508897);
+emit_32(1129252848);
+emit_32(1102598688);
+emit_32(1129508897);
+emit_32(1129508897);
+emit_32(1102258058);
+emit_32(1129508897);
+emit_32(1129764880);
+emit_32(1102454299);
+emit_32(1129508897);
+emit_32(1130020864);
+emit_32(1102717125);
+emit_32(1129508897);
+emit_32(1130276848);
+emit_32(1103026612);
+emit_32(1129508897);
+emit_32(1130532897);
+emit_32(1103449817);
+emit_32(1129508897);
+emit_32(1130788880);
+emit_32(1103303593);
+emit_32(1129508897);
+emit_32(1131044864);
+emit_32(1100124678);
+emit_32(1129508897);
+emit_32(1131300848);
+emit_32(1099774348);
+emit_32(1129508897);
+emit_32(1131556897);
+emit_32(1099896141);
+emit_32(1129508897);
+emit_32(1131812880);
+emit_32(1099520646);
+emit_32(1129508897);
+emit_32(1132068864);
+emit_32(1098974233);
+emit_32(1129508897);
+emit_32(1081737258);
+emit_32(1093092141);
+emit_32(1129252848);
+emit_32(1090125845);
+emit_32(1092641463);
+emit_32(1129252848);
+emit_32(1094418484);
+emit_32(1093021047);
+emit_32(1129252848);
+emit_32(1098514432);
+emit_32(1091404216);
+emit_32(1129252848);
+emit_32(1100759066);
+emit_32(1090891043);
+emit_32(1129252848);
+emit_32(1102807040);
+emit_32(1087333718);
+emit_32(1129252848);
+emit_32(1104855066);
+emit_32(1086550243);
+emit_32(1129252848);
+emit_32(1106903040);
+emit_32(1086614059);
+emit_32(1129252848);
+emit_32(1108123661);
+emit_32(1087395227);
+emit_32(1129252848);
+emit_32(1109147648);
+emit_32(1087693715);
+emit_32(1129252848);
+emit_32(1110171661);
+emit_32(1086905605);
+emit_32(1129252848);
+emit_32(1111195648);
+emit_32(1085917406);
+emit_32(1129252848);
+emit_32(1112219661);
+emit_32(1086122445);
+emit_32(1129252848);
+emit_32(1113243648);
+emit_32(1085614577);
+emit_32(1129252848);
+emit_32(1114267661);
+emit_32(1083545422);
+emit_32(1129252848);
+emit_32(1115291648);
+emit_32(1083831285);
+emit_32(1129252848);
+emit_32(1116000263);
+emit_32(1086466587);
+emit_32(1129252848);
+emit_32(1116512256);
+emit_32(1089709267);
+emit_32(1129252848);
+emit_32(1117024263);
+emit_32(1091281166);
+emit_32(1129252848);
+emit_32(1117536256);
+emit_32(1091916068);
+emit_32(1129252848);
+emit_32(1118048263);
+emit_32(1091040717);
+emit_32(1129252848);
+emit_32(1118560256);
+emit_32(1090210612);
+emit_32(1129252848);
+emit_32(1119072263);
+emit_32(1089209851);
+emit_32(1129252848);
+emit_32(1119584256);
+emit_32(1089378399);
+emit_32(1129252848);
+emit_32(1120096263);
+emit_32(1090028789);
+emit_32(1129252848);
+emit_32(1120608322);
+emit_32(1091234840);
+emit_32(1129252848);
+emit_32(1121120289);
+emit_32(1093074734);
+emit_32(1129252848);
+emit_32(1121632256);
+emit_32(1093111330);
+emit_32(1129252848);
+emit_32(1122144223);
+emit_32(1094128029);
+emit_32(1129252848);
+emit_32(1122656322);
+emit_32(1095036410);
+emit_32(1129252848);
+emit_32(1123168289);
+emit_32(1095680551);
+emit_32(1129252848);
+emit_32(1123680256);
+emit_32(1097146460);
+emit_32(1129252848);
+emit_32(1124132848);
+emit_32(1098042153);
+emit_32(1129252848);
+emit_32(1124388897);
+emit_32(1097318741);
+emit_32(1129252848);
+emit_32(1124644880);
+emit_32(1101515457);
+emit_32(1129252848);
+emit_32(1124900864);
+emit_32(1102822454);
+emit_32(1129252848);
+emit_32(1125156848);
+emit_32(1103621941);
+emit_32(1129252848);
+emit_32(1125412897);
+emit_32(1104011330);
+emit_32(1129252848);
+emit_32(1125668880);
+emit_32(1101788244);
+emit_32(1129252848);
+emit_32(1125924864);
+emit_32(1102141981);
+emit_32(1129252848);
+emit_32(1126180848);
+emit_32(1103612556);
+emit_32(1129252848);
+emit_32(1126436897);
+emit_32(1104382421);
+emit_32(1129252848);
+emit_32(1126692880);
+emit_32(1104094324);
+emit_32(1129252848);
+emit_32(1126948864);
+emit_32(1101288335);
+emit_32(1129252848);
+emit_32(1127204848);
+emit_32(1103222224);
+emit_32(1129252848);
+emit_32(1127460897);
+emit_32(1103312087);
+emit_32(1129252848);
+emit_32(1127716880);
+emit_32(1103773512);
+emit_32(1129252848);
+emit_32(1127972864);
+emit_32(1104076551);
+emit_32(1129252848);
+emit_32(1128228848);
+emit_32(1104345353);
+emit_32(1129252848);
+emit_32(1128484897);
+emit_32(1104178053);
+emit_32(1129252848);
+emit_32(1128740880);
+emit_32(1103422240);
+emit_32(1129252848);
+emit_32(1128996864);
+emit_32(1103161092);
+emit_32(1129252848);
+emit_32(1129252848);
+emit_32(1102825705);
+emit_32(1129252848);
+emit_32(1129508897);
+emit_32(1102393482);
+emit_32(1129252848);
+emit_32(1129764880);
+emit_32(1102471601);
+emit_32(1129252848);
+emit_32(1130020864);
+emit_32(1100205471);
+emit_32(1129252848);
+emit_32(1130276848);
+emit_32(1102674552);
+emit_32(1129252848);
+emit_32(1130532897);
+emit_32(1102672980);
+emit_32(1129252848);
+emit_32(1130788880);
+emit_32(1102535406);
+emit_32(1129252848);
+emit_32(1131044864);
+emit_32(1100902669);
+emit_32(1129252848);
+emit_32(1131300848);
+emit_32(1099358641);
+emit_32(1129252848);
+emit_32(1131556897);
+emit_32(1099486829);
+emit_32(1129252848);
+emit_32(1131812880);
+emit_32(1098967679);
+emit_32(1129252848);
+emit_32(1132068864);
+emit_32(1097864210);
+emit_32(1129252848);
+emit_32(1081737258);
+emit_32(1094158228);
+emit_32(1128996864);
+emit_32(1090125845);
+emit_32(1093761447);
+emit_32(1128996864);
+emit_32(1094418484);
+emit_32(1094140822);
+emit_32(1128996864);
+emit_32(1098514432);
+emit_32(1093034574);
+emit_32(1128996864);
+emit_32(1100759066);
+emit_32(1091456100);
+emit_32(1128996864);
+emit_32(1102807040);
+emit_32(1089525095);
+emit_32(1128996864);
+emit_32(1104855066);
+emit_32(1088585025);
+emit_32(1128996864);
+emit_32(1106903040);
+emit_32(1090478817);
+emit_32(1128996864);
+emit_32(1108123661);
+emit_32(1091340515);
+emit_32(1128996864);
+emit_32(1109147648);
+emit_32(1091433031);
+emit_32(1128996864);
+emit_32(1110171661);
+emit_32(1090929264);
+emit_32(1128996864);
+emit_32(1111195648);
+emit_32(1089429192);
+emit_32(1128996864);
+emit_32(1112219661);
+emit_32(1087959340);
+emit_32(1128996864);
+emit_32(1113243648);
+emit_32(1088733567);
+emit_32(1128996864);
+emit_32(1114267661);
+emit_32(1087293054);
+emit_32(1128996864);
+emit_32(1115291648);
+emit_32(1087872937);
+emit_32(1128996864);
+emit_32(1116000263);
+emit_32(1089774656);
+emit_32(1128996864);
+emit_32(1116512256);
+emit_32(1091806303);
+emit_32(1128996864);
+emit_32(1117024263);
+emit_32(1092488066);
+emit_32(1128996864);
+emit_32(1117536256);
+emit_32(1092781238);
+emit_32(1128996864);
+emit_32(1118048263);
+emit_32(1092423317);
+emit_32(1128996864);
+emit_32(1118560256);
+emit_32(1092476627);
+emit_32(1128996864);
+emit_32(1119072263);
+emit_32(1092619547);
+emit_32(1128996864);
+emit_32(1119584256);
+emit_32(1092370794);
+emit_32(1128996864);
+emit_32(1120096263);
+emit_32(1091790858);
+emit_32(1128996864);
+emit_32(1120608322);
+emit_32(1091461888);
+emit_32(1128996864);
+emit_32(1121120289);
+emit_32(1092460080);
+emit_32(1128996864);
+emit_32(1121632256);
+emit_32(1094170916);
+emit_32(1128996864);
+emit_32(1122144223);
+emit_32(1094599154);
+emit_32(1128996864);
+emit_32(1122656322);
+emit_32(1095059898);
+emit_32(1128996864);
+emit_32(1123168289);
+emit_32(1096401342);
+emit_32(1128996864);
+emit_32(1123680256);
+emit_32(1096965371);
+emit_32(1128996864);
+emit_32(1124132848);
+emit_32(1097641807);
+emit_32(1128996864);
+emit_32(1124388897);
+emit_32(1099087059);
+emit_32(1128996864);
+emit_32(1124644880);
+emit_32(1102450944);
+emit_32(1128996864);
+emit_32(1124900864);
+emit_32(1103410286);
+emit_32(1128996864);
+emit_32(1125156848);
+emit_32(1103813149);
+emit_32(1128996864);
+emit_32(1125412897);
+emit_32(1101937980);
+emit_32(1128996864);
+emit_32(1125668880);
+emit_32(1103166020);
+emit_32(1128996864);
+emit_32(1125924864);
+emit_32(1104505681);
+emit_32(1128996864);
+emit_32(1126180848);
+emit_32(1103994867);
+emit_32(1128996864);
+emit_32(1126436897);
+emit_32(1104662548);
+emit_32(1128996864);
+emit_32(1126692880);
+emit_32(1104116974);
+emit_32(1128996864);
+emit_32(1126948864);
+emit_32(1100885629);
+emit_32(1128996864);
+emit_32(1127204848);
+emit_32(1100638585);
+emit_32(1128996864);
+emit_32(1127460897);
+emit_32(1100607442);
+emit_32(1128996864);
+emit_32(1127716880);
+emit_32(1103522116);
+emit_32(1128996864);
+emit_32(1127972864);
+emit_32(1103785676);
+emit_32(1128996864);
+emit_32(1128228848);
+emit_32(1103795375);
+emit_32(1128996864);
+emit_32(1128484897);
+emit_32(1101024146);
+emit_32(1128996864);
+emit_32(1128740880);
+emit_32(1100738829);
+emit_32(1128996864);
+emit_32(1128996864);
+emit_32(1102805677);
+emit_32(1128996864);
+emit_32(1129252848);
+emit_32(1102445543);
+emit_32(1128996864);
+emit_32(1129508897);
+emit_32(1102293657);
+emit_32(1128996864);
+emit_32(1129764880);
+emit_32(1100424728);
+emit_32(1128996864);
+emit_32(1130020864);
+emit_32(1099671273);
+emit_32(1128996864);
+emit_32(1130276848);
+emit_32(1100387975);
+emit_32(1128996864);
+emit_32(1130532897);
+emit_32(1101778072);
+emit_32(1128996864);
+emit_32(1130788880);
+emit_32(1101932318);
+emit_32(1128996864);
+emit_32(1131044864);
+emit_32(1101602383);
+emit_32(1128996864);
+emit_32(1131300848);
+emit_32(1098804049);
+emit_32(1128996864);
+emit_32(1131556897);
+emit_32(1098879861);
+emit_32(1128996864);
+emit_32(1131812880);
+emit_32(1098098881);
+emit_32(1128996864);
+emit_32(1132068864);
+emit_32(1096354890);
+emit_32(1128996864);
+emit_32(1081737258);
+emit_32(1094837495);
+emit_32(1128740880);
+emit_32(1090125845);
+emit_32(1095096284);
+emit_32(1128740880);
+emit_32(1094418484);
+emit_32(1094836761);
+emit_32(1128740880);
+emit_32(1098514432);
+emit_32(1093776966);
+emit_32(1128740880);
+emit_32(1100759066);
+emit_32(1092523739);
+emit_32(1128740880);
+emit_32(1102807040);
+emit_32(1091209108);
+emit_32(1128740880);
+emit_32(1104855066);
+emit_32(1090481543);
+emit_32(1128740880);
+emit_32(1106903040);
+emit_32(1091724850);
+emit_32(1128740880);
+emit_32(1108123661);
+emit_32(1092918077);
+emit_32(1128740880);
+emit_32(1109147648);
+emit_32(1092885571);
+emit_32(1128740880);
+emit_32(1110171661);
+emit_32(1092185311);
+emit_32(1128740880);
+emit_32(1111195648);
+emit_32(1090654935);
+emit_32(1128740880);
+emit_32(1112219661);
+emit_32(1090140378);
+emit_32(1128740880);
+emit_32(1113243648);
+emit_32(1091090734);
+emit_32(1128740880);
+emit_32(1114267661);
+emit_32(1090672415);
+emit_32(1128740880);
+emit_32(1115291648);
+emit_32(1091158399);
+emit_32(1128740880);
+emit_32(1116000263);
+emit_32(1092233651);
+emit_32(1128740880);
+emit_32(1116512256);
+emit_32(1093174139);
+emit_32(1128740880);
+emit_32(1117024263);
+emit_32(1092967255);
+emit_32(1128740880);
+emit_32(1117536256);
+emit_32(1093958998);
+emit_32(1128740880);
+emit_32(1118048263);
+emit_32(1094070986);
+emit_32(1128740880);
+emit_32(1118560256);
+emit_32(1094393423);
+emit_32(1128740880);
+emit_32(1119072263);
+emit_32(1095115263);
+emit_32(1128740880);
+emit_32(1119584256);
+emit_32(1095201351);
+emit_32(1128740880);
+emit_32(1120096263);
+emit_32(1094051693);
+emit_32(1128740880);
+emit_32(1120608322);
+emit_32(1092903187);
+emit_32(1128740880);
+emit_32(1121120289);
+emit_32(1093066136);
+emit_32(1128740880);
+emit_32(1121632256);
+emit_32(1093765641);
+emit_32(1128740880);
+emit_32(1122144223);
+emit_32(1094858886);
+emit_32(1128740880);
+emit_32(1122656322);
+emit_32(1095293731);
+emit_32(1128740880);
+emit_32(1123168289);
+emit_32(1096058248);
+emit_32(1128740880);
+emit_32(1123680256);
+emit_32(1098058197);
+emit_32(1128740880);
+emit_32(1124132848);
+emit_32(1099090415);
+emit_32(1128740880);
+emit_32(1124388897);
+emit_32(1099754216);
+emit_32(1128740880);
+emit_32(1124644880);
+emit_32(1103037989);
+emit_32(1128740880);
+emit_32(1124900864);
+emit_32(1103411334);
+emit_32(1128740880);
+emit_32(1125156848);
+emit_32(1104264875);
+emit_32(1128740880);
+emit_32(1125412897);
+emit_32(1101973160);
+emit_32(1128740880);
+emit_32(1125668880);
+emit_32(1104413616);
+emit_32(1128740880);
+emit_32(1125924864);
+emit_32(1104295861);
+emit_32(1128740880);
+emit_32(1126180848);
+emit_32(1104392801);
+emit_32(1128740880);
+emit_32(1126436897);
+emit_32(1104250248);
+emit_32(1128740880);
+emit_32(1126692880);
+emit_32(1104207466);
+emit_32(1128740880);
+emit_32(1126948864);
+emit_32(1101393507);
+emit_32(1128740880);
+emit_32(1127204848);
+emit_32(1101210845);
+emit_32(1128740880);
+emit_32(1127460897);
+emit_32(1100893913);
+emit_32(1128740880);
+emit_32(1127716880);
+emit_32(1101512678);
+emit_32(1128740880);
+emit_32(1127972864);
+emit_32(1103029862);
+emit_32(1128740880);
+emit_32(1128228848);
+emit_32(1103145206);
+emit_32(1128740880);
+emit_32(1128484897);
+emit_32(1100738514);
+emit_32(1128740880);
+emit_32(1128740880);
+emit_32(1101464234);
+emit_32(1128740880);
+emit_32(1128996864);
+emit_32(1102046560);
+emit_32(1128740880);
+emit_32(1129252848);
+emit_32(1102012062);
+emit_32(1128740880);
+emit_32(1129508897);
+emit_32(1101022678);
+emit_32(1128740880);
+emit_32(1129764880);
+emit_32(1098697723);
+emit_32(1128740880);
+emit_32(1130020864);
+emit_32(1098672662);
+emit_32(1128740880);
+emit_32(1130276848);
+emit_32(1098798911);
+emit_32(1128740880);
+emit_32(1130532897);
+emit_32(1100908750);
+emit_32(1128740880);
+emit_32(1130788880);
+emit_32(1100999243);
+emit_32(1128740880);
+emit_32(1131044864);
+emit_32(1100710255);
+emit_32(1128740880);
+emit_32(1131300848);
+emit_32(1097055338);
+emit_32(1128740880);
+emit_32(1131556897);
+emit_32(1097777807);
+emit_32(1128740880);
+emit_32(1131812880);
+emit_32(1096376071);
+emit_32(1128740880);
+emit_32(1132068864);
+emit_32(1094422364);
+emit_32(1128740880);
+emit_32(1081737258);
+emit_32(1096602144);
+emit_32(1128484897);
+emit_32(1090125845);
+emit_32(1096605604);
+emit_32(1128484897);
+emit_32(1094418484);
+emit_32(1095915222);
+emit_32(1128484897);
+emit_32(1098514432);
+emit_32(1094988700);
+emit_32(1128484897);
+emit_32(1100759066);
+emit_32(1093318738);
+emit_32(1128484897);
+emit_32(1102807040);
+emit_32(1092655199);
+emit_32(1128484897);
+emit_32(1104855066);
+emit_32(1091908927);
+emit_32(1128484897);
+emit_32(1106903040);
+emit_32(1093146457);
+emit_32(1128484897);
+emit_32(1108123661);
+emit_32(1093729255);
+emit_32(1128484897);
+emit_32(1109147648);
+emit_32(1093918628);
+emit_32(1128484897);
+emit_32(1110171661);
+emit_32(1093116048);
+emit_32(1128484897);
+emit_32(1111195648);
+emit_32(1091599514);
+emit_32(1128484897);
+emit_32(1112219661);
+emit_32(1092064610);
+emit_32(1128484897);
+emit_32(1113243648);
+emit_32(1092256562);
+emit_32(1128484897);
+emit_32(1114267661);
+emit_32(1092232937);
+emit_32(1128484897);
+emit_32(1115291648);
+emit_32(1092569216);
+emit_32(1128484897);
+emit_32(1116000263);
+emit_32(1093499827);
+emit_32(1128484897);
+emit_32(1116512256);
+emit_32(1094494401);
+emit_32(1128484897);
+emit_32(1117024263);
+emit_32(1094275249);
+emit_32(1128484897);
+emit_32(1117536256);
+emit_32(1095835320);
+emit_32(1128484897);
+emit_32(1118048263);
+emit_32(1096603927);
+emit_32(1128484897);
+emit_32(1118560256);
+emit_32(1095737174);
+emit_32(1128484897);
+emit_32(1119072263);
+emit_32(1097480536);
+emit_32(1128484897);
+emit_32(1119584256);
+emit_32(1097454217);
+emit_32(1128484897);
+emit_32(1120096263);
+emit_32(1096093480);
+emit_32(1128484897);
+emit_32(1120608322);
+emit_32(1095489500);
+emit_32(1128484897);
+emit_32(1121120289);
+emit_32(1095558601);
+emit_32(1128484897);
+emit_32(1121632256);
+emit_32(1094835713);
+emit_32(1128484897);
+emit_32(1122144223);
+emit_32(1095452590);
+emit_32(1128484897);
+emit_32(1122656322);
+emit_32(1095192334);
+emit_32(1128484897);
+emit_32(1123168289);
+emit_32(1096359399);
+emit_32(1128484897);
+emit_32(1123680256);
+emit_32(1098052325);
+emit_32(1128484897);
+emit_32(1124132848);
+emit_32(1099302384);
+emit_32(1128484897);
+emit_32(1124388897);
+emit_32(1100571948);
+emit_32(1128484897);
+emit_32(1124644880);
+emit_32(1103063207);
+emit_32(1128484897);
+emit_32(1124900864);
+emit_32(1104141301);
+emit_32(1128484897);
+emit_32(1125156848);
+emit_32(1104236039);
+emit_32(1128484897);
+emit_32(1125412897);
+emit_32(1101777338);
+emit_32(1128484897);
+emit_32(1125668880);
+emit_32(1103904794);
+emit_32(1128484897);
+emit_32(1125924864);
+emit_32(1104679954);
+emit_32(1128484897);
+emit_32(1126180848);
+emit_32(1104977645);
+emit_32(1128484897);
+emit_32(1126436897);
+emit_32(1104719800);
+emit_32(1128484897);
+emit_32(1126692880);
+emit_32(1104308181);
+emit_32(1128484897);
+emit_32(1126948864);
+emit_32(1102818784);
+emit_32(1128484897);
+emit_32(1127204848);
+emit_32(1104373455);
+emit_32(1128484897);
+emit_32(1127460897);
+emit_32(1101605267);
+emit_32(1128484897);
+emit_32(1127716880);
+emit_32(1101582618);
+emit_32(1128484897);
+emit_32(1127972864);
+emit_32(1103712433);
+emit_32(1128484897);
+emit_32(1128228848);
+emit_32(1103557086);
+emit_32(1128484897);
+emit_32(1128484897);
+emit_32(1103194069);
+emit_32(1128484897);
+emit_32(1128740880);
+emit_32(1101005482);
+emit_32(1128484897);
+emit_32(1128996864);
+emit_32(1102896693);
+emit_32(1128484897);
+emit_32(1129252848);
+emit_32(1102422632);
+emit_32(1128484897);
+emit_32(1129508897);
+emit_32(1099646737);
+emit_32(1128484897);
+emit_32(1129764880);
+emit_32(1099338403);
+emit_32(1128484897);
+emit_32(1130020864);
+emit_32(1099043701);
+emit_32(1128484897);
+emit_32(1130276848);
+emit_32(1098432643);
+emit_32(1128484897);
+emit_32(1130532897);
+emit_32(1101270824);
+emit_32(1128484897);
+emit_32(1130788880);
+emit_32(1101020319);
+emit_32(1128484897);
+emit_32(1131044864);
+emit_32(1100721370);
+emit_32(1128484897);
+emit_32(1131300848);
+emit_32(1097164495);
+emit_32(1128484897);
+emit_32(1131556897);
+emit_32(1096670721);
+emit_32(1128484897);
+emit_32(1131812880);
+emit_32(1095529765);
+emit_32(1128484897);
+emit_32(1132068864);
+emit_32(1095414841);
+emit_32(1128484897);
+emit_32(1081737258);
+emit_32(1097223216);
+emit_32(1128228848);
+emit_32(1090125845);
+emit_32(1097159043);
+emit_32(1128228848);
+emit_32(1094418484);
+emit_32(1096303510);
+emit_32(1128228848);
+emit_32(1098514432);
+emit_32(1095078878);
+emit_32(1128228848);
+emit_32(1100759066);
+emit_32(1093559491);
+emit_32(1128228848);
+emit_32(1102807040);
+emit_32(1093420450);
+emit_32(1128228848);
+emit_32(1104855066);
+emit_32(1094782865);
+emit_32(1128228848);
+emit_32(1106903040);
+emit_32(1094716699);
+emit_32(1128228848);
+emit_32(1108123661);
+emit_32(1095422496);
+emit_32(1128228848);
+emit_32(1109147648);
+emit_32(1095210998);
+emit_32(1128228848);
+emit_32(1110171661);
+emit_32(1093591892);
+emit_32(1128228848);
+emit_32(1111195648);
+emit_32(1093748025);
+emit_32(1128228848);
+emit_32(1112219661);
+emit_32(1093936139);
+emit_32(1128228848);
+emit_32(1113243648);
+emit_32(1093754421);
+emit_32(1128228848);
+emit_32(1114267661);
+emit_32(1092768026);
+emit_32(1128228848);
+emit_32(1115291648);
+emit_32(1093788919);
+emit_32(1128228848);
+emit_32(1116000263);
+emit_32(1094950951);
+emit_32(1128228848);
+emit_32(1116512256);
+emit_32(1095041758);
+emit_32(1128228848);
+emit_32(1117024263);
+emit_32(1096487325);
+emit_32(1128228848);
+emit_32(1117536256);
+emit_32(1097262852);
+emit_32(1128228848);
+emit_32(1118048263);
+emit_32(1097536530);
+emit_32(1128228848);
+emit_32(1118560256);
+emit_32(1098558367);
+emit_32(1128228848);
+emit_32(1119072263);
+emit_32(1098952212);
+emit_32(1128228848);
+emit_32(1119584256);
+emit_32(1099049048);
+emit_32(1128228848);
+emit_32(1120096263);
+emit_32(1099095553);
+emit_32(1128228848);
+emit_32(1120608322);
+emit_32(1098511915);
+emit_32(1128228848);
+emit_32(1121120289);
+emit_32(1097554566);
+emit_32(1128228848);
+emit_32(1121632256);
+emit_32(1096990851);
+emit_32(1128228848);
+emit_32(1122144223);
+emit_32(1096447479);
+emit_32(1128228848);
+emit_32(1122656322);
+emit_32(1097522584);
+emit_32(1128228848);
+emit_32(1123168289);
+emit_32(1098051486);
+emit_32(1128228848);
+emit_32(1123680256);
+emit_32(1099167013);
+emit_32(1128228848);
+emit_32(1124132848);
+emit_32(1099703150);
+emit_32(1128228848);
+emit_32(1124388897);
+emit_32(1102297537);
+emit_32(1128228848);
+emit_32(1124644880);
+emit_32(1103741898);
+emit_32(1128228848);
+emit_32(1124900864);
+emit_32(1104507778);
+emit_32(1128228848);
+emit_32(1125156848);
+emit_32(1104918977);
+emit_32(1128228848);
+emit_32(1125412897);
+emit_32(1102477630);
+emit_32(1128228848);
+emit_32(1125668880);
+emit_32(1102229537);
+emit_32(1128228848);
+emit_32(1125924864);
+emit_32(1105767065);
+emit_32(1128228848);
+emit_32(1126180848);
+emit_32(1105996231);
+emit_32(1128228848);
+emit_32(1126436897);
+emit_32(1105933527);
+emit_32(1128228848);
+emit_32(1126692880);
+emit_32(1105463240);
+emit_32(1128228848);
+emit_32(1126948864);
+emit_32(1105052985);
+emit_32(1128228848);
+emit_32(1127204848);
+emit_32(1105035736);
+emit_32(1128228848);
+emit_32(1127460897);
+emit_32(1104068424);
+emit_32(1128228848);
+emit_32(1127716880);
+emit_32(1102737467);
+emit_32(1128228848);
+emit_32(1127972864);
+emit_32(1105007739);
+emit_32(1128228848);
+emit_32(1128228848);
+emit_32(1104220835);
+emit_32(1128228848);
+emit_32(1128484897);
+emit_32(1104506624);
+emit_32(1128228848);
+emit_32(1128740880);
+emit_32(1102445019);
+emit_32(1128228848);
+emit_32(1128996864);
+emit_32(1102497553);
+emit_32(1128228848);
+emit_32(1129252848);
+emit_32(1101981444);
+emit_32(1128228848);
+emit_32(1129508897);
+emit_32(1101313920);
+emit_32(1128228848);
+emit_32(1129764880);
+emit_32(1101362889);
+emit_32(1128228848);
+emit_32(1130020864);
+emit_32(1098897582);
+emit_32(1128228848);
+emit_32(1130276848);
+emit_32(1099105095);
+emit_32(1128228848);
+emit_32(1130532897);
+emit_32(1101849428);
+emit_32(1128228848);
+emit_32(1130788880);
+emit_32(1101462346);
+emit_32(1128228848);
+emit_32(1131044864);
+emit_32(1101111964);
+emit_32(1128228848);
+emit_32(1131300848);
+emit_32(1098211184);
+emit_32(1128228848);
+emit_32(1131556897);
+emit_32(1097551315);
+emit_32(1128228848);
+emit_32(1131812880);
+emit_32(1097268933);
+emit_32(1128228848);
+emit_32(1132068864);
+emit_32(1096928356);
+emit_32(1128228848);
+emit_32(1081737258);
+emit_32(1096992739);
+emit_32(1127972864);
+emit_32(1090125866);
+emit_32(1097387423);
+emit_32(1127972864);
+emit_32(1094418484);
+emit_32(1096399769);
+emit_32(1127972864);
+emit_32(1098514432);
+emit_32(1094991636);
+emit_32(1127972864);
+emit_32(1100759066);
+emit_32(1094441239);
+emit_32(1127972864);
+emit_32(1102807040);
+emit_32(1095107189);
+emit_32(1127972864);
+emit_32(1104855066);
+emit_32(1096891761);
+emit_32(1127972864);
+emit_32(1106903040);
+emit_32(1096776417);
+emit_32(1127972864);
+emit_32(1108123661);
+emit_32(1097155058);
+emit_32(1127972864);
+emit_32(1109147648);
+emit_32(1095872545);
+emit_32(1127972864);
+emit_32(1110171661);
+emit_32(1095805226);
+emit_32(1127972864);
+emit_32(1111195648);
+emit_32(1096095367);
+emit_32(1127972864);
+emit_32(1112219661);
+emit_32(1095697223);
+emit_32(1127972864);
+emit_32(1113243648);
+emit_32(1095695440);
+emit_32(1127972864);
+emit_32(1114267661);
+emit_32(1094850498);
+emit_32(1127972864);
+emit_32(1115291648);
+emit_32(1095604738);
+emit_32(1127972864);
+emit_32(1116000263);
+emit_32(1095794636);
+emit_32(1127972864);
+emit_32(1116512256);
+emit_32(1095935669);
+emit_32(1127972864);
+emit_32(1117024263);
+emit_32(1097458201);
+emit_32(1127972864);
+emit_32(1117536256);
+emit_32(1099005428);
+emit_32(1127972864);
+emit_32(1118048263);
+emit_32(1099075106);
+emit_32(1127972864);
+emit_32(1118560256);
+emit_32(1099380713);
+emit_32(1127972864);
+emit_32(1119072263);
+emit_32(1099718669);
+emit_32(1127972864);
+emit_32(1119584256);
+emit_32(1100017356);
+emit_32(1127972864);
+emit_32(1120096263);
+emit_32(1100344092);
+emit_32(1127972864);
+emit_32(1120608322);
+emit_32(1100094793);
+emit_32(1127972864);
+emit_32(1121120289);
+emit_32(1099700109);
+emit_32(1127972864);
+emit_32(1121632256);
+emit_32(1099356386);
+emit_32(1127972864);
+emit_32(1122144223);
+emit_32(1098732746);
+emit_32(1127972864);
+emit_32(1122656322);
+emit_32(1099139855);
+emit_32(1127972864);
+emit_32(1123168289);
+emit_32(1099468531);
+emit_32(1127972864);
+emit_32(1123680256);
+emit_32(1099976619);
+emit_32(1127972864);
+emit_32(1124132848);
+emit_32(1100936485);
+emit_32(1127972864);
+emit_32(1124388897);
+emit_32(1103548174);
+emit_32(1127972864);
+emit_32(1124644880);
+emit_32(1104509036);
+emit_32(1127972864);
+emit_32(1124900864);
+emit_32(1105478183);
+emit_32(1127972864);
+emit_32(1125156848);
+emit_32(1105595466);
+emit_32(1127972864);
+emit_32(1125412897);
+emit_32(1103928335);
+emit_32(1127972864);
+emit_32(1125668880);
+emit_32(1104097732);
+emit_32(1127972864);
+emit_32(1125924864);
+emit_32(1105747981);
+emit_32(1127972864);
+emit_32(1126180848);
+emit_32(1107329129);
+emit_32(1127972864);
+emit_32(1126436897);
+emit_32(1107330807);
+emit_32(1127972864);
+emit_32(1126692880);
+emit_32(1107185474);
+emit_32(1127972864);
+emit_32(1126948864);
+emit_32(1106443082);
+emit_32(1127972864);
+emit_32(1127204848);
+emit_32(1106311748);
+emit_32(1127972864);
+emit_32(1127460897);
+emit_32(1106434117);
+emit_32(1127972864);
+emit_32(1127716880);
+emit_32(1106504581);
+emit_32(1127972864);
+emit_32(1127972864);
+emit_32(1105930800);
+emit_32(1127972864);
+emit_32(1128228848);
+emit_32(1106592085);
+emit_32(1127972864);
+emit_32(1128484897);
+emit_32(1106700245);
+emit_32(1127972864);
+emit_32(1128740880);
+emit_32(1104209143);
+emit_32(1127972864);
+emit_32(1128996864);
+emit_32(1103888803);
+emit_32(1127972864);
+emit_32(1129252848);
+emit_32(1103514986);
+emit_32(1127972864);
+emit_32(1129508897);
+emit_32(1104960710);
+emit_32(1127972864);
+emit_32(1129764880);
+emit_32(1103902592);
+emit_32(1127972864);
+emit_32(1130020864);
+emit_32(1101125124);
+emit_32(1127972864);
+emit_32(1130276848);
+emit_32(1099577950);
+emit_32(1127972864);
+emit_32(1130532897);
+emit_32(1102071045);
+emit_32(1127972864);
+emit_32(1130788880);
+emit_32(1102154983);
+emit_32(1127972864);
+emit_32(1131044864);
+emit_32(1101877530);
+emit_32(1127972864);
+emit_32(1131300848);
+emit_32(1099361367);
+emit_32(1127972864);
+emit_32(1131556897);
+emit_32(1098597270);
+emit_32(1127972864);
+emit_32(1131812880);
+emit_32(1098904817);
+emit_32(1127972864);
+emit_32(1132068864);
+emit_32(1098078224);
+emit_32(1127972864);
+emit_32(1081737258);
+emit_32(1096797703);
+emit_32(1127716880);
+emit_32(1090125866);
+emit_32(1097168375);
+emit_32(1127716880);
+emit_32(1094418484);
+emit_32(1095948462);
+emit_32(1127716880);
+emit_32(1098514432);
+emit_32(1095608618);
+emit_32(1127716880);
+emit_32(1100759066);
+emit_32(1096751356);
+emit_32(1127716880);
+emit_32(1102807040);
+emit_32(1097561276);
+emit_32(1127716880);
+emit_32(1104855066);
+emit_32(1097849635);
+emit_32(1127716880);
+emit_32(1106903040);
+emit_32(1098303144);
+emit_32(1127716880);
+emit_32(1108123661);
+emit_32(1098264347);
+emit_32(1127716880);
+emit_32(1109147648);
+emit_32(1097068341);
+emit_32(1127716880);
+emit_32(1110171661);
+emit_32(1098172806);
+emit_32(1127716880);
+emit_32(1111195648);
+emit_32(1098939053);
+emit_32(1127716880);
+emit_32(1112219661);
+emit_32(1097712586);
+emit_32(1127716880);
+emit_32(1113243648);
+emit_32(1097830341);
+emit_32(1127716880);
+emit_32(1114267661);
+emit_32(1096396623);
+emit_32(1127716880);
+emit_32(1115291648);
+emit_32(1095821689);
+emit_32(1127716880);
+emit_32(1116000263);
+emit_32(1096202427);
+emit_32(1127716880);
+emit_32(1116512256);
+emit_32(1096892495);
+emit_32(1127716880);
+emit_32(1117024263);
+emit_32(1098192309);
+emit_32(1127716880);
+emit_32(1117536256);
+emit_32(1099117101);
+emit_32(1127716880);
+emit_32(1118048263);
+emit_32(1099661522);
+emit_32(1127716880);
+emit_32(1118560256);
+emit_32(1099930114);
+emit_32(1127716880);
+emit_32(1119072263);
+emit_32(1100208459);
+emit_32(1127716880);
+emit_32(1119584256);
+emit_32(1100702129);
+emit_32(1127716880);
+emit_32(1120096263);
+emit_32(1101093614);
+emit_32(1127716880);
+emit_32(1120608322);
+emit_32(1101089158);
+emit_32(1127716880);
+emit_32(1121120289);
+emit_32(1100770810);
+emit_32(1127716880);
+emit_32(1121632256);
+emit_32(1100500959);
+emit_32(1127716880);
+emit_32(1122144223);
+emit_32(1100074032);
+emit_32(1127716880);
+emit_32(1122656322);
+emit_32(1100304509);
+emit_32(1127716880);
+emit_32(1123168289);
+emit_32(1100602881);
+emit_32(1127716880);
+emit_32(1123680256);
+emit_32(1101222799);
+emit_32(1127716880);
+emit_32(1124132848);
+emit_32(1101588647);
+emit_32(1127716880);
+emit_32(1124388897);
+emit_32(1103974262);
+emit_32(1127716880);
+emit_32(1124644880);
+emit_32(1104918190);
+emit_32(1127716880);
+emit_32(1124900864);
+emit_32(1105762661);
+emit_32(1127716880);
+emit_32(1125156848);
+emit_32(1106612899);
+emit_32(1127716880);
+emit_32(1125412897);
+emit_32(1104639689);
+emit_32(1127716880);
+emit_32(1125668880);
+emit_32(1105198265);
+emit_32(1127716880);
+emit_32(1125924864);
+emit_32(1105413748);
+emit_32(1127716880);
+emit_32(1126180848);
+emit_32(1107783057);
+emit_32(1127716880);
+emit_32(1126436897);
+emit_32(1107991672);
+emit_32(1127716880);
+emit_32(1126692880);
+emit_32(1107664568);
+emit_32(1127716880);
+emit_32(1126948864);
+emit_32(1107212999);
+emit_32(1127716880);
+emit_32(1127204848);
+emit_32(1107232712);
+emit_32(1127716880);
+emit_32(1127460897);
+emit_32(1107399803);
+emit_32(1127716880);
+emit_32(1127716880);
+emit_32(1107519026);
+emit_32(1127716880);
+emit_32(1127972864);
+emit_32(1105586291);
+emit_32(1127716880);
+emit_32(1128228848);
+emit_32(1107722319);
+emit_32(1127716880);
+emit_32(1128484897);
+emit_32(1107549828);
+emit_32(1127716880);
+emit_32(1128740880);
+emit_32(1107213051);
+emit_32(1127716880);
+emit_32(1128996864);
+emit_32(1104407953);
+emit_32(1127716880);
+emit_32(1129252848);
+emit_32(1105963988);
+emit_32(1127716880);
+emit_32(1129508897);
+emit_32(1105610303);
+emit_32(1127716880);
+emit_32(1129764880);
+emit_32(1104453042);
+emit_32(1127716880);
+emit_32(1130020864);
+emit_32(1103642178);
+emit_32(1127716880);
+emit_32(1130276848);
+emit_32(1100372928);
+emit_32(1127716880);
+emit_32(1130532897);
+emit_32(1102654577);
+emit_32(1127716880);
+emit_32(1130788880);
+emit_32(1102227911);
+emit_32(1127716880);
+emit_32(1131044864);
+emit_32(1101889641);
+emit_32(1127716880);
+emit_32(1131300848);
+emit_32(1099123340);
+emit_32(1127716880);
+emit_32(1131556897);
+emit_32(1099152595);
+emit_32(1127716880);
+emit_32(1131812880);
+emit_32(1099081921);
+emit_32(1127716880);
+emit_32(1132068864);
+emit_32(1098933705);
+emit_32(1127716880);
+emit_32(1081737258);
+emit_32(1097521955);
+emit_32(1127460897);
+emit_32(1090125866);
+emit_32(1097290954);
+emit_32(1127460897);
+emit_32(1094418484);
+emit_32(1096535664);
+emit_32(1127460897);
+emit_32(1098514432);
+emit_32(1096791202);
+emit_32(1127460897);
+emit_32(1100759066);
+emit_32(1097822057);
+emit_32(1127460897);
+emit_32(1102807040);
+emit_32(1098240020);
+emit_32(1127460897);
+emit_32(1104855066);
+emit_32(1098978217);
+emit_32(1127460897);
+emit_32(1106903040);
+emit_32(1099121977);
+emit_32(1127460897);
+emit_32(1108123661);
+emit_32(1099009884);
+emit_32(1127460897);
+emit_32(1109147648);
+emit_32(1099001233);
+emit_32(1127460897);
+emit_32(1110171661);
+emit_32(1099564791);
+emit_32(1127460897);
+emit_32(1111195648);
+emit_32(1099604427);
+emit_32(1127460897);
+emit_32(1112219661);
+emit_32(1098912681);
+emit_32(1127460897);
+emit_32(1113243648);
+emit_32(1098358823);
+emit_32(1127460897);
+emit_32(1114267661);
+emit_32(1096897318);
+emit_32(1127460897);
+emit_32(1115291648);
+emit_32(1095649408);
+emit_32(1127460897);
+emit_32(1116000263);
+emit_32(1096935801);
+emit_32(1127460897);
+emit_32(1116512256);
+emit_32(1097798359);
+emit_32(1127460897);
+emit_32(1117024263);
+emit_32(1098804363);
+emit_32(1127460897);
+emit_32(1117536256);
+emit_32(1099628859);
+emit_32(1127460897);
+emit_32(1118048263);
+emit_32(1100288570);
+emit_32(1127460897);
+emit_32(1118560256);
+emit_32(1100879076);
+emit_32(1127460897);
+emit_32(1119072263);
+emit_32(1100927310);
+emit_32(1127460897);
+emit_32(1119584256);
+emit_32(1101310879);
+emit_32(1127460897);
+emit_32(1120096263);
+emit_32(1101683124);
+emit_32(1127460897);
+emit_32(1120608322);
+emit_32(1101623879);
+emit_32(1127460897);
+emit_32(1121120289);
+emit_32(1101768950);
+emit_32(1127460897);
+emit_32(1121632256);
+emit_32(1101614495);
+emit_32(1127460897);
+emit_32(1122144223);
+emit_32(1101255882);
+emit_32(1127460897);
+emit_32(1122656322);
+emit_32(1101305165);
+emit_32(1127460897);
+emit_32(1123168289);
+emit_32(1101210164);
+emit_32(1127460897);
+emit_32(1123680256);
+emit_32(1101974785);
+emit_32(1127460897);
+emit_32(1124132848);
+emit_32(1102412304);
+emit_32(1127460897);
+emit_32(1124388897);
+emit_32(1102794981);
+emit_32(1127460897);
+emit_32(1124644880);
+emit_32(1105358121);
+emit_32(1127460897);
+emit_32(1124900864);
+emit_32(1106543274);
+emit_32(1127460897);
+emit_32(1125156848);
+emit_32(1107495748);
+emit_32(1127460897);
+emit_32(1125412897);
+emit_32(1105955861);
+emit_32(1127460897);
+emit_32(1125668880);
+emit_32(1106429084);
+emit_32(1127460897);
+emit_32(1125924864);
+emit_32(1107140909);
+emit_32(1127460897);
+emit_32(1126180848);
+emit_32(1108420067);
+emit_32(1127460897);
+emit_32(1126436897);
+emit_32(1108539421);
+emit_32(1127460897);
+emit_32(1126692880);
+emit_32(1108278824);
+emit_32(1127460897);
+emit_32(1126948864);
+emit_32(1106248099);
+emit_32(1127460897);
+emit_32(1127204848);
+emit_32(1106077182);
+emit_32(1127460897);
+emit_32(1127460897);
+emit_32(1107959900);
+emit_32(1127460897);
+emit_32(1127716880);
+emit_32(1107937880);
+emit_32(1127460897);
+emit_32(1127972864);
+emit_32(1107912006);
+emit_32(1127460897);
+emit_32(1128228848);
+emit_32(1107668710);
+emit_32(1127460897);
+emit_32(1128484897);
+emit_32(1106012327);
+emit_32(1127460897);
+emit_32(1128740880);
+emit_32(1105705199);
+emit_32(1127460897);
+emit_32(1128996864);
+emit_32(1105290802);
+emit_32(1127460897);
+emit_32(1129252848);
+emit_32(1106539918);
+emit_32(1127460897);
+emit_32(1129508897);
+emit_32(1105540573);
+emit_32(1127460897);
+emit_32(1129764880);
+emit_32(1104772701);
+emit_32(1127460897);
+emit_32(1130020864);
+emit_32(1101448086);
+emit_32(1127460897);
+emit_32(1130276848);
+emit_32(1101175508);
+emit_32(1127460897);
+emit_32(1130532897);
+emit_32(1103296830);
+emit_32(1127460897);
+emit_32(1130788880);
+emit_32(1102692850);
+emit_32(1127460897);
+emit_32(1131044864);
+emit_32(1101873336);
+emit_32(1127460897);
+emit_32(1131300848);
+emit_32(1099038038);
+emit_32(1127460897);
+emit_32(1131556897);
+emit_32(1099314443);
+emit_32(1127460897);
+emit_32(1131812880);
+emit_32(1099183371);
+emit_32(1127460897);
+emit_32(1132068864);
+emit_32(1098779931);
+emit_32(1127460897);
+emit_32(1081737258);
+emit_32(1098169765);
+emit_32(1127204848);
+emit_32(1090125866);
+emit_32(1097937715);
+emit_32(1127204848);
+emit_32(1094418484);
+emit_32(1097656592);
+emit_32(1127204848);
+emit_32(1098514432);
+emit_32(1097279105);
+emit_32(1127204848);
+emit_32(1100759066);
+emit_32(1098705587);
+emit_32(1127204848);
+emit_32(1102807040);
+emit_32(1099191760);
+emit_32(1127204848);
+emit_32(1104855066);
+emit_32(1099316121);
+emit_32(1127204848);
+emit_32(1106903040);
+emit_32(1099533910);
+emit_32(1127204848);
+emit_32(1108123661);
+emit_32(1099430573);
+emit_32(1127204848);
+emit_32(1109147648);
+emit_32(1099413848);
+emit_32(1127204848);
+emit_32(1110171661);
+emit_32(1099829504);
+emit_32(1127204848);
+emit_32(1111195648);
+emit_32(1100016517);
+emit_32(1127204848);
+emit_32(1112219661);
+emit_32(1099249693);
+emit_32(1127204848);
+emit_32(1113243648);
+emit_32(1098799645);
+emit_32(1127204848);
+emit_32(1114267661);
+emit_32(1098342780);
+emit_32(1127204848);
+emit_32(1115291648);
+emit_32(1097196791);
+emit_32(1127204848);
+emit_32(1116000263);
+emit_32(1097901330);
+emit_32(1127204848);
+emit_32(1116512256);
+emit_32(1098866124);
+emit_32(1127204848);
+emit_32(1117024263);
+emit_32(1099404516);
+emit_32(1127204848);
+emit_32(1117536256);
+emit_32(1099985741);
+emit_32(1127204848);
+emit_32(1118048263);
+emit_32(1100426563);
+emit_32(1127204848);
+emit_32(1118560256);
+emit_32(1101059169);
+emit_32(1127204848);
+emit_32(1119072263);
+emit_32(1101194959);
+emit_32(1127204848);
+emit_32(1119584256);
+emit_32(1101016072);
+emit_32(1127204848);
+emit_32(1120096263);
+emit_32(1101472308);
+emit_32(1127204848);
+emit_32(1120608322);
+emit_32(1101985323);
+emit_32(1127204848);
+emit_32(1121120289);
+emit_32(1102436316);
+emit_32(1127204848);
+emit_32(1121632256);
+emit_32(1102413719);
+emit_32(1127204848);
+emit_32(1122144223);
+emit_32(1101785779);
+emit_32(1127204848);
+emit_32(1122656322);
+emit_32(1101731673);
+emit_32(1127204848);
+emit_32(1123168289);
+emit_32(1102273262);
+emit_32(1127204848);
+emit_32(1123680256);
+emit_32(1102879182);
+emit_32(1127204848);
+emit_32(1124132848);
+emit_32(1103081819);
+emit_32(1127204848);
+emit_32(1124388897);
+emit_32(1103419985);
+emit_32(1127204848);
+emit_32(1124644880);
+emit_32(1106708634);
+emit_32(1127204848);
+emit_32(1124900864);
+emit_32(1107116530);
+emit_32(1127204848);
+emit_32(1125156848);
+emit_32(1107879893);
+emit_32(1127204848);
+emit_32(1125412897);
+emit_32(1106751573);
+emit_32(1127204848);
+emit_32(1125668880);
+emit_32(1108314712);
+emit_32(1127204848);
+emit_32(1125924864);
+emit_32(1109036342);
+emit_32(1127204848);
+emit_32(1126180848);
+emit_32(1109160047);
+emit_32(1127204848);
+emit_32(1126436897);
+emit_32(1109143323);
+emit_32(1127204848);
+emit_32(1126692880);
+emit_32(1108877692);
+emit_32(1127204848);
+emit_32(1126948864);
+emit_32(1108518135);
+emit_32(1127204848);
+emit_32(1127204848);
+emit_32(1108362238);
+emit_32(1127204848);
+emit_32(1127460897);
+emit_32(1108376997);
+emit_32(1127204848);
+emit_32(1127716880);
+emit_32(1108363313);
+emit_32(1127204848);
+emit_32(1127972864);
+emit_32(1108321213);
+emit_32(1127204848);
+emit_32(1128228848);
+emit_32(1106462953);
+emit_32(1127204848);
+emit_32(1128484897);
+emit_32(1106272584);
+emit_32(1127204848);
+emit_32(1128740880);
+emit_32(1105682131);
+emit_32(1127204848);
+emit_32(1128996864);
+emit_32(1107532055);
+emit_32(1127204848);
+emit_32(1129252848);
+emit_32(1106896539);
+emit_32(1127204848);
+emit_32(1129508897);
+emit_32(1106257851);
+emit_32(1127204848);
+emit_32(1129764880);
+emit_32(1102788428);
+emit_32(1127204848);
+emit_32(1130020864);
+emit_32(1101910298);
+emit_32(1127204848);
+emit_32(1130276848);
+emit_32(1101035943);
+emit_32(1127204848);
+emit_32(1130532897);
+emit_32(1103745044);
+emit_32(1127204848);
+emit_32(1130788880);
+emit_32(1103183164);
+emit_32(1127204848);
+emit_32(1131044864);
+emit_32(1102075291);
+emit_32(1127204848);
+emit_32(1131300848);
+emit_32(1098519780);
+emit_32(1127204848);
+emit_32(1131556897);
+emit_32(1098358928);
+emit_32(1127204848);
+emit_32(1131812880);
+emit_32(1098789788);
+emit_32(1127204848);
+emit_32(1132068864);
+emit_32(1097999476);
+emit_32(1127204848);
+emit_32(1081737258);
+emit_32(1098949119);
+emit_32(1126948864);
+emit_32(1090125845);
+emit_32(1098913939);
+emit_32(1126948864);
+emit_32(1094418484);
+emit_32(1097887384);
+emit_32(1126948864);
+emit_32(1098514432);
+emit_32(1098001888);
+emit_32(1126948864);
+emit_32(1100759066);
+emit_32(1099097545);
+emit_32(1126948864);
+emit_32(1102807040);
+emit_32(1099290588);
+emit_32(1126948864);
+emit_32(1104855066);
+emit_32(1099551474);
+emit_32(1126948864);
+emit_32(1106903040);
+emit_32(1099163605);
+emit_32(1126948864);
+emit_32(1108123661);
+emit_32(1099190711);
+emit_32(1126948864);
+emit_32(1109147648);
+emit_32(1099720557);
+emit_32(1126948864);
+emit_32(1110171661);
+emit_32(1099796002);
+emit_32(1126948864);
+emit_32(1111195648);
+emit_32(1099824156);
+emit_32(1126948864);
+emit_32(1112219661);
+emit_32(1099671431);
+emit_32(1126948864);
+emit_32(1113243648);
+emit_32(1099204133);
+emit_32(1126948864);
+emit_32(1114267661);
+emit_32(1098311323);
+emit_32(1126948864);
+emit_32(1115291648);
+emit_32(1097819226);
+emit_32(1126948864);
+emit_32(1116000263);
+emit_32(1098122894);
+emit_32(1126948864);
+emit_32(1116512256);
+emit_32(1099069548);
+emit_32(1126948864);
+emit_32(1117024263);
+emit_32(1099712640);
+emit_32(1126948864);
+emit_32(1117536256);
+emit_32(1100258161);
+emit_32(1126948864);
+emit_32(1118048263);
+emit_32(1100567858);
+emit_32(1126948864);
+emit_32(1118560256);
+emit_32(1100912735);
+emit_32(1126948864);
+emit_32(1119072263);
+emit_32(1101335259);
+emit_32(1126948864);
+emit_32(1119584256);
+emit_32(1101300236);
+emit_32(1126948864);
+emit_32(1120096263);
+emit_32(1101307209);
+emit_32(1126948864);
+emit_32(1120608322);
+emit_32(1101813252);
+emit_32(1126948864);
+emit_32(1121120289);
+emit_32(1102347239);
+emit_32(1126948864);
+emit_32(1121632256);
+emit_32(1102583851);
+emit_32(1126948864);
+emit_32(1122144223);
+emit_32(1102372458);
+emit_32(1126948864);
+emit_32(1122656322);
+emit_32(1102499126);
+emit_32(1126948864);
+emit_32(1123168289);
+emit_32(1102697097);
+emit_32(1126948864);
+emit_32(1123680256);
+emit_32(1103294890);
+emit_32(1126948864);
+emit_32(1124132848);
+emit_32(1103928177);
+emit_32(1126948864);
+emit_32(1124388897);
+emit_32(1105053195);
+emit_32(1126948864);
+emit_32(1124644880);
+emit_32(1107678488);
+emit_32(1126948864);
+emit_32(1124900864);
+emit_32(1107666613);
+emit_32(1126948864);
+emit_32(1125156848);
+emit_32(1108068663);
+emit_32(1126948864);
+emit_32(1125412897);
+emit_32(1107030075);
+emit_32(1126948864);
+emit_32(1125668880);
+emit_32(1109044940);
+emit_32(1126948864);
+emit_32(1125924864);
+emit_32(1109464528);
+emit_32(1126948864);
+emit_32(1126180848);
+emit_32(1109502329);
+emit_32(1126948864);
+emit_32(1126436897);
+emit_32(1109661634);
+emit_32(1126948864);
+emit_32(1126692880);
+emit_32(1109335998);
+emit_32(1126948864);
+emit_32(1126948864);
+emit_32(1108826548);
+emit_32(1126948864);
+emit_32(1127204848);
+emit_32(1108883774);
+emit_32(1126948864);
+emit_32(1127460897);
+emit_32(1107300110);
+emit_32(1126948864);
+emit_32(1127716880);
+emit_32(1108142929);
+emit_32(1126948864);
+emit_32(1127972864);
+emit_32(1108009838);
+emit_32(1126948864);
+emit_32(1128228848);
+emit_32(1107061165);
+emit_32(1126948864);
+emit_32(1128484897);
+emit_32(1105722553);
+emit_32(1126948864);
+emit_32(1128740880);
+emit_32(1106183035);
+emit_32(1126948864);
+emit_32(1128996864);
+emit_32(1107464133);
+emit_32(1126948864);
+emit_32(1129252848);
+emit_32(1106950907);
+emit_32(1126948864);
+emit_32(1129508897);
+emit_32(1105415740);
+emit_32(1126948864);
+emit_32(1129764880);
+emit_32(1102572893);
+emit_32(1126948864);
+emit_32(1130020864);
+emit_32(1101736444);
+emit_32(1126948864);
+emit_32(1130276848);
+emit_32(1103790604);
+emit_32(1126948864);
+emit_32(1130532897);
+emit_32(1103702943);
+emit_32(1126948864);
+emit_32(1130788880);
+emit_32(1102824918);
+emit_32(1126948864);
+emit_32(1131044864);
+emit_32(1102312374);
+emit_32(1126948864);
+emit_32(1131300848);
+emit_32(1098839595);
+emit_32(1126948864);
+emit_32(1131556897);
+emit_32(1098161272);
+emit_32(1126948864);
+emit_32(1131812880);
+emit_32(1097697906);
+emit_32(1126948864);
+emit_32(1132068864);
+emit_32(1097362991);
+emit_32(1126948864);
+emit_32(1081737258);
+emit_32(1099508220);
+emit_32(1126692880);
+emit_32(1090125845);
+emit_32(1099273653);
+emit_32(1126692880);
+emit_32(1094418484);
+emit_32(1099205496);
+emit_32(1126692880);
+emit_32(1098514432);
+emit_32(1098995047);
+emit_32(1126692880);
+emit_32(1100759066);
+emit_32(1099092355);
+emit_32(1126692880);
+emit_32(1102807040);
+emit_32(1099190187);
+emit_32(1126692880);
+emit_32(1104855066);
+emit_32(1099331011);
+emit_32(1126692880);
+emit_32(1106903040);
+emit_32(1099536112);
+emit_32(1126692880);
+emit_32(1108123661);
+emit_32(1099882824);
+emit_32(1126692880);
+emit_32(1109147648);
+emit_32(1100241332);
+emit_32(1126692880);
+emit_32(1110171661);
+emit_32(1100308441);
+emit_32(1126692880);
+emit_32(1111195648);
+emit_32(1099924085);
+emit_32(1126692880);
+emit_32(1112219661);
+emit_32(1099715209);
+emit_32(1126692880);
+emit_32(1113243648);
+emit_32(1099688575);
+emit_32(1126692880);
+emit_32(1114267661);
+emit_32(1099415106);
+emit_32(1126692880);
+emit_32(1115291648);
+emit_32(1099022572);
+emit_32(1126692880);
+emit_32(1116000263);
+emit_32(1098456655);
+emit_32(1126692880);
+emit_32(1116512256);
+emit_32(1099432827);
+emit_32(1126692880);
+emit_32(1117024263);
+emit_32(1099963931);
+emit_32(1126692880);
+emit_32(1117536256);
+emit_32(1100471914);
+emit_32(1126692880);
+emit_32(1118048263);
+emit_32(1100910271);
+emit_32(1126692880);
+emit_32(1118560256);
+emit_32(1100950746);
+emit_32(1126692880);
+emit_32(1119072263);
+emit_32(1101340921);
+emit_32(1126692880);
+emit_32(1119584256);
+emit_32(1101516925);
+emit_32(1126692880);
+emit_32(1120096263);
+emit_32(1101607626);
+emit_32(1126692880);
+emit_32(1120608322);
+emit_32(1101700478);
+emit_32(1126692880);
+emit_32(1121120289);
+emit_32(1102113826);
+emit_32(1126692880);
+emit_32(1121632256);
+emit_32(1102162428);
+emit_32(1126692880);
+emit_32(1122144223);
+emit_32(1102697097);
+emit_32(1126692880);
+emit_32(1122656322);
+emit_32(1103401950);
+emit_32(1126692880);
+emit_32(1123168289);
+emit_32(1103831813);
+emit_32(1126692880);
+emit_32(1123680256);
+emit_32(1104291194);
+emit_32(1126692880);
+emit_32(1124132848);
+emit_32(1105271456);
+emit_32(1126692880);
+emit_32(1124388897);
+emit_32(1106220574);
+emit_32(1126692880);
+emit_32(1124644880);
+emit_32(1108019957);
+emit_32(1126692880);
+emit_32(1124900864);
+emit_32(1108180861);
+emit_32(1126692880);
+emit_32(1125156848);
+emit_32(1108381558);
+emit_32(1126692880);
+emit_32(1125412897);
+emit_32(1108884508);
+emit_32(1126692880);
+emit_32(1125668880);
+emit_32(1109395820);
+emit_32(1126692880);
+emit_32(1125924864);
+emit_32(1109634712);
+emit_32(1126692880);
+emit_32(1126180848);
+emit_32(1109777816);
+emit_32(1126692880);
+emit_32(1126436897);
+emit_32(1109887130);
+emit_32(1126692880);
+emit_32(1126692880);
+emit_32(1109468460);
+emit_32(1126692880);
+emit_32(1126948864);
+emit_32(1108976887);
+emit_32(1126692880);
+emit_32(1127204848);
+emit_32(1108737288);
+emit_32(1126692880);
+emit_32(1127460897);
+emit_32(1107322339);
+emit_32(1126692880);
+emit_32(1127716880);
+emit_32(1108472024);
+emit_32(1126692880);
+emit_32(1127972864);
+emit_32(1107965326);
+emit_32(1126692880);
+emit_32(1128228848);
+emit_32(1107928049);
+emit_32(1126692880);
+emit_32(1128484897);
+emit_32(1106025906);
+emit_32(1126692880);
+emit_32(1128740880);
+emit_32(1107754012);
+emit_32(1126692880);
+emit_32(1128996864);
+emit_32(1107563407);
+emit_32(1126692880);
+emit_32(1129252848);
+emit_32(1107120672);
+emit_32(1126692880);
+emit_32(1129508897);
+emit_32(1103449188);
+emit_32(1126692880);
+emit_32(1129764880);
+emit_32(1102395841);
+emit_32(1126692880);
+emit_32(1130020864);
+emit_32(1101999899);
+emit_32(1126692880);
+emit_32(1130276848);
+emit_32(1104243012);
+emit_32(1126692880);
+emit_32(1130532897);
+emit_32(1103501407);
+emit_32(1126692880);
+emit_32(1130788880);
+emit_32(1102408424);
+emit_32(1126692880);
+emit_32(1131044864);
+emit_32(1099757099);
+emit_32(1126692880);
+emit_32(1131300848);
+emit_32(1098990538);
+emit_32(1126692880);
+emit_32(1131556897);
+emit_32(1097576795);
+emit_32(1126692880);
+emit_32(1131812880);
+emit_32(1097118777);
+emit_32(1126692880);
+emit_32(1132068864);
+emit_32(1095884499);
+emit_32(1126692880);
+emit_32(1081737300);
+emit_32(1099149921);
+emit_32(1126436897);
+emit_32(1090125845);
+emit_32(1099736547);
+emit_32(1126436897);
+emit_32(1094418484);
+emit_32(1099814457);
+emit_32(1126436897);
+emit_32(1098514432);
+emit_32(1099497996);
+emit_32(1126436897);
+emit_32(1100759066);
+emit_32(1099614598);
+emit_32(1126436897);
+emit_32(1102807040);
+emit_32(1099949041);
+emit_32(1126436897);
+emit_32(1104855066);
+emit_32(1100303460);
+emit_32(1126436897);
+emit_32(1106903040);
+emit_32(1100372194);
+emit_32(1126436897);
+emit_32(1108123661);
+emit_32(1100388499);
+emit_32(1126436897);
+emit_32(1109147648);
+emit_32(1100457129);
+emit_32(1126436897);
+emit_32(1110171661);
+emit_32(1100645768);
+emit_32(1126436897);
+emit_32(1111195648);
+emit_32(1100270587);
+emit_32(1126436897);
+emit_32(1112219661);
+emit_32(1099961152);
+emit_32(1126436897);
+emit_32(1113243648);
+emit_32(1099730885);
+emit_32(1126436897);
+emit_32(1114267661);
+emit_32(1099738435);
+emit_32(1126436897);
+emit_32(1115291648);
+emit_32(1099626866);
+emit_32(1126436897);
+emit_32(1116000263);
+emit_32(1099808847);
+emit_32(1126436897);
+emit_32(1116512256);
+emit_32(1099946000);
+emit_32(1126436897);
+emit_32(1117024263);
+emit_32(1100112776);
+emit_32(1126436897);
+emit_32(1117536256);
+emit_32(1100457758);
+emit_32(1126436897);
+emit_32(1118048263);
+emit_32(1101221960);
+emit_32(1126436897);
+emit_32(1118560256);
+emit_32(1101270404);
+emit_32(1126436897);
+emit_32(1119072263);
+emit_32(1101406090);
+emit_32(1126436897);
+emit_32(1119584256);
+emit_32(1101500619);
+emit_32(1126436897);
+emit_32(1120096263);
+emit_32(1101585606);
+emit_32(1126436897);
+emit_32(1120608322);
+emit_32(1101398278);
+emit_32(1126436897);
+emit_32(1121120289);
+emit_32(1101771047);
+emit_32(1126436897);
+emit_32(1121632256);
+emit_32(1102476005);
+emit_32(1126436897);
+emit_32(1122144223);
+emit_32(1103241150);
+emit_32(1126436897);
+emit_32(1122656322);
+emit_32(1103529247);
+emit_32(1126436897);
+emit_32(1123168289);
+emit_32(1104315207);
+emit_32(1126436897);
+emit_32(1123680256);
+emit_32(1105405149);
+emit_32(1126436897);
+emit_32(1124132848);
+emit_32(1106277302);
+emit_32(1126436897);
+emit_32(1124388897);
+emit_32(1107026667);
+emit_32(1126436897);
+emit_32(1124644880);
+emit_32(1107115324);
+emit_32(1126436897);
+emit_32(1124900864);
+emit_32(1108622626);
+emit_32(1126436897);
+emit_32(1125156848);
+emit_32(1108806546);
+emit_32(1126436897);
+emit_32(1125412897);
+emit_32(1109128328);
+emit_32(1126436897);
+emit_32(1125668880);
+emit_32(1109170114);
+emit_32(1126436897);
+emit_32(1125924864);
+emit_32(1108511739);
+emit_32(1126436897);
+emit_32(1126180848);
+emit_32(1109723867);
+emit_32(1126436897);
+emit_32(1126436897);
+emit_32(1109979719);
+emit_32(1126436897);
+emit_32(1126692880);
+emit_32(1109649182);
+emit_32(1126436897);
+emit_32(1126948864);
+emit_32(1107794749);
+emit_32(1126436897);
+emit_32(1127204848);
+emit_32(1107867677);
+emit_32(1126436897);
+emit_32(1127460897);
+emit_32(1107576278);
+emit_32(1126436897);
+emit_32(1127716880);
+emit_32(1108142168);
+emit_32(1126436897);
+emit_32(1127972864);
+emit_32(1108112284);
+emit_32(1126436897);
+emit_32(1128228848);
+emit_32(1108004202);
+emit_32(1126436897);
+emit_32(1128484897);
+emit_32(1106311696);
+emit_32(1126436897);
+emit_32(1128740880);
+emit_32(1107993349);
+emit_32(1126436897);
+emit_32(1128996864);
+emit_32(1107720798);
+emit_32(1126436897);
+emit_32(1129252848);
+emit_32(1106276306);
+emit_32(1126436897);
+emit_32(1129508897);
+emit_32(1103536849);
+emit_32(1126436897);
+emit_32(1129764880);
+emit_32(1102593288);
+emit_32(1126436897);
+emit_32(1130020864);
+emit_32(1104446017);
+emit_32(1126436897);
+emit_32(1130276848);
+emit_32(1104044255);
+emit_32(1126436897);
+emit_32(1130532897);
+emit_32(1102976752);
+emit_32(1126436897);
+emit_32(1130788880);
+emit_32(1102244531);
+emit_32(1126436897);
+emit_32(1131044864);
+emit_32(1099010199);
+emit_32(1126436897);
+emit_32(1131300848);
+emit_32(1097715417);
+emit_32(1126436897);
+emit_32(1131556897);
+emit_32(1096758067);
+emit_32(1126436897);
+emit_32(1131812880);
+emit_32(1097016856);
+emit_32(1126436897);
+emit_32(1132068864);
+emit_32(1096071355);
+emit_32(1126436897);
+emit_32(1081737300);
+emit_32(1099236901);
+emit_32(1126180848);
+emit_32(1090125845);
+emit_32(1099655702);
+emit_32(1126180848);
+emit_32(1094418484);
+emit_32(1099975256);
+emit_32(1126180848);
+emit_32(1098514432);
+emit_32(1100023700);
+emit_32(1126180848);
+emit_32(1100759066);
+emit_32(1100282436);
+emit_32(1126180848);
+emit_32(1102807040);
+emit_32(1100103077);
+emit_32(1126180848);
+emit_32(1104855066);
+emit_32(1100266183);
+emit_32(1126180848);
+emit_32(1106903040);
+emit_32(1100408947);
+emit_32(1126180848);
+emit_32(1108123661);
+emit_32(1100595488);
+emit_32(1126180848);
+emit_32(1109147648);
+emit_32(1100418698);
+emit_32(1126180848);
+emit_32(1110171661);
+emit_32(1100484601);
+emit_32(1126180848);
+emit_32(1111195648);
+emit_32(1100664327);
+emit_32(1126180848);
+emit_32(1112219661);
+emit_32(1099877791);
+emit_32(1126180848);
+emit_32(1113243648);
+emit_32(1100235250);
+emit_32(1126180848);
+emit_32(1114267661);
+emit_32(1100072773);
+emit_32(1126180848);
+emit_32(1115291648);
+emit_32(1099973001);
+emit_32(1126180848);
+emit_32(1116000263);
+emit_32(1100257165);
+emit_32(1126180848);
+emit_32(1116512256);
+emit_32(1100157288);
+emit_32(1126180848);
+emit_32(1117024263);
+emit_32(1100000369);
+emit_32(1126180848);
+emit_32(1117536256);
+emit_32(1100933077);
+emit_32(1126180848);
+emit_32(1118048263);
+emit_32(1101502192);
+emit_32(1126180848);
+emit_32(1118560256);
+emit_32(1101329701);
+emit_32(1126180848);
+emit_32(1119072263);
+emit_32(1101273078);
+emit_32(1126180848);
+emit_32(1119584256);
+emit_32(1101224057);
+emit_32(1126180848);
+emit_32(1120096263);
+emit_32(1100934231);
+emit_32(1126180848);
+emit_32(1120608322);
+emit_32(1101108137);
+emit_32(1126180848);
+emit_32(1121120289);
+emit_32(1102075344);
+emit_32(1126180848);
+emit_32(1121632256);
+emit_32(1102823975);
+emit_32(1126180848);
+emit_32(1122144223);
+emit_32(1103440694);
+emit_32(1126180848);
+emit_32(1122656322);
+emit_32(1104266238);
+emit_32(1126180848);
+emit_32(1123168289);
+emit_32(1105264588);
+emit_32(1126180848);
+emit_32(1123680256);
+emit_32(1106148170);
+emit_32(1126180848);
+emit_32(1124132848);
+emit_32(1107157267);
+emit_32(1126180848);
+emit_32(1124388897);
+emit_32(1107410970);
+emit_32(1126180848);
+emit_32(1124644880);
+emit_32(1107631669);
+emit_32(1126180848);
+emit_32(1124900864);
+emit_32(1108727248);
+emit_32(1126180848);
+emit_32(1125156848);
+emit_32(1109083947);
+emit_32(1126180848);
+emit_32(1125412897);
+emit_32(1109383499);
+emit_32(1126180848);
+emit_32(1125668880);
+emit_32(1109832552);
+emit_32(1126180848);
+emit_32(1125924864);
+emit_32(1108779362);
+emit_32(1126180848);
+emit_32(1126180848);
+emit_32(1109779336);
+emit_32(1126180848);
+emit_32(1126436897);
+emit_32(1109875019);
+emit_32(1126180848);
+emit_32(1126692880);
+emit_32(1109584485);
+emit_32(1126180848);
+emit_32(1126948864);
+emit_32(1108220130);
+emit_32(1126180848);
+emit_32(1127204848);
+emit_32(1107865790);
+emit_32(1126180848);
+emit_32(1127460897);
+emit_32(1107810792);
+emit_32(1126180848);
+emit_32(1127716880);
+emit_32(1107637358);
+emit_32(1126180848);
+emit_32(1127972864);
+emit_32(1108765940);
+emit_32(1126180848);
+emit_32(1128228848);
+emit_32(1108423134);
+emit_32(1126180848);
+emit_32(1128484897);
+emit_32(1107554101);
+emit_32(1126180848);
+emit_32(1128740880);
+emit_32(1107893184);
+emit_32(1126180848);
+emit_32(1128996864);
+emit_32(1107705384);
+emit_32(1126180848);
+emit_32(1129252848);
+emit_32(1104640790);
+emit_32(1126180848);
+emit_32(1129508897);
+emit_32(1103289857);
+emit_32(1126180848);
+emit_32(1129764880);
+emit_32(1103910824);
+emit_32(1126180848);
+emit_32(1130020864);
+emit_32(1104153359);
+emit_32(1126180848);
+emit_32(1130276848);
+emit_32(1103150186);
+emit_32(1126180848);
+emit_32(1130532897);
+emit_32(1102522509);
+emit_32(1126180848);
+emit_32(1130788880);
+emit_32(1099531498);
+emit_32(1126180848);
+emit_32(1131044864);
+emit_32(1097916953);
+emit_32(1126180848);
+emit_32(1131300848);
+emit_32(1097069285);
+emit_32(1126180848);
+emit_32(1131556897);
+emit_32(1096586310);
+emit_32(1126180848);
+emit_32(1131812880);
+emit_32(1097348625);
+emit_32(1126180848);
+emit_32(1132068864);
+emit_32(1097196791);
+emit_32(1126180848);
+emit_32(1081737300);
+emit_32(1099397648);
+emit_32(1125924864);
+emit_32(1090125845);
+emit_32(1100083993);
+emit_32(1125924864);
+emit_32(1094418484);
+emit_32(1100159071);
+emit_32(1125924864);
+emit_32(1098514432);
+emit_32(1100011536);
+emit_32(1125924864);
+emit_32(1100759066);
+emit_32(1100346556);
+emit_32(1125924864);
+emit_32(1102807040);
+emit_32(1100440404);
+emit_32(1125924864);
+emit_32(1104855066);
+emit_32(1100194775);
+emit_32(1125924864);
+emit_32(1106903040);
+emit_32(1100304561);
+emit_32(1125924864);
+emit_32(1108123661);
+emit_32(1100451571);
+emit_32(1125924864);
+emit_32(1109147648);
+emit_32(1100478992);
+emit_32(1125924864);
+emit_32(1110171661);
+emit_32(1100408580);
+emit_32(1125924864);
+emit_32(1111195648);
+emit_32(1100317249);
+emit_32(1125924864);
+emit_32(1112219661);
+emit_32(1100401554);
+emit_32(1125924864);
+emit_32(1113243648);
+emit_32(1100711618);
+emit_32(1125924864);
+emit_32(1114267661);
+emit_32(1100343358);
+emit_32(1125924864);
+emit_32(1115291648);
+emit_32(1099679924);
+emit_32(1125924864);
+emit_32(1116000263);
+emit_32(1100265868);
+emit_32(1125924864);
+emit_32(1116512256);
+emit_32(1100336438);
+emit_32(1125924864);
+emit_32(1117024263);
+emit_32(1100743338);
+emit_32(1125924864);
+emit_32(1117536256);
+emit_32(1100911529);
+emit_32(1125924864);
+emit_32(1118048263);
+emit_32(1100933916);
+emit_32(1125924864);
+emit_32(1118560256);
+emit_32(1100950012);
+emit_32(1125924864);
+emit_32(1119072263);
+emit_32(1100711251);
+emit_32(1125924864);
+emit_32(1119584256);
+emit_32(1100374239);
+emit_32(1125924864);
+emit_32(1120096263);
+emit_32(1100424046);
+emit_32(1125924864);
+emit_32(1120608322);
+emit_32(1101327290);
+emit_32(1125924864);
+emit_32(1121120289);
+emit_32(1102568437);
+emit_32(1125924864);
+emit_32(1121632256);
+emit_32(1103744257);
+emit_32(1125924864);
+emit_32(1122144223);
+emit_32(1104560993);
+emit_32(1125924864);
+emit_32(1122656322);
+emit_32(1105101115);
+emit_32(1125924864);
+emit_32(1123168289);
+emit_32(1106075032);
+emit_32(1125924864);
+emit_32(1123680256);
+emit_32(1107013874);
+emit_32(1125924864);
+emit_32(1124132848);
+emit_32(1107516116);
+emit_32(1125924864);
+emit_32(1124388897);
+emit_32(1107763764);
+emit_32(1125924864);
+emit_32(1124644880);
+emit_32(1107925035);
+emit_32(1125924864);
+emit_32(1124900864);
+emit_32(1108124867);
+emit_32(1125924864);
+emit_32(1125156848);
+emit_32(1109418652);
+emit_32(1125924864);
+emit_32(1125412897);
+emit_32(1109666352);
+emit_32(1125924864);
+emit_32(1125668880);
+emit_32(1109926216);
+emit_32(1125924864);
+emit_32(1125924864);
+emit_32(1109962156);
+emit_32(1125924864);
+emit_32(1126180848);
+emit_32(1109898428);
+emit_32(1125924864);
+emit_32(1126436897);
+emit_32(1110252978);
+emit_32(1125924864);
+emit_32(1126692880);
+emit_32(1110074851);
+emit_32(1125924864);
+emit_32(1126948864);
+emit_32(1108526681);
+emit_32(1125924864);
+emit_32(1127204848);
+emit_32(1108040561);
+emit_32(1125924864);
+emit_32(1127460897);
+emit_32(1108008160);
+emit_32(1125924864);
+emit_32(1127716880);
+emit_32(1107835722);
+emit_32(1125924864);
+emit_32(1127972864);
+emit_32(1107758862);
+emit_32(1125924864);
+emit_32(1128228848);
+emit_32(1107617173);
+emit_32(1125924864);
+emit_32(1128484897);
+emit_32(1107323860);
+emit_32(1125924864);
+emit_32(1128740880);
+emit_32(1106591770);
+emit_32(1125924864);
+emit_32(1128996864);
+emit_32(1107721716);
+emit_32(1125924864);
+emit_32(1129252848);
+emit_32(1105209537);
+emit_32(1125924864);
+emit_32(1129508897);
+emit_32(1106514647);
+emit_32(1125924864);
+emit_32(1129764880);
+emit_32(1105924089);
+emit_32(1125924864);
+emit_32(1130020864);
+emit_32(1104857583);
+emit_32(1125924864);
+emit_32(1130276848);
+emit_32(1104080850);
+emit_32(1125924864);
+emit_32(1130532897);
+emit_32(1103165338);
+emit_32(1125924864);
+emit_32(1130788880);
+emit_32(1099955123);
+emit_32(1125924864);
+emit_32(1131044864);
+emit_32(1098976015);
+emit_32(1125924864);
+emit_32(1131300848);
+emit_32(1097678822);
+emit_32(1125924864);
+emit_32(1131556897);
+emit_32(1095863632);
+emit_32(1125924864);
+emit_32(1131812880);
+emit_32(1096143811);
+emit_32(1125924864);
+emit_32(1132068864);
+emit_32(1096399978);
+emit_32(1125924864);
+emit_32(1081737300);
+emit_32(1099796421);
+emit_32(1125668880);
+emit_32(1090125845);
+emit_32(1100536244);
+emit_32(1125668880);
+emit_32(1094418484);
+emit_32(1100815951);
+emit_32(1125668880);
+emit_32(1098514432);
+emit_32(1100932763);
+emit_32(1125668880);
+emit_32(1100759066);
+emit_32(1100556691);
+emit_32(1125668880);
+emit_32(1102807040);
+emit_32(1100739091);
+emit_32(1125668880);
+emit_32(1104855066);
+emit_32(1100685404);
+emit_32(1125668880);
+emit_32(1106903040);
+emit_32(1100296592);
+emit_32(1125668880);
+emit_32(1108123661);
+emit_32(1100158652);
+emit_32(1125668880);
+emit_32(1109147648);
+emit_32(1100060033);
+emit_32(1125668880);
+emit_32(1110171661);
+emit_32(1100191996);
+emit_32(1125668880);
+emit_32(1111195648);
+emit_32(1099855718);
+emit_32(1125668880);
+emit_32(1112219661);
+emit_32(1100233887);
+emit_32(1125668880);
+emit_32(1113243648);
+emit_32(1100904976);
+emit_32(1125668880);
+emit_32(1114267661);
+emit_32(1100654785);
+emit_32(1125668880);
+emit_32(1115291648);
+emit_32(1100035234);
+emit_32(1125668880);
+emit_32(1116000263);
+emit_32(1099851262);
+emit_32(1125668880);
+emit_32(1116512256);
+emit_32(1099917741);
+emit_32(1125668880);
+emit_32(1117024263);
+emit_32(1100254544);
+emit_32(1125668880);
+emit_32(1117536256);
+emit_32(1100744910);
+emit_32(1125668880);
+emit_32(1118048263);
+emit_32(1101045065);
+emit_32(1125668880);
+emit_32(1118560256);
+emit_32(1100752460);
+emit_32(1125668880);
+emit_32(1119072263);
+emit_32(1101140695);
+emit_32(1125668880);
+emit_32(1119584256);
+emit_32(1100593706);
+emit_32(1125668880);
+emit_32(1120096263);
+emit_32(1101066351);
+emit_32(1125668880);
+emit_32(1120608322);
+emit_32(1102014421);
+emit_32(1125668880);
+emit_32(1121120289);
+emit_32(1103061005);
+emit_32(1125668880);
+emit_32(1121632256);
+emit_32(1104070627);
+emit_32(1125668880);
+emit_32(1122144223);
+emit_32(1105156270);
+emit_32(1125668880);
+emit_32(1122656322);
+emit_32(1105870088);
+emit_32(1125668880);
+emit_32(1123168289);
+emit_32(1106367690);
+emit_32(1125668880);
+emit_32(1123680256);
+emit_32(1107164922);
+emit_32(1125668880);
+emit_32(1124132848);
+emit_32(1107602545);
+emit_32(1125668880);
+emit_32(1124388897);
+emit_32(1107941812);
+emit_32(1125668880);
+emit_32(1124644880);
+emit_32(1108344334);
+emit_32(1125668880);
+emit_32(1124900864);
+emit_32(1108480308);
+emit_32(1125668880);
+emit_32(1125156848);
+emit_32(1108327137);
+emit_32(1125668880);
+emit_32(1125412897);
+emit_32(1109716107);
+emit_32(1125668880);
+emit_32(1125668880);
+emit_32(1110107934);
+emit_32(1125668880);
+emit_32(1125924864);
+emit_32(1110315159);
+emit_32(1125668880);
+emit_32(1126180848);
+emit_32(1110535569);
+emit_32(1125668880);
+emit_32(1126436897);
+emit_32(1110503509);
+emit_32(1125668880);
+emit_32(1126692880);
+emit_32(1109463636);
+emit_32(1125668880);
+emit_32(1126948864);
+emit_32(1108400118);
+emit_32(1125668880);
+emit_32(1127204848);
+emit_32(1108447225);
+emit_32(1125668880);
+emit_32(1127460897);
+emit_32(1108142195);
+emit_32(1125668880);
+emit_32(1127716880);
+emit_32(1108004202);
+emit_32(1125668880);
+emit_32(1127972864);
+emit_32(1108024046);
+emit_32(1125668880);
+emit_32(1128228848);
+emit_32(1107844452);
+emit_32(1125668880);
+emit_32(1128484897);
+emit_32(1107348947);
+emit_32(1125668880);
+emit_32(1128740880);
+emit_32(1106593763);
+emit_32(1125668880);
+emit_32(1128996864);
+emit_32(1105593683);
+emit_32(1125668880);
+emit_32(1129252848);
+emit_32(1107573788);
+emit_32(1125668880);
+emit_32(1129508897);
+emit_32(1107189039);
+emit_32(1125668880);
+emit_32(1129764880);
+emit_32(1106191581);
+emit_32(1125668880);
+emit_32(1130020864);
+emit_32(1104988812);
+emit_32(1125668880);
+emit_32(1130276848);
+emit_32(1104221150);
+emit_32(1125668880);
+emit_32(1130532897);
+emit_32(1100814903);
+emit_32(1125668880);
+emit_32(1130788880);
+emit_32(1100302044);
+emit_32(1125668880);
+emit_32(1131044864);
+emit_32(1099639816);
+emit_32(1125668880);
+emit_32(1131300848);
+emit_32(1098467980);
+emit_32(1125668880);
+emit_32(1131556897);
+emit_32(1096188795);
+emit_32(1125668880);
+emit_32(1131812880);
+emit_32(1095551051);
+emit_32(1125668880);
+emit_32(1132068864);
+emit_32(1095331689);
+emit_32(1125668880);
+emit_32(1081737258);
+emit_32(1100171654);
+emit_32(1125412897);
+emit_32(1090125845);
+emit_32(1100384200);
+emit_32(1125412897);
+emit_32(1094418484);
+emit_32(1101392563);
+emit_32(1125412897);
+emit_32(1098514432);
+emit_32(1101939763);
+emit_32(1125412897);
+emit_32(1100759066);
+emit_32(1101350096);
+emit_32(1125412897);
+emit_32(1102807040);
+emit_32(1100931242);
+emit_32(1125412897);
+emit_32(1104855066);
+emit_32(1101054660);
+emit_32(1125412897);
+emit_32(1106903040);
+emit_32(1100365745);
+emit_32(1125412897);
+emit_32(1108123661);
+emit_32(1100020711);
+emit_32(1125412897);
+emit_32(1109147648);
+emit_32(1099837211);
+emit_32(1125412897);
+emit_32(1110171661);
+emit_32(1099961205);
+emit_32(1125412897);
+emit_32(1111195648);
+emit_32(1099795792);
+emit_32(1125412897);
+emit_32(1112219661);
+emit_32(1099519282);
+emit_32(1125412897);
+emit_32(1113243648);
+emit_32(1100138886);
+emit_32(1125412897);
+emit_32(1114267661);
+emit_32(1100250454);
+emit_32(1125412897);
+emit_32(1115291648);
+emit_32(1100025640);
+emit_32(1125412897);
+emit_32(1116000263);
+emit_32(1099647890);
+emit_32(1125412897);
+emit_32(1116512256);
+emit_32(1099582564);
+emit_32(1125412897);
+emit_32(1117024263);
+emit_32(1099791335);
+emit_32(1125412897);
+emit_32(1117536256);
+emit_32(1100303198);
+emit_32(1125412897);
+emit_32(1118048263);
+emit_32(1100818520);
+emit_32(1125412897);
+emit_32(1118560256);
+emit_32(1100729182);
+emit_32(1125412897);
+emit_32(1119072263);
+emit_32(1101156162);
+emit_32(1125412897);
+emit_32(1119584256);
+emit_32(1101134247);
+emit_32(1125412897);
+emit_32(1120096263);
+emit_32(1101623565);
+emit_32(1125412897);
+emit_32(1120608322);
+emit_32(1102682626);
+emit_32(1125412897);
+emit_32(1121120289);
+emit_32(1103567205);
+emit_32(1125412897);
+emit_32(1121632256);
+emit_32(1104435374);
+emit_32(1125412897);
+emit_32(1122144223);
+emit_32(1105541464);
+emit_32(1125412897);
+emit_32(1122656322);
+emit_32(1106370730);
+emit_32(1125412897);
+emit_32(1123168289);
+emit_32(1107136296);
+emit_32(1125412897);
+emit_32(1123680256);
+emit_32(1107622678);
+emit_32(1125412897);
+emit_32(1124132848);
+emit_32(1107924458);
+emit_32(1125412897);
+emit_32(1124388897);
+emit_32(1108157006);
+emit_32(1125412897);
+emit_32(1124644880);
+emit_32(1108530928);
+emit_32(1125412897);
+emit_32(1124900864);
+emit_32(1108656600);
+emit_32(1125412897);
+emit_32(1125156848);
+emit_32(1108481461);
+emit_32(1125412897);
+emit_32(1125412897);
+emit_32(1108539159);
+emit_32(1125412897);
+emit_32(1125668880);
+emit_32(1110441066);
+emit_32(1125412897);
+emit_32(1125924864);
+emit_32(1110692148);
+emit_32(1125412897);
+emit_32(1126180848);
+emit_32(1110653744);
+emit_32(1125412897);
+emit_32(1126436897);
+emit_32(1110727721);
+emit_32(1125412897);
+emit_32(1126692880);
+emit_32(1110202673);
+emit_32(1125412897);
+emit_32(1126948864);
+emit_32(1109971881);
+emit_32(1125412897);
+emit_32(1127204848);
+emit_32(1109534940);
+emit_32(1125412897);
+emit_32(1127460897);
+emit_32(1108342263);
+emit_32(1125412897);
+emit_32(1127716880);
+emit_32(1107927840);
+emit_32(1125412897);
+emit_32(1127972864);
+emit_32(1108111183);
+emit_32(1125412897);
+emit_32(1128228848);
+emit_32(1107908939);
+emit_32(1125412897);
+emit_32(1128484897);
+emit_32(1108258954);
+emit_32(1125412897);
+emit_32(1128740880);
+emit_32(1108072464);
+emit_32(1125412897);
+emit_32(1128996864);
+emit_32(1107928180);
+emit_32(1125412897);
+emit_32(1129252848);
+emit_32(1107296990);
+emit_32(1125412897);
+emit_32(1129508897);
+emit_32(1106977751);
+emit_32(1125412897);
+emit_32(1129764880);
+emit_32(1105908938);
+emit_32(1125412897);
+emit_32(1130020864);
+emit_32(1105000556);
+emit_32(1125412897);
+emit_32(1130276848);
+emit_32(1101880046);
+emit_32(1125412897);
+emit_32(1130532897);
+emit_32(1101191447);
+emit_32(1125412897);
+emit_32(1130788880);
+emit_32(1100805675);
+emit_32(1125412897);
+emit_32(1131044864);
+emit_32(1099759459);
+emit_32(1125412897);
+emit_32(1131300848);
+emit_32(1099177761);
+emit_32(1125412897);
+emit_32(1131556897);
+emit_32(1097755263);
+emit_32(1125412897);
+emit_32(1131812880);
+emit_32(1095551576);
+emit_32(1125412897);
+emit_32(1132068864);
+emit_32(1095000968);
+emit_32(1125412897);
+emit_32(1081737258);
+emit_32(1099891107);
+emit_32(1125156848);
+emit_32(1090125845);
+emit_32(1100647078);
+emit_32(1125156848);
+emit_32(1094418484);
+emit_32(1101487879);
+emit_32(1125156848);
+emit_32(1098514432);
+emit_32(1101979399);
+emit_32(1125156848);
+emit_32(1100759066);
+emit_32(1101681341);
+emit_32(1125156848);
+emit_32(1102807040);
+emit_32(1100993475);
+emit_32(1125156848);
+emit_32(1104855066);
+emit_32(1100813907);
+emit_32(1125156848);
+emit_32(1106903040);
+emit_32(1100711094);
+emit_32(1125156848);
+emit_32(1108123661);
+emit_32(1100302044);
+emit_32(1125156848);
+emit_32(1109147648);
+emit_32(1099535063);
+emit_32(1125156848);
+emit_32(1110171661);
+emit_32(1099325506);
+emit_32(1125156848);
+emit_32(1111195648);
+emit_32(1099122554);
+emit_32(1125156848);
+emit_32(1112219661);
+emit_32(1099190764);
+emit_32(1125156848);
+emit_32(1113243648);
+emit_32(1099332846);
+emit_32(1125156848);
+emit_32(1114267661);
+emit_32(1099594465);
+emit_32(1125156848);
+emit_32(1115291648);
+emit_32(1099712850);
+emit_32(1125156848);
+emit_32(1116000263);
+emit_32(1099353031);
+emit_32(1125156848);
+emit_32(1116512256);
+emit_32(1099544553);
+emit_32(1125156848);
+emit_32(1117024263);
+emit_32(1099237163);
+emit_32(1125156848);
+emit_32(1117536256);
+emit_32(1099846700);
+emit_32(1125156848);
+emit_32(1118048263);
+emit_32(1100273628);
+emit_32(1125156848);
+emit_32(1118560256);
+emit_32(1100368839);
+emit_32(1125156848);
+emit_32(1119072263);
+emit_32(1101256668);
+emit_32(1125156848);
+emit_32(1119584256);
+emit_32(1101557609);
+emit_32(1125156848);
+emit_32(1120096263);
+emit_32(1101502192);
+emit_32(1125156848);
+emit_32(1120608322);
+emit_32(1102635231);
+emit_32(1125156848);
+emit_32(1121120289);
+emit_32(1103741374);
+emit_32(1125156848);
+emit_32(1121632256);
+emit_32(1104695211);
+emit_32(1125156848);
+emit_32(1122144223);
+emit_32(1105984016);
+emit_32(1125156848);
+emit_32(1122656322);
+emit_32(1106774537);
+emit_32(1125156848);
+emit_32(1123168289);
+emit_32(1107580944);
+emit_32(1125156848);
+emit_32(1123680256);
+emit_32(1107993847);
+emit_32(1125156848);
+emit_32(1124132848);
+emit_32(1108308813);
+emit_32(1125156848);
+emit_32(1124388897);
+emit_32(1108572163);
+emit_32(1125156848);
+emit_32(1124644880);
+emit_32(1108751548);
+emit_32(1125156848);
+emit_32(1124900864);
+emit_32(1108775613);
+emit_32(1125156848);
+emit_32(1125156848);
+emit_32(1108840887);
+emit_32(1125156848);
+emit_32(1125412897);
+emit_32(1108640452);
+emit_32(1125156848);
+emit_32(1125668880);
+emit_32(1109400932);
+emit_32(1125156848);
+emit_32(1125924864);
+emit_32(1110700537);
+emit_32(1125156848);
+emit_32(1126180848);
+emit_32(1110726279);
+emit_32(1125156848);
+emit_32(1126436897);
+emit_32(1110647059);
+emit_32(1125156848);
+emit_32(1126692880);
+emit_32(1110057628);
+emit_32(1125156848);
+emit_32(1126948864);
+emit_32(1109862960);
+emit_32(1125156848);
+emit_32(1127204848);
+emit_32(1109806599);
+emit_32(1125156848);
+emit_32(1127460897);
+emit_32(1109740539);
+emit_32(1125156848);
+emit_32(1127716880);
+emit_32(1109309417);
+emit_32(1125156848);
+emit_32(1127972864);
+emit_32(1109254577);
+emit_32(1125156848);
+emit_32(1128228848);
+emit_32(1109010704);
+emit_32(1125156848);
+emit_32(1128484897);
+emit_32(1108707980);
+emit_32(1125156848);
+emit_32(1128740880);
+emit_32(1108196590);
+emit_32(1125156848);
+emit_32(1128996864);
+emit_32(1107884428);
+emit_32(1125156848);
+emit_32(1129252848);
+emit_32(1107202828);
+emit_32(1125156848);
+emit_32(1129508897);
+emit_32(1106564402);
+emit_32(1125156848);
+emit_32(1129764880);
+emit_32(1104622440);
+emit_32(1125156848);
+emit_32(1130020864);
+emit_32(1102215591);
+emit_32(1125156848);
+emit_32(1130276848);
+emit_32(1101762186);
+emit_32(1125156848);
+emit_32(1130532897);
+emit_32(1101353085);
+emit_32(1125156848);
+emit_32(1130788880);
+emit_32(1101174984);
+emit_32(1125156848);
+emit_32(1131044864);
+emit_32(1099976252);
+emit_32(1125156848);
+emit_32(1131300848);
+emit_32(1098682624);
+emit_32(1125156848);
+emit_32(1131556897);
+emit_32(1097157994);
+emit_32(1125156848);
+emit_32(1131812880);
+emit_32(1095208586);
+emit_32(1125156848);
+emit_32(1132068864);
+emit_32(1095289117);
+emit_32(1125156848);
+emit_32(1081737258);
+emit_32(1100260206);
+emit_32(1124900864);
+emit_32(1090125845);
+emit_32(1100861722);
+emit_32(1124900864);
+emit_32(1094418484);
+emit_32(1101453905);
+emit_32(1124900864);
+emit_32(1098514432);
+emit_32(1101891581);
+emit_32(1124900864);
+emit_32(1100759066);
+emit_32(1101491759);
+emit_32(1124900864);
+emit_32(1102807040);
+emit_32(1101032640);
+emit_32(1124900864);
+emit_32(1104855066);
+emit_32(1100567282);
+emit_32(1124900864);
+emit_32(1106903040);
+emit_32(1100372876);
+emit_32(1124900864);
+emit_32(1108123661);
+emit_32(1100112672);
+emit_32(1124900864);
+emit_32(1109147648);
+emit_32(1099604689);
+emit_32(1124900864);
+emit_32(1110171661);
+emit_32(1099198995);
+emit_32(1124900864);
+emit_32(1111195648);
+emit_32(1098995676);
+emit_32(1124900864);
+emit_32(1112219661);
+emit_32(1098921384);
+emit_32(1124900864);
+emit_32(1113243648);
+emit_32(1098994627);
+emit_32(1124900864);
+emit_32(1114267661);
+emit_32(1099148296);
+emit_32(1124900864);
+emit_32(1115291648);
+emit_32(1099448032);
+emit_32(1124900864);
+emit_32(1116000263);
+emit_32(1099762395);
+emit_32(1124900864);
+emit_32(1116512256);
+emit_32(1099304849);
+emit_32(1124900864);
+emit_32(1117024263);
+emit_32(1099411698);
+emit_32(1124900864);
+emit_32(1117536256);
+emit_32(1099612239);
+emit_32(1124900864);
+emit_32(1118048263);
+emit_32(1099837840);
+emit_32(1124900864);
+emit_32(1118560256);
+emit_32(1100521092);
+emit_32(1124900864);
+emit_32(1119072263);
+emit_32(1101042758);
+emit_32(1124900864);
+emit_32(1119584256);
+emit_32(1101829715);
+emit_32(1124900864);
+emit_32(1120096263);
+emit_32(1101787195);
+emit_32(1124900864);
+emit_32(1120608322);
+emit_32(1103231661);
+emit_32(1124900864);
+emit_32(1121120289);
+emit_32(1104133017);
+emit_32(1124900864);
+emit_32(1121632256);
+emit_32(1105136347);
+emit_32(1124900864);
+emit_32(1122144223);
+emit_32(1106058779);
+emit_32(1124900864);
+emit_32(1122656322);
+emit_32(1107306060);
+emit_32(1124900864);
+emit_32(1123168289);
+emit_32(1107824214);
+emit_32(1124900864);
+emit_32(1123680256);
+emit_32(1108124343);
+emit_32(1124900864);
+emit_32(1124132848);
+emit_32(1108411050);
+emit_32(1124900864);
+emit_32(1124388897);
+emit_32(1108748167);
+emit_32(1124900864);
+emit_32(1124644880);
+emit_32(1108912295);
+emit_32(1124900864);
+emit_32(1124900864);
+emit_32(1108843273);
+emit_32(1124900864);
+emit_32(1125156848);
+emit_32(1109145892);
+emit_32(1124900864);
+emit_32(1125412897);
+emit_32(1108908258);
+emit_32(1124900864);
+emit_32(1125668880);
+emit_32(1109287685);
+emit_32(1124900864);
+emit_32(1125924864);
+emit_32(1109482773);
+emit_32(1124900864);
+emit_32(1126180848);
+emit_32(1109256516);
+emit_32(1124900864);
+emit_32(1126436897);
+emit_32(1110387222);
+emit_32(1124900864);
+emit_32(1126692880);
+emit_32(1110113439);
+emit_32(1124900864);
+emit_32(1126948864);
+emit_32(1109770738);
+emit_32(1124900864);
+emit_32(1127204848);
+emit_32(1109713748);
+emit_32(1124900864);
+emit_32(1127460897);
+emit_32(1109642471);
+emit_32(1124900864);
+emit_32(1127716880);
+emit_32(1109465262);
+emit_32(1124900864);
+emit_32(1127972864);
+emit_32(1109524768);
+emit_32(1124900864);
+emit_32(1128228848);
+emit_32(1109357599);
+emit_32(1124900864);
+emit_32(1128484897);
+emit_32(1108841438);
+emit_32(1124900864);
+emit_32(1128740880);
+emit_32(1108264013);
+emit_32(1124900864);
+emit_32(1128996864);
+emit_32(1107582543);
+emit_32(1124900864);
+emit_32(1129252848);
+emit_32(1106640739);
+emit_32(1124900864);
+emit_32(1129508897);
+emit_32(1103288074);
+emit_32(1124900864);
+emit_32(1129764880);
+emit_32(1102897585);
+emit_32(1124900864);
+emit_32(1130020864);
+emit_32(1102698145);
+emit_32(1124900864);
+emit_32(1130276848);
+emit_32(1101950353);
+emit_32(1124900864);
+emit_32(1130532897);
+emit_32(1101571713);
+emit_32(1124900864);
+emit_32(1130788880);
+emit_32(1101236693);
+emit_32(1124900864);
+emit_32(1131044864);
+emit_32(1100675547);
+emit_32(1124900864);
+emit_32(1131300848);
+emit_32(1099383387);
+emit_32(1124900864);
+emit_32(1131556897);
+emit_32(1098585840);
+emit_32(1124900864);
+emit_32(1131812880);
+emit_32(1096815319);
+emit_32(1124900864);
+emit_32(1132068864);
+emit_32(1095522740);
+emit_32(1124900864);
+emit_32(1081737258);
+emit_32(1100859258);
+emit_32(1124644880);
+emit_32(1090125845);
+emit_32(1101195903);
+emit_32(1124644880);
+emit_32(1094418484);
+emit_32(1101106407);
+emit_32(1124644880);
+emit_32(1098514432);
+emit_32(1101011196);
+emit_32(1124644880);
+emit_32(1100759066);
+emit_32(1101487355);
+emit_32(1124644880);
+emit_32(1102807040);
+emit_32(1101120563);
+emit_32(1124644880);
+emit_32(1104855066);
+emit_32(1100659766);
+emit_32(1124644880);
+emit_32(1106903040);
+emit_32(1100064175);
+emit_32(1124644880);
+emit_32(1108123661);
+emit_32(1099751175);
+emit_32(1124644880);
+emit_32(1109147648);
+emit_32(1099500618);
+emit_32(1124644880);
+emit_32(1110171661);
+emit_32(1099345376);
+emit_32(1124644880);
+emit_32(1111195648);
+emit_32(1099089157);
+emit_32(1124644880);
+emit_32(1112219661);
+emit_32(1098329673);
+emit_32(1124644880);
+emit_32(1113243648);
+emit_32(1098686084);
+emit_32(1124644880);
+emit_32(1114267661);
+emit_32(1099133616);
+emit_32(1124644880);
+emit_32(1115291648);
+emit_32(1099084752);
+emit_32(1124644880);
+emit_32(1116000263);
+emit_32(1099672322);
+emit_32(1124644880);
+emit_32(1116512256);
+emit_32(1099700004);
+emit_32(1124644880);
+emit_32(1117024263);
+emit_32(1099767847);
+emit_32(1124644880);
+emit_32(1117536256);
+emit_32(1099478440);
+emit_32(1124644880);
+emit_32(1118048263);
+emit_32(1099565892);
+emit_32(1124644880);
+emit_32(1118560256);
+emit_32(1100285634);
+emit_32(1124644880);
+emit_32(1119072263);
+emit_32(1100840908);
+emit_32(1124644880);
+emit_32(1119584256);
+emit_32(1101579577);
+emit_32(1124644880);
+emit_32(1120096263);
+emit_32(1101821746);
+emit_32(1124644880);
+emit_32(1120608322);
+emit_32(1103580575);
+emit_32(1124644880);
+emit_32(1121120289);
+emit_32(1104976858);
+emit_32(1124644880);
+emit_32(1121632256);
+emit_32(1105588440);
+emit_32(1124644880);
+emit_32(1122144223);
+emit_32(1106822195);
+emit_32(1124644880);
+emit_32(1122656322);
+emit_32(1107756686);
+emit_32(1124644880);
+emit_32(1123168289);
+emit_32(1108002131);
+emit_32(1124644880);
+emit_32(1123680256);
+emit_32(1108095874);
+emit_32(1124644880);
+emit_32(1124132848);
+emit_32(1108362055);
+emit_32(1124644880);
+emit_32(1124388897);
+emit_32(1108659431);
+emit_32(1124644880);
+emit_32(1124644880);
+emit_32(1109016576);
+emit_32(1124644880);
+emit_32(1124900864);
+emit_32(1109100043);
+emit_32(1124644880);
+emit_32(1125156848);
+emit_32(1109226842);
+emit_32(1124644880);
+emit_32(1125412897);
+emit_32(1109110030);
+emit_32(1124644880);
+emit_32(1125668880);
+emit_32(1109268916);
+emit_32(1124644880);
+emit_32(1125924864);
+emit_32(1109272612);
+emit_32(1124644880);
+emit_32(1126180848);
+emit_32(1109315053);
+emit_32(1124644880);
+emit_32(1126436897);
+emit_32(1108975105);
+emit_32(1124644880);
+emit_32(1126692880);
+emit_32(1108796559);
+emit_32(1124644880);
+emit_32(1126948864);
+emit_32(1108827649);
+emit_32(1124644880);
+emit_32(1127204848);
+emit_32(1109670651);
+emit_32(1124644880);
+emit_32(1127460897);
+emit_32(1109571771);
+emit_32(1124644880);
+emit_32(1127716880);
+emit_32(1109561993);
+emit_32(1124644880);
+emit_32(1127972864);
+emit_32(1109715478);
+emit_32(1124644880);
+emit_32(1128228848);
+emit_32(1109451342);
+emit_32(1124644880);
+emit_32(1128484897);
+emit_32(1108848070);
+emit_32(1124644880);
+emit_32(1128740880);
+emit_32(1106750525);
+emit_32(1124644880);
+emit_32(1128996864);
+emit_32(1105305377);
+emit_32(1124644880);
+emit_32(1129252848);
+emit_32(1103748819);
+emit_32(1124644880);
+emit_32(1129508897);
+emit_32(1103181906);
+emit_32(1124644880);
+emit_32(1129764880);
+emit_32(1102910272);
+emit_32(1124644880);
+emit_32(1130020864);
+emit_32(1102380846);
+emit_32(1124644880);
+emit_32(1130276848);
+emit_32(1101721764);
+emit_32(1124644880);
+emit_32(1130532897);
+emit_32(1101539941);
+emit_32(1124644880);
+emit_32(1130788880);
+emit_32(1101138913);
+emit_32(1124644880);
+emit_32(1131044864);
+emit_32(1100148166);
+emit_32(1124644880);
+emit_32(1131300848);
+emit_32(1099305268);
+emit_32(1124644880);
+emit_32(1131556897);
+emit_32(1099050412);
+emit_32(1124644880);
+emit_32(1131812880);
+emit_32(1097572601);
+emit_32(1124644880);
+emit_32(1132068864);
+emit_32(1096388234);
+emit_32(1124644880);
+emit_32(1081737258);
+emit_32(1100982465);
+emit_32(1124388897);
+emit_32(1090125824);
+emit_32(1101595148);
+emit_32(1124388897);
+emit_32(1094418484);
+emit_32(1101527882);
+emit_32(1124388897);
+emit_32(1098514432);
+emit_32(1101659007);
+emit_32(1124388897);
+emit_32(1100759066);
+emit_32(1101842665);
+emit_32(1124388897);
+emit_32(1102807040);
+emit_32(1101032902);
+emit_32(1124388897);
+emit_32(1104855066);
+emit_32(1100272108);
+emit_32(1124388897);
+emit_32(1106903040);
+emit_32(1100043256);
+emit_32(1124388897);
+emit_32(1108123661);
+emit_32(1099540464);
+emit_32(1124388897);
+emit_32(1109147648);
+emit_32(1099626080);
+emit_32(1124388897);
+emit_32(1110171661);
+emit_32(1099081554);
+emit_32(1124388897);
+emit_32(1111195648);
+emit_32(1098359138);
+emit_32(1124388897);
+emit_32(1112219661);
+emit_32(1097625344);
+emit_32(1124388897);
+emit_32(1113243648);
+emit_32(1097653341);
+emit_32(1124388897);
+emit_32(1114267661);
+emit_32(1098623589);
+emit_32(1124388897);
+emit_32(1115291648);
+emit_32(1099027815);
+emit_32(1124388897);
+emit_32(1116000263);
+emit_32(1099509950);
+emit_32(1124388897);
+emit_32(1116512256);
+emit_32(1099695496);
+emit_32(1124388897);
+emit_32(1117024263);
+emit_32(1099418095);
+emit_32(1124388897);
+emit_32(1117536256);
+emit_32(1099118097);
+emit_32(1124388897);
+emit_32(1118048263);
+emit_32(1099305111);
+emit_32(1124388897);
+emit_32(1118560256);
+emit_32(1100055524);
+emit_32(1124388897);
+emit_32(1119072263);
+emit_32(1101014132);
+emit_32(1124388897);
+emit_32(1119584256);
+emit_32(1101309569);
+emit_32(1124388897);
+emit_32(1120096263);
+emit_32(1102362339);
+emit_32(1124388897);
+emit_32(1120608322);
+emit_32(1103979663);
+emit_32(1124388897);
+emit_32(1121120289);
+emit_32(1105246709);
+emit_32(1124388897);
+emit_32(1121632256);
+emit_32(1105782322);
+emit_32(1124388897);
+emit_32(1122144223);
+emit_32(1107021110);
+emit_32(1124388897);
+emit_32(1122656322);
+emit_32(1107619427);
+emit_32(1124388897);
+emit_32(1123168289);
+emit_32(1107918769);
+emit_32(1124388897);
+emit_32(1123680256);
+emit_32(1108052515);
+emit_32(1124388897);
+emit_32(1124132848);
+emit_32(1108443687);
+emit_32(1124388897);
+emit_32(1124388897);
+emit_32(1108689656);
+emit_32(1124388897);
+emit_32(1124644880);
+emit_32(1109031544);
+emit_32(1124388897);
+emit_32(1124900864);
+emit_32(1109169904);
+emit_32(1124388897);
+emit_32(1125156848);
+emit_32(1109272691);
+emit_32(1124388897);
+emit_32(1125412897);
+emit_32(1109111367);
+emit_32(1124388897);
+emit_32(1125668880);
+emit_32(1109309548);
+emit_32(1124388897);
+emit_32(1125924864);
+emit_32(1109332460);
+emit_32(1124388897);
+emit_32(1126180848);
+emit_32(1109248285);
+emit_32(1124388897);
+emit_32(1126436897);
+emit_32(1108946898);
+emit_32(1124388897);
+emit_32(1126692880);
+emit_32(1108703419);
+emit_32(1124388897);
+emit_32(1126948864);
+emit_32(1108479758);
+emit_32(1124388897);
+emit_32(1127204848);
+emit_32(1108324306);
+emit_32(1124388897);
+emit_32(1127460897);
+emit_32(1108262886);
+emit_32(1124388897);
+emit_32(1127716880);
+emit_32(1108353955);
+emit_32(1124388897);
+emit_32(1127972864);
+emit_32(1108388610);
+emit_32(1124388897);
+emit_32(1128228848);
+emit_32(1108016156);
+emit_32(1124388897);
+emit_32(1128484897);
+emit_32(1107451209);
+emit_32(1124388897);
+emit_32(1128740880);
+emit_32(1106693797);
+emit_32(1124388897);
+emit_32(1128996864);
+emit_32(1105140908);
+emit_32(1124388897);
+emit_32(1129252848);
+emit_32(1103671801);
+emit_32(1124388897);
+emit_32(1129508897);
+emit_32(1102951481);
+emit_32(1124388897);
+emit_32(1129764880);
+emit_32(1102824813);
+emit_32(1124388897);
+emit_32(1130020864);
+emit_32(1102191421);
+emit_32(1124388897);
+emit_32(1130276848);
+emit_32(1101602960);
+emit_32(1124388897);
+emit_32(1130532897);
+emit_32(1101147668);
+emit_32(1124388897);
+emit_32(1130788880);
+emit_32(1100725774);
+emit_32(1124388897);
+emit_32(1131044864);
+emit_32(1100192730);
+emit_32(1124388897);
+emit_32(1131300848);
+emit_32(1099972267);
+emit_32(1124388897);
+emit_32(1131556897);
+emit_32(1099729574);
+emit_32(1124388897);
+emit_32(1131812880);
+emit_32(1099118936);
+emit_32(1124388897);
+emit_32(1132068864);
+emit_32(1097577634);
+emit_32(1124388897);
+emit_32(1081737258);
+emit_32(1101050728);
+emit_32(1124132848);
+emit_32(1090125866);
+emit_32(1101569144);
+emit_32(1124132848);
+emit_32(1094418484);
+emit_32(1101742788);
+emit_32(1124132848);
+emit_32(1098514432);
+emit_32(1102383625);
+emit_32(1124132848);
+emit_32(1100759066);
+emit_32(1102114927);
+emit_32(1124132848);
+emit_32(1102807040);
+emit_32(1101213309);
+emit_32(1124132848);
+emit_32(1104855066);
+emit_32(1100341209);
+emit_32(1124132848);
+emit_32(1106903040);
+emit_32(1099911345);
+emit_32(1124132848);
+emit_32(1108123661);
+emit_32(1099586129);
+emit_32(1124132848);
+emit_32(1109147648);
+emit_32(1099190030);
+emit_32(1124132848);
+emit_32(1110171661);
+emit_32(1098581751);
+emit_32(1124132848);
+emit_32(1111195648);
+emit_32(1097483053);
+emit_32(1124132848);
+emit_32(1112219661);
+emit_32(1097178022);
+emit_32(1124132848);
+emit_32(1113243648);
+emit_32(1096978688);
+emit_32(1124132848);
+emit_32(1114267661);
+emit_32(1097352610);
+emit_32(1124132848);
+emit_32(1115291648);
+emit_32(1097969906);
+emit_32(1124132848);
+emit_32(1116000263);
+emit_32(1098943509);
+emit_32(1124132848);
+emit_32(1116512256);
+emit_32(1099235380);
+emit_32(1124132848);
+emit_32(1117024263);
+emit_32(1098875037);
+emit_32(1124132848);
+emit_32(1117536256);
+emit_32(1098919916);
+emit_32(1124132848);
+emit_32(1118048263);
+emit_32(1099015127);
+emit_32(1124132848);
+emit_32(1118560256);
+emit_32(1100384410);
+emit_32(1124132848);
+emit_32(1119072263);
+emit_32(1100817786);
+emit_32(1124132848);
+emit_32(1119584256);
+emit_32(1101157682);
+emit_32(1124132848);
+emit_32(1120096263);
+emit_32(1102698670);
+emit_32(1124132848);
+emit_32(1120608322);
+emit_32(1104088662);
+emit_32(1124132848);
+emit_32(1121120289);
+emit_32(1104975548);
+emit_32(1124132848);
+emit_32(1121632256);
+emit_32(1105705671);
+emit_32(1124132848);
+emit_32(1122144223);
+emit_32(1106546629);
+emit_32(1124132848);
+emit_32(1122656322);
+emit_32(1107224271);
+emit_32(1124132848);
+emit_32(1123168289);
+emit_32(1107432990);
+emit_32(1124132848);
+emit_32(1123680256);
+emit_32(1107870823);
+emit_32(1124132848);
+emit_32(1124132848);
+emit_32(1108611197);
+emit_32(1124132848);
+emit_32(1124388897);
+emit_32(1109002394);
+emit_32(1124132848);
+emit_32(1124644880);
+emit_32(1109174020);
+emit_32(1124132848);
+emit_32(1124900864);
+emit_32(1109145131);
+emit_32(1124132848);
+emit_32(1125156848);
+emit_32(1109111053);
+emit_32(1124132848);
+emit_32(1125412897);
+emit_32(1108982156);
+emit_32(1124132848);
+emit_32(1125668880);
+emit_32(1109159733);
+emit_32(1124132848);
+emit_32(1125924864);
+emit_32(1109315342);
+emit_32(1124132848);
+emit_32(1126180848);
+emit_32(1109210091);
+emit_32(1124132848);
+emit_32(1126436897);
+emit_32(1108929885);
+emit_32(1124132848);
+emit_32(1126692880);
+emit_32(1108541256);
+emit_32(1124132848);
+emit_32(1126948864);
+emit_32(1108339091);
+emit_32(1124132848);
+emit_32(1127204848);
+emit_32(1108284853);
+emit_32(1124132848);
+emit_32(1127460897);
+emit_32(1108246449);
+emit_32(1124132848);
+emit_32(1127716880);
+emit_32(1108208727);
+emit_32(1124132848);
+emit_32(1127972864);
+emit_32(1108242648);
+emit_32(1124132848);
+emit_32(1128228848);
+emit_32(1107828539);
+emit_32(1124132848);
+emit_32(1128484897);
+emit_32(1107302207);
+emit_32(1124132848);
+emit_32(1128740880);
+emit_32(1106125311);
+emit_32(1124132848);
+emit_32(1128996864);
+emit_32(1104882853);
+emit_32(1124132848);
+emit_32(1129252848);
+emit_32(1103712328);
+emit_32(1124132848);
+emit_32(1129508897);
+emit_32(1103248228);
+emit_32(1124132848);
+emit_32(1129764880);
+emit_32(1102281808);
+emit_32(1124132848);
+emit_32(1130020864);
+emit_32(1101935621);
+emit_32(1124132848);
+emit_32(1130276848);
+emit_32(1100815060);
+emit_32(1124132848);
+emit_32(1130532897);
+emit_32(1100889457);
+emit_32(1124132848);
+emit_32(1130788880);
+emit_32(1101023098);
+emit_32(1124132848);
+emit_32(1131044864);
+emit_32(1100560938);
+emit_32(1124132848);
+emit_32(1131300848);
+emit_32(1099884397);
+emit_32(1124132848);
+emit_32(1131556897);
+emit_32(1099776918);
+emit_32(1124132848);
+emit_32(1131812880);
+emit_32(1099406246);
+emit_32(1124132848);
+emit_32(1132068864);
+emit_32(1099062890);
+emit_32(1124132848);
+emit_start(Landscape03Vtx)
+emit_32(1081737216);
+emit_32(1112116167);
+emit_32(3054751226);
+emit_32(1081737216);
+emit_32(1112701298);
+emit_32(1081737216);
+emit_32(1090125824);
+emit_32(1112117215);
+emit_32(3054752017);
+emit_32(1090125824);
+emit_32(1112503694);
+emit_32(1081737216);
+emit_32(1094418484);
+emit_32(1111966902);
+emit_32(3054641802);
+emit_32(1094418484);
+emit_32(1112328084);
+emit_32(1081737216);
+emit_32(1098514432);
+emit_32(1112170824);
+emit_32(3054791336);
+emit_32(1098514432);
+emit_32(1112069951);
+emit_32(1081737216);
+emit_32(1100759066);
+emit_32(1112121016);
+emit_32(3054754788);
+emit_32(1100759066);
+emit_32(1112173655);
+emit_32(1081737216);
+emit_32(1102807040);
+emit_32(1112268577);
+emit_32(3054863024);
+emit_32(1102807040);
+emit_32(1112198559);
+emit_32(1081737216);
+emit_32(1104855066);
+emit_32(1112660640);
+emit_32(3055150524);
+emit_32(1104855066);
+emit_32(1112333694);
+emit_32(1081737216);
+emit_32(1106903040);
+emit_32(1112840733);
+emit_32(3055282597);
+emit_32(1106903040);
+emit_32(1112388744);
+emit_32(1081737216);
+emit_32(1108123661);
+emit_32(1112817271);
+emit_32(3055265401);
+emit_32(1108123661);
+emit_32(1112590726);
+emit_32(1081737216);
+emit_32(1109147648);
+emit_32(1112978804);
+emit_32(3055383885);
+emit_32(1109147648);
+emit_32(1113057735);
+emit_32(1081737216);
+emit_32(1110171661);
+emit_32(1113143692);
+emit_32(3055504787);
+emit_32(1110171661);
+emit_32(1113035296);
+emit_32(1081737216);
+emit_32(1111195648);
+emit_32(1113241551);
+emit_32(3055576563);
+emit_32(1111195648);
+emit_32(1112886896);
+emit_32(1081737216);
+emit_32(1112219661);
+emit_32(1113409140);
+emit_32(3055699444);
+emit_32(1112219661);
+emit_32(1112955971);
+emit_32(1081737216);
+emit_32(1113243648);
+emit_32(1113827049);
+emit_32(3056005944);
+emit_32(1113243648);
+emit_32(1113474440);
+emit_32(1081737216);
+emit_32(1114267661);
+emit_32(1113969787);
+emit_32(3056110618);
+emit_32(1114267661);
+emit_32(1113373252);
+emit_32(1081737216);
+emit_32(1115291648);
+emit_32(1113729217);
+emit_32(3055934168);
+emit_32(1115291648);
+emit_32(1112981923);
+emit_32(1081737216);
+emit_32(1116000263);
+emit_32(1113555888);
+emit_32(3055807065);
+emit_32(1116000263);
+emit_32(1112815462);
+emit_32(1081737216);
+emit_32(1116512256);
+emit_32(1112971595);
+emit_32(3055378563);
+emit_32(1116512256);
+emit_32(1112451711);
+emit_32(1081737216);
+emit_32(1117024263);
+emit_32(1112445996);
+emit_32(3054993118);
+emit_32(1117024263);
+emit_32(1112394144);
+emit_32(1081737216);
+emit_32(1117536256);
+emit_32(1112490508);
+emit_32(3055025752);
+emit_32(1117536256);
+emit_32(1112528414);
+emit_32(1081737216);
+emit_32(1118048263);
+emit_32(1112364810);
+emit_32(3054933569);
+emit_32(1118048263);
+emit_32(1112287950);
+emit_32(1081737216);
+emit_32(1118560256);
+emit_32(1112062978);
+emit_32(3054712259);
+emit_32(1118560256);
+emit_32(1111949653);
+emit_32(1081737216);
+emit_32(1119072263);
+emit_32(1111766755);
+emit_32(3054494995);
+emit_32(1119072263);
+emit_32(1111682685);
+emit_32(1081737216);
+emit_32(1119584256);
+emit_32(1111332435);
+emit_32(3054176489);
+emit_32(1119584256);
+emit_32(1111194678);
+emit_32(1081737216);
+emit_32(1120096263);
+emit_32(1110914210);
+emit_32(3053869769);
+emit_32(1120096263);
+emit_32(1111068639);
+emit_32(1081737216);
+emit_32(1120608322);
+emit_32(1110765653);
+emit_32(3053760829);
+emit_32(1120608322);
+emit_32(1110815303);
+emit_32(1081737216);
+emit_32(1121120289);
+emit_32(1110612404);
+emit_32(3053648459);
+emit_32(1121120289);
+emit_32(1110882674);
+emit_32(1081737216);
+emit_32(1121632256);
+emit_32(1110535543);
+emit_32(3053592076);
+emit_32(1121632256);
+emit_32(1110789010);
+emit_32(1081737216);
+emit_32(1122144223);
+emit_32(1110472052);
+emit_32(3053545501);
+emit_32(1122144223);
+emit_32(1110340062);
+emit_32(1081737216);
+emit_32(1122656322);
+emit_32(1110285668);
+emit_32(3053364308);
+emit_32(1122656322);
+emit_32(1109951539);
+emit_32(1081737216);
+emit_32(1123168289);
+emit_32(1109697652);
+emit_32(3052501939);
+emit_32(1123168289);
+emit_32(1109517848);
+emit_32(1081737216);
+emit_32(1123680256);
+emit_32(1109444526);
+emit_32(3052130656);
+emit_32(1123680256);
+emit_32(1109219108);
+emit_32(1081737216);
+emit_32(1124132848);
+emit_32(1109279611);
+emit_32(3051888763);
+emit_32(1124132848);
+emit_32(1108888571);
+emit_32(1081737216);
+emit_32(1124388897);
+emit_32(1108937068);
+emit_32(3051386330);
+emit_32(1124388897);
+emit_32(1108548203);
+emit_32(1081737216);
+emit_32(1124644880);
+emit_32(1108458524);
+emit_32(3050684490);
+emit_32(1124644880);
+emit_32(1108062057);
+emit_32(1081737216);
+emit_32(1124900864);
+emit_32(1107860049);
+emit_32(3049806640);
+emit_32(1124900864);
+emit_32(1107391755);
+emit_32(1081737216);
+emit_32(1125156848);
+emit_32(1107061952);
+emit_32(3048807931);
+emit_32(1125156848);
+emit_32(1107147201);
+emit_32(1081737216);
+emit_32(1125412897);
+emit_32(1106198187);
+emit_32(3048174525);
+emit_32(1125412897);
+emit_32(1106562515);
+emit_32(1081737216);
+emit_32(1125668880);
+emit_32(1106521306);
+emit_32(3048411491);
+emit_32(1125668880);
+emit_32(1107088323);
+emit_32(1081737216);
+emit_32(1125924864);
+emit_32(1106837714);
+emit_32(3048643444);
+emit_32(1125924864);
+emit_32(1107466728);
+emit_32(1081737216);
+emit_32(1126180848);
+emit_32(1107242569);
+emit_32(3048940401);
+emit_32(1126180848);
+emit_32(1107640477);
+emit_32(1081737216);
+emit_32(1126436897);
+emit_32(1107053196);
+emit_32(3048801510);
+emit_32(1126436897);
+emit_32(1107446858);
+emit_32(1081737216);
+emit_32(1126692880);
+emit_32(1106540495);
+emit_32(3048425477);
+emit_32(1126692880);
+emit_32(1107035003);
+emit_32(1081737216);
+emit_32(1126948864);
+emit_32(1106275362);
+emit_32(3048231084);
+emit_32(1126948864);
+emit_32(1106606398);
+emit_32(1081737216);
+emit_32(1127204848);
+emit_32(1105871923);
+emit_32(3047935271);
+emit_32(1127204848);
+emit_32(1106181305);
+emit_32(1081737216);
+emit_32(1127460897);
+emit_32(1105372958);
+emit_32(3047569266);
+emit_32(1127460897);
+emit_32(1105541831);
+emit_32(1081737216);
+emit_32(1127716880);
+emit_32(1104684096);
+emit_32(3047064106);
+emit_32(1127716880);
+emit_32(1104783501);
+emit_32(1081737216);
+emit_32(1127972864);
+emit_32(1103501774);
+emit_32(3046197075);
+emit_32(1127972864);
+emit_32(1103855197);
+emit_32(1081737216);
+emit_32(1128228848);
+emit_32(1102439829);
+emit_32(3045418269);
+emit_32(1128228848);
+emit_32(1103186310);
+emit_32(1081737216);
+emit_32(1128484897);
+emit_32(1101869718);
+emit_32(3044935642);
+emit_32(1128484897);
+emit_32(1103087482);
+emit_32(1081737216);
+emit_32(1128740880);
+emit_32(1101702785);
+emit_32(3044690829);
+emit_32(1128740880);
+emit_32(1102981471);
+emit_32(1081737216);
+emit_32(1128996864);
+emit_32(1101484419);
+emit_32(3044370528);
+emit_32(1128996864);
+emit_32(1102264716);
+emit_32(1081737216);
+emit_32(1129252848);
+emit_32(1100736102);
+emit_32(3043272969);
+emit_32(1129252848);
+emit_32(1102136581);
+emit_32(1081737216);
+emit_32(1129508897);
+emit_32(1100482452);
+emit_32(3042900948);
+emit_32(1129508897);
+emit_32(1101851735);
+emit_32(1081737216);
+emit_32(1129764880);
+emit_32(1100170134);
+emit_32(3042442865);
+emit_32(1129764880);
+emit_32(1101959109);
+emit_32(1081737216);
+emit_32(1130020864);
+emit_32(1100368052);
+emit_32(3042733136);
+emit_32(1130020864);
+emit_32(1101538001);
+emit_32(1081737216);
+emit_32(1130276848);
+emit_32(1100034710);
+emit_32(3042244249);
+emit_32(1130276848);
+emit_32(1100676386);
+emit_32(1081737216);
+emit_32(1130532897);
+emit_32(1099793118);
+emit_32(3041889854);
+emit_32(1130532897);
+emit_32(1100067740);
+emit_32(1081737216);
+emit_32(1130788880);
+emit_32(1099349570);
+emit_32(3041239348);
+emit_32(1130788880);
+emit_32(1099550582);
+emit_32(1081737216);
+emit_32(1131044864);
+emit_32(1099102264);
+emit_32(3040876615);
+emit_32(1131044864);
+emit_32(1099061684);
+emit_32(1081737216);
+emit_32(1131300848);
+emit_32(1097152227);
+emit_32(3039303785);
+emit_32(1131300848);
+emit_32(1097284243);
+emit_32(1081737216);
+emit_32(1131556897);
+emit_32(1095174088);
+emit_32(3037853098);
+emit_32(1131556897);
+emit_32(1096432799);
+emit_32(1081737216);
+emit_32(1131812880);
+emit_32(1095119772);
+emit_32(3037813287);
+emit_32(1131812880);
+emit_32(1096013998);
+emit_32(1081737216);
+emit_32(1132068864);
+emit_32(1094633233);
+emit_32(3037456465);
+emit_32(1132068864);
+emit_32(1095458043);
+emit_32(1081737216);
+emit_32(1081737216);
+emit_32(1111714929);
+emit_32(3229220864);
+emit_32(1090125824);
+emit_32(1111846420);
+emit_32(3229220864);
+emit_32(1094418484);
+emit_32(1112005149);
+emit_32(3229220864);
+emit_32(1098514432);
+emit_32(1112044365);
+emit_32(3229220864);
+emit_32(1100759066);
+emit_32(1112440753);
+emit_32(3229220864);
+emit_32(1102807040);
+emit_32(1112584120);
+emit_32(3229220864);
+emit_32(1104855066);
+emit_32(1112766651);
+emit_32(3229220864);
+emit_32(1106903040);
+emit_32(1113057657);
+emit_32(3229220864);
+emit_32(1108123661);
+emit_32(1113035846);
+emit_32(3229220864);
+emit_32(1109147648);
+emit_32(1113286037);
+emit_32(3229220864);
+emit_32(1110171661);
+emit_32(1113632643);
+emit_32(3229220864);
+emit_32(1111195648);
+emit_32(1113716556);
+emit_32(3229220864);
+emit_32(1112219661);
+emit_32(1113737894);
+emit_32(3229220864);
+emit_32(1113243648);
+emit_32(1114105892);
+emit_32(3229220864);
+emit_32(1114267661);
+emit_32(1114272563);
+emit_32(3229220864);
+emit_32(1115291648);
+emit_32(1114112603);
+emit_32(3229220864);
+emit_32(1116000263);
+emit_32(1114000379);
+emit_32(3229220864);
+emit_32(1116512256);
+emit_32(1113455303);
+emit_32(3229220864);
+emit_32(1117024263);
+emit_32(1112990522);
+emit_32(3229220864);
+emit_32(1117536256);
+emit_32(1112862360);
+emit_32(3229220864);
+emit_32(1118048263);
+emit_32(1112683289);
+emit_32(3229220864);
+emit_32(1118560256);
+emit_32(1112325279);
+emit_32(3229220864);
+emit_32(1119072263);
+emit_32(1111923989);
+emit_32(3229220864);
+emit_32(1119584256);
+emit_32(1111407434);
+emit_32(3229220864);
+emit_32(1120096263);
+emit_32(1110917251);
+emit_32(3229220864);
+emit_32(1120608322);
+emit_32(1110628080);
+emit_32(3229220864);
+emit_32(1121120289);
+emit_32(1110728560);
+emit_32(3229220864);
+emit_32(1121632256);
+emit_32(1110660245);
+emit_32(3229220864);
+emit_32(1122144223);
+emit_32(1110578220);
+emit_32(3229220864);
+emit_32(1122656322);
+emit_32(1110373800);
+emit_32(3229220864);
+emit_32(1123168289);
+emit_32(1109998646);
+emit_32(3229220864);
+emit_32(1123680256);
+emit_32(1109504138);
+emit_32(3229220864);
+emit_32(1124132848);
+emit_32(1109245821);
+emit_32(3229220864);
+emit_32(1124388897);
+emit_32(1109347533);
+emit_32(3229220864);
+emit_32(1124644880);
+emit_32(1108947213);
+emit_32(3229220864);
+emit_32(1124900864);
+emit_32(1108137607);
+emit_32(3229220864);
+emit_32(1125156848);
+emit_32(1107314396);
+emit_32(3229220864);
+emit_32(1125412897);
+emit_32(1106864505);
+emit_32(3229220864);
+emit_32(1125668880);
+emit_32(1107350389);
+emit_32(3229220864);
+emit_32(1125924864);
+emit_32(1107022263);
+emit_32(3229220864);
+emit_32(1126180848);
+emit_32(1107147673);
+emit_32(3229220864);
+emit_32(1126436897);
+emit_32(1107173940);
+emit_32(3229220864);
+emit_32(1126692880);
+emit_32(1106863299);
+emit_32(3229220864);
+emit_32(1126948864);
+emit_32(1106064966);
+emit_32(3229220864);
+emit_32(1127204848);
+emit_32(1105610408);
+emit_32(3229220864);
+emit_32(1127460897);
+emit_32(1105364464);
+emit_32(3229220864);
+emit_32(1127716880);
+emit_32(1104474905);
+emit_32(3229220864);
+emit_32(1127972864);
+emit_32(1103487985);
+emit_32(3229220864);
+emit_32(1128228848);
+emit_32(1102533729);
+emit_32(3229220864);
+emit_32(1128484897);
+emit_32(1101802294);
+emit_32(3229220864);
+emit_32(1128740880);
+emit_32(1100883847);
+emit_32(3229220864);
+emit_32(1128996864);
+emit_32(1100469607);
+emit_32(3229220864);
+emit_32(1129252848);
+emit_32(1100396573);
+emit_32(3229220864);
+emit_32(1129508897);
+emit_32(1100417440);
+emit_32(3229220864);
+emit_32(1129764880);
+emit_32(1100382103);
+emit_32(3229220864);
+emit_32(1130020864);
+emit_32(1100225498);
+emit_32(3229220864);
+emit_32(1130276848);
+emit_32(1100250192);
+emit_32(3229220864);
+emit_32(1130532897);
+emit_32(1099696859);
+emit_32(3229220864);
+emit_32(1130788880);
+emit_32(1099685587);
+emit_32(3229220864);
+emit_32(1131044864);
+emit_32(1099260389);
+emit_32(3229220864);
+emit_32(1131300848);
+emit_32(1097711642);
+emit_32(3229220864);
+emit_32(1131556897);
+emit_32(1095721340);
+emit_32(3229220864);
+emit_32(1131812880);
+emit_32(1095617636);
+emit_32(3229220864);
+emit_32(1132068864);
+emit_32(1094282799);
+emit_32(3229220864);
+emit_32(1081737216);
+emit_32(1111679959);
+emit_32(3237609472);
+emit_32(1090125824);
+emit_32(1111786285);
+emit_32(3237609472);
+emit_32(1094418484);
+emit_32(1112014979);
+emit_32(3237609472);
+emit_32(1098514432);
+emit_32(1112169408);
+emit_32(3237609472);
+emit_32(1100759066);
+emit_32(1112421145);
+emit_32(3237609472);
+emit_32(1102807040);
+emit_32(1112788461);
+emit_32(3237609472);
+emit_32(1104855066);
+emit_32(1112831951);
+emit_32(3237609472);
+emit_32(1106903040);
+emit_32(1113081302);
+emit_32(3237609472);
+emit_32(1108123661);
+emit_32(1113387250);
+emit_32(3237609472);
+emit_32(1109147648);
+emit_32(1113921710);
+emit_32(3237609472);
+emit_32(1110171661);
+emit_32(1113963574);
+emit_32(3237609472);
+emit_32(1111195648);
+emit_32(1114050658);
+emit_32(3237609472);
+emit_32(1112219661);
+emit_32(1113921264);
+emit_32(3237609472);
+emit_32(1113243648);
+emit_32(1114115854);
+emit_32(3237609472);
+emit_32(1114267661);
+emit_32(1114312278);
+emit_32(3237609472);
+emit_32(1115291648);
+emit_32(1114279117);
+emit_32(3237609472);
+emit_32(1116000263);
+emit_32(1113920609);
+emit_32(3237609472);
+emit_32(1116512256);
+emit_32(1113584645);
+emit_32(3237609472);
+emit_32(1117024263);
+emit_32(1113293246);
+emit_32(3237609472);
+emit_32(1117536256);
+emit_32(1113201469);
+emit_32(3237609472);
+emit_32(1118048263);
+emit_32(1112988661);
+emit_32(3237609472);
+emit_32(1118560256);
+emit_32(1112637047);
+emit_32(3237609472);
+emit_32(1119072263);
+emit_32(1112267476);
+emit_32(3237609472);
+emit_32(1119584256);
+emit_32(1111621186);
+emit_32(3237609472);
+emit_32(1120096263);
+emit_32(1110940949);
+emit_32(3237609472);
+emit_32(1120608322);
+emit_32(1110726751);
+emit_32(3237609472);
+emit_32(1121120289);
+emit_32(1110505737);
+emit_32(3237609472);
+emit_32(1121632256);
+emit_32(1110430476);
+emit_32(3237609472);
+emit_32(1122144223);
+emit_32(1110258876);
+emit_32(3237609472);
+emit_32(1122656322);
+emit_32(1110246425);
+emit_32(3237609472);
+emit_32(1123168289);
+emit_32(1110111368);
+emit_32(3237609472);
+emit_32(1123680256);
+emit_32(1109704075);
+emit_32(3237609472);
+emit_32(1124132848);
+emit_32(1109328449);
+emit_32(3237609472);
+emit_32(1124388897);
+emit_32(1109344020);
+emit_32(3237609472);
+emit_32(1124644880);
+emit_32(1109056501);
+emit_32(3237609472);
+emit_32(1124900864);
+emit_32(1108366983);
+emit_32(3237609472);
+emit_32(1125156848);
+emit_32(1107828618);
+emit_32(3237609472);
+emit_32(1125412897);
+emit_32(1107568047);
+emit_32(3237609472);
+emit_32(1125668880);
+emit_32(1107450056);
+emit_32(3237609472);
+emit_32(1125924864);
+emit_32(1107525842);
+emit_32(3237609472);
+emit_32(1126180848);
+emit_32(1107466650);
+emit_32(3237609472);
+emit_32(1126436897);
+emit_32(1107475195);
+emit_32(3237609472);
+emit_32(1126692880);
+emit_32(1107046852);
+emit_32(3237609472);
+emit_32(1126948864);
+emit_32(1106460593);
+emit_32(3237609472);
+emit_32(1127204848);
+emit_32(1105866051);
+emit_32(3237609472);
+emit_32(1127460897);
+emit_32(1105220967);
+emit_32(3237609472);
+emit_32(1127716880);
+emit_32(1104257535);
+emit_32(3237609472);
+emit_32(1127972864);
+emit_32(1103215618);
+emit_32(3237609472);
+emit_32(1128228848);
+emit_32(1102464785);
+emit_32(3237609472);
+emit_32(1128484897);
+emit_32(1101270562);
+emit_32(3237609472);
+emit_32(1128740880);
+emit_32(1100280706);
+emit_32(3237609472);
+emit_32(1128996864);
+emit_32(1099709599);
+emit_32(3237609472);
+emit_32(1129252848);
+emit_32(1100000579);
+emit_32(3237609472);
+emit_32(1129508897);
+emit_32(1100207987);
+emit_32(3237609472);
+emit_32(1129764880);
+emit_32(1100241227);
+emit_32(3237609472);
+emit_32(1130020864);
+emit_32(1100129029);
+emit_32(3237609472);
+emit_32(1130276848);
+emit_32(1099912079);
+emit_32(3237609472);
+emit_32(1130532897);
+emit_32(1099448608);
+emit_32(3237609472);
+emit_32(1130788880);
+emit_32(1099055392);
+emit_32(3237609472);
+emit_32(1131044864);
+emit_32(1098378012);
+emit_32(3237609472);
+emit_32(1131300848);
+emit_32(1096274779);
+emit_32(3237609472);
+emit_32(1131556897);
+emit_32(1096113088);
+emit_32(3237609472);
+emit_32(1131812880);
+emit_32(1094998137);
+emit_32(3237609472);
+emit_32(1132068864);
+emit_32(1093654387);
+emit_32(3237609472);
+emit_32(1081737216);
+emit_32(1111917802);
+emit_32(3241902132);
+emit_32(1090125824);
+emit_32(1112032752);
+emit_32(3241902132);
+emit_32(1094418484);
+emit_32(1112179868);
+emit_32(3241902132);
+emit_32(1098514432);
+emit_32(1112289968);
+emit_32(3241902132);
+emit_32(1100759066);
+emit_32(1112667167);
+emit_32(3241902132);
+emit_32(1102807040);
+emit_32(1112883777);
+emit_32(3241902132);
+emit_32(1104855066);
+emit_32(1113176434);
+emit_32(3241902132);
+emit_32(1106903040);
+emit_32(1113400908);
+emit_32(3241902132);
+emit_32(1108123661);
+emit_32(1113733176);
+emit_32(3241902132);
+emit_32(1109147648);
+emit_32(1114095642);
+emit_32(3241902132);
+emit_32(1110171661);
+emit_32(1114172346);
+emit_32(3241902132);
+emit_32(1111195648);
+emit_32(1114411342);
+emit_32(3241902132);
+emit_32(1112219661);
+emit_32(1114340694);
+emit_32(3241902132);
+emit_32(1113243648);
+emit_32(1114253374);
+emit_32(3241902132);
+emit_32(1114267661);
+emit_32(1114280192);
+emit_32(3241902132);
+emit_32(1115291648);
+emit_32(1114163721);
+emit_32(3241902132);
+emit_32(1116000263);
+emit_32(1114090190);
+emit_32(3241902132);
+emit_32(1116512256);
+emit_32(1113701666);
+emit_32(3241902132);
+emit_32(1117024263);
+emit_32(1113532950);
+emit_32(3241902132);
+emit_32(1117536256);
+emit_32(1113573556);
+emit_32(3241902132);
+emit_32(1118048263);
+emit_32(1113300219);
+emit_32(3241902132);
+emit_32(1118560256);
+emit_32(1112826289);
+emit_32(3241902132);
+emit_32(1119072263);
+emit_32(1112471713);
+emit_32(3241902132);
+emit_32(1119584256);
+emit_32(1111810323);
+emit_32(3241902132);
+emit_32(1120096263);
+emit_32(1110995816);
+emit_32(3241902132);
+emit_32(1120608322);
+emit_32(1110440752);
+emit_32(3241902132);
+emit_32(1121120289);
+emit_32(1110331281);
+emit_32(3241902132);
+emit_32(1121632256);
+emit_32(1110265928);
+emit_32(3241902132);
+emit_32(1122144223);
+emit_32(1110314897);
+emit_32(3241902132);
+emit_32(1122656322);
+emit_32(1110355136);
+emit_32(3241902132);
+emit_32(1123168289);
+emit_32(1110061272);
+emit_32(3241902132);
+emit_32(1123680256);
+emit_32(1109762481);
+emit_32(3241902132);
+emit_32(1124132848);
+emit_32(1109249543);
+emit_32(3241902132);
+emit_32(1124388897);
+emit_32(1109267133);
+emit_32(3241902132);
+emit_32(1124644880);
+emit_32(1108818474);
+emit_32(3241902132);
+emit_32(1124900864);
+emit_32(1108492996);
+emit_32(3241902132);
+emit_32(1125156848);
+emit_32(1108035555);
+emit_32(3241902132);
+emit_32(1125412897);
+emit_32(1107824896);
+emit_32(3241902132);
+emit_32(1125668880);
+emit_32(1107697625);
+emit_32(3241902132);
+emit_32(1125924864);
+emit_32(1107864374);
+emit_32(3241902132);
+emit_32(1126180848);
+emit_32(1107783896);
+emit_32(3241902132);
+emit_32(1126436897);
+emit_32(1107786911);
+emit_32(3241902132);
+emit_32(1126692880);
+emit_32(1107603043);
+emit_32(3241902132);
+emit_32(1126948864);
+emit_32(1106784603);
+emit_32(3241902132);
+emit_32(1127204848);
+emit_32(1106394376);
+emit_32(3241902132);
+emit_32(1127460897);
+emit_32(1105369026);
+emit_32(3241902132);
+emit_32(1127716880);
+emit_32(1104382892);
+emit_32(3241902132);
+emit_32(1127972864);
+emit_32(1103613552);
+emit_32(3241902132);
+emit_32(1128228848);
+emit_32(1102201959);
+emit_32(3241902132);
+emit_32(1128484897);
+emit_32(1100683674);
+emit_32(3241902132);
+emit_32(1128740880);
+emit_32(1100170081);
+emit_32(3241902132);
+emit_32(1128996864);
+emit_32(1099248330);
+emit_32(3241902132);
+emit_32(1129252848);
+emit_32(1098972398);
+emit_32(3241902132);
+emit_32(1129508897);
+emit_32(1099403729);
+emit_32(3241902132);
+emit_32(1129764880);
+emit_32(1099570243);
+emit_32(3241902132);
+emit_32(1130020864);
+emit_32(1099452174);
+emit_32(3241902132);
+emit_32(1130276848);
+emit_32(1099309567);
+emit_32(3241902132);
+emit_32(1130532897);
+emit_32(1098235616);
+emit_32(3241902132);
+emit_32(1130788880);
+emit_32(1097234960);
+emit_32(3241902132);
+emit_32(1131044864);
+emit_32(1096084777);
+emit_32(3241902132);
+emit_32(1131300848);
+emit_32(1095855768);
+emit_32(3241902132);
+emit_32(1131556897);
+emit_32(1095600649);
+emit_32(3241902132);
+emit_32(1131812880);
+emit_32(1095372584);
+emit_32(3241902132);
+emit_32(1132068864);
+emit_32(1094155711);
+emit_32(3241902132);
+emit_32(1081737216);
+emit_32(1112196121);
+emit_32(3245998080);
+emit_32(1090125824);
+emit_32(1112339435);
+emit_32(3245998080);
+emit_32(1094418484);
+emit_32(1112635054);
+emit_32(3245998080);
+emit_32(1098514432);
+emit_32(1112640664);
+emit_32(3245998080);
+emit_32(1100759066);
+emit_32(1112829670);
+emit_32(3245998080);
+emit_32(1102807040);
+emit_32(1113234342);
+emit_32(3245998080);
+emit_32(1104855066);
+emit_32(1113597123);
+emit_32(3245998080);
+emit_32(1106903040);
+emit_32(1113703003);
+emit_32(3245998080);
+emit_32(1108123661);
+emit_32(1113932589);
+emit_32(3245998080);
+emit_32(1109147648);
+emit_32(1114173735);
+emit_32(3245998080);
+emit_32(1110171661);
+emit_32(1114493341);
+emit_32(3245998080);
+emit_32(1111195648);
+emit_32(1114614687);
+emit_32(3245998080);
+emit_32(1112219661);
+emit_32(1114656971);
+emit_32(3245998080);
+emit_32(1113243648);
+emit_32(1114375193);
+emit_32(3245998080);
+emit_32(1114267661);
+emit_32(1114462251);
+emit_32(3245998080);
+emit_32(1115291648);
+emit_32(1114444425);
+emit_32(3245998080);
+emit_32(1116000263);
+emit_32(1114258040);
+emit_32(3245998080);
+emit_32(1116512256);
+emit_32(1113897068);
+emit_32(3245998080);
+emit_32(1117024263);
+emit_32(1113641399);
+emit_32(3245998080);
+emit_32(1117536256);
+emit_32(1113834835);
+emit_32(3245998080);
+emit_32(1118048263);
+emit_32(1113430688);
+emit_32(3245998080);
+emit_32(1118560256);
+emit_32(1112813260);
+emit_32(3245998080);
+emit_32(1119072263);
+emit_32(1112444187);
+emit_32(3245998080);
+emit_32(1119584256);
+emit_32(1111786704);
+emit_32(3245998080);
+emit_32(1120096263);
+emit_32(1111130558);
+emit_32(3245998080);
+emit_32(1120608322);
+emit_32(1110632169);
+emit_32(3245998080);
+emit_32(1121120289);
+emit_32(1110279953);
+emit_32(3245998080);
+emit_32(1121632256);
+emit_32(1110145840);
+emit_32(3245998080);
+emit_32(1122144223);
+emit_32(1110117869);
+emit_32(3245998080);
+emit_32(1122656322);
+emit_32(1109967425);
+emit_32(3245998080);
+emit_32(1123168289);
+emit_32(1109898533);
+emit_32(3245998080);
+emit_32(1123680256);
+emit_32(1109796192);
+emit_32(3245998080);
+emit_32(1124132848);
+emit_32(1109273031);
+emit_32(3245998080);
+emit_32(1124388897);
+emit_32(1109109716);
+emit_32(3245998080);
+emit_32(1124644880);
+emit_32(1108907052);
+emit_32(3245998080);
+emit_32(1124900864);
+emit_32(1108479705);
+emit_32(3245998080);
+emit_32(1125156848);
+emit_32(1108048504);
+emit_32(3245998080);
+emit_32(1125412897);
+emit_32(1108035581);
+emit_32(3245998080);
+emit_32(1125668880);
+emit_32(1107927761);
+emit_32(3245998080);
+emit_32(1125924864);
+emit_32(1108119231);
+emit_32(3245998080);
+emit_32(1126180848);
+emit_32(1108244955);
+emit_32(3245998080);
+emit_32(1126436897);
+emit_32(1108024597);
+emit_32(3245998080);
+emit_32(1126692880);
+emit_32(1107730052);
+emit_32(3245998080);
+emit_32(1126948864);
+emit_32(1107344019);
+emit_32(3245998080);
+emit_32(1127204848);
+emit_32(1106859314);
+emit_32(3245998080);
+emit_32(1127460897);
+emit_32(1105701057);
+emit_32(3245998080);
+emit_32(1127716880);
+emit_32(1104883954);
+emit_32(3245998080);
+emit_32(1127972864);
+emit_32(1103479492);
+emit_32(3245998080);
+emit_32(1128228848);
+emit_32(1101941126);
+emit_32(3245998080);
+emit_32(1128484897);
+emit_32(1100612003);
+emit_32(3245998080);
+emit_32(1128740880);
+emit_32(1099967182);
+emit_32(3245998080);
+emit_32(1128996864);
+emit_32(1099350200);
+emit_32(3245998080);
+emit_32(1129252848);
+emit_32(1098786642);
+emit_32(3245998080);
+emit_32(1129508897);
+emit_32(1098582799);
+emit_32(3245998080);
+emit_32(1129764880);
+emit_32(1098188639);
+emit_32(3245998080);
+emit_32(1130020864);
+emit_32(1098264032);
+emit_32(3245998080);
+emit_32(1130276848);
+emit_32(1097098120);
+emit_32(3245998080);
+emit_32(1130532897);
+emit_32(1096369150);
+emit_32(3245998080);
+emit_32(1130788880);
+emit_32(1096281280);
+emit_32(3245998080);
+emit_32(1131044864);
+emit_32(1096127244);
+emit_32(3245998080);
+emit_32(1131300848);
+emit_32(1096047342);
+emit_32(3245998080);
+emit_32(1131556897);
+emit_32(1096229061);
+emit_32(3245998080);
+emit_32(1131812880);
+emit_32(1095837942);
+emit_32(3245998080);
+emit_32(1132068864);
+emit_32(1094247567);
+emit_32(3245998080);
+emit_32(1081737216);
+emit_32(1112566084);
+emit_32(3248242714);
+emit_32(1090125824);
+emit_32(1112769036);
+emit_32(3248242714);
+emit_32(1094418484);
+emit_32(1113204903);
+emit_32(3248242714);
+emit_32(1098514432);
+emit_32(1113297807);
+emit_32(3248242714);
+emit_32(1100759066);
+emit_32(1113299590);
+emit_32(3248242714);
+emit_32(1102807040);
+emit_32(1113631778);
+emit_32(3248242714);
+emit_32(1104855066);
+emit_32(1113733962);
+emit_32(3248242714);
+emit_32(1106903040);
+emit_32(1114058575);
+emit_32(3248242714);
+emit_32(1108123661);
+emit_32(1114302841);
+emit_32(3248242714);
+emit_32(1109147648);
+emit_32(1114499816);
+emit_32(3248242714);
+emit_32(1110171661);
+emit_32(1114705389);
+emit_32(3248242714);
+emit_32(1111195648);
+emit_32(1114954505);
+emit_32(3248242714);
+emit_32(1112219661);
+emit_32(1114757818);
+emit_32(3248242714);
+emit_32(1113243648);
+emit_32(1114552664);
+emit_32(3248242714);
+emit_32(1114267661);
+emit_32(1114690499);
+emit_32(3248242714);
+emit_32(1115291648);
+emit_32(1114401800);
+emit_32(3248242714);
+emit_32(1116000263);
+emit_32(1114010445);
+emit_32(3248242714);
+emit_32(1116512256);
+emit_32(1113755904);
+emit_32(3248242714);
+emit_32(1117024263);
+emit_32(1113715219);
+emit_32(3248242714);
+emit_32(1117536256);
+emit_32(1113634478);
+emit_32(3248242714);
+emit_32(1118048263);
+emit_32(1113284962);
+emit_32(3248242714);
+emit_32(1118560256);
+emit_32(1112908602);
+emit_32(3248242714);
+emit_32(1119072263);
+emit_32(1112464713);
+emit_32(3248242714);
+emit_32(1119584256);
+emit_32(1111750948);
+emit_32(3248242714);
+emit_32(1120096263);
+emit_32(1111362529);
+emit_32(3248242714);
+emit_32(1120608322);
+emit_32(1110906005);
+emit_32(3248242714);
+emit_32(1121120289);
+emit_32(1110451867);
+emit_32(3248242714);
+emit_32(1121632256);
+emit_32(1110203905);
+emit_32(3248242714);
+emit_32(1122144223);
+emit_32(1110022344);
+emit_32(3248242714);
+emit_32(1122656322);
+emit_32(1109942023);
+emit_32(3248242714);
+emit_32(1123168289);
+emit_32(1109931930);
+emit_32(3248242714);
+emit_32(1123680256);
+emit_32(1109863432);
+emit_32(3248242714);
+emit_32(1124132848);
+emit_32(1109215989);
+emit_32(3248242714);
+emit_32(1124388897);
+emit_32(1109161384);
+emit_32(3248242714);
+emit_32(1124644880);
+emit_32(1108931536);
+emit_32(3248242714);
+emit_32(1124900864);
+emit_32(1108371544);
+emit_32(3248242714);
+emit_32(1125156848);
+emit_32(1108462875);
+emit_32(3248242714);
+emit_32(1125412897);
+emit_32(1108261182);
+emit_32(3248242714);
+emit_32(1125668880);
+emit_32(1108292980);
+emit_32(3248242714);
+emit_32(1125924864);
+emit_32(1108474724);
+emit_32(3248242714);
+emit_32(1126180848);
+emit_32(1108428377);
+emit_32(3248242714);
+emit_32(1126436897);
+emit_32(1108089713);
+emit_32(3248242714);
+emit_32(1126692880);
+emit_32(1107824057);
+emit_32(3248242714);
+emit_32(1126948864);
+emit_32(1107727614);
+emit_32(3248242714);
+emit_32(1127204848);
+emit_32(1107082976);
+emit_32(3248242714);
+emit_32(1127460897);
+emit_32(1106264772);
+emit_32(3248242714);
+emit_32(1127716880);
+emit_32(1105380141);
+emit_32(3248242714);
+emit_32(1127972864);
+emit_32(1103821223);
+emit_32(3248242714);
+emit_32(1128228848);
+emit_32(1102097049);
+emit_32(3248242714);
+emit_32(1128484897);
+emit_32(1100348129);
+emit_32(3248242714);
+emit_32(1128740880);
+emit_32(1099721186);
+emit_32(3248242714);
+emit_32(1128996864);
+emit_32(1098987759);
+emit_32(3248242714);
+emit_32(1129252848);
+emit_32(1098503317);
+emit_32(3248242714);
+emit_32(1129508897);
+emit_32(1097783679);
+emit_32(3248242714);
+emit_32(1129764880);
+emit_32(1097409338);
+emit_32(3248242714);
+emit_32(1130020864);
+emit_32(1096647547);
+emit_32(3248242714);
+emit_32(1130276848);
+emit_32(1096484599);
+emit_32(3248242714);
+emit_32(1130532897);
+emit_32(1095929168);
+emit_32(3248242714);
+emit_32(1130788880);
+emit_32(1096063071);
+emit_32(3248242714);
+emit_32(1131044864);
+emit_32(1096407109);
+emit_32(3248242714);
+emit_32(1131300848);
+emit_32(1095628227);
+emit_32(3248242714);
+emit_32(1131556897);
+emit_32(1095460769);
+emit_32(3248242714);
+emit_32(1131812880);
+emit_32(1095830916);
+emit_32(3248242714);
+emit_32(1132068864);
+emit_32(1094232467);
+emit_32(3248242714);
+emit_32(1081737216);
+emit_32(1113150456);
+emit_32(3250290688);
+emit_32(1090125824);
+emit_32(1113492292);
+emit_32(3250290688);
+emit_32(1094418484);
+emit_32(1113689922);
+emit_32(3250290688);
+emit_32(1098514432);
+emit_32(1113686357);
+emit_32(3250290688);
+emit_32(1100759066);
+emit_32(1113837352);
+emit_32(3250290688);
+emit_32(1102807040);
+emit_32(1113996473);
+emit_32(3250290688);
+emit_32(1104855066);
+emit_32(1114061039);
+emit_32(3250290688);
+emit_32(1106903040);
+emit_32(1114255891);
+emit_32(3250290688);
+emit_32(1108123661);
+emit_32(1114434988);
+emit_32(3250290688);
+emit_32(1109147648);
+emit_32(1114792814);
+emit_32(3250290688);
+emit_32(1110171661);
+emit_32(1114681586);
+emit_32(3250290688);
+emit_32(1111195648);
+emit_32(1114881157);
+emit_32(3250290688);
+emit_32(1112219661);
+emit_32(1114508309);
+emit_32(3250290688);
+emit_32(1113243648);
+emit_32(1114572115);
+emit_32(3250290688);
+emit_32(1114267661);
+emit_32(1114613377);
+emit_32(3250290688);
+emit_32(1115291648);
+emit_32(1114243334);
+emit_32(3250290688);
+emit_32(1116000263);
+emit_32(1114073701);
+emit_32(3250290688);
+emit_32(1116512256);
+emit_32(1113815594);
+emit_32(3250290688);
+emit_32(1117024263);
+emit_32(1113605721);
+emit_32(3250290688);
+emit_32(1117536256);
+emit_32(1113440702);
+emit_32(3250290688);
+emit_32(1118048263);
+emit_32(1112989159);
+emit_32(3250290688);
+emit_32(1118560256);
+emit_32(1112567395);
+emit_32(3250290688);
+emit_32(1119072263);
+emit_32(1112247344);
+emit_32(3250290688);
+emit_32(1119584256);
+emit_32(1112009920);
+emit_32(3250290688);
+emit_32(1120096263);
+emit_32(1111470454);
+emit_32(3250290688);
+emit_32(1120608322);
+emit_32(1110996838);
+emit_32(3250290688);
+emit_32(1121120289);
+emit_32(1110568495);
+emit_32(3250290688);
+emit_32(1121632256);
+emit_32(1110151633);
+emit_32(3250290688);
+emit_32(1122144223);
+emit_32(1109917460);
+emit_32(3250290688);
+emit_32(1122656322);
+emit_32(1109701663);
+emit_32(3250290688);
+emit_32(1123168289);
+emit_32(1109686721);
+emit_32(3250290688);
+emit_32(1123680256);
+emit_32(1109370549);
+emit_32(3250290688);
+emit_32(1124132848);
+emit_32(1109357783);
+emit_32(3250290688);
+emit_32(1124388897);
+emit_32(1109361348);
+emit_32(3250290688);
+emit_32(1124644880);
+emit_32(1108962627);
+emit_32(3250290688);
+emit_32(1124900864);
+emit_32(1108736108);
+emit_32(3250290688);
+emit_32(1125156848);
+emit_32(1108614185);
+emit_32(3250290688);
+emit_32(1125412897);
+emit_32(1108533864);
+emit_32(3250290688);
+emit_32(1125668880);
+emit_32(1108590068);
+emit_32(3250290688);
+emit_32(1125924864);
+emit_32(1108802404);
+emit_32(3250290688);
+emit_32(1126180848);
+emit_32(1108700955);
+emit_32(3250290688);
+emit_32(1126436897);
+emit_32(1108392988);
+emit_32(3250290688);
+emit_32(1126692880);
+emit_32(1108021871);
+emit_32(3250290688);
+emit_32(1126948864);
+emit_32(1107615521);
+emit_32(3250290688);
+emit_32(1127204848);
+emit_32(1107132835);
+emit_32(3250290688);
+emit_32(1127460897);
+emit_32(1106307239);
+emit_32(3250290688);
+emit_32(1127716880);
+emit_32(1105259659);
+emit_32(3250290688);
+emit_32(1127972864);
+emit_32(1103882145);
+emit_32(3250290688);
+emit_32(1128228848);
+emit_32(1102498916);
+emit_32(3250290688);
+emit_32(1128484897);
+emit_32(1100712509);
+emit_32(3250290688);
+emit_32(1128740880);
+emit_32(1099497629);
+emit_32(3250290688);
+emit_32(1128996864);
+emit_32(1097686476);
+emit_32(3250290688);
+emit_32(1129252848);
+emit_32(1096996199);
+emit_32(3250290688);
+emit_32(1129508897);
+emit_32(1096729441);
+emit_32(3250290688);
+emit_32(1129764880);
+emit_32(1096118855);
+emit_32(3250290688);
+emit_32(1130020864);
+emit_32(1095816970);
+emit_32(3250290688);
+emit_32(1130276848);
+emit_32(1095839934);
+emit_32(3250290688);
+emit_32(1130532897);
+emit_32(1095807218);
+emit_32(3250290688);
+emit_32(1130788880);
+emit_32(1096112249);
+emit_32(3250290688);
+emit_32(1131044864);
+emit_32(1096393372);
+emit_32(3250290688);
+emit_32(1131300848);
+emit_32(1096168558);
+emit_32(3250290688);
+emit_32(1131556897);
+emit_32(1095322776);
+emit_32(3250290688);
+emit_32(1131812880);
+emit_32(1094576924);
+emit_32(3250290688);
+emit_32(1132068864);
+emit_32(1094020760);
+emit_32(3250290688);
+emit_32(1081737216);
+emit_32(1113988085);
+emit_32(3252338714);
+emit_32(1090125824);
+emit_32(1114065260);
+emit_32(3252338714);
+emit_32(1094418484);
+emit_32(1113997338);
+emit_32(3252338714);
+emit_32(1098514432);
+emit_32(1114054171);
+emit_32(3252338714);
+emit_32(1100759066);
+emit_32(1114320378);
+emit_32(3252338714);
+emit_32(1102807040);
+emit_32(1114467126);
+emit_32(3252338714);
+emit_32(1104855066);
+emit_32(1114435984);
+emit_32(3252338714);
+emit_32(1106903040);
+emit_32(1114341953);
+emit_32(3252338714);
+emit_32(1108123661);
+emit_32(1114299407);
+emit_32(3252338714);
+emit_32(1109147648);
+emit_32(1114563438);
+emit_32(3252338714);
+emit_32(1110171661);
+emit_32(1114648268);
+emit_32(3252338714);
+emit_32(1111195648);
+emit_32(1114546084);
+emit_32(3252338714);
+emit_32(1112219661);
+emit_32(1114619144);
+emit_32(3252338714);
+emit_32(1113243648);
+emit_32(1114743636);
+emit_32(3252338714);
+emit_32(1114267661);
+emit_32(1114455592);
+emit_32(3252338714);
+emit_32(1115291648);
+emit_32(1114088040);
+emit_32(3252338714);
+emit_32(1116000263);
+emit_32(1113929390);
+emit_32(3252338714);
+emit_32(1116512256);
+emit_32(1113476511);
+emit_32(3252338714);
+emit_32(1117024263);
+emit_32(1113251303);
+emit_32(3252338714);
+emit_32(1117536256);
+emit_32(1113169592);
+emit_32(3252338714);
+emit_32(1118048263);
+emit_32(1112818162);
+emit_32(3252338714);
+emit_32(1118560256);
+emit_32(1112268839);
+emit_32(3252338714);
+emit_32(1119072263);
+emit_32(1111908916);
+emit_32(3252338714);
+emit_32(1119584256);
+emit_32(1111826550);
+emit_32(3252338714);
+emit_32(1120096263);
+emit_32(1111731418);
+emit_32(3252338714);
+emit_32(1120608322);
+emit_32(1111230146);
+emit_32(3252338714);
+emit_32(1121120289);
+emit_32(1110553815);
+emit_32(3252338714);
+emit_32(1121632256);
+emit_32(1110036683);
+emit_32(3252338714);
+emit_32(1122144223);
+emit_32(1109799364);
+emit_32(3252338714);
+emit_32(1122656322);
+emit_32(1109771393);
+emit_32(3252338714);
+emit_32(1123168289);
+emit_32(1109709003);
+emit_32(3252338714);
+emit_32(1123680256);
+emit_32(1109442691);
+emit_32(3252338714);
+emit_32(1124132848);
+emit_32(1109517769);
+emit_32(3252338714);
+emit_32(1124388897);
+emit_32(1109424524);
+emit_32(3252338714);
+emit_32(1124644880);
+emit_32(1109080277);
+emit_32(3252338714);
+emit_32(1124900864);
+emit_32(1108875411);
+emit_32(3252338714);
+emit_32(1125156848);
+emit_32(1108744733);
+emit_32(3252338714);
+emit_32(1125412897);
+emit_32(1108572268);
+emit_32(3252338714);
+emit_32(1125668880);
+emit_32(1108842041);
+emit_32(3252338714);
+emit_32(1125924864);
+emit_32(1108992537);
+emit_32(3252338714);
+emit_32(1126180848);
+emit_32(1108824136);
+emit_32(3252338714);
+emit_32(1126436897);
+emit_32(1108504583);
+emit_32(3252338714);
+emit_32(1126692880);
+emit_32(1107939112);
+emit_32(3252338714);
+emit_32(1126948864);
+emit_32(1107373221);
+emit_32(3252338714);
+emit_32(1127204848);
+emit_32(1107163454);
+emit_32(3252338714);
+emit_32(1127460897);
+emit_32(1106219106);
+emit_32(3252338714);
+emit_32(1127716880);
+emit_32(1105070444);
+emit_32(3252338714);
+emit_32(1127972864);
+emit_32(1103725960);
+emit_32(3252338714);
+emit_32(1128228848);
+emit_32(1102334919);
+emit_32(3252338714);
+emit_32(1128484897);
+emit_32(1100777102);
+emit_32(3252338714);
+emit_32(1128740880);
+emit_32(1099662937);
+emit_32(3252338714);
+emit_32(1128996864);
+emit_32(1098431490);
+emit_32(3252338714);
+emit_32(1129252848);
+emit_32(1097775186);
+emit_32(3252338714);
+emit_32(1129508897);
+emit_32(1096256848);
+emit_32(3252338714);
+emit_32(1129764880);
+emit_32(1095754895);
+emit_32(3252338714);
+emit_32(1130020864);
+emit_32(1096060659);
+emit_32(3252338714);
+emit_32(1130276848);
+emit_32(1095067238);
+emit_32(3252338714);
+emit_32(1130532897);
+emit_32(1094771330);
+emit_32(3252338714);
+emit_32(1130788880);
+emit_32(1095212047);
+emit_32(3252338714);
+emit_32(1131044864);
+emit_32(1094803207);
+emit_32(3252338714);
+emit_32(1131300848);
+emit_32(1094921801);
+emit_32(3252338714);
+emit_32(1131556897);
+emit_32(1094618028);
+emit_32(3252338714);
+emit_32(1131812880);
+emit_32(1093381757);
+emit_32(3252338714);
+emit_32(1132068864);
+emit_32(1092728180);
+emit_32(3252338714);
+emit_32(1081737216);
+emit_32(1114484349);
+emit_32(3254386688);
+emit_32(1090125824);
+emit_32(1114516331);
+emit_32(3254386688);
+emit_32(1094418484);
+emit_32(1114316079);
+emit_32(3254386688);
+emit_32(1098514432);
+emit_32(1114579953);
+emit_32(3254386688);
+emit_32(1100759066);
+emit_32(1114764660);
+emit_32(3254386688);
+emit_32(1102807040);
+emit_32(1114796065);
+emit_32(3254386688);
+emit_32(1104855066);
+emit_32(1114724998);
+emit_32(3254386688);
+emit_32(1106903040);
+emit_32(1114516881);
+emit_32(3254386688);
+emit_32(1108123661);
+emit_32(1114291254);
+emit_32(3254386688);
+emit_32(1109147648);
+emit_32(1114334036);
+emit_32(3254386688);
+emit_32(1110171661);
+emit_32(1114475987);
+emit_32(3254386688);
+emit_32(1111195648);
+emit_32(1114491322);
+emit_32(3254386688);
+emit_32(1112219661);
+emit_32(1114531378);
+emit_32(3254386688);
+emit_32(1113243648);
+emit_32(1114372755);
+emit_32(3254386688);
+emit_32(1114267661);
+emit_32(1114308136);
+emit_32(3254386688);
+emit_32(1115291648);
+emit_32(1113743609);
+emit_32(3254386688);
+emit_32(1116000263);
+emit_32(1113664809);
+emit_32(3254386688);
+emit_32(1116512256);
+emit_32(1113231799);
+emit_32(3254386688);
+emit_32(1117024263);
+emit_32(1112995057);
+emit_32(3254386688);
+emit_32(1117536256);
+emit_32(1112878744);
+emit_32(3254386688);
+emit_32(1118048263);
+emit_32(1112754959);
+emit_32(3254386688);
+emit_32(1118560256);
+emit_32(1112570436);
+emit_32(3254386688);
+emit_32(1119072263);
+emit_32(1112364417);
+emit_32(3254386688);
+emit_32(1119584256);
+emit_32(1111993903);
+emit_32(3254386688);
+emit_32(1120096263);
+emit_32(1111795748);
+emit_32(3254386688);
+emit_32(1120608322);
+emit_32(1111345490);
+emit_32(3254386688);
+emit_32(1121120289);
+emit_32(1110601525);
+emit_32(3254386688);
+emit_32(1121632256);
+emit_32(1110149693);
+emit_32(3254386688);
+emit_32(1122144223);
+emit_32(1110165946);
+emit_32(3254386688);
+emit_32(1122656322);
+emit_32(1109981554);
+emit_32(3254386688);
+emit_32(1123168289);
+emit_32(1109825395);
+emit_32(3254386688);
+emit_32(1123680256);
+emit_32(1109816797);
+emit_32(3254386688);
+emit_32(1124132848);
+emit_32(1109710052);
+emit_32(3254386688);
+emit_32(1124388897);
+emit_32(1109602468);
+emit_32(3254386688);
+emit_32(1124644880);
+emit_32(1109349918);
+emit_32(3254386688);
+emit_32(1124900864);
+emit_32(1109069634);
+emit_32(3254386688);
+emit_32(1125156848);
+emit_32(1108800622);
+emit_32(3254386688);
+emit_32(1125412897);
+emit_32(1108662341);
+emit_32(3254386688);
+emit_32(1125668880);
+emit_32(1108955051);
+emit_32(3254386688);
+emit_32(1125924864);
+emit_32(1109069896);
+emit_32(3254386688);
+emit_32(1126180848);
+emit_32(1108753986);
+emit_32(3254386688);
+emit_32(1126436897);
+emit_32(1108343941);
+emit_32(3254386688);
+emit_32(1126692880);
+emit_32(1107751600);
+emit_32(3254386688);
+emit_32(1126948864);
+emit_32(1107299113);
+emit_32(3254386688);
+emit_32(1127204848);
+emit_32(1106833257);
+emit_32(3254386688);
+emit_32(1127460897);
+emit_32(1106258742);
+emit_32(3254386688);
+emit_32(1127716880);
+emit_32(1104970147);
+emit_32(3254386688);
+emit_32(1127972864);
+emit_32(1103641549);
+emit_32(3254386688);
+emit_32(1128228848);
+emit_32(1102486700);
+emit_32(3254386688);
+emit_32(1128484897);
+emit_32(1100950903);
+emit_32(3254386688);
+emit_32(1128740880);
+emit_32(1099783943);
+emit_32(3254386688);
+emit_32(1128996864);
+emit_32(1099048105);
+emit_32(3254386688);
+emit_32(1129252848);
+emit_32(1097916324);
+emit_32(3254386688);
+emit_32(1129508897);
+emit_32(1096849293);
+emit_32(3254386688);
+emit_32(1129764880);
+emit_32(1095290166);
+emit_32(3254386688);
+emit_32(1130020864);
+emit_32(1094873566);
+emit_32(3254386688);
+emit_32(1130276848);
+emit_32(1094773742);
+emit_32(3254386688);
+emit_32(1130532897);
+emit_32(1093963298);
+emit_32(3254386688);
+emit_32(1130788880);
+emit_32(1094288251);
+emit_32(3254386688);
+emit_32(1131044864);
+emit_32(1093582560);
+emit_32(3254386688);
+emit_32(1131300848);
+emit_32(1093578994);
+emit_32(3254386688);
+emit_32(1131556897);
+emit_32(1093961096);
+emit_32(3254386688);
+emit_32(1131812880);
+emit_32(1094270950);
+emit_32(3254386688);
+emit_32(1132068864);
+emit_32(1094226805);
+emit_32(3254386688);
+emit_32(1081737216);
+emit_32(1114694274);
+emit_32(3255607309);
+emit_32(1090125824);
+emit_32(1114471950);
+emit_32(3255607309);
+emit_32(1094418484);
+emit_32(1114251644);
+emit_32(3255607309);
+emit_32(1098514432);
+emit_32(1114525794);
+emit_32(3255607309);
+emit_32(1100759066);
+emit_32(1114675374);
+emit_32(3255607309);
+emit_32(1102807040);
+emit_32(1114775146);
+emit_32(3255607309);
+emit_32(1104855066);
+emit_32(1114776168);
+emit_32(3255607309);
+emit_32(1106903040);
+emit_32(1114678755);
+emit_32(3255607309);
+emit_32(1108123661);
+emit_32(1114267373);
+emit_32(3255607309);
+emit_32(1109147648);
+emit_32(1114095459);
+emit_32(3255607309);
+emit_32(1110171661);
+emit_32(1114227474);
+emit_32(3255607309);
+emit_32(1111195648);
+emit_32(1114305305);
+emit_32(3255607309);
+emit_32(1112219661);
+emit_32(1114012333);
+emit_32(3255607309);
+emit_32(1113243648);
+emit_32(1113935761);
+emit_32(3255607309);
+emit_32(1114267661);
+emit_32(1113756087);
+emit_32(3255607309);
+emit_32(1115291648);
+emit_32(1113651780);
+emit_32(3255607309);
+emit_32(1116000263);
+emit_32(1113622315);
+emit_32(3255607309);
+emit_32(1116512256);
+emit_32(1113238353);
+emit_32(3255607309);
+emit_32(1117024263);
+emit_32(1112877931);
+emit_32(3255607309);
+emit_32(1117536256);
+emit_32(1112868625);
+emit_32(3255607309);
+emit_32(1118048263);
+emit_32(1112560842);
+emit_32(3255607309);
+emit_32(1118560256);
+emit_32(1112530249);
+emit_32(3255607309);
+emit_32(1119072263);
+emit_32(1112251957);
+emit_32(3255607309);
+emit_32(1119584256);
+emit_32(1111883697);
+emit_32(3255607309);
+emit_32(1120096263);
+emit_32(1111510168);
+emit_32(3255607309);
+emit_32(1120608322);
+emit_32(1111049686);
+emit_32(3255607309);
+emit_32(1121120289);
+emit_32(1110465000);
+emit_32(3255607309);
+emit_32(1121632256);
+emit_32(1110143926);
+emit_32(3255607309);
+emit_32(1122144223);
+emit_32(1110128565);
+emit_32(3255607309);
+emit_32(1122656322);
+emit_32(1110170613);
+emit_32(3255607309);
+emit_32(1123168289);
+emit_32(1110002133);
+emit_32(3255607309);
+emit_32(1123680256);
+emit_32(1109827938);
+emit_32(3255607309);
+emit_32(1124132848);
+emit_32(1109697652);
+emit_32(3255607309);
+emit_32(1124388897);
+emit_32(1109285929);
+emit_32(3255607309);
+emit_32(1124644880);
+emit_32(1109015973);
+emit_32(3255607309);
+emit_32(1124900864);
+emit_32(1108853103);
+emit_32(3255607309);
+emit_32(1125156848);
+emit_32(1108675186);
+emit_32(3255607309);
+emit_32(1125412897);
+emit_32(1108706171);
+emit_32(3255607309);
+emit_32(1125668880);
+emit_32(1108840441);
+emit_32(3255607309);
+emit_32(1125924864);
+emit_32(1108822485);
+emit_32(3255607309);
+emit_32(1126180848);
+emit_32(1108425782);
+emit_32(3255607309);
+emit_32(1126436897);
+emit_32(1108131997);
+emit_32(3255607309);
+emit_32(1126692880);
+emit_32(1107626584);
+emit_32(3255607309);
+emit_32(1126948864);
+emit_32(1107199630);
+emit_32(3255607309);
+emit_32(1127204848);
+emit_32(1106951065);
+emit_32(3255607309);
+emit_32(1127460897);
+emit_32(1106261574);
+emit_32(3255607309);
+emit_32(1127716880);
+emit_32(1104881543);
+emit_32(3255607309);
+emit_32(1127972864);
+emit_32(1103438021);
+emit_32(3255607309);
+emit_32(1128228848);
+emit_32(1102185759);
+emit_32(3255607309);
+emit_32(1128484897);
+emit_32(1101110234);
+emit_32(3255607309);
+emit_32(1128740880);
+emit_32(1100328678);
+emit_32(3255607309);
+emit_32(1128996864);
+emit_32(1099613287);
+emit_32(3255607309);
+emit_32(1129252848);
+emit_32(1098156658);
+emit_32(3255607309);
+emit_32(1129508897);
+emit_32(1096407528);
+emit_32(3255607309);
+emit_32(1129764880);
+emit_32(1096170131);
+emit_32(3255607309);
+emit_32(1130020864);
+emit_32(1095690512);
+emit_32(3255607309);
+emit_32(1130276848);
+emit_32(1094209084);
+emit_32(3255607309);
+emit_32(1130532897);
+emit_32(1093127687);
+emit_32(3255607309);
+emit_32(1130788880);
+emit_32(1092438259);
+emit_32(3255607309);
+emit_32(1131044864);
+emit_32(1092531729);
+emit_32(3255607309);
+emit_32(1131300848);
+emit_32(1093627753);
+emit_32(3255607309);
+emit_32(1131556897);
+emit_32(1094279863);
+emit_32(3255607309);
+emit_32(1131812880);
+emit_32(1094536449);
+emit_32(3255607309);
+emit_32(1132068864);
+emit_32(1094652422);
+emit_32(3255607309);
+emit_32(1081737216);
+emit_32(1114612538);
+emit_32(3256631296);
+emit_32(1090125824);
+emit_32(1114274713);
+emit_32(3256631296);
+emit_32(1094418484);
+emit_32(1114042532);
+emit_32(3256631296);
+emit_32(1098514432);
+emit_32(1114371758);
+emit_32(3256631296);
+emit_32(1100759066);
+emit_32(1114654061);
+emit_32(3256631296);
+emit_32(1102807040);
+emit_32(1114778344);
+emit_32(3256631296);
+emit_32(1104855066);
+emit_32(1114758762);
+emit_32(3256631296);
+emit_32(1106903040);
+emit_32(1114526817);
+emit_32(3256631296);
+emit_32(1108123661);
+emit_32(1114218640);
+emit_32(3256631296);
+emit_32(1109147648);
+emit_32(1113983497);
+emit_32(3256631296);
+emit_32(1110171661);
+emit_32(1114023684);
+emit_32(3256631296);
+emit_32(1111195648);
+emit_32(1114065102);
+emit_32(3256631296);
+emit_32(1112219661);
+emit_32(1113899585);
+emit_32(3256631296);
+emit_32(1113243648);
+emit_32(1113503538);
+emit_32(3256631296);
+emit_32(1114267661);
+emit_32(1113409769);
+emit_32(3256631296);
+emit_32(1115291648);
+emit_32(1113402665);
+emit_32(3256631296);
+emit_32(1116000263);
+emit_32(1113537931);
+emit_32(3256631296);
+emit_32(1116512256);
+emit_32(1113144426);
+emit_32(3256631296);
+emit_32(1117024263);
+emit_32(1112966772);
+emit_32(3256631296);
+emit_32(1117536256);
+emit_32(1112729086);
+emit_32(3256631296);
+emit_32(1118048263);
+emit_32(1112420463);
+emit_32(3256631296);
+emit_32(1118560256);
+emit_32(1112416322);
+emit_32(3256631296);
+emit_32(1119072263);
+emit_32(1112175306);
+emit_32(3256631296);
+emit_32(1119584256);
+emit_32(1112112733);
+emit_32(3256631296);
+emit_32(1120096263);
+emit_32(1111723265);
+emit_32(3256631296);
+emit_32(1120608322);
+emit_32(1111230539);
+emit_32(3256631296);
+emit_32(1121120289);
+emit_32(1110568521);
+emit_32(3256631296);
+emit_32(1121632256);
+emit_32(1110333220);
+emit_32(3256631296);
+emit_32(1122144223);
+emit_32(1110249780);
+emit_32(3256631296);
+emit_32(1122656322);
+emit_32(1110285117);
+emit_32(3256631296);
+emit_32(1123168289);
+emit_32(1109907735);
+emit_32(3256631296);
+emit_32(1123680256);
+emit_32(1109777213);
+emit_32(3256631296);
+emit_32(1124132848);
+emit_32(1109451630);
+emit_32(3256631296);
+emit_32(1124388897);
+emit_32(1109111184);
+emit_32(3256631296);
+emit_32(1124644880);
+emit_32(1108792102);
+emit_32(3256631296);
+emit_32(1124900864);
+emit_32(1108776190);
+emit_32(3256631296);
+emit_32(1125156848);
+emit_32(1108834805);
+emit_32(3256631296);
+emit_32(1125412897);
+emit_32(1108715477);
+emit_32(3256631296);
+emit_32(1125668880);
+emit_32(1108660453);
+emit_32(3256631296);
+emit_32(1125924864);
+emit_32(1108548623);
+emit_32(3256631296);
+emit_32(1126180848);
+emit_32(1108317621);
+emit_32(3256631296);
+emit_32(1126436897);
+emit_32(1107958091);
+emit_32(3256631296);
+emit_32(1126692880);
+emit_32(1107488198);
+emit_32(3256631296);
+emit_32(1126948864);
+emit_32(1107323624);
+emit_32(3256631296);
+emit_32(1127204848);
+emit_32(1106940264);
+emit_32(3256631296);
+emit_32(1127460897);
+emit_32(1106131026);
+emit_32(3256631296);
+emit_32(1127716880);
+emit_32(1104537505);
+emit_32(3256631296);
+emit_32(1127972864);
+emit_32(1103113277);
+emit_32(3256631296);
+emit_32(1128228848);
+emit_32(1102198604);
+emit_32(3256631296);
+emit_32(1128484897);
+emit_32(1101660003);
+emit_32(3256631296);
+emit_32(1128740880);
+emit_32(1100980106);
+emit_32(3256631296);
+emit_32(1128996864);
+emit_32(1100131808);
+emit_32(3256631296);
+emit_32(1129252848);
+emit_32(1099325034);
+emit_32(3256631296);
+emit_32(1129508897);
+emit_32(1097933521);
+emit_32(3256631296);
+emit_32(1129764880);
+emit_32(1096350800);
+emit_32(3256631296);
+emit_32(1130020864);
+emit_32(1095937976);
+emit_32(3256631296);
+emit_32(1130276848);
+emit_32(1093950924);
+emit_32(3256631296);
+emit_32(1130532897);
+emit_32(1093143101);
+emit_32(3256631296);
+emit_32(1130788880);
+emit_32(1092323492);
+emit_32(3256631296);
+emit_32(1131044864);
+emit_32(1092516462);
+emit_32(3256631296);
+emit_32(1131300848);
+emit_32(1093374417);
+emit_32(3256631296);
+emit_32(1131556897);
+emit_32(1093934567);
+emit_32(3256631296);
+emit_32(1131812880);
+emit_32(1094793141);
+emit_32(3256631296);
+emit_32(1132068864);
+emit_32(1094610584);
+emit_32(3256631296);
+emit_32(1081737216);
+emit_32(1114510642);
+emit_32(3257655309);
+emit_32(1090125824);
+emit_32(1114177090);
+emit_32(3257655309);
+emit_32(1094418484);
+emit_32(1114130088);
+emit_32(3257655309);
+emit_32(1098514432);
+emit_32(1114485503);
+emit_32(3257655309);
+emit_32(1100759066);
+emit_32(1114774202);
+emit_32(3257655309);
+emit_32(1102807040);
+emit_32(1114811400);
+emit_32(3257655309);
+emit_32(1104855066);
+emit_32(1114642894);
+emit_32(3257655309);
+emit_32(1106903040);
+emit_32(1114125710);
+emit_32(3257655309);
+emit_32(1108123661);
+emit_32(1113782380);
+emit_32(3257655309);
+emit_32(1109147648);
+emit_32(1113903464);
+emit_32(3257655309);
+emit_32(1110171661);
+emit_32(1113893372);
+emit_32(3257655309);
+emit_32(1111195648);
+emit_32(1113835831);
+emit_32(3257655309);
+emit_32(1112219661);
+emit_32(1113519056);
+emit_32(3257655309);
+emit_32(1113243648);
+emit_32(1113402219);
+emit_32(3257655309);
+emit_32(1114267661);
+emit_32(1113222650);
+emit_32(3257655309);
+emit_32(1115291648);
+emit_32(1113112760);
+emit_32(3257655309);
+emit_32(1116000263);
+emit_32(1112977441);
+emit_32(3257655309);
+emit_32(1116512256);
+emit_32(1112883121);
+emit_32(3257655309);
+emit_32(1117024263);
+emit_32(1112823615);
+emit_32(3257655309);
+emit_32(1117536256);
+emit_32(1112700957);
+emit_32(3257655309);
+emit_32(1118048263);
+emit_32(1112438473);
+emit_32(3257655309);
+emit_32(1118560256);
+emit_32(1112053645);
+emit_32(3257655309);
+emit_32(1119072263);
+emit_32(1111879136);
+emit_32(3257655309);
+emit_32(1119584256);
+emit_32(1112020641);
+emit_32(3257655309);
+emit_32(1120096263);
+emit_32(1111750895);
+emit_32(3257655309);
+emit_32(1120608322);
+emit_32(1111255810);
+emit_32(3257655309);
+emit_32(1121120289);
+emit_32(1110557852);
+emit_32(3257655309);
+emit_32(1121632256);
+emit_32(1110574917);
+emit_32(3257655309);
+emit_32(1122144223);
+emit_32(1110468329);
+emit_32(3257655309);
+emit_32(1122656322);
+emit_32(1110138264);
+emit_32(3257655309);
+emit_32(1123168289);
+emit_32(1110059752);
+emit_32(3257655309);
+emit_32(1123680256);
+emit_32(1109798447);
+emit_32(3257655309);
+emit_32(1124132848);
+emit_32(1109243252);
+emit_32(3257655309);
+emit_32(1124388897);
+emit_32(1109362344);
+emit_32(3257655309);
+emit_32(1124644880);
+emit_32(1109167073);
+emit_32(3257655309);
+emit_32(1124900864);
+emit_32(1109064601);
+emit_32(3257655309);
+emit_32(1125156848);
+emit_32(1108980715);
+emit_32(3257655309);
+emit_32(1125412897);
+emit_32(1108866472);
+emit_32(3257655309);
+emit_32(1125668880);
+emit_32(1108651960);
+emit_32(3257655309);
+emit_32(1125924864);
+emit_32(1108356130);
+emit_32(3257655309);
+emit_32(1126180848);
+emit_32(1108103240);
+emit_32(3257655309);
+emit_32(1126436897);
+emit_32(1107651828);
+emit_32(3257655309);
+emit_32(1126692880);
+emit_32(1107336154);
+emit_32(3257655309);
+emit_32(1126948864);
+emit_32(1106756135);
+emit_32(3257655309);
+emit_32(1127204848);
+emit_32(1106100145);
+emit_32(3257655309);
+emit_32(1127460897);
+emit_32(1105225790);
+emit_32(3257655309);
+emit_32(1127716880);
+emit_32(1104058987);
+emit_32(3257655309);
+emit_32(1127972864);
+emit_32(1103547702);
+emit_32(3257655309);
+emit_32(1128228848);
+emit_32(1102526860);
+emit_32(3257655309);
+emit_32(1128484897);
+emit_32(1101431308);
+emit_32(3257655309);
+emit_32(1128740880);
+emit_32(1100829216);
+emit_32(3257655309);
+emit_32(1128996864);
+emit_32(1100205418);
+emit_32(3257655309);
+emit_32(1129252848);
+emit_32(1099550373);
+emit_32(3257655309);
+emit_32(1129508897);
+emit_32(1098506148);
+emit_32(3257655309);
+emit_32(1129764880);
+emit_32(1096071564);
+emit_32(3257655309);
+emit_32(1130020864);
+emit_32(1095937976);
+emit_32(3257655309);
+emit_32(1130276848);
+emit_32(1093431145);
+emit_32(3257655309);
+emit_32(1130532897);
+emit_32(1092220816);
+emit_32(3257655309);
+emit_32(1130788880);
+emit_32(1091857117);
+emit_32(3257655309);
+emit_32(1131044864);
+emit_32(1092062974);
+emit_32(3257655309);
+emit_32(1131300848);
+emit_32(1092869004);
+emit_32(3257655309);
+emit_32(1131556897);
+emit_32(1094057460);
+emit_32(3257655309);
+emit_32(1131812880);
+emit_32(1093644845);
+emit_32(3257655309);
+emit_32(1132068864);
+emit_32(1092544669);
+emit_32(3257655309);
+emit_32(1081737216);
+emit_32(1114350184);
+emit_32(3258679296);
+emit_32(1090125824);
+emit_32(1114346619);
+emit_32(3258679296);
+emit_32(1094418484);
+emit_32(1114421513);
+emit_32(3258679296);
+emit_32(1098514432);
+emit_32(1114700304);
+emit_32(3258679296);
+emit_32(1100759066);
+emit_32(1114796563);
+emit_32(3258679296);
+emit_32(1102807040);
+emit_32(1114621582);
+emit_32(3258679296);
+emit_32(1104855066);
+emit_32(1114296549);
+emit_32(3258679296);
+emit_32(1106903040);
+emit_32(1114209753);
+emit_32(3258679296);
+emit_32(1108123661);
+emit_32(1113856567);
+emit_32(3258679296);
+emit_32(1109147648);
+emit_32(1113867944);
+emit_32(3258679296);
+emit_32(1110171661);
+emit_32(1113863907);
+emit_32(3258679296);
+emit_32(1111195648);
+emit_32(1113532976);
+emit_32(3258679296);
+emit_32(1112219661);
+emit_32(1113290808);
+emit_32(3258679296);
+emit_32(1113243648);
+emit_32(1113017942);
+emit_32(3258679296);
+emit_32(1114267661);
+emit_32(1112948867);
+emit_32(3258679296);
+emit_32(1115291648);
+emit_32(1112695872);
+emit_32(3258679296);
+emit_32(1116000263);
+emit_32(1112643627);
+emit_32(3258679296);
+emit_32(1116512256);
+emit_32(1112588707);
+emit_32(3258679296);
+emit_32(1117024263);
+emit_32(1112603833);
+emit_32(3258679296);
+emit_32(1117536256);
+emit_32(1112628213);
+emit_32(3258679296);
+emit_32(1118048263);
+emit_32(1112273715);
+emit_32(3258679296);
+emit_32(1118560256);
+emit_32(1111859449);
+emit_32(3258679296);
+emit_32(1119072263);
+emit_32(1111576936);
+emit_32(3258679296);
+emit_32(1119584256);
+emit_32(1111726726);
+emit_32(3258679296);
+emit_32(1120096263);
+emit_32(1111402296);
+emit_32(3258679296);
+emit_32(1120608322);
+emit_32(1110549489);
+emit_32(3258679296);
+emit_32(1121120289);
+emit_32(1110448511);
+emit_32(3258679296);
+emit_32(1121632256);
+emit_32(1110373695);
+emit_32(3258679296);
+emit_32(1122144223);
+emit_32(1110467333);
+emit_32(3258679296);
+emit_32(1122656322);
+emit_32(1110274028);
+emit_32(3258679296);
+emit_32(1123168289);
+emit_32(1109946532);
+emit_32(3258679296);
+emit_32(1123680256);
+emit_32(1109626795);
+emit_32(3258679296);
+emit_32(1124132848);
+emit_32(1109494622);
+emit_32(3258679296);
+emit_32(1124388897);
+emit_32(1109413069);
+emit_32(3258679296);
+emit_32(1124644880);
+emit_32(1109297647);
+emit_32(3258679296);
+emit_32(1124900864);
+emit_32(1109062294);
+emit_32(3258679296);
+emit_32(1125156848);
+emit_32(1108844007);
+emit_32(3258679296);
+emit_32(1125412897);
+emit_32(1108568860);
+emit_32(3258679296);
+emit_32(1125668880);
+emit_32(1108450004);
+emit_32(3258679296);
+emit_32(1125924864);
+emit_32(1108186943);
+emit_32(3258679296);
+emit_32(1126180848);
+emit_32(1107845369);
+emit_32(3258679296);
+emit_32(1126436897);
+emit_32(1107362972);
+emit_32(3258679296);
+emit_32(1126692880);
+emit_32(1106252189);
+emit_32(3258679296);
+emit_32(1126948864);
+emit_32(1105829298);
+emit_32(3258679296);
+emit_32(1127204848);
+emit_32(1105218083);
+emit_32(3258679296);
+emit_32(1127460897);
+emit_32(1104523506);
+emit_32(3258679296);
+emit_32(1127716880);
+emit_32(1104128351);
+emit_32(3258679296);
+emit_32(1127972864);
+emit_32(1103796214);
+emit_32(3258679296);
+emit_32(1128228848);
+emit_32(1103027818);
+emit_32(3258679296);
+emit_32(1128484897);
+emit_32(1101322309);
+emit_32(3258679296);
+emit_32(1128740880);
+emit_32(1100681576);
+emit_32(3258679296);
+emit_32(1128996864);
+emit_32(1099668023);
+emit_32(3258679296);
+emit_32(1129252848);
+emit_32(1099208380);
+emit_32(3258679296);
+emit_32(1129508897);
+emit_32(1097801400);
+emit_32(3258679296);
+emit_32(1129764880);
+emit_32(1095333472);
+emit_32(3258679296);
+emit_32(1130020864);
+emit_32(1094540329);
+emit_32(3258679296);
+emit_32(1130276848);
+emit_32(1092787739);
+emit_32(3258679296);
+emit_32(1130532897);
+emit_32(1092315051);
+emit_32(3258679296);
+emit_32(1130788880);
+emit_32(1091861091);
+emit_32(3258679296);
+emit_32(1131044864);
+emit_32(1091047459);
+emit_32(3258679296);
+emit_32(1131300848);
+emit_32(1091787586);
+emit_32(3258679296);
+emit_32(1131556897);
+emit_32(1091795230);
+emit_32(3258679296);
+emit_32(1131812880);
+emit_32(1091987980);
+emit_32(3258679296);
+emit_32(1132068864);
+emit_32(1091100066);
+emit_32(3258679296);
+emit_32(1081737216);
+emit_32(1114597202);
+emit_32(3259703309);
+emit_32(1090125824);
+emit_32(1114535127);
+emit_32(3259703309);
+emit_32(1094418484);
+emit_32(1114569520);
+emit_32(3259703309);
+emit_32(1098514432);
+emit_32(1114747935);
+emit_32(3259703309);
+emit_32(1100759066);
+emit_32(1114487233);
+emit_32(3259703309);
+emit_32(1102807040);
+emit_32(1114382795);
+emit_32(3259703309);
+emit_32(1104855066);
+emit_32(1113996919);
+emit_32(3259703309);
+emit_32(1106903040);
+emit_32(1114099181);
+emit_32(3259703309);
+emit_32(1108123661);
+emit_32(1113852163);
+emit_32(3259703309);
+emit_32(1109147648);
+emit_32(1113652435);
+emit_32(3259703309);
+emit_32(1110171661);
+emit_32(1113551117);
+emit_32(3259703309);
+emit_32(1111195648);
+emit_32(1113386543);
+emit_32(3259703309);
+emit_32(1112219661);
+emit_32(1113298436);
+emit_32(3259703309);
+emit_32(1113243648);
+emit_32(1112846185);
+emit_32(3259703309);
+emit_32(1114267661);
+emit_32(1112699621);
+emit_32(3259703309);
+emit_32(1115291648);
+emit_32(1112253320);
+emit_32(3259703309);
+emit_32(1116000263);
+emit_32(1112228338);
+emit_32(3259703309);
+emit_32(1116512256);
+emit_32(1112085679);
+emit_32(3259703309);
+emit_32(1117024263);
+emit_32(1112407068);
+emit_32(3259703309);
+emit_32(1117536256);
+emit_32(1112221391);
+emit_32(3259703309);
+emit_32(1118048263);
+emit_32(1111896936);
+emit_32(3259703309);
+emit_32(1118560256);
+emit_32(1111579322);
+emit_32(3259703309);
+emit_32(1119072263);
+emit_32(1111494309);
+emit_32(3259703309);
+emit_32(1119584256);
+emit_32(1111163588);
+emit_32(3259703309);
+emit_32(1120096263);
+emit_32(1110845004);
+emit_32(3259703309);
+emit_32(1120608322);
+emit_32(1110534835);
+emit_32(3259703309);
+emit_32(1121120289);
+emit_32(1110661294);
+emit_32(3259703309);
+emit_32(1121632256);
+emit_32(1110709161);
+emit_32(3259703309);
+emit_32(1122144223);
+emit_32(1110566843);
+emit_32(3259703309);
+emit_32(1122656322);
+emit_32(1110304385);
+emit_32(3259703309);
+emit_32(1123168289);
+emit_32(1109925298);
+emit_32(3259703309);
+emit_32(1123680256);
+emit_32(1109647897);
+emit_32(3259703309);
+emit_32(1124132848);
+emit_32(1109489300);
+emit_32(3259703309);
+emit_32(1124388897);
+emit_32(1109413541);
+emit_32(3259703309);
+emit_32(1124644880);
+emit_32(1109402137);
+emit_32(3259703309);
+emit_32(1124900864);
+emit_32(1108939034);
+emit_32(3259703309);
+emit_32(1125156848);
+emit_32(1108484450);
+emit_32(3259703309);
+emit_32(1125412897);
+emit_32(1108297200);
+emit_32(3259703309);
+emit_32(1125668880);
+emit_32(1108185815);
+emit_32(3259703309);
+emit_32(1125924864);
+emit_32(1108077104);
+emit_32(3259703309);
+emit_32(1126180848);
+emit_32(1107688659);
+emit_32(3259703309);
+emit_32(1126436897);
+emit_32(1107166075);
+emit_32(3259703309);
+emit_32(1126692880);
+emit_32(1105985012);
+emit_32(3259703309);
+emit_32(1126948864);
+emit_32(1104765465);
+emit_32(3259703309);
+emit_32(1127204848);
+emit_32(1103884766);
+emit_32(3259703309);
+emit_32(1127460897);
+emit_32(1103770157);
+emit_32(3259703309);
+emit_32(1127716880);
+emit_32(1103747613);
+emit_32(3259703309);
+emit_32(1127972864);
+emit_32(1103380349);
+emit_32(3259703309);
+emit_32(1128228848);
+emit_32(1102807669);
+emit_32(3259703309);
+emit_32(1128484897);
+emit_32(1101721240);
+emit_32(3259703309);
+emit_32(1128740880);
+emit_32(1100629095);
+emit_32(3259703309);
+emit_32(1128996864);
+emit_32(1099835323);
+emit_32(3259703309);
+emit_32(1129252848);
+emit_32(1098920598);
+emit_32(3259703309);
+emit_32(1129508897);
+emit_32(1096752929);
+emit_32(3259703309);
+emit_32(1129764880);
+emit_32(1095066609);
+emit_32(3259703309);
+emit_32(1130020864);
+emit_32(1093563371);
+emit_32(3259703309);
+emit_32(1130276848);
+emit_32(1092693157);
+emit_32(3259703309);
+emit_32(1130532897);
+emit_32(1091653725);
+emit_32(3259703309);
+emit_32(1130788880);
+emit_32(1091615085);
+emit_32(3259703309);
+emit_32(1131044864);
+emit_32(1091394161);
+emit_32(3259703309);
+emit_32(1131300848);
+emit_32(1091605134);
+emit_32(3259703309);
+emit_32(1131556897);
+emit_32(1091638730);
+emit_32(3259703309);
+emit_32(1131812880);
+emit_32(1091599786);
+emit_32(3259703309);
+emit_32(1132068864);
+emit_32(1092266859);
+emit_32(3259703309);
+emit_32(1081737216);
+emit_32(1114739258);
+emit_32(3260727296);
+emit_32(1090125824);
+emit_32(1114878378);
+emit_32(3260727296);
+emit_32(1094418484);
+emit_32(1114870802);
+emit_32(3260727296);
+emit_32(1098514432);
+emit_32(1114770794);
+emit_32(3260727296);
+emit_32(1100759066);
+emit_32(1114231276);
+emit_32(3260727296);
+emit_32(1102807040);
+emit_32(1114104450);
+emit_32(3260727296);
+emit_32(1104855066);
+emit_32(1113868626);
+emit_32(3260727296);
+emit_32(1106903040);
+emit_32(1113833393);
+emit_32(3260727296);
+emit_32(1108123661);
+emit_32(1113996840);
+emit_32(3260727296);
+emit_32(1109147648);
+emit_32(1113765393);
+emit_32(3260727296);
+emit_32(1110171661);
+emit_32(1113650627);
+emit_32(3260727296);
+emit_32(1111195648);
+emit_32(1113342896);
+emit_32(3260727296);
+emit_32(1112219661);
+emit_32(1113156380);
+emit_32(3260727296);
+emit_32(1113243648);
+emit_32(1112582154);
+emit_32(3260727296);
+emit_32(1114267661);
+emit_32(1112346277);
+emit_32(3260727296);
+emit_32(1115291648);
+emit_32(1111870249);
+emit_32(3260727296);
+emit_32(1116000263);
+emit_32(1111605930);
+emit_32(3260727296);
+emit_32(1116512256);
+emit_32(1111495305);
+emit_32(3260727296);
+emit_32(1117024263);
+emit_32(1111701219);
+emit_32(3260727296);
+emit_32(1117536256);
+emit_32(1111545768);
+emit_32(3260727296);
+emit_32(1118048263);
+emit_32(1111442876);
+emit_32(3260727296);
+emit_32(1118560256);
+emit_32(1111332802);
+emit_32(3260727296);
+emit_32(1119072263);
+emit_32(1111091472);
+emit_32(3260727296);
+emit_32(1119584256);
+emit_32(1110805001);
+emit_32(3260727296);
+emit_32(1120096263);
+emit_32(1110581864);
+emit_32(3260727296);
+emit_32(1120608322);
+emit_32(1110742008);
+emit_32(3260727296);
+emit_32(1121120289);
+emit_32(1110855516);
+emit_32(3260727296);
+emit_32(1121632256);
+emit_32(1110816168);
+emit_32(3260727296);
+emit_32(1122144223);
+emit_32(1110551665);
+emit_32(3260727296);
+emit_32(1122656322);
+emit_32(1110342579);
+emit_32(3260727296);
+emit_32(1123168289);
+emit_32(1110183327);
+emit_32(3260727296);
+emit_32(1123680256);
+emit_32(1109713040);
+emit_32(3260727296);
+emit_32(1124132848);
+emit_32(1109405598);
+emit_32(3260727296);
+emit_32(1124388897);
+emit_32(1109483874);
+emit_32(3260727296);
+emit_32(1124644880);
+emit_32(1109243252);
+emit_32(3260727296);
+emit_32(1124900864);
+emit_32(1108683915);
+emit_32(3260727296);
+emit_32(1125156848);
+emit_32(1108334268);
+emit_32(3260727296);
+emit_32(1125412897);
+emit_32(1108021346);
+emit_32(3260727296);
+emit_32(1125668880);
+emit_32(1107650229);
+emit_32(3260727296);
+emit_32(1125924864);
+emit_32(1107734875);
+emit_32(3260727296);
+emit_32(1126180848);
+emit_32(1107447356);
+emit_32(3260727296);
+emit_32(1126436897);
+emit_32(1106611641);
+emit_32(3260727296);
+emit_32(1126692880);
+emit_32(1105656650);
+emit_32(3260727296);
+emit_32(1126948864);
+emit_32(1104580601);
+emit_32(3260727296);
+emit_32(1127204848);
+emit_32(1103477447);
+emit_32(3260727296);
+emit_32(1127460897);
+emit_32(1102867753);
+emit_32(3260727296);
+emit_32(1127716880);
+emit_32(1102847882);
+emit_32(3260727296);
+emit_32(1127972864);
+emit_32(1102763996);
+emit_32(3260727296);
+emit_32(1128228848);
+emit_32(1102458913);
+emit_32(3260727296);
+emit_32(1128484897);
+emit_32(1102197083);
+emit_32(3260727296);
+emit_32(1128740880);
+emit_32(1101514251);
+emit_32(3260727296);
+emit_32(1128996864);
+emit_32(1100242957);
+emit_32(3260727296);
+emit_32(1129252848);
+emit_32(1098935488);
+emit_32(3260727296);
+emit_32(1129508897);
+emit_32(1096397147);
+emit_32(3260727296);
+emit_32(1129764880);
+emit_32(1093735442);
+emit_32(3260727296);
+emit_32(1130020864);
+emit_32(1092509887);
+emit_32(3260727296);
+emit_32(1130276848);
+emit_32(1092214797);
+emit_32(3260727296);
+emit_32(1130532897);
+emit_32(1091179916);
+emit_32(3260727296);
+emit_32(1130788880);
+emit_32(1091523565);
+emit_32(3260727296);
+emit_32(1131044864);
+emit_32(1091405317);
+emit_32(3260727296);
+emit_32(1131300848);
+emit_32(1091481213);
+emit_32(3260727296);
+emit_32(1131556897);
+emit_32(1091769446);
+emit_32(3260727296);
+emit_32(1131812880);
+emit_32(1091742634);
+emit_32(3260727296);
+emit_32(1132068864);
+emit_32(1092008249);
+emit_32(3260727296);
+emit_32(1081737216);
+emit_32(1115049086);
+emit_32(3261751309);
+emit_32(1090125824);
+emit_32(1114962395);
+emit_32(3261751309);
+emit_32(1094418484);
+emit_32(1114740674);
+emit_32(3261751309);
+emit_32(1098514432);
+emit_32(1114486001);
+emit_32(3261751309);
+emit_32(1100759066);
+emit_32(1114250779);
+emit_32(3261751309);
+emit_32(1102807040);
+emit_32(1113755799);
+emit_32(3261751309);
+emit_32(1104855066);
+emit_32(1113604699);
+emit_32(3261751309);
+emit_32(1106903040);
+emit_32(1113715717);
+emit_32(3261751309);
+emit_32(1108123661);
+emit_32(1113733516);
+emit_32(3261751309);
+emit_32(1109147648);
+emit_32(1113783009);
+emit_32(3261751309);
+emit_32(1110171661);
+emit_32(1113496093);
+emit_32(3261751309);
+emit_32(1111195648);
+emit_32(1113237016);
+emit_32(3261751309);
+emit_32(1112219661);
+emit_32(1112990181);
+emit_32(3261751309);
+emit_32(1113243648);
+emit_32(1112521022);
+emit_32(3261751309);
+emit_32(1114267661);
+emit_32(1112125315);
+emit_32(3261751309);
+emit_32(1115291648);
+emit_32(1111604671);
+emit_32(3261751309);
+emit_32(1116000263);
+emit_32(1111264408);
+emit_32(3261751309);
+emit_32(1116512256);
+emit_32(1110967242);
+emit_32(3261751309);
+emit_32(1117024263);
+emit_32(1110960898);
+emit_32(3261751309);
+emit_32(1117536256);
+emit_32(1110766938);
+emit_32(3261751309);
+emit_32(1118048263);
+emit_32(1110773334);
+emit_32(3261751309);
+emit_32(1118560256);
+emit_32(1110772364);
+emit_32(3261751309);
+emit_32(1119072263);
+emit_32(1110784763);
+emit_32(3261751309);
+emit_32(1119584256);
+emit_32(1110671203);
+emit_32(3261751309);
+emit_32(1120096263);
+emit_32(1110537562);
+emit_32(3261751309);
+emit_32(1120608322);
+emit_32(1110731470);
+emit_32(3261751309);
+emit_32(1121120289);
+emit_32(1110870222);
+emit_32(3261751309);
+emit_32(1121632256);
+emit_32(1110602652);
+emit_32(3261751309);
+emit_32(1122144223);
+emit_32(1110529357);
+emit_32(3261751309);
+emit_32(1122656322);
+emit_32(1110527626);
+emit_32(3261751309);
+emit_32(1123168289);
+emit_32(1110155303);
+emit_32(3261751309);
+emit_32(1123680256);
+emit_32(1109558559);
+emit_32(3261751309);
+emit_32(1124132848);
+emit_32(1109729686);
+emit_32(3261751309);
+emit_32(1124388897);
+emit_32(1109466835);
+emit_32(3261751309);
+emit_32(1124644880);
+emit_32(1109238455);
+emit_32(3261751309);
+emit_32(1124900864);
+emit_32(1108631067);
+emit_32(3261751309);
+emit_32(1125156848);
+emit_32(1108053590);
+emit_32(3261751309);
+emit_32(1125412897);
+emit_32(1107431549);
+emit_32(3261751309);
+emit_32(1125668880);
+emit_32(1107275127);
+emit_32(3261751309);
+emit_32(1125924864);
+emit_32(1107085807);
+emit_32(3261751309);
+emit_32(1126180848);
+emit_32(1106875043);
+emit_32(3261751309);
+emit_32(1126436897);
+emit_32(1106465207);
+emit_32(3261751309);
+emit_32(1126692880);
+emit_32(1105739330);
+emit_32(3261751309);
+emit_32(1126948864);
+emit_32(1104828380);
+emit_32(3261751309);
+emit_32(1127204848);
+emit_32(1104194306);
+emit_32(3261751309);
+emit_32(1127460897);
+emit_32(1103488510);
+emit_32(3261751309);
+emit_32(1127716880);
+emit_32(1102913680);
+emit_32(3261751309);
+emit_32(1127972864);
+emit_32(1102738044);
+emit_32(3261751309);
+emit_32(1128228848);
+emit_32(1102513753);
+emit_32(3261751309);
+emit_32(1128484897);
+emit_32(1102220624);
+emit_32(3261751309);
+emit_32(1128740880);
+emit_32(1101685640);
+emit_32(3261751309);
+emit_32(1128996864);
+emit_32(1100932081);
+emit_32(3261751309);
+emit_32(1129252848);
+emit_32(1099376414);
+emit_32(3261751309);
+emit_32(1129508897);
+emit_32(1096550344);
+emit_32(3261751309);
+emit_32(1129764880);
+emit_32(1094603244);
+emit_32(3261751309);
+emit_32(1130020864);
+emit_32(1092245762);
+emit_32(3261751309);
+emit_32(1130276848);
+emit_32(1091851801);
+emit_32(3261751309);
+emit_32(1130532897);
+emit_32(1091990360);
+emit_32(3261751309);
+emit_32(1130788880);
+emit_32(1091469343);
+emit_32(3261751309);
+emit_32(1131044864);
+emit_32(1091186889);
+emit_32(3261751309);
+emit_32(1131300848);
+emit_32(1091680191);
+emit_32(3261751309);
+emit_32(1131556897);
+emit_32(1092249820);
+emit_32(3261751309);
+emit_32(1131812880);
+emit_32(1091787240);
+emit_32(3261751309);
+emit_32(1132068864);
+emit_32(1092823076);
+emit_32(3261751309);
+emit_32(1081737216);
+emit_32(1115189700);
+emit_32(3262775296);
+emit_32(1090125824);
+emit_32(1114804086);
+emit_32(3262775296);
+emit_32(1094418484);
+emit_32(1114524457);
+emit_32(3262775296);
+emit_32(1098514432);
+emit_32(1114431554);
+emit_32(3262775296);
+emit_32(1100759066);
+emit_32(1113978044);
+emit_32(3262775296);
+emit_32(1102807040);
+emit_32(1113530381);
+emit_32(3262775296);
+emit_32(1104855066);
+emit_32(1113581814);
+emit_32(3262775296);
+emit_32(1106903040);
+emit_32(1113583963);
+emit_32(3262775296);
+emit_32(1108123661);
+emit_32(1113510458);
+emit_32(3262775296);
+emit_32(1109147648);
+emit_32(1113580162);
+emit_32(3262775296);
+emit_32(1110171661);
+emit_32(1113244408);
+emit_32(3262775296);
+emit_32(1111195648);
+emit_32(1113012699);
+emit_32(3262775296);
+emit_32(1112219661);
+emit_32(1112648765);
+emit_32(3262775296);
+emit_32(1113243648);
+emit_32(1112238483);
+emit_32(3262775296);
+emit_32(1114267661);
+emit_32(1111804976);
+emit_32(3262775296);
+emit_32(1115291648);
+emit_32(1111412362);
+emit_32(3262775296);
+emit_32(1116000263);
+emit_32(1110827074);
+emit_32(3262775296);
+emit_32(1116512256);
+emit_32(1110530694);
+emit_32(3262775296);
+emit_32(1117024263);
+emit_32(1110239399);
+emit_32(3262775296);
+emit_32(1117536256);
+emit_32(1110405048);
+emit_32(3262775296);
+emit_32(1118048263);
+emit_32(1110532476);
+emit_32(3262775296);
+emit_32(1118560256);
+emit_32(1110521885);
+emit_32(3262775296);
+emit_32(1119072263);
+emit_32(1110500757);
+emit_32(3262775296);
+emit_32(1119584256);
+emit_32(1110457372);
+emit_32(3262775296);
+emit_32(1120096263);
+emit_32(1110371651);
+emit_32(3262775296);
+emit_32(1120608322);
+emit_32(1110583332);
+emit_32(3262775296);
+emit_32(1121120289);
+emit_32(1110579793);
+emit_32(3262775296);
+emit_32(1121632256);
+emit_32(1110326510);
+emit_32(3262775296);
+emit_32(1122144223);
+emit_32(1110576044);
+emit_32(3262775296);
+emit_32(1122656322);
+emit_32(1110255731);
+emit_32(3262775296);
+emit_32(1123168289);
+emit_32(1109817767);
+emit_32(3262775296);
+emit_32(1123680256);
+emit_32(1109393120);
+emit_32(3262775296);
+emit_32(1124132848);
+emit_32(1109645407);
+emit_32(3262775296);
+emit_32(1124388897);
+emit_32(1109352881);
+emit_32(3262775296);
+emit_32(1124644880);
+emit_32(1109118131);
+emit_32(3262775296);
+emit_32(1124900864);
+emit_32(1108538950);
+emit_32(3262775296);
+emit_32(1125156848);
+emit_32(1108056028);
+emit_32(3262775296);
+emit_32(1125412897);
+emit_32(1107693981);
+emit_32(3262775296);
+emit_32(1125668880);
+emit_32(1107060169);
+emit_32(3262775296);
+emit_32(1125924864);
+emit_32(1106929307);
+emit_32(3262775296);
+emit_32(1126180848);
+emit_32(1106668945);
+emit_32(3262775296);
+emit_32(1126436897);
+emit_32(1106423893);
+emit_32(3262775296);
+emit_32(1126692880);
+emit_32(1106097157);
+emit_32(3262775296);
+emit_32(1126948864);
+emit_32(1105689628);
+emit_32(3262775296);
+emit_32(1127204848);
+emit_32(1104863822);
+emit_32(3262775296);
+emit_32(1127460897);
+emit_32(1104431232);
+emit_32(3262775296);
+emit_32(1127716880);
+emit_32(1103727061);
+emit_32(3262775296);
+emit_32(1127972864);
+emit_32(1103036154);
+emit_32(3262775296);
+emit_32(1128228848);
+emit_32(1102391227);
+emit_32(3262775296);
+emit_32(1128484897);
+emit_32(1102074977);
+emit_32(3262775296);
+emit_32(1128740880);
+emit_32(1101512049);
+emit_32(3262775296);
+emit_32(1128996864);
+emit_32(1100231108);
+emit_32(3262775296);
+emit_32(1129252848);
+emit_32(1098399508);
+emit_32(3262775296);
+emit_32(1129508897);
+emit_32(1096015571);
+emit_32(3262775296);
+emit_32(1129764880);
+emit_32(1093673366);
+emit_32(3262775296);
+emit_32(1130020864);
+emit_32(1092539069);
+emit_32(3262775296);
+emit_32(1130276848);
+emit_32(1092267928);
+emit_32(3262775296);
+emit_32(1130532897);
+emit_32(1092764041);
+emit_32(3262775296);
+emit_32(1130788880);
+emit_32(1092150519);
+emit_32(3262775296);
+emit_32(1131044864);
+emit_32(1091502594);
+emit_32(3262775296);
+emit_32(1131300848);
+emit_32(1091946980);
+emit_32(3262775296);
+emit_32(1131556897);
+emit_32(1091906568);
+emit_32(3262775296);
+emit_32(1131812880);
+emit_32(1092505546);
+emit_32(3262775296);
+emit_32(1132068864);
+emit_32(1093985842);
+emit_32(3262775296);
+emit_32(1081737216);
+emit_32(1114860919);
+emit_32(3263483911);
+emit_32(1090125824);
+emit_32(1114455068);
+emit_32(3263483911);
+emit_32(1094418484);
+emit_32(1114274320);
+emit_32(3263483911);
+emit_32(1098514432);
+emit_32(1113998492);
+emit_32(3263483911);
+emit_32(1100759066);
+emit_32(1113229912);
+emit_32(3263483911);
+emit_32(1102807040);
+emit_32(1112963364);
+emit_32(3263483911);
+emit_32(1104855066);
+emit_32(1113085549);
+emit_32(3263483911);
+emit_32(1106903040);
+emit_32(1113193500);
+emit_32(3263483911);
+emit_32(1108123661);
+emit_32(1113051339);
+emit_32(3263483911);
+emit_32(1109147648);
+emit_32(1112914631);
+emit_32(3263483911);
+emit_32(1110171661);
+emit_32(1112713593);
+emit_32(3263483911);
+emit_32(1111195648);
+emit_32(1112530774);
+emit_32(3263483911);
+emit_32(1112219661);
+emit_32(1112319538);
+emit_32(3263483911);
+emit_32(1113243648);
+emit_32(1112017836);
+emit_32(3263483911);
+emit_32(1114267661);
+emit_32(1111480022);
+emit_32(3263483911);
+emit_32(1115291648);
+emit_32(1111044889);
+emit_32(3263483911);
+emit_32(1116000263);
+emit_32(1110559058);
+emit_32(3263483911);
+emit_32(1116512256);
+emit_32(1109970151);
+emit_32(3263483911);
+emit_32(1117024263);
+emit_32(1109713014);
+emit_32(3263483911);
+emit_32(1117536256);
+emit_32(1109844532);
+emit_32(3263483911);
+emit_32(1118048263);
+emit_32(1110110713);
+emit_32(3263483911);
+emit_32(1118560256);
+emit_32(1110168096);
+emit_32(3263483911);
+emit_32(1119072263);
+emit_32(1110188910);
+emit_32(3263483911);
+emit_32(1119584256);
+emit_32(1110300531);
+emit_32(3263483911);
+emit_32(1120096263);
+emit_32(1110086438);
+emit_32(3263483911);
+emit_32(1120608322);
+emit_32(1110098418);
+emit_32(3263483911);
+emit_32(1121120289);
+emit_32(1110207470);
+emit_32(3263483911);
+emit_32(1121632256);
+emit_32(1110104814);
+emit_32(3263483911);
+emit_32(1122144223);
+emit_32(1110042057);
+emit_32(3263483911);
+emit_32(1122656322);
+emit_32(1109977963);
+emit_32(3263483911);
+emit_32(1123168289);
+emit_32(1109719017);
+emit_32(3263483911);
+emit_32(1123680256);
+emit_32(1109491371);
+emit_32(3263483911);
+emit_32(1124132848);
+emit_32(1109439493);
+emit_32(3263483911);
+emit_32(1124388897);
+emit_32(1109273372);
+emit_32(3263483911);
+emit_32(1124644880);
+emit_32(1109142720);
+emit_32(3263483911);
+emit_32(1124900864);
+emit_32(1108647110);
+emit_32(3263483911);
+emit_32(1125156848);
+emit_32(1108078520);
+emit_32(3263483911);
+emit_32(1125412897);
+emit_32(1107629520);
+emit_32(3263483911);
+emit_32(1125668880);
+emit_32(1107405963);
+emit_32(3263483911);
+emit_32(1125924864);
+emit_32(1107180388);
+emit_32(3263483911);
+emit_32(1126180848);
+emit_32(1106634447);
+emit_32(3263483911);
+emit_32(1126436897);
+emit_32(1106537297);
+emit_32(3263483911);
+emit_32(1126692880);
+emit_32(1106021869);
+emit_32(3263483911);
+emit_32(1126948864);
+emit_32(1105710599);
+emit_32(3263483911);
+emit_32(1127204848);
+emit_32(1104910693);
+emit_32(3263483911);
+emit_32(1127460897);
+emit_32(1104565083);
+emit_32(3263483911);
+emit_32(1127716880);
+emit_32(1103934836);
+emit_32(3263483911);
+emit_32(1127972864);
+emit_32(1103249120);
+emit_32(3263483911);
+emit_32(1128228848);
+emit_32(1102145336);
+emit_32(3263483911);
+emit_32(1128484897);
+emit_32(1101411962);
+emit_32(3263483911);
+emit_32(1128740880);
+emit_32(1100959711);
+emit_32(3263483911);
+emit_32(1128996864);
+emit_32(1099510055);
+emit_32(3263483911);
+emit_32(1129252848);
+emit_32(1096815005);
+emit_32(3263483911);
+emit_32(1129508897);
+emit_32(1094088393);
+emit_32(3263483911);
+emit_32(1129764880);
+emit_32(1092617450);
+emit_32(3263483911);
+emit_32(1130020864);
+emit_32(1091201757);
+emit_32(3263483911);
+emit_32(1130276848);
+emit_32(1091975481);
+emit_32(3263483911);
+emit_32(1130532897);
+emit_32(1092051219);
+emit_32(3263483911);
+emit_32(1130788880);
+emit_32(1091427243);
+emit_32(3263483911);
+emit_32(1131044864);
+emit_32(1091236570);
+emit_32(3263483911);
+emit_32(1131300848);
+emit_32(1092364376);
+emit_32(3263483911);
+emit_32(1131556897);
+emit_32(1093015385);
+emit_32(3263483911);
+emit_32(1131812880);
+emit_32(1093629116);
+emit_32(3263483911);
+emit_32(1132068864);
+emit_32(1094121318);
+emit_32(3263483911);
+emit_32(1081737216);
+emit_32(1114412994);
+emit_32(3263995904);
+emit_32(1090125824);
+emit_32(1114056740);
+emit_32(3263995904);
+emit_32(1094418484);
+emit_32(1113478634);
+emit_32(3263995904);
+emit_32(1098514432);
+emit_32(1113153890);
+emit_32(3263995904);
+emit_32(1100759066);
+emit_32(1112554235);
+emit_32(3263995904);
+emit_32(1102807040);
+emit_32(1112170430);
+emit_32(3263995904);
+emit_32(1104855066);
+emit_32(1112241550);
+emit_32(3263995904);
+emit_32(1106903040);
+emit_32(1112360406);
+emit_32(3263995904);
+emit_32(1108123661);
+emit_32(1112453310);
+emit_32(3263995904);
+emit_32(1109147648);
+emit_32(1112310127);
+emit_32(3263995904);
+emit_32(1110171661);
+emit_32(1112440544);
+emit_32(3263995904);
+emit_32(1111195648);
+emit_32(1111943545);
+emit_32(3263995904);
+emit_32(1112219661);
+emit_32(1111698283);
+emit_32(3263995904);
+emit_32(1113243648);
+emit_32(1111330233);
+emit_32(3263995904);
+emit_32(1114267661);
+emit_32(1111083634);
+emit_32(3263995904);
+emit_32(1115291648);
+emit_32(1110768275);
+emit_32(3263995904);
+emit_32(1116000263);
+emit_32(1110145158);
+emit_32(3263995904);
+emit_32(1116512256);
+emit_32(1109629941);
+emit_32(3263995904);
+emit_32(1117024263);
+emit_32(1109269781);
+emit_32(3263995904);
+emit_32(1117536256);
+emit_32(1109302287);
+emit_32(3263995904);
+emit_32(1118048263);
+emit_32(1109529015);
+emit_32(3263995904);
+emit_32(1118560256);
+emit_32(1109660900);
+emit_32(3263995904);
+emit_32(1119072263);
+emit_32(1109901076);
+emit_32(3263995904);
+emit_32(1119584256);
+emit_32(1109952850);
+emit_32(3263995904);
+emit_32(1120096263);
+emit_32(1109778733);
+emit_32(3263995904);
+emit_32(1120608322);
+emit_32(1109570460);
+emit_32(3263995904);
+emit_32(1121120289);
+emit_32(1109713381);
+emit_32(3263995904);
+emit_32(1121632256);
+emit_32(1109646849);
+emit_32(3263995904);
+emit_32(1122144223);
+emit_32(1109683837);
+emit_32(3263995904);
+emit_32(1122656322);
+emit_32(1109578377);
+emit_32(3263995904);
+emit_32(1123168289);
+emit_32(1109348975);
+emit_32(3263995904);
+emit_32(1123680256);
+emit_32(1109644804);
+emit_32(3263995904);
+emit_32(1124132848);
+emit_32(1109851662);
+emit_32(3263995904);
+emit_32(1124388897);
+emit_32(1109688451);
+emit_32(3263995904);
+emit_32(1124644880);
+emit_32(1109357599);
+emit_32(3263995904);
+emit_32(1124900864);
+emit_32(1108828593);
+emit_32(3263995904);
+emit_32(1125156848);
+emit_32(1108185291);
+emit_32(3263995904);
+emit_32(1125412897);
+emit_32(1107780226);
+emit_32(3263995904);
+emit_32(1125668880);
+emit_32(1107584457);
+emit_32(3263995904);
+emit_32(1125924864);
+emit_32(1107420958);
+emit_32(3263995904);
+emit_32(1126180848);
+emit_32(1107022525);
+emit_32(3263995904);
+emit_32(1126436897);
+emit_32(1105944170);
+emit_32(3263995904);
+emit_32(1126692880);
+emit_32(1105239946);
+emit_32(3263995904);
+emit_32(1126948864);
+emit_32(1105095295);
+emit_32(3263995904);
+emit_32(1127204848);
+emit_32(1104538816);
+emit_32(3263995904);
+emit_32(1127460897);
+emit_32(1103876692);
+emit_32(3263995904);
+emit_32(1127716880);
+emit_32(1103498786);
+emit_32(3263995904);
+emit_32(1127972864);
+emit_32(1102542589);
+emit_32(3263995904);
+emit_32(1128228848);
+emit_32(1101655913);
+emit_32(3263995904);
+emit_32(1128484897);
+emit_32(1100746955);
+emit_32(3263995904);
+emit_32(1128740880);
+emit_32(1099747662);
+emit_32(3263995904);
+emit_32(1128996864);
+emit_32(1098190422);
+emit_32(3263995904);
+emit_32(1129252848);
+emit_32(1095504599);
+emit_32(3263995904);
+emit_32(1129508897);
+emit_32(1092998503);
+emit_32(3263995904);
+emit_32(1129764880);
+emit_32(1090781394);
+emit_32(3263995904);
+emit_32(1130020864);
+emit_32(1090669165);
+emit_32(3263995904);
+emit_32(1130276848);
+emit_32(1091201548);
+emit_32(3263995904);
+emit_32(1130532897);
+emit_32(1091148238);
+emit_32(3263995904);
+emit_32(1130788880);
+emit_32(1091128944);
+emit_32(3263995904);
+emit_32(1131044864);
+emit_32(1091988745);
+emit_32(3263995904);
+emit_32(1131300848);
+emit_32(1092577195);
+emit_32(3263995904);
+emit_32(1131556897);
+emit_32(1092426756);
+emit_32(3263995904);
+emit_32(1131812880);
+emit_32(1092938944);
+emit_32(3263995904);
+emit_32(1132068864);
+emit_32(1093077985);
+emit_32(3263995904);
+emit_32(1081737216);
+emit_32(1113723162);
+emit_32(3264507911);
+emit_32(1090125824);
+emit_32(1113515282);
+emit_32(3264507911);
+emit_32(1094418484);
+emit_32(1112907160);
+emit_32(3264507911);
+emit_32(1098514432);
+emit_32(1112285197);
+emit_32(3264507911);
+emit_32(1100759066);
+emit_32(1111782615);
+emit_32(3264507911);
+emit_32(1102807040);
+emit_32(1111448565);
+emit_32(3264507911);
+emit_32(1104855066);
+emit_32(1111432364);
+emit_32(3264507911);
+emit_32(1106903040);
+emit_32(1111593242);
+emit_32(3264507911);
+emit_32(1108123661);
+emit_32(1111556175);
+emit_32(3264507911);
+emit_32(1109147648);
+emit_32(1111791947);
+emit_32(3264507911);
+emit_32(1110171661);
+emit_32(1111706147);
+emit_32(3264507911);
+emit_32(1111195648);
+emit_32(1111342658);
+emit_32(3264507911);
+emit_32(1112219661);
+emit_32(1111241785);
+emit_32(3264507911);
+emit_32(1113243648);
+emit_32(1110814700);
+emit_32(3264507911);
+emit_32(1114267661);
+emit_32(1110530720);
+emit_32(3264507911);
+emit_32(1115291648);
+emit_32(1110173496);
+emit_32(3264507911);
+emit_32(1116000263);
+emit_32(1109779887);
+emit_32(3264507911);
+emit_32(1116512256);
+emit_32(1109242701);
+emit_32(3264507911);
+emit_32(1117024263);
+emit_32(1108763528);
+emit_32(3264507911);
+emit_32(1117536256);
+emit_32(1108823140);
+emit_32(3264507911);
+emit_32(1118048263);
+emit_32(1109120202);
+emit_32(3264507911);
+emit_32(1118560256);
+emit_32(1109432205);
+emit_32(3264507911);
+emit_32(1119072263);
+emit_32(1109682684);
+emit_32(3264507911);
+emit_32(1119584256);
+emit_32(1109558821);
+emit_32(3264507911);
+emit_32(1120096263);
+emit_32(1109416031);
+emit_32(3264507911);
+emit_32(1120608322);
+emit_32(1109479208);
+emit_32(3264507911);
+emit_32(1121120289);
+emit_32(1109404235);
+emit_32(3264507911);
+emit_32(1121632256);
+emit_32(1109406882);
+emit_32(3264507911);
+emit_32(1122144223);
+emit_32(1109258378);
+emit_32(3264507911);
+emit_32(1122656322);
+emit_32(1109286008);
+emit_32(3264507911);
+emit_32(1123168289);
+emit_32(1109433857);
+emit_32(3264507911);
+emit_32(1123680256);
+emit_32(1109483166);
+emit_32(3264507911);
+emit_32(1124132848);
+emit_32(1109859762);
+emit_32(3264507911);
+emit_32(1124388897);
+emit_32(1109785995);
+emit_32(3264507911);
+emit_32(1124644880);
+emit_32(1109694218);
+emit_32(3264507911);
+emit_32(1124900864);
+emit_32(1109081588);
+emit_32(3264507911);
+emit_32(1125156848);
+emit_32(1108301316);
+emit_32(3264507911);
+emit_32(1125412897);
+emit_32(1107987923);
+emit_32(3264507911);
+emit_32(1125668880);
+emit_32(1107744208);
+emit_32(3264507911);
+emit_32(1125924864);
+emit_32(1107483348);
+emit_32(3264507911);
+emit_32(1126180848);
+emit_32(1106653741);
+emit_32(3264507911);
+emit_32(1126436897);
+emit_32(1105289282);
+emit_32(3264507911);
+emit_32(1126692880);
+emit_32(1104749946);
+emit_32(3264507911);
+emit_32(1126948864);
+emit_32(1104530532);
+emit_32(3264507911);
+emit_32(1127204848);
+emit_32(1104035552);
+emit_32(3264507911);
+emit_32(1127460897);
+emit_32(1103561123);
+emit_32(3264507911);
+emit_32(1127716880);
+emit_32(1102839493);
+emit_32(3264507911);
+emit_32(1127972864);
+emit_32(1102745908);
+emit_32(3264507911);
+emit_32(1128228848);
+emit_32(1102238083);
+emit_32(3264507911);
+emit_32(1128484897);
+emit_32(1101176504);
+emit_32(3264507911);
+emit_32(1128740880);
+emit_32(1099585395);
+emit_32(3264507911);
+emit_32(1128996864);
+emit_32(1097910033);
+emit_32(3264507911);
+emit_32(1129252848);
+emit_32(1094998662);
+emit_32(3264507911);
+emit_32(1129508897);
+emit_32(1092197905);
+emit_32(3264507911);
+emit_32(1129764880);
+emit_32(1089185482);
+emit_32(3264507911);
+emit_32(1130020864);
+emit_32(1088998898);
+emit_32(3264507911);
+emit_32(1130276848);
+emit_32(1090896014);
+emit_32(3264507911);
+emit_32(1130532897);
+emit_32(1090711286);
+emit_32(3264507911);
+emit_32(1130788880);
+emit_32(1091554068);
+emit_32(3264507911);
+emit_32(1131044864);
+emit_32(1091546760);
+emit_32(3264507911);
+emit_32(1131300848);
+emit_32(1091602523);
+emit_32(3264507911);
+emit_32(1131556897);
+emit_32(1091448749);
+emit_32(3264507911);
+emit_32(1131812880);
+emit_32(1091178993);
+emit_32(3264507911);
+emit_32(1132068864);
+emit_32(1092283059);
+emit_32(3264507911);
+emit_32(1081737216);
+emit_32(1113178820);
+emit_32(3265019904);
+emit_32(1090125824);
+emit_32(1112815043);
+emit_32(3265019904);
+emit_32(1094418484);
+emit_32(1112334769);
+emit_32(3265019904);
+emit_32(1098514432);
+emit_32(1111680641);
+emit_32(3265019904);
+emit_32(1100759066);
+emit_32(1110962104);
+emit_32(3265019904);
+emit_32(1102807040);
+emit_32(1110710079);
+emit_32(3265019904);
+emit_32(1104855066);
+emit_32(1110785366);
+emit_32(3265019904);
+emit_32(1106903040);
+emit_32(1110945956);
+emit_32(3265019904);
+emit_32(1108123661);
+emit_32(1111176643);
+emit_32(3265019904);
+emit_32(1109147648);
+emit_32(1111187364);
+emit_32(3265019904);
+emit_32(1110171661);
+emit_32(1110966901);
+emit_32(3265019904);
+emit_32(1111195648);
+emit_32(1110878952);
+emit_32(3265019904);
+emit_32(1112219661);
+emit_32(1110825343);
+emit_32(3265019904);
+emit_32(1113243648);
+emit_32(1110299718);
+emit_32(3265019904);
+emit_32(1114267661);
+emit_32(1109951067);
+emit_32(3265019904);
+emit_32(1115291648);
+emit_32(1109657859);
+emit_32(3265019904);
+emit_32(1116000263);
+emit_32(1109104185);
+emit_32(3265019904);
+emit_32(1116512256);
+emit_32(1108869644);
+emit_32(3265019904);
+emit_32(1117024263);
+emit_32(1108483296);
+emit_32(3265019904);
+emit_32(1117536256);
+emit_32(1108620057);
+emit_32(3265019904);
+emit_32(1118048263);
+emit_32(1108696603);
+emit_32(3265019904);
+emit_32(1118560256);
+emit_32(1109027874);
+emit_32(3265019904);
+emit_32(1119072263);
+emit_32(1109328580);
+emit_32(3265019904);
+emit_32(1119584256);
+emit_32(1109485499);
+emit_32(3265019904);
+emit_32(1120096263);
+emit_32(1109574785);
+emit_32(3265019904);
+emit_32(1120608322);
+emit_32(1109596203);
+emit_32(3265019904);
+emit_32(1121120289);
+emit_32(1109472235);
+emit_32(3265019904);
+emit_32(1121632256);
+emit_32(1109210510);
+emit_32(3265019904);
+emit_32(1122144223);
+emit_32(1109167152);
+emit_32(3265019904);
+emit_32(1122656322);
+emit_32(1109362999);
+emit_32(3265019904);
+emit_32(1123168289);
+emit_32(1109542149);
+emit_32(3265019904);
+emit_32(1123680256);
+emit_32(1109608156);
+emit_32(3265019904);
+emit_32(1124132848);
+emit_32(1109889647);
+emit_32(3265019904);
+emit_32(1124388897);
+emit_32(1110013300);
+emit_32(3265019904);
+emit_32(1124644880);
+emit_32(1109719908);
+emit_32(3265019904);
+emit_32(1124900864);
+emit_32(1109054299);
+emit_32(3265019904);
+emit_32(1125156848);
+emit_32(1108598561);
+emit_32(3265019904);
+emit_32(1125412897);
+emit_32(1108352696);
+emit_32(3265019904);
+emit_32(1125668880);
+emit_32(1107819128);
+emit_32(3265019904);
+emit_32(1125924864);
+emit_32(1107355868);
+emit_32(3265019904);
+emit_32(1126180848);
+emit_32(1106496193);
+emit_32(3265019904);
+emit_32(1126436897);
+emit_32(1105447564);
+emit_32(3265019904);
+emit_32(1126692880);
+emit_32(1104791208);
+emit_32(3265019904);
+emit_32(1126948864);
+emit_32(1104514122);
+emit_32(3265019904);
+emit_32(1127204848);
+emit_32(1103658956);
+emit_32(3265019904);
+emit_32(1127460897);
+emit_32(1103186887);
+emit_32(3265019904);
+emit_32(1127716880);
+emit_32(1103111179);
+emit_32(3265019904);
+emit_32(1127972864);
+emit_32(1103121823);
+emit_32(3265019904);
+emit_32(1128228848);
+emit_32(1102278872);
+emit_32(3265019904);
+emit_32(1128484897);
+emit_32(1100851603);
+emit_32(3265019904);
+emit_32(1128740880);
+emit_32(1099479699);
+emit_32(3265019904);
+emit_32(1128996864);
+emit_32(1097632580);
+emit_32(3265019904);
+emit_32(1129252848);
+emit_32(1094591185);
+emit_32(3265019904);
+emit_32(1129508897);
+emit_32(1091931629);
+emit_32(3265019904);
+emit_32(1129764880);
+emit_32(1088905806);
+emit_32(3265019904);
+emit_32(1130020864);
+emit_32(1090343655);
+emit_32(3265019904);
+emit_32(1130276848);
+emit_32(1091249918);
+emit_32(3265019904);
+emit_32(1130532897);
+emit_32(1091107417);
+emit_32(3265019904);
+emit_32(1130788880);
+emit_32(1092474068);
+emit_32(3265019904);
+emit_32(1131044864);
+emit_32(1091844765);
+emit_32(3265019904);
+emit_32(1131300848);
+emit_32(1091016830);
+emit_32(3265019904);
+emit_32(1131556897);
+emit_32(1090180560);
+emit_32(3265019904);
+emit_32(1131812880);
+emit_32(1090146502);
+emit_32(3265019904);
+emit_32(1132068864);
+emit_32(1091238625);
+emit_32(3265019904);
+emit_32(1081737216);
+emit_32(1112525767);
+emit_32(3265531911);
+emit_32(1090125824);
+emit_32(1112045230);
+emit_32(3265531911);
+emit_32(1094418484);
+emit_32(1111728246);
+emit_32(3265531911);
+emit_32(1098514432);
+emit_32(1111134490);
+emit_32(3265531911);
+emit_32(1100759066);
+emit_32(1110592061);
+emit_32(3265531911);
+emit_32(1102807040);
+emit_32(1110293873);
+emit_32(3265531911);
+emit_32(1104855066);
+emit_32(1110356761);
+emit_32(3265531911);
+emit_32(1106903040);
+emit_32(1110662159);
+emit_32(3265531911);
+emit_32(1108123661);
+emit_32(1110710760);
+emit_32(3265531911);
+emit_32(1109147648);
+emit_32(1110634267);
+emit_32(3265531911);
+emit_32(1110171661);
+emit_32(1110559556);
+emit_32(3265531911);
+emit_32(1111195648);
+emit_32(1110659144);
+emit_32(3265531911);
+emit_32(1112219661);
+emit_32(1110325251);
+emit_32(3265531911);
+emit_32(1113243648);
+emit_32(1109714954);
+emit_32(3265531911);
+emit_32(1114267661);
+emit_32(1109517035);
+emit_32(3265531911);
+emit_32(1115291648);
+emit_32(1108983441);
+emit_32(3265531911);
+emit_32(1116000263);
+emit_32(1108437998);
+emit_32(3265531911);
+emit_32(1116512256);
+emit_32(1108232687);
+emit_32(3265531911);
+emit_32(1117024263);
+emit_32(1108084497);
+emit_32(3265531911);
+emit_32(1117536256);
+emit_32(1108299979);
+emit_32(3265531911);
+emit_32(1118048263);
+emit_32(1108631434);
+emit_32(3265531911);
+emit_32(1118560256);
+emit_32(1108895544);
+emit_32(3265531911);
+emit_32(1119072263);
+emit_32(1109120306);
+emit_32(3265531911);
+emit_32(1119584256);
+emit_32(1109413095);
+emit_32(3265531911);
+emit_32(1120096263);
+emit_32(1109497977);
+emit_32(3265531911);
+emit_32(1120608322);
+emit_32(1109458603);
+emit_32(3265531911);
+emit_32(1121120289);
+emit_32(1109373328);
+emit_32(3265531911);
+emit_32(1121632256);
+emit_32(1109400669);
+emit_32(3265531911);
+emit_32(1122144223);
+emit_32(1109567655);
+emit_32(3265531911);
+emit_32(1122656322);
+emit_32(1109574287);
+emit_32(3265531911);
+emit_32(1123168289);
+emit_32(1109599375);
+emit_32(3265531911);
+emit_32(1123680256);
+emit_32(1109804660);
+emit_32(3265531911);
+emit_32(1124132848);
+emit_32(1109874704);
+emit_32(3265531911);
+emit_32(1124388897);
+emit_32(1109814254);
+emit_32(3265531911);
+emit_32(1124644880);
+emit_32(1109294763);
+emit_32(3265531911);
+emit_32(1124900864);
+emit_32(1109046460);
+emit_32(3265531911);
+emit_32(1125156848);
+emit_32(1108605901);
+emit_32(3265531911);
+emit_32(1125412897);
+emit_32(1108298039);
+emit_32(3265531911);
+emit_32(1125668880);
+emit_32(1108029997);
+emit_32(3265531911);
+emit_32(1125924864);
+emit_32(1107621262);
+emit_32(3265531911);
+emit_32(1126180848);
+emit_32(1106659980);
+emit_32(3265531911);
+emit_32(1126436897);
+emit_32(1105554362);
+emit_32(3265531911);
+emit_32(1126692880);
+emit_32(1104494356);
+emit_32(3265531911);
+emit_32(1126948864);
+emit_32(1104060455);
+emit_32(3265531911);
+emit_32(1127204848);
+emit_32(1103517817);
+emit_32(3265531911);
+emit_32(1127460897);
+emit_32(1102225500);
+emit_32(3265531911);
+emit_32(1127716880);
+emit_32(1102665010);
+emit_32(3265531911);
+emit_32(1127972864);
+emit_32(1102667894);
+emit_32(3265531911);
+emit_32(1128228848);
+emit_32(1101705144);
+emit_32(3265531911);
+emit_32(1128484897);
+emit_32(1100387503);
+emit_32(3265531911);
+emit_32(1128740880);
+emit_32(1099194486);
+emit_32(3265531911);
+emit_32(1128996864);
+emit_32(1097299866);
+emit_32(3265531911);
+emit_32(1129252848);
+emit_32(1093825515);
+emit_32(3265531911);
+emit_32(1129508897);
+emit_32(1090816720);
+emit_32(3265531911);
+emit_32(1129764880);
+emit_32(1090544321);
+emit_32(3265531911);
+emit_32(1130020864);
+emit_32(1090558718);
+emit_32(3265531911);
+emit_32(1130276848);
+emit_32(1090808845);
+emit_32(3265531911);
+emit_32(1130532897);
+emit_32(1090674481);
+emit_32(3265531911);
+emit_32(1130788880);
+emit_32(1090993898);
+emit_32(3265531911);
+emit_32(1131044864);
+emit_32(1090749297);
+emit_32(3265531911);
+emit_32(1131300848);
+emit_32(1090783533);
+emit_32(3265531911);
+emit_32(1131556897);
+emit_32(1089829685);
+emit_32(3265531911);
+emit_32(1131812880);
+emit_32(1090562483);
+emit_32(3265531911);
+emit_32(1132068864);
+emit_32(1091169052);
+emit_32(3265531911);
+emit_32(1081737216);
+emit_32(1112016683);
+emit_32(3266043904);
+emit_32(1090125824);
+emit_32(1111610963);
+emit_32(3266043904);
+emit_32(1094418484);
+emit_32(1110972380);
+emit_32(3266043904);
+emit_32(1098514432);
+emit_32(1110456559);
+emit_32(3266043904);
+emit_32(1100759066);
+emit_32(1110004833);
+emit_32(3266043904);
+emit_32(1102807040);
+emit_32(1109891010);
+emit_32(3266043904);
+emit_32(1104855066);
+emit_32(1110020745);
+emit_32(3266043904);
+emit_32(1106903040);
+emit_32(1110210065);
+emit_32(3266043904);
+emit_32(1108123661);
+emit_32(1110213526);
+emit_32(3266043904);
+emit_32(1109147648);
+emit_32(1110290465);
+emit_32(3266043904);
+emit_32(1110171661);
+emit_32(1110321843);
+emit_32(3266043904);
+emit_32(1111195648);
+emit_32(1109977832);
+emit_32(3266043904);
+emit_32(1112219661);
+emit_32(1109631120);
+emit_32(3266043904);
+emit_32(1113243648);
+emit_32(1109240762);
+emit_32(3266043904);
+emit_32(1114267661);
+emit_32(1108674478);
+emit_32(3266043904);
+emit_32(1115291648);
+emit_32(1108141775);
+emit_32(3266043904);
+emit_32(1116000263);
+emit_32(1107789637);
+emit_32(3266043904);
+emit_32(1116512256);
+emit_32(1107598534);
+emit_32(3266043904);
+emit_32(1117024263);
+emit_32(1107892555);
+emit_32(3266043904);
+emit_32(1117536256);
+emit_32(1108239712);
+emit_32(3266043904);
+emit_32(1118048263);
+emit_32(1108608811);
+emit_32(3266043904);
+emit_32(1118560256);
+emit_32(1108738520);
+emit_32(3266043904);
+emit_32(1119072263);
+emit_32(1108905191);
+emit_32(3266043904);
+emit_32(1119584256);
+emit_32(1109116820);
+emit_32(3266043904);
+emit_32(1120096263);
+emit_32(1109110843);
+emit_32(3266043904);
+emit_32(1120608322);
+emit_32(1109093384);
+emit_32(3266043904);
+emit_32(1121120289);
+emit_32(1109277331);
+emit_32(3266043904);
+emit_32(1121632256);
+emit_32(1109425678);
+emit_32(3266043904);
+emit_32(1122144223);
+emit_32(1109587814);
+emit_32(3266043904);
+emit_32(1122656322);
+emit_32(1109495330);
+emit_32(3266043904);
+emit_32(1123168289);
+emit_32(1109569438);
+emit_32(3266043904);
+emit_32(1123680256);
+emit_32(1109583358);
+emit_32(3266043904);
+emit_32(1124132848);
+emit_32(1109553945);
+emit_32(3266043904);
+emit_32(1124388897);
+emit_32(1109310833);
+emit_32(3266043904);
+emit_32(1124644880);
+emit_32(1109184820);
+emit_32(3266043904);
+emit_32(1124900864);
+emit_32(1108916725);
+emit_32(3266043904);
+emit_32(1125156848);
+emit_32(1108501594);
+emit_32(3266043904);
+emit_32(1125412897);
+emit_32(1108421037);
+emit_32(3266043904);
+emit_32(1125668880);
+emit_32(1108052070);
+emit_32(3266043904);
+emit_32(1125924864);
+emit_32(1107663887);
+emit_32(3266043904);
+emit_32(1126180848);
+emit_32(1106901100);
+emit_32(3266043904);
+emit_32(1126436897);
+emit_32(1105810896);
+emit_32(3266043904);
+emit_32(1126692880);
+emit_32(1104533153);
+emit_32(3266043904);
+emit_32(1126948864);
+emit_32(1103280577);
+emit_32(3266043904);
+emit_32(1127204848);
+emit_32(1102832153);
+emit_32(3266043904);
+emit_32(1127460897);
+emit_32(1101711226);
+emit_32(3266043904);
+emit_32(1127716880);
+emit_32(1101683910);
+emit_32(3266043904);
+emit_32(1127972864);
+emit_32(1101916956);
+emit_32(3266043904);
+emit_32(1128228848);
+emit_32(1101225945);
+emit_32(3266043904);
+emit_32(1128484897);
+emit_32(1099926497);
+emit_32(3266043904);
+emit_32(1128740880);
+emit_32(1098187591);
+emit_32(3266043904);
+emit_32(1128996864);
+emit_32(1095823367);
+emit_32(3266043904);
+emit_32(1129252848);
+emit_32(1091829718);
+emit_32(3266043904);
+emit_32(1129508897);
+emit_32(1088807932);
+emit_32(3266043904);
+emit_32(1129764880);
+emit_32(1089675104);
+emit_32(3266043904);
+emit_32(1130020864);
+emit_32(1090567704);
+emit_32(3266043904);
+emit_32(1130276848);
+emit_32(1090536174);
+emit_32(3266043904);
+emit_32(1130532897);
+emit_32(1090414497);
+emit_32(3266043904);
+emit_32(1130788880);
+emit_32(1090232632);
+emit_32(3266043904);
+emit_32(1131044864);
+emit_32(1086780888);
+emit_32(3266043904);
+emit_32(1131300848);
+emit_32(1089263098);
+emit_32(3266043904);
+emit_32(1131556897);
+emit_32(1089690267);
+emit_32(3266043904);
+emit_32(1131812880);
+emit_32(1087942248);
+emit_32(3266043904);
+emit_32(1132068864);
+emit_32(1090262202);
+emit_32(3266043904);
+emit_32(1081737216);
+emit_32(1111401326);
+emit_32(3266555911);
+emit_32(1090125824);
+emit_32(1110943623);
+emit_32(3266555911);
+emit_32(1094418484);
+emit_32(1110454960);
+emit_32(3266555911);
+emit_32(1098514432);
+emit_32(1110052097);
+emit_32(3266555911);
+emit_32(1100759066);
+emit_32(1109812734);
+emit_32(3266555911);
+emit_32(1102807040);
+emit_32(1109724706);
+emit_32(3266555911);
+emit_32(1104855066);
+emit_32(1109725597);
+emit_32(3266555911);
+emit_32(1106903040);
+emit_32(1109797162);
+emit_32(3266555911);
+emit_32(1108123661);
+emit_32(1110063972);
+emit_32(3266555911);
+emit_32(1109147648);
+emit_32(1110046147);
+emit_32(3266555911);
+emit_32(1110171661);
+emit_32(1109992119);
+emit_32(3266555911);
+emit_32(1111195648);
+emit_32(1109639850);
+emit_32(3266555911);
+emit_32(1112219661);
+emit_32(1109061691);
+emit_32(3266555911);
+emit_32(1113243648);
+emit_32(1108508410);
+emit_32(3266555911);
+emit_32(1114267661);
+emit_32(1108134540);
+emit_32(3266555911);
+emit_32(1115291648);
+emit_32(1108063604);
+emit_32(3266555911);
+emit_32(1116000263);
+emit_32(1107530351);
+emit_32(3266555911);
+emit_32(1116512256);
+emit_32(1107403761);
+emit_32(3266555911);
+emit_32(1117024263);
+emit_32(1107815668);
+emit_32(3266555911);
+emit_32(1117536256);
+emit_32(1108314030);
+emit_32(3266555911);
+emit_32(1118048263);
+emit_32(1108639613);
+emit_32(3266555911);
+emit_32(1118560256);
+emit_32(1108710628);
+emit_32(3266555911);
+emit_32(1119072263);
+emit_32(1108872213);
+emit_32(3266555911);
+emit_32(1119584256);
+emit_32(1108749215);
+emit_32(3266555911);
+emit_32(1120096263);
+emit_32(1108889462);
+emit_32(3266555911);
+emit_32(1120608322);
+emit_32(1108863484);
+emit_32(3266555911);
+emit_32(1121120289);
+emit_32(1109036604);
+emit_32(3266555911);
+emit_32(1121632256);
+emit_32(1109205713);
+emit_32(3266555911);
+emit_32(1122144223);
+emit_32(1109394116);
+emit_32(3266555911);
+emit_32(1122656322);
+emit_32(1109718781);
+emit_32(3266555911);
+emit_32(1123168289);
+emit_32(1109715871);
+emit_32(3266555911);
+emit_32(1123680256);
+emit_32(1109592926);
+emit_32(3266555911);
+emit_32(1124132848);
+emit_32(1109325932);
+emit_32(3266555911);
+emit_32(1124388897);
+emit_32(1109167623);
+emit_32(3266555911);
+emit_32(1124644880);
+emit_32(1108999930);
+emit_32(3266555911);
+emit_32(1124900864);
+emit_32(1108794147);
+emit_32(3266555911);
+emit_32(1125156848);
+emit_32(1108512054);
+emit_32(3266555911);
+emit_32(1125412897);
+emit_32(1108376184);
+emit_32(3266555911);
+emit_32(1125668880);
+emit_32(1108266215);
+emit_32(3266555911);
+emit_32(1125924864);
+emit_32(1107795326);
+emit_32(3266555911);
+emit_32(1126180848);
+emit_32(1107314763);
+emit_32(3266555911);
+emit_32(1126436897);
+emit_32(1106114511);
+emit_32(3266555911);
+emit_32(1126692880);
+emit_32(1104385514);
+emit_32(3266555911);
+emit_32(1126948864);
+emit_32(1102999506);
+emit_32(3266555911);
+emit_32(1127204848);
+emit_32(1102036337);
+emit_32(3266555911);
+emit_32(1127460897);
+emit_32(1101372378);
+emit_32(3266555911);
+emit_32(1127716880);
+emit_32(1101356021);
+emit_32(3266555911);
+emit_32(1127972864);
+emit_32(1101083863);
+emit_32(3266555911);
+emit_32(1128228848);
+emit_32(1099864211);
+emit_32(3266555911);
+emit_32(1128484897);
+emit_32(1099053662);
+emit_32(3266555911);
+emit_32(1128740880);
+emit_32(1096243846);
+emit_32(3266555911);
+emit_32(1128996864);
+emit_32(1092140631);
+emit_32(3266555911);
+emit_32(1129252848);
+emit_32(1086381925);
+emit_32(3266555911);
+emit_32(1129508897);
+emit_32(1086092015);
+emit_32(3266555911);
+emit_32(1129764880);
+emit_32(1087322309);
+emit_32(3266555911);
+emit_32(1130020864);
+emit_32(1086744250);
+emit_32(3266555911);
+emit_32(1130276848);
+emit_32(1086502784);
+emit_32(3266555911);
+emit_32(1130532897);
+emit_32(1088099933);
+emit_32(3266555911);
+emit_32(1130788880);
+emit_32(1087042801);
+emit_32(3266555911);
+emit_32(1131044864);
+emit_32(1085944166);
+emit_32(3266555911);
+emit_32(1131300848);
+emit_32(1086098348);
+emit_32(3266555911);
+emit_32(1131556897);
+emit_32(1088087979);
+emit_32(3266555911);
+emit_32(1131812880);
+emit_32(1087004759);
+emit_32(3266555911);
+emit_32(1132068864);
+emit_32(1086940628);
+emit_32(3266555911);
+emit_32(1081737216);
+emit_32(1110813757);
+emit_32(3267067904);
+emit_32(1090125824);
+emit_32(1110590462);
+emit_32(3267067904);
+emit_32(1094418484);
+emit_32(1110447410);
+emit_32(3267067904);
+emit_32(1098514432);
+emit_32(1109984621);
+emit_32(3267067904);
+emit_32(1100759066);
+emit_32(1109628053);
+emit_32(3267067904);
+emit_32(1102807040);
+emit_32(1109594341);
+emit_32(3267067904);
+emit_32(1104855066);
+emit_32(1109544298);
+emit_32(3267067904);
+emit_32(1106903040);
+emit_32(1109733881);
+emit_32(3267067904);
+emit_32(1108123661);
+emit_32(1109573291);
+emit_32(3267067904);
+emit_32(1109147648);
+emit_32(1109550878);
+emit_32(3267067904);
+emit_32(1110171661);
+emit_32(1109270961);
+emit_32(3267067904);
+emit_32(1111195648);
+emit_32(1108931091);
+emit_32(3267067904);
+emit_32(1112219661);
+emit_32(1108382633);
+emit_32(3267067904);
+emit_32(1113243648);
+emit_32(1108013298);
+emit_32(3267067904);
+emit_32(1114267661);
+emit_32(1107931011);
+emit_32(3267067904);
+emit_32(1115291648);
+emit_32(1107808171);
+emit_32(3267067904);
+emit_32(1116000263);
+emit_32(1107425519);
+emit_32(3267067904);
+emit_32(1116512256);
+emit_32(1107431129);
+emit_32(3267067904);
+emit_32(1117024263);
+emit_32(1107661423);
+emit_32(3267067904);
+emit_32(1117536256);
+emit_32(1108073723);
+emit_32(3267067904);
+emit_32(1118048263);
+emit_32(1108439492);
+emit_32(3267067904);
+emit_32(1118560256);
+emit_32(1108755874);
+emit_32(3267067904);
+emit_32(1119072263);
+emit_32(1108610122);
+emit_32(3267067904);
+emit_32(1119584256);
+emit_32(1108774538);
+emit_32(3267067904);
+emit_32(1120096263);
+emit_32(1108983703);
+emit_32(3267067904);
+emit_32(1120608322);
+emit_32(1108966611);
+emit_32(3267067904);
+emit_32(1121120289);
+emit_32(1109162171);
+emit_32(3267067904);
+emit_32(1121632256);
+emit_32(1109004596);
+emit_32(3267067904);
+emit_32(1122144223);
+emit_32(1109403972);
+emit_32(3267067904);
+emit_32(1122656322);
+emit_32(1109453098);
+emit_32(3267067904);
+emit_32(1123168289);
+emit_32(1109628944);
+emit_32(3267067904);
+emit_32(1123680256);
+emit_32(1109442953);
+emit_32(3267067904);
+emit_32(1124132848);
+emit_32(1109378597);
+emit_32(3267067904);
+emit_32(1124388897);
+emit_32(1109310151);
+emit_32(3267067904);
+emit_32(1124644880);
+emit_32(1109090370);
+emit_32(3267067904);
+emit_32(1124900864);
+emit_32(1108727012);
+emit_32(3267067904);
+emit_32(1125156848);
+emit_32(1108564378);
+emit_32(3267067904);
+emit_32(1125412897);
+emit_32(1108413016);
+emit_32(3267067904);
+emit_32(1125668880);
+emit_32(1108252662);
+emit_32(3267067904);
+emit_32(1125924864);
+emit_32(1107867468);
+emit_32(3267067904);
+emit_32(1126180848);
+emit_32(1107313322);
+emit_32(3267067904);
+emit_32(1126436897);
+emit_32(1105536274);
+emit_32(3267067904);
+emit_32(1126692880);
+emit_32(1103691199);
+emit_32(3267067904);
+emit_32(1126948864);
+emit_32(1102287156);
+emit_32(3267067904);
+emit_32(1127204848);
+emit_32(1100758437);
+emit_32(3267067904);
+emit_32(1127460897);
+emit_32(1100185390);
+emit_32(3267067904);
+emit_32(1127716880);
+emit_32(1100274781);
+emit_32(3267067904);
+emit_32(1127972864);
+emit_32(1099687789);
+emit_32(3267067904);
+emit_32(1128228848);
+emit_32(1098027264);
+emit_32(3267067904);
+emit_32(1128484897);
+emit_32(1095782577);
+emit_32(3267067904);
+emit_32(1128740880);
+emit_32(1092060656);
+emit_32(3267067904);
+emit_32(1128996864);
+emit_32(1085479584);
+emit_32(3267067904);
+emit_32(1129252848);
+emit_32(1080427922);
+emit_32(3267067904);
+emit_32(1129508897);
+emit_32(1082737893);
+emit_32(3267067904);
+emit_32(1129764880);
+emit_32(1082587842);
+emit_32(3267067904);
+emit_32(1130020864);
+emit_32(1082372569);
+emit_32(3267067904);
+emit_32(1130276848);
+emit_32(1085083537);
+emit_32(3267067904);
+emit_32(1130532897);
+emit_32(1085407211);
+emit_32(3267067904);
+emit_32(1130788880);
+emit_32(1084963160);
+emit_32(3267067904);
+emit_32(1131044864);
+emit_32(1084737318);
+emit_32(3267067904);
+emit_32(1131300848);
+emit_32(1083924504);
+emit_32(3267067904);
+emit_32(1131556897);
+emit_32(1084286829);
+emit_32(3267067904);
+emit_32(1131812880);
+emit_32(1084905342);
+emit_32(3267067904);
+emit_32(1132068864);
+emit_32(1085475641);
+emit_32(3267067904);
+emit_32(1081737216);
+emit_32(1110694612);
+emit_32(3267579911);
+emit_32(1090125824);
+emit_32(1110646797);
+emit_32(3267579911);
+emit_32(1094418484);
+emit_32(1110299640);
+emit_32(3267579911);
+emit_32(1098514432);
+emit_32(1110057393);
+emit_32(3267579911);
+emit_32(1100759066);
+emit_32(1109526053);
+emit_32(3267579911);
+emit_32(1102807040);
+emit_32(1109344807);
+emit_32(3267579911);
+emit_32(1104855066);
+emit_32(1109452259);
+emit_32(3267579911);
+emit_32(1106903040);
+emit_32(1109261550);
+emit_32(3267579911);
+emit_32(1108123661);
+emit_32(1109082820);
+emit_32(3267579911);
+emit_32(1109147648);
+emit_32(1108958406);
+emit_32(3267579911);
+emit_32(1110171661);
+emit_32(1108756398);
+emit_32(3267579911);
+emit_32(1111195648);
+emit_32(1108426831);
+emit_32(3267579911);
+emit_32(1112219661);
+emit_32(1107880234);
+emit_32(3267579911);
+emit_32(1113243648);
+emit_32(1107647398);
+emit_32(3267579911);
+emit_32(1114267661);
+emit_32(1107551060);
+emit_32(3267579911);
+emit_32(1115291648);
+emit_32(1107461800);
+emit_32(3267579911);
+emit_32(1116000263);
+emit_32(1107421980);
+emit_32(3267579911);
+emit_32(1116512256);
+emit_32(1107111287);
+emit_32(3267579911);
+emit_32(1117024263);
+emit_32(1107355396);
+emit_32(3267579911);
+emit_32(1117536256);
+emit_32(1107770029);
+emit_32(3267579911);
+emit_32(1118048263);
+emit_32(1108281682);
+emit_32(3267579911);
+emit_32(1118560256);
+emit_32(1108475930);
+emit_32(3267579911);
+emit_32(1119072263);
+emit_32(1108583724);
+emit_32(3267579911);
+emit_32(1119584256);
+emit_32(1108787908);
+emit_32(3267579911);
+emit_32(1120096263);
+emit_32(1108859761);
+emit_32(3267579911);
+emit_32(1120608322);
+emit_32(1109119625);
+emit_32(3267579911);
+emit_32(1121120289);
+emit_32(1109310125);
+emit_32(3267579911);
+emit_32(1121632256);
+emit_32(1109129088);
+emit_32(3267579911);
+emit_32(1122144223);
+emit_32(1109416267);
+emit_32(3267579911);
+emit_32(1122656322);
+emit_32(1109508751);
+emit_32(3267579911);
+emit_32(1123168289);
+emit_32(1109311540);
+emit_32(3267579911);
+emit_32(1123680256);
+emit_32(1109131552);
+emit_32(3267579911);
+emit_32(1124132848);
+emit_32(1109360247);
+emit_32(3267579911);
+emit_32(1124388897);
+emit_32(1109275522);
+emit_32(3267579911);
+emit_32(1124644880);
+emit_32(1108801749);
+emit_32(3267579911);
+emit_32(1124900864);
+emit_32(1108467804);
+emit_32(3267579911);
+emit_32(1125156848);
+emit_32(1108391100);
+emit_32(3267579911);
+emit_32(1125412897);
+emit_32(1108331096);
+emit_32(3267579911);
+emit_32(1125668880);
+emit_32(1108112599);
+emit_32(3267579911);
+emit_32(1125924864);
+emit_32(1107624355);
+emit_32(3267579911);
+emit_32(1126180848);
+emit_32(1106590564);
+emit_32(3267579911);
+emit_32(1126436897);
+emit_32(1104796346);
+emit_32(3267579911);
+emit_32(1126692880);
+emit_32(1102786068);
+emit_32(3267579911);
+emit_32(1126948864);
+emit_32(1101357226);
+emit_32(3267579911);
+emit_32(1127204848);
+emit_32(1100162793);
+emit_32(3267579911);
+emit_32(1127460897);
+emit_32(1099771412);
+emit_32(3267579911);
+emit_32(1127716880);
+emit_32(1098962017);
+emit_32(3267579911);
+emit_32(1127972864);
+emit_32(1097608462);
+emit_32(3267579911);
+emit_32(1128228848);
+emit_32(1094970874);
+emit_32(3267579911);
+emit_32(1128484897);
+emit_32(1092021933);
+emit_32(3267579911);
+emit_32(1128740880);
+emit_32(1088236919);
+emit_32(3267579911);
+emit_32(1128996864);
+emit_32(1082682696);
+emit_32(3267579911);
+emit_32(1129252848);
+emit_32(1079924773);
+emit_32(3267579911);
+emit_32(1129508897);
+emit_32(1081076487);
+emit_32(3267579911);
+emit_32(1129764880);
+emit_32(1081136801);
+emit_32(3267579911);
+emit_32(1130020864);
+emit_32(1081313088);
+emit_32(3267579911);
+emit_32(1130276848);
+emit_32(1082622067);
+emit_32(3267579911);
+emit_32(1130532897);
+emit_32(1080914755);
+emit_32(3267579911);
+emit_32(1130788880);
+emit_32(1081174131);
+emit_32(3267579911);
+emit_32(1131044864);
+emit_32(1081307258);
+emit_32(3267579911);
+emit_32(1131300848);
+emit_32(1080904101);
+emit_32(3267579911);
+emit_32(1131556897);
+emit_32(1082632301);
+emit_32(3267579911);
+emit_32(1131812880);
+emit_32(1082980177);
+emit_32(3267579911);
+emit_32(1132068864);
+emit_32(1083203964);
+emit_32(3267579911);
+emit_32(1081737216);
+emit_32(1110581209);
+emit_32(3268091970);
+emit_32(1090125824);
+emit_32(1110551586);
+emit_32(3268091970);
+emit_32(1094418484);
+emit_32(1110307347);
+emit_32(3268091970);
+emit_32(1098514432);
+emit_32(1109985591);
+emit_32(3268091970);
+emit_32(1100759066);
+emit_32(1109670180);
+emit_32(3268091970);
+emit_32(1102807040);
+emit_32(1109393303);
+emit_32(3268091970);
+emit_32(1104855066);
+emit_32(1109233946);
+emit_32(3268091970);
+emit_32(1106903040);
+emit_32(1109280450);
+emit_32(3268091970);
+emit_32(1108123661);
+emit_32(1108630281);
+emit_32(3268091970);
+emit_32(1109147648);
+emit_32(1108457449);
+emit_32(3268091970);
+emit_32(1110171661);
+emit_32(1108487176);
+emit_32(3268091970);
+emit_32(1111195648);
+emit_32(1108197114);
+emit_32(3268091970);
+emit_32(1112219661);
+emit_32(1107653847);
+emit_32(3268091970);
+emit_32(1113243648);
+emit_32(1107312745);
+emit_32(3268091970);
+emit_32(1114267661);
+emit_32(1107342131);
+emit_32(3268091970);
+emit_32(1115291648);
+emit_32(1107499418);
+emit_32(3268091970);
+emit_32(1116000263);
+emit_32(1107104104);
+emit_32(3268091970);
+emit_32(1116512256);
+emit_32(1107322497);
+emit_32(3268091970);
+emit_32(1117024263);
+emit_32(1107451078);
+emit_32(3268091970);
+emit_32(1117536256);
+emit_32(1107597774);
+emit_32(3268091970);
+emit_32(1118048263);
+emit_32(1108134383);
+emit_32(3268091970);
+emit_32(1118560256);
+emit_32(1108348292);
+emit_32(3268091970);
+emit_32(1119072263);
+emit_32(1108697206);
+emit_32(3268091970);
+emit_32(1119584256);
+emit_32(1108767120);
+emit_32(3268091970);
+emit_32(1120096263);
+emit_32(1108911089);
+emit_32(3268091970);
+emit_32(1120608322);
+emit_32(1109333115);
+emit_32(3268091970);
+emit_32(1121120289);
+emit_32(1109311147);
+emit_32(3268091970);
+emit_32(1121632256);
+emit_32(1109257853);
+emit_32(3268091970);
+emit_32(1122144223);
+emit_32(1109429663);
+emit_32(3268091970);
+emit_32(1122656322);
+emit_32(1109626926);
+emit_32(3268091970);
+emit_32(1123168289);
+emit_32(1109223460);
+emit_32(3268091970);
+emit_32(1123680256);
+emit_32(1109113464);
+emit_32(3268091970);
+emit_32(1124132848);
+emit_32(1109197770);
+emit_32(3268091970);
+emit_32(1124388897);
+emit_32(1108996941);
+emit_32(3268091970);
+emit_32(1124644880);
+emit_32(1108521910);
+emit_32(3268091970);
+emit_32(1124900864);
+emit_32(1108156167);
+emit_32(3268091970);
+emit_32(1125156848);
+emit_32(1108312169);
+emit_32(3268091970);
+emit_32(1125412897);
+emit_32(1108417210);
+emit_32(3268091970);
+emit_32(1125668880);
+emit_32(1108025410);
+emit_32(3268091970);
+emit_32(1125924864);
+emit_32(1107366039);
+emit_32(3268091970);
+emit_32(1126180848);
+emit_32(1106152836);
+emit_32(3268091970);
+emit_32(1126436897);
+emit_32(1104094377);
+emit_32(3268091970);
+emit_32(1126692880);
+emit_32(1102342783);
+emit_32(3268091970);
+emit_32(1126948864);
+emit_32(1101171838);
+emit_32(3268091970);
+emit_32(1127204848);
+emit_32(1099584871);
+emit_32(3268091970);
+emit_32(1127460897);
+emit_32(1099343069);
+emit_32(3268091970);
+emit_32(1127716880);
+emit_32(1097562115);
+emit_32(3268091970);
+emit_32(1127972864);
+emit_32(1094777202);
+emit_32(3268091970);
+emit_32(1128228848);
+emit_32(1092522051);
+emit_32(3268091970);
+emit_32(1128484897);
+emit_32(1088883870);
+emit_32(3268091970);
+emit_32(1128740880);
+emit_32(1085242165);
+emit_32(3268091970);
+emit_32(1128996864);
+emit_32(1078093792);
+emit_32(3268091970);
+emit_32(1129252848);
+emit_32(1078026222);
+emit_32(3268091970);
+emit_32(1129508897);
+emit_32(1077460788);
+emit_32(3268091970);
+emit_32(1129764880);
+emit_32(1078305017);
+emit_32(3268091970);
+emit_32(1130020864);
+emit_32(1079773820);
+emit_32(3268091970);
+emit_32(1130276848);
+emit_32(1080393613);
+emit_32(3268091970);
+emit_32(1130532897);
+emit_32(1078685021);
+emit_32(3268091970);
+emit_32(1130788880);
+emit_32(1075784911);
+emit_32(3268091970);
+emit_32(1131044864);
+emit_32(1076529820);
+emit_32(3268091970);
+emit_32(1131300848);
+emit_32(1074011602);
+emit_32(3268091970);
+emit_32(1131556897);
+emit_32(1075826561);
+emit_32(3268091970);
+emit_32(1131812880);
+emit_32(1078155029);
+emit_32(3268091970);
+emit_32(1132068864);
+emit_32(1080836699);
+emit_32(3268091970);
+emit_32(1081737216);
+emit_32(1110663915);
+emit_32(3268603937);
+emit_32(1090125824);
+emit_32(1110523301);
+emit_32(3268603937);
+emit_32(1094418484);
+emit_32(1110414092);
+emit_32(3268603937);
+emit_32(1098514432);
+emit_32(1110239740);
+emit_32(3268603937);
+emit_32(1100759066);
+emit_32(1110111263);
+emit_32(3268603937);
+emit_32(1102807040);
+emit_32(1109732989);
+emit_32(3268603937);
+emit_32(1104855066);
+emit_32(1109257434);
+emit_32(3268603937);
+emit_32(1106903040);
+emit_32(1108986639);
+emit_32(3268603937);
+emit_32(1108123661);
+emit_32(1108299324);
+emit_32(3268603937);
+emit_32(1109147648);
+emit_32(1108108666);
+emit_32(3268603937);
+emit_32(1110171661);
+emit_32(1108133256);
+emit_32(3268603937);
+emit_32(1111195648);
+emit_32(1107900341);
+emit_32(3268603937);
+emit_32(1112219661);
+emit_32(1106990544);
+emit_32(3268603937);
+emit_32(1113243648);
+emit_32(1106677911);
+emit_32(3268603937);
+emit_32(1114267661);
+emit_32(1106924116);
+emit_32(3268603937);
+emit_32(1115291648);
+emit_32(1107371465);
+emit_32(3268603937);
+emit_32(1116000263);
+emit_32(1107430500);
+emit_32(3268603937);
+emit_32(1116512256);
+emit_32(1107498631);
+emit_32(3268603937);
+emit_32(1117024263);
+emit_32(1107438390);
+emit_32(3268603937);
+emit_32(1117536256);
+emit_32(1107833808);
+emit_32(3268603937);
+emit_32(1118048263);
+emit_32(1108210981);
+emit_32(3268603937);
+emit_32(1118560256);
+emit_32(1108542226);
+emit_32(3268603937);
+emit_32(1119072263);
+emit_32(1108787882);
+emit_32(3268603937);
+emit_32(1119584256);
+emit_32(1108829274);
+emit_32(3268603937);
+emit_32(1120096263);
+emit_32(1109124029);
+emit_32(3268603937);
+emit_32(1120608322);
+emit_32(1109412387);
+emit_32(3268603937);
+emit_32(1121120289);
+emit_32(1109324752);
+emit_32(3268603937);
+emit_32(1121632256);
+emit_32(1109233631);
+emit_32(3268603937);
+emit_32(1122144223);
+emit_32(1109356105);
+emit_32(3268603937);
+emit_32(1122656322);
+emit_32(1109523353);
+emit_32(3268603937);
+emit_32(1123168289);
+emit_32(1109276492);
+emit_32(3268603937);
+emit_32(1123680256);
+emit_32(1109141330);
+emit_32(3268603937);
+emit_32(1124132848);
+emit_32(1108924485);
+emit_32(3268603937);
+emit_32(1124388897);
+emit_32(1108532029);
+emit_32(3268603937);
+emit_32(1124644880);
+emit_32(1108013482);
+emit_32(3268603937);
+emit_32(1124900864);
+emit_32(1107879159);
+emit_32(3268603937);
+emit_32(1125156848);
+emit_32(1108192290);
+emit_32(3268603937);
+emit_32(1125412897);
+emit_32(1108199499);
+emit_32(3268603937);
+emit_32(1125668880);
+emit_32(1107673455);
+emit_32(3268603937);
+emit_32(1125924864);
+emit_32(1106232371);
+emit_32(3268603937);
+emit_32(1126180848);
+emit_32(1104800226);
+emit_32(3268603937);
+emit_32(1126436897);
+emit_32(1103280682);
+emit_32(3268603937);
+emit_32(1126692880);
+emit_32(1102286055);
+emit_32(3268603937);
+emit_32(1126948864);
+emit_32(1100759748);
+emit_32(3268603937);
+emit_32(1127204848);
+emit_32(1099429367);
+emit_32(3268603937);
+emit_32(1127460897);
+emit_32(1097617900);
+emit_32(3268603937);
+emit_32(1127716880);
+emit_32(1095952341);
+emit_32(3268603937);
+emit_32(1127972864);
+emit_32(1093005319);
+emit_32(3268603937);
+emit_32(1128228848);
+emit_32(1088642320);
+emit_32(3268603937);
+emit_32(1128484897);
+emit_32(1085144270);
+emit_32(3268603937);
+emit_32(1128740880);
+emit_32(1079423554);
+emit_32(3268603937);
+emit_32(1128996864);
+emit_32(1075473065);
+emit_32(3268603937);
+emit_32(1129252848);
+emit_32(1075224804);
+emit_32(3268603937);
+emit_32(1129508897);
+emit_32(1074942527);
+emit_32(3268603937);
+emit_32(1129764880);
+emit_32(1070517327);
+emit_32(3268603937);
+emit_32(1130020864);
+emit_32(1076303998);
+emit_32(3268603937);
+emit_32(1130276848);
+emit_32(1075194647);
+emit_32(3268603937);
+emit_32(1130532897);
+emit_32(1069302069);
+emit_32(3268603937);
+emit_32(1130788880);
+emit_32(1059149840);
+emit_32(3268603937);
+emit_32(1131044864);
+emit_32(1062802928);
+emit_32(3268603937);
+emit_32(1131300848);
+emit_32(1068305922);
+emit_32(3268603937);
+emit_32(1131556897);
+emit_32(1074623970);
+emit_32(3268603937);
+emit_32(1131812880);
+emit_32(1077991619);
+emit_32(3268603937);
+emit_32(1132068864);
+emit_32(1078469350);
+emit_32(3268603937);
+emit_32(1081737216);
+emit_32(1110808645);
+emit_32(3269115904);
+emit_32(1090125824);
+emit_32(1110606427);
+emit_32(3269115904);
+emit_32(1094418484);
+emit_32(1110590725);
+emit_32(3269115904);
+emit_32(1098514432);
+emit_32(1110520575);
+emit_32(3269115904);
+emit_32(1100759066);
+emit_32(1110320952);
+emit_32(3269115904);
+emit_32(1102807040);
+emit_32(1109925718);
+emit_32(3269115904);
+emit_32(1104855066);
+emit_32(1109578691);
+emit_32(3269115904);
+emit_32(1106903040);
+emit_32(1109301579);
+emit_32(3269115904);
+emit_32(1108123661);
+emit_32(1108401481);
+emit_32(3269115904);
+emit_32(1109147648);
+emit_32(1108050418);
+emit_32(3269115904);
+emit_32(1110171661);
+emit_32(1108134828);
+emit_32(3269115904);
+emit_32(1111195648);
+emit_32(1107813047);
+emit_32(3269115904);
+emit_32(1112219661);
+emit_32(1106770867);
+emit_32(3269115904);
+emit_32(1113243648);
+emit_32(1107263016);
+emit_32(3269115904);
+emit_32(1114267661);
+emit_32(1107073696);
+emit_32(3269115904);
+emit_32(1115291648);
+emit_32(1107071861);
+emit_32(3269115904);
+emit_32(1116000263);
+emit_32(1107575911);
+emit_32(3269115904);
+emit_32(1116512256);
+emit_32(1107727326);
+emit_32(3269115904);
+emit_32(1117024263);
+emit_32(1107439570);
+emit_32(3269115904);
+emit_32(1117536256);
+emit_32(1107890956);
+emit_32(3269115904);
+emit_32(1118048263);
+emit_32(1108361426);
+emit_32(3269115904);
+emit_32(1118560256);
+emit_32(1108752964);
+emit_32(3269115904);
+emit_32(1119072263);
+emit_32(1109015894);
+emit_32(3269115904);
+emit_32(1119584256);
+emit_32(1109044966);
+emit_32(3269115904);
+emit_32(1120096263);
+emit_32(1109198320);
+emit_32(3269115904);
+emit_32(1120608322);
+emit_32(1109370103);
+emit_32(3269115904);
+emit_32(1121120289);
+emit_32(1109373380);
+emit_32(3269115904);
+emit_32(1121632256);
+emit_32(1109279795);
+emit_32(3269115904);
+emit_32(1122144223);
+emit_32(1109433568);
+emit_32(3269115904);
+emit_32(1122656322);
+emit_32(1109623387);
+emit_32(3269115904);
+emit_32(1123168289);
+emit_32(1109428273);
+emit_32(3269115904);
+emit_32(1123680256);
+emit_32(1108960346);
+emit_32(3269115904);
+emit_32(1124132848);
+emit_32(1108585323);
+emit_32(3269115904);
+emit_32(1124388897);
+emit_32(1108055818);
+emit_32(3269115904);
+emit_32(1124644880);
+emit_32(1107534728);
+emit_32(3269115904);
+emit_32(1124900864);
+emit_32(1107471001);
+emit_32(3269115904);
+emit_32(1125156848);
+emit_32(1107590041);
+emit_32(3269115904);
+emit_32(1125412897);
+emit_32(1107454172);
+emit_32(3269115904);
+emit_32(1125668880);
+emit_32(1106832209);
+emit_32(3269115904);
+emit_32(1125924864);
+emit_32(1105088217);
+emit_32(3269115904);
+emit_32(1126180848);
+emit_32(1103608676);
+emit_32(3269115904);
+emit_32(1126436897);
+emit_32(1102467039);
+emit_32(3269115904);
+emit_32(1126692880);
+emit_32(1101262068);
+emit_32(3269115904);
+emit_32(1126948864);
+emit_32(1100082158);
+emit_32(3269115904);
+emit_32(1127204848);
+emit_32(1098845677);
+emit_32(3269115904);
+emit_32(1127460897);
+emit_32(1095460140);
+emit_32(3269115904);
+emit_32(1127716880);
+emit_32(1093620938);
+emit_32(3269115904);
+emit_32(1127972864);
+emit_32(1089412289);
+emit_32(3269115904);
+emit_32(1128228848);
+emit_32(1083970620);
+emit_32(3269115904);
+emit_32(1128484897);
+emit_32(1077038086);
+emit_32(3269115904);
+emit_32(1128740880);
+emit_32(1069835165);
+emit_32(3269115904);
+emit_32(1128996864);
+emit_32(1070535279);
+emit_32(3269115904);
+emit_32(1129252848);
+emit_32(1071829221);
+emit_32(3269115904);
+emit_32(1129508897);
+emit_32(1066648753);
+emit_32(3269115904);
+emit_32(1129764880);
+emit_32(1051679953);
+emit_32(3269115904);
+emit_32(1130020864);
+emit_32(1057135450);
+emit_32(3269115904);
+emit_32(1130276848);
+emit_32(1048743000);
+emit_32(3269115904);
+emit_32(1130532897);
+emit_32(3194534264);
+emit_32(3269115904);
+emit_32(1130788880);
+emit_32(3210162995);
+emit_32(3269115904);
+emit_32(1131044864);
+emit_32(3197138557);
+emit_32(3269115904);
+emit_32(1131300848);
+emit_32(1054446180);
+emit_32(3269115904);
+emit_32(1131556897);
+emit_32(1071525302);
+emit_32(3269115904);
+emit_32(1131812880);
+emit_32(1072082306);
+emit_32(3269115904);
+emit_32(1132068864);
+emit_32(1070395189);
+emit_32(3269115904);
+emit_32(1081737216);
+emit_32(1111356054);
+emit_32(3269627871);
+emit_32(1090125824);
+emit_32(1111049765);
+emit_32(3269627871);
+emit_32(1094418484);
+emit_32(1111095011);
+emit_32(3269627871);
+emit_32(1098514432);
+emit_32(1110769821);
+emit_32(3269627871);
+emit_32(1100759066);
+emit_32(1110387956);
+emit_32(3269627871);
+emit_32(1102807040);
+emit_32(1110076608);
+emit_32(3269627871);
+emit_32(1104855066);
+emit_32(1109830507);
+emit_32(3269627871);
+emit_32(1106903040);
+emit_32(1109267474);
+emit_32(3269627871);
+emit_32(1108123661);
+emit_32(1108522670);
+emit_32(3269627871);
+emit_32(1109147648);
+emit_32(1108306716);
+emit_32(3269627871);
+emit_32(1110171661);
+emit_32(1108152078);
+emit_32(3269627871);
+emit_32(1111195648);
+emit_32(1107581521);
+emit_32(3269627871);
+emit_32(1112219661);
+emit_32(1106841751);
+emit_32(3269627871);
+emit_32(1113243648);
+emit_32(1107248808);
+emit_32(3269627871);
+emit_32(1114267661);
+emit_32(1107071599);
+emit_32(3269627871);
+emit_32(1115291648);
+emit_32(1107391729);
+emit_32(3269627871);
+emit_32(1116000263);
+emit_32(1107625981);
+emit_32(3269627871);
+emit_32(1116512256);
+emit_32(1107606818);
+emit_32(3269627871);
+emit_32(1117024263);
+emit_32(1107732044);
+emit_32(3269627871);
+emit_32(1117536256);
+emit_32(1108255231);
+emit_32(3269627871);
+emit_32(1118048263);
+emit_32(1108554259);
+emit_32(3269627871);
+emit_32(1118560256);
+emit_32(1108867835);
+emit_32(3269627871);
+emit_32(1119072263);
+emit_32(1109054272);
+emit_32(3269627871);
+emit_32(1119584256);
+emit_32(1109386251);
+emit_32(3269627871);
+emit_32(1120096263);
+emit_32(1109299298);
+emit_32(3269627871);
+emit_32(1120608322);
+emit_32(1109427959);
+emit_32(3269627871);
+emit_32(1121120289);
+emit_32(1109424079);
+emit_32(3269627871);
+emit_32(1121632256);
+emit_32(1109411181);
+emit_32(3269627871);
+emit_32(1122144223);
+emit_32(1109433621);
+emit_32(3269627871);
+emit_32(1122656322);
+emit_32(1109598955);
+emit_32(3269627871);
+emit_32(1123168289);
+emit_32(1109218086);
+emit_32(3269627871);
+emit_32(1123680256);
+emit_32(1108916909);
+emit_32(3269627871);
+emit_32(1124132848);
+emit_32(1108631119);
+emit_32(3269627871);
+emit_32(1124388897);
+emit_32(1108074483);
+emit_32(3269627871);
+emit_32(1124644880);
+emit_32(1107470084);
+emit_32(3269627871);
+emit_32(1124900864);
+emit_32(1106751049);
+emit_32(3269627871);
+emit_32(1125156848);
+emit_32(1106805732);
+emit_32(3269627871);
+emit_32(1125412897);
+emit_32(1106063917);
+emit_32(3269627871);
+emit_32(1125668880);
+emit_32(1104941941);
+emit_32(3269627871);
+emit_32(1125924864);
+emit_32(1103592738);
+emit_32(3269627871);
+emit_32(1126180848);
+emit_32(1102378749);
+emit_32(3269627871);
+emit_32(1126436897);
+emit_32(1101064359);
+emit_32(3269627871);
+emit_32(1126692880);
+emit_32(1099948989);
+emit_32(3269627871);
+emit_32(1126948864);
+emit_32(1098973289);
+emit_32(3269627871);
+emit_32(1127204848);
+emit_32(1097124125);
+emit_32(3269627871);
+emit_32(1127460897);
+emit_32(1094111671);
+emit_32(3269627871);
+emit_32(1127716880);
+emit_32(1091103611);
+emit_32(3269627871);
+emit_32(1127972864);
+emit_32(1086368084);
+emit_32(3269627871);
+emit_32(1128228848);
+emit_32(1078725915);
+emit_32(3269627871);
+emit_32(1128484897);
+emit_32(1069950844);
+emit_32(3269627871);
+emit_32(1128740880);
+emit_32(1018630897);
+emit_32(3269627871);
+emit_32(1128996864);
+emit_32(3181731986);
+emit_32(3269627871);
+emit_32(1129252848);
+emit_32(3201792590);
+emit_32(3269627871);
+emit_32(1129508897);
+emit_32(3204973752);
+emit_32(3269627871);
+emit_32(1129764880);
+emit_32(3215721958);
+emit_32(3269627871);
+emit_32(1130020864);
+emit_32(3222414389);
+emit_32(3269627871);
+emit_32(1130276848);
+emit_32(3222253076);
+emit_32(3269627871);
+emit_32(1130532897);
+emit_32(3222187310);
+emit_32(3269627871);
+emit_32(1130788880);
+emit_32(3216801991);
+emit_32(3269627871);
+emit_32(1131044864);
+emit_32(3205181336);
+emit_32(3269627871);
+emit_32(1131300848);
+emit_32(3200822633);
+emit_32(3269627871);
+emit_32(1131556897);
+emit_32(3196733320);
+emit_32(3269627871);
+emit_32(1131812880);
+emit_32(3206975391);
+emit_32(3269627871);
+emit_32(1132068864);
+emit_32(1038377734);
+emit_32(3269627871);
+emit_32(1081737216);
+emit_32(1111592455);
+emit_32(3270139970);
+emit_32(1090125824);
+emit_32(1111491609);
+emit_32(3270139970);
+emit_32(1094418484);
+emit_32(1111194940);
+emit_32(3270139970);
+emit_32(1098514432);
+emit_32(1110835331);
+emit_32(3270139970);
+emit_32(1100759066);
+emit_32(1110275365);
+emit_32(3270139970);
+emit_32(1102807040);
+emit_32(1110005567);
+emit_32(3270139970);
+emit_32(1104855066);
+emit_32(1109696499);
+emit_32(3270139970);
+emit_32(1106903040);
+emit_32(1109176772);
+emit_32(3270139970);
+emit_32(1108123661);
+emit_32(1108885556);
+emit_32(3270139970);
+emit_32(1109147648);
+emit_32(1108468774);
+emit_32(3270139970);
+emit_32(1110171661);
+emit_32(1108030285);
+emit_32(3270139970);
+emit_32(1111195648);
+emit_32(1107430028);
+emit_32(3270139970);
+emit_32(1112219661);
+emit_32(1107103737);
+emit_32(3270139970);
+emit_32(1113243648);
+emit_32(1107092098);
+emit_32(3270139970);
+emit_32(1114267661);
+emit_32(1107375004);
+emit_32(3270139970);
+emit_32(1115291648);
+emit_32(1107478708);
+emit_32(3270139970);
+emit_32(1116000263);
+emit_32(1107657884);
+emit_32(3270139970);
+emit_32(1116512256);
+emit_32(1107812575);
+emit_32(3270139970);
+emit_32(1117024263);
+emit_32(1108062005);
+emit_32(3270139970);
+emit_32(1117536256);
+emit_32(1108546316);
+emit_32(3270139970);
+emit_32(1118048263);
+emit_32(1108808198);
+emit_32(3270139970);
+emit_32(1118560256);
+emit_32(1108821253);
+emit_32(3270139970);
+emit_32(1119072263);
+emit_32(1108944565);
+emit_32(3270139970);
+emit_32(1119584256);
+emit_32(1109292509);
+emit_32(3270139970);
+emit_32(1120096263);
+emit_32(1109325827);
+emit_32(3270139970);
+emit_32(1120608322);
+emit_32(1109645355);
+emit_32(3270139970);
+emit_32(1121120289);
+emit_32(1109627555);
+emit_32(3270139970);
+emit_32(1121632256);
+emit_32(1109566502);
+emit_32(3270139970);
+emit_32(1122144223);
+emit_32(1109470347);
+emit_32(3270139970);
+emit_32(1122656322);
+emit_32(1109358831);
+emit_32(3270139970);
+emit_32(1123168289);
+emit_32(1109156561);
+emit_32(3270139970);
+emit_32(1123680256);
+emit_32(1108641920);
+emit_32(3270139970);
+emit_32(1124132848);
+emit_32(1108219580);
+emit_32(3270139970);
+emit_32(1124388897);
+emit_32(1107796112);
+emit_32(3270139970);
+emit_32(1124644880);
+emit_32(1107364885);
+emit_32(3270139970);
+emit_32(1124900864);
+emit_32(1106177268);
+emit_32(3270139970);
+emit_32(1125156848);
+emit_32(1105288443);
+emit_32(3270139970);
+emit_32(1125412897);
+emit_32(1104753197);
+emit_32(3270139970);
+emit_32(1125668880);
+emit_32(1103375473);
+emit_32(3270139970);
+emit_32(1125924864);
+emit_32(1102075344);
+emit_32(3270139970);
+emit_32(1126180848);
+emit_32(1100964849);
+emit_32(3270139970);
+emit_32(1126436897);
+emit_32(1099792384);
+emit_32(3270139970);
+emit_32(1126692880);
+emit_32(1098450049);
+emit_32(3270139970);
+emit_32(1126948864);
+emit_32(1096338322);
+emit_32(3270139970);
+emit_32(1127204848);
+emit_32(1093954280);
+emit_32(3270139970);
+emit_32(1127460897);
+emit_32(1091524247);
+emit_32(3270139970);
+emit_32(1127716880);
+emit_32(1088518839);
+emit_32(3270139970);
+emit_32(1127972864);
+emit_32(1083884385);
+emit_32(3270139970);
+emit_32(1128228848);
+emit_32(1076931424);
+emit_32(3270139970);
+emit_32(1128484897);
+emit_32(1044557454);
+emit_32(3270139970);
+emit_32(1128740880);
+emit_32(3205427693);
+emit_32(3270139970);
+emit_32(1128996864);
+emit_32(3213113940);
+emit_32(3270139970);
+emit_32(1129252848);
+emit_32(3221962118);
+emit_32(3270139970);
+emit_32(1129508897);
+emit_32(3220483500);
+emit_32(3270139970);
+emit_32(1129764880);
+emit_32(3225420531);
+emit_32(3270139970);
+emit_32(1130020864);
+emit_32(3230173831);
+emit_32(3270139970);
+emit_32(1130276848);
+emit_32(3232043735);
+emit_32(3270139970);
+emit_32(1130532897);
+emit_32(3227363752);
+emit_32(3270139970);
+emit_32(1130788880);
+emit_32(3221899790);
+emit_32(3270139970);
+emit_32(1131044864);
+emit_32(3216845360);
+emit_32(3270139970);
+emit_32(1131300848);
+emit_32(3219415546);
+emit_32(3270139970);
+emit_32(1131556897);
+emit_32(3212863456);
+emit_32(3270139970);
+emit_32(1131812880);
+emit_32(3221056106);
+emit_32(3270139970);
+emit_32(1132068864);
+emit_32(3222457423);
+emit_32(3270139970);
+emit_start(Landscape04Vtx)
+emit_32(1081737216);
+emit_32(1100462372);
+emit_32(1123680256);
+emit_32(1081737216);
+emit_32(1101050728);
+emit_32(1124132848);
+emit_32(1090125824);
+emit_32(1101307000);
+emit_32(1123680256);
+emit_32(1090125824);
+emit_32(1101569144);
+emit_32(1124132848);
+emit_32(1094418484);
+emit_32(1101816870);
+emit_32(1123680256);
+emit_32(1094418484);
+emit_32(1101742788);
+emit_32(1124132848);
+emit_32(1098514432);
+emit_32(1102313580);
+emit_32(1123680256);
+emit_32(1098514432);
+emit_32(1102383625);
+emit_32(1124132848);
+emit_32(1100759066);
+emit_32(1102224504);
+emit_32(1123680256);
+emit_32(1100759066);
+emit_32(1102114927);
+emit_32(1124132848);
+emit_32(1102807040);
+emit_32(1101213834);
+emit_32(1123680256);
+emit_32(1102807040);
+emit_32(1101213309);
+emit_32(1124132848);
+emit_32(1104855066);
+emit_32(1100303408);
+emit_32(1123680256);
+emit_32(1104855066);
+emit_32(1100341209);
+emit_32(1124132848);
+emit_32(1106903040);
+emit_32(1099679610);
+emit_32(1123680256);
+emit_32(1106903040);
+emit_32(1099911345);
+emit_32(1124132848);
+emit_32(1108123661);
+emit_32(1099160984);
+emit_32(1123680256);
+emit_32(1108123661);
+emit_32(1099586129);
+emit_32(1124132848);
+emit_32(1109147648);
+emit_32(1098137259);
+emit_32(1123680256);
+emit_32(1109147648);
+emit_32(1099190030);
+emit_32(1124132848);
+emit_32(1110171661);
+emit_32(1097207906);
+emit_32(1123680256);
+emit_32(1110171661);
+emit_32(1098581751);
+emit_32(1124132848);
+emit_32(1111195648);
+emit_32(1096797074);
+emit_32(1123680256);
+emit_32(1111195648);
+emit_32(1097483053);
+emit_32(1124132848);
+emit_32(1112219661);
+emit_32(1097544709);
+emit_32(1123680256);
+emit_32(1112219661);
+emit_32(1097178022);
+emit_32(1124132848);
+emit_32(1113243648);
+emit_32(1097976408);
+emit_32(1123680256);
+emit_32(1113243648);
+emit_32(1096978688);
+emit_32(1124132848);
+emit_32(1114267661);
+emit_32(1097506541);
+emit_32(1123680256);
+emit_32(1114267661);
+emit_32(1097352610);
+emit_32(1124132848);
+emit_32(1115291648);
+emit_32(1097510945);
+emit_32(1123680256);
+emit_32(1115291648);
+emit_32(1097969906);
+emit_32(1124132848);
+emit_32(1116000263);
+emit_32(1097837262);
+emit_32(1123680256);
+emit_32(1116000263);
+emit_32(1098943509);
+emit_32(1124132848);
+emit_32(1116512256);
+emit_32(1098359872);
+emit_32(1123680256);
+emit_32(1116512256);
+emit_32(1099235380);
+emit_32(1124132848);
+emit_32(1117024263);
+emit_32(1097957533);
+emit_32(1123680256);
+emit_32(1117024263);
+emit_32(1098875037);
+emit_32(1124132848);
+emit_32(1117536256);
+emit_32(1098416705);
+emit_32(1123680256);
+emit_32(1117536256);
+emit_32(1098919916);
+emit_32(1124132848);
+emit_32(1118048263);
+emit_32(1098948385);
+emit_32(1123680256);
+emit_32(1118048263);
+emit_32(1099015127);
+emit_32(1124132848);
+emit_32(1118560256);
+emit_32(1099890845);
+emit_32(1123680256);
+emit_32(1118560256);
+emit_32(1100384410);
+emit_32(1124132848);
+emit_32(1119072263);
+emit_32(1100416863);
+emit_32(1123680256);
+emit_32(1119072263);
+emit_32(1100817786);
+emit_32(1124132848);
+emit_32(1119584256);
+emit_32(1100910848);
+emit_32(1123680256);
+emit_32(1119584256);
+emit_32(1101157682);
+emit_32(1124132848);
+emit_32(1120096263);
+emit_32(1102712825);
+emit_32(1123680256);
+emit_32(1120096263);
+emit_32(1102698670);
+emit_32(1124132848);
+emit_32(1120608322);
+emit_32(1103789661);
+emit_32(1123680256);
+emit_32(1120608322);
+emit_32(1104088662);
+emit_32(1124132848);
+emit_32(1121120289);
+emit_32(1104607602);
+emit_32(1123680256);
+emit_32(1121120289);
+emit_32(1104975548);
+emit_32(1124132848);
+emit_32(1121632256);
+emit_32(1105587811);
+emit_32(1123680256);
+emit_32(1121632256);
+emit_32(1105705671);
+emit_32(1124132848);
+emit_32(1122144223);
+emit_32(1106213025);
+emit_32(1123680256);
+emit_32(1122144223);
+emit_32(1106546629);
+emit_32(1124132848);
+emit_32(1122656322);
+emit_32(1106606765);
+emit_32(1123680256);
+emit_32(1122656322);
+emit_32(1107224271);
+emit_32(1124132848);
+emit_32(1123168289);
+emit_32(1107406409);
+emit_32(1123680256);
+emit_32(1123168289);
+emit_32(1107432990);
+emit_32(1124132848);
+emit_32(1123680256);
+emit_32(1108017021);
+emit_32(1123680256);
+emit_32(1123680256);
+emit_32(1107870823);
+emit_32(1124132848);
+emit_32(1124132848);
+emit_32(1108642890);
+emit_32(1123680256);
+emit_32(1124132848);
+emit_32(1108611197);
+emit_32(1124132848);
+emit_32(1124388897);
+emit_32(1108976940);
+emit_32(1123680256);
+emit_32(1124388897);
+emit_32(1109002394);
+emit_32(1124132848);
+emit_32(1124644880);
+emit_32(1108915991);
+emit_32(1123680256);
+emit_32(1124644880);
+emit_32(1109174020);
+emit_32(1124132848);
+emit_32(1124900864);
+emit_32(1109069713);
+emit_32(1123680256);
+emit_32(1124900864);
+emit_32(1109145131);
+emit_32(1124132848);
+emit_32(1125156848);
+emit_32(1108852159);
+emit_32(1123680256);
+emit_32(1125156848);
+emit_32(1109111053);
+emit_32(1124132848);
+emit_32(1125412897);
+emit_32(1109018044);
+emit_32(1123680256);
+emit_32(1125412897);
+emit_32(1108982156);
+emit_32(1124132848);
+emit_32(1125668880);
+emit_32(1109032776);
+emit_32(1123680256);
+emit_32(1125668880);
+emit_32(1109159733);
+emit_32(1124132848);
+emit_32(1125924864);
+emit_32(1109297490);
+emit_32(1123680256);
+emit_32(1125924864);
+emit_32(1109315342);
+emit_32(1124132848);
+emit_32(1126180848);
+emit_32(1109331018);
+emit_32(1123680256);
+emit_32(1126180848);
+emit_32(1109210091);
+emit_32(1124132848);
+emit_32(1126436897);
+emit_32(1109010285);
+emit_32(1123680256);
+emit_32(1126436897);
+emit_32(1108929885);
+emit_32(1124132848);
+emit_32(1126692880);
+emit_32(1108437919);
+emit_32(1123680256);
+emit_32(1126692880);
+emit_32(1108541256);
+emit_32(1124132848);
+emit_32(1126948864);
+emit_32(1108395583);
+emit_32(1123680256);
+emit_32(1126948864);
+emit_32(1108339091);
+emit_32(1124132848);
+emit_32(1127204848);
+emit_32(1108230432);
+emit_32(1123680256);
+emit_32(1127204848);
+emit_32(1108284853);
+emit_32(1124132848);
+emit_32(1127460897);
+emit_32(1107992091);
+emit_32(1123680256);
+emit_32(1127460897);
+emit_32(1108246449);
+emit_32(1124132848);
+emit_32(1127716880);
+emit_32(1107862408);
+emit_32(1123680256);
+emit_32(1127716880);
+emit_32(1108208727);
+emit_32(1124132848);
+emit_32(1127972864);
+emit_32(1107704336);
+emit_32(1123680256);
+emit_32(1127972864);
+emit_32(1108242648);
+emit_32(1124132848);
+emit_32(1128228848);
+emit_32(1107562018);
+emit_32(1123680256);
+emit_32(1128228848);
+emit_32(1107828539);
+emit_32(1124132848);
+emit_32(1128484897);
+emit_32(1106914679);
+emit_32(1123680256);
+emit_32(1128484897);
+emit_32(1107302207);
+emit_32(1124132848);
+emit_32(1128740880);
+emit_32(1105855984);
+emit_32(1123680256);
+emit_32(1128740880);
+emit_32(1106125311);
+emit_32(1124132848);
+emit_32(1128996864);
+emit_32(1104645194);
+emit_32(1123680256);
+emit_32(1128996864);
+emit_32(1104882853);
+emit_32(1124132848);
+emit_32(1129252848);
+emit_32(1103670490);
+emit_32(1123680256);
+emit_32(1129252848);
+emit_32(1103712328);
+emit_32(1124132848);
+emit_32(1129508897);
+emit_32(1102923956);
+emit_32(1123680256);
+emit_32(1129508897);
+emit_32(1103248228);
+emit_32(1124132848);
+emit_32(1129764880);
+emit_32(1102092435);
+emit_32(1123680256);
+emit_32(1129764880);
+emit_32(1102281808);
+emit_32(1124132848);
+emit_32(1130020864);
+emit_32(1101172887);
+emit_32(1123680256);
+emit_32(1130020864);
+emit_32(1101935621);
+emit_32(1124132848);
+emit_32(1130276848);
+emit_32(1101025876);
+emit_32(1123680256);
+emit_32(1130276848);
+emit_32(1100815060);
+emit_32(1124132848);
+emit_32(1130532897);
+emit_32(1101065722);
+emit_32(1123680256);
+emit_32(1130532897);
+emit_32(1100889457);
+emit_32(1124132848);
+emit_32(1130788880);
+emit_32(1101130577);
+emit_32(1123680256);
+emit_32(1130788880);
+emit_32(1101023098);
+emit_32(1124132848);
+emit_32(1131044864);
+emit_32(1100802530);
+emit_32(1123680256);
+emit_32(1131044864);
+emit_32(1100560938);
+emit_32(1124132848);
+emit_32(1131300848);
+emit_32(1100276983);
+emit_32(1123680256);
+emit_32(1131300848);
+emit_32(1099884397);
+emit_32(1124132848);
+emit_32(1131556897);
+emit_32(1099626499);
+emit_32(1123680256);
+emit_32(1131556897);
+emit_32(1099776918);
+emit_32(1124132848);
+emit_32(1131812880);
+emit_32(1099785830);
+emit_32(1123680256);
+emit_32(1131812880);
+emit_32(1099406246);
+emit_32(1124132848);
+emit_32(1132068864);
+emit_32(1099641599);
+emit_32(1123680256);
+emit_32(1132068864);
+emit_32(1099062890);
+emit_32(1124132848);
+emit_32(1081737216);
+emit_32(1100235512);
+emit_32(1123168289);
+emit_32(1090125824);
+emit_32(1100861512);
+emit_32(1123168289);
+emit_32(1094418484);
+emit_32(1101523373);
+emit_32(1123168289);
+emit_32(1098514432);
+emit_32(1102177632);
+emit_32(1123168289);
+emit_32(1100759066);
+emit_32(1102223140);
+emit_32(1123168289);
+emit_32(1102807040);
+emit_32(1101084754);
+emit_32(1123168289);
+emit_32(1104855066);
+emit_32(1099931897);
+emit_32(1123168289);
+emit_32(1106903040);
+emit_32(1099771150);
+emit_32(1123168289);
+emit_32(1108123661);
+emit_32(1099034001);
+emit_32(1123168289);
+emit_32(1109147648);
+emit_32(1097525730);
+emit_32(1123168289);
+emit_32(1110171661);
+emit_32(1097329331);
+emit_32(1123168289);
+emit_32(1111195648);
+emit_32(1097895877);
+emit_32(1123168289);
+emit_32(1112219661);
+emit_32(1098267283);
+emit_32(1123168289);
+emit_32(1113243648);
+emit_32(1098019609);
+emit_32(1123168289);
+emit_32(1114267661);
+emit_32(1097783994);
+emit_32(1123168289);
+emit_32(1115291648);
+emit_32(1097984587);
+emit_32(1123168289);
+emit_32(1116000263);
+emit_32(1098022755);
+emit_32(1123168289);
+emit_32(1116512256);
+emit_32(1098026110);
+emit_32(1123168289);
+emit_32(1117024263);
+emit_32(1097933206);
+emit_32(1123168289);
+emit_32(1117536256);
+emit_32(1098931503);
+emit_32(1123168289);
+emit_32(1118048263);
+emit_32(1099231973);
+emit_32(1123168289);
+emit_32(1118560256);
+emit_32(1099649463);
+emit_32(1123168289);
+emit_32(1119072263);
+emit_32(1100347343);
+emit_32(1123168289);
+emit_32(1119584256);
+emit_32(1100400558);
+emit_32(1123168289);
+emit_32(1120096263);
+emit_32(1101890794);
+emit_32(1123168289);
+emit_32(1120608322);
+emit_32(1103399223);
+emit_32(1123168289);
+emit_32(1121120289);
+emit_32(1104023703);
+emit_32(1123168289);
+emit_32(1121632256);
+emit_32(1104903930);
+emit_32(1123168289);
+emit_32(1122144223);
+emit_32(1105787670);
+emit_32(1123168289);
+emit_32(1122656322);
+emit_32(1106319507);
+emit_32(1123168289);
+emit_32(1123168289);
+emit_32(1107324096);
+emit_32(1123168289);
+emit_32(1123680256);
+emit_32(1107997229);
+emit_32(1123168289);
+emit_32(1124132848);
+emit_32(1108634344);
+emit_32(1123168289);
+emit_32(1124388897);
+emit_32(1108819601);
+emit_32(1123168289);
+emit_32(1124644880);
+emit_32(1108814096);
+emit_32(1123168289);
+emit_32(1124900864);
+emit_32(1108757106);
+emit_32(1123168289);
+emit_32(1125156848);
+emit_32(1108647897);
+emit_32(1123168289);
+emit_32(1125412897);
+emit_32(1108920920);
+emit_32(1123168289);
+emit_32(1125668880);
+emit_32(1109111000);
+emit_32(1123168289);
+emit_32(1125924864);
+emit_32(1109475302);
+emit_32(1123168289);
+emit_32(1126180848);
+emit_32(1109573422);
+emit_32(1123168289);
+emit_32(1126436897);
+emit_32(1109272140);
+emit_32(1123168289);
+emit_32(1126692880);
+emit_32(1108874101);
+emit_32(1123168289);
+emit_32(1126948864);
+emit_32(1108464710);
+emit_32(1123168289);
+emit_32(1127204848);
+emit_32(1108148460);
+emit_32(1123168289);
+emit_32(1127460897);
+emit_32(1107996416);
+emit_32(1123168289);
+emit_32(1127716880);
+emit_32(1107704781);
+emit_32(1123168289);
+emit_32(1127972864);
+emit_32(1107621603);
+emit_32(1123168289);
+emit_32(1128228848);
+emit_32(1107169798);
+emit_32(1123168289);
+emit_32(1128484897);
+emit_32(1106434222);
+emit_32(1123168289);
+emit_32(1128740880);
+emit_32(1105659953);
+emit_32(1123168289);
+emit_32(1128996864);
+emit_32(1104548410);
+emit_32(1123168289);
+emit_32(1129252848);
+emit_32(1103654289);
+emit_32(1123168289);
+emit_32(1129508897);
+emit_32(1102602673);
+emit_32(1123168289);
+emit_32(1129764880);
+emit_32(1101366401);
+emit_32(1123168289);
+emit_32(1130020864);
+emit_32(1100673240);
+emit_32(1123168289);
+emit_32(1130276848);
+emit_32(1100637012);
+emit_32(1123168289);
+emit_32(1130532897);
+emit_32(1101126015);
+emit_32(1123168289);
+emit_32(1130788880);
+emit_32(1101170999);
+emit_32(1123168289);
+emit_32(1131044864);
+emit_32(1101134194);
+emit_32(1123168289);
+emit_32(1131300848);
+emit_32(1101200569);
+emit_32(1123168289);
+emit_32(1131556897);
+emit_32(1100148952);
+emit_32(1123168289);
+emit_32(1131812880);
+emit_32(1099244241);
+emit_32(1123168289);
+emit_32(1132068864);
+emit_32(1099746247);
+emit_32(1123168289);
+emit_32(1081737216);
+emit_32(1100438045);
+emit_32(1122656322);
+emit_32(1090125824);
+emit_32(1100591871);
+emit_32(1122656322);
+emit_32(1094418484);
+emit_32(1101406352);
+emit_32(1122656322);
+emit_32(1098514432);
+emit_32(1101309359);
+emit_32(1122656322);
+emit_32(1100759066);
+emit_32(1101169112);
+emit_32(1122656322);
+emit_32(1102807040);
+emit_32(1100305872);
+emit_32(1122656322);
+emit_32(1104855066);
+emit_32(1099701682);
+emit_32(1122656322);
+emit_32(1106903040);
+emit_32(1099474561);
+emit_32(1122656322);
+emit_32(1108123661);
+emit_32(1098570950);
+emit_32(1122656322);
+emit_32(1109147648);
+emit_32(1097605421);
+emit_32(1122656322);
+emit_32(1110171661);
+emit_32(1097274386);
+emit_32(1122656322);
+emit_32(1111195648);
+emit_32(1097648413);
+emit_32(1122656322);
+emit_32(1112219661);
+emit_32(1097935199);
+emit_32(1122656322);
+emit_32(1113243648);
+emit_32(1097655229);
+emit_32(1122656322);
+emit_32(1114267661);
+emit_32(1098651795);
+emit_32(1122656322);
+emit_32(1115291648);
+emit_32(1099066193);
+emit_32(1122656322);
+emit_32(1116000263);
+emit_32(1098931189);
+emit_32(1122656322);
+emit_32(1116512256);
+emit_32(1098814849);
+emit_32(1122656322);
+emit_32(1117024263);
+emit_32(1098993264);
+emit_32(1122656322);
+emit_32(1117536256);
+emit_32(1099606157);
+emit_32(1122656322);
+emit_32(1118048263);
+emit_32(1099571344);
+emit_32(1122656322);
+emit_32(1118560256);
+emit_32(1099949408);
+emit_32(1122656322);
+emit_32(1119072263);
+emit_32(1100115817);
+emit_32(1122656322);
+emit_32(1119584256);
+emit_32(1100095947);
+emit_32(1122656322);
+emit_32(1120096263);
+emit_32(1100761740);
+emit_32(1122656322);
+emit_32(1120608322);
+emit_32(1101924191);
+emit_32(1122656322);
+emit_32(1121120289);
+emit_32(1102920810);
+emit_32(1122656322);
+emit_32(1121632256);
+emit_32(1103899499);
+emit_32(1122656322);
+emit_32(1122144223);
+emit_32(1105260918);
+emit_32(1122656322);
+emit_32(1122656322);
+emit_32(1106034347);
+emit_32(1122656322);
+emit_32(1123168289);
+emit_32(1107198004);
+emit_32(1122656322);
+emit_32(1123680256);
+emit_32(1107826495);
+emit_32(1122656322);
+emit_32(1124132848);
+emit_32(1108446937);
+emit_32(1122656322);
+emit_32(1124388897);
+emit_32(1108618065);
+emit_32(1122656322);
+emit_32(1124644880);
+emit_32(1108561835);
+emit_32(1122656322);
+emit_32(1124900864);
+emit_32(1108406410);
+emit_32(1122656322);
+emit_32(1125156848);
+emit_32(1108576174);
+emit_32(1122656322);
+emit_32(1125412897);
+emit_32(1109301448);
+emit_32(1122656322);
+emit_32(1125668880);
+emit_32(1109829249);
+emit_32(1122656322);
+emit_32(1125924864);
+emit_32(1110051154);
+emit_32(1122656322);
+emit_32(1126180848);
+emit_32(1110198478);
+emit_32(1122656322);
+emit_32(1126436897);
+emit_32(1109858268);
+emit_32(1122656322);
+emit_32(1126692880);
+emit_32(1109550301);
+emit_32(1122656322);
+emit_32(1126948864);
+emit_32(1108917669);
+emit_32(1122656322);
+emit_32(1127204848);
+emit_32(1108613005);
+emit_32(1122656322);
+emit_32(1127460897);
+emit_32(1108306375);
+emit_32(1122656322);
+emit_32(1127716880);
+emit_32(1107971382);
+emit_32(1122656322);
+emit_32(1127972864);
+emit_32(1107731022);
+emit_32(1122656322);
+emit_32(1128228848);
+emit_32(1107436241);
+emit_32(1122656322);
+emit_32(1128484897);
+emit_32(1106805103);
+emit_32(1122656322);
+emit_32(1128740880);
+emit_32(1105736132);
+emit_32(1122656322);
+emit_32(1128996864);
+emit_32(1104687818);
+emit_32(1122656322);
+emit_32(1129252848);
+emit_32(1103709969);
+emit_32(1122656322);
+emit_32(1129508897);
+emit_32(1102382734);
+emit_32(1122656322);
+emit_32(1129764880);
+emit_32(1101330121);
+emit_32(1122656322);
+emit_32(1130020864);
+emit_32(1100614520);
+emit_32(1122656322);
+emit_32(1130276848);
+emit_32(1100389233);
+emit_32(1122656322);
+emit_32(1130532897);
+emit_32(1100597690);
+emit_32(1122656322);
+emit_32(1130788880);
+emit_32(1101237636);
+emit_32(1122656322);
+emit_32(1131044864);
+emit_32(1101286500);
+emit_32(1122656322);
+emit_32(1131300848);
+emit_32(1101166386);
+emit_32(1122656322);
+emit_32(1131556897);
+emit_32(1100711041);
+emit_32(1122656322);
+emit_32(1131812880);
+emit_32(1099946053);
+emit_32(1122656322);
+emit_32(1132068864);
+emit_32(1099609932);
+emit_32(1122656322);
+emit_32(1081737216);
+emit_32(1100139620);
+emit_32(1122144223);
+emit_32(1090125824);
+emit_32(1100323697);
+emit_32(1122144223);
+emit_32(1094418484);
+emit_32(1100674708);
+emit_32(1122144223);
+emit_32(1098514432);
+emit_32(1100753299);
+emit_32(1122144223);
+emit_32(1100759066);
+emit_32(1100255278);
+emit_32(1122144223);
+emit_32(1102807040);
+emit_32(1099783052);
+emit_32(1122144223);
+emit_32(1104855066);
+emit_32(1099327131);
+emit_32(1122144223);
+emit_32(1106903040);
+emit_32(1099190764);
+emit_32(1122144223);
+emit_32(1108123661);
+emit_32(1098756443);
+emit_32(1122144223);
+emit_32(1109147648);
+emit_32(1097994967);
+emit_32(1122144223);
+emit_32(1110171661);
+emit_32(1098760743);
+emit_32(1122144223);
+emit_32(1111195648);
+emit_32(1099136762);
+emit_32(1122144223);
+emit_32(1112219661);
+emit_32(1099063729);
+emit_32(1122144223);
+emit_32(1113243648);
+emit_32(1099278634);
+emit_32(1122144223);
+emit_32(1114267661);
+emit_32(1099336883);
+emit_32(1122144223);
+emit_32(1115291648);
+emit_32(1099511261);
+emit_32(1122144223);
+emit_32(1116000263);
+emit_32(1099185311);
+emit_32(1122144223);
+emit_32(1116512256);
+emit_32(1098779931);
+emit_32(1122144223);
+emit_32(1117024263);
+emit_32(1099229561);
+emit_32(1122144223);
+emit_32(1117536256);
+emit_32(1099456787);
+emit_32(1122144223);
+emit_32(1118048263);
+emit_32(1099608673);
+emit_32(1122144223);
+emit_32(1118560256);
+emit_32(1099933417);
+emit_32(1122144223);
+emit_32(1119072263);
+emit_32(1100161640);
+emit_32(1122144223);
+emit_32(1119584256);
+emit_32(1100494039);
+emit_32(1122144223);
+emit_32(1120096263);
+emit_32(1100626841);
+emit_32(1122144223);
+emit_32(1120608322);
+emit_32(1101085173);
+emit_32(1122144223);
+emit_32(1121120289);
+emit_32(1102206573);
+emit_32(1122144223);
+emit_32(1121632256);
+emit_32(1103460303);
+emit_32(1122144223);
+emit_32(1122144223);
+emit_32(1104032825);
+emit_32(1122144223);
+emit_32(1122656322);
+emit_32(1105660740);
+emit_32(1122144223);
+emit_32(1123168289);
+emit_32(1106883065);
+emit_32(1122144223);
+emit_32(1123680256);
+emit_32(1107680480);
+emit_32(1122144223);
+emit_32(1124132848);
+emit_32(1108110344);
+emit_32(1122144223);
+emit_32(1124388897);
+emit_32(1108454854);
+emit_32(1122144223);
+emit_32(1124644880);
+emit_32(1108686065);
+emit_32(1122144223);
+emit_32(1124900864);
+emit_32(1108654057);
+emit_32(1122144223);
+emit_32(1125156848);
+emit_32(1108922519);
+emit_32(1122144223);
+emit_32(1125412897);
+emit_32(1109770450);
+emit_32(1122144223);
+emit_32(1125668880);
+emit_32(1110434487);
+emit_32(1122144223);
+emit_32(1125924864);
+emit_32(1110705884);
+emit_32(1122144223);
+emit_32(1126180848);
+emit_32(1110743214);
+emit_32(1122144223);
+emit_32(1126436897);
+emit_32(1110390656);
+emit_32(1122144223);
+emit_32(1126692880);
+emit_32(1110053093);
+emit_32(1122144223);
+emit_32(1126948864);
+emit_32(1109488042);
+emit_32(1122144223);
+emit_32(1127204848);
+emit_32(1108960713);
+emit_32(1122144223);
+emit_32(1127460897);
+emit_32(1108725701);
+emit_32(1122144223);
+emit_32(1127716880);
+emit_32(1108233840);
+emit_32(1122144223);
+emit_32(1127972864);
+emit_32(1107884455);
+emit_32(1122144223);
+emit_32(1128228848);
+emit_32(1107301971);
+emit_32(1122144223);
+emit_32(1128484897);
+emit_32(1106353639);
+emit_32(1122144223);
+emit_32(1128740880);
+emit_32(1105631956);
+emit_32(1122144223);
+emit_32(1128996864);
+emit_32(1104783920);
+emit_32(1122144223);
+emit_32(1129252848);
+emit_32(1103622046);
+emit_32(1122144223);
+emit_32(1129508897);
+emit_32(1102332926);
+emit_32(1122144223);
+emit_32(1129764880);
+emit_32(1100887622);
+emit_32(1122144223);
+emit_32(1130020864);
+emit_32(1100248410);
+emit_32(1122144223);
+emit_32(1130276848);
+emit_32(1100033242);
+emit_32(1122144223);
+emit_32(1130532897);
+emit_32(1099938346);
+emit_32(1122144223);
+emit_32(1130788880);
+emit_32(1100585370);
+emit_32(1122144223);
+emit_32(1131044864);
+emit_32(1101043650);
+emit_32(1122144223);
+emit_32(1131300848);
+emit_32(1101065565);
+emit_32(1122144223);
+emit_32(1131556897);
+emit_32(1100500540);
+emit_32(1122144223);
+emit_32(1131812880);
+emit_32(1100135373);
+emit_32(1122144223);
+emit_32(1132068864);
+emit_32(1100354840);
+emit_32(1122144223);
+emit_32(1081737216);
+emit_32(1099957115);
+emit_32(1121632256);
+emit_32(1090125824);
+emit_32(1100037593);
+emit_32(1121632256);
+emit_32(1094418484);
+emit_32(1100062445);
+emit_32(1121632256);
+emit_32(1098514432);
+emit_32(1100063284);
+emit_32(1121632256);
+emit_32(1100759066);
+emit_32(1099841195);
+emit_32(1121632256);
+emit_32(1102807040);
+emit_32(1099713898);
+emit_32(1121632256);
+emit_32(1104855066);
+emit_32(1099359951);
+emit_32(1121632256);
+emit_32(1106903040);
+emit_32(1098837289);
+emit_32(1121632256);
+emit_32(1108123661);
+emit_32(1098060399);
+emit_32(1121632256);
+emit_32(1109147648);
+emit_32(1098949381);
+emit_32(1121632256);
+emit_32(1110171661);
+emit_32(1099007001);
+emit_32(1121632256);
+emit_32(1111195648);
+emit_32(1098883950);
+emit_32(1121632256);
+emit_32(1112219661);
+emit_32(1099407242);
+emit_32(1121632256);
+emit_32(1113243648);
+emit_32(1099479174);
+emit_32(1121632256);
+emit_32(1114267661);
+emit_32(1099627076);
+emit_32(1121632256);
+emit_32(1115291648);
+emit_32(1099212207);
+emit_32(1121632256);
+emit_32(1116000263);
+emit_32(1099332898);
+emit_32(1121632256);
+emit_32(1116512256);
+emit_32(1099391985);
+emit_32(1121632256);
+emit_32(1117024263);
+emit_32(1099349203);
+emit_32(1121632256);
+emit_32(1117536256);
+emit_32(1099452960);
+emit_32(1121632256);
+emit_32(1118048263);
+emit_32(1099360476);
+emit_32(1121632256);
+emit_32(1118560256);
+emit_32(1099645374);
+emit_32(1121632256);
+emit_32(1119072263);
+emit_32(1099926864);
+emit_32(1121632256);
+emit_32(1119584256);
+emit_32(1100231737);
+emit_32(1121632256);
+emit_32(1120096263);
+emit_32(1100104545);
+emit_32(1121632256);
+emit_32(1120608322);
+emit_32(1100531630);
+emit_32(1121632256);
+emit_32(1121120289);
+emit_32(1101229824);
+emit_32(1121632256);
+emit_32(1121632256);
+emit_32(1102138835);
+emit_32(1121632256);
+emit_32(1122144223);
+emit_32(1103981340);
+emit_32(1121632256);
+emit_32(1122656322);
+emit_32(1105126595);
+emit_32(1121632256);
+emit_32(1123168289);
+emit_32(1106590722);
+emit_32(1121632256);
+emit_32(1123680256);
+emit_32(1107669182);
+emit_32(1121632256);
+emit_32(1124132848);
+emit_32(1107932296);
+emit_32(1121632256);
+emit_32(1124388897);
+emit_32(1108574129);
+emit_32(1121632256);
+emit_32(1124644880);
+emit_32(1108726278);
+emit_32(1121632256);
+emit_32(1124900864);
+emit_32(1108737393);
+emit_32(1121632256);
+emit_32(1125156848);
+emit_32(1109413095);
+emit_32(1121632256);
+emit_32(1125412897);
+emit_32(1110114933);
+emit_32(1121632256);
+emit_32(1125668880);
+emit_32(1110645303);
+emit_32(1121632256);
+emit_32(1125924864);
+emit_32(1111013117);
+emit_32(1121632256);
+emit_32(1126180848);
+emit_32(1111064655);
+emit_32(1121632256);
+emit_32(1126436897);
+emit_32(1110758890);
+emit_32(1121632256);
+emit_32(1126692880);
+emit_32(1110376107);
+emit_32(1121632256);
+emit_32(1126948864);
+emit_32(1109822407);
+emit_32(1121632256);
+emit_32(1127204848);
+emit_32(1109326797);
+emit_32(1121632256);
+emit_32(1127460897);
+emit_32(1108601838);
+emit_32(1121632256);
+emit_32(1127716880);
+emit_32(1108258010);
+emit_32(1121632256);
+emit_32(1127972864);
+emit_32(1108088245);
+emit_32(1121632256);
+emit_32(1128228848);
+emit_32(1107411154);
+emit_32(1121632256);
+emit_32(1128484897);
+emit_32(1106040377);
+emit_32(1121632256);
+emit_32(1128740880);
+emit_32(1105294629);
+emit_32(1121632256);
+emit_32(1128996864);
+emit_32(1104278664);
+emit_32(1121632256);
+emit_32(1129252848);
+emit_32(1103177554);
+emit_32(1121632256);
+emit_32(1129508897);
+emit_32(1102109580);
+emit_32(1121632256);
+emit_32(1129764880);
+emit_32(1101025824);
+emit_32(1121632256);
+emit_32(1130020864);
+emit_32(1099990984);
+emit_32(1121632256);
+emit_32(1130276848);
+emit_32(1099361681);
+emit_32(1121632256);
+emit_32(1130532897);
+emit_32(1099399011);
+emit_32(1121632256);
+emit_32(1130788880);
+emit_32(1099424229);
+emit_32(1121632256);
+emit_32(1131044864);
+emit_32(1099786407);
+emit_32(1121632256);
+emit_32(1131300848);
+emit_32(1100148585);
+emit_32(1121632256);
+emit_32(1131556897);
+emit_32(1100174118);
+emit_32(1121632256);
+emit_32(1131812880);
+emit_32(1100070047);
+emit_32(1121632256);
+emit_32(1132068864);
+emit_32(1100267704);
+emit_32(1121632256);
+emit_32(1081737216);
+emit_32(1099935672);
+emit_32(1121120289);
+emit_32(1090125824);
+emit_32(1100185285);
+emit_32(1121120289);
+emit_32(1094418484);
+emit_32(1100187225);
+emit_32(1121120289);
+emit_32(1098514432);
+emit_32(1099887280);
+emit_32(1121120289);
+emit_32(1100759066);
+emit_32(1099826148);
+emit_32(1121120289);
+emit_32(1102807040);
+emit_32(1099732563);
+emit_32(1121120289);
+emit_32(1104855066);
+emit_32(1099085749);
+emit_32(1121120289);
+emit_32(1106903040);
+emit_32(1098762735);
+emit_32(1121120289);
+emit_32(1108123661);
+emit_32(1098970248);
+emit_32(1121120289);
+emit_32(1109147648);
+emit_32(1099373740);
+emit_32(1121120289);
+emit_32(1110171661);
+emit_32(1099054658);
+emit_32(1121120289);
+emit_32(1111195648);
+emit_32(1098747635);
+emit_32(1121120289);
+emit_32(1112219661);
+emit_32(1099059272);
+emit_32(1121120289);
+emit_32(1113243648);
+emit_32(1099057280);
+emit_32(1121120289);
+emit_32(1114267661);
+emit_32(1099293943);
+emit_32(1121120289);
+emit_32(1115291648);
+emit_32(1099644535);
+emit_32(1121120289);
+emit_32(1116000263);
+emit_32(1099369441);
+emit_32(1121120289);
+emit_32(1116512256);
+emit_32(1099598817);
+emit_32(1121120289);
+emit_32(1117024263);
+emit_32(1099807641);
+emit_32(1121120289);
+emit_32(1117536256);
+emit_32(1099466382);
+emit_32(1121120289);
+emit_32(1118048263);
+emit_32(1099290640);
+emit_32(1121120289);
+emit_32(1118560256);
+emit_32(1099113641);
+emit_32(1121120289);
+emit_32(1119072263);
+emit_32(1099247124);
+emit_32(1121120289);
+emit_32(1119584256);
+emit_32(1099832754);
+emit_32(1121120289);
+emit_32(1120096263);
+emit_32(1100177054);
+emit_32(1121120289);
+emit_32(1120608322);
+emit_32(1100171549);
+emit_32(1121120289);
+emit_32(1121120289);
+emit_32(1100677172);
+emit_32(1121120289);
+emit_32(1121632256);
+emit_32(1101971063);
+emit_32(1121120289);
+emit_32(1122144223);
+emit_32(1103633737);
+emit_32(1121120289);
+emit_32(1122656322);
+emit_32(1104631195);
+emit_32(1121120289);
+emit_32(1123168289);
+emit_32(1106163951);
+emit_32(1121120289);
+emit_32(1123680256);
+emit_32(1107425676);
+emit_32(1121120289);
+emit_32(1124132848);
+emit_32(1107927394);
+emit_32(1121120289);
+emit_32(1124388897);
+emit_32(1108148145);
+emit_32(1121120289);
+emit_32(1124644880);
+emit_32(1108470268);
+emit_32(1121120289);
+emit_32(1124900864);
+emit_32(1108816246);
+emit_32(1121120289);
+emit_32(1125156848);
+emit_32(1109543145);
+emit_32(1121120289);
+emit_32(1125412897);
+emit_32(1110276781);
+emit_32(1121120289);
+emit_32(1125668880);
+emit_32(1110909649);
+emit_32(1121120289);
+emit_32(1125924864);
+emit_32(1111224091);
+emit_32(1121120289);
+emit_32(1126180848);
+emit_32(1111301135);
+emit_32(1121120289);
+emit_32(1126436897);
+emit_32(1111167992);
+emit_32(1121120289);
+emit_32(1126692880);
+emit_32(1110709345);
+emit_32(1121120289);
+emit_32(1126948864);
+emit_32(1110071837);
+emit_32(1121120289);
+emit_32(1127204848);
+emit_32(1109390262);
+emit_32(1121120289);
+emit_32(1127460897);
+emit_32(1108886238);
+emit_32(1121120289);
+emit_32(1127716880);
+emit_32(1108757814);
+emit_32(1121120289);
+emit_32(1127972864);
+emit_32(1108248258);
+emit_32(1121120289);
+emit_32(1128228848);
+emit_32(1107404862);
+emit_32(1121120289);
+emit_32(1128484897);
+emit_32(1106003467);
+emit_32(1121120289);
+emit_32(1128740880);
+emit_32(1104821354);
+emit_32(1121120289);
+emit_32(1128996864);
+emit_32(1104184607);
+emit_32(1121120289);
+emit_32(1129252848);
+emit_32(1103554570);
+emit_32(1121120289);
+emit_32(1129508897);
+emit_32(1102588989);
+emit_32(1121120289);
+emit_32(1129764880);
+emit_32(1101617378);
+emit_32(1121120289);
+emit_32(1130020864);
+emit_32(1100444598);
+emit_32(1121120289);
+emit_32(1130276848);
+emit_32(1099799619);
+emit_32(1121120289);
+emit_32(1130532897);
+emit_32(1099403939);
+emit_32(1121120289);
+emit_32(1130788880);
+emit_32(1099507276);
+emit_32(1121120289);
+emit_32(1131044864);
+emit_32(1099782737);
+emit_32(1121120289);
+emit_32(1131300848);
+emit_32(1099916535);
+emit_32(1121120289);
+emit_32(1131556897);
+emit_32(1099956486);
+emit_32(1121120289);
+emit_32(1131812880);
+emit_32(1100280182);
+emit_32(1121120289);
+emit_32(1132068864);
+emit_32(1100594020);
+emit_32(1121120289);
+emit_32(1081737216);
+emit_32(1099802817);
+emit_32(1120608322);
+emit_32(1090125824);
+emit_32(1100171706);
+emit_32(1120608322);
+emit_32(1094418484);
+emit_32(1099951820);
+emit_32(1120608322);
+emit_32(1098514432);
+emit_32(1100236666);
+emit_32(1120608322);
+emit_32(1100759066);
+emit_32(1100302621);
+emit_32(1120608322);
+emit_32(1102807040);
+emit_32(1099644797);
+emit_32(1120608322);
+emit_32(1104855066);
+emit_32(1099555458);
+emit_32(1120608322);
+emit_32(1106903040);
+emit_32(1099452645);
+emit_32(1120608322);
+emit_32(1108123661);
+emit_32(1099951138);
+emit_32(1120608322);
+emit_32(1109147648);
+emit_32(1100092696);
+emit_32(1120608322);
+emit_32(1110171661);
+emit_32(1099905735);
+emit_32(1120608322);
+emit_32(1111195648);
+emit_32(1099555563);
+emit_32(1120608322);
+emit_32(1112219661);
+emit_32(1098964743);
+emit_32(1120608322);
+emit_32(1113243648);
+emit_32(1099224475);
+emit_32(1120608322);
+emit_32(1114267661);
+emit_32(1099204185);
+emit_32(1120608322);
+emit_32(1115291648);
+emit_32(1099361419);
+emit_32(1120608322);
+emit_32(1116000263);
+emit_32(1099438385);
+emit_32(1120608322);
+emit_32(1116512256);
+emit_32(1099693294);
+emit_32(1120608322);
+emit_32(1117024263);
+emit_32(1099966448);
+emit_32(1120608322);
+emit_32(1117536256);
+emit_32(1099611085);
+emit_32(1120608322);
+emit_32(1118048263);
+emit_32(1099352087);
+emit_32(1120608322);
+emit_32(1118560256);
+emit_32(1098341627);
+emit_32(1120608322);
+emit_32(1119072263);
+emit_32(1098488322);
+emit_32(1120608322);
+emit_32(1119584256);
+emit_32(1099373688);
+emit_32(1120608322);
+emit_32(1120096263);
+emit_32(1099586286);
+emit_32(1120608322);
+emit_32(1120608322);
+emit_32(1099611819);
+emit_32(1120608322);
+emit_32(1121120289);
+emit_32(1100077125);
+emit_32(1120608322);
+emit_32(1121632256);
+emit_32(1101296094);
+emit_32(1120608322);
+emit_32(1122144223);
+emit_32(1102346872);
+emit_32(1120608322);
+emit_32(1122656322);
+emit_32(1103678512);
+emit_32(1120608322);
+emit_32(1123168289);
+emit_32(1105306478);
+emit_32(1120608322);
+emit_32(1123680256);
+emit_32(1106488852);
+emit_32(1120608322);
+emit_32(1124132848);
+emit_32(1107446438);
+emit_32(1120608322);
+emit_32(1124388897);
+emit_32(1107966506);
+emit_32(1120608322);
+emit_32(1124644880);
+emit_32(1108466205);
+emit_32(1120608322);
+emit_32(1124900864);
+emit_32(1108823481);
+emit_32(1120608322);
+emit_32(1125156848);
+emit_32(1109507624);
+emit_32(1120608322);
+emit_32(1125412897);
+emit_32(1110351387);
+emit_32(1120608322);
+emit_32(1125668880);
+emit_32(1111019749);
+emit_32(1120608322);
+emit_32(1125924864);
+emit_32(1111329971);
+emit_32(1120608322);
+emit_32(1126180848);
+emit_32(1111365308);
+emit_32(1120608322);
+emit_32(1126436897);
+emit_32(1111184166);
+emit_32(1120608322);
+emit_32(1126692880);
+emit_32(1110574760);
+emit_32(1120608322);
+emit_32(1126948864);
+emit_32(1110380328);
+emit_32(1120608322);
+emit_32(1127204848);
+emit_32(1109912165);
+emit_32(1120608322);
+emit_32(1127460897);
+emit_32(1109599191);
+emit_32(1120608322);
+emit_32(1127716880);
+emit_32(1109069372);
+emit_32(1120608322);
+emit_32(1127972864);
+emit_32(1108386487);
+emit_32(1120608322);
+emit_32(1128228848);
+emit_32(1107668422);
+emit_32(1120608322);
+emit_32(1128484897);
+emit_32(1106120173);
+emit_32(1120608322);
+emit_32(1128740880);
+emit_32(1104797657);
+emit_32(1120608322);
+emit_32(1128996864);
+emit_32(1104352117);
+emit_32(1120608322);
+emit_32(1129252848);
+emit_32(1103791338);
+emit_32(1120608322);
+emit_32(1129508897);
+emit_32(1102834355);
+emit_32(1120608322);
+emit_32(1129764880);
+emit_32(1102173438);
+emit_32(1120608322);
+emit_32(1130020864);
+emit_32(1101005534);
+emit_32(1120608322);
+emit_32(1130276848);
+emit_32(1100530582);
+emit_32(1120608322);
+emit_32(1130532897);
+emit_32(1099941020);
+emit_32(1120608322);
+emit_32(1130788880);
+emit_32(1099395393);
+emit_32(1120608322);
+emit_32(1131044864);
+emit_32(1099621676);
+emit_32(1120608322);
+emit_32(1131300848);
+emit_32(1099449605);
+emit_32(1120608322);
+emit_32(1131556897);
+emit_32(1099506595);
+emit_32(1120608322);
+emit_32(1131812880);
+emit_32(1100131336);
+emit_32(1120608322);
+emit_32(1132068864);
+emit_32(1100624377);
+emit_32(1120608322);
+emit_32(1081737216);
+emit_32(1099965451);
+emit_32(1120096263);
+emit_32(1090125824);
+emit_32(1100056678);
+emit_32(1120096263);
+emit_32(1094418484);
+emit_32(1099809423);
+emit_32(1120096263);
+emit_32(1098514432);
+emit_32(1100136789);
+emit_32(1120096263);
+emit_32(1100759066);
+emit_32(1100328573);
+emit_32(1120096263);
+emit_32(1102807040);
+emit_32(1099649149);
+emit_32(1120096263);
+emit_32(1104855066);
+emit_32(1099960680);
+emit_32(1120096263);
+emit_32(1106903040);
+emit_32(1100214383);
+emit_32(1120096263);
+emit_32(1108123661);
+emit_32(1100707214);
+emit_32(1120096263);
+emit_32(1109147648);
+emit_32(1100899838);
+emit_32(1120096263);
+emit_32(1110171661);
+emit_32(1100765934);
+emit_32(1120096263);
+emit_32(1111195648);
+emit_32(1100769552);
+emit_32(1120096263);
+emit_32(1112219661);
+emit_32(1099924609);
+emit_32(1120096263);
+emit_32(1113243648);
+emit_32(1099242301);
+emit_32(1120096263);
+emit_32(1114267661);
+emit_32(1098940101);
+emit_32(1120096263);
+emit_32(1115291648);
+emit_32(1099295726);
+emit_32(1120096263);
+emit_32(1116000263);
+emit_32(1099408343);
+emit_32(1120096263);
+emit_32(1116512256);
+emit_32(1099741895);
+emit_32(1120096263);
+emit_32(1117024263);
+emit_32(1099493854);
+emit_32(1120096263);
+emit_32(1117536256);
+emit_32(1099382810);
+emit_32(1120096263);
+emit_32(1118048263);
+emit_32(1099116734);
+emit_32(1120096263);
+emit_32(1118560256);
+emit_32(1098839491);
+emit_32(1120096263);
+emit_32(1119072263);
+emit_32(1098942461);
+emit_32(1120096263);
+emit_32(1119584256);
+emit_32(1099008626);
+emit_32(1120096263);
+emit_32(1120096263);
+emit_32(1099170002);
+emit_32(1120096263);
+emit_32(1120608322);
+emit_32(1099494064);
+emit_32(1120096263);
+emit_32(1121120289);
+emit_32(1099581830);
+emit_32(1120096263);
+emit_32(1121632256);
+emit_32(1100481875);
+emit_32(1120096263);
+emit_32(1122144223);
+emit_32(1101530032);
+emit_32(1120096263);
+emit_32(1122656322);
+emit_32(1102909853);
+emit_32(1120096263);
+emit_32(1123168289);
+emit_32(1104403812);
+emit_32(1120096263);
+emit_32(1123680256);
+emit_32(1105884611);
+emit_32(1120096263);
+emit_32(1124132848);
+emit_32(1107445731);
+emit_32(1120096263);
+emit_32(1124388897);
+emit_32(1107970254);
+emit_32(1120096263);
+emit_32(1124644880);
+emit_32(1108388505);
+emit_32(1120096263);
+emit_32(1124900864);
+emit_32(1108761877);
+emit_32(1120096263);
+emit_32(1125156848);
+emit_32(1109478133);
+emit_32(1120096263);
+emit_32(1125412897);
+emit_32(1110090973);
+emit_32(1120096263);
+emit_32(1125668880);
+emit_32(1110851033);
+emit_32(1120096263);
+emit_32(1125924864);
+emit_32(1111411497);
+emit_32(1120096263);
+emit_32(1126180848);
+emit_32(1111336655);
+emit_32(1120096263);
+emit_32(1126436897);
+emit_32(1111269415);
+emit_32(1120096263);
+emit_32(1126692880);
+emit_32(1110784292);
+emit_32(1120096263);
+emit_32(1126948864);
+emit_32(1110653508);
+emit_32(1120096263);
+emit_32(1127204848);
+emit_32(1110359330);
+emit_32(1120096263);
+emit_32(1127460897);
+emit_32(1109834623);
+emit_32(1120096263);
+emit_32(1127716880);
+emit_32(1109238009);
+emit_32(1120096263);
+emit_32(1127972864);
+emit_32(1108505212);
+emit_32(1120096263);
+emit_32(1128228848);
+emit_32(1107662209);
+emit_32(1120096263);
+emit_32(1128484897);
+emit_32(1106214755);
+emit_32(1120096263);
+emit_32(1128740880);
+emit_32(1105231400);
+emit_32(1120096263);
+emit_32(1128996864);
+emit_32(1104882277);
+emit_32(1120096263);
+emit_32(1129252848);
+emit_32(1103989781);
+emit_32(1120096263);
+emit_32(1129508897);
+emit_32(1103333268);
+emit_32(1120096263);
+emit_32(1129764880);
+emit_32(1102701186);
+emit_32(1120096263);
+emit_32(1130020864);
+emit_32(1101762396);
+emit_32(1120096263);
+emit_32(1130276848);
+emit_32(1100764257);
+emit_32(1120096263);
+emit_32(1130532897);
+emit_32(1100213020);
+emit_32(1120096263);
+emit_32(1130788880);
+emit_32(1099813093);
+emit_32(1120096263);
+emit_32(1131044864);
+emit_32(1099177080);
+emit_32(1120096263);
+emit_32(1131300848);
+emit_32(1099042862);
+emit_32(1120096263);
+emit_32(1131556897);
+emit_32(1098988336);
+emit_32(1120096263);
+emit_32(1131812880);
+emit_32(1099476815);
+emit_32(1120096263);
+emit_32(1132068864);
+emit_32(1100226285);
+emit_32(1120096263);
+emit_32(1081737216);
+emit_32(1099519545);
+emit_32(1119584256);
+emit_32(1090125824);
+emit_32(1099335991);
+emit_32(1119584256);
+emit_32(1094418484);
+emit_32(1099709442);
+emit_32(1119584256);
+emit_32(1098514432);
+emit_32(1100359978);
+emit_32(1119584256);
+emit_32(1100759066);
+emit_32(1100132490);
+emit_32(1119584256);
+emit_32(1102807040);
+emit_32(1100526073);
+emit_32(1119584256);
+emit_32(1104855066);
+emit_32(1100876716);
+emit_32(1119584256);
+emit_32(1106903040);
+emit_32(1101010724);
+emit_32(1119584256);
+emit_32(1108123661);
+emit_32(1101185208);
+emit_32(1119584256);
+emit_32(1109147648);
+emit_32(1101761557);
+emit_32(1119584256);
+emit_32(1110171661);
+emit_32(1101844080);
+emit_32(1119584256);
+emit_32(1111195648);
+emit_32(1101813409);
+emit_32(1119584256);
+emit_32(1112219661);
+emit_32(1101402839);
+emit_32(1119584256);
+emit_32(1113243648);
+emit_32(1100438936);
+emit_32(1119584256);
+emit_32(1114267661);
+emit_32(1099786984);
+emit_32(1119584256);
+emit_32(1115291648);
+emit_32(1099715523);
+emit_32(1119584256);
+emit_32(1116000263);
+emit_32(1099745985);
+emit_32(1119584256);
+emit_32(1116512256);
+emit_32(1100093902);
+emit_32(1119584256);
+emit_32(1117024263);
+emit_32(1100168351);
+emit_32(1119584256);
+emit_32(1117536256);
+emit_32(1100068946);
+emit_32(1119584256);
+emit_32(1118048263);
+emit_32(1100204894);
+emit_32(1119584256);
+emit_32(1118560256);
+emit_32(1099776865);
+emit_32(1119584256);
+emit_32(1119072263);
+emit_32(1099815715);
+emit_32(1119584256);
+emit_32(1119584256);
+emit_32(1100174957);
+emit_32(1119584256);
+emit_32(1120096263);
+emit_32(1100503528);
+emit_32(1119584256);
+emit_32(1120608322);
+emit_32(1100870425);
+emit_32(1119584256);
+emit_32(1121120289);
+emit_32(1100930771);
+emit_32(1119584256);
+emit_32(1121632256);
+emit_32(1100869219);
+emit_32(1119584256);
+emit_32(1122144223);
+emit_32(1101778439);
+emit_32(1119584256);
+emit_32(1122656322);
+emit_32(1103199574);
+emit_32(1119584256);
+emit_32(1123168289);
+emit_32(1104588361);
+emit_32(1119584256);
+emit_32(1123680256);
+emit_32(1106227809);
+emit_32(1119584256);
+emit_32(1124132848);
+emit_32(1107512970);
+emit_32(1119584256);
+emit_32(1124388897);
+emit_32(1107998251);
+emit_32(1119584256);
+emit_32(1124644880);
+emit_32(1108347008);
+emit_32(1119584256);
+emit_32(1124900864);
+emit_32(1108602048);
+emit_32(1119584256);
+emit_32(1125156848);
+emit_32(1109290831);
+emit_32(1119584256);
+emit_32(1125412897);
+emit_32(1109977176);
+emit_32(1119584256);
+emit_32(1125668880);
+emit_32(1110570959);
+emit_32(1119584256);
+emit_32(1125924864);
+emit_32(1111274737);
+emit_32(1119584256);
+emit_32(1126180848);
+emit_32(1111376973);
+emit_32(1119584256);
+emit_32(1126436897);
+emit_32(1111218586);
+emit_32(1119584256);
+emit_32(1126692880);
+emit_32(1110884090);
+emit_32(1119584256);
+emit_32(1126948864);
+emit_32(1110905140);
+emit_32(1119584256);
+emit_32(1127204848);
+emit_32(1110659642);
+emit_32(1119584256);
+emit_32(1127460897);
+emit_32(1110072466);
+emit_32(1119584256);
+emit_32(1127716880);
+emit_32(1109486102);
+emit_32(1119584256);
+emit_32(1127972864);
+emit_32(1108855960);
+emit_32(1119584256);
+emit_32(1128228848);
+emit_32(1108119781);
+emit_32(1119584256);
+emit_32(1128484897);
+emit_32(1107034689);
+emit_32(1119584256);
+emit_32(1128740880);
+emit_32(1106087772);
+emit_32(1119584256);
+emit_32(1128996864);
+emit_32(1105093617);
+emit_32(1119584256);
+emit_32(1129252848);
+emit_32(1104335182);
+emit_32(1119584256);
+emit_32(1129508897);
+emit_32(1104074192);
+emit_32(1119584256);
+emit_32(1129764880);
+emit_32(1103483057);
+emit_32(1119584256);
+emit_32(1130020864);
+emit_32(1102981208);
+emit_32(1119584256);
+emit_32(1130276848);
+emit_32(1101489714);
+emit_32(1119584256);
+emit_32(1130532897);
+emit_32(1100552235);
+emit_32(1119584256);
+emit_32(1130788880);
+emit_32(1100255278);
+emit_32(1119584256);
+emit_32(1131044864);
+emit_32(1099722392);
+emit_32(1119584256);
+emit_32(1131300848);
+emit_32(1097754634);
+emit_32(1119584256);
+emit_32(1131556897);
+emit_32(1099078199);
+emit_32(1119584256);
+emit_32(1131812880);
+emit_32(1098909588);
+emit_32(1119584256);
+emit_32(1132068864);
+emit_32(1098899364);
+emit_32(1119584256);
+emit_32(1081737216);
+emit_32(1098532992);
+emit_32(1119072263);
+emit_32(1090125824);
+emit_32(1099050359);
+emit_32(1119072263);
+emit_32(1094418484);
+emit_32(1099771203);
+emit_32(1119072263);
+emit_32(1098514432);
+emit_32(1100405277);
+emit_32(1119072263);
+emit_32(1100759066);
+emit_32(1100821823);
+emit_32(1119072263);
+emit_32(1102807040);
+emit_32(1101489399);
+emit_32(1119072263);
+emit_32(1104855066);
+emit_32(1101426590);
+emit_32(1119072263);
+emit_32(1106903040);
+emit_32(1101124023);
+emit_32(1119072263);
+emit_32(1108123661);
+emit_32(1101831497);
+emit_32(1119072263);
+emit_32(1109147648);
+emit_32(1102350123);
+emit_32(1119072263);
+emit_32(1110171661);
+emit_32(1102793199);
+emit_32(1119072263);
+emit_32(1111195648);
+emit_32(1102843111);
+emit_32(1119072263);
+emit_32(1112219661);
+emit_32(1102558318);
+emit_32(1119072263);
+emit_32(1113243648);
+emit_32(1101824891);
+emit_32(1119072263);
+emit_32(1114267661);
+emit_32(1101196113);
+emit_32(1119072263);
+emit_32(1115291648);
+emit_32(1100804365);
+emit_32(1119072263);
+emit_32(1116000263);
+emit_32(1100310538);
+emit_32(1119072263);
+emit_32(1116512256);
+emit_32(1100314680);
+emit_32(1119072263);
+emit_32(1117024263);
+emit_32(1100878604);
+emit_32(1119072263);
+emit_32(1117536256);
+emit_32(1101233180);
+emit_32(1119072263);
+emit_32(1118048263);
+emit_32(1101099486);
+emit_32(1119072263);
+emit_32(1118560256);
+emit_32(1100717123);
+emit_32(1119072263);
+emit_32(1119072263);
+emit_32(1100634758);
+emit_32(1119072263);
+emit_32(1119584256);
+emit_32(1100997670);
+emit_32(1119072263);
+emit_32(1120096263);
+emit_32(1101349205);
+emit_32(1119072263);
+emit_32(1120608322);
+emit_32(1101475873);
+emit_32(1119072263);
+emit_32(1121120289);
+emit_32(1101425646);
+emit_32(1119072263);
+emit_32(1121632256);
+emit_32(1101796422);
+emit_32(1119072263);
+emit_32(1122144223);
+emit_32(1102446120);
+emit_32(1119072263);
+emit_32(1122656322);
+emit_32(1103203559);
+emit_32(1119072263);
+emit_32(1123168289);
+emit_32(1104856849);
+emit_32(1119072263);
+emit_32(1123680256);
+emit_32(1106223877);
+emit_32(1119072263);
+emit_32(1124132848);
+emit_32(1107396421);
+emit_32(1119072263);
+emit_32(1124388897);
+emit_32(1107875018);
+emit_32(1119072263);
+emit_32(1124644880);
+emit_32(1108277173);
+emit_32(1119072263);
+emit_32(1124900864);
+emit_32(1108512814);
+emit_32(1119072263);
+emit_32(1125156848);
+emit_32(1109177296);
+emit_32(1119072263);
+emit_32(1125412897);
+emit_32(1109962811);
+emit_32(1119072263);
+emit_32(1125668880);
+emit_32(1110386698);
+emit_32(1119072263);
+emit_32(1125924864);
+emit_32(1110954895);
+emit_32(1119072263);
+emit_32(1126180848);
+emit_32(1111373146);
+emit_32(1119072263);
+emit_32(1126436897);
+emit_32(1111232741);
+emit_32(1119072263);
+emit_32(1126692880);
+emit_32(1110968474);
+emit_32(1119072263);
+emit_32(1126948864);
+emit_32(1110976076);
+emit_32(1119072263);
+emit_32(1127204848);
+emit_32(1110947948);
+emit_32(1119072263);
+emit_32(1127460897);
+emit_32(1110319458);
+emit_32(1119072263);
+emit_32(1127716880);
+emit_32(1109529802);
+emit_32(1119072263);
+emit_32(1127972864);
+emit_32(1108903985);
+emit_32(1119072263);
+emit_32(1128228848);
+emit_32(1108310439);
+emit_32(1119072263);
+emit_32(1128484897);
+emit_32(1107575387);
+emit_32(1119072263);
+emit_32(1128740880);
+emit_32(1106795613);
+emit_32(1119072263);
+emit_32(1128996864);
+emit_32(1105037099);
+emit_32(1119072263);
+emit_32(1129252848);
+emit_32(1104566131);
+emit_32(1119072263);
+emit_32(1129508897);
+emit_32(1104325640);
+emit_32(1119072263);
+emit_32(1129764880);
+emit_32(1103661315);
+emit_32(1119072263);
+emit_32(1130020864);
+emit_32(1102795191);
+emit_32(1119072263);
+emit_32(1130276848);
+emit_32(1101517868);
+emit_32(1119072263);
+emit_32(1130532897);
+emit_32(1100461113);
+emit_32(1119072263);
+emit_32(1130788880);
+emit_32(1100370097);
+emit_32(1119072263);
+emit_32(1131044864);
+emit_32(1099572602);
+emit_32(1119072263);
+emit_32(1131300848);
+emit_32(1097838100);
+emit_32(1119072263);
+emit_32(1131556897);
+emit_32(1098295594);
+emit_32(1119072263);
+emit_32(1131812880);
+emit_32(1098303459);
+emit_32(1119072263);
+emit_32(1132068864);
+emit_32(1098824601);
+emit_32(1119072263);
+emit_32(1081737216);
+emit_32(1098479410);
+emit_32(1118560256);
+emit_32(1090125824);
+emit_32(1099112959);
+emit_32(1118560256);
+emit_32(1094418484);
+emit_32(1100063546);
+emit_32(1118560256);
+emit_32(1098514432);
+emit_32(1100578082);
+emit_32(1118560256);
+emit_32(1100759066);
+emit_32(1101399327);
+emit_32(1118560256);
+emit_32(1102807040);
+emit_32(1101862745);
+emit_32(1118560256);
+emit_32(1104855066);
+emit_32(1102014684);
+emit_32(1118560256);
+emit_32(1106903040);
+emit_32(1101855457);
+emit_32(1118560256);
+emit_32(1108123661);
+emit_32(1102305349);
+emit_32(1118560256);
+emit_32(1109147648);
+emit_32(1102995679);
+emit_32(1118560256);
+emit_32(1110171661);
+emit_32(1103423603);
+emit_32(1118560256);
+emit_32(1111195648);
+emit_32(1103543455);
+emit_32(1118560256);
+emit_32(1112219661);
+emit_32(1103387741);
+emit_32(1118560256);
+emit_32(1113243648);
+emit_32(1102938374);
+emit_32(1118560256);
+emit_32(1114267661);
+emit_32(1102169244);
+emit_32(1118560256);
+emit_32(1115291648);
+emit_32(1101791704);
+emit_32(1118560256);
+emit_32(1116000263);
+emit_32(1101646581);
+emit_32(1118560256);
+emit_32(1116512256);
+emit_32(1101112698);
+emit_32(1118560256);
+emit_32(1117024263);
+emit_32(1101184998);
+emit_32(1118560256);
+emit_32(1117536256);
+emit_32(1101989727);
+emit_32(1118560256);
+emit_32(1118048263);
+emit_32(1102023229);
+emit_32(1118560256);
+emit_32(1118560256);
+emit_32(1101345377);
+emit_32(1118560256);
+emit_32(1119072263);
+emit_32(1101364199);
+emit_32(1118560256);
+emit_32(1119584256);
+emit_32(1101345325);
+emit_32(1118560256);
+emit_32(1120096263);
+emit_32(1101567780);
+emit_32(1118560256);
+emit_32(1120608322);
+emit_32(1101948047);
+emit_32(1118560256);
+emit_32(1121120289);
+emit_32(1102252343);
+emit_32(1118560256);
+emit_32(1121632256);
+emit_32(1102278400);
+emit_32(1118560256);
+emit_32(1122144223);
+emit_32(1102915882);
+emit_32(1118560256);
+emit_32(1122656322);
+emit_32(1103545342);
+emit_32(1118560256);
+emit_32(1123168289);
+emit_32(1104523873);
+emit_32(1118560256);
+emit_32(1123680256);
+emit_32(1105840623);
+emit_32(1118560256);
+emit_32(1124132848);
+emit_32(1107083500);
+emit_32(1118560256);
+emit_32(1124388897);
+emit_32(1107781668);
+emit_32(1118560256);
+emit_32(1124644880);
+emit_32(1108269990);
+emit_32(1118560256);
+emit_32(1124900864);
+emit_32(1108523300);
+emit_32(1118560256);
+emit_32(1125156848);
+emit_32(1109103110);
+emit_32(1118560256);
+emit_32(1125412897);
+emit_32(1109825526);
+emit_32(1118560256);
+emit_32(1125668880);
+emit_32(1110495330);
+emit_32(1118560256);
+emit_32(1125924864);
+emit_32(1110756478);
+emit_32(1118560256);
+emit_32(1126180848);
+emit_32(1111016630);
+emit_32(1118560256);
+emit_32(1126436897);
+emit_32(1111283388);
+emit_32(1118560256);
+emit_32(1126692880);
+emit_32(1111246530);
+emit_32(1118560256);
+emit_32(1126948864);
+emit_32(1110841937);
+emit_32(1118560256);
+emit_32(1127204848);
+emit_32(1110618826);
+emit_32(1118560256);
+emit_32(1127460897);
+emit_32(1110342972);
+emit_32(1118560256);
+emit_32(1127716880);
+emit_32(1109456191);
+emit_32(1118560256);
+emit_32(1127972864);
+emit_32(1108985774);
+emit_32(1118560256);
+emit_32(1128228848);
+emit_32(1108475956);
+emit_32(1118560256);
+emit_32(1128484897);
+emit_32(1107767512);
+emit_32(1118560256);
+emit_32(1128740880);
+emit_32(1107083552);
+emit_32(1118560256);
+emit_32(1128996864);
+emit_32(1105634525);
+emit_32(1118560256);
+emit_32(1129252848);
+emit_32(1104932871);
+emit_32(1118560256);
+emit_32(1129508897);
+emit_32(1104170766);
+emit_32(1118560256);
+emit_32(1129764880);
+emit_32(1103195904);
+emit_32(1118560256);
+emit_32(1130020864);
+emit_32(1102135532);
+emit_32(1118560256);
+emit_32(1130276848);
+emit_32(1101066089);
+emit_32(1118560256);
+emit_32(1130532897);
+emit_32(1100669413);
+emit_32(1118560256);
+emit_32(1130788880);
+emit_32(1099835795);
+emit_32(1118560256);
+emit_32(1131044864);
+emit_32(1099072641);
+emit_32(1118560256);
+emit_32(1131300848);
+emit_32(1097951976);
+emit_32(1118560256);
+emit_32(1131556897);
+emit_32(1097998742);
+emit_32(1118560256);
+emit_32(1131812880);
+emit_32(1097628595);
+emit_32(1118560256);
+emit_32(1132068864);
+emit_32(1098095945);
+emit_32(1118560256);
+emit_32(1081737216);
+emit_32(1099413271);
+emit_32(1118048263);
+emit_32(1090125824);
+emit_32(1099851366);
+emit_32(1118048263);
+emit_32(1094418484);
+emit_32(1100634810);
+emit_32(1118048263);
+emit_32(1098514432);
+emit_32(1101543191);
+emit_32(1118048263);
+emit_32(1100759066);
+emit_32(1102227020);
+emit_32(1118048263);
+emit_32(1102807040);
+emit_32(1102623329);
+emit_32(1118048263);
+emit_32(1104855066);
+emit_32(1102636122);
+emit_32(1118048263);
+emit_32(1106903040);
+emit_32(1102855746);
+emit_32(1118048263);
+emit_32(1108123661);
+emit_32(1103180228);
+emit_32(1118048263);
+emit_32(1109147648);
+emit_32(1103670700);
+emit_32(1118048263);
+emit_32(1110171661);
+emit_32(1104191894);
+emit_32(1118048263);
+emit_32(1111195648);
+emit_32(1104328733);
+emit_32(1118048263);
+emit_32(1112219661);
+emit_32(1103856769);
+emit_32(1118048263);
+emit_32(1113243648);
+emit_32(1103570665);
+emit_32(1118048263);
+emit_32(1114267661);
+emit_32(1103155744);
+emit_32(1118048263);
+emit_32(1115291648);
+emit_32(1103141221);
+emit_32(1118048263);
+emit_32(1116000263);
+emit_32(1102853230);
+emit_32(1118048263);
+emit_32(1116512256);
+emit_32(1102033034);
+emit_32(1118048263);
+emit_32(1117024263);
+emit_32(1102017724);
+emit_32(1118048263);
+emit_32(1117536256);
+emit_32(1102380584);
+emit_32(1118048263);
+emit_32(1118048263);
+emit_32(1102405698);
+emit_32(1118048263);
+emit_32(1118560256);
+emit_32(1101754689);
+emit_32(1118048263);
+emit_32(1119072263);
+emit_32(1101894202);
+emit_32(1118048263);
+emit_32(1119584256);
+emit_32(1101906471);
+emit_32(1118048263);
+emit_32(1120096263);
+emit_32(1102313056);
+emit_32(1118048263);
+emit_32(1120608322);
+emit_32(1102601309);
+emit_32(1118048263);
+emit_32(1121120289);
+emit_32(1102592606);
+emit_32(1118048263);
+emit_32(1121632256);
+emit_32(1102703493);
+emit_32(1118048263);
+emit_32(1122144223);
+emit_32(1102937378);
+emit_32(1118048263);
+emit_32(1122656322);
+emit_32(1103504867);
+emit_32(1118048263);
+emit_32(1123168289);
+emit_32(1104384675);
+emit_32(1118048263);
+emit_32(1123680256);
+emit_32(1105635049);
+emit_32(1118048263);
+emit_32(1124132848);
+emit_32(1106752255);
+emit_32(1118048263);
+emit_32(1124388897);
+emit_32(1107767879);
+emit_32(1118048263);
+emit_32(1124644880);
+emit_32(1108294474);
+emit_32(1118048263);
+emit_32(1124900864);
+emit_32(1108613634);
+emit_32(1118048263);
+emit_32(1125156848);
+emit_32(1109065177);
+emit_32(1118048263);
+emit_32(1125412897);
+emit_32(1109930095);
+emit_32(1118048263);
+emit_32(1125668880);
+emit_32(1110386383);
+emit_32(1118048263);
+emit_32(1125924864);
+emit_32(1110751995);
+emit_32(1118048263);
+emit_32(1126180848);
+emit_32(1111030602);
+emit_32(1118048263);
+emit_32(1126436897);
+emit_32(1111233554);
+emit_32(1118048263);
+emit_32(1126692880);
+emit_32(1111303704);
+emit_32(1118048263);
+emit_32(1126948864);
+emit_32(1111031703);
+emit_32(1118048263);
+emit_32(1127204848);
+emit_32(1110529488);
+emit_32(1118048263);
+emit_32(1127460897);
+emit_32(1110208545);
+emit_32(1118048263);
+emit_32(1127716880);
+emit_32(1109599375);
+emit_32(1118048263);
+emit_32(1127972864);
+emit_32(1109300609);
+emit_32(1118048263);
+emit_32(1128228848);
+emit_32(1108749189);
+emit_32(1118048263);
+emit_32(1128484897);
+emit_32(1108160047);
+emit_32(1118048263);
+emit_32(1128740880);
+emit_32(1107724180);
+emit_32(1118048263);
+emit_32(1128996864);
+emit_32(1106714873);
+emit_32(1118048263);
+emit_32(1129252848);
+emit_32(1104821512);
+emit_32(1118048263);
+emit_32(1129508897);
+emit_32(1103852103);
+emit_32(1118048263);
+emit_32(1129764880);
+emit_32(1103039771);
+emit_32(1118048263);
+emit_32(1130020864);
+emit_32(1102286212);
+emit_32(1118048263);
+emit_32(1130276848);
+emit_32(1101202509);
+emit_32(1118048263);
+emit_32(1130532897);
+emit_32(1100589197);
+emit_32(1118048263);
+emit_32(1130788880);
+emit_32(1100484811);
+emit_32(1118048263);
+emit_32(1131044864);
+emit_32(1099835113);
+emit_32(1118048263);
+emit_32(1131300848);
+emit_32(1098729600);
+emit_32(1118048263);
+emit_32(1131556897);
+emit_32(1097121608);
+emit_32(1118048263);
+emit_32(1131812880);
+emit_32(1098002203);
+emit_32(1118048263);
+emit_32(1132068864);
+emit_32(1097770887);
+emit_32(1118048263);
+emit_32(1081737216);
+emit_32(1100388447);
+emit_32(1117536256);
+emit_32(1090125824);
+emit_32(1100757493);
+emit_32(1117536256);
+emit_32(1094418484);
+emit_32(1101501091);
+emit_32(1117536256);
+emit_32(1098514432);
+emit_32(1102103236);
+emit_32(1117536256);
+emit_32(1100759066);
+emit_32(1102707845);
+emit_32(1117536256);
+emit_32(1102807040);
+emit_32(1103009572);
+emit_32(1117536256);
+emit_32(1104855066);
+emit_32(1103428898);
+emit_32(1117536256);
+emit_32(1106903040);
+emit_32(1103146831);
+emit_32(1117536256);
+emit_32(1108123661);
+emit_32(1103947576);
+emit_32(1117536256);
+emit_32(1109147648);
+emit_32(1104597484);
+emit_32(1117536256);
+emit_32(1110171661);
+emit_32(1104667424);
+emit_32(1117536256);
+emit_32(1111195648);
+emit_32(1104486230);
+emit_32(1117536256);
+emit_32(1112219661);
+emit_32(1104487068);
+emit_32(1117536256);
+emit_32(1113243648);
+emit_32(1104896904);
+emit_32(1117536256);
+emit_32(1114267661);
+emit_32(1104464524);
+emit_32(1117536256);
+emit_32(1115291648);
+emit_32(1104222355);
+emit_32(1117536256);
+emit_32(1116000263);
+emit_32(1103558974);
+emit_32(1117536256);
+emit_32(1116512256);
+emit_32(1103033480);
+emit_32(1117536256);
+emit_32(1117024263);
+emit_32(1102717544);
+emit_32(1117536256);
+emit_32(1117536256);
+emit_32(1102634340);
+emit_32(1117536256);
+emit_32(1118048263);
+emit_32(1102741976);
+emit_32(1117536256);
+emit_32(1118560256);
+emit_32(1102625007);
+emit_32(1117536256);
+emit_32(1119072263);
+emit_32(1102725618);
+emit_32(1117536256);
+emit_32(1119584256);
+emit_32(1103254520);
+emit_32(1117536256);
+emit_32(1120096263);
+emit_32(1103392722);
+emit_32(1117536256);
+emit_32(1120608322);
+emit_32(1103322992);
+emit_32(1117536256);
+emit_32(1121120289);
+emit_32(1103436395);
+emit_32(1117536256);
+emit_32(1121632256);
+emit_32(1103376417);
+emit_32(1117536256);
+emit_32(1122144223);
+emit_32(1103563325);
+emit_32(1117536256);
+emit_32(1122656322);
+emit_32(1103992612);
+emit_32(1117536256);
+emit_32(1123168289);
+emit_32(1104630514);
+emit_32(1117536256);
+emit_32(1123680256);
+emit_32(1106116556);
+emit_32(1117536256);
+emit_32(1124132848);
+emit_32(1106961236);
+emit_32(1117536256);
+emit_32(1124388897);
+emit_32(1107803950);
+emit_32(1117536256);
+emit_32(1124644880);
+emit_32(1108189276);
+emit_32(1117536256);
+emit_32(1124900864);
+emit_32(1108506129);
+emit_32(1117536256);
+emit_32(1125156848);
+emit_32(1109028792);
+emit_32(1117536256);
+emit_32(1125412897);
+emit_32(1109715216);
+emit_32(1117536256);
+emit_32(1125668880);
+emit_32(1110237171);
+emit_32(1117536256);
+emit_32(1125924864);
+emit_32(1110769507);
+emit_32(1117536256);
+emit_32(1126180848);
+emit_32(1111106100);
+emit_32(1117536256);
+emit_32(1126436897);
+emit_32(1111271906);
+emit_32(1117536256);
+emit_32(1126692880);
+emit_32(1111370210);
+emit_32(1117536256);
+emit_32(1126948864);
+emit_32(1111065310);
+emit_32(1117536256);
+emit_32(1127204848);
+emit_32(1110676210);
+emit_32(1117536256);
+emit_32(1127460897);
+emit_32(1110374587);
+emit_32(1117536256);
+emit_32(1127716880);
+emit_32(1110042162);
+emit_32(1117536256);
+emit_32(1127972864);
+emit_32(1109530614);
+emit_32(1117536256);
+emit_32(1128228848);
+emit_32(1108942678);
+emit_32(1117536256);
+emit_32(1128484897);
+emit_32(1108422689);
+emit_32(1117536256);
+emit_32(1128740880);
+emit_32(1108099491);
+emit_32(1117536256);
+emit_32(1128996864);
+emit_32(1107404915);
+emit_32(1117536256);
+emit_32(1129252848);
+emit_32(1105961366);
+emit_32(1117536256);
+emit_32(1129508897);
+emit_32(1104014161);
+emit_32(1117536256);
+emit_32(1129764880);
+emit_32(1102659977);
+emit_32(1117536256);
+emit_32(1130020864);
+emit_32(1101498941);
+emit_32(1117536256);
+emit_32(1130276848);
+emit_32(1100603667);
+emit_32(1117536256);
+emit_32(1130532897);
+emit_32(1100248567);
+emit_32(1117536256);
+emit_32(1130788880);
+emit_32(1100396993);
+emit_32(1117536256);
+emit_32(1131044864);
+emit_32(1099775974);
+emit_32(1117536256);
+emit_32(1131300848);
+emit_32(1098614781);
+emit_32(1117536256);
+emit_32(1131556897);
+emit_32(1097165439);
+emit_32(1117536256);
+emit_32(1131812880);
+emit_32(1096806092);
+emit_32(1117536256);
+emit_32(1132068864);
+emit_32(1097532755);
+emit_32(1117536256);
+emit_32(1081737216);
+emit_32(1101362836);
+emit_32(1117024263);
+emit_32(1090125824);
+emit_32(1102440982);
+emit_32(1117024263);
+emit_32(1094418484);
+emit_32(1102525602);
+emit_32(1117024263);
+emit_32(1098514432);
+emit_32(1102772542);
+emit_32(1117024263);
+emit_32(1100759066);
+emit_32(1102996623);
+emit_32(1117024263);
+emit_32(1102807040);
+emit_32(1103394295);
+emit_32(1117024263);
+emit_32(1104855066);
+emit_32(1103807853);
+emit_32(1117024263);
+emit_32(1106903040);
+emit_32(1104063968);
+emit_32(1117024263);
+emit_32(1108123661);
+emit_32(1104272477);
+emit_32(1117024263);
+emit_32(1109147648);
+emit_32(1105094404);
+emit_32(1117024263);
+emit_32(1110171661);
+emit_32(1105462297);
+emit_32(1117024263);
+emit_32(1111195648);
+emit_32(1105615756);
+emit_32(1117024263);
+emit_32(1112219661);
+emit_32(1105780539);
+emit_32(1117024263);
+emit_32(1113243648);
+emit_32(1105949622);
+emit_32(1117024263);
+emit_32(1114267661);
+emit_32(1105825523);
+emit_32(1117024263);
+emit_32(1115291648);
+emit_32(1105325457);
+emit_32(1117024263);
+emit_32(1116000263);
+emit_32(1104503217);
+emit_32(1117024263);
+emit_32(1116512256);
+emit_32(1103914389);
+emit_32(1117024263);
+emit_32(1117024263);
+emit_32(1103220703);
+emit_32(1117024263);
+emit_32(1117536256);
+emit_32(1103554989);
+emit_32(1117024263);
+emit_32(1118048263);
+emit_32(1103557663);
+emit_32(1117024263);
+emit_32(1118560256);
+emit_32(1103000555);
+emit_32(1117024263);
+emit_32(1119072263);
+emit_32(1103407455);
+emit_32(1117024263);
+emit_32(1119584256);
+emit_32(1103934783);
+emit_32(1117024263);
+emit_32(1120096263);
+emit_32(1103628861);
+emit_32(1117024263);
+emit_32(1120608322);
+emit_32(1103876221);
+emit_32(1117024263);
+emit_32(1121120289);
+emit_32(1104062762);
+emit_32(1117024263);
+emit_32(1121632256);
+emit_32(1104076446);
+emit_32(1117024263);
+emit_32(1122144223);
+emit_32(1104571479);
+emit_32(1117024263);
+emit_32(1122656322);
+emit_32(1105134302);
+emit_32(1117024263);
+emit_32(1123168289);
+emit_32(1105662312);
+emit_32(1117024263);
+emit_32(1123680256);
+emit_32(1106251717);
+emit_32(1117024263);
+emit_32(1124132848);
+emit_32(1107284512);
+emit_32(1117024263);
+emit_32(1124388897);
+emit_32(1107873183);
+emit_32(1117024263);
+emit_32(1124644880);
+emit_32(1108188149);
+emit_32(1117024263);
+emit_32(1124900864);
+emit_32(1108443241);
+emit_32(1117024263);
+emit_32(1125156848);
+emit_32(1109131028);
+emit_32(1117024263);
+emit_32(1125412897);
+emit_32(1109732884);
+emit_32(1117024263);
+emit_32(1125668880);
+emit_32(1110471632);
+emit_32(1117024263);
+emit_32(1125924864);
+emit_32(1111024494);
+emit_32(1117024263);
+emit_32(1126180848);
+emit_32(1111170666);
+emit_32(1117024263);
+emit_32(1126436897);
+emit_32(1111345332);
+emit_32(1117024263);
+emit_32(1126692880);
+emit_32(1111265011);
+emit_32(1117024263);
+emit_32(1126948864);
+emit_32(1110964620);
+emit_32(1117024263);
+emit_32(1127204848);
+emit_32(1110816430);
+emit_32(1117024263);
+emit_32(1127460897);
+emit_32(1110708847);
+emit_32(1117024263);
+emit_32(1127716880);
+emit_32(1110212162);
+emit_32(1117024263);
+emit_32(1127972864);
+emit_32(1109715111);
+emit_32(1117024263);
+emit_32(1128228848);
+emit_32(1108818579);
+emit_32(1117024263);
+emit_32(1128484897);
+emit_32(1108483873);
+emit_32(1117024263);
+emit_32(1128740880);
+emit_32(1108125627);
+emit_32(1117024263);
+emit_32(1128996864);
+emit_32(1107598718);
+emit_32(1117024263);
+emit_32(1129252848);
+emit_32(1106363390);
+emit_32(1117024263);
+emit_32(1129508897);
+emit_32(1104237822);
+emit_32(1117024263);
+emit_32(1129764880);
+emit_32(1102138258);
+emit_32(1117024263);
+emit_32(1130020864);
+emit_32(1100193202);
+emit_32(1117024263);
+emit_32(1130276848);
+emit_32(1099480433);
+emit_32(1117024263);
+emit_32(1130532897);
+emit_32(1099613759);
+emit_32(1117024263);
+emit_32(1130788880);
+emit_32(1099142005);
+emit_32(1117024263);
+emit_32(1131044864);
+emit_32(1098613732);
+emit_32(1117024263);
+emit_32(1131300848);
+emit_32(1097637718);
+emit_32(1117024263);
+emit_32(1131556897);
+emit_32(1096434057);
+emit_32(1117024263);
+emit_32(1131812880);
+emit_32(1095523684);
+emit_32(1117024263);
+emit_32(1132068864);
+emit_32(1096168243);
+emit_32(1117024263);
+emit_32(1081737216);
+emit_32(1102550401);
+emit_32(1116512256);
+emit_32(1090125824);
+emit_32(1103281835);
+emit_32(1116512256);
+emit_32(1094418484);
+emit_32(1103432620);
+emit_32(1116512256);
+emit_32(1098514432);
+emit_32(1103624300);
+emit_32(1116512256);
+emit_32(1100759066);
+emit_32(1103732880);
+emit_32(1116512256);
+emit_32(1102807040);
+emit_32(1103772569);
+emit_32(1116512256);
+emit_32(1104855066);
+emit_32(1104059145);
+emit_32(1116512256);
+emit_32(1106903040);
+emit_32(1104733694);
+emit_32(1116512256);
+emit_32(1108123661);
+emit_32(1105135927);
+emit_32(1116512256);
+emit_32(1109147648);
+emit_32(1105641446);
+emit_32(1116512256);
+emit_32(1110171661);
+emit_32(1106189117);
+emit_32(1116512256);
+emit_32(1111195648);
+emit_32(1106590984);
+emit_32(1116512256);
+emit_32(1112219661);
+emit_32(1106792730);
+emit_32(1116512256);
+emit_32(1113243648);
+emit_32(1107103528);
+emit_32(1116512256);
+emit_32(1114267661);
+emit_32(1107045751);
+emit_32(1116512256);
+emit_32(1115291648);
+emit_32(1106493886);
+emit_32(1116512256);
+emit_32(1116000263);
+emit_32(1105577011);
+emit_32(1116512256);
+emit_32(1116512256);
+emit_32(1104601992);
+emit_32(1116512256);
+emit_32(1117024263);
+emit_32(1103981498);
+emit_32(1116512256);
+emit_32(1117536256);
+emit_32(1104213076);
+emit_32(1116512256);
+emit_32(1118048263);
+emit_32(1103729577);
+emit_32(1116512256);
+emit_32(1118560256);
+emit_32(1103354344);
+emit_32(1116512256);
+emit_32(1119072263);
+emit_32(1103689836);
+emit_32(1116512256);
+emit_32(1119584256);
+emit_32(1104224505);
+emit_32(1116512256);
+emit_32(1120096263);
+emit_32(1104374714);
+emit_32(1116512256);
+emit_32(1120608322);
+emit_32(1104188696);
+emit_32(1116512256);
+emit_32(1121120289);
+emit_32(1104209773);
+emit_32(1116512256);
+emit_32(1121632256);
+emit_32(1104973765);
+emit_32(1116512256);
+emit_32(1122144223);
+emit_32(1105524110);
+emit_32(1116512256);
+emit_32(1122656322);
+emit_32(1106275992);
+emit_32(1116512256);
+emit_32(1123168289);
+emit_32(1106381373);
+emit_32(1116512256);
+emit_32(1123680256);
+emit_32(1106763527);
+emit_32(1116512256);
+emit_32(1124132848);
+emit_32(1107402293);
+emit_32(1116512256);
+emit_32(1124388897);
+emit_32(1107816822);
+emit_32(1116512256);
+emit_32(1124644880);
+emit_32(1108307293);
+emit_32(1116512256);
+emit_32(1124900864);
+emit_32(1108759098);
+emit_32(1116512256);
+emit_32(1125156848);
+emit_32(1109471632);
+emit_32(1116512256);
+emit_32(1125412897);
+emit_32(1109900027);
+emit_32(1116512256);
+emit_32(1125668880);
+emit_32(1110484111);
+emit_32(1116512256);
+emit_32(1125924864);
+emit_32(1110873316);
+emit_32(1116512256);
+emit_32(1126180848);
+emit_32(1111321923);
+emit_32(1116512256);
+emit_32(1126436897);
+emit_32(1111520628);
+emit_32(1116512256);
+emit_32(1126692880);
+emit_32(1111429507);
+emit_32(1116512256);
+emit_32(1126948864);
+emit_32(1110992722);
+emit_32(1116512256);
+emit_32(1127204848);
+emit_32(1110804503);
+emit_32(1116512256);
+emit_32(1127460897);
+emit_32(1110532633);
+emit_32(1116512256);
+emit_32(1127716880);
+emit_32(1110132130);
+emit_32(1116512256);
+emit_32(1127972864);
+emit_32(1109531112);
+emit_32(1116512256);
+emit_32(1128228848);
+emit_32(1108783425);
+emit_32(1116512256);
+emit_32(1128484897);
+emit_32(1108534467);
+emit_32(1116512256);
+emit_32(1128740880);
+emit_32(1108104918);
+emit_32(1116512256);
+emit_32(1128996864);
+emit_32(1107580866);
+emit_32(1116512256);
+emit_32(1129252848);
+emit_32(1106274314);
+emit_32(1116512256);
+emit_32(1129508897);
+emit_32(1104539025);
+emit_32(1116512256);
+emit_32(1129764880);
+emit_32(1102452516);
+emit_32(1116512256);
+emit_32(1130020864);
+emit_32(1100238029);
+emit_32(1116512256);
+emit_32(1130276848);
+emit_32(1098493670);
+emit_32(1116512256);
+emit_32(1130532897);
+emit_32(1097538732);
+emit_32(1116512256);
+emit_32(1130788880);
+emit_32(1097860435);
+emit_32(1116512256);
+emit_32(1131044864);
+emit_32(1096806826);
+emit_32(1116512256);
+emit_32(1131300848);
+emit_32(1095175137);
+emit_32(1116512256);
+emit_32(1131556897);
+emit_32(1095179751);
+emit_32(1116512256);
+emit_32(1131812880);
+emit_32(1094445538);
+emit_32(1116512256);
+emit_32(1132068864);
+emit_32(1094491675);
+emit_32(1116512256);
+emit_32(1081737216);
+emit_32(1103917954);
+emit_32(1116000263);
+emit_32(1090125824);
+emit_32(1104214281);
+emit_32(1116000263);
+emit_32(1094418484);
+emit_32(1104273211);
+emit_32(1116000263);
+emit_32(1098514432);
+emit_32(1104389236);
+emit_32(1116000263);
+emit_32(1100759066);
+emit_32(1104665746);
+emit_32(1116000263);
+emit_32(1102807040);
+emit_32(1104683886);
+emit_32(1116000263);
+emit_32(1104855066);
+emit_32(1104862354);
+emit_32(1116000263);
+emit_32(1106903040);
+emit_32(1105668342);
+emit_32(1116000263);
+emit_32(1108123661);
+emit_32(1106303097);
+emit_32(1116000263);
+emit_32(1109147648);
+emit_32(1106378228);
+emit_32(1116000263);
+emit_32(1110171661);
+emit_32(1106845054);
+emit_32(1116000263);
+emit_32(1111195648);
+emit_32(1107149298);
+emit_32(1116000263);
+emit_32(1112219661);
+emit_32(1107634553);
+emit_32(1116000263);
+emit_32(1113243648);
+emit_32(1107721139);
+emit_32(1116000263);
+emit_32(1114267661);
+emit_32(1107693457);
+emit_32(1116000263);
+emit_32(1115291648);
+emit_32(1107040823);
+emit_32(1116000263);
+emit_32(1116000263);
+emit_32(1106302678);
+emit_32(1116000263);
+emit_32(1116512256);
+emit_32(1105678251);
+emit_32(1116000263);
+emit_32(1117024263);
+emit_32(1104723575);
+emit_32(1116000263);
+emit_32(1117536256);
+emit_32(1104584219);
+emit_32(1116000263);
+emit_32(1118048263);
+emit_32(1104086408);
+emit_32(1116000263);
+emit_32(1118560256);
+emit_32(1103762398);
+emit_32(1116000263);
+emit_32(1119072263);
+emit_32(1104084573);
+emit_32(1116000263);
+emit_32(1119584256);
+emit_32(1104925583);
+emit_32(1116000263);
+emit_32(1120096263);
+emit_32(1104774273);
+emit_32(1116000263);
+emit_32(1120608322);
+emit_32(1104591244);
+emit_32(1116000263);
+emit_32(1121120289);
+emit_32(1104826283);
+emit_32(1116000263);
+emit_32(1121632256);
+emit_32(1105545973);
+emit_32(1116000263);
+emit_32(1122144223);
+emit_32(1105872919);
+emit_32(1116000263);
+emit_32(1122656322);
+emit_32(1106423946);
+emit_32(1116000263);
+emit_32(1123168289);
+emit_32(1107313243);
+emit_32(1116000263);
+emit_32(1123680256);
+emit_32(1107471709);
+emit_32(1116000263);
+emit_32(1124132848);
+emit_32(1107748166);
+emit_32(1116000263);
+emit_32(1124388897);
+emit_32(1108035319);
+emit_32(1116000263);
+emit_32(1124644880);
+emit_32(1108525135);
+emit_32(1116000263);
+emit_32(1124900864);
+emit_32(1109011254);
+emit_32(1116000263);
+emit_32(1125156848);
+emit_32(1109529539);
+emit_32(1116000263);
+emit_32(1125412897);
+emit_32(1109929073);
+emit_32(1116000263);
+emit_32(1125668880);
+emit_32(1110361244);
+emit_32(1116000263);
+emit_32(1125924864);
+emit_32(1111018701);
+emit_32(1116000263);
+emit_32(1126180848);
+emit_32(1111418392);
+emit_32(1116000263);
+emit_32(1126436897);
+emit_32(1111581943);
+emit_32(1116000263);
+emit_32(1126692880);
+emit_32(1111596912);
+emit_32(1116000263);
+emit_32(1126948864);
+emit_32(1111336970);
+emit_32(1116000263);
+emit_32(1127204848);
+emit_32(1110946611);
+emit_32(1116000263);
+emit_32(1127460897);
+emit_32(1110462222);
+emit_32(1116000263);
+emit_32(1127716880);
+emit_32(1109940398);
+emit_32(1116000263);
+emit_32(1127972864);
+emit_32(1109463846);
+emit_32(1116000263);
+emit_32(1128228848);
+emit_32(1108875307);
+emit_32(1116000263);
+emit_32(1128484897);
+emit_32(1108586607);
+emit_32(1116000263);
+emit_32(1128740880);
+emit_32(1108248442);
+emit_32(1116000263);
+emit_32(1128996864);
+emit_32(1107558426);
+emit_32(1116000263);
+emit_32(1129252848);
+emit_32(1106322391);
+emit_32(1116000263);
+emit_32(1129508897);
+emit_32(1104389131);
+emit_32(1116000263);
+emit_32(1129764880);
+emit_32(1102274835);
+emit_32(1116000263);
+emit_32(1130020864);
+emit_32(1100247571);
+emit_32(1116000263);
+emit_32(1130276848);
+emit_32(1098982516);
+emit_32(1116000263);
+emit_32(1130532897);
+emit_32(1097852990);
+emit_32(1116000263);
+emit_32(1130788880);
+emit_32(1097777388);
+emit_32(1116000263);
+emit_32(1131044864);
+emit_32(1096162057);
+emit_32(1116000263);
+emit_32(1131300848);
+emit_32(1093655750);
+emit_32(1116000263);
+emit_32(1131556897);
+emit_32(1093255194);
+emit_32(1116000263);
+emit_32(1131812880);
+emit_32(1092384509);
+emit_32(1116000263);
+emit_32(1132068864);
+emit_32(1092614651);
+emit_32(1116000263);
+emit_32(1081737216);
+emit_32(1104775951);
+emit_32(1115291648);
+emit_32(1090125824);
+emit_32(1105273081);
+emit_32(1115291648);
+emit_32(1094418484);
+emit_32(1105163033);
+emit_32(1115291648);
+emit_32(1098514432);
+emit_32(1105037623);
+emit_32(1115291648);
+emit_32(1100759066);
+emit_32(1105121038);
+emit_32(1115291648);
+emit_32(1102807040);
+emit_32(1105312455);
+emit_32(1115291648);
+emit_32(1104855066);
+emit_32(1106012694);
+emit_32(1115291648);
+emit_32(1106903040);
+emit_32(1106371779);
+emit_32(1115291648);
+emit_32(1108123661);
+emit_32(1106828329);
+emit_32(1115291648);
+emit_32(1109147648);
+emit_32(1107099071);
+emit_32(1115291648);
+emit_32(1110171661);
+emit_32(1107519026);
+emit_32(1115291648);
+emit_32(1111195648);
+emit_32(1107598272);
+emit_32(1115291648);
+emit_32(1112219661);
+emit_32(1107988605);
+emit_32(1115291648);
+emit_32(1113243648);
+emit_32(1108084340);
+emit_32(1115291648);
+emit_32(1114267661);
+emit_32(1107768272);
+emit_32(1115291648);
+emit_32(1115291648);
+emit_32(1107585375);
+emit_32(1115291648);
+emit_32(1116000263);
+emit_32(1107334686);
+emit_32(1115291648);
+emit_32(1116512256);
+emit_32(1106384729);
+emit_32(1115291648);
+emit_32(1117024263);
+emit_32(1105355237);
+emit_32(1115291648);
+emit_32(1117536256);
+emit_32(1105239160);
+emit_32(1115291648);
+emit_32(1118048263);
+emit_32(1104804472);
+emit_32(1115291648);
+emit_32(1118560256);
+emit_32(1104295703);
+emit_32(1115291648);
+emit_32(1119072263);
+emit_32(1104303725);
+emit_32(1115291648);
+emit_32(1119584256);
+emit_32(1104739566);
+emit_32(1115291648);
+emit_32(1120096263);
+emit_32(1104935911);
+emit_32(1115291648);
+emit_32(1120608322);
+emit_32(1104793148);
+emit_32(1115291648);
+emit_32(1121120289);
+emit_32(1105350990);
+emit_32(1115291648);
+emit_32(1121632256);
+emit_32(1105666821);
+emit_32(1115291648);
+emit_32(1122144223);
+emit_32(1106542854);
+emit_32(1115291648);
+emit_32(1122656322);
+emit_32(1107330282);
+emit_32(1115291648);
+emit_32(1123168289);
+emit_32(1107522722);
+emit_32(1115291648);
+emit_32(1123680256);
+emit_32(1107991908);
+emit_32(1115291648);
+emit_32(1124132848);
+emit_32(1108210273);
+emit_32(1115291648);
+emit_32(1124388897);
+emit_32(1108506863);
+emit_32(1115291648);
+emit_32(1124644880);
+emit_32(1108775220);
+emit_32(1115291648);
+emit_32(1124900864);
+emit_32(1109189670);
+emit_32(1115291648);
+emit_32(1125156848);
+emit_32(1109527233);
+emit_32(1115291648);
+emit_32(1125412897);
+emit_32(1109974057);
+emit_32(1115291648);
+emit_32(1125668880);
+emit_32(1110321240);
+emit_32(1115291648);
+emit_32(1125924864);
+emit_32(1110734825);
+emit_32(1115291648);
+emit_32(1126180848);
+emit_32(1111142197);
+emit_32(1115291648);
+emit_32(1126436897);
+emit_32(1111340456);
+emit_32(1115291648);
+emit_32(1126692880);
+emit_32(1111407224);
+emit_32(1115291648);
+emit_32(1126948864);
+emit_32(1111510535);
+emit_32(1115291648);
+emit_32(1127204848);
+emit_32(1111087042);
+emit_32(1115291648);
+emit_32(1127460897);
+emit_32(1110641816);
+emit_32(1115291648);
+emit_32(1127716880);
+emit_32(1110084734);
+emit_32(1115291648);
+emit_32(1127972864);
+emit_32(1109478107);
+emit_32(1115291648);
+emit_32(1128228848);
+emit_32(1108983703);
+emit_32(1115291648);
+emit_32(1128484897);
+emit_32(1108396684);
+emit_32(1115291648);
+emit_32(1128740880);
+emit_32(1108182303);
+emit_32(1115291648);
+emit_32(1128996864);
+emit_32(1107304776);
+emit_32(1115291648);
+emit_32(1129252848);
+emit_32(1105830714);
+emit_32(1115291648);
+emit_32(1129508897);
+emit_32(1104926999);
+emit_32(1115291648);
+emit_32(1129764880);
+emit_32(1103134825);
+emit_32(1115291648);
+emit_32(1130020864);
+emit_32(1101331694);
+emit_32(1115291648);
+emit_32(1130276848);
+emit_32(1100242905);
+emit_32(1115291648);
+emit_32(1130532897);
+emit_32(1099575381);
+emit_32(1115291648);
+emit_32(1130788880);
+emit_32(1098291610);
+emit_32(1115291648);
+emit_32(1131044864);
+emit_32(1096472330);
+emit_32(1115291648);
+emit_32(1131300848);
+emit_32(1094126875);
+emit_32(1115291648);
+emit_32(1131556897);
+emit_32(1092334691);
+emit_32(1115291648);
+emit_32(1131812880);
+emit_32(1091097822);
+emit_32(1115291648);
+emit_32(1132068864);
+emit_32(1090977194);
+emit_32(1115291648);
+emit_32(1081737216);
+emit_32(1105382343);
+emit_32(1114267661);
+emit_32(1090125824);
+emit_32(1105662155);
+emit_32(1114267661);
+emit_32(1094418484);
+emit_32(1105488092);
+emit_32(1114267661);
+emit_32(1098514432);
+emit_32(1105646479);
+emit_32(1114267661);
+emit_32(1100759066);
+emit_32(1105753591);
+emit_32(1114267661);
+emit_32(1102807040);
+emit_32(1106409108);
+emit_32(1114267661);
+emit_32(1104855066);
+emit_32(1106974396);
+emit_32(1114267661);
+emit_32(1106903040);
+emit_32(1107565006);
+emit_32(1114267661);
+emit_32(1108123661);
+emit_32(1107665538);
+emit_32(1114267661);
+emit_32(1109147648);
+emit_32(1107918481);
+emit_32(1114267661);
+emit_32(1110171661);
+emit_32(1108002577);
+emit_32(1114267661);
+emit_32(1111195648);
+emit_32(1107850848);
+emit_32(1114267661);
+emit_32(1112219661);
+emit_32(1108010494);
+emit_32(1114267661);
+emit_32(1113243648);
+emit_32(1108185815);
+emit_32(1114267661);
+emit_32(1114267661);
+emit_32(1108069791);
+emit_32(1114267661);
+emit_32(1115291648);
+emit_32(1107943490);
+emit_32(1114267661);
+emit_32(1116000263);
+emit_32(1107599924);
+emit_32(1114267661);
+emit_32(1116512256);
+emit_32(1106557691);
+emit_32(1114267661);
+emit_32(1117024263);
+emit_32(1106465102);
+emit_32(1114267661);
+emit_32(1117536256);
+emit_32(1106678120);
+emit_32(1114267661);
+emit_32(1118048263);
+emit_32(1106208044);
+emit_32(1114267661);
+emit_32(1118560256);
+emit_32(1105390469);
+emit_32(1114267661);
+emit_32(1119072263);
+emit_32(1105130632);
+emit_32(1114267661);
+emit_32(1119584256);
+emit_32(1105068923);
+emit_32(1114267661);
+emit_32(1120096263);
+emit_32(1105156532);
+emit_32(1114267661);
+emit_32(1120608322);
+emit_32(1105073537);
+emit_32(1114267661);
+emit_32(1121120289);
+emit_32(1105331225);
+emit_32(1114267661);
+emit_32(1121632256);
+emit_32(1105964145);
+emit_32(1114267661);
+emit_32(1122144223);
+emit_32(1106908702);
+emit_32(1114267661);
+emit_32(1122656322);
+emit_32(1107699250);
+emit_32(1114267661);
+emit_32(1123168289);
+emit_32(1107951485);
+emit_32(1114267661);
+emit_32(1123680256);
+emit_32(1108124448);
+emit_32(1114267661);
+emit_32(1124132848);
+emit_32(1108505998);
+emit_32(1114267661);
+emit_32(1124388897);
+emit_32(1108644332);
+emit_32(1114267661);
+emit_32(1124644880);
+emit_32(1108925429);
+emit_32(1114267661);
+emit_32(1124900864);
+emit_32(1109130320);
+emit_32(1114267661);
+emit_32(1125156848);
+emit_32(1109477189);
+emit_32(1114267661);
+emit_32(1125412897);
+emit_32(1110047693);
+emit_32(1114267661);
+emit_32(1125668880);
+emit_32(1110276833);
+emit_32(1114267661);
+emit_32(1125924864);
+emit_32(1110533420);
+emit_32(1114267661);
+emit_32(1126180848);
+emit_32(1110872975);
+emit_32(1114267635);
+emit_32(1126436897);
+emit_32(1110877064);
+emit_32(1114267635);
+emit_32(1126692880);
+emit_32(1111218743);
+emit_32(1114267661);
+emit_32(1126948864);
+emit_32(1111252874);
+emit_32(1114267661);
+emit_32(1127204848);
+emit_32(1110924067);
+emit_32(1114267635);
+emit_32(1127460897);
+emit_32(1110454855);
+emit_32(1114267635);
+emit_32(1127716880);
+emit_32(1109824949);
+emit_32(1114267661);
+emit_32(1127972864);
+emit_32(1109367508);
+emit_32(1114267661);
+emit_32(1128228848);
+emit_32(1108826469);
+emit_32(1114267661);
+emit_32(1128484897);
+emit_32(1108105521);
+emit_32(1114267661);
+emit_32(1128740880);
+emit_32(1107979010);
+emit_32(1114267661);
+emit_32(1128996864);
+emit_32(1107413408);
+emit_32(1114267661);
+emit_32(1129252848);
+emit_32(1106515224);
+emit_32(1114267661);
+emit_32(1129508897);
+emit_32(1105576277);
+emit_32(1114267661);
+emit_32(1129764880);
+emit_32(1104326584);
+emit_32(1114267661);
+emit_32(1130020864);
+emit_32(1103294261);
+emit_32(1114267661);
+emit_32(1130276848);
+emit_32(1102143501);
+emit_32(1114267661);
+emit_32(1130532897);
+emit_32(1101094348);
+emit_32(1114267661);
+emit_32(1130788880);
+emit_32(1100028785);
+emit_32(1114267661);
+emit_32(1131044864);
+emit_32(1098592446);
+emit_32(1114267661);
+emit_32(1131300848);
+emit_32(1095355492);
+emit_32(1114267661);
+emit_32(1131556897);
+emit_32(1093903738);
+emit_32(1114267661);
+emit_32(1131812880);
+emit_32(1093133979);
+emit_32(1114267661);
+emit_32(1132068864);
+emit_32(1092040083);
+emit_32(1114267661);
+emit_32(1081737216);
+emit_32(1105831238);
+emit_32(1113243648);
+emit_32(1090125824);
+emit_32(1105941548);
+emit_32(1113243648);
+emit_32(1094418484);
+emit_32(1106052330);
+emit_32(1113243648);
+emit_32(1098514432);
+emit_32(1106181987);
+emit_32(1113243648);
+emit_32(1100759066);
+emit_32(1106947762);
+emit_32(1113243648);
+emit_32(1102807040);
+emit_32(1107434170);
+emit_32(1113243648);
+emit_32(1104855066);
+emit_32(1107922597);
+emit_32(1113243648);
+emit_32(1106903040);
+emit_32(1108070236);
+emit_32(1113243648);
+emit_32(1108123661);
+emit_32(1108318408);
+emit_32(1113243648);
+emit_32(1109147648);
+emit_32(1108398991);
+emit_32(1113243648);
+emit_32(1110171661);
+emit_32(1108455247);
+emit_32(1113243648);
+emit_32(1111195648);
+emit_32(1108380929);
+emit_32(1113243648);
+emit_32(1112219661);
+emit_32(1108193129);
+emit_32(1113243648);
+emit_32(1113243648);
+emit_32(1108214940);
+emit_32(1113243648);
+emit_32(1114267661);
+emit_32(1108368189);
+emit_32(1113243648);
+emit_32(1115291648);
+emit_32(1108351228);
+emit_32(1113243648);
+emit_32(1116000263);
+emit_32(1108058728);
+emit_32(1113243648);
+emit_32(1116512256);
+emit_32(1107523561);
+emit_32(1113243648);
+emit_32(1117024263);
+emit_32(1107704624);
+emit_32(1113243648);
+emit_32(1117536256);
+emit_32(1107780384);
+emit_32(1113243648);
+emit_32(1118048263);
+emit_32(1107523797);
+emit_32(1113243648);
+emit_32(1118560256);
+emit_32(1106889671);
+emit_32(1113243648);
+emit_32(1119072263);
+emit_32(1105955127);
+emit_32(1113243648);
+emit_32(1119584256);
+emit_32(1105678513);
+emit_32(1113243648);
+emit_32(1120096263);
+emit_32(1105031175);
+emit_32(1113243648);
+emit_32(1120608322);
+emit_32(1105177346);
+emit_32(1113243648);
+emit_32(1121120289);
+emit_32(1105487043);
+emit_32(1113243648);
+emit_32(1121632256);
+emit_32(1105785782);
+emit_32(1113243648);
+emit_32(1122144223);
+emit_32(1106626950);
+emit_32(1113243648);
+emit_32(1122656322);
+emit_32(1107401638);
+emit_32(1113243648);
+emit_32(1123168289);
+emit_32(1107915047);
+emit_32(1113243648);
+emit_32(1123680256);
+emit_32(1108256070);
+emit_32(1113243648);
+emit_32(1124132848);
+emit_32(1108654529);
+emit_32(1113243648);
+emit_32(1124388897);
+emit_32(1108830034);
+emit_32(1113243648);
+emit_32(1124644880);
+emit_32(1108955156);
+emit_32(1113243648);
+emit_32(1124900864);
+emit_32(1109136769);
+emit_32(1113243648);
+emit_32(1125156848);
+emit_32(1109352907);
+emit_32(1113243648);
+emit_32(1125412897);
+emit_32(1109748534);
+emit_32(1113243648);
+emit_32(1125668880);
+emit_32(1109939926);
+emit_32(1113243648);
+emit_32(1125924864);
+emit_32(1110036867);
+emit_32(1113243648);
+emit_32(1126180848);
+emit_32(1110259401);
+emit_32(1113243648);
+emit_32(1126436897);
+emit_32(1110514257);
+emit_32(1113243648);
+emit_32(1126692880);
+emit_32(1110728167);
+emit_32(1113243648);
+emit_32(1126948864);
+emit_32(1110690470);
+emit_32(1113243648);
+emit_32(1127204848);
+emit_32(1110543172);
+emit_32(1113243648);
+emit_32(1127460897);
+emit_32(1110206867);
+emit_32(1113243648);
+emit_32(1127716880);
+emit_32(1109792994);
+emit_32(1113243648);
+emit_32(1127972864);
+emit_32(1109392779);
+emit_32(1113243648);
+emit_32(1128228848);
+emit_32(1108657596);
+emit_32(1113243648);
+emit_32(1128484897);
+emit_32(1108142902);
+emit_32(1113243648);
+emit_32(1128740880);
+emit_32(1107935625);
+emit_32(1113243648);
+emit_32(1128996864);
+emit_32(1107490216);
+emit_32(1113243648);
+emit_32(1129252848);
+emit_32(1107021844);
+emit_32(1113243648);
+emit_32(1129508897);
+emit_32(1106216328);
+emit_32(1113243648);
+emit_32(1129764880);
+emit_32(1105553103);
+emit_32(1113243648);
+emit_32(1130020864);
+emit_32(1104695106);
+emit_32(1113243648);
+emit_32(1130276848);
+emit_32(1103352404);
+emit_32(1113243648);
+emit_32(1130532897);
+emit_32(1101904950);
+emit_32(1113243648);
+emit_32(1130788880);
+emit_32(1101020476);
+emit_32(1113243648);
+emit_32(1131044864);
+emit_32(1099594623);
+emit_32(1113243648);
+emit_32(1131300848);
+emit_32(1097008782);
+emit_32(1113243648);
+emit_32(1131556897);
+emit_32(1094881640);
+emit_32(1113243648);
+emit_32(1131812880);
+emit_32(1093566726);
+emit_32(1113243648);
+emit_32(1132068864);
+emit_32(1093310244);
+emit_32(1113243648);
+emit_32(1081737216);
+emit_32(1106473438);
+emit_32(1112219661);
+emit_32(1090125824);
+emit_32(1106755138);
+emit_32(1112219661);
+emit_32(1094418484);
+emit_32(1106932662);
+emit_32(1112219661);
+emit_32(1098514432);
+emit_32(1107310071);
+emit_32(1112219661);
+emit_32(1100759066);
+emit_32(1107799179);
+emit_32(1112219661);
+emit_32(1102807040);
+emit_32(1107999693);
+emit_32(1112219661);
+emit_32(1104855066);
+emit_32(1108293059);
+emit_32(1112219661);
+emit_32(1106903040);
+emit_32(1108560839);
+emit_32(1112219661);
+emit_32(1108123661);
+emit_32(1108867783);
+emit_32(1112219661);
+emit_32(1109147648);
+emit_32(1108932769);
+emit_32(1112219661);
+emit_32(1110171661);
+emit_32(1108709527);
+emit_32(1112219661);
+emit_32(1111195648);
+emit_32(1108681661);
+emit_32(1112219661);
+emit_32(1112219661);
+emit_32(1108461250);
+emit_32(1112219661);
+emit_32(1113243648);
+emit_32(1108501751);
+emit_32(1112219661);
+emit_32(1114267661);
+emit_32(1108538058);
+emit_32(1112219661);
+emit_32(1115291648);
+emit_32(1108506155);
+emit_32(1112219661);
+emit_32(1116000263);
+emit_32(1108331069);
+emit_32(1112219661);
+emit_32(1116512256);
+emit_32(1108130713);
+emit_32(1112219661);
+emit_32(1117024263);
+emit_32(1108289153);
+emit_32(1112219661);
+emit_32(1117536256);
+emit_32(1108320872);
+emit_32(1112219661);
+emit_32(1118048263);
+emit_32(1108083946);
+emit_32(1112219661);
+emit_32(1118560256);
+emit_32(1107747196);
+emit_32(1112219661);
+emit_32(1119072263);
+emit_32(1107465942);
+emit_32(1112219661);
+emit_32(1119584256);
+emit_32(1106748480);
+emit_32(1112219661);
+emit_32(1120096263);
+emit_32(1105589856);
+emit_32(1112219661);
+emit_32(1120608322);
+emit_32(1105803398);
+emit_32(1112219661);
+emit_32(1121120289);
+emit_32(1106245426);
+emit_32(1112219661);
+emit_32(1121632256);
+emit_32(1106538345);
+emit_32(1112219661);
+emit_32(1122144223);
+emit_32(1107136191);
+emit_32(1112219661);
+emit_32(1122656322);
+emit_32(1107495066);
+emit_32(1112219661);
+emit_32(1123168289);
+emit_32(1107886552);
+emit_32(1112219661);
+emit_32(1123680256);
+emit_32(1108441668);
+emit_32(1112219661);
+emit_32(1124132848);
+emit_32(1108593266);
+emit_32(1112219661);
+emit_32(1124388897);
+emit_32(1108683470);
+emit_32(1112219661);
+emit_32(1124644880);
+emit_32(1108825211);
+emit_32(1112219661);
+emit_32(1124900864);
+emit_32(1108891271);
+emit_32(1112219661);
+emit_32(1125156848);
+emit_32(1109395715);
+emit_32(1112219661);
+emit_32(1125412897);
+emit_32(1109608864);
+emit_32(1112219661);
+emit_32(1125668880);
+emit_32(1110023576);
+emit_32(1112219661);
+emit_32(1125924864);
+emit_32(1110077237);
+emit_32(1112219661);
+emit_32(1126180848);
+emit_32(1110323678);
+emit_32(1112219661);
+emit_32(1126436897);
+emit_32(1110319510);
+emit_32(1112219661);
+emit_32(1126692880);
+emit_32(1110497559);
+emit_32(1112219635);
+emit_32(1126948864);
+emit_32(1110356630);
+emit_32(1112219661);
+emit_32(1127204848);
+emit_32(1110231745);
+emit_32(1112219661);
+emit_32(1127460897);
+emit_32(1110168568);
+emit_32(1112219661);
+emit_32(1127716880);
+emit_32(1109786440);
+emit_32(1112219661);
+emit_32(1127972864);
+emit_32(1109264984);
+emit_32(1112219661);
+emit_32(1128228848);
+emit_32(1108914445);
+emit_32(1112219661);
+emit_32(1128484897);
+emit_32(1108210640);
+emit_32(1112219661);
+emit_32(1128740880);
+emit_32(1107987897);
+emit_32(1112219661);
+emit_32(1128996864);
+emit_32(1107869644);
+emit_32(1112219661);
+emit_32(1129252848);
+emit_32(1107326534);
+emit_32(1112219661);
+emit_32(1129508897);
+emit_32(1106725831);
+emit_32(1112219661);
+emit_32(1129764880);
+emit_32(1106425466);
+emit_32(1112219661);
+emit_32(1130020864);
+emit_32(1105264955);
+emit_32(1112219661);
+emit_32(1130276848);
+emit_32(1103574860);
+emit_32(1112219661);
+emit_32(1130532897);
+emit_32(1102181460);
+emit_32(1112219661);
+emit_32(1130788880);
+emit_32(1101485677);
+emit_32(1112219661);
+emit_32(1131044864);
+emit_32(1100402288);
+emit_32(1112219661);
+emit_32(1131300848);
+emit_32(1098898421);
+emit_32(1112219661);
+emit_32(1131556897);
+emit_32(1095522425);
+emit_32(1112219661);
+emit_32(1131812880);
+emit_32(1094313732);
+emit_32(1112219661);
+emit_32(1132068864);
+emit_32(1094995201);
+emit_32(1112219661);
+emit_32(1081737216);
+emit_32(1106707585);
+emit_32(1111195648);
+emit_32(1090125824);
+emit_32(1107420879);
+emit_32(1111195648);
+emit_32(1094418484);
+emit_32(1107741455);
+emit_32(1111195648);
+emit_32(1098514432);
+emit_32(1108119388);
+emit_32(1111195648);
+emit_32(1100759066);
+emit_32(1108616649);
+emit_32(1111195648);
+emit_32(1102807040);
+emit_32(1108965851);
+emit_32(1111195648);
+emit_32(1104855066);
+emit_32(1109029919);
+emit_32(1111195648);
+emit_32(1106903040);
+emit_32(1109125602);
+emit_32(1111195648);
+emit_32(1108123661);
+emit_32(1109390551);
+emit_32(1111195648);
+emit_32(1109147648);
+emit_32(1109477215);
+emit_32(1111195648);
+emit_32(1110171661);
+emit_32(1109385334);
+emit_32(1111195648);
+emit_32(1111195648);
+emit_32(1109314608);
+emit_32(1111195648);
+emit_32(1112219661);
+emit_32(1109240919);
+emit_32(1111195648);
+emit_32(1113243648);
+emit_32(1108946400);
+emit_32(1111195648);
+emit_32(1114267661);
+emit_32(1108953006);
+emit_32(1111195648);
+emit_32(1115291648);
+emit_32(1109031911);
+emit_32(1111195648);
+emit_32(1116000263);
+emit_32(1108925062);
+emit_32(1111195648);
+emit_32(1116512256);
+emit_32(1108595887);
+emit_32(1111195648);
+emit_32(1117024263);
+emit_32(1108683941);
+emit_32(1111195648);
+emit_32(1117536256);
+emit_32(1108833809);
+emit_32(1111195648);
+emit_32(1118048263);
+emit_32(1108582282);
+emit_32(1111195648);
+emit_32(1118560256);
+emit_32(1108393093);
+emit_32(1111195648);
+emit_32(1119072263);
+emit_32(1108034008);
+emit_32(1111195648);
+emit_32(1119584256);
+emit_32(1107578926);
+emit_32(1111195648);
+emit_32(1120096263);
+emit_32(1106764313);
+emit_32(1111195648);
+emit_32(1120608322);
+emit_32(1106737365);
+emit_32(1111195648);
+emit_32(1121120289);
+emit_32(1107324568);
+emit_32(1111195648);
+emit_32(1121632256);
+emit_32(1107570511);
+emit_32(1111195648);
+emit_32(1122144223);
+emit_32(1107538818);
+emit_32(1111195648);
+emit_32(1122656322);
+emit_32(1107646926);
+emit_32(1111195648);
+emit_32(1123168289);
+emit_32(1107876984);
+emit_32(1111195648);
+emit_32(1123680256);
+emit_32(1108102060);
+emit_32(1111195648);
+emit_32(1124132848);
+emit_32(1108560812);
+emit_32(1111195648);
+emit_32(1124388897);
+emit_32(1108645328);
+emit_32(1111195648);
+emit_32(1124644880);
+emit_32(1108748770);
+emit_32(1111195648);
+emit_32(1124900864);
+emit_32(1109085782);
+emit_32(1111195648);
+emit_32(1125156848);
+emit_32(1109583226);
+emit_32(1111195648);
+emit_32(1125412897);
+emit_32(1109638486);
+emit_32(1111195648);
+emit_32(1125668880);
+emit_32(1110035425);
+emit_32(1111195648);
+emit_32(1125924864);
+emit_32(1110433989);
+emit_32(1111195648);
+emit_32(1126180848);
+emit_32(1110499420);
+emit_32(1111195648);
+emit_32(1126436897);
+emit_32(1110684860);
+emit_32(1111195648);
+emit_32(1126692880);
+emit_32(1110426858);
+emit_32(1111195648);
+emit_32(1126948864);
+emit_32(1110251405);
+emit_32(1111195648);
+emit_32(1127204848);
+emit_32(1110246503);
+emit_32(1111195648);
+emit_32(1127460897);
+emit_32(1110057366);
+emit_32(1111195648);
+emit_32(1127716880);
+emit_32(1109702135);
+emit_32(1111195648);
+emit_32(1127972864);
+emit_32(1109224404);
+emit_32(1111195648);
+emit_32(1128228848);
+emit_32(1108823035);
+emit_32(1111195648);
+emit_32(1128484897);
+emit_32(1108466703);
+emit_32(1111195648);
+emit_32(1128740880);
+emit_32(1108265009);
+emit_32(1111195648);
+emit_32(1128996864);
+emit_32(1108131919);
+emit_32(1111195648);
+emit_32(1129252848);
+emit_32(1107543668);
+emit_32(1111195648);
+emit_32(1129508897);
+emit_32(1106964749);
+emit_32(1111195648);
+emit_32(1129764880);
+emit_32(1106629467);
+emit_32(1111195648);
+emit_32(1130020864);
+emit_32(1105373587);
+emit_32(1111195648);
+emit_32(1130276848);
+emit_32(1103657645);
+emit_32(1111195648);
+emit_32(1130532897);
+emit_32(1103203244);
+emit_32(1111195648);
+emit_32(1130788880);
+emit_32(1102255384);
+emit_32(1111195648);
+emit_32(1131044864);
+emit_32(1100737203);
+emit_32(1111195648);
+emit_32(1131300848);
+emit_32(1099366557);
+emit_32(1111195648);
+emit_32(1131556897);
+emit_32(1096754817);
+emit_32(1111195648);
+emit_32(1131812880);
+emit_32(1096073871);
+emit_32(1111195648);
+emit_32(1132068864);
+emit_32(1096026581);
+emit_32(1111195648);
+emit_32(1081737216);
+emit_32(1107240944);
+emit_32(1110171661);
+emit_32(1090125824);
+emit_32(1107823611);
+emit_32(1110171661);
+emit_32(1094418484);
+emit_32(1108408821);
+emit_32(1110171661);
+emit_32(1098514432);
+emit_32(1108701925);
+emit_32(1110171661);
+emit_32(1100759066);
+emit_32(1109285326);
+emit_32(1110171661);
+emit_32(1102807040);
+emit_32(1109681609);
+emit_32(1110171661);
+emit_32(1104855066);
+emit_32(1109940345);
+emit_32(1110171661);
+emit_32(1106903040);
+emit_32(1109939952);
+emit_32(1110171661);
+emit_32(1108123661);
+emit_32(1109971121);
+emit_32(1110171661);
+emit_32(1109147648);
+emit_32(1110303834);
+emit_32(1110171661);
+emit_32(1110171661);
+emit_32(1110120962);
+emit_32(1110171661);
+emit_32(1111195648);
+emit_32(1110000979);
+emit_32(1110171661);
+emit_32(1112219661);
+emit_32(1109972484);
+emit_32(1110171661);
+emit_32(1113243648);
+emit_32(1109736686);
+emit_32(1110171661);
+emit_32(1114267661);
+emit_32(1109619612);
+emit_32(1110171661);
+emit_32(1115291648);
+emit_32(1109518608);
+emit_32(1110171661);
+emit_32(1116000263);
+emit_32(1109430003);
+emit_32(1110171661);
+emit_32(1116512256);
+emit_32(1109161909);
+emit_32(1110171661);
+emit_32(1117024263);
+emit_32(1109167492);
+emit_32(1110171661);
+emit_32(1117536256);
+emit_32(1109168515);
+emit_32(1110171661);
+emit_32(1118048263);
+emit_32(1109105626);
+emit_32(1110171661);
+emit_32(1118560256);
+emit_32(1108756686);
+emit_32(1110171661);
+emit_32(1119072263);
+emit_32(1108552555);
+emit_32(1110171661);
+emit_32(1119584256);
+emit_32(1108023286);
+emit_32(1110171661);
+emit_32(1120096263);
+emit_32(1107602178);
+emit_32(1110171661);
+emit_32(1120608322);
+emit_32(1107405649);
+emit_32(1110171661);
+emit_32(1121120289);
+emit_32(1107570616);
+emit_32(1110171661);
+emit_32(1121632256);
+emit_32(1107660164);
+emit_32(1110171661);
+emit_32(1122144223);
+emit_32(1107756004);
+emit_32(1110171661);
+emit_32(1122656322);
+emit_32(1107706800);
+emit_32(1110171661);
+emit_32(1123168289);
+emit_32(1107795667);
+emit_32(1110171661);
+emit_32(1123680256);
+emit_32(1108061218);
+emit_32(1110171661);
+emit_32(1124132848);
+emit_32(1108159365);
+emit_32(1110171661);
+emit_32(1124388897);
+emit_32(1108652615);
+emit_32(1110171661);
+emit_32(1124644880);
+emit_32(1108895151);
+emit_32(1110171661);
+emit_32(1124900864);
+emit_32(1109068900);
+emit_32(1110171661);
+emit_32(1125156848);
+emit_32(1109317911);
+emit_32(1110171661);
+emit_32(1125412897);
+emit_32(1109583646);
+emit_32(1110171661);
+emit_32(1125668880);
+emit_32(1109982314);
+emit_32(1110171661);
+emit_32(1125924864);
+emit_32(1110319589);
+emit_32(1110171661);
+emit_32(1126180848);
+emit_32(1110618800);
+emit_32(1110171635);
+emit_32(1126436897);
+emit_32(1110589833);
+emit_32(1110171661);
+emit_32(1126692880);
+emit_32(1110601236);
+emit_32(1110171661);
+emit_32(1126948864);
+emit_32(1110238219);
+emit_32(1110171661);
+emit_32(1127204848);
+emit_32(1110066804);
+emit_32(1110171661);
+emit_32(1127460897);
+emit_32(1109910933);
+emit_32(1110171661);
+emit_32(1127716880);
+emit_32(1109484739);
+emit_32(1110171661);
+emit_32(1127972864);
+emit_32(1109107907);
+emit_32(1110171661);
+emit_32(1128228848);
+emit_32(1108797633);
+emit_32(1110171661);
+emit_32(1128484897);
+emit_32(1108483428);
+emit_32(1110171661);
+emit_32(1128740880);
+emit_32(1108328081);
+emit_32(1110171661);
+emit_32(1128996864);
+emit_32(1108125627);
+emit_32(1110171661);
+emit_32(1129252848);
+emit_32(1107731808);
+emit_32(1110171661);
+emit_32(1129508897);
+emit_32(1106917982);
+emit_32(1110171661);
+emit_32(1129764880);
+emit_32(1106313688);
+emit_32(1110171661);
+emit_32(1130020864);
+emit_32(1105521174);
+emit_32(1110171661);
+emit_32(1130276848);
+emit_32(1104211450);
+emit_32(1110171661);
+emit_32(1130532897);
+emit_32(1103253052);
+emit_32(1110171661);
+emit_32(1130788880);
+emit_32(1102325744);
+emit_32(1110171661);
+emit_32(1131044864);
+emit_32(1101081451);
+emit_32(1110171661);
+emit_32(1131300848);
+emit_32(1099684171);
+emit_32(1110171661);
+emit_32(1131556897);
+emit_32(1098145962);
+emit_32(1110171661);
+emit_32(1131812880);
+emit_32(1096588198);
+emit_32(1110171661);
+emit_32(1132068864);
+emit_32(1095942590);
+emit_32(1110171661);
+emit_32(1081737216);
+emit_32(1108060956);
+emit_32(1109147648);
+emit_32(1090125824);
+emit_32(1108546971);
+emit_32(1109147648);
+emit_32(1094418484);
+emit_32(1109017939);
+emit_32(1109147648);
+emit_32(1098514432);
+emit_32(1109407144);
+emit_32(1109147648);
+emit_32(1100759066);
+emit_32(1109980401);
+emit_32(1109147648);
+emit_32(1102807040);
+emit_32(1110240972);
+emit_32(1109147648);
+emit_32(1104855066);
+emit_32(1110658358);
+emit_32(1109147648);
+emit_32(1106903040);
+emit_32(1110751524);
+emit_32(1109147648);
+emit_32(1108123661);
+emit_32(1110695844);
+emit_32(1109147648);
+emit_32(1109147648);
+emit_32(1110721089);
+emit_32(1109147648);
+emit_32(1110171661);
+emit_32(1110727406);
+emit_32(1109147648);
+emit_32(1111195648);
+emit_32(1110842173);
+emit_32(1109147648);
+emit_32(1112219661);
+emit_32(1110770765);
+emit_32(1109147648);
+emit_32(1113243648);
+emit_32(1110489091);
+emit_32(1109147648);
+emit_32(1114267661);
+emit_32(1110249518);
+emit_32(1109147648);
+emit_32(1115291648);
+emit_32(1110116087);
+emit_32(1109147648);
+emit_32(1116000263);
+emit_32(1110026722);
+emit_32(1109147648);
+emit_32(1116512256);
+emit_32(1109757343);
+emit_32(1109147648);
+emit_32(1117024263);
+emit_32(1109707325);
+emit_32(1109147648);
+emit_32(1117536256);
+emit_32(1109736109);
+emit_32(1109147648);
+emit_32(1118048263);
+emit_32(1109670940);
+emit_32(1109147648);
+emit_32(1118560256);
+emit_32(1109409425);
+emit_32(1109147648);
+emit_32(1119072263);
+emit_32(1109060459);
+emit_32(1109147648);
+emit_32(1119584256);
+emit_32(1108683601);
+emit_32(1109147648);
+emit_32(1120096263);
+emit_32(1108291643);
+emit_32(1109147648);
+emit_32(1120608322);
+emit_32(1108134645);
+emit_32(1109147648);
+emit_32(1121120289);
+emit_32(1107726382);
+emit_32(1109147648);
+emit_32(1121632256);
+emit_32(1107627056);
+emit_32(1109147648);
+emit_32(1122144223);
+emit_32(1107778260);
+emit_32(1109147648);
+emit_32(1122656322);
+emit_32(1108018568);
+emit_32(1109147648);
+emit_32(1123168289);
+emit_32(1107783031);
+emit_32(1109147648);
+emit_32(1123680256);
+emit_32(1108023470);
+emit_32(1109147648);
+emit_32(1124132848);
+emit_32(1108274551);
+emit_32(1109147648);
+emit_32(1124388897);
+emit_32(1108502721);
+emit_32(1109147648);
+emit_32(1124644880);
+emit_32(1108792679);
+emit_32(1109147648);
+emit_32(1124900864);
+emit_32(1108934997);
+emit_32(1109147648);
+emit_32(1125156848);
+emit_32(1109183483);
+emit_32(1109147648);
+emit_32(1125412897);
+emit_32(1109454645);
+emit_32(1109147648);
+emit_32(1125668880);
+emit_32(1109678699);
+emit_32(1109147648);
+emit_32(1125924864);
+emit_32(1110022658);
+emit_32(1109147648);
+emit_32(1126180848);
+emit_32(1110147151);
+emit_32(1109147648);
+emit_32(1126436897);
+emit_32(1110222596);
+emit_32(1109147648);
+emit_32(1126692880);
+emit_32(1110347035);
+emit_32(1109147648);
+emit_32(1126948864);
+emit_32(1110235231);
+emit_32(1109147648);
+emit_32(1127204848);
+emit_32(1110061194);
+emit_32(1109147648);
+emit_32(1127460897);
+emit_32(1109745022);
+emit_32(1109147648);
+emit_32(1127716880);
+emit_32(1109246162);
+emit_32(1109147648);
+emit_32(1127972864);
+emit_32(1109124003);
+emit_32(1109147648);
+emit_32(1128228848);
+emit_32(1108700011);
+emit_32(1109147648);
+emit_32(1128484897);
+emit_32(1108308525);
+emit_32(1109147648);
+emit_32(1128740880);
+emit_32(1108062844);
+emit_32(1109147648);
+emit_32(1128996864);
+emit_32(1107977306);
+emit_32(1109147648);
+emit_32(1129252848);
+emit_32(1107731205);
+emit_32(1109147648);
+emit_32(1129508897);
+emit_32(1107357781);
+emit_32(1109147648);
+emit_32(1129764880);
+emit_32(1106463529);
+emit_32(1109147648);
+emit_32(1130020864);
+emit_32(1105450081);
+emit_32(1109147648);
+emit_32(1130276848);
+emit_32(1104493307);
+emit_32(1109147648);
+emit_32(1130532897);
+emit_32(1103358434);
+emit_32(1109147648);
+emit_32(1130788880);
+emit_32(1102558632);
+emit_32(1109147648);
+emit_32(1131044864);
+emit_32(1101338404);
+emit_32(1109147648);
+emit_32(1131300848);
+emit_32(1100196558);
+emit_32(1109147648);
+emit_32(1131556897);
+emit_32(1099061264);
+emit_32(1109147648);
+emit_32(1131812880);
+emit_32(1096545521);
+emit_32(1109147648);
+emit_32(1132068864);
+emit_32(1096018716);
+emit_32(1109147648);
+emit_32(1081737216);
+emit_32(1109011386);
+emit_32(1108123661);
+emit_32(1090125824);
+emit_32(1109203904);
+emit_32(1108123661);
+emit_32(1094418484);
+emit_32(1109519263);
+emit_32(1108123661);
+emit_32(1098514432);
+emit_32(1109988842);
+emit_32(1108123661);
+emit_32(1100759066);
+emit_32(1110461461);
+emit_32(1108123635);
+emit_32(1102807040);
+emit_32(1110941919);
+emit_32(1108123635);
+emit_32(1104855066);
+emit_32(1111344415);
+emit_32(1108123661);
+emit_32(1106903040);
+emit_32(1111428956);
+emit_32(1108123661);
+emit_32(1108123661);
+emit_32(1111187862);
+emit_32(1108123635);
+emit_32(1109147648);
+emit_32(1111258851);
+emit_32(1108123635);
+emit_32(1110171661);
+emit_32(1111121199);
+emit_32(1108123661);
+emit_32(1111195648);
+emit_32(1111334951);
+emit_32(1108123661);
+emit_32(1112219661);
+emit_32(1111280871);
+emit_32(1108123635);
+emit_32(1113243648);
+emit_32(1111290597);
+emit_32(1108123635);
+emit_32(1114267661);
+emit_32(1111219660);
+emit_32(1108123661);
+emit_32(1115291648);
+emit_32(1110791212);
+emit_32(1108123661);
+emit_32(1116000263);
+emit_32(1110556043);
+emit_32(1108123635);
+emit_32(1116512256);
+emit_32(1110407643);
+emit_32(1108123635);
+emit_32(1117024263);
+emit_32(1110379174);
+emit_32(1108123661);
+emit_32(1117536256);
+emit_32(1110347979);
+emit_32(1108123661);
+emit_32(1118048263);
+emit_32(1110338280);
+emit_32(1108123661);
+emit_32(1118560256);
+emit_32(1109911536);
+emit_32(1108123661);
+emit_32(1119072263);
+emit_32(1109549908);
+emit_32(1108123661);
+emit_32(1119584256);
+emit_32(1109081142);
+emit_32(1108123661);
+emit_32(1120096263);
+emit_32(1108718492);
+emit_32(1108123661);
+emit_32(1120608322);
+emit_32(1108472470);
+emit_32(1108123661);
+emit_32(1121120289);
+emit_32(1108029604);
+emit_32(1108123661);
+emit_32(1121632256);
+emit_32(1107454879);
+emit_32(1108123661);
+emit_32(1122144223);
+emit_32(1107399252);
+emit_32(1108123661);
+emit_32(1122656322);
+emit_32(1107660793);
+emit_32(1108123661);
+emit_32(1123168289);
+emit_32(1107749241);
+emit_32(1108123661);
+emit_32(1123680256);
+emit_32(1107770448);
+emit_32(1108123661);
+emit_32(1124132848);
+emit_32(1108146730);
+emit_32(1108123661);
+emit_32(1124388897);
+emit_32(1108341608);
+emit_32(1108123661);
+emit_32(1124644880);
+emit_32(1108443057);
+emit_32(1108123661);
+emit_32(1124900864);
+emit_32(1108765442);
+emit_32(1108123661);
+emit_32(1125156848);
+emit_32(1108966061);
+emit_32(1108123661);
+emit_32(1125412897);
+emit_32(1109234287);
+emit_32(1108123661);
+emit_32(1125668880);
+emit_32(1109396423);
+emit_32(1108123661);
+emit_32(1125924864);
+emit_32(1109622050);
+emit_32(1108123661);
+emit_32(1126180848);
+emit_32(1109584826);
+emit_32(1108123661);
+emit_32(1126436897);
+emit_32(1109832945);
+emit_32(1108123661);
+emit_32(1126692880);
+emit_32(1109962759);
+emit_32(1108123661);
+emit_32(1126948864);
+emit_32(1109897773);
+emit_32(1108123661);
+emit_32(1127204848);
+emit_32(1109645800);
+emit_32(1108123661);
+emit_32(1127460897);
+emit_32(1109215386);
+emit_32(1108123661);
+emit_32(1127716880);
+emit_32(1108859027);
+emit_32(1108123661);
+emit_32(1127972864);
+emit_32(1108683050);
+emit_32(1108123661);
+emit_32(1128228848);
+emit_32(1108384704);
+emit_32(1108123661);
+emit_32(1128484897);
+emit_32(1108232031);
+emit_32(1108123661);
+emit_32(1128740880);
+emit_32(1108097027);
+emit_32(1108123661);
+emit_32(1128996864);
+emit_32(1107779178);
+emit_32(1108123661);
+emit_32(1129252848);
+emit_32(1107602938);
+emit_32(1108123661);
+emit_32(1129508897);
+emit_32(1107406278);
+emit_32(1108123661);
+emit_32(1129764880);
+emit_32(1106809874);
+emit_32(1108123661);
+emit_32(1130020864);
+emit_32(1105779438);
+emit_32(1108123661);
+emit_32(1130276848);
+emit_32(1104361030);
+emit_32(1108123661);
+emit_32(1130532897);
+emit_32(1102937430);
+emit_32(1108123661);
+emit_32(1130788880);
+emit_32(1102218107);
+emit_32(1108123661);
+emit_32(1131044864);
+emit_32(1101488456);
+emit_32(1108123661);
+emit_32(1131300848);
+emit_32(1100298741);
+emit_32(1108123661);
+emit_32(1131556897);
+emit_32(1099192756);
+emit_32(1108123661);
+emit_32(1131812880);
+emit_32(1097382704);
+emit_32(1108123661);
+emit_32(1132068864);
+emit_32(1096297952);
+emit_32(1108123661);
+emit_32(1081737216);
+emit_32(1109770397);
+emit_32(1106903040);
+emit_32(1090125824);
+emit_32(1109777737);
+emit_32(1106903040);
+emit_32(1094418484);
+emit_32(1110054299);
+emit_32(1106903040);
+emit_32(1098514432);
+emit_32(1110481751);
+emit_32(1106903040);
+emit_32(1100759066);
+emit_32(1110921734);
+emit_32(1106903040);
+emit_32(1102807040);
+emit_32(1111312643);
+emit_32(1106903040);
+emit_32(1104855066);
+emit_32(1111792130);
+emit_32(1106903040);
+emit_32(1106903040);
+emit_32(1111787124);
+emit_32(1106903040);
+emit_32(1108123661);
+emit_32(1111611697);
+emit_32(1106903040);
+emit_32(1109147648);
+emit_32(1111513262);
+emit_32(1106903040);
+emit_32(1110171661);
+emit_32(1111366278);
+emit_32(1106903040);
+emit_32(1111195648);
+emit_32(1111544090);
+emit_32(1106903040);
+emit_32(1112219661);
+emit_32(1111560762);
+emit_32(1106903040);
+emit_32(1113243648);
+emit_32(1111668713);
+emit_32(1106903040);
+emit_32(1114267661);
+emit_32(1111792235);
+emit_32(1106903040);
+emit_32(1115291648);
+emit_32(1111628474);
+emit_32(1106903040);
+emit_32(1116000263);
+emit_32(1111299169);
+emit_32(1106903040);
+emit_32(1116512256);
+emit_32(1111051180);
+emit_32(1106903040);
+emit_32(1117024263);
+emit_32(1110941447);
+emit_32(1106903040);
+emit_32(1117536256);
+emit_32(1110781408);
+emit_32(1106903040);
+emit_32(1118048263);
+emit_32(1110736162);
+emit_32(1106903040);
+emit_32(1118560256);
+emit_32(1110488462);
+emit_32(1106903040);
+emit_32(1119072263);
+emit_32(1109937383);
+emit_32(1106903040);
+emit_32(1119584256);
+emit_32(1109345724);
+emit_32(1106903040);
+emit_32(1120096263);
+emit_32(1108919032);
+emit_32(1106903040);
+emit_32(1120608322);
+emit_32(1108581522);
+emit_32(1106903040);
+emit_32(1121120289);
+emit_32(1108342132);
+emit_32(1106903040);
+emit_32(1121632256);
+emit_32(1107848908);
+emit_32(1106903040);
+emit_32(1122144223);
+emit_32(1107817451);
+emit_32(1106903040);
+emit_32(1122656322);
+emit_32(1107677518);
+emit_32(1106903040);
+emit_32(1123168289);
+emit_32(1107491160);
+emit_32(1106903040);
+emit_32(1123680256);
+emit_32(1107374427);
+emit_32(1106903040);
+emit_32(1124132848);
+emit_32(1107634238);
+emit_32(1106903040);
+emit_32(1124388897);
+emit_32(1107933318);
+emit_32(1106903040);
+emit_32(1124644880);
+emit_32(1108214022);
+emit_32(1106903040);
+emit_32(1124900864);
+emit_32(1108453936);
+emit_32(1106903040);
+emit_32(1125156848);
+emit_32(1108889960);
+emit_32(1106903040);
+emit_32(1125412897);
+emit_32(1108978801);
+emit_32(1106903040);
+emit_32(1125668880);
+emit_32(1108913553);
+emit_32(1106903040);
+emit_32(1125924864);
+emit_32(1109166234);
+emit_32(1106903040);
+emit_32(1126180848);
+emit_32(1109341451);
+emit_32(1106903040);
+emit_32(1126436897);
+emit_32(1109498502);
+emit_32(1106903040);
+emit_32(1126692880);
+emit_32(1109568048);
+emit_32(1106903040);
+emit_32(1126948864);
+emit_32(1109560892);
+emit_32(1106903040);
+emit_32(1127204848);
+emit_32(1109393539);
+emit_32(1106903040);
+emit_32(1127460897);
+emit_32(1108906790);
+emit_32(1106903040);
+emit_32(1127716880);
+emit_32(1108388794);
+emit_32(1106903040);
+emit_32(1127972864);
+emit_32(1108280685);
+emit_32(1106903040);
+emit_32(1128228848);
+emit_32(1108149246);
+emit_32(1106903040);
+emit_32(1128484897);
+emit_32(1107958379);
+emit_32(1106903040);
+emit_32(1128740880);
+emit_32(1107807725);
+emit_32(1106903040);
+emit_32(1128996864);
+emit_32(1107773594);
+emit_32(1106903040);
+emit_32(1129252848);
+emit_32(1107432414);
+emit_32(1106903040);
+emit_32(1129508897);
+emit_32(1107128327);
+emit_32(1106903040);
+emit_32(1129764880);
+emit_32(1106506678);
+emit_32(1106903040);
+emit_32(1130020864);
+emit_32(1105675629);
+emit_32(1106903040);
+emit_32(1130276848);
+emit_32(1104725148);
+emit_32(1106903040);
+emit_32(1130532897);
+emit_32(1102879234);
+emit_32(1106903040);
+emit_32(1130788880);
+emit_32(1102337697);
+emit_32(1106903040);
+emit_32(1131044864);
+emit_32(1101447194);
+emit_32(1106903040);
+emit_32(1131300848);
+emit_32(1100372404);
+emit_32(1106903040);
+emit_32(1131556897);
+emit_32(1099275803);
+emit_32(1106903040);
+emit_32(1131812880);
+emit_32(1097451700);
+emit_32(1106903040);
+emit_32(1132068864);
+emit_32(1095526829);
+emit_32(1106903040);
+emit_32(1081737216);
+emit_32(1110109952);
+emit_32(1104855014);
+emit_32(1090125824);
+emit_32(1110275732);
+emit_32(1104855066);
+emit_32(1094418484);
+emit_32(1110685778);
+emit_32(1104855014);
+emit_32(1098514432);
+emit_32(1111152735);
+emit_32(1104855066);
+emit_32(1100759066);
+emit_32(1111517587);
+emit_32(1104855014);
+emit_32(1102807040);
+emit_32(1111678596);
+emit_32(1104855066);
+emit_32(1104855066);
+emit_32(1111775642);
+emit_32(1104855014);
+emit_32(1106903040);
+emit_32(1112048193);
+emit_32(1104855066);
+emit_32(1108123661);
+emit_32(1111799470);
+emit_32(1104855014);
+emit_32(1109147648);
+emit_32(1112134622);
+emit_32(1104855066);
+emit_32(1110171661);
+emit_32(1111941867);
+emit_32(1104855014);
+emit_32(1111195648);
+emit_32(1111767463);
+emit_32(1104855066);
+emit_32(1112219661);
+emit_32(1111687011);
+emit_32(1104855014);
+emit_32(1113243648);
+emit_32(1111766309);
+emit_32(1104855066);
+emit_32(1114267661);
+emit_32(1111969340);
+emit_32(1104855014);
+emit_32(1115291648);
+emit_32(1111967505);
+emit_32(1104855066);
+emit_32(1116000263);
+emit_32(1111727355);
+emit_32(1104855014);
+emit_32(1116512256);
+emit_32(1111359540);
+emit_32(1104855066);
+emit_32(1117024263);
+emit_32(1111157847);
+emit_32(1104855014);
+emit_32(1117536256);
+emit_32(1110917304);
+emit_32(1104855066);
+emit_32(1118048263);
+emit_32(1110816929);
+emit_32(1104855014);
+emit_32(1118560256);
+emit_32(1110568783);
+emit_32(1104855066);
+emit_32(1119072263);
+emit_32(1110093490);
+emit_32(1104855014);
+emit_32(1119584256);
+emit_32(1109527311);
+emit_32(1104855066);
+emit_32(1120096263);
+emit_32(1108993586);
+emit_32(1104855014);
+emit_32(1120608322);
+emit_32(1108933555);
+emit_32(1104855066);
+emit_32(1121120289);
+emit_32(1108821698);
+emit_32(1104855014);
+emit_32(1121632256);
+emit_32(1108751234);
+emit_32(1104855066);
+emit_32(1122144223);
+emit_32(1108472837);
+emit_32(1104855014);
+emit_32(1122656322);
+emit_32(1108266844);
+emit_32(1104855066);
+emit_32(1123168289);
+emit_32(1107914103);
+emit_32(1104855014);
+emit_32(1123680256);
+emit_32(1107834175);
+emit_32(1104855066);
+emit_32(1124132848);
+emit_32(1107903539);
+emit_32(1104855014);
+emit_32(1124388897);
+emit_32(1107817215);
+emit_32(1104855066);
+emit_32(1124644880);
+emit_32(1107776661);
+emit_32(1104855014);
+emit_32(1124900864);
+emit_32(1108217378);
+emit_32(1104855066);
+emit_32(1125156848);
+emit_32(1108340821);
+emit_32(1104855014);
+emit_32(1125412897);
+emit_32(1108427643);
+emit_32(1104855066);
+emit_32(1125668880);
+emit_32(1108896016);
+emit_32(1104855014);
+emit_32(1125924864);
+emit_32(1109136271);
+emit_32(1104855066);
+emit_32(1126180848);
+emit_32(1109149745);
+emit_32(1104855014);
+emit_32(1126436897);
+emit_32(1109121932);
+emit_32(1104855066);
+emit_32(1126692880);
+emit_32(1108894600);
+emit_32(1104855014);
+emit_32(1126948864);
+emit_32(1108941734);
+emit_32(1104855066);
+emit_32(1127204848);
+emit_32(1108756031);
+emit_32(1104855014);
+emit_32(1127460897);
+emit_32(1108342132);
+emit_32(1104855066);
+emit_32(1127716880);
+emit_32(1107861281);
+emit_32(1104855014);
+emit_32(1127972864);
+emit_32(1107811264);
+emit_32(1104855066);
+emit_32(1128228848);
+emit_32(1107808905);
+emit_32(1104855014);
+emit_32(1128484897);
+emit_32(1107751705);
+emit_32(1104855066);
+emit_32(1128740880);
+emit_32(1107656337);
+emit_32(1104855014);
+emit_32(1128996864);
+emit_32(1107347820);
+emit_32(1104855066);
+emit_32(1129252848);
+emit_32(1107352119);
+emit_32(1104855014);
+emit_32(1129508897);
+emit_32(1106497084);
+emit_32(1104855066);
+emit_32(1129764880);
+emit_32(1105749344);
+emit_32(1104855014);
+emit_32(1130020864);
+emit_32(1104957407);
+emit_32(1104855066);
+emit_32(1130276848);
+emit_32(1104016048);
+emit_32(1104855014);
+emit_32(1130532897);
+emit_32(1102858578);
+emit_32(1104855066);
+emit_32(1130788880);
+emit_32(1102331511);
+emit_32(1104855014);
+emit_32(1131044864);
+emit_32(1101186518);
+emit_32(1104855066);
+emit_32(1131300848);
+emit_32(1100268490);
+emit_32(1104855066);
+emit_32(1131556897);
+emit_32(1099251266);
+emit_32(1104855066);
+emit_32(1131812880);
+emit_32(1097610874);
+emit_32(1104855066);
+emit_32(1132068864);
+emit_32(1095739900);
+emit_32(1104855066);
+emit_32(1081737216);
+emit_32(1110619796);
+emit_32(1102807040);
+emit_32(1090125824);
+emit_32(1110999800);
+emit_32(1102807040);
+emit_32(1094418484);
+emit_32(1111488489);
+emit_32(1102807040);
+emit_32(1098514432);
+emit_32(1111646011);
+emit_32(1102807040);
+emit_32(1100759066);
+emit_32(1111969235);
+emit_32(1102807040);
+emit_32(1102807040);
+emit_32(1112017758);
+emit_32(1102807040);
+emit_32(1104855066);
+emit_32(1111955341);
+emit_32(1102807040);
+emit_32(1106903040);
+emit_32(1112183747);
+emit_32(1102807040);
+emit_32(1108123661);
+emit_32(1112078287);
+emit_32(1102807040);
+emit_32(1109147648);
+emit_32(1112415640);
+emit_32(1102807040);
+emit_32(1110171661);
+emit_32(1112379359);
+emit_32(1102807040);
+emit_32(1111195648);
+emit_32(1112160154);
+emit_32(1102807040);
+emit_32(1112219661);
+emit_32(1112004362);
+emit_32(1102807040);
+emit_32(1113243648);
+emit_32(1112284594);
+emit_32(1102807040);
+emit_32(1114267661);
+emit_32(1112145815);
+emit_32(1102807040);
+emit_32(1115291648);
+emit_32(1112028165);
+emit_32(1102807040);
+emit_32(1116000263);
+emit_32(1111869699);
+emit_32(1102807040);
+emit_32(1116512256);
+emit_32(1111690130);
+emit_32(1102807040);
+emit_32(1117024263);
+emit_32(1111495488);
+emit_32(1102807040);
+emit_32(1117536256);
+emit_32(1111516565);
+emit_32(1102807040);
+emit_32(1118048263);
+emit_32(1111279455);
+emit_32(1102807040);
+emit_32(1118560256);
+emit_32(1110753647);
+emit_32(1102807040);
+emit_32(1119072263);
+emit_32(1110422245);
+emit_32(1102807040);
+emit_32(1119584256);
+emit_32(1109864350);
+emit_32(1102807040);
+emit_32(1120096263);
+emit_32(1109488566);
+emit_32(1102807040);
+emit_32(1120608322);
+emit_32(1109477320);
+emit_32(1102807040);
+emit_32(1121120289);
+emit_32(1109194755);
+emit_32(1102807040);
+emit_32(1121632256);
+emit_32(1109034743);
+emit_32(1102807040);
+emit_32(1122144223);
+emit_32(1108849800);
+emit_32(1102807040);
+emit_32(1122656322);
+emit_32(1108636598);
+emit_32(1102807040);
+emit_32(1123168289);
+emit_32(1108210719);
+emit_32(1102807040);
+emit_32(1123680256);
+emit_32(1108302496);
+emit_32(1102807040);
+emit_32(1124132848);
+emit_32(1108212213);
+emit_32(1102807040);
+emit_32(1124388897);
+emit_32(1107870640);
+emit_32(1102807040);
+emit_32(1124644880);
+emit_32(1107736422);
+emit_32(1102807040);
+emit_32(1124900864);
+emit_32(1107676522);
+emit_32(1102807040);
+emit_32(1125156848);
+emit_32(1108209094);
+emit_32(1102807040);
+emit_32(1125412897);
+emit_32(1108349734);
+emit_32(1102807040);
+emit_32(1125668880);
+emit_32(1108929675);
+emit_32(1102807040);
+emit_32(1125924864);
+emit_32(1109162643);
+emit_32(1102807040);
+emit_32(1126180848);
+emit_32(1109107540);
+emit_32(1102807040);
+emit_32(1126436897);
+emit_32(1108914654);
+emit_32(1102807040);
+emit_32(1126692880);
+emit_32(1108541388);
+emit_32(1102807040);
+emit_32(1126948864);
+emit_32(1108505081);
+emit_32(1102807040);
+emit_32(1127204848);
+emit_32(1108237222);
+emit_32(1102807040);
+emit_32(1127460897);
+emit_32(1108014924);
+emit_32(1102807040);
+emit_32(1127716880);
+emit_32(1107468589);
+emit_32(1102807040);
+emit_32(1127972864);
+emit_32(1107449269);
+emit_32(1102807040);
+emit_32(1128228848);
+emit_32(1107434458);
+emit_32(1102807040);
+emit_32(1128484897);
+emit_32(1107390916);
+emit_32(1102807040);
+emit_32(1128740880);
+emit_32(1107022787);
+emit_32(1102807040);
+emit_32(1128996864);
+emit_32(1106671200);
+emit_32(1102807040);
+emit_32(1129252848);
+emit_32(1106222724);
+emit_32(1102807040);
+emit_32(1129508897);
+emit_32(1106247575);
+emit_32(1102807040);
+emit_32(1129764880);
+emit_32(1105452230);
+emit_32(1102807040);
+emit_32(1130020864);
+emit_32(1104502273);
+emit_32(1102807040);
+emit_32(1130276848);
+emit_32(1103619634);
+emit_32(1102807040);
+emit_32(1130532897);
+emit_32(1102588831);
+emit_32(1102807040);
+emit_32(1130788880);
+emit_32(1101717150);
+emit_32(1102807040);
+emit_32(1131044864);
+emit_32(1100508142);
+emit_32(1102807040);
+emit_32(1131300848);
+emit_32(1100011589);
+emit_32(1102807040);
+emit_32(1131556897);
+emit_32(1099322674);
+emit_32(1102807040);
+emit_32(1131812880);
+emit_32(1097813040);
+emit_32(1102807040);
+emit_32(1132068864);
+emit_32(1095768526);
+emit_32(1102807040);
+emit_32(1081737216);
+emit_32(1111203643);
+emit_32(1100759014);
+emit_32(1090125824);
+emit_32(1111589362);
+emit_32(1100759014);
+emit_32(1094418484);
+emit_32(1112030917);
+emit_32(1100759014);
+emit_32(1098514432);
+emit_32(1112275996);
+emit_32(1100759014);
+emit_32(1100759066);
+emit_32(1112319197);
+emit_32(1100759014);
+emit_32(1102807040);
+emit_32(1112479393);
+emit_32(1100759014);
+emit_32(1104855066);
+emit_32(1112429638);
+emit_32(1100759014);
+emit_32(1106903040);
+emit_32(1112415247);
+emit_32(1100759014);
+emit_32(1108123661);
+emit_32(1112431998);
+emit_32(1100759014);
+emit_32(1109147648);
+emit_32(1112654453);
+emit_32(1100759014);
+emit_32(1110171661);
+emit_32(1112696396);
+emit_32(1100759014);
+emit_32(1111195648);
+emit_32(1112521022);
+emit_32(1100759014);
+emit_32(1112219661);
+emit_32(1112435904);
+emit_32(1100759014);
+emit_32(1113243648);
+emit_32(1112240292);
+emit_32(1100759014);
+emit_32(1114267661);
+emit_32(1112316209);
+emit_32(1100759014);
+emit_32(1115291648);
+emit_32(1112066150);
+emit_32(1100759014);
+emit_32(1116000263);
+emit_32(1111963651);
+emit_32(1100759014);
+emit_32(1116512256);
+emit_32(1111800886);
+emit_32(1100759014);
+emit_32(1117024263);
+emit_32(1111681296);
+emit_32(1100759014);
+emit_32(1117536256);
+emit_32(1111620767);
+emit_32(1100759014);
+emit_32(1118048263);
+emit_32(1111346774);
+emit_32(1100759014);
+emit_32(1118560256);
+emit_32(1111034272);
+emit_32(1100759014);
+emit_32(1119072263);
+emit_32(1110619088);
+emit_32(1100759014);
+emit_32(1119584256);
+emit_32(1110189723);
+emit_32(1100759014);
+emit_32(1120096263);
+emit_32(1109747512);
+emit_32(1100759014);
+emit_32(1120608322);
+emit_32(1109609965);
+emit_32(1100759014);
+emit_32(1121120289);
+emit_32(1109538216);
+emit_32(1100759014);
+emit_32(1121632256);
+emit_32(1109322341);
+emit_32(1100759014);
+emit_32(1122144223);
+emit_32(1109116505);
+emit_32(1100759014);
+emit_32(1122656322);
+emit_32(1108968237);
+emit_32(1100759014);
+emit_32(1123168289);
+emit_32(1108596962);
+emit_32(1100759014);
+emit_32(1123680256);
+emit_32(1108337885);
+emit_32(1100759014);
+emit_32(1124132848);
+emit_32(1108184583);
+emit_32(1100759014);
+emit_32(1124388897);
+emit_32(1107955103);
+emit_32(1100759014);
+emit_32(1124644880);
+emit_32(1108010677);
+emit_32(1100759014);
+emit_32(1124900864);
+emit_32(1107800306);
+emit_32(1100759014);
+emit_32(1125156848);
+emit_32(1107894626);
+emit_32(1100759014);
+emit_32(1125412897);
+emit_32(1108230616);
+emit_32(1100759014);
+emit_32(1125668880);
+emit_32(1108803374);
+emit_32(1100759014);
+emit_32(1125924864);
+emit_32(1109075454);
+emit_32(1100759014);
+emit_32(1126180848);
+emit_32(1109027350);
+emit_32(1100759014);
+emit_32(1126436897);
+emit_32(1108939951);
+emit_32(1100759014);
+emit_32(1126692880);
+emit_32(1108326744);
+emit_32(1100759014);
+emit_32(1126948864);
+emit_32(1108036865);
+emit_32(1100759014);
+emit_32(1127204848);
+emit_32(1107817923);
+emit_32(1100759014);
+emit_32(1127460897);
+emit_32(1107732464);
+emit_32(1100759014);
+emit_32(1127716880);
+emit_32(1107137554);
+emit_32(1100759014);
+emit_32(1127972864);
+emit_32(1106958562);
+emit_32(1100759014);
+emit_32(1128228848);
+emit_32(1106960135);
+emit_32(1100759014);
+emit_32(1128484897);
+emit_32(1106646873);
+emit_32(1100759014);
+emit_32(1128740880);
+emit_32(1105859497);
+emit_32(1100759014);
+emit_32(1128996864);
+emit_32(1105603382);
+emit_32(1100759014);
+emit_32(1129252848);
+emit_32(1105170530);
+emit_32(1100759014);
+emit_32(1129508897);
+emit_32(1105374164);
+emit_32(1100759014);
+emit_32(1129764880);
+emit_32(1105401636);
+emit_32(1100759014);
+emit_32(1130020864);
+emit_32(1104911427);
+emit_32(1100759014);
+emit_32(1130276848);
+emit_32(1103660424);
+emit_32(1100759014);
+emit_32(1130532897);
+emit_32(1102697778);
+emit_32(1100759014);
+emit_32(1130788880);
+emit_32(1101449239);
+emit_32(1100759066);
+emit_32(1131044864);
+emit_32(1100702810);
+emit_32(1100759066);
+emit_32(1131300848);
+emit_32(1099801611);
+emit_32(1100759066);
+emit_32(1131556897);
+emit_32(1099221015);
+emit_32(1100759066);
+emit_32(1131812880);
+emit_32(1097633733);
+emit_32(1100759066);
+emit_32(1132068864);
+emit_32(1095588276);
+emit_32(1100759066);
+emit_32(1081737216);
+emit_32(1111812866);
+emit_32(1098514432);
+emit_32(1090125824);
+emit_32(1112034614);
+emit_32(1098514432);
+emit_32(1094418484);
+emit_32(1112430949);
+emit_32(1098514432);
+emit_32(1098514432);
+emit_32(1112552899);
+emit_32(1098514432);
+emit_32(1100759066);
+emit_32(1112388901);
+emit_32(1098514432);
+emit_32(1102807040);
+emit_32(1112497324);
+emit_32(1098514432);
+emit_32(1104855066);
+emit_32(1112626351);
+emit_32(1098514432);
+emit_32(1106903040);
+emit_32(1112804164);
+emit_32(1098514432);
+emit_32(1108123661);
+emit_32(1112732048);
+emit_32(1098514432);
+emit_32(1109147648);
+emit_32(1112876043);
+emit_32(1098514432);
+emit_32(1110171661);
+emit_32(1112974741);
+emit_32(1098514432);
+emit_32(1111195648);
+emit_32(1112667141);
+emit_32(1098514432);
+emit_32(1112219661);
+emit_32(1112522411);
+emit_32(1098514432);
+emit_32(1113243648);
+emit_32(1112234315);
+emit_32(1098514432);
+emit_32(1114267661);
+emit_32(1112061562);
+emit_32(1098514432);
+emit_32(1115291648);
+emit_32(1111763216);
+emit_32(1098514432);
+emit_32(1116000263);
+emit_32(1111779207);
+emit_32(1098514432);
+emit_32(1116512256);
+emit_32(1111697732);
+emit_32(1098514432);
+emit_32(1117024263);
+emit_32(1111651097);
+emit_32(1098514432);
+emit_32(1117536256);
+emit_32(1111523564);
+emit_32(1098514432);
+emit_32(1118048263);
+emit_32(1111418916);
+emit_32(1098514432);
+emit_32(1118560256);
+emit_32(1111207811);
+emit_32(1098514432);
+emit_32(1119072263);
+emit_32(1110728743);
+emit_32(1098514432);
+emit_32(1119584256);
+emit_32(1110351885);
+emit_32(1098514432);
+emit_32(1120096263);
+emit_32(1110067354);
+emit_32(1098514432);
+emit_32(1120608322);
+emit_32(1109906476);
+emit_32(1098514432);
+emit_32(1121120289);
+emit_32(1109648474);
+emit_32(1098514432);
+emit_32(1121632256);
+emit_32(1109594787);
+emit_32(1098514432);
+emit_32(1122144223);
+emit_32(1109226711);
+emit_32(1098514432);
+emit_32(1122656322);
+emit_32(1109203825);
+emit_32(1098514432);
+emit_32(1123168289);
+emit_32(1108763659);
+emit_32(1098514432);
+emit_32(1123680256);
+emit_32(1108360770);
+emit_32(1098514432);
+emit_32(1124132848);
+emit_32(1108356628);
+emit_32(1098514432);
+emit_32(1124388897);
+emit_32(1108118838);
+emit_32(1098514432);
+emit_32(1124644880);
+emit_32(1108079411);
+emit_32(1098514432);
+emit_32(1124900864);
+emit_32(1107833179);
+emit_32(1098514432);
+emit_32(1125156848);
+emit_32(1107770841);
+emit_32(1098514432);
+emit_32(1125412897);
+emit_32(1108082531);
+emit_32(1098514432);
+emit_32(1125668880);
+emit_32(1108414667);
+emit_32(1098514432);
+emit_32(1125924864);
+emit_32(1108808670);
+emit_32(1098514432);
+emit_32(1126180848);
+emit_32(1108779572);
+emit_32(1098514432);
+emit_32(1126436897);
+emit_32(1108586686);
+emit_32(1098514432);
+emit_32(1126692880);
+emit_32(1108017650);
+emit_32(1098514432);
+emit_32(1126948864);
+emit_32(1107632508);
+emit_32(1098514432);
+emit_32(1127204848);
+emit_32(1107530849);
+emit_32(1098514432);
+emit_32(1127460897);
+emit_32(1107331357);
+emit_32(1098514432);
+emit_32(1127716880);
+emit_32(1106461065);
+emit_32(1098514432);
+emit_32(1127972864);
+emit_32(1105721295);
+emit_32(1098514432);
+emit_32(1128228848);
+emit_32(1105899395);
+emit_32(1098514432);
+emit_32(1128484897);
+emit_32(1105780959);
+emit_32(1098514432);
+emit_32(1128740880);
+emit_32(1105112806);
+emit_32(1098514432);
+emit_32(1128996864);
+emit_32(1104398988);
+emit_32(1098514432);
+emit_32(1129252848);
+emit_32(1104246420);
+emit_32(1098514432);
+emit_32(1129508897);
+emit_32(1104877715);
+emit_32(1098514432);
+emit_32(1129764880);
+emit_32(1104934024);
+emit_32(1098514432);
+emit_32(1130020864);
+emit_32(1104407062);
+emit_32(1098514432);
+emit_32(1130276848);
+emit_32(1103509009);
+emit_32(1098514432);
+emit_32(1130532897);
+emit_32(1102561359);
+emit_32(1098514432);
+emit_32(1130788880);
+emit_32(1101226941);
+emit_32(1098514432);
+emit_32(1131044864);
+emit_32(1100378223);
+emit_32(1098514432);
+emit_32(1131300848);
+emit_32(1099670330);
+emit_32(1098514432);
+emit_32(1131556897);
+emit_32(1099052247);
+emit_32(1098514432);
+emit_32(1131812880);
+emit_32(1097040344);
+emit_32(1098514432);
+emit_32(1132068864);
+emit_32(1094514429);
+emit_32(1098514432);
+emit_32(1081737216);
+emit_32(1112309314);
+emit_32(1094418380);
+emit_32(1090125824);
+emit_32(1112490036);
+emit_32(1094418380);
+emit_32(1094418484);
+emit_32(1112564590);
+emit_32(1094418380);
+emit_32(1098514432);
+emit_32(1112495017);
+emit_32(1094418380);
+emit_32(1100759066);
+emit_32(1112570934);
+emit_32(1094418380);
+emit_32(1102807040);
+emit_32(1112483797);
+emit_32(1094418380);
+emit_32(1104855066);
+emit_32(1112593269);
+emit_32(1094418380);
+emit_32(1106903040);
+emit_32(1112653955);
+emit_32(1094418380);
+emit_32(1108123661);
+emit_32(1112696973);
+emit_32(1094418380);
+emit_32(1109147648);
+emit_32(1112876358);
+emit_32(1094418380);
+emit_32(1110171661);
+emit_32(1112771972);
+emit_32(1094418380);
+emit_32(1111195648);
+emit_32(1112696658);
+emit_32(1094418380);
+emit_32(1112219661);
+emit_32(1112760438);
+emit_32(1094418380);
+emit_32(1113243648);
+emit_32(1112709844);
+emit_32(1094418380);
+emit_32(1114267661);
+emit_32(1112445708);
+emit_32(1094418380);
+emit_32(1115291648);
+emit_32(1112126810);
+emit_32(1094418380);
+emit_32(1116000263);
+emit_32(1111838268);
+emit_32(1094418380);
+emit_32(1116512256);
+emit_32(1111661530);
+emit_32(1094418380);
+emit_32(1117024263);
+emit_32(1111906163);
+emit_32(1094418380);
+emit_32(1117536256);
+emit_32(1112106389);
+emit_32(1094418380);
+emit_32(1118048263);
+emit_32(1111761879);
+emit_32(1094418380);
+emit_32(1118560256);
+emit_32(1111398128);
+emit_32(1094418380);
+emit_32(1119072263);
+emit_32(1110978645);
+emit_32(1094418380);
+emit_32(1119584256);
+emit_32(1110634319);
+emit_32(1094418380);
+emit_32(1120096263);
+emit_32(1110529776);
+emit_32(1094418380);
+emit_32(1120608322);
+emit_32(1110304358);
+emit_32(1094418380);
+emit_32(1121120289);
+emit_32(1110165710);
+emit_32(1094418380);
+emit_32(1121632256);
+emit_32(1109858216);
+emit_32(1094418380);
+emit_32(1122144223);
+emit_32(1109581365);
+emit_32(1094418380);
+emit_32(1122656322);
+emit_32(1109235859);
+emit_32(1094418380);
+emit_32(1123168289);
+emit_32(1108903907);
+emit_32(1094418380);
+emit_32(1123680256);
+emit_32(1108430973);
+emit_32(1094418380);
+emit_32(1124132848);
+emit_32(1108410683);
+emit_32(1094418380);
+emit_32(1124388897);
+emit_32(1108135038);
+emit_32(1094418380);
+emit_32(1124644880);
+emit_32(1107804973);
+emit_32(1094418380);
+emit_32(1124900864);
+emit_32(1107639901);
+emit_32(1094418380);
+emit_32(1125156848);
+emit_32(1107772126);
+emit_32(1094418380);
+emit_32(1125412897);
+emit_32(1107737261);
+emit_32(1094418380);
+emit_32(1125668880);
+emit_32(1108006063);
+emit_32(1094418380);
+emit_32(1125924864);
+emit_32(1108199919);
+emit_32(1094418380);
+emit_32(1126180848);
+emit_32(1108248678);
+emit_32(1094418380);
+emit_32(1126436897);
+emit_32(1107916253);
+emit_32(1094418380);
+emit_32(1126692880);
+emit_32(1107555149);
+emit_32(1094418380);
+emit_32(1126948864);
+emit_32(1107371177);
+emit_32(1094418380);
+emit_32(1127204848);
+emit_32(1107332275);
+emit_32(1094418380);
+emit_32(1127460897);
+emit_32(1106749686);
+emit_32(1094418380);
+emit_32(1127716880);
+emit_32(1105781640);
+emit_32(1094418380);
+emit_32(1127972864);
+emit_32(1105277223);
+emit_32(1094418380);
+emit_32(1128228848);
+emit_32(1104907757);
+emit_32(1094418380);
+emit_32(1128484897);
+emit_32(1104873049);
+emit_32(1094418380);
+emit_32(1128740880);
+emit_32(1104381896);
+emit_32(1094418380);
+emit_32(1128996864);
+emit_32(1103612294);
+emit_32(1094418380);
+emit_32(1129252848);
+emit_32(1103676519);
+emit_32(1094418380);
+emit_32(1129508897);
+emit_32(1104280132);
+emit_32(1094418380);
+emit_32(1129764880);
+emit_32(1104232789);
+emit_32(1094418380);
+emit_32(1130020864);
+emit_32(1103550533);
+emit_32(1094418380);
+emit_32(1130276848);
+emit_32(1102514592);
+emit_32(1094418380);
+emit_32(1130532897);
+emit_32(1101953866);
+emit_32(1094418380);
+emit_32(1130788880);
+emit_32(1100634653);
+emit_32(1094418380);
+emit_32(1131044864);
+emit_32(1099709337);
+emit_32(1094418380);
+emit_32(1131300848);
+emit_32(1099034526);
+emit_32(1094418380);
+emit_32(1131556897);
+emit_32(1098146172);
+emit_32(1094418380);
+emit_32(1131812880);
+emit_32(1096675754);
+emit_32(1094418380);
+emit_32(1132068864);
+emit_32(1095032426);
+emit_32(1094418380);
+emit_32(1081737216);
+emit_32(1112605380);
+emit_32(1090125824);
+emit_32(1090125824);
+emit_32(1112742534);
+emit_32(1090125824);
+emit_32(1094418484);
+emit_32(1112581997);
+emit_32(1090125824);
+emit_32(1098514432);
+emit_32(1112591984);
+emit_32(1090125824);
+emit_32(1100759066);
+emit_32(1112534732);
+emit_32(1090125824);
+emit_32(1102807040);
+emit_32(1112399387);
+emit_32(1090125824);
+emit_32(1104855066);
+emit_32(1112277857);
+emit_32(1090125824);
+emit_32(1106903040);
+emit_32(1112201599);
+emit_32(1090125824);
+emit_32(1108123661);
+emit_32(1112445472);
+emit_32(1090125824);
+emit_32(1109147648);
+emit_32(1112670418);
+emit_32(1090125824);
+emit_32(1110171661);
+emit_32(1112875572);
+emit_32(1090125824);
+emit_32(1111195648);
+emit_32(1112679095);
+emit_32(1090125824);
+emit_32(1112219661);
+emit_32(1112703500);
+emit_32(1090125824);
+emit_32(1113243648);
+emit_32(1112775511);
+emit_32(1090125824);
+emit_32(1114267661);
+emit_32(1112764999);
+emit_32(1090125824);
+emit_32(1115291648);
+emit_32(1112475330);
+emit_32(1090125824);
+emit_32(1116000263);
+emit_32(1112362661);
+emit_32(1090125824);
+emit_32(1116512256);
+emit_32(1112174966);
+emit_32(1090125824);
+emit_32(1117024263);
+emit_32(1112258039);
+emit_32(1090125824);
+emit_32(1117536256);
+emit_32(1112460755);
+emit_32(1090125824);
+emit_32(1118048263);
+emit_32(1112160312);
+emit_32(1090125824);
+emit_32(1118560256);
+emit_32(1111604462);
+emit_32(1090125824);
+emit_32(1119072263);
+emit_32(1111322578);
+emit_32(1090125824);
+emit_32(1119584256);
+emit_32(1110893291);
+emit_32(1090125824);
+emit_32(1120096263);
+emit_32(1110900736);
+emit_32(1090125824);
+emit_32(1120608322);
+emit_32(1110553369);
+emit_32(1090125824);
+emit_32(1121120289);
+emit_32(1110630518);
+emit_32(1090125824);
+emit_32(1121632256);
+emit_32(1110571431);
+emit_32(1090125824);
+emit_32(1122144223);
+emit_32(1110245900);
+emit_32(1090125824);
+emit_32(1122656322);
+emit_32(1109753463);
+emit_32(1090125824);
+emit_32(1123168289);
+emit_32(1109358386);
+emit_32(1090125824);
+emit_32(1123680256);
+emit_32(1108613530);
+emit_32(1090125824);
+emit_32(1124132848);
+emit_32(1108478368);
+emit_32(1090125824);
+emit_32(1124388897);
+emit_32(1108175854);
+emit_32(1090125824);
+emit_32(1124644880);
+emit_32(1107804527);
+emit_32(1090125824);
+emit_32(1124900864);
+emit_32(1107498500);
+emit_32(1090125824);
+emit_32(1125156848);
+emit_32(1107513704);
+emit_32(1090125824);
+emit_32(1125412897);
+emit_32(1107414562);
+emit_32(1090125824);
+emit_32(1125668880);
+emit_32(1107678934);
+emit_32(1090125824);
+emit_32(1125924864);
+emit_32(1107910564);
+emit_32(1090125824);
+emit_32(1126180848);
+emit_32(1108046853);
+emit_32(1090125824);
+emit_32(1126436897);
+emit_32(1107743028);
+emit_32(1090125824);
+emit_32(1126692880);
+emit_32(1107443817);
+emit_32(1090125824);
+emit_32(1126948864);
+emit_32(1107040246);
+emit_32(1090125824);
+emit_32(1127204848);
+emit_32(1106762321);
+emit_32(1090125824);
+emit_32(1127460897);
+emit_32(1106354582);
+emit_32(1090125824);
+emit_32(1127716880);
+emit_32(1105464079);
+emit_32(1090125824);
+emit_32(1127972864);
+emit_32(1104597169);
+emit_32(1090125824);
+emit_32(1128228848);
+emit_32(1103944902);
+emit_32(1090125824);
+emit_32(1128484897);
+emit_32(1104198028);
+emit_32(1090125824);
+emit_32(1128740880);
+emit_32(1103790342);
+emit_32(1090125824);
+emit_32(1128996864);
+emit_32(1103102686);
+emit_32(1090125824);
+emit_32(1129252848);
+emit_32(1103136555);
+emit_32(1090125824);
+emit_32(1129508897);
+emit_32(1103360688);
+emit_32(1090125824);
+emit_32(1129764880);
+emit_32(1103301339);
+emit_32(1090125824);
+emit_32(1130020864);
+emit_32(1102581596);
+emit_32(1090125824);
+emit_32(1130276848);
+emit_32(1101582723);
+emit_32(1090125824);
+emit_32(1130532897);
+emit_32(1100502427);
+emit_32(1090125824);
+emit_32(1130788880);
+emit_32(1099934623);
+emit_32(1090125824);
+emit_32(1131044864);
+emit_32(1099180854);
+emit_32(1090125824);
+emit_32(1131300848);
+emit_32(1098378012);
+emit_32(1090125824);
+emit_32(1131556897);
+emit_32(1096908852);
+emit_32(1090125824);
+emit_32(1131812880);
+emit_32(1096091278);
+emit_32(1090125824);
+emit_32(1132068864);
+emit_32(1095719453);
+emit_32(1090125824);
+emit_32(1081737216);
+emit_32(1112701298);
+emit_32(1081737216);
+emit_32(1090125824);
+emit_32(1112503694);
+emit_32(1081737216);
+emit_32(1094418484);
+emit_32(1112328084);
+emit_32(1081737216);
+emit_32(1098514432);
+emit_32(1112069951);
+emit_32(1081737216);
+emit_32(1100759066);
+emit_32(1112173655);
+emit_32(1081737216);
+emit_32(1102807040);
+emit_32(1112198559);
+emit_32(1081737216);
+emit_32(1104855066);
+emit_32(1112333694);
+emit_32(1081737216);
+emit_32(1106903040);
+emit_32(1112388744);
+emit_32(1081737216);
+emit_32(1108123661);
+emit_32(1112590726);
+emit_32(1081737216);
+emit_32(1109147648);
+emit_32(1113057735);
+emit_32(1081737216);
+emit_32(1110171661);
+emit_32(1113035296);
+emit_32(1081737216);
+emit_32(1111195648);
+emit_32(1112886896);
+emit_32(1081737216);
+emit_32(1112219661);
+emit_32(1112955971);
+emit_32(1081737216);
+emit_32(1113243648);
+emit_32(1113474440);
+emit_32(1081737216);
+emit_32(1114267661);
+emit_32(1113373252);
+emit_32(1081737216);
+emit_32(1115291648);
+emit_32(1112981923);
+emit_32(1081737216);
+emit_32(1116000263);
+emit_32(1112815462);
+emit_32(1081737216);
+emit_32(1116512256);
+emit_32(1112451711);
+emit_32(1081737216);
+emit_32(1117024263);
+emit_32(1112394144);
+emit_32(1081737216);
+emit_32(1117536256);
+emit_32(1112528414);
+emit_32(1081737216);
+emit_32(1118048263);
+emit_32(1112287950);
+emit_32(1081737216);
+emit_32(1118560256);
+emit_32(1111949653);
+emit_32(1081737216);
+emit_32(1119072263);
+emit_32(1111682685);
+emit_32(1081737216);
+emit_32(1119584256);
+emit_32(1111194678);
+emit_32(1081737216);
+emit_32(1120096263);
+emit_32(1111068639);
+emit_32(1081737216);
+emit_32(1120608322);
+emit_32(1110815303);
+emit_32(1081737216);
+emit_32(1121120289);
+emit_32(1110882674);
+emit_32(1081737216);
+emit_32(1121632256);
+emit_32(1110789010);
+emit_32(1081737216);
+emit_32(1122144223);
+emit_32(1110340062);
+emit_32(1081737216);
+emit_32(1122656322);
+emit_32(1109951539);
+emit_32(1081737216);
+emit_32(1123168289);
+emit_32(1109517848);
+emit_32(1081737216);
+emit_32(1123680256);
+emit_32(1109219108);
+emit_32(1081737216);
+emit_32(1124132848);
+emit_32(1108888571);
+emit_32(1081737216);
+emit_32(1124388897);
+emit_32(1108548203);
+emit_32(1081737216);
+emit_32(1124644880);
+emit_32(1108062057);
+emit_32(1081737216);
+emit_32(1124900864);
+emit_32(1107391755);
+emit_32(1081737216);
+emit_32(1125156848);
+emit_32(1107147201);
+emit_32(1081737216);
+emit_32(1125412897);
+emit_32(1106562515);
+emit_32(1081737216);
+emit_32(1125668880);
+emit_32(1107088323);
+emit_32(1081737216);
+emit_32(1125924864);
+emit_32(1107466728);
+emit_32(1081737216);
+emit_32(1126180848);
+emit_32(1107640477);
+emit_32(1081737216);
+emit_32(1126436897);
+emit_32(1107446858);
+emit_32(1081737216);
+emit_32(1126692880);
+emit_32(1107035003);
+emit_32(1081737216);
+emit_32(1126948864);
+emit_32(1106606398);
+emit_32(1081737216);
+emit_32(1127204848);
+emit_32(1106181305);
+emit_32(1081737216);
+emit_32(1127460897);
+emit_32(1105541831);
+emit_32(1081737216);
+emit_32(1127716880);
+emit_32(1104783501);
+emit_32(1081737216);
+emit_32(1127972864);
+emit_32(1103855197);
+emit_32(1081737216);
+emit_32(1128228848);
+emit_32(1103186310);
+emit_32(1081737216);
+emit_32(1128484897);
+emit_32(1103087482);
+emit_32(1081737216);
+emit_32(1128740880);
+emit_32(1102981471);
+emit_32(1081737216);
+emit_32(1128996864);
+emit_32(1102264716);
+emit_32(1081737216);
+emit_32(1129252848);
+emit_32(1102136581);
+emit_32(1081737216);
+emit_32(1129508897);
+emit_32(1101851735);
+emit_32(1081737216);
+emit_32(1129764880);
+emit_32(1101959109);
+emit_32(1081737216);
+emit_32(1130020864);
+emit_32(1101538001);
+emit_32(1081737216);
+emit_32(1130276848);
+emit_32(1100676386);
+emit_32(1081737216);
+emit_32(1130532897);
+emit_32(1100067740);
+emit_32(1081737216);
+emit_32(1130788880);
+emit_32(1099550582);
+emit_32(1081737216);
+emit_32(1131044864);
+emit_32(1099061684);
+emit_32(1081737216);
+emit_32(1131300848);
+emit_32(1097284243);
+emit_32(1081737216);
+emit_32(1131556897);
+emit_32(1096432799);
+emit_32(1081737216);
+emit_32(1131812880);
+emit_32(1096013998);
+emit_32(1081737216);
+emit_32(1132068864);
+emit_32(1095458043);
+emit_32(1081737216);
+emit_start(Landscape05Vtx)
+emit_32(3279552512);
+emit_32(3212673672);
+emit_32(0);
+emit_32(3279552512);
+emit_32(1041185636);
+emit_32(1081737216);
+emit_32(3279296528);
+emit_32(1059833579);
+emit_32(0);
+emit_32(3279296528);
+emit_32(1071476480);
+emit_32(1081737216);
+emit_32(3279040545);
+emit_32(1072407784);
+emit_32(0);
+emit_32(3279040545);
+emit_32(1076263523);
+emit_32(1081737216);
+emit_32(3278784496);
+emit_32(1080759692);
+emit_32(3022808678);
+emit_32(3278784496);
+emit_32(1082158660);
+emit_32(1081737216);
+emit_32(3278528512);
+emit_32(1084161503);
+emit_32(3026792956);
+emit_32(3278528512);
+emit_32(1084513929);
+emit_32(1081737216);
+emit_32(3278272528);
+emit_32(1087503650);
+emit_32(3029991200);
+emit_32(3278272528);
+emit_32(1087785717);
+emit_32(1081737216);
+emit_32(3278016545);
+emit_32(1090834682);
+emit_32(3032665494);
+emit_32(3278016545);
+emit_32(1090972056);
+emit_32(1081737216);
+emit_32(3277760496);
+emit_32(1092557314);
+emit_32(3035192119);
+emit_32(3277760496);
+emit_32(1092442569);
+emit_32(1081737216);
+emit_32(3277504512);
+emit_32(1094292446);
+emit_32(3037206586);
+emit_32(3277504512);
+emit_32(1094046974);
+emit_32(1081737216);
+emit_32(3277248528);
+emit_32(1097139854);
+emit_32(3039294743);
+emit_32(3277248528);
+emit_32(1097043280);
+emit_32(1081737216);
+emit_32(3276992545);
+emit_32(1099197999);
+emit_32(3041017018);
+emit_32(3276992545);
+emit_32(1098999818);
+emit_32(1081737216);
+emit_32(3276736496);
+emit_32(1100402917);
+emit_32(3042784259);
+emit_32(3276736496);
+emit_32(1100434742);
+emit_32(1081737216);
+emit_32(3276480512);
+emit_32(1101809268);
+emit_32(3044847030);
+emit_32(3276480512);
+emit_32(1101659007);
+emit_32(1081737216);
+emit_32(3276224528);
+emit_32(1102438046);
+emit_32(3045416976);
+emit_32(3276224528);
+emit_32(1102608545);
+emit_32(1081737216);
+emit_32(3275968545);
+emit_32(1103348997);
+emit_32(3046085013);
+emit_32(3275968545);
+emit_32(1103417836);
+emit_32(1081737216);
+emit_32(3275712496);
+emit_32(1104211817);
+emit_32(3046717804);
+emit_32(3275712496);
+emit_32(1104053168);
+emit_32(1081737216);
+emit_32(3275456512);
+emit_32(1104674187);
+emit_32(3047056805);
+emit_32(3275456512);
+emit_32(1104973450);
+emit_32(1081737216);
+emit_32(3275200528);
+emit_32(1105401165);
+emit_32(3047590024);
+emit_32(3275200528);
+emit_32(1105837477);
+emit_32(1081737216);
+emit_32(3274944545);
+emit_32(1105747352);
+emit_32(3047843880);
+emit_32(3274944545);
+emit_32(1106081743);
+emit_32(1081737216);
+emit_32(3274688496);
+emit_32(1106143871);
+emit_32(3048134678);
+emit_32(3274688496);
+emit_32(1106636492);
+emit_32(1081737216);
+emit_32(3274432512);
+emit_32(1106329416);
+emit_32(3048270754);
+emit_32(3274432512);
+emit_32(1107002917);
+emit_32(1081737216);
+emit_32(3274176528);
+emit_32(1107393459);
+emit_32(3049122304);
+emit_32(3274176528);
+emit_32(1107580184);
+emit_32(1081737216);
+emit_32(3273920545);
+emit_32(1108074955);
+emit_32(3050121892);
+emit_32(3273920545);
+emit_32(1107983729);
+emit_32(1081737216);
+emit_32(3273664496);
+emit_32(1108448641);
+emit_32(3050669976);
+emit_32(3273664496);
+emit_32(1108213550);
+emit_32(1081737216);
+emit_32(3273408512);
+emit_32(1108684230);
+emit_32(3051015487);
+emit_32(3273408512);
+emit_32(1108715137);
+emit_32(1081737216);
+emit_32(3273152528);
+emit_32(1108934132);
+emit_32(3051382020);
+emit_32(3273152528);
+emit_32(1108987871);
+emit_32(1081737216);
+emit_32(3272896545);
+emit_32(1108952377);
+emit_32(3051408760);
+emit_32(3272896545);
+emit_32(1109130582);
+emit_32(1081737216);
+emit_32(3272640496);
+emit_32(1108910775);
+emit_32(3051347803);
+emit_32(3272640496);
+emit_32(1109075454);
+emit_32(1081737216);
+emit_32(3272384512);
+emit_32(1108499366);
+emit_32(3050744391);
+emit_32(3272384512);
+emit_32(1108764813);
+emit_32(1081737216);
+emit_32(3272128528);
+emit_32(1108270907);
+emit_32(3050409260);
+emit_32(3272128528);
+emit_32(1108391939);
+emit_32(1081737216);
+emit_32(3271872545);
+emit_32(1107755506);
+emit_32(3049653324);
+emit_32(3271872545);
+emit_32(1108080224);
+emit_32(1081737216);
+emit_32(3271616496);
+emit_32(1107633190);
+emit_32(3049473972);
+emit_32(3271616496);
+emit_32(1107854728);
+emit_32(1081737216);
+emit_32(3271163904);
+emit_32(1107663336);
+emit_32(3049518128);
+emit_32(3271163904);
+emit_32(1107912740);
+emit_32(1081737216);
+emit_32(3270651937);
+emit_32(1107588075);
+emit_32(3049407737);
+emit_32(3270651937);
+emit_32(1107731730);
+emit_32(1081737216);
+emit_32(3270139970);
+emit_32(1107502327);
+emit_32(3049282041);
+emit_32(3270139970);
+emit_32(1107480989);
+emit_32(1081737216);
+emit_32(3269627871);
+emit_32(1107559370);
+emit_32(3049365692);
+emit_32(3269627871);
+emit_32(1107400013);
+emit_32(1081737216);
+emit_32(3269115904);
+emit_32(1107429425);
+emit_32(3049175080);
+emit_32(3269115904);
+emit_32(1106814855);
+emit_32(1081737216);
+emit_32(3268603937);
+emit_32(1107211531);
+emit_32(3048917619);
+emit_32(3268603937);
+emit_32(1106747641);
+emit_32(1081737216);
+emit_32(3268091970);
+emit_32(1106869381);
+emit_32(3048666666);
+emit_32(3268091970);
+emit_32(1106153570);
+emit_32(1081737216);
+emit_32(3267579911);
+emit_32(1106076710);
+emit_32(3048085420);
+emit_32(3267579911);
+emit_32(1105450553);
+emit_32(1081737216);
+emit_32(3267067904);
+emit_32(1105107773);
+emit_32(3047374784);
+emit_32(3267067904);
+emit_32(1105015289);
+emit_32(1081737216);
+emit_32(3266555911);
+emit_32(1104100511);
+emit_32(3046636088);
+emit_32(3266555911);
+emit_32(1103926185);
+emit_32(1081737216);
+emit_32(3266043904);
+emit_32(1102799385);
+emit_32(3045681976);
+emit_32(3266043904);
+emit_32(1103220965);
+emit_32(1081737216);
+emit_32(3265531911);
+emit_32(1102770130);
+emit_32(3045660513);
+emit_32(3265531911);
+emit_32(1102714556);
+emit_32(1081737216);
+emit_32(3265019904);
+emit_32(1102608335);
+emit_32(3045541854);
+emit_32(3265019904);
+emit_32(1102293972);
+emit_32(1081737216);
+emit_32(3264507911);
+emit_32(1103061372);
+emit_32(3045874083);
+emit_32(3264507911);
+emit_32(1102696206);
+emit_32(1081737216);
+emit_32(3263995904);
+emit_32(1102915777);
+emit_32(3045767298);
+emit_32(3263995904);
+emit_32(1102841119);
+emit_32(1081737216);
+emit_32(3263483911);
+emit_32(1102723888);
+emit_32(3045626560);
+emit_32(3263483911);
+emit_32(1102940104);
+emit_32(1081737216);
+emit_32(3262775296);
+emit_32(1103408189);
+emit_32(3046128466);
+emit_32(3262775296);
+emit_32(1103457681);
+emit_32(1081737216);
+emit_32(3261751309);
+emit_32(1103998484);
+emit_32(3046561321);
+emit_32(3261751309);
+emit_32(1103885553);
+emit_32(1081737216);
+emit_32(3260727296);
+emit_32(1104668105);
+emit_32(3047052407);
+emit_32(3260727296);
+emit_32(1104135953);
+emit_32(1081737216);
+emit_32(3259703309);
+emit_32(1105127381);
+emit_32(3047389210);
+emit_32(3259703309);
+emit_32(1104254180);
+emit_32(1081737216);
+emit_32(3258679296);
+emit_32(1105216196);
+emit_32(3047454301);
+emit_32(3258679296);
+emit_32(1104598218);
+emit_32(1081737216);
+emit_32(3257655309);
+emit_32(1105244507);
+emit_32(3047475059);
+emit_32(3257655309);
+emit_32(1105055869);
+emit_32(1081737216);
+emit_32(3256631296);
+emit_32(1106325379);
+emit_32(3048267763);
+emit_32(3256631296);
+emit_32(1105830661);
+emit_32(1081737216);
+emit_32(3255607309);
+emit_32(1107402398);
+emit_32(3049135410);
+emit_32(3255607309);
+emit_32(1107186156);
+emit_32(1081737216);
+emit_32(3254386688);
+emit_32(1107944119);
+emit_32(3049929961);
+emit_32(3254386688);
+emit_32(1107890222);
+emit_32(1081737216);
+emit_32(3252338714);
+emit_32(1108676916);
+emit_32(3051004756);
+emit_32(3252338714);
+emit_32(1108342578);
+emit_32(1081737216);
+emit_32(3250290688);
+emit_32(1109077105);
+emit_32(3051591719);
+emit_32(3250290688);
+emit_32(1108968106);
+emit_32(1081737216);
+emit_32(3248242714);
+emit_32(1109498895);
+emit_32(3052210436);
+emit_32(3248242714);
+emit_32(1109363314);
+emit_32(1081737216);
+emit_32(3245998080);
+emit_32(1110132051);
+emit_32(3053139040);
+emit_32(3245998080);
+emit_32(1110217982);
+emit_32(1081737216);
+emit_32(3241902132);
+emit_32(1110709318);
+emit_32(3053719532);
+emit_32(3241902132);
+emit_32(1110836747);
+emit_32(1081737216);
+emit_32(3237609472);
+emit_32(1111158922);
+emit_32(3054049253);
+emit_32(3237609472);
+emit_32(1111340011);
+emit_32(1081737216);
+emit_32(3229220864);
+emit_32(1111589126);
+emit_32(3054364725);
+emit_32(3229220864);
+emit_32(1111989472);
+emit_32(1081737216);
+emit_32(0);
+emit_32(1111989053);
+emit_32(3054658031);
+emit_32(0);
+emit_32(1112547577);
+emit_32(1081737216);
+emit_32(1081737216);
+emit_32(1112116167);
+emit_32(3054751226);
+emit_32(1081737216);
+emit_32(1112701298);
+emit_32(1081737216);
+emit_32(3279552512);
+emit_32(3209799987);
+emit_32(3229220864);
+emit_32(3279296528);
+emit_32(1059840776);
+emit_32(3229220864);
+emit_32(3279040545);
+emit_32(1077240503);
+emit_32(3229220864);
+emit_32(3278784496);
+emit_32(1082549401);
+emit_32(3229220864);
+emit_32(3278528512);
+emit_32(1085468217);
+emit_32(3229220864);
+emit_32(3278272528);
+emit_32(1088296919);
+emit_32(3229220864);
+emit_32(3278016545);
+emit_32(1090881837);
+emit_32(3229220864);
+emit_32(3277760496);
+emit_32(1092463268);
+emit_32(3229220864);
+emit_32(3277504512);
+emit_32(1093558757);
+emit_32(3229220864);
+emit_32(3277248528);
+emit_32(1096426612);
+emit_32(3229220864);
+emit_32(3276992545);
+emit_32(1099175874);
+emit_32(3229220864);
+emit_32(3276736496);
+emit_32(1099804757);
+emit_32(3229220864);
+emit_32(3276480512);
+emit_32(1101394975);
+emit_32(3229220864);
+emit_32(3276224528);
+emit_32(1102334185);
+emit_32(3229220864);
+emit_32(3275968545);
+emit_32(1103311038);
+emit_32(3229220864);
+emit_32(3275712496);
+emit_32(1104048921);
+emit_32(3229220864);
+emit_32(3275456512);
+emit_32(1104659821);
+emit_32(3229220864);
+emit_32(3275200528);
+emit_32(1105062632);
+emit_32(3229220864);
+emit_32(3274944545);
+emit_32(1105651669);
+emit_32(3229220864);
+emit_32(3274688496);
+emit_32(1106231322);
+emit_32(3229220864);
+emit_32(3274432512);
+emit_32(1107336626);
+emit_32(3229220864);
+emit_32(3274176528);
+emit_32(1107657989);
+emit_32(3229220864);
+emit_32(3273920545);
+emit_32(1108184452);
+emit_32(3229220864);
+emit_32(3273664496);
+emit_32(1108338672);
+emit_32(3229220864);
+emit_32(3273408512);
+emit_32(1108483926);
+emit_32(3229220864);
+emit_32(3273152528);
+emit_32(1108691229);
+emit_32(3229220864);
+emit_32(3272896545);
+emit_32(1108557850);
+emit_32(3229220864);
+emit_32(3272640496);
+emit_32(1108486573);
+emit_32(3229220864);
+emit_32(3272384512);
+emit_32(1108265140);
+emit_32(3229220864);
+emit_32(3272128528);
+emit_32(1108112887);
+emit_32(3229220864);
+emit_32(3271872545);
+emit_32(1107872003);
+emit_32(3229220864);
+emit_32(3271616496);
+emit_32(1107841411);
+emit_32(3229220864);
+emit_32(3271163904);
+emit_32(1107883406);
+emit_32(3229220864);
+emit_32(3270651937);
+emit_32(1107859944);
+emit_32(3229220864);
+emit_32(3270139970);
+emit_32(1107767014);
+emit_32(3229220864);
+emit_32(3269627871);
+emit_32(1107782795);
+emit_32(3229220864);
+emit_32(3269115904);
+emit_32(1107629310);
+emit_32(3229220864);
+emit_32(3268603937);
+emit_32(1107448404);
+emit_32(3229220864);
+emit_32(3268091970);
+emit_32(1107249594);
+emit_32(3229220864);
+emit_32(3267579911);
+emit_32(1106441929);
+emit_32(3229220864);
+emit_32(3267067904);
+emit_32(1105756265);
+emit_32(3229220864);
+emit_32(3266555911);
+emit_32(1104508197);
+emit_32(3229220864);
+emit_32(3266043904);
+emit_32(1103537583);
+emit_32(3229220864);
+emit_32(3265531911);
+emit_32(1103027556);
+emit_32(3229220864);
+emit_32(3265019904);
+emit_32(1102775006);
+emit_32(3229220864);
+emit_32(3264507911);
+emit_32(1103080037);
+emit_32(3229220864);
+emit_32(3263995904);
+emit_32(1103170109);
+emit_32(3229220864);
+emit_32(3263483911);
+emit_32(1103334002);
+emit_32(3229220864);
+emit_32(3262775296);
+emit_32(1103932372);
+emit_32(3229220864);
+emit_32(3261751309);
+emit_32(1104512234);
+emit_32(3229220864);
+emit_32(3260727296);
+emit_32(1105151184);
+emit_32(3229220864);
+emit_32(3259703309);
+emit_32(1105468116);
+emit_32(3229220864);
+emit_32(3258679296);
+emit_32(1105860336);
+emit_32(3229220864);
+emit_32(3257655309);
+emit_32(1105963568);
+emit_32(3229220864);
+emit_32(3256631296);
+emit_32(1106718071);
+emit_32(3229220864);
+emit_32(3255607309);
+emit_32(1107534414);
+emit_32(3229220864);
+emit_32(3254386688);
+emit_32(1108061821);
+emit_32(3229220864);
+emit_32(3252338714);
+emit_32(1108796323);
+emit_32(3229220864);
+emit_32(3250290688);
+emit_32(1109110555);
+emit_32(3229220864);
+emit_32(3248242714);
+emit_32(1109471606);
+emit_32(3229220864);
+emit_32(3245998080);
+emit_32(1109857115);
+emit_32(3229220864);
+emit_32(3241902132);
+emit_32(1110399726);
+emit_32(3229220864);
+emit_32(3237609472);
+emit_32(1110641187);
+emit_32(3229220864);
+emit_32(3229220864);
+emit_32(1111105208);
+emit_32(3229220864);
+emit_32(0);
+emit_32(1111556044);
+emit_32(3229220864);
+emit_32(1081737216);
+emit_32(1111714929);
+emit_32(3229220864);
+emit_32(3279552512);
+emit_32(1054711998);
+emit_32(3237609472);
+emit_32(3279296528);
+emit_32(1073162675);
+emit_32(3237609472);
+emit_32(3279040545);
+emit_32(1079142997);
+emit_32(3237609472);
+emit_32(3278784496);
+emit_32(1083244271);
+emit_32(3237609472);
+emit_32(3278528512);
+emit_32(1085647335);
+emit_32(3237609472);
+emit_32(3278272528);
+emit_32(1089136346);
+emit_32(3237609472);
+emit_32(3278016545);
+emit_32(1091028155);
+emit_32(3237609472);
+emit_32(3277760496);
+emit_32(1092749361);
+emit_32(3237609472);
+emit_32(3277504512);
+emit_32(1094007338);
+emit_32(3237609472);
+emit_32(3277248528);
+emit_32(1096172333);
+emit_32(3237609472);
+emit_32(3276992545);
+emit_32(1098404017);
+emit_32(3237609472);
+emit_32(3276736496);
+emit_32(1099924924);
+emit_32(3237609472);
+emit_32(3276480512);
+emit_32(1101300708);
+emit_32(3237609472);
+emit_32(3276224528);
+emit_32(1102514540);
+emit_32(3237609472);
+emit_32(3275968545);
+emit_32(1102952530);
+emit_32(3237609472);
+emit_32(3275712496);
+emit_32(1104219315);
+emit_32(3237609472);
+emit_32(3275456512);
+emit_32(1105238635);
+emit_32(3237609472);
+emit_32(3275200528);
+emit_32(1105786254);
+emit_32(3237609472);
+emit_32(3274944545);
+emit_32(1106026116);
+emit_32(3237609472);
+emit_32(3274688496);
+emit_32(1106387979);
+emit_32(3237609472);
+emit_32(3274432512);
+emit_32(1107205816);
+emit_32(3237609472);
+emit_32(3274176528);
+emit_32(1107688659);
+emit_32(3237609472);
+emit_32(3273920545);
+emit_32(1107937067);
+emit_32(3237609472);
+emit_32(3273664496);
+emit_32(1108184426);
+emit_32(3237609472);
+emit_32(3273408512);
+emit_32(1108351831);
+emit_32(3237609472);
+emit_32(3273152528);
+emit_32(1108376840);
+emit_32(3237609472);
+emit_32(3272896545);
+emit_32(1108546866);
+emit_32(3237609472);
+emit_32(3272640496);
+emit_32(1108425232);
+emit_32(3237609472);
+emit_32(3272384512);
+emit_32(1108404994);
+emit_32(3237609472);
+emit_32(3272128528);
+emit_32(1108262466);
+emit_32(3237609472);
+emit_32(3271872545);
+emit_32(1107983912);
+emit_32(3237609472);
+emit_32(3271616496);
+emit_32(1107864453);
+emit_32(3237609472);
+emit_32(3271163904);
+emit_32(1107866576);
+emit_32(3237609472);
+emit_32(3270651937);
+emit_32(1107727562);
+emit_32(3237609472);
+emit_32(3270139970);
+emit_32(1107886499);
+emit_32(3237609472);
+emit_32(3269627871);
+emit_32(1107880313);
+emit_32(3237609472);
+emit_32(3269115904);
+emit_32(1107886866);
+emit_32(3237609472);
+emit_32(3268603937);
+emit_32(1107605533);
+emit_32(3237609472);
+emit_32(3268091970);
+emit_32(1107358646);
+emit_32(3237609472);
+emit_32(3267579911);
+emit_32(1106791734);
+emit_32(3237609472);
+emit_32(3267067904);
+emit_32(1106079646);
+emit_32(3237609472);
+emit_32(3266555911);
+emit_32(1104985928);
+emit_32(3237609472);
+emit_32(3266043904);
+emit_32(1104015576);
+emit_32(3237609472);
+emit_32(3265531911);
+emit_32(1103311720);
+emit_32(3237609472);
+emit_32(3265019904);
+emit_32(1103316648);
+emit_32(3237609472);
+emit_32(3264507911);
+emit_32(1103704569);
+emit_32(3237609472);
+emit_32(3263995904);
+emit_32(1103636359);
+emit_32(3237609472);
+emit_32(3263483911);
+emit_32(1103830817);
+emit_32(3237609472);
+emit_32(3262775296);
+emit_32(1104077757);
+emit_32(3237609472);
+emit_32(3261751309);
+emit_32(1104578819);
+emit_32(3237609472);
+emit_32(3260727296);
+emit_32(1105235699);
+emit_32(3237609472);
+emit_32(3259703309);
+emit_32(1105711858);
+emit_32(3237609472);
+emit_32(3258679296);
+emit_32(1105779124);
+emit_32(3237609472);
+emit_32(3257655309);
+emit_32(1106565975);
+emit_32(3237609472);
+emit_32(3256631296);
+emit_32(1107139756);
+emit_32(3237609472);
+emit_32(3255607309);
+emit_32(1107456478);
+emit_32(3237609472);
+emit_32(3254386688);
+emit_32(1107977988);
+emit_32(3237609472);
+emit_32(3252338714);
+emit_32(1108423606);
+emit_32(3237609472);
+emit_32(3250290688);
+emit_32(1108993822);
+emit_32(3237609472);
+emit_32(3248242714);
+emit_32(1109315132);
+emit_32(3237609472);
+emit_32(3245998080);
+emit_32(1109596884);
+emit_32(3237609472);
+emit_32(3241902132);
+emit_32(1110086989);
+emit_32(3237609472);
+emit_32(3237609472);
+emit_32(1110712176);
+emit_32(3237609472);
+emit_32(3229220864);
+emit_32(1111303415);
+emit_32(3237609472);
+emit_32(0);
+emit_32(1111637125);
+emit_32(3237609472);
+emit_32(1081737216);
+emit_32(1111679959);
+emit_32(3237609472);
+emit_32(3279552512);
+emit_32(1058110391);
+emit_32(3241902132);
+emit_32(3279296528);
+emit_32(1072323898);
+emit_32(3241902132);
+emit_32(3279040545);
+emit_32(1079279857);
+emit_32(3241902132);
+emit_32(3278784496);
+emit_32(1082742465);
+emit_32(3241902132);
+emit_32(3278528512);
+emit_32(1086410992);
+emit_32(3241902132);
+emit_32(3278272528);
+emit_32(1088461147);
+emit_32(3241902132);
+emit_32(3278016545);
+emit_32(1091533338);
+emit_32(3241902132);
+emit_32(3277760496);
+emit_32(1093009303);
+emit_32(3241902132);
+emit_32(3277504512);
+emit_32(1094260359);
+emit_32(3241902132);
+emit_32(3277248528);
+emit_32(1096715285);
+emit_32(3241902132);
+emit_32(3276992545);
+emit_32(1098545575);
+emit_32(3241902132);
+emit_32(3276736496);
+emit_32(1100069260);
+emit_32(3241902132);
+emit_32(3276480512);
+emit_32(1101010882);
+emit_32(3241902132);
+emit_32(3276224528);
+emit_32(1101814458);
+emit_32(3241902132);
+emit_32(3275968545);
+emit_32(1102816372);
+emit_32(3241902132);
+emit_32(3275712496);
+emit_32(1104296175);
+emit_32(3241902132);
+emit_32(3275456512);
+emit_32(1105227573);
+emit_32(3241902132);
+emit_32(3275200528);
+emit_32(1105862695);
+emit_32(3241902132);
+emit_32(3274944545);
+emit_32(1106061767);
+emit_32(3241902132);
+emit_32(3274688496);
+emit_32(1106614157);
+emit_32(3241902132);
+emit_32(3274432512);
+emit_32(1106679117);
+emit_32(3241902132);
+emit_32(3274176528);
+emit_32(1107555097);
+emit_32(3241902132);
+emit_32(3273920545);
+emit_32(1107710706);
+emit_32(3241902132);
+emit_32(3273664496);
+emit_32(1107987399);
+emit_32(3241902132);
+emit_32(3273408512);
+emit_32(1108243985);
+emit_32(3241902132);
+emit_32(3273152528);
+emit_32(1108410132);
+emit_32(3241902132);
+emit_32(3272896545);
+emit_32(1108423370);
+emit_32(3241902132);
+emit_32(3272640496);
+emit_32(1108487858);
+emit_32(3241902132);
+emit_32(3272384512);
+emit_32(1108444525);
+emit_32(3241902132);
+emit_32(3272128528);
+emit_32(1108145681);
+emit_32(3241902132);
+emit_32(3271872545);
+emit_32(1107836142);
+emit_32(3241902132);
+emit_32(3271616496);
+emit_32(1107856825);
+emit_32(3241902132);
+emit_32(3271163904);
+emit_32(1107713065);
+emit_32(3241902132);
+emit_32(3270651937);
+emit_32(1107761431);
+emit_32(3241902132);
+emit_32(3270139970);
+emit_32(1107749346);
+emit_32(3241902132);
+emit_32(3269627871);
+emit_32(1107742242);
+emit_32(3241902132);
+emit_32(3269115904);
+emit_32(1107724468);
+emit_32(3241902132);
+emit_32(3268603937);
+emit_32(1107622651);
+emit_32(3241902132);
+emit_32(3268091970);
+emit_32(1107524085);
+emit_32(3241902132);
+emit_32(3267579911);
+emit_32(1106842380);
+emit_32(3241902132);
+emit_32(3267067904);
+emit_32(1106029733);
+emit_32(3241902132);
+emit_32(3266555911);
+emit_32(1104983674);
+emit_32(3241902132);
+emit_32(3266043904);
+emit_32(1104019456);
+emit_32(3241902132);
+emit_32(3265531911);
+emit_32(1103853571);
+emit_32(3241902132);
+emit_32(3265019904);
+emit_32(1103951666);
+emit_32(3241902132);
+emit_32(3264507911);
+emit_32(1103711542);
+emit_32(3241902132);
+emit_32(3263995904);
+emit_32(1103910404);
+emit_32(3241902132);
+emit_32(3263483911);
+emit_32(1103908517);
+emit_32(3241902132);
+emit_32(3262775296);
+emit_32(1104110577);
+emit_32(3241902132);
+emit_32(3261751309);
+emit_32(1104188172);
+emit_32(3241902132);
+emit_32(3260727296);
+emit_32(1104905241);
+emit_32(3241902132);
+emit_32(3259703309);
+emit_32(1105620212);
+emit_32(3241902132);
+emit_32(3258679296);
+emit_32(1106230221);
+emit_32(3241902132);
+emit_32(3257655309);
+emit_32(1107170322);
+emit_32(3241902132);
+emit_32(3256631296);
+emit_32(1107365357);
+emit_32(3241902132);
+emit_32(3255607309);
+emit_32(1107446569);
+emit_32(3241902132);
+emit_32(3254386688);
+emit_32(1107700744);
+emit_32(3241902132);
+emit_32(3252338714);
+emit_32(1108112651);
+emit_32(3241902132);
+emit_32(3250290688);
+emit_32(1108689473);
+emit_32(3241902132);
+emit_32(3248242714);
+emit_32(1109194519);
+emit_32(3241902132);
+emit_32(3245998080);
+emit_32(1109874285);
+emit_32(3241902132);
+emit_32(3241902132);
+emit_32(1110441774);
+emit_32(3241902132);
+emit_32(3237609472);
+emit_32(1111191218);
+emit_32(3241902132);
+emit_32(3229220864);
+emit_32(1111647243);
+emit_32(3241902132);
+emit_32(0);
+emit_32(1111674821);
+emit_32(3241902132);
+emit_32(1081737216);
+emit_32(1111917802);
+emit_32(3241902132);
+emit_32(3279552512);
+emit_32(1069567233);
+emit_32(3245998080);
+emit_32(3279296528);
+emit_32(1071989863);
+emit_32(3245998080);
+emit_32(3279040545);
+emit_32(1075944798);
+emit_32(3245998080);
+emit_32(3278784496);
+emit_32(1082325006);
+emit_32(3245998080);
+emit_32(3278528512);
+emit_32(1086766564);
+emit_32(3245998080);
+emit_32(3278272528);
+emit_32(1089466668);
+emit_32(3245998080);
+emit_32(3278016545);
+emit_32(1091111989);
+emit_32(3245998080);
+emit_32(3277760496);
+emit_32(1092605224);
+emit_32(3245998080);
+emit_32(3277504512);
+emit_32(1095055494);
+emit_32(3245998080);
+emit_32(3277248528);
+emit_32(1097329541);
+emit_32(3245998080);
+emit_32(3276992545);
+emit_32(1098231421);
+emit_32(3245998080);
+emit_32(3276736496);
+emit_32(1099798361);
+emit_32(3245998080);
+emit_32(3276480512);
+emit_32(1100629777);
+emit_32(3245998080);
+emit_32(3276224528);
+emit_32(1101582932);
+emit_32(3245998080);
+emit_32(3275968545);
+emit_32(1102756341);
+emit_32(3245998080);
+emit_32(3275712496);
+emit_32(1103822271);
+emit_32(3245998080);
+emit_32(3275456512);
+emit_32(1104867754);
+emit_32(3245998080);
+emit_32(3275200528);
+emit_32(1105394716);
+emit_32(3245998080);
+emit_32(3274944545);
+emit_32(1106013428);
+emit_32(3245998080);
+emit_32(3274688496);
+emit_32(1106248257);
+emit_32(3245998080);
+emit_32(3274432512);
+emit_32(1106783293);
+emit_32(3245998080);
+emit_32(3274176528);
+emit_32(1107441641);
+emit_32(3245998080);
+emit_32(3273920545);
+emit_32(1107472338);
+emit_32(3245998080);
+emit_32(3273664496);
+emit_32(1107780305);
+emit_32(3245998080);
+emit_32(3273408512);
+emit_32(1108116033);
+emit_32(3245998080);
+emit_32(3273152528);
+emit_32(1108228755);
+emit_32(3245998080);
+emit_32(3272896545);
+emit_32(1108513391);
+emit_32(3245998080);
+emit_32(3272640496);
+emit_32(1108457108);
+emit_32(3245998080);
+emit_32(3272384512);
+emit_32(1108243173);
+emit_32(3245998080);
+emit_32(3272128528);
+emit_32(1108176536);
+emit_32(3245998080);
+emit_32(3271872545);
+emit_32(1107871348);
+emit_32(3245998080);
+emit_32(3271616496);
+emit_32(1107923121);
+emit_32(3245998080);
+emit_32(3271163904);
+emit_32(1107614682);
+emit_32(3245998080);
+emit_32(3270651937);
+emit_32(1107505709);
+emit_32(3245998080);
+emit_32(3270139970);
+emit_32(1107594707);
+emit_32(3245998080);
+emit_32(3269627871);
+emit_32(1107597381);
+emit_32(3245998080);
+emit_32(3269115904);
+emit_32(1107730471);
+emit_32(3245998080);
+emit_32(3268603937);
+emit_32(1107619086);
+emit_32(3245998080);
+emit_32(3268091970);
+emit_32(1107455273);
+emit_32(3245998080);
+emit_32(3267579911);
+emit_32(1106610802);
+emit_32(3245998080);
+emit_32(3267067904);
+emit_32(1105479074);
+emit_32(3245998080);
+emit_32(3266555911);
+emit_32(1105028081);
+emit_32(3245998080);
+emit_32(3266043904);
+emit_32(1104895856);
+emit_32(3245998080);
+emit_32(3265531911);
+emit_32(1104167515);
+emit_32(3245998080);
+emit_32(3265019904);
+emit_32(1104032563);
+emit_32(3245998080);
+emit_32(3264507911);
+emit_32(1104102818);
+emit_32(3245998080);
+emit_32(3263995904);
+emit_32(1103636621);
+emit_32(3245998080);
+emit_32(3263483911);
+emit_32(1104117812);
+emit_32(3245998080);
+emit_32(3262775296);
+emit_32(1104170556);
+emit_32(3245998080);
+emit_32(3261751309);
+emit_32(1104075031);
+emit_32(3245998080);
+emit_32(3260727296);
+emit_32(1104866076);
+emit_32(3245998080);
+emit_32(3259703309);
+emit_32(1105674056);
+emit_32(3245998080);
+emit_32(3258679296);
+emit_32(1106593763);
+emit_32(3245998080);
+emit_32(3257655309);
+emit_32(1107479652);
+emit_32(3245998080);
+emit_32(3256631296);
+emit_32(1107477371);
+emit_32(3245998080);
+emit_32(3255607309);
+emit_32(1107602886);
+emit_32(3245998080);
+emit_32(3254386688);
+emit_32(1108002655);
+emit_32(3245998080);
+emit_32(3252338714);
+emit_32(1108265717);
+emit_32(3245998080);
+emit_32(3250290688);
+emit_32(1108946348);
+emit_32(3245998080);
+emit_32(3248242714);
+emit_32(1109570748);
+emit_32(3245998080);
+emit_32(3245998080);
+emit_32(1110334348);
+emit_32(3245998080);
+emit_32(3241902132);
+emit_32(1111046776);
+emit_32(3245998080);
+emit_32(3237609472);
+emit_32(1111662998);
+emit_32(3245998080);
+emit_32(3229220864);
+emit_32(1111752783);
+emit_32(3245998080);
+emit_32(0);
+emit_32(1112149144);
+emit_32(3245998080);
+emit_32(1081737216);
+emit_32(1112196121);
+emit_32(3245998080);
+emit_32(3279552512);
+emit_32(1069069537);
+emit_32(3248242714);
+emit_32(3279296528);
+emit_32(1070813613);
+emit_32(3248242714);
+emit_32(3279040545);
+emit_32(1077694242);
+emit_32(3248242714);
+emit_32(3278784496);
+emit_32(1083641745);
+emit_32(3248242714);
+emit_32(3278528512);
+emit_32(1087538169);
+emit_32(3248242714);
+emit_32(3278272528);
+emit_32(1089089810);
+emit_32(3248242714);
+emit_32(3278016545);
+emit_32(1090321216);
+emit_32(3248242714);
+emit_32(3277760496);
+emit_32(1092452761);
+emit_32(3248242714);
+emit_32(3277504512);
+emit_32(1094878390);
+emit_32(3248242714);
+emit_32(3277248528);
+emit_32(1096058143);
+emit_32(3248242714);
+emit_32(3276992545);
+emit_32(1098098567);
+emit_32(3248242714);
+emit_32(3276736496);
+emit_32(1099576902);
+emit_32(3248242714);
+emit_32(3276480512);
+emit_32(1100562563);
+emit_32(3248242714);
+emit_32(3276224528);
+emit_32(1101167224);
+emit_32(3248242714);
+emit_32(3275968545);
+emit_32(1102019088);
+emit_32(3248242714);
+emit_32(3275712496);
+emit_32(1103025878);
+emit_32(3248242714);
+emit_32(3275456512);
+emit_32(1104220258);
+emit_32(3248242714);
+emit_32(3275200528);
+emit_32(1104981944);
+emit_32(3248242714);
+emit_32(3274944545);
+emit_32(1105491132);
+emit_32(3248242714);
+emit_32(3274688496);
+emit_32(1105710495);
+emit_32(3248242714);
+emit_32(3274432512);
+emit_32(1106232423);
+emit_32(3248242714);
+emit_32(3274176528);
+emit_32(1106909961);
+emit_32(3248242714);
+emit_32(3273920545);
+emit_32(1107031858);
+emit_32(3248242714);
+emit_32(3273664496);
+emit_32(1107735426);
+emit_32(3248242714);
+emit_32(3273408512);
+emit_32(1108117868);
+emit_32(3248242714);
+emit_32(3273152528);
+emit_32(1108098862);
+emit_32(3248242714);
+emit_32(3272896545);
+emit_32(1108068716);
+emit_32(3248242714);
+emit_32(3272640496);
+emit_32(1108110003);
+emit_32(3248242714);
+emit_32(3272384512);
+emit_32(1108104761);
+emit_32(3248242714);
+emit_32(3272128528);
+emit_32(1108024125);
+emit_32(3248242714);
+emit_32(3271872545);
+emit_32(1107776111);
+emit_32(3248242714);
+emit_32(3271616496);
+emit_32(1107637384);
+emit_32(3248242714);
+emit_32(3271163904);
+emit_32(1107446360);
+emit_32(3248242714);
+emit_32(3270651937);
+emit_32(1107041400);
+emit_32(3248242714);
+emit_32(3270139970);
+emit_32(1107011882);
+emit_32(3248242714);
+emit_32(3269627871);
+emit_32(1107115167);
+emit_32(3248242714);
+emit_32(3269115904);
+emit_32(1107418494);
+emit_32(3248242714);
+emit_32(3268603937);
+emit_32(1107457422);
+emit_32(3248242714);
+emit_32(3268091970);
+emit_32(1106904613);
+emit_32(3248242714);
+emit_32(3267579911);
+emit_32(1106031411);
+emit_32(3248242714);
+emit_32(3267067904);
+emit_32(1105454223);
+emit_32(3248242714);
+emit_32(3266555911);
+emit_32(1105778967);
+emit_32(3248242714);
+emit_32(3266043904);
+emit_32(1105570929);
+emit_32(3248242714);
+emit_32(3265531911);
+emit_32(1104914258);
+emit_32(3248242714);
+emit_32(3265019904);
+emit_32(1104424468);
+emit_32(3248242714);
+emit_32(3264507911);
+emit_32(1104545527);
+emit_32(3248242714);
+emit_32(3263995904);
+emit_32(1104296280);
+emit_32(3248242714);
+emit_32(3263483911);
+emit_32(1103990568);
+emit_32(3248242714);
+emit_32(3262775296);
+emit_32(1104013427);
+emit_32(3248242714);
+emit_32(3261751309);
+emit_32(1104087142);
+emit_32(3248242714);
+emit_32(3260727296);
+emit_32(1104895017);
+emit_32(3248242714);
+emit_32(3259703309);
+emit_32(1105764129);
+emit_32(3248242714);
+emit_32(3258679296);
+emit_32(1106780357);
+emit_32(3248242714);
+emit_32(3257655309);
+emit_32(1107436005);
+emit_32(3248242714);
+emit_32(3256631296);
+emit_32(1107614237);
+emit_32(3248242714);
+emit_32(3255607309);
+emit_32(1107805785);
+emit_32(3248242714);
+emit_32(3254386688);
+emit_32(1108259294);
+emit_32(3248242714);
+emit_32(3252338714);
+emit_32(1108838738);
+emit_32(3248242714);
+emit_32(3250290688);
+emit_32(1109532056);
+emit_32(3248242714);
+emit_32(3248242714);
+emit_32(1110357731);
+emit_32(3248242714);
+emit_32(3245998080);
+emit_32(1111305617);
+emit_32(3248242714);
+emit_32(3241902132);
+emit_32(1111938354);
+emit_32(3248242714);
+emit_32(3237609472);
+emit_32(1112310678);
+emit_32(3248242714);
+emit_32(3229220864);
+emit_32(1112422010);
+emit_32(3248242714);
+emit_32(0);
+emit_32(1112626745);
+emit_32(3248242714);
+emit_32(1081737216);
+emit_32(1112566084);
+emit_32(3248242714);
+emit_32(3279552512);
+emit_32(1065800916);
+emit_32(3250290688);
+emit_32(3279296528);
+emit_32(1067728450);
+emit_32(3250290688);
+emit_32(3279040545);
+emit_32(1079534242);
+emit_32(3250290688);
+emit_32(3278784496);
+emit_32(1083207466);
+emit_32(3250290688);
+emit_32(3278528512);
+emit_32(1085554830);
+emit_32(3250290688);
+emit_32(3278272528);
+emit_32(1087362784);
+emit_32(3250290688);
+emit_32(3278016545);
+emit_32(1089916067);
+emit_32(3250290688);
+emit_32(3277760496);
+emit_32(1091396866);
+emit_32(3250290688);
+emit_32(3277504512);
+emit_32(1093035832);
+emit_32(3250290688);
+emit_32(3277248528);
+emit_32(1094508767);
+emit_32(3250290688);
+emit_32(3276992545);
+emit_32(1096595328);
+emit_32(3250290688);
+emit_32(3276736496);
+emit_32(1099173252);
+emit_32(3250290688);
+emit_32(3276480512);
+emit_32(1100269748);
+emit_32(3250290688);
+emit_32(3276224528);
+emit_32(1101165704);
+emit_32(3250290688);
+emit_32(3275968545);
+emit_32(1101889169);
+emit_32(3250290688);
+emit_32(3275712496);
+emit_32(1102356467);
+emit_32(3250290688);
+emit_32(3275456512);
+emit_32(1103641549);
+emit_32(3250290688);
+emit_32(3275200528);
+emit_32(1104432910);
+emit_32(3250290688);
+emit_32(3274944545);
+emit_32(1104777157);
+emit_32(3250290688);
+emit_32(3274688496);
+emit_32(1105410025);
+emit_32(3250290688);
+emit_32(3274432512);
+emit_32(1105737233);
+emit_32(3250290688);
+emit_32(3274176528);
+emit_32(1106211085);
+emit_32(3250290688);
+emit_32(3273920545);
+emit_32(1107190979);
+emit_32(3250290688);
+emit_32(3273664496);
+emit_32(1107686903);
+emit_32(3250290688);
+emit_32(3273408512);
+emit_32(1107933449);
+emit_32(3250290688);
+emit_32(3273152528);
+emit_32(1107858896);
+emit_32(3250290688);
+emit_32(3272896545);
+emit_32(1107712567);
+emit_32(3250290688);
+emit_32(3272640496);
+emit_32(1107834044);
+emit_32(3250290688);
+emit_32(3272384512);
+emit_32(1107745256);
+emit_32(3250290688);
+emit_32(3272128528);
+emit_32(1107612821);
+emit_32(3250290688);
+emit_32(3271872545);
+emit_32(1107307240);
+emit_32(3250290688);
+emit_32(3271616496);
+emit_32(1106953581);
+emit_32(3250290688);
+emit_32(3271163904);
+emit_32(1106958195);
+emit_32(3250290688);
+emit_32(3270651937);
+emit_32(1106599635);
+emit_32(3250290688);
+emit_32(3270139970);
+emit_32(1106321238);
+emit_32(3250290688);
+emit_32(3269627871);
+emit_32(1106339588);
+emit_32(3250290688);
+emit_32(3269115904);
+emit_32(1106571795);
+emit_32(3250290688);
+emit_32(3268603937);
+emit_32(1106917982);
+emit_32(3250290688);
+emit_32(3268091970);
+emit_32(1106501383);
+emit_32(3250290688);
+emit_32(3267579911);
+emit_32(1105718516);
+emit_32(3250290688);
+emit_32(3267067904);
+emit_32(1105903065);
+emit_32(3250290688);
+emit_32(3266555911);
+emit_32(1106013795);
+emit_32(3250290688);
+emit_32(3266043904);
+emit_32(1105949517);
+emit_32(3250290688);
+emit_32(3265531911);
+emit_32(1105206863);
+emit_32(3250290688);
+emit_32(3265019904);
+emit_32(1104861934);
+emit_32(3250290688);
+emit_32(3264507911);
+emit_32(1104599790);
+emit_32(3250290688);
+emit_32(3263995904);
+emit_32(1103950932);
+emit_32(3250290688);
+emit_32(3263483911);
+emit_32(1104055527);
+emit_32(3250290688);
+emit_32(3262775296);
+emit_32(1103866364);
+emit_32(3250290688);
+emit_32(3261751309);
+emit_32(1104419383);
+emit_32(3250290688);
+emit_32(3260727296);
+emit_32(1104811026);
+emit_32(3250290688);
+emit_32(3259703309);
+emit_32(1105456634);
+emit_32(3250290688);
+emit_32(3258679296);
+emit_32(1106791681);
+emit_32(3250290688);
+emit_32(3257655309);
+emit_32(1107583068);
+emit_32(3250290688);
+emit_32(3256631296);
+emit_32(1107949860);
+emit_32(3250290688);
+emit_32(3255607309);
+emit_32(1108658278);
+emit_32(3250290688);
+emit_32(3254386688);
+emit_32(1109252165);
+emit_32(3250290688);
+emit_32(3252338714);
+emit_32(1109776086);
+emit_32(3250290688);
+emit_32(3250290688);
+emit_32(1110334321);
+emit_32(3250290688);
+emit_32(3248242714);
+emit_32(1111177403);
+emit_32(3250290688);
+emit_32(3245998080);
+emit_32(1111862202);
+emit_32(3250290688);
+emit_32(3241902132);
+emit_32(1112485580);
+emit_32(3250290688);
+emit_32(3237609472);
+emit_32(1112835516);
+emit_32(3250290688);
+emit_32(3229220864);
+emit_32(1112928997);
+emit_32(3250290688);
+emit_32(0);
+emit_32(1112967689);
+emit_32(3250290688);
+emit_32(1081737216);
+emit_32(1113150456);
+emit_32(3250290688);
+emit_32(3279552512);
+emit_32(1065811150);
+emit_32(3252338714);
+emit_32(3279296528);
+emit_32(1074401378);
+emit_32(3252338714);
+emit_32(3279040545);
+emit_32(1078638548);
+emit_32(3252338714);
+emit_32(3278784496);
+emit_32(1082498734);
+emit_32(3252338714);
+emit_32(3278528512);
+emit_32(1084586134);
+emit_32(3252338714);
+emit_32(3278272528);
+emit_32(1087624907);
+emit_32(3252338714);
+emit_32(3278016545);
+emit_32(1088961422);
+emit_32(3252338714);
+emit_32(3277760496);
+emit_32(1091843412);
+emit_32(3252338714);
+emit_32(3277504512);
+emit_32(1093413739);
+emit_32(3252338714);
+emit_32(3277248528);
+emit_32(1094395206);
+emit_32(3252338714);
+emit_32(3276992545);
+emit_32(1095806484);
+emit_32(3252338714);
+emit_32(3276736496);
+emit_32(1097929536);
+emit_32(3252338714);
+emit_32(3276480512);
+emit_32(1099744988);
+emit_32(3252338714);
+emit_32(3276224528);
+emit_32(1100647340);
+emit_32(3252338714);
+emit_32(3275968545);
+emit_32(1101240992);
+emit_32(3252338714);
+emit_32(3275712496);
+emit_32(1101372693);
+emit_32(3252338714);
+emit_32(3275456512);
+emit_32(1102475638);
+emit_32(3252338714);
+emit_32(3275200528);
+emit_32(1103490240);
+emit_32(3252338714);
+emit_32(3274944545);
+emit_32(1104043416);
+emit_32(3252338714);
+emit_32(3274688496);
+emit_32(1105440696);
+emit_32(3252338714);
+emit_32(3274432512);
+emit_32(1105987161);
+emit_32(3252338714);
+emit_32(3274176528);
+emit_32(1106185395);
+emit_32(3252338714);
+emit_32(3273920545);
+emit_32(1107031700);
+emit_32(3252338714);
+emit_32(3273664496);
+emit_32(1107454932);
+emit_32(3252338714);
+emit_32(3273408512);
+emit_32(1107539368);
+emit_32(3252338714);
+emit_32(3273152528);
+emit_32(1107466152);
+emit_32(3252338714);
+emit_32(3272896545);
+emit_32(1107413067);
+emit_32(3252338714);
+emit_32(3272640496);
+emit_32(1107297960);
+emit_32(3252338714);
+emit_32(3272384512);
+emit_32(1107173310);
+emit_32(3252338714);
+emit_32(3272128528);
+emit_32(1107130371);
+emit_32(3252338714);
+emit_32(3271872545);
+emit_32(1106771653);
+emit_32(3252338714);
+emit_32(3271616496);
+emit_32(1106460803);
+emit_32(3252338714);
+emit_32(3271163904);
+emit_32(1106115455);
+emit_32(3252338714);
+emit_32(3270651937);
+emit_32(1105926344);
+emit_32(3252338714);
+emit_32(3270139970);
+emit_32(1105546602);
+emit_32(3252338714);
+emit_32(3269627871);
+emit_32(1105660477);
+emit_32(3252338714);
+emit_32(3269115904);
+emit_32(1105920367);
+emit_32(3252338714);
+emit_32(3268603937);
+emit_32(1106109897);
+emit_32(3252338714);
+emit_32(3268091970);
+emit_32(1105672798);
+emit_32(3252338714);
+emit_32(3267579911);
+emit_32(1105767537);
+emit_32(3252338714);
+emit_32(3267067904);
+emit_32(1105707139);
+emit_32(3252338714);
+emit_32(3266555911);
+emit_32(1105871241);
+emit_32(3252338714);
+emit_32(3266043904);
+emit_32(1105955599);
+emit_32(3252338714);
+emit_32(3265531911);
+emit_32(1105848435);
+emit_32(3252338714);
+emit_32(3265019904);
+emit_32(1105348264);
+emit_32(3252338714);
+emit_32(3264507911);
+emit_32(1104644040);
+emit_32(3252338714);
+emit_32(3263995904);
+emit_32(1104354371);
+emit_32(3252338714);
+emit_32(3263483911);
+emit_32(1104366902);
+emit_32(3252338714);
+emit_32(3262775296);
+emit_32(1104900103);
+emit_32(3252338714);
+emit_32(3261751309);
+emit_32(1105214885);
+emit_32(3252338714);
+emit_32(3260727296);
+emit_32(1105392147);
+emit_32(3252338714);
+emit_32(3259703309);
+emit_32(1106490111);
+emit_32(3252338714);
+emit_32(3258679296);
+emit_32(1107465837);
+emit_32(3252338714);
+emit_32(3257655309);
+emit_32(1108021897);
+emit_32(3252338714);
+emit_32(3256631296);
+emit_32(1108703366);
+emit_32(3252338714);
+emit_32(3255607309);
+emit_32(1109418128);
+emit_32(3252338714);
+emit_32(3254386688);
+emit_32(1110033669);
+emit_32(3252338714);
+emit_32(3252338714);
+emit_32(1110598065);
+emit_32(3252338714);
+emit_32(3250290688);
+emit_32(1111530878);
+emit_32(3252338714);
+emit_32(3248242714);
+emit_32(1112167127);
+emit_32(3252338714);
+emit_32(3245998080);
+emit_32(1112747776);
+emit_32(3252338714);
+emit_32(3241902132);
+emit_32(1113057631);
+emit_32(3252338714);
+emit_32(3237609472);
+emit_32(1113395220);
+emit_32(3252338714);
+emit_32(3229220864);
+emit_32(1113520262);
+emit_32(3252338714);
+emit_32(0);
+emit_32(1113746230);
+emit_32(3252338714);
+emit_32(1081737216);
+emit_32(1113988085);
+emit_32(3252338714);
+emit_32(3279552512);
+emit_32(1073007234);
+emit_32(3254386688);
+emit_32(3279296528);
+emit_32(1071855058);
+emit_32(3254386688);
+emit_32(3279040545);
+emit_32(1077504995);
+emit_32(3254386688);
+emit_32(3278784496);
+emit_32(1083853809);
+emit_32(3254386688);
+emit_32(3278528512);
+emit_32(1085433090);
+emit_32(3254386688);
+emit_32(3278272528);
+emit_32(1086653926);
+emit_32(3254386688);
+emit_32(3278016545);
+emit_32(1089328256);
+emit_32(3254386688);
+emit_32(3277760496);
+emit_32(1091680359);
+emit_32(3254386688);
+emit_32(3277504512);
+emit_32(1093386371);
+emit_32(3254386688);
+emit_32(3277248528);
+emit_32(1094430019);
+emit_32(3254386688);
+emit_32(3276992545);
+emit_32(1095762759);
+emit_32(3254386688);
+emit_32(3276736496);
+emit_32(1097278685);
+emit_32(3254386688);
+emit_32(3276480512);
+emit_32(1099307942);
+emit_32(3254386688);
+emit_32(3276224528);
+emit_32(1100328206);
+emit_32(3254386688);
+emit_32(3275968545);
+emit_32(1100510396);
+emit_32(3254386688);
+emit_32(3275712496);
+emit_32(1100754190);
+emit_32(3254386688);
+emit_32(3275456512);
+emit_32(1101542300);
+emit_32(3254386688);
+emit_32(3275200528);
+emit_32(1102303461);
+emit_32(3254386688);
+emit_32(3274944545);
+emit_32(1103597719);
+emit_32(3254386688);
+emit_32(3274688496);
+emit_32(1104967316);
+emit_32(3254386688);
+emit_32(3274432512);
+emit_32(1105690205);
+emit_32(3254386688);
+emit_32(3274176528);
+emit_32(1106034714);
+emit_32(3254386688);
+emit_32(3273920545);
+emit_32(1106220994);
+emit_32(3254386688);
+emit_32(3273664496);
+emit_32(1106826651);
+emit_32(3254386688);
+emit_32(3273408512);
+emit_32(1107242779);
+emit_32(3254386688);
+emit_32(3273152528);
+emit_32(1107302810);
+emit_32(3254386688);
+emit_32(3272896545);
+emit_32(1107370915);
+emit_32(3254386688);
+emit_32(3272640496);
+emit_32(1107004385);
+emit_32(3254386688);
+emit_32(3272384512);
+emit_32(1106217429);
+emit_32(3254386688);
+emit_32(3272128528);
+emit_32(1106380587);
+emit_32(3254386688);
+emit_32(3271872545);
+emit_32(1106492418);
+emit_32(3254386688);
+emit_32(3271616496);
+emit_32(1106313793);
+emit_32(3254386688);
+emit_32(3271163904);
+emit_32(1105860336);
+emit_32(3254386688);
+emit_32(3270651937);
+emit_32(1104962965);
+emit_32(3254386688);
+emit_32(3270139970);
+emit_32(1104709367);
+emit_32(3254386688);
+emit_32(3269627871);
+emit_32(1104850924);
+emit_32(3254386688);
+emit_32(3269115904);
+emit_32(1105116162);
+emit_32(3254386688);
+emit_32(3268603937);
+emit_32(1105713640);
+emit_32(3254386688);
+emit_32(3268091970);
+emit_32(1105431311);
+emit_32(3254386688);
+emit_32(3267579911);
+emit_32(1105504921);
+emit_32(3254386688);
+emit_32(3267067904);
+emit_32(1105722658);
+emit_32(3254386688);
+emit_32(3266555911);
+emit_32(1106419279);
+emit_32(3254386688);
+emit_32(3266043904);
+emit_32(1106556905);
+emit_32(3254386688);
+emit_32(3265531911);
+emit_32(1106183088);
+emit_32(3254386688);
+emit_32(3265019904);
+emit_32(1105580681);
+emit_32(3254386688);
+emit_32(3264507911);
+emit_32(1105335366);
+emit_32(3254386688);
+emit_32(3263995904);
+emit_32(1104986348);
+emit_32(3254386688);
+emit_32(3263483911);
+emit_32(1105341763);
+emit_32(3254386688);
+emit_32(3262775296);
+emit_32(1105698541);
+emit_32(3254386688);
+emit_32(3261751309);
+emit_32(1105960737);
+emit_32(3254386688);
+emit_32(3260727296);
+emit_32(1106331828);
+emit_32(3254386688);
+emit_32(3259703309);
+emit_32(1107459886);
+emit_32(3254386688);
+emit_32(3258679296);
+emit_32(1108153677);
+emit_32(3254386688);
+emit_32(3257655309);
+emit_32(1108782508);
+emit_32(3254386688);
+emit_32(3256631296);
+emit_32(1109432127);
+emit_32(3254386688);
+emit_32(3255607309);
+emit_32(1110052097);
+emit_32(3254386688);
+emit_32(3254386688);
+emit_32(1110875832);
+emit_32(3254386688);
+emit_32(3252338714);
+emit_32(1111641214);
+emit_32(3254386688);
+emit_32(3250290688);
+emit_32(1112331230);
+emit_32(3254386688);
+emit_32(3248242714);
+emit_32(1112948054);
+emit_32(3254386688);
+emit_32(3245998080);
+emit_32(1113423243);
+emit_32(3254386688);
+emit_32(3241902132);
+emit_32(1113710579);
+emit_32(3254386688);
+emit_32(3237609472);
+emit_32(1113669763);
+emit_32(3254386688);
+emit_32(3229220864);
+emit_32(1114121516);
+emit_32(3254386688);
+emit_32(0);
+emit_32(1114484769);
+emit_32(3254386688);
+emit_32(1081737216);
+emit_32(1114484349);
+emit_32(3254386688);
+emit_32(3279552512);
+emit_32(1072117538);
+emit_32(3255607309);
+emit_32(3279296528);
+emit_32(1066548005);
+emit_32(3255607309);
+emit_32(3279040545);
+emit_32(1074090329);
+emit_32(3255607309);
+emit_32(3278784496);
+emit_32(1080727353);
+emit_32(3255607309);
+emit_32(3278528512);
+emit_32(1083163300);
+emit_32(3255607309);
+emit_32(3278272528);
+emit_32(1085569447);
+emit_32(3255607309);
+emit_32(3278016545);
+emit_32(1089130264);
+emit_32(3255607309);
+emit_32(3277760496);
+emit_32(1091726821);
+emit_32(3255607309);
+emit_32(3277504512);
+emit_32(1092664741);
+emit_32(3255607309);
+emit_32(3277248528);
+emit_32(1094453402);
+emit_32(3255607309);
+emit_32(3276992545);
+emit_32(1095438854);
+emit_32(3255607309);
+emit_32(3276736496);
+emit_32(1096833145);
+emit_32(3255607309);
+emit_32(3276480512);
+emit_32(1097840722);
+emit_32(3255607309);
+emit_32(3276224528);
+emit_32(1099027500);
+emit_32(3255607309);
+emit_32(3275968545);
+emit_32(1099544815);
+emit_32(3255607309);
+emit_32(3275712496);
+emit_32(1099992505);
+emit_32(3255607309);
+emit_32(3275456512);
+emit_32(1100930351);
+emit_32(3255607309);
+emit_32(3275200528);
+emit_32(1102195720);
+emit_32(3255607309);
+emit_32(3274944545);
+emit_32(1103964773);
+emit_32(3255607309);
+emit_32(3274688496);
+emit_32(1105022262);
+emit_32(3255607309);
+emit_32(3274432512);
+emit_32(1105539419);
+emit_32(3255607309);
+emit_32(3274176528);
+emit_32(1106031097);
+emit_32(3255607309);
+emit_32(3273920545);
+emit_32(1106016050);
+emit_32(3255607309);
+emit_32(3273664496);
+emit_32(1106647135);
+emit_32(3255607309);
+emit_32(3273408512);
+emit_32(1106967003);
+emit_32(3255607309);
+emit_32(3273152528);
+emit_32(1107003861);
+emit_32(3255607309);
+emit_32(3272896545);
+emit_32(1107169273);
+emit_32(3255607309);
+emit_32(3272640496);
+emit_32(1106842170);
+emit_32(3255607309);
+emit_32(3272384512);
+emit_32(1105904481);
+emit_32(3255607309);
+emit_32(3272128528);
+emit_32(1105234493);
+emit_32(3255607309);
+emit_32(3271872545);
+emit_32(1105294944);
+emit_32(3255607309);
+emit_32(3271616496);
+emit_32(1105337988);
+emit_32(3255607309);
+emit_32(3271163904);
+emit_32(1104796765);
+emit_32(3255607309);
+emit_32(3270651937);
+emit_32(1104285113);
+emit_32(3255607309);
+emit_32(3270139970);
+emit_32(1103883875);
+emit_32(3255607309);
+emit_32(3269627871);
+emit_32(1103911662);
+emit_32(3255607309);
+emit_32(3269115904);
+emit_32(1104082528);
+emit_32(3255607309);
+emit_32(3268603937);
+emit_32(1105166231);
+emit_32(3255607309);
+emit_32(3268091970);
+emit_32(1105162718);
+emit_32(3255607309);
+emit_32(3267579911);
+emit_32(1105161460);
+emit_32(3255607309);
+emit_32(3267067904);
+emit_32(1105681397);
+emit_32(3255607309);
+emit_32(3266555911);
+emit_32(1106322129);
+emit_32(3255607309);
+emit_32(3266043904);
+emit_32(1106430080);
+emit_32(3255607309);
+emit_32(3265531911);
+emit_32(1106116084);
+emit_32(3255607309);
+emit_32(3265019904);
+emit_32(1105862643);
+emit_32(3255607309);
+emit_32(3264507911);
+emit_32(1105647947);
+emit_32(3255607309);
+emit_32(3263995904);
+emit_32(1105573655);
+emit_32(3255607309);
+emit_32(3263483911);
+emit_32(1105891374);
+emit_32(3255607309);
+emit_32(3262775296);
+emit_32(1106077339);
+emit_32(3255607309);
+emit_32(3261751309);
+emit_32(1106805889);
+emit_32(3255607309);
+emit_32(3260727296);
+emit_32(1107381269);
+emit_32(3255607309);
+emit_32(3259703309);
+emit_32(1107945325);
+emit_32(3255607309);
+emit_32(3258679296);
+emit_32(1108632771);
+emit_32(3255607309);
+emit_32(3257655309);
+emit_32(1109426989);
+emit_32(3255607309);
+emit_32(3256631296);
+emit_32(1110034927);
+emit_32(3255607309);
+emit_32(3255607309);
+emit_32(1110881652);
+emit_32(3255607309);
+emit_32(3254386688);
+emit_32(1111900946);
+emit_32(3255607309);
+emit_32(3252338714);
+emit_32(1112428590);
+emit_32(3255607309);
+emit_32(3250290688);
+emit_32(1112879923);
+emit_32(3255607309);
+emit_32(3248242714);
+emit_32(1113433755);
+emit_32(3255607309);
+emit_32(3245998080);
+emit_32(1113801412);
+emit_32(3255607309);
+emit_32(3241902132);
+emit_32(1113823248);
+emit_32(3255607309);
+emit_32(3237609472);
+emit_32(1114004154);
+emit_32(3255607309);
+emit_32(3229220864);
+emit_32(1114356344);
+emit_32(3255607309);
+emit_32(0);
+emit_32(1114696502);
+emit_32(3255607309);
+emit_32(1081737216);
+emit_32(1114694274);
+emit_32(3255607309);
+emit_32(3279552512);
+emit_32(1076255680);
+emit_32(3256631296);
+emit_32(3279296528);
+emit_32(1069990271);
+emit_32(3256631296);
+emit_32(3279040545);
+emit_32(1068896816);
+emit_32(3256631296);
+emit_32(3278784496);
+emit_32(1077023364);
+emit_32(3256631296);
+emit_32(3278528512);
+emit_32(1081539790);
+emit_32(3256631296);
+emit_32(3278272528);
+emit_32(1084255287);
+emit_32(3256631296);
+emit_32(3278016545);
+emit_32(1087513968);
+emit_32(3256631296);
+emit_32(3277760496);
+emit_32(1090514049);
+emit_32(3256631296);
+emit_32(3277504512);
+emit_32(1092329323);
+emit_32(3256631296);
+emit_32(3277248528);
+emit_32(1094687130);
+emit_32(3256631296);
+emit_32(3276992545);
+emit_32(1095553044);
+emit_32(3256631296);
+emit_32(3276736496);
+emit_32(1096485647);
+emit_32(3256631296);
+emit_32(3276480512);
+emit_32(1097021994);
+emit_32(3256631296);
+emit_32(3276224528);
+emit_32(1097731565);
+emit_32(3256631296);
+emit_32(3275968545);
+emit_32(1099236114);
+emit_32(3256631296);
+emit_32(3275712496);
+emit_32(1099466539);
+emit_32(3256631296);
+emit_32(3275456512);
+emit_32(1100645820);
+emit_32(3256631296);
+emit_32(3275200528);
+emit_32(1102788270);
+emit_32(3256631296);
+emit_32(3274944545);
+emit_32(1104259213);
+emit_32(3256631296);
+emit_32(3274688496);
+emit_32(1105157161);
+emit_32(3256631296);
+emit_32(3274432512);
+emit_32(1105746199);
+emit_32(3256631296);
+emit_32(3274176528);
+emit_32(1105646689);
+emit_32(3256631296);
+emit_32(3273920545);
+emit_32(1106061296);
+emit_32(3256631296);
+emit_32(3273664496);
+emit_32(1106358777);
+emit_32(3256631296);
+emit_32(3273408512);
+emit_32(1106493728);
+emit_32(3256631296);
+emit_32(3273152528);
+emit_32(1106565556);
+emit_32(3256631296);
+emit_32(3272896545);
+emit_32(1106704649);
+emit_32(3256631296);
+emit_32(3272640496);
+emit_32(1106418231);
+emit_32(3256631296);
+emit_32(3272384512);
+emit_32(1105930014);
+emit_32(3256631296);
+emit_32(3272128528);
+emit_32(1105073589);
+emit_32(3256631296);
+emit_32(3271872545);
+emit_32(1104573104);
+emit_32(3256631296);
+emit_32(3271616496);
+emit_32(1104491368);
+emit_32(3256631296);
+emit_32(3271163904);
+emit_32(1103992822);
+emit_32(3256631296);
+emit_32(3270651937);
+emit_32(1103347004);
+emit_32(3256631296);
+emit_32(3270139970);
+emit_32(1103160882);
+emit_32(3256631296);
+emit_32(3269627871);
+emit_32(1103581256);
+emit_32(3256631296);
+emit_32(3269115904);
+emit_32(1103924874);
+emit_32(3256631296);
+emit_32(3268603937);
+emit_32(1103872184);
+emit_32(3256631296);
+emit_32(3268091970);
+emit_32(1104525237);
+emit_32(3256631296);
+emit_32(3267579911);
+emit_32(1104546785);
+emit_32(3256631296);
+emit_32(3267067904);
+emit_32(1105161250);
+emit_32(3256631296);
+emit_32(3266555911);
+emit_32(1105731204);
+emit_32(3256631296);
+emit_32(3266043904);
+emit_32(1105909881);
+emit_32(3256631296);
+emit_32(3265531911);
+emit_32(1106044990);
+emit_32(3256631296);
+emit_32(3265019904);
+emit_32(1105972009);
+emit_32(3256631296);
+emit_32(3264507911);
+emit_32(1105900444);
+emit_32(3256631296);
+emit_32(3263995904);
+emit_32(1106042264);
+emit_32(3256631296);
+emit_32(3263483911);
+emit_32(1105966347);
+emit_32(3256631296);
+emit_32(3262775296);
+emit_32(1106865029);
+emit_32(3256631296);
+emit_32(3261751309);
+emit_32(1107485707);
+emit_32(3256631296);
+emit_32(3260727296);
+emit_32(1107879081);
+emit_32(3256631296);
+emit_32(3259703309);
+emit_32(1108393643);
+emit_32(3256631296);
+emit_32(3258679296);
+emit_32(1109055845);
+emit_32(3256631296);
+emit_32(3257655309);
+emit_32(1109718362);
+emit_32(3256631296);
+emit_32(3256631296);
+emit_32(1110595522);
+emit_32(3256631296);
+emit_32(3255607309);
+emit_32(1111233213);
+emit_32(3256631296);
+emit_32(3254386688);
+emit_32(1112275236);
+emit_32(3256631296);
+emit_32(3252338714);
+emit_32(1112879058);
+emit_32(3256631296);
+emit_32(3250290688);
+emit_32(1113378678);
+emit_32(3256631296);
+emit_32(3248242714);
+emit_32(1113688847);
+emit_32(3256631296);
+emit_32(3245998080);
+emit_32(1114075693);
+emit_32(3256631296);
+emit_32(3241902132);
+emit_32(1114046857);
+emit_32(3256631296);
+emit_32(3237609472);
+emit_32(1114323576);
+emit_32(3256631296);
+emit_32(3229220864);
+emit_32(1114565509);
+emit_32(3256631296);
+emit_32(0);
+emit_32(1114610047);
+emit_32(3256631296);
+emit_32(1081737216);
+emit_32(1114612538);
+emit_32(3256631296);
+emit_32(3279552512);
+emit_32(1076804295);
+emit_32(3257655309);
+emit_32(3279296528);
+emit_32(1073151266);
+emit_32(3257655309);
+emit_32(3279040545);
+emit_32(1073776846);
+emit_32(3257655309);
+emit_32(3278784496);
+emit_32(1078617493);
+emit_32(3257655309);
+emit_32(3278528512);
+emit_32(1079412439);
+emit_32(3257655309);
+emit_32(3278272528);
+emit_32(1083194359);
+emit_32(3257655309);
+emit_32(3278016545);
+emit_32(1086932302);
+emit_32(3257655309);
+emit_32(3277760496);
+emit_32(1090303516);
+emit_32(3257655309);
+emit_32(3277504512);
+emit_32(1091865904);
+emit_32(3257655309);
+emit_32(3277248528);
+emit_32(1094115865);
+emit_32(3257655309);
+emit_32(3276992545);
+emit_32(1095463705);
+emit_32(3257655309);
+emit_32(3276736496);
+emit_32(1096420531);
+emit_32(3257655309);
+emit_32(3276480512);
+emit_32(1097432511);
+emit_32(3257655309);
+emit_32(3276224528);
+emit_32(1097662883);
+emit_32(3257655309);
+emit_32(3275968545);
+emit_32(1098694263);
+emit_32(3257655309);
+emit_32(3275712496);
+emit_32(1099094871);
+emit_32(3257655309);
+emit_32(3275456512);
+emit_32(1101139542);
+emit_32(3257655309);
+emit_32(3275200528);
+emit_32(1102734583);
+emit_32(3257655309);
+emit_32(3274944545);
+emit_32(1103866521);
+emit_32(3257655309);
+emit_32(3274688496);
+emit_32(1104826178);
+emit_32(3257655309);
+emit_32(3274432512);
+emit_32(1105191869);
+emit_32(3257655309);
+emit_32(3274176528);
+emit_32(1105342759);
+emit_32(3257655309);
+emit_32(3273920545);
+emit_32(1105684804);
+emit_32(3257655309);
+emit_32(3273664496);
+emit_32(1105820647);
+emit_32(3257655309);
+emit_32(3273408512);
+emit_32(1106189903);
+emit_32(3257655309);
+emit_32(3273152528);
+emit_32(1105981447);
+emit_32(3257655309);
+emit_32(3272896545);
+emit_32(1105858134);
+emit_32(3257655309);
+emit_32(3272640496);
+emit_32(1105678146);
+emit_32(3257655309);
+emit_32(3272384512);
+emit_32(1104998826);
+emit_32(3257655309);
+emit_32(3272128528);
+emit_32(1104598218);
+emit_32(3257655309);
+emit_32(3271872545);
+emit_32(1104297643);
+emit_32(3257655309);
+emit_32(3271616496);
+emit_32(1103698487);
+emit_32(3257655309);
+emit_32(3271163904);
+emit_32(1103368290);
+emit_32(3257655309);
+emit_32(3270651937);
+emit_32(1103021107);
+emit_32(3257655309);
+emit_32(3270139970);
+emit_32(1102840332);
+emit_32(3257655309);
+emit_32(3269627871);
+emit_32(1103133042);
+emit_32(3257655309);
+emit_32(3269115904);
+emit_32(1103173570);
+emit_32(3257655309);
+emit_32(3268603937);
+emit_32(1103141274);
+emit_32(3257655309);
+emit_32(3268091970);
+emit_32(1103365407);
+emit_32(3257655309);
+emit_32(3267579911);
+emit_32(1103545342);
+emit_32(3257655309);
+emit_32(3267067904);
+emit_32(1104414140);
+emit_32(3257655309);
+emit_32(3266555911);
+emit_32(1104666532);
+emit_32(3257655309);
+emit_32(3266043904);
+emit_32(1105496480);
+emit_32(3257655309);
+emit_32(3265531911);
+emit_32(1105715423);
+emit_32(3257655309);
+emit_32(3265019904);
+emit_32(1105801196);
+emit_32(3257655309);
+emit_32(3264507911);
+emit_32(1105657070);
+emit_32(3257655309);
+emit_32(3263995904);
+emit_32(1106199708);
+emit_32(3257655309);
+emit_32(3263483911);
+emit_32(1107111182);
+emit_32(3257655309);
+emit_32(3262775296);
+emit_32(1107520468);
+emit_32(3257655309);
+emit_32(3261751309);
+emit_32(1107938194);
+emit_32(3257655309);
+emit_32(3260727296);
+emit_32(1108285168);
+emit_32(3257655309);
+emit_32(3259703309);
+emit_32(1109004937);
+emit_32(3257655309);
+emit_32(3258679296);
+emit_32(1109555675);
+emit_32(3257655309);
+emit_32(3257655309);
+emit_32(1110079124);
+emit_32(3257655309);
+emit_32(3256631296);
+emit_32(1110954659);
+emit_32(3257655309);
+emit_32(3255607309);
+emit_32(1111702136);
+emit_32(3257655309);
+emit_32(3254386688);
+emit_32(1112419205);
+emit_32(3257655309);
+emit_32(3252338714);
+emit_32(1113101723);
+emit_32(3257655309);
+emit_32(3250290688);
+emit_32(1113769509);
+emit_32(3257655309);
+emit_32(3248242714);
+emit_32(1113942393);
+emit_32(3257655309);
+emit_32(3245998080);
+emit_32(1114187760);
+emit_32(3257655309);
+emit_32(3241902132);
+emit_32(1114233451);
+emit_32(3257655309);
+emit_32(3237609472);
+emit_32(1114375009);
+emit_32(3257655309);
+emit_32(3229220864);
+emit_32(1114534052);
+emit_32(3257655309);
+emit_32(0);
+emit_32(1114534445);
+emit_32(3257655309);
+emit_32(1081737216);
+emit_32(1114510642);
+emit_32(3257655309);
+emit_32(3279552512);
+emit_32(1073972469);
+emit_32(3258679296);
+emit_32(3279296528);
+emit_32(1069063330);
+emit_32(3258679296);
+emit_32(3279040545);
+emit_32(1073401750);
+emit_32(3258679296);
+emit_32(3278784496);
+emit_32(1075865903);
+emit_32(3258679296);
+emit_32(3278528512);
+emit_32(1078931520);
+emit_32(3258679296);
+emit_32(3278272528);
+emit_32(1083096191);
+emit_32(3258679296);
+emit_32(3278016545);
+emit_32(1086698344);
+emit_32(3258679296);
+emit_32(3277760496);
+emit_32(1089640354);
+emit_32(3258679296);
+emit_32(3277504512);
+emit_32(1091993652);
+emit_32(3258679296);
+emit_32(3277248528);
+emit_32(1094077907);
+emit_32(3258679296);
+emit_32(3276992545);
+emit_32(1095184469);
+emit_32(3258679296);
+emit_32(3276736496);
+emit_32(1095896243);
+emit_32(3258679296);
+emit_32(3276480512);
+emit_32(1096633916);
+emit_32(3258679296);
+emit_32(3276224528);
+emit_32(1096975542);
+emit_32(3258679296);
+emit_32(3275968545);
+emit_32(1097889376);
+emit_32(3258679296);
+emit_32(3275712496);
+emit_32(1099541774);
+emit_32(3258679296);
+emit_32(3275456512);
+emit_32(1101179178);
+emit_32(3258679296);
+emit_32(3275200528);
+emit_32(1102317932);
+emit_32(3258679296);
+emit_32(3274944545);
+emit_32(1103521278);
+emit_32(3258679296);
+emit_32(3274688496);
+emit_32(1104345983);
+emit_32(3258679296);
+emit_32(3274432512);
+emit_32(1104852759);
+emit_32(3258679296);
+emit_32(3274176528);
+emit_32(1104831526);
+emit_32(3258679296);
+emit_32(3273920545);
+emit_32(1104946974);
+emit_32(3258679296);
+emit_32(3273664496);
+emit_32(1105281994);
+emit_32(3258679296);
+emit_32(3273408512);
+emit_32(1105386275);
+emit_32(3258679296);
+emit_32(3273152528);
+emit_32(1104804053);
+emit_32(3258679296);
+emit_32(3272896545);
+emit_32(1105020374);
+emit_32(3258679296);
+emit_32(3272640496);
+emit_32(1104527806);
+emit_32(3258679296);
+emit_32(3272384512);
+emit_32(1103824211);
+emit_32(3258679296);
+emit_32(3272128528);
+emit_32(1103687791);
+emit_32(3258679296);
+emit_32(3271872545);
+emit_32(1103464392);
+emit_32(3258679296);
+emit_32(3271616496);
+emit_32(1103011774);
+emit_32(3258679296);
+emit_32(3271163904);
+emit_32(1102466777);
+emit_32(3258679296);
+emit_32(3270651937);
+emit_32(1102908804);
+emit_32(3258679296);
+emit_32(3270139970);
+emit_32(1102728659);
+emit_32(3258679296);
+emit_32(3269627871);
+emit_32(1102517318);
+emit_32(3258679296);
+emit_32(3269115904);
+emit_32(1102387190);
+emit_32(3258679296);
+emit_32(3268603937);
+emit_32(1102173019);
+emit_32(3258679296);
+emit_32(3268091970);
+emit_32(1102448637);
+emit_32(3258679296);
+emit_32(3267579911);
+emit_32(1102804104);
+emit_32(3258679296);
+emit_32(3267067904);
+emit_32(1103652140);
+emit_32(3258679296);
+emit_32(3266555911);
+emit_32(1104033035);
+emit_32(3258679296);
+emit_32(3266043904);
+emit_32(1104794721);
+emit_32(3258679296);
+emit_32(3265531911);
+emit_32(1105280578);
+emit_32(3258679296);
+emit_32(3265019904);
+emit_32(1105555305);
+emit_32(3258679296);
+emit_32(3264507911);
+emit_32(1106497398);
+emit_32(3258679296);
+emit_32(3263995904);
+emit_32(1107356549);
+emit_32(3258679296);
+emit_32(3263483911);
+emit_32(1107738440);
+emit_32(3258679296);
+emit_32(3262775296);
+emit_32(1108026091);
+emit_32(3258679296);
+emit_32(3261751309);
+emit_32(1108412596);
+emit_32(3258679296);
+emit_32(3260727296);
+emit_32(1108935547);
+emit_32(3258679296);
+emit_32(3259703309);
+emit_32(1109269178);
+emit_32(3258679296);
+emit_32(3258679296);
+emit_32(1109856774);
+emit_32(3258679296);
+emit_32(3257655309);
+emit_32(1110673955);
+emit_32(3258679296);
+emit_32(3256631296);
+emit_32(1111396031);
+emit_32(3258679296);
+emit_32(3255607309);
+emit_32(1111904302);
+emit_32(3258679296);
+emit_32(3254386688);
+emit_32(1112640612);
+emit_32(3258679296);
+emit_32(3252338714);
+emit_32(1113308083);
+emit_32(3258679296);
+emit_32(3250290688);
+emit_32(1113763480);
+emit_32(3258679296);
+emit_32(3248242714);
+emit_32(1113823117);
+emit_32(3258679296);
+emit_32(3245998080);
+emit_32(1114289734);
+emit_32(3258679296);
+emit_32(3241902132);
+emit_32(1114547028);
+emit_32(3258679296);
+emit_32(3237609472);
+emit_32(1114378417);
+emit_32(3258679296);
+emit_32(3229220864);
+emit_32(1114468175);
+emit_32(3258679296);
+emit_32(0);
+emit_32(1114253689);
+emit_32(3258679296);
+emit_32(1081737216);
+emit_32(1114350184);
+emit_32(3258679296);
+emit_32(3279552512);
+emit_32(1076163699);
+emit_32(3259703309);
+emit_32(3279296528);
+emit_32(1074005017);
+emit_32(3259703309);
+emit_32(3279040545);
+emit_32(1074851343);
+emit_32(3259703309);
+emit_32(3278784496);
+emit_32(1075567479);
+emit_32(3259703309);
+emit_32(3278528512);
+emit_32(1076420223);
+emit_32(3259703309);
+emit_32(3278272528);
+emit_32(1083073395);
+emit_32(3259703309);
+emit_32(3278016545);
+emit_32(1087377339);
+emit_32(3259703309);
+emit_32(3277760496);
+emit_32(1090634446);
+emit_32(3259703309);
+emit_32(3277504512);
+emit_32(1092723461);
+emit_32(3259703309);
+emit_32(3277248528);
+emit_32(1094053580);
+emit_32(3259703309);
+emit_32(3276992545);
+emit_32(1095488766);
+emit_32(3259703309);
+emit_32(3276736496);
+emit_32(1096447794);
+emit_32(3259703309);
+emit_32(3276480512);
+emit_32(1096424305);
+emit_32(3259703309);
+emit_32(3276224528);
+emit_32(1096267648);
+emit_32(3259703309);
+emit_32(3275968545);
+emit_32(1098177000);
+emit_32(3259703309);
+emit_32(3275712496);
+emit_32(1099698536);
+emit_32(3259703309);
+emit_32(3275456512);
+emit_32(1100780981);
+emit_32(3259703309);
+emit_32(3275200528);
+emit_32(1102100247);
+emit_32(3259703309);
+emit_32(3274944545);
+emit_32(1103045696);
+emit_32(3259703309);
+emit_32(3274688496);
+emit_32(1103591375);
+emit_32(3259703309);
+emit_32(3274432512);
+emit_32(1104209510);
+emit_32(3259703309);
+emit_32(3274176528);
+emit_32(1104099882);
+emit_32(3259703309);
+emit_32(3273920545);
+emit_32(1104651171);
+emit_32(3259703309);
+emit_32(3273664496);
+emit_32(1104566760);
+emit_32(3259703309);
+emit_32(3273408512);
+emit_32(1104331250);
+emit_32(3259703309);
+emit_32(3273152528);
+emit_32(1103945269);
+emit_32(3259703309);
+emit_32(3272896545);
+emit_32(1103774247);
+emit_32(3259703309);
+emit_32(3272640496);
+emit_32(1103880729);
+emit_32(3259703309);
+emit_32(3272384512);
+emit_32(1103052669);
+emit_32(3259703309);
+emit_32(3272128528);
+emit_32(1102949594);
+emit_32(3259703309);
+emit_32(3271872545);
+emit_32(1102556640);
+emit_32(3259703309);
+emit_32(3271616496);
+emit_32(1102215329);
+emit_32(3259703309);
+emit_32(3271163904);
+emit_32(1102211711);
+emit_32(3259703309);
+emit_32(3270651937);
+emit_32(1102750102);
+emit_32(3259703309);
+emit_32(3270139970);
+emit_32(1102672246);
+emit_32(3259703309);
+emit_32(3269627871);
+emit_32(1102404282);
+emit_32(3259703309);
+emit_32(3269115904);
+emit_32(1101664721);
+emit_32(3259703309);
+emit_32(3268603937);
+emit_32(1101247965);
+emit_32(3259703309);
+emit_32(3268091970);
+emit_32(1101781742);
+emit_32(3259703309);
+emit_32(3267579911);
+emit_32(1102060559);
+emit_32(3259703309);
+emit_32(3267067904);
+emit_32(1102827382);
+emit_32(3259703309);
+emit_32(3266555911);
+emit_32(1103737651);
+emit_32(3259703309);
+emit_32(3266043904);
+emit_32(1104384360);
+emit_32(3259703309);
+emit_32(3265531911);
+emit_32(1104969151);
+emit_32(3259703309);
+emit_32(3265019904);
+emit_32(1106019143);
+emit_32(3259703309);
+emit_32(3264507911);
+emit_32(1106853337);
+emit_32(3259703309);
+emit_32(3263995904);
+emit_32(1107698306);
+emit_32(3259703309);
+emit_32(3263483911);
+emit_32(1108253868);
+emit_32(3259703309);
+emit_32(3262775296);
+emit_32(1108408245);
+emit_32(3259703309);
+emit_32(3261751309);
+emit_32(1108719619);
+emit_32(3259703309);
+emit_32(3260727296);
+emit_32(1109327662);
+emit_32(3259703309);
+emit_32(3259703309);
+emit_32(1109785051);
+emit_32(3259703309);
+emit_32(3258679296);
+emit_32(1110584826);
+emit_32(3259703309);
+emit_32(3257655309);
+emit_32(1111298907);
+emit_32(3259703309);
+emit_32(3256631296);
+emit_32(1111928472);
+emit_32(3259703309);
+emit_32(3255607309);
+emit_32(1112511401);
+emit_32(3259703309);
+emit_32(3254386688);
+emit_32(1113049871);
+emit_32(3259703309);
+emit_32(3252338714);
+emit_32(1113389636);
+emit_32(3259703309);
+emit_32(3250290688);
+emit_32(1113731419);
+emit_32(3259703309);
+emit_32(3248242714);
+emit_32(1114257359);
+emit_32(3259703309);
+emit_32(3245998080);
+emit_32(1114519870);
+emit_32(3259703309);
+emit_32(3241902132);
+emit_32(1114340039);
+emit_32(3259703309);
+emit_32(3237609472);
+emit_32(1114383922);
+emit_32(3259703309);
+emit_32(3229220864);
+emit_32(1114528390);
+emit_32(3259703309);
+emit_32(0);
+emit_32(1114544302);
+emit_32(3259703309);
+emit_32(1081737216);
+emit_32(1114597202);
+emit_32(3259703309);
+emit_32(3279552512);
+emit_32(1073915300);
+emit_32(3260727296);
+emit_32(3279296528);
+emit_32(1076045336);
+emit_32(3260727296);
+emit_32(3279040545);
+emit_32(1076717767);
+emit_32(3260727296);
+emit_32(3278784496);
+emit_32(1077967921);
+emit_32(3260727296);
+emit_32(3278528512);
+emit_32(1080230706);
+emit_32(3260727296);
+emit_32(3278272528);
+emit_32(1084434174);
+emit_32(3260727296);
+emit_32(3278016545);
+emit_32(1088619209);
+emit_32(3260727296);
+emit_32(3277760496);
+emit_32(1090948694);
+emit_32(3260727296);
+emit_32(3277504512);
+emit_32(1092674388);
+emit_32(3260727296);
+emit_32(3277248528);
+emit_32(1094185071);
+emit_32(3260727296);
+emit_32(3276992545);
+emit_32(1094902717);
+emit_32(3260727296);
+emit_32(3276736496);
+emit_32(1095470101);
+emit_32(3260727296);
+emit_32(3276480512);
+emit_32(1095440531);
+emit_32(3260727296);
+emit_32(3276224528);
+emit_32(1096837654);
+emit_32(3260727296);
+emit_32(3275968545);
+emit_32(1098967784);
+emit_32(3260727296);
+emit_32(3275712496);
+emit_32(1100160067);
+emit_32(3260727296);
+emit_32(3275456512);
+emit_32(1100666582);
+emit_32(3260727296);
+emit_32(3275200528);
+emit_32(1101873178);
+emit_32(3260727296);
+emit_32(3274944545);
+emit_32(1102572736);
+emit_32(3260727296);
+emit_32(3274688496);
+emit_32(1102982834);
+emit_32(3260727296);
+emit_32(3274432512);
+emit_32(1103746092);
+emit_32(3260727296);
+emit_32(3274176528);
+emit_32(1104190584);
+emit_32(3260727296);
+emit_32(3273920545);
+emit_32(1104541647);
+emit_32(3260727296);
+emit_32(3273664496);
+emit_32(1104309335);
+emit_32(3260727296);
+emit_32(3273408512);
+emit_32(1103949831);
+emit_32(3260727296);
+emit_32(3273152528);
+emit_32(1103383495);
+emit_32(3260727296);
+emit_32(3272896545);
+emit_32(1103021107);
+emit_32(3260727296);
+emit_32(3272640496);
+emit_32(1102773014);
+emit_32(3260727296);
+emit_32(3272384512);
+emit_32(1102509192);
+emit_32(3260727296);
+emit_32(3272128528);
+emit_32(1102328470);
+emit_32(3260727296);
+emit_32(3271872545);
+emit_32(1101757678);
+emit_32(3260727296);
+emit_32(3271616496);
+emit_32(1101776133);
+emit_32(3260727296);
+emit_32(3271163904);
+emit_32(1102138363);
+emit_32(3260727296);
+emit_32(3270651937);
+emit_32(1102294496);
+emit_32(3260727296);
+emit_32(3270139970);
+emit_32(1101746563);
+emit_32(3260727296);
+emit_32(3269627871);
+emit_32(1101436656);
+emit_32(3260727296);
+emit_32(3269115904);
+emit_32(1100808559);
+emit_32(3260727296);
+emit_32(3268603937);
+emit_32(1101081451);
+emit_32(3260727296);
+emit_32(3268091970);
+emit_32(1101838156);
+emit_32(3260727296);
+emit_32(3267579911);
+emit_32(1102177947);
+emit_32(3260727296);
+emit_32(3267067904);
+emit_32(1102933656);
+emit_32(3260727296);
+emit_32(3266555911);
+emit_32(1103594940);
+emit_32(3260727296);
+emit_32(3266043904);
+emit_32(1104370991);
+emit_32(3260727296);
+emit_32(3265531911);
+emit_32(1105153229);
+emit_32(3260727296);
+emit_32(3265019904);
+emit_32(1106283803);
+emit_32(3260727296);
+emit_32(3264507911);
+emit_32(1107489928);
+emit_32(3260727296);
+emit_32(3263995904);
+emit_32(1107912347);
+emit_32(3260727296);
+emit_32(3263483911);
+emit_32(1108259976);
+emit_32(3260727296);
+emit_32(3262775296);
+emit_32(1108728218);
+emit_32(3260727296);
+emit_32(3261751309);
+emit_32(1108959507);
+emit_32(3260727296);
+emit_32(3260727296);
+emit_32(1109551402);
+emit_32(3260727296);
+emit_32(3259703309);
+emit_32(1110560788);
+emit_32(3260727296);
+emit_32(3258679296);
+emit_32(1111390473);
+emit_32(3260727296);
+emit_32(3257655309);
+emit_32(1111954109);
+emit_32(3260727296);
+emit_32(3256631296);
+emit_32(1112588288);
+emit_32(3260727296);
+emit_32(3255607309);
+emit_32(1113193211);
+emit_32(3260727296);
+emit_32(3254386688);
+emit_32(1113572953);
+emit_32(3260727296);
+emit_32(3252338714);
+emit_32(1113885324);
+emit_32(3260727296);
+emit_32(3250290688);
+emit_32(1114116194);
+emit_32(3260727296);
+emit_32(3248242714);
+emit_32(1114531771);
+emit_32(3260727296);
+emit_32(3245998080);
+emit_32(1114632933);
+emit_32(3260727296);
+emit_32(3241902132);
+emit_32(1114591697);
+emit_32(3260727296);
+emit_32(3237609472);
+emit_32(1114663420);
+emit_32(3260727296);
+emit_32(3229220864);
+emit_32(1114860631);
+emit_32(3260727296);
+emit_32(0);
+emit_32(1114783587);
+emit_32(3260727296);
+emit_32(1081737216);
+emit_32(1114739258);
+emit_32(3260727296);
+emit_32(3279552512);
+emit_32(1082154906);
+emit_32(3261751309);
+emit_32(3279296528);
+emit_32(1078227213);
+emit_32(3261751309);
+emit_32(3279040545);
+emit_32(1079515745);
+emit_32(3261751309);
+emit_32(3278784496);
+emit_32(1080953133);
+emit_32(3261751309);
+emit_32(3278528512);
+emit_32(1082315317);
+emit_32(3261751309);
+emit_32(3278272528);
+emit_32(1085410084);
+emit_32(3261751309);
+emit_32(3278016545);
+emit_32(1089116884);
+emit_32(3261751309);
+emit_32(3277760496);
+emit_32(1091162058);
+emit_32(3261751309);
+emit_32(3277504512);
+emit_32(1092383922);
+emit_32(3261751309);
+emit_32(3277248528);
+emit_32(1094686500);
+emit_32(3261751309);
+emit_32(3276992545);
+emit_32(1095695440);
+emit_32(3261751309);
+emit_32(3276736496);
+emit_32(1096304558);
+emit_32(3261751309);
+emit_32(3276480512);
+emit_32(1096755970);
+emit_32(3261751309);
+emit_32(3276224528);
+emit_32(1097235484);
+emit_32(3261751309);
+emit_32(3275968545);
+emit_32(1098986081);
+emit_32(3261751309);
+emit_32(3275712496);
+emit_32(1099885602);
+emit_32(3261751309);
+emit_32(3275456512);
+emit_32(1100472805);
+emit_32(3261751309);
+emit_32(3275200528);
+emit_32(1101685588);
+emit_32(3261751309);
+emit_32(3274944545);
+emit_32(1102836243);
+emit_32(3261751309);
+emit_32(3274688496);
+emit_32(1103812048);
+emit_32(3261751309);
+emit_32(3274432512);
+emit_32(1104207518);
+emit_32(3261751309);
+emit_32(3274176528);
+emit_32(1104457970);
+emit_32(3261751309);
+emit_32(3273920545);
+emit_32(1104083891);
+emit_32(3261751309);
+emit_32(3273664496);
+emit_32(1103629805);
+emit_32(3261751309);
+emit_32(3273408512);
+emit_32(1103776553);
+emit_32(3261751309);
+emit_32(3273152528);
+emit_32(1103074794);
+emit_32(3261751309);
+emit_32(3272896545);
+emit_32(1102698250);
+emit_32(3261751309);
+emit_32(3272640496);
+emit_32(1102376914);
+emit_32(3261751309);
+emit_32(3272384512);
+emit_32(1101790760);
+emit_32(3261751309);
+emit_32(3272128528);
+emit_32(1101572184);
+emit_32(3261751309);
+emit_32(3271872545);
+emit_32(1101531028);
+emit_32(3261751309);
+emit_32(3271616496);
+emit_32(1101967498);
+emit_32(3261751309);
+emit_32(3271163904);
+emit_32(1101842874);
+emit_32(3261751309);
+emit_32(3270651937);
+emit_32(1101503398);
+emit_32(3261751309);
+emit_32(3270139970);
+emit_32(1101637406);
+emit_32(3261751309);
+emit_32(3269627871);
+emit_32(1100872627);
+emit_32(3261751309);
+emit_32(3269115904);
+emit_32(1100259629);
+emit_32(3261751309);
+emit_32(3268603937);
+emit_32(1101213676);
+emit_32(3261751309);
+emit_32(3268091970);
+emit_32(1102188118);
+emit_32(3261751309);
+emit_32(3267579911);
+emit_32(1102756499);
+emit_32(3261751309);
+emit_32(3267067904);
+emit_32(1103291744);
+emit_32(3261751309);
+emit_32(3266555911);
+emit_32(1104021763);
+emit_32(3261751309);
+emit_32(3266043904);
+emit_32(1105069185);
+emit_32(3261751309);
+emit_32(3265531911);
+emit_32(1105681659);
+emit_32(3261751309);
+emit_32(3265019904);
+emit_32(1106673612);
+emit_32(3261751309);
+emit_32(3264507911);
+emit_32(1107534728);
+emit_32(3261751309);
+emit_32(3263995904);
+emit_32(1108049579);
+emit_32(3261751309);
+emit_32(3263483911);
+emit_32(1108358411);
+emit_32(3261751309);
+emit_32(3262775296);
+emit_32(1109001765);
+emit_32(3261751309);
+emit_32(3261751309);
+emit_32(1109732911);
+emit_32(3261751309);
+emit_32(3260727296);
+emit_32(1110268628);
+emit_32(3261751309);
+emit_32(3259703309);
+emit_32(1111109324);
+emit_32(3261751309);
+emit_32(3258679296);
+emit_32(1111815854);
+emit_32(3261751309);
+emit_32(3257655309);
+emit_32(1112380434);
+emit_32(3261751309);
+emit_32(3256631296);
+emit_32(1113088511);
+emit_32(3261751309);
+emit_32(3255607309);
+emit_32(1113540657);
+emit_32(3261751309);
+emit_32(3254386688);
+emit_32(1113874498);
+emit_32(3261751309);
+emit_32(3252338714);
+emit_32(1114128672);
+emit_32(3261751309);
+emit_32(3250290688);
+emit_32(1114325883);
+emit_32(3261751309);
+emit_32(3248242714);
+emit_32(1114630023);
+emit_32(3261751309);
+emit_32(3245998080);
+emit_32(1114691181);
+emit_32(3261751309);
+emit_32(3241902132);
+emit_32(1114643497);
+emit_32(3261751309);
+emit_32(3237609472);
+emit_32(1114924410);
+emit_32(3261751309);
+emit_32(3229220864);
+emit_32(1115023894);
+emit_32(3261751309);
+emit_32(0);
+emit_32(1115026751);
+emit_32(3261751309);
+emit_32(1081737216);
+emit_32(1115049086);
+emit_32(3261751309);
+emit_32(3279552512);
+emit_32(1085379717);
+emit_32(3262775296);
+emit_32(3279296528);
+emit_32(1082515763);
+emit_32(3262775296);
+emit_32(3279040545);
+emit_32(1081713392);
+emit_32(3262775296);
+emit_32(3278784496);
+emit_32(1082674664);
+emit_32(3262775296);
+emit_32(3278528512);
+emit_32(1083857751);
+emit_32(3262775296);
+emit_32(3278272528);
+emit_32(1086391782);
+emit_32(3262775296);
+emit_32(3278016545);
+emit_32(1089887986);
+emit_32(3262775296);
+emit_32(3277760496);
+emit_32(1091366562);
+emit_32(3262775296);
+emit_32(3277504512);
+emit_32(1093480323);
+emit_32(3262775296);
+emit_32(3277248528);
+emit_32(1096367053);
+emit_32(3262775296);
+emit_32(3276992545);
+emit_32(1097288647);
+emit_32(3262775296);
+emit_32(3276736496);
+emit_32(1097900491);
+emit_32(3262775296);
+emit_32(3276480512);
+emit_32(1097387737);
+emit_32(3262775296);
+emit_32(3276224528);
+emit_32(1098997092);
+emit_32(3262775296);
+emit_32(3275968545);
+emit_32(1099406141);
+emit_32(3262775296);
+emit_32(3275712496);
+emit_32(1100061920);
+emit_32(3262775296);
+emit_32(3275456512);
+emit_32(1100936328);
+emit_32(3262775296);
+emit_32(3275200528);
+emit_32(1102376704);
+emit_32(3262775296);
+emit_32(3274944545);
+emit_32(1103402212);
+emit_32(3262775296);
+emit_32(3274688496);
+emit_32(1104153831);
+emit_32(3262775296);
+emit_32(3274432512);
+emit_32(1104171447);
+emit_32(3262775296);
+emit_32(3274176528);
+emit_32(1104486911);
+emit_32(3262775296);
+emit_32(3273920545);
+emit_32(1103965769);
+emit_32(3262775296);
+emit_32(3273664496);
+emit_32(1103343911);
+emit_32(3262775296);
+emit_32(3273408512);
+emit_32(1102855274);
+emit_32(3262775296);
+emit_32(3273152528);
+emit_32(1102990751);
+emit_32(3262775296);
+emit_32(3272896545);
+emit_32(1102516113);
+emit_32(3262775296);
+emit_32(3272640496);
+emit_32(1101872916);
+emit_32(3262775296);
+emit_32(3272384512);
+emit_32(1101340606);
+emit_32(3262775296);
+emit_32(3272128528);
+emit_32(1101093667);
+emit_32(3262775296);
+emit_32(3271872545);
+emit_32(1101409288);
+emit_32(3262775296);
+emit_32(3271616496);
+emit_32(1101315074);
+emit_32(3262775296);
+emit_32(3271163904);
+emit_32(1101239471);
+emit_32(3262775296);
+emit_32(3270651937);
+emit_32(1100955936);
+emit_32(3262775296);
+emit_32(3270139970);
+emit_32(1100734163);
+emit_32(3262775296);
+emit_32(3269627871);
+emit_32(1099873911);
+emit_32(3262775296);
+emit_32(3269115904);
+emit_32(1100253023);
+emit_32(3262775296);
+emit_32(3268603937);
+emit_32(1101062786);
+emit_32(3262775296);
+emit_32(3268091970);
+emit_32(1101695916);
+emit_32(3262775296);
+emit_32(3267579911);
+emit_32(1102727139);
+emit_32(3262775296);
+emit_32(3267067904);
+emit_32(1103290748);
+emit_32(3262775296);
+emit_32(3266555911);
+emit_32(1104346717);
+emit_32(3262775296);
+emit_32(3266043904);
+emit_32(1105063261);
+emit_32(3262775296);
+emit_32(3265531911);
+emit_32(1106002838);
+emit_32(3262775296);
+emit_32(3265019904);
+emit_32(1107066723);
+emit_32(3262775296);
+emit_32(3264507911);
+emit_32(1107631093);
+emit_32(3262775296);
+emit_32(3263995904);
+emit_32(1108240630);
+emit_32(3262775296);
+emit_32(3263483911);
+emit_32(1108980662);
+emit_32(3262775296);
+emit_32(3262775296);
+emit_32(1109633532);
+emit_32(3262775296);
+emit_32(3261751309);
+emit_32(1110425679);
+emit_32(3262775296);
+emit_32(3260727296);
+emit_32(1110943098);
+emit_32(3262775296);
+emit_32(3259703309);
+emit_32(1111573843);
+emit_32(3262775296);
+emit_32(3258679296);
+emit_32(1112066674);
+emit_32(3262775296);
+emit_32(3257655309);
+emit_32(1112658464);
+emit_32(3262775296);
+emit_32(3256631296);
+emit_32(1113241131);
+emit_32(3262775296);
+emit_32(3255607309);
+emit_32(1113628711);
+emit_32(3262775296);
+emit_32(3254386688);
+emit_32(1113998361);
+emit_32(3262775296);
+emit_32(3252338714);
+emit_32(1114315476);
+emit_32(3262775296);
+emit_32(3250290688);
+emit_32(1114404291);
+emit_32(3262775296);
+emit_32(3248242714);
+emit_32(1114257097);
+emit_32(3262775296);
+emit_32(3245998080);
+emit_32(1114167496);
+emit_32(3262775296);
+emit_32(3241902132);
+emit_32(1114396767);
+emit_32(3262775296);
+emit_32(3237609472);
+emit_32(1114735247);
+emit_32(3262775296);
+emit_32(3229220864);
+emit_32(1114903465);
+emit_32(3262775296);
+emit_32(0);
+emit_32(1115124924);
+emit_32(3262775296);
+emit_32(1081737216);
+emit_32(1115189700);
+emit_32(3262775296);
+emit_32(3279552512);
+emit_32(1086492571);
+emit_32(3263483911);
+emit_32(3279296528);
+emit_32(1084509819);
+emit_32(3263483911);
+emit_32(3279040545);
+emit_32(1084430379);
+emit_32(3263483911);
+emit_32(3278784496);
+emit_32(1085001978);
+emit_32(3263483911);
+emit_32(3278528512);
+emit_32(1084687406);
+emit_32(3263483911);
+emit_32(3278272528);
+emit_32(1087121591);
+emit_32(3263483911);
+emit_32(3278016545);
+emit_32(1090205138);
+emit_32(3263483911);
+emit_32(3277760496);
+emit_32(1091946330);
+emit_32(3263483911);
+emit_32(3277504512);
+emit_32(1094604292);
+emit_32(3263483911);
+emit_32(3277248528);
+emit_32(1096763205);
+emit_32(3263483911);
+emit_32(3276992545);
+emit_32(1098349072);
+emit_32(3263483911);
+emit_32(3276736496);
+emit_32(1098895589);
+emit_32(3263483911);
+emit_32(3276480512);
+emit_32(1099139645);
+emit_32(3263483911);
+emit_32(3276224528);
+emit_32(1099654916);
+emit_32(3263483911);
+emit_32(3275968545);
+emit_32(1100028838);
+emit_32(3263483911);
+emit_32(3275712496);
+emit_32(1100411096);
+emit_32(3263483911);
+emit_32(3275456512);
+emit_32(1101073796);
+emit_32(3263483911);
+emit_32(3275200528);
+emit_32(1102500803);
+emit_32(3263483911);
+emit_32(3274944545);
+emit_32(1103383180);
+emit_32(3263483911);
+emit_32(3274688496);
+emit_32(1103953081);
+emit_32(3263483911);
+emit_32(3274432512);
+emit_32(1104117078);
+emit_32(3263483911);
+emit_32(3274176528);
+emit_32(1104031777);
+emit_32(3263483911);
+emit_32(3273920545);
+emit_32(1103706141);
+emit_32(3263483911);
+emit_32(3273664496);
+emit_32(1103324512);
+emit_32(3263483911);
+emit_32(3273408512);
+emit_32(1102513124);
+emit_32(3263483911);
+emit_32(3273152528);
+emit_32(1102512757);
+emit_32(3263483911);
+emit_32(3272896545);
+emit_32(1102001367);
+emit_32(3263483911);
+emit_32(3272640496);
+emit_32(1101489347);
+emit_32(3263483911);
+emit_32(3272384512);
+emit_32(1101058382);
+emit_32(3263483911);
+emit_32(3272128528);
+emit_32(1100785805);
+emit_32(3263483911);
+emit_32(3271872545);
+emit_32(1100711985);
+emit_32(3263483911);
+emit_32(3271616496);
+emit_32(1100454979);
+emit_32(3263483911);
+emit_32(3271163904);
+emit_32(1100441924);
+emit_32(3263483911);
+emit_32(3270651937);
+emit_32(1100316829);
+emit_32(3263483911);
+emit_32(3270139970);
+emit_32(1099903690);
+emit_32(3263483911);
+emit_32(3269627871);
+emit_32(1099946525);
+emit_32(3263483911);
+emit_32(3269115904);
+emit_32(1100095265);
+emit_32(3263483911);
+emit_32(3268603937);
+emit_32(1100759958);
+emit_32(3263483911);
+emit_32(3268091970);
+emit_32(1101531447);
+emit_32(3263483911);
+emit_32(3267579911);
+emit_32(1102182403);
+emit_32(3263483911);
+emit_32(3267067904);
+emit_32(1102954575);
+emit_32(3263483911);
+emit_32(3266555911);
+emit_32(1103927181);
+emit_32(3263483911);
+emit_32(3266043904);
+emit_32(1104963174);
+emit_32(3263483911);
+emit_32(3265531911);
+emit_32(1106107695);
+emit_32(3263483911);
+emit_32(3265019904);
+emit_32(1106811971);
+emit_32(3263483911);
+emit_32(3264507911);
+emit_32(1107810242);
+emit_32(3263483911);
+emit_32(3263995904);
+emit_32(1108701217);
+emit_32(3263483911);
+emit_32(3263483911);
+emit_32(1109660533);
+emit_32(3263483911);
+emit_32(3262775296);
+emit_32(1110370838);
+emit_32(3263483911);
+emit_32(3261751309);
+emit_32(1111099363);
+emit_32(3263483911);
+emit_32(3260727296);
+emit_32(1111486628);
+emit_32(3263483911);
+emit_32(3259703309);
+emit_32(1111821464);
+emit_32(3263483911);
+emit_32(3258679296);
+emit_32(1112262967);
+emit_32(3263483911);
+emit_32(3257655309);
+emit_32(1112778211);
+emit_32(3263483911);
+emit_32(3256631296);
+emit_32(1113334717);
+emit_32(3263483911);
+emit_32(3255607309);
+emit_32(1113699910);
+emit_32(3263483911);
+emit_32(3254386688);
+emit_32(1113953429);
+emit_32(3263483911);
+emit_32(3252338714);
+emit_32(1114251775);
+emit_32(3263483911);
+emit_32(3250290688);
+emit_32(1114199242);
+emit_32(3263483911);
+emit_32(3248242714);
+emit_32(1113838033);
+emit_32(3263483911);
+emit_32(3245998080);
+emit_32(1113833787);
+emit_32(3263483911);
+emit_32(3241902132);
+emit_32(1114207840);
+emit_32(3263483911);
+emit_32(3237609472);
+emit_32(1114546556);
+emit_32(3263483911);
+emit_32(3229220864);
+emit_32(1114598697);
+emit_32(3263483911);
+emit_32(0);
+emit_32(1114817954);
+emit_32(3263483911);
+emit_32(1081737216);
+emit_32(1114860919);
+emit_32(3263483911);
+emit_32(3279552512);
+emit_32(1087139710);
+emit_32(3263995904);
+emit_32(3279296528);
+emit_32(1087121150);
+emit_32(3263995904);
+emit_32(3279040545);
+emit_32(1087424797);
+emit_32(3263995904);
+emit_32(3278784496);
+emit_32(1088288866);
+emit_32(3263995904);
+emit_32(3278528512);
+emit_32(1087946275);
+emit_32(3263995904);
+emit_32(3278272528);
+emit_32(1088967861);
+emit_32(3263995904);
+emit_32(3278016545);
+emit_32(1091560444);
+emit_32(3263995904);
+emit_32(3277760496);
+emit_32(1093142053);
+emit_32(3263995904);
+emit_32(3277504512);
+emit_32(1094326419);
+emit_32(3263995904);
+emit_32(3277248528);
+emit_32(1096867958);
+emit_32(3263995904);
+emit_32(3276992545);
+emit_32(1098819882);
+emit_32(3263995904);
+emit_32(3276736496);
+emit_32(1099265422);
+emit_32(3263995904);
+emit_32(3276480512);
+emit_32(1099487668);
+emit_32(3263995904);
+emit_32(3276224528);
+emit_32(1099990827);
+emit_32(3263995904);
+emit_32(3275968545);
+emit_32(1100246627);
+emit_32(3263995904);
+emit_32(3275712496);
+emit_32(1100397937);
+emit_32(3263995904);
+emit_32(3275456512);
+emit_32(1101410127);
+emit_32(3263995904);
+emit_32(3275200528);
+emit_32(1102521513);
+emit_32(3263995904);
+emit_32(3274944545);
+emit_32(1103207386);
+emit_32(3263995904);
+emit_32(3274688496);
+emit_32(1103390940);
+emit_32(3263995904);
+emit_32(3274432512);
+emit_32(1103443263);
+emit_32(3263995904);
+emit_32(3274176528);
+emit_32(1103097024);
+emit_32(3263995904);
+emit_32(3273920545);
+emit_32(1102906864);
+emit_32(3263995904);
+emit_32(3273664496);
+emit_32(1102900730);
+emit_32(3263995904);
+emit_32(3273408512);
+emit_32(1102220938);
+emit_32(3263995904);
+emit_32(3273152528);
+emit_32(1102144078);
+emit_32(3263995904);
+emit_32(3272896545);
+emit_32(1101363046);
+emit_32(3263995904);
+emit_32(3272640496);
+emit_32(1100839544);
+emit_32(3263995904);
+emit_32(3272384512);
+emit_32(1100199127);
+emit_32(3263995904);
+emit_32(3272128528);
+emit_32(1100097362);
+emit_32(3263995904);
+emit_32(3271872545);
+emit_32(1099987419);
+emit_32(3263995904);
+emit_32(3271616496);
+emit_32(1099540044);
+emit_32(3263995904);
+emit_32(3271163904);
+emit_32(1099437336);
+emit_32(3263995904);
+emit_32(3270651937);
+emit_32(1099514983);
+emit_32(3263995904);
+emit_32(3270139970);
+emit_32(1099717201);
+emit_32(3263995904);
+emit_32(3269627871);
+emit_32(1099729155);
+emit_32(3263995904);
+emit_32(3269115904);
+emit_32(1099827039);
+emit_32(3263995904);
+emit_32(3268603937);
+emit_32(1100161378);
+emit_32(3263995904);
+emit_32(3268091970);
+emit_32(1100861355);
+emit_32(3263995904);
+emit_32(3267579911);
+emit_32(1101473671);
+emit_32(3263995904);
+emit_32(3267067904);
+emit_32(1102447483);
+emit_32(3263995904);
+emit_32(3266555911);
+emit_32(1103703782);
+emit_32(3263995904);
+emit_32(3266043904);
+emit_32(1104882067);
+emit_32(3263995904);
+emit_32(3265531911);
+emit_32(1105992194);
+emit_32(3263995904);
+emit_32(3265019904);
+emit_32(1106919608);
+emit_32(3263995904);
+emit_32(3264507911);
+emit_32(1107993271);
+emit_32(3263995904);
+emit_32(3263995904);
+emit_32(1108925769);
+emit_32(3263995904);
+emit_32(3263483911);
+emit_32(1110019198);
+emit_32(3263995904);
+emit_32(3262775296);
+emit_32(1110818501);
+emit_32(3263995904);
+emit_32(3261751309);
+emit_32(1111233161);
+emit_32(3263995904);
+emit_32(3260727296);
+emit_32(1111683183);
+emit_32(3263995904);
+emit_32(3259703309);
+emit_32(1111981792);
+emit_32(3263995904);
+emit_32(3258679296);
+emit_32(1112340798);
+emit_32(3263995904);
+emit_32(3257655309);
+emit_32(1112786705);
+emit_32(3263995904);
+emit_32(3256631296);
+emit_32(1113283966);
+emit_32(3263995904);
+emit_32(3255607309);
+emit_32(1113555626);
+emit_32(3263995904);
+emit_32(3254386688);
+emit_32(1113825948);
+emit_32(3263995904);
+emit_32(3252338714);
+emit_32(1113819107);
+emit_32(3263995904);
+emit_32(3250290688);
+emit_32(1113630940);
+emit_32(3263995904);
+emit_32(3248242714);
+emit_32(1113321059);
+emit_32(3263995904);
+emit_32(3245998080);
+emit_32(1113733018);
+emit_32(3263995904);
+emit_32(3241902132);
+emit_32(1114113861);
+emit_32(3263995904);
+emit_32(3237609472);
+emit_32(1114143562);
+emit_32(3263995904);
+emit_32(3229220864);
+emit_32(1114322213);
+emit_32(3263995904);
+emit_32(0);
+emit_32(1114472841);
+emit_32(3263995904);
+emit_32(1081737216);
+emit_32(1114412994);
+emit_32(3263995904);
+emit_32(3279552512);
+emit_32(1089045854);
+emit_32(3264507911);
+emit_32(3279296528);
+emit_32(1088278862);
+emit_32(3264507911);
+emit_32(3279040545);
+emit_32(1090412714);
+emit_32(3264507911);
+emit_32(3278784496);
+emit_32(1089711259);
+emit_32(3264507911);
+emit_32(3278528512);
+emit_32(1090927439);
+emit_32(3264507911);
+emit_32(3278272528);
+emit_32(1091410686);
+emit_32(3264507911);
+emit_32(3278016545);
+emit_32(1093437227);
+emit_32(3264507911);
+emit_32(3277760496);
+emit_32(1094926205);
+emit_32(3264507911);
+emit_32(3277504512);
+emit_32(1095460140);
+emit_32(3264507911);
+emit_32(3277248528);
+emit_32(1097105460);
+emit_32(3264507911);
+emit_32(3276992545);
+emit_32(1098968413);
+emit_32(3264507911);
+emit_32(3276736496);
+emit_32(1099353345);
+emit_32(3264507911);
+emit_32(3276480512);
+emit_32(1099813618);
+emit_32(3264507911);
+emit_32(3276224528);
+emit_32(1100320499);
+emit_32(3264507911);
+emit_32(3275968545);
+emit_32(1100493829);
+emit_32(3264507911);
+emit_32(3275712496);
+emit_32(1100473906);
+emit_32(3264507911);
+emit_32(3275456512);
+emit_32(1101401948);
+emit_32(3264507911);
+emit_32(3275200528);
+emit_32(1102298848);
+emit_32(3264507911);
+emit_32(3274944545);
+emit_32(1102989230);
+emit_32(3264507911);
+emit_32(3274688496);
+emit_32(1102648967);
+emit_32(3264507911);
+emit_32(3274432512);
+emit_32(1102203952);
+emit_32(3264507911);
+emit_32(3274176528);
+emit_32(1102020923);
+emit_32(3264507911);
+emit_32(3273920545);
+emit_32(1102482244);
+emit_32(3264507911);
+emit_32(3273664496);
+emit_32(1101949515);
+emit_32(3264507911);
+emit_32(3273408512);
+emit_32(1101712379);
+emit_32(3264507911);
+emit_32(3273152528);
+emit_32(1100957195);
+emit_32(3264507911);
+emit_32(3272896545);
+emit_32(1100760377);
+emit_32(3264507911);
+emit_32(3272640496);
+emit_32(1100597271);
+emit_32(3264507911);
+emit_32(3272384512);
+emit_32(1099567360);
+emit_32(3264507911);
+emit_32(3272128528);
+emit_32(1098669307);
+emit_32(3264507911);
+emit_32(3271872545);
+emit_32(1098076022);
+emit_32(3264507911);
+emit_32(3271616496);
+emit_32(1097956485);
+emit_32(3264507911);
+emit_32(3271163904);
+emit_32(1098180565);
+emit_32(3264507911);
+emit_32(3270651937);
+emit_32(1097980812);
+emit_32(3264507911);
+emit_32(3270139970);
+emit_32(1098969042);
+emit_32(3264507911);
+emit_32(3269627871);
+emit_32(1099581411);
+emit_32(3264507911);
+emit_32(3269115904);
+emit_32(1099345900);
+emit_32(3264507911);
+emit_32(3268603937);
+emit_32(1099778595);
+emit_32(3264507911);
+emit_32(3268091970);
+emit_32(1100042784);
+emit_32(3264507911);
+emit_32(3267579911);
+emit_32(1100446643);
+emit_32(3264507911);
+emit_32(3267067904);
+emit_32(1101589486);
+emit_32(3264507911);
+emit_32(3266555911);
+emit_32(1103063522);
+emit_32(3264507911);
+emit_32(3266043904);
+emit_32(1104431599);
+emit_32(3264507911);
+emit_32(3265531911);
+emit_32(1106038332);
+emit_32(3264507911);
+emit_32(3265019904);
+emit_32(1107210011);
+emit_32(3264507911);
+emit_32(3264507911);
+emit_32(1107970254);
+emit_32(3264507911);
+emit_32(3263995904);
+emit_32(1108769794);
+emit_32(3264507911);
+emit_32(3263483911);
+emit_32(1109911929);
+emit_32(3264507911);
+emit_32(3262775296);
+emit_32(1110640427);
+emit_32(3264507911);
+emit_32(3261751309);
+emit_32(1111295551);
+emit_32(3264507911);
+emit_32(3260727296);
+emit_32(1111699227);
+emit_32(3264507911);
+emit_32(3259703309);
+emit_32(1112037130);
+emit_32(3264507911);
+emit_32(3258679296);
+emit_32(1112388927);
+emit_32(3264507911);
+emit_32(3257655309);
+emit_32(1112777766);
+emit_32(3264507911);
+emit_32(3256631296);
+emit_32(1112967610);
+emit_32(3264507911);
+emit_32(3255607309);
+emit_32(1113472080);
+emit_32(3264507911);
+emit_32(3254386688);
+emit_32(1113707171);
+emit_32(3264507911);
+emit_32(3252338714);
+emit_32(1113542073);
+emit_32(3264507911);
+emit_32(3250290688);
+emit_32(1113390370);
+emit_32(3264507911);
+emit_32(3248242714);
+emit_32(1113303574);
+emit_32(3264507911);
+emit_32(3245998080);
+emit_32(1113650705);
+emit_32(3264507911);
+emit_32(3241902132);
+emit_32(1114040330);
+emit_32(3264507911);
+emit_32(3237609472);
+emit_32(1114029556);
+emit_32(3264507911);
+emit_32(3229220864);
+emit_32(1113975580);
+emit_32(3264507911);
+emit_32(0);
+emit_32(1113691390);
+emit_32(3264507911);
+emit_32(1081737216);
+emit_32(1113723162);
+emit_32(3264507911);
+emit_32(3279552512);
+emit_32(1091448267);
+emit_32(3265019904);
+emit_32(3279296528);
+emit_32(1090852236);
+emit_32(3265019904);
+emit_32(3279040545);
+emit_32(1091224616);
+emit_32(3265019904);
+emit_32(3278784496);
+emit_32(1092115172);
+emit_32(3265019904);
+emit_32(3278528512);
+emit_32(1092387560);
+emit_32(3265019904);
+emit_32(3278272528);
+emit_32(1093982696);
+emit_32(3265019904);
+emit_32(3278016545);
+emit_32(1095925288);
+emit_32(3265019904);
+emit_32(3277760496);
+emit_32(1097267780);
+emit_32(3265019904);
+emit_32(3277504512);
+emit_32(1098458962);
+emit_32(3265019904);
+emit_32(3277248528);
+emit_32(1097176554);
+emit_32(3265019904);
+emit_32(3276992545);
+emit_32(1098529427);
+emit_32(3265019904);
+emit_32(3276736496);
+emit_32(1099386480);
+emit_32(3265019904);
+emit_32(3276480512);
+emit_32(1100029729);
+emit_32(3265019904);
+emit_32(3276224528);
+emit_32(1100574360);
+emit_32(3265019904);
+emit_32(3275968545);
+emit_32(1100451571);
+emit_32(3265019904);
+emit_32(3275712496);
+emit_32(1100757808);
+emit_32(3265019904);
+emit_32(3275456512);
+emit_32(1101452909);
+emit_32(3265019904);
+emit_32(3275200528);
+emit_32(1102452412);
+emit_32(3265019904);
+emit_32(3274944545);
+emit_32(1102489269);
+emit_32(3265019904);
+emit_32(3274688496);
+emit_32(1101956383);
+emit_32(3265019904);
+emit_32(3274432512);
+emit_32(1102164106);
+emit_32(3265019904);
+emit_32(3274176528);
+emit_32(1102017829);
+emit_32(3265019904);
+emit_32(3273920545);
+emit_32(1101687633);
+emit_32(3265019904);
+emit_32(3273664496);
+emit_32(1101190398);
+emit_32(3265019904);
+emit_32(3273408512);
+emit_32(1100930771);
+emit_32(3265019904);
+emit_32(3273152528);
+emit_32(1099875379);
+emit_32(3265019904);
+emit_32(3272896545);
+emit_32(1099988363);
+emit_32(3265019904);
+emit_32(3272640496);
+emit_32(1099466749);
+emit_32(3265019904);
+emit_32(3272384512);
+emit_32(1099025927);
+emit_32(3265019904);
+emit_32(3272128528);
+emit_32(1097133667);
+emit_32(3265019904);
+emit_32(3271872545);
+emit_32(1096125042);
+emit_32(3265019904);
+emit_32(3271616496);
+emit_32(1097217448);
+emit_32(3265019904);
+emit_32(3271163904);
+emit_32(1097530343);
+emit_32(3265019904);
+emit_32(3270651937);
+emit_32(1097021365);
+emit_32(3265019904);
+emit_32(3270139970);
+emit_32(1098337432);
+emit_32(3265019904);
+emit_32(3269627871);
+emit_32(1099231186);
+emit_32(3265019904);
+emit_32(3269115904);
+emit_32(1099058066);
+emit_32(3265019904);
+emit_32(3268603937);
+emit_32(1098845363);
+emit_32(3265019904);
+emit_32(3268091970);
+emit_32(1099724436);
+emit_32(3265019904);
+emit_32(3267579911);
+emit_32(1100562825);
+emit_32(3265019904);
+emit_32(3267067904);
+emit_32(1101564635);
+emit_32(3265019904);
+emit_32(3266555911);
+emit_32(1102663280);
+emit_32(3265019904);
+emit_32(3266043904);
+emit_32(1103783055);
+emit_32(3265019904);
+emit_32(3265531911);
+emit_32(1105695185);
+emit_32(3265019904);
+emit_32(3265019904);
+emit_32(1107222541);
+emit_32(3265019904);
+emit_32(3264507911);
+emit_32(1108142824);
+emit_32(3265019904);
+emit_32(3263995904);
+emit_32(1108595363);
+emit_32(3265019904);
+emit_32(3263483911);
+emit_32(1109574812);
+emit_32(3265019904);
+emit_32(3262775296);
+emit_32(1110596754);
+emit_32(3265019904);
+emit_32(3261751309);
+emit_32(1111223304);
+emit_32(3265019904);
+emit_32(3260727296);
+emit_32(1111571117);
+emit_32(3265019904);
+emit_32(3259703309);
+emit_32(1111962445);
+emit_32(3265019904);
+emit_32(3258679296);
+emit_32(1112404944);
+emit_32(3265019904);
+emit_32(3257655309);
+emit_32(1112735429);
+emit_32(3265019904);
+emit_32(3256631296);
+emit_32(1112827337);
+emit_32(3265019904);
+emit_32(3255607309);
+emit_32(1113233949);
+emit_32(3265019904);
+emit_32(3254386688);
+emit_32(1113414513);
+emit_32(3265019904);
+emit_32(3252338714);
+emit_32(1113420150);
+emit_32(3265019904);
+emit_32(3250290688);
+emit_32(1113163904);
+emit_32(3265019904);
+emit_32(3248242714);
+emit_32(1113052807);
+emit_32(3265019904);
+emit_32(3245998080);
+emit_32(1113343787);
+emit_32(3265019904);
+emit_32(3241902132);
+emit_32(1113698599);
+emit_32(3265019904);
+emit_32(3237609472);
+emit_32(1113628816);
+emit_32(3265019904);
+emit_32(3229220864);
+emit_32(1113662187);
+emit_32(3265019904);
+emit_32(0);
+emit_32(1113260242);
+emit_32(3265019904);
+emit_32(1081737216);
+emit_32(1113178820);
+emit_32(3265019904);
+emit_32(3279552512);
+emit_32(1093438171);
+emit_32(3265531911);
+emit_32(3279296528);
+emit_32(1092747788);
+emit_32(3265531911);
+emit_32(3279040545);
+emit_32(1093310454);
+emit_32(3265531911);
+emit_32(3278784496);
+emit_32(1094102234);
+emit_32(3265531911);
+emit_32(3278528512);
+emit_32(1095034523);
+emit_32(3265531911);
+emit_32(3278272528);
+emit_32(1096277295);
+emit_32(3265531911);
+emit_32(3278016545);
+emit_32(1097766063);
+emit_32(3265531911);
+emit_32(3277760496);
+emit_32(1099194067);
+emit_32(3265531911);
+emit_32(3277504512);
+emit_32(1099628649);
+emit_32(3265531911);
+emit_32(3277248528);
+emit_32(1099258973);
+emit_32(3265531911);
+emit_32(3276992545);
+emit_32(1098472174);
+emit_32(3265531911);
+emit_32(3276736496);
+emit_32(1099274020);
+emit_32(3265531911);
+emit_32(3276480512);
+emit_32(1099770049);
+emit_32(3265531911);
+emit_32(3276224528);
+emit_32(1100217110);
+emit_32(3265531911);
+emit_32(3275968545);
+emit_32(1099973526);
+emit_32(3265531911);
+emit_32(3275712496);
+emit_32(1100572682);
+emit_32(3265531911);
+emit_32(3275456512);
+emit_32(1101377883);
+emit_32(3265531911);
+emit_32(3275200528);
+emit_32(1101817027);
+emit_32(3265531911);
+emit_32(3274944545);
+emit_32(1101419407);
+emit_32(3265531911);
+emit_32(3274688496);
+emit_32(1101366087);
+emit_32(3265531911);
+emit_32(3274432512);
+emit_32(1101862955);
+emit_32(3265531911);
+emit_32(3274176528);
+emit_32(1101888854);
+emit_32(3265531911);
+emit_32(3273920545);
+emit_32(1101226888);
+emit_32(3265531911);
+emit_32(3273664496);
+emit_32(1100713768);
+emit_32(3265531911);
+emit_32(3273408512);
+emit_32(1099889010);
+emit_32(3265531911);
+emit_32(3273152528);
+emit_32(1098959238);
+emit_32(3265531911);
+emit_32(3272896545);
+emit_32(1098971873);
+emit_32(3265531911);
+emit_32(3272640496);
+emit_32(1098173750);
+emit_32(3265531911);
+emit_32(3272384512);
+emit_32(1096822345);
+emit_32(3265531911);
+emit_32(3272128528);
+emit_32(1095460769);
+emit_32(3265531911);
+emit_32(3271872545);
+emit_32(1095939654);
+emit_32(3265531911);
+emit_32(3271616496);
+emit_32(1096979107);
+emit_32(3265531911);
+emit_32(3271163904);
+emit_32(1096816787);
+emit_32(3265531911);
+emit_32(3270651937);
+emit_32(1096356567);
+emit_32(3265531911);
+emit_32(3270139970);
+emit_32(1097648308);
+emit_32(3265531911);
+emit_32(3269627871);
+emit_32(1098574096);
+emit_32(3265531911);
+emit_32(3269115904);
+emit_32(1097968858);
+emit_32(3265531911);
+emit_32(3268603937);
+emit_32(1098365115);
+emit_32(3265531911);
+emit_32(3268091970);
+emit_32(1099546126);
+emit_32(3265531911);
+emit_32(3267579911);
+emit_32(1100574569);
+emit_32(3265531911);
+emit_32(3267067904);
+emit_32(1101687475);
+emit_32(3265531911);
+emit_32(3266555911);
+emit_32(1102052380);
+emit_32(3265531911);
+emit_32(3266043904);
+emit_32(1103313292);
+emit_32(3265531911);
+emit_32(3265531911);
+emit_32(1105621785);
+emit_32(3265531911);
+emit_32(3265019904);
+emit_32(1107169169);
+emit_32(3265531911);
+emit_32(3264507911);
+emit_32(1107983021);
+emit_32(3265531911);
+emit_32(3263995904);
+emit_32(1108610777);
+emit_32(3265531911);
+emit_32(3263483911);
+emit_32(1109287292);
+emit_32(3265531911);
+emit_32(3262775296);
+emit_32(1110292405);
+emit_32(3265531911);
+emit_32(3261751309);
+emit_32(1110956075);
+emit_32(3265531911);
+emit_32(3260727296);
+emit_32(1111332749);
+emit_32(3265531911);
+emit_32(3259703309);
+emit_32(1111901392);
+emit_32(3265531911);
+emit_32(3258679296);
+emit_32(1112404473);
+emit_32(3265531911);
+emit_32(3257655309);
+emit_32(1112625041);
+emit_32(3265531911);
+emit_32(3256631296);
+emit_32(1112715716);
+emit_32(3265531911);
+emit_32(3255607309);
+emit_32(1112946875);
+emit_32(3265531911);
+emit_32(3254386688);
+emit_32(1113184299);
+emit_32(3265531911);
+emit_32(3252338714);
+emit_32(1112883882);
+emit_32(3265531911);
+emit_32(3250290688);
+emit_32(1112791607);
+emit_32(3265531911);
+emit_32(3248242714);
+emit_32(1112621633);
+emit_32(3265531911);
+emit_32(3245998080);
+emit_32(1113008138);
+emit_32(3265531911);
+emit_32(3241902132);
+emit_32(1113167285);
+emit_32(3265531911);
+emit_32(3237609472);
+emit_32(1113124399);
+emit_32(3265531911);
+emit_32(3229220864);
+emit_32(1112977362);
+emit_32(3265531911);
+emit_32(0);
+emit_32(1112766703);
+emit_32(3265531911);
+emit_32(1081737216);
+emit_32(1112525767);
+emit_32(3265531911);
+emit_32(3279552512);
+emit_32(1095002332);
+emit_32(3266043904);
+emit_32(3279296528);
+emit_32(1094609640);
+emit_32(3266043904);
+emit_32(3279040545);
+emit_32(1096233255);
+emit_32(3266043904);
+emit_32(3278784496);
+emit_32(1097215037);
+emit_32(3266043904);
+emit_32(3278528512);
+emit_32(1097707028);
+emit_32(3266043904);
+emit_32(3278272528);
+emit_32(1098213910);
+emit_32(3266043904);
+emit_32(3278016545);
+emit_32(1099607939);
+emit_32(3266043904);
+emit_32(3277760496);
+emit_32(1100328888);
+emit_32(3266043904);
+emit_32(3277504512);
+emit_32(1099961205);
+emit_32(3266043904);
+emit_32(3277248528);
+emit_32(1099657799);
+emit_32(3266043904);
+emit_32(3276992545);
+emit_32(1099461558);
+emit_32(3266043904);
+emit_32(3276736496);
+emit_32(1099119408);
+emit_32(3266043904);
+emit_32(3276480512);
+emit_32(1099612763);
+emit_32(3266043904);
+emit_32(3276224528);
+emit_32(1099736862);
+emit_32(3266043904);
+emit_32(3275968545);
+emit_32(1099825729);
+emit_32(3266043904);
+emit_32(3275712496);
+emit_32(1100371460);
+emit_32(3266043904);
+emit_32(3275456512);
+emit_32(1100899051);
+emit_32(3266043904);
+emit_32(3275200528);
+emit_32(1100798702);
+emit_32(3266043904);
+emit_32(3274944545);
+emit_32(1100553703);
+emit_32(3266043904);
+emit_32(3274688496);
+emit_32(1100490159);
+emit_32(3266043904);
+emit_32(3274432512);
+emit_32(1100873309);
+emit_32(3266043904);
+emit_32(3274176528);
+emit_32(1100817524);
+emit_32(3266043904);
+emit_32(3273920545);
+emit_32(1100275568);
+emit_32(3266043904);
+emit_32(3273664496);
+emit_32(1100060977);
+emit_32(3266043904);
+emit_32(3273408512);
+emit_32(1099264636);
+emit_32(3266043904);
+emit_32(3273152528);
+emit_32(1097887279);
+emit_32(3266043904);
+emit_32(3272896545);
+emit_32(1096157548);
+emit_32(3266043904);
+emit_32(3272640496);
+emit_32(1095486249);
+emit_32(3266043904);
+emit_32(3272384512);
+emit_32(1094979368);
+emit_32(3266043904);
+emit_32(3272128528);
+emit_32(1095398693);
+emit_32(3266043904);
+emit_32(3271872545);
+emit_32(1095531024);
+emit_32(3266043904);
+emit_32(3271616496);
+emit_32(1095980968);
+emit_32(3266043904);
+emit_32(3271163904);
+emit_32(1095589534);
+emit_32(3266043904);
+emit_32(3270651937);
+emit_32(1095288383);
+emit_32(3266043904);
+emit_32(3270139970);
+emit_32(1096315044);
+emit_32(3266043904);
+emit_32(3269627871);
+emit_32(1096326788);
+emit_32(3266043904);
+emit_32(3269115904);
+emit_32(1096402705);
+emit_32(3266043904);
+emit_32(3268603937);
+emit_32(1097546911);
+emit_32(3266043904);
+emit_32(3268091970);
+emit_32(1099249798);
+emit_32(3266043904);
+emit_32(3267579911);
+emit_32(1099942016);
+emit_32(3266043904);
+emit_32(3267067904);
+emit_32(1100913469);
+emit_32(3266043904);
+emit_32(3266555911);
+emit_32(1101943433);
+emit_32(3266043904);
+emit_32(3266043904);
+emit_32(1102787536);
+emit_32(3266043904);
+emit_32(3265531911);
+emit_32(1104904507);
+emit_32(3266043904);
+emit_32(3265019904);
+emit_32(1106333873);
+emit_32(3266043904);
+emit_32(3264507911);
+emit_32(1107759779);
+emit_32(3266043904);
+emit_32(3263995904);
+emit_32(1108391467);
+emit_32(3266043904);
+emit_32(3263483911);
+emit_32(1108904981);
+emit_32(3266043904);
+emit_32(3262775296);
+emit_32(1109806757);
+emit_32(3266043904);
+emit_32(3261751309);
+emit_32(1110385151);
+emit_32(3266043904);
+emit_32(3260727296);
+emit_32(1110931145);
+emit_32(3266043904);
+emit_32(3259703309);
+emit_32(1111641319);
+emit_32(3266043904);
+emit_32(3258679296);
+emit_32(1112124634);
+emit_32(3266043904);
+emit_32(3257655309);
+emit_32(1112283257);
+emit_32(3266043904);
+emit_32(3256631296);
+emit_32(1112339618);
+emit_32(3266043904);
+emit_32(3255607309);
+emit_32(1112509383);
+emit_32(3266043904);
+emit_32(3254386688);
+emit_32(1112776009);
+emit_32(3266043904);
+emit_32(3252338714);
+emit_32(1112680825);
+emit_32(3266043904);
+emit_32(3250290688);
+emit_32(1112625539);
+emit_32(3266043904);
+emit_32(3248242714);
+emit_32(1112693513);
+emit_32(3266043904);
+emit_32(3245998080);
+emit_32(1112618644);
+emit_32(3266043904);
+emit_32(3241902132);
+emit_32(1112571616);
+emit_32(3266043904);
+emit_32(3237609472);
+emit_32(1112555074);
+emit_32(3266043904);
+emit_32(3229220864);
+emit_32(1112282576);
+emit_32(3266043904);
+emit_32(0);
+emit_32(1112161675);
+emit_32(3266043904);
+emit_32(1081737216);
+emit_32(1112016683);
+emit_32(3266043904);
+emit_32(3279552512);
+emit_32(1096435525);
+emit_32(3266555911);
+emit_32(3279296528);
+emit_32(1097116575);
+emit_32(3266555911);
+emit_32(3279040545);
+emit_32(1098870633);
+emit_32(3266555911);
+emit_32(3278784496);
+emit_32(1099498730);
+emit_32(3266555911);
+emit_32(3278528512);
+emit_32(1099914596);
+emit_32(3266555911);
+emit_32(3278272528);
+emit_32(1099951872);
+emit_32(3266555911);
+emit_32(3278016545);
+emit_32(1100659976);
+emit_32(3266555911);
+emit_32(3277760496);
+emit_32(1101078253);
+emit_32(3266555911);
+emit_32(3277504512);
+emit_32(1100635177);
+emit_32(3266555911);
+emit_32(3277248528);
+emit_32(1100013948);
+emit_32(3266555911);
+emit_32(3276992545);
+emit_32(1099614650);
+emit_32(3266555911);
+emit_32(3276736496);
+emit_32(1099488402);
+emit_32(3266555911);
+emit_32(3276480512);
+emit_32(1099820591);
+emit_32(3266555911);
+emit_32(3276224528);
+emit_32(1099553833);
+emit_32(3266555911);
+emit_32(3275968545);
+emit_32(1099782999);
+emit_32(3266555911);
+emit_32(3275712496);
+emit_32(1100398566);
+emit_32(3266555911);
+emit_32(3275456512);
+emit_32(1100575303);
+emit_32(3266555911);
+emit_32(3275200528);
+emit_32(1100289986);
+emit_32(3266555911);
+emit_32(3274944545);
+emit_32(1099602382);
+emit_32(3266555911);
+emit_32(3274688496);
+emit_32(1099733506);
+emit_32(3266555911);
+emit_32(3274432512);
+emit_32(1100008915);
+emit_32(3266555911);
+emit_32(3274176528);
+emit_32(1100003777);
+emit_32(3266555911);
+emit_32(3273920545);
+emit_32(1099179753);
+emit_32(3266555911);
+emit_32(3273664496);
+emit_32(1098406953);
+emit_32(3266555911);
+emit_32(3273408512);
+emit_32(1097223320);
+emit_32(3266555911);
+emit_32(3273152528);
+emit_32(1096202217);
+emit_32(3266555911);
+emit_32(3272896545);
+emit_32(1095613442);
+emit_32(3266555911);
+emit_32(3272640496);
+emit_32(1095615539);
+emit_32(3266555911);
+emit_32(3272384512);
+emit_32(1095008728);
+emit_32(3266555911);
+emit_32(3272128528);
+emit_32(1095144623);
+emit_32(3266555911);
+emit_32(3271872545);
+emit_32(1095756572);
+emit_32(3266555911);
+emit_32(3271616496);
+emit_32(1094683564);
+emit_32(3266555911);
+emit_32(3271163904);
+emit_32(1094540119);
+emit_32(3266555911);
+emit_32(3270651937);
+emit_32(1094978843);
+emit_32(3266555911);
+emit_32(3270139970);
+emit_32(1095340707);
+emit_32(3266555911);
+emit_32(3269627871);
+emit_32(1095981597);
+emit_32(3266555911);
+emit_32(3269115904);
+emit_32(1096517838);
+emit_32(3266555911);
+emit_32(3268603937);
+emit_32(1096669463);
+emit_32(3266555911);
+emit_32(3268091970);
+emit_32(1097720555);
+emit_32(3266555911);
+emit_32(3267579911);
+emit_32(1098962122);
+emit_32(3266555911);
+emit_32(3267067904);
+emit_32(1099956067);
+emit_32(3266555911);
+emit_32(3266555911);
+emit_32(1101017750);
+emit_32(3266555911);
+emit_32(3266043904);
+emit_32(1102473436);
+emit_32(3266555911);
+emit_32(3265531911);
+emit_32(1104059040);
+emit_32(3266555911);
+emit_32(3265019904);
+emit_32(1105738491);
+emit_32(3266555911);
+emit_32(3264507911);
+emit_32(1107208438);
+emit_32(3266555911);
+emit_32(3263995904);
+emit_32(1107891008);
+emit_32(3266555911);
+emit_32(3263483911);
+emit_32(1108674504);
+emit_32(3266555911);
+emit_32(3262775296);
+emit_32(1109604067);
+emit_32(3266555911);
+emit_32(3261751309);
+emit_32(1110189120);
+emit_32(3266555911);
+emit_32(3260727296);
+emit_32(1110577670);
+emit_32(3266555911);
+emit_32(3259703309);
+emit_32(1111354953);
+emit_32(3266555911);
+emit_32(3258679296);
+emit_32(1111734537);
+emit_32(3266555911);
+emit_32(3257655309);
+emit_32(1111705518);
+emit_32(3266555911);
+emit_32(3256631296);
+emit_32(1111723527);
+emit_32(3266555911);
+emit_32(3255607309);
+emit_32(1112027955);
+emit_32(3266555911);
+emit_32(3254386688);
+emit_32(1112257410);
+emit_32(3266555911);
+emit_32(3252338714);
+emit_32(1112640297);
+emit_32(3266555911);
+emit_32(3250290688);
+emit_32(1112609967);
+emit_32(3266555911);
+emit_32(3248242714);
+emit_32(1112557696);
+emit_32(3266555911);
+emit_32(3245998080);
+emit_32(1112351231);
+emit_32(3266555911);
+emit_32(3241902132);
+emit_32(1112040774);
+emit_32(3266555911);
+emit_32(3237609472);
+emit_32(1111912900);
+emit_32(3266555911);
+emit_32(3229220864);
+emit_32(1111694639);
+emit_32(3266555911);
+emit_32(0);
+emit_32(1111678858);
+emit_32(3266555911);
+emit_32(1081737216);
+emit_32(1111401326);
+emit_32(3266555911);
+emit_32(3279552512);
+emit_32(1098118070);
+emit_32(3267067904);
+emit_32(3279296528);
+emit_32(1099747453);
+emit_32(3267067904);
+emit_32(3279040545);
+emit_32(1100611269);
+emit_32(3267067904);
+emit_32(3278784496);
+emit_32(1101443210);
+emit_32(3267067904);
+emit_32(3278528512);
+emit_32(1101232603);
+emit_32(3267067904);
+emit_32(3278272528);
+emit_32(1101611506);
+emit_32(3267067904);
+emit_32(3278016545);
+emit_32(1101693243);
+emit_32(3267067904);
+emit_32(3277760496);
+emit_32(1101466016);
+emit_32(3267067904);
+emit_32(3277504512);
+emit_32(1101285137);
+emit_32(3267067904);
+emit_32(3277248528);
+emit_32(1100667106);
+emit_32(3267067904);
+emit_32(3276992545);
+emit_32(1100084308);
+emit_32(3267067904);
+emit_32(3276736496);
+emit_32(1099746194);
+emit_32(3267067904);
+emit_32(3276480512);
+emit_32(1099973840);
+emit_32(3267067904);
+emit_32(3276224528);
+emit_32(1099985637);
+emit_32(3267067904);
+emit_32(3275968545);
+emit_32(1099784782);
+emit_32(3267067904);
+emit_32(3275712496);
+emit_32(1100330146);
+emit_32(3267067904);
+emit_32(3275456512);
+emit_32(1100180200);
+emit_32(3267067904);
+emit_32(3275200528);
+emit_32(1099997118);
+emit_32(3267067904);
+emit_32(3274944545);
+emit_32(1099326240);
+emit_32(3267067904);
+emit_32(3274688496);
+emit_32(1099003435);
+emit_32(3267067904);
+emit_32(3274432512);
+emit_32(1099218918);
+emit_32(3267067904);
+emit_32(3274176528);
+emit_32(1098944243);
+emit_32(3267067904);
+emit_32(3273920545);
+emit_32(1097839464);
+emit_32(3267067904);
+emit_32(3273664496);
+emit_32(1095942065);
+emit_32(3267067904);
+emit_32(3273408512);
+emit_32(1094895587);
+emit_32(3267067904);
+emit_32(3273152528);
+emit_32(1094953468);
+emit_32(3267067904);
+emit_32(3272896545);
+emit_32(1095007260);
+emit_32(3267067904);
+emit_32(3272640496);
+emit_32(1095264895);
+emit_32(3267067904);
+emit_32(3272384512);
+emit_32(1094611422);
+emit_32(3267067904);
+emit_32(3272128528);
+emit_32(1095079402);
+emit_32(3267067904);
+emit_32(3271872545);
+emit_32(1094441973);
+emit_32(3267067904);
+emit_32(3271616496);
+emit_32(1094236766);
+emit_32(3267067904);
+emit_32(3271163904);
+emit_32(1094323798);
+emit_32(3267067904);
+emit_32(3270651937);
+emit_32(1094165987);
+emit_32(3267067904);
+emit_32(3270139970);
+emit_32(1094226805);
+emit_32(3267067904);
+emit_32(3269627871);
+emit_32(1094579336);
+emit_32(3267067904);
+emit_32(3269115904);
+emit_32(1095352975);
+emit_32(3267067904);
+emit_32(3268603937);
+emit_32(1095436757);
+emit_32(3267067904);
+emit_32(3268091970);
+emit_32(1095935879);
+emit_32(3267067904);
+emit_32(3267579911);
+emit_32(1097439012);
+emit_32(3267067904);
+emit_32(3267067904);
+emit_32(1099223007);
+emit_32(3267067904);
+emit_32(3266555911);
+emit_32(1100974863);
+emit_32(3267067904);
+emit_32(3266043904);
+emit_32(1102518734);
+emit_32(3267067904);
+emit_32(3265531911);
+emit_32(1104318772);
+emit_32(3267067904);
+emit_32(3265019904);
+emit_32(1105646112);
+emit_32(3267067904);
+emit_32(3264507911);
+emit_32(1106403341);
+emit_32(3267067904);
+emit_32(3263995904);
+emit_32(1107600264);
+emit_32(3267067904);
+emit_32(3263483911);
+emit_32(1108414248);
+emit_32(3267067904);
+emit_32(3262775296);
+emit_32(1109181543);
+emit_32(3267067904);
+emit_32(3261751309);
+emit_32(1109764892);
+emit_32(3267067904);
+emit_32(3260727296);
+emit_32(1110292536);
+emit_32(3267067904);
+emit_32(3259703309);
+emit_32(1110846682);
+emit_32(3267067904);
+emit_32(3258679296);
+emit_32(1111130925);
+emit_32(3267067904);
+emit_32(3257655309);
+emit_32(1111171793);
+emit_32(3267067904);
+emit_32(3256631296);
+emit_32(1111317938);
+emit_32(3267067904);
+emit_32(3255607309);
+emit_32(1111635762);
+emit_32(3267067904);
+emit_32(3254386688);
+emit_32(1112164637);
+emit_32(3267067904);
+emit_32(3252338714);
+emit_32(1112290938);
+emit_32(3267067904);
+emit_32(3250290688);
+emit_32(1112478450);
+emit_32(3267067904);
+emit_32(3248242714);
+emit_32(1112372360);
+emit_32(3267067904);
+emit_32(3245998080);
+emit_32(1111917566);
+emit_32(3267067904);
+emit_32(3241902132);
+emit_32(1112023289);
+emit_32(3267067904);
+emit_32(3237609472);
+emit_32(1111655422);
+emit_32(3267067904);
+emit_32(3229220864);
+emit_32(1111168988);
+emit_32(3267067904);
+emit_32(0);
+emit_32(1110861231);
+emit_32(3267067904);
+emit_32(1081737216);
+emit_32(1110813757);
+emit_32(3267067904);
+emit_32(3279552512);
+emit_32(1100220360);
+emit_32(3267579911);
+emit_32(3279296528);
+emit_32(1101067662);
+emit_32(3267579911);
+emit_32(3279040545);
+emit_32(1102439514);
+emit_32(3267579911);
+emit_32(3278784496);
+emit_32(1103265006);
+emit_32(3267579911);
+emit_32(3278528512);
+emit_32(1103236799);
+emit_32(3267579911);
+emit_32(3278272528);
+emit_32(1103276120);
+emit_32(3267579911);
+emit_32(3278016545);
+emit_32(1103285505);
+emit_32(3267579911);
+emit_32(3277760496);
+emit_32(1102760850);
+emit_32(3267579911);
+emit_32(3277504512);
+emit_32(1101931584);
+emit_32(3267579911);
+emit_32(3277248528);
+emit_32(1101349415);
+emit_32(3267579911);
+emit_32(3276992545);
+emit_32(1100402341);
+emit_32(3267579911);
+emit_32(3276736496);
+emit_32(1100027265);
+emit_32(3267579911);
+emit_32(3276480512);
+emit_32(1100259525);
+emit_32(3267579911);
+emit_32(3276224528);
+emit_32(1100063651);
+emit_32(3267579911);
+emit_32(3275968545);
+emit_32(1099648782);
+emit_32(3267579911);
+emit_32(3275712496);
+emit_32(1100276302);
+emit_32(3267579911);
+emit_32(3275456512);
+emit_32(1100001260);
+emit_32(3267579911);
+emit_32(3275200528);
+emit_32(1099604217);
+emit_32(3267579911);
+emit_32(3274944545);
+emit_32(1099253678);
+emit_32(3267579911);
+emit_32(3274688496);
+emit_32(1098028836);
+emit_32(3267579911);
+emit_32(3274432512);
+emit_32(1097094660);
+emit_32(3267579911);
+emit_32(3274176528);
+emit_32(1096265341);
+emit_32(3267579911);
+emit_32(3273920545);
+emit_32(1095381601);
+emit_32(3267579911);
+emit_32(3273664496);
+emit_32(1094132852);
+emit_32(3267579911);
+emit_32(3273408512);
+emit_32(1094233411);
+emit_32(3267579911);
+emit_32(3273152528);
+emit_32(1094498386);
+emit_32(3267579911);
+emit_32(3272896545);
+emit_32(1093571235);
+emit_32(3267579911);
+emit_32(3272640496);
+emit_32(1093897237);
+emit_32(3267579911);
+emit_32(3272384512);
+emit_32(1093720657);
+emit_32(3267579911);
+emit_32(3272128528);
+emit_32(1094242743);
+emit_32(3267579911);
+emit_32(3271872545);
+emit_32(1094359764);
+emit_32(3267579911);
+emit_32(3271616496);
+emit_32(1093621672);
+emit_32(3267579911);
+emit_32(3271163904);
+emit_32(1093012449);
+emit_32(3267579911);
+emit_32(3270651937);
+emit_32(1092577332);
+emit_32(3267579911);
+emit_32(3270139970);
+emit_32(1093321674);
+emit_32(3267579911);
+emit_32(3269627871);
+emit_32(1093936035);
+emit_32(3267579911);
+emit_32(3269115904);
+emit_32(1093928170);
+emit_32(3267579911);
+emit_32(3268603937);
+emit_32(1094840746);
+emit_32(3267579911);
+emit_32(3268091970);
+emit_32(1094808555);
+emit_32(3267579911);
+emit_32(3267579911);
+emit_32(1096373764);
+emit_32(3267579911);
+emit_32(3267067904);
+emit_32(1099250323);
+emit_32(3267579911);
+emit_32(3266555911);
+emit_32(1100852966);
+emit_32(3267579911);
+emit_32(3266043904);
+emit_32(1102489846);
+emit_32(3267579911);
+emit_32(3265531911);
+emit_32(1104539655);
+emit_32(3267579911);
+emit_32(3265019904);
+emit_32(1105973058);
+emit_32(3267579911);
+emit_32(3264507911);
+emit_32(1106325275);
+emit_32(3267579911);
+emit_32(3263995904);
+emit_32(1107714664);
+emit_32(3267579911);
+emit_32(3263483911);
+emit_32(1108389003);
+emit_32(3267579911);
+emit_32(3262775296);
+emit_32(1108702606);
+emit_32(3267579911);
+emit_32(3261751309);
+emit_32(1109247787);
+emit_32(3267579911);
+emit_32(3260727296);
+emit_32(1109490349);
+emit_32(3267579911);
+emit_32(3259703309);
+emit_32(1110247866);
+emit_32(3267579911);
+emit_32(3258679296);
+emit_32(1110389712);
+emit_32(3267579911);
+emit_32(3257655309);
+emit_32(1110661425);
+emit_32(3267579911);
+emit_32(3256631296);
+emit_32(1111202018);
+emit_32(3267579911);
+emit_32(3255607309);
+emit_32(1111704260);
+emit_32(3267579911);
+emit_32(3254386688);
+emit_32(1112088275);
+emit_32(3267579911);
+emit_32(3252338714);
+emit_32(1111942549);
+emit_32(3267579911);
+emit_32(3250290688);
+emit_32(1111975579);
+emit_32(3267579911);
+emit_32(3248242714);
+emit_32(1111977309);
+emit_32(3267579911);
+emit_32(3245998080);
+emit_32(1111576202);
+emit_32(3267579911);
+emit_32(3241902132);
+emit_32(1111451789);
+emit_32(3267579911);
+emit_32(3237609472);
+emit_32(1111316601);
+emit_32(3267579911);
+emit_32(3229220864);
+emit_32(1111007166);
+emit_32(3267579911);
+emit_32(0);
+emit_32(1110677022);
+emit_32(3267579911);
+emit_32(1081737216);
+emit_32(1110694612);
+emit_32(3267579911);
+emit_32(3279552512);
+emit_32(1101546599);
+emit_32(3268091970);
+emit_32(3279296528);
+emit_32(1102626423);
+emit_32(3268091970);
+emit_32(3279040545);
+emit_32(1103845864);
+emit_32(3268091970);
+emit_32(3278784496);
+emit_32(1104837345);
+emit_32(3268091970);
+emit_32(3278528512);
+emit_32(1104581650);
+emit_32(3268091970);
+emit_32(3278272528);
+emit_32(1104347136);
+emit_32(3268091970);
+emit_32(3278016545);
+emit_32(1104555173);
+emit_32(3268091970);
+emit_32(3277760496);
+emit_32(1103817186);
+emit_32(3268091970);
+emit_32(3277504512);
+emit_32(1102977119);
+emit_32(3268091970);
+emit_32(3277248528);
+emit_32(1101762816);
+emit_32(3268091970);
+emit_32(3276992545);
+emit_32(1100889928);
+emit_32(3268091970);
+emit_32(3276736496);
+emit_32(1100508824);
+emit_32(3268091970);
+emit_32(3276480512);
+emit_32(1100799646);
+emit_32(3268091970);
+emit_32(3276224528);
+emit_32(1100611741);
+emit_32(3268091970);
+emit_32(3275968545);
+emit_32(1099998639);
+emit_32(3268091970);
+emit_32(3275712496);
+emit_32(1099825152);
+emit_32(3268091970);
+emit_32(3275456512);
+emit_32(1099499674);
+emit_32(3268091970);
+emit_32(3275200528);
+emit_32(1099020422);
+emit_32(3268091970);
+emit_32(3274944545);
+emit_32(1098795241);
+emit_32(3268091970);
+emit_32(3274688496);
+emit_32(1097320733);
+emit_32(3268091970);
+emit_32(3274432512);
+emit_32(1096709728);
+emit_32(3268091970);
+emit_32(3274176528);
+emit_32(1095004848);
+emit_32(3268091970);
+emit_32(3273920545);
+emit_32(1094273362);
+emit_32(3268091970);
+emit_32(3273664496);
+emit_32(1094729282);
+emit_32(3268091970);
+emit_32(3273408512);
+emit_32(1094410620);
+emit_32(3268091970);
+emit_32(3273152528);
+emit_32(1093402205);
+emit_32(3268091970);
+emit_32(3272896545);
+emit_32(1092271431);
+emit_32(3268091970);
+emit_32(3272640496);
+emit_32(1092329176);
+emit_32(3268091970);
+emit_32(3272384512);
+emit_32(1092614609);
+emit_32(3268091970);
+emit_32(3272128528);
+emit_32(1093144674);
+emit_32(3268091970);
+emit_32(3271872545);
+emit_32(1093760922);
+emit_32(3268091970);
+emit_32(3271616496);
+emit_32(1093140165);
+emit_32(3268091970);
+emit_32(3271163904);
+emit_32(1091696654);
+emit_32(3268091970);
+emit_32(3270651937);
+emit_32(1090884374);
+emit_32(3268091970);
+emit_32(3270139970);
+emit_32(1091484506);
+emit_32(3268091970);
+emit_32(3269627871);
+emit_32(1092037976);
+emit_32(3268091970);
+emit_32(3269115904);
+emit_32(1093188295);
+emit_32(3268091970);
+emit_32(3268603937);
+emit_32(1093395808);
+emit_32(3268091970);
+emit_32(3268091970);
+emit_32(1094337220);
+emit_32(3268091970);
+emit_32(3267579911);
+emit_32(1097044643);
+emit_32(3268091970);
+emit_32(3267067904);
+emit_32(1099465543);
+emit_32(3268091970);
+emit_32(3266555911);
+emit_32(1101317433);
+emit_32(3268091970);
+emit_32(3266043904);
+emit_32(1102556745);
+emit_32(3268091970);
+emit_32(3265531911);
+emit_32(1104196718);
+emit_32(3268091970);
+emit_32(3265019904);
+emit_32(1105380036);
+emit_32(3268091970);
+emit_32(3264507911);
+emit_32(1106482194);
+emit_32(3268091970);
+emit_32(3263995904);
+emit_32(1107758783);
+emit_32(3268091970);
+emit_32(3263483911);
+emit_32(1108425415);
+emit_32(3268091970);
+emit_32(3262775296);
+emit_32(1108887024);
+emit_32(3268091970);
+emit_32(3261751309);
+emit_32(1109173128);
+emit_32(3268091970);
+emit_32(3260727296);
+emit_32(1109482432);
+emit_32(3268091970);
+emit_32(3259703309);
+emit_32(1109785208);
+emit_32(3268091970);
+emit_32(3258679296);
+emit_32(1110180600);
+emit_32(3268091970);
+emit_32(3257655309);
+emit_32(1110663076);
+emit_32(3268091970);
+emit_32(3256631296);
+emit_32(1111283309);
+emit_32(3268091970);
+emit_32(3255607309);
+emit_32(1111318829);
+emit_32(3268091970);
+emit_32(3254386688);
+emit_32(1111804844);
+emit_32(3268091970);
+emit_32(3252338714);
+emit_32(1111712072);
+emit_32(3268091970);
+emit_32(3250290688);
+emit_32(1111394877);
+emit_32(3268091970);
+emit_32(3248242714);
+emit_32(1111473652);
+emit_32(3268091970);
+emit_32(3245998080);
+emit_32(1111266139);
+emit_32(3268091970);
+emit_32(3241902132);
+emit_32(1110947660);
+emit_32(3268091970);
+emit_32(3237609472);
+emit_32(1111203722);
+emit_32(3268091970);
+emit_32(3229220864);
+emit_32(1110998647);
+emit_32(3268091970);
+emit_32(0);
+emit_32(1110773727);
+emit_32(3268091970);
+emit_32(1081737216);
+emit_32(1110581209);
+emit_32(3268091970);
+emit_32(3279552512);
+emit_32(1103102267);
+emit_32(3268603937);
+emit_32(3279296528);
+emit_32(1104534831);
+emit_32(3268603937);
+emit_32(3279040545);
+emit_32(1105424810);
+emit_32(3268603937);
+emit_32(3278784496);
+emit_32(1105745989);
+emit_32(3268603937);
+emit_32(3278528512);
+emit_32(1105282046);
+emit_32(3268603937);
+emit_32(3278272528);
+emit_32(1105208436);
+emit_32(3268603937);
+emit_32(3278016545);
+emit_32(1104906394);
+emit_32(3268603937);
+emit_32(3277760496);
+emit_32(1104679063);
+emit_32(3268603937);
+emit_32(3277504512);
+emit_32(1103607680);
+emit_32(3268603937);
+emit_32(3277248528);
+emit_32(1102510188);
+emit_32(3268603937);
+emit_32(3276992545);
+emit_32(1101765385);
+emit_32(3268603937);
+emit_32(3276736496);
+emit_32(1101636986);
+emit_32(3268603937);
+emit_32(3276480512);
+emit_32(1101430207);
+emit_32(3268603937);
+emit_32(3276224528);
+emit_32(1101386534);
+emit_32(3268603937);
+emit_32(3275968545);
+emit_32(1100866283);
+emit_32(3268603937);
+emit_32(3275712496);
+emit_32(1100204370);
+emit_32(3268603937);
+emit_32(3275456512);
+emit_32(1099530240);
+emit_32(3268603937);
+emit_32(3275200528);
+emit_32(1098318663);
+emit_32(3268603937);
+emit_32(3274944545);
+emit_32(1096968831);
+emit_32(3268603937);
+emit_32(3274688496);
+emit_32(1096686764);
+emit_32(3268603937);
+emit_32(3274432512);
+emit_32(1095657901);
+emit_32(3268603937);
+emit_32(3274176528);
+emit_32(1093922718);
+emit_32(3268603937);
+emit_32(3273920545);
+emit_32(1093799720);
+emit_32(3268603937);
+emit_32(3273664496);
+emit_32(1093400527);
+emit_32(3268603937);
+emit_32(3273408512);
+emit_32(1094189371);
+emit_32(3268603937);
+emit_32(3273152528);
+emit_32(1093002383);
+emit_32(3268603937);
+emit_32(3272896545);
+emit_32(1092483505);
+emit_32(3268603937);
+emit_32(3272640496);
+emit_32(1092251707);
+emit_32(3268603937);
+emit_32(3272384512);
+emit_32(1090906562);
+emit_32(3268603937);
+emit_32(3272128528);
+emit_32(1091695983);
+emit_32(3268603937);
+emit_32(3271872545);
+emit_32(1092003666);
+emit_32(3268603937);
+emit_32(3271616496);
+emit_32(1091543866);
+emit_32(3268603937);
+emit_32(3271163904);
+emit_32(1090300789);
+emit_32(3268603937);
+emit_32(3270651937);
+emit_32(1088844569);
+emit_32(3268603937);
+emit_32(3270139970);
+emit_32(1087660223);
+emit_32(3268603937);
+emit_32(3269627871);
+emit_32(1090808153);
+emit_32(3268603937);
+emit_32(3269115904);
+emit_32(1090929306);
+emit_32(3268603937);
+emit_32(3268603937);
+emit_32(1092294940);
+emit_32(3268603937);
+emit_32(3268091970);
+emit_32(1094951266);
+emit_32(3268603937);
+emit_32(3267579911);
+emit_32(1098255958);
+emit_32(3268603937);
+emit_32(3267067904);
+emit_32(1100042365);
+emit_32(3268603937);
+emit_32(3266555911);
+emit_32(1101461717);
+emit_32(3268603937);
+emit_32(3266043904);
+emit_32(1102844841);
+emit_32(3268603937);
+emit_32(3265531911);
+emit_32(1103734872);
+emit_32(3268603937);
+emit_32(3265019904);
+emit_32(1105122348);
+emit_32(3268603937);
+emit_32(3264507911);
+emit_32(1106689969);
+emit_32(3268603937);
+emit_32(3263995904);
+emit_32(1107793438);
+emit_32(3268603937);
+emit_32(3263483911);
+emit_32(1108426280);
+emit_32(3268603937);
+emit_32(3262775296);
+emit_32(1108850534);
+emit_32(3268603937);
+emit_32(3261751309);
+emit_32(1109340009);
+emit_32(3268603937);
+emit_32(3260727296);
+emit_32(1109539003);
+emit_32(3268603937);
+emit_32(3259703309);
+emit_32(1109953715);
+emit_32(3268603937);
+emit_32(3258679296);
+emit_32(1110117502);
+emit_32(3268603937);
+emit_32(3257655309);
+emit_32(1110591485);
+emit_32(3268603937);
+emit_32(3256631296);
+emit_32(1111088562);
+emit_32(3268603937);
+emit_32(3255607309);
+emit_32(1111126206);
+emit_32(3268603937);
+emit_32(3254386688);
+emit_32(1111259559);
+emit_32(3268603937);
+emit_32(3252338714);
+emit_32(1111504191);
+emit_32(3268603937);
+emit_32(3250290688);
+emit_32(1111434068);
+emit_32(3268603937);
+emit_32(3248242714);
+emit_32(1111442299);
+emit_32(3268603937);
+emit_32(3245998080);
+emit_32(1111170010);
+emit_32(3268603937);
+emit_32(3241902132);
+emit_32(1110967137);
+emit_32(3268603937);
+emit_32(3237609472);
+emit_32(1111303415);
+emit_32(3268603937);
+emit_32(3229220864);
+emit_32(1111224012);
+emit_32(3268603937);
+emit_32(0);
+emit_32(1110873788);
+emit_32(3268603937);
+emit_32(1081737216);
+emit_32(1110663915);
+emit_32(3268603937);
+emit_32(3279552512);
+emit_32(1104677595);
+emit_32(3269115904);
+emit_32(3279296528);
+emit_32(1105454590);
+emit_32(3269115904);
+emit_32(3279040545);
+emit_32(1106154304);
+emit_32(3269115904);
+emit_32(3278784496);
+emit_32(1106277093);
+emit_32(3269115904);
+emit_32(3278528512);
+emit_32(1105875016);
+emit_32(3269115904);
+emit_32(3278272528);
+emit_32(1106034452);
+emit_32(3269115904);
+emit_32(3278016545);
+emit_32(1105655077);
+emit_32(3269115904);
+emit_32(3277760496);
+emit_32(1104930721);
+emit_32(3269115904);
+emit_32(3277504512);
+emit_32(1104001892);
+emit_32(3269115904);
+emit_32(3277248528);
+emit_32(1103101166);
+emit_32(3269115904);
+emit_32(3276992545);
+emit_32(1102785177);
+emit_32(3269115904);
+emit_32(3276736496);
+emit_32(1102764678);
+emit_32(3269115904);
+emit_32(3276480512);
+emit_32(1102751256);
+emit_32(3269115904);
+emit_32(3276224528);
+emit_32(1102164210);
+emit_32(3269115904);
+emit_32(3275968545);
+emit_32(1101552786);
+emit_32(3269115904);
+emit_32(3275712496);
+emit_32(1101117679);
+emit_32(3269115904);
+emit_32(3275456512);
+emit_32(1100386245);
+emit_32(3269115904);
+emit_32(3275200528);
+emit_32(1099326974);
+emit_32(3269115904);
+emit_32(3274944545);
+emit_32(1098796709);
+emit_32(3269115904);
+emit_32(3274688496);
+emit_32(1097716256);
+emit_32(3269115904);
+emit_32(3274432512);
+emit_32(1095916585);
+emit_32(3269115904);
+emit_32(3274176528);
+emit_32(1095486669);
+emit_32(3269115904);
+emit_32(3273920545);
+emit_32(1093398010);
+emit_32(3269115904);
+emit_32(3273664496);
+emit_32(1092921118);
+emit_32(3269115904);
+emit_32(3273408512);
+emit_32(1092252829);
+emit_32(3269115904);
+emit_32(3273152528);
+emit_32(1092749676);
+emit_32(3269115904);
+emit_32(3272896545);
+emit_32(1092530481);
+emit_32(3269115904);
+emit_32(3272640496);
+emit_32(1091486131);
+emit_32(3269115904);
+emit_32(3272384512);
+emit_32(1090876730);
+emit_32(3269115904);
+emit_32(3272128528);
+emit_32(1090142454);
+emit_32(3269115904);
+emit_32(3271872545);
+emit_32(1088793147);
+emit_32(3269115904);
+emit_32(3271616496);
+emit_32(1089015130);
+emit_32(3269115904);
+emit_32(3271163904);
+emit_32(1088303693);
+emit_32(3269115904);
+emit_32(3270651937);
+emit_32(1087535674);
+emit_32(3269115904);
+emit_32(3270139970);
+emit_32(1085670299);
+emit_32(3269115904);
+emit_32(3269627871);
+emit_32(1085625420);
+emit_32(3269115904);
+emit_32(3269115904);
+emit_32(1088308013);
+emit_32(3269115904);
+emit_32(3268603937);
+emit_32(1092417340);
+emit_32(3269115904);
+emit_32(3268091970);
+emit_32(1095410752);
+emit_32(3269115904);
+emit_32(3267579911);
+emit_32(1098094582);
+emit_32(3269115904);
+emit_32(3267067904);
+emit_32(1100161430);
+emit_32(3269115904);
+emit_32(3266555911);
+emit_32(1101552891);
+emit_32(3269115904);
+emit_32(3266043904);
+emit_32(1102765307);
+emit_32(3269115904);
+emit_32(3265531911);
+emit_32(1103641549);
+emit_32(3269115904);
+emit_32(3265019904);
+emit_32(1105704360);
+emit_32(3269115904);
+emit_32(3264507911);
+emit_32(1107288811);
+emit_32(3269115904);
+emit_32(3263995904);
+emit_32(1107972981);
+emit_32(3269115904);
+emit_32(3263483911);
+emit_32(1108646167);
+emit_32(3269115904);
+emit_32(3262775296);
+emit_32(1109009918);
+emit_32(3269115904);
+emit_32(3261751309);
+emit_32(1109314581);
+emit_32(3269115904);
+emit_32(3260727296);
+emit_32(1109742427);
+emit_32(3269115904);
+emit_32(3259703309);
+emit_32(1110003653);
+emit_32(3269115904);
+emit_32(3258679296);
+emit_32(1110284435);
+emit_32(3269115904);
+emit_32(3257655309);
+emit_32(1110677153);
+emit_32(3269115904);
+emit_32(3256631296);
+emit_32(1111084630);
+emit_32(3269115904);
+emit_32(3255607309);
+emit_32(1111141489);
+emit_32(3269115904);
+emit_32(3254386688);
+emit_32(1111299090);
+emit_32(3269115904);
+emit_32(3252338714);
+emit_32(1111545138);
+emit_32(3269115904);
+emit_32(3250290688);
+emit_32(1111299378);
+emit_32(3269115904);
+emit_32(3248242714);
+emit_32(1111477977);
+emit_32(3269115904);
+emit_32(3245998080);
+emit_32(1111335580);
+emit_32(3269115904);
+emit_32(3241902132);
+emit_32(1111332776);
+emit_32(3269115904);
+emit_32(3237609472);
+emit_32(1111510640);
+emit_32(3269115904);
+emit_32(3229220864);
+emit_32(1111358806);
+emit_32(3269115904);
+emit_32(0);
+emit_32(1111013904);
+emit_32(3269115904);
+emit_32(1081737216);
+emit_32(1110808645);
+emit_32(3269115904);
+emit_32(3279552512);
+emit_32(1105473988);
+emit_32(3269627871);
+emit_32(3279296528);
+emit_32(1106406644);
+emit_32(3269627871);
+emit_32(3279040545);
+emit_32(1106900052);
+emit_32(3269627871);
+emit_32(3278784496);
+emit_32(1106631983);
+emit_32(3269627871);
+emit_32(3278528512);
+emit_32(1106899527);
+emit_32(3269627871);
+emit_32(3278272528);
+emit_32(1107077575);
+emit_32(3269627871);
+emit_32(3278016545);
+emit_32(1106405386);
+emit_32(3269627871);
+emit_32(3277760496);
+emit_32(1105322207);
+emit_32(3269627871);
+emit_32(3277504512);
+emit_32(1104051752);
+emit_32(3269627871);
+emit_32(3277248528);
+emit_32(1103820331);
+emit_32(3269627871);
+emit_32(3276992545);
+emit_32(1103544189);
+emit_32(3269627871);
+emit_32(3276736496);
+emit_32(1104020714);
+emit_32(3269627871);
+emit_32(3276480512);
+emit_32(1104151629);
+emit_32(3269627871);
+emit_32(3276224528);
+emit_32(1103575069);
+emit_32(3269627871);
+emit_32(3275968545);
+emit_32(1102962911);
+emit_32(3269627871);
+emit_32(3275712496);
+emit_32(1102032824);
+emit_32(3269627871);
+emit_32(3275456512);
+emit_32(1101115320);
+emit_32(3269627871);
+emit_32(3275200528);
+emit_32(1100461113);
+emit_32(3269627871);
+emit_32(3274944545);
+emit_32(1099847644);
+emit_32(3269627871);
+emit_32(3274688496);
+emit_32(1099097702);
+emit_32(3269627871);
+emit_32(3274432512);
+emit_32(1097494692);
+emit_32(3269627871);
+emit_32(3274176528);
+emit_32(1096228851);
+emit_32(3269627871);
+emit_32(3273920545);
+emit_32(1094225966);
+emit_32(3269627871);
+emit_32(3273664496);
+emit_32(1093095391);
+emit_32(3269627871);
+emit_32(3273408512);
+emit_32(1092478294);
+emit_32(3269627871);
+emit_32(3273152528);
+emit_32(1092368508);
+emit_32(3269627871);
+emit_32(3272896545);
+emit_32(1091995425);
+emit_32(3269627871);
+emit_32(3272640496);
+emit_32(1090918526);
+emit_32(3269627871);
+emit_32(3272384512);
+emit_32(1090551315);
+emit_32(3269627871);
+emit_32(3272128528);
+emit_32(1089373156);
+emit_32(3269627871);
+emit_32(3271872545);
+emit_32(1087003689);
+emit_32(3269627871);
+emit_32(3271616496);
+emit_32(1086132763);
+emit_32(3269627871);
+emit_32(3271163904);
+emit_32(1085152973);
+emit_32(3269627871);
+emit_32(3270651937);
+emit_32(1085347149);
+emit_32(3269627871);
+emit_32(3270139970);
+emit_32(1084963286);
+emit_32(3269627871);
+emit_32(3269627871);
+emit_32(1086623454);
+emit_32(3269627871);
+emit_32(3269115904);
+emit_32(1089942512);
+emit_32(3269627871);
+emit_32(3268603937);
+emit_32(1092605381);
+emit_32(3269627871);
+emit_32(3268091970);
+emit_32(1095649093);
+emit_32(3269627871);
+emit_32(3267579911);
+emit_32(1098551656);
+emit_32(3269627871);
+emit_32(3267067904);
+emit_32(1100188326);
+emit_32(3269627871);
+emit_32(3266555911);
+emit_32(1101247703);
+emit_32(3269627871);
+emit_32(3266043904);
+emit_32(1102236038);
+emit_32(3269627871);
+emit_32(3265531911);
+emit_32(1104015996);
+emit_32(3269627871);
+emit_32(3265019904);
+emit_32(1106019562);
+emit_32(3269627871);
+emit_32(3264507911);
+emit_32(1107489640);
+emit_32(3269627871);
+emit_32(3263995904);
+emit_32(1107939269);
+emit_32(3269627871);
+emit_32(3263483911);
+emit_32(1108609493);
+emit_32(3269627871);
+emit_32(3262775296);
+emit_32(1108936360);
+emit_32(3269627871);
+emit_32(3261751309);
+emit_32(1109365909);
+emit_32(3269627871);
+emit_32(3260727296);
+emit_32(1109731836);
+emit_32(3269627871);
+emit_32(3259703309);
+emit_32(1110075454);
+emit_32(3269627871);
+emit_32(3258679296);
+emit_32(1110274841);
+emit_32(3269627871);
+emit_32(3257655309);
+emit_32(1110532397);
+emit_32(3269627871);
+emit_32(3256631296);
+emit_32(1110820677);
+emit_32(3269627871);
+emit_32(3255607309);
+emit_32(1110970388);
+emit_32(3269627871);
+emit_32(3254386688);
+emit_32(1111402270);
+emit_32(3269627871);
+emit_32(3252338714);
+emit_32(1111410187);
+emit_32(3269627871);
+emit_32(3250290688);
+emit_32(1111092730);
+emit_32(3269627871);
+emit_32(3248242714);
+emit_32(1111561549);
+emit_32(3269627871);
+emit_32(3245998080);
+emit_32(1111622576);
+emit_32(3269627871);
+emit_32(3241902132);
+emit_32(1111406543);
+emit_32(3269627871);
+emit_32(3237609472);
+emit_32(1111614869);
+emit_32(3269627871);
+emit_32(3229220864);
+emit_32(1111623991);
+emit_32(3269627871);
+emit_32(0);
+emit_32(1111334244);
+emit_32(3269627871);
+emit_32(1081737216);
+emit_32(1111356054);
+emit_32(3269627871);
+emit_32(3279552512);
+emit_32(1106615049);
+emit_32(3270139970);
+emit_32(3279296528);
+emit_32(1107119309);
+emit_32(3270139970);
+emit_32(3279040545);
+emit_32(1107204296);
+emit_32(3270139970);
+emit_32(3278784496);
+emit_32(1107426043);
+emit_32(3270139970);
+emit_32(3278528512);
+emit_32(1107651514);
+emit_32(3270139970);
+emit_32(3278272528);
+emit_32(1107492104);
+emit_32(3270139970);
+emit_32(3278016545);
+emit_32(1106671934);
+emit_32(3270139970);
+emit_32(3277760496);
+emit_32(1105363468);
+emit_32(3270139970);
+emit_32(3277504512);
+emit_32(1104722631);
+emit_32(3270139970);
+emit_32(3277248528);
+emit_32(1104684463);
+emit_32(3270139970);
+emit_32(3276992545);
+emit_32(1104973765);
+emit_32(3270139970);
+emit_32(3276736496);
+emit_32(1105162981);
+emit_32(3270139970);
+emit_32(3276480512);
+emit_32(1105246762);
+emit_32(3270139970);
+emit_32(3276224528);
+emit_32(1104513126);
+emit_32(3270139970);
+emit_32(3275968545);
+emit_32(1103992350);
+emit_32(3270139970);
+emit_32(3275712496);
+emit_32(1103134301);
+emit_32(3270139970);
+emit_32(3275456512);
+emit_32(1102130761);
+emit_32(3270139970);
+emit_32(3275200528);
+emit_32(1101510214);
+emit_32(3270139970);
+emit_32(3274944545);
+emit_32(1100554804);
+emit_32(3270139970);
+emit_32(3274688496);
+emit_32(1100005560);
+emit_32(3270139970);
+emit_32(3274432512);
+emit_32(1099090258);
+emit_32(3270139970);
+emit_32(3274176528);
+emit_32(1096702388);
+emit_32(3270139970);
+emit_32(3273920545);
+emit_32(1094929875);
+emit_32(3270139970);
+emit_32(3273664496);
+emit_32(1093071903);
+emit_32(3270139970);
+emit_32(3273408512);
+emit_32(1091864185);
+emit_32(3270139970);
+emit_32(3273152528);
+emit_32(1090738538);
+emit_32(3270139970);
+emit_32(3272896545);
+emit_32(1089872215);
+emit_32(3270139970);
+emit_32(3272640496);
+emit_32(1088532009);
+emit_32(3270139970);
+emit_32(3272384512);
+emit_32(1087136019);
+emit_32(3270139970);
+emit_32(3272128528);
+emit_32(1086091155);
+emit_32(3270139970);
+emit_32(3271872545);
+emit_32(1083137212);
+emit_32(3270139970);
+emit_32(3271616496);
+emit_32(1082194374);
+emit_32(3270139970);
+emit_32(3271163904);
+emit_32(1084156344);
+emit_32(3270139970);
+emit_32(3270651937);
+emit_32(1086494710);
+emit_32(3270139970);
+emit_32(3270139970);
+emit_32(1087925178);
+emit_32(3270139970);
+emit_32(3269627871);
+emit_32(1089283545);
+emit_32(3270139970);
+emit_32(3269115904);
+emit_32(1089544493);
+emit_32(3270139970);
+emit_32(3268603937);
+emit_32(1092490552);
+emit_32(3270139970);
+emit_32(3268091970);
+emit_32(1094596637);
+emit_32(3270139970);
+emit_32(3267579911);
+emit_32(1097303536);
+emit_32(3270139970);
+emit_32(3267067904);
+emit_32(1099546598);
+emit_32(3270139970);
+emit_32(3266555911);
+emit_32(1101122293);
+emit_32(3270139970);
+emit_32(3266043904);
+emit_32(1102198394);
+emit_32(3270139970);
+emit_32(3265531911);
+emit_32(1104133751);
+emit_32(3270139970);
+emit_32(3265019904);
+emit_32(1105876641);
+emit_32(3270139970);
+emit_32(3264507911);
+emit_32(1107287081);
+emit_32(3270139970);
+emit_32(3263995904);
+emit_32(1107840362);
+emit_32(3270139970);
+emit_32(3263483911);
+emit_32(1108323913);
+emit_32(3270139970);
+emit_32(3262775296);
+emit_32(1108846340);
+emit_32(3270139970);
+emit_32(3261751309);
+emit_32(1109191243);
+emit_32(3270139970);
+emit_32(3260727296);
+emit_32(1109548335);
+emit_32(3270139970);
+emit_32(3259703309);
+emit_32(1110053775);
+emit_32(3270139970);
+emit_32(3258679296);
+emit_32(1110107410);
+emit_32(3270139970);
+emit_32(3257655309);
+emit_32(1110399726);
+emit_32(3270139970);
+emit_32(3256631296);
+emit_32(1110760515);
+emit_32(3270139970);
+emit_32(3255607309);
+emit_32(1110729294);
+emit_32(3270139970);
+emit_32(3254386688);
+emit_32(1110963755);
+emit_32(3270139970);
+emit_32(3252338714);
+emit_32(1110772128);
+emit_32(3270139970);
+emit_32(3250290688);
+emit_32(1110896358);
+emit_32(3270139970);
+emit_32(3248242714);
+emit_32(1111339775);
+emit_32(3270139970);
+emit_32(3245998080);
+emit_32(1111522542);
+emit_32(3270139970);
+emit_32(3241902132);
+emit_32(1111498739);
+emit_32(3270139970);
+emit_32(3237609472);
+emit_32(1111764002);
+emit_32(3270139970);
+emit_32(3229220864);
+emit_32(1111826209);
+emit_32(3270139970);
+emit_32(0);
+emit_32(1111701062);
+emit_32(3270139970);
+emit_32(1081737216);
+emit_32(1111592455);
+emit_32(3270139970);
+emit_32(3279552512);
+emit_32(1107165027);
+emit_32(3270651937);
+emit_32(3279296528);
+emit_32(1106980268);
+emit_32(3270651937);
+emit_32(3279040545);
+emit_32(1107315707);
+emit_32(3270651937);
+emit_32(3278784496);
+emit_32(1107598272);
+emit_32(3270651937);
+emit_32(3278528512);
+emit_32(1107717469);
+emit_32(3270651937);
+emit_32(3278272528);
+emit_32(1107286557);
+emit_32(3270651937);
+emit_32(3278016545);
+emit_32(1106402712);
+emit_32(3270651937);
+emit_32(3277760496);
+emit_32(1105497896);
+emit_32(3270651937);
+emit_32(3277504512);
+emit_32(1105374898);
+emit_32(3270651937);
+emit_32(3277248528);
+emit_32(1105640659);
+emit_32(3270651937);
+emit_32(3276992545);
+emit_32(1105948416);
+emit_32(3270651937);
+emit_32(3276736496);
+emit_32(1105871923);
+emit_32(3270651937);
+emit_32(3276480512);
+emit_32(1105415268);
+emit_32(3270651937);
+emit_32(3276224528);
+emit_32(1104908386);
+emit_32(3270651937);
+emit_32(3275968545);
+emit_32(1104625166);
+emit_32(3270651937);
+emit_32(3275712496);
+emit_32(1103529981);
+emit_32(3270651937);
+emit_32(3275456512);
+emit_32(1102284535);
+emit_32(3270651937);
+emit_32(3275200528);
+emit_32(1101814668);
+emit_32(3270651937);
+emit_32(3274944545);
+emit_32(1101354395);
+emit_32(3270651937);
+emit_32(3274688496);
+emit_32(1100467772);
+emit_32(3270651937);
+emit_32(3274432512);
+emit_32(1099331902);
+emit_32(3270651937);
+emit_32(3274176528);
+emit_32(1097334469);
+emit_32(3270651937);
+emit_32(3273920545);
+emit_32(1095774713);
+emit_32(3270651937);
+emit_32(3273664496);
+emit_32(1093969274);
+emit_32(3270651937);
+emit_32(3273408512);
+emit_32(1092236870);
+emit_32(3270651937);
+emit_32(3273152528);
+emit_32(1091177242);
+emit_32(3270651937);
+emit_32(3272896545);
+emit_32(1089194521);
+emit_32(3270651937);
+emit_32(3272640496);
+emit_32(1087253250);
+emit_32(3270651937);
+emit_32(3272384512);
+emit_32(1085293042);
+emit_32(3270651937);
+emit_32(3272128528);
+emit_32(1086332055);
+emit_32(3270651937);
+emit_32(3271872545);
+emit_32(1083552217);
+emit_32(3270651937);
+emit_32(3271616496);
+emit_32(1081840228);
+emit_32(3270651937);
+emit_32(3271163904);
+emit_32(1085052373);
+emit_32(3270651937);
+emit_32(3270651937);
+emit_32(1088324601);
+emit_32(3270651937);
+emit_32(3270139970);
+emit_32(1090526128);
+emit_32(3270651937);
+emit_32(3269627871);
+emit_32(1090035353);
+emit_32(3270651937);
+emit_32(3269115904);
+emit_32(1091146088);
+emit_32(3270651937);
+emit_32(3268603937);
+emit_32(1092321972);
+emit_32(3270651937);
+emit_32(3268091970);
+emit_32(1094166931);
+emit_32(3270651937);
+emit_32(3267579911);
+emit_32(1096361705);
+emit_32(3270651937);
+emit_32(3267067904);
+emit_32(1098923167);
+emit_32(3270651937);
+emit_32(3266555911);
+emit_32(1100222510);
+emit_32(3270651937);
+emit_32(3266043904);
+emit_32(1102327683);
+emit_32(3270651937);
+emit_32(3265531911);
+emit_32(1104008865);
+emit_32(3270651937);
+emit_32(3265019904);
+emit_32(1105745465);
+emit_32(3270651937);
+emit_32(3264507911);
+emit_32(1107240472);
+emit_32(3270651937);
+emit_32(3263995904);
+emit_32(1107738152);
+emit_32(3270651937);
+emit_32(3263483911);
+emit_32(1108317333);
+emit_32(3270651937);
+emit_32(3262775296);
+emit_32(1108718230);
+emit_32(3270651937);
+emit_32(3261751309);
+emit_32(1109166313);
+emit_32(3270651937);
+emit_32(3260727296);
+emit_32(1109572767);
+emit_32(3270651937);
+emit_32(3259703309);
+emit_32(1109886999);
+emit_32(3270651937);
+emit_32(3258679296);
+emit_32(1110175934);
+emit_32(3270651937);
+emit_32(3257655309);
+emit_32(1110012409);
+emit_32(3270651937);
+emit_32(3256631296);
+emit_32(1110458420);
+emit_32(3270651937);
+emit_32(3255607309);
+emit_32(1110277908);
+emit_32(3270651937);
+emit_32(3254386688);
+emit_32(1110242571);
+emit_32(3270651937);
+emit_32(3252338714);
+emit_32(1110493941);
+emit_32(3270651937);
+emit_32(3250290688);
+emit_32(1110776139);
+emit_32(3270651937);
+emit_32(3248242714);
+emit_32(1111135643);
+emit_32(3270651937);
+emit_32(3245998080);
+emit_32(1111317021);
+emit_32(3270651937);
+emit_32(3241902132);
+emit_32(1111525111);
+emit_32(3270651937);
+emit_32(3237609472);
+emit_32(1111847102);
+emit_32(3270651937);
+emit_32(3229220864);
+emit_32(1111929704);
+emit_32(3270651937);
+emit_32(0);
+emit_32(1111847364);
+emit_32(3270651937);
+emit_32(1081737216);
+emit_32(1111930149);
+emit_32(3270651937);
+emit_32(3279552512);
+emit_32(1106982994);
+emit_32(3271163904);
+emit_32(3279296528);
+emit_32(1106990334);
+emit_32(3271163904);
+emit_32(3279040545);
+emit_32(1107378569);
+emit_32(3271163904);
+emit_32(3278784496);
+emit_32(1107553734);
+emit_32(3271163904);
+emit_32(3278528512);
+emit_32(1107478761);
+emit_32(3271163904);
+emit_32(3278272528);
+emit_32(1106962389);
+emit_32(3271163904);
+emit_32(3278016545);
+emit_32(1105953607);
+emit_32(3271163904);
+emit_32(3277760496);
+emit_32(1105995497);
+emit_32(3271163904);
+emit_32(3277504512);
+emit_32(1105958325);
+emit_32(3271163904);
+emit_32(3277248528);
+emit_32(1106168041);
+emit_32(3271163904);
+emit_32(3276992545);
+emit_32(1106461590);
+emit_32(3271163904);
+emit_32(3276736496);
+emit_32(1106400248);
+emit_32(3271163904);
+emit_32(3276480512);
+emit_32(1105590904);
+emit_32(3271163904);
+emit_32(3276224528);
+emit_32(1105294315);
+emit_32(3271163904);
+emit_32(3275968545);
+emit_32(1104823661);
+emit_32(3271163904);
+emit_32(3275712496);
+emit_32(1103994185);
+emit_32(3271163904);
+emit_32(3275456512);
+emit_32(1102728764);
+emit_32(3271163904);
+emit_32(3275200528);
+emit_32(1102137996);
+emit_32(3271163904);
+emit_32(3274944545);
+emit_32(1101349782);
+emit_32(3271163904);
+emit_32(3274688496);
+emit_32(1100398356);
+emit_32(3271163904);
+emit_32(3274432512);
+emit_32(1099098489);
+emit_32(3271163904);
+emit_32(3274176528);
+emit_32(1097575747);
+emit_32(3271163904);
+emit_32(3273920545);
+emit_32(1095747135);
+emit_32(3271163904);
+emit_32(3273664496);
+emit_32(1094011427);
+emit_32(3271163904);
+emit_32(3273408512);
+emit_32(1092817099);
+emit_32(3271163904);
+emit_32(3273152528);
+emit_32(1090935010);
+emit_32(3271163904);
+emit_32(3272896545);
+emit_32(1086813205);
+emit_32(3271163904);
+emit_32(3272640496);
+emit_32(1085254874);
+emit_32(3271163904);
+emit_32(3272384512);
+emit_32(1084610859);
+emit_32(3271163904);
+emit_32(3272128528);
+emit_32(1085403226);
+emit_32(3271163904);
+emit_32(3271872545);
+emit_32(1085803741);
+emit_32(3271163904);
+emit_32(3271616496);
+emit_32(1084901902);
+emit_32(3271163904);
+emit_32(3271163904);
+emit_32(1086653402);
+emit_32(3271163904);
+emit_32(3270651937);
+emit_32(1089541201);
+emit_32(3271163904);
+emit_32(3270139970);
+emit_32(1090924587);
+emit_32(3271163904);
+emit_32(3269627871);
+emit_32(1091193002);
+emit_32(3271163904);
+emit_32(3269115904);
+emit_32(1091042709);
+emit_32(3271163904);
+emit_32(3268603937);
+emit_32(1091824318);
+emit_32(3271163904);
+emit_32(3268091970);
+emit_32(1094207721);
+emit_32(3271163904);
+emit_32(3267579911);
+emit_32(1096193199);
+emit_32(3271163904);
+emit_32(3267067904);
+emit_32(1098383045);
+emit_32(3271163904);
+emit_32(3266555911);
+emit_32(1099615542);
+emit_32(3271163904);
+emit_32(3266043904);
+emit_32(1101433038);
+emit_32(3271163904);
+emit_32(3265531911);
+emit_32(1103595045);
+emit_32(3271163904);
+emit_32(3265019904);
+emit_32(1105129950);
+emit_32(3271163904);
+emit_32(3264507911);
+emit_32(1106326061);
+emit_32(3271163904);
+emit_32(3263995904);
+emit_32(1107411652);
+emit_32(3271163904);
+emit_32(3263483911);
+emit_32(1107887050);
+emit_32(3271163904);
+emit_32(3262775296);
+emit_32(1108492236);
+emit_32(3271163904);
+emit_32(3261751309);
+emit_32(1109105757);
+emit_32(3271163904);
+emit_32(3260727296);
+emit_32(1109424656);
+emit_32(3271163904);
+emit_32(3259703309);
+emit_32(1109901784);
+emit_32(3271163904);
+emit_32(3258679296);
+emit_32(1109885321);
+emit_32(3271163904);
+emit_32(3257655309);
+emit_32(1109822564);
+emit_32(3271163904);
+emit_32(3256631296);
+emit_32(1109824163);
+emit_32(3271163904);
+emit_32(3255607309);
+emit_32(1109730315);
+emit_32(3271163904);
+emit_32(3254386688);
+emit_32(1109803113);
+emit_32(3271163904);
+emit_32(3252338714);
+emit_32(1109995186);
+emit_32(3271163904);
+emit_32(3250290688);
+emit_32(1110434618);
+emit_32(3271163904);
+emit_32(3248242714);
+emit_32(1111024783);
+emit_32(3271163904);
+emit_32(3245998080);
+emit_32(1111309785);
+emit_32(3271163904);
+emit_32(3241902132);
+emit_32(1111384208);
+emit_32(3271163904);
+emit_32(3237609472);
+emit_32(1111783952);
+emit_32(3271163904);
+emit_32(3229220864);
+emit_32(1111918930);
+emit_32(3271163904);
+emit_32(0);
+emit_32(1112106100);
+emit_32(3271163904);
+emit_32(1081737216);
+emit_32(1112094042);
+emit_32(3271163904);
+emit_start(Landscape06Vtx)
+emit_32(3279552512);
+emit_32(1085562023);
+emit_32(1131812880);
+emit_32(3279552512);
+emit_32(1090639836);
+emit_32(1132068864);
+emit_32(3279296528);
+emit_32(1088557385);
+emit_32(1131812880);
+emit_32(3279296528);
+emit_32(1092330749);
+emit_32(1132068864);
+emit_32(3279040545);
+emit_32(1092455865);
+emit_32(1131812880);
+emit_32(3279040545);
+emit_32(1094355780);
+emit_32(1132068864);
+emit_32(3278784496);
+emit_32(1095594567);
+emit_32(1131812880);
+emit_32(3278784496);
+emit_32(1095302539);
+emit_32(1132068864);
+emit_32(3278528512);
+emit_32(1096797808);
+emit_32(1131812880);
+emit_32(3278528512);
+emit_32(1095711379);
+emit_32(1132068864);
+emit_32(3278272528);
+emit_32(1098618136);
+emit_32(1131812880);
+emit_32(3278272528);
+emit_32(1098003041);
+emit_32(1132068864);
+emit_32(3278016545);
+emit_32(1099699061);
+emit_32(1131812880);
+emit_32(3278016545);
+emit_32(1099454009);
+emit_32(1132068864);
+emit_32(3277760496);
+emit_32(1100182821);
+emit_32(1131812880);
+emit_32(3277760496);
+emit_32(1099951977);
+emit_32(1132068864);
+emit_32(3277504512);
+emit_32(1100520096);
+emit_32(1131812880);
+emit_32(3277504512);
+emit_32(1100371355);
+emit_32(1132068864);
+emit_32(3277248528);
+emit_32(1100966579);
+emit_32(1131812880);
+emit_32(3277248528);
+emit_32(1100780352);
+emit_32(1132068864);
+emit_32(3276992545);
+emit_32(1100860306);
+emit_32(1131812880);
+emit_32(3276992545);
+emit_32(1101050203);
+emit_32(1132068864);
+emit_32(3276736496);
+emit_32(1100465622);
+emit_32(1131812880);
+emit_32(3276736496);
+emit_32(1100893074);
+emit_32(1132068864);
+emit_32(3276480512);
+emit_32(1100581280);
+emit_32(1131812880);
+emit_32(3276480512);
+emit_32(1101018641);
+emit_32(1132068864);
+emit_32(3276224528);
+emit_32(1099877895);
+emit_32(1131812880);
+emit_32(3276224528);
+emit_32(1100648651);
+emit_32(1132068864);
+emit_32(3275968545);
+emit_32(1098108633);
+emit_32(1131812880);
+emit_32(3275968545);
+emit_32(1099969017);
+emit_32(1132068864);
+emit_32(3275712496);
+emit_32(1097534433);
+emit_32(1131812880);
+emit_32(3275712496);
+emit_32(1099061736);
+emit_32(1132068864);
+emit_32(3275456512);
+emit_32(1095741263);
+emit_32(1131812880);
+emit_32(3275456512);
+emit_32(1097819121);
+emit_32(1132068864);
+emit_32(3275200528);
+emit_32(1094351061);
+emit_32(1131812880);
+emit_32(3275200528);
+emit_32(1095413373);
+emit_32(1132068864);
+emit_32(3274944545);
+emit_32(1095198940);
+emit_32(1131812880);
+emit_32(3274944545);
+emit_32(1096465724);
+emit_32(1132068864);
+emit_32(3274688496);
+emit_32(1095888378);
+emit_32(1131812880);
+emit_32(3274688496);
+emit_32(1097378510);
+emit_32(1132068864);
+emit_32(3274432512);
+emit_32(1096087503);
+emit_32(1131812880);
+emit_32(3274432512);
+emit_32(1098800064);
+emit_32(1132068864);
+emit_32(3274176528);
+emit_32(1096238288);
+emit_32(1131812880);
+emit_32(3274176528);
+emit_32(1098870004);
+emit_32(1132068864);
+emit_32(3273920545);
+emit_32(1096234303);
+emit_32(1131812880);
+emit_32(3273920545);
+emit_32(1098365115);
+emit_32(1132068864);
+emit_32(3273664496);
+emit_32(1097531182);
+emit_32(1131812880);
+emit_32(3273664496);
+emit_32(1097973681);
+emit_32(1132068864);
+emit_32(3273408512);
+emit_32(1096980680);
+emit_32(1131812880);
+emit_32(3273408512);
+emit_32(1097661835);
+emit_32(1132068864);
+emit_32(3273152528);
+emit_32(1096822135);
+emit_32(1131812880);
+emit_32(3273152528);
+emit_32(1097231709);
+emit_32(1132068864);
+emit_32(3272896545);
+emit_32(1095973103);
+emit_32(1131812880);
+emit_32(3272896545);
+emit_32(1097116261);
+emit_32(1132068864);
+emit_32(3272640496);
+emit_32(1095621621);
+emit_32(1131812880);
+emit_32(3272640496);
+emit_32(1096358035);
+emit_32(1132068864);
+emit_32(3272384512);
+emit_32(1095942380);
+emit_32(1131812880);
+emit_32(3272384512);
+emit_32(1097122133);
+emit_32(1132068864);
+emit_32(3272128528);
+emit_32(1095707289);
+emit_32(1131812880);
+emit_32(3272128528);
+emit_32(1097935303);
+emit_32(1132068864);
+emit_32(3271872545);
+emit_32(1096204524);
+emit_32(1131812880);
+emit_32(3271872545);
+emit_32(1097370855);
+emit_32(1132068864);
+emit_32(3271616496);
+emit_32(1096900883);
+emit_32(1131812880);
+emit_32(3271616496);
+emit_32(1098608280);
+emit_32(1132068864);
+emit_32(3271163904);
+emit_32(1096266285);
+emit_32(1131812880);
+emit_32(3271163904);
+emit_32(1098342256);
+emit_32(1132068864);
+emit_32(3270651937);
+emit_32(1095366397);
+emit_32(1131812880);
+emit_32(3270651937);
+emit_32(1098053793);
+emit_32(1132068864);
+emit_32(3270139970);
+emit_32(1094774581);
+emit_32(1131812880);
+emit_32(3270139970);
+emit_32(1098324640);
+emit_32(1132068864);
+emit_32(3269627871);
+emit_32(1095465488);
+emit_32(1131812880);
+emit_32(3269627871);
+emit_32(1098790417);
+emit_32(1132068864);
+emit_32(3269115904);
+emit_32(1095080136);
+emit_32(1131812880);
+emit_32(3269115904);
+emit_32(1098071199);
+emit_32(1132068864);
+emit_32(3268603937);
+emit_32(1095775027);
+emit_32(1131812880);
+emit_32(3268603937);
+emit_32(1098042258);
+emit_32(1132068864);
+emit_32(3268091970);
+emit_32(1096498335);
+emit_32(1131812880);
+emit_32(3268091970);
+emit_32(1097596823);
+emit_32(1132068864);
+emit_32(3267579911);
+emit_32(1096881170);
+emit_32(1131812880);
+emit_32(3267579911);
+emit_32(1097962986);
+emit_32(1132068864);
+emit_32(3267067904);
+emit_32(1096646604);
+emit_32(1131812880);
+emit_32(3267067904);
+emit_32(1097510525);
+emit_32(1132068864);
+emit_32(3266555911);
+emit_32(1097473930);
+emit_32(1131812880);
+emit_32(3266555911);
+emit_32(1096970614);
+emit_32(1132068864);
+emit_32(3266043904);
+emit_32(1096072928);
+emit_32(1131812880);
+emit_32(3266043904);
+emit_32(1096851181);
+emit_32(1132068864);
+emit_32(3265531911);
+emit_32(1095562061);
+emit_32(1131812880);
+emit_32(3265531911);
+emit_32(1096578341);
+emit_32(1132068864);
+emit_32(3265019904);
+emit_32(1094504258);
+emit_32(1131812880);
+emit_32(3265019904);
+emit_32(1095833747);
+emit_32(1132068864);
+emit_32(3264507911);
+emit_32(1094381679);
+emit_32(1131812880);
+emit_32(3264507911);
+emit_32(1095590058);
+emit_32(1132068864);
+emit_32(3263995904);
+emit_32(1093698952);
+emit_32(1131812880);
+emit_32(3263995904);
+emit_32(1095093872);
+emit_32(1132068864);
+emit_32(3263483911);
+emit_32(1094601146);
+emit_32(1131812880);
+emit_32(3263483911);
+emit_32(1093864941);
+emit_32(1132068864);
+emit_32(3262775296);
+emit_32(1093294516);
+emit_32(1131812880);
+emit_32(3262775296);
+emit_32(1092542435);
+emit_32(1132068864);
+emit_32(3261751309);
+emit_32(1091098766);
+emit_32(1131812880);
+emit_32(3261751309);
+emit_32(1091449232);
+emit_32(1132068864);
+emit_32(3260727296);
+emit_32(1088637685);
+emit_32(1131812880);
+emit_32(3260727296);
+emit_32(1089462705);
+emit_32(1132068864);
+emit_32(3259703309);
+emit_32(1088371137);
+emit_32(1131812880);
+emit_32(3259703309);
+emit_32(1086825892);
+emit_32(1132068864);
+emit_32(3258679296);
+emit_32(1090482591);
+emit_32(1131812880);
+emit_32(3258679296);
+emit_32(1088189482);
+emit_32(1132068864);
+emit_32(3257655309);
+emit_32(1091688768);
+emit_32(1131812880);
+emit_32(3257655309);
+emit_32(1089036752);
+emit_32(1132068864);
+emit_32(3256631296);
+emit_32(1091298897);
+emit_32(1131812880);
+emit_32(3256631296);
+emit_32(1088194704);
+emit_32(1132068864);
+emit_32(3255607309);
+emit_32(1089392345);
+emit_32(1131812880);
+emit_32(3255607309);
+emit_32(1087706759);
+emit_32(1132068864);
+emit_32(3254386688);
+emit_32(1089840108);
+emit_32(1131812880);
+emit_32(3254386688);
+emit_32(1087906072);
+emit_32(1132068864);
+emit_32(3252338714);
+emit_32(1088432604);
+emit_32(1131812880);
+emit_32(3252338714);
+emit_32(1086651325);
+emit_32(1132068864);
+emit_32(3250290688);
+emit_32(1085565840);
+emit_32(1131812880);
+emit_32(3250290688);
+emit_32(1085752989);
+emit_32(1132068864);
+emit_32(3248242714);
+emit_32(1084476831);
+emit_32(1131812880);
+emit_32(3248242714);
+emit_32(1082147671);
+emit_32(1132068864);
+emit_32(3245998080);
+emit_32(1080454304);
+emit_32(1131812880);
+emit_32(3245998080);
+emit_32(1080053035);
+emit_32(1132068864);
+emit_32(3241902132);
+emit_32(1078160817);
+emit_32(1131812880);
+emit_32(3241902132);
+emit_32(1078352203);
+emit_32(1132068864);
+emit_32(3237609472);
+emit_32(1075763269);
+emit_32(1131812880);
+emit_32(3237609472);
+emit_32(1075673385);
+emit_32(1132068864);
+emit_32(3229220864);
+emit_32(1071152764);
+emit_32(1131812880);
+emit_32(3229220864);
+emit_32(1076050788);
+emit_32(1132068864);
+emit_32(0);
+emit_32(1066573591);
+emit_32(1131812880);
+emit_32(0);
+emit_32(1074500112);
+emit_32(1132068864);
+emit_32(1081737216);
+emit_32(1055384530);
+emit_32(1131812880);
+emit_32(1081737216);
+emit_32(1069740626);
+emit_32(1132068864);
+emit_32(3279552512);
+emit_32(1084680359);
+emit_32(1131556897);
+emit_32(3279296528);
+emit_32(1089160463);
+emit_32(1131556897);
+emit_32(3279040545);
+emit_32(1092855687);
+emit_32(1131556897);
+emit_32(3278784496);
+emit_32(1095505229);
+emit_32(1131556897);
+emit_32(3278528512);
+emit_32(1097158309);
+emit_32(1131556897);
+emit_32(3278272528);
+emit_32(1099096077);
+emit_32(1131556897);
+emit_32(3278016545);
+emit_32(1099862691);
+emit_32(1131556897);
+emit_32(3277760496);
+emit_32(1100235198);
+emit_32(1131556897);
+emit_32(3277504512);
+emit_32(1100353529);
+emit_32(1131556897);
+emit_32(3277248528);
+emit_32(1100744753);
+emit_32(1131556897);
+emit_32(3276992545);
+emit_32(1100450208);
+emit_32(1131556897);
+emit_32(3276736496);
+emit_32(1099944218);
+emit_32(1131556897);
+emit_32(3276480512);
+emit_32(1099578632);
+emit_32(1131556897);
+emit_32(3276224528);
+emit_32(1098095211);
+emit_32(1131556897);
+emit_32(3275968545);
+emit_32(1096681416);
+emit_32(1131556897);
+emit_32(3275712496);
+emit_32(1095628436);
+emit_32(1131556897);
+emit_32(3275456512);
+emit_32(1094488739);
+emit_32(1131556897);
+emit_32(3275200528);
+emit_32(1095225678);
+emit_32(1131556897);
+emit_32(3274944545);
+emit_32(1095742416);
+emit_32(1131556897);
+emit_32(3274688496);
+emit_32(1096313995);
+emit_32(1131556897);
+emit_32(3274432512);
+emit_32(1096609379);
+emit_32(1131556897);
+emit_32(3274176528);
+emit_32(1096643458);
+emit_32(1131556897);
+emit_32(3273920545);
+emit_32(1096377644);
+emit_32(1131556897);
+emit_32(3273664496);
+emit_32(1096630875);
+emit_32(1131556897);
+emit_32(3273408512);
+emit_32(1096367787);
+emit_32(1131556897);
+emit_32(3273152528);
+emit_32(1095764646);
+emit_32(1131556897);
+emit_32(3272896545);
+emit_32(1095369648);
+emit_32(1131556897);
+emit_32(3272640496);
+emit_32(1095202610);
+emit_32(1131556897);
+emit_32(3272384512);
+emit_32(1095378141);
+emit_32(1131556897);
+emit_32(3272128528);
+emit_32(1094896425);
+emit_32(1131556897);
+emit_32(3271872545);
+emit_32(1094491570);
+emit_32(1131556897);
+emit_32(3271616496);
+emit_32(1094140717);
+emit_32(1131556897);
+emit_32(3271163904);
+emit_32(1093673576);
+emit_32(1131556897);
+emit_32(3270651937);
+emit_32(1092775680);
+emit_32(1131556897);
+emit_32(3270139970);
+emit_32(1093246176);
+emit_32(1131556897);
+emit_32(3269627871);
+emit_32(1092835135);
+emit_32(1131556897);
+emit_32(3269115904);
+emit_32(1093700839);
+emit_32(1131556897);
+emit_32(3268603937);
+emit_32(1093815868);
+emit_32(1131556897);
+emit_32(3268091970);
+emit_32(1095128475);
+emit_32(1131556897);
+emit_32(3267579911);
+emit_32(1096138044);
+emit_32(1131556897);
+emit_32(3267067904);
+emit_32(1097063727);
+emit_32(1131556897);
+emit_32(3266555911);
+emit_32(1096790468);
+emit_32(1131556897);
+emit_32(3266043904);
+emit_32(1096105433);
+emit_32(1131556897);
+emit_32(3265531911);
+emit_32(1094675490);
+emit_32(1131556897);
+emit_32(3265019904);
+emit_32(1094279548);
+emit_32(1131556897);
+emit_32(3264507911);
+emit_32(1094433060);
+emit_32(1131556897);
+emit_32(3263995904);
+emit_32(1094244316);
+emit_32(1131556897);
+emit_32(3263483911);
+emit_32(1095101212);
+emit_32(1131556897);
+emit_32(3262775296);
+emit_32(1093870184);
+emit_32(1131556897);
+emit_32(3261751309);
+emit_32(1092196416);
+emit_32(1131556897);
+emit_32(3260727296);
+emit_32(1090926800);
+emit_32(1131556897);
+emit_32(3259703309);
+emit_32(1089315547);
+emit_32(1131556897);
+emit_32(3258679296);
+emit_32(1090882864);
+emit_32(1131556897);
+emit_32(3257655309);
+emit_32(1092302982);
+emit_32(1131556897);
+emit_32(3256631296);
+emit_32(1091679478);
+emit_32(1131556897);
+emit_32(3255607309);
+emit_32(1090777587);
+emit_32(1131556897);
+emit_32(3254386688);
+emit_32(1090588833);
+emit_32(1131556897);
+emit_32(3252338714);
+emit_32(1088391584);
+emit_32(1131556897);
+emit_32(3250290688);
+emit_32(1088187762);
+emit_32(1131556897);
+emit_32(3248242714);
+emit_32(1086074735);
+emit_32(1131556897);
+emit_32(3245998080);
+emit_32(1083035311);
+emit_32(1131556897);
+emit_32(3241902132);
+emit_32(1080697784);
+emit_32(1131556897);
+emit_32(3237609472);
+emit_32(1077335797);
+emit_32(1131556897);
+emit_32(3229220864);
+emit_32(1072342604);
+emit_32(1131556897);
+emit_32(0);
+emit_32(1073908380);
+emit_32(1131556897);
+emit_32(1081737216);
+emit_32(1074643096);
+emit_32(1131556897);
+emit_32(3279552512);
+emit_32(1085160041);
+emit_32(1131300848);
+emit_32(3279296528);
+emit_32(1090327885);
+emit_32(1131300848);
+emit_32(3279040545);
+emit_32(1093025976);
+emit_32(1131300848);
+emit_32(3278784496);
+emit_32(1095630848);
+emit_32(1131300848);
+emit_32(3278528512);
+emit_32(1097676095);
+emit_32(1131300848);
+emit_32(3278272528);
+emit_32(1099190973);
+emit_32(1131300848);
+emit_32(3278016545);
+emit_32(1099857081);
+emit_32(1131300848);
+emit_32(3277760496);
+emit_32(1100491260);
+emit_32(1131300848);
+emit_32(3277504512);
+emit_32(1100352848);
+emit_32(1131300848);
+emit_32(3277248528);
+emit_32(1100472753);
+emit_32(1131300848);
+emit_32(3276992545);
+emit_32(1100152989);
+emit_32(1131300848);
+emit_32(3276736496);
+emit_32(1099265684);
+emit_32(1131300848);
+emit_32(3276480512);
+emit_32(1098708314);
+emit_32(1131300848);
+emit_32(3276224528);
+emit_32(1096067580);
+emit_32(1131300848);
+emit_32(3275968545);
+emit_32(1096230633);
+emit_32(1131300848);
+emit_32(3275712496);
+emit_32(1096388025);
+emit_32(1131300848);
+emit_32(3275456512);
+emit_32(1094867799);
+emit_32(1131300848);
+emit_32(3275200528);
+emit_32(1096132172);
+emit_32(1131300848);
+emit_32(3274944545);
+emit_32(1097306682);
+emit_32(1131300848);
+emit_32(3274688496);
+emit_32(1097887069);
+emit_32(1131300848);
+emit_32(3274432512);
+emit_32(1097633838);
+emit_32(1131300848);
+emit_32(3274176528);
+emit_32(1098457389);
+emit_32(1131300848);
+emit_32(3273920545);
+emit_32(1097090466);
+emit_32(1131300848);
+emit_32(3273664496);
+emit_32(1096891446);
+emit_32(1131300848);
+emit_32(3273408512);
+emit_32(1095233962);
+emit_32(1131300848);
+emit_32(3273152528);
+emit_32(1094867799);
+emit_32(1131300848);
+emit_32(3272896545);
+emit_32(1094576295);
+emit_32(1131300848);
+emit_32(3272640496);
+emit_32(1093957845);
+emit_32(1131300848);
+emit_32(3272384512);
+emit_32(1093473193);
+emit_32(1131300848);
+emit_32(3272128528);
+emit_32(1093446664);
+emit_32(1131300848);
+emit_32(3271872545);
+emit_32(1093505489);
+emit_32(1131300848);
+emit_32(3271616496);
+emit_32(1092573494);
+emit_32(1131300848);
+emit_32(3271163904);
+emit_32(1092718533);
+emit_32(1131300848);
+emit_32(3270651937);
+emit_32(1091299642);
+emit_32(1131300848);
+emit_32(3270139970);
+emit_32(1091752270);
+emit_32(1131300848);
+emit_32(3269627871);
+emit_32(1092863027);
+emit_32(1131300848);
+emit_32(3269115904);
+emit_32(1093352607);
+emit_32(1131300848);
+emit_32(3268603937);
+emit_32(1094334389);
+emit_32(1131300848);
+emit_32(3268091970);
+emit_32(1095530080);
+emit_32(1131300848);
+emit_32(3267579911);
+emit_32(1096764359);
+emit_32(1131300848);
+emit_32(3267067904);
+emit_32(1096925944);
+emit_32(1131300848);
+emit_32(3266555911);
+emit_32(1096040107);
+emit_32(1131300848);
+emit_32(3266043904);
+emit_32(1094881536);
+emit_32(1131300848);
+emit_32(3265531911);
+emit_32(1094389753);
+emit_32(1131300848);
+emit_32(3265019904);
+emit_32(1094053370);
+emit_32(1131300848);
+emit_32(3264507911);
+emit_32(1094865283);
+emit_32(1131300848);
+emit_32(3263995904);
+emit_32(1095186461);
+emit_32(1131300848);
+emit_32(3263483911);
+emit_32(1095388208);
+emit_32(1131300848);
+emit_32(3262775296);
+emit_32(1094366475);
+emit_32(1131300848);
+emit_32(3261751309);
+emit_32(1093486930);
+emit_32(1131300848);
+emit_32(3260727296);
+emit_32(1091443444);
+emit_32(1131300848);
+emit_32(3259703309);
+emit_32(1090412169);
+emit_32(1131300848);
+emit_32(3258679296);
+emit_32(1091017376);
+emit_32(1131300848);
+emit_32(3257655309);
+emit_32(1091659503);
+emit_32(1131300848);
+emit_32(3256631296);
+emit_32(1091788813);
+emit_32(1131300848);
+emit_32(3255607309);
+emit_32(1091703155);
+emit_32(1131300848);
+emit_32(3254386688);
+emit_32(1091097539);
+emit_32(1131300848);
+emit_32(3252338714);
+emit_32(1090228501);
+emit_32(1131300848);
+emit_32(3250290688);
+emit_32(1089127831);
+emit_32(1131300848);
+emit_32(3248242714);
+emit_32(1087112238);
+emit_32(1131300848);
+emit_32(3245998080);
+emit_32(1085471698);
+emit_32(1131300848);
+emit_32(3241902132);
+emit_32(1083846552);
+emit_32(1131300848);
+emit_32(3237609472);
+emit_32(1082879010);
+emit_32(1131300848);
+emit_32(3229220864);
+emit_32(1080627152);
+emit_32(1131300848);
+emit_32(0);
+emit_32(1080885311);
+emit_32(1131300848);
+emit_32(1081737216);
+emit_32(1078120510);
+emit_32(1131300848);
+emit_32(3279552512);
+emit_32(1086174748);
+emit_32(1131044864);
+emit_32(3279296528);
+emit_32(1090628574);
+emit_32(1131044864);
+emit_32(3279040545);
+emit_32(1092984871);
+emit_32(1131044864);
+emit_32(3278784496);
+emit_32(1095235954);
+emit_32(1131044864);
+emit_32(3278528512);
+emit_32(1097962986);
+emit_32(1131044864);
+emit_32(3278272528);
+emit_32(1098907753);
+emit_32(1131044864);
+emit_32(3278016545);
+emit_32(1099567464);
+emit_32(1131044864);
+emit_32(3277760496);
+emit_32(1100053322);
+emit_32(1131044864);
+emit_32(3277504512);
+emit_32(1100365745);
+emit_32(1131044864);
+emit_32(3277248528);
+emit_32(1100199389);
+emit_32(1131044864);
+emit_32(3276992545);
+emit_32(1100122476);
+emit_32(1131044864);
+emit_32(3276736496);
+emit_32(1098964533);
+emit_32(1131044864);
+emit_32(3276480512);
+emit_32(1098061028);
+emit_32(1131044864);
+emit_32(3276224528);
+emit_32(1096998401);
+emit_32(1131044864);
+emit_32(3275968545);
+emit_32(1096347969);
+emit_32(1131044864);
+emit_32(3275712496);
+emit_32(1096743597);
+emit_32(1131044864);
+emit_32(3275456512);
+emit_32(1096079639);
+emit_32(1131044864);
+emit_32(3275200528);
+emit_32(1096454190);
+emit_32(1131044864);
+emit_32(3274944545);
+emit_32(1097972947);
+emit_32(1131044864);
+emit_32(3274688496);
+emit_32(1098482241);
+emit_32(1131044864);
+emit_32(3274432512);
+emit_32(1098243165);
+emit_32(1131044864);
+emit_32(3274176528);
+emit_32(1097818073);
+emit_32(1131044864);
+emit_32(3273920545);
+emit_32(1097259811);
+emit_32(1131044864);
+emit_32(3273664496);
+emit_32(1096971138);
+emit_32(1131044864);
+emit_32(3273408512);
+emit_32(1095776495);
+emit_32(1131044864);
+emit_32(3273152528);
+emit_32(1094346657);
+emit_32(1131044864);
+emit_32(3272896545);
+emit_32(1094305658);
+emit_32(1131044864);
+emit_32(3272640496);
+emit_32(1093779797);
+emit_32(1131044864);
+emit_32(3272384512);
+emit_32(1093535059);
+emit_32(1131044864);
+emit_32(3272128528);
+emit_32(1092859566);
+emit_32(1131044864);
+emit_32(3271872545);
+emit_32(1092315471);
+emit_32(1131044864);
+emit_32(3271616496);
+emit_32(1091613628);
+emit_32(1131044864);
+emit_32(3271163904);
+emit_32(1092129045);
+emit_32(1131044864);
+emit_32(3270651937);
+emit_32(1090623961);
+emit_32(1131044864);
+emit_32(3270139970);
+emit_32(1091745329);
+emit_32(1131044864);
+emit_32(3269627871);
+emit_32(1092278802);
+emit_32(1131044864);
+emit_32(3269115904);
+emit_32(1092897106);
+emit_32(1131044864);
+emit_32(3268603937);
+emit_32(1093630060);
+emit_32(1131044864);
+emit_32(3268091970);
+emit_32(1095021835);
+emit_32(1131044864);
+emit_32(3267579911);
+emit_32(1096071460);
+emit_32(1131044864);
+emit_32(3267067904);
+emit_32(1095859647);
+emit_32(1131044864);
+emit_32(3266555911);
+emit_32(1095186671);
+emit_32(1131044864);
+emit_32(3266043904);
+emit_32(1094964478);
+emit_32(1131044864);
+emit_32(3265531911);
+emit_32(1094463993);
+emit_32(1131044864);
+emit_32(3265019904);
+emit_32(1094678322);
+emit_32(1131044864);
+emit_32(3264507911);
+emit_32(1094959340);
+emit_32(1131044864);
+emit_32(3263995904);
+emit_32(1095934725);
+emit_32(1131044864);
+emit_32(3263483911);
+emit_32(1096292499);
+emit_32(1131044864);
+emit_32(3262775296);
+emit_32(1095947833);
+emit_32(1131044864);
+emit_32(3261751309);
+emit_32(1094626102);
+emit_32(1131044864);
+emit_32(3260727296);
+emit_32(1092638002);
+emit_32(1131044864);
+emit_32(3259703309);
+emit_32(1091654302);
+emit_32(1131044864);
+emit_32(3258679296);
+emit_32(1090981043);
+emit_32(1131044864);
+emit_32(3257655309);
+emit_32(1091856132);
+emit_32(1131044864);
+emit_32(3256631296);
+emit_32(1092849815);
+emit_32(1131044864);
+emit_32(3255607309);
+emit_32(1092381563);
+emit_32(1131044864);
+emit_32(3254386688);
+emit_32(1091755762);
+emit_32(1131044864);
+emit_32(3252338714);
+emit_32(1091392210);
+emit_32(1131044864);
+emit_32(3250290688);
+emit_32(1090522762);
+emit_32(1131044864);
+emit_32(3248242714);
+emit_32(1089201336);
+emit_32(1131044864);
+emit_32(3245998080);
+emit_32(1088158150);
+emit_32(1131044864);
+emit_32(3241902132);
+emit_32(1086827927);
+emit_32(1131044864);
+emit_32(3237609472);
+emit_32(1085289603);
+emit_32(1131044864);
+emit_32(3229220864);
+emit_32(1084371008);
+emit_32(1131044864);
+emit_32(0);
+emit_32(1084371155);
+emit_32(1131044864);
+emit_32(1081737216);
+emit_32(1084629524);
+emit_32(1131044864);
+emit_32(3279552512);
+emit_32(1084191198);
+emit_32(1130788880);
+emit_32(3279296528);
+emit_32(1090263187);
+emit_32(1130788880);
+emit_32(3279040545);
+emit_32(1093579624);
+emit_32(1130788880);
+emit_32(3278784496);
+emit_32(1095609772);
+emit_32(1130788880);
+emit_32(3278528512);
+emit_32(1097395392);
+emit_32(1130788880);
+emit_32(3278272528);
+emit_32(1098942775);
+emit_32(1130788880);
+emit_32(3278016545);
+emit_32(1099952973);
+emit_32(1130788880);
+emit_32(3277760496);
+emit_32(1100137051);
+emit_32(1130788880);
+emit_32(3277504512);
+emit_32(1100188117);
+emit_32(1130788880);
+emit_32(3277248528);
+emit_32(1100449631);
+emit_32(1130788880);
+emit_32(3276992545);
+emit_32(1099596091);
+emit_32(1130788880);
+emit_32(3276736496);
+emit_32(1098204263);
+emit_32(1130788880);
+emit_32(3276480512);
+emit_32(1098412510);
+emit_32(1130788880);
+emit_32(3276224528);
+emit_32(1097801505);
+emit_32(1130788880);
+emit_32(3275968545);
+emit_32(1096603507);
+emit_32(1130788880);
+emit_32(3275712496);
+emit_32(1095928224);
+emit_32(1130788880);
+emit_32(3275456512);
+emit_32(1096222035);
+emit_32(1130788880);
+emit_32(3275200528);
+emit_32(1097042546);
+emit_32(1130788880);
+emit_32(3274944545);
+emit_32(1097761554);
+emit_32(1130788880);
+emit_32(3274688496);
+emit_32(1098099720);
+emit_32(1130788880);
+emit_32(3274432512);
+emit_32(1097722862);
+emit_32(1130788880);
+emit_32(3274176528);
+emit_32(1096956563);
+emit_32(1130788880);
+emit_32(3273920545);
+emit_32(1096582850);
+emit_32(1130788880);
+emit_32(3273664496);
+emit_32(1095826303);
+emit_32(1130788880);
+emit_32(3273408512);
+emit_32(1095071538);
+emit_32(1130788880);
+emit_32(3273152528);
+emit_32(1094227434);
+emit_32(1130788880);
+emit_32(3272896545);
+emit_32(1094210132);
+emit_32(1130788880);
+emit_32(3272640496);
+emit_32(1093761027);
+emit_32(1130788880);
+emit_32(3272384512);
+emit_32(1093810520);
+emit_32(1130788880);
+emit_32(3272128528);
+emit_32(1092656772);
+emit_32(1130788880);
+emit_32(3271872545);
+emit_32(1091138738);
+emit_32(1130788880);
+emit_32(3271616496);
+emit_32(1089927035);
+emit_32(1130788880);
+emit_32(3271163904);
+emit_32(1089350360);
+emit_32(1130788880);
+emit_32(3270651937);
+emit_32(1090698210);
+emit_32(1130788880);
+emit_32(3270139970);
+emit_32(1090875577);
+emit_32(1130788880);
+emit_32(3269627871);
+emit_32(1091800075);
+emit_32(1130788880);
+emit_32(3269115904);
+emit_32(1092846354);
+emit_32(1130788880);
+emit_32(3268603937);
+emit_32(1094213173);
+emit_32(1130788880);
+emit_32(3268091970);
+emit_32(1095490444);
+emit_32(1130788880);
+emit_32(3267579911);
+emit_32(1095492331);
+emit_32(1130788880);
+emit_32(3267067904);
+emit_32(1095128475);
+emit_32(1130788880);
+emit_32(3266555911);
+emit_32(1094457387);
+emit_32(1130788880);
+emit_32(3266043904);
+emit_32(1093000915);
+emit_32(1130788880);
+emit_32(3265531911);
+emit_32(1092702700);
+emit_32(1130788880);
+emit_32(3265019904);
+emit_32(1094131489);
+emit_32(1130788880);
+emit_32(3264507911);
+emit_32(1094959759);
+emit_32(1130788880);
+emit_32(3263995904);
+emit_32(1096392743);
+emit_32(1130788880);
+emit_32(3263483911);
+emit_32(1097205809);
+emit_32(1130788880);
+emit_32(3262775296);
+emit_32(1096775893);
+emit_32(1130788880);
+emit_32(3261751309);
+emit_32(1095617217);
+emit_32(1130788880);
+emit_32(3260727296);
+emit_32(1094159591);
+emit_32(1130788880);
+emit_32(3259703309);
+emit_32(1092609701);
+emit_32(1130788880);
+emit_32(3258679296);
+emit_32(1091241058);
+emit_32(1130788880);
+emit_32(3257655309);
+emit_32(1092023201);
+emit_32(1130788880);
+emit_32(3256631296);
+emit_32(1093109862);
+emit_32(1130788880);
+emit_32(3255607309);
+emit_32(1093719399);
+emit_32(1130788880);
+emit_32(3254386688);
+emit_32(1093231077);
+emit_32(1130788880);
+emit_32(3252338714);
+emit_32(1093489761);
+emit_32(1130788880);
+emit_32(3250290688);
+emit_32(1092575423);
+emit_32(1130788880);
+emit_32(3248242714);
+emit_32(1091158975);
+emit_32(1130788880);
+emit_32(3245998080);
+emit_32(1089311227);
+emit_32(1130788880);
+emit_32(3241902132);
+emit_32(1087230748);
+emit_32(1130788880);
+emit_32(3237609472);
+emit_32(1087094936);
+emit_32(1130788880);
+emit_32(3229220864);
+emit_32(1087427439);
+emit_32(1130788880);
+emit_32(0);
+emit_32(1086716610);
+emit_32(1130788880);
+emit_32(1081737216);
+emit_32(1086083564);
+emit_32(1130788880);
+emit_32(3279552512);
+emit_32(1084064572);
+emit_32(1130532897);
+emit_32(3279296528);
+emit_32(1091219604);
+emit_32(1130532897);
+emit_32(3279040545);
+emit_32(1094461581);
+emit_32(1130532897);
+emit_32(3278784496);
+emit_32(1096451988);
+emit_32(1130532897);
+emit_32(3278528512);
+emit_32(1098531104);
+emit_32(1130532897);
+emit_32(3278272528);
+emit_32(1099322203);
+emit_32(1130532897);
+emit_32(3278016545);
+emit_32(1099673423);
+emit_32(1130532897);
+emit_32(3277760496);
+emit_32(1100210032);
+emit_32(1130532897);
+emit_32(3277504512);
+emit_32(1100192468);
+emit_32(1130532897);
+emit_32(3277248528);
+emit_32(1099743153);
+emit_32(1130532897);
+emit_32(3276992545);
+emit_32(1099219128);
+emit_32(1130532897);
+emit_32(3276736496);
+emit_32(1097733767);
+emit_32(1130532897);
+emit_32(3276480512);
+emit_32(1098251554);
+emit_32(1130532897);
+emit_32(3276224528);
+emit_32(1098330197);
+emit_32(1130532897);
+emit_32(3275968545);
+emit_32(1097354078);
+emit_32(1130532897);
+emit_32(3275712496);
+emit_32(1095686947);
+emit_32(1130532897);
+emit_32(3275456512);
+emit_32(1096170655);
+emit_32(1130532897);
+emit_32(3275200528);
+emit_32(1096848035);
+emit_32(1130532897);
+emit_32(3274944545);
+emit_32(1098161481);
+emit_32(1130532897);
+emit_32(3274688496);
+emit_32(1097829712);
+emit_32(1130532897);
+emit_32(3274432512);
+emit_32(1097057436);
+emit_32(1130532897);
+emit_32(3274176528);
+emit_32(1096473484);
+emit_32(1130532897);
+emit_32(3273920545);
+emit_32(1095842765);
+emit_32(1130532897);
+emit_32(3273664496);
+emit_32(1095539517);
+emit_32(1130532897);
+emit_32(3273408512);
+emit_32(1095213200);
+emit_32(1130532897);
+emit_32(3273152528);
+emit_32(1094205414);
+emit_32(1130532897);
+emit_32(3272896545);
+emit_32(1093845647);
+emit_32(1130532897);
+emit_32(3272640496);
+emit_32(1093546174);
+emit_32(1130532897);
+emit_32(3272384512);
+emit_32(1092377452);
+emit_32(1130532897);
+emit_32(3272128528);
+emit_32(1091313106);
+emit_32(1130532897);
+emit_32(3271872545);
+emit_32(1087954328);
+emit_32(1130532897);
+emit_32(3271616496);
+emit_32(1087060480);
+emit_32(1130532897);
+emit_32(3271163904);
+emit_32(1087580678);
+emit_32(1130532897);
+emit_32(3270651937);
+emit_32(1090126768);
+emit_32(1130532897);
+emit_32(3270139970);
+emit_32(1090624715);
+emit_32(1130532897);
+emit_32(3269627871);
+emit_32(1091647664);
+emit_32(1130532897);
+emit_32(3269115904);
+emit_32(1092856211);
+emit_32(1130532897);
+emit_32(3268603937);
+emit_32(1094224917);
+emit_32(1130532897);
+emit_32(3268091970);
+emit_32(1095671952);
+emit_32(1130532897);
+emit_32(3267579911);
+emit_32(1095628646);
+emit_32(1130532897);
+emit_32(3267067904);
+emit_32(1095567829);
+emit_32(1130532897);
+emit_32(3266555911);
+emit_32(1093630270);
+emit_32(1130532897);
+emit_32(3266043904);
+emit_32(1092684245);
+emit_32(1130532897);
+emit_32(3265531911);
+emit_32(1091861343);
+emit_32(1130532897);
+emit_32(3265019904);
+emit_32(1092755023);
+emit_32(1130532897);
+emit_32(3264507911);
+emit_32(1094570528);
+emit_32(1130532897);
+emit_32(3263995904);
+emit_32(1095357275);
+emit_32(1130532897);
+emit_32(3263483911);
+emit_32(1096480299);
+emit_32(1130532897);
+emit_32(3262775296);
+emit_32(1096746428);
+emit_32(1130532897);
+emit_32(3261751309);
+emit_32(1096329514);
+emit_32(1130532897);
+emit_32(3260727296);
+emit_32(1095223896);
+emit_32(1130532897);
+emit_32(3259703309);
+emit_32(1093955643);
+emit_32(1130532897);
+emit_32(3258679296);
+emit_32(1093246281);
+emit_32(1130532897);
+emit_32(3257655309);
+emit_32(1094172174);
+emit_32(1130532897);
+emit_32(3256631296);
+emit_32(1095280414);
+emit_32(1130532897);
+emit_32(3255607309);
+emit_32(1095624976);
+emit_32(1130532897);
+emit_32(3254386688);
+emit_32(1095264161);
+emit_32(1130532897);
+emit_32(3252338714);
+emit_32(1094911210);
+emit_32(1130532897);
+emit_32(3250290688);
+emit_32(1094226385);
+emit_32(1130532897);
+emit_32(3248242714);
+emit_32(1092124945);
+emit_32(1130532897);
+emit_32(3245998080);
+emit_32(1090831631);
+emit_32(1130532897);
+emit_32(3241902132);
+emit_32(1089226670);
+emit_32(1130532897);
+emit_32(3237609472);
+emit_32(1089629994);
+emit_32(1130532897);
+emit_32(3229220864);
+emit_32(1089284992);
+emit_32(1130532897);
+emit_32(0);
+emit_32(1088387495);
+emit_32(1130532897);
+emit_32(1081737216);
+emit_32(1088205504);
+emit_32(1130532897);
+emit_32(3279552512);
+emit_32(1083530931);
+emit_32(1130276848);
+emit_32(3279296528);
+emit_32(1090306850);
+emit_32(1130276848);
+emit_32(3279040545);
+emit_32(1093521008);
+emit_32(1130276848);
+emit_32(3278784496);
+emit_32(1096939995);
+emit_32(1130276848);
+emit_32(3278528512);
+emit_32(1098488322);
+emit_32(1130276848);
+emit_32(3278272528);
+emit_32(1099450129);
+emit_32(1130276848);
+emit_32(3278016545);
+emit_32(1099687369);
+emit_32(1130276848);
+emit_32(3277760496);
+emit_32(1099754740);
+emit_32(1130276848);
+emit_32(3277504512);
+emit_32(1099338246);
+emit_32(1130276848);
+emit_32(3277248528);
+emit_32(1099121348);
+emit_32(1130276848);
+emit_32(3276992545);
+emit_32(1097937191);
+emit_32(1130276848);
+emit_32(3276736496);
+emit_32(1097116051);
+emit_32(1130276848);
+emit_32(3276480512);
+emit_32(1097449498);
+emit_32(1130276848);
+emit_32(3276224528);
+emit_32(1097296721);
+emit_32(1130276848);
+emit_32(3275968545);
+emit_32(1096895116);
+emit_32(1130276848);
+emit_32(3275712496);
+emit_32(1095191390);
+emit_32(1130276848);
+emit_32(3275456512);
+emit_32(1095800403);
+emit_32(1130276848);
+emit_32(3275200528);
+emit_32(1096784282);
+emit_32(1130276848);
+emit_32(3274944545);
+emit_32(1097651454);
+emit_32(1130276848);
+emit_32(3274688496);
+emit_32(1097454846);
+emit_32(1130276848);
+emit_32(3274432512);
+emit_32(1096258211);
+emit_32(1130276848);
+emit_32(3274176528);
+emit_32(1096116863);
+emit_32(1130276848);
+emit_32(3273920545);
+emit_32(1096517943);
+emit_32(1130276848);
+emit_32(3273664496);
+emit_32(1095318897);
+emit_32(1130276848);
+emit_32(3273408512);
+emit_32(1094673498);
+emit_32(1130276848);
+emit_32(3273152528);
+emit_32(1093918733);
+emit_32(1130276848);
+emit_32(3272896545);
+emit_32(1093483364);
+emit_32(1130276848);
+emit_32(3272640496);
+emit_32(1092914826);
+emit_32(1130276848);
+emit_32(3272384512);
+emit_32(1091000567);
+emit_32(1130276848);
+emit_32(3272128528);
+emit_32(1089935654);
+emit_32(1130276848);
+emit_32(3271872545);
+emit_32(1086818510);
+emit_32(1130276848);
+emit_32(3271616496);
+emit_32(1085690389);
+emit_32(1130276848);
+emit_32(3271163904);
+emit_32(1086952309);
+emit_32(1130276848);
+emit_32(3270651937);
+emit_32(1088839431);
+emit_32(1130276848);
+emit_32(3270139970);
+emit_32(1089612819);
+emit_32(1130276848);
+emit_32(3269627871);
+emit_32(1091440686);
+emit_32(1130276848);
+emit_32(3269115904);
+emit_32(1092535473);
+emit_32(1130276848);
+emit_32(3268603937);
+emit_32(1092891758);
+emit_32(1130276848);
+emit_32(3268091970);
+emit_32(1094112510);
+emit_32(1130276848);
+emit_32(3267579911);
+emit_32(1095020472);
+emit_32(1130276848);
+emit_32(3267067904);
+emit_32(1094302617);
+emit_32(1130276848);
+emit_32(3266555911);
+emit_32(1094287622);
+emit_32(1130276848);
+emit_32(3266043904);
+emit_32(1092792667);
+emit_32(1130276848);
+emit_32(3265531911);
+emit_32(1093051561);
+emit_32(1130276848);
+emit_32(3265019904);
+emit_32(1093418353);
+emit_32(1130276848);
+emit_32(3264507911);
+emit_32(1094221667);
+emit_32(1130276848);
+emit_32(3263995904);
+emit_32(1095632001);
+emit_32(1130276848);
+emit_32(3263483911);
+emit_32(1097732614);
+emit_32(1130276848);
+emit_32(3262775296);
+emit_32(1098628832);
+emit_32(1130276848);
+emit_32(3261751309);
+emit_32(1097948306);
+emit_32(1130276848);
+emit_32(3260727296);
+emit_32(1097305319);
+emit_32(1130276848);
+emit_32(3259703309);
+emit_32(1096485333);
+emit_32(1130276848);
+emit_32(3258679296);
+emit_32(1095850210);
+emit_32(1130276848);
+emit_32(3257655309);
+emit_32(1095872964);
+emit_32(1130276848);
+emit_32(3256631296);
+emit_32(1096804414);
+emit_32(1130276848);
+emit_32(3255607309);
+emit_32(1096692741);
+emit_32(1130276848);
+emit_32(3254386688);
+emit_32(1096946077);
+emit_32(1130276848);
+emit_32(3252338714);
+emit_32(1096420006);
+emit_32(1130276848);
+emit_32(3250290688);
+emit_32(1094944660);
+emit_32(1130276848);
+emit_32(3248242714);
+emit_32(1093505489);
+emit_32(1130276848);
+emit_32(3245998080);
+emit_32(1092313867);
+emit_32(1130276848);
+emit_32(3241902132);
+emit_32(1091062559);
+emit_32(1130276848);
+emit_32(3237609472);
+emit_32(1091612432);
+emit_32(1130276848);
+emit_32(3229220864);
+emit_32(1091011671);
+emit_32(1130276848);
+emit_32(0);
+emit_32(1090792142);
+emit_32(1130276848);
+emit_32(1081737216);
+emit_32(1088030748);
+emit_32(1130276848);
+emit_32(3279552512);
+emit_32(1084583764);
+emit_32(1130020864);
+emit_32(3279296528);
+emit_32(1087682243);
+emit_32(1130020864);
+emit_32(3279040545);
+emit_32(1092094075);
+emit_32(1130020864);
+emit_32(3278784496);
+emit_32(1095249691);
+emit_32(1130020864);
+emit_32(3278528512);
+emit_32(1098698877);
+emit_32(1130020864);
+emit_32(3278272528);
+emit_32(1099753796);
+emit_32(1130020864);
+emit_32(3278016545);
+emit_32(1100023333);
+emit_32(1130020864);
+emit_32(3277760496);
+emit_32(1099595042);
+emit_32(1130020864);
+emit_32(3277504512);
+emit_32(1099115371);
+emit_32(1130020864);
+emit_32(3277248528);
+emit_32(1098920493);
+emit_32(1130020864);
+emit_32(3276992545);
+emit_32(1097370855);
+emit_32(1130020864);
+emit_32(3276736496);
+emit_32(1096229480);
+emit_32(1130020864);
+emit_32(3276480512);
+emit_32(1096179987);
+emit_32(1130020864);
+emit_32(3276224528);
+emit_32(1096332765);
+emit_32(1130020864);
+emit_32(3275968545);
+emit_32(1094920228);
+emit_32(1130020864);
+emit_32(3275712496);
+emit_32(1094538966);
+emit_32(1130020864);
+emit_32(3275456512);
+emit_32(1096079324);
+emit_32(1130020864);
+emit_32(3275200528);
+emit_32(1096062022);
+emit_32(1130020864);
+emit_32(3274944545);
+emit_32(1097415524);
+emit_32(1130020864);
+emit_32(3274688496);
+emit_32(1097262642);
+emit_32(1130020864);
+emit_32(3274432512);
+emit_32(1096083309);
+emit_32(1130020864);
+emit_32(3274176528);
+emit_32(1097096338);
+emit_32(1130020864);
+emit_32(3273920545);
+emit_32(1097389520);
+emit_32(1130020864);
+emit_32(3273664496);
+emit_32(1096628987);
+emit_32(1130020864);
+emit_32(3273408512);
+emit_32(1095157311);
+emit_32(1130020864);
+emit_32(3273152528);
+emit_32(1093144150);
+emit_32(1130020864);
+emit_32(3272896545);
+emit_32(1092252305);
+emit_32(1130020864);
+emit_32(3272640496);
+emit_32(1090906174);
+emit_32(1130020864);
+emit_32(3272384512);
+emit_32(1089256785);
+emit_32(1130020864);
+emit_32(3272128528);
+emit_32(1086933413);
+emit_32(1130020864);
+emit_32(3271872545);
+emit_32(1085005690);
+emit_32(1130020864);
+emit_32(3271616496);
+emit_32(1084837205);
+emit_32(1130020864);
+emit_32(3271163904);
+emit_32(1085479500);
+emit_32(1130020864);
+emit_32(3270651937);
+emit_32(1086647781);
+emit_32(1130020864);
+emit_32(3270139970);
+emit_32(1088754391);
+emit_32(1130020864);
+emit_32(3269627871);
+emit_32(1090605474);
+emit_32(1130020864);
+emit_32(3269115904);
+emit_32(1091545984);
+emit_32(1130020864);
+emit_32(3268603937);
+emit_32(1092272018);
+emit_32(1130020864);
+emit_32(3268091970);
+emit_32(1093427580);
+emit_32(1130020864);
+emit_32(3267579911);
+emit_32(1094111042);
+emit_32(1130020864);
+emit_32(3267067904);
+emit_32(1094388915);
+emit_32(1130020864);
+emit_32(3266555911);
+emit_32(1094139458);
+emit_32(1130020864);
+emit_32(3266043904);
+emit_32(1094235718);
+emit_32(1130020864);
+emit_32(3265531911);
+emit_32(1094648752);
+emit_32(1130020864);
+emit_32(3265019904);
+emit_32(1095187300);
+emit_32(1130020864);
+emit_32(3264507911);
+emit_32(1096097674);
+emit_32(1130020864);
+emit_32(3263995904);
+emit_32(1097057016);
+emit_32(1130020864);
+emit_32(3263483911);
+emit_32(1097881092);
+emit_32(1130020864);
+emit_32(3262775296);
+emit_32(1098962856);
+emit_32(1130020864);
+emit_32(3261751309);
+emit_32(1098940835);
+emit_32(1130020864);
+emit_32(3260727296);
+emit_32(1098504366);
+emit_32(1130020864);
+emit_32(3259703309);
+emit_32(1098210030);
+emit_32(1130020864);
+emit_32(3258679296);
+emit_32(1097752537);
+emit_32(1130020864);
+emit_32(3257655309);
+emit_32(1096972082);
+emit_32(1130020864);
+emit_32(3256631296);
+emit_32(1097685323);
+emit_32(1130020864);
+emit_32(3255607309);
+emit_32(1097690566);
+emit_32(1130020864);
+emit_32(3254386688);
+emit_32(1097717514);
+emit_32(1130020864);
+emit_32(3252338714);
+emit_32(1096801373);
+emit_32(1130020864);
+emit_32(3250290688);
+emit_32(1096574462);
+emit_32(1130020864);
+emit_32(3248242714);
+emit_32(1095368389);
+emit_32(1130020864);
+emit_32(3245998080);
+emit_32(1094028204);
+emit_32(1130020864);
+emit_32(3241902132);
+emit_32(1093145513);
+emit_32(1130020864);
+emit_32(3237609472);
+emit_32(1092561058);
+emit_32(1130020864);
+emit_32(3229220864);
+emit_32(1091353465);
+emit_32(1130020864);
+emit_32(0);
+emit_32(1090850872);
+emit_32(1130020864);
+emit_32(1081737216);
+emit_32(1090545737);
+emit_32(1130020864);
+emit_32(3279552512);
+emit_32(1083020778);
+emit_32(1129764880);
+emit_32(3279296528);
+emit_32(1086653695);
+emit_32(1129764880);
+emit_32(3279040545);
+emit_32(1091034835);
+emit_32(1129764880);
+emit_32(3278784496);
+emit_32(1094988805);
+emit_32(1129764880);
+emit_32(3278528512);
+emit_32(1098825335);
+emit_32(1129764880);
+emit_32(3278272528);
+emit_32(1099793485);
+emit_32(1129764880);
+emit_32(3278016545);
+emit_32(1100052431);
+emit_32(1129764880);
+emit_32(3277760496);
+emit_32(1099921673);
+emit_32(1129764880);
+emit_32(3277504512);
+emit_32(1099421608);
+emit_32(1129764880);
+emit_32(3277248528);
+emit_32(1098552915);
+emit_32(1129764880);
+emit_32(3276992545);
+emit_32(1097228773);
+emit_32(1129764880);
+emit_32(3276736496);
+emit_32(1095528822);
+emit_32(1129764880);
+emit_32(3276480512);
+emit_32(1095513932);
+emit_32(1129764880);
+emit_32(3276224528);
+emit_32(1095608094);
+emit_32(1129764880);
+emit_32(3275968545);
+emit_32(1094888666);
+emit_32(1129764880);
+emit_32(3275712496);
+emit_32(1094960493);
+emit_32(1129764880);
+emit_32(3275456512);
+emit_32(1095322147);
+emit_32(1129764880);
+emit_32(3275200528);
+emit_32(1095300232);
+emit_32(1129764880);
+emit_32(3274944545);
+emit_32(1096422103);
+emit_32(1129764880);
+emit_32(3274688496);
+emit_32(1096640836);
+emit_32(1129764880);
+emit_32(3274432512);
+emit_32(1097230031);
+emit_32(1129764880);
+emit_32(3274176528);
+emit_32(1097125279);
+emit_32(1129764880);
+emit_32(3273920545);
+emit_32(1097162084);
+emit_32(1129764880);
+emit_32(3273664496);
+emit_32(1096846777);
+emit_32(1129764880);
+emit_32(3273408512);
+emit_32(1095743360);
+emit_32(1129764880);
+emit_32(3273152528);
+emit_32(1093469838);
+emit_32(1129764880);
+emit_32(3272896545);
+emit_32(1092165598);
+emit_32(1129764880);
+emit_32(3272640496);
+emit_32(1090712261);
+emit_32(1129764880);
+emit_32(3272384512);
+emit_32(1088210873);
+emit_32(1129764880);
+emit_32(3272128528);
+emit_32(1085889095);
+emit_32(1129764880);
+emit_32(3271872545);
+emit_32(1083392330);
+emit_32(1129764880);
+emit_32(3271616496);
+emit_32(1083388073);
+emit_32(1129764880);
+emit_32(3271163904);
+emit_32(1084653180);
+emit_32(1129764880);
+emit_32(3270651937);
+emit_32(1086692618);
+emit_32(1129764880);
+emit_32(3270139970);
+emit_32(1088701795);
+emit_32(1129764880);
+emit_32(3269627871);
+emit_32(1090628616);
+emit_32(1129764880);
+emit_32(3269115904);
+emit_32(1091284553);
+emit_32(1129764880);
+emit_32(3268603937);
+emit_32(1092579376);
+emit_32(1129764880);
+emit_32(3268091970);
+emit_32(1093773715);
+emit_32(1129764880);
+emit_32(3267579911);
+emit_32(1094376856);
+emit_32(1129764880);
+emit_32(3267067904);
+emit_32(1094634281);
+emit_32(1129764880);
+emit_32(3266555911);
+emit_32(1094720789);
+emit_32(1129764880);
+emit_32(3266043904);
+emit_32(1095562586);
+emit_32(1129764880);
+emit_32(3265531911);
+emit_32(1096146957);
+emit_32(1129764880);
+emit_32(3265019904);
+emit_32(1096371248);
+emit_32(1129764880);
+emit_32(3264507911);
+emit_32(1097603115);
+emit_32(1129764880);
+emit_32(3263995904);
+emit_32(1098307233);
+emit_32(1129764880);
+emit_32(3263483911);
+emit_32(1098369729);
+emit_32(1129764880);
+emit_32(3262775296);
+emit_32(1099083075);
+emit_32(1129764880);
+emit_32(3261751309);
+emit_32(1099129946);
+emit_32(1129764880);
+emit_32(3260727296);
+emit_32(1099485099);
+emit_32(1129764880);
+emit_32(3259703309);
+emit_32(1099764335);
+emit_32(1129764880);
+emit_32(3258679296);
+emit_32(1099176713);
+emit_32(1129764880);
+emit_32(3257655309);
+emit_32(1098040266);
+emit_32(1129764880);
+emit_32(3256631296);
+emit_32(1098351798);
+emit_32(1129764880);
+emit_32(3255607309);
+emit_32(1098988388);
+emit_32(1129764880);
+emit_32(3254386688);
+emit_32(1098753193);
+emit_32(1129764880);
+emit_32(3252338714);
+emit_32(1098284479);
+emit_32(1129764880);
+emit_32(3250290688);
+emit_32(1097489554);
+emit_32(1129764880);
+emit_32(3248242714);
+emit_32(1095940702);
+emit_32(1129764880);
+emit_32(3245998080);
+emit_32(1094687549);
+emit_32(1129764880);
+emit_32(3241902132);
+emit_32(1094446272);
+emit_32(1129764880);
+emit_32(3237609472);
+emit_32(1093495318);
+emit_32(1129764880);
+emit_32(3229220864);
+emit_32(1092748208);
+emit_32(1129764880);
+emit_32(0);
+emit_32(1092091118);
+emit_32(1129764880);
+emit_32(1081737216);
+emit_32(1091835139);
+emit_32(1129764880);
+emit_32(3279552512);
+emit_32(1080463993);
+emit_32(1129508897);
+emit_32(3279296528);
+emit_32(1085016910);
+emit_32(1129508897);
+emit_32(3279040545);
+emit_32(1089825176);
+emit_32(1129508897);
+emit_32(3278784496);
+emit_32(1094698979);
+emit_32(1129508897);
+emit_32(3278528512);
+emit_32(1097809265);
+emit_32(1129508897);
+emit_32(3278272528);
+emit_32(1099171575);
+emit_32(1129508897);
+emit_32(3278016545);
+emit_32(1099886127);
+emit_32(1129508897);
+emit_32(3277760496);
+emit_32(1099484470);
+emit_32(1129508897);
+emit_32(3277504512);
+emit_32(1098929301);
+emit_32(1129508897);
+emit_32(3277248528);
+emit_32(1097703463);
+emit_32(1129508897);
+emit_32(3276992545);
+emit_32(1096695572);
+emit_32(1129508897);
+emit_32(3276736496);
+emit_32(1094705899);
+emit_32(1129508897);
+emit_32(3276480512);
+emit_32(1094521559);
+emit_32(1129508897);
+emit_32(3276224528);
+emit_32(1094382938);
+emit_32(1129508897);
+emit_32(3275968545);
+emit_32(1093723488);
+emit_32(1129508897);
+emit_32(3275712496);
+emit_32(1094327258);
+emit_32(1129508897);
+emit_32(3275456512);
+emit_32(1094643404);
+emit_32(1129508897);
+emit_32(3275200528);
+emit_32(1095341441);
+emit_32(1129508897);
+emit_32(3274944545);
+emit_32(1096856319);
+emit_32(1129508897);
+emit_32(3274688496);
+emit_32(1097642751);
+emit_32(1129508897);
+emit_32(3274432512);
+emit_32(1097737857);
+emit_32(1129508897);
+emit_32(3274176528);
+emit_32(1097157784);
+emit_32(1129508897);
+emit_32(3273920545);
+emit_32(1096063805);
+emit_32(1129508897);
+emit_32(3273664496);
+emit_32(1095072272);
+emit_32(1129508897);
+emit_32(3273408512);
+emit_32(1094164729);
+emit_32(1129508897);
+emit_32(3273152528);
+emit_32(1092558321);
+emit_32(1129508897);
+emit_32(3272896545);
+emit_32(1090029460);
+emit_32(1129508897);
+emit_32(3272640496);
+emit_32(1087566627);
+emit_32(1129508897);
+emit_32(3272384512);
+emit_32(1087370124);
+emit_32(1129508897);
+emit_32(3272128528);
+emit_32(1084743064);
+emit_32(1129508897);
+emit_32(3271872545);
+emit_32(1082700102);
+emit_32(1129508897);
+emit_32(3271616496);
+emit_32(1083566646);
+emit_32(1129508897);
+emit_32(3271163904);
+emit_32(1084803462);
+emit_32(1129508897);
+emit_32(3270651937);
+emit_32(1086593633);
+emit_32(1129508897);
+emit_32(3270139970);
+emit_32(1090542266);
+emit_32(1129508897);
+emit_32(3269627871);
+emit_32(1091515565);
+emit_32(1129508897);
+emit_32(3269115904);
+emit_32(1092537947);
+emit_32(1129508897);
+emit_32(3268603937);
+emit_32(1093041704);
+emit_32(1129508897);
+emit_32(3268091970);
+emit_32(1093964870);
+emit_32(1129508897);
+emit_32(3267579911);
+emit_32(1094427502);
+emit_32(1129508897);
+emit_32(3267067904);
+emit_32(1095046267);
+emit_32(1129508897);
+emit_32(3266555911);
+emit_32(1095386844);
+emit_32(1129508897);
+emit_32(3266043904);
+emit_32(1095993865);
+emit_32(1129508897);
+emit_32(3265531911);
+emit_32(1096745379);
+emit_32(1129508897);
+emit_32(3265019904);
+emit_32(1098208458);
+emit_32(1129508897);
+emit_32(3264507911);
+emit_32(1099059325);
+emit_32(1129508897);
+emit_32(3263995904);
+emit_32(1098961755);
+emit_32(1129508897);
+emit_32(3263483911);
+emit_32(1099315859);
+emit_32(1129508897);
+emit_32(3262775296);
+emit_32(1099329071);
+emit_32(1129508897);
+emit_32(3261751309);
+emit_32(1098988231);
+emit_32(1129508897);
+emit_32(3260727296);
+emit_32(1099657694);
+emit_32(1129508897);
+emit_32(3259703309);
+emit_32(1099596038);
+emit_32(1129508897);
+emit_32(3258679296);
+emit_32(1099042285);
+emit_32(1129508897);
+emit_32(3257655309);
+emit_32(1098921594);
+emit_32(1129508897);
+emit_32(3256631296);
+emit_32(1099409339);
+emit_32(1129508897);
+emit_32(3255607309);
+emit_32(1099994654);
+emit_32(1129508897);
+emit_32(3254386688);
+emit_32(1099682493);
+emit_32(1129508897);
+emit_32(3252338714);
+emit_32(1099586024);
+emit_32(1129508897);
+emit_32(3250290688);
+emit_32(1098985085);
+emit_32(1129508897);
+emit_32(3248242714);
+emit_32(1098287940);
+emit_32(1129508897);
+emit_32(3245998080);
+emit_32(1096812488);
+emit_32(1129508897);
+emit_32(3241902132);
+emit_32(1096132172);
+emit_32(1129508897);
+emit_32(3237609472);
+emit_32(1095219072);
+emit_32(1129508897);
+emit_32(3229220864);
+emit_32(1094487061);
+emit_32(1129508897);
+emit_32(0);
+emit_32(1093746137);
+emit_32(1129508897);
+emit_32(1081737216);
+emit_32(1093216816);
+emit_32(1129508897);
+emit_32(3279552512);
+emit_32(1080029128);
+emit_32(1129252848);
+emit_32(3279296528);
+emit_32(1082132361);
+emit_32(1129252848);
+emit_32(3279040545);
+emit_32(1088551786);
+emit_32(1129252848);
+emit_32(3278784496);
+emit_32(1092773688);
+emit_32(1129252848);
+emit_32(3278528512);
+emit_32(1095789393);
+emit_32(1129252848);
+emit_32(3278272528);
+emit_32(1098426352);
+emit_32(1129252848);
+emit_32(3278016545);
+emit_32(1099118884);
+emit_32(1129252848);
+emit_32(3277760496);
+emit_32(1098946498);
+emit_32(1129252848);
+emit_32(3277504512);
+emit_32(1098247674);
+emit_32(1129252848);
+emit_32(3277248528);
+emit_32(1097180538);
+emit_32(1129252848);
+emit_32(3276992545);
+emit_32(1095903583);
+emit_32(1129252848);
+emit_32(3276736496);
+emit_32(1093972944);
+emit_32(1129252848);
+emit_32(3276480512);
+emit_32(1094119535);
+emit_32(1129252848);
+emit_32(3276224528);
+emit_32(1094115656);
+emit_32(1129252848);
+emit_32(3275968545);
+emit_32(1093250371);
+emit_32(1129252848);
+emit_32(3275712496);
+emit_32(1093516919);
+emit_32(1129252848);
+emit_32(3275456512);
+emit_32(1094550500);
+emit_32(1129252848);
+emit_32(3275200528);
+emit_32(1095584186);
+emit_32(1129252848);
+emit_32(3274944545);
+emit_32(1097766378);
+emit_32(1129252848);
+emit_32(3274688496);
+emit_32(1097882665);
+emit_32(1129252848);
+emit_32(3274432512);
+emit_32(1097698640);
+emit_32(1129252848);
+emit_32(3274176528);
+emit_32(1096544577);
+emit_32(1129252848);
+emit_32(3273920545);
+emit_32(1095417568);
+emit_32(1129252848);
+emit_32(3273664496);
+emit_32(1093038558);
+emit_32(1129252848);
+emit_32(3273408512);
+emit_32(1092208883);
+emit_32(1129252848);
+emit_32(3273152528);
+emit_32(1091657217);
+emit_32(1129252848);
+emit_32(3272896545);
+emit_32(1088339847);
+emit_32(1129252848);
+emit_32(3272640496);
+emit_32(1087749541);
+emit_32(1129252848);
+emit_32(3272384512);
+emit_32(1086492760);
+emit_32(1129252848);
+emit_32(3272128528);
+emit_32(1084289744);
+emit_32(1129252848);
+emit_32(3271872545);
+emit_32(1084101671);
+emit_32(1129252848);
+emit_32(3271616496);
+emit_32(1084133212);
+emit_32(1129252848);
+emit_32(3271163904);
+emit_32(1084719282);
+emit_32(1129252848);
+emit_32(3270651937);
+emit_32(1088718929);
+emit_32(1129252848);
+emit_32(3270139970);
+emit_32(1091794685);
+emit_32(1129252848);
+emit_32(3269627871);
+emit_32(1093539149);
+emit_32(1129252848);
+emit_32(3269115904);
+emit_32(1093719084);
+emit_32(1129252848);
+emit_32(3268603937);
+emit_32(1094263190);
+emit_32(1129252848);
+emit_32(3268091970);
+emit_32(1095010510);
+emit_32(1129252848);
+emit_32(3267579911);
+emit_32(1095499566);
+emit_32(1129252848);
+emit_32(3267067904);
+emit_32(1095406243);
+emit_32(1129252848);
+emit_32(3266555911);
+emit_32(1095095969);
+emit_32(1129252848);
+emit_32(3266043904);
+emit_32(1095937871);
+emit_32(1129252848);
+emit_32(3265531911);
+emit_32(1096329200);
+emit_32(1129252848);
+emit_32(3265019904);
+emit_32(1097172045);
+emit_32(1129252848);
+emit_32(3264507911);
+emit_32(1098488847);
+emit_32(1129252848);
+emit_32(3263995904);
+emit_32(1099439328);
+emit_32(1129252848);
+emit_32(3263483911);
+emit_32(1099647261);
+emit_32(1129252848);
+emit_32(3262775296);
+emit_32(1099958583);
+emit_32(1129252848);
+emit_32(3261751309);
+emit_32(1099777022);
+emit_32(1129252848);
+emit_32(3260727296);
+emit_32(1099447507);
+emit_32(1129252848);
+emit_32(3259703309);
+emit_32(1099254674);
+emit_32(1129252848);
+emit_32(3258679296);
+emit_32(1099498363);
+emit_32(1129252848);
+emit_32(3257655309);
+emit_32(1099988625);
+emit_32(1129252848);
+emit_32(3256631296);
+emit_32(1100359821);
+emit_32(1129252848);
+emit_32(3255607309);
+emit_32(1100639581);
+emit_32(1129252848);
+emit_32(3254386688);
+emit_32(1100562616);
+emit_32(1129252848);
+emit_32(3252338714);
+emit_32(1100538551);
+emit_32(1129252848);
+emit_32(3250290688);
+emit_32(1099604846);
+emit_32(1129252848);
+emit_32(3248242714);
+emit_32(1098614466);
+emit_32(1129252848);
+emit_32(3245998080);
+emit_32(1097631216);
+emit_32(1129252848);
+emit_32(3241902132);
+emit_32(1097023042);
+emit_32(1129252848);
+emit_32(3237609472);
+emit_32(1096365690);
+emit_32(1129252848);
+emit_32(3229220864);
+emit_32(1095964819);
+emit_32(1129252848);
+emit_32(0);
+emit_32(1094558784);
+emit_32(1129252848);
+emit_32(1081737216);
+emit_32(1093092141);
+emit_32(1129252848);
+emit_32(3279552512);
+emit_32(1081540755);
+emit_32(1128996864);
+emit_32(3279296528);
+emit_32(1081307971);
+emit_32(1128996864);
+emit_32(3279040545);
+emit_32(1088074180);
+emit_32(1128996864);
+emit_32(3278784496);
+emit_32(1092649012);
+emit_32(1128996864);
+emit_32(3278528512);
+emit_32(1095750805);
+emit_32(1128996864);
+emit_32(3278272528);
+emit_32(1098025586);
+emit_32(1128996864);
+emit_32(3278016545);
+emit_32(1098512754);
+emit_32(1128996864);
+emit_32(3277760496);
+emit_32(1097976513);
+emit_32(1128996864);
+emit_32(3277504512);
+emit_32(1097395287);
+emit_32(1128996864);
+emit_32(3277248528);
+emit_32(1096884211);
+emit_32(1128996864);
+emit_32(3276992545);
+emit_32(1096131333);
+emit_32(1128996864);
+emit_32(3276736496);
+emit_32(1094845884);
+emit_32(1128996864);
+emit_32(3276480512);
+emit_32(1093703565);
+emit_32(1128996864);
+emit_32(3276224528);
+emit_32(1092970506);
+emit_32(1128996864);
+emit_32(3275968545);
+emit_32(1093979341);
+emit_32(1128996864);
+emit_32(3275712496);
+emit_32(1093333942);
+emit_32(1128996864);
+emit_32(3275456512);
+emit_32(1094401183);
+emit_32(1128996864);
+emit_32(3275200528);
+emit_32(1095977612);
+emit_32(1128996864);
+emit_32(3274944545);
+emit_32(1096785330);
+emit_32(1128996864);
+emit_32(3274688496);
+emit_32(1097852781);
+emit_32(1128996864);
+emit_32(3274432512);
+emit_32(1097488400);
+emit_32(1128996864);
+emit_32(3274176528);
+emit_32(1096273520);
+emit_32(1128996864);
+emit_32(3273920545);
+emit_32(1094778041);
+emit_32(1128996864);
+emit_32(3273664496);
+emit_32(1093292943);
+emit_32(1128996864);
+emit_32(3273408512);
+emit_32(1092898574);
+emit_32(1128996864);
+emit_32(3273152528);
+emit_32(1090867996);
+emit_32(1128996864);
+emit_32(3272896545);
+emit_32(1089691860);
+emit_32(1128996864);
+emit_32(3272640496);
+emit_32(1086739427);
+emit_32(1128996864);
+emit_32(3272384512);
+emit_32(1085853087);
+emit_32(1128996864);
+emit_32(3272128528);
+emit_32(1084833724);
+emit_32(1128996864);
+emit_32(3271872545);
+emit_32(1084451895);
+emit_32(1128996864);
+emit_32(3271616496);
+emit_32(1085526644);
+emit_32(1128996864);
+emit_32(3271163904);
+emit_32(1089112459);
+emit_32(1128996864);
+emit_32(3270651937);
+emit_32(1091663645);
+emit_32(1128996864);
+emit_32(3270139970);
+emit_32(1093345162);
+emit_32(1128996864);
+emit_32(3269627871);
+emit_32(1094246728);
+emit_32(1128996864);
+emit_32(3269115904);
+emit_32(1095325398);
+emit_32(1128996864);
+emit_32(3268603937);
+emit_32(1096227907);
+emit_32(1128996864);
+emit_32(3268091970);
+emit_32(1097145097);
+emit_32(1128996864);
+emit_32(3267579911);
+emit_32(1097392036);
+emit_32(1128996864);
+emit_32(3267067904);
+emit_32(1096728288);
+emit_32(1128996864);
+emit_32(3266555911);
+emit_32(1095835320);
+emit_32(1128996864);
+emit_32(3266043904);
+emit_32(1095814034);
+emit_32(1128996864);
+emit_32(3265531911);
+emit_32(1096693475);
+emit_32(1128996864);
+emit_32(3265019904);
+emit_32(1097025244);
+emit_32(1128996864);
+emit_32(3264507911);
+emit_32(1099054920);
+emit_32(1128996864);
+emit_32(3263995904);
+emit_32(1099511523);
+emit_32(1128996864);
+emit_32(3263483911);
+emit_32(1100212234);
+emit_32(1128996864);
+emit_32(3262775296);
+emit_32(1100597481);
+emit_32(1128996864);
+emit_32(3261751309);
+emit_32(1100490945);
+emit_32(1128996864);
+emit_32(3260727296);
+emit_32(1100197711);
+emit_32(1128996864);
+emit_32(3259703309);
+emit_32(1099593207);
+emit_32(1128996864);
+emit_32(3258679296);
+emit_32(1099432565);
+emit_32(1128996864);
+emit_32(3257655309);
+emit_32(1100182245);
+emit_32(1128996864);
+emit_32(3256631296);
+emit_32(1100992112);
+emit_32(1128996864);
+emit_32(3255607309);
+emit_32(1101070441);
+emit_32(1128996864);
+emit_32(3254386688);
+emit_32(1101070860);
+emit_32(1128996864);
+emit_32(3252338714);
+emit_32(1100442554);
+emit_32(1128996864);
+emit_32(3250290688);
+emit_32(1100162689);
+emit_32(1128996864);
+emit_32(3248242714);
+emit_32(1099264741);
+emit_32(1128996864);
+emit_32(3245998080);
+emit_32(1098634809);
+emit_32(1128996864);
+emit_32(3241902132);
+emit_32(1097542192);
+emit_32(1128996864);
+emit_32(3237609472);
+emit_32(1097603953);
+emit_32(1128996864);
+emit_32(3229220864);
+emit_32(1097205809);
+emit_32(1128996864);
+emit_32(0);
+emit_32(1095764961);
+emit_32(1128996864);
+emit_32(1081737216);
+emit_32(1094158228);
+emit_32(1128996864);
+emit_32(3279552512);
+emit_32(1083563940);
+emit_32(1128740880);
+emit_32(3279296528);
+emit_32(1083505514);
+emit_32(1128740880);
+emit_32(3279040545);
+emit_32(1087057166);
+emit_32(1128740880);
+emit_32(3278784496);
+emit_32(1091606046);
+emit_32(1128740880);
+emit_32(3278528512);
+emit_32(1094145750);
+emit_32(1128740880);
+emit_32(3278272528);
+emit_32(1096803366);
+emit_32(1128740880);
+emit_32(3278016545);
+emit_32(1097677459);
+emit_32(1128740880);
+emit_32(3277760496);
+emit_32(1096868377);
+emit_32(1128740880);
+emit_32(3277504512);
+emit_32(1097277637);
+emit_32(1128740880);
+emit_32(3277248528);
+emit_32(1097130626);
+emit_32(1128740880);
+emit_32(3276992545);
+emit_32(1095319526);
+emit_32(1128740880);
+emit_32(3276736496);
+emit_32(1094270635);
+emit_32(1128740880);
+emit_32(3276480512);
+emit_32(1092528657);
+emit_32(1128740880);
+emit_32(3276224528);
+emit_32(1091786055);
+emit_32(1128740880);
+emit_32(3275968545);
+emit_32(1092729228);
+emit_32(1128740880);
+emit_32(3275712496);
+emit_32(1093207379);
+emit_32(1128740880);
+emit_32(3275456512);
+emit_32(1094361966);
+emit_32(1128740880);
+emit_32(3275200528);
+emit_32(1096155975);
+emit_32(1128740880);
+emit_32(3274944545);
+emit_32(1098072457);
+emit_32(1128740880);
+emit_32(3274688496);
+emit_32(1097534957);
+emit_32(1128740880);
+emit_32(3274432512);
+emit_32(1096843212);
+emit_32(1128740880);
+emit_32(3274176528);
+emit_32(1095427215);
+emit_32(1128740880);
+emit_32(3273920545);
+emit_32(1095393870);
+emit_32(1128740880);
+emit_32(3273664496);
+emit_32(1094328831);
+emit_32(1128740880);
+emit_32(3273408512);
+emit_32(1093549005);
+emit_32(1128740880);
+emit_32(3273152528);
+emit_32(1091282907);
+emit_32(1128740880);
+emit_32(3272896545);
+emit_32(1089591113);
+emit_32(1128740880);
+emit_32(3272640496);
+emit_32(1087793476);
+emit_32(1128740880);
+emit_32(3272384512);
+emit_32(1084819170);
+emit_32(1128740880);
+emit_32(3272128528);
+emit_32(1085220523);
+emit_32(1128740880);
+emit_32(3271872545);
+emit_32(1088960395);
+emit_32(1128740880);
+emit_32(3271616496);
+emit_32(1091632869);
+emit_32(1128740880);
+emit_32(3271163904);
+emit_32(1092528154);
+emit_32(1128740880);
+emit_32(3270651937);
+emit_32(1093541036);
+emit_32(1128740880);
+emit_32(3270139970);
+emit_32(1094536554);
+emit_32(1128740880);
+emit_32(3269627871);
+emit_32(1095733504);
+emit_32(1128740880);
+emit_32(3269115904);
+emit_32(1096930453);
+emit_32(1128740880);
+emit_32(3268603937);
+emit_32(1097898289);
+emit_32(1128740880);
+emit_32(3268091970);
+emit_32(1098312162);
+emit_32(1128740880);
+emit_32(3267579911);
+emit_32(1098889088);
+emit_32(1128740880);
+emit_32(3267067904);
+emit_32(1098348023);
+emit_32(1128740880);
+emit_32(3266555911);
+emit_32(1097239783);
+emit_32(1128740880);
+emit_32(3266043904);
+emit_32(1096978163);
+emit_32(1128740880);
+emit_32(3265531911);
+emit_32(1097254987);
+emit_32(1128740880);
+emit_32(3265019904);
+emit_32(1097619682);
+emit_32(1128740880);
+emit_32(3264507911);
+emit_32(1098276300);
+emit_32(1128740880);
+emit_32(3263995904);
+emit_32(1099118097);
+emit_32(1128740880);
+emit_32(3263483911);
+emit_32(1099929276);
+emit_32(1128740880);
+emit_32(3262775296);
+emit_32(1100678011);
+emit_32(1128740880);
+emit_32(3261751309);
+emit_32(1100864396);
+emit_32(1128740880);
+emit_32(3260727296);
+emit_32(1100514486);
+emit_32(1128740880);
+emit_32(3259703309);
+emit_32(1100086300);
+emit_32(1128740880);
+emit_32(3258679296);
+emit_32(1099510946);
+emit_32(1128740880);
+emit_32(3257655309);
+emit_32(1100286840);
+emit_32(1128740880);
+emit_32(3256631296);
+emit_32(1100610850);
+emit_32(1128740880);
+emit_32(3255607309);
+emit_32(1101170370);
+emit_32(1128740880);
+emit_32(3254386688);
+emit_32(1100818206);
+emit_32(1128740880);
+emit_32(3252338714);
+emit_32(1100338640);
+emit_32(1128740880);
+emit_32(3250290688);
+emit_32(1099906469);
+emit_32(1128740880);
+emit_32(3248242714);
+emit_32(1099577688);
+emit_32(1128740880);
+emit_32(3245998080);
+emit_32(1099007892);
+emit_32(1128740880);
+emit_32(3241902132);
+emit_32(1098245472);
+emit_32(1128740880);
+emit_32(3237609472);
+emit_32(1097688783);
+emit_32(1128740880);
+emit_32(3229220864);
+emit_32(1096704380);
+emit_32(1128740880);
+emit_32(0);
+emit_32(1095305265);
+emit_32(1128740880);
+emit_32(1081737216);
+emit_32(1094837495);
+emit_32(1128740880);
+emit_32(3279552512);
+emit_32(1085717569);
+emit_32(1128484897);
+emit_32(3279296528);
+emit_32(1083562745);
+emit_32(1128484897);
+emit_32(3279040545);
+emit_32(1084856981);
+emit_32(1128484897);
+emit_32(3278784496);
+emit_32(1089938108);
+emit_32(1128484897);
+emit_32(3278528512);
+emit_32(1093643482);
+emit_32(1128484897);
+emit_32(3278272528);
+emit_32(1095378456);
+emit_32(1128484897);
+emit_32(3278016545);
+emit_32(1096701654);
+emit_32(1128484897);
+emit_32(3277760496);
+emit_32(1095991453);
+emit_32(1128484897);
+emit_32(3277504512);
+emit_32(1096837130);
+emit_32(1128484897);
+emit_32(3277248528);
+emit_32(1097429470);
+emit_32(1128484897);
+emit_32(3276992545);
+emit_32(1095425747);
+emit_32(1128484897);
+emit_32(3276736496);
+emit_32(1092456704);
+emit_32(1128484897);
+emit_32(3276480512);
+emit_32(1090579469);
+emit_32(1128484897);
+emit_32(3276224528);
+emit_32(1089853278);
+emit_32(1128484897);
+emit_32(3275968545);
+emit_32(1091601590);
+emit_32(1128484897);
+emit_32(3275712496);
+emit_32(1093452222);
+emit_32(1128484897);
+emit_32(3275456512);
+emit_32(1094872308);
+emit_32(1128484897);
+emit_32(3275200528);
+emit_32(1095959891);
+emit_32(1128484897);
+emit_32(3274944545);
+emit_32(1097078827);
+emit_32(1128484897);
+emit_32(3274688496);
+emit_32(1096858206);
+emit_32(1128484897);
+emit_32(3274432512);
+emit_32(1096053948);
+emit_32(1128484897);
+emit_32(3274176528);
+emit_32(1095523264);
+emit_32(1128484897);
+emit_32(3273920545);
+emit_32(1095300547);
+emit_32(1128484897);
+emit_32(3273664496);
+emit_32(1094152041);
+emit_32(1128484897);
+emit_32(3273408512);
+emit_32(1093293887);
+emit_32(1128484897);
+emit_32(3273152528);
+emit_32(1091954824);
+emit_32(1128484897);
+emit_32(3272896545);
+emit_32(1090264488);
+emit_32(1128484897);
+emit_32(3272640496);
+emit_32(1087964038);
+emit_32(1128484897);
+emit_32(3272384512);
+emit_32(1084913101);
+emit_32(1128484897);
+emit_32(3272128528);
+emit_32(1087644432);
+emit_32(1128484897);
+emit_32(3271872545);
+emit_32(1091545292);
+emit_32(1128484897);
+emit_32(3271616496);
+emit_32(1092949010);
+emit_32(1128484897);
+emit_32(3271163904);
+emit_32(1093888744);
+emit_32(1128484897);
+emit_32(3270651937);
+emit_32(1095009252);
+emit_32(1128484897);
+emit_32(3270139970);
+emit_32(1096532728);
+emit_32(1128484897);
+emit_32(3269627871);
+emit_32(1096831048);
+emit_32(1128484897);
+emit_32(3269115904);
+emit_32(1098431280);
+emit_32(1128484897);
+emit_32(3268603937);
+emit_32(1098981153);
+emit_32(1128484897);
+emit_32(3268091970);
+emit_32(1099259917);
+emit_32(1128484897);
+emit_32(3267579911);
+emit_32(1099047004);
+emit_32(1128484897);
+emit_32(3267067904);
+emit_32(1099189663);
+emit_32(1128484897);
+emit_32(3266555911);
+emit_32(1097994233);
+emit_32(1128484897);
+emit_32(3266043904);
+emit_32(1097616536);
+emit_32(1128484897);
+emit_32(3265531911);
+emit_32(1098345402);
+emit_32(1128484897);
+emit_32(3265019904);
+emit_32(1098214644);
+emit_32(1128484897);
+emit_32(3264507911);
+emit_32(1097712481);
+emit_32(1128484897);
+emit_32(3263995904);
+emit_32(1099049258);
+emit_32(1128484897);
+emit_32(3263483911);
+emit_32(1099930586);
+emit_32(1128484897);
+emit_32(3262775296);
+emit_32(1100537135);
+emit_32(1128484897);
+emit_32(3261751309);
+emit_32(1100755920);
+emit_32(1128484897);
+emit_32(3260727296);
+emit_32(1100566915);
+emit_32(1128484897);
+emit_32(3259703309);
+emit_32(1099988940);
+emit_32(1128484897);
+emit_32(3258679296);
+emit_32(1099547332);
+emit_32(1128484897);
+emit_32(3257655309);
+emit_32(1100698878);
+emit_32(1128484897);
+emit_32(3256631296);
+emit_32(1101203033);
+emit_32(1128484897);
+emit_32(3255607309);
+emit_32(1100897845);
+emit_32(1128484897);
+emit_32(3254386688);
+emit_32(1100472176);
+emit_32(1128484897);
+emit_32(3252338714);
+emit_32(1100121008);
+emit_32(1128484897);
+emit_32(3250290688);
+emit_32(1100059666);
+emit_32(1128484897);
+emit_32(3248242714);
+emit_32(1099700424);
+emit_32(1128484897);
+emit_32(3245998080);
+emit_32(1099220596);
+emit_32(1128484897);
+emit_32(3241902132);
+emit_32(1098230163);
+emit_32(1128484897);
+emit_32(3237609472);
+emit_32(1097298503);
+emit_32(1128484897);
+emit_32(3229220864);
+emit_32(1096617663);
+emit_32(1128484897);
+emit_32(0);
+emit_32(1095209006);
+emit_32(1128484897);
+emit_32(1081737216);
+emit_32(1096602144);
+emit_32(1128484897);
+emit_32(3279552512);
+emit_32(1086488964);
+emit_32(1128228848);
+emit_32(3279296528);
+emit_32(1085207394);
+emit_32(1128228848);
+emit_32(3279040545);
+emit_32(1083144426);
+emit_32(1128228848);
+emit_32(3278784496);
+emit_32(1087877279);
+emit_32(1128228848);
+emit_32(3278528512);
+emit_32(1092360979);
+emit_32(1128228848);
+emit_32(3278272528);
+emit_32(1094229112);
+emit_32(1128228848);
+emit_32(3278016545);
+emit_32(1095715678);
+emit_32(1128228848);
+emit_32(3277760496);
+emit_32(1095363042);
+emit_32(1128228848);
+emit_32(3277504512);
+emit_32(1095186881);
+emit_32(1128228848);
+emit_32(3277248528);
+emit_32(1096363593);
+emit_32(1128228848);
+emit_32(3276992545);
+emit_32(1094958082);
+emit_32(1128228848);
+emit_32(3276736496);
+emit_32(1091948081);
+emit_32(1128228848);
+emit_32(3276480512);
+emit_32(1089598789);
+emit_32(1128228848);
+emit_32(3276224528);
+emit_32(1090830991);
+emit_32(1128228848);
+emit_32(3275968545);
+emit_32(1092661490);
+emit_32(1128228848);
+emit_32(3275712496);
+emit_32(1094218416);
+emit_32(1128228848);
+emit_32(3275456512);
+emit_32(1095692504);
+emit_32(1128228848);
+emit_32(3275200528);
+emit_32(1096747267);
+emit_32(1128228848);
+emit_32(3274944545);
+emit_32(1096959708);
+emit_32(1128228848);
+emit_32(3274688496);
+emit_32(1096562717);
+emit_32(1128228848);
+emit_32(3274432512);
+emit_32(1095550422);
+emit_32(1128228848);
+emit_32(3274176528);
+emit_32(1095356331);
+emit_32(1128228848);
+emit_32(3273920545);
+emit_32(1094786744);
+emit_32(1128228848);
+emit_32(3273664496);
+emit_32(1094402651);
+emit_32(1128228848);
+emit_32(3273408512);
+emit_32(1093003326);
+emit_32(1128228848);
+emit_32(3273152528);
+emit_32(1091879924);
+emit_32(1128228848);
+emit_32(3272896545);
+emit_32(1090340950);
+emit_32(1128228848);
+emit_32(3272640496);
+emit_32(1088120653);
+emit_32(1128228848);
+emit_32(3272384512);
+emit_32(1090582175);
+emit_32(1128228848);
+emit_32(3272128528);
+emit_32(1091421633);
+emit_32(1128228848);
+emit_32(3271872545);
+emit_32(1093724013);
+emit_32(1128228848);
+emit_32(3271616496);
+emit_32(1095136025);
+emit_32(1128228848);
+emit_32(3271163904);
+emit_32(1096213647);
+emit_32(1128228848);
+emit_32(3270651937);
+emit_32(1096677537);
+emit_32(1128228848);
+emit_32(3270139970);
+emit_32(1097917268);
+emit_32(1128228848);
+emit_32(3269627871);
+emit_32(1098919130);
+emit_32(1128228848);
+emit_32(3269115904);
+emit_32(1099360947);
+emit_32(1128228848);
+emit_32(3268603937);
+emit_32(1099387686);
+emit_32(1128228848);
+emit_32(3268091970);
+emit_32(1099422027);
+emit_32(1128228848);
+emit_32(3267579911);
+emit_32(1099524892);
+emit_32(1128228848);
+emit_32(3267067904);
+emit_32(1099391723);
+emit_32(1128228848);
+emit_32(3266555911);
+emit_32(1098232680);
+emit_32(1128228848);
+emit_32(3266043904);
+emit_32(1097328073);
+emit_32(1128228848);
+emit_32(3265531911);
+emit_32(1098499542);
+emit_32(1128228848);
+emit_32(3265019904);
+emit_32(1098867278);
+emit_32(1128228848);
+emit_32(3264507911);
+emit_32(1097477915);
+emit_32(1128228848);
+emit_32(3263995904);
+emit_32(1098419431);
+emit_32(1128228848);
+emit_32(3263483911);
+emit_32(1099657118);
+emit_32(1128228848);
+emit_32(3262775296);
+emit_32(1100094951);
+emit_32(1128228848);
+emit_32(3261751309);
+emit_32(1100491260);
+emit_32(1128228848);
+emit_32(3260727296);
+emit_32(1100506884);
+emit_32(1128228848);
+emit_32(3259703309);
+emit_32(1099794324);
+emit_32(1128228848);
+emit_32(3258679296);
+emit_32(1099789291);
+emit_32(1128228848);
+emit_32(3257655309);
+emit_32(1100379115);
+emit_32(1128228848);
+emit_32(3256631296);
+emit_32(1100923221);
+emit_32(1128228848);
+emit_32(3255607309);
+emit_32(1100371932);
+emit_32(1128228848);
+emit_32(3254386688);
+emit_32(1100316148);
+emit_32(1128228848);
+emit_32(3252338714);
+emit_32(1100515692);
+emit_32(1128228848);
+emit_32(3250290688);
+emit_32(1100307916);
+emit_32(1128228848);
+emit_32(3248242714);
+emit_32(1099810210);
+emit_32(1128228848);
+emit_32(3245998080);
+emit_32(1099154640);
+emit_32(1128228848);
+emit_32(3241902132);
+emit_32(1098355573);
+emit_32(1128228848);
+emit_32(3237609472);
+emit_32(1097472777);
+emit_32(1128228848);
+emit_32(3229220864);
+emit_32(1096682465);
+emit_32(1128228848);
+emit_32(0);
+emit_32(1096577398);
+emit_32(1128228848);
+emit_32(1081737216);
+emit_32(1097223216);
+emit_32(1128228848);
+emit_32(3279552512);
+emit_32(1086853617);
+emit_32(1127972864);
+emit_32(3279296528);
+emit_32(1086298564);
+emit_32(1127972864);
+emit_32(3279040545);
+emit_32(1085278425);
+emit_32(1127972864);
+emit_32(3278784496);
+emit_32(1085319131);
+emit_32(1127972864);
+emit_32(3278528512);
+emit_32(1090251360);
+emit_32(1127972864);
+emit_32(3278272528);
+emit_32(1092641777);
+emit_32(1127972864);
+emit_32(3278016545);
+emit_32(1093620623);
+emit_32(1127972864);
+emit_32(3277760496);
+emit_32(1094102653);
+emit_32(1127972864);
+emit_32(3277504512);
+emit_32(1093830758);
+emit_32(1127972864);
+emit_32(3277248528);
+emit_32(1094796916);
+emit_32(1127972864);
+emit_32(3276992545);
+emit_32(1093478751);
+emit_32(1127972864);
+emit_32(3276736496);
+emit_32(1091477050);
+emit_32(1127972864);
+emit_32(3276480512);
+emit_32(1089930831);
+emit_32(1127972864);
+emit_32(3276224528);
+emit_32(1091537375);
+emit_32(1127972864);
+emit_32(3275968545);
+emit_32(1093540302);
+emit_32(1127972864);
+emit_32(3275712496);
+emit_32(1095329278);
+emit_32(1127972864);
+emit_32(3275456512);
+emit_32(1096120323);
+emit_32(1127972864);
+emit_32(3275200528);
+emit_32(1096433743);
+emit_32(1127972864);
+emit_32(3274944545);
+emit_32(1096683304);
+emit_32(1127972864);
+emit_32(3274688496);
+emit_32(1096592182);
+emit_32(1127972864);
+emit_32(3274432512);
+emit_32(1095725220);
+emit_32(1127972864);
+emit_32(3274176528);
+emit_32(1094999815);
+emit_32(1127972864);
+emit_32(3273920545);
+emit_32(1094300520);
+emit_32(1127972864);
+emit_32(3273664496);
+emit_32(1093576583);
+emit_32(1127972864);
+emit_32(3273408512);
+emit_32(1092872779);
+emit_32(1127972864);
+emit_32(3273152528);
+emit_32(1091911098);
+emit_32(1127972864);
+emit_32(3272896545);
+emit_32(1091753434);
+emit_32(1127972864);
+emit_32(3272640496);
+emit_32(1092133438);
+emit_32(1127972864);
+emit_32(3272384512);
+emit_32(1093071169);
+emit_32(1127972864);
+emit_32(3272128528);
+emit_32(1094518728);
+emit_32(1127972864);
+emit_32(3271872545);
+emit_32(1096084986);
+emit_32(1127972864);
+emit_32(3271616496);
+emit_32(1096360657);
+emit_32(1127972864);
+emit_32(3271163904);
+emit_32(1096731014);
+emit_32(1127972864);
+emit_32(3270651937);
+emit_32(1098285738);
+emit_32(1127972864);
+emit_32(3270139970);
+emit_32(1099415631);
+emit_32(1127972864);
+emit_32(3269627871);
+emit_32(1099949408);
+emit_32(1127972864);
+emit_32(3269115904);
+emit_32(1100367161);
+emit_32(1127972864);
+emit_32(3268603937);
+emit_32(1100361866);
+emit_32(1127972864);
+emit_32(3268091970);
+emit_32(1100305714);
+emit_32(1127972864);
+emit_32(3267579911);
+emit_32(1100208354);
+emit_32(1127972864);
+emit_32(3267067904);
+emit_32(1100142975);
+emit_32(1127972864);
+emit_32(3266555911);
+emit_32(1099102421);
+emit_32(1127972864);
+emit_32(3266043904);
+emit_32(1097385430);
+emit_32(1127972864);
+emit_32(3265531911);
+emit_32(1097822162);
+emit_32(1127972864);
+emit_32(3265019904);
+emit_32(1098963275);
+emit_32(1127972864);
+emit_32(3264507911);
+emit_32(1097304900);
+emit_32(1127972864);
+emit_32(3263995904);
+emit_32(1097683121);
+emit_32(1127972864);
+emit_32(3263483911);
+emit_32(1099069810);
+emit_32(1127972864);
+emit_32(3262775296);
+emit_32(1099605213);
+emit_32(1127972864);
+emit_32(3261751309);
+emit_32(1100129868);
+emit_32(1127972864);
+emit_32(3260727296);
+emit_32(1100106433);
+emit_32(1127972864);
+emit_32(3259703309);
+emit_32(1099661207);
+emit_32(1127972864);
+emit_32(3258679296);
+emit_32(1099945896);
+emit_32(1127972864);
+emit_32(3257655309);
+emit_32(1100312216);
+emit_32(1127972864);
+emit_32(3256631296);
+emit_32(1100604401);
+emit_32(1127972864);
+emit_32(3255607309);
+emit_32(1101000920);
+emit_32(1127972864);
+emit_32(3254386688);
+emit_32(1100943301);
+emit_32(1127972864);
+emit_32(3252338714);
+emit_32(1100628886);
+emit_32(1127972864);
+emit_32(3250290688);
+emit_32(1100484759);
+emit_32(1127972864);
+emit_32(3248242714);
+emit_32(1099700843);
+emit_32(1127972864);
+emit_32(3245998080);
+emit_32(1099261752);
+emit_32(1127972864);
+emit_32(3241902132);
+emit_32(1098560045);
+emit_32(1127972864);
+emit_32(3237609472);
+emit_32(1097453588);
+emit_32(1127972864);
+emit_32(3229220864);
+emit_32(1096754712);
+emit_32(1127972864);
+emit_32(0);
+emit_32(1097041812);
+emit_32(1127972864);
+emit_32(1081737216);
+emit_32(1096992739);
+emit_32(1127972864);
+emit_32(3279552512);
+emit_32(1088632086);
+emit_32(1127716880);
+emit_32(3279296528);
+emit_32(1087150511);
+emit_32(1127716880);
+emit_32(3279040545);
+emit_32(1085863719);
+emit_32(1127716880);
+emit_32(3278784496);
+emit_32(1084379313);
+emit_32(1127716880);
+emit_32(3278528512);
+emit_32(1086294621);
+emit_32(1127716880);
+emit_32(3278272528);
+emit_32(1089793845);
+emit_32(1127716880);
+emit_32(3278016545);
+emit_32(1091311124);
+emit_32(1127716880);
+emit_32(3277760496);
+emit_32(1092520195);
+emit_32(1127716880);
+emit_32(3277504512);
+emit_32(1092832933);
+emit_32(1127716880);
+emit_32(3277248528);
+emit_32(1092827899);
+emit_32(1127716880);
+emit_32(3276992545);
+emit_32(1091811620);
+emit_32(1127716880);
+emit_32(3276736496);
+emit_32(1089828825);
+emit_32(1127716880);
+emit_32(3276480512);
+emit_32(1090682052);
+emit_32(1127716880);
+emit_32(3276224528);
+emit_32(1092010839);
+emit_32(1127716880);
+emit_32(3275968545);
+emit_32(1093459876);
+emit_32(1127716880);
+emit_32(3275712496);
+emit_32(1096080897);
+emit_32(1127716880);
+emit_32(3275456512);
+emit_32(1096807455);
+emit_32(1127716880);
+emit_32(3275200528);
+emit_32(1096413086);
+emit_32(1127716880);
+emit_32(3274944545);
+emit_32(1096350381);
+emit_32(1127716880);
+emit_32(3274688496);
+emit_32(1096323642);
+emit_32(1127716880);
+emit_32(3274432512);
+emit_32(1095633784);
+emit_32(1127716880);
+emit_32(3274176528);
+emit_32(1094753714);
+emit_32(1127716880);
+emit_32(3273920545);
+emit_32(1094125198);
+emit_32(1127716880);
+emit_32(3273664496);
+emit_32(1093062361);
+emit_32(1127716880);
+emit_32(3273408512);
+emit_32(1093213041);
+emit_32(1127716880);
+emit_32(3273152528);
+emit_32(1093187876);
+emit_32(1127716880);
+emit_32(3272896545);
+emit_32(1094195347);
+emit_32(1127716880);
+emit_32(3272640496);
+emit_32(1094880172);
+emit_32(1127716880);
+emit_32(3272384512);
+emit_32(1095364719);
+emit_32(1127716880);
+emit_32(3272128528);
+emit_32(1096288829);
+emit_32(1127716880);
+emit_32(3271872545);
+emit_32(1097163132);
+emit_32(1127716880);
+emit_32(3271616496);
+emit_32(1097356385);
+emit_32(1127716880);
+emit_32(3271163904);
+emit_32(1098373084);
+emit_32(1127716880);
+emit_32(3270651937);
+emit_32(1099643172);
+emit_32(1127716880);
+emit_32(3270139970);
+emit_32(1099931949);
+emit_32(1127716880);
+emit_32(3269627871);
+emit_32(1100246260);
+emit_32(1127716880);
+emit_32(3269115904);
+emit_32(1100634600);
+emit_32(1127716880);
+emit_32(3268603937);
+emit_32(1100611741);
+emit_32(1127716880);
+emit_32(3268091970);
+emit_32(1100940417);
+emit_32(1127716880);
+emit_32(3267579911);
+emit_32(1100834564);
+emit_32(1127716880);
+emit_32(3267067904);
+emit_32(1100309804);
+emit_32(1127716880);
+emit_32(3266555911);
+emit_32(1099846386);
+emit_32(1127716880);
+emit_32(3266043904);
+emit_32(1098992216);
+emit_32(1127716880);
+emit_32(3265531911);
+emit_32(1098681051);
+emit_32(1127716880);
+emit_32(3265019904);
+emit_32(1098547986);
+emit_32(1127716880);
+emit_32(3264507911);
+emit_32(1097247857);
+emit_32(1127716880);
+emit_32(3263995904);
+emit_32(1097448345);
+emit_32(1127716880);
+emit_32(3263483911);
+emit_32(1098445645);
+emit_32(1127716880);
+emit_32(3262775296);
+emit_32(1098977798);
+emit_32(1127716880);
+emit_32(3261751309);
+emit_32(1099491390);
+emit_32(1127716880);
+emit_32(3260727296);
+emit_32(1099337145);
+emit_32(1127716880);
+emit_32(3259703309);
+emit_32(1099792908);
+emit_32(1127716880);
+emit_32(3258679296);
+emit_32(1100235722);
+emit_32(1127716880);
+emit_32(3257655309);
+emit_32(1100866336);
+emit_32(1127716880);
+emit_32(3256631296);
+emit_32(1101422448);
+emit_32(1127716880);
+emit_32(3255607309);
+emit_32(1101221855);
+emit_32(1127716880);
+emit_32(3254386688);
+emit_32(1101088005);
+emit_32(1127716880);
+emit_32(3252338714);
+emit_32(1100972556);
+emit_32(1127716880);
+emit_32(3250290688);
+emit_32(1100202325);
+emit_32(1127716880);
+emit_32(3248242714);
+emit_32(1099418409);
+emit_32(1127716880);
+emit_32(3245998080);
+emit_32(1098944243);
+emit_32(1127716880);
+emit_32(3241902132);
+emit_32(1098327366);
+emit_32(1127716880);
+emit_32(3237609472);
+emit_32(1097923455);
+emit_32(1127716880);
+emit_32(3229220864);
+emit_32(1098086089);
+emit_32(1127716880);
+emit_32(0);
+emit_32(1097086481);
+emit_32(1127716880);
+emit_32(1081737216);
+emit_32(1096797703);
+emit_32(1127716880);
+emit_32(3279552512);
+emit_32(1090697067);
+emit_32(1127460897);
+emit_32(3279296528);
+emit_32(1088464754);
+emit_32(1127460897);
+emit_32(3279040545);
+emit_32(1087359387);
+emit_32(1127460897);
+emit_32(3278784496);
+emit_32(1086695387);
+emit_32(1127460897);
+emit_32(3278528512);
+emit_32(1083514070);
+emit_32(1127460897);
+emit_32(3278272528);
+emit_32(1084835276);
+emit_32(1127460897);
+emit_32(3278016545);
+emit_32(1088646514);
+emit_32(1127460897);
+emit_32(3277760496);
+emit_32(1090551147);
+emit_32(1127460897);
+emit_32(3277504512);
+emit_32(1091910700);
+emit_32(1127460897);
+emit_32(3277248528);
+emit_32(1091808013);
+emit_32(1127460897);
+emit_32(3276992545);
+emit_32(1091196294);
+emit_32(1127460897);
+emit_32(3276736496);
+emit_32(1090026922);
+emit_32(1127460897);
+emit_32(3276480512);
+emit_32(1090912801);
+emit_32(1127460897);
+emit_32(3276224528);
+emit_32(1091162887);
+emit_32(1127460897);
+emit_32(3275968545);
+emit_32(1093409649);
+emit_32(1127460897);
+emit_32(3275712496);
+emit_32(1094918970);
+emit_32(1127460897);
+emit_32(3275456512);
+emit_32(1096294177);
+emit_32(1127460897);
+emit_32(3275200528);
+emit_32(1096363698);
+emit_32(1127460897);
+emit_32(3274944545);
+emit_32(1096394421);
+emit_32(1127460897);
+emit_32(3274688496);
+emit_32(1096326893);
+emit_32(1127460897);
+emit_32(3274432512);
+emit_32(1095806484);
+emit_32(1127460897);
+emit_32(3274176528);
+emit_32(1096379007);
+emit_32(1127460897);
+emit_32(3273920545);
+emit_32(1096041470);
+emit_32(1127460897);
+emit_32(3273664496);
+emit_32(1094485488);
+emit_32(1127460897);
+emit_32(3273408512);
+emit_32(1095082128);
+emit_32(1127460897);
+emit_32(3273152528);
+emit_32(1095898969);
+emit_32(1127460897);
+emit_32(3272896545);
+emit_32(1096463208);
+emit_32(1127460897);
+emit_32(3272640496);
+emit_32(1096556741);
+emit_32(1127460897);
+emit_32(3272384512);
+emit_32(1096834613);
+emit_32(1127460897);
+emit_32(3272128528);
+emit_32(1098017826);
+emit_32(1127460897);
+emit_32(3271872545);
+emit_32(1098909745);
+emit_32(1127460897);
+emit_32(3271616496);
+emit_32(1099379035);
+emit_32(1127460897);
+emit_32(3271163904);
+emit_32(1099621519);
+emit_32(1127460897);
+emit_32(3270651937);
+emit_32(1100273890);
+emit_32(1127460897);
+emit_32(3270139970);
+emit_32(1100651587);
+emit_32(1127460897);
+emit_32(3269627871);
+emit_32(1100583063);
+emit_32(1127460897);
+emit_32(3269115904);
+emit_32(1100899471);
+emit_32(1127460897);
+emit_32(3268603937);
+emit_32(1101366926);
+emit_32(1127460897);
+emit_32(3268091970);
+emit_32(1101899183);
+emit_32(1127460897);
+emit_32(3267579911);
+emit_32(1101822427);
+emit_32(1127460897);
+emit_32(3267067904);
+emit_32(1101218290);
+emit_32(1127460897);
+emit_32(3266555911);
+emit_32(1100574150);
+emit_32(1127460897);
+emit_32(3266043904);
+emit_32(1100108005);
+emit_32(1127460897);
+emit_32(3265531911);
+emit_32(1099514144);
+emit_32(1127460897);
+emit_32(3265019904);
+emit_32(1098172701);
+emit_32(1127460897);
+emit_32(3264507911);
+emit_32(1096910216);
+emit_32(1127460897);
+emit_32(3263995904);
+emit_32(1097118253);
+emit_32(1127460897);
+emit_32(3263483911);
+emit_32(1097919785);
+emit_32(1127460897);
+emit_32(3262775296);
+emit_32(1098225759);
+emit_32(1127460897);
+emit_32(3261751309);
+emit_32(1098294021);
+emit_32(1127460897);
+emit_32(3260727296);
+emit_32(1099564476);
+emit_32(1127460897);
+emit_32(3259703309);
+emit_32(1100155453);
+emit_32(1127460897);
+emit_32(3258679296);
+emit_32(1100660343);
+emit_32(1127460897);
+emit_32(3257655309);
+emit_32(1101117574);
+emit_32(1127460897);
+emit_32(3256631296);
+emit_32(1101606787);
+emit_32(1127460897);
+emit_32(3255607309);
+emit_32(1101430155);
+emit_32(1127460897);
+emit_32(3254386688);
+emit_32(1100673712);
+emit_32(1127460897);
+emit_32(3252338714);
+emit_32(1100216585);
+emit_32(1127460897);
+emit_32(3250290688);
+emit_32(1099492858);
+emit_32(1127460897);
+emit_32(3248242714);
+emit_32(1098998822);
+emit_32(1127460897);
+emit_32(3245998080);
+emit_32(1097972423);
+emit_32(1127460897);
+emit_32(3241902132);
+emit_32(1098463681);
+emit_32(1127460897);
+emit_32(3237609472);
+emit_32(1099098961);
+emit_32(1127460897);
+emit_32(3229220864);
+emit_32(1099075315);
+emit_32(1127460897);
+emit_32(0);
+emit_32(1098576717);
+emit_32(1127460897);
+emit_32(1081737216);
+emit_32(1097521955);
+emit_32(1127460897);
+emit_32(3279552512);
+emit_32(1091907942);
+emit_32(1127204848);
+emit_32(3279296528);
+emit_32(1090913000);
+emit_32(1127204848);
+emit_32(3279040545);
+emit_32(1089627792);
+emit_32(1127204848);
+emit_32(3278784496);
+emit_32(1088453282);
+emit_32(1127204848);
+emit_32(3278528512);
+emit_32(1085638149);
+emit_32(1127204848);
+emit_32(3278272528);
+emit_32(1082820290);
+emit_32(1127204848);
+emit_32(3278016545);
+emit_32(1084647581);
+emit_32(1127204848);
+emit_32(3277760496);
+emit_32(1086976132);
+emit_32(1127204848);
+emit_32(3277504512);
+emit_32(1089606024);
+emit_32(1127204848);
+emit_32(3277248528);
+emit_32(1090895206);
+emit_32(1127204848);
+emit_32(3276992545);
+emit_32(1090776528);
+emit_32(1127204848);
+emit_32(3276736496);
+emit_32(1089657215);
+emit_32(1127204848);
+emit_32(3276480512);
+emit_32(1090767154);
+emit_32(1127204848);
+emit_32(3276224528);
+emit_32(1091192603);
+emit_32(1127204848);
+emit_32(3275968545);
+emit_32(1093123912);
+emit_32(1127204848);
+emit_32(3275712496);
+emit_32(1094534667);
+emit_32(1127204848);
+emit_32(3275456512);
+emit_32(1096318399);
+emit_32(1127204848);
+emit_32(3275200528);
+emit_32(1097169319);
+emit_32(1127204848);
+emit_32(3274944545);
+emit_32(1096886518);
+emit_32(1127204848);
+emit_32(3274688496);
+emit_32(1097439642);
+emit_32(1127204848);
+emit_32(3274432512);
+emit_32(1096797599);
+emit_32(1127204848);
+emit_32(3274176528);
+emit_32(1096554224);
+emit_32(1127204848);
+emit_32(3273920545);
+emit_32(1096240490);
+emit_32(1127204848);
+emit_32(3273664496);
+emit_32(1096477363);
+emit_32(1127204848);
+emit_32(3273408512);
+emit_32(1097087635);
+emit_32(1127204848);
+emit_32(3273152528);
+emit_32(1097338349);
+emit_32(1127204848);
+emit_32(3272896545);
+emit_32(1097759457);
+emit_32(1127204848);
+emit_32(3272640496);
+emit_32(1097880778);
+emit_32(1127204848);
+emit_32(3272384512);
+emit_32(1098146906);
+emit_32(1127204848);
+emit_32(3272128528);
+emit_32(1099303643);
+emit_32(1127204848);
+emit_32(3271872545);
+emit_32(1099944532);
+emit_32(1127204848);
+emit_32(3271616496);
+emit_32(1100242905);
+emit_32(1127204848);
+emit_32(3271163904);
+emit_32(1100588882);
+emit_32(1127204848);
+emit_32(3270651937);
+emit_32(1100605502);
+emit_32(1127204848);
+emit_32(3270139970);
+emit_32(1100742289);
+emit_32(1127204848);
+emit_32(3269627871);
+emit_32(1101124128);
+emit_32(1127204848);
+emit_32(3269115904);
+emit_32(1101735972);
+emit_32(1127204848);
+emit_32(3268603937);
+emit_32(1102084728);
+emit_32(1127204848);
+emit_32(3268091970);
+emit_32(1102719903);
+emit_32(1127204848);
+emit_32(3267579911);
+emit_32(1102404177);
+emit_32(1127204848);
+emit_32(3267067904);
+emit_32(1101692613);
+emit_32(1127204848);
+emit_32(3266555911);
+emit_32(1101323724);
+emit_32(1127204848);
+emit_32(3266043904);
+emit_32(1100739353);
+emit_32(1127204848);
+emit_32(3265531911);
+emit_32(1100060977);
+emit_32(1127204848);
+emit_32(3265019904);
+emit_32(1098668153);
+emit_32(1127204848);
+emit_32(3264507911);
+emit_32(1097066139);
+emit_32(1127204848);
+emit_32(3263995904);
+emit_32(1097240936);
+emit_32(1127204848);
+emit_32(3263483911);
+emit_32(1098056099);
+emit_32(1127204848);
+emit_32(3262775296);
+emit_32(1098692270);
+emit_32(1127204848);
+emit_32(3261751309);
+emit_32(1099028339);
+emit_32(1127204848);
+emit_32(3260727296);
+emit_32(1099487406);
+emit_32(1127204848);
+emit_32(3259703309);
+emit_32(1100464154);
+emit_32(1127204848);
+emit_32(3258679296);
+emit_32(1100643146);
+emit_32(1127204848);
+emit_32(3257655309);
+emit_32(1100685089);
+emit_32(1127204848);
+emit_32(3256631296);
+emit_32(1100823658);
+emit_32(1127204848);
+emit_32(3255607309);
+emit_32(1100633027);
+emit_32(1127204848);
+emit_32(3254386688);
+emit_32(1100238553);
+emit_32(1127204848);
+emit_32(3252338714);
+emit_32(1099137706);
+emit_32(1127204848);
+emit_32(3250290688);
+emit_32(1098443758);
+emit_32(1127204848);
+emit_32(3248242714);
+emit_32(1098669202);
+emit_32(1127204848);
+emit_32(3245998080);
+emit_32(1099104571);
+emit_32(1127204848);
+emit_32(3241902132);
+emit_32(1099412328);
+emit_32(1127204848);
+emit_32(3237609472);
+emit_32(1099546755);
+emit_32(1127204848);
+emit_32(3229220864);
+emit_32(1099464966);
+emit_32(1127204848);
+emit_32(0);
+emit_32(1099096864);
+emit_32(1127204848);
+emit_32(1081737216);
+emit_32(1098169765);
+emit_32(1127204848);
+emit_32(3279552512);
+emit_32(1092650690);
+emit_32(1126948864);
+emit_32(3279296528);
+emit_32(1091119434);
+emit_32(1126948864);
+emit_32(3279040545);
+emit_32(1090136415);
+emit_32(1126948864);
+emit_32(3278784496);
+emit_32(1088411612);
+emit_32(1126948864);
+emit_32(3278528512);
+emit_32(1085469077);
+emit_32(1126948864);
+emit_32(3278272528);
+emit_32(1083833424);
+emit_32(1126948864);
+emit_32(3278016545);
+emit_32(1083689035);
+emit_32(1126948864);
+emit_32(3277760496);
+emit_32(1085122711);
+emit_32(1126948864);
+emit_32(3277504512);
+emit_32(1086667243);
+emit_32(1126948864);
+emit_32(3277248528);
+emit_32(1087657958);
+emit_32(1126948864);
+emit_32(3276992545);
+emit_32(1088371095);
+emit_32(1126948864);
+emit_32(3276736496);
+emit_32(1089466354);
+emit_32(1126948864);
+emit_32(3276480512);
+emit_32(1091055439);
+emit_32(1126948864);
+emit_32(3276224528);
+emit_32(1090400677);
+emit_32(1126948864);
+emit_32(3275968545);
+emit_32(1092101142);
+emit_32(1126948864);
+emit_32(3275712496);
+emit_32(1093636037);
+emit_32(1126948864);
+emit_32(3275456512);
+emit_32(1095931999);
+emit_32(1126948864);
+emit_32(3275200528);
+emit_32(1096626890);
+emit_32(1126948864);
+emit_32(3274944545);
+emit_32(1098060923);
+emit_32(1126948864);
+emit_32(3274688496);
+emit_32(1097783994);
+emit_32(1126948864);
+emit_32(3274432512);
+emit_32(1096721367);
+emit_32(1126948864);
+emit_32(3274176528);
+emit_32(1097047264);
+emit_32(1126948864);
+emit_32(3273920545);
+emit_32(1096218051);
+emit_32(1126948864);
+emit_32(3273664496);
+emit_32(1096743282);
+emit_32(1126948864);
+emit_32(3273408512);
+emit_32(1097750335);
+emit_32(1126948864);
+emit_32(3273152528);
+emit_32(1098166619);
+emit_32(1126948864);
+emit_32(3272896545);
+emit_32(1097872074);
+emit_32(1126948864);
+emit_32(3272640496);
+emit_32(1097941595);
+emit_32(1126948864);
+emit_32(3272384512);
+emit_32(1098064383);
+emit_32(1126948864);
+emit_32(3272128528);
+emit_32(1099511103);
+emit_32(1126948864);
+emit_32(3271872545);
+emit_32(1100417545);
+emit_32(1126948864);
+emit_32(3271616496);
+emit_32(1100756969);
+emit_32(1126948864);
+emit_32(3271163904);
+emit_32(1100841956);
+emit_32(1126948864);
+emit_32(3270651937);
+emit_32(1100819517);
+emit_32(1126948864);
+emit_32(3270139970);
+emit_32(1101316280);
+emit_32(1126948864);
+emit_32(3269627871);
+emit_32(1101803658);
+emit_32(1126948864);
+emit_32(3269115904);
+emit_32(1102338327);
+emit_32(1126948864);
+emit_32(3268603937);
+emit_32(1102614679);
+emit_32(1126948864);
+emit_32(3268091970);
+emit_32(1102899577);
+emit_32(1126948864);
+emit_32(3267579911);
+emit_32(1102273472);
+emit_32(1126948864);
+emit_32(3267067904);
+emit_32(1102032300);
+emit_32(1126948864);
+emit_32(3266555911);
+emit_32(1102213336);
+emit_32(1126948864);
+emit_32(3266043904);
+emit_32(1101920154);
+emit_32(1126948864);
+emit_32(3265531911);
+emit_32(1101073377);
+emit_32(1126948864);
+emit_32(3265019904);
+emit_32(1099747453);
+emit_32(1126948864);
+emit_32(3264507911);
+emit_32(1097970221);
+emit_32(1126948864);
+emit_32(3263995904);
+emit_32(1098951583);
+emit_32(1126948864);
+emit_32(3263483911);
+emit_32(1099125385);
+emit_32(1126948864);
+emit_32(3262775296);
+emit_32(1099384383);
+emit_32(1126948864);
+emit_32(3261751309);
+emit_32(1099297666);
+emit_32(1126948864);
+emit_32(3260727296);
+emit_32(1099151914);
+emit_32(1126948864);
+emit_32(3259703309);
+emit_32(1100003043);
+emit_32(1126948864);
+emit_32(3258679296);
+emit_32(1100391278);
+emit_32(1126948864);
+emit_32(3257655309);
+emit_32(1100196872);
+emit_32(1126948864);
+emit_32(3256631296);
+emit_32(1100006189);
+emit_32(1126948864);
+emit_32(3255607309);
+emit_32(1100085251);
+emit_32(1126948864);
+emit_32(3254386688);
+emit_32(1099464704);
+emit_32(1126948864);
+emit_32(3252338714);
+emit_32(1098192624);
+emit_32(1126948864);
+emit_32(3250290688);
+emit_32(1098051695);
+emit_32(1126948864);
+emit_32(3248242714);
+emit_32(1099538104);
+emit_32(1126948864);
+emit_32(3245998080);
+emit_32(1100121060);
+emit_32(1126948864);
+emit_32(3241902132);
+emit_32(1100174380);
+emit_32(1126948864);
+emit_32(3237609472);
+emit_32(1100128138);
+emit_32(1126948864);
+emit_32(3229220864);
+emit_32(1099728526);
+emit_32(1126948864);
+emit_32(0);
+emit_32(1099015494);
+emit_32(1126948864);
+emit_32(1081737216);
+emit_32(1098949119);
+emit_32(1126948864);
+emit_32(3279552512);
+emit_32(1092053820);
+emit_32(1126692880);
+emit_32(3279296528);
+emit_32(1091482168);
+emit_32(1126692880);
+emit_32(3279040545);
+emit_32(1090170556);
+emit_32(1126692880);
+emit_32(3278784496);
+emit_32(1089291577);
+emit_32(1126692880);
+emit_32(3278528512);
+emit_32(1087031308);
+emit_32(1126692880);
+emit_32(3278272528);
+emit_32(1085157335);
+emit_32(1126692880);
+emit_32(3278016545);
+emit_32(1082956060);
+emit_32(1126692880);
+emit_32(3277760496);
+emit_32(1079787745);
+emit_32(1126692880);
+emit_32(3277504512);
+emit_32(1083066831);
+emit_32(1126692880);
+emit_32(3277248528);
+emit_32(1084997260);
+emit_32(1126692880);
+emit_32(3276992545);
+emit_32(1086936056);
+emit_32(1126692880);
+emit_32(3276736496);
+emit_32(1087077194);
+emit_32(1126692880);
+emit_32(3276480512);
+emit_32(1089181120);
+emit_32(1126692880);
+emit_32(3276224528);
+emit_32(1090090592);
+emit_32(1126692880);
+emit_32(3275968545);
+emit_32(1091979287);
+emit_32(1126692880);
+emit_32(3275712496);
+emit_32(1093947779);
+emit_32(1126692880);
+emit_32(3275456512);
+emit_32(1095104148);
+emit_32(1126692880);
+emit_32(3275200528);
+emit_32(1097546806);
+emit_32(1126692880);
+emit_32(3274944545);
+emit_32(1098312476);
+emit_32(1126692880);
+emit_32(3274688496);
+emit_32(1098096050);
+emit_32(1126692880);
+emit_32(3274432512);
+emit_32(1096460062);
+emit_32(1126692880);
+emit_32(3274176528);
+emit_32(1096848350);
+emit_32(1126692880);
+emit_32(3273920545);
+emit_32(1096377539);
+emit_32(1126692880);
+emit_32(3273664496);
+emit_32(1097570714);
+emit_32(1126692880);
+emit_32(3273408512);
+emit_32(1098430756);
+emit_32(1126692880);
+emit_32(3273152528);
+emit_32(1099100848);
+emit_32(1126692880);
+emit_32(3272896545);
+emit_32(1099443103);
+emit_32(1126692880);
+emit_32(3272640496);
+emit_32(1099024459);
+emit_32(1126692880);
+emit_32(3272384512);
+emit_32(1097976827);
+emit_32(1126692880);
+emit_32(3272128528);
+emit_32(1099397281);
+emit_32(1126692880);
+emit_32(3271872545);
+emit_32(1100167250);
+emit_32(1126692880);
+emit_32(3271616496);
+emit_32(1101001916);
+emit_32(1126692880);
+emit_32(3271163904);
+emit_32(1101218133);
+emit_32(1126692880);
+emit_32(3270651937);
+emit_32(1101763445);
+emit_32(1126692880);
+emit_32(3270139970);
+emit_32(1102254703);
+emit_32(1126692880);
+emit_32(3269627871);
+emit_32(1102306188);
+emit_32(1126692880);
+emit_32(3269115904);
+emit_32(1102526179);
+emit_32(1126692880);
+emit_32(3268603937);
+emit_32(1102836453);
+emit_32(1126692880);
+emit_32(3268091970);
+emit_32(1102582120);
+emit_32(1126692880);
+emit_32(3267579911);
+emit_32(1102493673);
+emit_32(1126692880);
+emit_32(3267067904);
+emit_32(1102731752);
+emit_32(1126692880);
+emit_32(3266555911);
+emit_32(1102752566);
+emit_32(1126692880);
+emit_32(3266043904);
+emit_32(1102414243);
+emit_32(1126692880);
+emit_32(3265531911);
+emit_32(1101987945);
+emit_32(1126692880);
+emit_32(3265019904);
+emit_32(1100347133);
+emit_32(1126692880);
+emit_32(3264507911);
+emit_32(1099205706);
+emit_32(1126692880);
+emit_32(3263995904);
+emit_32(1099525784);
+emit_32(1126692880);
+emit_32(3263483911);
+emit_32(1100012533);
+emit_32(1126692880);
+emit_32(3262775296);
+emit_32(1100473434);
+emit_32(1126692880);
+emit_32(3261751309);
+emit_32(1099686268);
+emit_32(1126692880);
+emit_32(3260727296);
+emit_32(1099578474);
+emit_32(1126692880);
+emit_32(3259703309);
+emit_32(1099386952);
+emit_32(1126692880);
+emit_32(3258679296);
+emit_32(1099512257);
+emit_32(1126692880);
+emit_32(3257655309);
+emit_32(1099849269);
+emit_32(1126692880);
+emit_32(3256631296);
+emit_32(1099792017);
+emit_32(1126692880);
+emit_32(3255607309);
+emit_32(1099326974);
+emit_32(1126692880);
+emit_32(3254386688);
+emit_32(1098936798);
+emit_32(1126692880);
+emit_32(3252338714);
+emit_32(1097635096);
+emit_32(1126692880);
+emit_32(3250290688);
+emit_32(1099347316);
+emit_32(1126692880);
+emit_32(3248242714);
+emit_32(1099939237);
+emit_32(1126692880);
+emit_32(3245998080);
+emit_32(1100173489);
+emit_32(1126692880);
+emit_32(3241902132);
+emit_32(1100441086);
+emit_32(1126692880);
+emit_32(3237609472);
+emit_32(1100198130);
+emit_32(1126692880);
+emit_32(3229220864);
+emit_32(1099547122);
+emit_32(1126692880);
+emit_32(0);
+emit_32(1099279735);
+emit_32(1126692880);
+emit_32(1081737216);
+emit_32(1099508220);
+emit_32(1126692880);
+emit_32(3279552512);
+emit_32(1091859760);
+emit_32(1126436897);
+emit_32(3279296528);
+emit_32(1091230761);
+emit_32(1126436897);
+emit_32(3279040545);
+emit_32(1090930805);
+emit_32(1126436897);
+emit_32(3278784496);
+emit_32(1089555210);
+emit_32(1126436897);
+emit_32(3278528512);
+emit_32(1087108253);
+emit_32(1126436897);
+emit_32(3278272528);
+emit_32(1084241425);
+emit_32(1126436897);
+emit_32(3278016545);
+emit_32(1080584495);
+emit_32(1126436897);
+emit_32(3277760496);
+emit_32(1077009103);
+emit_32(1126436897);
+emit_32(3277504512);
+emit_32(1077476097);
+emit_32(1126436897);
+emit_32(3277248528);
+emit_32(1082163798);
+emit_32(1126436897);
+emit_32(3276992545);
+emit_32(1083224118);
+emit_32(1126436897);
+emit_32(3276736496);
+emit_32(1083925510);
+emit_32(1126436897);
+emit_32(3276480512);
+emit_32(1086781055);
+emit_32(1126436897);
+emit_32(3276224528);
+emit_32(1090787203);
+emit_32(1126436897);
+emit_32(3275968545);
+emit_32(1093020523);
+emit_32(1126436897);
+emit_32(3275712496);
+emit_32(1094356094);
+emit_32(1126436897);
+emit_32(3275456512);
+emit_32(1095272654);
+emit_32(1126436897);
+emit_32(3275200528);
+emit_32(1096919967);
+emit_32(1126436897);
+emit_32(3274944545);
+emit_32(1097664981);
+emit_32(1126436897);
+emit_32(3274688496);
+emit_32(1097850264);
+emit_32(1126436897);
+emit_32(3274432512);
+emit_32(1097462501);
+emit_32(1126436897);
+emit_32(3274176528);
+emit_32(1097374001);
+emit_32(1126436897);
+emit_32(3273920545);
+emit_32(1096574357);
+emit_32(1126436897);
+emit_32(3273664496);
+emit_32(1097971165);
+emit_32(1126436897);
+emit_32(3273408512);
+emit_32(1099181588);
+emit_32(1126436897);
+emit_32(3273152528);
+emit_32(1099865208);
+emit_32(1126436897);
+emit_32(3272896545);
+emit_32(1100222353);
+emit_32(1126436897);
+emit_32(3272640496);
+emit_32(1099751699);
+emit_32(1126436897);
+emit_32(3272384512);
+emit_32(1099151756);
+emit_32(1126436897);
+emit_32(3272128528);
+emit_32(1099314548);
+emit_32(1126436897);
+emit_32(3271872545);
+emit_32(1100567124);
+emit_32(1126436897);
+emit_32(3271616496);
+emit_32(1101301023);
+emit_32(1126436897);
+emit_32(3271163904);
+emit_32(1101937036);
+emit_32(1126436897);
+emit_32(3270651937);
+emit_32(1102452516);
+emit_32(1126436897);
+emit_32(3270139970);
+emit_32(1102878763);
+emit_32(1126436897);
+emit_32(3269627871);
+emit_32(1102764678);
+emit_32(1126436897);
+emit_32(3269115904);
+emit_32(1103315599);
+emit_32(1126436897);
+emit_32(3268603937);
+emit_32(1103337986);
+emit_32(1126436897);
+emit_32(3268091970);
+emit_32(1103125021);
+emit_32(1126436897);
+emit_32(3267579911);
+emit_32(1103452701);
+emit_32(1126436897);
+emit_32(3267067904);
+emit_32(1103518551);
+emit_32(1126436897);
+emit_32(3266555911);
+emit_32(1103087377);
+emit_32(1126436897);
+emit_32(3266043904);
+emit_32(1102707740);
+emit_32(1126436897);
+emit_32(3265531911);
+emit_32(1102273682);
+emit_32(1126436897);
+emit_32(3265019904);
+emit_32(1100733009);
+emit_32(1126436897);
+emit_32(3264507911);
+emit_32(1100143447);
+emit_32(1126436897);
+emit_32(3263995904);
+emit_32(1100648022);
+emit_32(1126436897);
+emit_32(3263483911);
+emit_32(1100809555);
+emit_32(1126436897);
+emit_32(3262775296);
+emit_32(1100886835);
+emit_32(1126436897);
+emit_32(3261751309);
+emit_32(1100168508);
+emit_32(1126436897);
+emit_32(3260727296);
+emit_32(1099798833);
+emit_32(1126436897);
+emit_32(3259703309);
+emit_32(1099326502);
+emit_32(1126436897);
+emit_32(3258679296);
+emit_32(1099188195);
+emit_32(1126436897);
+emit_32(3257655309);
+emit_32(1098951478);
+emit_32(1126436897);
+emit_32(3256631296);
+emit_32(1099140746);
+emit_32(1126436897);
+emit_32(3255607309);
+emit_32(1097892836);
+emit_32(1126436897);
+emit_32(3254386688);
+emit_32(1096986552);
+emit_32(1126436897);
+emit_32(3252338714);
+emit_32(1098931818);
+emit_32(1126436897);
+emit_32(3250290688);
+emit_32(1099424072);
+emit_32(1126436897);
+emit_32(3248242714);
+emit_32(1099604217);
+emit_32(1126436897);
+emit_32(3245998080);
+emit_32(1100206309);
+emit_32(1126436897);
+emit_32(3241902132);
+emit_32(1099889954);
+emit_32(1126436897);
+emit_32(3237609472);
+emit_32(1099854460);
+emit_32(1126436897);
+emit_32(3229220864);
+emit_32(1099540935);
+emit_32(1126436897);
+emit_32(0);
+emit_32(1099312713);
+emit_32(1126436897);
+emit_32(1081737216);
+emit_32(1099149921);
+emit_32(1126436897);
+emit_32(3279552512);
+emit_32(1091110007);
+emit_32(1126180848);
+emit_32(3279296528);
+emit_32(1090566603);
+emit_32(1126180848);
+emit_32(3279040545);
+emit_32(1089927538);
+emit_32(1126180848);
+emit_32(3278784496);
+emit_32(1088849057);
+emit_32(1126180848);
+emit_32(3278528512);
+emit_32(1085306191);
+emit_32(1126180848);
+emit_32(3278272528);
+emit_32(1084238930);
+emit_32(1126180848);
+emit_32(3278016545);
+emit_32(1082904260);
+emit_32(1126180848);
+emit_32(3277760496);
+emit_32(1078098238);
+emit_32(1126180848);
+emit_32(3277504512);
+emit_32(1077638962);
+emit_32(1126180848);
+emit_32(3277248528);
+emit_32(1076413302);
+emit_32(1126180848);
+emit_32(3276992545);
+emit_32(1076646547);
+emit_32(1126180848);
+emit_32(3276736496);
+emit_32(1080275711);
+emit_32(1126180848);
+emit_32(3276480512);
+emit_32(1085520143);
+emit_32(1126180848);
+emit_32(3276224528);
+emit_32(1089702514);
+emit_32(1126180848);
+emit_32(3275968545);
+emit_32(1092246705);
+emit_32(1126180848);
+emit_32(3275712496);
+emit_32(1093963402);
+emit_32(1126180848);
+emit_32(3275456512);
+emit_32(1095512778);
+emit_32(1126180848);
+emit_32(3275200528);
+emit_32(1096063386);
+emit_32(1126180848);
+emit_32(3274944545);
+emit_32(1098150157);
+emit_32(1126180848);
+emit_32(3274688496);
+emit_32(1098201747);
+emit_32(1126180848);
+emit_32(3274432512);
+emit_32(1098080322);
+emit_32(1126180848);
+emit_32(3274176528);
+emit_32(1097170158);
+emit_32(1126180848);
+emit_32(3273920545);
+emit_32(1097720975);
+emit_32(1126180848);
+emit_32(3273664496);
+emit_32(1098994627);
+emit_32(1126180848);
+emit_32(3273408512);
+emit_32(1099145570);
+emit_32(1126180848);
+emit_32(3273152528);
+emit_32(1100249878);
+emit_32(1126180848);
+emit_32(3272896545);
+emit_32(1100617613);
+emit_32(1126180848);
+emit_32(3272640496);
+emit_32(1100383781);
+emit_32(1126180848);
+emit_32(3272384512);
+emit_32(1099661417);
+emit_32(1126180848);
+emit_32(3272128528);
+emit_32(1099771570);
+emit_32(1126180848);
+emit_32(3271872545);
+emit_32(1100856322);
+emit_32(1126180848);
+emit_32(3271616496);
+emit_32(1101777863);
+emit_32(1126180848);
+emit_32(3271163904);
+emit_32(1102608912);
+emit_32(1126180848);
+emit_32(3270651937);
+emit_32(1103420142);
+emit_32(1126180848);
+emit_32(3270139970);
+emit_32(1104133541);
+emit_32(1126180848);
+emit_32(3269627871);
+emit_32(1104300737);
+emit_32(1126180848);
+emit_32(3269115904);
+emit_32(1104750366);
+emit_32(1126180848);
+emit_32(3268603937);
+emit_32(1104692327);
+emit_32(1126180848);
+emit_32(3268091970);
+emit_32(1104180255);
+emit_32(1126180848);
+emit_32(3267579911);
+emit_32(1104286004);
+emit_32(1126180848);
+emit_32(3267067904);
+emit_32(1104294760);
+emit_32(1126180848);
+emit_32(3266555911);
+emit_32(1103989519);
+emit_32(1126180848);
+emit_32(3266043904);
+emit_32(1103116370);
+emit_32(1126180848);
+emit_32(3265531911);
+emit_32(1102176374);
+emit_32(1126180848);
+emit_32(3265019904);
+emit_32(1101252683);
+emit_32(1126180848);
+emit_32(3264507911);
+emit_32(1100807091);
+emit_32(1126180848);
+emit_32(3263995904);
+emit_32(1101057072);
+emit_32(1126180848);
+emit_32(3263483911);
+emit_32(1101590954);
+emit_32(1126180848);
+emit_32(3262775296);
+emit_32(1101241516);
+emit_32(1126180848);
+emit_32(3261751309);
+emit_32(1100721632);
+emit_32(1126180848);
+emit_32(3260727296);
+emit_32(1100065328);
+emit_32(1126180848);
+emit_32(3259703309);
+emit_32(1099340867);
+emit_32(1126180848);
+emit_32(3258679296);
+emit_32(1099102631);
+emit_32(1126180848);
+emit_32(3257655309);
+emit_32(1098007550);
+emit_32(1126180848);
+emit_32(3256631296);
+emit_32(1097436391);
+emit_32(1126180848);
+emit_32(3255607309);
+emit_32(1097548589);
+emit_32(1126180848);
+emit_32(3254386688);
+emit_32(1097682282);
+emit_32(1126180848);
+emit_32(3252338714);
+emit_32(1099124127);
+emit_32(1126180848);
+emit_32(3250290688);
+emit_32(1098983145);
+emit_32(1126180848);
+emit_32(3248242714);
+emit_32(1099734136);
+emit_32(1126180848);
+emit_32(3245998080);
+emit_32(1099916745);
+emit_32(1126180848);
+emit_32(3241902132);
+emit_32(1099462450);
+emit_32(1126180848);
+emit_32(3237609472);
+emit_32(1099513410);
+emit_32(1126180848);
+emit_32(3229220864);
+emit_32(1099346425);
+emit_32(1126180848);
+emit_32(0);
+emit_32(1099133931);
+emit_32(1126180848);
+emit_32(1081737216);
+emit_32(1099236901);
+emit_32(1126180848);
+emit_32(3279552512);
+emit_32(1089511002);
+emit_32(1125924864);
+emit_32(3279296528);
+emit_32(1089751084);
+emit_32(1125924864);
+emit_32(3279040545);
+emit_32(1089625192);
+emit_32(1125924864);
+emit_32(3278784496);
+emit_32(1088308768);
+emit_32(1125924864);
+emit_32(3278528512);
+emit_32(1083791334);
+emit_32(1125924864);
+emit_32(3278272528);
+emit_32(1083037702);
+emit_32(1125924864);
+emit_32(3278016545);
+emit_32(1082409647);
+emit_32(1125924864);
+emit_32(3277760496);
+emit_32(1076909237);
+emit_32(1125924864);
+emit_32(3277504512);
+emit_32(1076578474);
+emit_32(1125924864);
+emit_32(3277248528);
+emit_32(1079282500);
+emit_32(1125924864);
+emit_32(3276992545);
+emit_32(1079322891);
+emit_32(1125924864);
+emit_32(3276736496);
+emit_32(1080482867);
+emit_32(1125924864);
+emit_32(3276480512);
+emit_32(1083066517);
+emit_32(1125924864);
+emit_32(3276224528);
+emit_32(1086368944);
+emit_32(1125924864);
+emit_32(3275968545);
+emit_32(1090788545);
+emit_32(1125924864);
+emit_32(3275712496);
+emit_32(1093220381);
+emit_32(1125924864);
+emit_32(3275456512);
+emit_32(1094138095);
+emit_32(1125924864);
+emit_32(3275200528);
+emit_32(1095485201);
+emit_32(1125924864);
+emit_32(3274944545);
+emit_32(1098300103);
+emit_32(1125924864);
+emit_32(3274688496);
+emit_32(1099012348);
+emit_32(1125924864);
+emit_32(3274432512);
+emit_32(1097753795);
+emit_32(1125924864);
+emit_32(3274176528);
+emit_32(1096927727);
+emit_32(1125924864);
+emit_32(3273920545);
+emit_32(1098937847);
+emit_32(1125924864);
+emit_32(3273664496);
+emit_32(1099750598);
+emit_32(1125924864);
+emit_32(3273408512);
+emit_32(1099826096);
+emit_32(1125924864);
+emit_32(3273152528);
+emit_32(1100180514);
+emit_32(1125924864);
+emit_32(3272896545);
+emit_32(1100786015);
+emit_32(1125924864);
+emit_32(3272640496);
+emit_32(1100625006);
+emit_32(1125924864);
+emit_32(3272384512);
+emit_32(1100107638);
+emit_32(1125924864);
+emit_32(3272128528);
+emit_32(1100331457);
+emit_32(1125924864);
+emit_32(3271872545);
+emit_32(1101249590);
+emit_32(1125924864);
+emit_32(3271616496);
+emit_32(1102354737);
+emit_32(1125924864);
+emit_32(3271163904);
+emit_32(1103441691);
+emit_32(1125924864);
+emit_32(3270651937);
+emit_32(1104738936);
+emit_32(1125924864);
+emit_32(3270139970);
+emit_32(1105236276);
+emit_32(1125924864);
+emit_32(3269627871);
+emit_32(1105460304);
+emit_32(1125924864);
+emit_32(3269115904);
+emit_32(1105771993);
+emit_32(1125924864);
+emit_32(3268603937);
+emit_32(1105867833);
+emit_32(1125924864);
+emit_32(3268091970);
+emit_32(1105681868);
+emit_32(1125924864);
+emit_32(3267579911);
+emit_32(1105399854);
+emit_32(1125924864);
+emit_32(3267067904);
+emit_32(1104596592);
+emit_32(1125924864);
+emit_32(3266555911);
+emit_32(1104130657);
+emit_32(1125924864);
+emit_32(3266043904);
+emit_32(1103243877);
+emit_32(1125924864);
+emit_32(3265531911);
+emit_32(1102380270);
+emit_32(1125924864);
+emit_32(3265019904);
+emit_32(1102020241);
+emit_32(1125924864);
+emit_32(3264507911);
+emit_32(1101572656);
+emit_32(1125924864);
+emit_32(3263995904);
+emit_32(1101722026);
+emit_32(1125924864);
+emit_32(3263483911);
+emit_32(1101703833);
+emit_32(1125924864);
+emit_32(3262775296);
+emit_32(1101282463);
+emit_32(1125924864);
+emit_32(3261751309);
+emit_32(1100994314);
+emit_32(1125924864);
+emit_32(3260727296);
+emit_32(1100261255);
+emit_32(1125924864);
+emit_32(3259703309);
+emit_32(1099538104);
+emit_32(1125924864);
+emit_32(3258679296);
+emit_32(1099005113);
+emit_32(1125924864);
+emit_32(3257655309);
+emit_32(1097288542);
+emit_32(1125924864);
+emit_32(3256631296);
+emit_32(1096558523);
+emit_32(1125924864);
+emit_32(3255607309);
+emit_32(1097476761);
+emit_32(1125924864);
+emit_32(3254386688);
+emit_32(1098510552);
+emit_32(1125924864);
+emit_32(3252338714);
+emit_32(1098575249);
+emit_32(1125924864);
+emit_32(3250290688);
+emit_32(1099187146);
+emit_32(1125924864);
+emit_32(3248242714);
+emit_32(1099341339);
+emit_32(1125924864);
+emit_32(3245998080);
+emit_32(1099196531);
+emit_32(1125924864);
+emit_32(3241902132);
+emit_32(1099085906);
+emit_32(1125924864);
+emit_32(3237609472);
+emit_32(1099120876);
+emit_32(1125924864);
+emit_32(3229220864);
+emit_32(1098773955);
+emit_32(1125924864);
+emit_32(0);
+emit_32(1099088580);
+emit_32(1125924864);
+emit_32(1081737216);
+emit_32(1099397648);
+emit_32(1125924864);
+emit_32(3279552512);
+emit_32(1087350222);
+emit_32(1125668880);
+emit_32(3279296528);
+emit_32(1087173453);
+emit_32(1125668880);
+emit_32(3279040545);
+emit_32(1087524370);
+emit_32(1125668880);
+emit_32(3278784496);
+emit_32(1085198146);
+emit_32(1125668880);
+emit_32(3278528512);
+emit_32(1082565654);
+emit_32(1125668880);
+emit_32(3278272528);
+emit_32(1077145753);
+emit_32(1125668880);
+emit_32(3278016545);
+emit_32(1072746264);
+emit_32(1125668880);
+emit_32(3277760496);
+emit_32(1070147557);
+emit_32(1125668880);
+emit_32(3277504512);
+emit_32(1075759536);
+emit_32(1125668880);
+emit_32(3277248528);
+emit_32(1077469889);
+emit_32(1125668880);
+emit_32(3276992545);
+emit_32(1076408479);
+emit_32(1125668880);
+emit_32(3276736496);
+emit_32(1077817429);
+emit_32(1125668880);
+emit_32(3276480512);
+emit_32(1080487943);
+emit_32(1125668880);
+emit_32(3276224528);
+emit_32(1082089831);
+emit_32(1125668880);
+emit_32(3275968545);
+emit_32(1089194856);
+emit_32(1125668880);
+emit_32(3275712496);
+emit_32(1092143819);
+emit_32(1125668880);
+emit_32(3275456512);
+emit_32(1093271971);
+emit_32(1125668880);
+emit_32(3275200528);
+emit_32(1095061157);
+emit_32(1125668880);
+emit_32(3274944545);
+emit_32(1096826225);
+emit_32(1125668880);
+emit_32(3274688496);
+emit_32(1097739220);
+emit_32(1125668880);
+emit_32(3274432512);
+emit_32(1097853200);
+emit_32(1125668880);
+emit_32(3274176528);
+emit_32(1097601856);
+emit_32(1125668880);
+emit_32(3273920545);
+emit_32(1099313866);
+emit_32(1125668880);
+emit_32(3273664496);
+emit_32(1100242538);
+emit_32(1125668880);
+emit_32(3273408512);
+emit_32(1100791520);
+emit_32(1125668880);
+emit_32(3273152528);
+emit_32(1100534671);
+emit_32(1125668880);
+emit_32(3272896545);
+emit_32(1100486803);
+emit_32(1125668880);
+emit_32(3272640496);
+emit_32(1100712667);
+emit_32(1125668880);
+emit_32(3272384512);
+emit_32(1100661549);
+emit_32(1125668880);
+emit_32(3272128528);
+emit_32(1101351407);
+emit_32(1125668880);
+emit_32(3271872545);
+emit_32(1102206154);
+emit_32(1125668880);
+emit_32(3271616496);
+emit_32(1103301286);
+emit_32(1125668880);
+emit_32(3271163904);
+emit_32(1104362760);
+emit_32(1125668880);
+emit_32(3270651937);
+emit_32(1105383916);
+emit_32(1125668880);
+emit_32(3270139970);
+emit_32(1106277093);
+emit_32(1125668880);
+emit_32(3269627871);
+emit_32(1106308235);
+emit_32(1125668880);
+emit_32(3269115904);
+emit_32(1106719801);
+emit_32(1125668880);
+emit_32(3268603937);
+emit_32(1106707323);
+emit_32(1125668880);
+emit_32(3268091970);
+emit_32(1106722475);
+emit_32(1125668880);
+emit_32(3267579911);
+emit_32(1106438259);
+emit_32(1125668880);
+emit_32(3267067904);
+emit_32(1105408609);
+emit_32(1125668880);
+emit_32(3266555911);
+emit_32(1104049917);
+emit_32(1125668880);
+emit_32(3266043904);
+emit_32(1103297564);
+emit_32(1125668880);
+emit_32(3265531911);
+emit_32(1102461429);
+emit_32(1125668880);
+emit_32(3265019904);
+emit_32(1102366533);
+emit_32(1125668880);
+emit_32(3264507911);
+emit_32(1101967340);
+emit_32(1125668880);
+emit_32(3263995904);
+emit_32(1101786146);
+emit_32(1125668880);
+emit_32(3263483911);
+emit_32(1101553258);
+emit_32(1125668880);
+emit_32(3262775296);
+emit_32(1101001340);
+emit_32(1125668880);
+emit_32(3261751309);
+emit_32(1100728448);
+emit_32(1125668880);
+emit_32(3260727296);
+emit_32(1100022546);
+emit_32(1125668880);
+emit_32(3259703309);
+emit_32(1099153224);
+emit_32(1125668880);
+emit_32(3258679296);
+emit_32(1097869977);
+emit_32(1125668880);
+emit_32(3257655309);
+emit_32(1096668099);
+emit_32(1125668880);
+emit_32(3256631296);
+emit_32(1097741107);
+emit_32(1125668880);
+emit_32(3255607309);
+emit_32(1097981755);
+emit_32(1125668880);
+emit_32(3254386688);
+emit_32(1097933206);
+emit_32(1125668880);
+emit_32(3252338714);
+emit_32(1098260572);
+emit_32(1125668880);
+emit_32(3250290688);
+emit_32(1098406219);
+emit_32(1125668880);
+emit_32(3248242714);
+emit_32(1098084516);
+emit_32(1125668880);
+emit_32(3245998080);
+emit_32(1098079168);
+emit_32(1125668880);
+emit_32(3241902132);
+emit_32(1098423520);
+emit_32(1125668880);
+emit_32(3237609472);
+emit_32(1098536662);
+emit_32(1125668880);
+emit_32(3229220864);
+emit_32(1098183711);
+emit_32(1125668880);
+emit_32(0);
+emit_32(1099109709);
+emit_32(1125668880);
+emit_32(1081737216);
+emit_32(1099796421);
+emit_32(1125668880);
+emit_32(3279552512);
+emit_32(1084599032);
+emit_32(1125412897);
+emit_32(3279296528);
+emit_32(1083540012);
+emit_32(1125412897);
+emit_32(3279040545);
+emit_32(1082794369);
+emit_32(1125412897);
+emit_32(3278784496);
+emit_32(1078855100);
+emit_32(1125412897);
+emit_32(3278528512);
+emit_32(1074302393);
+emit_32(1125412897);
+emit_32(3278272528);
+emit_32(1066993608);
+emit_32(1125412897);
+emit_32(3278016545);
+emit_32(1038259757);
+emit_32(1125412897);
+emit_32(3277760496);
+emit_32(1064430889);
+emit_32(1125412897);
+emit_32(3277504512);
+emit_32(1068992026);
+emit_32(1125412897);
+emit_32(3277248528);
+emit_32(1074031860);
+emit_32(1125412897);
+emit_32(3276992545);
+emit_32(1074904275);
+emit_32(1125412897);
+emit_32(3276736496);
+emit_32(1074708653);
+emit_32(1125412897);
+emit_32(3276480512);
+emit_32(1076428066);
+emit_32(1125412897);
+emit_32(3276224528);
+emit_32(1077918302);
+emit_32(1125412897);
+emit_32(3275968545);
+emit_32(1085074875);
+emit_32(1125412897);
+emit_32(3275712496);
+emit_32(1090557240);
+emit_32(1125412897);
+emit_32(3275456512);
+emit_32(1092638422);
+emit_32(1125412897);
+emit_32(3275200528);
+emit_32(1094944555);
+emit_32(1125412897);
+emit_32(3274944545);
+emit_32(1097008048);
+emit_32(1125412897);
+emit_32(3274688496);
+emit_32(1097387737);
+emit_32(1125412897);
+emit_32(3274432512);
+emit_32(1098056204);
+emit_32(1125412897);
+emit_32(3274176528);
+emit_32(1098092066);
+emit_32(1125412897);
+emit_32(3273920545);
+emit_32(1099683122);
+emit_32(1125412897);
+emit_32(3273664496);
+emit_32(1100803369);
+emit_32(1125412897);
+emit_32(3273408512);
+emit_32(1101115267);
+emit_32(1125412897);
+emit_32(3273152528);
+emit_32(1101294207);
+emit_32(1125412897);
+emit_32(3272896545);
+emit_32(1101133932);
+emit_32(1125412897);
+emit_32(3272640496);
+emit_32(1101242093);
+emit_32(1125412897);
+emit_32(3272384512);
+emit_32(1101498994);
+emit_32(1125412897);
+emit_32(3272128528);
+emit_32(1102385303);
+emit_32(1125412897);
+emit_32(3271872545);
+emit_32(1103696757);
+emit_32(1125412897);
+emit_32(3271616496);
+emit_32(1104690492);
+emit_32(1125412897);
+emit_32(3271163904);
+emit_32(1105923146);
+emit_32(1125412897);
+emit_32(3270651937);
+emit_32(1106797868);
+emit_32(1125412897);
+emit_32(3270139970);
+emit_32(1107151867);
+emit_32(1125412897);
+emit_32(3269627871);
+emit_32(1107261181);
+emit_32(1125412897);
+emit_32(3269115904);
+emit_32(1107270933);
+emit_32(1125412897);
+emit_32(3268603937);
+emit_32(1107353141);
+emit_32(1125412897);
+emit_32(3268091970);
+emit_32(1107243880);
+emit_32(1125412897);
+emit_32(3267579911);
+emit_32(1106494620);
+emit_32(1125412897);
+emit_32(3267067904);
+emit_32(1105521174);
+emit_32(1125412897);
+emit_32(3266555911);
+emit_32(1104449162);
+emit_32(1125412897);
+emit_32(3266043904);
+emit_32(1103510110);
+emit_32(1125412897);
+emit_32(3265531911);
+emit_32(1102747953);
+emit_32(1125412897);
+emit_32(3265019904);
+emit_32(1102196874);
+emit_32(1125412897);
+emit_32(3264507911);
+emit_32(1102074085);
+emit_32(1125412897);
+emit_32(3263995904);
+emit_32(1101784888);
+emit_32(1125412897);
+emit_32(3263483911);
+emit_32(1101295203);
+emit_32(1125412897);
+emit_32(3262775296);
+emit_32(1100689231);
+emit_32(1125412897);
+emit_32(3261751309);
+emit_32(1100003515);
+emit_32(1125412897);
+emit_32(3260727296);
+emit_32(1099230295);
+emit_32(1125412897);
+emit_32(3259703309);
+emit_32(1098733375);
+emit_32(1125412897);
+emit_32(3258679296);
+emit_32(1096895326);
+emit_32(1125412897);
+emit_32(3257655309);
+emit_32(1095571918);
+emit_32(1125412897);
+emit_32(3256631296);
+emit_32(1096896374);
+emit_32(1125412897);
+emit_32(3255607309);
+emit_32(1097195638);
+emit_32(1125412897);
+emit_32(3254386688);
+emit_32(1097122238);
+emit_32(1125412897);
+emit_32(3252338714);
+emit_32(1098028522);
+emit_32(1125412897);
+emit_32(3250290688);
+emit_32(1096753663);
+emit_32(1125412897);
+emit_32(3248242714);
+emit_32(1097797416);
+emit_32(1125412897);
+emit_32(3245998080);
+emit_32(1098329673);
+emit_32(1125412897);
+emit_32(3241902132);
+emit_32(1098215273);
+emit_32(1125412897);
+emit_32(3237609472);
+emit_32(1097896401);
+emit_32(1125412897);
+emit_32(3229220864);
+emit_32(1098533411);
+emit_32(1125412897);
+emit_32(0);
+emit_32(1099233650);
+emit_32(1125412897);
+emit_32(1081737216);
+emit_32(1100171654);
+emit_32(1125412897);
+emit_32(3279552512);
+emit_32(1085043754);
+emit_32(1125156848);
+emit_32(3279296528);
+emit_32(1082745359);
+emit_32(1125156848);
+emit_32(3279040545);
+emit_32(1077929543);
+emit_32(1125156848);
+emit_32(3278784496);
+emit_32(1077120797);
+emit_32(1125156848);
+emit_32(3278528512);
+emit_32(1070829467);
+emit_32(1125156848);
+emit_32(3278272528);
+emit_32(3196693122);
+emit_32(1125156848);
+emit_32(3278016545);
+emit_32(3203591578);
+emit_32(1125156848);
+emit_32(3277760496);
+emit_32(3178809932);
+emit_32(1125156848);
+emit_32(3277504512);
+emit_32(1062996554);
+emit_32(1125156848);
+emit_32(3277248528);
+emit_32(1067740194);
+emit_32(1125156848);
+emit_32(3276992545);
+emit_32(1071204690);
+emit_32(1125156848);
+emit_32(3276736496);
+emit_32(1074277437);
+emit_32(1125156848);
+emit_32(3276480512);
+emit_32(1077601171);
+emit_32(1125156848);
+emit_32(3276224528);
+emit_32(1081521125);
+emit_32(1125156848);
+emit_32(3275968545);
+emit_32(1082948300);
+emit_32(1125156848);
+emit_32(3275712496);
+emit_32(1087836804);
+emit_32(1125156848);
+emit_32(3275456512);
+emit_32(1091823815);
+emit_32(1125156848);
+emit_32(3275200528);
+emit_32(1094296745);
+emit_32(1125156848);
+emit_32(3274944545);
+emit_32(1095976039);
+emit_32(1125156848);
+emit_32(3274688496);
+emit_32(1097507484);
+emit_32(1125156848);
+emit_32(3274432512);
+emit_32(1097570923);
+emit_32(1125156848);
+emit_32(3274176528);
+emit_32(1098982359);
+emit_32(1125156848);
+emit_32(3273920545);
+emit_32(1100051802);
+emit_32(1125156848);
+emit_32(3273664496);
+emit_32(1100994419);
+emit_32(1125156848);
+emit_32(3273408512);
+emit_32(1102158705);
+emit_32(1125156848);
+emit_32(3273152528);
+emit_32(1102017357);
+emit_32(1125156848);
+emit_32(3272896545);
+emit_32(1102232735);
+emit_32(1125156848);
+emit_32(3272640496);
+emit_32(1101864265);
+emit_32(1125156848);
+emit_32(3272384512);
+emit_32(1102610222);
+emit_32(1125156848);
+emit_32(3272128528);
+emit_32(1103466332);
+emit_32(1125156848);
+emit_32(3271872545);
+emit_32(1104473437);
+emit_32(1125156848);
+emit_32(3271616496);
+emit_32(1106243066);
+emit_32(1125156848);
+emit_32(3271163904);
+emit_32(1107111235);
+emit_32(1125156848);
+emit_32(3270651937);
+emit_32(1107425205);
+emit_32(1125156848);
+emit_32(3270139970);
+emit_32(1107552502);
+emit_32(1125156848);
+emit_32(3269627871);
+emit_32(1107600002);
+emit_32(1125156848);
+emit_32(3269115904);
+emit_32(1107564875);
+emit_32(1125156848);
+emit_32(3268603937);
+emit_32(1107418258);
+emit_32(1125156848);
+emit_32(3268091970);
+emit_32(1107034584);
+emit_32(1125156848);
+emit_32(3267579911);
+emit_32(1106363600);
+emit_32(1125156848);
+emit_32(3267067904);
+emit_32(1105390731);
+emit_32(1125156848);
+emit_32(3266555911);
+emit_32(1104501591);
+emit_32(1125156848);
+emit_32(3266043904);
+emit_32(1103946108);
+emit_32(1125156848);
+emit_32(3265531911);
+emit_32(1102869325);
+emit_32(1125156848);
+emit_32(3265019904);
+emit_32(1101989360);
+emit_32(1125156848);
+emit_32(3264507911);
+emit_32(1101780170);
+emit_32(1125156848);
+emit_32(3263995904);
+emit_32(1101640971);
+emit_32(1125156848);
+emit_32(3263483911);
+emit_32(1101030700);
+emit_32(1125156848);
+emit_32(3262775296);
+emit_32(1100725564);
+emit_32(1125156848);
+emit_32(3261751309);
+emit_32(1099604322);
+emit_32(1125156848);
+emit_32(3260727296);
+emit_32(1099292318);
+emit_32(1125156848);
+emit_32(3259703309);
+emit_32(1098829949);
+emit_32(1125156848);
+emit_32(3258679296);
+emit_32(1097125803);
+emit_32(1125156848);
+emit_32(3257655309);
+emit_32(1096142658);
+emit_32(1125156848);
+emit_32(3256631296);
+emit_32(1095542138);
+emit_32(1125156848);
+emit_32(3255607309);
+emit_32(1096456811);
+emit_32(1125156848);
+emit_32(3254386688);
+emit_32(1096482501);
+emit_32(1125156848);
+emit_32(3252338714);
+emit_32(1096896270);
+emit_32(1125156848);
+emit_32(3250290688);
+emit_32(1096761213);
+emit_32(1125156848);
+emit_32(3248242714);
+emit_32(1096850971);
+emit_32(1125156848);
+emit_32(3245998080);
+emit_32(1096941463);
+emit_32(1125156848);
+emit_32(3241902132);
+emit_32(1096922589);
+emit_32(1125156848);
+emit_32(3237609472);
+emit_32(1097331429);
+emit_32(1125156848);
+emit_32(3229220864);
+emit_32(1098308177);
+emit_32(1125156848);
+emit_32(0);
+emit_32(1099200882);
+emit_32(1125156848);
+emit_32(1081737216);
+emit_32(1099891107);
+emit_32(1125156848);
+emit_32(3279552512);
+emit_32(1084907963);
+emit_32(1124900864);
+emit_32(3279296528);
+emit_32(1083246159);
+emit_32(1124900864);
+emit_32(3279040545);
+emit_32(1077321704);
+emit_32(1124900864);
+emit_32(3278784496);
+emit_32(1069416909);
+emit_32(1124900864);
+emit_32(3278528512);
+emit_32(1044789651);
+emit_32(1124900864);
+emit_32(3278272528);
+emit_32(3167012033);
+emit_32(1124900864);
+emit_32(3278016545);
+emit_32(3192403624);
+emit_32(1124900864);
+emit_32(3277760496);
+emit_32(3204872485);
+emit_32(1124900864);
+emit_32(3277504512);
+emit_32(1048751859);
+emit_32(1124900864);
+emit_32(3277248528);
+emit_32(1057065154);
+emit_32(1124900864);
+emit_32(3276992545);
+emit_32(1067451207);
+emit_32(1124900864);
+emit_32(3276736496);
+emit_32(1076983266);
+emit_32(1124900864);
+emit_32(3276480512);
+emit_32(1078929255);
+emit_32(1124900864);
+emit_32(3276224528);
+emit_32(1081361406);
+emit_32(1124900864);
+emit_32(3275968545);
+emit_32(1083089858);
+emit_32(1124900864);
+emit_32(3275712496);
+emit_32(1087525083);
+emit_32(1124900864);
+emit_32(3275456512);
+emit_32(1091337443);
+emit_32(1124900864);
+emit_32(3275200528);
+emit_32(1093300912);
+emit_32(1124900864);
+emit_32(3274944545);
+emit_32(1094898103);
+emit_32(1124900864);
+emit_32(3274688496);
+emit_32(1096638530);
+emit_32(1124900864);
+emit_32(3274432512);
+emit_32(1097274071);
+emit_32(1124900864);
+emit_32(3274176528);
+emit_32(1099026766);
+emit_32(1124900864);
+emit_32(3273920545);
+emit_32(1099861538);
+emit_32(1124900864);
+emit_32(3273664496);
+emit_32(1101176137);
+emit_32(1124900864);
+emit_32(3273408512);
+emit_32(1101893049);
+emit_32(1124900864);
+emit_32(3273152528);
+emit_32(1101975047);
+emit_32(1124900864);
+emit_32(3272896545);
+emit_32(1102502691);
+emit_32(1124900864);
+emit_32(3272640496);
+emit_32(1102587573);
+emit_32(1124900864);
+emit_32(3272384512);
+emit_32(1103471103);
+emit_32(1124900864);
+emit_32(3272128528);
+emit_32(1104395895);
+emit_32(1124900864);
+emit_32(3271872545);
+emit_32(1105537742);
+emit_32(1124900864);
+emit_32(3271616496);
+emit_32(1106756659);
+emit_32(1124900864);
+emit_32(3271163904);
+emit_32(1107634867);
+emit_32(1124900864);
+emit_32(3270651937);
+emit_32(1108079516);
+emit_32(1124900864);
+emit_32(3270139970);
+emit_32(1107976153);
+emit_32(1124900864);
+emit_32(3269627871);
+emit_32(1107884271);
+emit_32(1124900864);
+emit_32(3269115904);
+emit_32(1107747642);
+emit_32(1124900864);
+emit_32(3268603937);
+emit_32(1107549985);
+emit_32(1124900864);
+emit_32(3268091970);
+emit_32(1106944773);
+emit_32(1124900864);
+emit_32(3267579911);
+emit_32(1106247732);
+emit_32(1124900864);
+emit_32(3267067904);
+emit_32(1105208646);
+emit_32(1124900864);
+emit_32(3266555911);
+emit_32(1104283802);
+emit_32(1124900864);
+emit_32(3266043904);
+emit_32(1103606946);
+emit_32(1124900864);
+emit_32(3265531911);
+emit_32(1102871160);
+emit_32(1124900864);
+emit_32(3265019904);
+emit_32(1101718513);
+emit_32(1124900864);
+emit_32(3264507911);
+emit_32(1101446513);
+emit_32(1124900864);
+emit_32(3263995904);
+emit_32(1101370543);
+emit_32(1124900864);
+emit_32(3263483911);
+emit_32(1100714292);
+emit_32(1124900864);
+emit_32(3262775296);
+emit_32(1099954599);
+emit_32(1124900864);
+emit_32(3261751309);
+emit_32(1099576325);
+emit_32(1124900864);
+emit_32(3260727296);
+emit_32(1099307680);
+emit_32(1124900864);
+emit_32(3259703309);
+emit_32(1098767978);
+emit_32(1124900864);
+emit_32(3258679296);
+emit_32(1098097938);
+emit_32(1124900864);
+emit_32(3257655309);
+emit_32(1096914095);
+emit_32(1124900864);
+emit_32(3256631296);
+emit_32(1096195192);
+emit_32(1124900864);
+emit_32(3255607309);
+emit_32(1095657482);
+emit_32(1124900864);
+emit_32(3254386688);
+emit_32(1095370487);
+emit_32(1124900864);
+emit_32(3252338714);
+emit_32(1095450703);
+emit_32(1124900864);
+emit_32(3250290688);
+emit_32(1094766612);
+emit_32(1124900864);
+emit_32(3248242714);
+emit_32(1095587018);
+emit_32(1124900864);
+emit_32(3245998080);
+emit_32(1094951266);
+emit_32(1124900864);
+emit_32(3241902132);
+emit_32(1094949903);
+emit_32(1124900864);
+emit_32(3237609472);
+emit_32(1096714656);
+emit_32(1124900864);
+emit_32(3229220864);
+emit_32(1098445226);
+emit_32(1124900864);
+emit_32(0);
+emit_32(1099331587);
+emit_32(1124900864);
+emit_32(1081737216);
+emit_32(1100260206);
+emit_32(1124900864);
+emit_32(3279552512);
+emit_32(1083591665);
+emit_32(1124644880);
+emit_32(3279296528);
+emit_32(1079852212);
+emit_32(1124644880);
+emit_32(3279040545);
+emit_32(1072228855);
+emit_32(1124644880);
+emit_32(3278784496);
+emit_32(1066448684);
+emit_32(1124644880);
+emit_32(3278528512);
+emit_32(1057555518);
+emit_32(1124644880);
+emit_32(3278272528);
+emit_32(1063153790);
+emit_32(1124644880);
+emit_32(3278016545);
+emit_32(1058210333);
+emit_32(1124644880);
+emit_32(3277760496);
+emit_32(1049561427);
+emit_32(1124644880);
+emit_32(3277504512);
+emit_32(3214410567);
+emit_32(1124644880);
+emit_32(3277248528);
+emit_32(3207614251);
+emit_32(1124644880);
+emit_32(3276992545);
+emit_32(1055980993);
+emit_32(1124644880);
+emit_32(3276736496);
+emit_32(1073762292);
+emit_32(1124644880);
+emit_32(3276480512);
+emit_32(1079724747);
+emit_32(1124644880);
+emit_32(3276224528);
+emit_32(1082560411);
+emit_32(1124644880);
+emit_32(3275968545);
+emit_32(1084722260);
+emit_32(1124644880);
+emit_32(3275712496);
+emit_32(1086375571);
+emit_32(1124644880);
+emit_32(3275456512);
+emit_32(1090446500);
+emit_32(1124644880);
+emit_32(3275200528);
+emit_32(1093171832);
+emit_32(1124644880);
+emit_32(3274944545);
+emit_32(1094812015);
+emit_32(1124644880);
+emit_32(3274688496);
+emit_32(1096292290);
+emit_32(1124644880);
+emit_32(3274432512);
+emit_32(1097734921);
+emit_32(1124644880);
+emit_32(3274176528);
+emit_32(1099196531);
+emit_32(1124644880);
+emit_32(3273920545);
+emit_32(1099805229);
+emit_32(1124644880);
+emit_32(3273664496);
+emit_32(1100823187);
+emit_32(1124644880);
+emit_32(3273408512);
+emit_32(1101755685);
+emit_32(1124644880);
+emit_32(3273152528);
+emit_32(1102405698);
+emit_32(1124644880);
+emit_32(3272896545);
+emit_32(1102759225);
+emit_32(1124644880);
+emit_32(3272640496);
+emit_32(1103381607);
+emit_32(1124644880);
+emit_32(3272384512);
+emit_32(1104182510);
+emit_32(1124644880);
+emit_32(3272128528);
+emit_32(1105063995);
+emit_32(1124644880);
+emit_32(3271872545);
+emit_32(1106336390);
+emit_32(1124644880);
+emit_32(3271616496);
+emit_32(1107656416);
+emit_32(1124644880);
+emit_32(3271163904);
+emit_32(1108075925);
+emit_32(1124644880);
+emit_32(3270651937);
+emit_32(1108328763);
+emit_32(1124644880);
+emit_32(3270139970);
+emit_32(1108369080);
+emit_32(1124644880);
+emit_32(3269627871);
+emit_32(1108254366);
+emit_32(1124644880);
+emit_32(3269115904);
+emit_32(1107968551);
+emit_32(1124644880);
+emit_32(3268603937);
+emit_32(1107979456);
+emit_32(1124644880);
+emit_32(3268091970);
+emit_32(1107515802);
+emit_32(1124644880);
+emit_32(3267579911);
+emit_32(1106388084);
+emit_32(1124644880);
+emit_32(3267067904);
+emit_32(1104790841);
+emit_32(1124644880);
+emit_32(3266555911);
+emit_32(1104209563);
+emit_32(1124644880);
+emit_32(3266043904);
+emit_32(1103624405);
+emit_32(1124644880);
+emit_32(3265531911);
+emit_32(1102359613);
+emit_32(1124644880);
+emit_32(3265019904);
+emit_32(1101907257);
+emit_32(1124644880);
+emit_32(3264507911);
+emit_32(1101809058);
+emit_32(1124644880);
+emit_32(3263995904);
+emit_32(1101301128);
+emit_32(1124644880);
+emit_32(3263483911);
+emit_32(1100497289);
+emit_32(1124644880);
+emit_32(3262775296);
+emit_32(1099654863);
+emit_32(1124644880);
+emit_32(3261751309);
+emit_32(1099315701);
+emit_32(1124644880);
+emit_32(3260727296);
+emit_32(1098867697);
+emit_32(1124644880);
+emit_32(3259703309);
+emit_32(1097723491);
+emit_32(1124644880);
+emit_32(3258679296);
+emit_32(1097140063);
+emit_32(1124644880);
+emit_32(3257655309);
+emit_32(1096683933);
+emit_32(1124644880);
+emit_32(3256631296);
+emit_32(1095379399);
+emit_32(1124644880);
+emit_32(3255607309);
+emit_32(1094758747);
+emit_32(1124644880);
+emit_32(3254386688);
+emit_32(1094561405);
+emit_32(1124644880);
+emit_32(3252338714);
+emit_32(1094733582);
+emit_32(1124644880);
+emit_32(3250290688);
+emit_32(1093957845);
+emit_32(1124644880);
+emit_32(3248242714);
+emit_32(1094294123);
+emit_32(1124644880);
+emit_32(3245998080);
+emit_32(1093574905);
+emit_32(1124644880);
+emit_32(3241902132);
+emit_32(1094867799);
+emit_32(1124644880);
+emit_32(3237609472);
+emit_32(1097134821);
+emit_32(1124644880);
+emit_32(3229220864);
+emit_32(1099036099);
+emit_32(1124644880);
+emit_32(0);
+emit_32(1099596615);
+emit_32(1124644880);
+emit_32(1081737216);
+emit_32(1100859258);
+emit_32(1124644880);
+emit_32(3279552512);
+emit_32(1081904485);
+emit_32(1124388897);
+emit_32(3279296528);
+emit_32(1075136304);
+emit_32(1124388897);
+emit_32(3279040545);
+emit_32(1073454011);
+emit_32(1124388897);
+emit_32(3278784496);
+emit_32(1066813673);
+emit_32(1124388897);
+emit_32(3278528512);
+emit_32(1058745375);
+emit_32(1124388897);
+emit_32(3278272528);
+emit_32(1007923565);
+emit_32(1124388897);
+emit_32(3278016545);
+emit_32(1041418101);
+emit_32(1124388897);
+emit_32(3277760496);
+emit_32(3199617458);
+emit_32(1124388897);
+emit_32(3277504512);
+emit_32(3217487424);
+emit_32(1124388897);
+emit_32(3277248528);
+emit_32(3214749551);
+emit_32(1124388897);
+emit_32(3276992545);
+emit_32(3200772133);
+emit_32(1124388897);
+emit_32(3276736496);
+emit_32(1066640783);
+emit_32(1124388897);
+emit_32(3276480512);
+emit_32(1076373750);
+emit_32(1124388897);
+emit_32(3276224528);
+emit_32(1080280534);
+emit_32(1124388897);
+emit_32(3275968545);
+emit_32(1084212505);
+emit_32(1124388897);
+emit_32(3275712496);
+emit_32(1084220726);
+emit_32(1124388897);
+emit_32(3275456512);
+emit_32(1088347817);
+emit_32(1124388897);
+emit_32(3275200528);
+emit_32(1092688649);
+emit_32(1124388897);
+emit_32(3274944545);
+emit_32(1095110020);
+emit_32(1124388897);
+emit_32(3274688496);
+emit_32(1096019765);
+emit_32(1124388897);
+emit_32(3274432512);
+emit_32(1097191863);
+emit_32(1124388897);
+emit_32(3274176528);
+emit_32(1099076574);
+emit_32(1124388897);
+emit_32(3273920545);
+emit_32(1099798099);
+emit_32(1124388897);
+emit_32(3273664496);
+emit_32(1100653265);
+emit_32(1124388897);
+emit_32(3273408512);
+emit_32(1101516925);
+emit_32(1124388897);
+emit_32(3273152528);
+emit_32(1102653791);
+emit_32(1124388897);
+emit_32(3272896545);
+emit_32(1103041659);
+emit_32(1124388897);
+emit_32(3272640496);
+emit_32(1103477814);
+emit_32(1124388897);
+emit_32(3272384512);
+emit_32(1104761586);
+emit_32(1124388897);
+emit_32(3272128528);
+emit_32(1105735555);
+emit_32(1124388897);
+emit_32(3271872545);
+emit_32(1106382579);
+emit_32(1124388897);
+emit_32(3271616496);
+emit_32(1107704231);
+emit_32(1124388897);
+emit_32(3271163904);
+emit_32(1108131394);
+emit_32(1124388897);
+emit_32(3270651937);
+emit_32(1108458393);
+emit_32(1124388897);
+emit_32(3270139970);
+emit_32(1108511529);
+emit_32(1124388897);
+emit_32(3269627871);
+emit_32(1108351464);
+emit_32(1124388897);
+emit_32(3269115904);
+emit_32(1108007374);
+emit_32(1124388897);
+emit_32(3268603937);
+emit_32(1107999667);
+emit_32(1124388897);
+emit_32(3268091970);
+emit_32(1107747353);
+emit_32(1124388897);
+emit_32(3267579911);
+emit_32(1106761954);
+emit_32(1124388897);
+emit_32(3267067904);
+emit_32(1105151446);
+emit_32(1124388897);
+emit_32(3266555911);
+emit_32(1103997960);
+emit_32(1124388897);
+emit_32(3266043904);
+emit_32(1103338930);
+emit_32(1124388897);
+emit_32(3265531911);
+emit_32(1102310120);
+emit_32(1124388897);
+emit_32(3265019904);
+emit_32(1102078804);
+emit_32(1124388897);
+emit_32(3264507911);
+emit_32(1102132910);
+emit_32(1124388897);
+emit_32(3263995904);
+emit_32(1101260338);
+emit_32(1124388897);
+emit_32(3263483911);
+emit_32(1100505783);
+emit_32(1124388897);
+emit_32(3262775296);
+emit_32(1099485361);
+emit_32(1124388897);
+emit_32(3261751309);
+emit_32(1099317379);
+emit_32(1124388897);
+emit_32(3260727296);
+emit_32(1097990459);
+emit_32(1124388897);
+emit_32(3259703309);
+emit_32(1097342543);
+emit_32(1124388897);
+emit_32(3258679296);
+emit_32(1095513512);
+emit_32(1124388897);
+emit_32(3257655309);
+emit_32(1095404880);
+emit_32(1124388897);
+emit_32(3256631296);
+emit_32(1094651059);
+emit_32(1124388897);
+emit_32(3255607309);
+emit_32(1094446901);
+emit_32(1124388897);
+emit_32(3254386688);
+emit_32(1093497625);
+emit_32(1124388897);
+emit_32(3252338714);
+emit_32(1093705977);
+emit_32(1124388897);
+emit_32(3250290688);
+emit_32(1093119299);
+emit_32(1124388897);
+emit_32(3248242714);
+emit_32(1093472354);
+emit_32(1124388897);
+emit_32(3245998080);
+emit_32(1095171362);
+emit_32(1124388897);
+emit_32(3241902132);
+emit_32(1096014103);
+emit_32(1124388897);
+emit_32(3237609472);
+emit_32(1097783784);
+emit_32(1124388897);
+emit_32(3229220864);
+emit_32(1099140904);
+emit_32(1124388897);
+emit_32(0);
+emit_32(1099863844);
+emit_32(1124388897);
+emit_32(1081737216);
+emit_32(1100982465);
+emit_32(1124388897);
+emit_32(3279552512);
+emit_32(1076151032);
+emit_32(1124132848);
+emit_32(3279296528);
+emit_32(1074265021);
+emit_32(1124132848);
+emit_32(3279040545);
+emit_32(1059897651);
+emit_32(1124132848);
+emit_32(3278784496);
+emit_32(3197909672);
+emit_32(1124132848);
+emit_32(3278528512);
+emit_32(3211975304);
+emit_32(1124132848);
+emit_32(3278272528);
+emit_32(3212548900);
+emit_32(1124132848);
+emit_32(3278016545);
+emit_32(3214293881);
+emit_32(1124132848);
+emit_32(3277760496);
+emit_32(3216921864);
+emit_32(1124132848);
+emit_32(3277504512);
+emit_32(3222195908);
+emit_32(1124132848);
+emit_32(3277248528);
+emit_32(3221805335);
+emit_32(1124132848);
+emit_32(3276992545);
+emit_32(3213409470);
+emit_32(1124132848);
+emit_32(3276736496);
+emit_32(1032354486);
+emit_32(1124132848);
+emit_32(3276480512);
+emit_32(1066671654);
+emit_32(1124132848);
+emit_32(3276224528);
+emit_32(1078555291);
+emit_32(1124132848);
+emit_32(3275968545);
+emit_32(1082316198);
+emit_32(1124132848);
+emit_32(3275712496);
+emit_32(1084389652);
+emit_32(1124132848);
+emit_32(3275456512);
+emit_32(1090589284);
+emit_32(1124132848);
+emit_32(3275200528);
+emit_32(1093399793);
+emit_32(1124132848);
+emit_32(3274944545);
+emit_32(1094797335);
+emit_32(1124132848);
+emit_32(3274688496);
+emit_32(1095931475);
+emit_32(1124132848);
+emit_32(3274432512);
+emit_32(1097364459);
+emit_32(1124132848);
+emit_32(3274176528);
+emit_32(1098713452);
+emit_32(1124132848);
+emit_32(3273920545);
+emit_32(1099383020);
+emit_32(1124132848);
+emit_32(3273664496);
+emit_32(1100286158);
+emit_32(1124132848);
+emit_32(3273408512);
+emit_32(1101469791);
+emit_32(1124132848);
+emit_32(3273152528);
+emit_32(1102376757);
+emit_32(1124132848);
+emit_32(3272896545);
+emit_32(1103068345);
+emit_32(1124132848);
+emit_32(3272640496);
+emit_32(1104423682);
+emit_32(1124132848);
+emit_32(3272384512);
+emit_32(1104904507);
+emit_32(1124132848);
+emit_32(3272128528);
+emit_32(1106022131);
+emit_32(1124132848);
+emit_32(3271872545);
+emit_32(1106604720);
+emit_32(1124132848);
+emit_32(3271616496);
+emit_32(1107631800);
+emit_32(1124132848);
+emit_32(3271163904);
+emit_32(1108172682);
+emit_32(1124132848);
+emit_32(3270651937);
+emit_32(1108436818);
+emit_32(1124132848);
+emit_32(3270139970);
+emit_32(1108399830);
+emit_32(1124132848);
+emit_32(3269627871);
+emit_32(1108123845);
+emit_32(1124132848);
+emit_32(3269115904);
+emit_32(1108184505);
+emit_32(1124132848);
+emit_32(3268603937);
+emit_32(1108270331);
+emit_32(1124132848);
+emit_32(3268091970);
+emit_32(1107910957);
+emit_32(1124132848);
+emit_32(3267579911);
+emit_32(1107432518);
+emit_32(1124132848);
+emit_32(3267067904);
+emit_32(1105755426);
+emit_32(1124132848);
+emit_32(3266555911);
+emit_32(1104147644);
+emit_32(1124132848);
+emit_32(3266043904);
+emit_32(1103239525);
+emit_32(1124132848);
+emit_32(3265531911);
+emit_32(1102590666);
+emit_32(1124132848);
+emit_32(3265019904);
+emit_32(1101844290);
+emit_32(1124132848);
+emit_32(3264507911);
+emit_32(1101550007);
+emit_32(1124132848);
+emit_32(3263995904);
+emit_32(1101094925);
+emit_32(1124132848);
+emit_32(3263483911);
+emit_32(1100315990);
+emit_32(1124132848);
+emit_32(3262775296);
+emit_32(1099604269);
+emit_32(1124132848);
+emit_32(3261751309);
+emit_32(1098955673);
+emit_32(1124132848);
+emit_32(3260727296);
+emit_32(1096931397);
+emit_32(1124132848);
+emit_32(3259703309);
+emit_32(1095373108);
+emit_32(1124132848);
+emit_32(3258679296);
+emit_32(1094758538);
+emit_32(1124132848);
+emit_32(3257655309);
+emit_32(1094166512);
+emit_32(1124132848);
+emit_32(3256631296);
+emit_32(1094620021);
+emit_32(1124132848);
+emit_32(3255607309);
+emit_32(1094357772);
+emit_32(1124132848);
+emit_32(3254386688);
+emit_32(1093070435);
+emit_32(1124132848);
+emit_32(3252338714);
+emit_32(1092280920);
+emit_32(1124132848);
+emit_32(3250290688);
+emit_32(1092453726);
+emit_32(1124132848);
+emit_32(3248242714);
+emit_32(1094304085);
+emit_32(1124132848);
+emit_32(3245998080);
+emit_32(1096070621);
+emit_32(1124132848);
+emit_32(3241902132);
+emit_32(1096864812);
+emit_32(1124132848);
+emit_32(3237609472);
+emit_32(1098173435);
+emit_32(1124132848);
+emit_32(3229220864);
+emit_32(1099365404);
+emit_32(1124132848);
+emit_32(0);
+emit_32(1099987367);
+emit_32(1124132848);
+emit_32(1081737216);
+emit_32(1101050728);
+emit_32(1124132848);
+emit_32(3279552512);
+emit_32(1075745946);
+emit_32(1123680256);
+emit_32(3279296528);
+emit_32(1067640202);
+emit_32(1123680256);
+emit_32(3279040545);
+emit_32(3205049803);
+emit_32(1123680256);
+emit_32(3278784496);
+emit_32(3215612571);
+emit_32(1123680256);
+emit_32(3278528512);
+emit_32(3218144588);
+emit_32(1123680256);
+emit_32(3278272528);
+emit_32(3222509223);
+emit_32(1123680256);
+emit_32(3278016545);
+emit_32(3221797869);
+emit_32(1123680256);
+emit_32(3277760496);
+emit_32(3225243909);
+emit_32(1123680256);
+emit_32(3277504512);
+emit_32(3225089810);
+emit_32(1123680256);
+emit_32(3277248528);
+emit_32(3226837912);
+emit_32(1123680256);
+emit_32(3276992545);
+emit_32(3222475668);
+emit_32(1123680256);
+emit_32(3276736496);
+emit_32(3210500905);
+emit_32(1123680256);
+emit_32(3276480512);
+emit_32(1057082501);
+emit_32(1123680256);
+emit_32(3276224528);
+emit_32(1069886755);
+emit_32(1123680256);
+emit_32(3275968545);
+emit_32(1079284135);
+emit_32(1123680256);
+emit_32(3275712496);
+emit_32(1085833856);
+emit_32(1123680256);
+emit_32(3275456512);
+emit_32(1090703044);
+emit_32(1123680256);
+emit_32(3275200528);
+emit_32(1093163863);
+emit_32(1123680256);
+emit_32(3274944545);
+emit_32(1094161898);
+emit_32(1123680256);
+emit_32(3274688496);
+emit_32(1095085064);
+emit_32(1123680256);
+emit_32(3274432512);
+emit_32(1096343041);
+emit_32(1123680256);
+emit_32(3274176528);
+emit_32(1097267465);
+emit_32(1123680256);
+emit_32(3273920545);
+emit_32(1099232549);
+emit_32(1123680256);
+emit_32(3273664496);
+emit_32(1100352638);
+emit_32(1123680256);
+emit_32(3273408512);
+emit_32(1101666347);
+emit_32(1123680256);
+emit_32(3273152528);
+emit_32(1102553599);
+emit_32(1123680256);
+emit_32(3272896545);
+emit_32(1103499048);
+emit_32(1123680256);
+emit_32(3272640496);
+emit_32(1104589619);
+emit_32(1123680256);
+emit_32(3272384512);
+emit_32(1105372486);
+emit_32(1123680256);
+emit_32(3272128528);
+emit_32(1105859602);
+emit_32(1123680256);
+emit_32(3271872545);
+emit_32(1106894337);
+emit_32(1123680256);
+emit_32(3271616496);
+emit_32(1107538372);
+emit_32(1123680256);
+emit_32(3271163904);
+emit_32(1107947762);
+emit_32(1123680256);
+emit_32(3270651937);
+emit_32(1108124343);
+emit_32(1123680256);
+emit_32(3270139970);
+emit_32(1107942572);
+emit_32(1123680256);
+emit_32(3269627871);
+emit_32(1108284329);
+emit_32(1123680256);
+emit_32(3269115904);
+emit_32(1108344439);
+emit_32(1123680256);
+emit_32(3268603937);
+emit_32(1108291722);
+emit_32(1123680256);
+emit_32(3268091970);
+emit_32(1107980426);
+emit_32(1123680256);
+emit_32(3267579911);
+emit_32(1107402844);
+emit_32(1123680256);
+emit_32(3267067904);
+emit_32(1105639401);
+emit_32(1123680256);
+emit_32(3266555911);
+emit_32(1104157868);
+emit_32(1123680256);
+emit_32(3266043904);
+emit_32(1103642965);
+emit_32(1123680256);
+emit_32(3265531911);
+emit_32(1102980579);
+emit_32(1123680256);
+emit_32(3265019904);
+emit_32(1102268282);
+emit_32(1123680256);
+emit_32(3264507911);
+emit_32(1101485362);
+emit_32(1123680256);
+emit_32(3263995904);
+emit_32(1100559260);
+emit_32(1123680256);
+emit_32(3263483911);
+emit_32(1099869979);
+emit_32(1123680256);
+emit_32(3262775296);
+emit_32(1099177447);
+emit_32(1123680256);
+emit_32(3261751309);
+emit_32(1097774032);
+emit_32(1123680256);
+emit_32(3260727296);
+emit_32(1096015990);
+emit_32(1123680256);
+emit_32(3259703309);
+emit_32(1094982618);
+emit_32(1123680256);
+emit_32(3258679296);
+emit_32(1094173642);
+emit_32(1123680256);
+emit_32(3257655309);
+emit_32(1093433557);
+emit_32(1123680256);
+emit_32(3256631296);
+emit_32(1092957084);
+emit_32(1123680256);
+emit_32(3255607309);
+emit_32(1093043696);
+emit_32(1123680256);
+emit_32(3254386688);
+emit_32(1092576367);
+emit_32(1123680256);
+emit_32(3252338714);
+emit_32(1092381919);
+emit_32(1123680256);
+emit_32(3250290688);
+emit_32(1093319052);
+emit_32(1123680256);
+emit_32(3248242714);
+emit_32(1094929141);
+emit_32(1123680256);
+emit_32(3245998080);
+emit_32(1096641151);
+emit_32(1123680256);
+emit_32(3241902132);
+emit_32(1098022230);
+emit_32(1123680256);
+emit_32(3237609472);
+emit_32(1098658716);
+emit_32(1123680256);
+emit_32(3229220864);
+emit_32(1099385274);
+emit_32(1123680256);
+emit_32(0);
+emit_32(1099998324);
+emit_32(1123680256);
+emit_32(1081737216);
+emit_32(1100462372);
+emit_32(1123680256);
+emit_32(3279552512);
+emit_32(1073527831);
+emit_32(1123168289);
+emit_32(3279296528);
+emit_32(1067716203);
+emit_32(1123168289);
+emit_32(3279040545);
+emit_32(1032802545);
+emit_32(1123168289);
+emit_32(3278784496);
+emit_32(3215483554);
+emit_32(1123168289);
+emit_32(3278528512);
+emit_32(3222614416);
+emit_32(1123168289);
+emit_32(3278272528);
+emit_32(3226235358);
+emit_32(1123168289);
+emit_32(3278016545);
+emit_32(3229265659);
+emit_32(1123168289);
+emit_32(3277760496);
+emit_32(3229676575);
+emit_32(1123168289);
+emit_32(3277504512);
+emit_32(3230314529);
+emit_32(1123168289);
+emit_32(3277248528);
+emit_32(3227686797);
+emit_32(1123168289);
+emit_32(3276992545);
+emit_32(3224163288);
+emit_32(1123168289);
+emit_32(3276736496);
+emit_32(3224837816);
+emit_32(1123168289);
+emit_32(3276480512);
+emit_32(3214911115);
+emit_32(1123168289);
+emit_32(3276224528);
+emit_32(1045755414);
+emit_32(1123168289);
+emit_32(3275968545);
+emit_32(1075946895);
+emit_32(1123168289);
+emit_32(3275712496);
+emit_32(1083922239);
+emit_32(1123168289);
+emit_32(3275456512);
+emit_32(1089208404);
+emit_32(1123168289);
+emit_32(3275200528);
+emit_32(1091995729);
+emit_32(1123168289);
+emit_32(3274944545);
+emit_32(1093743097);
+emit_32(1123168289);
+emit_32(3274688496);
+emit_32(1094702019);
+emit_32(1123168289);
+emit_32(3274432512);
+emit_32(1095065456);
+emit_32(1123168289);
+emit_32(3274176528);
+emit_32(1095980443);
+emit_32(1123168289);
+emit_32(3273920545);
+emit_32(1098763574);
+emit_32(1123168289);
+emit_32(3273664496);
+emit_32(1100013791);
+emit_32(1123168289);
+emit_32(3273408512);
+emit_32(1101157106);
+emit_32(1123168289);
+emit_32(3273152528);
+emit_32(1102482401);
+emit_32(1123168289);
+emit_32(3272896545);
+emit_32(1103806543);
+emit_32(1123168289);
+emit_32(3272640496);
+emit_32(1104565135);
+emit_32(1123168289);
+emit_32(3272384512);
+emit_32(1105773671);
+emit_32(1123168289);
+emit_32(3272128528);
+emit_32(1106220312);
+emit_32(1123168289);
+emit_32(3271872545);
+emit_32(1106669942);
+emit_32(1123168289);
+emit_32(3271616496);
+emit_32(1107272401);
+emit_32(1123168289);
+emit_32(3271163904);
+emit_32(1107768771);
+emit_32(1123168289);
+emit_32(3270651937);
+emit_32(1108156770);
+emit_32(1123168289);
+emit_32(3270139970);
+emit_32(1108407039);
+emit_32(1123168289);
+emit_32(3269627871);
+emit_32(1108550903);
+emit_32(1123168289);
+emit_32(3269115904);
+emit_32(1108478263);
+emit_32(1123168289);
+emit_32(3268603937);
+emit_32(1108278274);
+emit_32(1123168289);
+emit_32(3268091970);
+emit_32(1107762925);
+emit_32(1123168289);
+emit_32(3267579911);
+emit_32(1106660819);
+emit_32(1123168289);
+emit_32(3267067904);
+emit_32(1105273658);
+emit_32(1123168289);
+emit_32(3266555911);
+emit_32(1104481668);
+emit_32(1123168289);
+emit_32(3266043904);
+emit_32(1104168826);
+emit_32(1123168289);
+emit_32(3265531911);
+emit_32(1103522536);
+emit_32(1123168289);
+emit_32(3265019904);
+emit_32(1102851185);
+emit_32(1123168289);
+emit_32(3264507911);
+emit_32(1101917061);
+emit_32(1123168289);
+emit_32(3263995904);
+emit_32(1101010095);
+emit_32(1123168289);
+emit_32(3263483911);
+emit_32(1099888329);
+emit_32(1123168289);
+emit_32(3262775296);
+emit_32(1098570531);
+emit_32(1123168289);
+emit_32(3261751309);
+emit_32(1096537866);
+emit_32(1123168289);
+emit_32(3260727296);
+emit_32(1095068497);
+emit_32(1123168289);
+emit_32(3259703309);
+emit_32(1094656406);
+emit_32(1123168289);
+emit_32(3258679296);
+emit_32(1094724039);
+emit_32(1123168289);
+emit_32(3257655309);
+emit_32(1093671584);
+emit_32(1123168289);
+emit_32(3256631296);
+emit_32(1092454407);
+emit_32(1123168289);
+emit_32(3255607309);
+emit_32(1092709935);
+emit_32(1123168289);
+emit_32(3254386688);
+emit_32(1093178858);
+emit_32(1123168289);
+emit_32(3252338714);
+emit_32(1092563312);
+emit_32(1123168289);
+emit_32(3250290688);
+emit_32(1093668753);
+emit_32(1123168289);
+emit_32(3248242714);
+emit_32(1095561013);
+emit_32(1123168289);
+emit_32(3245998080);
+emit_32(1096702388);
+emit_32(1123168289);
+emit_32(3241902132);
+emit_32(1097769524);
+emit_32(1123168289);
+emit_32(3237609472);
+emit_32(1098298111);
+emit_32(1123168289);
+emit_32(3229220864);
+emit_32(1098956931);
+emit_32(1123168289);
+emit_32(0);
+emit_32(1099464022);
+emit_32(1123168289);
+emit_32(1081737216);
+emit_32(1100235512);
+emit_32(1123168289);
+emit_32(3279552512);
+emit_32(1074513450);
+emit_32(1122656322);
+emit_32(3279296528);
+emit_32(1069684087);
+emit_32(1122656322);
+emit_32(3279040545);
+emit_32(1059117578);
+emit_32(1122656322);
+emit_32(3278784496);
+emit_32(3205587983);
+emit_32(1122656322);
+emit_32(3278528512);
+emit_32(3221291239);
+emit_32(1122656322);
+emit_32(3278272528);
+emit_32(3227143174);
+emit_32(1122656322);
+emit_32(3278016545);
+emit_32(3228890898);
+emit_32(1122656322);
+emit_32(3277760496);
+emit_32(3231744493);
+emit_32(1122656322);
+emit_32(3277504512);
+emit_32(3231183211);
+emit_32(1122656322);
+emit_32(3277248528);
+emit_32(3226713845);
+emit_32(1122656322);
+emit_32(3276992545);
+emit_32(3222588579);
+emit_32(1122656322);
+emit_32(3276736496);
+emit_32(3218835474);
+emit_32(1122656322);
+emit_32(3276480512);
+emit_32(3214447728);
+emit_32(1122656322);
+emit_32(3276224528);
+emit_32(1046529045);
+emit_32(1122656322);
+emit_32(3275968545);
+emit_32(1070915199);
+emit_32(1122656322);
+emit_32(3275712496);
+emit_32(1082866637);
+emit_32(1122656322);
+emit_32(3275456512);
+emit_32(1087021578);
+emit_32(1122656322);
+emit_32(3275200528);
+emit_32(1090529232);
+emit_32(1122656322);
+emit_32(3274944545);
+emit_32(1092317201);
+emit_32(1122656322);
+emit_32(3274688496);
+emit_32(1093426427);
+emit_32(1122656322);
+emit_32(3274432512);
+emit_32(1094040158);
+emit_32(1122656322);
+emit_32(3274176528);
+emit_32(1095262693);
+emit_32(1122656322);
+emit_32(3273920545);
+emit_32(1097468792);
+emit_32(1122656322);
+emit_32(3273664496);
+emit_32(1099540411);
+emit_32(1122656322);
+emit_32(3273408512);
+emit_32(1100993213);
+emit_32(1122656322);
+emit_32(3273152528);
+emit_32(1102819203);
+emit_32(1122656322);
+emit_32(3272896545);
+emit_32(1104470763);
+emit_32(1122656322);
+emit_32(3272640496);
+emit_32(1105442111);
+emit_32(1122656322);
+emit_32(3272384512);
+emit_32(1106127356);
+emit_32(1122656322);
+emit_32(3272128528);
+emit_32(1106807829);
+emit_32(1122656322);
+emit_32(3271872545);
+emit_32(1107212108);
+emit_32(1122656322);
+emit_32(3271616496);
+emit_32(1107339719);
+emit_32(1122656322);
+emit_32(3271163904);
+emit_32(1108016575);
+emit_32(1122656322);
+emit_32(3270651937);
+emit_32(1108361190);
+emit_32(1122656322);
+emit_32(3270139970);
+emit_32(1108677807);
+emit_32(1122656322);
+emit_32(3269627871);
+emit_32(1108698045);
+emit_32(1122656322);
+emit_32(3269115904);
+emit_32(1108670415);
+emit_32(1122656322);
+emit_32(3268603937);
+emit_32(1108385307);
+emit_32(1122656322);
+emit_32(3268091970);
+emit_32(1107664044);
+emit_32(1122656322);
+emit_32(3267579911);
+emit_32(1106926109);
+emit_32(1122656322);
+emit_32(3267067904);
+emit_32(1105983491);
+emit_32(1122656322);
+emit_32(3266555911);
+emit_32(1105752542);
+emit_32(1122656322);
+emit_32(3266043904);
+emit_32(1105343650);
+emit_32(1122656322);
+emit_32(3265531911);
+emit_32(1104481983);
+emit_32(1122656322);
+emit_32(3265019904);
+emit_32(1103536377);
+emit_32(1122656322);
+emit_32(3264507911);
+emit_32(1102421374);
+emit_32(1122656322);
+emit_32(3263995904);
+emit_32(1101252526);
+emit_32(1122656322);
+emit_32(3263483911);
+emit_32(1099947835);
+emit_32(1122656322);
+emit_32(3262775296);
+emit_32(1099066665);
+emit_32(1122656322);
+emit_32(3261751309);
+emit_32(1097029334);
+emit_32(1122656322);
+emit_32(3260727296);
+emit_32(1095561223);
+emit_32(1122656322);
+emit_32(3259703309);
+emit_32(1095286181);
+emit_32(1122656322);
+emit_32(3258679296);
+emit_32(1094900095);
+emit_32(1122656322);
+emit_32(3257655309);
+emit_32(1093810625);
+emit_32(1122656322);
+emit_32(3256631296);
+emit_32(1093100949);
+emit_32(1122656322);
+emit_32(3255607309);
+emit_32(1093720133);
+emit_32(1122656322);
+emit_32(3254386688);
+emit_32(1094140822);
+emit_32(1122656322);
+emit_32(3252338714);
+emit_32(1093200983);
+emit_32(1122656322);
+emit_32(3250290688);
+emit_32(1093279731);
+emit_32(1122656322);
+emit_32(3248242714);
+emit_32(1095297296);
+emit_32(1122656322);
+emit_32(3245998080);
+emit_32(1096326998);
+emit_32(1122656322);
+emit_32(3241902132);
+emit_32(1097208116);
+emit_32(1122656322);
+emit_32(3237609472);
+emit_32(1098363332);
+emit_32(1122656322);
+emit_32(3229220864);
+emit_32(1098960496);
+emit_32(1122656322);
+emit_32(0);
+emit_32(1099624612);
+emit_32(1122656322);
+emit_32(1081737216);
+emit_32(1100438045);
+emit_32(1122656322);
+emit_start(Landscape07Vtx)
+emit_32(1081737216);
+emit_32(1111930149);
+emit_32(3270651937);
+emit_32(1081737216);
+emit_32(1111592455);
+emit_32(3270139970);
+emit_32(1090125824);
+emit_32(1111718284);
+emit_32(3270651937);
+emit_32(1090125824);
+emit_32(1111491609);
+emit_32(3270139970);
+emit_32(1094418484);
+emit_32(1111318934);
+emit_32(3270651937);
+emit_32(1094418484);
+emit_32(1111194940);
+emit_32(3270139970);
+emit_32(1098514432);
+emit_32(1110681374);
+emit_32(3270651937);
+emit_32(1098514432);
+emit_32(1110835331);
+emit_32(3270139970);
+emit_32(1100759066);
+emit_32(1110219843);
+emit_32(3270651937);
+emit_32(1100759066);
+emit_32(1110275365);
+emit_32(3270139970);
+emit_32(1102807040);
+emit_32(1109758994);
+emit_32(3270651937);
+emit_32(1102807040);
+emit_32(1110005567);
+emit_32(3270139970);
+emit_32(1104855066);
+emit_32(1109428771);
+emit_32(3270651937);
+emit_32(1104855066);
+emit_32(1109696499);
+emit_32(3270139970);
+emit_32(1106903040);
+emit_32(1109202908);
+emit_32(3270651937);
+emit_32(1106903040);
+emit_32(1109176772);
+emit_32(3270139970);
+emit_32(1108123661);
+emit_32(1108966585);
+emit_32(3270651937);
+emit_32(1108123661);
+emit_32(1108885556);
+emit_32(3270139970);
+emit_32(1109147648);
+emit_32(1108648919);
+emit_32(3270651937);
+emit_32(1109147648);
+emit_32(1108468774);
+emit_32(3270139970);
+emit_32(1110171661);
+emit_32(1108152890);
+emit_32(3270651937);
+emit_32(1110171661);
+emit_32(1108030285);
+emit_32(3270139970);
+emit_32(1111195648);
+emit_32(1107519839);
+emit_32(3270651937);
+emit_32(1111195648);
+emit_32(1107430028);
+emit_32(3270139970);
+emit_32(1112219661);
+emit_32(1107320478);
+emit_32(3270651937);
+emit_32(1112219661);
+emit_32(1107103737);
+emit_32(3270139970);
+emit_32(1113243648);
+emit_32(1107611170);
+emit_32(3270651937);
+emit_32(1113243648);
+emit_32(1107092098);
+emit_32(3270139970);
+emit_32(1114267661);
+emit_32(1107859839);
+emit_32(3270651937);
+emit_32(1114267661);
+emit_32(1107375004);
+emit_32(3270139970);
+emit_32(1115291648);
+emit_32(1107759596);
+emit_32(3270651937);
+emit_32(1115291648);
+emit_32(1107478708);
+emit_32(3270139970);
+emit_32(1116000263);
+emit_32(1107948785);
+emit_32(3270651937);
+emit_32(1116000263);
+emit_32(1107657884);
+emit_32(3270139970);
+emit_32(1116512256);
+emit_32(1108015605);
+emit_32(3270651937);
+emit_32(1116512256);
+emit_32(1107812575);
+emit_32(3270139970);
+emit_32(1117024263);
+emit_32(1108198949);
+emit_32(3270651937);
+emit_32(1117024263);
+emit_32(1108062005);
+emit_32(3270139970);
+emit_32(1117536256);
+emit_32(1108525082);
+emit_32(3270651937);
+emit_32(1117536256);
+emit_32(1108546316);
+emit_32(3270139970);
+emit_32(1118048263);
+emit_32(1108838475);
+emit_32(3270651937);
+emit_32(1118048263);
+emit_32(1108808198);
+emit_32(3270139970);
+emit_32(1118560256);
+emit_32(1108830663);
+emit_32(3270651937);
+emit_32(1118560256);
+emit_32(1108821253);
+emit_32(3270139970);
+emit_32(1119072263);
+emit_32(1108933791);
+emit_32(3270651937);
+emit_32(1119072263);
+emit_32(1108944565);
+emit_32(3270139970);
+emit_32(1119584256);
+emit_32(1109285510);
+emit_32(3270651937);
+emit_32(1119584256);
+emit_32(1109292509);
+emit_32(3270139970);
+emit_32(1120096263);
+emit_32(1109319064);
+emit_32(3270651937);
+emit_32(1120096263);
+emit_32(1109325827);
+emit_32(3270139970);
+emit_32(1120608322);
+emit_32(1109471003);
+emit_32(3270651937);
+emit_32(1120608322);
+emit_32(1109645355);
+emit_32(3270139970);
+emit_32(1121120289);
+emit_32(1109582728);
+emit_32(3270651937);
+emit_32(1121120289);
+emit_32(1109627555);
+emit_32(3270139970);
+emit_32(1121632256);
+emit_32(1109427592);
+emit_32(3270651937);
+emit_32(1121632256);
+emit_32(1109566502);
+emit_32(3270139970);
+emit_32(1122144223);
+emit_32(1109250959);
+emit_32(3270651937);
+emit_32(1122144223);
+emit_32(1109470347);
+emit_32(3270139970);
+emit_32(1122656322);
+emit_32(1109132050);
+emit_32(3270651937);
+emit_32(1122656322);
+emit_32(1109358831);
+emit_32(3270139970);
+emit_32(1123168289);
+emit_32(1108892975);
+emit_32(3270651937);
+emit_32(1123168289);
+emit_32(1109156561);
+emit_32(3270139970);
+emit_32(1123680256);
+emit_32(1108663599);
+emit_32(3270651937);
+emit_32(1123680256);
+emit_32(1108641920);
+emit_32(3270139970);
+emit_32(1124132848);
+emit_32(1108204087);
+emit_32(3270651937);
+emit_32(1124132848);
+emit_32(1108219580);
+emit_32(3270139970);
+emit_32(1124388897);
+emit_32(1107681555);
+emit_32(3270651937);
+emit_32(1124388897);
+emit_32(1107796112);
+emit_32(3270139970);
+emit_32(1124644880);
+emit_32(1107061165);
+emit_32(3270651937);
+emit_32(1124644880);
+emit_32(1107364885);
+emit_32(3270139970);
+emit_32(1124900864);
+emit_32(1105549119);
+emit_32(3270651937);
+emit_32(1124900864);
+emit_32(1106177268);
+emit_32(3270139970);
+emit_32(1125156848);
+emit_32(1104447065);
+emit_32(3270651937);
+emit_32(1125156848);
+emit_32(1105288443);
+emit_32(3270139970);
+emit_32(1125412897);
+emit_32(1103204817);
+emit_32(3270651937);
+emit_32(1125412897);
+emit_32(1104753197);
+emit_32(3270139970);
+emit_32(1125668880);
+emit_32(1102168352);
+emit_32(3270651937);
+emit_32(1125668880);
+emit_32(1103375473);
+emit_32(3270139970);
+emit_32(1125924864);
+emit_32(1101100116);
+emit_32(3270651937);
+emit_32(1125924864);
+emit_32(1102075344);
+emit_32(3270139970);
+emit_32(1126180848);
+emit_32(1099752591);
+emit_32(3270651937);
+emit_32(1126180848);
+emit_32(1100964849);
+emit_32(3270139970);
+emit_32(1126436897);
+emit_32(1098425093);
+emit_32(3270651937);
+emit_32(1126436897);
+emit_32(1099792384);
+emit_32(3270139970);
+emit_32(1126692880);
+emit_32(1096597845);
+emit_32(3270651937);
+emit_32(1126692880);
+emit_32(1098450049);
+emit_32(3270139970);
+emit_32(1126948864);
+emit_32(1094429285);
+emit_32(3270651937);
+emit_32(1126948864);
+emit_32(1096338322);
+emit_32(3270139970);
+emit_32(1127204848);
+emit_32(1091900413);
+emit_32(3270651937);
+emit_32(1127204848);
+emit_32(1093954280);
+emit_32(3270139970);
+emit_32(1127460897);
+emit_32(1087591940);
+emit_32(3270651937);
+emit_32(1127460897);
+emit_32(1091524247);
+emit_32(3270139970);
+emit_32(1127716880);
+emit_32(1083181671);
+emit_32(3270651937);
+emit_32(1127716880);
+emit_32(1088518839);
+emit_32(3270139970);
+emit_32(1127972864);
+emit_32(1076995723);
+emit_32(3270651937);
+emit_32(1127972864);
+emit_32(1083884385);
+emit_32(3270139970);
+emit_32(1128228848);
+emit_32(1068649268);
+emit_32(3270651937);
+emit_32(1128228848);
+emit_32(1076931424);
+emit_32(3270139970);
+emit_32(1128484897);
+emit_32(3216283995);
+emit_32(3270651937);
+emit_32(1128484897);
+emit_32(1044557454);
+emit_32(3270139970);
+emit_32(1128740880);
+emit_32(3221805544);
+emit_32(3270651937);
+emit_32(1128740880);
+emit_32(3205427693);
+emit_32(3270139970);
+emit_32(1128996864);
+emit_32(3223037537);
+emit_32(3270651937);
+emit_32(1128996864);
+emit_32(3213113940);
+emit_32(3270139970);
+emit_32(1129252848);
+emit_32(3228540254);
+emit_32(3270651937);
+emit_32(1129252848);
+emit_32(3221962118);
+emit_32(3270139970);
+emit_32(1129508897);
+emit_32(3230275333);
+emit_32(3270651937);
+emit_32(1129508897);
+emit_32(3220483500);
+emit_32(3270139970);
+emit_32(1129764880);
+emit_32(3232612273);
+emit_32(3270651937);
+emit_32(1129764880);
+emit_32(3225420531);
+emit_32(3270139970);
+emit_32(1130020864);
+emit_32(3235277565);
+emit_32(3270651937);
+emit_32(1130020864);
+emit_32(3230173831);
+emit_32(3270139970);
+emit_32(1130276848);
+emit_32(3234218671);
+emit_32(3270651937);
+emit_32(1130276848);
+emit_32(3232043735);
+emit_32(3270139970);
+emit_32(1130532897);
+emit_32(3231045470);
+emit_32(3270651937);
+emit_32(1130532897);
+emit_32(3227363752);
+emit_32(3270139970);
+emit_32(1130788880);
+emit_32(3226755997);
+emit_32(3270651937);
+emit_32(1130788880);
+emit_32(3221899790);
+emit_32(3270139970);
+emit_32(1131044864);
+emit_32(3229128715);
+emit_32(3270651937);
+emit_32(1131044864);
+emit_32(3216845360);
+emit_32(3270139970);
+emit_32(1131300848);
+emit_32(3228788683);
+emit_32(3270651937);
+emit_32(1131300848);
+emit_32(3219415546);
+emit_32(3270139970);
+emit_32(1131556897);
+emit_32(3227247276);
+emit_32(3270651937);
+emit_32(1131556897);
+emit_32(3212863456);
+emit_32(3270139970);
+emit_32(1131812880);
+emit_32(3228672710);
+emit_32(3270651937);
+emit_32(1131812880);
+emit_32(3221056106);
+emit_32(3270139970);
+emit_32(1132068864);
+emit_32(3228908137);
+emit_32(3270651937);
+emit_32(1132068864);
+emit_32(3222457423);
+emit_32(3270139970);
+emit_32(1081737216);
+emit_32(1112094042);
+emit_32(3271163904);
+emit_32(1090125824);
+emit_32(1112019724);
+emit_32(3271163904);
+emit_32(1094418484);
+emit_32(1111438813);
+emit_32(3271163904);
+emit_32(1098514432);
+emit_32(1110812184);
+emit_32(3271163904);
+emit_32(1100759066);
+emit_32(1110106545);
+emit_32(3271163904);
+emit_32(1102807040);
+emit_32(1109946348);
+emit_32(3271163904);
+emit_32(1104855066);
+emit_32(1109673168);
+emit_32(3271163904);
+emit_32(1106903040);
+emit_32(1109472471);
+emit_32(3271163904);
+emit_32(1108123661);
+emit_32(1108974240);
+emit_32(3271163904);
+emit_32(1109147648);
+emit_32(1108497164);
+emit_32(3271163904);
+emit_32(1110171661);
+emit_32(1108102899);
+emit_32(3271163904);
+emit_32(1111195648);
+emit_32(1107538870);
+emit_32(3271163904);
+emit_32(1112219661);
+emit_32(1106915413);
+emit_32(3271163904);
+emit_32(1113243648);
+emit_32(1107679563);
+emit_32(3271163904);
+emit_32(1114267661);
+emit_32(1107902857);
+emit_32(3271163904);
+emit_32(1115291648);
+emit_32(1107930251);
+emit_32(3271163904);
+emit_32(1116000263);
+emit_32(1107983335);
+emit_32(3271163904);
+emit_32(1116512256);
+emit_32(1108070420);
+emit_32(3271163904);
+emit_32(1117024263);
+emit_32(1108274184);
+emit_32(3271163904);
+emit_32(1117536256);
+emit_32(1108723525);
+emit_32(3271163904);
+emit_32(1118048263);
+emit_32(1108785863);
+emit_32(3271163904);
+emit_32(1118560256);
+emit_32(1108864795);
+emit_32(3271163904);
+emit_32(1119072263);
+emit_32(1109018883);
+emit_32(3271163904);
+emit_32(1119584256);
+emit_32(1109278065);
+emit_32(3271163904);
+emit_32(1120096263);
+emit_32(1109410316);
+emit_32(3271163904);
+emit_32(1120608322);
+emit_32(1109373406);
+emit_32(3271163904);
+emit_32(1121120289);
+emit_32(1109364887);
+emit_32(3271163904);
+emit_32(1121632256);
+emit_32(1109384967);
+emit_32(3271163904);
+emit_32(1122144223);
+emit_32(1109332197);
+emit_32(3271163904);
+emit_32(1122656322);
+emit_32(1109067825);
+emit_32(3271163904);
+emit_32(1123168289);
+emit_32(1108783609);
+emit_32(3271163904);
+emit_32(1123680256);
+emit_32(1108563460);
+emit_32(3271163904);
+emit_32(1124132848);
+emit_32(1108020743);
+emit_32(3271163904);
+emit_32(1124388897);
+emit_32(1107280056);
+emit_32(3271163904);
+emit_32(1124644880);
+emit_32(1106630987);
+emit_32(3271163904);
+emit_32(1124900864);
+emit_32(1105186941);
+emit_32(3271163904);
+emit_32(1125156848);
+emit_32(1103741583);
+emit_32(3271163904);
+emit_32(1125412897);
+emit_32(1102190530);
+emit_32(3271163904);
+emit_32(1125668880);
+emit_32(1101340292);
+emit_32(3271163904);
+emit_32(1125924864);
+emit_32(1100447115);
+emit_32(3271163904);
+emit_32(1126180848);
+emit_32(1099367868);
+emit_32(3271163904);
+emit_32(1126436897);
+emit_32(1097589064);
+emit_32(3271163904);
+emit_32(1126692880);
+emit_32(1095164127);
+emit_32(3271163904);
+emit_32(1126948864);
+emit_32(1092722832);
+emit_32(3271163904);
+emit_32(1127204848);
+emit_32(1090145097);
+emit_32(3271163904);
+emit_32(1127460897);
+emit_32(1085202802);
+emit_32(3271163904);
+emit_32(1127716880);
+emit_32(1076722968);
+emit_32(3271163904);
+emit_32(1127972864);
+emit_32(1066002159);
+emit_32(3271163904);
+emit_32(1128228848);
+emit_32(3206002464);
+emit_32(3271163904);
+emit_32(1128484897);
+emit_32(3225385089);
+emit_32(3271163904);
+emit_32(1128740880);
+emit_32(3230254068);
+emit_32(3271163904);
+emit_32(1128996864);
+emit_32(3231283224);
+emit_32(3271163904);
+emit_32(1129252848);
+emit_32(3234493545);
+emit_32(3271163904);
+emit_32(1129508897);
+emit_32(3235258355);
+emit_32(3271163904);
+emit_32(1129764880);
+emit_32(3238361175);
+emit_32(3271163904);
+emit_32(1130020864);
+emit_32(3238992240);
+emit_32(3271163904);
+emit_32(1130276848);
+emit_32(3236249825);
+emit_32(3271163904);
+emit_32(1130532897);
+emit_32(3232841681);
+emit_32(3271163904);
+emit_32(1130788880);
+emit_32(3231925288);
+emit_32(3271163904);
+emit_32(1131044864);
+emit_32(3233336672);
+emit_32(3271163904);
+emit_32(1131300848);
+emit_32(3232958618);
+emit_32(3271163904);
+emit_32(1131556897);
+emit_32(3233414623);
+emit_32(3271163904);
+emit_32(1131812880);
+emit_32(3232723968);
+emit_32(3271163904);
+emit_32(1132068864);
+emit_32(3232386725);
+emit_32(3271163904);
+emit_32(1081737216);
+emit_32(1112138475);
+emit_32(3271616496);
+emit_32(1090125824);
+emit_32(1112117661);
+emit_32(3271616496);
+emit_32(1094418484);
+emit_32(1111516696);
+emit_32(3271616496);
+emit_32(1098514432);
+emit_32(1110701375);
+emit_32(3271616496);
+emit_32(1100759066);
+emit_32(1110259479);
+emit_32(3271616496);
+emit_32(1102807040);
+emit_32(1110148252);
+emit_32(3271616496);
+emit_32(1104855066);
+emit_32(1109941420);
+emit_32(3271616496);
+emit_32(1106903040);
+emit_32(1109408245);
+emit_32(3271616496);
+emit_32(1108123661);
+emit_32(1108791106);
+emit_32(3271616496);
+emit_32(1109147648);
+emit_32(1108280161);
+emit_32(3271616496);
+emit_32(1110171661);
+emit_32(1107557063);
+emit_32(3271616496);
+emit_32(1111195648);
+emit_32(1107163926);
+emit_32(3271616496);
+emit_32(1112219661);
+emit_32(1106741192);
+emit_32(3271616496);
+emit_32(1113243648);
+emit_32(1107262911);
+emit_32(3271616496);
+emit_32(1114267661);
+emit_32(1107611563);
+emit_32(3271616496);
+emit_32(1115291648);
+emit_32(1107823244);
+emit_32(3271616496);
+emit_32(1116000263);
+emit_32(1107902490);
+emit_32(3271616496);
+emit_32(1116512256);
+emit_32(1107980347);
+emit_32(3271616496);
+emit_32(1117024263);
+emit_32(1108314974);
+emit_32(3271616496);
+emit_32(1117536256);
+emit_32(1108495670);
+emit_32(3271616496);
+emit_32(1118048263);
+emit_32(1108580998);
+emit_32(3271616496);
+emit_32(1118560256);
+emit_32(1108703707);
+emit_32(3271616496);
+emit_32(1119072263);
+emit_32(1108940790);
+emit_32(3271616496);
+emit_32(1119584256);
+emit_32(1109066200);
+emit_32(3271616496);
+emit_32(1120096263);
+emit_32(1109329864);
+emit_32(3271616496);
+emit_32(1120608322);
+emit_32(1109220734);
+emit_32(3271616496);
+emit_32(1121120289);
+emit_32(1109504138);
+emit_32(3271616496);
+emit_32(1121632256);
+emit_32(1109526053);
+emit_32(3271616496);
+emit_32(1122144223);
+emit_32(1109328108);
+emit_32(3271616496);
+emit_32(1122656322);
+emit_32(1109031859);
+emit_32(3271616496);
+emit_32(1123168289);
+emit_32(1108646638);
+emit_32(3271616496);
+emit_32(1123680256);
+emit_32(1108345618);
+emit_32(3271616496);
+emit_32(1124132848);
+emit_32(1107854806);
+emit_32(3271616496);
+emit_32(1124388897);
+emit_32(1107061532);
+emit_32(3271616496);
+emit_32(1124644880);
+emit_32(1105828407);
+emit_32(3271616496);
+emit_32(1124900864);
+emit_32(1104345458);
+emit_32(3271616496);
+emit_32(1125156848);
+emit_32(1103146569);
+emit_32(3271616496);
+emit_32(1125412897);
+emit_32(1101554883);
+emit_32(3271616496);
+emit_32(1125668880);
+emit_32(1100465255);
+emit_32(3271616496);
+emit_32(1125924864);
+emit_32(1099197894);
+emit_32(3271616496);
+emit_32(1126180848);
+emit_32(1097396440);
+emit_32(3271616496);
+emit_32(1126436897);
+emit_32(1095592680);
+emit_32(3271616496);
+emit_32(1126692880);
+emit_32(1093988988);
+emit_32(3271616496);
+emit_32(1126948864);
+emit_32(1091770998);
+emit_32(3271616496);
+emit_32(1127204848);
+emit_32(1088099283);
+emit_32(3271616496);
+emit_32(1127460897);
+emit_32(1081294172);
+emit_32(3271616496);
+emit_32(1127716880);
+emit_32(1060903076);
+emit_32(3271616496);
+emit_32(1127972864);
+emit_32(1039720717);
+emit_32(3271616496);
+emit_32(1128228848);
+emit_32(3220556900);
+emit_32(3271616496);
+emit_32(1128484897);
+emit_32(3232451338);
+emit_32(3271616496);
+emit_32(1128740880);
+emit_32(3236043424);
+emit_32(3271616496);
+emit_32(1128996864);
+emit_32(3238289211);
+emit_32(3271616496);
+emit_32(1129252848);
+emit_32(3238868193);
+emit_32(3271616496);
+emit_32(1129508897);
+emit_32(3239430691);
+emit_32(3271616496);
+emit_32(1129764880);
+emit_32(3241001301);
+emit_32(3271616496);
+emit_32(1130020864);
+emit_32(3240828600);
+emit_32(3271616496);
+emit_32(1130276848);
+emit_32(3238957018);
+emit_32(3271616496);
+emit_32(1130532897);
+emit_32(3238262997);
+emit_32(3271616496);
+emit_32(1130788880);
+emit_32(3237575372);
+emit_32(3271616496);
+emit_32(1131044864);
+emit_32(3235372398);
+emit_32(3271616496);
+emit_32(1131300848);
+emit_32(3236771345);
+emit_32(3271616496);
+emit_32(1131556897);
+emit_32(3235935337);
+emit_32(3271616496);
+emit_32(1131812880);
+emit_32(3235730822);
+emit_32(3271616496);
+emit_32(1132068864);
+emit_32(3234015499);
+emit_32(3271616496);
+emit_32(1081737216);
+emit_32(1111780334);
+emit_32(3271872545);
+emit_32(1090125824);
+emit_32(1111692673);
+emit_32(3271872545);
+emit_32(1094418484);
+emit_32(1111222256);
+emit_32(3271872545);
+emit_32(1098514432);
+emit_32(1110566135);
+emit_32(3271872545);
+emit_32(1100759066);
+emit_32(1110232950);
+emit_32(3271872545);
+emit_32(1102807040);
+emit_32(1109993665);
+emit_32(3271872545);
+emit_32(1104855066);
+emit_32(1109851950);
+emit_32(3271872545);
+emit_32(1106903040);
+emit_32(1109283098);
+emit_32(3271872545);
+emit_32(1108123661);
+emit_32(1108493022);
+emit_32(3271872545);
+emit_32(1109147648);
+emit_32(1107705515);
+emit_32(3271872545);
+emit_32(1110171661);
+emit_32(1107275494);
+emit_32(3271872545);
+emit_32(1111195648);
+emit_32(1106747326);
+emit_32(3271872545);
+emit_32(1112219661);
+emit_32(1106557639);
+emit_32(3271872545);
+emit_32(1113243648);
+emit_32(1107170427);
+emit_32(3271872545);
+emit_32(1114267661);
+emit_32(1107580499);
+emit_32(3271872545);
+emit_32(1115291648);
+emit_32(1107671725);
+emit_32(3271872545);
+emit_32(1116000263);
+emit_32(1107801250);
+emit_32(3271872545);
+emit_32(1116512256);
+emit_32(1107801355);
+emit_32(3271872545);
+emit_32(1117024263);
+emit_32(1107771313);
+emit_32(3271872545);
+emit_32(1117536256);
+emit_32(1108068427);
+emit_32(3271872545);
+emit_32(1118048263);
+emit_32(1108248048);
+emit_32(3271872545);
+emit_32(1118560256);
+emit_32(1108300713);
+emit_32(3271872545);
+emit_32(1119072263);
+emit_32(1108561232);
+emit_32(3271872545);
+emit_32(1119584256);
+emit_32(1108758521);
+emit_32(3271872545);
+emit_32(1120096263);
+emit_32(1109143559);
+emit_32(3271872545);
+emit_32(1120608322);
+emit_32(1109106360);
+emit_32(3271872545);
+emit_32(1121120289);
+emit_32(1109227104);
+emit_32(3271872545);
+emit_32(1121632256);
+emit_32(1109385701);
+emit_32(3271872545);
+emit_32(1122144223);
+emit_32(1109080854);
+emit_32(3271872545);
+emit_32(1122656322);
+emit_32(1108826600);
+emit_32(3271872545);
+emit_32(1123168289);
+emit_32(1108564194);
+emit_32(3271872545);
+emit_32(1123680256);
+emit_32(1108304829);
+emit_32(3271872545);
+emit_32(1124132848);
+emit_32(1107781275);
+emit_32(3271872545);
+emit_32(1124388897);
+emit_32(1107099700);
+emit_32(3271872545);
+emit_32(1124644880);
+emit_32(1105344908);
+emit_32(3271872545);
+emit_32(1124900864);
+emit_32(1103617904);
+emit_32(3271872545);
+emit_32(1125156848);
+emit_32(1102172966);
+emit_32(3271872545);
+emit_32(1125412897);
+emit_32(1100636435);
+emit_32(3271872545);
+emit_32(1125668880);
+emit_32(1099511418);
+emit_32(3271872545);
+emit_32(1125924864);
+emit_32(1097613076);
+emit_32(3271872545);
+emit_32(1126180848);
+emit_32(1095954124);
+emit_32(3271872545);
+emit_32(1126436897);
+emit_32(1093684062);
+emit_32(3271872545);
+emit_32(1126692880);
+emit_32(1091734235);
+emit_32(3271872545);
+emit_32(1126948864);
+emit_32(1088057634);
+emit_32(3271872545);
+emit_32(1127204848);
+emit_32(1082772853);
+emit_32(3271872545);
+emit_32(1127460897);
+emit_32(1073941095);
+emit_32(3271872545);
+emit_32(1127716880);
+emit_32(3208567734);
+emit_32(3271872545);
+emit_32(1127972864);
+emit_32(3214907844);
+emit_32(3271872545);
+emit_32(1128228848);
+emit_32(3228392866);
+emit_32(3271872545);
+emit_32(1128484897);
+emit_32(3236333837);
+emit_32(3271872545);
+emit_32(1128740880);
+emit_32(3239712465);
+emit_32(3271872545);
+emit_32(1128996864);
+emit_32(3240772082);
+emit_32(3271872545);
+emit_32(1129252848);
+emit_32(3241312099);
+emit_32(3271872545);
+emit_32(1129508897);
+emit_32(3242196782);
+emit_32(3271872545);
+emit_32(1129764880);
+emit_32(3243389118);
+emit_32(3271872545);
+emit_32(1130020864);
+emit_32(3242673360);
+emit_32(3271872545);
+emit_32(1130276848);
+emit_32(3241675955);
+emit_32(3271872545);
+emit_32(1130532897);
+emit_32(3241634116);
+emit_32(3271872545);
+emit_32(1130788880);
+emit_32(3240687986);
+emit_32(3271872545);
+emit_32(1131044864);
+emit_32(3240058075);
+emit_32(3271872545);
+emit_32(1131300848);
+emit_32(3239722845);
+emit_32(3271872545);
+emit_32(1131556897);
+emit_32(3238832237);
+emit_32(3271872545);
+emit_32(1131812880);
+emit_32(3238354108);
+emit_32(3271872545);
+emit_32(1132068864);
+emit_32(3234493083);
+emit_32(3271872545);
+emit_32(1081737216);
+emit_32(1111464346);
+emit_32(3272128528);
+emit_32(1090125824);
+emit_32(1111239505);
+emit_32(3272128528);
+emit_32(1094418484);
+emit_32(1110994767);
+emit_32(3272128528);
+emit_32(1098514432);
+emit_32(1110132890);
+emit_32(3272128528);
+emit_32(1100759066);
+emit_32(1109887445);
+emit_32(3272128528);
+emit_32(1102807040);
+emit_32(1109762271);
+emit_32(3272128528);
+emit_32(1104855066);
+emit_32(1109309469);
+emit_32(3272128528);
+emit_32(1106903040);
+emit_32(1108918429);
+emit_32(3272128528);
+emit_32(1108123661);
+emit_32(1108186287);
+emit_32(3272128528);
+emit_32(1109147648);
+emit_32(1107206970);
+emit_32(3272128528);
+emit_32(1110171661);
+emit_32(1106779308);
+emit_32(3272128528);
+emit_32(1111195648);
+emit_32(1105875436);
+emit_32(3272128528);
+emit_32(1112219661);
+emit_32(1105956962);
+emit_32(3272128528);
+emit_32(1113243648);
+emit_32(1106440618);
+emit_32(3272128528);
+emit_32(1114267661);
+emit_32(1107100225);
+emit_32(3272128528);
+emit_32(1115291648);
+emit_32(1107233499);
+emit_32(3272128528);
+emit_32(1116000263);
+emit_32(1107508645);
+emit_32(3272128528);
+emit_32(1116512256);
+emit_32(1107671935);
+emit_32(3272128528);
+emit_32(1117024263);
+emit_32(1107608207);
+emit_32(3272128528);
+emit_32(1117536256);
+emit_32(1107752387);
+emit_32(3272128528);
+emit_32(1118048263);
+emit_32(1108110134);
+emit_32(3272128528);
+emit_32(1118560256);
+emit_32(1108408690);
+emit_32(3272128528);
+emit_32(1119072263);
+emit_32(1108474017);
+emit_32(3272128528);
+emit_32(1119584256);
+emit_32(1108395164);
+emit_32(3272128528);
+emit_32(1120096263);
+emit_32(1108750369);
+emit_32(3272128528);
+emit_32(1120608322);
+emit_32(1108885688);
+emit_32(3272128528);
+emit_32(1121120289);
+emit_32(1109040851);
+emit_32(3272128528);
+emit_32(1121632256);
+emit_32(1108986665);
+emit_32(3272128528);
+emit_32(1122144223);
+emit_32(1108827727);
+emit_32(3272128528);
+emit_32(1122656322);
+emit_32(1108753462);
+emit_32(3272128528);
+emit_32(1123168289);
+emit_32(1108679852);
+emit_32(3272128528);
+emit_32(1123680256);
+emit_32(1108175513);
+emit_32(3272128528);
+emit_32(1124132848);
+emit_32(1107583015);
+emit_32(3272128528);
+emit_32(1124388897);
+emit_32(1106521358);
+emit_32(3272128528);
+emit_32(1124644880);
+emit_32(1104987134);
+emit_32(3272128528);
+emit_32(1124900864);
+emit_32(1103342862);
+emit_32(3272128528);
+emit_32(1125156848);
+emit_32(1101546652);
+emit_32(3272128528);
+emit_32(1125412897);
+emit_32(1099964770);
+emit_32(3272128528);
+emit_32(1125668880);
+emit_32(1098242746);
+emit_32(3272128528);
+emit_32(1125924864);
+emit_32(1096185125);
+emit_32(3272128528);
+emit_32(1126180848);
+emit_32(1094379792);
+emit_32(3272128528);
+emit_32(1126436897);
+emit_32(1092287841);
+emit_32(3272128528);
+emit_32(1126692880);
+emit_32(1089612693);
+emit_32(3272128528);
+emit_32(1126948864);
+emit_32(1083167159);
+emit_32(3272128528);
+emit_32(1127204848);
+emit_32(1069990774);
+emit_32(3272128528);
+emit_32(1127460897);
+emit_32(1049416773);
+emit_32(3272128528);
+emit_32(1127716880);
+emit_32(3222071379);
+emit_32(3272128528);
+emit_32(1127972864);
+emit_32(3226126181);
+emit_32(3272128528);
+emit_32(1128228848);
+emit_32(3233267570);
+emit_32(3272128528);
+emit_32(1128484897);
+emit_32(3238358344);
+emit_32(3272128528);
+emit_32(1128740880);
+emit_32(3242189233);
+emit_32(3272128528);
+emit_32(1128996864);
+emit_32(3244019627);
+emit_32(3272128528);
+emit_32(1129252848);
+emit_32(3244520951);
+emit_32(3272128528);
+emit_32(1129508897);
+emit_32(3245091062);
+emit_32(3272128528);
+emit_32(1129764880);
+emit_32(3245124302);
+emit_32(3272128528);
+emit_32(1130020864);
+emit_32(3245824436);
+emit_32(3272128528);
+emit_32(1130276848);
+emit_32(3245103854);
+emit_32(3272128528);
+emit_32(1130532897);
+emit_32(3245100184);
+emit_32(3272128528);
+emit_32(1130788880);
+emit_32(3243298207);
+emit_32(3272128528);
+emit_32(1131044864);
+emit_32(3242985731);
+emit_32(3272128528);
+emit_32(1131300848);
+emit_32(3242330895);
+emit_32(3272128528);
+emit_32(1131556897);
+emit_32(3242176545);
+emit_32(3272128528);
+emit_32(1131812880);
+emit_32(3239330856);
+emit_32(3272128528);
+emit_32(1132068864);
+emit_32(3234703260);
+emit_32(3272128528);
+emit_32(1081737216);
+emit_32(1111298697);
+emit_32(3272384512);
+emit_32(1090125824);
+emit_32(1111058363);
+emit_32(3272384512);
+emit_32(1094418484);
+emit_32(1110735087);
+emit_32(3272384512);
+emit_32(1098514432);
+emit_32(1110169171);
+emit_32(3272384512);
+emit_32(1100759066);
+emit_32(1109403894);
+emit_32(3272384512);
+emit_32(1102807040);
+emit_32(1108912557);
+emit_32(3272384512);
+emit_32(1104855066);
+emit_32(1108673482);
+emit_32(3272384512);
+emit_32(1106903040);
+emit_32(1108260081);
+emit_32(3272384512);
+emit_32(1108123661);
+emit_32(1107647870);
+emit_32(3272384512);
+emit_32(1109147648);
+emit_32(1106643832);
+emit_32(3272384512);
+emit_32(1110171661);
+emit_32(1105736919);
+emit_32(3272384512);
+emit_32(1111195648);
+emit_32(1105100643);
+emit_32(3272384512);
+emit_32(1112219661);
+emit_32(1104911375);
+emit_32(3272384512);
+emit_32(1113243648);
+emit_32(1105299348);
+emit_32(3272384512);
+emit_32(1114267661);
+emit_32(1106150267);
+emit_32(3272384512);
+emit_32(1115291648);
+emit_32(1106320766);
+emit_32(3272384512);
+emit_32(1116000263);
+emit_32(1106620187);
+emit_32(3272384512);
+emit_32(1116512256);
+emit_32(1107259294);
+emit_32(3272384512);
+emit_32(1117024263);
+emit_32(1107471604);
+emit_32(3272384512);
+emit_32(1117536256);
+emit_32(1107538267);
+emit_32(3272384512);
+emit_32(1118048263);
+emit_32(1108219553);
+emit_32(3272384512);
+emit_32(1118560256);
+emit_32(1108391625);
+emit_32(3272384512);
+emit_32(1119072263);
+emit_32(1108309180);
+emit_32(3272384512);
+emit_32(1119584256);
+emit_32(1108147516);
+emit_32(3272384512);
+emit_32(1120096263);
+emit_32(1108248730);
+emit_32(3272384512);
+emit_32(1120608322);
+emit_32(1108495801);
+emit_32(3272384512);
+emit_32(1121120289);
+emit_32(1108672669);
+emit_32(3272384512);
+emit_32(1121632256);
+emit_32(1108534860);
+emit_32(3272384512);
+emit_32(1122144223);
+emit_32(1108457213);
+emit_32(3272384512);
+emit_32(1122656322);
+emit_32(1108523588);
+emit_32(3272384512);
+emit_32(1123168289);
+emit_32(1108457397);
+emit_32(3272384512);
+emit_32(1123680256);
+emit_32(1108144502);
+emit_32(3272384512);
+emit_32(1124132848);
+emit_32(1107554966);
+emit_32(3272384512);
+emit_32(1124388897);
+emit_32(1106329469);
+emit_32(3272384512);
+emit_32(1124644880);
+emit_32(1104699510);
+emit_32(3272384512);
+emit_32(1124900864);
+emit_32(1103026140);
+emit_32(3272384512);
+emit_32(1125156848);
+emit_32(1101214148);
+emit_32(3272384512);
+emit_32(1125412897);
+emit_32(1099233965);
+emit_32(3272384512);
+emit_32(1125668880);
+emit_32(1095822737);
+emit_32(3272384512);
+emit_32(1125924864);
+emit_32(1093805801);
+emit_32(3272384512);
+emit_32(1126180848);
+emit_32(1091936012);
+emit_32(3272384512);
+emit_32(1126436897);
+emit_32(1089180931);
+emit_32(3272384512);
+emit_32(1126692880);
+emit_32(1084894877);
+emit_32(3272384512);
+emit_32(1126948864);
+emit_32(1077040728);
+emit_32(3272384512);
+emit_32(1127204848);
+emit_32(1063155099);
+emit_32(3272384512);
+emit_32(1127460897);
+emit_32(3215476340);
+emit_32(3272384512);
+emit_32(1127716880);
+emit_32(3228112477);
+emit_32(3272384512);
+emit_32(1127972864);
+emit_32(3232515133);
+emit_32(3272384512);
+emit_32(1128228848);
+emit_32(3238089206);
+emit_32(3272384512);
+emit_32(1128484897);
+emit_32(3241062852);
+emit_32(3272384512);
+emit_32(1128740880);
+emit_32(3244581139);
+emit_32(3272384512);
+emit_32(1128996864);
+emit_32(3246469677);
+emit_32(3272384512);
+emit_32(1129252848);
+emit_32(3246870181);
+emit_32(3272384512);
+emit_32(1129508897);
+emit_32(3246893302);
+emit_32(3272384512);
+emit_32(1129764880);
+emit_32(3247231363);
+emit_32(3272384512);
+emit_32(1130020864);
+emit_32(3247263344);
+emit_32(3272384512);
+emit_32(1130276848);
+emit_32(3246998946);
+emit_32(3272384512);
+emit_32(1130532897);
+emit_32(3246499404);
+emit_32(3272384512);
+emit_32(1130788880);
+emit_32(3246148551);
+emit_32(3272384512);
+emit_32(1131044864);
+emit_32(3245400077);
+emit_32(3272384512);
+emit_32(1131300848);
+emit_32(3245118115);
+emit_32(3272384512);
+emit_32(1131556897);
+emit_32(3243091847);
+emit_32(3272384512);
+emit_32(1131812880);
+emit_32(3239267260);
+emit_32(3272384512);
+emit_32(1132068864);
+emit_32(3232983029);
+emit_32(3272384512);
+emit_32(1081737216);
+emit_32(1110766990);
+emit_32(3272640496);
+emit_32(1090125824);
+emit_32(1110715348);
+emit_32(3272640496);
+emit_32(1094418484);
+emit_32(1110472891);
+emit_32(3272640496);
+emit_32(1098514432);
+emit_32(1110034088);
+emit_32(3272640496);
+emit_32(1100759066);
+emit_32(1109323153);
+emit_32(3272640496);
+emit_32(1102807040);
+emit_32(1108619533);
+emit_32(3272640496);
+emit_32(1104855066);
+emit_32(1107915545);
+emit_32(3272640496);
+emit_32(1106903040);
+emit_32(1107624277);
+emit_32(3272640496);
+emit_32(1108123661);
+emit_32(1106832051);
+emit_32(3272640496);
+emit_32(1109147648);
+emit_32(1105866313);
+emit_32(3272640496);
+emit_32(1110171661);
+emit_32(1104840439);
+emit_32(3272640496);
+emit_32(1111195648);
+emit_32(1104739880);
+emit_32(3272640496);
+emit_32(1112219661);
+emit_32(1104492573);
+emit_32(3272640496);
+emit_32(1113243648);
+emit_32(1104325483);
+emit_32(3272640496);
+emit_32(1114267661);
+emit_32(1105104785);
+emit_32(3272640496);
+emit_32(1115291648);
+emit_32(1105118154);
+emit_32(3272640496);
+emit_32(1116000263);
+emit_32(1105110290);
+emit_32(3272640496);
+emit_32(1116512256);
+emit_32(1106190585);
+emit_32(3272640496);
+emit_32(1117024263);
+emit_32(1106806938);
+emit_32(3272640496);
+emit_32(1117536256);
+emit_32(1107447723);
+emit_32(3272640496);
+emit_32(1118048263);
+emit_32(1107960450);
+emit_32(3272640496);
+emit_32(1118560256);
+emit_32(1108120882);
+emit_32(3272640496);
+emit_32(1119072263);
+emit_32(1108021058);
+emit_32(3272640496);
+emit_32(1119584256);
+emit_32(1107844897);
+emit_32(3272640496);
+emit_32(1120096263);
+emit_32(1107897457);
+emit_32(3272640496);
+emit_32(1120608322);
+emit_32(1108031465);
+emit_32(3272640496);
+emit_32(1121120289);
+emit_32(1108410263);
+emit_32(3272640496);
+emit_32(1121632256);
+emit_32(1108301604);
+emit_32(3272640496);
+emit_32(1122144223);
+emit_32(1108298380);
+emit_32(3272640496);
+emit_32(1122656322);
+emit_32(1108279165);
+emit_32(3272640496);
+emit_32(1123168289);
+emit_32(1108038648);
+emit_32(3272640496);
+emit_32(1123680256);
+emit_32(1107908388);
+emit_32(3272640496);
+emit_32(1124132848);
+emit_32(1107420617);
+emit_32(3272640496);
+emit_32(1124388897);
+emit_32(1106088663);
+emit_32(3272640496);
+emit_32(1124644880);
+emit_32(1104288416);
+emit_32(3272640496);
+emit_32(1124900864);
+emit_32(1102764101);
+emit_32(3272640496);
+emit_32(1125156848);
+emit_32(1100664904);
+emit_32(3272640496);
+emit_32(1125412897);
+emit_32(1097290744);
+emit_32(3272640496);
+emit_32(1125668880);
+emit_32(1093918838);
+emit_32(3272640496);
+emit_32(1125924864);
+emit_32(1092359438);
+emit_32(3272640496);
+emit_32(1126180848);
+emit_32(1090438216);
+emit_32(3272640496);
+emit_32(1126436897);
+emit_32(1085633179);
+emit_32(3272640496);
+emit_32(1126692880);
+emit_32(1082298330);
+emit_32(3272640496);
+emit_32(1126948864);
+emit_32(1071317684);
+emit_32(3272640496);
+emit_32(1127204848);
+emit_32(3211416991);
+emit_32(3272640496);
+emit_32(1127460897);
+emit_32(3224008099);
+emit_32(3272640496);
+emit_32(1127716880);
+emit_32(3232930936);
+emit_32(3272640496);
+emit_32(1127972864);
+emit_32(3237569689);
+emit_32(3272640496);
+emit_32(1128228848);
+emit_32(3240285648);
+emit_32(3272640496);
+emit_32(1128484897);
+emit_32(3243818405);
+emit_32(3272640496);
+emit_32(1128740880);
+emit_32(3246427577);
+emit_32(3272640496);
+emit_32(1128996864);
+emit_32(3247046918);
+emit_32(3272640496);
+emit_32(1129252848);
+emit_32(3247819509);
+emit_32(3272640496);
+emit_32(1129508897);
+emit_32(3247822340);
+emit_32(3272640496);
+emit_32(1129764880);
+emit_32(3248121446);
+emit_32(3272640496);
+emit_32(1130020864);
+emit_32(3248655224);
+emit_32(3272640496);
+emit_32(1130276848);
+emit_32(3248219541);
+emit_32(3272640496);
+emit_32(1130532897);
+emit_32(3247726395);
+emit_32(3272640496);
+emit_32(1130788880);
+emit_32(3247190835);
+emit_32(3272640496);
+emit_32(1131044864);
+emit_32(3246657425);
+emit_32(3272640496);
+emit_32(1131300848);
+emit_32(3245446844);
+emit_32(3272640496);
+emit_32(1131556897);
+emit_32(3243320646);
+emit_32(3272640496);
+emit_32(1131812880);
+emit_32(3240090015);
+emit_32(3272640496);
+emit_32(1132068864);
+emit_32(3233059449);
+emit_32(3272640496);
+emit_32(1081737216);
+emit_32(1110289075);
+emit_32(3272896545);
+emit_32(1090125824);
+emit_32(1110184899);
+emit_32(3272896545);
+emit_32(1094418484);
+emit_32(1110081326);
+emit_32(3272896545);
+emit_32(1098514432);
+emit_32(1109624907);
+emit_32(3272896545);
+emit_32(1100759066);
+emit_32(1109048007);
+emit_32(3272896545);
+emit_32(1102807040);
+emit_32(1108349472);
+emit_32(3272896545);
+emit_32(1104855066);
+emit_32(1107549330);
+emit_32(3272896545);
+emit_32(1106903040);
+emit_32(1106981421);
+emit_32(3272896545);
+emit_32(1108123661);
+emit_32(1105990831);
+emit_32(3272896545);
+emit_32(1109147648);
+emit_32(1104915359);
+emit_32(3272896545);
+emit_32(1110171661);
+emit_32(1103693873);
+emit_32(3272896545);
+emit_32(1111195648);
+emit_32(1103863900);
+emit_32(3272896545);
+emit_32(1112219661);
+emit_32(1103998799);
+emit_32(3272896545);
+emit_32(1113243648);
+emit_32(1104012640);
+emit_32(3272896545);
+emit_32(1114267661);
+emit_32(1104234834);
+emit_32(3272896545);
+emit_32(1115291648);
+emit_32(1104799230);
+emit_32(3272896545);
+emit_32(1116000263);
+emit_32(1104865395);
+emit_32(3272896545);
+emit_32(1116512256);
+emit_32(1105083079);
+emit_32(3272896545);
+emit_32(1117024263);
+emit_32(1105770892);
+emit_32(3272896545);
+emit_32(1117536256);
+emit_32(1106981264);
+emit_32(3272896545);
+emit_32(1118048263);
+emit_32(1107541964);
+emit_32(3272896545);
+emit_32(1118560256);
+emit_32(1107753173);
+emit_32(3272896545);
+emit_32(1119072263);
+emit_32(1107932348);
+emit_32(3272896545);
+emit_32(1119584256);
+emit_32(1107696026);
+emit_32(3272896545);
+emit_32(1120096263);
+emit_32(1107774171);
+emit_32(3272896545);
+emit_32(1120608322);
+emit_32(1107999483);
+emit_32(3272896545);
+emit_32(1121120289);
+emit_32(1108089897);
+emit_32(3272896545);
+emit_32(1121632256);
+emit_32(1107942887);
+emit_32(3272896545);
+emit_32(1122144223);
+emit_32(1108011018);
+emit_32(3272896545);
+emit_32(1122656322);
+emit_32(1107841201);
+emit_32(3272896545);
+emit_32(1123168289);
+emit_32(1107624487);
+emit_32(3272896545);
+emit_32(1123680256);
+emit_32(1107346430);
+emit_32(3272896545);
+emit_32(1124132848);
+emit_32(1106655681);
+emit_32(3272896545);
+emit_32(1124388897);
+emit_32(1105650778);
+emit_32(3272896545);
+emit_32(1124644880);
+emit_32(1103819755);
+emit_32(3272896545);
+emit_32(1124900864);
+emit_32(1101832441);
+emit_32(3272896545);
+emit_32(1125156848);
+emit_32(1099587597);
+emit_32(3272896545);
+emit_32(1125412897);
+emit_32(1095963771);
+emit_32(3272896545);
+emit_32(1125668880);
+emit_32(1092682462);
+emit_32(3272896545);
+emit_32(1125924864);
+emit_32(1090858999);
+emit_32(3272896545);
+emit_32(1126180848);
+emit_32(1087538064);
+emit_32(3272896545);
+emit_32(1126436897);
+emit_32(1082518866);
+emit_32(3272896545);
+emit_32(1126692880);
+emit_32(1074794217);
+emit_32(3272896545);
+emit_32(1126948864);
+emit_32(1055151058);
+emit_32(3272896545);
+emit_32(1127204848);
+emit_32(3219019520);
+emit_32(3272896545);
+emit_32(1127460897);
+emit_32(3227302431);
+emit_32(3272896545);
+emit_32(1127716880);
+emit_32(3235425456);
+emit_32(3272896545);
+emit_32(1127972864);
+emit_32(3239324219);
+emit_32(3272896545);
+emit_32(1128228848);
+emit_32(3242595451);
+emit_32(3272896545);
+emit_32(1128484897);
+emit_32(3244970790);
+emit_32(3272896545);
+emit_32(1128740880);
+emit_32(3246227194);
+emit_32(3272896545);
+emit_32(1128996864);
+emit_32(3247085558);
+emit_32(3272896545);
+emit_32(1129252848);
+emit_32(3248170310);
+emit_32(3272896545);
+emit_32(1129508897);
+emit_32(3248369697);
+emit_32(3272896545);
+emit_32(1129764880);
+emit_32(3248556238);
+emit_32(3272896545);
+emit_32(1130020864);
+emit_32(3248791329);
+emit_32(3272896545);
+emit_32(1130276848);
+emit_32(3248863052);
+emit_32(3272896545);
+emit_32(1130532897);
+emit_32(3248823992);
+emit_32(3272896545);
+emit_32(1130788880);
+emit_32(3248329641);
+emit_32(3272896545);
+emit_32(1131044864);
+emit_32(3247178567);
+emit_32(3272896545);
+emit_32(1131300848);
+emit_32(3244969427);
+emit_32(3272896545);
+emit_32(1131556897);
+emit_32(3242521421);
+emit_32(3272896545);
+emit_32(1131812880);
+emit_32(3240271177);
+emit_32(3272896545);
+emit_32(1132068864);
+emit_32(3235475683);
+emit_32(3272896545);
+emit_32(1081737216);
+emit_32(1110106754);
+emit_32(3273152528);
+emit_32(1090125824);
+emit_32(1109851190);
+emit_32(3273152528);
+emit_32(1094418484);
+emit_32(1109531007);
+emit_32(3273152528);
+emit_32(1098514432);
+emit_32(1109268234);
+emit_32(3273152528);
+emit_32(1100759066);
+emit_32(1108527468);
+emit_32(3273152528);
+emit_32(1102807040);
+emit_32(1107822510);
+emit_32(3273152528);
+emit_32(1104855066);
+emit_32(1106879657);
+emit_32(3273152528);
+emit_32(1106903040);
+emit_32(1105644854);
+emit_32(3273152528);
+emit_32(1108123661);
+emit_32(1104812442);
+emit_32(3273152528);
+emit_32(1109147648);
+emit_32(1103599816);
+emit_32(3273152528);
+emit_32(1110171661);
+emit_32(1102886837);
+emit_32(3273152528);
+emit_32(1111195648);
+emit_32(1102824551);
+emit_32(3273152528);
+emit_32(1112219661);
+emit_32(1103195800);
+emit_32(3273152528);
+emit_32(1113243648);
+emit_32(1103637250);
+emit_32(3273152528);
+emit_32(1114267661);
+emit_32(1103975626);
+emit_32(3273152528);
+emit_32(1115291648);
+emit_32(1103996545);
+emit_32(3273152528);
+emit_32(1116000263);
+emit_32(1104513755);
+emit_32(3273152528);
+emit_32(1116512256);
+emit_32(1104583642);
+emit_32(3273152528);
+emit_32(1117024263);
+emit_32(1105332745);
+emit_32(3273152528);
+emit_32(1117536256);
+emit_32(1106424522);
+emit_32(3273152528);
+emit_32(1118048263);
+emit_32(1107096712);
+emit_32(3273152528);
+emit_32(1118560256);
+emit_32(1107537140);
+emit_32(3273152528);
+emit_32(1119072263);
+emit_32(1107484004);
+emit_32(3273152528);
+emit_32(1119584256);
+emit_32(1107558426);
+emit_32(3273152528);
+emit_32(1120096263);
+emit_32(1107936071);
+emit_32(3273152528);
+emit_32(1120608322);
+emit_32(1108104000);
+emit_32(3273152528);
+emit_32(1121120289);
+emit_32(1107929150);
+emit_32(3273152528);
+emit_32(1121632256);
+emit_32(1107694584);
+emit_32(3273152528);
+emit_32(1122144223);
+emit_32(1107539263);
+emit_32(3273152528);
+emit_32(1122656322);
+emit_32(1107466886);
+emit_32(3273152528);
+emit_32(1123168289);
+emit_32(1107473859);
+emit_32(3273152528);
+emit_32(1123680256);
+emit_32(1106712723);
+emit_32(3273152528);
+emit_32(1124132848);
+emit_32(1105424338);
+emit_32(3273152528);
+emit_32(1124388897);
+emit_32(1104440931);
+emit_32(3273152528);
+emit_32(1124644880);
+emit_32(1103144052);
+emit_32(3273152528);
+emit_32(1124900864);
+emit_32(1101107560);
+emit_32(3273152528);
+emit_32(1125156848);
+emit_32(1099132725);
+emit_32(3273152528);
+emit_32(1125412897);
+emit_32(1095577685);
+emit_32(3273152528);
+emit_32(1125668880);
+emit_32(1092369556);
+emit_32(3273152528);
+emit_32(1125924864);
+emit_32(1088719809);
+emit_32(3273152528);
+emit_32(1126180848);
+emit_32(1083696669);
+emit_32(3273152528);
+emit_32(1126436897);
+emit_32(1075000451);
+emit_32(3273152528);
+emit_32(1126692880);
+emit_32(1069530827);
+emit_32(3273152528);
+emit_32(1126948864);
+emit_32(3206582150);
+emit_32(3273152528);
+emit_32(1127204848);
+emit_32(3221141921);
+emit_32(3273152528);
+emit_32(1127460897);
+emit_32(3231308055);
+emit_32(3273152528);
+emit_32(1127716880);
+emit_32(3238013027);
+emit_32(3273152528);
+emit_32(1127972864);
+emit_32(3241648692);
+emit_32(3273152528);
+emit_32(1128228848);
+emit_32(3243113762);
+emit_32(3273152528);
+emit_32(1128484897);
+emit_32(3244161289);
+emit_32(3273152528);
+emit_32(1128740880);
+emit_32(3245421258);
+emit_32(3273152528);
+emit_32(1128996864);
+emit_32(3246875424);
+emit_32(3273152528);
+emit_32(1129252848);
+emit_32(3247610685);
+emit_32(3273152528);
+emit_32(1129508897);
+emit_32(3248309299);
+emit_32(3273152528);
+emit_32(1129764880);
+emit_32(3248981069);
+emit_32(3273152528);
+emit_32(1130020864);
+emit_32(3249435889);
+emit_32(3273152528);
+emit_32(1130276848);
+emit_32(3249270057);
+emit_32(3273152528);
+emit_32(1130532897);
+emit_32(3249259047);
+emit_32(3273152528);
+emit_32(1130788880);
+emit_32(3248161974);
+emit_32(3273152528);
+emit_32(1131044864);
+emit_32(3246939072);
+emit_32(3273152528);
+emit_32(1131300848);
+emit_32(3244307041);
+emit_32(3273152528);
+emit_32(1131556897);
+emit_32(3241397138);
+emit_32(3273152528);
+emit_32(1131812880);
+emit_32(3239169606);
+emit_32(3273152528);
+emit_32(1132068864);
+emit_32(3235418829);
+emit_32(3273152528);
+emit_32(1081737216);
+emit_32(1109848700);
+emit_32(3273408512);
+emit_32(1090125824);
+emit_32(1109616073);
+emit_32(3273408512);
+emit_32(1094418484);
+emit_32(1109191190);
+emit_32(3273408512);
+emit_32(1098514432);
+emit_32(1108732386);
+emit_32(3273408512);
+emit_32(1100759066);
+emit_32(1108353876);
+emit_32(3273408512);
+emit_32(1102807040);
+emit_32(1107813099);
+emit_32(3273408512);
+emit_32(1104855066);
+emit_32(1106931404);
+emit_32(3273408512);
+emit_32(1106903040);
+emit_32(1105711700);
+emit_32(3273408512);
+emit_32(1108123661);
+emit_32(1104199496);
+emit_32(3273408512);
+emit_32(1109147648);
+emit_32(1102966738);
+emit_32(3273408512);
+emit_32(1110171661);
+emit_32(1102284115);
+emit_32(3273408512);
+emit_32(1111195648);
+emit_32(1102118283);
+emit_32(3273408512);
+emit_32(1112219661);
+emit_32(1102403024);
+emit_32(3273408512);
+emit_32(1113243648);
+emit_32(1102981471);
+emit_32(3273408512);
+emit_32(1114267661);
+emit_32(1103432253);
+emit_32(3273408512);
+emit_32(1115291648);
+emit_32(1103738700);
+emit_32(3273408512);
+emit_32(1116000263);
+emit_32(1104470396);
+emit_32(3273408512);
+emit_32(1116512256);
+emit_32(1104866915);
+emit_32(3273408512);
+emit_32(1117024263);
+emit_32(1105262543);
+emit_32(3273408512);
+emit_32(1117536256);
+emit_32(1106001527);
+emit_32(3273408512);
+emit_32(1118048263);
+emit_32(1106476637);
+emit_32(3273408512);
+emit_32(1118560256);
+emit_32(1106576409);
+emit_32(3273408512);
+emit_32(1119072263);
+emit_32(1106461537);
+emit_32(3273408512);
+emit_32(1119584256);
+emit_32(1107353561);
+emit_32(3273408512);
+emit_32(1120096263);
+emit_32(1107634841);
+emit_32(3273408512);
+emit_32(1120608322);
+emit_32(1107769845);
+emit_32(3273408512);
+emit_32(1121120289);
+emit_32(1107434380);
+emit_32(3273408512);
+emit_32(1121632256);
+emit_32(1107315943);
+emit_32(3273408512);
+emit_32(1122144223);
+emit_32(1106787592);
+emit_32(3273408512);
+emit_32(1122656322);
+emit_32(1106765100);
+emit_32(3273408512);
+emit_32(1123168289);
+emit_32(1106762845);
+emit_32(3273408512);
+emit_32(1123680256);
+emit_32(1105758834);
+emit_32(3273408512);
+emit_32(1124132848);
+emit_32(1104621758);
+emit_32(3273408512);
+emit_32(1124388897);
+emit_32(1103142375);
+emit_32(3273408512);
+emit_32(1124644880);
+emit_32(1101953080);
+emit_32(3273408512);
+emit_32(1124900864);
+emit_32(1100385039);
+emit_32(3273408512);
+emit_32(1125156848);
+emit_32(1097070857);
+emit_32(3273408512);
+emit_32(1125412897);
+emit_32(1093584657);
+emit_32(3273408512);
+emit_32(1125668880);
+emit_32(1091629985);
+emit_32(3273408512);
+emit_32(1125924864);
+emit_32(1088130111);
+emit_32(3273408512);
+emit_32(1126180848);
+emit_32(1080062598);
+emit_32(3273408512);
+emit_32(1126436897);
+emit_32(1066603370);
+emit_32(3273408512);
+emit_32(1126692880);
+emit_32(3206794499);
+emit_32(3273408512);
+emit_32(1126948864);
+emit_32(3224322043);
+emit_32(3273408512);
+emit_32(1127204848);
+emit_32(3229663824);
+emit_32(3273408512);
+emit_32(1127460897);
+emit_32(3234125914);
+emit_32(3273408512);
+emit_32(1127716880);
+emit_32(3238854457);
+emit_32(3273408512);
+emit_32(1127972864);
+emit_32(3240458138);
+emit_32(3273408512);
+emit_32(1128228848);
+emit_32(3241347121);
+emit_32(3273408512);
+emit_32(1128484897);
+emit_32(3243399080);
+emit_32(3273408512);
+emit_32(1128740880);
+emit_32(3244860480);
+emit_32(3273408512);
+emit_32(1128996864);
+emit_32(3246331213);
+emit_32(3273408512);
+emit_32(1129252848);
+emit_32(3247173534);
+emit_32(3273408512);
+emit_32(1129508897);
+emit_32(3247995565);
+emit_32(3273408512);
+emit_32(1129764880);
+emit_32(3249070460);
+emit_32(3273408512);
+emit_32(1130020864);
+emit_32(3249215740);
+emit_32(3273408512);
+emit_32(1130276848);
+emit_32(3249090383);
+emit_32(3273408512);
+emit_32(1130532897);
+emit_32(3248637136);
+emit_32(3273408512);
+emit_32(1130788880);
+emit_32(3247527900);
+emit_32(3273408512);
+emit_32(1131044864);
+emit_32(3246097695);
+emit_32(3273408512);
+emit_32(1131300848);
+emit_32(3243725711);
+emit_32(3273408512);
+emit_32(1131556897);
+emit_32(3240252198);
+emit_32(3273408512);
+emit_32(1131812880);
+emit_32(3238101369);
+emit_32(3273408512);
+emit_32(1132068864);
+emit_32(3232685716);
+emit_32(3273408512);
+emit_32(1081737216);
+emit_32(1109518057);
+emit_32(3273664496);
+emit_32(1090125824);
+emit_32(1109209645);
+emit_32(3273664496);
+emit_32(1094418484);
+emit_32(1108711100);
+emit_32(3273664496);
+emit_32(1098514432);
+emit_32(1108394482);
+emit_32(3273664496);
+emit_32(1100759066);
+emit_32(1107902805);
+emit_32(3273664496);
+emit_32(1102807040);
+emit_32(1107530351);
+emit_32(3273664496);
+emit_32(1104855066);
+emit_32(1106484396);
+emit_32(3273664496);
+emit_32(1106903040);
+emit_32(1105503610);
+emit_32(3273664496);
+emit_32(1108123661);
+emit_32(1104089658);
+emit_32(3273664496);
+emit_32(1109147648);
+emit_32(1103023571);
+emit_32(3273664496);
+emit_32(1110171661);
+emit_32(1102213651);
+emit_32(3273664496);
+emit_32(1111195648);
+emit_32(1101760718);
+emit_32(3273664496);
+emit_32(1112219661);
+emit_32(1102038119);
+emit_32(3273664496);
+emit_32(1113243648);
+emit_32(1102582016);
+emit_32(3273664496);
+emit_32(1114267661);
+emit_32(1103573287);
+emit_32(3273664496);
+emit_32(1115291648);
+emit_32(1103737913);
+emit_32(3273664496);
+emit_32(1116000263);
+emit_32(1104225396);
+emit_32(3273664496);
+emit_32(1116512256);
+emit_32(1104815063);
+emit_32(3273664496);
+emit_32(1117024263);
+emit_32(1105243301);
+emit_32(3273664496);
+emit_32(1117536256);
+emit_32(1105695814);
+emit_32(3273664496);
+emit_32(1118048263);
+emit_32(1105989625);
+emit_32(3273664496);
+emit_32(1118560256);
+emit_32(1106114930);
+emit_32(3273664496);
+emit_32(1119072263);
+emit_32(1106699669);
+emit_32(3273664496);
+emit_32(1119584256);
+emit_32(1107034164);
+emit_32(3273664496);
+emit_32(1120096263);
+emit_32(1107327294);
+emit_32(3273664496);
+emit_32(1120608322);
+emit_32(1106913106);
+emit_32(3273664496);
+emit_32(1121120289);
+emit_32(1106509038);
+emit_32(3273664496);
+emit_32(1121632256);
+emit_32(1105952401);
+emit_32(3273664496);
+emit_32(1122144223);
+emit_32(1106608862);
+emit_32(3273664496);
+emit_32(1122656322);
+emit_32(1106050443);
+emit_32(3273664496);
+emit_32(1123168289);
+emit_32(1105539210);
+emit_32(3273664496);
+emit_32(1123680256);
+emit_32(1104316937);
+emit_32(3273664496);
+emit_32(1124132848);
+emit_32(1103423078);
+emit_32(3273664496);
+emit_32(1124388897);
+emit_32(1102157867);
+emit_32(3273664496);
+emit_32(1124644880);
+emit_32(1100686767);
+emit_32(3273664496);
+emit_32(1124900864);
+emit_32(1099193752);
+emit_32(3273664496);
+emit_32(1125156848);
+emit_32(1096183867);
+emit_32(3273664496);
+emit_32(1125412897);
+emit_32(1092300434);
+emit_32(3273664496);
+emit_32(1125668880);
+emit_32(1090658553);
+emit_32(3273664496);
+emit_32(1125924864);
+emit_32(1087350684);
+emit_32(3273664496);
+emit_32(1126180848);
+emit_32(1076097052);
+emit_32(3273664496);
+emit_32(1126436897);
+emit_32(1033250201);
+emit_32(3273664496);
+emit_32(1126692880);
+emit_32(3213794340);
+emit_32(3273664496);
+emit_32(1126948864);
+emit_32(3225617244);
+emit_32(3273664496);
+emit_32(1127204848);
+emit_32(3234199587);
+emit_32(3273664496);
+emit_32(1127460897);
+emit_32(3236783823);
+emit_32(3273664496);
+emit_32(1127716880);
+emit_32(3239231409);
+emit_32(3273664496);
+emit_32(1127972864);
+emit_32(3239869436);
+emit_32(3273664496);
+emit_32(1128228848);
+emit_32(3240676137);
+emit_32(3273664496);
+emit_32(1128484897);
+emit_32(3242958153);
+emit_32(3273664496);
+emit_32(1128740880);
+emit_32(3244196417);
+emit_32(3273664496);
+emit_32(1128996864);
+emit_32(3245843100);
+emit_32(3273664496);
+emit_32(1129252848);
+emit_32(3247245204);
+emit_32(3273664496);
+emit_32(1129508897);
+emit_32(3248095337);
+emit_32(3273664496);
+emit_32(1129764880);
+emit_32(3248269505);
+emit_32(3273664496);
+emit_32(1130020864);
+emit_32(3248127423);
+emit_32(3273664496);
+emit_32(1130276848);
+emit_32(3248240250);
+emit_32(3273664496);
+emit_32(1130532897);
+emit_32(3247358398);
+emit_32(3273664496);
+emit_32(1130788880);
+emit_32(3246549998);
+emit_32(3273664496);
+emit_32(1131044864);
+emit_32(3244820005);
+emit_32(3273664496);
+emit_32(1131300848);
+emit_32(3242185563);
+emit_32(3273664496);
+emit_32(1131556897);
+emit_32(3239470873);
+emit_32(3273664496);
+emit_32(1131812880);
+emit_32(3235146241);
+emit_32(3273664496);
+emit_32(1132068864);
+emit_32(3228421765);
+emit_32(3273664496);
+emit_32(1081737216);
+emit_32(1109095429);
+emit_32(3273920545);
+emit_32(1090125824);
+emit_32(1108721848);
+emit_32(3273920545);
+emit_32(1094418484);
+emit_32(1108271799);
+emit_32(3273920545);
+emit_32(1098514432);
+emit_32(1107836640);
+emit_32(3273920545);
+emit_32(1100759066);
+emit_32(1107583487);
+emit_32(3273920545);
+emit_32(1102807040);
+emit_32(1107305929);
+emit_32(3273920545);
+emit_32(1104855066);
+emit_32(1106095427);
+emit_32(3273920545);
+emit_32(1106903040);
+emit_32(1104843427);
+emit_32(3273920545);
+emit_32(1108123661);
+emit_32(1103754481);
+emit_32(3273920545);
+emit_32(1109147648);
+emit_32(1102895959);
+emit_32(3273920545);
+emit_32(1110171661);
+emit_32(1102181460);
+emit_32(3273920545);
+emit_32(1111195648);
+emit_32(1101676256);
+emit_32(3273920545);
+emit_32(1112219661);
+emit_32(1101547858);
+emit_32(3273920545);
+emit_32(1113243648);
+emit_32(1102482086);
+emit_32(3273920545);
+emit_32(1114267661);
+emit_32(1103334421);
+emit_32(3273920545);
+emit_32(1115291648);
+emit_32(1103698330);
+emit_32(3273920545);
+emit_32(1116000263);
+emit_32(1103797472);
+emit_32(3273920545);
+emit_32(1116512256);
+emit_32(1104470449);
+emit_32(3273920545);
+emit_32(1117024263);
+emit_32(1105019221);
+emit_32(3273920545);
+emit_32(1117536256);
+emit_32(1105107249);
+emit_32(3273920545);
+emit_32(1118048263);
+emit_32(1105221177);
+emit_32(3273920545);
+emit_32(1118560256);
+emit_32(1105813517);
+emit_32(3273920545);
+emit_32(1119072263);
+emit_32(1106222986);
+emit_32(3273920545);
+emit_32(1119584256);
+emit_32(1106744181);
+emit_32(3273920545);
+emit_32(1120096263);
+emit_32(1106572162);
+emit_32(3273920545);
+emit_32(1120608322);
+emit_32(1106138261);
+emit_32(3273920545);
+emit_32(1121120289);
+emit_32(1105034373);
+emit_32(3273920545);
+emit_32(1121632256);
+emit_32(1104844371);
+emit_32(3273920545);
+emit_32(1122144223);
+emit_32(1105102006);
+emit_32(3273920545);
+emit_32(1122656322);
+emit_32(1104862039);
+emit_32(3273920545);
+emit_32(1123168289);
+emit_32(1104232946);
+emit_32(3273920545);
+emit_32(1123680256);
+emit_32(1103026297);
+emit_32(3273920545);
+emit_32(1124132848);
+emit_32(1101863741);
+emit_32(3273920545);
+emit_32(1124388897);
+emit_32(1100516216);
+emit_32(3273920545);
+emit_32(1124644880);
+emit_32(1099293105);
+emit_32(3273920545);
+emit_32(1124900864);
+emit_32(1097230346);
+emit_32(3273920545);
+emit_32(1125156848);
+emit_32(1093750751);
+emit_32(3273920545);
+emit_32(1125412897);
+emit_32(1090925405);
+emit_32(3273920545);
+emit_32(1125668880);
+emit_32(1088433213);
+emit_32(3273920545);
+emit_32(1125924864);
+emit_32(1084125285);
+emit_32(3273920545);
+emit_32(1126180848);
+emit_32(1075725646);
+emit_32(3273920545);
+emit_32(1126436897);
+emit_32(1061623490);
+emit_32(3273920545);
+emit_32(1126692880);
+emit_32(3216532465);
+emit_32(3273920545);
+emit_32(1126948864);
+emit_32(3227819673);
+emit_32(3273920545);
+emit_32(1127204848);
+emit_32(3234520577);
+emit_32(3273920545);
+emit_32(1127460897);
+emit_32(3236952791);
+emit_32(3273920545);
+emit_32(1127716880);
+emit_32(3239234608);
+emit_32(3273920545);
+emit_32(1127972864);
+emit_32(3240023346);
+emit_32(3273920545);
+emit_32(1128228848);
+emit_32(3241225696);
+emit_32(3273920545);
+emit_32(1128484897);
+emit_32(3243063535);
+emit_32(3273920545);
+emit_32(1128740880);
+emit_32(3245269949);
+emit_32(3273920545);
+emit_32(1128996864);
+emit_32(3246344425);
+emit_32(3273920545);
+emit_32(1129252848);
+emit_32(3246962665);
+emit_32(3273920545);
+emit_32(1129508897);
+emit_32(3247716853);
+emit_32(3273920545);
+emit_32(1129764880);
+emit_32(3247725609);
+emit_32(3273920545);
+emit_32(1130020864);
+emit_32(3247729803);
+emit_32(3273920545);
+emit_32(1130276848);
+emit_32(3247215739);
+emit_32(3273920545);
+emit_32(1130532897);
+emit_32(3246018422);
+emit_32(3273920545);
+emit_32(1130788880);
+emit_32(3244886589);
+emit_32(3273920545);
+emit_32(1131044864);
+emit_32(3242781888);
+emit_32(3273920545);
+emit_32(1131300848);
+emit_32(3240781205);
+emit_32(3273920545);
+emit_32(1131556897);
+emit_32(3238299267);
+emit_32(3273920545);
+emit_32(1131812880);
+emit_32(3233550057);
+emit_32(3273920545);
+emit_32(1132068864);
+emit_32(3223464811);
+emit_32(3273920545);
+emit_32(1081737216);
+emit_32(1108664621);
+emit_32(3274176528);
+emit_32(1090125824);
+emit_32(1108522618);
+emit_32(3274176528);
+emit_32(1094418484);
+emit_32(1108407563);
+emit_32(3274176528);
+emit_32(1098514432);
+emit_32(1107682787);
+emit_32(3274176528);
+emit_32(1100759066);
+emit_32(1107320583);
+emit_32(3274176528);
+emit_32(1102807040);
+emit_32(1106544532);
+emit_32(3274176528);
+emit_32(1104855066);
+emit_32(1105511999);
+emit_32(3274176528);
+emit_32(1106903040);
+emit_32(1104375867);
+emit_32(3274176528);
+emit_32(1108123661);
+emit_32(1103074112);
+emit_32(3274176528);
+emit_32(1109147648);
+emit_32(1102337278);
+emit_32(3274176528);
+emit_32(1110171661);
+emit_32(1101962517);
+emit_32(3274176528);
+emit_32(1111195648);
+emit_32(1101639031);
+emit_32(3274176528);
+emit_32(1112219661);
+emit_32(1101573181);
+emit_32(3274176528);
+emit_32(1113243648);
+emit_32(1101942070);
+emit_32(3274176528);
+emit_32(1114267661);
+emit_32(1102543638);
+emit_32(3274176528);
+emit_32(1115291648);
+emit_32(1103135559);
+emit_32(3274176528);
+emit_32(1116000263);
+emit_32(1103322153);
+emit_32(3274176528);
+emit_32(1116512256);
+emit_32(1103539995);
+emit_32(3274176528);
+emit_32(1117024263);
+emit_32(1103767850);
+emit_32(3274176528);
+emit_32(1117536256);
+emit_32(1104163740);
+emit_32(3274176528);
+emit_32(1118048263);
+emit_32(1104602045);
+emit_32(3274176528);
+emit_32(1118560256);
+emit_32(1104897953);
+emit_32(3274176528);
+emit_32(1119072263);
+emit_32(1105720246);
+emit_32(3274176528);
+emit_32(1119584256);
+emit_32(1105815981);
+emit_32(3274176528);
+emit_32(1120096263);
+emit_32(1105144788);
+emit_32(3274176528);
+emit_32(1120608322);
+emit_32(1104485233);
+emit_32(3274176528);
+emit_32(1121120289);
+emit_32(1103618061);
+emit_32(3274176528);
+emit_32(1121632256);
+emit_32(1103661315);
+emit_32(3274176528);
+emit_32(1122144223);
+emit_32(1103401845);
+emit_32(3274176528);
+emit_32(1122656322);
+emit_32(1102987500);
+emit_32(3274176528);
+emit_32(1123168289);
+emit_32(1102162900);
+emit_32(3274176528);
+emit_32(1123680256);
+emit_32(1100880701);
+emit_32(3274176528);
+emit_32(1124132848);
+emit_32(1099831339);
+emit_32(3274176528);
+emit_32(1124388897);
+emit_32(1098628622);
+emit_32(3274176528);
+emit_32(1124644880);
+emit_32(1096283587);
+emit_32(3274176528);
+emit_32(1124900864);
+emit_32(1094436939);
+emit_32(3274176528);
+emit_32(1125156848);
+emit_32(1092462586);
+emit_32(3274176528);
+emit_32(1125412897);
+emit_32(1090574426);
+emit_32(3274176528);
+emit_32(1125668880);
+emit_32(1088368683);
+emit_32(3274176528);
+emit_32(1125924864);
+emit_32(1084468987);
+emit_32(3274176528);
+emit_32(1126180848);
+emit_32(1078479458);
+emit_32(3274176528);
+emit_32(1126436897);
+emit_32(1070097393);
+emit_32(3274176528);
+emit_32(1126692880);
+emit_32(3219330905);
+emit_32(3274176528);
+emit_32(1126948864);
+emit_32(3229956377);
+emit_32(3274176528);
+emit_32(1127204848);
+emit_32(3233498299);
+emit_32(3274176528);
+emit_32(1127460897);
+emit_32(3237958480);
+emit_32(3274176528);
+emit_32(1127716880);
+emit_32(3239973518);
+emit_32(3274176528);
+emit_32(1127972864);
+emit_32(3240389457);
+emit_32(3274176528);
+emit_32(1128228848);
+emit_32(3241706154);
+emit_32(3274176528);
+emit_32(1128484897);
+emit_32(3243624314);
+emit_32(3274176528);
+emit_32(1128740880);
+emit_32(3245731637);
+emit_32(3274176528);
+emit_32(1128996864);
+emit_32(3246688777);
+emit_32(3274176528);
+emit_32(1129252848);
+emit_32(3247277500);
+emit_32(3274176528);
+emit_32(1129508897);
+emit_32(3247268744);
+emit_32(3274176528);
+emit_32(1129764880);
+emit_32(3246821579);
+emit_32(3274176528);
+emit_32(1130020864);
+emit_32(3246928901);
+emit_32(3274176528);
+emit_32(1130276848);
+emit_32(3246584024);
+emit_32(3274176528);
+emit_32(1130532897);
+emit_32(3244589423);
+emit_32(3274176528);
+emit_32(1130788880);
+emit_32(3243611311);
+emit_32(3274176528);
+emit_32(1131044864);
+emit_32(3242211253);
+emit_32(3274176528);
+emit_32(1131300848);
+emit_32(3239996199);
+emit_32(3274176528);
+emit_32(1131556897);
+emit_32(3237841102);
+emit_32(3274176528);
+emit_32(1131812880);
+emit_32(3232583521);
+emit_32(3274176528);
+emit_32(1132068864);
+emit_32(3220160035);
+emit_32(3274176528);
+emit_32(1081737216);
+emit_32(1108184872);
+emit_32(3274432512);
+emit_32(1090125824);
+emit_32(1108148932);
+emit_32(3274432512);
+emit_32(1094418484);
+emit_32(1107903853);
+emit_32(3274432512);
+emit_32(1098514432);
+emit_32(1107577694);
+emit_32(3274432512);
+emit_32(1100759066);
+emit_32(1106982365);
+emit_32(3274432512);
+emit_32(1102807040);
+emit_32(1105680086);
+emit_32(3274432512);
+emit_32(1104855066);
+emit_32(1104468771);
+emit_32(3274432512);
+emit_32(1106903040);
+emit_32(1103509114);
+emit_32(3274432512);
+emit_32(1108123661);
+emit_32(1102687764);
+emit_32(3274432512);
+emit_32(1109147648);
+emit_32(1102002520);
+emit_32(3274432512);
+emit_32(1110171661);
+emit_32(1101411123);
+emit_32(3274432512);
+emit_32(1111195648);
+emit_32(1101064569);
+emit_32(3274432512);
+emit_32(1112219661);
+emit_32(1100846150);
+emit_32(3274432512);
+emit_32(1113243648);
+emit_32(1101357436);
+emit_32(3274432512);
+emit_32(1114267661);
+emit_32(1102179729);
+emit_32(3274432512);
+emit_32(1115291648);
+emit_32(1102092698);
+emit_32(3274432512);
+emit_32(1116000263);
+emit_32(1102408371);
+emit_32(3274432512);
+emit_32(1116512256);
+emit_32(1102286999);
+emit_32(3274432512);
+emit_32(1117024263);
+emit_32(1102506518);
+emit_32(3274432512);
+emit_32(1117536256);
+emit_32(1103483005);
+emit_32(3274432512);
+emit_32(1118048263);
+emit_32(1103994238);
+emit_32(3274432512);
+emit_32(1118560256);
+emit_32(1104213233);
+emit_32(3274432512);
+emit_32(1119072263);
+emit_32(1103948992);
+emit_32(3274432512);
+emit_32(1119584256);
+emit_32(1103515143);
+emit_32(3274432512);
+emit_32(1120096263);
+emit_32(1103105832);
+emit_32(3274432512);
+emit_32(1120608322);
+emit_32(1102826124);
+emit_32(3274432512);
+emit_32(1121120289);
+emit_32(1102767456);
+emit_32(3274432512);
+emit_32(1121632256);
+emit_32(1102189901);
+emit_32(3274432512);
+emit_32(1122144223);
+emit_32(1101674421);
+emit_32(3274432512);
+emit_32(1122656322);
+emit_32(1100890243);
+emit_32(3274432512);
+emit_32(1123168289);
+emit_32(1099939761);
+emit_32(3274432512);
+emit_32(1123680256);
+emit_32(1099075997);
+emit_32(3274432512);
+emit_32(1124132848);
+emit_32(1097086376);
+emit_32(3274432512);
+emit_32(1124388897);
+emit_32(1095228614);
+emit_32(3274432512);
+emit_32(1124644880);
+emit_32(1093029436);
+emit_32(3274432512);
+emit_32(1124900864);
+emit_32(1091479672);
+emit_32(3274432512);
+emit_32(1125156848);
+emit_32(1091750163);
+emit_32(3274432512);
+emit_32(1125412897);
+emit_32(1089138149);
+emit_32(3274432512);
+emit_32(1125668880);
+emit_32(1086598540);
+emit_32(3274432512);
+emit_32(1125924864);
+emit_32(1083352484);
+emit_32(3274432512);
+emit_32(1126180848);
+emit_32(1076974919);
+emit_32(3274432512);
+emit_32(1126436897);
+emit_32(1066291146);
+emit_32(3274432512);
+emit_32(1126692880);
+emit_32(3221226898);
+emit_32(3274432512);
+emit_32(1126948864);
+emit_32(3228126151);
+emit_32(3274432512);
+emit_32(1127204848);
+emit_32(3231975515);
+emit_32(3274432512);
+emit_32(1127460897);
+emit_32(3238351340);
+emit_32(3274432512);
+emit_32(1127716880);
+emit_32(3240184460);
+emit_32(3274432512);
+emit_32(1127972864);
+emit_32(3241040832);
+emit_32(3274432512);
+emit_32(1128228848);
+emit_32(3242157461);
+emit_32(3274432512);
+emit_32(1128484897);
+emit_32(3244822731);
+emit_32(3274432512);
+emit_32(1128740880);
+emit_32(3246247536);
+emit_32(3274432512);
+emit_32(1128996864);
+emit_32(3247038372);
+emit_32(3274432512);
+emit_32(1129252848);
+emit_32(3247585939);
+emit_32(3274432512);
+emit_32(1129508897);
+emit_32(3246884389);
+emit_32(3274432512);
+emit_32(1129764880);
+emit_32(3246474763);
+emit_32(3274432512);
+emit_32(1130020864);
+emit_32(3246383746);
+emit_32(3274432512);
+emit_32(1130276848);
+emit_32(3245256632);
+emit_32(3274432512);
+emit_32(1130532897);
+emit_32(3243907010);
+emit_32(3274432512);
+emit_32(1130788880);
+emit_32(3243058921);
+emit_32(3274432512);
+emit_32(1131044864);
+emit_32(3241166032);
+emit_32(3274432512);
+emit_32(1131300848);
+emit_32(3238570922);
+emit_32(3274432512);
+emit_32(1131556897);
+emit_32(3234153659);
+emit_32(3274432512);
+emit_32(1131812880);
+emit_32(3230360226);
+emit_32(3274432512);
+emit_32(1132068864);
+emit_32(3219833634);
+emit_32(3274432512);
+emit_32(1081737216);
+emit_32(1108036289);
+emit_32(3274688496);
+emit_32(1090125824);
+emit_32(1107810609);
+emit_32(3274688496);
+emit_32(1094418484);
+emit_32(1107747825);
+emit_32(3274688496);
+emit_32(1098514432);
+emit_32(1107286871);
+emit_32(3274688496);
+emit_32(1100759066);
+emit_32(1106086881);
+emit_32(3274688496);
+emit_32(1102807040);
+emit_32(1104804315);
+emit_32(3274688496);
+emit_32(1104855066);
+emit_32(1103699326);
+emit_32(3274688496);
+emit_32(1106903040);
+emit_32(1102741504);
+emit_32(3274688496);
+emit_32(1108123661);
+emit_32(1101680083);
+emit_32(3274688496);
+emit_32(1109147648);
+emit_32(1101656595);
+emit_32(3274688496);
+emit_32(1110171661);
+emit_32(1100849663);
+emit_32(3274688496);
+emit_32(1111195648);
+emit_32(1100640053);
+emit_32(3274688496);
+emit_32(1112219661);
+emit_32(1100253443);
+emit_32(3274688496);
+emit_32(1113243648);
+emit_32(1100764047);
+emit_32(3274688496);
+emit_32(1114267661);
+emit_32(1101163554);
+emit_32(3274688496);
+emit_32(1115291648);
+emit_32(1101305217);
+emit_32(3274688496);
+emit_32(1116000263);
+emit_32(1101417624);
+emit_32(3274688496);
+emit_32(1116512256);
+emit_32(1101765385);
+emit_32(3274688496);
+emit_32(1117024263);
+emit_32(1102533938);
+emit_32(3274688496);
+emit_32(1117536256);
+emit_32(1102938689);
+emit_32(3274688496);
+emit_32(1118048263);
+emit_32(1103318955);
+emit_32(3274688496);
+emit_32(1118560256);
+emit_32(1103683754);
+emit_32(3274688496);
+emit_32(1119072263);
+emit_32(1103175090);
+emit_32(3274688496);
+emit_32(1119584256);
+emit_32(1102854593);
+emit_32(3274688496);
+emit_32(1120096263);
+emit_32(1102466567);
+emit_32(3274688496);
+emit_32(1120608322);
+emit_32(1101638507);
+emit_32(3274688496);
+emit_32(1121120289);
+emit_32(1101343542);
+emit_32(3274688496);
+emit_32(1121632256);
+emit_32(1100858629);
+emit_32(3274688496);
+emit_32(1122144223);
+emit_32(1099916326);
+emit_32(3274688496);
+emit_32(1122656322);
+emit_32(1099386952);
+emit_32(3274688496);
+emit_32(1123168289);
+emit_32(1098990538);
+emit_32(3274688496);
+emit_32(1123680256);
+emit_32(1097981860);
+emit_32(3274688496);
+emit_32(1124132848);
+emit_32(1095898759);
+emit_32(3274688496);
+emit_32(1124388897);
+emit_32(1092934435);
+emit_32(3274688496);
+emit_32(1124644880);
+emit_32(1090423368);
+emit_32(3274688496);
+emit_32(1124900864);
+emit_32(1089465599);
+emit_32(3274688496);
+emit_32(1125156848);
+emit_32(1090025916);
+emit_32(3274688496);
+emit_32(1125412897);
+emit_32(1088093013);
+emit_32(3274688496);
+emit_32(1125668880);
+emit_32(1086367518);
+emit_32(3274688496);
+emit_32(1125924864);
+emit_32(1083889418);
+emit_32(3274688496);
+emit_32(1126180848);
+emit_32(1076254464);
+emit_32(3274688496);
+emit_32(1126436897);
+emit_32(1068370850);
+emit_32(3274688496);
+emit_32(1126692880);
+emit_32(3216221248);
+emit_32(3274688496);
+emit_32(1126948864);
+emit_32(3228349497);
+emit_32(3274688496);
+emit_32(1127204848);
+emit_32(3232983910);
+emit_32(3274688496);
+emit_32(1127460897);
+emit_32(3238169558);
+emit_32(3274688496);
+emit_32(1127716880);
+emit_32(3239092054);
+emit_32(3274688496);
+emit_32(1127972864);
+emit_32(3241438976);
+emit_32(3274688496);
+emit_32(1128228848);
+emit_32(3243388489);
+emit_32(3274688496);
+emit_32(1128484897);
+emit_32(3245180191);
+emit_32(3274688496);
+emit_32(1128740880);
+emit_32(3246270710);
+emit_32(3274688496);
+emit_32(1128996864);
+emit_32(3247252229);
+emit_32(3274688496);
+emit_32(1129252848);
+emit_32(3247543262);
+emit_32(3274688496);
+emit_32(1129508897);
+emit_32(3246603737);
+emit_32(3274688496);
+emit_32(1129764880);
+emit_32(3246628379);
+emit_32(3274688496);
+emit_32(1130020864);
+emit_32(3246208949);
+emit_32(3274688496);
+emit_32(1130276848);
+emit_32(3243960277);
+emit_32(3274688496);
+emit_32(1130532897);
+emit_32(3243077167);
+emit_32(3274688496);
+emit_32(1130788880);
+emit_32(3241817407);
+emit_32(3274688496);
+emit_32(1131044864);
+emit_32(3238920664);
+emit_32(3274688496);
+emit_32(1131300848);
+emit_32(3235529538);
+emit_32(3274688496);
+emit_32(1131556897);
+emit_32(3228900545);
+emit_32(3274688496);
+emit_32(1131812880);
+emit_32(3222674310);
+emit_32(3274688496);
+emit_32(1132068864);
+emit_32(3208271280);
+emit_32(3274688496);
+emit_32(1081737216);
+emit_32(1107544270);
+emit_32(3274944545);
+emit_32(1090125824);
+emit_32(1107321186);
+emit_32(3274944545);
+emit_32(1094418484);
+emit_32(1106832838);
+emit_32(3274944545);
+emit_32(1098514432);
+emit_32(1105933107);
+emit_32(3274944545);
+emit_32(1100759066);
+emit_32(1104947236);
+emit_32(3274944545);
+emit_32(1102807040);
+emit_32(1104326217);
+emit_32(3274944545);
+emit_32(1104855066);
+emit_32(1103138967);
+emit_32(3274944545);
+emit_32(1106903040);
+emit_32(1102036441);
+emit_32(3274944545);
+emit_32(1108123661);
+emit_32(1101087742);
+emit_32(3274944545);
+emit_32(1109147648);
+emit_32(1100669465);
+emit_32(3274944545);
+emit_32(1110171661);
+emit_32(1100266183);
+emit_32(3274944545);
+emit_32(1111195648);
+emit_32(1100000526);
+emit_32(3274944545);
+emit_32(1112219661);
+emit_32(1099972529);
+emit_32(3274944545);
+emit_32(1113243648);
+emit_32(1099715681);
+emit_32(3274944545);
+emit_32(1114267661);
+emit_32(1099811521);
+emit_32(3274944545);
+emit_32(1115291648);
+emit_32(1100048079);
+emit_32(3274944545);
+emit_32(1116000263);
+emit_32(1100398461);
+emit_32(3274944545);
+emit_32(1116512256);
+emit_32(1101470735);
+emit_32(3274944545);
+emit_32(1117024263);
+emit_32(1102010332);
+emit_32(3274944545);
+emit_32(1117536256);
+emit_32(1102212969);
+emit_32(3274944545);
+emit_32(1118048263);
+emit_32(1102131547);
+emit_32(3274944545);
+emit_32(1118560256);
+emit_32(1102714503);
+emit_32(3274944545);
+emit_32(1119072263);
+emit_32(1102278033);
+emit_32(3274944545);
+emit_32(1119584256);
+emit_32(1101809792);
+emit_32(3274944545);
+emit_32(1120096263);
+emit_32(1100816004);
+emit_32(3274944545);
+emit_32(1120608322);
+emit_32(1100025011);
+emit_32(3274944545);
+emit_32(1121120289);
+emit_32(1099466277);
+emit_32(3274944545);
+emit_32(1121632256);
+emit_32(1098984771);
+emit_32(3274944545);
+emit_32(1122144223);
+emit_32(1098724776);
+emit_32(3274944545);
+emit_32(1122656322);
+emit_32(1097818073);
+emit_32(3274944545);
+emit_32(1123168289);
+emit_32(1098331770);
+emit_32(3274944545);
+emit_32(1123680256);
+emit_32(1097767007);
+emit_32(3274944545);
+emit_32(1124132848);
+emit_32(1095061891);
+emit_32(3274944545);
+emit_32(1124388897);
+emit_32(1092565693);
+emit_32(3274944545);
+emit_32(1124644880);
+emit_32(1089087839);
+emit_32(3274944545);
+emit_32(1124900864);
+emit_32(1088235430);
+emit_32(3274944545);
+emit_32(1125156848);
+emit_32(1089040317);
+emit_32(3274944545);
+emit_32(1125412897);
+emit_32(1087875957);
+emit_32(3274944545);
+emit_32(1125668880);
+emit_32(1086441128);
+emit_32(3274944545);
+emit_32(1125924864);
+emit_32(1085113966);
+emit_32(3274944545);
+emit_32(1126180848);
+emit_32(1081486648);
+emit_32(3274944545);
+emit_32(1126436897);
+emit_32(1075610470);
+emit_32(3274944545);
+emit_32(1126692880);
+emit_32(3191896348);
+emit_32(3274944545);
+emit_32(1126948864);
+emit_32(3225446032);
+emit_32(3274944545);
+emit_32(1127204848);
+emit_32(3232519202);
+emit_32(3274944545);
+emit_32(1127460897);
+emit_32(3234831920);
+emit_32(3274944545);
+emit_32(1127716880);
+emit_32(3239305806);
+emit_32(3274944545);
+emit_32(1127972864);
+emit_32(3241685497);
+emit_32(3274944545);
+emit_32(1128228848);
+emit_32(3242903208);
+emit_32(3274944545);
+emit_32(1128484897);
+emit_32(3244487397);
+emit_32(3274944545);
+emit_32(1128740880);
+emit_32(3245844673);
+emit_32(3274944545);
+emit_32(1128996864);
+emit_32(3246709067);
+emit_32(3274944545);
+emit_32(1129252848);
+emit_32(3246977188);
+emit_32(3274944545);
+emit_32(1129508897);
+emit_32(3246402830);
+emit_32(3274944545);
+emit_32(1129764880);
+emit_32(3246323034);
+emit_32(3274944545);
+emit_32(1130020864);
+emit_32(3244941011);
+emit_32(3274944545);
+emit_32(1130276848);
+emit_32(3243260877);
+emit_32(3274944545);
+emit_32(1130532897);
+emit_32(3242406707);
+emit_32(3274944545);
+emit_32(1130788880);
+emit_32(3239902383);
+emit_32(3274944545);
+emit_32(1131044864);
+emit_32(3235323031);
+emit_32(3274944545);
+emit_32(1131300848);
+emit_32(3229858692);
+emit_32(3274944545);
+emit_32(1131556897);
+emit_32(3221983215);
+emit_32(3274944545);
+emit_32(1131812880);
+emit_32(3204619249);
+emit_32(3274944545);
+emit_32(1132068864);
+emit_32(1069430331);
+emit_32(3274944545);
+emit_32(1081737216);
+emit_32(1106249096);
+emit_32(3275200528);
+emit_32(1090125824);
+emit_32(1106043942);
+emit_32(3275200528);
+emit_32(1094418484);
+emit_32(1105378410);
+emit_32(3275200528);
+emit_32(1098514432);
+emit_32(1104642467);
+emit_32(3275200528);
+emit_32(1100759066);
+emit_32(1104162010);
+emit_32(3275200528);
+emit_32(1102807040);
+emit_32(1103635153);
+emit_32(3275200528);
+emit_32(1104855066);
+emit_32(1102464995);
+emit_32(3275200528);
+emit_32(1106903040);
+emit_32(1101344958);
+emit_32(3275200528);
+emit_32(1108123661);
+emit_32(1100328835);
+emit_32(3275200528);
+emit_32(1109147648);
+emit_32(1099478755);
+emit_32(3275200528);
+emit_32(1110171661);
+emit_32(1099658219);
+emit_32(3275200528);
+emit_32(1111195648);
+emit_32(1099600285);
+emit_32(3275200528);
+emit_32(1112219661);
+emit_32(1099186464);
+emit_32(3275200528);
+emit_32(1113243648);
+emit_32(1099013135);
+emit_32(3275200528);
+emit_32(1114267661);
+emit_32(1099476763);
+emit_32(3275200528);
+emit_32(1115291648);
+emit_32(1099561540);
+emit_32(3275200528);
+emit_32(1116000263);
+emit_32(1099962673);
+emit_32(3275200528);
+emit_32(1116512256);
+emit_32(1100314837);
+emit_32(3275200528);
+emit_32(1117024263);
+emit_32(1100808192);
+emit_32(3275200528);
+emit_32(1117536256);
+emit_32(1100975545);
+emit_32(3275200528);
+emit_32(1118048263);
+emit_32(1100964744);
+emit_32(3275200528);
+emit_32(1118560256);
+emit_32(1100600364);
+emit_32(3275200528);
+emit_32(1119072263);
+emit_32(1100761426);
+emit_32(3275200528);
+emit_32(1119584256);
+emit_32(1100181144);
+emit_32(3275200528);
+emit_32(1120096263);
+emit_32(1098976749);
+emit_32(3275200528);
+emit_32(1120608322);
+emit_32(1097199518);
+emit_32(3275200528);
+emit_32(1121120289);
+emit_32(1096699347);
+emit_32(3275200528);
+emit_32(1121632256);
+emit_32(1096334128);
+emit_32(3275200528);
+emit_32(1122144223);
+emit_32(1096532414);
+emit_32(3275200528);
+emit_32(1122656322);
+emit_32(1096818675);
+emit_32(3275200528);
+emit_32(1123168289);
+emit_32(1097088578);
+emit_32(3275200528);
+emit_32(1123680256);
+emit_32(1096387291);
+emit_32(3275200528);
+emit_32(1124132848);
+emit_32(1094034810);
+emit_32(3275200528);
+emit_32(1124388897);
+emit_32(1090976691);
+emit_32(3275200528);
+emit_32(1124644880);
+emit_32(1088321497);
+emit_32(3275200528);
+emit_32(1124900864);
+emit_32(1088758712);
+emit_32(3275200528);
+emit_32(1125156848);
+emit_32(1087833868);
+emit_32(3275200528);
+emit_32(1125412897);
+emit_32(1084974107);
+emit_32(3275200528);
+emit_32(1125668880);
+emit_32(1084703805);
+emit_32(3275200528);
+emit_32(1125924864);
+emit_32(1084375328);
+emit_32(3275200528);
+emit_32(1126180848);
+emit_32(1079810898);
+emit_32(3275200528);
+emit_32(1126436897);
+emit_32(1075134836);
+emit_32(3275200528);
+emit_32(1126692880);
+emit_32(1055694338);
+emit_32(3275200528);
+emit_32(1126948864);
+emit_32(3222544916);
+emit_32(3275200528);
+emit_32(1127204848);
+emit_32(3231495477);
+emit_32(3275200528);
+emit_32(1127460897);
+emit_32(3235209219);
+emit_32(3275200528);
+emit_32(1127716880);
+emit_32(3239322940);
+emit_32(3275200528);
+emit_32(1127972864);
+emit_32(3240031389);
+emit_32(3275200528);
+emit_32(1128228848);
+emit_32(3242234426);
+emit_32(3275200528);
+emit_32(1128484897);
+emit_32(3243694988);
+emit_32(3275200528);
+emit_32(1128740880);
+emit_32(3244783934);
+emit_32(3275200528);
+emit_32(1128996864);
+emit_32(3245353415);
+emit_32(3275200528);
+emit_32(1129252848);
+emit_32(3245143910);
+emit_32(3275200528);
+emit_32(1129508897);
+emit_32(3243741859);
+emit_32(3275200528);
+emit_32(1129764880);
+emit_32(3244369117);
+emit_32(3275200528);
+emit_32(1130020864);
+emit_32(3244547480);
+emit_32(3275200528);
+emit_32(1130276848);
+emit_32(3242487867);
+emit_32(3275200528);
+emit_32(1130532897);
+emit_32(3241258307);
+emit_32(3275200528);
+emit_32(1130788880);
+emit_32(3238763409);
+emit_32(3275200528);
+emit_32(1131044864);
+emit_32(3232771615);
+emit_32(3275200528);
+emit_32(1131300848);
+emit_32(3224658636);
+emit_32(3275200528);
+emit_32(1131556897);
+emit_32(3205375013);
+emit_32(3275200528);
+emit_32(1131812880);
+emit_32(1065955266);
+emit_32(3275200528);
+emit_32(1132068864);
+emit_32(1078364786);
+emit_32(3275200528);
+emit_32(1081737216);
+emit_32(1105010622);
+emit_32(3275456512);
+emit_32(1090125824);
+emit_32(1104741191);
+emit_32(3275456512);
+emit_32(1094418484);
+emit_32(1104199864);
+emit_32(3275456512);
+emit_32(1098514432);
+emit_32(1103701895);
+emit_32(3275456512);
+emit_32(1100759066);
+emit_32(1103428898);
+emit_32(3275456512);
+emit_32(1102807040);
+emit_32(1102959031);
+emit_32(3275456512);
+emit_32(1104855066);
+emit_32(1102357044);
+emit_32(3275456512);
+emit_32(1106903040);
+emit_32(1100872784);
+emit_32(3275456512);
+emit_32(1108123661);
+emit_32(1099789972);
+emit_32(3275456512);
+emit_32(1109147648);
+emit_32(1099200043);
+emit_32(3275456512);
+emit_32(1110171661);
+emit_32(1098764622);
+emit_32(3275456512);
+emit_32(1111195648);
+emit_32(1098958399);
+emit_32(3275456512);
+emit_32(1112219661);
+emit_32(1098447743);
+emit_32(3275456512);
+emit_32(1113243648);
+emit_32(1098347184);
+emit_32(3275456512);
+emit_32(1114267661);
+emit_32(1099067032);
+emit_32(3275456512);
+emit_32(1115291648);
+emit_32(1099311664);
+emit_32(3275456512);
+emit_32(1116000263);
+emit_32(1099114584);
+emit_32(3275456512);
+emit_32(1116512256);
+emit_32(1099262119);
+emit_32(3275456512);
+emit_32(1117024263);
+emit_32(1099307522);
+emit_32(3275456512);
+emit_32(1117536256);
+emit_32(1099567150);
+emit_32(3275456512);
+emit_32(1118048263);
+emit_32(1099285555);
+emit_32(3275456512);
+emit_32(1118560256);
+emit_32(1099184367);
+emit_32(3275456512);
+emit_32(1119072263);
+emit_32(1099025665);
+emit_32(3275456512);
+emit_32(1119584256);
+emit_32(1097936771);
+emit_32(3275456512);
+emit_32(1120096263);
+emit_32(1097086062);
+emit_32(3275456512);
+emit_32(1120608322);
+emit_32(1095166329);
+emit_32(3275456512);
+emit_32(1121120289);
+emit_32(1093547013);
+emit_32(3275456512);
+emit_32(1121632256);
+emit_32(1094611632);
+emit_32(3275456512);
+emit_32(1122144223);
+emit_32(1095301176);
+emit_32(3275456512);
+emit_32(1122656322);
+emit_32(1096040002);
+emit_32(3275456512);
+emit_32(1123168289);
+emit_32(1096486905);
+emit_32(3275456512);
+emit_32(1123680256);
+emit_32(1095536371);
+emit_32(3275456512);
+emit_32(1124132848);
+emit_32(1093119718);
+emit_32(3275456512);
+emit_32(1124388897);
+emit_32(1091308366);
+emit_32(3275456512);
+emit_32(1124644880);
+emit_32(1088220394);
+emit_32(3275456512);
+emit_32(1124900864);
+emit_32(1088246482);
+emit_32(3275456512);
+emit_32(1125156848);
+emit_32(1087966198);
+emit_32(3275456512);
+emit_32(1125412897);
+emit_32(1084761016);
+emit_32(3275456512);
+emit_32(1125668880);
+emit_32(1082433638);
+emit_32(3275456512);
+emit_32(1125924864);
+emit_32(1080387489);
+emit_32(3275456512);
+emit_32(1126180848);
+emit_32(1080768877);
+emit_32(3275456512);
+emit_32(1126436897);
+emit_32(1072749536);
+emit_32(3275456512);
+emit_32(1126692880);
+emit_32(1066725424);
+emit_32(3275456512);
+emit_32(1126948864);
+emit_32(3211315758);
+emit_32(3275456512);
+emit_32(1127204848);
+emit_32(3229615254);
+emit_32(3275456512);
+emit_32(1127460897);
+emit_32(3234924069);
+emit_32(3275456512);
+emit_32(1127716880);
+emit_32(3238308600);
+emit_32(3275456512);
+emit_32(1127972864);
+emit_32(3239071816);
+emit_32(3275456512);
+emit_32(1128228848);
+emit_32(3240224516);
+emit_32(3275456512);
+emit_32(1128484897);
+emit_32(3241289869);
+emit_32(3275456512);
+emit_32(1128740880);
+emit_32(3242705866);
+emit_32(3275456512);
+emit_32(1128996864);
+emit_32(3242964969);
+emit_32(3275456512);
+emit_32(1129252848);
+emit_32(3243192091);
+emit_32(3275456512);
+emit_32(1129508897);
+emit_32(3242061516);
+emit_32(3275456512);
+emit_32(1129764880);
+emit_32(3242460709);
+emit_32(3275456512);
+emit_32(1130020864);
+emit_32(3243083563);
+emit_32(3275456512);
+emit_32(1130276848);
+emit_32(3240930627);
+emit_32(3275456512);
+emit_32(1130532897);
+emit_32(3238871108);
+emit_32(3275456512);
+emit_32(1130788880);
+emit_32(3236675631);
+emit_32(3275456512);
+emit_32(1131044864);
+emit_32(3232208551);
+emit_32(3275456512);
+emit_32(1131300848);
+emit_32(3223881892);
+emit_32(3275456512);
+emit_32(1131556897);
+emit_32(1056471794);
+emit_32(3275456512);
+emit_32(1131812880);
+emit_32(1077025041);
+emit_32(3275456512);
+emit_32(1132068864);
+emit_32(1081975788);
+emit_32(3275456512);
+emit_32(1081737216);
+emit_32(1103817710);
+emit_32(3275712496);
+emit_32(1090125824);
+emit_32(1103479177);
+emit_32(3275712496);
+emit_32(1094418484);
+emit_32(1103628337);
+emit_32(3275712496);
+emit_32(1098514432);
+emit_32(1103194908);
+emit_32(3275712496);
+emit_32(1100759066);
+emit_32(1102441087);
+emit_32(3275712496);
+emit_32(1102807040);
+emit_32(1101777548);
+emit_32(3275712496);
+emit_32(1104855066);
+emit_32(1101550322);
+emit_32(3275712496);
+emit_32(1106903040);
+emit_32(1100130340);
+emit_32(3275712496);
+emit_32(1108123661);
+emit_32(1099405250);
+emit_32(3275712496);
+emit_32(1109147648);
+emit_32(1098058092);
+emit_32(3275712496);
+emit_32(1110171661);
+emit_32(1097423074);
+emit_32(3275712496);
+emit_32(1111195648);
+emit_32(1097055863);
+emit_32(3275712496);
+emit_32(1112219661);
+emit_32(1096882743);
+emit_32(3275712496);
+emit_32(1113243648);
+emit_32(1098289303);
+emit_32(3275712496);
+emit_32(1114267661);
+emit_32(1097937610);
+emit_32(3275712496);
+emit_32(1115291648);
+emit_32(1097533279);
+emit_32(3275712496);
+emit_32(1116000263);
+emit_32(1097752851);
+emit_32(3275712496);
+emit_32(1116512256);
+emit_32(1097273547);
+emit_32(3275712496);
+emit_32(1117024263);
+emit_32(1097170787);
+emit_32(3275712496);
+emit_32(1117536256);
+emit_32(1096374708);
+emit_32(3275712496);
+emit_32(1118048263);
+emit_32(1096180197);
+emit_32(3275712496);
+emit_32(1118560256);
+emit_32(1097218602);
+emit_32(3275712496);
+emit_32(1119072263);
+emit_32(1096138883);
+emit_32(3275712496);
+emit_32(1119584256);
+emit_32(1096076912);
+emit_32(3275712496);
+emit_32(1120096263);
+emit_32(1094562034);
+emit_32(3275712496);
+emit_32(1120608322);
+emit_32(1092095962);
+emit_32(3275712496);
+emit_32(1121120289);
+emit_32(1091662502);
+emit_32(3275712496);
+emit_32(1121632256);
+emit_32(1092889556);
+emit_32(3275712496);
+emit_32(1122144223);
+emit_32(1094008177);
+emit_32(3275712496);
+emit_32(1122656322);
+emit_32(1094597791);
+emit_32(3275712496);
+emit_32(1123168289);
+emit_32(1094669828);
+emit_32(3275712496);
+emit_32(1123680256);
+emit_32(1093668333);
+emit_32(3275712496);
+emit_32(1124132848);
+emit_32(1092690012);
+emit_32(3275712496);
+emit_32(1124388897);
+emit_32(1091404793);
+emit_32(3275712496);
+emit_32(1124644880);
+emit_32(1089616677);
+emit_32(3275712496);
+emit_32(1124900864);
+emit_32(1087718650);
+emit_32(3275712496);
+emit_32(1125156848);
+emit_32(1085433635);
+emit_32(3275712496);
+emit_32(1125412897);
+emit_32(1083051984);
+emit_32(3275712496);
+emit_32(1125668880);
+emit_32(1080094894);
+emit_32(3275712496);
+emit_32(1125924864);
+emit_32(1077582632);
+emit_32(3275712496);
+emit_32(1126180848);
+emit_32(1079746432);
+emit_32(3275712496);
+emit_32(1126436897);
+emit_32(1073545866);
+emit_32(3275712496);
+emit_32(1126692880);
+emit_32(1068480405);
+emit_32(3275712496);
+emit_32(1126948864);
+emit_32(3205219354);
+emit_32(3275712496);
+emit_32(1127204848);
+emit_32(3228713018);
+emit_32(3275712496);
+emit_32(1127460897);
+emit_32(3234007257);
+emit_32(3275712496);
+emit_32(1127716880);
+emit_32(3234765252);
+emit_32(3275712496);
+emit_32(1127972864);
+emit_32(3236479652);
+emit_32(3275712496);
+emit_32(1128228848);
+emit_32(3239043033);
+emit_32(3275712496);
+emit_32(1128484897);
+emit_32(3239994091);
+emit_32(3275712496);
+emit_32(1128740880);
+emit_32(3241107312);
+emit_32(3275712496);
+emit_32(1128996864);
+emit_32(3240979281);
+emit_32(3275712496);
+emit_32(1129252848);
+emit_32(3240651496);
+emit_32(3275712496);
+emit_32(1129508897);
+emit_32(3240242971);
+emit_32(3275712496);
+emit_32(1129764880);
+emit_32(3240761491);
+emit_32(3275712496);
+emit_32(1130020864);
+emit_32(3240982007);
+emit_32(3275712496);
+emit_32(1130276848);
+emit_32(3239091351);
+emit_32(3275712496);
+emit_32(1130532897);
+emit_32(3236735400);
+emit_32(3275712496);
+emit_32(1130788880);
+emit_32(3231377575);
+emit_32(3275712496);
+emit_32(1131044864);
+emit_32(3227422808);
+emit_32(3275712496);
+emit_32(1131300848);
+emit_32(3218146098);
+emit_32(3275712496);
+emit_32(1131556897);
+emit_32(1069112487);
+emit_32(3275712496);
+emit_32(1131812880);
+emit_32(1077648441);
+emit_32(3275712496);
+emit_32(1132068864);
+emit_32(1082214129);
+emit_32(3275712496);
+emit_32(1081737216);
+emit_32(1102629726);
+emit_32(3275968545);
+emit_32(1090125824);
+emit_32(1102698722);
+emit_32(3275968545);
+emit_32(1094418484);
+emit_32(1102802741);
+emit_32(3275968545);
+emit_32(1098514432);
+emit_32(1102285373);
+emit_32(3275968545);
+emit_32(1100759066);
+emit_32(1101786251);
+emit_32(3275968545);
+emit_32(1102807040);
+emit_32(1100824812);
+emit_32(3275968545);
+emit_32(1104855066);
+emit_32(1100025640);
+emit_32(3275968545);
+emit_32(1106903040);
+emit_32(1099634940);
+emit_32(3275968545);
+emit_32(1108123661);
+emit_32(1099046584);
+emit_32(3275968545);
+emit_32(1109147648);
+emit_32(1096636223);
+emit_32(3275968545);
+emit_32(1110171661);
+emit_32(1095513303);
+emit_32(3275968545);
+emit_32(1111195648);
+emit_32(1095867407);
+emit_32(3275968545);
+emit_32(1112219661);
+emit_32(1096126929);
+emit_32(3275968545);
+emit_32(1113243648);
+emit_32(1096604870);
+emit_32(3275968545);
+emit_32(1114267661);
+emit_32(1095827037);
+emit_32(3275968545);
+emit_32(1115291648);
+emit_32(1095170838);
+emit_32(3275968545);
+emit_32(1116000263);
+emit_32(1095497679);
+emit_32(3275968545);
+emit_32(1116512256);
+emit_32(1095025715);
+emit_32(3275968545);
+emit_32(1117024263);
+emit_32(1094083884);
+emit_32(3275968545);
+emit_32(1117536256);
+emit_32(1094884996);
+emit_32(3275968545);
+emit_32(1118048263);
+emit_32(1094938054);
+emit_32(3275968545);
+emit_32(1118560256);
+emit_32(1094814322);
+emit_32(3275968545);
+emit_32(1119072263);
+emit_32(1094028414);
+emit_32(3275968545);
+emit_32(1119584256);
+emit_32(1093868087);
+emit_32(3275968545);
+emit_32(1120096263);
+emit_32(1091898725);
+emit_32(3275968545);
+emit_32(1120608322);
+emit_32(1091588902);
+emit_32(3275968545);
+emit_32(1121120289);
+emit_32(1090929599);
+emit_32(3275968545);
+emit_32(1121632256);
+emit_32(1091279268);
+emit_32(3275968545);
+emit_32(1122144223);
+emit_32(1091962195);
+emit_32(3275968545);
+emit_32(1122656322);
+emit_32(1092164916);
+emit_32(3275968545);
+emit_32(1123168289);
+emit_32(1092135976);
+emit_32(3275968545);
+emit_32(1123680256);
+emit_32(1091891196);
+emit_32(3275968545);
+emit_32(1124132848);
+emit_32(1091591995);
+emit_32(3275968545);
+emit_32(1124388897);
+emit_32(1091090063);
+emit_32(3275968545);
+emit_32(1124644880);
+emit_32(1090340509);
+emit_32(3275968545);
+emit_32(1124900864);
+emit_32(1086101389);
+emit_32(3275968545);
+emit_32(1125156848);
+emit_32(1083757927);
+emit_32(3275968545);
+emit_32(1125412897);
+emit_32(1078075547);
+emit_32(3275968545);
+emit_32(1125668880);
+emit_32(1076426137);
+emit_32(3275968545);
+emit_32(1125924864);
+emit_32(1072504840);
+emit_32(3275968545);
+emit_32(1126180848);
+emit_32(1076195660);
+emit_32(3275968545);
+emit_32(1126436897);
+emit_32(1072621609);
+emit_32(3275968545);
+emit_32(1126692880);
+emit_32(1056034915);
+emit_32(3275968545);
+emit_32(1126948864);
+emit_32(3209808342);
+emit_32(3275968545);
+emit_32(1127204848);
+emit_32(3226594391);
+emit_32(3275968545);
+emit_32(1127460897);
+emit_32(3229765557);
+emit_32(3275968545);
+emit_32(1127716880);
+emit_32(3232195653);
+emit_32(3275968545);
+emit_32(1127972864);
+emit_32(3233670937);
+emit_32(3275968545);
+emit_32(1128228848);
+emit_32(3236746137);
+emit_32(3275968545);
+emit_32(1128484897);
+emit_32(3239602763);
+emit_32(3275968545);
+emit_32(1128740880);
+emit_32(3239120397);
+emit_32(3275968545);
+emit_32(1128996864);
+emit_32(3238680404);
+emit_32(3275968545);
+emit_32(1129252848);
+emit_32(3238748498);
+emit_32(3275968545);
+emit_32(1129508897);
+emit_32(3237309495);
+emit_32(3275968545);
+emit_32(1129764880);
+emit_32(3238233637);
+emit_32(3275968545);
+emit_32(1130020864);
+emit_32(3238814642);
+emit_32(3275968545);
+emit_32(1130276848);
+emit_32(3237583887);
+emit_32(3275968545);
+emit_32(1130532897);
+emit_32(3232326054);
+emit_32(3275968545);
+emit_32(1130788880);
+emit_32(3225982694);
+emit_32(3275968545);
+emit_32(1131044864);
+emit_32(3216861550);
+emit_32(3275968545);
+emit_32(1131300848);
+emit_32(1026734803);
+emit_32(3275968545);
+emit_32(1131556897);
+emit_32(1070114842);
+emit_32(3275968545);
+emit_32(1131812880);
+emit_32(1079071526);
+emit_32(3275968545);
+emit_32(1132068864);
+emit_32(1085031464);
+emit_32(3275968545);
+emit_32(1081737216);
+emit_32(1101834591);
+emit_32(3276224528);
+emit_32(1090125824);
+emit_32(1101837579);
+emit_32(3276224528);
+emit_32(1094418484);
+emit_32(1102082264);
+emit_32(3276224528);
+emit_32(1098514432);
+emit_32(1101628441);
+emit_32(3276224528);
+emit_32(1100759066);
+emit_32(1100985349);
+emit_32(3276224528);
+emit_32(1102807040);
+emit_32(1100055367);
+emit_32(3276224528);
+emit_32(1104855066);
+emit_32(1099637142);
+emit_32(3276224528);
+emit_32(1106903040);
+emit_32(1098680317);
+emit_32(3276224528);
+emit_32(1108123661);
+emit_32(1096761947);
+emit_32(3276224528);
+emit_32(1109147648);
+emit_32(1094480980);
+emit_32(3276224528);
+emit_32(1110171661);
+emit_32(1095392087);
+emit_32(3276224528);
+emit_32(1111195648);
+emit_32(1094890029);
+emit_32(3276224528);
+emit_32(1112219661);
+emit_32(1094984506);
+emit_32(3276224528);
+emit_32(1113243648);
+emit_32(1094746898);
+emit_32(3276224528);
+emit_32(1114267661);
+emit_32(1095240253);
+emit_32(3276224528);
+emit_32(1115291648);
+emit_32(1094944765);
+emit_32(3276224528);
+emit_32(1116000263);
+emit_32(1093070435);
+emit_32(3276224528);
+emit_32(1116512256);
+emit_32(1092835659);
+emit_32(3276224528);
+emit_32(1117024263);
+emit_32(1092160439);
+emit_32(3276224528);
+emit_32(1117536256);
+emit_32(1093144779);
+emit_32(3276224528);
+emit_32(1118048263);
+emit_32(1093574171);
+emit_32(3276224528);
+emit_32(1118560256);
+emit_32(1093277109);
+emit_32(3276224528);
+emit_32(1119072263);
+emit_32(1093819957);
+emit_32(3276224528);
+emit_32(1119584256);
+emit_32(1092843628);
+emit_32(3276224528);
+emit_32(1120096263);
+emit_32(1091116372);
+emit_32(3276224528);
+emit_32(1120608322);
+emit_32(1091376859);
+emit_32(3276224528);
+emit_32(1121120289);
+emit_32(1090364648);
+emit_32(3276224528);
+emit_32(1121632256);
+emit_32(1090493874);
+emit_32(3276224528);
+emit_32(1122144223);
+emit_32(1090596026);
+emit_32(3276224528);
+emit_32(1122656322);
+emit_32(1090953811);
+emit_32(3276224528);
+emit_32(1123168289);
+emit_32(1090983737);
+emit_32(3276224528);
+emit_32(1123680256);
+emit_32(1091497519);
+emit_32(3276224528);
+emit_32(1124132848);
+emit_32(1090542549);
+emit_32(3276224528);
+emit_32(1124388897);
+emit_32(1090078156);
+emit_32(3276224528);
+emit_32(1124644880);
+emit_32(1088934054);
+emit_32(3276224528);
+emit_32(1124900864);
+emit_32(1087697720);
+emit_32(3276224528);
+emit_32(1125156848);
+emit_32(1085563428);
+emit_32(3276224528);
+emit_32(1125412897);
+emit_32(1080952084);
+emit_32(3276224528);
+emit_32(1125668880);
+emit_32(1073321471);
+emit_32(3276224528);
+emit_32(1125924864);
+emit_32(1070202670);
+emit_32(3276224528);
+emit_32(1126180848);
+emit_32(1076022141);
+emit_32(3276224528);
+emit_32(1126436897);
+emit_32(1074767541);
+emit_32(3276224528);
+emit_32(1126692880);
+emit_32(1043406403);
+emit_32(3276224528);
+emit_32(1126948864);
+emit_32(3214856505);
+emit_32(3276224528);
+emit_32(1127204848);
+emit_32(3221624644);
+emit_32(3276224528);
+emit_32(1127460897);
+emit_32(3223744907);
+emit_32(3276224528);
+emit_32(1127716880);
+emit_32(3226922931);
+emit_32(3276224528);
+emit_32(1127972864);
+emit_32(3231769868);
+emit_32(3276224528);
+emit_32(1128228848);
+emit_32(3235400940);
+emit_32(3276224528);
+emit_32(1128484897);
+emit_32(3237712778);
+emit_32(3276224528);
+emit_32(1128740880);
+emit_32(3237178570);
+emit_32(3276224528);
+emit_32(1128996864);
+emit_32(3236152161);
+emit_32(3276224528);
+emit_32(1129252848);
+emit_32(3236365358);
+emit_32(3276224528);
+emit_32(1129508897);
+emit_32(3234550776);
+emit_32(3276224528);
+emit_32(1129764880);
+emit_32(3234356705);
+emit_32(3276224528);
+emit_32(1130020864);
+emit_32(3236727662);
+emit_32(3276224528);
+emit_32(1130276848);
+emit_32(3234020867);
+emit_32(3276224528);
+emit_32(1130532897);
+emit_32(3229942851);
+emit_32(3276224528);
+emit_32(1130788880);
+emit_32(3218905099);
+emit_32(3276224528);
+emit_32(1131044864);
+emit_32(1046590114);
+emit_32(3276224528);
+emit_32(1131300848);
+emit_32(1071351155);
+emit_32(3276224528);
+emit_32(1131556897);
+emit_32(1075089706);
+emit_32(3276224528);
+emit_32(1131812880);
+emit_32(1081837670);
+emit_32(3276224528);
+emit_32(1132068864);
+emit_32(1088418344);
+emit_32(3276224528);
+emit_32(1081737216);
+emit_32(1101171471);
+emit_32(3276480512);
+emit_32(1090125824);
+emit_32(1100482504);
+emit_32(3276480512);
+emit_32(1094418484);
+emit_32(1100941623);
+emit_32(3276480512);
+emit_32(1098514432);
+emit_32(1100408685);
+emit_32(3276480512);
+emit_32(1100759066);
+emit_32(1099563690);
+emit_32(3276480512);
+emit_32(1102807040);
+emit_32(1099315859);
+emit_32(3276480512);
+emit_32(1104855066);
+emit_32(1099149083);
+emit_32(3276480512);
+emit_32(1106903040);
+emit_32(1096909482);
+emit_32(3276480512);
+emit_32(1108123661);
+emit_32(1095417463);
+emit_32(3276480512);
+emit_32(1109147648);
+emit_32(1095014180);
+emit_32(3276480512);
+emit_32(1110171661);
+emit_32(1094740188);
+emit_32(3276480512);
+emit_32(1111195648);
+emit_32(1094116495);
+emit_32(3276480512);
+emit_32(1112219661);
+emit_32(1094245994);
+emit_32(3276480512);
+emit_32(1113243648);
+emit_32(1093480953);
+emit_32(3276480512);
+emit_32(1114267661);
+emit_32(1095278002);
+emit_32(3276480512);
+emit_32(1115291648);
+emit_32(1094897264);
+emit_32(3276480512);
+emit_32(1116000263);
+emit_32(1092706055);
+emit_32(3276480512);
+emit_32(1116512256);
+emit_32(1091291358);
+emit_32(3276480512);
+emit_32(1117024263);
+emit_32(1090889429);
+emit_32(3276480512);
+emit_32(1117536256);
+emit_32(1091305986);
+emit_32(3276480512);
+emit_32(1118048263);
+emit_32(1092298620);
+emit_32(3276480512);
+emit_32(1118560256);
+emit_32(1092551684);
+emit_32(3276480512);
+emit_32(1119072263);
+emit_32(1092611295);
+emit_32(3276480512);
+emit_32(1119584256);
+emit_32(1091871042);
+emit_32(3276480512);
+emit_32(1120096263);
+emit_32(1090718773);
+emit_32(3276480512);
+emit_32(1120608322);
+emit_32(1090155373);
+emit_32(3276480512);
+emit_32(1121120289);
+emit_32(1087795930);
+emit_32(3276480512);
+emit_32(1121632256);
+emit_32(1087063877);
+emit_32(3276480512);
+emit_32(1122144223);
+emit_32(1088019466);
+emit_32(3276480512);
+emit_32(1122656322);
+emit_32(1090277322);
+emit_32(3276480512);
+emit_32(1123168289);
+emit_32(1091326066);
+emit_32(3276480512);
+emit_32(1123680256);
+emit_32(1091923220);
+emit_32(3276480512);
+emit_32(1124132848);
+emit_32(1091702285);
+emit_32(3276480512);
+emit_32(1124388897);
+emit_32(1089725142);
+emit_32(3276480512);
+emit_32(1124644880);
+emit_32(1087013462);
+emit_32(3276480512);
+emit_32(1124900864);
+emit_32(1086960152);
+emit_32(3276480512);
+emit_32(1125156848);
+emit_32(1085873156);
+emit_32(3276480512);
+emit_32(1125412897);
+emit_32(1082634587);
+emit_32(3276480512);
+emit_32(1125668880);
+emit_32(1076934109);
+emit_32(3276480512);
+emit_32(1125924864);
+emit_32(1073398227);
+emit_32(3276480512);
+emit_32(1126180848);
+emit_32(1074881249);
+emit_32(3276480512);
+emit_32(1126436897);
+emit_32(1074681558);
+emit_32(3276480512);
+emit_32(1126692880);
+emit_32(1066383253);
+emit_32(3276480512);
+emit_32(1126948864);
+emit_32(3190627924);
+emit_32(3276480512);
+emit_32(1127204848);
+emit_32(3210951893);
+emit_32(3276480512);
+emit_32(1127460897);
+emit_32(3211101009);
+emit_32(3276480512);
+emit_32(1127716880);
+emit_32(3222970470);
+emit_32(3276480512);
+emit_32(1127972864);
+emit_32(3228079929);
+emit_32(3276480512);
+emit_32(1128228848);
+emit_32(3233825706);
+emit_32(3276480512);
+emit_32(1128484897);
+emit_32(3233542381);
+emit_32(3276480512);
+emit_32(1128740880);
+emit_32(3232104805);
+emit_32(3276480512);
+emit_32(1128996864);
+emit_32(3230112405);
+emit_32(3276480512);
+emit_32(1129252848);
+emit_32(3231152970);
+emit_32(3276480512);
+emit_32(1129508897);
+emit_32(3231464292);
+emit_32(3276480512);
+emit_32(1129764880);
+emit_32(3231339491);
+emit_32(3276480512);
+emit_32(1130020864);
+emit_32(3231844149);
+emit_32(3276480512);
+emit_32(1130276848);
+emit_32(3231999318);
+emit_32(3276480512);
+emit_32(1130532897);
+emit_32(3224338359);
+emit_32(3276480512);
+emit_32(1130788880);
+emit_32(1034571239);
+emit_32(3276480512);
+emit_32(1131044864);
+emit_32(1073783180);
+emit_32(3276480512);
+emit_32(1131300848);
+emit_32(1077514055);
+emit_32(3276480512);
+emit_32(1131556897);
+emit_32(1081268167);
+emit_32(3276480512);
+emit_32(1131812880);
+emit_32(1085146577);
+emit_32(3276480512);
+emit_32(1132068864);
+emit_32(1091014199);
+emit_32(3276480512);
+emit_32(1081737216);
+emit_32(1100121322);
+emit_32(3276736496);
+emit_32(1090125824);
+emit_32(1099396180);
+emit_32(3276736496);
+emit_32(1094418484);
+emit_32(1099281098);
+emit_32(3276736496);
+emit_32(1098514432);
+emit_32(1098942251);
+emit_32(3276736496);
+emit_32(1100759066);
+emit_32(1098739981);
+emit_32(3276736496);
+emit_32(1102807040);
+emit_32(1097837366);
+emit_32(3276736496);
+emit_32(1104855066);
+emit_32(1096300469);
+emit_32(3276736496);
+emit_32(1106903040);
+emit_32(1095044694);
+emit_32(3276736496);
+emit_32(1108123661);
+emit_32(1095162764);
+emit_32(3276736496);
+emit_32(1109147648);
+emit_32(1095334730);
+emit_32(3276736496);
+emit_32(1110171661);
+emit_32(1095152697);
+emit_32(3276736496);
+emit_32(1111195648);
+emit_32(1094407894);
+emit_32(3276736496);
+emit_32(1112219661);
+emit_32(1093563371);
+emit_32(3276736496);
+emit_32(1113243648);
+emit_32(1092844257);
+emit_32(3276736496);
+emit_32(1114267661);
+emit_32(1093382386);
+emit_32(3276736496);
+emit_32(1115291648);
+emit_32(1092541009);
+emit_32(3276736496);
+emit_32(1116000263);
+emit_32(1091687762);
+emit_32(3276736496);
+emit_32(1116512256);
+emit_32(1088040290);
+emit_32(3276736496);
+emit_32(1117024263);
+emit_32(1088119038);
+emit_32(3276736496);
+emit_32(1117536256);
+emit_32(1088383007);
+emit_32(3276736496);
+emit_32(1118048263);
+emit_32(1090949575);
+emit_32(3276736496);
+emit_32(1118560256);
+emit_32(1091368575);
+emit_32(3276736496);
+emit_32(1119072263);
+emit_32(1091839008);
+emit_32(3276736496);
+emit_32(1119584256);
+emit_32(1091040497);
+emit_32(3276736496);
+emit_32(1120096263);
+emit_32(1088659118);
+emit_32(3276736496);
+emit_32(1120608322);
+emit_32(1086563119);
+emit_32(3276736496);
+emit_32(1121120289);
+emit_32(1083266480);
+emit_32(3276736496);
+emit_32(1121632256);
+emit_32(1082063323);
+emit_32(3276736496);
+emit_32(1122144223);
+emit_32(1086818322);
+emit_32(3276736496);
+emit_32(1122656322);
+emit_32(1089302105);
+emit_32(3276736496);
+emit_32(1123168289);
+emit_32(1090938523);
+emit_32(3276736496);
+emit_32(1123680256);
+emit_32(1091787911);
+emit_32(3276736496);
+emit_32(1124132848);
+emit_32(1091673658);
+emit_32(3276736496);
+emit_32(1124388897);
+emit_32(1091250789);
+emit_32(3276736496);
+emit_32(1124644880);
+emit_32(1088596245);
+emit_32(3276736496);
+emit_32(1124900864);
+emit_32(1086620707);
+emit_32(3276736496);
+emit_32(1125156848);
+emit_32(1083915591);
+emit_32(3276736496);
+emit_32(1125412897);
+emit_32(1083242195);
+emit_32(3276736496);
+emit_32(1125668880);
+emit_32(1083662443);
+emit_32(3276736496);
+emit_32(1125924864);
+emit_32(1080051525);
+emit_32(3276736496);
+emit_32(1126180848);
+emit_32(1078023915);
+emit_32(3276736496);
+emit_32(1126436897);
+emit_32(1076481418);
+emit_32(3276736496);
+emit_32(1126692880);
+emit_32(1073065367);
+emit_32(3276736496);
+emit_32(1126948864);
+emit_32(1068007204);
+emit_32(3276736496);
+emit_32(1127204848);
+emit_32(1059175291);
+emit_32(3276736496);
+emit_32(1127460897);
+emit_32(3191698780);
+emit_32(3276736496);
+emit_32(1127716880);
+emit_32(3213224166);
+emit_32(3276736496);
+emit_32(1127972864);
+emit_32(3223725026);
+emit_32(3276736496);
+emit_32(1128228848);
+emit_32(3228029430);
+emit_32(3276736496);
+emit_32(1128484897);
+emit_32(3226148159);
+emit_32(3276736496);
+emit_32(1128740880);
+emit_32(3225760353);
+emit_32(3276736496);
+emit_32(1128996864);
+emit_32(3222121585);
+emit_32(3276736496);
+emit_32(1129252848);
+emit_32(3225539356);
+emit_32(3276736496);
+emit_32(1129508897);
+emit_32(3229882998);
+emit_32(3276736496);
+emit_32(1129764880);
+emit_32(3227190108);
+emit_32(3276736496);
+emit_32(1130020864);
+emit_32(3228912960);
+emit_32(3276736496);
+emit_32(1130276848);
+emit_32(3228921307);
+emit_32(3276736496);
+emit_32(1130532897);
+emit_32(3219664184);
+emit_32(3276736496);
+emit_32(1130788880);
+emit_32(1065871800);
+emit_32(3276736496);
+emit_32(1131044864);
+emit_32(1077962552);
+emit_32(3276736496);
+emit_32(1131300848);
+emit_32(1082028972);
+emit_32(3276736496);
+emit_32(1131556897);
+emit_32(1084764119);
+emit_32(3276736496);
+emit_32(1131812880);
+emit_32(1086553745);
+emit_32(3276736496);
+emit_32(1132068864);
+emit_32(1092505651);
+emit_32(3276736496);
+emit_32(1081737216);
+emit_32(1099020213);
+emit_32(3276992545);
+emit_32(1090125824);
+emit_32(1098714186);
+emit_32(3276992545);
+emit_32(1094418484);
+emit_32(1097828034);
+emit_32(3276992545);
+emit_32(1098514432);
+emit_32(1097529085);
+emit_32(3276992545);
+emit_32(1100759066);
+emit_32(1097159252);
+emit_32(3276992545);
+emit_32(1102807040);
+emit_32(1096861667);
+emit_32(3276992545);
+emit_32(1104855066);
+emit_32(1094929036);
+emit_32(3276992545);
+emit_32(1106903040);
+emit_32(1095502502);
+emit_32(3276992545);
+emit_32(1108123661);
+emit_32(1095915851);
+emit_32(3276992545);
+emit_32(1109147648);
+emit_32(1095718928);
+emit_32(3276992545);
+emit_32(1110171661);
+emit_32(1095125539);
+emit_32(3276992545);
+emit_32(1111195648);
+emit_32(1094669094);
+emit_32(3276992545);
+emit_32(1112219661);
+emit_32(1093180431);
+emit_32(3276992545);
+emit_32(1113243648);
+emit_32(1091863545);
+emit_32(3276992545);
+emit_32(1114267661);
+emit_32(1091778558);
+emit_32(3276992545);
+emit_32(1115291648);
+emit_32(1091298751);
+emit_32(3276992545);
+emit_32(1116000263);
+emit_32(1089644695);
+emit_32(3276992545);
+emit_32(1116512256);
+emit_32(1086301730);
+emit_32(3276992545);
+emit_32(1117024263);
+emit_32(1086163570);
+emit_32(3276992545);
+emit_32(1117536256);
+emit_32(1086958244);
+emit_32(3276992545);
+emit_32(1118048263);
+emit_32(1089172396);
+emit_32(3276992545);
+emit_32(1118560256);
+emit_32(1089779354);
+emit_32(3276992545);
+emit_32(1119072263);
+emit_32(1090296616);
+emit_32(3276992545);
+emit_32(1119584256);
+emit_32(1089775033);
+emit_32(3276992545);
+emit_32(1120096263);
+emit_32(1085622735);
+emit_32(3276992545);
+emit_32(1120608322);
+emit_32(1082413128);
+emit_32(3276992545);
+emit_32(1121120289);
+emit_32(1076491106);
+emit_32(3276992545);
+emit_32(1121632256);
+emit_32(1082562760);
+emit_32(3276992545);
+emit_32(1122144223);
+emit_32(1085964047);
+emit_32(3276992545);
+emit_32(1122656322);
+emit_32(1088268397);
+emit_32(3276992545);
+emit_32(1123168289);
+emit_32(1091065421);
+emit_32(3276992545);
+emit_32(1123680256);
+emit_32(1091881444);
+emit_32(3276992545);
+emit_32(1124132848);
+emit_32(1092768655);
+emit_32(3276992545);
+emit_32(1124388897);
+emit_32(1091984761);
+emit_32(3276992545);
+emit_32(1124644880);
+emit_32(1091281397);
+emit_32(3276992545);
+emit_32(1124900864);
+emit_32(1090331513);
+emit_32(3276992545);
+emit_32(1125156848);
+emit_32(1084916184);
+emit_32(3276992545);
+emit_32(1125412897);
+emit_32(1084859729);
+emit_32(3276992545);
+emit_32(1125668880);
+emit_32(1084191807);
+emit_32(3276992545);
+emit_32(1125924864);
+emit_32(1084800757);
+emit_32(3276992545);
+emit_32(1126180848);
+emit_32(1082243678);
+emit_32(3276992545);
+emit_32(1126436897);
+emit_32(1082662102);
+emit_32(3276992545);
+emit_32(1126692880);
+emit_32(1080485887);
+emit_32(3276992545);
+emit_32(1126948864);
+emit_32(1077722135);
+emit_32(3276992545);
+emit_32(1127204848);
+emit_32(1073495534);
+emit_32(3276992545);
+emit_32(1127460897);
+emit_32(1067137892);
+emit_32(3276992545);
+emit_32(1127716880);
+emit_32(3201755546);
+emit_32(3276992545);
+emit_32(1127972864);
+emit_32(3219314631);
+emit_32(3276992545);
+emit_32(1128228848);
+emit_32(3220786161);
+emit_32(3276992545);
+emit_32(1128484897);
+emit_32(3215535647);
+emit_32(3276992545);
+emit_32(1128740880);
+emit_32(3219082434);
+emit_32(3276992545);
+emit_32(1128996864);
+emit_32(3207719209);
+emit_32(3276992545);
+emit_32(1129252848);
+emit_32(3219319329);
+emit_32(3276992545);
+emit_32(1129508897);
+emit_32(3222885200);
+emit_32(3276992545);
+emit_32(1129764880);
+emit_32(3223784878);
+emit_32(3276992545);
+emit_32(1130020864);
+emit_32(3226090865);
+emit_32(3276992545);
+emit_32(1130276848);
+emit_32(3223180269);
+emit_32(3276992545);
+emit_32(1130532897);
+emit_32(3210523051);
+emit_32(3276992545);
+emit_32(1130788880);
+emit_32(1069117184);
+emit_32(3276992545);
+emit_32(1131044864);
+emit_32(1079791646);
+emit_32(3276992545);
+emit_32(1131300848);
+emit_32(1085107318);
+emit_32(3276992545);
+emit_32(1131556897);
+emit_32(1086920663);
+emit_32(3276992545);
+emit_32(1131812880);
+emit_32(1088946029);
+emit_32(3276992545);
+emit_32(1132068864);
+emit_32(1093373998);
+emit_32(3276992545);
+emit_32(1081737216);
+emit_32(1097108292);
+emit_32(3277248528);
+emit_32(1090125824);
+emit_32(1096843002);
+emit_32(3277248528);
+emit_32(1094418484);
+emit_32(1095568248);
+emit_32(3277248528);
+emit_32(1098514432);
+emit_32(1095018899);
+emit_32(3277248528);
+emit_32(1100759066);
+emit_32(1094782235);
+emit_32(3277248528);
+emit_32(1102807040);
+emit_32(1095180170);
+emit_32(3277248528);
+emit_32(1104855066);
+emit_32(1095450493);
+emit_32(3277248528);
+emit_32(1106903040);
+emit_32(1095069965);
+emit_32(3277248528);
+emit_32(1108123661);
+emit_32(1095994599);
+emit_32(3277248528);
+emit_32(1109147648);
+emit_32(1095664822);
+emit_32(3277248528);
+emit_32(1110171661);
+emit_32(1095335569);
+emit_32(3277248528);
+emit_32(1111195648);
+emit_32(1094159381);
+emit_32(3277248528);
+emit_32(1112219661);
+emit_32(1093190812);
+emit_32(3277248528);
+emit_32(1113243648);
+emit_32(1092024942);
+emit_32(3277248528);
+emit_32(1114267661);
+emit_32(1092719162);
+emit_32(3277248528);
+emit_32(1115291648);
+emit_32(1091950724);
+emit_32(3277248528);
+emit_32(1116000263);
+emit_32(1090594496);
+emit_32(3277248528);
+emit_32(1116512256);
+emit_32(1087264889);
+emit_32(3277248528);
+emit_32(1117024263);
+emit_32(1085915770);
+emit_32(3277248528);
+emit_32(1117536256);
+emit_32(1085498563);
+emit_32(3277248528);
+emit_32(1118048263);
+emit_32(1087685913);
+emit_32(3277248528);
+emit_32(1118560256);
+emit_32(1089772496);
+emit_32(3277248528);
+emit_32(1119072263);
+emit_32(1090845682);
+emit_32(3277248528);
+emit_32(1119584256);
+emit_32(1090463340);
+emit_32(3277248528);
+emit_32(1120096263);
+emit_32(1085056987);
+emit_32(3277248528);
+emit_32(1120608322);
+emit_32(1080738301);
+emit_32(3277248528);
+emit_32(1121120289);
+emit_32(1078775408);
+emit_32(3277248528);
+emit_32(1121632256);
+emit_32(1086143815);
+emit_32(3277248528);
+emit_32(1122144223);
+emit_32(1089267858);
+emit_32(3277248528);
+emit_32(1122656322);
+emit_32(1090842075);
+emit_32(3277248528);
+emit_32(1123168289);
+emit_32(1092362164);
+emit_32(3277248528);
+emit_32(1123680256);
+emit_32(1092866068);
+emit_32(3277248528);
+emit_32(1124132848);
+emit_32(1092973547);
+emit_32(3277248528);
+emit_32(1124388897);
+emit_32(1093272810);
+emit_32(3277248528);
+emit_32(1124644880);
+emit_32(1093540826);
+emit_32(3277248528);
+emit_32(1124900864);
+emit_32(1091662900);
+emit_32(3277248528);
+emit_32(1125156848);
+emit_32(1087337472);
+emit_32(3277248528);
+emit_32(1125412897);
+emit_32(1084271960);
+emit_32(3277248528);
+emit_32(1125668880);
+emit_32(1086273209);
+emit_32(3277248528);
+emit_32(1125924864);
+emit_32(1087017908);
+emit_32(3277248528);
+emit_32(1126180848);
+emit_32(1086137020);
+emit_32(3277248528);
+emit_32(1126436897);
+emit_32(1084291023);
+emit_32(3277248528);
+emit_32(1126692880);
+emit_32(1084252771);
+emit_32(3277248528);
+emit_32(1126948864);
+emit_32(1082890062);
+emit_32(3277248528);
+emit_32(1127204848);
+emit_32(1080838922);
+emit_32(3277248528);
+emit_32(1127460897);
+emit_32(1077790963);
+emit_32(3277248528);
+emit_32(1127716880);
+emit_32(1069026504);
+emit_32(3277248528);
+emit_32(1127972864);
+emit_32(3200230497);
+emit_32(3277248528);
+emit_32(1128228848);
+emit_32(3212093549);
+emit_32(3277248528);
+emit_32(1128484897);
+emit_32(3187505818);
+emit_32(3277248528);
+emit_32(1128740880);
+emit_32(3186118946);
+emit_32(3277248528);
+emit_32(1128996864);
+emit_32(3163350412);
+emit_32(3277248528);
+emit_32(1129252848);
+emit_32(3213662303);
+emit_32(3277248528);
+emit_32(1129508897);
+emit_32(3213755333);
+emit_32(3277248528);
+emit_32(1129764880);
+emit_32(3220593894);
+emit_32(3277248528);
+emit_32(1130020864);
+emit_32(3222323667);
+emit_32(3277248528);
+emit_32(1130276848);
+emit_32(3215526587);
+emit_32(3277248528);
+emit_32(1130532897);
+emit_32(1045835140);
+emit_32(3277248528);
+emit_32(1130788880);
+emit_32(1075469835);
+emit_32(3277248528);
+emit_32(1131044864);
+emit_32(1083532819);
+emit_32(3277248528);
+emit_32(1131300848);
+emit_32(1086949121);
+emit_32(3277248528);
+emit_32(1131556897);
+emit_32(1088845177);
+emit_32(3277248528);
+emit_32(1131812880);
+emit_32(1090603115);
+emit_32(3277248528);
+emit_32(1132068864);
+emit_32(1092936742);
+emit_32(3277248528);
+emit_32(1081737216);
+emit_32(1096047133);
+emit_32(3277504512);
+emit_32(1090125824);
+emit_32(1095575064);
+emit_32(3277504512);
+emit_32(1094418484);
+emit_32(1094514324);
+emit_32(3277504512);
+emit_32(1098514432);
+emit_32(1094409781);
+emit_32(3277504512);
+emit_32(1100759066);
+emit_32(1094209084);
+emit_32(3277504512);
+emit_32(1102807040);
+emit_32(1094844731);
+emit_32(3277504512);
+emit_32(1104855066);
+emit_32(1094741236);
+emit_32(3277504512);
+emit_32(1106903040);
+emit_32(1095085484);
+emit_32(3277504512);
+emit_32(1108123661);
+emit_32(1095114110);
+emit_32(3277504512);
+emit_32(1109147648);
+emit_32(1094994362);
+emit_32(3277504512);
+emit_32(1110171661);
+emit_32(1095239939);
+emit_32(3277504512);
+emit_32(1111195648);
+emit_32(1093966548);
+emit_32(3277504512);
+emit_32(1112219661);
+emit_32(1092807347);
+emit_32(3277504512);
+emit_32(1113243648);
+emit_32(1093061208);
+emit_32(3277504512);
+emit_32(1114267661);
+emit_32(1092621120);
+emit_32(3277504512);
+emit_32(1115291648);
+emit_32(1092574889);
+emit_32(3277504512);
+emit_32(1116000263);
+emit_32(1091199283);
+emit_32(3277504512);
+emit_32(1116512256);
+emit_32(1087281792);
+emit_32(3277504512);
+emit_32(1117024263);
+emit_32(1084862056);
+emit_32(3277504512);
+emit_32(1117536256);
+emit_32(1084838904);
+emit_32(3277504512);
+emit_32(1118048263);
+emit_32(1088961905);
+emit_32(3277504512);
+emit_32(1118560256);
+emit_32(1090683457);
+emit_32(3277504512);
+emit_32(1119072263);
+emit_32(1091541548);
+emit_32(3277504512);
+emit_32(1119584256);
+emit_32(1089950880);
+emit_32(3277504512);
+emit_32(1120096263);
+emit_32(1085097923);
+emit_32(3277504512);
+emit_32(1120608322);
+emit_32(1082634273);
+emit_32(3277504512);
+emit_32(1121120289);
+emit_32(1085048283);
+emit_32(3277504512);
+emit_32(1121632256);
+emit_32(1089879786);
+emit_32(3277504512);
+emit_32(1122144223);
+emit_32(1091437760);
+emit_32(3277504512);
+emit_32(1122656322);
+emit_32(1092036938);
+emit_32(3277504512);
+emit_32(1123168289);
+emit_32(1091792777);
+emit_32(3277504512);
+emit_32(1123680256);
+emit_32(1092759427);
+emit_32(3277504512);
+emit_32(1124132848);
+emit_32(1094303141);
+emit_32(3277504512);
+emit_32(1124388897);
+emit_32(1094722047);
+emit_32(3277504512);
+emit_32(1124644880);
+emit_32(1095047211);
+emit_32(3277504512);
+emit_32(1124900864);
+emit_32(1093500980);
+emit_32(3277504512);
+emit_32(1125156848);
+emit_32(1089802590);
+emit_32(3277504512);
+emit_32(1125412897);
+emit_32(1086478164);
+emit_32(3277504512);
+emit_32(1125668880);
+emit_32(1087292152);
+emit_32(3277504512);
+emit_32(1125924864);
+emit_32(1088463244);
+emit_32(3277504512);
+emit_32(1126180848);
+emit_32(1088955697);
+emit_32(3277504512);
+emit_32(1126436897);
+emit_32(1086983577);
+emit_32(3277504512);
+emit_32(1126692880);
+emit_32(1087333382);
+emit_32(3277504512);
+emit_32(1126948864);
+emit_32(1086099795);
+emit_32(3277504512);
+emit_32(1127204848);
+emit_32(1085722623);
+emit_32(3277504512);
+emit_32(1127460897);
+emit_32(1082769224);
+emit_32(3277504512);
+emit_32(1127716880);
+emit_32(1075827190);
+emit_32(3277504512);
+emit_32(1127972864);
+emit_32(1066775588);
+emit_32(3277504512);
+emit_32(1128228848);
+emit_32(1067171279);
+emit_32(3277504512);
+emit_32(1128484897);
+emit_32(1067001745);
+emit_32(3277504512);
+emit_32(1128740880);
+emit_32(1067686843);
+emit_32(3277504512);
+emit_32(1128996864);
+emit_32(1065883795);
+emit_32(3277504512);
+emit_32(1129252848);
+emit_32(1040732182);
+emit_32(3277504512);
+emit_32(1129508897);
+emit_32(3197189593);
+emit_32(3277504512);
+emit_32(1129764880);
+emit_32(3203486016);
+emit_32(3277504512);
+emit_32(1130020864);
+emit_32(3211855951);
+emit_32(3277504512);
+emit_32(1130276848);
+emit_32(3212062612);
+emit_32(3277504512);
+emit_32(1130532897);
+emit_32(1061179313);
+emit_32(3277504512);
+emit_32(1130788880);
+emit_32(1076017024);
+emit_32(3277504512);
+emit_32(1131044864);
+emit_32(1084602198);
+emit_32(3277504512);
+emit_32(1131300848);
+emit_32(1088897291);
+emit_32(3277504512);
+emit_32(1131556897);
+emit_32(1090987995);
+emit_32(3277504512);
+emit_32(1131812880);
+emit_32(1091140101);
+emit_32(3277504512);
+emit_32(1132068864);
+emit_32(1093070540);
+emit_32(3277504512);
+emit_32(1081737216);
+emit_32(1095782787);
+emit_32(3277760496);
+emit_32(1090125824);
+emit_32(1095949510);
+emit_32(3277760496);
+emit_32(1094418484);
+emit_32(1095197157);
+emit_32(3277760496);
+emit_32(1098514432);
+emit_32(1093509684);
+emit_32(3277760496);
+emit_32(1100759066);
+emit_32(1093932365);
+emit_32(3277760496);
+emit_32(1102807040);
+emit_32(1094883004);
+emit_32(3277760496);
+emit_32(1104855066);
+emit_32(1095364195);
+emit_32(3277760496);
+emit_32(1106903040);
+emit_32(1095467794);
+emit_32(3277760496);
+emit_32(1108123661);
+emit_32(1095382231);
+emit_32(3277760496);
+emit_32(1109147648);
+emit_32(1095263532);
+emit_32(3277760496);
+emit_32(1110171661);
+emit_32(1094240751);
+emit_32(3277760496);
+emit_32(1111195648);
+emit_32(1093792485);
+emit_32(3277760496);
+emit_32(1112219661);
+emit_32(1093773400);
+emit_32(3277760496);
+emit_32(1113243648);
+emit_32(1093969799);
+emit_32(3277760496);
+emit_32(1114267661);
+emit_32(1092613235);
+emit_32(3277760496);
+emit_32(1115291648);
+emit_32(1091641803);
+emit_32(3277760496);
+emit_32(1116000263);
+emit_32(1090223425);
+emit_32(3277760496);
+emit_32(1116512256);
+emit_32(1086325449);
+emit_32(3277760496);
+emit_32(1117024263);
+emit_32(1086748822);
+emit_32(3277760496);
+emit_32(1117536256);
+emit_32(1088214081);
+emit_32(3277760496);
+emit_32(1118048263);
+emit_32(1090683918);
+emit_32(3277760496);
+emit_32(1118560256);
+emit_32(1091490273);
+emit_32(3277760496);
+emit_32(1119072263);
+emit_32(1092135263);
+emit_32(3277760496);
+emit_32(1119584256);
+emit_32(1090576429);
+emit_32(3277760496);
+emit_32(1120096263);
+emit_32(1085919021);
+emit_32(3277760496);
+emit_32(1120608322);
+emit_32(1084273260);
+emit_32(3277760496);
+emit_32(1121120289);
+emit_32(1088748708);
+emit_32(3277760496);
+emit_32(1121632256);
+emit_32(1091512618);
+emit_32(3277760496);
+emit_32(1122144223);
+emit_32(1092476008);
+emit_32(3277760496);
+emit_32(1122656322);
+emit_32(1093289483);
+emit_32(3277760496);
+emit_32(1123168289);
+emit_32(1093443623);
+emit_32(3277760496);
+emit_32(1123680256);
+emit_32(1093739846);
+emit_32(3277760496);
+emit_32(1124132848);
+emit_32(1095381916);
+emit_32(3277760496);
+emit_32(1124388897);
+emit_32(1095171886);
+emit_32(3277760496);
+emit_32(1124644880);
+emit_32(1094833196);
+emit_32(3277760496);
+emit_32(1124900864);
+emit_32(1094087134);
+emit_32(3277760496);
+emit_32(1125156848);
+emit_32(1091517725);
+emit_32(3277760496);
+emit_32(1125412897);
+emit_32(1088065624);
+emit_32(3277760496);
+emit_32(1125668880);
+emit_32(1089789588);
+emit_32(3277760496);
+emit_32(1125924864);
+emit_32(1090797741);
+emit_32(3277760496);
+emit_32(1126180848);
+emit_32(1090448785);
+emit_32(3277760496);
+emit_32(1126436897);
+emit_32(1089515972);
+emit_32(3277760496);
+emit_32(1126692880);
+emit_32(1088794300);
+emit_32(3277760496);
+emit_32(1126948864);
+emit_32(1086317606);
+emit_32(3277760496);
+emit_32(1127204848);
+emit_32(1085853170);
+emit_32(3277760496);
+emit_32(1127460897);
+emit_32(1083759395);
+emit_32(3277760496);
+emit_32(1127716880);
+emit_32(1079594766);
+emit_32(3277760496);
+emit_32(1127972864);
+emit_32(1077764623);
+emit_32(3277760496);
+emit_32(1128228848);
+emit_32(1072514403);
+emit_32(3277760496);
+emit_32(1128484897);
+emit_32(1067984303);
+emit_32(3277760496);
+emit_32(1128740880);
+emit_32(1066412026);
+emit_32(3277760496);
+emit_32(1128996864);
+emit_32(1069352569);
+emit_32(3277760496);
+emit_32(1129252848);
+emit_32(1072856490);
+emit_32(3277760496);
+emit_32(1129508897);
+emit_32(1059155041);
+emit_32(3277760496);
+emit_32(1129764880);
+emit_32(1050172017);
+emit_32(3277760496);
+emit_32(1130020864);
+emit_32(3157538945);
+emit_32(3277760496);
+emit_32(1130276848);
+emit_32(3194387429);
+emit_32(3277760496);
+emit_32(1130532897);
+emit_32(1059188931);
+emit_32(3277760496);
+emit_32(1130788880);
+emit_32(1077509609);
+emit_32(3277760496);
+emit_32(1131044864);
+emit_32(1085587356);
+emit_32(3277760496);
+emit_32(1131300848);
+emit_32(1088891944);
+emit_32(3277760496);
+emit_32(1131556897);
+emit_32(1090308297);
+emit_32(3277760496);
+emit_32(1131812880);
+emit_32(1091359484);
+emit_32(3277760496);
+emit_32(1132068864);
+emit_32(1093623035);
+emit_32(3277760496);
+emit_32(1081737216);
+emit_32(1094685347);
+emit_32(3278016545);
+emit_32(1090125824);
+emit_32(1095642592);
+emit_32(3278016545);
+emit_32(1094418484);
+emit_32(1094847876);
+emit_32(3278016545);
+emit_32(1098514432);
+emit_32(1093374732);
+emit_32(3278016545);
+emit_32(1100759066);
+emit_32(1094384720);
+emit_32(3278016545);
+emit_32(1102807040);
+emit_32(1095400371);
+emit_32(3278016545);
+emit_32(1104855066);
+emit_32(1095484362);
+emit_32(3278016545);
+emit_32(1106903040);
+emit_32(1094502790);
+emit_32(3278016545);
+emit_32(1108123661);
+emit_32(1093875112);
+emit_32(3278016545);
+emit_32(1109147648);
+emit_32(1093633206);
+emit_32(3278016545);
+emit_32(1110171661);
+emit_32(1093418667);
+emit_32(3278016545);
+emit_32(1111195648);
+emit_32(1093659211);
+emit_32(3278016545);
+emit_32(1112219661);
+emit_32(1093957426);
+emit_32(3278016545);
+emit_32(1113243648);
+emit_32(1093739846);
+emit_32(3278016545);
+emit_32(1114267661);
+emit_32(1093359842);
+emit_32(3278016545);
+emit_32(1115291648);
+emit_32(1091739111);
+emit_32(3278016545);
+emit_32(1116000263);
+emit_32(1089668246);
+emit_32(3278016545);
+emit_32(1116512256);
+emit_32(1087761327);
+emit_32(3278016545);
+emit_32(1117024263);
+emit_32(1088382734);
+emit_32(3278016545);
+emit_32(1117536256);
+emit_32(1089936850);
+emit_32(3278016545);
+emit_32(1118048263);
+emit_32(1091570688);
+emit_32(3278016545);
+emit_32(1118560256);
+emit_32(1092069527);
+emit_32(3278016545);
+emit_32(1119072263);
+emit_32(1091509504);
+emit_32(3278016545);
+emit_32(1119584256);
+emit_32(1090092228);
+emit_32(3278016545);
+emit_32(1120096263);
+emit_32(1086488041);
+emit_32(3278016545);
+emit_32(1120608322);
+emit_32(1087594478);
+emit_32(3278016545);
+emit_32(1121120289);
+emit_32(1091111695);
+emit_32(3278016545);
+emit_32(1121632256);
+emit_32(1092917028);
+emit_32(3278016545);
+emit_32(1122144223);
+emit_32(1094162946);
+emit_32(3278016545);
+emit_32(1122656322);
+emit_32(1094317402);
+emit_32(3278016545);
+emit_32(1123168289);
+emit_32(1094797545);
+emit_32(3278016545);
+emit_32(1123680256);
+emit_32(1095272759);
+emit_32(3278016545);
+emit_32(1124132848);
+emit_32(1096382467);
+emit_32(3278016545);
+emit_32(1124388897);
+emit_32(1095677824);
+emit_32(3278016545);
+emit_32(1124644880);
+emit_32(1094211076);
+emit_32(3278016545);
+emit_32(1124900864);
+emit_32(1093289168);
+emit_32(3278016545);
+emit_32(1125156848);
+emit_32(1091399110);
+emit_32(3278016545);
+emit_32(1125412897);
+emit_32(1091357282);
+emit_32(3278016545);
+emit_32(1125668880);
+emit_32(1092084459);
+emit_32(3278016545);
+emit_32(1125924864);
+emit_32(1092576409);
+emit_32(3278016545);
+emit_32(1126180848);
+emit_32(1091310967);
+emit_32(3278016545);
+emit_32(1126436897);
+emit_32(1089767358);
+emit_32(3278016545);
+emit_32(1126692880);
+emit_32(1088833559);
+emit_32(3278016545);
+emit_32(1126948864);
+emit_32(1088084855);
+emit_32(3278016545);
+emit_32(1127204848);
+emit_32(1086548397);
+emit_32(3278016545);
+emit_32(1127460897);
+emit_32(1083608358);
+emit_32(3278016545);
+emit_32(1127716880);
+emit_32(1083278790);
+emit_32(3278016545);
+emit_32(1127972864);
+emit_32(1080394661);
+emit_32(3278016545);
+emit_32(1128228848);
+emit_32(1077852158);
+emit_32(3278016545);
+emit_32(1128484897);
+emit_32(1069478650);
+emit_32(3278016545);
+emit_32(1128740880);
+emit_32(1072553494);
+emit_32(3278016545);
+emit_32(1128996864);
+emit_32(1069471100);
+emit_32(3278016545);
+emit_32(1129252848);
+emit_32(1068704381);
+emit_32(3278016545);
+emit_32(1129508897);
+emit_32(1063054771);
+emit_32(3278016545);
+emit_32(1129764880);
+emit_32(1066657309);
+emit_32(3278016545);
+emit_32(1130020864);
+emit_32(1058799582);
+emit_32(3278016545);
+emit_32(1130276848);
+emit_32(1065716610);
+emit_32(3278016545);
+emit_32(1130532897);
+emit_32(1070221796);
+emit_32(3278016545);
+emit_32(1130788880);
+emit_32(1082372632);
+emit_32(3278016545);
+emit_32(1131044864);
+emit_32(1085584357);
+emit_32(3278016545);
+emit_32(1131300848);
+emit_32(1087618406);
+emit_32(3278016545);
+emit_32(1131556897);
+emit_32(1089074731);
+emit_32(3278016545);
+emit_32(1131812880);
+emit_32(1091116256);
+emit_32(3278016545);
+emit_32(1132068864);
+emit_32(1093443623);
+emit_32(3278016545);
+emit_32(1081737216);
+emit_32(1093100529);
+emit_32(3278272528);
+emit_32(1090125824);
+emit_32(1094102968);
+emit_32(3278272528);
+emit_32(1094418484);
+emit_32(1093438380);
+emit_32(3278272528);
+emit_32(1098514432);
+emit_32(1093242192);
+emit_32(3278272528);
+emit_32(1100759066);
+emit_32(1093664663);
+emit_32(3278272528);
+emit_32(1102807040);
+emit_32(1094290978);
+emit_32(3278272528);
+emit_32(1104855066);
+emit_32(1094142185);
+emit_32(3278272528);
+emit_32(1106903040);
+emit_32(1092722622);
+emit_32(3278272528);
+emit_32(1108123661);
+emit_32(1093048205);
+emit_32(3278272528);
+emit_32(1109147648);
+emit_32(1092329868);
+emit_32(3278272528);
+emit_32(1110171661);
+emit_32(1092322308);
+emit_32(3278272528);
+emit_32(1111195648);
+emit_32(1093430621);
+emit_32(3278272528);
+emit_32(1112219661);
+emit_32(1093536317);
+emit_32(3278272528);
+emit_32(1113243648);
+emit_32(1092950268);
+emit_32(3278272528);
+emit_32(1114267661);
+emit_32(1093055336);
+emit_32(3278272528);
+emit_32(1115291648);
+emit_32(1091513918);
+emit_32(3278272528);
+emit_32(1116000263);
+emit_32(1090353428);
+emit_32(3278272528);
+emit_32(1116512256);
+emit_32(1091025450);
+emit_32(3278272528);
+emit_32(1117024263);
+emit_32(1091303186);
+emit_32(3278272528);
+emit_32(1117536256);
+emit_32(1091441535);
+emit_32(3278272528);
+emit_32(1118048263);
+emit_32(1092287275);
+emit_32(3278272528);
+emit_32(1118560256);
+emit_32(1092144259);
+emit_32(3278272528);
+emit_32(1119072263);
+emit_32(1091616102);
+emit_32(3278272528);
+emit_32(1119584256);
+emit_32(1091037110);
+emit_32(3278272528);
+emit_32(1120096263);
+emit_32(1090309493);
+emit_32(3278272528);
+emit_32(1120608322);
+emit_32(1091784220);
+emit_32(3278272528);
+emit_32(1121120289);
+emit_32(1093152434);
+emit_32(3278272528);
+emit_32(1121632256);
+emit_32(1094218836);
+emit_32(3278272528);
+emit_32(1122144223);
+emit_32(1094752980);
+emit_32(3278272528);
+emit_32(1122656322);
+emit_32(1095698796);
+emit_32(3278272528);
+emit_32(1123168289);
+emit_32(1095918053);
+emit_32(3278272528);
+emit_32(1123680256);
+emit_32(1096702912);
+emit_32(3278272528);
+emit_32(1124132848);
+emit_32(1097339817);
+emit_32(3278272528);
+emit_32(1124388897);
+emit_32(1095953075);
+emit_32(3278272528);
+emit_32(1124644880);
+emit_32(1094317611);
+emit_32(3278272528);
+emit_32(1124900864);
+emit_32(1093780950);
+emit_32(3278272528);
+emit_32(1125156848);
+emit_32(1092660022);
+emit_32(3278272528);
+emit_32(1125412897);
+emit_32(1092828633);
+emit_32(3278272528);
+emit_32(1125668880);
+emit_32(1093621252);
+emit_32(3278272528);
+emit_32(1125924864);
+emit_32(1093691821);
+emit_32(3278272528);
+emit_32(1126180848);
+emit_32(1092496151);
+emit_32(3278272528);
+emit_32(1126436897);
+emit_32(1091489371);
+emit_32(3278272528);
+emit_32(1126692880);
+emit_32(1090315742);
+emit_32(3278272528);
+emit_32(1126948864);
+emit_32(1088919605);
+emit_32(3278272528);
+emit_32(1127204848);
+emit_32(1086524028);
+emit_32(3278272528);
+emit_32(1127460897);
+emit_32(1084543520);
+emit_32(3278272528);
+emit_32(1127716880);
+emit_32(1083661479);
+emit_32(3278272528);
+emit_32(1127972864);
+emit_32(1082237198);
+emit_32(3278272528);
+emit_32(1128228848);
+emit_32(1078013052);
+emit_32(3278272528);
+emit_32(1128484897);
+emit_32(1072342353);
+emit_32(3278272528);
+emit_32(1128740880);
+emit_32(1077011074);
+emit_32(3278272528);
+emit_32(1128996864);
+emit_32(1078172393);
+emit_32(3278272528);
+emit_32(1129252848);
+emit_32(1074035719);
+emit_32(3278272528);
+emit_32(1129508897);
+emit_32(1073825416);
+emit_32(3278272528);
+emit_32(1129764880);
+emit_32(1074307678);
+emit_32(3278272528);
+emit_32(1130020864);
+emit_32(1070873927);
+emit_32(3278272528);
+emit_32(1130276848);
+emit_32(1072403002);
+emit_32(3278272528);
+emit_32(1130532897);
+emit_32(1077025838);
+emit_32(3278272528);
+emit_32(1130788880);
+emit_32(1081902304);
+emit_32(3278272528);
+emit_32(1131044864);
+emit_32(1085968619);
+emit_32(3278272528);
+emit_32(1131300848);
+emit_32(1088231676);
+emit_32(3278272528);
+emit_32(1131556897);
+emit_32(1090439956);
+emit_32(3278272528);
+emit_32(1131812880);
+emit_32(1089744184);
+emit_32(3278272528);
+emit_32(1132068864);
+emit_32(1092872988);
+emit_32(3278272528);
+emit_32(1081737216);
+emit_32(1091412678);
+emit_32(3278528512);
+emit_32(1090125824);
+emit_32(1091988504);
+emit_32(3278528512);
+emit_32(1094418484);
+emit_32(1092226269);
+emit_32(3278528512);
+emit_32(1098514432);
+emit_32(1092585521);
+emit_32(3278528512);
+emit_32(1100759066);
+emit_32(1092575014);
+emit_32(3278528512);
+emit_32(1102807040);
+emit_32(1092307292);
+emit_32(3278528512);
+emit_32(1104855066);
+emit_32(1092661805);
+emit_32(3278528512);
+emit_32(1106903040);
+emit_32(1092468123);
+emit_32(3278528512);
+emit_32(1108123661);
+emit_32(1092120016);
+emit_32(3278528512);
+emit_32(1109147648);
+emit_32(1091309048);
+emit_32(3278528512);
+emit_32(1110171661);
+emit_32(1091564323);
+emit_32(3278528512);
+emit_32(1111195648);
+emit_32(1092158059);
+emit_32(3278528512);
+emit_32(1112219661);
+emit_32(1092138943);
+emit_32(3278528512);
+emit_32(1113243648);
+emit_32(1092639785);
+emit_32(3278528512);
+emit_32(1114267661);
+emit_32(1092158950);
+emit_32(3278528512);
+emit_32(1115291648);
+emit_32(1091761330);
+emit_32(3278528512);
+emit_32(1116000263);
+emit_32(1091873884);
+emit_32(3278528512);
+emit_32(1116512256);
+emit_32(1093128002);
+emit_32(3278528512);
+emit_32(1117024263);
+emit_32(1093545755);
+emit_32(3278528512);
+emit_32(1117536256);
+emit_32(1093685844);
+emit_32(3278528512);
+emit_32(1118048263);
+emit_32(1094474478);
+emit_32(3278528512);
+emit_32(1118560256);
+emit_32(1093835057);
+emit_32(3278528512);
+emit_32(1119072263);
+emit_32(1093247435);
+emit_32(3278528512);
+emit_32(1119584256);
+emit_32(1092545770);
+emit_32(3278528512);
+emit_32(1120096263);
+emit_32(1092881691);
+emit_32(3278528512);
+emit_32(1120608322);
+emit_32(1093753687);
+emit_32(3278528512);
+emit_32(1121120289);
+emit_32(1095402888);
+emit_32(3278528512);
+emit_32(1121632256);
+emit_32(1096263454);
+emit_32(3278528512);
+emit_32(1122144223);
+emit_32(1097648518);
+emit_32(3278528512);
+emit_32(1122656322);
+emit_32(1098257845);
+emit_32(3278528512);
+emit_32(1123168289);
+emit_32(1098906075);
+emit_32(3278528512);
+emit_32(1123680256);
+emit_32(1097757884);
+emit_32(3278528512);
+emit_32(1124132848);
+emit_32(1097095184);
+emit_32(3278528512);
+emit_32(1124388897);
+emit_32(1096820772);
+emit_32(3278528512);
+emit_32(1124644880);
+emit_32(1095881563);
+emit_32(3278528512);
+emit_32(1124900864);
+emit_32(1095322462);
+emit_32(3278528512);
+emit_32(1125156848);
+emit_32(1094560881);
+emit_32(3278528512);
+emit_32(1125412897);
+emit_32(1094212020);
+emit_32(3278528512);
+emit_32(1125668880);
+emit_32(1094591919);
+emit_32(3278528512);
+emit_32(1125924864);
+emit_32(1094354836);
+emit_32(3278528512);
+emit_32(1126180848);
+emit_32(1093487244);
+emit_32(3278528512);
+emit_32(1126436897);
+emit_32(1092900566);
+emit_32(3278528512);
+emit_32(1126692880);
+emit_32(1091131859);
+emit_32(3278528512);
+emit_32(1126948864);
+emit_32(1088434303);
+emit_32(3278528512);
+emit_32(1127204848);
+emit_32(1085602330);
+emit_32(3278528512);
+emit_32(1127460897);
+emit_32(1084383381);
+emit_32(3278528512);
+emit_32(1127716880);
+emit_32(1082990348);
+emit_32(3278528512);
+emit_32(1127972864);
+emit_32(1081942359);
+emit_32(3278528512);
+emit_32(1128228848);
+emit_32(1079707928);
+emit_32(3278528512);
+emit_32(1128484897);
+emit_32(1076020757);
+emit_32(3278528512);
+emit_32(1128740880);
+emit_32(1081959766);
+emit_32(3278528512);
+emit_32(1128996864);
+emit_32(1081769302);
+emit_32(3278528512);
+emit_32(1129252848);
+emit_32(1077543709);
+emit_32(3278528512);
+emit_32(1129508897);
+emit_32(1078419522);
+emit_32(3278528512);
+emit_32(1129764880);
+emit_32(1079325911);
+emit_32(3278528512);
+emit_32(1130020864);
+emit_32(1076435784);
+emit_32(3278528512);
+emit_32(1130276848);
+emit_32(1076442830);
+emit_32(3278528512);
+emit_32(1130532897);
+emit_32(1078716269);
+emit_32(3278528512);
+emit_32(1130788880);
+emit_32(1083099337);
+emit_32(3278528512);
+emit_32(1131044864);
+emit_32(1086173385);
+emit_32(3278528512);
+emit_32(1131300848);
+emit_32(1088001787);
+emit_32(3278528512);
+emit_32(1131556897);
+emit_32(1091260069);
+emit_32(3278528512);
+emit_32(1131812880);
+emit_32(1091015247);
+emit_32(3278528512);
+emit_32(1132068864);
+emit_32(1093018740);
+emit_32(3278528512);
+emit_32(1081737216);
+emit_32(1090509120);
+emit_32(3278784496);
+emit_32(1090125824);
+emit_32(1091171244);
+emit_32(3278784496);
+emit_32(1094418484);
+emit_32(1091637818);
+emit_32(3278784496);
+emit_32(1098514432);
+emit_32(1091699621);
+emit_32(3278784496);
+emit_32(1100759066);
+emit_32(1091545869);
+emit_32(3278784496);
+emit_32(1102807040);
+emit_32(1092355642);
+emit_32(3278784496);
+emit_32(1104855066);
+emit_32(1092176189);
+emit_32(3278784496);
+emit_32(1106903040);
+emit_32(1091883961);
+emit_32(3278784496);
+emit_32(1108123661);
+emit_32(1091185924);
+emit_32(3278784496);
+emit_32(1109147648);
+emit_32(1091284217);
+emit_32(3278784496);
+emit_32(1110171661);
+emit_32(1091038221);
+emit_32(3278784496);
+emit_32(1111195648);
+emit_32(1091340725);
+emit_32(3278784496);
+emit_32(1112219661);
+emit_32(1091305944);
+emit_32(3278784496);
+emit_32(1113243648);
+emit_32(1091527623);
+emit_32(3278784496);
+emit_32(1114267661);
+emit_32(1092680260);
+emit_32(3278784496);
+emit_32(1115291648);
+emit_32(1093798461);
+emit_32(3278784496);
+emit_32(1116000263);
+emit_32(1093476968);
+emit_32(3278784496);
+emit_32(1116512256);
+emit_32(1094724669);
+emit_32(3278784496);
+emit_32(1117024263);
+emit_32(1095984847);
+emit_32(3278784496);
+emit_32(1117536256);
+emit_32(1096949223);
+emit_32(3278784496);
+emit_32(1118048263);
+emit_32(1097185362);
+emit_32(3278784496);
+emit_32(1118560256);
+emit_32(1096053529);
+emit_32(3278784496);
+emit_32(1119072263);
+emit_32(1095554721);
+emit_32(3278784496);
+emit_32(1119584256);
+emit_32(1094764095);
+emit_32(3278784496);
+emit_32(1120096263);
+emit_32(1095516239);
+emit_32(3278784496);
+emit_32(1120608322);
+emit_32(1096842687);
+emit_32(3278784496);
+emit_32(1121120289);
+emit_32(1098862245);
+emit_32(3278784496);
+emit_32(1121632256);
+emit_32(1099841038);
+emit_32(3278784496);
+emit_32(1122144223);
+emit_32(1100521249);
+emit_32(3278784496);
+emit_32(1122656322);
+emit_32(1100352324);
+emit_32(3278784496);
+emit_32(1123168289);
+emit_32(1100382418);
+emit_32(3278784496);
+emit_32(1123680256);
+emit_32(1099683961);
+emit_32(3278784496);
+emit_32(1124132848);
+emit_32(1099118517);
+emit_32(3278784496);
+emit_32(1124388897);
+emit_32(1098912891);
+emit_32(3278784496);
+emit_32(1124644880);
+emit_32(1098053268);
+emit_32(3278784496);
+emit_32(1124900864);
+emit_32(1096737201);
+emit_32(3278784496);
+emit_32(1125156848);
+emit_32(1095640390);
+emit_32(3278784496);
+emit_32(1125412897);
+emit_32(1094410096);
+emit_32(3278784496);
+emit_32(1125668880);
+emit_32(1094098878);
+emit_32(3278784496);
+emit_32(1125924864);
+emit_32(1093723488);
+emit_32(3278784496);
+emit_32(1126180848);
+emit_32(1093527195);
+emit_32(3278784496);
+emit_32(1126436897);
+emit_32(1093210944);
+emit_32(3278784496);
+emit_32(1126692880);
+emit_32(1092714548);
+emit_32(3278784496);
+emit_32(1126948864);
+emit_32(1089965455);
+emit_32(3278784496);
+emit_32(1127204848);
+emit_32(1086218431);
+emit_32(3278784496);
+emit_32(1127460897);
+emit_32(1085307869);
+emit_32(3278784496);
+emit_32(1127716880);
+emit_32(1084803231);
+emit_32(3278784496);
+emit_32(1127972864);
+emit_32(1084117756);
+emit_32(3278784496);
+emit_32(1128228848);
+emit_32(1082406438);
+emit_32(3278784496);
+emit_32(1128484897);
+emit_32(1080428635);
+emit_32(3278784496);
+emit_32(1128740880);
+emit_32(1082196765);
+emit_32(3278784496);
+emit_32(1128996864);
+emit_32(1082931292);
+emit_32(3278784496);
+emit_32(1129252848);
+emit_32(1078353839);
+emit_32(3278784496);
+emit_32(1129508897);
+emit_32(1078676842);
+emit_32(3278784496);
+emit_32(1129764880);
+emit_32(1078175832);
+emit_32(3278784496);
+emit_32(1130020864);
+emit_32(1078788788);
+emit_32(3278784496);
+emit_32(1130276848);
+emit_32(1075988503);
+emit_32(3278784496);
+emit_32(1130532897);
+emit_32(1078470902);
+emit_32(3278784496);
+emit_32(1130788880);
+emit_32(1083278329);
+emit_32(3278784496);
+emit_32(1131044864);
+emit_32(1086190728);
+emit_32(3278784496);
+emit_32(1131300848);
+emit_32(1088421406);
+emit_32(3278784496);
+emit_32(1131556897);
+emit_32(1090737280);
+emit_32(3278784496);
+emit_32(1131812880);
+emit_32(1092161257);
+emit_32(3278784496);
+emit_32(1132068864);
+emit_32(1094162946);
+emit_32(3278784496);
+emit_32(1081737216);
+emit_32(1087170664);
+emit_32(3279040545);
+emit_32(1090125824);
+emit_32(1090282922);
+emit_32(3279040545);
+emit_32(1094418484);
+emit_32(1091155117);
+emit_32(3279040545);
+emit_32(1098514432);
+emit_32(1091115921);
+emit_32(3279040545);
+emit_32(1100759066);
+emit_32(1091154351);
+emit_32(3279040545);
+emit_32(1102807040);
+emit_32(1091182076);
+emit_32(3279040545);
+emit_32(1104855066);
+emit_32(1090880379);
+emit_32(3279040545);
+emit_32(1106903040);
+emit_32(1089488437);
+emit_32(3279040545);
+emit_32(1108123661);
+emit_32(1089764611);
+emit_32(3279040545);
+emit_32(1109147648);
+emit_32(1090012599);
+emit_32(3279040545);
+emit_32(1110171661);
+emit_32(1089610386);
+emit_32(3279040545);
+emit_32(1111195648);
+emit_32(1090497943);
+emit_32(3279040545);
+emit_32(1112219661);
+emit_32(1092221833);
+emit_32(3279040545);
+emit_32(1113243648);
+emit_32(1091868673);
+emit_32(3279040545);
+emit_32(1114267661);
+emit_32(1093013812);
+emit_32(3279040545);
+emit_32(1115291648);
+emit_32(1093957635);
+emit_32(3279040545);
+emit_32(1116000263);
+emit_32(1095032950);
+emit_32(3279040545);
+emit_32(1116512256);
+emit_32(1096314729);
+emit_32(3279040545);
+emit_32(1117024263);
+emit_32(1097345375);
+emit_32(3279040545);
+emit_32(1117536256);
+emit_32(1098078329);
+emit_32(3279040545);
+emit_32(1118048263);
+emit_32(1098803524);
+emit_32(3279040545);
+emit_32(1118560256);
+emit_32(1098341522);
+emit_32(3279040545);
+emit_32(1119072263);
+emit_32(1097352715);
+emit_32(3279040545);
+emit_32(1119584256);
+emit_32(1097048103);
+emit_32(3279040545);
+emit_32(1120096263);
+emit_32(1096764149);
+emit_32(3279040545);
+emit_32(1120608322);
+emit_32(1098722469);
+emit_32(3279040545);
+emit_32(1121120289);
+emit_32(1100309647);
+emit_32(3279040545);
+emit_32(1121632256);
+emit_32(1101387321);
+emit_32(3279040545);
+emit_32(1122144223);
+emit_32(1101809739);
+emit_32(3279040545);
+emit_32(1122656322);
+emit_32(1101519703);
+emit_32(3279040545);
+emit_32(1123168289);
+emit_32(1101121821);
+emit_32(3279040545);
+emit_32(1123680256);
+emit_32(1100240545);
+emit_32(3279040545);
+emit_32(1124132848);
+emit_32(1099882352);
+emit_32(3279040545);
+emit_32(1124388897);
+emit_32(1099784048);
+emit_32(3279040545);
+emit_32(1124644880);
+emit_32(1099378563);
+emit_32(3279040545);
+emit_32(1124900864);
+emit_32(1097709545);
+emit_32(3279040545);
+emit_32(1125156848);
+emit_32(1095839095);
+emit_32(3279040545);
+emit_32(1125412897);
+emit_32(1095221589);
+emit_32(3279040545);
+emit_32(1125668880);
+emit_32(1094514219);
+emit_32(3279040545);
+emit_32(1125924864);
+emit_32(1094489263);
+emit_32(3279040545);
+emit_32(1126180848);
+emit_32(1094114397);
+emit_32(3279040545);
+emit_32(1126436897);
+emit_32(1093523525);
+emit_32(3279040545);
+emit_32(1126692880);
+emit_32(1092364020);
+emit_32(3279040545);
+emit_32(1126948864);
+emit_32(1090657578);
+emit_32(3279040545);
+emit_32(1127204848);
+emit_32(1088250991);
+emit_32(3279040545);
+emit_32(1127460897);
+emit_32(1086186701);
+emit_32(3279040545);
+emit_32(1127716880);
+emit_32(1085899685);
+emit_32(3279040545);
+emit_32(1127972864);
+emit_32(1085922502);
+emit_32(3279040545);
+emit_32(1128228848);
+emit_32(1083915444);
+emit_32(3279040545);
+emit_32(1128484897);
+emit_32(1082705891);
+emit_32(3279040545);
+emit_32(1128740880);
+emit_32(1082612966);
+emit_32(3279040545);
+emit_32(1128996864);
+emit_32(1082123763);
+emit_32(3279040545);
+emit_32(1129252848);
+emit_32(1079957992);
+emit_32(3279040545);
+emit_32(1129508897);
+emit_32(1080918362);
+emit_32(3279040545);
+emit_32(1129764880);
+emit_32(1080150846);
+emit_32(3279040545);
+emit_32(1130020864);
+emit_32(1079666824);
+emit_32(3279040545);
+emit_32(1130276848);
+emit_32(1075451758);
+emit_32(3279040545);
+emit_32(1130532897);
+emit_32(1079618505);
+emit_32(3279040545);
+emit_32(1130788880);
+emit_32(1083212437);
+emit_32(3279040545);
+emit_32(1131044864);
+emit_32(1086243597);
+emit_32(3279040545);
+emit_32(1131300848);
+emit_32(1089861499);
+emit_32(3279040545);
+emit_32(1131556897);
+emit_32(1091090891);
+emit_32(3279040545);
+emit_32(1131812880);
+emit_32(1092085392);
+emit_32(3279040545);
+emit_32(1132068864);
+emit_32(1094769128);
+emit_32(3279040545);
+emit_32(1081737216);
+emit_32(1086522393);
+emit_32(3279296528);
+emit_32(1090125824);
+emit_32(1089733279);
+emit_32(3279296528);
+emit_32(1094418484);
+emit_32(1090866549);
+emit_32(3279296528);
+emit_32(1098514432);
+emit_32(1091166221);
+emit_32(3279296528);
+emit_32(1100759066);
+emit_32(1091316692);
+emit_32(3279296528);
+emit_32(1102807040);
+emit_32(1090303012);
+emit_32(3279296528);
+emit_32(1104855066);
+emit_32(1090054898);
+emit_32(3279296528);
+emit_32(1106903040);
+emit_32(1089282496);
+emit_32(3279296528);
+emit_32(1108123661);
+emit_32(1087524370);
+emit_32(3279296528);
+emit_32(1109147648);
+emit_32(1086986471);
+emit_32(3279296528);
+emit_32(1110171661);
+emit_32(1089941925);
+emit_32(3279296528);
+emit_32(1111195648);
+emit_32(1091445195);
+emit_32(3279296528);
+emit_32(1112219661);
+emit_32(1092661595);
+emit_32(3279296528);
+emit_32(1113243648);
+emit_32(1093449286);
+emit_32(3279296528);
+emit_32(1114267661);
+emit_32(1094451829);
+emit_32(3279296528);
+emit_32(1115291648);
+emit_32(1095908406);
+emit_32(3279296528);
+emit_32(1116000263);
+emit_32(1095897606);
+emit_32(3279296528);
+emit_32(1116512256);
+emit_32(1097742156);
+emit_32(3279296528);
+emit_32(1117024263);
+emit_32(1098429917);
+emit_32(3279296528);
+emit_32(1117536256);
+emit_32(1099162819);
+emit_32(3279296528);
+emit_32(1118048263);
+emit_32(1099463446);
+emit_32(3279296528);
+emit_32(1118560256);
+emit_32(1099555196);
+emit_32(3279296528);
+emit_32(1119072263);
+emit_32(1099132672);
+emit_32(3279296528);
+emit_32(1119584256);
+emit_32(1099075420);
+emit_32(3279296528);
+emit_32(1120096263);
+emit_32(1099448871);
+emit_32(3279296528);
+emit_32(1120608322);
+emit_32(1099721553);
+emit_32(3279296528);
+emit_32(1121120289);
+emit_32(1101033321);
+emit_32(3279296528);
+emit_32(1121632256);
+emit_32(1101927337);
+emit_32(3279296528);
+emit_32(1122144223);
+emit_32(1102231686);
+emit_32(3279296528);
+emit_32(1122656322);
+emit_32(1102467092);
+emit_32(3279296528);
+emit_32(1123168289);
+emit_32(1101898711);
+emit_32(3279296528);
+emit_32(1123680256);
+emit_32(1101260390);
+emit_32(3279296528);
+emit_32(1124132848);
+emit_32(1100638480);
+emit_32(3279296528);
+emit_32(1124388897);
+emit_32(1100231685);
+emit_32(3279296528);
+emit_32(1124644880);
+emit_32(1099651036);
+emit_32(3279296528);
+emit_32(1124900864);
+emit_32(1097614020);
+emit_32(3279296528);
+emit_32(1125156848);
+emit_32(1096696726);
+emit_32(3279296528);
+emit_32(1125412897);
+emit_32(1094775629);
+emit_32(3279296528);
+emit_32(1125668880);
+emit_32(1094539595);
+emit_32(3279296528);
+emit_32(1125924864);
+emit_32(1095046372);
+emit_32(3279296528);
+emit_32(1126180848);
+emit_32(1095477441);
+emit_32(3279296528);
+emit_32(1126436897);
+emit_32(1093641594);
+emit_32(3279296528);
+emit_32(1126692880);
+emit_32(1092818357);
+emit_32(3279296528);
+emit_32(1126948864);
+emit_32(1090737490);
+emit_32(3279296528);
+emit_32(1127204848);
+emit_32(1089918898);
+emit_32(3279296528);
+emit_32(1127460897);
+emit_32(1089673426);
+emit_32(3279296528);
+emit_32(1127716880);
+emit_32(1088381686);
+emit_32(3279296528);
+emit_32(1127972864);
+emit_32(1088024583);
+emit_32(3279296528);
+emit_32(1128228848);
+emit_32(1086615842);
+emit_32(3279296528);
+emit_32(1128484897);
+emit_32(1083021134);
+emit_32(3279296528);
+emit_32(1128740880);
+emit_32(1082006448);
+emit_32(3279296528);
+emit_32(1128996864);
+emit_32(1082259554);
+emit_32(3279296528);
+emit_32(1129252848);
+emit_32(1081019948);
+emit_32(3279296528);
+emit_32(1129508897);
+emit_32(1083076688);
+emit_32(3279296528);
+emit_32(1129764880);
+emit_32(1079712290);
+emit_32(3279296528);
+emit_32(1130020864);
+emit_32(1076696460);
+emit_32(3279296528);
+emit_32(1130276848);
+emit_32(1081628248);
+emit_32(3279296528);
+emit_32(1130532897);
+emit_32(1083251486);
+emit_32(3279296528);
+emit_32(1130788880);
+emit_32(1085680051);
+emit_32(3279296528);
+emit_32(1131044864);
+emit_32(1086814757);
+emit_32(3279296528);
+emit_32(1131300848);
+emit_32(1089239043);
+emit_32(3279296528);
+emit_32(1131556897);
+emit_32(1091530717);
+emit_32(3279296528);
+emit_32(1131812880);
+emit_32(1093644321);
+emit_32(3279296528);
+emit_32(1132068864);
+emit_32(1095779536);
+emit_32(3279296528);
+emit_32(1081737216);
+emit_32(1086994839);
+emit_32(3279552512);
+emit_32(1090125824);
+emit_32(1088197052);
+emit_32(3279552512);
+emit_32(1094418484);
+emit_32(1091183439);
+emit_32(3279552512);
+emit_32(1098514432);
+emit_32(1091864132);
+emit_32(3279552512);
+emit_32(1100759066);
+emit_32(1091623966);
+emit_32(3279552512);
+emit_32(1102807040);
+emit_32(1091056907);
+emit_32(3279552512);
+emit_32(1104855066);
+emit_32(1090799639);
+emit_32(3279552512);
+emit_32(1106903040);
+emit_32(1090240475);
+emit_32(3279552512);
+emit_32(1108123661);
+emit_32(1087500672);
+emit_32(3279552512);
+emit_32(1109147648);
+emit_32(1087952231);
+emit_32(3279552512);
+emit_32(1110171661);
+emit_32(1091227636);
+emit_32(3279552512);
+emit_32(1111195648);
+emit_32(1092866173);
+emit_32(3279552512);
+emit_32(1112219661);
+emit_32(1094198074);
+emit_32(3279552512);
+emit_32(1113243648);
+emit_32(1095474505);
+emit_32(3279552512);
+emit_32(1114267661);
+emit_32(1097295462);
+emit_32(3279552512);
+emit_32(1115291648);
+emit_32(1098629985);
+emit_32(3279552512);
+emit_32(1116000263);
+emit_32(1098063859);
+emit_32(3279552512);
+emit_32(1116512256);
+emit_32(1098990748);
+emit_32(3279552512);
+emit_32(1117024263);
+emit_32(1099487406);
+emit_32(3279552512);
+emit_32(1117536256);
+emit_32(1099589956);
+emit_32(3279552512);
+emit_32(1118048263);
+emit_32(1100319660);
+emit_32(3279552512);
+emit_32(1118560256);
+emit_32(1100278032);
+emit_32(3279552512);
+emit_32(1119072263);
+emit_32(1099978821);
+emit_32(3279552512);
+emit_32(1119584256);
+emit_32(1100109840);
+emit_32(3279552512);
+emit_32(1120096263);
+emit_32(1100236089);
+emit_32(3279552512);
+emit_32(1120608322);
+emit_32(1100377385);
+emit_32(3279552512);
+emit_32(1121120289);
+emit_32(1102160173);
+emit_32(3279552512);
+emit_32(1121632256);
+emit_32(1103122924);
+emit_32(3279552512);
+emit_32(1122144223);
+emit_32(1103474721);
+emit_32(3279552512);
+emit_32(1122656322);
+emit_32(1103248805);
+emit_32(3279552512);
+emit_32(1123168289);
+emit_32(1102632819);
+emit_32(3279552512);
+emit_32(1123680256);
+emit_32(1102047399);
+emit_32(3279552512);
+emit_32(1124132848);
+emit_32(1101668391);
+emit_32(3279552512);
+emit_32(1124388897);
+emit_32(1100761740);
+emit_32(3279552512);
+emit_32(1124644880);
+emit_32(1100232943);
+emit_32(3279552512);
+emit_32(1124900864);
+emit_32(1098887306);
+emit_32(3279552512);
+emit_32(1125156848);
+emit_32(1097709860);
+emit_32(3279552512);
+emit_32(1125412897);
+emit_32(1096144126);
+emit_32(3279552512);
+emit_32(1125668880);
+emit_32(1095560803);
+emit_32(3279552512);
+emit_32(1125924864);
+emit_32(1096148740);
+emit_32(3279552512);
+emit_32(1126180848);
+emit_32(1095494428);
+emit_32(3279552512);
+emit_32(1126436897);
+emit_32(1093780950);
+emit_32(3279552512);
+emit_32(1126692880);
+emit_32(1092196667);
+emit_32(3279552512);
+emit_32(1126948864);
+emit_32(1091446736);
+emit_32(3279552512);
+emit_32(1127204848);
+emit_32(1090928352);
+emit_32(3279552512);
+emit_32(1127460897);
+emit_32(1090343508);
+emit_32(3279552512);
+emit_32(1127716880);
+emit_32(1089285495);
+emit_32(3279552512);
+emit_32(1127972864);
+emit_32(1088381665);
+emit_32(3279552512);
+emit_32(1128228848);
+emit_32(1088857949);
+emit_32(3279552512);
+emit_32(1128484897);
+emit_32(1086741545);
+emit_32(3279552512);
+emit_32(1128740880);
+emit_32(1082250913);
+emit_32(3279552512);
+emit_32(1128996864);
+emit_32(1083512120);
+emit_32(3279552512);
+emit_32(1129252848);
+emit_32(1081116417);
+emit_32(3279552512);
+emit_32(1129508897);
+emit_32(1082497517);
+emit_32(3279552512);
+emit_32(1129764880);
+emit_32(1082917200);
+emit_32(3279552512);
+emit_32(1130020864);
+emit_32(1083584702);
+emit_32(3279552512);
+emit_32(1130276848);
+emit_32(1086066325);
+emit_32(3279552512);
+emit_32(1130532897);
+emit_32(1086918125);
+emit_32(3279552512);
+emit_32(1130788880);
+emit_32(1088867533);
+emit_32(3279552512);
+emit_32(1131044864);
+emit_32(1089594720);
+emit_32(3279552512);
+emit_32(1131300848);
+emit_32(1090391575);
+emit_32(3279552512);
+emit_32(1131556897);
+emit_32(1092483358);
+emit_32(3279552512);
+emit_32(1131812880);
+emit_32(1094289405);
+emit_32(3279552512);
+emit_32(1132068864);
+emit_32(1096120323);
+emit_32(3279552512);
+emit_start(Landscape08Vtx)
+emit_32(3279552512);
+emit_32(1106761482);
+emit_32(3271616496);
+emit_32(3279552512);
+emit_32(1106982994);
+emit_32(3271163904);
+emit_32(3279296528);
+emit_32(1107171947);
+emit_32(3271616496);
+emit_32(3279296528);
+emit_32(1106990334);
+emit_32(3271163904);
+emit_32(3279040545);
+emit_32(1107445390);
+emit_32(3271616496);
+emit_32(3279040545);
+emit_32(1107378569);
+emit_32(3271163904);
+emit_32(3278784496);
+emit_32(1107535462);
+emit_32(3271616496);
+emit_32(3278784496);
+emit_32(1107553734);
+emit_32(3271163904);
+emit_32(3278528512);
+emit_32(1107451314);
+emit_32(3271616496);
+emit_32(3278528512);
+emit_32(1107478761);
+emit_32(3271163904);
+emit_32(3278272528);
+emit_32(1106913945);
+emit_32(3271616496);
+emit_32(3278272528);
+emit_32(1106962389);
+emit_32(3271163904);
+emit_32(3278016545);
+emit_32(1106520939);
+emit_32(3271616496);
+emit_32(3278016545);
+emit_32(1105953607);
+emit_32(3271163904);
+emit_32(3277760496);
+emit_32(1106354163);
+emit_32(3271616496);
+emit_32(3277760496);
+emit_32(1105995497);
+emit_32(3271163904);
+emit_32(3277504512);
+emit_32(1106487909);
+emit_32(3271616496);
+emit_32(3277504512);
+emit_32(1105958325);
+emit_32(3271163904);
+emit_32(3277248528);
+emit_32(1106611588);
+emit_32(3271616496);
+emit_32(3277248528);
+emit_32(1106168041);
+emit_32(3271163904);
+emit_32(3276992545);
+emit_32(1106511659);
+emit_32(3271616496);
+emit_32(3276992545);
+emit_32(1106461590);
+emit_32(3271163904);
+emit_32(3276736496);
+emit_32(1106390601);
+emit_32(3271616496);
+emit_32(3276736496);
+emit_32(1106400248);
+emit_32(3271163904);
+emit_32(3276480512);
+emit_32(1105922621);
+emit_32(3271616496);
+emit_32(3276480512);
+emit_32(1105590904);
+emit_32(3271163904);
+emit_32(3276224528);
+emit_32(1105564690);
+emit_32(3271616496);
+emit_32(3276224528);
+emit_32(1105294315);
+emit_32(3271163904);
+emit_32(3275968545);
+emit_32(1105186941);
+emit_32(3271616496);
+emit_32(3275968545);
+emit_32(1104823661);
+emit_32(3271163904);
+emit_32(3275712496);
+emit_32(1104211817);
+emit_32(3271616496);
+emit_32(3275712496);
+emit_32(1103994185);
+emit_32(3271163904);
+emit_32(3275456512);
+emit_32(1103031068);
+emit_32(3271616496);
+emit_32(3275456512);
+emit_32(1102728764);
+emit_32(3271163904);
+emit_32(3275200528);
+emit_32(1102027162);
+emit_32(3271616496);
+emit_32(3275200528);
+emit_32(1102137996);
+emit_32(3271163904);
+emit_32(3274944545);
+emit_32(1100836923);
+emit_32(3271616496);
+emit_32(3274944545);
+emit_32(1101349782);
+emit_32(3271163904);
+emit_32(3274688496);
+emit_32(1099615804);
+emit_32(3271616496);
+emit_32(3274688496);
+emit_32(1100398356);
+emit_32(3271163904);
+emit_32(3274432512);
+emit_32(1098688915);
+emit_32(3271616496);
+emit_32(3274432512);
+emit_32(1099098489);
+emit_32(3271163904);
+emit_32(3274176528);
+emit_32(1097203188);
+emit_32(3271616496);
+emit_32(3274176528);
+emit_32(1097575747);
+emit_32(3271163904);
+emit_32(3273920545);
+emit_32(1095228300);
+emit_32(3271616496);
+emit_32(3273920545);
+emit_32(1095747135);
+emit_32(3271163904);
+emit_32(3273664496);
+emit_32(1093720657);
+emit_32(3271616496);
+emit_32(3273664496);
+emit_32(1094011427);
+emit_32(3271163904);
+emit_32(3273408512);
+emit_32(1091725553);
+emit_32(3271616496);
+emit_32(3273408512);
+emit_32(1092817099);
+emit_32(3271163904);
+emit_32(3273152528);
+emit_32(1087752037);
+emit_32(3271616496);
+emit_32(3273152528);
+emit_32(1090935010);
+emit_32(3271163904);
+emit_32(3272896545);
+emit_32(1085425309);
+emit_32(3271616496);
+emit_32(3272896545);
+emit_32(1086813205);
+emit_32(3271163904);
+emit_32(3272640496);
+emit_32(1084703847);
+emit_32(3271616496);
+emit_32(3272640496);
+emit_32(1085254874);
+emit_32(3271163904);
+emit_32(3272384512);
+emit_32(1086064186);
+emit_32(3271616496);
+emit_32(3272384512);
+emit_32(1084610859);
+emit_32(3271163904);
+emit_32(3272128528);
+emit_32(1088120192);
+emit_32(3271616496);
+emit_32(3272128528);
+emit_32(1085403226);
+emit_32(3271163904);
+emit_32(3271872545);
+emit_32(1088130111);
+emit_32(3271616496);
+emit_32(3271872545);
+emit_32(1085803741);
+emit_32(3271163904);
+emit_32(3271616496);
+emit_32(1088638754);
+emit_32(3271616496);
+emit_32(3271616496);
+emit_32(1084901902);
+emit_32(3271163904);
+emit_32(3271163904);
+emit_32(1089569596);
+emit_32(3271616496);
+emit_32(3271163904);
+emit_32(1086653402);
+emit_32(3271163904);
+emit_32(3270651937);
+emit_32(1090542371);
+emit_32(3271616496);
+emit_32(3270651937);
+emit_32(1089541201);
+emit_32(3271163904);
+emit_32(3270139970);
+emit_32(1091253725);
+emit_32(3271616496);
+emit_32(3270139970);
+emit_32(1090924587);
+emit_32(3271163904);
+emit_32(3269627871);
+emit_32(1091983785);
+emit_32(3271616496);
+emit_32(3269627871);
+emit_32(1091193002);
+emit_32(3271163904);
+emit_32(3269115904);
+emit_32(1091362609);
+emit_32(3271616496);
+emit_32(3269115904);
+emit_32(1091042709);
+emit_32(3271163904);
+emit_32(3268603937);
+emit_32(1092022341);
+emit_32(3271616496);
+emit_32(3268603937);
+emit_32(1091824318);
+emit_32(3271163904);
+emit_32(3268091970);
+emit_32(1093526356);
+emit_32(3271616496);
+emit_32(3268091970);
+emit_32(1094207721);
+emit_32(3271163904);
+emit_32(3267579911);
+emit_32(1095594567);
+emit_32(3271616496);
+emit_32(3267579911);
+emit_32(1096193199);
+emit_32(3271163904);
+emit_32(3267067904);
+emit_32(1097671796);
+emit_32(3271616496);
+emit_32(3267067904);
+emit_32(1098383045);
+emit_32(3271163904);
+emit_32(3266555911);
+emit_32(1099231658);
+emit_32(3271616496);
+emit_32(3266555911);
+emit_32(1099615542);
+emit_32(3271163904);
+emit_32(3266043904);
+emit_32(1101135662);
+emit_32(3271616496);
+emit_32(3266043904);
+emit_32(1101433038);
+emit_32(3271163904);
+emit_32(3265531911);
+emit_32(1102943093);
+emit_32(3271616496);
+emit_32(3265531911);
+emit_32(1103595045);
+emit_32(3271163904);
+emit_32(3265019904);
+emit_32(1104383889);
+emit_32(3271616496);
+emit_32(3265019904);
+emit_32(1105129950);
+emit_32(3271163904);
+emit_32(3264507911);
+emit_32(1105613344);
+emit_32(3271616496);
+emit_32(3264507911);
+emit_32(1106326061);
+emit_32(3271163904);
+emit_32(3263995904);
+emit_32(1106984409);
+emit_32(3271616496);
+emit_32(3263995904);
+emit_32(1107411652);
+emit_32(3271163904);
+emit_32(3263483911);
+emit_32(1107639822);
+emit_32(3271616496);
+emit_32(3263483911);
+emit_32(1107887050);
+emit_32(3271163904);
+emit_32(3262775296);
+emit_32(1108306507);
+emit_32(3271616496);
+emit_32(3262775296);
+emit_32(1108492236);
+emit_32(3271163904);
+emit_32(3261751309);
+emit_32(1108863825);
+emit_32(3271616496);
+emit_32(3261751309);
+emit_32(1109105757);
+emit_32(3271163904);
+emit_32(3260727296);
+emit_32(1109236279);
+emit_32(3271616496);
+emit_32(3260727296);
+emit_32(1109424656);
+emit_32(3271163904);
+emit_32(3259703309);
+emit_32(1109566004);
+emit_32(3271616496);
+emit_32(3259703309);
+emit_32(1109901784);
+emit_32(3271163904);
+emit_32(3258679296);
+emit_32(1109626611);
+emit_32(3271616496);
+emit_32(3258679296);
+emit_32(1109885321);
+emit_32(3271163904);
+emit_32(3257655309);
+emit_32(1109381454);
+emit_32(3271616496);
+emit_32(3257655309);
+emit_32(1109822564);
+emit_32(3271163904);
+emit_32(3256631296);
+emit_32(1109416817);
+emit_32(3271616496);
+emit_32(3256631296);
+emit_32(1109824163);
+emit_32(3271163904);
+emit_32(3255607309);
+emit_32(1109214704);
+emit_32(3271616496);
+emit_32(3255607309);
+emit_32(1109730315);
+emit_32(3271163904);
+emit_32(3254386688);
+emit_32(1109356052);
+emit_32(3271616496);
+emit_32(3254386688);
+emit_32(1109803113);
+emit_32(3271163904);
+emit_32(3252338714);
+emit_32(1109796533);
+emit_32(3271616496);
+emit_32(3252338714);
+emit_32(1109995186);
+emit_32(3271163904);
+emit_32(3250290688);
+emit_32(1110456690);
+emit_32(3271616496);
+emit_32(3250290688);
+emit_32(1110434618);
+emit_32(3271163904);
+emit_32(3248242714);
+emit_32(1110816797);
+emit_32(3271616496);
+emit_32(3248242714);
+emit_32(1111024783);
+emit_32(3271163904);
+emit_32(3245998080);
+emit_32(1111345699);
+emit_32(3271616496);
+emit_32(3245998080);
+emit_32(1111309785);
+emit_32(3271163904);
+emit_32(3241902132);
+emit_32(1111491032);
+emit_32(3271616496);
+emit_32(3241902132);
+emit_32(1111384208);
+emit_32(3271163904);
+emit_32(3237609472);
+emit_32(1111509356);
+emit_32(3271616496);
+emit_32(3237609472);
+emit_32(1111783952);
+emit_32(3271163904);
+emit_32(3229220864);
+emit_32(1111680693);
+emit_32(3271616496);
+emit_32(3229220864);
+emit_32(1111918930);
+emit_32(3271163904);
+emit_32(0);
+emit_32(1111962419);
+emit_32(3271616496);
+emit_32(0);
+emit_32(1112106100);
+emit_32(3271163904);
+emit_32(1081737216);
+emit_32(1112138475);
+emit_32(3271616496);
+emit_32(1081737216);
+emit_32(1112094042);
+emit_32(3271163904);
+emit_32(3279552512);
+emit_32(1106831999);
+emit_32(3271872545);
+emit_32(3279296528);
+emit_32(1107221283);
+emit_32(3271872545);
+emit_32(3279040545);
+emit_32(1107491448);
+emit_32(3271872545);
+emit_32(3278784496);
+emit_32(1107603856);
+emit_32(3271872545);
+emit_32(3278528512);
+emit_32(1107347427);
+emit_32(3271872545);
+emit_32(3278272528);
+emit_32(1107241678);
+emit_32(3271872545);
+emit_32(3278016545);
+emit_32(1107331016);
+emit_32(3271872545);
+emit_32(3277760496);
+emit_32(1107339012);
+emit_32(3271872545);
+emit_32(3277504512);
+emit_32(1106970935);
+emit_32(3271872545);
+emit_32(3277248528);
+emit_32(1106766096);
+emit_32(3271872545);
+emit_32(3276992545);
+emit_32(1106540075);
+emit_32(3271872545);
+emit_32(3276736496);
+emit_32(1106320661);
+emit_32(3271872545);
+emit_32(3276480512);
+emit_32(1106168093);
+emit_32(3271872545);
+emit_32(3276224528);
+emit_32(1105508591);
+emit_32(3271872545);
+emit_32(3275968545);
+emit_32(1104919711);
+emit_32(3271872545);
+emit_32(3275712496);
+emit_32(1103890062);
+emit_32(3271872545);
+emit_32(3275456512);
+emit_32(1102724412);
+emit_32(3271872545);
+emit_32(3275200528);
+emit_32(1101678300);
+emit_32(3271872545);
+emit_32(3274944545);
+emit_32(1100687815);
+emit_32(3271872545);
+emit_32(3274688496);
+emit_32(1100014525);
+emit_32(3271872545);
+emit_32(3274432512);
+emit_32(1099108503);
+emit_32(3271872545);
+emit_32(3274176528);
+emit_32(1097338769);
+emit_32(3271872545);
+emit_32(3273920545);
+emit_32(1095563634);
+emit_32(3271872545);
+emit_32(3273664496);
+emit_32(1093020942);
+emit_32(3271872545);
+emit_32(3273408512);
+emit_32(1090382432);
+emit_32(3271872545);
+emit_32(3273152528);
+emit_32(1088955592);
+emit_32(3271872545);
+emit_32(3272896545);
+emit_32(1086743621);
+emit_32(3271872545);
+emit_32(3272640496);
+emit_32(1086106171);
+emit_32(3271872545);
+emit_32(3272384512);
+emit_32(1087622538);
+emit_32(3271872545);
+emit_32(3272128528);
+emit_32(1089541390);
+emit_32(3271872545);
+emit_32(3271872545);
+emit_32(1090739493);
+emit_32(3271872545);
+emit_32(3271616496);
+emit_32(1091296192);
+emit_32(3271872545);
+emit_32(3271163904);
+emit_32(1091536652);
+emit_32(3271872545);
+emit_32(3270651937);
+emit_32(1092000751);
+emit_32(3271872545);
+emit_32(3270139970);
+emit_32(1092665265);
+emit_32(3271872545);
+emit_32(3269627871);
+emit_32(1092064683);
+emit_32(3271872545);
+emit_32(3269115904);
+emit_32(1092005921);
+emit_32(3271872545);
+emit_32(3268603937);
+emit_32(1092949220);
+emit_32(3271872545);
+emit_32(3268091970);
+emit_32(1093979446);
+emit_32(3271872545);
+emit_32(3267579911);
+emit_32(1095270977);
+emit_32(3271872545);
+emit_32(3267067904);
+emit_32(1097543031);
+emit_32(3271872545);
+emit_32(3266555911);
+emit_32(1099248173);
+emit_32(3271872545);
+emit_32(3266043904);
+emit_32(1100580441);
+emit_32(3271872545);
+emit_32(3265531911);
+emit_32(1102805677);
+emit_32(3271872545);
+emit_32(3265019904);
+emit_32(1104235935);
+emit_32(3271872545);
+emit_32(3264507911);
+emit_32(1105586553);
+emit_32(3271872545);
+emit_32(3263995904);
+emit_32(1106838605);
+emit_32(3271872545);
+emit_32(3263483911);
+emit_32(1107360534);
+emit_32(3271872545);
+emit_32(3262775296);
+emit_32(1107828487);
+emit_32(3271872545);
+emit_32(3261751309);
+emit_32(1108377181);
+emit_32(3271872545);
+emit_32(3260727296);
+emit_32(1108949179);
+emit_32(3271872545);
+emit_32(3259703309);
+emit_32(1109077157);
+emit_32(3271872545);
+emit_32(3258679296);
+emit_32(1109165841);
+emit_32(3271872545);
+emit_32(3257655309);
+emit_32(1109169589);
+emit_32(3271872545);
+emit_32(3256631296);
+emit_32(1108993167);
+emit_32(3271872545);
+emit_32(3255607309);
+emit_32(1108949362);
+emit_32(3271872545);
+emit_32(3254386688);
+emit_32(1109262310);
+emit_32(3271872545);
+emit_32(3252338714);
+emit_32(1109890250);
+emit_32(3271872545);
+emit_32(3250290688);
+emit_32(1110249177);
+emit_32(3271872545);
+emit_32(3248242714);
+emit_32(1110644779);
+emit_32(3271872545);
+emit_32(3245998080);
+emit_32(1111031572);
+emit_32(3271872545);
+emit_32(3241902132);
+emit_32(1111347089);
+emit_32(3271872545);
+emit_32(3237609472);
+emit_32(1111265300);
+emit_32(3271872545);
+emit_32(3229220864);
+emit_32(1111507023);
+emit_32(3271872545);
+emit_32(0);
+emit_32(1111638698);
+emit_32(3271872545);
+emit_32(1081737216);
+emit_32(1111780334);
+emit_32(3271872545);
+emit_32(3279552512);
+emit_32(1106638851);
+emit_32(3272128528);
+emit_32(3279296528);
+emit_32(1106692434);
+emit_32(3272128528);
+emit_32(3279040545);
+emit_32(1107345539);
+emit_32(3272128528);
+emit_32(3278784496);
+emit_32(1107597459);
+emit_32(3272128528);
+emit_32(3278528512);
+emit_32(1107379225);
+emit_32(3272128528);
+emit_32(3278272528);
+emit_32(1107456950);
+emit_32(3272128528);
+emit_32(3278016545);
+emit_32(1107643492);
+emit_32(3272128528);
+emit_32(3277760496);
+emit_32(1107464788);
+emit_32(3272128528);
+emit_32(3277504512);
+emit_32(1107237641);
+emit_32(3272128528);
+emit_32(3277248528);
+emit_32(1107040666);
+emit_32(3272128528);
+emit_32(3276992545);
+emit_32(1106355945);
+emit_32(3272128528);
+emit_32(3276736496);
+emit_32(1106248938);
+emit_32(3272128528);
+emit_32(3276480512);
+emit_32(1106022184);
+emit_32(3272128528);
+emit_32(3276224528);
+emit_32(1105264378);
+emit_32(3272128528);
+emit_32(3275968545);
+emit_32(1104551084);
+emit_32(3272128528);
+emit_32(3275712496);
+emit_32(1103522693);
+emit_32(3272128528);
+emit_32(3275456512);
+emit_32(1102465624);
+emit_32(3272128528);
+emit_32(3275200528);
+emit_32(1101580416);
+emit_32(3272128528);
+emit_32(3274944545);
+emit_32(1100781558);
+emit_32(3272128528);
+emit_32(3274688496);
+emit_32(1099917584);
+emit_32(3272128528);
+emit_32(3274432512);
+emit_32(1098955253);
+emit_32(3272128528);
+emit_32(3274176528);
+emit_32(1097496474);
+emit_32(3272128528);
+emit_32(3273920545);
+emit_32(1095188768);
+emit_32(3272128528);
+emit_32(3273664496);
+emit_32(1092550792);
+emit_32(3272128528);
+emit_32(3273408512);
+emit_32(1090256602);
+emit_32(3272128528);
+emit_32(3273152528);
+emit_32(1088560866);
+emit_32(3272128528);
+emit_32(3272896545);
+emit_32(1086795610);
+emit_32(3272128528);
+emit_32(3272640496);
+emit_32(1087160745);
+emit_32(3272128528);
+emit_32(3272384512);
+emit_32(1088465991);
+emit_32(3272128528);
+emit_32(3272128528);
+emit_32(1090214701);
+emit_32(3272128528);
+emit_32(3271872545);
+emit_32(1091916110);
+emit_32(3272128528);
+emit_32(3271616496);
+emit_32(1093188714);
+emit_32(3272128528);
+emit_32(3271163904);
+emit_32(1092821503);
+emit_32(3272128528);
+emit_32(3270651937);
+emit_32(1092462943);
+emit_32(3272128528);
+emit_32(3270139970);
+emit_32(1092871730);
+emit_32(3272128528);
+emit_32(3269627871);
+emit_32(1092567339);
+emit_32(3272128528);
+emit_32(3269115904);
+emit_32(1091624103);
+emit_32(3272128528);
+emit_32(3268603937);
+emit_32(1092971030);
+emit_32(3272128528);
+emit_32(3268091970);
+emit_32(1093964556);
+emit_32(3272128528);
+emit_32(3267579911);
+emit_32(1095084959);
+emit_32(3272128528);
+emit_32(3267067904);
+emit_32(1096871523);
+emit_32(3272128528);
+emit_32(3266555911);
+emit_32(1098883740);
+emit_32(3272128528);
+emit_32(3266043904);
+emit_32(1100410939);
+emit_32(3272128528);
+emit_32(3265531911);
+emit_32(1102172809);
+emit_32(3272128528);
+emit_32(3265019904);
+emit_32(1103650777);
+emit_32(3272128528);
+emit_32(3264507911);
+emit_32(1105013087);
+emit_32(3272128528);
+emit_32(3263995904);
+emit_32(1105804657);
+emit_32(3272128528);
+emit_32(3263483911);
+emit_32(1106638642);
+emit_32(3272128528);
+emit_32(3262775296);
+emit_32(1107472469);
+emit_32(3272128528);
+emit_32(3261751309);
+emit_32(1107957436);
+emit_32(3272128528);
+emit_32(3260727296);
+emit_32(1108447173);
+emit_32(3272128528);
+emit_32(3259703309);
+emit_32(1108395845);
+emit_32(3272128528);
+emit_32(3258679296);
+emit_32(1108480990);
+emit_32(3272128528);
+emit_32(3257655309);
+emit_32(1108416004);
+emit_32(3272128528);
+emit_32(3256631296);
+emit_32(1108454539);
+emit_32(3272128528);
+emit_32(3255607309);
+emit_32(1108650702);
+emit_32(3272128528);
+emit_32(3254386688);
+emit_32(1108972221);
+emit_32(3272128528);
+emit_32(3252338714);
+emit_32(1109614028);
+emit_32(3272128528);
+emit_32(3250290688);
+emit_32(1110107567);
+emit_32(3272128528);
+emit_32(3248242714);
+emit_32(1110378204);
+emit_32(3272128528);
+emit_32(3245998080);
+emit_32(1110643966);
+emit_32(3272128528);
+emit_32(3241902132);
+emit_32(1110789770);
+emit_32(3272128528);
+emit_32(3237609472);
+emit_32(1111079780);
+emit_32(3272128528);
+emit_32(3229220864);
+emit_32(1111310572);
+emit_32(3272128528);
+emit_32(0);
+emit_32(1111599245);
+emit_32(3272128528);
+emit_32(1081737216);
+emit_32(1111464346);
+emit_32(3272128528);
+emit_32(3279552512);
+emit_32(1105805967);
+emit_32(3272384512);
+emit_32(3279296528);
+emit_32(1106518894);
+emit_32(3272384512);
+emit_32(3279040545);
+emit_32(1107073958);
+emit_32(3272384512);
+emit_32(3278784496);
+emit_32(1107138550);
+emit_32(3272384512);
+emit_32(3278528512);
+emit_32(1107533837);
+emit_32(3272384512);
+emit_32(3278272528);
+emit_32(1107630542);
+emit_32(3272384512);
+emit_32(3278016545);
+emit_32(1107506050);
+emit_32(3272384512);
+emit_32(3277760496);
+emit_32(1107593265);
+emit_32(3272384512);
+emit_32(3277504512);
+emit_32(1107310490);
+emit_32(3272384512);
+emit_32(3277248528);
+emit_32(1106912058);
+emit_32(3272384512);
+emit_32(3276992545);
+emit_32(1106372356);
+emit_32(3272384512);
+emit_32(3276736496);
+emit_32(1106038489);
+emit_32(3272384512);
+emit_32(3276480512);
+emit_32(1105442531);
+emit_32(3272384512);
+emit_32(3276224528);
+emit_32(1104607235);
+emit_32(3272384512);
+emit_32(3275968545);
+emit_32(1103592686);
+emit_32(3272384512);
+emit_32(3275712496);
+emit_32(1102531265);
+emit_32(3272384512);
+emit_32(3275456512);
+emit_32(1101975100);
+emit_32(3272384512);
+emit_32(3275200528);
+emit_32(1101237322);
+emit_32(3272384512);
+emit_32(3274944545);
+emit_32(1100189794);
+emit_32(3272384512);
+emit_32(3274688496);
+emit_32(1099519335);
+emit_32(3272384512);
+emit_32(3274432512);
+emit_32(1098076861);
+emit_32(3272384512);
+emit_32(3274176528);
+emit_32(1096265132);
+emit_32(3272384512);
+emit_32(3273920545);
+emit_32(1094474583);
+emit_32(3272384512);
+emit_32(3273664496);
+emit_32(1091850260);
+emit_32(3272384512);
+emit_32(3273408512);
+emit_32(1089607366);
+emit_32(3272384512);
+emit_32(3273152528);
+emit_32(1087214767);
+emit_32(3272384512);
+emit_32(3272896545);
+emit_32(1087594331);
+emit_32(3272384512);
+emit_32(3272640496);
+emit_32(1087250901);
+emit_32(3272384512);
+emit_32(3272384512);
+emit_32(1087478526);
+emit_32(3272384512);
+emit_32(3272128528);
+emit_32(1089739004);
+emit_32(3272384512);
+emit_32(3271872545);
+emit_32(1091784944);
+emit_32(3272384512);
+emit_32(3271616496);
+emit_32(1093147086);
+emit_32(3272384512);
+emit_32(3271163904);
+emit_32(1093336249);
+emit_32(3272384512);
+emit_32(3270651937);
+emit_32(1091955799);
+emit_32(3272384512);
+emit_32(3270139970);
+emit_32(1092128436);
+emit_32(3272384512);
+emit_32(3269627871);
+emit_32(1091415572);
+emit_32(3272384512);
+emit_32(3269115904);
+emit_32(1091890787);
+emit_32(3272384512);
+emit_32(3268603937);
+emit_32(1092277691);
+emit_32(3272384512);
+emit_32(3268091970);
+emit_32(1093164912);
+emit_32(3272384512);
+emit_32(3267579911);
+emit_32(1094506355);
+emit_32(3272384512);
+emit_32(3267067904);
+emit_32(1095937556);
+emit_32(3272384512);
+emit_32(3266555911);
+emit_32(1098124362);
+emit_32(3272384512);
+emit_32(3266043904);
+emit_32(1100012533);
+emit_32(3272384512);
+emit_32(3265531911);
+emit_32(1101424440);
+emit_32(3272384512);
+emit_32(3265019904);
+emit_32(1102978797);
+emit_32(3272384512);
+emit_32(3264507911);
+emit_32(1103996754);
+emit_32(3272384512);
+emit_32(3263995904);
+emit_32(1104943566);
+emit_32(3272384512);
+emit_32(3263483911);
+emit_32(1106152836);
+emit_32(3272384512);
+emit_32(3262775296);
+emit_32(1107158211);
+emit_32(3272384512);
+emit_32(3261751309);
+emit_32(1107529328);
+emit_32(3272384512);
+emit_32(3260727296);
+emit_32(1107846470);
+emit_32(3272384512);
+emit_32(3259703309);
+emit_32(1107994739);
+emit_32(3272384512);
+emit_32(3258679296);
+emit_32(1107829064);
+emit_32(3272384512);
+emit_32(3257655309);
+emit_32(1107762165);
+emit_32(3272384512);
+emit_32(3256631296);
+emit_32(1107865711);
+emit_32(3272384512);
+emit_32(3255607309);
+emit_32(1108367403);
+emit_32(3272384512);
+emit_32(3254386688);
+emit_32(1109093568);
+emit_32(3272384512);
+emit_32(3252338714);
+emit_32(1109542411);
+emit_32(3272384512);
+emit_32(3250290688);
+emit_32(1110096793);
+emit_32(3272384512);
+emit_32(3248242714);
+emit_32(1110312223);
+emit_32(3272384512);
+emit_32(3245998080);
+emit_32(1110368505);
+emit_32(3272384512);
+emit_32(3241902132);
+emit_32(1110406752);
+emit_32(3272384512);
+emit_32(3237609472);
+emit_32(1110868545);
+emit_32(3272384512);
+emit_32(3229220864);
+emit_32(1111168464);
+emit_32(3272384512);
+emit_32(0);
+emit_32(1111261315);
+emit_32(3272384512);
+emit_32(1081737216);
+emit_32(1111298697);
+emit_32(3272384512);
+emit_32(3279552512);
+emit_32(1105376733);
+emit_32(3272640496);
+emit_32(3279296528);
+emit_32(1106021659);
+emit_32(3272640496);
+emit_32(3279040545);
+emit_32(1106269805);
+emit_32(3272640496);
+emit_32(3278784496);
+emit_32(1106578978);
+emit_32(3272640496);
+emit_32(3278528512);
+emit_32(1107451288);
+emit_32(3272640496);
+emit_32(3278272528);
+emit_32(1107638616);
+emit_32(3272640496);
+emit_32(3278016545);
+emit_32(1107539132);
+emit_32(3272640496);
+emit_32(3277760496);
+emit_32(1107436844);
+emit_32(3272640496);
+emit_32(3277504512);
+emit_32(1107235701);
+emit_32(3272640496);
+emit_32(3277248528);
+emit_32(1107161462);
+emit_32(3272640496);
+emit_32(3276992545);
+emit_32(1106065280);
+emit_32(3272640496);
+emit_32(3276736496);
+emit_32(1105372171);
+emit_32(3272640496);
+emit_32(3276480512);
+emit_32(1104578662);
+emit_32(3272640496);
+emit_32(3276224528);
+emit_32(1103665876);
+emit_32(3272640496);
+emit_32(3275968545);
+emit_32(1102629464);
+emit_32(3272640496);
+emit_32(3275712496);
+emit_32(1101635885);
+emit_32(3272640496);
+emit_32(3275456512);
+emit_32(1101146882);
+emit_32(3272640496);
+emit_32(3275200528);
+emit_32(1100175848);
+emit_32(3272640496);
+emit_32(3274944545);
+emit_32(1099030961);
+emit_32(3272640496);
+emit_32(3274688496);
+emit_32(1097580151);
+emit_32(3272640496);
+emit_32(3274432512);
+emit_32(1096760374);
+emit_32(3272640496);
+emit_32(3274176528);
+emit_32(1095282721);
+emit_32(3272640496);
+emit_32(3273920545);
+emit_32(1093280465);
+emit_32(3272640496);
+emit_32(3273664496);
+emit_32(1091084065);
+emit_32(3272640496);
+emit_32(3273408512);
+emit_32(1089099247);
+emit_32(3272640496);
+emit_32(3273152528);
+emit_32(1087789576);
+emit_32(3272640496);
+emit_32(3272896545);
+emit_32(1085020140);
+emit_32(3272640496);
+emit_32(3272640496);
+emit_32(1085329784);
+emit_32(3272640496);
+emit_32(3272384512);
+emit_32(1086214027);
+emit_32(3272640496);
+emit_32(3272128528);
+emit_32(1088756363);
+emit_32(3272640496);
+emit_32(3271872545);
+emit_32(1091099217);
+emit_32(3272640496);
+emit_32(3271616496);
+emit_32(1092281151);
+emit_32(3272640496);
+emit_32(3271163904);
+emit_32(1092410891);
+emit_32(3272640496);
+emit_32(3270651937);
+emit_32(1092270707);
+emit_32(3272640496);
+emit_32(3270139970);
+emit_32(1092436770);
+emit_32(3272640496);
+emit_32(3269627871);
+emit_32(1091996431);
+emit_32(3272640496);
+emit_32(3269115904);
+emit_32(1092130995);
+emit_32(3272640496);
+emit_32(3268603937);
+emit_32(1092506794);
+emit_32(3272640496);
+emit_32(3268091970);
+emit_32(1093085115);
+emit_32(3272640496);
+emit_32(3267579911);
+emit_32(1094064590);
+emit_32(3272640496);
+emit_32(3267067904);
+emit_32(1096463103);
+emit_32(3272640496);
+emit_32(3266555911);
+emit_32(1098582275);
+emit_32(3272640496);
+emit_32(3266043904);
+emit_32(1099782894);
+emit_32(3272640496);
+emit_32(3265531911);
+emit_32(1101033216);
+emit_32(3272640496);
+emit_32(3265019904);
+emit_32(1102204423);
+emit_32(3272640496);
+emit_32(3264507911);
+emit_32(1103112962);
+emit_32(3272640496);
+emit_32(3263995904);
+emit_32(1104476688);
+emit_32(3272640496);
+emit_32(3263483911);
+emit_32(1105600027);
+emit_32(3272640496);
+emit_32(3262775296);
+emit_32(1106773279);
+emit_32(3272640496);
+emit_32(3261751309);
+emit_32(1107254942);
+emit_32(3272640496);
+emit_32(3260727296);
+emit_32(1107325721);
+emit_32(3272640496);
+emit_32(3259703309);
+emit_32(1107680454);
+emit_32(3272640496);
+emit_32(3258679296);
+emit_32(1107700272);
+emit_32(3272640496);
+emit_32(3257655309);
+emit_32(1107704204);
+emit_32(3272640496);
+emit_32(3256631296);
+emit_32(1107913946);
+emit_32(3272640496);
+emit_32(3255607309);
+emit_32(1108409896);
+emit_32(3272640496);
+emit_32(3254386688);
+emit_32(1108866499);
+emit_32(3272640496);
+emit_32(3252338714);
+emit_32(1109485866);
+emit_32(3272640496);
+emit_32(3250290688);
+emit_32(1110027901);
+emit_32(3272640496);
+emit_32(3248242714);
+emit_32(1110441984);
+emit_32(3272640496);
+emit_32(3245998080);
+emit_32(1110489956);
+emit_32(3272640496);
+emit_32(3241902132);
+emit_32(1110446834);
+emit_32(3272640496);
+emit_32(3237609472);
+emit_32(1110725100);
+emit_32(3272640496);
+emit_32(3229220864);
+emit_32(1110855752);
+emit_32(3272640496);
+emit_32(0);
+emit_32(1110654897);
+emit_32(3272640496);
+emit_32(1081737216);
+emit_32(1110766990);
+emit_32(3272640496);
+emit_32(3279552512);
+emit_32(1104945611);
+emit_32(3272896545);
+emit_32(3279296528);
+emit_32(1105445886);
+emit_32(3272896545);
+emit_32(3279040545);
+emit_32(1105654868);
+emit_32(3272896545);
+emit_32(3278784496);
+emit_32(1106191896);
+emit_32(3272896545);
+emit_32(3278528512);
+emit_32(1106771024);
+emit_32(3272896545);
+emit_32(3278272528);
+emit_32(1107252111);
+emit_32(3272896545);
+emit_32(3278016545);
+emit_32(1107581652);
+emit_32(3272896545);
+emit_32(3277760496);
+emit_32(1107333218);
+emit_32(3272896545);
+emit_32(3277504512);
+emit_32(1106792310);
+emit_32(3272896545);
+emit_32(3277248528);
+emit_32(1106541229);
+emit_32(3272896545);
+emit_32(3276992545);
+emit_32(1105789924);
+emit_32(3272896545);
+emit_32(3276736496);
+emit_32(1104474486);
+emit_32(3272896545);
+emit_32(3276480512);
+emit_32(1103776134);
+emit_32(3272896545);
+emit_32(3276224528);
+emit_32(1102639635);
+emit_32(3272896545);
+emit_32(3275968545);
+emit_32(1101601964);
+emit_32(3272896545);
+emit_32(3275712496);
+emit_32(1100849820);
+emit_32(3272896545);
+emit_32(3275456512);
+emit_32(1100186229);
+emit_32(3272896545);
+emit_32(3275200528);
+emit_32(1099765540);
+emit_32(3272896545);
+emit_32(3274944545);
+emit_32(1098773850);
+emit_32(3272896545);
+emit_32(3274688496);
+emit_32(1097286550);
+emit_32(3272896545);
+emit_32(3274432512);
+emit_32(1095977088);
+emit_32(3272896545);
+emit_32(3274176528);
+emit_32(1094472381);
+emit_32(3272896545);
+emit_32(3273920545);
+emit_32(1093136810);
+emit_32(3272896545);
+emit_32(3273664496);
+emit_32(1090824857);
+emit_32(3272896545);
+emit_32(3273408512);
+emit_32(1088942045);
+emit_32(3272896545);
+emit_32(3273152528);
+emit_32(1087994509);
+emit_32(3272896545);
+emit_32(3272896545);
+emit_32(1085242018);
+emit_32(3272896545);
+emit_32(3272640496);
+emit_32(1082368710);
+emit_32(3272896545);
+emit_32(3272384512);
+emit_32(1083511616);
+emit_32(3272896545);
+emit_32(3272128528);
+emit_32(1086745865);
+emit_32(3272896545);
+emit_32(3271872545);
+emit_32(1089841387);
+emit_32(3272896545);
+emit_32(3271616496);
+emit_32(1091645420);
+emit_32(3272896545);
+emit_32(3271163904);
+emit_32(1091360837);
+emit_32(3272896545);
+emit_32(3270651937);
+emit_32(1091891626);
+emit_32(3272896545);
+emit_32(3270139970);
+emit_32(1091846705);
+emit_32(3272896545);
+emit_32(3269627871);
+emit_32(1092497818);
+emit_32(3272896545);
+emit_32(3269115904);
+emit_32(1091767087);
+emit_32(3272896545);
+emit_32(3268603937);
+emit_32(1092058643);
+emit_32(3272896545);
+emit_32(3268091970);
+emit_32(1092782286);
+emit_32(3272896545);
+emit_32(3267579911);
+emit_32(1093942536);
+emit_32(3272896545);
+emit_32(3267067904);
+emit_32(1096261042);
+emit_32(3272896545);
+emit_32(3266555911);
+emit_32(1098731278);
+emit_32(3272896545);
+emit_32(3266043904);
+emit_32(1099753639);
+emit_32(3272896545);
+emit_32(3265531911);
+emit_32(1100349178);
+emit_32(3272896545);
+emit_32(3265019904);
+emit_32(1101287129);
+emit_32(3272896545);
+emit_32(3264507911);
+emit_32(1102874726);
+emit_32(3272896545);
+emit_32(3263995904);
+emit_32(1104299216);
+emit_32(3272896545);
+emit_32(3263483911);
+emit_32(1105581310);
+emit_32(3272896545);
+emit_32(3262775296);
+emit_32(1106449741);
+emit_32(3272896545);
+emit_32(3261751309);
+emit_32(1106767197);
+emit_32(3272896545);
+emit_32(3260727296);
+emit_32(1106996783);
+emit_32(3272896545);
+emit_32(3259703309);
+emit_32(1107252216);
+emit_32(3272896545);
+emit_32(3258679296);
+emit_32(1107420643);
+emit_32(3272896545);
+emit_32(3257655309);
+emit_32(1107319351);
+emit_32(3272896545);
+emit_32(3256631296);
+emit_32(1107826600);
+emit_32(3272896545);
+emit_32(3255607309);
+emit_32(1108251299);
+emit_32(3272896545);
+emit_32(3254386688);
+emit_32(1108771550);
+emit_32(3272896545);
+emit_32(3252338714);
+emit_32(1109302182);
+emit_32(3272896545);
+emit_32(3250290688);
+emit_32(1110005147);
+emit_32(3272896545);
+emit_32(3248242714);
+emit_32(1110267291);
+emit_32(3272896545);
+emit_32(3245998080);
+emit_32(1110424394);
+emit_32(3272896545);
+emit_32(3241902132);
+emit_32(1110409006);
+emit_32(3272896545);
+emit_32(3237609472);
+emit_32(1110530064);
+emit_32(3272896545);
+emit_32(3229220864);
+emit_32(1110513759);
+emit_32(3272896545);
+emit_32(0);
+emit_32(1110086228);
+emit_32(3272896545);
+emit_32(1081737216);
+emit_32(1110289075);
+emit_32(3272896545);
+emit_32(3279552512);
+emit_32(1105076106);
+emit_32(3273152528);
+emit_32(3279296528);
+emit_32(1105334790);
+emit_32(3273152528);
+emit_32(3279040545);
+emit_32(1105218241);
+emit_32(3273152528);
+emit_32(3278784496);
+emit_32(1105960947);
+emit_32(3273152528);
+emit_32(3278528512);
+emit_32(1107217980);
+emit_32(3273152528);
+emit_32(3278272528);
+emit_32(1107295574);
+emit_32(3273152528);
+emit_32(3278016545);
+emit_32(1107365331);
+emit_32(3273152528);
+emit_32(3277760496);
+emit_32(1107416134);
+emit_32(3273152528);
+emit_32(3277504512);
+emit_32(1106446438);
+emit_32(3273152528);
+emit_32(3277248528);
+emit_32(1105782794);
+emit_32(3273152528);
+emit_32(3276992545);
+emit_32(1105013821);
+emit_32(3273152528);
+emit_32(3276736496);
+emit_32(1103915857);
+emit_32(3273152528);
+emit_32(3276480512);
+emit_32(1103026979);
+emit_32(3273152528);
+emit_32(3276224528);
+emit_32(1101908673);
+emit_32(3273152528);
+emit_32(3275968545);
+emit_32(1100983409);
+emit_32(3273152528);
+emit_32(3275712496);
+emit_32(1100304771);
+emit_32(3273152528);
+emit_32(3275456512);
+emit_32(1099637090);
+emit_32(3273152528);
+emit_32(3275200528);
+emit_32(1099595147);
+emit_32(3273152528);
+emit_32(3274944545);
+emit_32(1098779302);
+emit_32(3273152528);
+emit_32(3274688496);
+emit_32(1096597425);
+emit_32(3273152528);
+emit_32(3274432512);
+emit_32(1094709255);
+emit_32(3273152528);
+emit_32(3274176528);
+emit_32(1093592941);
+emit_32(3273152528);
+emit_32(3273920545);
+emit_32(1091822808);
+emit_32(3273152528);
+emit_32(3273664496);
+emit_32(1090429890);
+emit_32(3273152528);
+emit_32(3273408512);
+emit_32(1088328040);
+emit_32(3273152528);
+emit_32(3273152528);
+emit_32(1087421546);
+emit_32(3273152528);
+emit_32(3272896545);
+emit_32(1085534382);
+emit_32(3273152528);
+emit_32(3272640496);
+emit_32(1082800241);
+emit_32(3273152528);
+emit_32(3272384512);
+emit_32(1078440703);
+emit_32(3273152528);
+emit_32(3272128528);
+emit_32(1084200594);
+emit_32(3273152528);
+emit_32(3271872545);
+emit_32(1087678322);
+emit_32(3273152528);
+emit_32(3271616496);
+emit_32(1089442320);
+emit_32(3273152528);
+emit_32(3271163904);
+emit_32(1090607372);
+emit_32(3273152528);
+emit_32(3270651937);
+emit_32(1091531566);
+emit_32(3273152528);
+emit_32(3270139970);
+emit_32(1091674141);
+emit_32(3273152528);
+emit_32(3269627871);
+emit_32(1091966117);
+emit_32(3273152528);
+emit_32(3269115904);
+emit_32(1091542251);
+emit_32(3273152528);
+emit_32(3268603937);
+emit_32(1091342288);
+emit_32(3273152528);
+emit_32(3268091970);
+emit_32(1092373405);
+emit_32(3273152528);
+emit_32(3267579911);
+emit_32(1093066975);
+emit_32(3273152528);
+emit_32(3267067904);
+emit_32(1096397252);
+emit_32(3273152528);
+emit_32(3266555911);
+emit_32(1099075053);
+emit_32(3273152528);
+emit_32(3266043904);
+emit_32(1099796788);
+emit_32(3273152528);
+emit_32(3265531911);
+emit_32(1100246942);
+emit_32(3273152528);
+emit_32(3265019904);
+emit_32(1101066614);
+emit_32(3273152528);
+emit_32(3264507911);
+emit_32(1102540440);
+emit_32(3273152528);
+emit_32(3263995904);
+emit_32(1104067323);
+emit_32(3273152528);
+emit_32(3263483911);
+emit_32(1105420039);
+emit_32(3273152528);
+emit_32(3262775296);
+emit_32(1106257484);
+emit_32(3273152528);
+emit_32(3261751309);
+emit_32(1106472337);
+emit_32(3273152528);
+emit_32(3260727296);
+emit_32(1106731912);
+emit_32(3273152528);
+emit_32(3259703309);
+emit_32(1106956465);
+emit_32(3273152528);
+emit_32(3258679296);
+emit_32(1106821199);
+emit_32(3273152528);
+emit_32(3257655309);
+emit_32(1106379643);
+emit_32(3273152528);
+emit_32(3256631296);
+emit_32(1107530954);
+emit_32(3273152528);
+emit_32(3255607309);
+emit_32(1108003992);
+emit_32(3273152528);
+emit_32(3254386688);
+emit_32(1108557352);
+emit_32(3273152528);
+emit_32(3252338714);
+emit_32(1109091706);
+emit_32(3273152528);
+emit_32(3250290688);
+emit_32(1109753830);
+emit_32(3273152528);
+emit_32(3248242714);
+emit_32(1109939664);
+emit_32(3273152528);
+emit_32(3245998080);
+emit_32(1109999118);
+emit_32(3273152528);
+emit_32(3241902132);
+emit_32(1110432914);
+emit_32(3273152528);
+emit_32(3237609472);
+emit_32(1110537457);
+emit_32(3273152528);
+emit_32(3229220864);
+emit_32(1110226685);
+emit_32(3273152528);
+emit_32(0);
+emit_32(1109884928);
+emit_32(3273152528);
+emit_32(1081737216);
+emit_32(1110106754);
+emit_32(3273152528);
+emit_32(3279552512);
+emit_32(1104836087);
+emit_32(3273408512);
+emit_32(3279296528);
+emit_32(1105132991);
+emit_32(3273408512);
+emit_32(3279040545);
+emit_32(1105059486);
+emit_32(3273408512);
+emit_32(3278784496);
+emit_32(1105434981);
+emit_32(3273408512);
+emit_32(3278528512);
+emit_32(1106513389);
+emit_32(3273408512);
+emit_32(3278272528);
+emit_32(1106841489);
+emit_32(3273408512);
+emit_32(3278016545);
+emit_32(1107378805);
+emit_32(3273408512);
+emit_32(3277760496);
+emit_32(1106914784);
+emit_32(3273408512);
+emit_32(3277504512);
+emit_32(1106011069);
+emit_32(3273408512);
+emit_32(3277248528);
+emit_32(1104591349);
+emit_32(3273408512);
+emit_32(3276992545);
+emit_32(1103757469);
+emit_32(3273408512);
+emit_32(3276736496);
+emit_32(1103249329);
+emit_32(3273408512);
+emit_32(3276480512);
+emit_32(1103030387);
+emit_32(3273408512);
+emit_32(3276224528);
+emit_32(1102188275);
+emit_32(3273408512);
+emit_32(3275968545);
+emit_32(1101338667);
+emit_32(3273408512);
+emit_32(3275712496);
+emit_32(1100738567);
+emit_32(3273408512);
+emit_32(3275456512);
+emit_32(1099970956);
+emit_32(3273408512);
+emit_32(3275200528);
+emit_32(1098288778);
+emit_32(3273408512);
+emit_32(3274944545);
+emit_32(1096724093);
+emit_32(3273408512);
+emit_32(3274688496);
+emit_32(1094523761);
+emit_32(3273408512);
+emit_32(3274432512);
+emit_32(1091893849);
+emit_32(3273408512);
+emit_32(3274176528);
+emit_32(1091370138);
+emit_32(3273408512);
+emit_32(3273920545);
+emit_32(1090570504);
+emit_32(3273408512);
+emit_32(3273664496);
+emit_32(1087323819);
+emit_32(3273408512);
+emit_32(3273408512);
+emit_32(1085981977);
+emit_32(3273408512);
+emit_32(3273152528);
+emit_32(1085699218);
+emit_32(3273408512);
+emit_32(3272896545);
+emit_32(1086443980);
+emit_32(3273408512);
+emit_32(3272640496);
+emit_32(1082061813);
+emit_32(3273408512);
+emit_32(3272384512);
+emit_32(1077123943);
+emit_32(3273408512);
+emit_32(3272128528);
+emit_32(1080172783);
+emit_32(3273408512);
+emit_32(3271872545);
+emit_32(1084168381);
+emit_32(3273408512);
+emit_32(3271616496);
+emit_32(1087820404);
+emit_32(3273408512);
+emit_32(3271163904);
+emit_32(1090796682);
+emit_32(3273408512);
+emit_32(3270651937);
+emit_32(1091577148);
+emit_32(3273408512);
+emit_32(3270139970);
+emit_32(1091446925);
+emit_32(3273408512);
+emit_32(3269627871);
+emit_32(1092098762);
+emit_32(3273408512);
+emit_32(3269115904);
+emit_32(1091744595);
+emit_32(3273408512);
+emit_32(3268603937);
+emit_32(1091408191);
+emit_32(3273408512);
+emit_32(3268091970);
+emit_32(1092385663);
+emit_32(3273408512);
+emit_32(3267579911);
+emit_32(1093825829);
+emit_32(3273408512);
+emit_32(3267067904);
+emit_32(1096198128);
+emit_32(3273408512);
+emit_32(3266555911);
+emit_32(1098768607);
+emit_32(3273408512);
+emit_32(3266043904);
+emit_32(1099579471);
+emit_32(3273408512);
+emit_32(3265531911);
+emit_32(1100058880);
+emit_32(3273408512);
+emit_32(3265019904);
+emit_32(1100744596);
+emit_32(3273408512);
+emit_32(3264507911);
+emit_32(1102061083);
+emit_32(3273408512);
+emit_32(3263995904);
+emit_32(1103274338);
+emit_32(3273408512);
+emit_32(3263483911);
+emit_32(1104422791);
+emit_32(3273408512);
+emit_32(3262775296);
+emit_32(1105176612);
+emit_32(3273408512);
+emit_32(3261751309);
+emit_32(1105646007);
+emit_32(3273408512);
+emit_32(3260727296);
+emit_32(1106575308);
+emit_32(3273408512);
+emit_32(3259703309);
+emit_32(1106762741);
+emit_32(3273408512);
+emit_32(3258679296);
+emit_32(1106791472);
+emit_32(3273408512);
+emit_32(3257655309);
+emit_32(1106362447);
+emit_32(3273408512);
+emit_32(3256631296);
+emit_32(1107312824);
+emit_32(3273408512);
+emit_32(3255607309);
+emit_32(1107822143);
+emit_32(3273408512);
+emit_32(3254386688);
+emit_32(1108186890);
+emit_32(3273408512);
+emit_32(3252338714);
+emit_32(1108816848);
+emit_32(3273408512);
+emit_32(3250290688);
+emit_32(1109429689);
+emit_32(3273408512);
+emit_32(3248242714);
+emit_32(1109536408);
+emit_32(3273408512);
+emit_32(3245998080);
+emit_32(1109813992);
+emit_32(3273408512);
+emit_32(3241902132);
+emit_32(1110208099);
+emit_32(3273408512);
+emit_32(3237609472);
+emit_32(1110335213);
+emit_32(3273408512);
+emit_32(3229220864);
+emit_32(1110186263);
+emit_32(3273408512);
+emit_32(0);
+emit_32(1109755796);
+emit_32(3273408512);
+emit_32(1081737216);
+emit_32(1109848700);
+emit_32(3273408512);
+emit_32(3279552512);
+emit_32(1104733956);
+emit_32(3273664496);
+emit_32(3279296528);
+emit_32(1104666690);
+emit_32(3273664496);
+emit_32(3279040545);
+emit_32(1104540231);
+emit_32(3273664496);
+emit_32(3278784496);
+emit_32(1104872840);
+emit_32(3273664496);
+emit_32(3278528512);
+emit_32(1105814775);
+emit_32(3273664496);
+emit_32(3278272528);
+emit_32(1106809297);
+emit_32(3273664496);
+emit_32(3278016545);
+emit_32(1106966322);
+emit_32(3273664496);
+emit_32(3277760496);
+emit_32(1106369682);
+emit_32(3273664496);
+emit_32(3277504512);
+emit_32(1105145102);
+emit_32(3273664496);
+emit_32(3277248528);
+emit_32(1104371673);
+emit_32(3273664496);
+emit_32(3276992545);
+emit_32(1103102319);
+emit_32(3273664496);
+emit_32(3276736496);
+emit_32(1102915568);
+emit_32(3273664496);
+emit_32(3276480512);
+emit_32(1102916721);
+emit_32(3273664496);
+emit_32(3276224528);
+emit_32(1102503005);
+emit_32(3273664496);
+emit_32(3275968545);
+emit_32(1101360162);
+emit_32(3273664496);
+emit_32(3275712496);
+emit_32(1100655152);
+emit_32(3273664496);
+emit_32(3275456512);
+emit_32(1099898185);
+emit_32(3273664496);
+emit_32(3275200528);
+emit_32(1097164495);
+emit_32(3273664496);
+emit_32(3274944545);
+emit_32(1094617294);
+emit_32(3273664496);
+emit_32(3274688496);
+emit_32(1092199750);
+emit_32(3273664496);
+emit_32(3274432512);
+emit_32(1090062511);
+emit_32(3273664496);
+emit_32(3274176528);
+emit_32(1090680196);
+emit_32(3273664496);
+emit_32(3273920545);
+emit_32(1089407214);
+emit_32(3273664496);
+emit_32(3273664496);
+emit_32(1087342316);
+emit_32(3273664496);
+emit_32(3273408512);
+emit_32(1084811578);
+emit_32(3273664496);
+emit_32(3273152528);
+emit_32(1083587386);
+emit_32(3273664496);
+emit_32(3272896545);
+emit_32(1084521563);
+emit_32(3273664496);
+emit_32(3272640496);
+emit_32(1079059237);
+emit_32(3273664496);
+emit_32(3272384512);
+emit_32(1079341513);
+emit_32(3273664496);
+emit_32(3272128528);
+emit_32(1075719690);
+emit_32(3273664496);
+emit_32(3271872545);
+emit_32(1082462285);
+emit_32(3273664496);
+emit_32(3271616496);
+emit_32(1087277514);
+emit_32(3273664496);
+emit_32(3271163904);
+emit_32(1090505891);
+emit_32(3273664496);
+emit_32(3270651937);
+emit_32(1090927198);
+emit_32(3273664496);
+emit_32(3270139970);
+emit_32(1091146109);
+emit_32(3273664496);
+emit_32(3269627871);
+emit_32(1092080475);
+emit_32(3273664496);
+emit_32(3269115904);
+emit_32(1091780718);
+emit_32(3273664496);
+emit_32(3268603937);
+emit_32(1090802554);
+emit_32(3273664496);
+emit_32(3268091970);
+emit_32(1092320997);
+emit_32(3273664496);
+emit_32(3267579911);
+emit_32(1094564132);
+emit_32(3273664496);
+emit_32(3267067904);
+emit_32(1097435447);
+emit_32(3273664496);
+emit_32(3266555911);
+emit_32(1098963118);
+emit_32(3273664496);
+emit_32(3266043904);
+emit_32(1099774348);
+emit_32(3273664496);
+emit_32(3265531911);
+emit_32(1100067530);
+emit_32(3273664496);
+emit_32(3265019904);
+emit_32(1100332401);
+emit_32(3273664496);
+emit_32(3264507911);
+emit_32(1101386639);
+emit_32(3273664496);
+emit_32(3263995904);
+emit_32(1102851185);
+emit_32(3273664496);
+emit_32(3263483911);
+emit_32(1104372774);
+emit_32(3273664496);
+emit_32(3262775296);
+emit_32(1105071702);
+emit_32(3273664496);
+emit_32(3261751309);
+emit_32(1105296726);
+emit_32(3273664496);
+emit_32(3260727296);
+emit_32(1105674895);
+emit_32(3273664496);
+emit_32(3259703309);
+emit_32(1106000583);
+emit_32(3273664496);
+emit_32(3258679296);
+emit_32(1105931639);
+emit_32(3273664496);
+emit_32(3257655309);
+emit_32(1106021188);
+emit_32(3273664496);
+emit_32(3256631296);
+emit_32(1106564874);
+emit_32(3273664496);
+emit_32(3255607309);
+emit_32(1107568073);
+emit_32(3273664496);
+emit_32(3254386688);
+emit_32(1108016890);
+emit_32(3273664496);
+emit_32(3252338714);
+emit_32(1108734483);
+emit_32(3273664496);
+emit_32(3250290688);
+emit_32(1109191321);
+emit_32(3273664496);
+emit_32(3248242714);
+emit_32(1109295759);
+emit_32(3273664496);
+emit_32(3245998080);
+emit_32(1109358019);
+emit_32(3273664496);
+emit_32(3241902132);
+emit_32(1109703603);
+emit_32(3273664496);
+emit_32(3237609472);
+emit_32(1109859736);
+emit_32(3273664496);
+emit_32(3229220864);
+emit_32(1109838319);
+emit_32(3273664496);
+emit_32(0);
+emit_32(1109492761);
+emit_32(3273664496);
+emit_32(1081737216);
+emit_32(1109518057);
+emit_32(3273664496);
+emit_32(3279552512);
+emit_32(1104359299);
+emit_32(3273920545);
+emit_32(3279296528);
+emit_32(1104339586);
+emit_32(3273920545);
+emit_32(3279040545);
+emit_32(1104491735);
+emit_32(3273920545);
+emit_32(3278784496);
+emit_32(1104791627);
+emit_32(3273920545);
+emit_32(3278528512);
+emit_32(1105811577);
+emit_32(3273920545);
+emit_32(3278272528);
+emit_32(1106308497);
+emit_32(3273920545);
+emit_32(3278016545);
+emit_32(1106435952);
+emit_32(3273920545);
+emit_32(3277760496);
+emit_32(1105655916);
+emit_32(3273920545);
+emit_32(3277504512);
+emit_32(1104594023);
+emit_32(3273920545);
+emit_32(3277248528);
+emit_32(1103614234);
+emit_32(3273920545);
+emit_32(3276992545);
+emit_32(1103342128);
+emit_32(3273920545);
+emit_32(3276736496);
+emit_32(1102922855);
+emit_32(3273920545);
+emit_32(3276480512);
+emit_32(1102436945);
+emit_32(3273920545);
+emit_32(3276224528);
+emit_32(1101625347);
+emit_32(3273920545);
+emit_32(3275968545);
+emit_32(1100801953);
+emit_32(3273920545);
+emit_32(3275712496);
+emit_32(1100227910);
+emit_32(3273920545);
+emit_32(3275456512);
+emit_32(1099339661);
+emit_32(3273920545);
+emit_32(3275200528);
+emit_32(1096681731);
+emit_32(3273920545);
+emit_32(3274944545);
+emit_32(1093027548);
+emit_32(3273920545);
+emit_32(3274688496);
+emit_32(1089483949);
+emit_32(3273920545);
+emit_32(3274432512);
+emit_32(1087550857);
+emit_32(3273920545);
+emit_32(3274176528);
+emit_32(1088032090);
+emit_32(3273920545);
+emit_32(3273920545);
+emit_32(1088175452);
+emit_32(3273920545);
+emit_32(3273664496);
+emit_32(1087974251);
+emit_32(3273920545);
+emit_32(3273408512);
+emit_32(1084612369);
+emit_32(3273920545);
+emit_32(3273152528);
+emit_32(1083056807);
+emit_32(3273920545);
+emit_32(3272896545);
+emit_32(1083313058);
+emit_32(3273920545);
+emit_32(3272640496);
+emit_32(1077966411);
+emit_32(3273920545);
+emit_32(3272384512);
+emit_32(1077466701);
+emit_32(3273920545);
+emit_32(3272128528);
+emit_32(1076194527);
+emit_32(3273920545);
+emit_32(3271872545);
+emit_32(1078813199);
+emit_32(3273920545);
+emit_32(3271616496);
+emit_32(1084920546);
+emit_32(3273920545);
+emit_32(3271163904);
+emit_32(1087870295);
+emit_32(3273920545);
+emit_32(3270651937);
+emit_32(1089931229);
+emit_32(3273920545);
+emit_32(3270139970);
+emit_32(1090987638);
+emit_32(3273920545);
+emit_32(3269627871);
+emit_32(1091623883);
+emit_32(3273920545);
+emit_32(3269115904);
+emit_32(1091369550);
+emit_32(3273920545);
+emit_32(3268603937);
+emit_32(1090009558);
+emit_32(3273920545);
+emit_32(3268091970);
+emit_32(1093783362);
+emit_32(3273920545);
+emit_32(3267579911);
+emit_32(1095581880);
+emit_32(3273920545);
+emit_32(3267067904);
+emit_32(1097625344);
+emit_32(3273920545);
+emit_32(3266555911);
+emit_32(1099002544);
+emit_32(3273920545);
+emit_32(3266043904);
+emit_32(1099653605);
+emit_32(3273920545);
+emit_32(3265531911);
+emit_32(1100228067);
+emit_32(3273920545);
+emit_32(3265019904);
+emit_32(1100644195);
+emit_32(3273920545);
+emit_32(3264507911);
+emit_32(1101087218);
+emit_32(3273920545);
+emit_32(3263995904);
+emit_32(1102441873);
+emit_32(3273920545);
+emit_32(3263483911);
+emit_32(1103411859);
+emit_32(3273920545);
+emit_32(3262775296);
+emit_32(1104352169);
+emit_32(3273920545);
+emit_32(3261751309);
+emit_32(1104534045);
+emit_32(3273920545);
+emit_32(3260727296);
+emit_32(1104718961);
+emit_32(3273920545);
+emit_32(3259703309);
+emit_32(1105600394);
+emit_32(3273920545);
+emit_32(3258679296);
+emit_32(1105578322);
+emit_32(3273920545);
+emit_32(3257655309);
+emit_32(1105873968);
+emit_32(3273920545);
+emit_32(3256631296);
+emit_32(1105977043);
+emit_32(3273920545);
+emit_32(3255607309);
+emit_32(1107501987);
+emit_32(3273920545);
+emit_32(3254386688);
+emit_32(1108022657);
+emit_32(3273920545);
+emit_32(3252338714);
+emit_32(1108493730);
+emit_32(3273920545);
+emit_32(3250290688);
+emit_32(1108751627);
+emit_32(3273920545);
+emit_32(3248242714);
+emit_32(1108976756);
+emit_32(3273920545);
+emit_32(3245998080);
+emit_32(1109209357);
+emit_32(3273920545);
+emit_32(3241902132);
+emit_32(1109224928);
+emit_32(3273920545);
+emit_32(3237609472);
+emit_32(1109394299);
+emit_32(3273920545);
+emit_32(3229220864);
+emit_32(1109287790);
+emit_32(3273920545);
+emit_32(0);
+emit_32(1109096556);
+emit_32(3273920545);
+emit_32(1081737216);
+emit_32(1109095429);
+emit_32(3273920545);
+emit_32(3279552512);
+emit_32(1103777917);
+emit_32(3274176528);
+emit_32(3279296528);
+emit_32(1103682863);
+emit_32(3274176528);
+emit_32(3279040545);
+emit_32(1103889852);
+emit_32(3274176528);
+emit_32(3278784496);
+emit_32(1104470082);
+emit_32(3274176528);
+emit_32(3278528512);
+emit_32(1105367977);
+emit_32(3274176528);
+emit_32(3278272528);
+emit_32(1105484998);
+emit_32(3274176528);
+emit_32(3278016545);
+emit_32(1105335157);
+emit_32(3274176528);
+emit_32(3277760496);
+emit_32(1104592136);
+emit_32(3274176528);
+emit_32(3277504512);
+emit_32(1103631063);
+emit_32(3274176528);
+emit_32(3277248528);
+emit_32(1103255306);
+emit_32(3274176528);
+emit_32(3276992545);
+emit_32(1103018276);
+emit_32(3274176528);
+emit_32(3276736496);
+emit_32(1102447378);
+emit_32(3274176528);
+emit_32(3276480512);
+emit_32(1102332926);
+emit_32(3274176528);
+emit_32(3276224528);
+emit_32(1101176976);
+emit_32(3274176528);
+emit_32(3275968545);
+emit_32(1100388132);
+emit_32(3274176528);
+emit_32(3275712496);
+emit_32(1099436969);
+emit_32(3274176528);
+emit_32(3275456512);
+emit_32(1097622199);
+emit_32(3274176528);
+emit_32(3275200528);
+emit_32(1095157206);
+emit_32(3274176528);
+emit_32(3274944545);
+emit_32(1091943761);
+emit_32(3274176528);
+emit_32(3274688496);
+emit_32(1087145897);
+emit_32(3274176528);
+emit_32(3274432512);
+emit_32(1084175847);
+emit_32(3274176528);
+emit_32(3274176528);
+emit_32(1083923161);
+emit_32(3274176528);
+emit_32(3273920545);
+emit_32(1085375292);
+emit_32(3274176528);
+emit_32(3273664496);
+emit_32(1084407834);
+emit_32(3274176528);
+emit_32(3273408512);
+emit_32(1081391354);
+emit_32(3274176528);
+emit_32(3273152528);
+emit_32(1081952216);
+emit_32(3274176528);
+emit_32(3272896545);
+emit_32(1083406885);
+emit_32(3274176528);
+emit_32(3272640496);
+emit_32(1079981732);
+emit_32(3274176528);
+emit_32(3272384512);
+emit_32(1079058020);
+emit_32(3274176528);
+emit_32(3272128528);
+emit_32(1072707676);
+emit_32(3274176528);
+emit_32(3271872545);
+emit_32(1076687568);
+emit_32(3274176528);
+emit_32(3271616496);
+emit_32(1083207089);
+emit_32(3274176528);
+emit_32(3271163904);
+emit_32(1086389538);
+emit_32(3274176528);
+emit_32(3270651937);
+emit_32(1089283314);
+emit_32(3274176528);
+emit_32(3270139970);
+emit_32(1089347172);
+emit_32(3274176528);
+emit_32(3269627871);
+emit_32(1089486696);
+emit_32(3274176528);
+emit_32(3269115904);
+emit_32(1088193739);
+emit_32(3274176528);
+emit_32(3268603937);
+emit_32(1090655722);
+emit_32(3274176528);
+emit_32(3268091970);
+emit_32(1094451515);
+emit_32(3274176528);
+emit_32(3267579911);
+emit_32(1096952893);
+emit_32(3274176528);
+emit_32(3267067904);
+emit_32(1098336489);
+emit_32(3274176528);
+emit_32(3266555911);
+emit_32(1099234437);
+emit_32(3274176528);
+emit_32(3266043904);
+emit_32(1099379612);
+emit_32(3274176528);
+emit_32(3265531911);
+emit_32(1100215799);
+emit_32(3274176528);
+emit_32(3265019904);
+emit_32(1100530162);
+emit_32(3274176528);
+emit_32(3264507911);
+emit_32(1101031329);
+emit_32(3274176528);
+emit_32(3263995904);
+emit_32(1101498994);
+emit_32(3274176528);
+emit_32(3263483911);
+emit_32(1102563928);
+emit_32(3274176528);
+emit_32(3262775296);
+emit_32(1103428531);
+emit_32(3274176528);
+emit_32(3261751309);
+emit_32(1104384360);
+emit_32(3274176528);
+emit_32(3260727296);
+emit_32(1104488589);
+emit_32(3274176528);
+emit_32(3259703309);
+emit_32(1104535827);
+emit_32(3274176528);
+emit_32(3258679296);
+emit_32(1105265479);
+emit_32(3274176528);
+emit_32(3257655309);
+emit_32(1106039747);
+emit_32(3274176528);
+emit_32(3256631296);
+emit_32(1106434956);
+emit_32(3274176528);
+emit_32(3255607309);
+emit_32(1107058596);
+emit_32(3274176528);
+emit_32(3254386688);
+emit_32(1107738703);
+emit_32(3274176528);
+emit_32(3252338714);
+emit_32(1108236567);
+emit_32(3274176528);
+emit_32(3250290688);
+emit_32(1108369447);
+emit_32(3274176528);
+emit_32(3248242714);
+emit_32(1108738258);
+emit_32(3274176528);
+emit_32(3245998080);
+emit_32(1108925140);
+emit_32(3274176528);
+emit_32(3241902132);
+emit_32(1108891219);
+emit_32(3274176528);
+emit_32(3237609472);
+emit_32(1109019224);
+emit_32(3274176528);
+emit_32(3229220864);
+emit_32(1108962574);
+emit_32(3274176528);
+emit_32(0);
+emit_32(1108838921);
+emit_32(3274176528);
+emit_32(1081737216);
+emit_32(1108664621);
+emit_32(3274176528);
+emit_32(3279552512);
+emit_32(1103175247);
+emit_32(3274432512);
+emit_32(3279296528);
+emit_32(1103008996);
+emit_32(3274432512);
+emit_32(3279040545);
+emit_32(1103511840);
+emit_32(3274432512);
+emit_32(3278784496);
+emit_32(1104205736);
+emit_32(3274432512);
+emit_32(3278528512);
+emit_32(1104650804);
+emit_32(3274432512);
+emit_32(3278272528);
+emit_32(1104410365);
+emit_32(3274432512);
+emit_32(3278016545);
+emit_32(1103881359);
+emit_32(3274432512);
+emit_32(3277760496);
+emit_32(1103489768);
+emit_32(3274432512);
+emit_32(3277504512);
+emit_32(1102805048);
+emit_32(3274432512);
+emit_32(3277248528);
+emit_32(1102700452);
+emit_32(3274432512);
+emit_32(3276992545);
+emit_32(1102108688);
+emit_32(3274432512);
+emit_32(3276736496);
+emit_32(1101386429);
+emit_32(3274432512);
+emit_32(3276480512);
+emit_32(1101386115);
+emit_32(3274432512);
+emit_32(3276224528);
+emit_32(1100548774);
+emit_32(3274432512);
+emit_32(3275968545);
+emit_32(1099100534);
+emit_32(3274432512);
+emit_32(3275712496);
+emit_32(1097287388);
+emit_32(3274432512);
+emit_32(3275456512);
+emit_32(1095246545);
+emit_32(3274432512);
+emit_32(3275200528);
+emit_32(1092624685);
+emit_32(3274432512);
+emit_32(3274944545);
+emit_32(1090219567);
+emit_32(3274432512);
+emit_32(3274688496);
+emit_32(1082930516);
+emit_32(3274432512);
+emit_32(3274432512);
+emit_32(1078918434);
+emit_32(3274432512);
+emit_32(3274176528);
+emit_32(1079511215);
+emit_32(3274432512);
+emit_32(3273920545);
+emit_32(1081732351);
+emit_32(3274432512);
+emit_32(3273664496);
+emit_32(1079040698);
+emit_32(3274432512);
+emit_32(3273408512);
+emit_32(1077451183);
+emit_32(3274432512);
+emit_32(3273152528);
+emit_32(1082592749);
+emit_32(3274432512);
+emit_32(3272896545);
+emit_32(1081429857);
+emit_32(3274432512);
+emit_32(3272640496);
+emit_32(1077879421);
+emit_32(3274432512);
+emit_32(3272384512);
+emit_32(1077261516);
+emit_32(3274432512);
+emit_32(3272128528);
+emit_32(1073521036);
+emit_32(3274432512);
+emit_32(3271872545);
+emit_32(1072559785);
+emit_32(3274432512);
+emit_32(3271616496);
+emit_32(1078796380);
+emit_32(3274432512);
+emit_32(3271163904);
+emit_32(1084493587);
+emit_32(3274432512);
+emit_32(3270651937);
+emit_32(1086050198);
+emit_32(3274432512);
+emit_32(3270139970);
+emit_32(1087277451);
+emit_32(3274432512);
+emit_32(3269627871);
+emit_32(1086930582);
+emit_32(3274432512);
+emit_32(3269115904);
+emit_32(1089544619);
+emit_32(3274432512);
+emit_32(3268603937);
+emit_32(1092037839);
+emit_32(3274432512);
+emit_32(3268091970);
+emit_32(1094101185);
+emit_32(3274432512);
+emit_32(3267579911);
+emit_32(1096539125);
+emit_32(3274432512);
+emit_32(3267067904);
+emit_32(1097682387);
+emit_32(3274432512);
+emit_32(3266555911);
+emit_32(1098380005);
+emit_32(3274432512);
+emit_32(3266043904);
+emit_32(1099089471);
+emit_32(3274432512);
+emit_32(3265531911);
+emit_32(1100092801);
+emit_32(3274432512);
+emit_32(3265019904);
+emit_32(1099999687);
+emit_32(3274432512);
+emit_32(3264507911);
+emit_32(1100034290);
+emit_32(3274432512);
+emit_32(3263995904);
+emit_32(1101354920);
+emit_32(3274432512);
+emit_32(3263483911);
+emit_32(1102642361);
+emit_32(3274432512);
+emit_32(3262775296);
+emit_32(1103324617);
+emit_32(3274432512);
+emit_32(3261751309);
+emit_32(1104424364);
+emit_32(3274432512);
+emit_32(3260727296);
+emit_32(1104375238);
+emit_32(3274432512);
+emit_32(3259703309);
+emit_32(1104526075);
+emit_32(3274432512);
+emit_32(3258679296);
+emit_32(1105221963);
+emit_32(3274432512);
+emit_32(3257655309);
+emit_32(1106081009);
+emit_32(3274432512);
+emit_32(3256631296);
+emit_32(1106625692);
+emit_32(3274432512);
+emit_32(3255607309);
+emit_32(1106869957);
+emit_32(3274432512);
+emit_32(3254386688);
+emit_32(1107361976);
+emit_32(3274432512);
+emit_32(3252338714);
+emit_32(1107660584);
+emit_32(3274432512);
+emit_32(3250290688);
+emit_32(1107794539);
+emit_32(3274432512);
+emit_32(3248242714);
+emit_32(1108030993);
+emit_32(3274432512);
+emit_32(3245998080);
+emit_32(1108270855);
+emit_32(3274432512);
+emit_32(3241902132);
+emit_32(1108287055);
+emit_32(3274432512);
+emit_32(3237609472);
+emit_32(1108250041);
+emit_32(3274432512);
+emit_32(3229220864);
+emit_32(1108216958);
+emit_32(3274432512);
+emit_32(0);
+emit_32(1108239267);
+emit_32(3274432512);
+emit_32(1081737216);
+emit_32(1108184872);
+emit_32(3274432512);
+emit_32(3279552512);
+emit_32(1102812126);
+emit_32(3274688496);
+emit_32(3279296528);
+emit_32(1103117418);
+emit_32(3274688496);
+emit_32(3279040545);
+emit_32(1103649885);
+emit_32(3274688496);
+emit_32(3278784496);
+emit_32(1104097313);
+emit_32(3274688496);
+emit_32(3278528512);
+emit_32(1104444654);
+emit_32(3274688496);
+emit_32(3278272528);
+emit_32(1104063601);
+emit_32(3274688496);
+emit_32(3278016545);
+emit_32(1103545814);
+emit_32(3274688496);
+emit_32(3277760496);
+emit_32(1103584507);
+emit_32(3274688496);
+emit_32(3277504512);
+emit_32(1102679009);
+emit_32(3274688496);
+emit_32(3277248528);
+emit_32(1102258687);
+emit_32(3274688496);
+emit_32(3276992545);
+emit_32(1101507854);
+emit_32(3274688496);
+emit_32(3276736496);
+emit_32(1100690909);
+emit_32(3274688496);
+emit_32(3276480512);
+emit_32(1100132332);
+emit_32(3274688496);
+emit_32(3276224528);
+emit_32(1099019583);
+emit_32(3274688496);
+emit_32(3275968545);
+emit_32(1097127376);
+emit_32(3274688496);
+emit_32(3275712496);
+emit_32(1095215822);
+emit_32(3274688496);
+emit_32(3275456512);
+emit_32(1092786166);
+emit_32(3274688496);
+emit_32(3275200528);
+emit_32(1090176785);
+emit_32(3274688496);
+emit_32(3274944545);
+emit_32(1085473439);
+emit_32(3274688496);
+emit_32(3274688496);
+emit_32(1079921376);
+emit_32(3274688496);
+emit_32(3274432512);
+emit_32(1075489590);
+emit_32(3274688496);
+emit_32(3274176528);
+emit_32(1074320386);
+emit_32(3274688496);
+emit_32(3273920545);
+emit_32(1075278281);
+emit_32(3274688496);
+emit_32(3273664496);
+emit_32(1075627373);
+emit_32(3274688496);
+emit_32(3273408512);
+emit_32(1075421307);
+emit_32(3274688496);
+emit_32(3273152528);
+emit_32(1077995687);
+emit_32(3274688496);
+emit_32(3272896545);
+emit_32(1076187271);
+emit_32(3274688496);
+emit_32(3272640496);
+emit_32(1078197056);
+emit_32(3274688496);
+emit_32(3272384512);
+emit_32(1077490273);
+emit_32(3274688496);
+emit_32(3272128528);
+emit_32(1076221287);
+emit_32(3274688496);
+emit_32(3271872545);
+emit_32(1074908092);
+emit_32(3274688496);
+emit_32(3271616496);
+emit_32(1080775462);
+emit_32(3274688496);
+emit_32(3271163904);
+emit_32(1084715256);
+emit_32(3274688496);
+emit_32(3270651937);
+emit_32(1086583504);
+emit_32(3274688496);
+emit_32(3270139970);
+emit_32(1086842502);
+emit_32(3274688496);
+emit_32(3269627871);
+emit_32(1087987400);
+emit_32(3274688496);
+emit_32(3269115904);
+emit_32(1090173891);
+emit_32(3274688496);
+emit_32(3268603937);
+emit_32(1091923838);
+emit_32(3274688496);
+emit_32(3268091970);
+emit_32(1093947988);
+emit_32(3274688496);
+emit_32(3267579911);
+emit_32(1095834167);
+emit_32(3274688496);
+emit_32(3267067904);
+emit_32(1096733950);
+emit_32(3274688496);
+emit_32(3266555911);
+emit_32(1097836842);
+emit_32(3274688496);
+emit_32(3266043904);
+emit_32(1098556060);
+emit_32(3274688496);
+emit_32(3265531911);
+emit_32(1099108608);
+emit_32(3274688496);
+emit_32(3265019904);
+emit_32(1098963275);
+emit_32(3274688496);
+emit_32(3264507911);
+emit_32(1099819542);
+emit_32(3274688496);
+emit_32(3263995904);
+emit_32(1100942305);
+emit_32(3274688496);
+emit_32(3263483911);
+emit_32(1102197608);
+emit_32(3274688496);
+emit_32(3262775296);
+emit_32(1103022837);
+emit_32(3274688496);
+emit_32(3261751309);
+emit_32(1103801562);
+emit_32(3274688496);
+emit_32(3260727296);
+emit_32(1104507988);
+emit_32(3274688496);
+emit_32(3259703309);
+emit_32(1105154592);
+emit_32(3274688496);
+emit_32(3258679296);
+emit_32(1105464079);
+emit_32(3274688496);
+emit_32(3257655309);
+emit_32(1106093382);
+emit_32(3274688496);
+emit_32(3256631296);
+emit_32(1106574311);
+emit_32(3274688496);
+emit_32(3255607309);
+emit_32(1107051990);
+emit_32(3274688496);
+emit_32(3254386688);
+emit_32(1107119571);
+emit_32(3274688496);
+emit_32(3252338714);
+emit_32(1106870849);
+emit_32(3274688496);
+emit_32(3250290688);
+emit_32(1107053878);
+emit_32(3274688496);
+emit_32(3248242714);
+emit_32(1107270461);
+emit_32(3274688496);
+emit_32(3245998080);
+emit_32(1107546577);
+emit_32(3274688496);
+emit_32(3241902132);
+emit_32(1107761064);
+emit_32(3274688496);
+emit_32(3237609472);
+emit_32(1107768718);
+emit_32(3274688496);
+emit_32(3229220864);
+emit_32(1107959035);
+emit_32(3274688496);
+emit_32(0);
+emit_32(1108028398);
+emit_32(3274688496);
+emit_32(1081737216);
+emit_32(1108036289);
+emit_32(3274688496);
+emit_32(3279552512);
+emit_32(1102194829);
+emit_32(3274944545);
+emit_32(3279296528);
+emit_32(1102979740);
+emit_32(3274944545);
+emit_32(3279040545);
+emit_32(1103411282);
+emit_32(3274944545);
+emit_32(3278784496);
+emit_32(1104236354);
+emit_32(3274944545);
+emit_32(3278528512);
+emit_32(1103902330);
+emit_32(3274944545);
+emit_32(3278272528);
+emit_32(1103359430);
+emit_32(3274944545);
+emit_32(3278016545);
+emit_32(1103570665);
+emit_32(3274944545);
+emit_32(3277760496);
+emit_32(1102969255);
+emit_32(3274944545);
+emit_32(3277504512);
+emit_32(1102559995);
+emit_32(3274944545);
+emit_32(3277248528);
+emit_32(1101349467);
+emit_32(3274944545);
+emit_32(3276992545);
+emit_32(1100611689);
+emit_32(3274944545);
+emit_32(3276736496);
+emit_32(1099639921);
+emit_32(3274944545);
+emit_32(3276480512);
+emit_32(1098874513);
+emit_32(3274944545);
+emit_32(3276224528);
+emit_32(1096071040);
+emit_32(3274944545);
+emit_32(3275968545);
+emit_32(1094641831);
+emit_32(3274944545);
+emit_32(3275712496);
+emit_32(1092240938);
+emit_32(3274944545);
+emit_32(3275456512);
+emit_32(1090400551);
+emit_32(3274944545);
+emit_32(3275200528);
+emit_32(1086726760);
+emit_32(3274944545);
+emit_32(3274944545);
+emit_32(1082213060);
+emit_32(3274944545);
+emit_32(3274688496);
+emit_32(1073126939);
+emit_32(3274944545);
+emit_32(3274432512);
+emit_32(1071516914);
+emit_32(3274944545);
+emit_32(3274176528);
+emit_32(1065259968);
+emit_32(3274944545);
+emit_32(3273920545);
+emit_32(1065288959);
+emit_32(3274944545);
+emit_32(3273664496);
+emit_32(1065357243);
+emit_32(3274944545);
+emit_32(3273408512);
+emit_32(1069920478);
+emit_32(3274944545);
+emit_32(3273152528);
+emit_32(1062828597);
+emit_32(3274944545);
+emit_32(3272896545);
+emit_32(1067908386);
+emit_32(3274944545);
+emit_32(3272640496);
+emit_32(1068584424);
+emit_32(3274944545);
+emit_32(3272384512);
+emit_32(1063954466);
+emit_32(3274944545);
+emit_32(3272128528);
+emit_32(1068682235);
+emit_32(3274944545);
+emit_32(3271872545);
+emit_32(1074494492);
+emit_32(3274944545);
+emit_32(3271616496);
+emit_32(1082171809);
+emit_32(3274944545);
+emit_32(3271163904);
+emit_32(1085758274);
+emit_32(3274944545);
+emit_32(3270651937);
+emit_32(1088930825);
+emit_32(3274944545);
+emit_32(3270139970);
+emit_32(1088551890);
+emit_32(3274944545);
+emit_32(3269627871);
+emit_32(1090336420);
+emit_32(3274944545);
+emit_32(3269115904);
+emit_32(1090128550);
+emit_32(3274944545);
+emit_32(3268603937);
+emit_32(1092723147);
+emit_32(3274944545);
+emit_32(3268091970);
+emit_32(1094514744);
+emit_32(3274944545);
+emit_32(3267579911);
+emit_32(1095724381);
+emit_32(3274944545);
+emit_32(3267067904);
+emit_32(1096378378);
+emit_32(3274944545);
+emit_32(3266555911);
+emit_32(1096239232);
+emit_32(3274944545);
+emit_32(3266043904);
+emit_32(1097003853);
+emit_32(3274944545);
+emit_32(3265531911);
+emit_32(1097209165);
+emit_32(3274944545);
+emit_32(3265019904);
+emit_32(1098262459);
+emit_32(3274944545);
+emit_32(3264507911);
+emit_32(1099551893);
+emit_32(3274944545);
+emit_32(3263995904);
+emit_32(1100443025);
+emit_32(3274944545);
+emit_32(3263483911);
+emit_32(1101006635);
+emit_32(3274944545);
+emit_32(3262775296);
+emit_32(1102193466);
+emit_32(3274944545);
+emit_32(3261751309);
+emit_32(1103692405);
+emit_32(3274944545);
+emit_32(3260727296);
+emit_32(1104818733);
+emit_32(3274944545);
+emit_32(3259703309);
+emit_32(1105337935);
+emit_32(3274944545);
+emit_32(3258679296);
+emit_32(1105923932);
+emit_32(3274944545);
+emit_32(3257655309);
+emit_32(1106359720);
+emit_32(3274944545);
+emit_32(3256631296);
+emit_32(1106972561);
+emit_32(3274944545);
+emit_32(3255607309);
+emit_32(1106903040);
+emit_32(3274944545);
+emit_32(3254386688);
+emit_32(1106792520);
+emit_32(3274944545);
+emit_32(3252338714);
+emit_32(1106424313);
+emit_32(3274944545);
+emit_32(3250290688);
+emit_32(1106536196);
+emit_32(3274944545);
+emit_32(3248242714);
+emit_32(1106757026);
+emit_32(3274944545);
+emit_32(3245998080);
+emit_32(1107206445);
+emit_32(3274944545);
+emit_32(3241902132);
+emit_32(1107332773);
+emit_32(3274944545);
+emit_32(3237609472);
+emit_32(1107315261);
+emit_32(3274944545);
+emit_32(3229220864);
+emit_32(1107468589);
+emit_32(3274944545);
+emit_32(0);
+emit_32(1107529276);
+emit_32(3274944545);
+emit_32(1081737216);
+emit_32(1107544270);
+emit_32(3274944545);
+emit_32(3279552512);
+emit_32(1102256485);
+emit_32(3275200528);
+emit_32(3279296528);
+emit_32(1102476581);
+emit_32(3275200528);
+emit_32(3279040545);
+emit_32(1102648600);
+emit_32(3275200528);
+emit_32(3278784496);
+emit_32(1103151707);
+emit_32(3275200528);
+emit_32(3278528512);
+emit_32(1103103315);
+emit_32(3275200528);
+emit_32(3278272528);
+emit_32(1102817788);
+emit_32(3275200528);
+emit_32(3278016545);
+emit_32(1103034843);
+emit_32(3275200528);
+emit_32(3277760496);
+emit_32(1102561411);
+emit_32(3275200528);
+emit_32(3277504512);
+emit_32(1101968179);
+emit_32(3275200528);
+emit_32(3277248528);
+emit_32(1100968939);
+emit_32(3275200528);
+emit_32(3276992545);
+emit_32(1099333370);
+emit_32(3275200528);
+emit_32(3276736496);
+emit_32(1098046662);
+emit_32(3275200528);
+emit_32(3276480512);
+emit_32(1096587778);
+emit_32(3275200528);
+emit_32(3276224528);
+emit_32(1094379687);
+emit_32(3275200528);
+emit_32(3275968545);
+emit_32(1092357099);
+emit_32(3275200528);
+emit_32(3275712496);
+emit_32(1088608073);
+emit_32(3275200528);
+emit_32(3275456512);
+emit_32(1087226532);
+emit_32(3275200528);
+emit_32(3275200528);
+emit_32(1084547148);
+emit_32(3275200528);
+emit_32(3274944545);
+emit_32(1081193131);
+emit_32(3275200528);
+emit_32(3274688496);
+emit_32(1078008983);
+emit_32(3275200528);
+emit_32(3274432512);
+emit_32(1069241755);
+emit_32(3275200528);
+emit_32(3274176528);
+emit_32(1061457513);
+emit_32(3275200528);
+emit_32(3273920545);
+emit_32(1073613814);
+emit_32(3275200528);
+emit_32(3273664496);
+emit_32(1066147869);
+emit_32(3275200528);
+emit_32(3273408512);
+emit_32(1067857803);
+emit_32(3275200528);
+emit_32(3273152528);
+emit_32(3192938482);
+emit_32(3275200528);
+emit_32(3272896545);
+emit_32(3204552258);
+emit_32(3275200528);
+emit_32(3272640496);
+emit_32(3207444717);
+emit_32(3275200528);
+emit_32(3272384512);
+emit_32(1042926373);
+emit_32(3275200528);
+emit_32(3272128528);
+emit_32(1069107873);
+emit_32(3275200528);
+emit_32(3271872545);
+emit_32(1068988587);
+emit_32(3275200528);
+emit_32(3271616496);
+emit_32(1078926571);
+emit_32(3275200528);
+emit_32(3271163904);
+emit_32(1083921610);
+emit_32(3275200528);
+emit_32(3270651937);
+emit_32(1087667710);
+emit_32(3275200528);
+emit_32(3270139970);
+emit_32(1090444214);
+emit_32(3275200528);
+emit_32(3269627871);
+emit_32(1091070528);
+emit_32(3275200528);
+emit_32(3269115904);
+emit_32(1090066034);
+emit_32(3275200528);
+emit_32(3268603937);
+emit_32(1092043900);
+emit_32(3275200528);
+emit_32(3268091970);
+emit_32(1094000103);
+emit_32(3275200528);
+emit_32(3267579911);
+emit_32(1094961752);
+emit_32(3275200528);
+emit_32(3267067904);
+emit_32(1095524208);
+emit_32(3275200528);
+emit_32(3266555911);
+emit_32(1095676356);
+emit_32(3275200528);
+emit_32(3266043904);
+emit_32(1095717880);
+emit_32(3275200528);
+emit_32(3265531911);
+emit_32(1096110676);
+emit_32(3275200528);
+emit_32(3265019904);
+emit_32(1097228249);
+emit_32(3275200528);
+emit_32(3264507911);
+emit_32(1099051146);
+emit_32(3275200528);
+emit_32(3263995904);
+emit_32(1099955228);
+emit_32(3275200528);
+emit_32(3263483911);
+emit_32(1100759119);
+emit_32(3275200528);
+emit_32(3262775296);
+emit_32(1101740848);
+emit_32(3275200528);
+emit_32(3261751309);
+emit_32(1103570928);
+emit_32(3275200528);
+emit_32(3260727296);
+emit_32(1104669783);
+emit_32(3275200528);
+emit_32(3259703309);
+emit_32(1105525316);
+emit_32(3275200528);
+emit_32(3258679296);
+emit_32(1106359248);
+emit_32(3275200528);
+emit_32(3257655309);
+emit_32(1106517269);
+emit_32(3275200528);
+emit_32(3256631296);
+emit_32(1106616045);
+emit_32(3275200528);
+emit_32(3255607309);
+emit_32(1106583906);
+emit_32(3275200528);
+emit_32(3254386688);
+emit_32(1106124944);
+emit_32(3275200528);
+emit_32(3252338714);
+emit_32(1106384676);
+emit_32(3275200528);
+emit_32(3250290688);
+emit_32(1106808354);
+emit_32(3275200528);
+emit_32(3248242714);
+emit_32(1106794879);
+emit_32(3275200528);
+emit_32(3245998080);
+emit_32(1106762741);
+emit_32(3275200528);
+emit_32(3241902132);
+emit_32(1106491369);
+emit_32(3275200528);
+emit_32(3237609472);
+emit_32(1106295705);
+emit_32(3275200528);
+emit_32(3229220864);
+emit_32(1106289675);
+emit_32(3275200528);
+emit_32(0);
+emit_32(1106247261);
+emit_32(3275200528);
+emit_32(1081737216);
+emit_32(1106249096);
+emit_32(3275200528);
+emit_32(3279552512);
+emit_32(1102201697);
+emit_32(3275456512);
+emit_32(3279296528);
+emit_32(1102659820);
+emit_32(3275456512);
+emit_32(3279040545);
+emit_32(1102694528);
+emit_32(3275456512);
+emit_32(3278784496);
+emit_32(1102926001);
+emit_32(3275456512);
+emit_32(3278528512);
+emit_32(1102847567);
+emit_32(3275456512);
+emit_32(3278272528);
+emit_32(1102512443);
+emit_32(3275456512);
+emit_32(3278016545);
+emit_32(1102182928);
+emit_32(3275456512);
+emit_32(3277760496);
+emit_32(1101754112);
+emit_32(3275456512);
+emit_32(3277504512);
+emit_32(1101220178);
+emit_32(3275456512);
+emit_32(3277248528);
+emit_32(1100092591);
+emit_32(3275456512);
+emit_32(3276992545);
+emit_32(1099095081);
+emit_32(3275456512);
+emit_32(3276736496);
+emit_32(1095841821);
+emit_32(3275456512);
+emit_32(3276480512);
+emit_32(1094285106);
+emit_32(3275456512);
+emit_32(3276224528);
+emit_32(1092426242);
+emit_32(3275456512);
+emit_32(3275968545);
+emit_32(1091118752);
+emit_32(3275456512);
+emit_32(3275712496);
+emit_32(1086196076);
+emit_32(3275456512);
+emit_32(3275456512);
+emit_32(1084558955);
+emit_32(3275456512);
+emit_32(3275200528);
+emit_32(1081694099);
+emit_32(3275456512);
+emit_32(3274944545);
+emit_32(1083225900);
+emit_32(3275456512);
+emit_32(3274688496);
+emit_32(1082574231);
+emit_32(3275456512);
+emit_32(3274432512);
+emit_32(1076364145);
+emit_32(3275456512);
+emit_32(3274176528);
+emit_32(1072545021);
+emit_32(3275456512);
+emit_32(3273920545);
+emit_32(1074334018);
+emit_32(3275456512);
+emit_32(3273664496);
+emit_32(1076300014);
+emit_32(3275456512);
+emit_32(3273408512);
+emit_32(1073720181);
+emit_32(3275456512);
+emit_32(3273152528);
+emit_32(1062607037);
+emit_32(3275456512);
+emit_32(3272896545);
+emit_32(3187287312);
+emit_32(3275456512);
+emit_32(3272640496);
+emit_32(3214601911);
+emit_32(3275456512);
+emit_32(3272384512);
+emit_32(1058984736);
+emit_32(3275456512);
+emit_32(3272128528);
+emit_32(1074596288);
+emit_32(3275456512);
+emit_32(3271872545);
+emit_32(1076067859);
+emit_32(3275456512);
+emit_32(3271616496);
+emit_32(1078353210);
+emit_32(3275456512);
+emit_32(3271163904);
+emit_32(1083728860);
+emit_32(3275456512);
+emit_32(3270651937);
+emit_32(1087570235);
+emit_32(3275456512);
+emit_32(3270139970);
+emit_32(1089274527);
+emit_32(3275456512);
+emit_32(3269627871);
+emit_32(1090698305);
+emit_32(3275456512);
+emit_32(3269115904);
+emit_32(1091459088);
+emit_32(3275456512);
+emit_32(3268603937);
+emit_32(1092135063);
+emit_32(3275456512);
+emit_32(3268091970);
+emit_32(1093474242);
+emit_32(3275456512);
+emit_32(3267579911);
+emit_32(1094959235);
+emit_32(3275456512);
+emit_32(3267067904);
+emit_32(1094655672);
+emit_32(3275456512);
+emit_32(3266555911);
+emit_32(1095034523);
+emit_32(3275456512);
+emit_32(3266043904);
+emit_32(1095524522);
+emit_32(3275456512);
+emit_32(3265531911);
+emit_32(1096032557);
+emit_32(3275456512);
+emit_32(3265019904);
+emit_32(1097045482);
+emit_32(3275456512);
+emit_32(3264507911);
+emit_32(1098064278);
+emit_32(3275456512);
+emit_32(3263995904);
+emit_32(1099811573);
+emit_32(3275456512);
+emit_32(3263483911);
+emit_32(1101577899);
+emit_32(3275456512);
+emit_32(3262775296);
+emit_32(1102983515);
+emit_32(3275456512);
+emit_32(3261751309);
+emit_32(1103562015);
+emit_32(3275456512);
+emit_32(3260727296);
+emit_32(1104461116);
+emit_32(3275456512);
+emit_32(3259703309);
+emit_32(1105235752);
+emit_32(3275456512);
+emit_32(3258679296);
+emit_32(1106329049);
+emit_32(3275456512);
+emit_32(3257655309);
+emit_32(1106693744);
+emit_32(3275456512);
+emit_32(3256631296);
+emit_32(1106663703);
+emit_32(3275456512);
+emit_32(3255607309);
+emit_32(1106416710);
+emit_32(3275456512);
+emit_32(3254386688);
+emit_32(1105642390);
+emit_32(3275456512);
+emit_32(3252338714);
+emit_32(1106355631);
+emit_32(3275456512);
+emit_32(3250290688);
+emit_32(1107058020);
+emit_32(3275456512);
+emit_32(3248242714);
+emit_32(1106806414);
+emit_32(3275456512);
+emit_32(3245998080);
+emit_32(1106545790);
+emit_32(3275456512);
+emit_32(3241902132);
+emit_32(1106234783);
+emit_32(3275456512);
+emit_32(3237609472);
+emit_32(1105605637);
+emit_32(3275456512);
+emit_32(3229220864);
+emit_32(1105327922);
+emit_32(3275456512);
+emit_32(0);
+emit_32(1104886890);
+emit_32(3275456512);
+emit_32(1081737216);
+emit_32(1105010622);
+emit_32(3275456512);
+emit_32(3279552512);
+emit_32(1101796265);
+emit_32(3275712496);
+emit_32(3279296528);
+emit_32(1102154616);
+emit_32(3275712496);
+emit_32(3279040545);
+emit_32(1102271480);
+emit_32(3275712496);
+emit_32(3278784496);
+emit_32(1102377910);
+emit_32(3275712496);
+emit_32(3278528512);
+emit_32(1102537923);
+emit_32(3275712496);
+emit_32(3278272528);
+emit_32(1102370151);
+emit_32(3275712496);
+emit_32(3278016545);
+emit_32(1101809268);
+emit_32(3275712496);
+emit_32(3277760496);
+emit_32(1101123289);
+emit_32(3275712496);
+emit_32(3277504512);
+emit_32(1100805466);
+emit_32(3275712496);
+emit_32(3277248528);
+emit_32(1100000736);
+emit_32(3275712496);
+emit_32(3276992545);
+emit_32(1098896743);
+emit_32(3275712496);
+emit_32(3276736496);
+emit_32(1095489500);
+emit_32(3275712496);
+emit_32(3276480512);
+emit_32(1092604647);
+emit_32(3275712496);
+emit_32(3276224528);
+emit_32(1089231431);
+emit_32(3275712496);
+emit_32(3275968545);
+emit_32(1086808717);
+emit_32(3275712496);
+emit_32(3275712496);
+emit_32(1083957890);
+emit_32(3275712496);
+emit_32(3275456512);
+emit_32(1083971564);
+emit_32(3275712496);
+emit_32(3275200528);
+emit_32(1083249913);
+emit_32(3275712496);
+emit_32(3274944545);
+emit_32(1084720771);
+emit_32(3275712496);
+emit_32(3274688496);
+emit_32(1082599125);
+emit_32(3275712496);
+emit_32(3274432512);
+emit_32(1079874484);
+emit_32(3275712496);
+emit_32(3274176528);
+emit_32(1080545069);
+emit_32(3275712496);
+emit_32(3273920545);
+emit_32(1078235685);
+emit_32(3275712496);
+emit_32(3273664496);
+emit_32(1080867653);
+emit_32(3275712496);
+emit_32(3273408512);
+emit_32(1082567206);
+emit_32(3275712496);
+emit_32(3273152528);
+emit_32(1074733945);
+emit_32(3275712496);
+emit_32(3272896545);
+emit_32(1058342370);
+emit_32(3275712496);
+emit_32(3272640496);
+emit_32(1055267089);
+emit_32(3275712496);
+emit_32(3272384512);
+emit_32(1075522138);
+emit_32(3275712496);
+emit_32(3272128528);
+emit_32(1080234900);
+emit_32(3275712496);
+emit_32(3271872545);
+emit_32(1080374822);
+emit_32(3275712496);
+emit_32(3271616496);
+emit_32(1083014633);
+emit_32(3275712496);
+emit_32(3271163904);
+emit_32(1084734109);
+emit_32(3275712496);
+emit_32(3270651937);
+emit_32(1087494779);
+emit_32(3275712496);
+emit_32(3270139970);
+emit_32(1088284965);
+emit_32(3275712496);
+emit_32(3269627871);
+emit_32(1089959289);
+emit_32(3275712496);
+emit_32(3269115904);
+emit_32(1090565890);
+emit_32(3275712496);
+emit_32(3268603937);
+emit_32(1091730439);
+emit_32(3275712496);
+emit_32(3268091970);
+emit_32(1093621042);
+emit_32(3275712496);
+emit_32(3267579911);
+emit_32(1094912259);
+emit_32(3275712496);
+emit_32(3267067904);
+emit_32(1094344350);
+emit_32(3275712496);
+emit_32(3266555911);
+emit_32(1094347810);
+emit_32(3275712496);
+emit_32(3266043904);
+emit_32(1095166958);
+emit_32(3275712496);
+emit_32(3265531911);
+emit_32(1096161218);
+emit_32(3275712496);
+emit_32(3265019904);
+emit_32(1097215246);
+emit_32(3275712496);
+emit_32(3264507911);
+emit_32(1099003068);
+emit_32(3275712496);
+emit_32(3263995904);
+emit_32(1100476894);
+emit_32(3275712496);
+emit_32(3263483911);
+emit_32(1102488954);
+emit_32(3275712496);
+emit_32(3262775296);
+emit_32(1103829035);
+emit_32(3275712496);
+emit_32(3261751309);
+emit_32(1104228332);
+emit_32(3275712496);
+emit_32(3260727296);
+emit_32(1103954339);
+emit_32(3275712496);
+emit_32(3259703309);
+emit_32(1104646714);
+emit_32(3275712496);
+emit_32(3258679296);
+emit_32(1105727324);
+emit_32(3275712496);
+emit_32(3257655309);
+emit_32(1106170243);
+emit_32(3275712496);
+emit_32(3256631296);
+emit_32(1106312482);
+emit_32(3275712496);
+emit_32(3255607309);
+emit_32(1106119596);
+emit_32(3275712496);
+emit_32(3254386688);
+emit_32(1105456687);
+emit_32(3275712496);
+emit_32(3252338714);
+emit_32(1106005931);
+emit_32(3275712496);
+emit_32(3250290688);
+emit_32(1106493309);
+emit_32(3275712496);
+emit_32(3248242714);
+emit_32(1106443921);
+emit_32(3275712496);
+emit_32(3245998080);
+emit_32(1106444917);
+emit_32(3275712496);
+emit_32(3241902132);
+emit_32(1105728582);
+emit_32(3275712496);
+emit_32(3237609472);
+emit_32(1105301445);
+emit_32(3275712496);
+emit_32(3229220864);
+emit_32(1104221307);
+emit_32(3275712496);
+emit_32(0);
+emit_32(1103753013);
+emit_32(3275712496);
+emit_32(1081737216);
+emit_32(1103817710);
+emit_32(3275712496);
+emit_32(3279552512);
+emit_32(1101413745);
+emit_32(3275968545);
+emit_32(3279296528);
+emit_32(1101438858);
+emit_32(3275968545);
+emit_32(3279040545);
+emit_32(1101644379);
+emit_32(3275968545);
+emit_32(3278784496);
+emit_32(1102087560);
+emit_32(3275968545);
+emit_32(3278528512);
+emit_32(1102163214);
+emit_32(3275968545);
+emit_32(3278272528);
+emit_32(1102125308);
+emit_32(3275968545);
+emit_32(3278016545);
+emit_32(1101537739);
+emit_32(3275968545);
+emit_32(3277760496);
+emit_32(1100699350);
+emit_32(3275968545);
+emit_32(3277504512);
+emit_32(1099847539);
+emit_32(3275968545);
+emit_32(3277248528);
+emit_32(1099231239);
+emit_32(3275968545);
+emit_32(3276992545);
+emit_32(1097551315);
+emit_32(3275968545);
+emit_32(3276736496);
+emit_32(1094513590);
+emit_32(3275968545);
+emit_32(3276480512);
+emit_32(1092236859);
+emit_32(3275968545);
+emit_32(3276224528);
+emit_32(1087371425);
+emit_32(3275968545);
+emit_32(3275968545);
+emit_32(1086821908);
+emit_32(3275968545);
+emit_32(3275712496);
+emit_32(1087590871);
+emit_32(3275968545);
+emit_32(3275456512);
+emit_32(1086797791);
+emit_32(3275968545);
+emit_32(3275200528);
+emit_32(1085233189);
+emit_32(3275968545);
+emit_32(3274944545);
+emit_32(1084580975);
+emit_32(3275968545);
+emit_32(3274688496);
+emit_32(1083882351);
+emit_32(3275968545);
+emit_32(3274432512);
+emit_32(1082486780);
+emit_32(3275968545);
+emit_32(3274176528);
+emit_32(1085077623);
+emit_32(3275968545);
+emit_32(3273920545);
+emit_32(1084260342);
+emit_32(3275968545);
+emit_32(3273664496);
+emit_32(1083367290);
+emit_32(3275968545);
+emit_32(3273408512);
+emit_32(1083666638);
+emit_32(3275968545);
+emit_32(3273152528);
+emit_32(1078547909);
+emit_32(3275968545);
+emit_32(3272896545);
+emit_32(1066770387);
+emit_32(3275968545);
+emit_32(3272640496);
+emit_32(1075803744);
+emit_32(3275968545);
+emit_32(3272384512);
+emit_32(1082085679);
+emit_32(3275968545);
+emit_32(3272128528);
+emit_32(1084581185);
+emit_32(3275968545);
+emit_32(3271872545);
+emit_32(1085673172);
+emit_32(3275968545);
+emit_32(3271616496);
+emit_32(1085188394);
+emit_32(3275968545);
+emit_32(3271163904);
+emit_32(1084552768);
+emit_32(3275968545);
+emit_32(3270651937);
+emit_32(1087292635);
+emit_32(3275968545);
+emit_32(3270139970);
+emit_32(1089188963);
+emit_32(3275968545);
+emit_32(3269627871);
+emit_32(1090660503);
+emit_32(3275968545);
+emit_32(3269115904);
+emit_32(1089489254);
+emit_32(3275968545);
+emit_32(3268603937);
+emit_32(1091501157);
+emit_32(3275968545);
+emit_32(3268091970);
+emit_32(1093299130);
+emit_32(3275968545);
+emit_32(3267579911);
+emit_32(1093272076);
+emit_32(3275968545);
+emit_32(3267067904);
+emit_32(1093175293);
+emit_32(3275968545);
+emit_32(3266555911);
+emit_32(1094268538);
+emit_32(3275968545);
+emit_32(3266043904);
+emit_32(1094260359);
+emit_32(3275968545);
+emit_32(3265531911);
+emit_32(1097064147);
+emit_32(3275968545);
+emit_32(3265019904);
+emit_32(1098974337);
+emit_32(3275968545);
+emit_32(3264507911);
+emit_32(1099484050);
+emit_32(3275968545);
+emit_32(3263995904);
+emit_32(1101248646);
+emit_32(3275968545);
+emit_32(3263483911);
+emit_32(1102857634);
+emit_32(3275968545);
+emit_32(3262775296);
+emit_32(1103688158);
+emit_32(3275968545);
+emit_32(3261751309);
+emit_32(1104120486);
+emit_32(3275968545);
+emit_32(3260727296);
+emit_32(1103897087);
+emit_32(3275968545);
+emit_32(3259703309);
+emit_32(1103680084);
+emit_32(3275968545);
+emit_32(3258679296);
+emit_32(1104794406);
+emit_32(3275968545);
+emit_32(3257655309);
+emit_32(1105582830);
+emit_32(3275968545);
+emit_32(3256631296);
+emit_32(1105670124);
+emit_32(3275968545);
+emit_32(3255607309);
+emit_32(1105372486);
+emit_32(3275968545);
+emit_32(3254386688);
+emit_32(1104924063);
+emit_32(3275968545);
+emit_32(3252338714);
+emit_32(1105134250);
+emit_32(3275968545);
+emit_32(3250290688);
+emit_32(1105252739);
+emit_32(3275968545);
+emit_32(3248242714);
+emit_32(1105713693);
+emit_32(3275968545);
+emit_32(3245998080);
+emit_32(1105505760);
+emit_32(3275968545);
+emit_32(3241902132);
+emit_32(1104815692);
+emit_32(3275968545);
+emit_32(3237609472);
+emit_32(1104575830);
+emit_32(3275968545);
+emit_32(3229220864);
+emit_32(1103816871);
+emit_32(3275968545);
+emit_32(0);
+emit_32(1102689547);
+emit_32(3275968545);
+emit_32(1081737216);
+emit_32(1102629726);
+emit_32(3275968545);
+emit_32(3279552512);
+emit_32(1101111021);
+emit_32(3276224528);
+emit_32(3279296528);
+emit_32(1100789580);
+emit_32(3276224528);
+emit_32(3279040545);
+emit_32(1101187724);
+emit_32(3276224528);
+emit_32(3278784496);
+emit_32(1101544450);
+emit_32(3276224528);
+emit_32(3278528512);
+emit_32(1101809215);
+emit_32(3276224528);
+emit_32(3278272528);
+emit_32(1101364409);
+emit_32(3276224528);
+emit_32(3278016545);
+emit_32(1100966999);
+emit_32(3276224528);
+emit_32(3277760496);
+emit_32(1100334603);
+emit_32(3276224528);
+emit_32(3277504512);
+emit_32(1099684538);
+emit_32(3276224528);
+emit_32(3277248528);
+emit_32(1097905000);
+emit_32(3276224528);
+emit_32(3276992545);
+emit_32(1096189949);
+emit_32(3276224528);
+emit_32(3276736496);
+emit_32(1093369908);
+emit_32(3276224528);
+emit_32(3276480512);
+emit_32(1090856430);
+emit_32(3276224528);
+emit_32(3276224528);
+emit_32(1089059569);
+emit_32(3276224528);
+emit_32(3275968545);
+emit_32(1088475764);
+emit_32(3276224528);
+emit_32(3275712496);
+emit_32(1089236128);
+emit_32(3276224528);
+emit_32(3275456512);
+emit_32(1088316066);
+emit_32(3276224528);
+emit_32(3275200528);
+emit_32(1087626375);
+emit_32(3276224528);
+emit_32(3274944545);
+emit_32(1087484629);
+emit_32(3276224528);
+emit_32(3274688496);
+emit_32(1087038397);
+emit_32(3276224528);
+emit_32(3274432512);
+emit_32(1084227794);
+emit_32(3276224528);
+emit_32(3274176528);
+emit_32(1087406111);
+emit_32(3276224528);
+emit_32(3273920545);
+emit_32(1087788003);
+emit_32(3276224528);
+emit_32(3273664496);
+emit_32(1085636639);
+emit_32(3276224528);
+emit_32(3273408512);
+emit_32(1084012206);
+emit_32(3276224528);
+emit_32(3273152528);
+emit_32(1079773149);
+emit_32(3276224528);
+emit_32(3272896545);
+emit_32(1074099640);
+emit_32(3276224528);
+emit_32(3272640496);
+emit_32(1081570199);
+emit_32(3276224528);
+emit_32(3272384512);
+emit_32(1086505511);
+emit_32(3276224528);
+emit_32(3272128528);
+emit_32(1088421783);
+emit_32(3276224528);
+emit_32(3271872545);
+emit_32(1090863057);
+emit_32(3276224528);
+emit_32(3271616496);
+emit_32(1091104240);
+emit_32(3276224528);
+emit_32(3271163904);
+emit_32(1090801149);
+emit_32(3276224528);
+emit_32(3270651937);
+emit_32(1091187329);
+emit_32(3276224528);
+emit_32(3270139970);
+emit_32(1091684071);
+emit_32(3276224528);
+emit_32(3269627871);
+emit_32(1092334691);
+emit_32(3276224528);
+emit_32(3269115904);
+emit_32(1091715549);
+emit_32(3276224528);
+emit_32(3268603937);
+emit_32(1091937239);
+emit_32(3276224528);
+emit_32(3268091970);
+emit_32(1092157765);
+emit_32(3276224528);
+emit_32(3267579911);
+emit_32(1092352643);
+emit_32(3276224528);
+emit_32(3267067904);
+emit_32(1093649249);
+emit_32(3276224528);
+emit_32(3266555911);
+emit_32(1095125015);
+emit_32(3276224528);
+emit_32(3266043904);
+emit_32(1096433743);
+emit_32(3276224528);
+emit_32(3265531911);
+emit_32(1098895694);
+emit_32(3276224528);
+emit_32(3265019904);
+emit_32(1099846805);
+emit_32(3276224528);
+emit_32(3264507911);
+emit_32(1100394109);
+emit_32(3276224528);
+emit_32(3263995904);
+emit_32(1101147301);
+emit_32(3276224528);
+emit_32(3263483911);
+emit_32(1102840332);
+emit_32(3276224528);
+emit_32(3262775296);
+emit_32(1103420352);
+emit_32(3276224528);
+emit_32(3261751309);
+emit_32(1103784994);
+emit_32(3276224528);
+emit_32(3260727296);
+emit_32(1103743890);
+emit_32(3276224528);
+emit_32(3259703309);
+emit_32(1103097863);
+emit_32(3276224528);
+emit_32(3258679296);
+emit_32(1103438807);
+emit_32(3276224528);
+emit_32(3257655309);
+emit_32(1104475534);
+emit_32(3276224528);
+emit_32(3256631296);
+emit_32(1104961811);
+emit_32(3276224528);
+emit_32(3255607309);
+emit_32(1104919763);
+emit_32(3276224528);
+emit_32(3254386688);
+emit_32(1104827174);
+emit_32(3276224528);
+emit_32(3252338714);
+emit_32(1104406905);
+emit_32(3276224528);
+emit_32(3250290688);
+emit_32(1104336860);
+emit_32(3276224528);
+emit_32(3248242714);
+emit_32(1104244218);
+emit_32(3276224528);
+emit_32(3245998080);
+emit_32(1104283592);
+emit_32(3276224528);
+emit_32(3241902132);
+emit_32(1104029627);
+emit_32(3276224528);
+emit_32(3237609472);
+emit_32(1103767326);
+emit_32(3276224528);
+emit_32(3229220864);
+emit_32(1102780406);
+emit_32(3276224528);
+emit_32(0);
+emit_32(1102353111);
+emit_32(3276224528);
+emit_32(1081737216);
+emit_32(1101834591);
+emit_32(3276224528);
+emit_32(3279552512);
+emit_32(1100665376);
+emit_32(3276480512);
+emit_32(3279296528);
+emit_32(1100635911);
+emit_32(3276480512);
+emit_32(3279040545);
+emit_32(1100599001);
+emit_32(3276480512);
+emit_32(3278784496);
+emit_32(1100704593);
+emit_32(3276480512);
+emit_32(3278528512);
+emit_32(1100706847);
+emit_32(3276480512);
+emit_32(3278272528);
+emit_32(1100641940);
+emit_32(3276480512);
+emit_32(3278016545);
+emit_32(1100067373);
+emit_32(3276480512);
+emit_32(3277760496);
+emit_32(1099870817);
+emit_32(3276480512);
+emit_32(3277504512);
+emit_32(1099360738);
+emit_32(3276480512);
+emit_32(3277248528);
+emit_32(1097705875);
+emit_32(3276480512);
+emit_32(3276992545);
+emit_32(1095158989);
+emit_32(3276480512);
+emit_32(3276736496);
+emit_32(1092654884);
+emit_32(3276480512);
+emit_32(3276480512);
+emit_32(1091569199);
+emit_32(3276480512);
+emit_32(3276224528);
+emit_32(1091162174);
+emit_32(3276480512);
+emit_32(3275968545);
+emit_32(1090619556);
+emit_32(3276480512);
+emit_32(3275712496);
+emit_32(1090709283);
+emit_32(3276480512);
+emit_32(3275456512);
+emit_32(1090001987);
+emit_32(3276480512);
+emit_32(3275200528);
+emit_32(1089948027);
+emit_32(3276480512);
+emit_32(3274944545);
+emit_32(1089924476);
+emit_32(3276480512);
+emit_32(3274688496);
+emit_32(1089951446);
+emit_32(3276480512);
+emit_32(3274432512);
+emit_32(1087795175);
+emit_32(3276480512);
+emit_32(3274176528);
+emit_32(1087558449);
+emit_32(3276480512);
+emit_32(3273920545);
+emit_32(1087330845);
+emit_32(3276480512);
+emit_32(3273664496);
+emit_32(1086250308);
+emit_32(3276480512);
+emit_32(3273408512);
+emit_32(1086015469);
+emit_32(3276480512);
+emit_32(3273152528);
+emit_32(1084541779);
+emit_32(3276480512);
+emit_32(3272896545);
+emit_32(1083402271);
+emit_32(3276480512);
+emit_32(3272640496);
+emit_32(1087092084);
+emit_32(3276480512);
+emit_32(3272384512);
+emit_32(1089818319);
+emit_32(3276480512);
+emit_32(3272128528);
+emit_32(1091233068);
+emit_32(3276480512);
+emit_32(3271872545);
+emit_32(1092479059);
+emit_32(3276480512);
+emit_32(3271616496);
+emit_32(1092547835);
+emit_32(3276480512);
+emit_32(3271163904);
+emit_32(1093621252);
+emit_32(3276480512);
+emit_32(3270651937);
+emit_32(1093588327);
+emit_32(3276480512);
+emit_32(3270139970);
+emit_32(1094120689);
+emit_32(3276480512);
+emit_32(3269627871);
+emit_32(1093722230);
+emit_32(3276480512);
+emit_32(3269115904);
+emit_32(1093927017);
+emit_32(3276480512);
+emit_32(3268603937);
+emit_32(1094469340);
+emit_32(3276480512);
+emit_32(3268091970);
+emit_32(1093549320);
+emit_32(3276480512);
+emit_32(3267579911);
+emit_32(1094062283);
+emit_32(3276480512);
+emit_32(3267067904);
+emit_32(1094889505);
+emit_32(3276480512);
+emit_32(3266555911);
+emit_32(1095517287);
+emit_32(3276480512);
+emit_32(3266043904);
+emit_32(1098112303);
+emit_32(3276480512);
+emit_32(3265531911);
+emit_32(1099944847);
+emit_32(3276480512);
+emit_32(3265019904);
+emit_32(1100805204);
+emit_32(3276480512);
+emit_32(3264507911);
+emit_32(1100813068);
+emit_32(3276480512);
+emit_32(3263995904);
+emit_32(1100890191);
+emit_32(3276480512);
+emit_32(3263483911);
+emit_32(1101765018);
+emit_32(3276480512);
+emit_32(3262775296);
+emit_32(1103166125);
+emit_32(3276480512);
+emit_32(3261751309);
+emit_32(1103581413);
+emit_32(3276480512);
+emit_32(3260727296);
+emit_32(1103239001);
+emit_32(3276480512);
+emit_32(3259703309);
+emit_32(1103115059);
+emit_32(3276480512);
+emit_32(3258679296);
+emit_32(1102634916);
+emit_32(3276480512);
+emit_32(3257655309);
+emit_32(1103117366);
+emit_32(3276480512);
+emit_32(3256631296);
+emit_32(1103874962);
+emit_32(3276480512);
+emit_32(3255607309);
+emit_32(1104123108);
+emit_32(3276480512);
+emit_32(3254386688);
+emit_32(1103935308);
+emit_32(3276480512);
+emit_32(3252338714);
+emit_32(1103665666);
+emit_32(3276480512);
+emit_32(3250290688);
+emit_32(1103444679);
+emit_32(3276480512);
+emit_32(3248242714);
+emit_32(1103627551);
+emit_32(3276480512);
+emit_32(3245998080);
+emit_32(1103736865);
+emit_32(3276480512);
+emit_32(3241902132);
+emit_32(1103212210);
+emit_32(3276480512);
+emit_32(3237609472);
+emit_32(1102649124);
+emit_32(3276480512);
+emit_32(3229220864);
+emit_32(1101755266);
+emit_32(3276480512);
+emit_32(0);
+emit_32(1101465335);
+emit_32(3276480512);
+emit_32(1081737216);
+emit_32(1101171471);
+emit_32(3276480512);
+emit_32(3279552512);
+emit_32(1100210871);
+emit_32(3276736496);
+emit_32(3279296528);
+emit_32(1100433483);
+emit_32(3276736496);
+emit_32(3279040545);
+emit_32(1099833855);
+emit_32(3276736496);
+emit_32(3278784496);
+emit_32(1100155611);
+emit_32(3276736496);
+emit_32(3278528512);
+emit_32(1099838049);
+emit_32(3276736496);
+emit_32(3278272528);
+emit_32(1100058775);
+emit_32(3276736496);
+emit_32(3278016545);
+emit_32(1099672899);
+emit_32(3276736496);
+emit_32(3277760496);
+emit_32(1099187932);
+emit_32(3276736496);
+emit_32(3277504512);
+emit_32(1098271477);
+emit_32(3276736496);
+emit_32(3277248528);
+emit_32(1096846357);
+emit_32(3276736496);
+emit_32(3276992545);
+emit_32(1094240646);
+emit_32(3276736496);
+emit_32(3276736496);
+emit_32(1093510208);
+emit_32(3276736496);
+emit_32(3276480512);
+emit_32(1093157677);
+emit_32(3276736496);
+emit_32(3276224528);
+emit_32(1093135971);
+emit_32(3276736496);
+emit_32(3275968545);
+emit_32(1092174626);
+emit_32(3276736496);
+emit_32(3275712496);
+emit_32(1092008343);
+emit_32(3276736496);
+emit_32(3275456512);
+emit_32(1091657206);
+emit_32(3276736496);
+emit_32(3275200528);
+emit_32(1090624757);
+emit_32(3276736496);
+emit_32(3274944545);
+emit_32(1091109598);
+emit_32(3276736496);
+emit_32(3274688496);
+emit_32(1091299097);
+emit_32(3276736496);
+emit_32(3274432512);
+emit_32(1091108078);
+emit_32(3276736496);
+emit_32(3274176528);
+emit_32(1088708464);
+emit_32(3276736496);
+emit_32(3273920545);
+emit_32(1088400979);
+emit_32(3276736496);
+emit_32(3273664496);
+emit_32(1088671869);
+emit_32(3276736496);
+emit_32(3273408512);
+emit_32(1086687543);
+emit_32(3276736496);
+emit_32(3273152528);
+emit_32(1087251530);
+emit_32(3276736496);
+emit_32(3272896545);
+emit_32(1088748687);
+emit_32(3276736496);
+emit_32(3272640496);
+emit_32(1089984811);
+emit_32(3276736496);
+emit_32(3272384512);
+emit_32(1091974946);
+emit_32(3276736496);
+emit_32(3272128528);
+emit_32(1092819930);
+emit_32(3276736496);
+emit_32(3271872545);
+emit_32(1093160927);
+emit_32(3276736496);
+emit_32(3271616496);
+emit_32(1094132118);
+emit_32(3276736496);
+emit_32(3271163904);
+emit_32(1095157206);
+emit_32(3276736496);
+emit_32(3270651937);
+emit_32(1095618580);
+emit_32(3276736496);
+emit_32(3270139970);
+emit_32(1096186069);
+emit_32(3276736496);
+emit_32(3269627871);
+emit_32(1095671113);
+emit_32(3276736496);
+emit_32(3269115904);
+emit_32(1095678348);
+emit_32(3276736496);
+emit_32(3268603937);
+emit_32(1095989776);
+emit_32(3276736496);
+emit_32(3268091970);
+emit_32(1095663878);
+emit_32(3276736496);
+emit_32(3267579911);
+emit_32(1095691351);
+emit_32(3276736496);
+emit_32(3267067904);
+emit_32(1096383306);
+emit_32(3276736496);
+emit_32(3266555911);
+emit_32(1097384277);
+emit_32(3276736496);
+emit_32(3266043904);
+emit_32(1099122606);
+emit_32(3276736496);
+emit_32(3265531911);
+emit_32(1100558316);
+emit_32(3276736496);
+emit_32(3265019904);
+emit_32(1101303015);
+emit_32(3276736496);
+emit_32(3264507911);
+emit_32(1101081556);
+emit_32(3276736496);
+emit_32(3263995904);
+emit_32(1100970826);
+emit_32(3276736496);
+emit_32(3263483911);
+emit_32(1101242984);
+emit_32(3276736496);
+emit_32(3262775296);
+emit_32(1102057728);
+emit_32(3276736496);
+emit_32(3261751309);
+emit_32(1102727925);
+emit_32(3276736496);
+emit_32(3260727296);
+emit_32(1102747638);
+emit_32(3276736496);
+emit_32(3259703309);
+emit_32(1102584322);
+emit_32(3276736496);
+emit_32(3258679296);
+emit_32(1102811234);
+emit_32(3276736496);
+emit_32(3257655309);
+emit_32(1102829742);
+emit_32(3276736496);
+emit_32(3256631296);
+emit_32(1103344278);
+emit_32(3276736496);
+emit_32(3255607309);
+emit_32(1103685065);
+emit_32(3276736496);
+emit_32(3254386688);
+emit_32(1103826413);
+emit_32(3276736496);
+emit_32(3252338714);
+emit_32(1103104626);
+emit_32(3276736496);
+emit_32(3250290688);
+emit_32(1102261571);
+emit_32(3276736496);
+emit_32(3248242714);
+emit_32(1102829899);
+emit_32(3276736496);
+emit_32(3245998080);
+emit_32(1103020530);
+emit_32(3276736496);
+emit_32(3241902132);
+emit_32(1102258477);
+emit_32(3276736496);
+emit_32(3237609472);
+emit_32(1101911084);
+emit_32(3276736496);
+emit_32(3229220864);
+emit_32(1101090364);
+emit_32(3276736496);
+emit_32(0);
+emit_32(1100301573);
+emit_32(3276736496);
+emit_32(1081737216);
+emit_32(1100121322);
+emit_32(3276736496);
+emit_32(3279552512);
+emit_32(1099773614);
+emit_32(3276992545);
+emit_32(3279296528);
+emit_32(1099858287);
+emit_32(3276992545);
+emit_32(3279040545);
+emit_32(1099688523);
+emit_32(3276992545);
+emit_32(3278784496);
+emit_32(1099279211);
+emit_32(3276992545);
+emit_32(3278528512);
+emit_32(1098814430);
+emit_32(3276992545);
+emit_32(3278272528);
+emit_32(1099260651);
+emit_32(3276992545);
+emit_32(3278016545);
+emit_32(1099269983);
+emit_32(3276992545);
+emit_32(3277760496);
+emit_32(1097458201);
+emit_32(3276992545);
+emit_32(3277504512);
+emit_32(1096491624);
+emit_32(3276992545);
+emit_32(3277248528);
+emit_32(1094951371);
+emit_32(3276992545);
+emit_32(3276992545);
+emit_32(1094228482);
+emit_32(3276992545);
+emit_32(3276736496);
+emit_32(1094425929);
+emit_32(3276992545);
+emit_32(3276480512);
+emit_32(1094168504);
+emit_32(3276992545);
+emit_32(3276224528);
+emit_32(1094579965);
+emit_32(3276992545);
+emit_32(3275968545);
+emit_32(1094436205);
+emit_32(3276992545);
+emit_32(3275712496);
+emit_32(1093278787);
+emit_32(3276992545);
+emit_32(3275456512);
+emit_32(1093351873);
+emit_32(3276992545);
+emit_32(3275200528);
+emit_32(1092131865);
+emit_32(3276992545);
+emit_32(3274944545);
+emit_32(1092250753);
+emit_32(3276992545);
+emit_32(3274688496);
+emit_32(1092049888);
+emit_32(3276992545);
+emit_32(3274432512);
+emit_32(1092031821);
+emit_32(3276992545);
+emit_32(3274176528);
+emit_32(1090545517);
+emit_32(3276992545);
+emit_32(3273920545);
+emit_32(1087815580);
+emit_32(3276992545);
+emit_32(3273664496);
+emit_32(1088895152);
+emit_32(3276992545);
+emit_32(3273408512);
+emit_32(1089520607);
+emit_32(3276992545);
+emit_32(3273152528);
+emit_32(1091009407);
+emit_32(3276992545);
+emit_32(3272896545);
+emit_32(1091156585);
+emit_32(3276992545);
+emit_32(3272640496);
+emit_32(1092501331);
+emit_32(3276992545);
+emit_32(3272384512);
+emit_32(1093577002);
+emit_32(3276992545);
+emit_32(3272128528);
+emit_32(1094131384);
+emit_32(3276992545);
+emit_32(3271872545);
+emit_32(1095441999);
+emit_32(3276992545);
+emit_32(3271616496);
+emit_32(1096144126);
+emit_32(3276992545);
+emit_32(3271163904);
+emit_32(1097375574);
+emit_32(3276992545);
+emit_32(3270651937);
+emit_32(1097616746);
+emit_32(3276992545);
+emit_32(3270139970);
+emit_32(1098727817);
+emit_32(3276992545);
+emit_32(3269627871);
+emit_32(1098389442);
+emit_32(3276992545);
+emit_32(3269115904);
+emit_32(1097181902);
+emit_32(3276992545);
+emit_32(3268603937);
+emit_32(1097851522);
+emit_32(3276992545);
+emit_32(3268091970);
+emit_32(1097817234);
+emit_32(3276992545);
+emit_32(3267579911);
+emit_32(1098027054);
+emit_32(3276992545);
+emit_32(3267067904);
+emit_32(1098025691);
+emit_32(3276992545);
+emit_32(3266555911);
+emit_32(1099190816);
+emit_32(3276992545);
+emit_32(3266043904);
+emit_32(1100082420);
+emit_32(3276992545);
+emit_32(3265531911);
+emit_32(1100900257);
+emit_32(3276992545);
+emit_32(3265019904);
+emit_32(1101488351);
+emit_32(3276992545);
+emit_32(3264507911);
+emit_32(1101299188);
+emit_32(3276992545);
+emit_32(3263995904);
+emit_32(1101555565);
+emit_32(3276992545);
+emit_32(3263483911);
+emit_32(1101541671);
+emit_32(3276992545);
+emit_32(3262775296);
+emit_32(1101907414);
+emit_32(3276992545);
+emit_32(3261751309);
+emit_32(1102511446);
+emit_32(3276992545);
+emit_32(3260727296);
+emit_32(1102908490);
+emit_32(3276992545);
+emit_32(3259703309);
+emit_32(1102906130);
+emit_32(3276992545);
+emit_32(3258679296);
+emit_32(1102873153);
+emit_32(3276992545);
+emit_32(3257655309);
+emit_32(1103170057);
+emit_32(3276992545);
+emit_32(3256631296);
+emit_32(1103437234);
+emit_32(3276992545);
+emit_32(3255607309);
+emit_32(1103795952);
+emit_32(3276992545);
+emit_32(3254386688);
+emit_32(1103493018);
+emit_32(3276992545);
+emit_32(3252338714);
+emit_32(1102175378);
+emit_32(3276992545);
+emit_32(3250290688);
+emit_32(1101859861);
+emit_32(3276992545);
+emit_32(3248242714);
+emit_32(1102213756);
+emit_32(3276992545);
+emit_32(3245998080);
+emit_32(1102152676);
+emit_32(3276992545);
+emit_32(3241902132);
+emit_32(1101638559);
+emit_32(3276992545);
+emit_32(3237609472);
+emit_32(1101182167);
+emit_32(3276992545);
+emit_32(3229220864);
+emit_32(1100207830);
+emit_32(3276992545);
+emit_32(0);
+emit_32(1099526308);
+emit_32(3276992545);
+emit_32(1081737216);
+emit_32(1099020213);
+emit_32(3276992545);
+emit_32(3279552512);
+emit_32(1099775187);
+emit_32(3277248528);
+emit_32(3279296528);
+emit_32(1099528667);
+emit_32(3277248528);
+emit_32(3279040545);
+emit_32(1099794376);
+emit_32(3277248528);
+emit_32(3278784496);
+emit_32(1099371223);
+emit_32(3277248528);
+emit_32(3278528512);
+emit_32(1097562220);
+emit_32(3277248528);
+emit_32(3278272528);
+emit_32(1098308597);
+emit_32(3277248528);
+emit_32(3278016545);
+emit_32(1097403885);
+emit_32(3277248528);
+emit_32(3277760496);
+emit_32(1095946050);
+emit_32(3277248528);
+emit_32(3277504512);
+emit_32(1094735364);
+emit_32(3277248528);
+emit_32(3277248528);
+emit_32(1094678007);
+emit_32(3277248528);
+emit_32(3276992545);
+emit_32(1095274332);
+emit_32(3277248528);
+emit_32(3276736496);
+emit_32(1095321728);
+emit_32(3277248528);
+emit_32(3276480512);
+emit_32(1095493170);
+emit_32(3277248528);
+emit_32(3276224528);
+emit_32(1095747135);
+emit_32(3277248528);
+emit_32(3275968545);
+emit_32(1095522216);
+emit_32(3277248528);
+emit_32(3275712496);
+emit_32(1094690590);
+emit_32(3277248528);
+emit_32(3275456512);
+emit_32(1094638056);
+emit_32(3277248528);
+emit_32(3275200528);
+emit_32(1093416570);
+emit_32(3277248528);
+emit_32(3274944545);
+emit_32(1092979314);
+emit_32(3277248528);
+emit_32(3274688496);
+emit_32(1092811961);
+emit_32(3277248528);
+emit_32(3274432512);
+emit_32(1093012554);
+emit_32(3277248528);
+emit_32(3274176528);
+emit_32(1091374384);
+emit_32(3277248528);
+emit_32(3273920545);
+emit_32(1089032851);
+emit_32(3277248528);
+emit_32(3273664496);
+emit_32(1090993437);
+emit_32(3277248528);
+emit_32(3273408512);
+emit_32(1092377368);
+emit_32(3277248528);
+emit_32(3273152528);
+emit_32(1093095077);
+emit_32(3277248528);
+emit_32(3272896545);
+emit_32(1093715519);
+emit_32(3277248528);
+emit_32(3272640496);
+emit_32(1094921486);
+emit_32(3277248528);
+emit_32(3272384512);
+emit_32(1096565129);
+emit_32(3277248528);
+emit_32(3272128528);
+emit_32(1097767112);
+emit_32(3277248528);
+emit_32(3271872545);
+emit_32(1098339005);
+emit_32(3277248528);
+emit_32(3271616496);
+emit_32(1099085958);
+emit_32(3277248528);
+emit_32(3271163904);
+emit_32(1099220281);
+emit_32(3277248528);
+emit_32(3270651937);
+emit_32(1099411227);
+emit_32(3277248528);
+emit_32(3270139970);
+emit_32(1099194958);
+emit_32(3277248528);
+emit_32(3269627871);
+emit_32(1099275174);
+emit_32(3277248528);
+emit_32(3269115904);
+emit_32(1099273968);
+emit_32(3277248528);
+emit_32(3268603937);
+emit_32(1098980681);
+emit_32(3277248528);
+emit_32(3268091970);
+emit_32(1098318243);
+emit_32(3277248528);
+emit_32(3267579911);
+emit_32(1098900413);
+emit_32(3277248528);
+emit_32(3267067904);
+emit_32(1099325086);
+emit_32(3277248528);
+emit_32(3266555911);
+emit_32(1100242695);
+emit_32(3277248528);
+emit_32(3266043904);
+emit_32(1101153383);
+emit_32(3277248528);
+emit_32(3265531911);
+emit_32(1101448505);
+emit_32(3277248528);
+emit_32(3265019904);
+emit_32(1101666976);
+emit_32(3277248528);
+emit_32(3264507911);
+emit_32(1102125203);
+emit_32(3277248528);
+emit_32(3263995904);
+emit_32(1102137996);
+emit_32(3277248528);
+emit_32(3263483911);
+emit_32(1101933104);
+emit_32(3277248528);
+emit_32(3262775296);
+emit_32(1102603669);
+emit_32(3277248528);
+emit_32(3261751309);
+emit_32(1102617615);
+emit_32(3277248528);
+emit_32(3260727296);
+emit_32(1103215355);
+emit_32(3277248528);
+emit_32(3259703309);
+emit_32(1103071281);
+emit_32(3277248528);
+emit_32(3258679296);
+emit_32(1102637957);
+emit_32(3277248528);
+emit_32(3257655309);
+emit_32(1103331118);
+emit_32(3277248528);
+emit_32(3256631296);
+emit_32(1104015943);
+emit_32(3277248528);
+emit_32(3255607309);
+emit_32(1103436710);
+emit_32(3277248528);
+emit_32(3254386688);
+emit_32(1102725618);
+emit_32(3277248528);
+emit_32(3252338714);
+emit_32(1101979084);
+emit_32(3277248528);
+emit_32(3250290688);
+emit_32(1101652401);
+emit_32(3277248528);
+emit_32(3248242714);
+emit_32(1101690778);
+emit_32(3277248528);
+emit_32(3245998080);
+emit_32(1101385643);
+emit_32(3277248528);
+emit_32(3241902132);
+emit_32(1100831785);
+emit_32(3277248528);
+emit_32(3237609472);
+emit_32(1100385721);
+emit_32(3277248528);
+emit_32(3229220864);
+emit_32(1099248645);
+emit_32(3277248528);
+emit_32(0);
+emit_32(1097731041);
+emit_32(3277248528);
+emit_32(1081737216);
+emit_32(1097108292);
+emit_32(3277248528);
+emit_32(3279552512);
+emit_32(1099513148);
+emit_32(3277504512);
+emit_32(3279296528);
+emit_32(1099237687);
+emit_32(3277504512);
+emit_32(3279040545);
+emit_32(1099823002);
+emit_32(3277504512);
+emit_32(3278784496);
+emit_32(1099636094);
+emit_32(3277504512);
+emit_32(3278528512);
+emit_32(1098146172);
+emit_32(3277504512);
+emit_32(3278272528);
+emit_32(1096179673);
+emit_32(3277504512);
+emit_32(3278016545);
+emit_32(1095619209);
+emit_32(3277504512);
+emit_32(3277760496);
+emit_32(1095051510);
+emit_32(3277504512);
+emit_32(3277504512);
+emit_32(1094914041);
+emit_32(3277504512);
+emit_32(3277248528);
+emit_32(1095143680);
+emit_32(3277504512);
+emit_32(3276992545);
+emit_32(1095686213);
+emit_32(3277504512);
+emit_32(3276736496);
+emit_32(1096167719);
+emit_32(3277504512);
+emit_32(3276480512);
+emit_32(1096217212);
+emit_32(3277504512);
+emit_32(3276224528);
+emit_32(1095494009);
+emit_32(3277504512);
+emit_32(3275968545);
+emit_32(1095282721);
+emit_32(3277504512);
+emit_32(3275712496);
+emit_32(1094864024);
+emit_32(3277504512);
+emit_32(3275456512);
+emit_32(1095079402);
+emit_32(3277504512);
+emit_32(3275200528);
+emit_32(1093909506);
+emit_32(3277504512);
+emit_32(3274944545);
+emit_32(1094085876);
+emit_32(3277504512);
+emit_32(3274688496);
+emit_32(1093922193);
+emit_32(3277504512);
+emit_32(3274432512);
+emit_32(1093002173);
+emit_32(3277504512);
+emit_32(3274176528);
+emit_32(1091809376);
+emit_32(3277504512);
+emit_32(3273920545);
+emit_32(1090895154);
+emit_32(3277504512);
+emit_32(3273664496);
+emit_32(1092994938);
+emit_32(3277504512);
+emit_32(3273408512);
+emit_32(1094548613);
+emit_32(3277504512);
+emit_32(3273152528);
+emit_32(1095987783);
+emit_32(3277504512);
+emit_32(3272896545);
+emit_32(1096416022);
+emit_32(3277504512);
+emit_32(3272640496);
+emit_32(1097685323);
+emit_32(3277504512);
+emit_32(3272384512);
+emit_32(1098440927);
+emit_32(3277504512);
+emit_32(3272128528);
+emit_32(1099405512);
+emit_32(3277504512);
+emit_32(3271872545);
+emit_32(1099913599);
+emit_32(3277504512);
+emit_32(3271616496);
+emit_32(1099823422);
+emit_32(3277504512);
+emit_32(3271163904);
+emit_32(1099863373);
+emit_32(3277504512);
+emit_32(3270651937);
+emit_32(1099663042);
+emit_32(3277504512);
+emit_32(3270139970);
+emit_32(1099637929);
+emit_32(3277504512);
+emit_32(3269627871);
+emit_32(1099948936);
+emit_32(3277504512);
+emit_32(3269115904);
+emit_32(1099967024);
+emit_32(3277504512);
+emit_32(3268603937);
+emit_32(1099787770);
+emit_32(3277504512);
+emit_32(3268091970);
+emit_32(1099629540);
+emit_32(3277504512);
+emit_32(3267579911);
+emit_32(1099729889);
+emit_32(3277504512);
+emit_32(3267067904);
+emit_32(1099959737);
+emit_32(3277504512);
+emit_32(3266555911);
+emit_32(1100461585);
+emit_32(3277504512);
+emit_32(3266043904);
+emit_32(1101443996);
+emit_32(3277504512);
+emit_32(3265531911);
+emit_32(1102161904);
+emit_32(3277504512);
+emit_32(3265019904);
+emit_32(1102642623);
+emit_32(3277504512);
+emit_32(3264507911);
+emit_32(1102254703);
+emit_32(3277504512);
+emit_32(3263995904);
+emit_32(1102207464);
+emit_32(3277504512);
+emit_32(3263483911);
+emit_32(1101959424);
+emit_32(3277504512);
+emit_32(3262775296);
+emit_32(1102549248);
+emit_32(3277504512);
+emit_32(3261751309);
+emit_32(1103235488);
+emit_32(3277504512);
+emit_32(3260727296);
+emit_32(1103408923);
+emit_32(3277504512);
+emit_32(3259703309);
+emit_32(1103077258);
+emit_32(3277504512);
+emit_32(3258679296);
+emit_32(1102537084);
+emit_32(3277504512);
+emit_32(3257655309);
+emit_32(1103679455);
+emit_32(3277504512);
+emit_32(3256631296);
+emit_32(1103709654);
+emit_32(3277504512);
+emit_32(3255607309);
+emit_32(1102899891);
+emit_32(3277504512);
+emit_32(3254386688);
+emit_32(1101944534);
+emit_32(3277504512);
+emit_32(3252338714);
+emit_32(1101169793);
+emit_32(3277504512);
+emit_32(3250290688);
+emit_32(1100964273);
+emit_32(3277504512);
+emit_32(3248242714);
+emit_32(1101176085);
+emit_32(3277504512);
+emit_32(3245998080);
+emit_32(1100580284);
+emit_32(3277504512);
+emit_32(3241902132);
+emit_32(1099596143);
+emit_32(3277504512);
+emit_32(3237609472);
+emit_32(1099177394);
+emit_32(3277504512);
+emit_32(3229220864);
+emit_32(1098487274);
+emit_32(3277504512);
+emit_32(0);
+emit_32(1096586625);
+emit_32(3277504512);
+emit_32(1081737216);
+emit_32(1096047133);
+emit_32(3277504512);
+emit_32(3279552512);
+emit_32(1099302751);
+emit_32(3277760496);
+emit_32(3279296528);
+emit_32(1099310930);
+emit_32(3277760496);
+emit_32(3279040545);
+emit_32(1099757833);
+emit_32(3277760496);
+emit_32(3278784496);
+emit_32(1099826410);
+emit_32(3277760496);
+emit_32(3278528512);
+emit_32(1098603771);
+emit_32(3277760496);
+emit_32(3278272528);
+emit_32(1096803575);
+emit_32(3277760496);
+emit_32(3278016545);
+emit_32(1095899388);
+emit_32(3277760496);
+emit_32(3277760496);
+emit_32(1096413925);
+emit_32(3277760496);
+emit_32(3277504512);
+emit_32(1096685925);
+emit_32(3277760496);
+emit_32(3277248528);
+emit_32(1096488373);
+emit_32(3277760496);
+emit_32(3276992545);
+emit_32(1096023854);
+emit_32(3277760496);
+emit_32(3276736496);
+emit_32(1096726505);
+emit_32(3277760496);
+emit_32(3276480512);
+emit_32(1097672845);
+emit_32(3277760496);
+emit_32(3276224528);
+emit_32(1097630587);
+emit_32(3277760496);
+emit_32(3275968545);
+emit_32(1097242300);
+emit_32(3277760496);
+emit_32(3275712496);
+emit_32(1096015780);
+emit_32(3277760496);
+emit_32(3275456512);
+emit_32(1095966707);
+emit_32(3277760496);
+emit_32(3275200528);
+emit_32(1094654729);
+emit_32(3277760496);
+emit_32(3274944545);
+emit_32(1094504258);
+emit_32(3277760496);
+emit_32(3274688496);
+emit_32(1093927856);
+emit_32(3277760496);
+emit_32(3274432512);
+emit_32(1092392111);
+emit_32(3277760496);
+emit_32(3274176528);
+emit_32(1091411231);
+emit_32(3277760496);
+emit_32(3273920545);
+emit_32(1093339290);
+emit_32(3277760496);
+emit_32(3273664496);
+emit_32(1095670904);
+emit_32(3277760496);
+emit_32(3273408512);
+emit_32(1096393163);
+emit_32(3277760496);
+emit_32(3273152528);
+emit_32(1098248199);
+emit_32(3277760496);
+emit_32(3272896545);
+emit_32(1099000342);
+emit_32(3277760496);
+emit_32(3272640496);
+emit_32(1099390150);
+emit_32(3277760496);
+emit_32(3272384512);
+emit_32(1099453117);
+emit_32(3277760496);
+emit_32(3272128528);
+emit_32(1100216690);
+emit_32(3277760496);
+emit_32(3271872545);
+emit_32(1100387294);
+emit_32(3277760496);
+emit_32(3271616496);
+emit_32(1100623957);
+emit_32(3277760496);
+emit_32(3271163904);
+emit_32(1100583063);
+emit_32(3277760496);
+emit_32(3270651937);
+emit_32(1100270692);
+emit_32(3277760496);
+emit_32(3270139970);
+emit_32(1100221199);
+emit_32(3277760496);
+emit_32(3269627871);
+emit_32(1100837028);
+emit_32(3277760496);
+emit_32(3269115904);
+emit_32(1100744648);
+emit_32(3277760496);
+emit_32(3268603937);
+emit_32(1100729496);
+emit_32(3277760496);
+emit_32(3268091970);
+emit_32(1100349650);
+emit_32(3277760496);
+emit_32(3267579911);
+emit_32(1100277141);
+emit_32(3277760496);
+emit_32(3267067904);
+emit_32(1100539180);
+emit_32(3277760496);
+emit_32(3266555911);
+emit_32(1101285137);
+emit_32(3277760496);
+emit_32(3266043904);
+emit_32(1101760404);
+emit_32(3277760496);
+emit_32(3265531911);
+emit_32(1102151418);
+emit_32(3277760496);
+emit_32(3265019904);
+emit_32(1102545368);
+emit_32(3277760496);
+emit_32(3264507911);
+emit_32(1102327369);
+emit_32(3277760496);
+emit_32(3263995904);
+emit_32(1102437312);
+emit_32(3277760496);
+emit_32(3263483911);
+emit_32(1102836190);
+emit_32(3277760496);
+emit_32(3262775296);
+emit_32(1103463449);
+emit_32(3277760496);
+emit_32(3261751309);
+emit_32(1103612871);
+emit_32(3277760496);
+emit_32(3260727296);
+emit_32(1103521907);
+emit_32(3277760496);
+emit_32(3259703309);
+emit_32(1102694842);
+emit_32(3277760496);
+emit_32(3258679296);
+emit_32(1102314104);
+emit_32(3277760496);
+emit_32(3257655309);
+emit_32(1103092829);
+emit_32(3277760496);
+emit_32(3256631296);
+emit_32(1102811392);
+emit_32(3277760496);
+emit_32(3255607309);
+emit_32(1102399406);
+emit_32(3277760496);
+emit_32(3254386688);
+emit_32(1101424807);
+emit_32(3277760496);
+emit_32(3252338714);
+emit_32(1100416025);
+emit_32(3277760496);
+emit_32(3250290688);
+emit_32(1099956172);
+emit_32(3277760496);
+emit_32(3248242714);
+emit_32(1100071882);
+emit_32(3277760496);
+emit_32(3245998080);
+emit_32(1099877633);
+emit_32(3277760496);
+emit_32(3241902132);
+emit_32(1099019059);
+emit_32(3277760496);
+emit_32(3237609472);
+emit_32(1098372560);
+emit_32(3277760496);
+emit_32(3229220864);
+emit_32(1097025244);
+emit_32(3277760496);
+emit_32(0);
+emit_32(1095913230);
+emit_32(3277760496);
+emit_32(1081737216);
+emit_32(1095782787);
+emit_32(3277760496);
+emit_32(3279552512);
+emit_32(1098903349);
+emit_32(3278016545);
+emit_32(3279296528);
+emit_32(1099112225);
+emit_32(3278016545);
+emit_32(3279040545);
+emit_32(1099559495);
+emit_32(3278016545);
+emit_32(3278784496);
+emit_32(1099374422);
+emit_32(3278016545);
+emit_32(3278528512);
+emit_32(1099044802);
+emit_32(3278016545);
+emit_32(3278272528);
+emit_32(1099082498);
+emit_32(3278016545);
+emit_32(3278016545);
+emit_32(1098243061);
+emit_32(3278016545);
+emit_32(3277760496);
+emit_32(1097484626);
+emit_32(3278016545);
+emit_32(3277504512);
+emit_32(1098172282);
+emit_32(3278016545);
+emit_32(3277248528);
+emit_32(1097990039);
+emit_32(3278016545);
+emit_32(3276992545);
+emit_32(1097473301);
+emit_32(3278016545);
+emit_32(3276736496);
+emit_32(1098280600);
+emit_32(3278016545);
+emit_32(3276480512);
+emit_32(1098467561);
+emit_32(3278016545);
+emit_32(3276224528);
+emit_32(1098700449);
+emit_32(3278016545);
+emit_32(3275968545);
+emit_32(1097813354);
+emit_32(3278016545);
+emit_32(3275712496);
+emit_32(1097573020);
+emit_32(3278016545);
+emit_32(3275456512);
+emit_32(1096889034);
+emit_32(3278016545);
+emit_32(3275200528);
+emit_32(1095010930);
+emit_32(3278016545);
+emit_32(3274944545);
+emit_32(1094741446);
+emit_32(3278016545);
+emit_32(3274688496);
+emit_32(1093564105);
+emit_32(3278016545);
+emit_32(3274432512);
+emit_32(1092621330);
+emit_32(3278016545);
+emit_32(3274176528);
+emit_32(1092464757);
+emit_32(3278016545);
+emit_32(3273920545);
+emit_32(1094580175);
+emit_32(3278016545);
+emit_32(3273664496);
+emit_32(1096882219);
+emit_32(3278016545);
+emit_32(3273408512);
+emit_32(1098358718);
+emit_32(3278016545);
+emit_32(3273152528);
+emit_32(1099298662);
+emit_32(3278016545);
+emit_32(3272896545);
+emit_32(1099922617);
+emit_32(3278016545);
+emit_32(3272640496);
+emit_32(1100192521);
+emit_32(3278016545);
+emit_32(3272384512);
+emit_32(1100137470);
+emit_32(3278016545);
+emit_32(3272128528);
+emit_32(1101007893);
+emit_32(3278016545);
+emit_32(3271872545);
+emit_32(1101168640);
+emit_32(3278016545);
+emit_32(3271616496);
+emit_32(1100874252);
+emit_32(3278016545);
+emit_32(3271163904);
+emit_32(1100904346);
+emit_32(3278016545);
+emit_32(3270651937);
+emit_32(1100957142);
+emit_32(3278016545);
+emit_32(3270139970);
+emit_32(1101183110);
+emit_32(3278016545);
+emit_32(3269627871);
+emit_32(1101430574);
+emit_32(3278016545);
+emit_32(3269115904);
+emit_32(1101303906);
+emit_32(3278016545);
+emit_32(3268603937);
+emit_32(1101524317);
+emit_32(3278016545);
+emit_32(3268091970);
+emit_32(1101223481);
+emit_32(3278016545);
+emit_32(3267579911);
+emit_32(1100917768);
+emit_32(3278016545);
+emit_32(3267067904);
+emit_32(1100967523);
+emit_32(3278016545);
+emit_32(3266555911);
+emit_32(1101230506);
+emit_32(3278016545);
+emit_32(3266043904);
+emit_32(1101743889);
+emit_32(3278016545);
+emit_32(3265531911);
+emit_32(1102035865);
+emit_32(3278016545);
+emit_32(3265019904);
+emit_32(1102327683);
+emit_32(3278016545);
+emit_32(3264507911);
+emit_32(1102160803);
+emit_32(3278016545);
+emit_32(3263995904);
+emit_32(1102422737);
+emit_32(3278016545);
+emit_32(3263483911);
+emit_32(1102993582);
+emit_32(3278016545);
+emit_32(3262775296);
+emit_32(1103413274);
+emit_32(3278016545);
+emit_32(3261751309);
+emit_32(1103424966);
+emit_32(3278016545);
+emit_32(3260727296);
+emit_32(1102892656);
+emit_32(3278016545);
+emit_32(3259703309);
+emit_32(1102022495);
+emit_32(3278016545);
+emit_32(3258679296);
+emit_32(1101852259);
+emit_32(3278016545);
+emit_32(3257655309);
+emit_32(1102344408);
+emit_32(3278016545);
+emit_32(3256631296);
+emit_32(1102317198);
+emit_32(3278016545);
+emit_32(3255607309);
+emit_32(1101799883);
+emit_32(3278016545);
+emit_32(3254386688);
+emit_32(1100918922);
+emit_32(3278016545);
+emit_32(3252338714);
+emit_32(1099744779);
+emit_32(3278016545);
+emit_32(3250290688);
+emit_32(1098585945);
+emit_32(3278016545);
+emit_32(3248242714);
+emit_32(1098674235);
+emit_32(3278016545);
+emit_32(3245998080);
+emit_32(1098530685);
+emit_32(3278016545);
+emit_32(3241902132);
+emit_32(1097602066);
+emit_32(3278016545);
+emit_32(3237609472);
+emit_32(1097146565);
+emit_32(3278016545);
+emit_32(3229220864);
+emit_32(1096070935);
+emit_32(3278016545);
+emit_32(0);
+emit_32(1094636379);
+emit_32(3278016545);
+emit_32(1081737216);
+emit_32(1094685347);
+emit_32(3278016545);
+emit_32(3279552512);
+emit_32(1098113142);
+emit_32(3278272528);
+emit_32(3279296528);
+emit_32(1099020003);
+emit_32(3278272528);
+emit_32(3279040545);
+emit_32(1099561016);
+emit_32(3278272528);
+emit_32(3278784496);
+emit_32(1099848273);
+emit_32(3278272528);
+emit_32(3278528512);
+emit_32(1100167460);
+emit_32(3278272528);
+emit_32(3278272528);
+emit_32(1100256431);
+emit_32(3278272528);
+emit_32(3278016545);
+emit_32(1099679872);
+emit_32(3278272528);
+emit_32(3277760496);
+emit_32(1098851759);
+emit_32(3278272528);
+emit_32(3277504512);
+emit_32(1098385562);
+emit_32(3278272528);
+emit_32(3277248528);
+emit_32(1098603142);
+emit_32(3278272528);
+emit_32(3276992545);
+emit_32(1098517158);
+emit_32(3278272528);
+emit_32(3276736496);
+emit_32(1098595697);
+emit_32(3278272528);
+emit_32(3276480512);
+emit_32(1097738591);
+emit_32(3278272528);
+emit_32(3276224528);
+emit_32(1097722757);
+emit_32(3278272528);
+emit_32(3275968545);
+emit_32(1097226886);
+emit_32(3278272528);
+emit_32(3275712496);
+emit_32(1097415629);
+emit_32(3278272528);
+emit_32(3275456512);
+emit_32(1096617873);
+emit_32(3278272528);
+emit_32(3275200528);
+emit_32(1095510786);
+emit_32(3278272528);
+emit_32(3274944545);
+emit_32(1095328858);
+emit_32(3278272528);
+emit_32(3274688496);
+emit_32(1093740999);
+emit_32(3278272528);
+emit_32(3274432512);
+emit_32(1092633598);
+emit_32(3278272528);
+emit_32(3274176528);
+emit_32(1095320155);
+emit_32(3278272528);
+emit_32(3273920545);
+emit_32(1096140771);
+emit_32(3278272528);
+emit_32(3273664496);
+emit_32(1097600808);
+emit_32(3278272528);
+emit_32(3273408512);
+emit_32(1098894960);
+emit_32(3278272528);
+emit_32(3273152528);
+emit_32(1099788032);
+emit_32(3278272528);
+emit_32(3272896545);
+emit_32(1100230112);
+emit_32(3278272528);
+emit_32(3272640496);
+emit_32(1100219731);
+emit_32(3278272528);
+emit_32(3272384512);
+emit_32(1100734897);
+emit_32(3278272528);
+emit_32(3272128528);
+emit_32(1101173726);
+emit_32(3278272528);
+emit_32(3271872545);
+emit_32(1101152072);
+emit_32(3278272528);
+emit_32(3271616496);
+emit_32(1101550479);
+emit_32(3278272528);
+emit_32(3271163904);
+emit_32(1101252736);
+emit_32(3278272528);
+emit_32(3270651937);
+emit_32(1101467694);
+emit_32(3278272528);
+emit_32(3270139970);
+emit_32(1101808009);
+emit_32(3278272528);
+emit_32(3269627871);
+emit_32(1101705930);
+emit_32(3278272528);
+emit_32(3269115904);
+emit_32(1102054110);
+emit_32(3278272528);
+emit_32(3268603937);
+emit_32(1102131180);
+emit_32(3278272528);
+emit_32(3268091970);
+emit_32(1101898868);
+emit_32(3278272528);
+emit_32(3267579911);
+emit_32(1101280313);
+emit_32(3278272528);
+emit_32(3267067904);
+emit_32(1100809188);
+emit_32(3278272528);
+emit_32(3266555911);
+emit_32(1101005429);
+emit_32(3278272528);
+emit_32(3266043904);
+emit_32(1101565631);
+emit_32(3278272528);
+emit_32(3265531911);
+emit_32(1101958585);
+emit_32(3278272528);
+emit_32(3265019904);
+emit_32(1102447903);
+emit_32(3278272528);
+emit_32(3264507911);
+emit_32(1102259526);
+emit_32(3278272528);
+emit_32(3263995904);
+emit_32(1102073456);
+emit_32(3278272528);
+emit_32(3263483911);
+emit_32(1102367372);
+emit_32(3278272528);
+emit_32(3262775296);
+emit_32(1102600104);
+emit_32(3278272528);
+emit_32(3261751309);
+emit_32(1102289935);
+emit_32(3278272528);
+emit_32(3260727296);
+emit_32(1101835692);
+emit_32(3278272528);
+emit_32(3259703309);
+emit_32(1101049364);
+emit_32(3278272528);
+emit_32(3258679296);
+emit_32(1100957929);
+emit_32(3278272528);
+emit_32(3257655309);
+emit_32(1101280366);
+emit_32(3278272528);
+emit_32(3256631296);
+emit_32(1101113432);
+emit_32(3278272528);
+emit_32(3255607309);
+emit_32(1100449789);
+emit_32(3278272528);
+emit_32(3254386688);
+emit_32(1099921726);
+emit_32(3278272528);
+emit_32(3252338714);
+emit_32(1098223138);
+emit_32(3278272528);
+emit_32(3250290688);
+emit_32(1095989776);
+emit_32(3278272528);
+emit_32(3248242714);
+emit_32(1095913754);
+emit_32(3278272528);
+emit_32(3245998080);
+emit_32(1096548981);
+emit_32(3278272528);
+emit_32(3241902132);
+emit_32(1095493380);
+emit_32(3278272528);
+emit_32(3237609472);
+emit_32(1095273074);
+emit_32(3278272528);
+emit_32(3229220864);
+emit_32(1094758957);
+emit_32(3278272528);
+emit_32(0);
+emit_32(1093715414);
+emit_32(3278272528);
+emit_32(1081737216);
+emit_32(1093100529);
+emit_32(3278272528);
+emit_32(3279552512);
+emit_32(1098580387);
+emit_32(3278528512);
+emit_32(3279296528);
+emit_32(1099781479);
+emit_32(3278528512);
+emit_32(3279040545);
+emit_32(1100398041);
+emit_32(3278528512);
+emit_32(3278784496);
+emit_32(1100822715);
+emit_32(3278528512);
+emit_32(3278528512);
+emit_32(1100898841);
+emit_32(3278528512);
+emit_32(3278272528);
+emit_32(1100936538);
+emit_32(3278528512);
+emit_32(3278016545);
+emit_32(1100571528);
+emit_32(3278528512);
+emit_32(3277760496);
+emit_32(1099431674);
+emit_32(3278528512);
+emit_32(3277504512);
+emit_32(1098338586);
+emit_32(3278528512);
+emit_32(3277248528);
+emit_32(1098519046);
+emit_32(3278528512);
+emit_32(3276992545);
+emit_32(1098311533);
+emit_32(3278528512);
+emit_32(3276736496);
+emit_32(1097988991);
+emit_32(3278528512);
+emit_32(3276480512);
+emit_32(1097511993);
+emit_32(3278528512);
+emit_32(3276224528);
+emit_32(1097291373);
+emit_32(3278528512);
+emit_32(3275968545);
+emit_32(1096949852);
+emit_32(3278528512);
+emit_32(3275712496);
+emit_32(1096869007);
+emit_32(3278528512);
+emit_32(3275456512);
+emit_32(1096154717);
+emit_32(3278528512);
+emit_32(3275200528);
+emit_32(1096008126);
+emit_32(3278528512);
+emit_32(3274944545);
+emit_32(1096113612);
+emit_32(3278528512);
+emit_32(3274688496);
+emit_32(1094873986);
+emit_32(3278528512);
+emit_32(3274432512);
+emit_32(1094166512);
+emit_32(3278528512);
+emit_32(3274176528);
+emit_32(1095465592);
+emit_32(3278528512);
+emit_32(3273920545);
+emit_32(1096875193);
+emit_32(3278528512);
+emit_32(3273664496);
+emit_32(1098212128);
+emit_32(3278528512);
+emit_32(3273408512);
+emit_32(1099232497);
+emit_32(3278528512);
+emit_32(3273152528);
+emit_32(1099782003);
+emit_32(3278528512);
+emit_32(3272896545);
+emit_32(1100205261);
+emit_32(3278528512);
+emit_32(3272640496);
+emit_32(1100910690);
+emit_32(3278528512);
+emit_32(3272384512);
+emit_32(1100846098);
+emit_32(3278528512);
+emit_32(3272128528);
+emit_32(1101316856);
+emit_32(3278528512);
+emit_32(3271872545);
+emit_32(1101188668);
+emit_32(3278528512);
+emit_32(3271616496);
+emit_32(1101462451);
+emit_32(3278528512);
+emit_32(3271163904);
+emit_32(1102020713);
+emit_32(3278528512);
+emit_32(3270651937);
+emit_32(1101996543);
+emit_32(3278528512);
+emit_32(3270139970);
+emit_32(1102033138);
+emit_32(3278528512);
+emit_32(3269627871);
+emit_32(1102145231);
+emit_32(3278528512);
+emit_32(3269115904);
+emit_32(1102204423);
+emit_32(3278528512);
+emit_32(3268603937);
+emit_32(1102633396);
+emit_32(3278528512);
+emit_32(3268091970);
+emit_32(1102830685);
+emit_32(3278528512);
+emit_32(3267579911);
+emit_32(1102366271);
+emit_32(3278528512);
+emit_32(3267067904);
+emit_32(1101693819);
+emit_32(3278528512);
+emit_32(3266555911);
+emit_32(1100984300);
+emit_32(3278528512);
+emit_32(3266043904);
+emit_32(1101757311);
+emit_32(3278528512);
+emit_32(3265531911);
+emit_32(1102038486);
+emit_32(3278528512);
+emit_32(3265019904);
+emit_32(1102416078);
+emit_32(3278528512);
+emit_32(3264507911);
+emit_32(1102030360);
+emit_32(3278528512);
+emit_32(3263995904);
+emit_32(1101690831);
+emit_32(3278528512);
+emit_32(3263483911);
+emit_32(1101744256);
+emit_32(3278528512);
+emit_32(3262775296);
+emit_32(1101786199);
+emit_32(3278528512);
+emit_32(3261751309);
+emit_32(1101134142);
+emit_32(3278528512);
+emit_32(3260727296);
+emit_32(1100560990);
+emit_32(3278528512);
+emit_32(3259703309);
+emit_32(1099935148);
+emit_32(3278528512);
+emit_32(3258679296);
+emit_32(1099979765);
+emit_32(3278528512);
+emit_32(3257655309);
+emit_32(1100145597);
+emit_32(3278528512);
+emit_32(3256631296);
+emit_32(1099694499);
+emit_32(3278528512);
+emit_32(3255607309);
+emit_32(1099317589);
+emit_32(3278528512);
+emit_32(3254386688);
+emit_32(1098312896);
+emit_32(3278528512);
+emit_32(3252338714);
+emit_32(1096783967);
+emit_32(3278528512);
+emit_32(3250290688);
+emit_32(1094909218);
+emit_32(3278528512);
+emit_32(3248242714);
+emit_32(1094802158);
+emit_32(3278528512);
+emit_32(3245998080);
+emit_32(1094635749);
+emit_32(3278528512);
+emit_32(3241902132);
+emit_32(1093985423);
+emit_32(3278528512);
+emit_32(3237609472);
+emit_32(1093684376);
+emit_32(3278528512);
+emit_32(3229220864);
+emit_32(1092749885);
+emit_32(3278528512);
+emit_32(0);
+emit_32(1092334471);
+emit_32(3278528512);
+emit_32(1081737216);
+emit_32(1091412678);
+emit_32(3278528512);
+emit_32(3279552512);
+emit_32(1099246495);
+emit_32(3278784496);
+emit_32(3279296528);
+emit_32(1100406168);
+emit_32(3278784496);
+emit_32(3279040545);
+emit_32(1100809188);
+emit_32(3278784496);
+emit_32(3278784496);
+emit_32(1101173726);
+emit_32(3278784496);
+emit_32(3278528512);
+emit_32(1101440798);
+emit_32(3278784496);
+emit_32(3278272528);
+emit_32(1101323148);
+emit_32(3278784496);
+emit_32(3278016545);
+emit_32(1100602724);
+emit_32(3278784496);
+emit_32(3277760496);
+emit_32(1099957325);
+emit_32(3278784496);
+emit_32(3277504512);
+emit_32(1099164077);
+emit_32(3278784496);
+emit_32(3277248528);
+emit_32(1098681680);
+emit_32(3278784496);
+emit_32(3276992545);
+emit_32(1098343724);
+emit_32(3278784496);
+emit_32(3276736496);
+emit_32(1097173198);
+emit_32(3278784496);
+emit_32(3276480512);
+emit_32(1097496684);
+emit_32(3278784496);
+emit_32(3276224528);
+emit_32(1096577607);
+emit_32(3278784496);
+emit_32(3275968545);
+emit_32(1096202217);
+emit_32(3278784496);
+emit_32(3275712496);
+emit_32(1095980968);
+emit_32(3278784496);
+emit_32(3275456512);
+emit_32(1095241407);
+emit_32(3278784496);
+emit_32(3275200528);
+emit_32(1095384223);
+emit_32(3278784496);
+emit_32(3274944545);
+emit_32(1095777649);
+emit_32(3278784496);
+emit_32(3274688496);
+emit_32(1095404356);
+emit_32(3278784496);
+emit_32(3274432512);
+emit_32(1096055626);
+emit_32(3278784496);
+emit_32(3274176528);
+emit_32(1096762996);
+emit_32(3278784496);
+emit_32(3273920545);
+emit_32(1097732404);
+emit_32(3278784496);
+emit_32(3273664496);
+emit_32(1099124913);
+emit_32(3278784496);
+emit_32(3273408512);
+emit_32(1099487615);
+emit_32(3278784496);
+emit_32(3273152528);
+emit_32(1099905263);
+emit_32(3278784496);
+emit_32(3272896545);
+emit_32(1100576090);
+emit_32(3278784496);
+emit_32(3272640496);
+emit_32(1101366716);
+emit_32(3278784496);
+emit_32(3272384512);
+emit_32(1100955150);
+emit_32(3278784496);
+emit_32(3272128528);
+emit_32(1101465911);
+emit_32(3278784496);
+emit_32(3271872545);
+emit_32(1101897872);
+emit_32(3278784496);
+emit_32(3271616496);
+emit_32(1101968074);
+emit_32(3278784496);
+emit_32(3271163904);
+emit_32(1102322545);
+emit_32(3278784496);
+emit_32(3270651937);
+emit_32(1102468507);
+emit_32(3278784496);
+emit_32(3270139970);
+emit_32(1102636699);
+emit_32(3278784496);
+emit_32(3269627871);
+emit_32(1102593812);
+emit_32(3278784496);
+emit_32(3269115904);
+emit_32(1102955781);
+emit_32(3278784496);
+emit_32(3268603937);
+emit_32(1103423183);
+emit_32(3278784496);
+emit_32(3268091970);
+emit_32(1103413484);
+emit_32(3278784496);
+emit_32(3267579911);
+emit_32(1103118467);
+emit_32(3278784496);
+emit_32(3267067904);
+emit_32(1102692536);
+emit_32(3278784496);
+emit_32(3266555911);
+emit_32(1101705878);
+emit_32(3278784496);
+emit_32(3266043904);
+emit_32(1101340082);
+emit_32(3278784496);
+emit_32(3265531911);
+emit_32(1102200596);
+emit_32(3278784496);
+emit_32(3265019904);
+emit_32(1102209457);
+emit_32(3278784496);
+emit_32(3264507911);
+emit_32(1101833280);
+emit_32(3278784496);
+emit_32(3263995904);
+emit_32(1101273812);
+emit_32(3278784496);
+emit_32(3263483911);
+emit_32(1101051042);
+emit_32(3278784496);
+emit_32(3262775296);
+emit_32(1100997722);
+emit_32(3278784496);
+emit_32(3261751309);
+emit_32(1100555118);
+emit_32(3278784496);
+emit_32(3260727296);
+emit_32(1099388420);
+emit_32(3278784496);
+emit_32(3259703309);
+emit_32(1098921070);
+emit_32(3278784496);
+emit_32(3258679296);
+emit_32(1098291295);
+emit_32(3278784496);
+emit_32(3257655309);
+emit_32(1097914751);
+emit_32(3278784496);
+emit_32(3256631296);
+emit_32(1098783811);
+emit_32(3278784496);
+emit_32(3255607309);
+emit_32(1097200986);
+emit_32(3278784496);
+emit_32(3254386688);
+emit_32(1095754580);
+emit_32(3278784496);
+emit_32(3252338714);
+emit_32(1094603034);
+emit_32(3278784496);
+emit_32(3250290688);
+emit_32(1092756596);
+emit_32(3278784496);
+emit_32(3248242714);
+emit_32(1093057118);
+emit_32(3278784496);
+emit_32(3245998080);
+emit_32(1093385742);
+emit_32(3278784496);
+emit_32(3241902132);
+emit_32(1092478325);
+emit_32(3278784496);
+emit_32(3237609472);
+emit_32(1091460850);
+emit_32(3278784496);
+emit_32(3229220864);
+emit_32(1090737647);
+emit_32(3278784496);
+emit_32(0);
+emit_32(1090290346);
+emit_32(3278784496);
+emit_32(1081737216);
+emit_32(1090509120);
+emit_32(3278784496);
+emit_32(3279552512);
+emit_32(1099149345);
+emit_32(3279040545);
+emit_32(3279296528);
+emit_32(1100408318);
+emit_32(3279040545);
+emit_32(3279040545);
+emit_32(1100800170);
+emit_32(3279040545);
+emit_32(3278784496);
+emit_32(1101432986);
+emit_32(3279040545);
+emit_32(3278528512);
+emit_32(1101564058);
+emit_32(3279040545);
+emit_32(3278272528);
+emit_32(1101179755);
+emit_32(3279040545);
+emit_32(3278016545);
+emit_32(1100480145);
+emit_32(3279040545);
+emit_32(3277760496);
+emit_32(1099858759);
+emit_32(3279040545);
+emit_32(3277504512);
+emit_32(1099623354);
+emit_32(3279040545);
+emit_32(3277248528);
+emit_32(1098996934);
+emit_32(3279040545);
+emit_32(3276992545);
+emit_32(1098237818);
+emit_32(3279040545);
+emit_32(3276736496);
+emit_32(1097341285);
+emit_32(3279040545);
+emit_32(3276480512);
+emit_32(1096845414);
+emit_32(3279040545);
+emit_32(3276224528);
+emit_32(1095838571);
+emit_32(3279040545);
+emit_32(3275968545);
+emit_32(1095836998);
+emit_32(3279040545);
+emit_32(3275712496);
+emit_32(1095004114);
+emit_32(3279040545);
+emit_32(3275456512);
+emit_32(1094881011);
+emit_32(3279040545);
+emit_32(3275200528);
+emit_32(1094801529);
+emit_32(3279040545);
+emit_32(3274944545);
+emit_32(1093872281);
+emit_32(3279040545);
+emit_32(3274688496);
+emit_32(1094479197);
+emit_32(3279040545);
+emit_32(3274432512);
+emit_32(1096306341);
+emit_32(3279040545);
+emit_32(3274176528);
+emit_32(1096403334);
+emit_32(3279040545);
+emit_32(3273920545);
+emit_32(1097374315);
+emit_32(3279040545);
+emit_32(3273664496);
+emit_32(1098966788);
+emit_32(3279040545);
+emit_32(3273408512);
+emit_32(1099462921);
+emit_32(3279040545);
+emit_32(3273152528);
+emit_32(1099984903);
+emit_32(3279040545);
+emit_32(3272896545);
+emit_32(1101000973);
+emit_32(3279040545);
+emit_32(3272640496);
+emit_32(1101297982);
+emit_32(3279040545);
+emit_32(3272384512);
+emit_32(1101298506);
+emit_32(3279040545);
+emit_32(3272128528);
+emit_32(1101350044);
+emit_32(3279040545);
+emit_32(3271872545);
+emit_32(1102416393);
+emit_32(3279040545);
+emit_32(3271616496);
+emit_32(1102828588);
+emit_32(3279040545);
+emit_32(3271163904);
+emit_32(1103097810);
+emit_32(3279040545);
+emit_32(3270651937);
+emit_32(1103270825);
+emit_32(3279040545);
+emit_32(3270139970);
+emit_32(1103513256);
+emit_32(3279040545);
+emit_32(3269627871);
+emit_32(1103154119);
+emit_32(3279040545);
+emit_32(3269115904);
+emit_32(1103932214);
+emit_32(3279040545);
+emit_32(3268603937);
+emit_32(1103727532);
+emit_32(3279040545);
+emit_32(3268091970);
+emit_32(1103627393);
+emit_32(3279040545);
+emit_32(3267579911);
+emit_32(1103400272);
+emit_32(3279040545);
+emit_32(3267067904);
+emit_32(1103403365);
+emit_32(3279040545);
+emit_32(3266555911);
+emit_32(1102403496);
+emit_32(3279040545);
+emit_32(3266043904);
+emit_32(1101353556);
+emit_32(3279040545);
+emit_32(3265531911);
+emit_32(1101619213);
+emit_32(3279040545);
+emit_32(3265019904);
+emit_32(1102006295);
+emit_32(3279040545);
+emit_32(3264507911);
+emit_32(1101503503);
+emit_32(3279040545);
+emit_32(3263995904);
+emit_32(1100538131);
+emit_32(3279040545);
+emit_32(3263483911);
+emit_32(1100080271);
+emit_32(3279040545);
+emit_32(3262775296);
+emit_32(1099418881);
+emit_32(3279040545);
+emit_32(3261751309);
+emit_32(1099399430);
+emit_32(3279040545);
+emit_32(3260727296);
+emit_32(1099101215);
+emit_32(3279040545);
+emit_32(3259703309);
+emit_32(1097408394);
+emit_32(3279040545);
+emit_32(3258679296);
+emit_32(1096341468);
+emit_32(3279040545);
+emit_32(3257655309);
+emit_32(1095779641);
+emit_32(3279040545);
+emit_32(3256631296);
+emit_32(1094671296);
+emit_32(3279040545);
+emit_32(3255607309);
+emit_32(1094154977);
+emit_32(3279040545);
+emit_32(3254386688);
+emit_32(1092748732);
+emit_32(3279040545);
+emit_32(3252338714);
+emit_32(1091621345);
+emit_32(3279040545);
+emit_32(3250290688);
+emit_32(1090704869);
+emit_32(3279040545);
+emit_32(3248242714);
+emit_32(1090960134);
+emit_32(3279040545);
+emit_32(3245998080);
+emit_32(1090657442);
+emit_32(3279040545);
+emit_32(3241902132);
+emit_32(1089905497);
+emit_32(3279040545);
+emit_32(3237609472);
+emit_32(1088557112);
+emit_32(3279040545);
+emit_32(3229220864);
+emit_32(1086833925);
+emit_32(3279040545);
+emit_32(0);
+emit_32(1087077467);
+emit_32(3279040545);
+emit_32(1081737216);
+emit_32(1087170664);
+emit_32(3279040545);
+emit_32(3279552512);
+emit_32(1099250847);
+emit_32(3279296528);
+emit_32(3279296528);
+emit_32(1099782632);
+emit_32(3279296528);
+emit_32(3279040545);
+emit_32(1100353372);
+emit_32(3279296528);
+emit_32(3278784496);
+emit_32(1101212785);
+emit_32(3279296528);
+emit_32(3278528512);
+emit_32(1101165494);
+emit_32(3279296528);
+emit_32(3278272528);
+emit_32(1101113957);
+emit_32(3279296528);
+emit_32(3278016545);
+emit_32(1100762736);
+emit_32(3279296528);
+emit_32(3277760496);
+emit_32(1099820381);
+emit_32(3279296528);
+emit_32(3277504512);
+emit_32(1099259340);
+emit_32(3279296528);
+emit_32(3277248528);
+emit_32(1098864027);
+emit_32(3279296528);
+emit_32(3276992545);
+emit_32(1097692558);
+emit_32(3279296528);
+emit_32(3276736496);
+emit_32(1097396755);
+emit_32(3279296528);
+emit_32(3276480512);
+emit_32(1096710776);
+emit_32(3279296528);
+emit_32(3276224528);
+emit_32(1095208586);
+emit_32(3279296528);
+emit_32(3275968545);
+emit_32(1094436625);
+emit_32(3279296528);
+emit_32(3275712496);
+emit_32(1094237605);
+emit_32(3279296528);
+emit_32(3275456512);
+emit_32(1093631948);
+emit_32(3279296528);
+emit_32(3275200528);
+emit_32(1093328699);
+emit_32(3279296528);
+emit_32(3274944545);
+emit_32(1093335096);
+emit_32(3279296528);
+emit_32(3274688496);
+emit_32(1093281199);
+emit_32(3279296528);
+emit_32(3274432512);
+emit_32(1094777307);
+emit_32(3279296528);
+emit_32(3274176528);
+emit_32(1095041653);
+emit_32(3279296528);
+emit_32(3273920545);
+emit_32(1096648281);
+emit_32(3279296528);
+emit_32(3273664496);
+emit_32(1098228380);
+emit_32(3279296528);
+emit_32(3273408512);
+emit_32(1099209114);
+emit_32(3279296528);
+emit_32(3273152528);
+emit_32(1099931582);
+emit_32(3279296528);
+emit_32(3272896545);
+emit_32(1100442291);
+emit_32(3279296528);
+emit_32(3272640496);
+emit_32(1100819359);
+emit_32(3279296528);
+emit_32(3272384512);
+emit_32(1101023045);
+emit_32(3279296528);
+emit_32(3272128528);
+emit_32(1101474877);
+emit_32(3279296528);
+emit_32(3271872545);
+emit_32(1102424624);
+emit_32(3279296528);
+emit_32(3271616496);
+emit_32(1103221962);
+emit_32(3279296528);
+emit_32(3271163904);
+emit_32(1103274757);
+emit_32(3279296528);
+emit_32(3270651937);
+emit_32(1103895200);
+emit_32(3279296528);
+emit_32(3270139970);
+emit_32(1104182824);
+emit_32(3279296528);
+emit_32(3269627871);
+emit_32(1104099462);
+emit_32(3279296528);
+emit_32(3269115904);
+emit_32(1103825102);
+emit_32(3279296528);
+emit_32(3268603937);
+emit_32(1104155037);
+emit_32(3279296528);
+emit_32(3268091970);
+emit_32(1104133122);
+emit_32(3279296528);
+emit_32(3267579911);
+emit_32(1103855721);
+emit_32(3279296528);
+emit_32(3267067904);
+emit_32(1103437391);
+emit_32(3279296528);
+emit_32(3266555911);
+emit_32(1102382472);
+emit_32(3279296528);
+emit_32(3266043904);
+emit_32(1101496425);
+emit_32(3279296528);
+emit_32(3265531911);
+emit_32(1101309673);
+emit_32(3279296528);
+emit_32(3265019904);
+emit_32(1101136973);
+emit_32(3279296528);
+emit_32(3264507911);
+emit_32(1100555957);
+emit_32(3279296528);
+emit_32(3263995904);
+emit_32(1099877161);
+emit_32(3279296528);
+emit_32(3263483911);
+emit_32(1099240414);
+emit_32(3279296528);
+emit_32(3262775296);
+emit_32(1098818938);
+emit_32(3279296528);
+emit_32(3261751309);
+emit_32(1097030487);
+emit_32(3279296528);
+emit_32(3260727296);
+emit_32(1096386557);
+emit_32(3279296528);
+emit_32(3259703309);
+emit_32(1095308516);
+emit_32(3279296528);
+emit_32(3258679296);
+emit_32(1093918733);
+emit_32(3279296528);
+emit_32(3257655309);
+emit_32(1093062885);
+emit_32(3279296528);
+emit_32(3256631296);
+emit_32(1092790780);
+emit_32(3279296528);
+emit_32(3255607309);
+emit_32(1091773189);
+emit_32(3279296528);
+emit_32(3254386688);
+emit_32(1089177744);
+emit_32(3279296528);
+emit_32(3252338714);
+emit_32(1085799588);
+emit_32(3279296528);
+emit_32(3250290688);
+emit_32(1085098154);
+emit_32(3279296528);
+emit_32(3248242714);
+emit_32(1086394194);
+emit_32(3279296528);
+emit_32(3245998080);
+emit_32(1086183912);
+emit_32(3279296528);
+emit_32(3241902132);
+emit_32(1084926145);
+emit_32(3279296528);
+emit_32(3237609472);
+emit_32(1085235454);
+emit_32(3279296528);
+emit_32(3229220864);
+emit_32(1084071682);
+emit_32(3279296528);
+emit_32(0);
+emit_32(1084345968);
+emit_32(3279296528);
+emit_32(1081737216);
+emit_32(1086522393);
+emit_32(3279296528);
+emit_32(3279552512);
+emit_32(1099558709);
+emit_32(3279552512);
+emit_32(3279296528);
+emit_32(1099939394);
+emit_32(3279552512);
+emit_32(3279040545);
+emit_32(1100668731);
+emit_32(3279552512);
+emit_32(3278784496);
+emit_32(1100652321);
+emit_32(3279552512);
+emit_32(3278528512);
+emit_32(1101087375);
+emit_32(3279552512);
+emit_32(3278272528);
+emit_32(1100952319);
+emit_32(3279552512);
+emit_32(3278016545);
+emit_32(1100463787);
+emit_32(3279552512);
+emit_32(3277760496);
+emit_32(1099835428);
+emit_32(3279552512);
+emit_32(3277504512);
+emit_32(1098509084);
+emit_32(3279552512);
+emit_32(3277248528);
+emit_32(1097497838);
+emit_32(3279552512);
+emit_32(3276992545);
+emit_32(1095815817);
+emit_32(3279552512);
+emit_32(3276736496);
+emit_32(1096394106);
+emit_32(3279552512);
+emit_32(3276480512);
+emit_32(1095914488);
+emit_32(3279552512);
+emit_32(3276224528);
+emit_32(1094719216);
+emit_32(3279552512);
+emit_32(3275968545);
+emit_32(1093850681);
+emit_32(3279552512);
+emit_32(3275712496);
+emit_32(1093377773);
+emit_32(3279552512);
+emit_32(3275456512);
+emit_32(1092882845);
+emit_32(3279552512);
+emit_32(3275200528);
+emit_32(1092368613);
+emit_32(3279552512);
+emit_32(3274944545);
+emit_32(1091574149);
+emit_32(3279552512);
+emit_32(3274688496);
+emit_32(1092064893);
+emit_32(3279552512);
+emit_32(3274432512);
+emit_32(1093456206);
+emit_32(3279552512);
+emit_32(3274176528);
+emit_32(1095174193);
+emit_32(3279552512);
+emit_32(3273920545);
+emit_32(1096573098);
+emit_32(3279552512);
+emit_32(3273664496);
+emit_32(1096908852);
+emit_32(3279552512);
+emit_32(3273408512);
+emit_32(1098744804);
+emit_32(3279552512);
+emit_32(3273152528);
+emit_32(1099535483);
+emit_32(3279552512);
+emit_32(3272896545);
+emit_32(1099936825);
+emit_32(3279552512);
+emit_32(3272640496);
+emit_32(1100672506);
+emit_32(3279552512);
+emit_32(3272384512);
+emit_32(1101166805);
+emit_32(3279552512);
+emit_32(3272128528);
+emit_32(1102004250);
+emit_32(3279552512);
+emit_32(3271872545);
+emit_32(1102491838);
+emit_32(3279552512);
+emit_32(3271616496);
+emit_32(1103105779);
+emit_32(3279552512);
+emit_32(3271163904);
+emit_32(1103782950);
+emit_32(3279552512);
+emit_32(3270651937);
+emit_32(1104304878);
+emit_32(3279552512);
+emit_32(3270139970);
+emit_32(1104909802);
+emit_32(3279552512);
+emit_32(3269627871);
+emit_32(1104927680);
+emit_32(3279552512);
+emit_32(3269115904);
+emit_32(1104823452);
+emit_32(3279552512);
+emit_32(3268603937);
+emit_32(1104924063);
+emit_32(3279552512);
+emit_32(3268091970);
+emit_32(1105080143);
+emit_32(3279552512);
+emit_32(3267579911);
+emit_32(1104516533);
+emit_32(3279552512);
+emit_32(3267067904);
+emit_32(1103348315);
+emit_32(3279552512);
+emit_32(3266555911);
+emit_32(1102478049);
+emit_32(3279552512);
+emit_32(3266043904);
+emit_32(1101882406);
+emit_32(3279552512);
+emit_32(3265531911);
+emit_32(1100937324);
+emit_32(3279552512);
+emit_32(3265019904);
+emit_32(1100262828);
+emit_32(3279552512);
+emit_32(3264507911);
+emit_32(1099805963);
+emit_32(3279552512);
+emit_32(3263995904);
+emit_32(1098412301);
+emit_32(3279552512);
+emit_32(3263483911);
+emit_32(1097524052);
+emit_32(3279552512);
+emit_32(3262775296);
+emit_32(1096845309);
+emit_32(3279552512);
+emit_32(3261751309);
+emit_32(1094863186);
+emit_32(3279552512);
+emit_32(3260727296);
+emit_32(1092933596);
+emit_32(3279552512);
+emit_32(3259703309);
+emit_32(1092280658);
+emit_32(3279552512);
+emit_32(3258679296);
+emit_32(1090650752);
+emit_32(3279552512);
+emit_32(3257655309);
+emit_32(1090797762);
+emit_32(3279552512);
+emit_32(3256631296);
+emit_32(1090478271);
+emit_32(3279552512);
+emit_32(3255607309);
+emit_32(1089328172);
+emit_32(3279552512);
+emit_32(3254386688);
+emit_32(1087017593);
+emit_32(3279552512);
+emit_32(3252338714);
+emit_32(1083442180);
+emit_32(3279552512);
+emit_32(3250290688);
+emit_32(1081443237);
+emit_32(3279552512);
+emit_32(3248242714);
+emit_32(1082646268);
+emit_32(3279552512);
+emit_32(3245998080);
+emit_32(1081291445);
+emit_32(3279552512);
+emit_32(3241902132);
+emit_32(1081059249);
+emit_32(3279552512);
+emit_32(3237609472);
+emit_32(1081285406);
+emit_32(3279552512);
+emit_32(3229220864);
+emit_32(1081938249);
+emit_32(3279552512);
+emit_32(0);
+emit_32(1085708656);
+emit_32(3279552512);
+emit_32(1081737216);
+emit_32(1086994839);
+emit_32(3279552512);
+emit_start(LandscapeVtxCount)
+emit_32(2048);
+emit_32(1980);
+emit_32(2048);
+emit_32(2112);
+emit_32(2244);
+emit_32(2310);
+emit_32(2240);
+emit_32(2178);
+emit_start(LandscapeIdx)
+emit_32(Landscape01Idx);
+emit_32(Landscape02Idx);
+emit_32(Landscape03Idx);
+emit_32(Landscape04Idx);
+emit_32(Landscape05Idx);
+emit_32(Landscape06Idx);
+emit_32(Landscape07Idx);
+emit_32(Landscape08Idx);
+emit_start(Landscape01Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(128);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(129);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(130);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(131);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(132);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(133);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(134);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(135);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(136);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(137);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(138);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(139);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(140);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(141);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(142);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(143);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(144);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(145);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(146);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(147);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(148);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(149);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(150);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(151);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(152);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(153);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(154);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(155);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(156);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(157);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(158);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(159);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(160);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(161);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(162);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(163);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(164);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(165);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(166);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(167);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(168);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(169);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(170);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(171);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(172);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(173);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(174);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(175);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(176);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(177);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(178);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(179);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(180);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(181);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(182);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(183);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(184);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(185);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(186);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(187);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(188);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(189);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(190);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(191);
+emit_16(126);
+emit_16(191);
+emit_16(124);
+emit_16(192);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(193);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(194);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(195);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(196);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(197);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(198);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(199);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(200);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(201);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(202);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(203);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(204);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(205);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(206);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(207);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(208);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(209);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(210);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(211);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(212);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(213);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(214);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(215);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(216);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(217);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(218);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(219);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(220);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(221);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(222);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(223);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(224);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(225);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(226);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(227);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(228);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(229);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(230);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(231);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(232);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(233);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(234);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(235);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(236);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(237);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(238);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(239);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(240);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(241);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(242);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(243);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(244);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(245);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(246);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(247);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(248);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(249);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(250);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(251);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(252);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(253);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(254);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(255);
+emit_16(191);
+emit_16(255);
+emit_16(190);
+emit_16(256);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(257);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(258);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(259);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(260);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(261);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(262);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(263);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(264);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(265);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(266);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(267);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(268);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(269);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(270);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(271);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(272);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(273);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(274);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(275);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(276);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(277);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(278);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(279);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(280);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(281);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(282);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(283);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(284);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(285);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(286);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(287);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(288);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(289);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(290);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(291);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(292);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(293);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(294);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(295);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(296);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(297);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(298);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(299);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(300);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(301);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(302);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(303);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(304);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(305);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(306);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(307);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(308);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(309);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(310);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(311);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(312);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(313);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(314);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(315);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(316);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(317);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(318);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(319);
+emit_16(255);
+emit_16(319);
+emit_16(254);
+emit_16(320);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(321);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(322);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(323);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(324);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(325);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(326);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(327);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(328);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(329);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(330);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(331);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(332);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(333);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(334);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(335);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(336);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(337);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(338);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(339);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(340);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(341);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(342);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(343);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(344);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(345);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(346);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(347);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(348);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(349);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(350);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(351);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(352);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(353);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(354);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(355);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(356);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(357);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(358);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(359);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(360);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(361);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(362);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(363);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(364);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(365);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(366);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(367);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(368);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(369);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(370);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(371);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(372);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(373);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(374);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(375);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(376);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(377);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(378);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(379);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(380);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(381);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(382);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(383);
+emit_16(319);
+emit_16(383);
+emit_16(318);
+emit_16(384);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(385);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(386);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(387);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(388);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(389);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(390);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(391);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(392);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(393);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(394);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(395);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(396);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(397);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(398);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(399);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(400);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(401);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(402);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(403);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(404);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(405);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(406);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(407);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(408);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(409);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(410);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(411);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(412);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(413);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(414);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(415);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(416);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(417);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(418);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(419);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(420);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(421);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(422);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(423);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(424);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(425);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(426);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(427);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(428);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(429);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(430);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(431);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(432);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(433);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(434);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(435);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(436);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(437);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(438);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(439);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(440);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(441);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(442);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(443);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(444);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(445);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(446);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(447);
+emit_16(383);
+emit_16(447);
+emit_16(382);
+emit_16(448);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(449);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(450);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(451);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(452);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(453);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(454);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(455);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(456);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(457);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(458);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(459);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(460);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(461);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(462);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(463);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(464);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(465);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(466);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(467);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(468);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(469);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(470);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(471);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(472);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(473);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(474);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(475);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(476);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(477);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(478);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(479);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(480);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(481);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(482);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(483);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(484);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(485);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(486);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(487);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(488);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(489);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(490);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(491);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(492);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(493);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(494);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(495);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(496);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(497);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(498);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(499);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(500);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(501);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(502);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(503);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(504);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(505);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(506);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(507);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(508);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(509);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(510);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(511);
+emit_16(447);
+emit_16(511);
+emit_16(446);
+emit_16(512);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(513);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(514);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(515);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(516);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(517);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(518);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(519);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(520);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(521);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(522);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(523);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(524);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(525);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(526);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(527);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(528);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(529);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(530);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(531);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(532);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(533);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(534);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(535);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(536);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(537);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(538);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(539);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(540);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(541);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(542);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(543);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(544);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(545);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(546);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(547);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(548);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(549);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(550);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(551);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(552);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(553);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(554);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(555);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(556);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(557);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(558);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(559);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(560);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(561);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(562);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(563);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(564);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(565);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(566);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(567);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(568);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(569);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(570);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(571);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(572);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(573);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(574);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(575);
+emit_16(511);
+emit_16(575);
+emit_16(510);
+emit_16(576);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(577);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(578);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(579);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(580);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(581);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(582);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(583);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(584);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(585);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(586);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(587);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(588);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(589);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(590);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(591);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(592);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(593);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(594);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(595);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(596);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(597);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(598);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(599);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(600);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(601);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(602);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(603);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(604);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(605);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(606);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(607);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(608);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(609);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(610);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(611);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(612);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(613);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(614);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(615);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(616);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(617);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(618);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(619);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(620);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(621);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(622);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(623);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(624);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(625);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(626);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(627);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(628);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(629);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(630);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(631);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(632);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(633);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(634);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(635);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(636);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(637);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(638);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(639);
+emit_16(575);
+emit_16(639);
+emit_16(574);
+emit_16(640);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(641);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(642);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(643);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(644);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(645);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(646);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(647);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(648);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(649);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(650);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(651);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(652);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(653);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(654);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(655);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(656);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(657);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(658);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(659);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(660);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(661);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(662);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(663);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(664);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(665);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(666);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(667);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(668);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(669);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(670);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(671);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(672);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(673);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(674);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(675);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(676);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(677);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(678);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(679);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(680);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(681);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(682);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(683);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(684);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(685);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(686);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(687);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(688);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(689);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(690);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(691);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(692);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(693);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(694);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(695);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(696);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(697);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(698);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(699);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(700);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(701);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(702);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(703);
+emit_16(639);
+emit_16(703);
+emit_16(638);
+emit_16(704);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(705);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(706);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(707);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(708);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(709);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(710);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(711);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(712);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(713);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(714);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(715);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(716);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(717);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(718);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(719);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(720);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(721);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(722);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(723);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(724);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(725);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(726);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(727);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(728);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(729);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(730);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(731);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(732);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(733);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(734);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(735);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(736);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(737);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(738);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(739);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(740);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(741);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(742);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(743);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(744);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(745);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(746);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(747);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(748);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(749);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(750);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(751);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(752);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(753);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(754);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(755);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(756);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(757);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(758);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(759);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(760);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(761);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(762);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(763);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(764);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(765);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(766);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(767);
+emit_16(703);
+emit_16(767);
+emit_16(702);
+emit_16(768);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(769);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(770);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(771);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(772);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(773);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(774);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(775);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(776);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(777);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(778);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(779);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(780);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(781);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(782);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(783);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(784);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(785);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(786);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(787);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(788);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(789);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(790);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(791);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(792);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(793);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(794);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(795);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(796);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(797);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(798);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(799);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(800);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(801);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(802);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(803);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(804);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(805);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(806);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(807);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(808);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(809);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(810);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(811);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(812);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(813);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(814);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(815);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(816);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(817);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(818);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(819);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(820);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(821);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(822);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(823);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(824);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(825);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(826);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(827);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(828);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(829);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(830);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(831);
+emit_16(767);
+emit_16(831);
+emit_16(766);
+emit_16(832);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(833);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(834);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(835);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(836);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(837);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(838);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(839);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(840);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(841);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(842);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(843);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(844);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(845);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(846);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(847);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(848);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(849);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(850);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(851);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(852);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(853);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(854);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(855);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(856);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(857);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(858);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(859);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(860);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(861);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(862);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(863);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(864);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(865);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(866);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(867);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(868);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(869);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(870);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(871);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(872);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(873);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(874);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(875);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(876);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(877);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(878);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(879);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(880);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(881);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(882);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(883);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(884);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(885);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(886);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(887);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(888);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(889);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(890);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(891);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(892);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(893);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(894);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(895);
+emit_16(831);
+emit_16(895);
+emit_16(830);
+emit_16(896);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(897);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(898);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(899);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(900);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(901);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(902);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(903);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(904);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(905);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(906);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(907);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(908);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(909);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(910);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(911);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(912);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(913);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(914);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(915);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(916);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(917);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(918);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(919);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(920);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(921);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(922);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(923);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(924);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(925);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(926);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(927);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(928);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(929);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(930);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(931);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(932);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(933);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(934);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(935);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(936);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(937);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(938);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(939);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(940);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(941);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(942);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(943);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(944);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(945);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(946);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(947);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(948);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(949);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(950);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(951);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(952);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(953);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(954);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(955);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(956);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(957);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(958);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(959);
+emit_16(895);
+emit_16(959);
+emit_16(894);
+emit_16(960);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(961);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(962);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(963);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(964);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(965);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(966);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(967);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(968);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(969);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(970);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(971);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(972);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(973);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(974);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(975);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(976);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(977);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(978);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(979);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(980);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(981);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(982);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(983);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(984);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(985);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(986);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(987);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(988);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(989);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(990);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(991);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(992);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(993);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(994);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(995);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(996);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(997);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(998);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(999);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1000);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1001);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1002);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1003);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1004);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1005);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1006);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1007);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1008);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1009);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1010);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1011);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1012);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1013);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1014);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1015);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1016);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1017);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1018);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1019);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1020);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1021);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1022);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1023);
+emit_16(959);
+emit_16(1023);
+emit_16(958);
+emit_16(1024);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1025);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1026);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1027);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1028);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1029);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1030);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1031);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1032);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1033);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1034);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1035);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1036);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1037);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1038);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1039);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1040);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1041);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1042);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1043);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1044);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1045);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1046);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1047);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1048);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1049);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1050);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1051);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1052);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1053);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1054);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1055);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1056);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1057);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1058);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1059);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1060);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1061);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1062);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1063);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1064);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1065);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1066);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1067);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1068);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1069);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1070);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1071);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1072);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1073);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1074);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1075);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1076);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1077);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1078);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1079);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1080);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1081);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1082);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1083);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1084);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1085);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1086);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1087);
+emit_16(1023);
+emit_16(1087);
+emit_16(1022);
+emit_16(1088);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1089);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1090);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1091);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1092);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1093);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1094);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1095);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1096);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1097);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1098);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1099);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1100);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1101);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1102);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1103);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1104);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1105);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1106);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1107);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1108);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1109);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1110);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1111);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1112);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1113);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1114);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1115);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1116);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1117);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1118);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1119);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1120);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1121);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1122);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1123);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1124);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1125);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1126);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1127);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1128);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1129);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1130);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1131);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1132);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1133);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1134);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1135);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1136);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1137);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1138);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1139);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1140);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1141);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1142);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1143);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1144);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1145);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1146);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1147);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1148);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1149);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1150);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1151);
+emit_16(1087);
+emit_16(1151);
+emit_16(1086);
+emit_16(1152);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1153);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1154);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1155);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1156);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1157);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1158);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1159);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1160);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1161);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1162);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1163);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1164);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1165);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1166);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1167);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1168);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1169);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1170);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1171);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1172);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1173);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1174);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1175);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1176);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1177);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1178);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1179);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1180);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1181);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1182);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1183);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1184);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1185);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1186);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1187);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1188);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1189);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1190);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1191);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1192);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1193);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1194);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1195);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1196);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1197);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1198);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1199);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1200);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1201);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1202);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1203);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1204);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1205);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1206);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1207);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1208);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1209);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1210);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1211);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1212);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1213);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1214);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1215);
+emit_16(1151);
+emit_16(1215);
+emit_16(1150);
+emit_16(1216);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1217);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1218);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1219);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1220);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1221);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1222);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1223);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1224);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1225);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1226);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1227);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1228);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1229);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1230);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1231);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1232);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1233);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1234);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1235);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1236);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1237);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1238);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1239);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1240);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1241);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1242);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1243);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1244);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1245);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1246);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1247);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1248);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1249);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1250);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1251);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1252);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1253);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1254);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1255);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1256);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1257);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1258);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1259);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1260);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1261);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1262);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1263);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1264);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1265);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1266);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1267);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1268);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1269);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1270);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1271);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1272);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1273);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1274);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1275);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1276);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1277);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1278);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1279);
+emit_16(1215);
+emit_16(1279);
+emit_16(1214);
+emit_16(1280);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1281);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1282);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1283);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1284);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1285);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1286);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1287);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1288);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1289);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1290);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1291);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1292);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1293);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1294);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1295);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1296);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1297);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1298);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1299);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1300);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1301);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1302);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1303);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1304);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1305);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1306);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1307);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1308);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1309);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1310);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1311);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1312);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1313);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1314);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1315);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1316);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1317);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1318);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1319);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1320);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1321);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1322);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1323);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1324);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1325);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1326);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1327);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1328);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1329);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1330);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1331);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1332);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1333);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1334);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1335);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1336);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1337);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1338);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1339);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1340);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1341);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1342);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1343);
+emit_16(1279);
+emit_16(1343);
+emit_16(1278);
+emit_16(1344);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1345);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1346);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1347);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1348);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1349);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1350);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1351);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1352);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1353);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1354);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1355);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1356);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1357);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1358);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1359);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1360);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1361);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1362);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1363);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1364);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1365);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1366);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1367);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1368);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1369);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1370);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1371);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1372);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1373);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1374);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1375);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1376);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1377);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1378);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1379);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1380);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1381);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1382);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1383);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1384);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1385);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1386);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1387);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1388);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1389);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1390);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1391);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1392);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1393);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1394);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1395);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1396);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1397);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1398);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1399);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1400);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1401);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1402);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1403);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1404);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1405);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1406);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1407);
+emit_16(1343);
+emit_16(1407);
+emit_16(1342);
+emit_16(1408);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1409);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1410);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1411);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1412);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1413);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1414);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1415);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1416);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1417);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1418);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1419);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1420);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1421);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1422);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1423);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1424);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1425);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1426);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1427);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1428);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1429);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1430);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1431);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1432);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1433);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1434);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1435);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1436);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1437);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1438);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1439);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1440);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1441);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1442);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1443);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1444);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1445);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1446);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1447);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1448);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1449);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1450);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1451);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1452);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1453);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1454);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1455);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1456);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1457);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1458);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1459);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1460);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1461);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1462);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1463);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1464);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1465);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1466);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1467);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1468);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1469);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1470);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1471);
+emit_16(1407);
+emit_16(1471);
+emit_16(1406);
+emit_16(1472);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1473);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1474);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1475);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1476);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1477);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1478);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1479);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1480);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1481);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1482);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1483);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1484);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1485);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1486);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1487);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1488);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1489);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1490);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1491);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1492);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1493);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1494);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1495);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1496);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1497);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1498);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1499);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1500);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1501);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1502);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1503);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1504);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1505);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1506);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1507);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1508);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1509);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1510);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1511);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1512);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1513);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1514);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1515);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1516);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1517);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1518);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1519);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1520);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1521);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1522);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1523);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1524);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1525);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1526);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1527);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1528);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1529);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1530);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1531);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1532);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1533);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1534);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1535);
+emit_16(1471);
+emit_16(1535);
+emit_16(1470);
+emit_16(1536);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1537);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1538);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1539);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1540);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1541);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1542);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1543);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1544);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1545);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1546);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1547);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1548);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1549);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1550);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1551);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1552);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1553);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1554);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1555);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1556);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1557);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1558);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1559);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1560);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1561);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1562);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1563);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1564);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1565);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1566);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1567);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1568);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1569);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1570);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1571);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1572);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1573);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1574);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1575);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1576);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1577);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1578);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1579);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1580);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1581);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1582);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1583);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1584);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1585);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1586);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1587);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1588);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1589);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1590);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1591);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1592);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1593);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1594);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1595);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1596);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1597);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1598);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1599);
+emit_16(1535);
+emit_16(1599);
+emit_16(1534);
+emit_16(1600);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1601);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1602);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1603);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1604);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1605);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1606);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1607);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1608);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1609);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1610);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1611);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1612);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1613);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1614);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1615);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1616);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1617);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1618);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1619);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1620);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1621);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1622);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1623);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1624);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1625);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1626);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1627);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1628);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1629);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1630);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1631);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1632);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1633);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1634);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1635);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1636);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1637);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1638);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1639);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1640);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1641);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1642);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1643);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1644);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1645);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1646);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1647);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1648);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1649);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1650);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1651);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1652);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1653);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1654);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1655);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1656);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1657);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1658);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1659);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1660);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1661);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1662);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1663);
+emit_16(1599);
+emit_16(1663);
+emit_16(1598);
+emit_16(1664);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1665);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1666);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1667);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1668);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1669);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1670);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1671);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1672);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1673);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1674);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1675);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1676);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1677);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1678);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1679);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1680);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1681);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1682);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1683);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1684);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1685);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1686);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1687);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1688);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1689);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1690);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1691);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1692);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1693);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1694);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1695);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1696);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1697);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1698);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1699);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1700);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1701);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1702);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1703);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1704);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1705);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1706);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1707);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1708);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1709);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1710);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1711);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1712);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1713);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1714);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1715);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1716);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1717);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1718);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1719);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1720);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1721);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1722);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1723);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1724);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1725);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1726);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1727);
+emit_16(1663);
+emit_16(1727);
+emit_16(1662);
+emit_16(1728);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1729);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1730);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1731);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1732);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1733);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1734);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1735);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1736);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1737);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1738);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1739);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1740);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1741);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1742);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1743);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1744);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1745);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1746);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1747);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1748);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1749);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1750);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1751);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1752);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1753);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1754);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1755);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1756);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1757);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1758);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1759);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1760);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1761);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1762);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1763);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1764);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1765);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1766);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1767);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1768);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1769);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1770);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1771);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1772);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1773);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1774);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1775);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1776);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1777);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1778);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1779);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1780);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1781);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1782);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1783);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1784);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1785);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1786);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1787);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1788);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1789);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1790);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1791);
+emit_16(1727);
+emit_16(1791);
+emit_16(1726);
+emit_16(1792);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1793);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1794);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1795);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1796);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1797);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1798);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1799);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1800);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1801);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1802);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1803);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1804);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1805);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1806);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1807);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1808);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1809);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1810);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1811);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1812);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1813);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1814);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1815);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1816);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1817);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1818);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1819);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1820);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1821);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1822);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1823);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1824);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1825);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1826);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1827);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1828);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1829);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1830);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1831);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1832);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1833);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1834);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1835);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1836);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1837);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1838);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1839);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1840);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1841);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1842);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1843);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1844);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1845);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1846);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1847);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1848);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1849);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1850);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1851);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1852);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1853);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1854);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1855);
+emit_16(1791);
+emit_16(1855);
+emit_16(1790);
+emit_16(1856);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1857);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1858);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1859);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1860);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1861);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1862);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1863);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1864);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1865);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1866);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1867);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1868);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1869);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1870);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1871);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1872);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1873);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1874);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1875);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1876);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1877);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1878);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1879);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1880);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1881);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1882);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1883);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1884);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1885);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1886);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1887);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1888);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1889);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1890);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1891);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1892);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1893);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1894);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1895);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1896);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1897);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1898);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1899);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1900);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1901);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1902);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1903);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1904);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1905);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1906);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1907);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1908);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1909);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1910);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1911);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1912);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1913);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1914);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1915);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1916);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1917);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1918);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1919);
+emit_16(1855);
+emit_16(1919);
+emit_16(1854);
+emit_16(1920);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1921);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1922);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1923);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1924);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1925);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1926);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1927);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1928);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1929);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1930);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1931);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1932);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1933);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1934);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1935);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1936);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1937);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1938);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1939);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1940);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1941);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1942);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1943);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1944);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1945);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1946);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1947);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1948);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1949);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1950);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1951);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1952);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1953);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1954);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1955);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1956);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1957);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1958);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1959);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1960);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1961);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1962);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1963);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1964);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1965);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1966);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1967);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1968);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1969);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1970);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1971);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1972);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1973);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1974);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1975);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1976);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1977);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1978);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1979);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1980);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1981);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1982);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1983);
+emit_16(1919);
+emit_16(1983);
+emit_16(1918);
+emit_16(1984);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1985);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1986);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1987);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1988);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1989);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1990);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1991);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1992);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1993);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1994);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1995);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1996);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1997);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1998);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(1999);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2000);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2001);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2002);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2003);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2004);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2005);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2006);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2007);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2008);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2009);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2010);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2011);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2012);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2013);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2014);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2015);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2016);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2017);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2018);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2019);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2020);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2021);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2022);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2023);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2024);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2025);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2026);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2027);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2028);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2029);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2030);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2031);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2032);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2033);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2034);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2035);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2036);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2037);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2038);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2039);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2040);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2041);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2042);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2043);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2044);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2045);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2046);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2047);
+emit_16(1983);
+emit_16(2047);
+emit_16(1982);
+emit_start(Landscape02Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(128);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(130);
+emit_16(131);
+emit_16(130);
+emit_16(129);
+emit_16(132);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(133);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(134);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(135);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(136);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(137);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(138);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(139);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(140);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(141);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(142);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(143);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(144);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(145);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(146);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(147);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(148);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(149);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(150);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(151);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(152);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(153);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(154);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(155);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(156);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(157);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(158);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(159);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(160);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(161);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(162);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(163);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(164);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(165);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(166);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(167);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(168);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(169);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(170);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(171);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(172);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(173);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(174);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(175);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(176);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(177);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(178);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(179);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(180);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(181);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(182);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(183);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(184);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(185);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(186);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(187);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(188);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(189);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(190);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(191);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(192);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(193);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(194);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(195);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(196);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(197);
+emit_16(130);
+emit_16(197);
+emit_16(128);
+emit_16(198);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(199);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(200);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(201);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(202);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(203);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(204);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(205);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(206);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(207);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(208);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(209);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(210);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(211);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(212);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(213);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(214);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(215);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(216);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(217);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(218);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(219);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(220);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(221);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(222);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(223);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(224);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(225);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(226);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(227);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(228);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(229);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(230);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(231);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(232);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(233);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(234);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(235);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(236);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(237);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(238);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(239);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(240);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(241);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(242);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(243);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(244);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(245);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(246);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(247);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(248);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(249);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(250);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(251);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(252);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(253);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(254);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(255);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(256);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(257);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(258);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(259);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(260);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(261);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(262);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(263);
+emit_16(197);
+emit_16(263);
+emit_16(196);
+emit_16(264);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(265);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(266);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(267);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(268);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(269);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(270);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(271);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(272);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(273);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(274);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(275);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(276);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(277);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(278);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(279);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(280);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(281);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(282);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(283);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(284);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(285);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(286);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(287);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(288);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(289);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(290);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(291);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(292);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(293);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(294);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(295);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(296);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(297);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(298);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(299);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(300);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(301);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(302);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(303);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(304);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(305);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(306);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(307);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(308);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(309);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(310);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(311);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(312);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(313);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(314);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(315);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(316);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(317);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(318);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(319);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(320);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(321);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(322);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(323);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(324);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(325);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(326);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(327);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(328);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(329);
+emit_16(263);
+emit_16(329);
+emit_16(262);
+emit_16(330);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(331);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(332);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(333);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(334);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(335);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(336);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(337);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(338);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(339);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(340);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(341);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(342);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(343);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(344);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(345);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(346);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(347);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(348);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(349);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(350);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(351);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(352);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(353);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(354);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(355);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(356);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(357);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(358);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(359);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(360);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(361);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(362);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(363);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(364);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(365);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(366);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(367);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(368);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(369);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(370);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(371);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(372);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(373);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(374);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(375);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(376);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(377);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(378);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(379);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(380);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(381);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(382);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(383);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(384);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(385);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(386);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(387);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(388);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(389);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(390);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(391);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(392);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(393);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(394);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(395);
+emit_16(329);
+emit_16(395);
+emit_16(328);
+emit_16(396);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(397);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(398);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(399);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(400);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(401);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(402);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(403);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(404);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(405);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(406);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(407);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(408);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(409);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(410);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(411);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(412);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(413);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(414);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(415);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(416);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(417);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(418);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(419);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(420);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(421);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(422);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(423);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(424);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(425);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(426);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(427);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(428);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(429);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(430);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(431);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(432);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(433);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(434);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(435);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(436);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(437);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(438);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(439);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(440);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(441);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(442);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(443);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(444);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(445);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(446);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(447);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(448);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(449);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(450);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(451);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(452);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(453);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(454);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(455);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(456);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(457);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(458);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(459);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(460);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(461);
+emit_16(395);
+emit_16(461);
+emit_16(394);
+emit_16(462);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(463);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(464);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(465);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(466);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(467);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(468);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(469);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(470);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(471);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(472);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(473);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(474);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(475);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(476);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(477);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(478);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(479);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(480);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(481);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(482);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(483);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(484);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(485);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(486);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(487);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(488);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(489);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(490);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(491);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(492);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(493);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(494);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(495);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(496);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(497);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(498);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(499);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(500);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(501);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(502);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(503);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(504);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(505);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(506);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(507);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(508);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(509);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(510);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(511);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(512);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(513);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(514);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(515);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(516);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(517);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(518);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(519);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(520);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(521);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(522);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(523);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(524);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(525);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(526);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(527);
+emit_16(461);
+emit_16(527);
+emit_16(460);
+emit_16(528);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(529);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(530);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(531);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(532);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(533);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(534);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(535);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(536);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(537);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(538);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(539);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(540);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(541);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(542);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(543);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(544);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(545);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(546);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(547);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(548);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(549);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(550);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(551);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(552);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(553);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(554);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(555);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(556);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(557);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(558);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(559);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(560);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(561);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(562);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(563);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(564);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(565);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(566);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(567);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(568);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(569);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(570);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(571);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(572);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(573);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(574);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(575);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(576);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(577);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(578);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(579);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(580);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(581);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(582);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(583);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(584);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(585);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(586);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(587);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(588);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(589);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(590);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(591);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(592);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(593);
+emit_16(527);
+emit_16(593);
+emit_16(526);
+emit_16(594);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(595);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(596);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(597);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(598);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(599);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(600);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(601);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(602);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(603);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(604);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(605);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(606);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(607);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(608);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(609);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(610);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(611);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(612);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(613);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(614);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(615);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(616);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(617);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(618);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(619);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(620);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(621);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(622);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(623);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(624);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(625);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(626);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(627);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(628);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(629);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(630);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(631);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(632);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(633);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(634);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(635);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(636);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(637);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(638);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(639);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(640);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(641);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(642);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(643);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(644);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(645);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(646);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(647);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(648);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(649);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(650);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(651);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(652);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(653);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(654);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(655);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(656);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(657);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(658);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(659);
+emit_16(593);
+emit_16(659);
+emit_16(592);
+emit_16(660);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(661);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(662);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(663);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(664);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(665);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(666);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(667);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(668);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(669);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(670);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(671);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(672);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(673);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(674);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(675);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(676);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(677);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(678);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(679);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(680);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(681);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(682);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(683);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(684);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(685);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(686);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(687);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(688);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(689);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(690);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(691);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(692);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(693);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(694);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(695);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(696);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(697);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(698);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(699);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(700);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(701);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(702);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(703);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(704);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(705);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(706);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(707);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(708);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(709);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(710);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(711);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(712);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(713);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(714);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(715);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(716);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(717);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(718);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(719);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(720);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(721);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(722);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(723);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(724);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(725);
+emit_16(659);
+emit_16(725);
+emit_16(658);
+emit_16(726);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(727);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(728);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(729);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(730);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(731);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(732);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(733);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(734);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(735);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(736);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(737);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(738);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(739);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(740);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(741);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(742);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(743);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(744);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(745);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(746);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(747);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(748);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(749);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(750);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(751);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(752);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(753);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(754);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(755);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(756);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(757);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(758);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(759);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(760);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(761);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(762);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(763);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(764);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(765);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(766);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(767);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(768);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(769);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(770);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(771);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(772);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(773);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(774);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(775);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(776);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(777);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(778);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(779);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(780);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(781);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(782);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(783);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(784);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(785);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(786);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(787);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(788);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(789);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(790);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(791);
+emit_16(725);
+emit_16(791);
+emit_16(724);
+emit_16(792);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(793);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(794);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(795);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(796);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(797);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(798);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(799);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(800);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(801);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(802);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(803);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(804);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(805);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(806);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(807);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(808);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(809);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(810);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(811);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(812);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(813);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(814);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(815);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(816);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(817);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(818);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(819);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(820);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(821);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(822);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(823);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(824);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(825);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(826);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(827);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(828);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(829);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(830);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(831);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(832);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(833);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(834);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(835);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(836);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(837);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(838);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(839);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(840);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(841);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(842);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(843);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(844);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(845);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(846);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(847);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(848);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(849);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(850);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(851);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(852);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(853);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(854);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(855);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(856);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(857);
+emit_16(791);
+emit_16(857);
+emit_16(790);
+emit_16(858);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(859);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(860);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(861);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(862);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(863);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(864);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(865);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(866);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(867);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(868);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(869);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(870);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(871);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(872);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(873);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(874);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(875);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(876);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(877);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(878);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(879);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(880);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(881);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(882);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(883);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(884);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(885);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(886);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(887);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(888);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(889);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(890);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(891);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(892);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(893);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(894);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(895);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(896);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(897);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(898);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(899);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(900);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(901);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(902);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(903);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(904);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(905);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(906);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(907);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(908);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(909);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(910);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(911);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(912);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(913);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(914);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(915);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(916);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(917);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(918);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(919);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(920);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(921);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(922);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(923);
+emit_16(857);
+emit_16(923);
+emit_16(856);
+emit_16(924);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(925);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(926);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(927);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(928);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(929);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(930);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(931);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(932);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(933);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(934);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(935);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(936);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(937);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(938);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(939);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(940);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(941);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(942);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(943);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(944);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(945);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(946);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(947);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(948);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(949);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(950);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(951);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(952);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(953);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(954);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(955);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(956);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(957);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(958);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(959);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(960);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(961);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(962);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(963);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(964);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(965);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(966);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(967);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(968);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(969);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(970);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(971);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(972);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(973);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(974);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(975);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(976);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(977);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(978);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(979);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(980);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(981);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(982);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(983);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(984);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(985);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(986);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(987);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(988);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(989);
+emit_16(923);
+emit_16(989);
+emit_16(922);
+emit_16(990);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(991);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(992);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(993);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(994);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(995);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(996);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(997);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(998);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(999);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1000);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1001);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1002);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1003);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1004);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1005);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1006);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1007);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1008);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1009);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1010);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1011);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1012);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1013);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1014);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1015);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1016);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1017);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1018);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1019);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1020);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1021);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1022);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1023);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1024);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1025);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1026);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1027);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1028);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1029);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1030);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1031);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1032);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1033);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1034);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1035);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1036);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1037);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1038);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1039);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1040);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1041);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1042);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1043);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1044);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1045);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1046);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1047);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1048);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1049);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1050);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1051);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1052);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1053);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1054);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1055);
+emit_16(989);
+emit_16(1055);
+emit_16(988);
+emit_16(1056);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1057);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1058);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1059);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1060);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1061);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1062);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1063);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1064);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1065);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1066);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1067);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1068);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1069);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1070);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1071);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1072);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1073);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1074);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1075);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1076);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1077);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1078);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1079);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1080);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1081);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1082);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1083);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1084);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1085);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1086);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1087);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1088);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1089);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1090);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1091);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1092);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1093);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1094);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1095);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1096);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1097);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1098);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1099);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1100);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1101);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1102);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1103);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1104);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1105);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1106);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1107);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1108);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1109);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1110);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1111);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1112);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1113);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1114);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1115);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1116);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1117);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1118);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1119);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1120);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1121);
+emit_16(1055);
+emit_16(1121);
+emit_16(1054);
+emit_16(1122);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1123);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1124);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1125);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1126);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1127);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1128);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1129);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1130);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1131);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1132);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1133);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1134);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1135);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1136);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1137);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1138);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1139);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1140);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1141);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1142);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1143);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1144);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1145);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1146);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1147);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1148);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1149);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1150);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1151);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1152);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1153);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1154);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1155);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1156);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1157);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1158);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1159);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1160);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1161);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1162);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1163);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1164);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1165);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1166);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1167);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1168);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1169);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1170);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1171);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1172);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1173);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1174);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1175);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1176);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1177);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1178);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1179);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1180);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1181);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1182);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1183);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1184);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1185);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1186);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1187);
+emit_16(1121);
+emit_16(1187);
+emit_16(1120);
+emit_16(1188);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1189);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1190);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1191);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1192);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1193);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1194);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1195);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1196);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1197);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1198);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1199);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1200);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1201);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1202);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1203);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1204);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1205);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1206);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1207);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1208);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1209);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1210);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1211);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1212);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1213);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1214);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1215);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1216);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1217);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1218);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1219);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1220);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1221);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1222);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1223);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1224);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1225);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1226);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1227);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1228);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1229);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1230);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1231);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1232);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1233);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1234);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1235);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1236);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1237);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1238);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1239);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1240);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1241);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1242);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1243);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1244);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1245);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1246);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1247);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1248);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1249);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1250);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1251);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1252);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1253);
+emit_16(1187);
+emit_16(1253);
+emit_16(1186);
+emit_16(1254);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1255);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1256);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1257);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1258);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1259);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1260);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1261);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1262);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1263);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1264);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1265);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1266);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1267);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1268);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1269);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1270);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1271);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1272);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1273);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1274);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1275);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1276);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1277);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1278);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1279);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1280);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1281);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1282);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1283);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1284);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1285);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1286);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1287);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1288);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1289);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1290);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1291);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1292);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1293);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1294);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1295);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1296);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1297);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1298);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1299);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1300);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1301);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1302);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1303);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1304);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1305);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1306);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1307);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1308);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1309);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1310);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1311);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1312);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1313);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1314);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1315);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1316);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1317);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1318);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1319);
+emit_16(1253);
+emit_16(1319);
+emit_16(1252);
+emit_16(1320);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1321);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1322);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1323);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1324);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1325);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1326);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1327);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1328);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1329);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1330);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1331);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1332);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1333);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1334);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1335);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1336);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1337);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1338);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1339);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1340);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1341);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1342);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1343);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1344);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1345);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1346);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1347);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1348);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1349);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1350);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1351);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1352);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1353);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1354);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1355);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1356);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1357);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1358);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1359);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1360);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1361);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1362);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1363);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1364);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1365);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1366);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1367);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1368);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1369);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1370);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1371);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1372);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1373);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1374);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1375);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1376);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1377);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1378);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1379);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1380);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1381);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1382);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1383);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1384);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1385);
+emit_16(1319);
+emit_16(1385);
+emit_16(1318);
+emit_16(1386);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1387);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1388);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1389);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1390);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1391);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1392);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1393);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1394);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1395);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1396);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1397);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1398);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1399);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1400);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1401);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1402);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1403);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1404);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1405);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1406);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1407);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1408);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1409);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1410);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1411);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1412);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1413);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1414);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1415);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1416);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1417);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1418);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1419);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1420);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1421);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1422);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1423);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1424);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1425);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1426);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1427);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1428);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1429);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1430);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1431);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1432);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1433);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1434);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1435);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1436);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1437);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1438);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1439);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1440);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1441);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1442);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1443);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1444);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1445);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1446);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1447);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1448);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1449);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1450);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1451);
+emit_16(1385);
+emit_16(1451);
+emit_16(1384);
+emit_16(1452);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1453);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1454);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1455);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1456);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1457);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1458);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1459);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1460);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1461);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1462);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1463);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1464);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1465);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1466);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1467);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1468);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1469);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1470);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1471);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1472);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1473);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1474);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1475);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1476);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1477);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1478);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1479);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1480);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1481);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1482);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1483);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1484);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1485);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1486);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1487);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1488);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1489);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1490);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1491);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1492);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1493);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1494);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1495);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1496);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1497);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1498);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1499);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1500);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1501);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1502);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1503);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1504);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1505);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1506);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1507);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1508);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1509);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1510);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1511);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1512);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1513);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1514);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1515);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1516);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1517);
+emit_16(1451);
+emit_16(1517);
+emit_16(1450);
+emit_16(1518);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1519);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1520);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1521);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1522);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1523);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1524);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1525);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1526);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1527);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1528);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1529);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1530);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1531);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1532);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1533);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1534);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1535);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1536);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1537);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1538);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1539);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1540);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1541);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1542);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1543);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1544);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1545);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1546);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1547);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1548);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1549);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1550);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1551);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1552);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1553);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1554);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1555);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1556);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1557);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1558);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1559);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1560);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1561);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1562);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1563);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1564);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1565);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1566);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1567);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1568);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1569);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1570);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1571);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1572);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1573);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1574);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1575);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1576);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1577);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1578);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1579);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1580);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1581);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1582);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1583);
+emit_16(1517);
+emit_16(1583);
+emit_16(1516);
+emit_16(1584);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1585);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1586);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1587);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1588);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1589);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1590);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1591);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1592);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1593);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1594);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1595);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1596);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1597);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1598);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1599);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1600);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1601);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1602);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1603);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1604);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1605);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1606);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1607);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1608);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1609);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1610);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1611);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1612);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1613);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1614);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1615);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1616);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1617);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1618);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1619);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1620);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1621);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1622);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1623);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1624);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1625);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1626);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1627);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1628);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1629);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1630);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1631);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1632);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1633);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1634);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1635);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1636);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1637);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1638);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1639);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1640);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1641);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1642);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1643);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1644);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1645);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1646);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1647);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1648);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1649);
+emit_16(1583);
+emit_16(1649);
+emit_16(1582);
+emit_16(1650);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1651);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1652);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1653);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1654);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1655);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1656);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1657);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1658);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1659);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1660);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1661);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1662);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1663);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1664);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1665);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1666);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1667);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1668);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1669);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1670);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1671);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1672);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1673);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1674);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1675);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1676);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1677);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1678);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1679);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1680);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1681);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1682);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1683);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1684);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1685);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1686);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1687);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1688);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1689);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1690);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1691);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1692);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1693);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1694);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1695);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1696);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1697);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1698);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1699);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1700);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1701);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1702);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1703);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1704);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1705);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1706);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1707);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1708);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1709);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1710);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1711);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1712);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1713);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1714);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1715);
+emit_16(1649);
+emit_16(1715);
+emit_16(1648);
+emit_16(1716);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1717);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1718);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1719);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1720);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1721);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1722);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1723);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1724);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1725);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1726);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1727);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1728);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1729);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1730);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1731);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1732);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1733);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1734);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1735);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1736);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1737);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1738);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1739);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1740);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1741);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1742);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1743);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1744);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1745);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1746);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1747);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1748);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1749);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1750);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1751);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1752);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1753);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1754);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1755);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1756);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1757);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1758);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1759);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1760);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1761);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1762);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1763);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1764);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1765);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1766);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1767);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1768);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1769);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1770);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1771);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1772);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1773);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1774);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1775);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1776);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1777);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1778);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1779);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1780);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1781);
+emit_16(1715);
+emit_16(1781);
+emit_16(1714);
+emit_16(1782);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1783);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1784);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1785);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1786);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1787);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1788);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1789);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1790);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1791);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1792);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1793);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1794);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1795);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1796);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1797);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1798);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1799);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1800);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1801);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1802);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1803);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1804);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1805);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1806);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1807);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1808);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1809);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1810);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1811);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1812);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1813);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1814);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1815);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1816);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1817);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1818);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1819);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1820);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1821);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1822);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1823);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1824);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1825);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1826);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1827);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1828);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1829);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1830);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1831);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1832);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1833);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1834);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1835);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1836);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1837);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1838);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1839);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1840);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1841);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1842);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1843);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1844);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1845);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1846);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1847);
+emit_16(1781);
+emit_16(1847);
+emit_16(1780);
+emit_16(1848);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1849);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1850);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1851);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1852);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1853);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1854);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1855);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1856);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1857);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1858);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1859);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1860);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1861);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1862);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1863);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1864);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1865);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1866);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1867);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1868);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1869);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1870);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1871);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1872);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1873);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1874);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1875);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1876);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1877);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1878);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1879);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1880);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1881);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1882);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1883);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1884);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1885);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1886);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1887);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1888);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1889);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1890);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1891);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1892);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1893);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1894);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1895);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1896);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1897);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1898);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1899);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1900);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1901);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1902);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1903);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1904);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1905);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1906);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1907);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1908);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1909);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1910);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1911);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1912);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1913);
+emit_16(1847);
+emit_16(1913);
+emit_16(1846);
+emit_16(1914);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1915);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1916);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1917);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1918);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1919);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1920);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1921);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1922);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1923);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1924);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1925);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1926);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1927);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1928);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1929);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1930);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1931);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1932);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1933);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1934);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1935);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1936);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1937);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1938);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1939);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1940);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1941);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1942);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1943);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1944);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1945);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1946);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1947);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1948);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1949);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1950);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1951);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1952);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1953);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1954);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1955);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1956);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1957);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1958);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1959);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1960);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1961);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1962);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1963);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1964);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1965);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1966);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1967);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1968);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1969);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1970);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1971);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1972);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1973);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1974);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1975);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1976);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1977);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1978);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1979);
+emit_16(1913);
+emit_16(1979);
+emit_16(1912);
+emit_start(Landscape03Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(128);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(129);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(130);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(131);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(132);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(133);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(134);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(135);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(136);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(137);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(138);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(139);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(140);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(141);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(142);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(143);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(144);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(145);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(146);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(147);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(148);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(149);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(150);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(151);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(152);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(153);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(154);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(155);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(156);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(157);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(158);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(159);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(160);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(161);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(162);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(163);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(164);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(165);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(166);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(167);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(168);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(169);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(170);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(171);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(172);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(173);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(174);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(175);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(176);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(177);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(178);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(179);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(180);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(181);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(182);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(183);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(184);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(185);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(186);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(187);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(188);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(189);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(190);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(191);
+emit_16(126);
+emit_16(191);
+emit_16(124);
+emit_16(192);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(193);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(194);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(195);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(196);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(197);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(198);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(199);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(200);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(201);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(202);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(203);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(204);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(205);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(206);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(207);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(208);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(209);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(210);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(211);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(212);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(213);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(214);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(215);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(216);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(217);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(218);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(219);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(220);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(221);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(222);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(223);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(224);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(225);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(226);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(227);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(228);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(229);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(230);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(231);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(232);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(233);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(234);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(235);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(236);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(237);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(238);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(239);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(240);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(241);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(242);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(243);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(244);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(245);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(246);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(247);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(248);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(249);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(250);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(251);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(252);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(253);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(254);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(255);
+emit_16(191);
+emit_16(255);
+emit_16(190);
+emit_16(256);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(257);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(258);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(259);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(260);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(261);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(262);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(263);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(264);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(265);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(266);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(267);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(268);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(269);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(270);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(271);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(272);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(273);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(274);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(275);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(276);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(277);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(278);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(279);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(280);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(281);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(282);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(283);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(284);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(285);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(286);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(287);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(288);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(289);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(290);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(291);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(292);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(293);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(294);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(295);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(296);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(297);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(298);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(299);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(300);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(301);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(302);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(303);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(304);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(305);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(306);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(307);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(308);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(309);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(310);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(311);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(312);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(313);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(314);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(315);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(316);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(317);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(318);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(319);
+emit_16(255);
+emit_16(319);
+emit_16(254);
+emit_16(320);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(321);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(322);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(323);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(324);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(325);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(326);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(327);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(328);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(329);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(330);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(331);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(332);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(333);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(334);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(335);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(336);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(337);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(338);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(339);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(340);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(341);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(342);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(343);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(344);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(345);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(346);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(347);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(348);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(349);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(350);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(351);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(352);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(353);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(354);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(355);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(356);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(357);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(358);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(359);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(360);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(361);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(362);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(363);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(364);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(365);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(366);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(367);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(368);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(369);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(370);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(371);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(372);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(373);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(374);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(375);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(376);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(377);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(378);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(379);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(380);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(381);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(382);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(383);
+emit_16(319);
+emit_16(383);
+emit_16(318);
+emit_16(384);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(385);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(386);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(387);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(388);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(389);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(390);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(391);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(392);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(393);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(394);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(395);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(396);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(397);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(398);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(399);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(400);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(401);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(402);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(403);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(404);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(405);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(406);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(407);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(408);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(409);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(410);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(411);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(412);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(413);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(414);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(415);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(416);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(417);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(418);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(419);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(420);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(421);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(422);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(423);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(424);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(425);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(426);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(427);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(428);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(429);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(430);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(431);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(432);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(433);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(434);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(435);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(436);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(437);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(438);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(439);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(440);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(441);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(442);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(443);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(444);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(445);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(446);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(447);
+emit_16(383);
+emit_16(447);
+emit_16(382);
+emit_16(448);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(449);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(450);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(451);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(452);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(453);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(454);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(455);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(456);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(457);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(458);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(459);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(460);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(461);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(462);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(463);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(464);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(465);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(466);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(467);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(468);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(469);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(470);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(471);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(472);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(473);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(474);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(475);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(476);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(477);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(478);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(479);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(480);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(481);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(482);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(483);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(484);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(485);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(486);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(487);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(488);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(489);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(490);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(491);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(492);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(493);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(494);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(495);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(496);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(497);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(498);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(499);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(500);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(501);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(502);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(503);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(504);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(505);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(506);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(507);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(508);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(509);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(510);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(511);
+emit_16(447);
+emit_16(511);
+emit_16(446);
+emit_16(512);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(513);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(514);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(515);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(516);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(517);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(518);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(519);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(520);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(521);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(522);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(523);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(524);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(525);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(526);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(527);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(528);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(529);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(530);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(531);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(532);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(533);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(534);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(535);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(536);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(537);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(538);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(539);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(540);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(541);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(542);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(543);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(544);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(545);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(546);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(547);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(548);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(549);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(550);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(551);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(552);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(553);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(554);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(555);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(556);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(557);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(558);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(559);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(560);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(561);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(562);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(563);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(564);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(565);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(566);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(567);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(568);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(569);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(570);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(571);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(572);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(573);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(574);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(575);
+emit_16(511);
+emit_16(575);
+emit_16(510);
+emit_16(576);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(577);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(578);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(579);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(580);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(581);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(582);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(583);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(584);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(585);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(586);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(587);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(588);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(589);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(590);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(591);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(592);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(593);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(594);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(595);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(596);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(597);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(598);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(599);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(600);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(601);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(602);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(603);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(604);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(605);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(606);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(607);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(608);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(609);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(610);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(611);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(612);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(613);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(614);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(615);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(616);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(617);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(618);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(619);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(620);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(621);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(622);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(623);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(624);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(625);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(626);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(627);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(628);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(629);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(630);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(631);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(632);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(633);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(634);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(635);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(636);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(637);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(638);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(639);
+emit_16(575);
+emit_16(639);
+emit_16(574);
+emit_16(640);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(641);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(642);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(643);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(644);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(645);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(646);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(647);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(648);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(649);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(650);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(651);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(652);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(653);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(654);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(655);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(656);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(657);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(658);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(659);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(660);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(661);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(662);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(663);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(664);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(665);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(666);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(667);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(668);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(669);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(670);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(671);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(672);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(673);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(674);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(675);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(676);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(677);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(678);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(679);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(680);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(681);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(682);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(683);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(684);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(685);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(686);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(687);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(688);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(689);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(690);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(691);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(692);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(693);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(694);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(695);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(696);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(697);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(698);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(699);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(700);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(701);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(702);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(703);
+emit_16(639);
+emit_16(703);
+emit_16(638);
+emit_16(704);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(705);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(706);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(707);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(708);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(709);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(710);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(711);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(712);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(713);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(714);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(715);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(716);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(717);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(718);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(719);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(720);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(721);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(722);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(723);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(724);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(725);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(726);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(727);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(728);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(729);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(730);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(731);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(732);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(733);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(734);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(735);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(736);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(737);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(738);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(739);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(740);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(741);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(742);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(743);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(744);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(745);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(746);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(747);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(748);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(749);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(750);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(751);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(752);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(753);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(754);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(755);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(756);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(757);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(758);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(759);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(760);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(761);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(762);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(763);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(764);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(765);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(766);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(767);
+emit_16(703);
+emit_16(767);
+emit_16(702);
+emit_16(768);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(769);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(770);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(771);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(772);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(773);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(774);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(775);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(776);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(777);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(778);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(779);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(780);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(781);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(782);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(783);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(784);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(785);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(786);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(787);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(788);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(789);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(790);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(791);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(792);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(793);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(794);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(795);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(796);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(797);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(798);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(799);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(800);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(801);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(802);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(803);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(804);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(805);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(806);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(807);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(808);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(809);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(810);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(811);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(812);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(813);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(814);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(815);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(816);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(817);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(818);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(819);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(820);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(821);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(822);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(823);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(824);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(825);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(826);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(827);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(828);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(829);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(830);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(831);
+emit_16(767);
+emit_16(831);
+emit_16(766);
+emit_16(832);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(833);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(834);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(835);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(836);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(837);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(838);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(839);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(840);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(841);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(842);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(843);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(844);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(845);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(846);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(847);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(848);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(849);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(850);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(851);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(852);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(853);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(854);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(855);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(856);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(857);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(858);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(859);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(860);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(861);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(862);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(863);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(864);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(865);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(866);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(867);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(868);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(869);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(870);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(871);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(872);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(873);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(874);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(875);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(876);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(877);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(878);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(879);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(880);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(881);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(882);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(883);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(884);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(885);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(886);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(887);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(888);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(889);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(890);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(891);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(892);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(893);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(894);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(895);
+emit_16(831);
+emit_16(895);
+emit_16(830);
+emit_16(896);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(897);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(898);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(899);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(900);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(901);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(902);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(903);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(904);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(905);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(906);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(907);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(908);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(909);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(910);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(911);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(912);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(913);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(914);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(915);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(916);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(917);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(918);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(919);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(920);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(921);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(922);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(923);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(924);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(925);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(926);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(927);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(928);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(929);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(930);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(931);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(932);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(933);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(934);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(935);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(936);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(937);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(938);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(939);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(940);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(941);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(942);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(943);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(944);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(945);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(946);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(947);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(948);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(949);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(950);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(951);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(952);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(953);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(954);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(955);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(956);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(957);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(958);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(959);
+emit_16(895);
+emit_16(959);
+emit_16(894);
+emit_16(960);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(961);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(962);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(963);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(964);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(965);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(966);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(967);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(968);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(969);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(970);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(971);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(972);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(973);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(974);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(975);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(976);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(977);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(978);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(979);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(980);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(981);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(982);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(983);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(984);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(985);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(986);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(987);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(988);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(989);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(990);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(991);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(992);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(993);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(994);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(995);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(996);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(997);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(998);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(999);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1000);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1001);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1002);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1003);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1004);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1005);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1006);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1007);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1008);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1009);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1010);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1011);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1012);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1013);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1014);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1015);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1016);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1017);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1018);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1019);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1020);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1021);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1022);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1023);
+emit_16(959);
+emit_16(1023);
+emit_16(958);
+emit_16(1024);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1025);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1026);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1027);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1028);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1029);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1030);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1031);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1032);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1033);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1034);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1035);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1036);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1037);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1038);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1039);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1040);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1041);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1042);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1043);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1044);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1045);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1046);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1047);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1048);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1049);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1050);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1051);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1052);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1053);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1054);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1055);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1056);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1057);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1058);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1059);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1060);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1061);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1062);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1063);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1064);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1065);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1066);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1067);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1068);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1069);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1070);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1071);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1072);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1073);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1074);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1075);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1076);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1077);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1078);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1079);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1080);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1081);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1082);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1083);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1084);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1085);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1086);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1087);
+emit_16(1023);
+emit_16(1087);
+emit_16(1022);
+emit_16(1088);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1089);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1090);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1091);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1092);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1093);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1094);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1095);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1096);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1097);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1098);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1099);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1100);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1101);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1102);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1103);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1104);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1105);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1106);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1107);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1108);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1109);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1110);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1111);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1112);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1113);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1114);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1115);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1116);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1117);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1118);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1119);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1120);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1121);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1122);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1123);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1124);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1125);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1126);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1127);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1128);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1129);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1130);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1131);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1132);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1133);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1134);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1135);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1136);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1137);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1138);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1139);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1140);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1141);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1142);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1143);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1144);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1145);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1146);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1147);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1148);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1149);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1150);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1151);
+emit_16(1087);
+emit_16(1151);
+emit_16(1086);
+emit_16(1152);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1153);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1154);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1155);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1156);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1157);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1158);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1159);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1160);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1161);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1162);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1163);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1164);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1165);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1166);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1167);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1168);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1169);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1170);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1171);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1172);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1173);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1174);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1175);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1176);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1177);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1178);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1179);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1180);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1181);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1182);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1183);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1184);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1185);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1186);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1187);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1188);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1189);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1190);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1191);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1192);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1193);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1194);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1195);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1196);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1197);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1198);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1199);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1200);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1201);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1202);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1203);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1204);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1205);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1206);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1207);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1208);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1209);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1210);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1211);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1212);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1213);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1214);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1215);
+emit_16(1151);
+emit_16(1215);
+emit_16(1150);
+emit_16(1216);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1217);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1218);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1219);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1220);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1221);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1222);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1223);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1224);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1225);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1226);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1227);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1228);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1229);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1230);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1231);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1232);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1233);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1234);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1235);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1236);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1237);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1238);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1239);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1240);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1241);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1242);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1243);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1244);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1245);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1246);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1247);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1248);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1249);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1250);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1251);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1252);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1253);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1254);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1255);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1256);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1257);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1258);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1259);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1260);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1261);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1262);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1263);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1264);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1265);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1266);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1267);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1268);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1269);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1270);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1271);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1272);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1273);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1274);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1275);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1276);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1277);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1278);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1279);
+emit_16(1215);
+emit_16(1279);
+emit_16(1214);
+emit_16(1280);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1281);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1282);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1283);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1284);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1285);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1286);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1287);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1288);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1289);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1290);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1291);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1292);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1293);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1294);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1295);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1296);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1297);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1298);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1299);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1300);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1301);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1302);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1303);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1304);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1305);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1306);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1307);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1308);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1309);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1310);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1311);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1312);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1313);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1314);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1315);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1316);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1317);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1318);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1319);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1320);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1321);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1322);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1323);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1324);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1325);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1326);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1327);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1328);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1329);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1330);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1331);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1332);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1333);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1334);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1335);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1336);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1337);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1338);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1339);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1340);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1341);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1342);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1343);
+emit_16(1279);
+emit_16(1343);
+emit_16(1278);
+emit_16(1344);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1345);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1346);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1347);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1348);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1349);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1350);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1351);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1352);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1353);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1354);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1355);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1356);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1357);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1358);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1359);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1360);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1361);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1362);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1363);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1364);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1365);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1366);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1367);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1368);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1369);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1370);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1371);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1372);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1373);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1374);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1375);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1376);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1377);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1378);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1379);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1380);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1381);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1382);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1383);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1384);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1385);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1386);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1387);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1388);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1389);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1390);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1391);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1392);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1393);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1394);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1395);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1396);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1397);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1398);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1399);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1400);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1401);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1402);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1403);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1404);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1405);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1406);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1407);
+emit_16(1343);
+emit_16(1407);
+emit_16(1342);
+emit_16(1408);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1409);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1410);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1411);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1412);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1413);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1414);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1415);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1416);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1417);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1418);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1419);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1420);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1421);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1422);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1423);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1424);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1425);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1426);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1427);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1428);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1429);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1430);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1431);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1432);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1433);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1434);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1435);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1436);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1437);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1438);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1439);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1440);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1441);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1442);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1443);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1444);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1445);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1446);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1447);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1448);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1449);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1450);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1451);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1452);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1453);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1454);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1455);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1456);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1457);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1458);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1459);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1460);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1461);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1462);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1463);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1464);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1465);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1466);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1467);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1468);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1469);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1470);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1471);
+emit_16(1407);
+emit_16(1471);
+emit_16(1406);
+emit_16(1472);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1473);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1474);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1475);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1476);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1477);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1478);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1479);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1480);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1481);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1482);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1483);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1484);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1485);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1486);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1487);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1488);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1489);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1490);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1491);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1492);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1493);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1494);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1495);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1496);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1497);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1498);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1499);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1500);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1501);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1502);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1503);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1504);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1505);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1506);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1507);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1508);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1509);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1510);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1511);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1512);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1513);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1514);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1515);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1516);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1517);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1518);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1519);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1520);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1521);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1522);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1523);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1524);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1525);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1526);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1527);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1528);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1529);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1530);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1531);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1532);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1533);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1534);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1535);
+emit_16(1471);
+emit_16(1535);
+emit_16(1470);
+emit_16(1536);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1537);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1538);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1539);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1540);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1541);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1542);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1543);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1544);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1545);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1546);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1547);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1548);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1549);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1550);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1551);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1552);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1553);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1554);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1555);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1556);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1557);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1558);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1559);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1560);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1561);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1562);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1563);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1564);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1565);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1566);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1567);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1568);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1569);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1570);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1571);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1572);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1573);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1574);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1575);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1576);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1577);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1578);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1579);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1580);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1581);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1582);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1583);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1584);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1585);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1586);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1587);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1588);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1589);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1590);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1591);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1592);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1593);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1594);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1595);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1596);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1597);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1598);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1599);
+emit_16(1535);
+emit_16(1599);
+emit_16(1534);
+emit_16(1600);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1601);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1602);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1603);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1604);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1605);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1606);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1607);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1608);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1609);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1610);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1611);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1612);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1613);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1614);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1615);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1616);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1617);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1618);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1619);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1620);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1621);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1622);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1623);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1624);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1625);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1626);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1627);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1628);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1629);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1630);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1631);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1632);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1633);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1634);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1635);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1636);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1637);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1638);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1639);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1640);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1641);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1642);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1643);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1644);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1645);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1646);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1647);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1648);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1649);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1650);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1651);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1652);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1653);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1654);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1655);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1656);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1657);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1658);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1659);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1660);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1661);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1662);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1663);
+emit_16(1599);
+emit_16(1663);
+emit_16(1598);
+emit_16(1664);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1665);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1666);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1667);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1668);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1669);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1670);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1671);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1672);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1673);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1674);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1675);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1676);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1677);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1678);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1679);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1680);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1681);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1682);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1683);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1684);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1685);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1686);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1687);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1688);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1689);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1690);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1691);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1692);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1693);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1694);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1695);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1696);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1697);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1698);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1699);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1700);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1701);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1702);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1703);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1704);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1705);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1706);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1707);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1708);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1709);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1710);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1711);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1712);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1713);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1714);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1715);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1716);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1717);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1718);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1719);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1720);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1721);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1722);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1723);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1724);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1725);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1726);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1727);
+emit_16(1663);
+emit_16(1727);
+emit_16(1662);
+emit_16(1728);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1729);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1730);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1731);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1732);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1733);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1734);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1735);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1736);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1737);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1738);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1739);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1740);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1741);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1742);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1743);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1744);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1745);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1746);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1747);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1748);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1749);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1750);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1751);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1752);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1753);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1754);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1755);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1756);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1757);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1758);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1759);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1760);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1761);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1762);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1763);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1764);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1765);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1766);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1767);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1768);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1769);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1770);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1771);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1772);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1773);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1774);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1775);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1776);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1777);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1778);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1779);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1780);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1781);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1782);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1783);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1784);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1785);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1786);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1787);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1788);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1789);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1790);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1791);
+emit_16(1727);
+emit_16(1791);
+emit_16(1726);
+emit_16(1792);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1793);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1794);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1795);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1796);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1797);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1798);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1799);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1800);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1801);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1802);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1803);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1804);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1805);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1806);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1807);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1808);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1809);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1810);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1811);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1812);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1813);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1814);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1815);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1816);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1817);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1818);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1819);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1820);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1821);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1822);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1823);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1824);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1825);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1826);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1827);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1828);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1829);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1830);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1831);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1832);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1833);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1834);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1835);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1836);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1837);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1838);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1839);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1840);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1841);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1842);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1843);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1844);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1845);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1846);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1847);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1848);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1849);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1850);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1851);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1852);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1853);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1854);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1855);
+emit_16(1791);
+emit_16(1855);
+emit_16(1790);
+emit_16(1856);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1857);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1858);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1859);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1860);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1861);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1862);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1863);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1864);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1865);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1866);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1867);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1868);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1869);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1870);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1871);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1872);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1873);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1874);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1875);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1876);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1877);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1878);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1879);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1880);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1881);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1882);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1883);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1884);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1885);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1886);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1887);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1888);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1889);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1890);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1891);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1892);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1893);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1894);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1895);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1896);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1897);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1898);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1899);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1900);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1901);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1902);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1903);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1904);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1905);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1906);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1907);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1908);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1909);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1910);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1911);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1912);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1913);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1914);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1915);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1916);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1917);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1918);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1919);
+emit_16(1855);
+emit_16(1919);
+emit_16(1854);
+emit_16(1920);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1921);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1922);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1923);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1924);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1925);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1926);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1927);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1928);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1929);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1930);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1931);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1932);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1933);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1934);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1935);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1936);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1937);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1938);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1939);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1940);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1941);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1942);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1943);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1944);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1945);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1946);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1947);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1948);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1949);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1950);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1951);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1952);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1953);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1954);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1955);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1956);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1957);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1958);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1959);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1960);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1961);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1962);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1963);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1964);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1965);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1966);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1967);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1968);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1969);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1970);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1971);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1972);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1973);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1974);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1975);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1976);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1977);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1978);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1979);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1980);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1981);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1982);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1983);
+emit_16(1919);
+emit_16(1983);
+emit_16(1918);
+emit_16(1984);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1985);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1986);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1987);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1988);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1989);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1990);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1991);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1992);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1993);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1994);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1995);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1996);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1997);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1998);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(1999);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2000);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2001);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2002);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2003);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2004);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2005);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2006);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2007);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2008);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2009);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2010);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2011);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2012);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2013);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2014);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2015);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2016);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2017);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2018);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2019);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2020);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2021);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2022);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2023);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2024);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2025);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2026);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2027);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2028);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2029);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2030);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2031);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2032);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2033);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2034);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2035);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2036);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2037);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2038);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2039);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2040);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2041);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2042);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2043);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2044);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2045);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2046);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2047);
+emit_16(1983);
+emit_16(2047);
+emit_16(1982);
+emit_start(Landscape04Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(128);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(129);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(130);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(131);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(132);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(133);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(134);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(135);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(136);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(137);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(138);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(139);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(140);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(141);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(142);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(143);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(144);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(145);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(146);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(147);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(148);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(149);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(150);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(151);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(152);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(153);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(154);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(155);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(156);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(157);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(158);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(159);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(160);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(161);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(162);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(163);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(164);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(165);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(166);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(167);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(168);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(169);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(170);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(171);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(172);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(173);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(174);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(175);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(176);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(177);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(178);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(179);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(180);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(181);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(182);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(183);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(184);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(185);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(186);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(187);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(188);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(189);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(190);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(191);
+emit_16(126);
+emit_16(191);
+emit_16(124);
+emit_16(192);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(193);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(194);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(195);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(196);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(197);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(198);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(199);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(200);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(201);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(202);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(203);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(204);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(205);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(206);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(207);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(208);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(209);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(210);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(211);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(212);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(213);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(214);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(215);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(216);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(217);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(218);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(219);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(220);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(221);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(222);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(223);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(224);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(225);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(226);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(227);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(228);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(229);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(230);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(231);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(232);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(233);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(234);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(235);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(236);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(237);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(238);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(239);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(240);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(241);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(242);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(243);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(244);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(245);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(246);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(247);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(248);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(249);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(250);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(251);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(252);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(253);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(254);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(255);
+emit_16(191);
+emit_16(255);
+emit_16(190);
+emit_16(256);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(257);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(258);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(259);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(260);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(261);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(262);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(263);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(264);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(265);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(266);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(267);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(268);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(269);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(270);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(271);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(272);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(273);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(274);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(275);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(276);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(277);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(278);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(279);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(280);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(281);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(282);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(283);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(284);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(285);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(286);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(287);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(288);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(289);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(290);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(291);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(292);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(293);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(294);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(295);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(296);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(297);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(298);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(299);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(300);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(301);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(302);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(303);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(304);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(305);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(306);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(307);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(308);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(309);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(310);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(311);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(312);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(313);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(314);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(315);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(316);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(317);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(318);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(319);
+emit_16(255);
+emit_16(319);
+emit_16(254);
+emit_16(320);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(321);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(322);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(323);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(324);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(325);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(326);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(327);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(328);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(329);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(330);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(331);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(332);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(333);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(334);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(335);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(336);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(337);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(338);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(339);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(340);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(341);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(342);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(343);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(344);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(345);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(346);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(347);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(348);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(349);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(350);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(351);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(352);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(353);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(354);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(355);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(356);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(357);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(358);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(359);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(360);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(361);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(362);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(363);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(364);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(365);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(366);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(367);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(368);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(369);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(370);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(371);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(372);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(373);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(374);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(375);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(376);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(377);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(378);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(379);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(380);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(381);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(382);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(383);
+emit_16(319);
+emit_16(383);
+emit_16(318);
+emit_16(384);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(385);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(386);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(387);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(388);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(389);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(390);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(391);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(392);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(393);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(394);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(395);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(396);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(397);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(398);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(399);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(400);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(401);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(402);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(403);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(404);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(405);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(406);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(407);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(408);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(409);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(410);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(411);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(412);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(413);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(414);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(415);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(416);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(417);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(418);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(419);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(420);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(421);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(422);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(423);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(424);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(425);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(426);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(427);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(428);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(429);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(430);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(431);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(432);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(433);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(434);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(435);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(436);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(437);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(438);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(439);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(440);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(441);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(442);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(443);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(444);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(445);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(446);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(447);
+emit_16(383);
+emit_16(447);
+emit_16(382);
+emit_16(448);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(449);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(450);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(451);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(452);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(453);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(454);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(455);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(456);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(457);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(458);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(459);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(460);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(461);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(462);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(463);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(464);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(465);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(466);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(467);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(468);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(469);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(470);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(471);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(472);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(473);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(474);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(475);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(476);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(477);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(478);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(479);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(480);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(481);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(482);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(483);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(484);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(485);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(486);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(487);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(488);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(489);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(490);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(491);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(492);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(493);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(494);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(495);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(496);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(497);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(498);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(499);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(500);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(501);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(502);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(503);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(504);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(505);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(506);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(507);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(508);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(509);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(510);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(511);
+emit_16(447);
+emit_16(511);
+emit_16(446);
+emit_16(512);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(513);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(514);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(515);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(516);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(517);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(518);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(519);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(520);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(521);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(522);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(523);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(524);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(525);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(526);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(527);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(528);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(529);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(530);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(531);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(532);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(533);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(534);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(535);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(536);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(537);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(538);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(539);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(540);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(541);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(542);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(543);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(544);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(545);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(546);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(547);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(548);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(549);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(550);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(551);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(552);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(553);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(554);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(555);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(556);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(557);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(558);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(559);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(560);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(561);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(562);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(563);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(564);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(565);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(566);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(567);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(568);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(569);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(570);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(571);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(572);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(573);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(574);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(575);
+emit_16(511);
+emit_16(575);
+emit_16(510);
+emit_16(576);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(577);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(578);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(579);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(580);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(581);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(582);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(583);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(584);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(585);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(586);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(587);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(588);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(589);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(590);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(591);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(592);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(593);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(594);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(595);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(596);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(597);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(598);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(599);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(600);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(601);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(602);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(603);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(604);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(605);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(606);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(607);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(608);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(609);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(610);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(611);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(612);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(613);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(614);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(615);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(616);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(617);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(618);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(619);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(620);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(621);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(622);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(623);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(624);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(625);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(626);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(627);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(628);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(629);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(630);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(631);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(632);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(633);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(634);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(635);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(636);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(637);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(638);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(639);
+emit_16(575);
+emit_16(639);
+emit_16(574);
+emit_16(640);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(641);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(642);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(643);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(644);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(645);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(646);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(647);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(648);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(649);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(650);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(651);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(652);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(653);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(654);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(655);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(656);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(657);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(658);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(659);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(660);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(661);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(662);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(663);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(664);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(665);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(666);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(667);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(668);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(669);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(670);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(671);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(672);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(673);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(674);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(675);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(676);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(677);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(678);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(679);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(680);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(681);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(682);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(683);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(684);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(685);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(686);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(687);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(688);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(689);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(690);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(691);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(692);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(693);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(694);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(695);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(696);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(697);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(698);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(699);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(700);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(701);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(702);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(703);
+emit_16(639);
+emit_16(703);
+emit_16(638);
+emit_16(704);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(705);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(706);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(707);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(708);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(709);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(710);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(711);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(712);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(713);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(714);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(715);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(716);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(717);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(718);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(719);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(720);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(721);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(722);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(723);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(724);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(725);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(726);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(727);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(728);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(729);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(730);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(731);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(732);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(733);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(734);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(735);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(736);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(737);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(738);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(739);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(740);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(741);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(742);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(743);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(744);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(745);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(746);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(747);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(748);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(749);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(750);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(751);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(752);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(753);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(754);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(755);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(756);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(757);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(758);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(759);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(760);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(761);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(762);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(763);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(764);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(765);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(766);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(767);
+emit_16(703);
+emit_16(767);
+emit_16(702);
+emit_16(768);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(769);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(770);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(771);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(772);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(773);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(774);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(775);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(776);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(777);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(778);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(779);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(780);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(781);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(782);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(783);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(784);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(785);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(786);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(787);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(788);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(789);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(790);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(791);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(792);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(793);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(794);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(795);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(796);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(797);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(798);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(799);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(800);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(801);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(802);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(803);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(804);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(805);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(806);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(807);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(808);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(809);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(810);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(811);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(812);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(813);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(814);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(815);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(816);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(817);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(818);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(819);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(820);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(821);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(822);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(823);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(824);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(825);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(826);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(827);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(828);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(829);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(830);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(831);
+emit_16(767);
+emit_16(831);
+emit_16(766);
+emit_16(832);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(833);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(834);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(835);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(836);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(837);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(838);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(839);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(840);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(841);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(842);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(843);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(844);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(845);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(846);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(847);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(848);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(849);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(850);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(851);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(852);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(853);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(854);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(855);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(856);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(857);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(858);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(859);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(860);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(861);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(862);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(863);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(864);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(865);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(866);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(867);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(868);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(869);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(870);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(871);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(872);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(873);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(874);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(875);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(876);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(877);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(878);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(879);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(880);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(881);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(882);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(883);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(884);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(885);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(886);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(887);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(888);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(889);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(890);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(891);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(892);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(893);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(894);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(895);
+emit_16(831);
+emit_16(895);
+emit_16(830);
+emit_16(896);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(897);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(898);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(899);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(900);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(901);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(902);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(903);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(904);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(905);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(906);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(907);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(908);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(909);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(910);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(911);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(912);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(913);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(914);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(915);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(916);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(917);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(918);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(919);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(920);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(921);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(922);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(923);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(924);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(925);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(926);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(927);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(928);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(929);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(930);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(931);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(932);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(933);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(934);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(935);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(936);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(937);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(938);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(939);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(940);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(941);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(942);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(943);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(944);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(945);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(946);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(947);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(948);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(949);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(950);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(951);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(952);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(953);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(954);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(955);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(956);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(957);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(958);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(959);
+emit_16(895);
+emit_16(959);
+emit_16(894);
+emit_16(960);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(961);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(962);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(963);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(964);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(965);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(966);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(967);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(968);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(969);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(970);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(971);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(972);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(973);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(974);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(975);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(976);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(977);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(978);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(979);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(980);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(981);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(982);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(983);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(984);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(985);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(986);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(987);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(988);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(989);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(990);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(991);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(992);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(993);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(994);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(995);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(996);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(997);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(998);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(999);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1000);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1001);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1002);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1003);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1004);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1005);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1006);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1007);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1008);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1009);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1010);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1011);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1012);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1013);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1014);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1015);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1016);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1017);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1018);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1019);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1020);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1021);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1022);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1023);
+emit_16(959);
+emit_16(1023);
+emit_16(958);
+emit_16(1024);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1025);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1026);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1027);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1028);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1029);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1030);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1031);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1032);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1033);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1034);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1035);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1036);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1037);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1038);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1039);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1040);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1041);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1042);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1043);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1044);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1045);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1046);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1047);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1048);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1049);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1050);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1051);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1052);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1053);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1054);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1055);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1056);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1057);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1058);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1059);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1060);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1061);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1062);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1063);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1064);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1065);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1066);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1067);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1068);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1069);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1070);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1071);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1072);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1073);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1074);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1075);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1076);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1077);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1078);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1079);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1080);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1081);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1082);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1083);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1084);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1085);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1086);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1087);
+emit_16(1023);
+emit_16(1087);
+emit_16(1022);
+emit_16(1088);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1089);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1090);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1091);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1092);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1093);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1094);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1095);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1096);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1097);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1098);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1099);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1100);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1101);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1102);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1103);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1104);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1105);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1106);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1107);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1108);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1109);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1110);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1111);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1112);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1113);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1114);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1115);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1116);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1117);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1118);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1119);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1120);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1121);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1122);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1123);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1124);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1125);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1126);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1127);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1128);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1129);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1130);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1131);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1132);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1133);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1134);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1135);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1136);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1137);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1138);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1139);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1140);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1141);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1142);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1143);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1144);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1145);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1146);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1147);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1148);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1149);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1150);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1151);
+emit_16(1087);
+emit_16(1151);
+emit_16(1086);
+emit_16(1152);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1153);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1154);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1155);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1156);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1157);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1158);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1159);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1160);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1161);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1162);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1163);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1164);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1165);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1166);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1167);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1168);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1169);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1170);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1171);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1172);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1173);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1174);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1175);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1176);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1177);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1178);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1179);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1180);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1181);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1182);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1183);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1184);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1185);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1186);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1187);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1188);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1189);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1190);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1191);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1192);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1193);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1194);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1195);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1196);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1197);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1198);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1199);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1200);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1201);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1202);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1203);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1204);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1205);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1206);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1207);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1208);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1209);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1210);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1211);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1212);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1213);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1214);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1215);
+emit_16(1151);
+emit_16(1215);
+emit_16(1150);
+emit_16(1216);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1217);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1218);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1219);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1220);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1221);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1222);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1223);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1224);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1225);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1226);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1227);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1228);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1229);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1230);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1231);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1232);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1233);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1234);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1235);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1236);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1237);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1238);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1239);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1240);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1241);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1242);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1243);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1244);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1245);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1246);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1247);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1248);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1249);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1250);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1251);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1252);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1253);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1254);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1255);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1256);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1257);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1258);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1259);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1260);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1261);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1262);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1263);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1264);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1265);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1266);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1267);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1268);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1269);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1270);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1271);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1272);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1273);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1274);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1275);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1276);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1277);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1278);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1279);
+emit_16(1215);
+emit_16(1279);
+emit_16(1214);
+emit_16(1280);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1281);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1282);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1283);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1284);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1285);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1286);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1287);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1288);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1289);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1290);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1291);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1292);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1293);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1294);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1295);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1296);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1297);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1298);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1299);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1300);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1301);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1302);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1303);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1304);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1305);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1306);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1307);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1308);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1309);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1310);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1311);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1312);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1313);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1314);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1315);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1316);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1317);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1318);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1319);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1320);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1321);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1322);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1323);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1324);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1325);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1326);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1327);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1328);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1329);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1330);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1331);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1332);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1333);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1334);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1335);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1336);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1337);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1338);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1339);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1340);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1341);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1342);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1343);
+emit_16(1279);
+emit_16(1343);
+emit_16(1278);
+emit_16(1344);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1345);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1346);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1347);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1348);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1349);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1350);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1351);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1352);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1353);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1354);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1355);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1356);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1357);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1358);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1359);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1360);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1361);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1362);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1363);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1364);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1365);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1366);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1367);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1368);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1369);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1370);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1371);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1372);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1373);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1374);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1375);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1376);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1377);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1378);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1379);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1380);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1381);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1382);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1383);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1384);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1385);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1386);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1387);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1388);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1389);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1390);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1391);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1392);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1393);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1394);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1395);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1396);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1397);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1398);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1399);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1400);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1401);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1402);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1403);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1404);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1405);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1406);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1407);
+emit_16(1343);
+emit_16(1407);
+emit_16(1342);
+emit_16(1408);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1409);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1410);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1411);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1412);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1413);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1414);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1415);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1416);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1417);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1418);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1419);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1420);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1421);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1422);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1423);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1424);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1425);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1426);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1427);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1428);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1429);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1430);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1431);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1432);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1433);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1434);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1435);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1436);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1437);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1438);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1439);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1440);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1441);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1442);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1443);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1444);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1445);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1446);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1447);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1448);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1449);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1450);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1451);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1452);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1453);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1454);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1455);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1456);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1457);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1458);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1459);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1460);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1461);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1462);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1463);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1464);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1465);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1466);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1467);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1468);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1469);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1470);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1471);
+emit_16(1407);
+emit_16(1471);
+emit_16(1406);
+emit_16(1472);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1473);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1474);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1475);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1476);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1477);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1478);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1479);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1480);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1481);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1482);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1483);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1484);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1485);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1486);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1487);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1488);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1489);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1490);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1491);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1492);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1493);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1494);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1495);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1496);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1497);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1498);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1499);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1500);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1501);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1502);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1503);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1504);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1505);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1506);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1507);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1508);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1509);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1510);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1511);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1512);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1513);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1514);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1515);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1516);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1517);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1518);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1519);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1520);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1521);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1522);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1523);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1524);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1525);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1526);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1527);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1528);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1529);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1530);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1531);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1532);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1533);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1534);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1535);
+emit_16(1471);
+emit_16(1535);
+emit_16(1470);
+emit_16(1536);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1537);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1538);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1539);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1540);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1541);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1542);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1543);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1544);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1545);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1546);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1547);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1548);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1549);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1550);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1551);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1552);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1553);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1554);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1555);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1556);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1557);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1558);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1559);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1560);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1561);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1562);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1563);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1564);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1565);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1566);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1567);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1568);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1569);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1570);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1571);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1572);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1573);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1574);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1575);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1576);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1577);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1578);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1579);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1580);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1581);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1582);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1583);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1584);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1585);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1586);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1587);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1588);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1589);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1590);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1591);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1592);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1593);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1594);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1595);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1596);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1597);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1598);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1599);
+emit_16(1535);
+emit_16(1599);
+emit_16(1534);
+emit_16(1600);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1601);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1602);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1603);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1604);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1605);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1606);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1607);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1608);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1609);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1610);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1611);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1612);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1613);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1614);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1615);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1616);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1617);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1618);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1619);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1620);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1621);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1622);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1623);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1624);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1625);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1626);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1627);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1628);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1629);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1630);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1631);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1632);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1633);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1634);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1635);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1636);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1637);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1638);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1639);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1640);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1641);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1642);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1643);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1644);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1645);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1646);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1647);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1648);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1649);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1650);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1651);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1652);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1653);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1654);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1655);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1656);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1657);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1658);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1659);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1660);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1661);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1662);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1663);
+emit_16(1599);
+emit_16(1663);
+emit_16(1598);
+emit_16(1664);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1665);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1666);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1667);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1668);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1669);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1670);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1671);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1672);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1673);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1674);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1675);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1676);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1677);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1678);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1679);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1680);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1681);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1682);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1683);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1684);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1685);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1686);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1687);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1688);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1689);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1690);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1691);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1692);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1693);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1694);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1695);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1696);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1697);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1698);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1699);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1700);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1701);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1702);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1703);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1704);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1705);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1706);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1707);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1708);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1709);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1710);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1711);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1712);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1713);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1714);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1715);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1716);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1717);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1718);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1719);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1720);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1721);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1722);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1723);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1724);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1725);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1726);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1727);
+emit_16(1663);
+emit_16(1727);
+emit_16(1662);
+emit_16(1728);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1729);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1730);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1731);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1732);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1733);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1734);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1735);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1736);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1737);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1738);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1739);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1740);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1741);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1742);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1743);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1744);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1745);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1746);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1747);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1748);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1749);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1750);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1751);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1752);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1753);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1754);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1755);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1756);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1757);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1758);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1759);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1760);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1761);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1762);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1763);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1764);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1765);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1766);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1767);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1768);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1769);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1770);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1771);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1772);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1773);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1774);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1775);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1776);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1777);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1778);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1779);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1780);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1781);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1782);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1783);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1784);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1785);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1786);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1787);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1788);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1789);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1790);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1791);
+emit_16(1727);
+emit_16(1791);
+emit_16(1726);
+emit_16(1792);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1793);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1794);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1795);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1796);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1797);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1798);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1799);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1800);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1801);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1802);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1803);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1804);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1805);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1806);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1807);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1808);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1809);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1810);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1811);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1812);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1813);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1814);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1815);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1816);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1817);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1818);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1819);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1820);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1821);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1822);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1823);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1824);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1825);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1826);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1827);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1828);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1829);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1830);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1831);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1832);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1833);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1834);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1835);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1836);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1837);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1838);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1839);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1840);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1841);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1842);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1843);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1844);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1845);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1846);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1847);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1848);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1849);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1850);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1851);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1852);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1853);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1854);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1855);
+emit_16(1791);
+emit_16(1855);
+emit_16(1790);
+emit_16(1856);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1857);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1858);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1859);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1860);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1861);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1862);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1863);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1864);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1865);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1866);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1867);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1868);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1869);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1870);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1871);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1872);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1873);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1874);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1875);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1876);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1877);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1878);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1879);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1880);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1881);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1882);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1883);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1884);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1885);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1886);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1887);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1888);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1889);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1890);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1891);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1892);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1893);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1894);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1895);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1896);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1897);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1898);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1899);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1900);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1901);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1902);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1903);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1904);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1905);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1906);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1907);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1908);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1909);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1910);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1911);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1912);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1913);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1914);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1915);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1916);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1917);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1918);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1919);
+emit_16(1855);
+emit_16(1919);
+emit_16(1854);
+emit_16(1920);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1921);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1922);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1923);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1924);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1925);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1926);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1927);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1928);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1929);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1930);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1931);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1932);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1933);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1934);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1935);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1936);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1937);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1938);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1939);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1940);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1941);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1942);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1943);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1944);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1945);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1946);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1947);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1948);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1949);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1950);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1951);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1952);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1953);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1954);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1955);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1956);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1957);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1958);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1959);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1960);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1961);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1962);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1963);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1964);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1965);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1966);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1967);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1968);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1969);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1970);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1971);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1972);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1973);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1974);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1975);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1976);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1977);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1978);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1979);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1980);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1981);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1982);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1983);
+emit_16(1919);
+emit_16(1983);
+emit_16(1918);
+emit_16(1984);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1985);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1986);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1987);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1988);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1989);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1990);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1991);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1992);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1993);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1994);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1995);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1996);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1997);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1998);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(1999);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2000);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2001);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2002);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2003);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2004);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2005);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2006);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2007);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2008);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2009);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2010);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2011);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2012);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2013);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2014);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2015);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2016);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2017);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2018);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2019);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2020);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2021);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2022);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2023);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2024);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2025);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2026);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2027);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2028);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2029);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2030);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2031);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2032);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2033);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2034);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2035);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2036);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2037);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2038);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2039);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2040);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2041);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2042);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2043);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2044);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2045);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2046);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2047);
+emit_16(1983);
+emit_16(2047);
+emit_16(1982);
+emit_16(2048);
+emit_16(1984);
+emit_16(2049);
+emit_16(1985);
+emit_16(2049);
+emit_16(1984);
+emit_16(2049);
+emit_16(1985);
+emit_16(2050);
+emit_16(1986);
+emit_16(2050);
+emit_16(1985);
+emit_16(2050);
+emit_16(1986);
+emit_16(2051);
+emit_16(1987);
+emit_16(2051);
+emit_16(1986);
+emit_16(2051);
+emit_16(1987);
+emit_16(2052);
+emit_16(1988);
+emit_16(2052);
+emit_16(1987);
+emit_16(2052);
+emit_16(1988);
+emit_16(2053);
+emit_16(1989);
+emit_16(2053);
+emit_16(1988);
+emit_16(2053);
+emit_16(1989);
+emit_16(2054);
+emit_16(1990);
+emit_16(2054);
+emit_16(1989);
+emit_16(2054);
+emit_16(1990);
+emit_16(2055);
+emit_16(1991);
+emit_16(2055);
+emit_16(1990);
+emit_16(2055);
+emit_16(1991);
+emit_16(2056);
+emit_16(1992);
+emit_16(2056);
+emit_16(1991);
+emit_16(2056);
+emit_16(1992);
+emit_16(2057);
+emit_16(1993);
+emit_16(2057);
+emit_16(1992);
+emit_16(2057);
+emit_16(1993);
+emit_16(2058);
+emit_16(1994);
+emit_16(2058);
+emit_16(1993);
+emit_16(2058);
+emit_16(1994);
+emit_16(2059);
+emit_16(1995);
+emit_16(2059);
+emit_16(1994);
+emit_16(2059);
+emit_16(1995);
+emit_16(2060);
+emit_16(1996);
+emit_16(2060);
+emit_16(1995);
+emit_16(2060);
+emit_16(1996);
+emit_16(2061);
+emit_16(1997);
+emit_16(2061);
+emit_16(1996);
+emit_16(2061);
+emit_16(1997);
+emit_16(2062);
+emit_16(1998);
+emit_16(2062);
+emit_16(1997);
+emit_16(2062);
+emit_16(1998);
+emit_16(2063);
+emit_16(1999);
+emit_16(2063);
+emit_16(1998);
+emit_16(2063);
+emit_16(1999);
+emit_16(2064);
+emit_16(2000);
+emit_16(2064);
+emit_16(1999);
+emit_16(2064);
+emit_16(2000);
+emit_16(2065);
+emit_16(2001);
+emit_16(2065);
+emit_16(2000);
+emit_16(2065);
+emit_16(2001);
+emit_16(2066);
+emit_16(2002);
+emit_16(2066);
+emit_16(2001);
+emit_16(2066);
+emit_16(2002);
+emit_16(2067);
+emit_16(2003);
+emit_16(2067);
+emit_16(2002);
+emit_16(2067);
+emit_16(2003);
+emit_16(2068);
+emit_16(2004);
+emit_16(2068);
+emit_16(2003);
+emit_16(2068);
+emit_16(2004);
+emit_16(2069);
+emit_16(2005);
+emit_16(2069);
+emit_16(2004);
+emit_16(2069);
+emit_16(2005);
+emit_16(2070);
+emit_16(2006);
+emit_16(2070);
+emit_16(2005);
+emit_16(2070);
+emit_16(2006);
+emit_16(2071);
+emit_16(2007);
+emit_16(2071);
+emit_16(2006);
+emit_16(2071);
+emit_16(2007);
+emit_16(2072);
+emit_16(2008);
+emit_16(2072);
+emit_16(2007);
+emit_16(2072);
+emit_16(2008);
+emit_16(2073);
+emit_16(2009);
+emit_16(2073);
+emit_16(2008);
+emit_16(2073);
+emit_16(2009);
+emit_16(2074);
+emit_16(2010);
+emit_16(2074);
+emit_16(2009);
+emit_16(2074);
+emit_16(2010);
+emit_16(2075);
+emit_16(2011);
+emit_16(2075);
+emit_16(2010);
+emit_16(2075);
+emit_16(2011);
+emit_16(2076);
+emit_16(2012);
+emit_16(2076);
+emit_16(2011);
+emit_16(2076);
+emit_16(2012);
+emit_16(2077);
+emit_16(2013);
+emit_16(2077);
+emit_16(2012);
+emit_16(2077);
+emit_16(2013);
+emit_16(2078);
+emit_16(2014);
+emit_16(2078);
+emit_16(2013);
+emit_16(2078);
+emit_16(2014);
+emit_16(2079);
+emit_16(2015);
+emit_16(2079);
+emit_16(2014);
+emit_16(2079);
+emit_16(2015);
+emit_16(2080);
+emit_16(2016);
+emit_16(2080);
+emit_16(2015);
+emit_16(2080);
+emit_16(2016);
+emit_16(2081);
+emit_16(2017);
+emit_16(2081);
+emit_16(2016);
+emit_16(2081);
+emit_16(2017);
+emit_16(2082);
+emit_16(2018);
+emit_16(2082);
+emit_16(2017);
+emit_16(2082);
+emit_16(2018);
+emit_16(2083);
+emit_16(2019);
+emit_16(2083);
+emit_16(2018);
+emit_16(2083);
+emit_16(2019);
+emit_16(2084);
+emit_16(2020);
+emit_16(2084);
+emit_16(2019);
+emit_16(2084);
+emit_16(2020);
+emit_16(2085);
+emit_16(2021);
+emit_16(2085);
+emit_16(2020);
+emit_16(2085);
+emit_16(2021);
+emit_16(2086);
+emit_16(2022);
+emit_16(2086);
+emit_16(2021);
+emit_16(2086);
+emit_16(2022);
+emit_16(2087);
+emit_16(2023);
+emit_16(2087);
+emit_16(2022);
+emit_16(2087);
+emit_16(2023);
+emit_16(2088);
+emit_16(2024);
+emit_16(2088);
+emit_16(2023);
+emit_16(2088);
+emit_16(2024);
+emit_16(2089);
+emit_16(2025);
+emit_16(2089);
+emit_16(2024);
+emit_16(2089);
+emit_16(2025);
+emit_16(2090);
+emit_16(2026);
+emit_16(2090);
+emit_16(2025);
+emit_16(2090);
+emit_16(2026);
+emit_16(2091);
+emit_16(2027);
+emit_16(2091);
+emit_16(2026);
+emit_16(2091);
+emit_16(2027);
+emit_16(2092);
+emit_16(2028);
+emit_16(2092);
+emit_16(2027);
+emit_16(2092);
+emit_16(2028);
+emit_16(2093);
+emit_16(2029);
+emit_16(2093);
+emit_16(2028);
+emit_16(2093);
+emit_16(2029);
+emit_16(2094);
+emit_16(2030);
+emit_16(2094);
+emit_16(2029);
+emit_16(2094);
+emit_16(2030);
+emit_16(2095);
+emit_16(2031);
+emit_16(2095);
+emit_16(2030);
+emit_16(2095);
+emit_16(2031);
+emit_16(2096);
+emit_16(2032);
+emit_16(2096);
+emit_16(2031);
+emit_16(2096);
+emit_16(2032);
+emit_16(2097);
+emit_16(2033);
+emit_16(2097);
+emit_16(2032);
+emit_16(2097);
+emit_16(2033);
+emit_16(2098);
+emit_16(2034);
+emit_16(2098);
+emit_16(2033);
+emit_16(2098);
+emit_16(2034);
+emit_16(2099);
+emit_16(2035);
+emit_16(2099);
+emit_16(2034);
+emit_16(2099);
+emit_16(2035);
+emit_16(2100);
+emit_16(2036);
+emit_16(2100);
+emit_16(2035);
+emit_16(2100);
+emit_16(2036);
+emit_16(2101);
+emit_16(2037);
+emit_16(2101);
+emit_16(2036);
+emit_16(2101);
+emit_16(2037);
+emit_16(2102);
+emit_16(2038);
+emit_16(2102);
+emit_16(2037);
+emit_16(2102);
+emit_16(2038);
+emit_16(2103);
+emit_16(2039);
+emit_16(2103);
+emit_16(2038);
+emit_16(2103);
+emit_16(2039);
+emit_16(2104);
+emit_16(2040);
+emit_16(2104);
+emit_16(2039);
+emit_16(2104);
+emit_16(2040);
+emit_16(2105);
+emit_16(2041);
+emit_16(2105);
+emit_16(2040);
+emit_16(2105);
+emit_16(2041);
+emit_16(2106);
+emit_16(2042);
+emit_16(2106);
+emit_16(2041);
+emit_16(2106);
+emit_16(2042);
+emit_16(2107);
+emit_16(2043);
+emit_16(2107);
+emit_16(2042);
+emit_16(2107);
+emit_16(2043);
+emit_16(2108);
+emit_16(2044);
+emit_16(2108);
+emit_16(2043);
+emit_16(2108);
+emit_16(2044);
+emit_16(2109);
+emit_16(2045);
+emit_16(2109);
+emit_16(2044);
+emit_16(2109);
+emit_16(2045);
+emit_16(2110);
+emit_16(2046);
+emit_16(2110);
+emit_16(2045);
+emit_16(2110);
+emit_16(2046);
+emit_16(2111);
+emit_16(2047);
+emit_16(2111);
+emit_16(2046);
+emit_start(Landscape05Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(128);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(130);
+emit_16(131);
+emit_16(130);
+emit_16(129);
+emit_16(132);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(133);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(134);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(135);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(136);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(137);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(138);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(139);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(140);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(141);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(142);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(143);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(144);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(145);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(146);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(147);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(148);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(149);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(150);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(151);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(152);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(153);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(154);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(155);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(156);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(157);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(158);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(159);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(160);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(161);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(162);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(163);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(164);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(165);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(166);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(167);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(168);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(169);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(170);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(171);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(172);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(173);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(174);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(175);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(176);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(177);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(178);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(179);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(180);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(181);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(182);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(183);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(184);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(185);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(186);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(187);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(188);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(189);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(190);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(191);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(192);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(193);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(194);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(195);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(196);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(197);
+emit_16(130);
+emit_16(197);
+emit_16(128);
+emit_16(198);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(199);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(200);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(201);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(202);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(203);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(204);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(205);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(206);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(207);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(208);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(209);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(210);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(211);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(212);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(213);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(214);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(215);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(216);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(217);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(218);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(219);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(220);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(221);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(222);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(223);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(224);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(225);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(226);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(227);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(228);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(229);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(230);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(231);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(232);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(233);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(234);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(235);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(236);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(237);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(238);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(239);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(240);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(241);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(242);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(243);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(244);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(245);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(246);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(247);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(248);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(249);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(250);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(251);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(252);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(253);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(254);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(255);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(256);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(257);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(258);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(259);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(260);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(261);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(262);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(263);
+emit_16(197);
+emit_16(263);
+emit_16(196);
+emit_16(264);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(265);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(266);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(267);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(268);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(269);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(270);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(271);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(272);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(273);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(274);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(275);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(276);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(277);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(278);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(279);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(280);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(281);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(282);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(283);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(284);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(285);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(286);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(287);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(288);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(289);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(290);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(291);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(292);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(293);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(294);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(295);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(296);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(297);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(298);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(299);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(300);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(301);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(302);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(303);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(304);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(305);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(306);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(307);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(308);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(309);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(310);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(311);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(312);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(313);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(314);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(315);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(316);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(317);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(318);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(319);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(320);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(321);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(322);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(323);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(324);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(325);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(326);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(327);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(328);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(329);
+emit_16(263);
+emit_16(329);
+emit_16(262);
+emit_16(330);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(331);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(332);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(333);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(334);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(335);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(336);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(337);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(338);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(339);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(340);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(341);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(342);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(343);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(344);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(345);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(346);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(347);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(348);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(349);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(350);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(351);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(352);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(353);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(354);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(355);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(356);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(357);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(358);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(359);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(360);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(361);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(362);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(363);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(364);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(365);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(366);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(367);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(368);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(369);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(370);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(371);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(372);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(373);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(374);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(375);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(376);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(377);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(378);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(379);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(380);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(381);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(382);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(383);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(384);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(385);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(386);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(387);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(388);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(389);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(390);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(391);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(392);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(393);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(394);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(395);
+emit_16(329);
+emit_16(395);
+emit_16(328);
+emit_16(396);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(397);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(398);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(399);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(400);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(401);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(402);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(403);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(404);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(405);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(406);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(407);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(408);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(409);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(410);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(411);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(412);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(413);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(414);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(415);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(416);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(417);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(418);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(419);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(420);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(421);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(422);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(423);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(424);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(425);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(426);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(427);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(428);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(429);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(430);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(431);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(432);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(433);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(434);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(435);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(436);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(437);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(438);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(439);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(440);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(441);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(442);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(443);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(444);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(445);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(446);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(447);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(448);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(449);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(450);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(451);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(452);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(453);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(454);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(455);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(456);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(457);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(458);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(459);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(460);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(461);
+emit_16(395);
+emit_16(461);
+emit_16(394);
+emit_16(462);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(463);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(464);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(465);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(466);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(467);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(468);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(469);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(470);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(471);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(472);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(473);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(474);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(475);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(476);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(477);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(478);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(479);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(480);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(481);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(482);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(483);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(484);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(485);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(486);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(487);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(488);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(489);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(490);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(491);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(492);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(493);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(494);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(495);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(496);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(497);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(498);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(499);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(500);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(501);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(502);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(503);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(504);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(505);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(506);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(507);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(508);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(509);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(510);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(511);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(512);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(513);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(514);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(515);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(516);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(517);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(518);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(519);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(520);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(521);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(522);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(523);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(524);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(525);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(526);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(527);
+emit_16(461);
+emit_16(527);
+emit_16(460);
+emit_16(528);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(529);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(530);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(531);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(532);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(533);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(534);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(535);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(536);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(537);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(538);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(539);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(540);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(541);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(542);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(543);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(544);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(545);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(546);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(547);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(548);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(549);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(550);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(551);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(552);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(553);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(554);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(555);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(556);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(557);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(558);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(559);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(560);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(561);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(562);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(563);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(564);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(565);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(566);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(567);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(568);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(569);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(570);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(571);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(572);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(573);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(574);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(575);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(576);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(577);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(578);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(579);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(580);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(581);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(582);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(583);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(584);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(585);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(586);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(587);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(588);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(589);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(590);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(591);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(592);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(593);
+emit_16(527);
+emit_16(593);
+emit_16(526);
+emit_16(594);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(595);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(596);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(597);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(598);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(599);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(600);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(601);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(602);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(603);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(604);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(605);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(606);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(607);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(608);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(609);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(610);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(611);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(612);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(613);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(614);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(615);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(616);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(617);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(618);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(619);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(620);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(621);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(622);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(623);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(624);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(625);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(626);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(627);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(628);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(629);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(630);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(631);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(632);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(633);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(634);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(635);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(636);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(637);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(638);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(639);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(640);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(641);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(642);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(643);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(644);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(645);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(646);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(647);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(648);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(649);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(650);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(651);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(652);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(653);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(654);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(655);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(656);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(657);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(658);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(659);
+emit_16(593);
+emit_16(659);
+emit_16(592);
+emit_16(660);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(661);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(662);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(663);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(664);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(665);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(666);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(667);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(668);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(669);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(670);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(671);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(672);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(673);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(674);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(675);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(676);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(677);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(678);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(679);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(680);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(681);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(682);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(683);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(684);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(685);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(686);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(687);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(688);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(689);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(690);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(691);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(692);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(693);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(694);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(695);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(696);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(697);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(698);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(699);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(700);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(701);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(702);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(703);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(704);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(705);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(706);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(707);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(708);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(709);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(710);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(711);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(712);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(713);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(714);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(715);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(716);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(717);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(718);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(719);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(720);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(721);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(722);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(723);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(724);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(725);
+emit_16(659);
+emit_16(725);
+emit_16(658);
+emit_16(726);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(727);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(728);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(729);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(730);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(731);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(732);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(733);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(734);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(735);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(736);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(737);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(738);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(739);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(740);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(741);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(742);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(743);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(744);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(745);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(746);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(747);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(748);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(749);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(750);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(751);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(752);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(753);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(754);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(755);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(756);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(757);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(758);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(759);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(760);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(761);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(762);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(763);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(764);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(765);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(766);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(767);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(768);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(769);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(770);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(771);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(772);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(773);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(774);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(775);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(776);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(777);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(778);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(779);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(780);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(781);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(782);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(783);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(784);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(785);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(786);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(787);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(788);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(789);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(790);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(791);
+emit_16(725);
+emit_16(791);
+emit_16(724);
+emit_16(792);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(793);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(794);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(795);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(796);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(797);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(798);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(799);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(800);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(801);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(802);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(803);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(804);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(805);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(806);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(807);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(808);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(809);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(810);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(811);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(812);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(813);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(814);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(815);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(816);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(817);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(818);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(819);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(820);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(821);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(822);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(823);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(824);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(825);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(826);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(827);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(828);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(829);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(830);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(831);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(832);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(833);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(834);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(835);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(836);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(837);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(838);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(839);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(840);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(841);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(842);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(843);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(844);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(845);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(846);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(847);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(848);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(849);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(850);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(851);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(852);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(853);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(854);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(855);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(856);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(857);
+emit_16(791);
+emit_16(857);
+emit_16(790);
+emit_16(858);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(859);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(860);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(861);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(862);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(863);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(864);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(865);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(866);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(867);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(868);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(869);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(870);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(871);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(872);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(873);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(874);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(875);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(876);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(877);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(878);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(879);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(880);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(881);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(882);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(883);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(884);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(885);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(886);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(887);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(888);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(889);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(890);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(891);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(892);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(893);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(894);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(895);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(896);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(897);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(898);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(899);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(900);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(901);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(902);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(903);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(904);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(905);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(906);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(907);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(908);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(909);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(910);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(911);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(912);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(913);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(914);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(915);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(916);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(917);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(918);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(919);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(920);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(921);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(922);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(923);
+emit_16(857);
+emit_16(923);
+emit_16(856);
+emit_16(924);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(925);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(926);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(927);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(928);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(929);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(930);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(931);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(932);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(933);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(934);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(935);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(936);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(937);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(938);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(939);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(940);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(941);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(942);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(943);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(944);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(945);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(946);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(947);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(948);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(949);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(950);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(951);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(952);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(953);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(954);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(955);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(956);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(957);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(958);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(959);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(960);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(961);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(962);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(963);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(964);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(965);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(966);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(967);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(968);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(969);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(970);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(971);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(972);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(973);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(974);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(975);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(976);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(977);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(978);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(979);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(980);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(981);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(982);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(983);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(984);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(985);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(986);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(987);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(988);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(989);
+emit_16(923);
+emit_16(989);
+emit_16(922);
+emit_16(990);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(991);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(992);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(993);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(994);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(995);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(996);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(997);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(998);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(999);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1000);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1001);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1002);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1003);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1004);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1005);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1006);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1007);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1008);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1009);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1010);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1011);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1012);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1013);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1014);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1015);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1016);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1017);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1018);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1019);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1020);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1021);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1022);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1023);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1024);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1025);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1026);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1027);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1028);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1029);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1030);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1031);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1032);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1033);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1034);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1035);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1036);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1037);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1038);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1039);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1040);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1041);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1042);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1043);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1044);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1045);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1046);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1047);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1048);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1049);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1050);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1051);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1052);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1053);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1054);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1055);
+emit_16(989);
+emit_16(1055);
+emit_16(988);
+emit_16(1056);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1057);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1058);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1059);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1060);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1061);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1062);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1063);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1064);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1065);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1066);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1067);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1068);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1069);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1070);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1071);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1072);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1073);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1074);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1075);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1076);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1077);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1078);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1079);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1080);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1081);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1082);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1083);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1084);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1085);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1086);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1087);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1088);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1089);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1090);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1091);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1092);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1093);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1094);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1095);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1096);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1097);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1098);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1099);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1100);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1101);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1102);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1103);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1104);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1105);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1106);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1107);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1108);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1109);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1110);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1111);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1112);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1113);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1114);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1115);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1116);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1117);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1118);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1119);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1120);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1121);
+emit_16(1055);
+emit_16(1121);
+emit_16(1054);
+emit_16(1122);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1123);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1124);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1125);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1126);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1127);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1128);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1129);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1130);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1131);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1132);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1133);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1134);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1135);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1136);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1137);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1138);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1139);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1140);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1141);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1142);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1143);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1144);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1145);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1146);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1147);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1148);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1149);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1150);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1151);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1152);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1153);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1154);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1155);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1156);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1157);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1158);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1159);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1160);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1161);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1162);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1163);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1164);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1165);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1166);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1167);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1168);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1169);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1170);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1171);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1172);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1173);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1174);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1175);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1176);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1177);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1178);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1179);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1180);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1181);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1182);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1183);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1184);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1185);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1186);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1187);
+emit_16(1121);
+emit_16(1187);
+emit_16(1120);
+emit_16(1188);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1189);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1190);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1191);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1192);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1193);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1194);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1195);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1196);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1197);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1198);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1199);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1200);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1201);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1202);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1203);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1204);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1205);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1206);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1207);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1208);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1209);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1210);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1211);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1212);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1213);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1214);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1215);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1216);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1217);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1218);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1219);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1220);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1221);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1222);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1223);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1224);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1225);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1226);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1227);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1228);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1229);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1230);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1231);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1232);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1233);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1234);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1235);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1236);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1237);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1238);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1239);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1240);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1241);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1242);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1243);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1244);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1245);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1246);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1247);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1248);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1249);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1250);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1251);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1252);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1253);
+emit_16(1187);
+emit_16(1253);
+emit_16(1186);
+emit_16(1254);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1255);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1256);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1257);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1258);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1259);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1260);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1261);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1262);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1263);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1264);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1265);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1266);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1267);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1268);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1269);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1270);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1271);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1272);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1273);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1274);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1275);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1276);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1277);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1278);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1279);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1280);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1281);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1282);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1283);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1284);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1285);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1286);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1287);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1288);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1289);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1290);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1291);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1292);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1293);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1294);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1295);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1296);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1297);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1298);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1299);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1300);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1301);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1302);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1303);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1304);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1305);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1306);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1307);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1308);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1309);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1310);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1311);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1312);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1313);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1314);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1315);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1316);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1317);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1318);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1319);
+emit_16(1253);
+emit_16(1319);
+emit_16(1252);
+emit_16(1320);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1321);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1322);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1323);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1324);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1325);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1326);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1327);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1328);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1329);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1330);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1331);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1332);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1333);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1334);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1335);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1336);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1337);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1338);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1339);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1340);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1341);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1342);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1343);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1344);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1345);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1346);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1347);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1348);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1349);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1350);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1351);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1352);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1353);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1354);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1355);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1356);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1357);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1358);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1359);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1360);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1361);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1362);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1363);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1364);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1365);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1366);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1367);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1368);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1369);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1370);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1371);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1372);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1373);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1374);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1375);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1376);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1377);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1378);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1379);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1380);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1381);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1382);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1383);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1384);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1385);
+emit_16(1319);
+emit_16(1385);
+emit_16(1318);
+emit_16(1386);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1387);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1388);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1389);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1390);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1391);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1392);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1393);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1394);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1395);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1396);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1397);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1398);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1399);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1400);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1401);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1402);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1403);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1404);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1405);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1406);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1407);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1408);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1409);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1410);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1411);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1412);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1413);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1414);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1415);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1416);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1417);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1418);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1419);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1420);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1421);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1422);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1423);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1424);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1425);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1426);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1427);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1428);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1429);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1430);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1431);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1432);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1433);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1434);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1435);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1436);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1437);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1438);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1439);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1440);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1441);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1442);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1443);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1444);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1445);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1446);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1447);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1448);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1449);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1450);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1451);
+emit_16(1385);
+emit_16(1451);
+emit_16(1384);
+emit_16(1452);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1453);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1454);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1455);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1456);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1457);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1458);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1459);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1460);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1461);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1462);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1463);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1464);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1465);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1466);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1467);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1468);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1469);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1470);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1471);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1472);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1473);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1474);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1475);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1476);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1477);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1478);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1479);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1480);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1481);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1482);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1483);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1484);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1485);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1486);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1487);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1488);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1489);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1490);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1491);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1492);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1493);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1494);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1495);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1496);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1497);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1498);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1499);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1500);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1501);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1502);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1503);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1504);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1505);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1506);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1507);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1508);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1509);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1510);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1511);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1512);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1513);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1514);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1515);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1516);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1517);
+emit_16(1451);
+emit_16(1517);
+emit_16(1450);
+emit_16(1518);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1519);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1520);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1521);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1522);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1523);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1524);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1525);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1526);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1527);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1528);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1529);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1530);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1531);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1532);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1533);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1534);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1535);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1536);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1537);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1538);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1539);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1540);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1541);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1542);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1543);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1544);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1545);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1546);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1547);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1548);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1549);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1550);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1551);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1552);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1553);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1554);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1555);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1556);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1557);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1558);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1559);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1560);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1561);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1562);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1563);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1564);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1565);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1566);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1567);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1568);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1569);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1570);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1571);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1572);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1573);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1574);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1575);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1576);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1577);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1578);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1579);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1580);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1581);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1582);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1583);
+emit_16(1517);
+emit_16(1583);
+emit_16(1516);
+emit_16(1584);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1585);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1586);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1587);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1588);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1589);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1590);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1591);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1592);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1593);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1594);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1595);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1596);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1597);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1598);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1599);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1600);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1601);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1602);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1603);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1604);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1605);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1606);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1607);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1608);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1609);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1610);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1611);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1612);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1613);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1614);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1615);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1616);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1617);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1618);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1619);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1620);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1621);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1622);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1623);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1624);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1625);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1626);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1627);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1628);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1629);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1630);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1631);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1632);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1633);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1634);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1635);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1636);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1637);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1638);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1639);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1640);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1641);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1642);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1643);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1644);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1645);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1646);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1647);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1648);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1649);
+emit_16(1583);
+emit_16(1649);
+emit_16(1582);
+emit_16(1650);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1651);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1652);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1653);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1654);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1655);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1656);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1657);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1658);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1659);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1660);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1661);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1662);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1663);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1664);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1665);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1666);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1667);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1668);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1669);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1670);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1671);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1672);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1673);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1674);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1675);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1676);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1677);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1678);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1679);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1680);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1681);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1682);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1683);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1684);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1685);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1686);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1687);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1688);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1689);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1690);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1691);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1692);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1693);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1694);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1695);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1696);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1697);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1698);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1699);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1700);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1701);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1702);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1703);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1704);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1705);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1706);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1707);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1708);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1709);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1710);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1711);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1712);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1713);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1714);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1715);
+emit_16(1649);
+emit_16(1715);
+emit_16(1648);
+emit_16(1716);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1717);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1718);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1719);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1720);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1721);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1722);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1723);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1724);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1725);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1726);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1727);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1728);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1729);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1730);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1731);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1732);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1733);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1734);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1735);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1736);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1737);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1738);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1739);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1740);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1741);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1742);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1743);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1744);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1745);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1746);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1747);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1748);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1749);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1750);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1751);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1752);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1753);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1754);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1755);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1756);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1757);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1758);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1759);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1760);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1761);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1762);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1763);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1764);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1765);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1766);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1767);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1768);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1769);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1770);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1771);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1772);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1773);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1774);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1775);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1776);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1777);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1778);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1779);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1780);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1781);
+emit_16(1715);
+emit_16(1781);
+emit_16(1714);
+emit_16(1782);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1783);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1784);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1785);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1786);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1787);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1788);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1789);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1790);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1791);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1792);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1793);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1794);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1795);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1796);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1797);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1798);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1799);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1800);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1801);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1802);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1803);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1804);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1805);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1806);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1807);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1808);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1809);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1810);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1811);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1812);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1813);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1814);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1815);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1816);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1817);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1818);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1819);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1820);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1821);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1822);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1823);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1824);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1825);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1826);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1827);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1828);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1829);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1830);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1831);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1832);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1833);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1834);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1835);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1836);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1837);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1838);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1839);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1840);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1841);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1842);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1843);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1844);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1845);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1846);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1847);
+emit_16(1781);
+emit_16(1847);
+emit_16(1780);
+emit_16(1848);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1849);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1850);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1851);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1852);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1853);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1854);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1855);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1856);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1857);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1858);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1859);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1860);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1861);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1862);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1863);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1864);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1865);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1866);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1867);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1868);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1869);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1870);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1871);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1872);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1873);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1874);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1875);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1876);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1877);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1878);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1879);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1880);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1881);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1882);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1883);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1884);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1885);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1886);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1887);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1888);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1889);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1890);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1891);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1892);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1893);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1894);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1895);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1896);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1897);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1898);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1899);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1900);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1901);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1902);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1903);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1904);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1905);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1906);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1907);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1908);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1909);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1910);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1911);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1912);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1913);
+emit_16(1847);
+emit_16(1913);
+emit_16(1846);
+emit_16(1914);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1915);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1916);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1917);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1918);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1919);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1920);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1921);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1922);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1923);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1924);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1925);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1926);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1927);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1928);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1929);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1930);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1931);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1932);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1933);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1934);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1935);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1936);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1937);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1938);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1939);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1940);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1941);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1942);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1943);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1944);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1945);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1946);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1947);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1948);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1949);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1950);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1951);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1952);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1953);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1954);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1955);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1956);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1957);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1958);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1959);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1960);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1961);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1962);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1963);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1964);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1965);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1966);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1967);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1968);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1969);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1970);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1971);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1972);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1973);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1974);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1975);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1976);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1977);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1978);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1979);
+emit_16(1913);
+emit_16(1979);
+emit_16(1912);
+emit_16(1980);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1981);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1982);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1983);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1984);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1985);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1986);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1987);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1988);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1989);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1990);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1991);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1992);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1993);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1994);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1995);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1996);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1997);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1998);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(1999);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2000);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2001);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2002);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2003);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2004);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2005);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2006);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2007);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2008);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2009);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2010);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2011);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2012);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2013);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2014);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2015);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2016);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2017);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2018);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2019);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2020);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2021);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2022);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2023);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2024);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2025);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2026);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2027);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2028);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2029);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2030);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2031);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2032);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2033);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2034);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2035);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2036);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2037);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2038);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2039);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2040);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2041);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2042);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2043);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2044);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2045);
+emit_16(1979);
+emit_16(2045);
+emit_16(1978);
+emit_16(2046);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2047);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2048);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2049);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2050);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2051);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2052);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2053);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2054);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2055);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2056);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2057);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2058);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2059);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2060);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2061);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2062);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2063);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2064);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2065);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2066);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2067);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2068);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2069);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2070);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2071);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2072);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2073);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2074);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2075);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2076);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2077);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2078);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2079);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2080);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2081);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2082);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2083);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2084);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2085);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2086);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2087);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2088);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2089);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2090);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2091);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2092);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2093);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2094);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2095);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2096);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2097);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2098);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2099);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2100);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2101);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2102);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2103);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2104);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2105);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2106);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2107);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2108);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2109);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2110);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2111);
+emit_16(2045);
+emit_16(2111);
+emit_16(2044);
+emit_16(2112);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2113);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2114);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2115);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2116);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2117);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2118);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2119);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2120);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2121);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2122);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2123);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2124);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2125);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2126);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2127);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2128);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2129);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2130);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2131);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2132);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2133);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2134);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2135);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2136);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2137);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2138);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2139);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2140);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2141);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2142);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2143);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2144);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2145);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2146);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2147);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2148);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2149);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2150);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2151);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2152);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2153);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2154);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2155);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2156);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2157);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2158);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2159);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2160);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2161);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2162);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2163);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2164);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2165);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2166);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2167);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2168);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2169);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2170);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2171);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2172);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2173);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2174);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2175);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2176);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2177);
+emit_16(2111);
+emit_16(2177);
+emit_16(2110);
+emit_16(2178);
+emit_16(2112);
+emit_16(2179);
+emit_16(2113);
+emit_16(2179);
+emit_16(2112);
+emit_16(2179);
+emit_16(2113);
+emit_16(2180);
+emit_16(2114);
+emit_16(2180);
+emit_16(2113);
+emit_16(2180);
+emit_16(2114);
+emit_16(2181);
+emit_16(2115);
+emit_16(2181);
+emit_16(2114);
+emit_16(2181);
+emit_16(2115);
+emit_16(2182);
+emit_16(2116);
+emit_16(2182);
+emit_16(2115);
+emit_16(2182);
+emit_16(2116);
+emit_16(2183);
+emit_16(2117);
+emit_16(2183);
+emit_16(2116);
+emit_16(2183);
+emit_16(2117);
+emit_16(2184);
+emit_16(2118);
+emit_16(2184);
+emit_16(2117);
+emit_16(2184);
+emit_16(2118);
+emit_16(2185);
+emit_16(2119);
+emit_16(2185);
+emit_16(2118);
+emit_16(2185);
+emit_16(2119);
+emit_16(2186);
+emit_16(2120);
+emit_16(2186);
+emit_16(2119);
+emit_16(2186);
+emit_16(2120);
+emit_16(2187);
+emit_16(2121);
+emit_16(2187);
+emit_16(2120);
+emit_16(2187);
+emit_16(2121);
+emit_16(2188);
+emit_16(2122);
+emit_16(2188);
+emit_16(2121);
+emit_16(2188);
+emit_16(2122);
+emit_16(2189);
+emit_16(2123);
+emit_16(2189);
+emit_16(2122);
+emit_16(2189);
+emit_16(2123);
+emit_16(2190);
+emit_16(2124);
+emit_16(2190);
+emit_16(2123);
+emit_16(2190);
+emit_16(2124);
+emit_16(2191);
+emit_16(2125);
+emit_16(2191);
+emit_16(2124);
+emit_16(2191);
+emit_16(2125);
+emit_16(2192);
+emit_16(2126);
+emit_16(2192);
+emit_16(2125);
+emit_16(2192);
+emit_16(2126);
+emit_16(2193);
+emit_16(2127);
+emit_16(2193);
+emit_16(2126);
+emit_16(2193);
+emit_16(2127);
+emit_16(2194);
+emit_16(2128);
+emit_16(2194);
+emit_16(2127);
+emit_16(2194);
+emit_16(2128);
+emit_16(2195);
+emit_16(2129);
+emit_16(2195);
+emit_16(2128);
+emit_16(2195);
+emit_16(2129);
+emit_16(2196);
+emit_16(2130);
+emit_16(2196);
+emit_16(2129);
+emit_16(2196);
+emit_16(2130);
+emit_16(2197);
+emit_16(2131);
+emit_16(2197);
+emit_16(2130);
+emit_16(2197);
+emit_16(2131);
+emit_16(2198);
+emit_16(2132);
+emit_16(2198);
+emit_16(2131);
+emit_16(2198);
+emit_16(2132);
+emit_16(2199);
+emit_16(2133);
+emit_16(2199);
+emit_16(2132);
+emit_16(2199);
+emit_16(2133);
+emit_16(2200);
+emit_16(2134);
+emit_16(2200);
+emit_16(2133);
+emit_16(2200);
+emit_16(2134);
+emit_16(2201);
+emit_16(2135);
+emit_16(2201);
+emit_16(2134);
+emit_16(2201);
+emit_16(2135);
+emit_16(2202);
+emit_16(2136);
+emit_16(2202);
+emit_16(2135);
+emit_16(2202);
+emit_16(2136);
+emit_16(2203);
+emit_16(2137);
+emit_16(2203);
+emit_16(2136);
+emit_16(2203);
+emit_16(2137);
+emit_16(2204);
+emit_16(2138);
+emit_16(2204);
+emit_16(2137);
+emit_16(2204);
+emit_16(2138);
+emit_16(2205);
+emit_16(2139);
+emit_16(2205);
+emit_16(2138);
+emit_16(2205);
+emit_16(2139);
+emit_16(2206);
+emit_16(2140);
+emit_16(2206);
+emit_16(2139);
+emit_16(2206);
+emit_16(2140);
+emit_16(2207);
+emit_16(2141);
+emit_16(2207);
+emit_16(2140);
+emit_16(2207);
+emit_16(2141);
+emit_16(2208);
+emit_16(2142);
+emit_16(2208);
+emit_16(2141);
+emit_16(2208);
+emit_16(2142);
+emit_16(2209);
+emit_16(2143);
+emit_16(2209);
+emit_16(2142);
+emit_16(2209);
+emit_16(2143);
+emit_16(2210);
+emit_16(2144);
+emit_16(2210);
+emit_16(2143);
+emit_16(2210);
+emit_16(2144);
+emit_16(2211);
+emit_16(2145);
+emit_16(2211);
+emit_16(2144);
+emit_16(2211);
+emit_16(2145);
+emit_16(2212);
+emit_16(2146);
+emit_16(2212);
+emit_16(2145);
+emit_16(2212);
+emit_16(2146);
+emit_16(2213);
+emit_16(2147);
+emit_16(2213);
+emit_16(2146);
+emit_16(2213);
+emit_16(2147);
+emit_16(2214);
+emit_16(2148);
+emit_16(2214);
+emit_16(2147);
+emit_16(2214);
+emit_16(2148);
+emit_16(2215);
+emit_16(2149);
+emit_16(2215);
+emit_16(2148);
+emit_16(2215);
+emit_16(2149);
+emit_16(2216);
+emit_16(2150);
+emit_16(2216);
+emit_16(2149);
+emit_16(2216);
+emit_16(2150);
+emit_16(2217);
+emit_16(2151);
+emit_16(2217);
+emit_16(2150);
+emit_16(2217);
+emit_16(2151);
+emit_16(2218);
+emit_16(2152);
+emit_16(2218);
+emit_16(2151);
+emit_16(2218);
+emit_16(2152);
+emit_16(2219);
+emit_16(2153);
+emit_16(2219);
+emit_16(2152);
+emit_16(2219);
+emit_16(2153);
+emit_16(2220);
+emit_16(2154);
+emit_16(2220);
+emit_16(2153);
+emit_16(2220);
+emit_16(2154);
+emit_16(2221);
+emit_16(2155);
+emit_16(2221);
+emit_16(2154);
+emit_16(2221);
+emit_16(2155);
+emit_16(2222);
+emit_16(2156);
+emit_16(2222);
+emit_16(2155);
+emit_16(2222);
+emit_16(2156);
+emit_16(2223);
+emit_16(2157);
+emit_16(2223);
+emit_16(2156);
+emit_16(2223);
+emit_16(2157);
+emit_16(2224);
+emit_16(2158);
+emit_16(2224);
+emit_16(2157);
+emit_16(2224);
+emit_16(2158);
+emit_16(2225);
+emit_16(2159);
+emit_16(2225);
+emit_16(2158);
+emit_16(2225);
+emit_16(2159);
+emit_16(2226);
+emit_16(2160);
+emit_16(2226);
+emit_16(2159);
+emit_16(2226);
+emit_16(2160);
+emit_16(2227);
+emit_16(2161);
+emit_16(2227);
+emit_16(2160);
+emit_16(2227);
+emit_16(2161);
+emit_16(2228);
+emit_16(2162);
+emit_16(2228);
+emit_16(2161);
+emit_16(2228);
+emit_16(2162);
+emit_16(2229);
+emit_16(2163);
+emit_16(2229);
+emit_16(2162);
+emit_16(2229);
+emit_16(2163);
+emit_16(2230);
+emit_16(2164);
+emit_16(2230);
+emit_16(2163);
+emit_16(2230);
+emit_16(2164);
+emit_16(2231);
+emit_16(2165);
+emit_16(2231);
+emit_16(2164);
+emit_16(2231);
+emit_16(2165);
+emit_16(2232);
+emit_16(2166);
+emit_16(2232);
+emit_16(2165);
+emit_16(2232);
+emit_16(2166);
+emit_16(2233);
+emit_16(2167);
+emit_16(2233);
+emit_16(2166);
+emit_16(2233);
+emit_16(2167);
+emit_16(2234);
+emit_16(2168);
+emit_16(2234);
+emit_16(2167);
+emit_16(2234);
+emit_16(2168);
+emit_16(2235);
+emit_16(2169);
+emit_16(2235);
+emit_16(2168);
+emit_16(2235);
+emit_16(2169);
+emit_16(2236);
+emit_16(2170);
+emit_16(2236);
+emit_16(2169);
+emit_16(2236);
+emit_16(2170);
+emit_16(2237);
+emit_16(2171);
+emit_16(2237);
+emit_16(2170);
+emit_16(2237);
+emit_16(2171);
+emit_16(2238);
+emit_16(2172);
+emit_16(2238);
+emit_16(2171);
+emit_16(2238);
+emit_16(2172);
+emit_16(2239);
+emit_16(2173);
+emit_16(2239);
+emit_16(2172);
+emit_16(2239);
+emit_16(2173);
+emit_16(2240);
+emit_16(2174);
+emit_16(2240);
+emit_16(2173);
+emit_16(2240);
+emit_16(2174);
+emit_16(2241);
+emit_16(2175);
+emit_16(2241);
+emit_16(2174);
+emit_16(2241);
+emit_16(2175);
+emit_16(2242);
+emit_16(2176);
+emit_16(2242);
+emit_16(2175);
+emit_16(2242);
+emit_16(2176);
+emit_16(2243);
+emit_16(2177);
+emit_16(2243);
+emit_16(2176);
+emit_start(Landscape06Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(128);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(130);
+emit_16(131);
+emit_16(130);
+emit_16(129);
+emit_16(132);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(133);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(134);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(135);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(136);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(137);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(138);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(139);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(140);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(141);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(142);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(143);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(144);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(145);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(146);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(147);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(148);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(149);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(150);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(151);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(152);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(153);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(154);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(155);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(156);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(157);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(158);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(159);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(160);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(161);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(162);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(163);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(164);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(165);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(166);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(167);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(168);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(169);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(170);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(171);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(172);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(173);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(174);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(175);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(176);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(177);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(178);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(179);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(180);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(181);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(182);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(183);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(184);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(185);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(186);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(187);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(188);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(189);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(190);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(191);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(192);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(193);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(194);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(195);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(196);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(197);
+emit_16(130);
+emit_16(197);
+emit_16(128);
+emit_16(198);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(199);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(200);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(201);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(202);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(203);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(204);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(205);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(206);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(207);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(208);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(209);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(210);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(211);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(212);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(213);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(214);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(215);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(216);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(217);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(218);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(219);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(220);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(221);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(222);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(223);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(224);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(225);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(226);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(227);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(228);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(229);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(230);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(231);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(232);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(233);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(234);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(235);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(236);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(237);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(238);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(239);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(240);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(241);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(242);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(243);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(244);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(245);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(246);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(247);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(248);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(249);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(250);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(251);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(252);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(253);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(254);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(255);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(256);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(257);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(258);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(259);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(260);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(261);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(262);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(263);
+emit_16(197);
+emit_16(263);
+emit_16(196);
+emit_16(264);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(265);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(266);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(267);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(268);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(269);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(270);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(271);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(272);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(273);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(274);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(275);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(276);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(277);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(278);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(279);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(280);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(281);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(282);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(283);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(284);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(285);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(286);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(287);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(288);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(289);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(290);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(291);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(292);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(293);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(294);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(295);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(296);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(297);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(298);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(299);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(300);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(301);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(302);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(303);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(304);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(305);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(306);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(307);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(308);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(309);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(310);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(311);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(312);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(313);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(314);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(315);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(316);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(317);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(318);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(319);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(320);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(321);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(322);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(323);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(324);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(325);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(326);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(327);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(328);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(329);
+emit_16(263);
+emit_16(329);
+emit_16(262);
+emit_16(330);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(331);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(332);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(333);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(334);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(335);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(336);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(337);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(338);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(339);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(340);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(341);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(342);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(343);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(344);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(345);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(346);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(347);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(348);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(349);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(350);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(351);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(352);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(353);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(354);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(355);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(356);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(357);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(358);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(359);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(360);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(361);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(362);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(363);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(364);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(365);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(366);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(367);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(368);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(369);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(370);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(371);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(372);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(373);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(374);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(375);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(376);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(377);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(378);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(379);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(380);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(381);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(382);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(383);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(384);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(385);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(386);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(387);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(388);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(389);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(390);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(391);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(392);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(393);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(394);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(395);
+emit_16(329);
+emit_16(395);
+emit_16(328);
+emit_16(396);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(397);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(398);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(399);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(400);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(401);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(402);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(403);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(404);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(405);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(406);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(407);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(408);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(409);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(410);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(411);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(412);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(413);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(414);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(415);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(416);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(417);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(418);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(419);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(420);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(421);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(422);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(423);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(424);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(425);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(426);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(427);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(428);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(429);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(430);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(431);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(432);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(433);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(434);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(435);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(436);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(437);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(438);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(439);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(440);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(441);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(442);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(443);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(444);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(445);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(446);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(447);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(448);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(449);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(450);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(451);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(452);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(453);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(454);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(455);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(456);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(457);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(458);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(459);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(460);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(461);
+emit_16(395);
+emit_16(461);
+emit_16(394);
+emit_16(462);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(463);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(464);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(465);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(466);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(467);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(468);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(469);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(470);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(471);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(472);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(473);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(474);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(475);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(476);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(477);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(478);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(479);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(480);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(481);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(482);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(483);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(484);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(485);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(486);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(487);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(488);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(489);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(490);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(491);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(492);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(493);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(494);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(495);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(496);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(497);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(498);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(499);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(500);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(501);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(502);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(503);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(504);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(505);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(506);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(507);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(508);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(509);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(510);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(511);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(512);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(513);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(514);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(515);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(516);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(517);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(518);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(519);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(520);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(521);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(522);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(523);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(524);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(525);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(526);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(527);
+emit_16(461);
+emit_16(527);
+emit_16(460);
+emit_16(528);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(529);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(530);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(531);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(532);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(533);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(534);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(535);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(536);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(537);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(538);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(539);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(540);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(541);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(542);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(543);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(544);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(545);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(546);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(547);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(548);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(549);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(550);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(551);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(552);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(553);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(554);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(555);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(556);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(557);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(558);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(559);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(560);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(561);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(562);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(563);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(564);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(565);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(566);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(567);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(568);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(569);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(570);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(571);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(572);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(573);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(574);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(575);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(576);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(577);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(578);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(579);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(580);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(581);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(582);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(583);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(584);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(585);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(586);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(587);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(588);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(589);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(590);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(591);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(592);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(593);
+emit_16(527);
+emit_16(593);
+emit_16(526);
+emit_16(594);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(595);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(596);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(597);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(598);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(599);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(600);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(601);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(602);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(603);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(604);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(605);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(606);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(607);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(608);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(609);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(610);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(611);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(612);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(613);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(614);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(615);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(616);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(617);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(618);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(619);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(620);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(621);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(622);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(623);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(624);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(625);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(626);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(627);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(628);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(629);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(630);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(631);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(632);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(633);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(634);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(635);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(636);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(637);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(638);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(639);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(640);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(641);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(642);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(643);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(644);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(645);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(646);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(647);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(648);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(649);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(650);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(651);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(652);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(653);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(654);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(655);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(656);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(657);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(658);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(659);
+emit_16(593);
+emit_16(659);
+emit_16(592);
+emit_16(660);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(661);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(662);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(663);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(664);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(665);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(666);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(667);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(668);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(669);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(670);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(671);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(672);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(673);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(674);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(675);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(676);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(677);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(678);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(679);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(680);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(681);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(682);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(683);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(684);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(685);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(686);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(687);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(688);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(689);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(690);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(691);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(692);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(693);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(694);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(695);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(696);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(697);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(698);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(699);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(700);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(701);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(702);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(703);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(704);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(705);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(706);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(707);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(708);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(709);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(710);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(711);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(712);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(713);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(714);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(715);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(716);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(717);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(718);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(719);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(720);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(721);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(722);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(723);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(724);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(725);
+emit_16(659);
+emit_16(725);
+emit_16(658);
+emit_16(726);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(727);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(728);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(729);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(730);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(731);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(732);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(733);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(734);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(735);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(736);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(737);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(738);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(739);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(740);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(741);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(742);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(743);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(744);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(745);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(746);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(747);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(748);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(749);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(750);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(751);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(752);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(753);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(754);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(755);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(756);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(757);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(758);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(759);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(760);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(761);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(762);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(763);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(764);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(765);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(766);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(767);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(768);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(769);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(770);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(771);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(772);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(773);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(774);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(775);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(776);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(777);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(778);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(779);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(780);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(781);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(782);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(783);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(784);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(785);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(786);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(787);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(788);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(789);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(790);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(791);
+emit_16(725);
+emit_16(791);
+emit_16(724);
+emit_16(792);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(793);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(794);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(795);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(796);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(797);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(798);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(799);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(800);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(801);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(802);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(803);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(804);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(805);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(806);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(807);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(808);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(809);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(810);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(811);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(812);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(813);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(814);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(815);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(816);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(817);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(818);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(819);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(820);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(821);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(822);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(823);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(824);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(825);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(826);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(827);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(828);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(829);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(830);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(831);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(832);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(833);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(834);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(835);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(836);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(837);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(838);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(839);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(840);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(841);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(842);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(843);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(844);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(845);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(846);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(847);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(848);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(849);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(850);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(851);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(852);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(853);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(854);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(855);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(856);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(857);
+emit_16(791);
+emit_16(857);
+emit_16(790);
+emit_16(858);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(859);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(860);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(861);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(862);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(863);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(864);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(865);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(866);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(867);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(868);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(869);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(870);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(871);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(872);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(873);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(874);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(875);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(876);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(877);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(878);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(879);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(880);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(881);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(882);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(883);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(884);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(885);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(886);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(887);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(888);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(889);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(890);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(891);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(892);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(893);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(894);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(895);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(896);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(897);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(898);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(899);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(900);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(901);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(902);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(903);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(904);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(905);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(906);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(907);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(908);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(909);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(910);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(911);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(912);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(913);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(914);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(915);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(916);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(917);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(918);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(919);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(920);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(921);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(922);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(923);
+emit_16(857);
+emit_16(923);
+emit_16(856);
+emit_16(924);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(925);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(926);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(927);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(928);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(929);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(930);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(931);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(932);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(933);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(934);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(935);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(936);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(937);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(938);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(939);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(940);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(941);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(942);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(943);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(944);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(945);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(946);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(947);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(948);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(949);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(950);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(951);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(952);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(953);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(954);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(955);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(956);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(957);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(958);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(959);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(960);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(961);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(962);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(963);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(964);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(965);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(966);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(967);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(968);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(969);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(970);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(971);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(972);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(973);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(974);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(975);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(976);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(977);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(978);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(979);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(980);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(981);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(982);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(983);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(984);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(985);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(986);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(987);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(988);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(989);
+emit_16(923);
+emit_16(989);
+emit_16(922);
+emit_16(990);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(991);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(992);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(993);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(994);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(995);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(996);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(997);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(998);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(999);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1000);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1001);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1002);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1003);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1004);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1005);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1006);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1007);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1008);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1009);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1010);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1011);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1012);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1013);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1014);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1015);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1016);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1017);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1018);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1019);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1020);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1021);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1022);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1023);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1024);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1025);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1026);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1027);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1028);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1029);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1030);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1031);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1032);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1033);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1034);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1035);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1036);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1037);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1038);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1039);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1040);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1041);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1042);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1043);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1044);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1045);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1046);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1047);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1048);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1049);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1050);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1051);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1052);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1053);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1054);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1055);
+emit_16(989);
+emit_16(1055);
+emit_16(988);
+emit_16(1056);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1057);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1058);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1059);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1060);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1061);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1062);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1063);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1064);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1065);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1066);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1067);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1068);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1069);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1070);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1071);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1072);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1073);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1074);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1075);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1076);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1077);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1078);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1079);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1080);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1081);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1082);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1083);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1084);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1085);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1086);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1087);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1088);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1089);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1090);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1091);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1092);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1093);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1094);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1095);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1096);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1097);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1098);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1099);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1100);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1101);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1102);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1103);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1104);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1105);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1106);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1107);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1108);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1109);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1110);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1111);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1112);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1113);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1114);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1115);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1116);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1117);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1118);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1119);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1120);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1121);
+emit_16(1055);
+emit_16(1121);
+emit_16(1054);
+emit_16(1122);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1123);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1124);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1125);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1126);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1127);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1128);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1129);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1130);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1131);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1132);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1133);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1134);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1135);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1136);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1137);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1138);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1139);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1140);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1141);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1142);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1143);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1144);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1145);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1146);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1147);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1148);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1149);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1150);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1151);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1152);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1153);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1154);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1155);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1156);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1157);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1158);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1159);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1160);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1161);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1162);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1163);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1164);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1165);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1166);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1167);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1168);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1169);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1170);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1171);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1172);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1173);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1174);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1175);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1176);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1177);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1178);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1179);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1180);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1181);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1182);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1183);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1184);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1185);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1186);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1187);
+emit_16(1121);
+emit_16(1187);
+emit_16(1120);
+emit_16(1188);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1189);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1190);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1191);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1192);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1193);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1194);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1195);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1196);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1197);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1198);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1199);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1200);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1201);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1202);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1203);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1204);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1205);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1206);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1207);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1208);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1209);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1210);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1211);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1212);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1213);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1214);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1215);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1216);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1217);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1218);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1219);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1220);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1221);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1222);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1223);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1224);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1225);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1226);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1227);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1228);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1229);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1230);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1231);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1232);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1233);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1234);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1235);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1236);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1237);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1238);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1239);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1240);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1241);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1242);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1243);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1244);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1245);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1246);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1247);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1248);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1249);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1250);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1251);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1252);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1253);
+emit_16(1187);
+emit_16(1253);
+emit_16(1186);
+emit_16(1254);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1255);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1256);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1257);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1258);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1259);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1260);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1261);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1262);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1263);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1264);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1265);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1266);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1267);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1268);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1269);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1270);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1271);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1272);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1273);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1274);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1275);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1276);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1277);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1278);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1279);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1280);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1281);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1282);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1283);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1284);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1285);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1286);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1287);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1288);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1289);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1290);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1291);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1292);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1293);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1294);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1295);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1296);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1297);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1298);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1299);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1300);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1301);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1302);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1303);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1304);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1305);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1306);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1307);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1308);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1309);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1310);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1311);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1312);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1313);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1314);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1315);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1316);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1317);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1318);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1319);
+emit_16(1253);
+emit_16(1319);
+emit_16(1252);
+emit_16(1320);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1321);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1322);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1323);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1324);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1325);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1326);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1327);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1328);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1329);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1330);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1331);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1332);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1333);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1334);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1335);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1336);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1337);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1338);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1339);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1340);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1341);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1342);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1343);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1344);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1345);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1346);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1347);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1348);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1349);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1350);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1351);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1352);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1353);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1354);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1355);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1356);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1357);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1358);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1359);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1360);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1361);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1362);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1363);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1364);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1365);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1366);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1367);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1368);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1369);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1370);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1371);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1372);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1373);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1374);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1375);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1376);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1377);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1378);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1379);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1380);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1381);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1382);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1383);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1384);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1385);
+emit_16(1319);
+emit_16(1385);
+emit_16(1318);
+emit_16(1386);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1387);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1388);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1389);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1390);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1391);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1392);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1393);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1394);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1395);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1396);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1397);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1398);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1399);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1400);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1401);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1402);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1403);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1404);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1405);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1406);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1407);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1408);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1409);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1410);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1411);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1412);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1413);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1414);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1415);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1416);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1417);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1418);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1419);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1420);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1421);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1422);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1423);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1424);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1425);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1426);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1427);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1428);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1429);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1430);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1431);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1432);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1433);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1434);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1435);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1436);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1437);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1438);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1439);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1440);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1441);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1442);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1443);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1444);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1445);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1446);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1447);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1448);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1449);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1450);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1451);
+emit_16(1385);
+emit_16(1451);
+emit_16(1384);
+emit_16(1452);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1453);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1454);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1455);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1456);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1457);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1458);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1459);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1460);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1461);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1462);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1463);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1464);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1465);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1466);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1467);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1468);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1469);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1470);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1471);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1472);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1473);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1474);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1475);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1476);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1477);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1478);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1479);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1480);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1481);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1482);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1483);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1484);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1485);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1486);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1487);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1488);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1489);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1490);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1491);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1492);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1493);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1494);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1495);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1496);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1497);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1498);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1499);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1500);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1501);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1502);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1503);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1504);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1505);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1506);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1507);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1508);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1509);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1510);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1511);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1512);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1513);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1514);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1515);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1516);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1517);
+emit_16(1451);
+emit_16(1517);
+emit_16(1450);
+emit_16(1518);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1519);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1520);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1521);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1522);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1523);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1524);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1525);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1526);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1527);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1528);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1529);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1530);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1531);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1532);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1533);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1534);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1535);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1536);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1537);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1538);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1539);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1540);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1541);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1542);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1543);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1544);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1545);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1546);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1547);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1548);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1549);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1550);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1551);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1552);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1553);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1554);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1555);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1556);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1557);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1558);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1559);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1560);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1561);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1562);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1563);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1564);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1565);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1566);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1567);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1568);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1569);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1570);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1571);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1572);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1573);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1574);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1575);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1576);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1577);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1578);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1579);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1580);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1581);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1582);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1583);
+emit_16(1517);
+emit_16(1583);
+emit_16(1516);
+emit_16(1584);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1585);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1586);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1587);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1588);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1589);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1590);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1591);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1592);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1593);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1594);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1595);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1596);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1597);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1598);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1599);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1600);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1601);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1602);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1603);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1604);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1605);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1606);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1607);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1608);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1609);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1610);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1611);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1612);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1613);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1614);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1615);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1616);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1617);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1618);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1619);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1620);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1621);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1622);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1623);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1624);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1625);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1626);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1627);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1628);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1629);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1630);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1631);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1632);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1633);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1634);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1635);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1636);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1637);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1638);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1639);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1640);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1641);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1642);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1643);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1644);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1645);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1646);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1647);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1648);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1649);
+emit_16(1583);
+emit_16(1649);
+emit_16(1582);
+emit_16(1650);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1651);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1652);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1653);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1654);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1655);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1656);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1657);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1658);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1659);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1660);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1661);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1662);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1663);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1664);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1665);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1666);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1667);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1668);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1669);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1670);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1671);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1672);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1673);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1674);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1675);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1676);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1677);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1678);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1679);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1680);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1681);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1682);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1683);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1684);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1685);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1686);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1687);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1688);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1689);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1690);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1691);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1692);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1693);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1694);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1695);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1696);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1697);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1698);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1699);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1700);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1701);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1702);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1703);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1704);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1705);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1706);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1707);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1708);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1709);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1710);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1711);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1712);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1713);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1714);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1715);
+emit_16(1649);
+emit_16(1715);
+emit_16(1648);
+emit_16(1716);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1717);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1718);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1719);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1720);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1721);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1722);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1723);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1724);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1725);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1726);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1727);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1728);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1729);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1730);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1731);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1732);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1733);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1734);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1735);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1736);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1737);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1738);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1739);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1740);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1741);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1742);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1743);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1744);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1745);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1746);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1747);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1748);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1749);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1750);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1751);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1752);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1753);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1754);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1755);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1756);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1757);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1758);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1759);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1760);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1761);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1762);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1763);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1764);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1765);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1766);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1767);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1768);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1769);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1770);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1771);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1772);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1773);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1774);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1775);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1776);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1777);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1778);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1779);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1780);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1781);
+emit_16(1715);
+emit_16(1781);
+emit_16(1714);
+emit_16(1782);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1783);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1784);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1785);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1786);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1787);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1788);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1789);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1790);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1791);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1792);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1793);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1794);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1795);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1796);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1797);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1798);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1799);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1800);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1801);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1802);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1803);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1804);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1805);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1806);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1807);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1808);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1809);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1810);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1811);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1812);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1813);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1814);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1815);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1816);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1817);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1818);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1819);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1820);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1821);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1822);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1823);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1824);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1825);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1826);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1827);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1828);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1829);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1830);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1831);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1832);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1833);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1834);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1835);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1836);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1837);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1838);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1839);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1840);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1841);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1842);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1843);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1844);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1845);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1846);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1847);
+emit_16(1781);
+emit_16(1847);
+emit_16(1780);
+emit_16(1848);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1849);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1850);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1851);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1852);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1853);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1854);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1855);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1856);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1857);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1858);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1859);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1860);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1861);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1862);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1863);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1864);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1865);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1866);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1867);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1868);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1869);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1870);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1871);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1872);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1873);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1874);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1875);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1876);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1877);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1878);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1879);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1880);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1881);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1882);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1883);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1884);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1885);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1886);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1887);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1888);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1889);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1890);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1891);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1892);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1893);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1894);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1895);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1896);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1897);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1898);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1899);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1900);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1901);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1902);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1903);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1904);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1905);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1906);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1907);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1908);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1909);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1910);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1911);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1912);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1913);
+emit_16(1847);
+emit_16(1913);
+emit_16(1846);
+emit_16(1914);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1915);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1916);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1917);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1918);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1919);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1920);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1921);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1922);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1923);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1924);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1925);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1926);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1927);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1928);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1929);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1930);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1931);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1932);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1933);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1934);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1935);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1936);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1937);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1938);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1939);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1940);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1941);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1942);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1943);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1944);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1945);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1946);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1947);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1948);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1949);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1950);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1951);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1952);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1953);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1954);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1955);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1956);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1957);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1958);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1959);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1960);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1961);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1962);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1963);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1964);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1965);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1966);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1967);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1968);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1969);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1970);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1971);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1972);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1973);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1974);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1975);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1976);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1977);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1978);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1979);
+emit_16(1913);
+emit_16(1979);
+emit_16(1912);
+emit_16(1980);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1981);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1982);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1983);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1984);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1985);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1986);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1987);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1988);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1989);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1990);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1991);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1992);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1993);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1994);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1995);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1996);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1997);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1998);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(1999);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2000);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2001);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2002);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2003);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2004);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2005);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2006);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2007);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2008);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2009);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2010);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2011);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2012);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2013);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2014);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2015);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2016);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2017);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2018);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2019);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2020);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2021);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2022);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2023);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2024);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2025);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2026);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2027);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2028);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2029);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2030);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2031);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2032);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2033);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2034);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2035);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2036);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2037);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2038);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2039);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2040);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2041);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2042);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2043);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2044);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2045);
+emit_16(1979);
+emit_16(2045);
+emit_16(1978);
+emit_16(2046);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2047);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2048);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2049);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2050);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2051);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2052);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2053);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2054);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2055);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2056);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2057);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2058);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2059);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2060);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2061);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2062);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2063);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2064);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2065);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2066);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2067);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2068);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2069);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2070);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2071);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2072);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2073);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2074);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2075);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2076);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2077);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2078);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2079);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2080);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2081);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2082);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2083);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2084);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2085);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2086);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2087);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2088);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2089);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2090);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2091);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2092);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2093);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2094);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2095);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2096);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2097);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2098);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2099);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2100);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2101);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2102);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2103);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2104);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2105);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2106);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2107);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2108);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2109);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2110);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2111);
+emit_16(2045);
+emit_16(2111);
+emit_16(2044);
+emit_16(2112);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2113);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2114);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2115);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2116);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2117);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2118);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2119);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2120);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2121);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2122);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2123);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2124);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2125);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2126);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2127);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2128);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2129);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2130);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2131);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2132);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2133);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2134);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2135);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2136);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2137);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2138);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2139);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2140);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2141);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2142);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2143);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2144);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2145);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2146);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2147);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2148);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2149);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2150);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2151);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2152);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2153);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2154);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2155);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2156);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2157);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2158);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2159);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2160);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2161);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2162);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2163);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2164);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2165);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2166);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2167);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2168);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2169);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2170);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2171);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2172);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2173);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2174);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2175);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2176);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2177);
+emit_16(2111);
+emit_16(2177);
+emit_16(2110);
+emit_16(2178);
+emit_16(2112);
+emit_16(2179);
+emit_16(2113);
+emit_16(2179);
+emit_16(2112);
+emit_16(2179);
+emit_16(2113);
+emit_16(2180);
+emit_16(2114);
+emit_16(2180);
+emit_16(2113);
+emit_16(2180);
+emit_16(2114);
+emit_16(2181);
+emit_16(2115);
+emit_16(2181);
+emit_16(2114);
+emit_16(2181);
+emit_16(2115);
+emit_16(2182);
+emit_16(2116);
+emit_16(2182);
+emit_16(2115);
+emit_16(2182);
+emit_16(2116);
+emit_16(2183);
+emit_16(2117);
+emit_16(2183);
+emit_16(2116);
+emit_16(2183);
+emit_16(2117);
+emit_16(2184);
+emit_16(2118);
+emit_16(2184);
+emit_16(2117);
+emit_16(2184);
+emit_16(2118);
+emit_16(2185);
+emit_16(2119);
+emit_16(2185);
+emit_16(2118);
+emit_16(2185);
+emit_16(2119);
+emit_16(2186);
+emit_16(2120);
+emit_16(2186);
+emit_16(2119);
+emit_16(2186);
+emit_16(2120);
+emit_16(2187);
+emit_16(2121);
+emit_16(2187);
+emit_16(2120);
+emit_16(2187);
+emit_16(2121);
+emit_16(2188);
+emit_16(2122);
+emit_16(2188);
+emit_16(2121);
+emit_16(2188);
+emit_16(2122);
+emit_16(2189);
+emit_16(2123);
+emit_16(2189);
+emit_16(2122);
+emit_16(2189);
+emit_16(2123);
+emit_16(2190);
+emit_16(2124);
+emit_16(2190);
+emit_16(2123);
+emit_16(2190);
+emit_16(2124);
+emit_16(2191);
+emit_16(2125);
+emit_16(2191);
+emit_16(2124);
+emit_16(2191);
+emit_16(2125);
+emit_16(2192);
+emit_16(2126);
+emit_16(2192);
+emit_16(2125);
+emit_16(2192);
+emit_16(2126);
+emit_16(2193);
+emit_16(2127);
+emit_16(2193);
+emit_16(2126);
+emit_16(2193);
+emit_16(2127);
+emit_16(2194);
+emit_16(2128);
+emit_16(2194);
+emit_16(2127);
+emit_16(2194);
+emit_16(2128);
+emit_16(2195);
+emit_16(2129);
+emit_16(2195);
+emit_16(2128);
+emit_16(2195);
+emit_16(2129);
+emit_16(2196);
+emit_16(2130);
+emit_16(2196);
+emit_16(2129);
+emit_16(2196);
+emit_16(2130);
+emit_16(2197);
+emit_16(2131);
+emit_16(2197);
+emit_16(2130);
+emit_16(2197);
+emit_16(2131);
+emit_16(2198);
+emit_16(2132);
+emit_16(2198);
+emit_16(2131);
+emit_16(2198);
+emit_16(2132);
+emit_16(2199);
+emit_16(2133);
+emit_16(2199);
+emit_16(2132);
+emit_16(2199);
+emit_16(2133);
+emit_16(2200);
+emit_16(2134);
+emit_16(2200);
+emit_16(2133);
+emit_16(2200);
+emit_16(2134);
+emit_16(2201);
+emit_16(2135);
+emit_16(2201);
+emit_16(2134);
+emit_16(2201);
+emit_16(2135);
+emit_16(2202);
+emit_16(2136);
+emit_16(2202);
+emit_16(2135);
+emit_16(2202);
+emit_16(2136);
+emit_16(2203);
+emit_16(2137);
+emit_16(2203);
+emit_16(2136);
+emit_16(2203);
+emit_16(2137);
+emit_16(2204);
+emit_16(2138);
+emit_16(2204);
+emit_16(2137);
+emit_16(2204);
+emit_16(2138);
+emit_16(2205);
+emit_16(2139);
+emit_16(2205);
+emit_16(2138);
+emit_16(2205);
+emit_16(2139);
+emit_16(2206);
+emit_16(2140);
+emit_16(2206);
+emit_16(2139);
+emit_16(2206);
+emit_16(2140);
+emit_16(2207);
+emit_16(2141);
+emit_16(2207);
+emit_16(2140);
+emit_16(2207);
+emit_16(2141);
+emit_16(2208);
+emit_16(2142);
+emit_16(2208);
+emit_16(2141);
+emit_16(2208);
+emit_16(2142);
+emit_16(2209);
+emit_16(2143);
+emit_16(2209);
+emit_16(2142);
+emit_16(2209);
+emit_16(2143);
+emit_16(2210);
+emit_16(2144);
+emit_16(2210);
+emit_16(2143);
+emit_16(2210);
+emit_16(2144);
+emit_16(2211);
+emit_16(2145);
+emit_16(2211);
+emit_16(2144);
+emit_16(2211);
+emit_16(2145);
+emit_16(2212);
+emit_16(2146);
+emit_16(2212);
+emit_16(2145);
+emit_16(2212);
+emit_16(2146);
+emit_16(2213);
+emit_16(2147);
+emit_16(2213);
+emit_16(2146);
+emit_16(2213);
+emit_16(2147);
+emit_16(2214);
+emit_16(2148);
+emit_16(2214);
+emit_16(2147);
+emit_16(2214);
+emit_16(2148);
+emit_16(2215);
+emit_16(2149);
+emit_16(2215);
+emit_16(2148);
+emit_16(2215);
+emit_16(2149);
+emit_16(2216);
+emit_16(2150);
+emit_16(2216);
+emit_16(2149);
+emit_16(2216);
+emit_16(2150);
+emit_16(2217);
+emit_16(2151);
+emit_16(2217);
+emit_16(2150);
+emit_16(2217);
+emit_16(2151);
+emit_16(2218);
+emit_16(2152);
+emit_16(2218);
+emit_16(2151);
+emit_16(2218);
+emit_16(2152);
+emit_16(2219);
+emit_16(2153);
+emit_16(2219);
+emit_16(2152);
+emit_16(2219);
+emit_16(2153);
+emit_16(2220);
+emit_16(2154);
+emit_16(2220);
+emit_16(2153);
+emit_16(2220);
+emit_16(2154);
+emit_16(2221);
+emit_16(2155);
+emit_16(2221);
+emit_16(2154);
+emit_16(2221);
+emit_16(2155);
+emit_16(2222);
+emit_16(2156);
+emit_16(2222);
+emit_16(2155);
+emit_16(2222);
+emit_16(2156);
+emit_16(2223);
+emit_16(2157);
+emit_16(2223);
+emit_16(2156);
+emit_16(2223);
+emit_16(2157);
+emit_16(2224);
+emit_16(2158);
+emit_16(2224);
+emit_16(2157);
+emit_16(2224);
+emit_16(2158);
+emit_16(2225);
+emit_16(2159);
+emit_16(2225);
+emit_16(2158);
+emit_16(2225);
+emit_16(2159);
+emit_16(2226);
+emit_16(2160);
+emit_16(2226);
+emit_16(2159);
+emit_16(2226);
+emit_16(2160);
+emit_16(2227);
+emit_16(2161);
+emit_16(2227);
+emit_16(2160);
+emit_16(2227);
+emit_16(2161);
+emit_16(2228);
+emit_16(2162);
+emit_16(2228);
+emit_16(2161);
+emit_16(2228);
+emit_16(2162);
+emit_16(2229);
+emit_16(2163);
+emit_16(2229);
+emit_16(2162);
+emit_16(2229);
+emit_16(2163);
+emit_16(2230);
+emit_16(2164);
+emit_16(2230);
+emit_16(2163);
+emit_16(2230);
+emit_16(2164);
+emit_16(2231);
+emit_16(2165);
+emit_16(2231);
+emit_16(2164);
+emit_16(2231);
+emit_16(2165);
+emit_16(2232);
+emit_16(2166);
+emit_16(2232);
+emit_16(2165);
+emit_16(2232);
+emit_16(2166);
+emit_16(2233);
+emit_16(2167);
+emit_16(2233);
+emit_16(2166);
+emit_16(2233);
+emit_16(2167);
+emit_16(2234);
+emit_16(2168);
+emit_16(2234);
+emit_16(2167);
+emit_16(2234);
+emit_16(2168);
+emit_16(2235);
+emit_16(2169);
+emit_16(2235);
+emit_16(2168);
+emit_16(2235);
+emit_16(2169);
+emit_16(2236);
+emit_16(2170);
+emit_16(2236);
+emit_16(2169);
+emit_16(2236);
+emit_16(2170);
+emit_16(2237);
+emit_16(2171);
+emit_16(2237);
+emit_16(2170);
+emit_16(2237);
+emit_16(2171);
+emit_16(2238);
+emit_16(2172);
+emit_16(2238);
+emit_16(2171);
+emit_16(2238);
+emit_16(2172);
+emit_16(2239);
+emit_16(2173);
+emit_16(2239);
+emit_16(2172);
+emit_16(2239);
+emit_16(2173);
+emit_16(2240);
+emit_16(2174);
+emit_16(2240);
+emit_16(2173);
+emit_16(2240);
+emit_16(2174);
+emit_16(2241);
+emit_16(2175);
+emit_16(2241);
+emit_16(2174);
+emit_16(2241);
+emit_16(2175);
+emit_16(2242);
+emit_16(2176);
+emit_16(2242);
+emit_16(2175);
+emit_16(2242);
+emit_16(2176);
+emit_16(2243);
+emit_16(2177);
+emit_16(2243);
+emit_16(2176);
+emit_16(2244);
+emit_16(2178);
+emit_16(2245);
+emit_16(2179);
+emit_16(2245);
+emit_16(2178);
+emit_16(2245);
+emit_16(2179);
+emit_16(2246);
+emit_16(2180);
+emit_16(2246);
+emit_16(2179);
+emit_16(2246);
+emit_16(2180);
+emit_16(2247);
+emit_16(2181);
+emit_16(2247);
+emit_16(2180);
+emit_16(2247);
+emit_16(2181);
+emit_16(2248);
+emit_16(2182);
+emit_16(2248);
+emit_16(2181);
+emit_16(2248);
+emit_16(2182);
+emit_16(2249);
+emit_16(2183);
+emit_16(2249);
+emit_16(2182);
+emit_16(2249);
+emit_16(2183);
+emit_16(2250);
+emit_16(2184);
+emit_16(2250);
+emit_16(2183);
+emit_16(2250);
+emit_16(2184);
+emit_16(2251);
+emit_16(2185);
+emit_16(2251);
+emit_16(2184);
+emit_16(2251);
+emit_16(2185);
+emit_16(2252);
+emit_16(2186);
+emit_16(2252);
+emit_16(2185);
+emit_16(2252);
+emit_16(2186);
+emit_16(2253);
+emit_16(2187);
+emit_16(2253);
+emit_16(2186);
+emit_16(2253);
+emit_16(2187);
+emit_16(2254);
+emit_16(2188);
+emit_16(2254);
+emit_16(2187);
+emit_16(2254);
+emit_16(2188);
+emit_16(2255);
+emit_16(2189);
+emit_16(2255);
+emit_16(2188);
+emit_16(2255);
+emit_16(2189);
+emit_16(2256);
+emit_16(2190);
+emit_16(2256);
+emit_16(2189);
+emit_16(2256);
+emit_16(2190);
+emit_16(2257);
+emit_16(2191);
+emit_16(2257);
+emit_16(2190);
+emit_16(2257);
+emit_16(2191);
+emit_16(2258);
+emit_16(2192);
+emit_16(2258);
+emit_16(2191);
+emit_16(2258);
+emit_16(2192);
+emit_16(2259);
+emit_16(2193);
+emit_16(2259);
+emit_16(2192);
+emit_16(2259);
+emit_16(2193);
+emit_16(2260);
+emit_16(2194);
+emit_16(2260);
+emit_16(2193);
+emit_16(2260);
+emit_16(2194);
+emit_16(2261);
+emit_16(2195);
+emit_16(2261);
+emit_16(2194);
+emit_16(2261);
+emit_16(2195);
+emit_16(2262);
+emit_16(2196);
+emit_16(2262);
+emit_16(2195);
+emit_16(2262);
+emit_16(2196);
+emit_16(2263);
+emit_16(2197);
+emit_16(2263);
+emit_16(2196);
+emit_16(2263);
+emit_16(2197);
+emit_16(2264);
+emit_16(2198);
+emit_16(2264);
+emit_16(2197);
+emit_16(2264);
+emit_16(2198);
+emit_16(2265);
+emit_16(2199);
+emit_16(2265);
+emit_16(2198);
+emit_16(2265);
+emit_16(2199);
+emit_16(2266);
+emit_16(2200);
+emit_16(2266);
+emit_16(2199);
+emit_16(2266);
+emit_16(2200);
+emit_16(2267);
+emit_16(2201);
+emit_16(2267);
+emit_16(2200);
+emit_16(2267);
+emit_16(2201);
+emit_16(2268);
+emit_16(2202);
+emit_16(2268);
+emit_16(2201);
+emit_16(2268);
+emit_16(2202);
+emit_16(2269);
+emit_16(2203);
+emit_16(2269);
+emit_16(2202);
+emit_16(2269);
+emit_16(2203);
+emit_16(2270);
+emit_16(2204);
+emit_16(2270);
+emit_16(2203);
+emit_16(2270);
+emit_16(2204);
+emit_16(2271);
+emit_16(2205);
+emit_16(2271);
+emit_16(2204);
+emit_16(2271);
+emit_16(2205);
+emit_16(2272);
+emit_16(2206);
+emit_16(2272);
+emit_16(2205);
+emit_16(2272);
+emit_16(2206);
+emit_16(2273);
+emit_16(2207);
+emit_16(2273);
+emit_16(2206);
+emit_16(2273);
+emit_16(2207);
+emit_16(2274);
+emit_16(2208);
+emit_16(2274);
+emit_16(2207);
+emit_16(2274);
+emit_16(2208);
+emit_16(2275);
+emit_16(2209);
+emit_16(2275);
+emit_16(2208);
+emit_16(2275);
+emit_16(2209);
+emit_16(2276);
+emit_16(2210);
+emit_16(2276);
+emit_16(2209);
+emit_16(2276);
+emit_16(2210);
+emit_16(2277);
+emit_16(2211);
+emit_16(2277);
+emit_16(2210);
+emit_16(2277);
+emit_16(2211);
+emit_16(2278);
+emit_16(2212);
+emit_16(2278);
+emit_16(2211);
+emit_16(2278);
+emit_16(2212);
+emit_16(2279);
+emit_16(2213);
+emit_16(2279);
+emit_16(2212);
+emit_16(2279);
+emit_16(2213);
+emit_16(2280);
+emit_16(2214);
+emit_16(2280);
+emit_16(2213);
+emit_16(2280);
+emit_16(2214);
+emit_16(2281);
+emit_16(2215);
+emit_16(2281);
+emit_16(2214);
+emit_16(2281);
+emit_16(2215);
+emit_16(2282);
+emit_16(2216);
+emit_16(2282);
+emit_16(2215);
+emit_16(2282);
+emit_16(2216);
+emit_16(2283);
+emit_16(2217);
+emit_16(2283);
+emit_16(2216);
+emit_16(2283);
+emit_16(2217);
+emit_16(2284);
+emit_16(2218);
+emit_16(2284);
+emit_16(2217);
+emit_16(2284);
+emit_16(2218);
+emit_16(2285);
+emit_16(2219);
+emit_16(2285);
+emit_16(2218);
+emit_16(2285);
+emit_16(2219);
+emit_16(2286);
+emit_16(2220);
+emit_16(2286);
+emit_16(2219);
+emit_16(2286);
+emit_16(2220);
+emit_16(2287);
+emit_16(2221);
+emit_16(2287);
+emit_16(2220);
+emit_16(2287);
+emit_16(2221);
+emit_16(2288);
+emit_16(2222);
+emit_16(2288);
+emit_16(2221);
+emit_16(2288);
+emit_16(2222);
+emit_16(2289);
+emit_16(2223);
+emit_16(2289);
+emit_16(2222);
+emit_16(2289);
+emit_16(2223);
+emit_16(2290);
+emit_16(2224);
+emit_16(2290);
+emit_16(2223);
+emit_16(2290);
+emit_16(2224);
+emit_16(2291);
+emit_16(2225);
+emit_16(2291);
+emit_16(2224);
+emit_16(2291);
+emit_16(2225);
+emit_16(2292);
+emit_16(2226);
+emit_16(2292);
+emit_16(2225);
+emit_16(2292);
+emit_16(2226);
+emit_16(2293);
+emit_16(2227);
+emit_16(2293);
+emit_16(2226);
+emit_16(2293);
+emit_16(2227);
+emit_16(2294);
+emit_16(2228);
+emit_16(2294);
+emit_16(2227);
+emit_16(2294);
+emit_16(2228);
+emit_16(2295);
+emit_16(2229);
+emit_16(2295);
+emit_16(2228);
+emit_16(2295);
+emit_16(2229);
+emit_16(2296);
+emit_16(2230);
+emit_16(2296);
+emit_16(2229);
+emit_16(2296);
+emit_16(2230);
+emit_16(2297);
+emit_16(2231);
+emit_16(2297);
+emit_16(2230);
+emit_16(2297);
+emit_16(2231);
+emit_16(2298);
+emit_16(2232);
+emit_16(2298);
+emit_16(2231);
+emit_16(2298);
+emit_16(2232);
+emit_16(2299);
+emit_16(2233);
+emit_16(2299);
+emit_16(2232);
+emit_16(2299);
+emit_16(2233);
+emit_16(2300);
+emit_16(2234);
+emit_16(2300);
+emit_16(2233);
+emit_16(2300);
+emit_16(2234);
+emit_16(2301);
+emit_16(2235);
+emit_16(2301);
+emit_16(2234);
+emit_16(2301);
+emit_16(2235);
+emit_16(2302);
+emit_16(2236);
+emit_16(2302);
+emit_16(2235);
+emit_16(2302);
+emit_16(2236);
+emit_16(2303);
+emit_16(2237);
+emit_16(2303);
+emit_16(2236);
+emit_16(2303);
+emit_16(2237);
+emit_16(2304);
+emit_16(2238);
+emit_16(2304);
+emit_16(2237);
+emit_16(2304);
+emit_16(2238);
+emit_16(2305);
+emit_16(2239);
+emit_16(2305);
+emit_16(2238);
+emit_16(2305);
+emit_16(2239);
+emit_16(2306);
+emit_16(2240);
+emit_16(2306);
+emit_16(2239);
+emit_16(2306);
+emit_16(2240);
+emit_16(2307);
+emit_16(2241);
+emit_16(2307);
+emit_16(2240);
+emit_16(2307);
+emit_16(2241);
+emit_16(2308);
+emit_16(2242);
+emit_16(2308);
+emit_16(2241);
+emit_16(2308);
+emit_16(2242);
+emit_16(2309);
+emit_16(2243);
+emit_16(2309);
+emit_16(2242);
+emit_start(Landscape07Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(128);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(129);
+emit_16(0);
+emit_16(129);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(130);
+emit_16(2);
+emit_16(130);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(131);
+emit_16(4);
+emit_16(131);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(132);
+emit_16(6);
+emit_16(132);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(133);
+emit_16(8);
+emit_16(133);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(134);
+emit_16(10);
+emit_16(134);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(135);
+emit_16(12);
+emit_16(135);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(136);
+emit_16(14);
+emit_16(136);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(137);
+emit_16(16);
+emit_16(137);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(138);
+emit_16(18);
+emit_16(138);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(139);
+emit_16(20);
+emit_16(139);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(140);
+emit_16(22);
+emit_16(140);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(141);
+emit_16(24);
+emit_16(141);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(142);
+emit_16(26);
+emit_16(142);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(143);
+emit_16(28);
+emit_16(143);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(144);
+emit_16(30);
+emit_16(144);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(145);
+emit_16(32);
+emit_16(145);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(146);
+emit_16(34);
+emit_16(146);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(147);
+emit_16(36);
+emit_16(147);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(148);
+emit_16(38);
+emit_16(148);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(149);
+emit_16(40);
+emit_16(149);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(150);
+emit_16(42);
+emit_16(150);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(151);
+emit_16(44);
+emit_16(151);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(152);
+emit_16(46);
+emit_16(152);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(153);
+emit_16(48);
+emit_16(153);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(154);
+emit_16(50);
+emit_16(154);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(155);
+emit_16(52);
+emit_16(155);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(156);
+emit_16(54);
+emit_16(156);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(157);
+emit_16(56);
+emit_16(157);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(158);
+emit_16(58);
+emit_16(158);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(159);
+emit_16(60);
+emit_16(159);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(160);
+emit_16(62);
+emit_16(160);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(161);
+emit_16(64);
+emit_16(161);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(162);
+emit_16(66);
+emit_16(162);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(163);
+emit_16(68);
+emit_16(163);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(164);
+emit_16(70);
+emit_16(164);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(165);
+emit_16(72);
+emit_16(165);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(166);
+emit_16(74);
+emit_16(166);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(167);
+emit_16(76);
+emit_16(167);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(168);
+emit_16(78);
+emit_16(168);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(169);
+emit_16(80);
+emit_16(169);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(170);
+emit_16(82);
+emit_16(170);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(171);
+emit_16(84);
+emit_16(171);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(172);
+emit_16(86);
+emit_16(172);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(173);
+emit_16(88);
+emit_16(173);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(174);
+emit_16(90);
+emit_16(174);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(175);
+emit_16(92);
+emit_16(175);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(176);
+emit_16(94);
+emit_16(176);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(177);
+emit_16(96);
+emit_16(177);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(178);
+emit_16(98);
+emit_16(178);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(179);
+emit_16(100);
+emit_16(179);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(180);
+emit_16(102);
+emit_16(180);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(181);
+emit_16(104);
+emit_16(181);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(182);
+emit_16(106);
+emit_16(182);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(183);
+emit_16(108);
+emit_16(183);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(184);
+emit_16(110);
+emit_16(184);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(185);
+emit_16(112);
+emit_16(185);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(186);
+emit_16(114);
+emit_16(186);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(187);
+emit_16(116);
+emit_16(187);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(188);
+emit_16(118);
+emit_16(188);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(189);
+emit_16(120);
+emit_16(189);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(190);
+emit_16(122);
+emit_16(190);
+emit_16(124);
+emit_16(191);
+emit_16(126);
+emit_16(191);
+emit_16(124);
+emit_16(192);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(193);
+emit_16(128);
+emit_16(193);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(194);
+emit_16(129);
+emit_16(194);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(195);
+emit_16(130);
+emit_16(195);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(196);
+emit_16(131);
+emit_16(196);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(197);
+emit_16(132);
+emit_16(197);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(198);
+emit_16(133);
+emit_16(198);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(199);
+emit_16(134);
+emit_16(199);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(200);
+emit_16(135);
+emit_16(200);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(201);
+emit_16(136);
+emit_16(201);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(202);
+emit_16(137);
+emit_16(202);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(203);
+emit_16(138);
+emit_16(203);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(204);
+emit_16(139);
+emit_16(204);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(205);
+emit_16(140);
+emit_16(205);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(206);
+emit_16(141);
+emit_16(206);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(207);
+emit_16(142);
+emit_16(207);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(208);
+emit_16(143);
+emit_16(208);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(209);
+emit_16(144);
+emit_16(209);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(210);
+emit_16(145);
+emit_16(210);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(211);
+emit_16(146);
+emit_16(211);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(212);
+emit_16(147);
+emit_16(212);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(213);
+emit_16(148);
+emit_16(213);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(214);
+emit_16(149);
+emit_16(214);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(215);
+emit_16(150);
+emit_16(215);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(216);
+emit_16(151);
+emit_16(216);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(217);
+emit_16(152);
+emit_16(217);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(218);
+emit_16(153);
+emit_16(218);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(219);
+emit_16(154);
+emit_16(219);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(220);
+emit_16(155);
+emit_16(220);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(221);
+emit_16(156);
+emit_16(221);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(222);
+emit_16(157);
+emit_16(222);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(223);
+emit_16(158);
+emit_16(223);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(224);
+emit_16(159);
+emit_16(224);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(225);
+emit_16(160);
+emit_16(225);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(226);
+emit_16(161);
+emit_16(226);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(227);
+emit_16(162);
+emit_16(227);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(228);
+emit_16(163);
+emit_16(228);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(229);
+emit_16(164);
+emit_16(229);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(230);
+emit_16(165);
+emit_16(230);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(231);
+emit_16(166);
+emit_16(231);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(232);
+emit_16(167);
+emit_16(232);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(233);
+emit_16(168);
+emit_16(233);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(234);
+emit_16(169);
+emit_16(234);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(235);
+emit_16(170);
+emit_16(235);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(236);
+emit_16(171);
+emit_16(236);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(237);
+emit_16(172);
+emit_16(237);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(238);
+emit_16(173);
+emit_16(238);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(239);
+emit_16(174);
+emit_16(239);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(240);
+emit_16(175);
+emit_16(240);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(241);
+emit_16(176);
+emit_16(241);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(242);
+emit_16(177);
+emit_16(242);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(243);
+emit_16(178);
+emit_16(243);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(244);
+emit_16(179);
+emit_16(244);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(245);
+emit_16(180);
+emit_16(245);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(246);
+emit_16(181);
+emit_16(246);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(247);
+emit_16(182);
+emit_16(247);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(248);
+emit_16(183);
+emit_16(248);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(249);
+emit_16(184);
+emit_16(249);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(250);
+emit_16(185);
+emit_16(250);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(251);
+emit_16(186);
+emit_16(251);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(252);
+emit_16(187);
+emit_16(252);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(253);
+emit_16(188);
+emit_16(253);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(254);
+emit_16(189);
+emit_16(254);
+emit_16(190);
+emit_16(255);
+emit_16(191);
+emit_16(255);
+emit_16(190);
+emit_16(256);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(257);
+emit_16(192);
+emit_16(257);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(258);
+emit_16(193);
+emit_16(258);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(259);
+emit_16(194);
+emit_16(259);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(260);
+emit_16(195);
+emit_16(260);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(261);
+emit_16(196);
+emit_16(261);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(262);
+emit_16(197);
+emit_16(262);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(263);
+emit_16(198);
+emit_16(263);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(264);
+emit_16(199);
+emit_16(264);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(265);
+emit_16(200);
+emit_16(265);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(266);
+emit_16(201);
+emit_16(266);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(267);
+emit_16(202);
+emit_16(267);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(268);
+emit_16(203);
+emit_16(268);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(269);
+emit_16(204);
+emit_16(269);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(270);
+emit_16(205);
+emit_16(270);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(271);
+emit_16(206);
+emit_16(271);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(272);
+emit_16(207);
+emit_16(272);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(273);
+emit_16(208);
+emit_16(273);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(274);
+emit_16(209);
+emit_16(274);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(275);
+emit_16(210);
+emit_16(275);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(276);
+emit_16(211);
+emit_16(276);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(277);
+emit_16(212);
+emit_16(277);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(278);
+emit_16(213);
+emit_16(278);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(279);
+emit_16(214);
+emit_16(279);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(280);
+emit_16(215);
+emit_16(280);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(281);
+emit_16(216);
+emit_16(281);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(282);
+emit_16(217);
+emit_16(282);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(283);
+emit_16(218);
+emit_16(283);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(284);
+emit_16(219);
+emit_16(284);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(285);
+emit_16(220);
+emit_16(285);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(286);
+emit_16(221);
+emit_16(286);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(287);
+emit_16(222);
+emit_16(287);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(288);
+emit_16(223);
+emit_16(288);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(289);
+emit_16(224);
+emit_16(289);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(290);
+emit_16(225);
+emit_16(290);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(291);
+emit_16(226);
+emit_16(291);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(292);
+emit_16(227);
+emit_16(292);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(293);
+emit_16(228);
+emit_16(293);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(294);
+emit_16(229);
+emit_16(294);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(295);
+emit_16(230);
+emit_16(295);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(296);
+emit_16(231);
+emit_16(296);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(297);
+emit_16(232);
+emit_16(297);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(298);
+emit_16(233);
+emit_16(298);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(299);
+emit_16(234);
+emit_16(299);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(300);
+emit_16(235);
+emit_16(300);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(301);
+emit_16(236);
+emit_16(301);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(302);
+emit_16(237);
+emit_16(302);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(303);
+emit_16(238);
+emit_16(303);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(304);
+emit_16(239);
+emit_16(304);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(305);
+emit_16(240);
+emit_16(305);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(306);
+emit_16(241);
+emit_16(306);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(307);
+emit_16(242);
+emit_16(307);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(308);
+emit_16(243);
+emit_16(308);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(309);
+emit_16(244);
+emit_16(309);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(310);
+emit_16(245);
+emit_16(310);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(311);
+emit_16(246);
+emit_16(311);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(312);
+emit_16(247);
+emit_16(312);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(313);
+emit_16(248);
+emit_16(313);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(314);
+emit_16(249);
+emit_16(314);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(315);
+emit_16(250);
+emit_16(315);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(316);
+emit_16(251);
+emit_16(316);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(317);
+emit_16(252);
+emit_16(317);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(318);
+emit_16(253);
+emit_16(318);
+emit_16(254);
+emit_16(319);
+emit_16(255);
+emit_16(319);
+emit_16(254);
+emit_16(320);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(321);
+emit_16(256);
+emit_16(321);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(322);
+emit_16(257);
+emit_16(322);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(323);
+emit_16(258);
+emit_16(323);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(324);
+emit_16(259);
+emit_16(324);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(325);
+emit_16(260);
+emit_16(325);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(326);
+emit_16(261);
+emit_16(326);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(327);
+emit_16(262);
+emit_16(327);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(328);
+emit_16(263);
+emit_16(328);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(329);
+emit_16(264);
+emit_16(329);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(330);
+emit_16(265);
+emit_16(330);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(331);
+emit_16(266);
+emit_16(331);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(332);
+emit_16(267);
+emit_16(332);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(333);
+emit_16(268);
+emit_16(333);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(334);
+emit_16(269);
+emit_16(334);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(335);
+emit_16(270);
+emit_16(335);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(336);
+emit_16(271);
+emit_16(336);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(337);
+emit_16(272);
+emit_16(337);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(338);
+emit_16(273);
+emit_16(338);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(339);
+emit_16(274);
+emit_16(339);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(340);
+emit_16(275);
+emit_16(340);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(341);
+emit_16(276);
+emit_16(341);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(342);
+emit_16(277);
+emit_16(342);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(343);
+emit_16(278);
+emit_16(343);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(344);
+emit_16(279);
+emit_16(344);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(345);
+emit_16(280);
+emit_16(345);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(346);
+emit_16(281);
+emit_16(346);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(347);
+emit_16(282);
+emit_16(347);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(348);
+emit_16(283);
+emit_16(348);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(349);
+emit_16(284);
+emit_16(349);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(350);
+emit_16(285);
+emit_16(350);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(351);
+emit_16(286);
+emit_16(351);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(352);
+emit_16(287);
+emit_16(352);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(353);
+emit_16(288);
+emit_16(353);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(354);
+emit_16(289);
+emit_16(354);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(355);
+emit_16(290);
+emit_16(355);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(356);
+emit_16(291);
+emit_16(356);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(357);
+emit_16(292);
+emit_16(357);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(358);
+emit_16(293);
+emit_16(358);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(359);
+emit_16(294);
+emit_16(359);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(360);
+emit_16(295);
+emit_16(360);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(361);
+emit_16(296);
+emit_16(361);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(362);
+emit_16(297);
+emit_16(362);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(363);
+emit_16(298);
+emit_16(363);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(364);
+emit_16(299);
+emit_16(364);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(365);
+emit_16(300);
+emit_16(365);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(366);
+emit_16(301);
+emit_16(366);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(367);
+emit_16(302);
+emit_16(367);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(368);
+emit_16(303);
+emit_16(368);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(369);
+emit_16(304);
+emit_16(369);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(370);
+emit_16(305);
+emit_16(370);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(371);
+emit_16(306);
+emit_16(371);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(372);
+emit_16(307);
+emit_16(372);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(373);
+emit_16(308);
+emit_16(373);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(374);
+emit_16(309);
+emit_16(374);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(375);
+emit_16(310);
+emit_16(375);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(376);
+emit_16(311);
+emit_16(376);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(377);
+emit_16(312);
+emit_16(377);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(378);
+emit_16(313);
+emit_16(378);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(379);
+emit_16(314);
+emit_16(379);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(380);
+emit_16(315);
+emit_16(380);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(381);
+emit_16(316);
+emit_16(381);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(382);
+emit_16(317);
+emit_16(382);
+emit_16(318);
+emit_16(383);
+emit_16(319);
+emit_16(383);
+emit_16(318);
+emit_16(384);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(385);
+emit_16(320);
+emit_16(385);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(386);
+emit_16(321);
+emit_16(386);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(387);
+emit_16(322);
+emit_16(387);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(388);
+emit_16(323);
+emit_16(388);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(389);
+emit_16(324);
+emit_16(389);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(390);
+emit_16(325);
+emit_16(390);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(391);
+emit_16(326);
+emit_16(391);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(392);
+emit_16(327);
+emit_16(392);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(393);
+emit_16(328);
+emit_16(393);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(394);
+emit_16(329);
+emit_16(394);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(395);
+emit_16(330);
+emit_16(395);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(396);
+emit_16(331);
+emit_16(396);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(397);
+emit_16(332);
+emit_16(397);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(398);
+emit_16(333);
+emit_16(398);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(399);
+emit_16(334);
+emit_16(399);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(400);
+emit_16(335);
+emit_16(400);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(401);
+emit_16(336);
+emit_16(401);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(402);
+emit_16(337);
+emit_16(402);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(403);
+emit_16(338);
+emit_16(403);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(404);
+emit_16(339);
+emit_16(404);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(405);
+emit_16(340);
+emit_16(405);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(406);
+emit_16(341);
+emit_16(406);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(407);
+emit_16(342);
+emit_16(407);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(408);
+emit_16(343);
+emit_16(408);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(409);
+emit_16(344);
+emit_16(409);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(410);
+emit_16(345);
+emit_16(410);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(411);
+emit_16(346);
+emit_16(411);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(412);
+emit_16(347);
+emit_16(412);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(413);
+emit_16(348);
+emit_16(413);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(414);
+emit_16(349);
+emit_16(414);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(415);
+emit_16(350);
+emit_16(415);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(416);
+emit_16(351);
+emit_16(416);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(417);
+emit_16(352);
+emit_16(417);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(418);
+emit_16(353);
+emit_16(418);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(419);
+emit_16(354);
+emit_16(419);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(420);
+emit_16(355);
+emit_16(420);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(421);
+emit_16(356);
+emit_16(421);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(422);
+emit_16(357);
+emit_16(422);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(423);
+emit_16(358);
+emit_16(423);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(424);
+emit_16(359);
+emit_16(424);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(425);
+emit_16(360);
+emit_16(425);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(426);
+emit_16(361);
+emit_16(426);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(427);
+emit_16(362);
+emit_16(427);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(428);
+emit_16(363);
+emit_16(428);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(429);
+emit_16(364);
+emit_16(429);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(430);
+emit_16(365);
+emit_16(430);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(431);
+emit_16(366);
+emit_16(431);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(432);
+emit_16(367);
+emit_16(432);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(433);
+emit_16(368);
+emit_16(433);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(434);
+emit_16(369);
+emit_16(434);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(435);
+emit_16(370);
+emit_16(435);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(436);
+emit_16(371);
+emit_16(436);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(437);
+emit_16(372);
+emit_16(437);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(438);
+emit_16(373);
+emit_16(438);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(439);
+emit_16(374);
+emit_16(439);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(440);
+emit_16(375);
+emit_16(440);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(441);
+emit_16(376);
+emit_16(441);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(442);
+emit_16(377);
+emit_16(442);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(443);
+emit_16(378);
+emit_16(443);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(444);
+emit_16(379);
+emit_16(444);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(445);
+emit_16(380);
+emit_16(445);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(446);
+emit_16(381);
+emit_16(446);
+emit_16(382);
+emit_16(447);
+emit_16(383);
+emit_16(447);
+emit_16(382);
+emit_16(448);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(449);
+emit_16(384);
+emit_16(449);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(450);
+emit_16(385);
+emit_16(450);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(451);
+emit_16(386);
+emit_16(451);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(452);
+emit_16(387);
+emit_16(452);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(453);
+emit_16(388);
+emit_16(453);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(454);
+emit_16(389);
+emit_16(454);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(455);
+emit_16(390);
+emit_16(455);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(456);
+emit_16(391);
+emit_16(456);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(457);
+emit_16(392);
+emit_16(457);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(458);
+emit_16(393);
+emit_16(458);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(459);
+emit_16(394);
+emit_16(459);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(460);
+emit_16(395);
+emit_16(460);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(461);
+emit_16(396);
+emit_16(461);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(462);
+emit_16(397);
+emit_16(462);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(463);
+emit_16(398);
+emit_16(463);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(464);
+emit_16(399);
+emit_16(464);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(465);
+emit_16(400);
+emit_16(465);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(466);
+emit_16(401);
+emit_16(466);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(467);
+emit_16(402);
+emit_16(467);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(468);
+emit_16(403);
+emit_16(468);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(469);
+emit_16(404);
+emit_16(469);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(470);
+emit_16(405);
+emit_16(470);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(471);
+emit_16(406);
+emit_16(471);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(472);
+emit_16(407);
+emit_16(472);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(473);
+emit_16(408);
+emit_16(473);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(474);
+emit_16(409);
+emit_16(474);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(475);
+emit_16(410);
+emit_16(475);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(476);
+emit_16(411);
+emit_16(476);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(477);
+emit_16(412);
+emit_16(477);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(478);
+emit_16(413);
+emit_16(478);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(479);
+emit_16(414);
+emit_16(479);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(480);
+emit_16(415);
+emit_16(480);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(481);
+emit_16(416);
+emit_16(481);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(482);
+emit_16(417);
+emit_16(482);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(483);
+emit_16(418);
+emit_16(483);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(484);
+emit_16(419);
+emit_16(484);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(485);
+emit_16(420);
+emit_16(485);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(486);
+emit_16(421);
+emit_16(486);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(487);
+emit_16(422);
+emit_16(487);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(488);
+emit_16(423);
+emit_16(488);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(489);
+emit_16(424);
+emit_16(489);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(490);
+emit_16(425);
+emit_16(490);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(491);
+emit_16(426);
+emit_16(491);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(492);
+emit_16(427);
+emit_16(492);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(493);
+emit_16(428);
+emit_16(493);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(494);
+emit_16(429);
+emit_16(494);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(495);
+emit_16(430);
+emit_16(495);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(496);
+emit_16(431);
+emit_16(496);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(497);
+emit_16(432);
+emit_16(497);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(498);
+emit_16(433);
+emit_16(498);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(499);
+emit_16(434);
+emit_16(499);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(500);
+emit_16(435);
+emit_16(500);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(501);
+emit_16(436);
+emit_16(501);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(502);
+emit_16(437);
+emit_16(502);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(503);
+emit_16(438);
+emit_16(503);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(504);
+emit_16(439);
+emit_16(504);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(505);
+emit_16(440);
+emit_16(505);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(506);
+emit_16(441);
+emit_16(506);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(507);
+emit_16(442);
+emit_16(507);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(508);
+emit_16(443);
+emit_16(508);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(509);
+emit_16(444);
+emit_16(509);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(510);
+emit_16(445);
+emit_16(510);
+emit_16(446);
+emit_16(511);
+emit_16(447);
+emit_16(511);
+emit_16(446);
+emit_16(512);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(513);
+emit_16(448);
+emit_16(513);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(514);
+emit_16(449);
+emit_16(514);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(515);
+emit_16(450);
+emit_16(515);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(516);
+emit_16(451);
+emit_16(516);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(517);
+emit_16(452);
+emit_16(517);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(518);
+emit_16(453);
+emit_16(518);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(519);
+emit_16(454);
+emit_16(519);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(520);
+emit_16(455);
+emit_16(520);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(521);
+emit_16(456);
+emit_16(521);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(522);
+emit_16(457);
+emit_16(522);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(523);
+emit_16(458);
+emit_16(523);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(524);
+emit_16(459);
+emit_16(524);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(525);
+emit_16(460);
+emit_16(525);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(526);
+emit_16(461);
+emit_16(526);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(527);
+emit_16(462);
+emit_16(527);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(528);
+emit_16(463);
+emit_16(528);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(529);
+emit_16(464);
+emit_16(529);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(530);
+emit_16(465);
+emit_16(530);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(531);
+emit_16(466);
+emit_16(531);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(532);
+emit_16(467);
+emit_16(532);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(533);
+emit_16(468);
+emit_16(533);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(534);
+emit_16(469);
+emit_16(534);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(535);
+emit_16(470);
+emit_16(535);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(536);
+emit_16(471);
+emit_16(536);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(537);
+emit_16(472);
+emit_16(537);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(538);
+emit_16(473);
+emit_16(538);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(539);
+emit_16(474);
+emit_16(539);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(540);
+emit_16(475);
+emit_16(540);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(541);
+emit_16(476);
+emit_16(541);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(542);
+emit_16(477);
+emit_16(542);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(543);
+emit_16(478);
+emit_16(543);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(544);
+emit_16(479);
+emit_16(544);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(545);
+emit_16(480);
+emit_16(545);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(546);
+emit_16(481);
+emit_16(546);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(547);
+emit_16(482);
+emit_16(547);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(548);
+emit_16(483);
+emit_16(548);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(549);
+emit_16(484);
+emit_16(549);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(550);
+emit_16(485);
+emit_16(550);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(551);
+emit_16(486);
+emit_16(551);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(552);
+emit_16(487);
+emit_16(552);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(553);
+emit_16(488);
+emit_16(553);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(554);
+emit_16(489);
+emit_16(554);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(555);
+emit_16(490);
+emit_16(555);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(556);
+emit_16(491);
+emit_16(556);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(557);
+emit_16(492);
+emit_16(557);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(558);
+emit_16(493);
+emit_16(558);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(559);
+emit_16(494);
+emit_16(559);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(560);
+emit_16(495);
+emit_16(560);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(561);
+emit_16(496);
+emit_16(561);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(562);
+emit_16(497);
+emit_16(562);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(563);
+emit_16(498);
+emit_16(563);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(564);
+emit_16(499);
+emit_16(564);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(565);
+emit_16(500);
+emit_16(565);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(566);
+emit_16(501);
+emit_16(566);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(567);
+emit_16(502);
+emit_16(567);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(568);
+emit_16(503);
+emit_16(568);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(569);
+emit_16(504);
+emit_16(569);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(570);
+emit_16(505);
+emit_16(570);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(571);
+emit_16(506);
+emit_16(571);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(572);
+emit_16(507);
+emit_16(572);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(573);
+emit_16(508);
+emit_16(573);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(574);
+emit_16(509);
+emit_16(574);
+emit_16(510);
+emit_16(575);
+emit_16(511);
+emit_16(575);
+emit_16(510);
+emit_16(576);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(577);
+emit_16(512);
+emit_16(577);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(578);
+emit_16(513);
+emit_16(578);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(579);
+emit_16(514);
+emit_16(579);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(580);
+emit_16(515);
+emit_16(580);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(581);
+emit_16(516);
+emit_16(581);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(582);
+emit_16(517);
+emit_16(582);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(583);
+emit_16(518);
+emit_16(583);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(584);
+emit_16(519);
+emit_16(584);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(585);
+emit_16(520);
+emit_16(585);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(586);
+emit_16(521);
+emit_16(586);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(587);
+emit_16(522);
+emit_16(587);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(588);
+emit_16(523);
+emit_16(588);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(589);
+emit_16(524);
+emit_16(589);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(590);
+emit_16(525);
+emit_16(590);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(591);
+emit_16(526);
+emit_16(591);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(592);
+emit_16(527);
+emit_16(592);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(593);
+emit_16(528);
+emit_16(593);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(594);
+emit_16(529);
+emit_16(594);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(595);
+emit_16(530);
+emit_16(595);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(596);
+emit_16(531);
+emit_16(596);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(597);
+emit_16(532);
+emit_16(597);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(598);
+emit_16(533);
+emit_16(598);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(599);
+emit_16(534);
+emit_16(599);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(600);
+emit_16(535);
+emit_16(600);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(601);
+emit_16(536);
+emit_16(601);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(602);
+emit_16(537);
+emit_16(602);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(603);
+emit_16(538);
+emit_16(603);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(604);
+emit_16(539);
+emit_16(604);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(605);
+emit_16(540);
+emit_16(605);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(606);
+emit_16(541);
+emit_16(606);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(607);
+emit_16(542);
+emit_16(607);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(608);
+emit_16(543);
+emit_16(608);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(609);
+emit_16(544);
+emit_16(609);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(610);
+emit_16(545);
+emit_16(610);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(611);
+emit_16(546);
+emit_16(611);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(612);
+emit_16(547);
+emit_16(612);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(613);
+emit_16(548);
+emit_16(613);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(614);
+emit_16(549);
+emit_16(614);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(615);
+emit_16(550);
+emit_16(615);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(616);
+emit_16(551);
+emit_16(616);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(617);
+emit_16(552);
+emit_16(617);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(618);
+emit_16(553);
+emit_16(618);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(619);
+emit_16(554);
+emit_16(619);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(620);
+emit_16(555);
+emit_16(620);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(621);
+emit_16(556);
+emit_16(621);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(622);
+emit_16(557);
+emit_16(622);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(623);
+emit_16(558);
+emit_16(623);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(624);
+emit_16(559);
+emit_16(624);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(625);
+emit_16(560);
+emit_16(625);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(626);
+emit_16(561);
+emit_16(626);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(627);
+emit_16(562);
+emit_16(627);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(628);
+emit_16(563);
+emit_16(628);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(629);
+emit_16(564);
+emit_16(629);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(630);
+emit_16(565);
+emit_16(630);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(631);
+emit_16(566);
+emit_16(631);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(632);
+emit_16(567);
+emit_16(632);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(633);
+emit_16(568);
+emit_16(633);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(634);
+emit_16(569);
+emit_16(634);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(635);
+emit_16(570);
+emit_16(635);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(636);
+emit_16(571);
+emit_16(636);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(637);
+emit_16(572);
+emit_16(637);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(638);
+emit_16(573);
+emit_16(638);
+emit_16(574);
+emit_16(639);
+emit_16(575);
+emit_16(639);
+emit_16(574);
+emit_16(640);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(641);
+emit_16(576);
+emit_16(641);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(642);
+emit_16(577);
+emit_16(642);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(643);
+emit_16(578);
+emit_16(643);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(644);
+emit_16(579);
+emit_16(644);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(645);
+emit_16(580);
+emit_16(645);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(646);
+emit_16(581);
+emit_16(646);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(647);
+emit_16(582);
+emit_16(647);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(648);
+emit_16(583);
+emit_16(648);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(649);
+emit_16(584);
+emit_16(649);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(650);
+emit_16(585);
+emit_16(650);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(651);
+emit_16(586);
+emit_16(651);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(652);
+emit_16(587);
+emit_16(652);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(653);
+emit_16(588);
+emit_16(653);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(654);
+emit_16(589);
+emit_16(654);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(655);
+emit_16(590);
+emit_16(655);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(656);
+emit_16(591);
+emit_16(656);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(657);
+emit_16(592);
+emit_16(657);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(658);
+emit_16(593);
+emit_16(658);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(659);
+emit_16(594);
+emit_16(659);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(660);
+emit_16(595);
+emit_16(660);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(661);
+emit_16(596);
+emit_16(661);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(662);
+emit_16(597);
+emit_16(662);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(663);
+emit_16(598);
+emit_16(663);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(664);
+emit_16(599);
+emit_16(664);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(665);
+emit_16(600);
+emit_16(665);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(666);
+emit_16(601);
+emit_16(666);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(667);
+emit_16(602);
+emit_16(667);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(668);
+emit_16(603);
+emit_16(668);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(669);
+emit_16(604);
+emit_16(669);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(670);
+emit_16(605);
+emit_16(670);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(671);
+emit_16(606);
+emit_16(671);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(672);
+emit_16(607);
+emit_16(672);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(673);
+emit_16(608);
+emit_16(673);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(674);
+emit_16(609);
+emit_16(674);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(675);
+emit_16(610);
+emit_16(675);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(676);
+emit_16(611);
+emit_16(676);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(677);
+emit_16(612);
+emit_16(677);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(678);
+emit_16(613);
+emit_16(678);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(679);
+emit_16(614);
+emit_16(679);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(680);
+emit_16(615);
+emit_16(680);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(681);
+emit_16(616);
+emit_16(681);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(682);
+emit_16(617);
+emit_16(682);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(683);
+emit_16(618);
+emit_16(683);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(684);
+emit_16(619);
+emit_16(684);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(685);
+emit_16(620);
+emit_16(685);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(686);
+emit_16(621);
+emit_16(686);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(687);
+emit_16(622);
+emit_16(687);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(688);
+emit_16(623);
+emit_16(688);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(689);
+emit_16(624);
+emit_16(689);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(690);
+emit_16(625);
+emit_16(690);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(691);
+emit_16(626);
+emit_16(691);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(692);
+emit_16(627);
+emit_16(692);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(693);
+emit_16(628);
+emit_16(693);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(694);
+emit_16(629);
+emit_16(694);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(695);
+emit_16(630);
+emit_16(695);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(696);
+emit_16(631);
+emit_16(696);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(697);
+emit_16(632);
+emit_16(697);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(698);
+emit_16(633);
+emit_16(698);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(699);
+emit_16(634);
+emit_16(699);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(700);
+emit_16(635);
+emit_16(700);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(701);
+emit_16(636);
+emit_16(701);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(702);
+emit_16(637);
+emit_16(702);
+emit_16(638);
+emit_16(703);
+emit_16(639);
+emit_16(703);
+emit_16(638);
+emit_16(704);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(705);
+emit_16(640);
+emit_16(705);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(706);
+emit_16(641);
+emit_16(706);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(707);
+emit_16(642);
+emit_16(707);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(708);
+emit_16(643);
+emit_16(708);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(709);
+emit_16(644);
+emit_16(709);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(710);
+emit_16(645);
+emit_16(710);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(711);
+emit_16(646);
+emit_16(711);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(712);
+emit_16(647);
+emit_16(712);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(713);
+emit_16(648);
+emit_16(713);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(714);
+emit_16(649);
+emit_16(714);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(715);
+emit_16(650);
+emit_16(715);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(716);
+emit_16(651);
+emit_16(716);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(717);
+emit_16(652);
+emit_16(717);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(718);
+emit_16(653);
+emit_16(718);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(719);
+emit_16(654);
+emit_16(719);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(720);
+emit_16(655);
+emit_16(720);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(721);
+emit_16(656);
+emit_16(721);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(722);
+emit_16(657);
+emit_16(722);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(723);
+emit_16(658);
+emit_16(723);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(724);
+emit_16(659);
+emit_16(724);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(725);
+emit_16(660);
+emit_16(725);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(726);
+emit_16(661);
+emit_16(726);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(727);
+emit_16(662);
+emit_16(727);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(728);
+emit_16(663);
+emit_16(728);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(729);
+emit_16(664);
+emit_16(729);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(730);
+emit_16(665);
+emit_16(730);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(731);
+emit_16(666);
+emit_16(731);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(732);
+emit_16(667);
+emit_16(732);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(733);
+emit_16(668);
+emit_16(733);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(734);
+emit_16(669);
+emit_16(734);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(735);
+emit_16(670);
+emit_16(735);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(736);
+emit_16(671);
+emit_16(736);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(737);
+emit_16(672);
+emit_16(737);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(738);
+emit_16(673);
+emit_16(738);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(739);
+emit_16(674);
+emit_16(739);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(740);
+emit_16(675);
+emit_16(740);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(741);
+emit_16(676);
+emit_16(741);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(742);
+emit_16(677);
+emit_16(742);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(743);
+emit_16(678);
+emit_16(743);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(744);
+emit_16(679);
+emit_16(744);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(745);
+emit_16(680);
+emit_16(745);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(746);
+emit_16(681);
+emit_16(746);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(747);
+emit_16(682);
+emit_16(747);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(748);
+emit_16(683);
+emit_16(748);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(749);
+emit_16(684);
+emit_16(749);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(750);
+emit_16(685);
+emit_16(750);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(751);
+emit_16(686);
+emit_16(751);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(752);
+emit_16(687);
+emit_16(752);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(753);
+emit_16(688);
+emit_16(753);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(754);
+emit_16(689);
+emit_16(754);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(755);
+emit_16(690);
+emit_16(755);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(756);
+emit_16(691);
+emit_16(756);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(757);
+emit_16(692);
+emit_16(757);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(758);
+emit_16(693);
+emit_16(758);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(759);
+emit_16(694);
+emit_16(759);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(760);
+emit_16(695);
+emit_16(760);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(761);
+emit_16(696);
+emit_16(761);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(762);
+emit_16(697);
+emit_16(762);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(763);
+emit_16(698);
+emit_16(763);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(764);
+emit_16(699);
+emit_16(764);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(765);
+emit_16(700);
+emit_16(765);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(766);
+emit_16(701);
+emit_16(766);
+emit_16(702);
+emit_16(767);
+emit_16(703);
+emit_16(767);
+emit_16(702);
+emit_16(768);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(769);
+emit_16(704);
+emit_16(769);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(770);
+emit_16(705);
+emit_16(770);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(771);
+emit_16(706);
+emit_16(771);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(772);
+emit_16(707);
+emit_16(772);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(773);
+emit_16(708);
+emit_16(773);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(774);
+emit_16(709);
+emit_16(774);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(775);
+emit_16(710);
+emit_16(775);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(776);
+emit_16(711);
+emit_16(776);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(777);
+emit_16(712);
+emit_16(777);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(778);
+emit_16(713);
+emit_16(778);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(779);
+emit_16(714);
+emit_16(779);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(780);
+emit_16(715);
+emit_16(780);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(781);
+emit_16(716);
+emit_16(781);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(782);
+emit_16(717);
+emit_16(782);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(783);
+emit_16(718);
+emit_16(783);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(784);
+emit_16(719);
+emit_16(784);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(785);
+emit_16(720);
+emit_16(785);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(786);
+emit_16(721);
+emit_16(786);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(787);
+emit_16(722);
+emit_16(787);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(788);
+emit_16(723);
+emit_16(788);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(789);
+emit_16(724);
+emit_16(789);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(790);
+emit_16(725);
+emit_16(790);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(791);
+emit_16(726);
+emit_16(791);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(792);
+emit_16(727);
+emit_16(792);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(793);
+emit_16(728);
+emit_16(793);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(794);
+emit_16(729);
+emit_16(794);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(795);
+emit_16(730);
+emit_16(795);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(796);
+emit_16(731);
+emit_16(796);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(797);
+emit_16(732);
+emit_16(797);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(798);
+emit_16(733);
+emit_16(798);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(799);
+emit_16(734);
+emit_16(799);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(800);
+emit_16(735);
+emit_16(800);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(801);
+emit_16(736);
+emit_16(801);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(802);
+emit_16(737);
+emit_16(802);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(803);
+emit_16(738);
+emit_16(803);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(804);
+emit_16(739);
+emit_16(804);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(805);
+emit_16(740);
+emit_16(805);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(806);
+emit_16(741);
+emit_16(806);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(807);
+emit_16(742);
+emit_16(807);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(808);
+emit_16(743);
+emit_16(808);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(809);
+emit_16(744);
+emit_16(809);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(810);
+emit_16(745);
+emit_16(810);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(811);
+emit_16(746);
+emit_16(811);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(812);
+emit_16(747);
+emit_16(812);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(813);
+emit_16(748);
+emit_16(813);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(814);
+emit_16(749);
+emit_16(814);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(815);
+emit_16(750);
+emit_16(815);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(816);
+emit_16(751);
+emit_16(816);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(817);
+emit_16(752);
+emit_16(817);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(818);
+emit_16(753);
+emit_16(818);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(819);
+emit_16(754);
+emit_16(819);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(820);
+emit_16(755);
+emit_16(820);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(821);
+emit_16(756);
+emit_16(821);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(822);
+emit_16(757);
+emit_16(822);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(823);
+emit_16(758);
+emit_16(823);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(824);
+emit_16(759);
+emit_16(824);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(825);
+emit_16(760);
+emit_16(825);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(826);
+emit_16(761);
+emit_16(826);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(827);
+emit_16(762);
+emit_16(827);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(828);
+emit_16(763);
+emit_16(828);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(829);
+emit_16(764);
+emit_16(829);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(830);
+emit_16(765);
+emit_16(830);
+emit_16(766);
+emit_16(831);
+emit_16(767);
+emit_16(831);
+emit_16(766);
+emit_16(832);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(833);
+emit_16(768);
+emit_16(833);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(834);
+emit_16(769);
+emit_16(834);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(835);
+emit_16(770);
+emit_16(835);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(836);
+emit_16(771);
+emit_16(836);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(837);
+emit_16(772);
+emit_16(837);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(838);
+emit_16(773);
+emit_16(838);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(839);
+emit_16(774);
+emit_16(839);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(840);
+emit_16(775);
+emit_16(840);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(841);
+emit_16(776);
+emit_16(841);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(842);
+emit_16(777);
+emit_16(842);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(843);
+emit_16(778);
+emit_16(843);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(844);
+emit_16(779);
+emit_16(844);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(845);
+emit_16(780);
+emit_16(845);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(846);
+emit_16(781);
+emit_16(846);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(847);
+emit_16(782);
+emit_16(847);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(848);
+emit_16(783);
+emit_16(848);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(849);
+emit_16(784);
+emit_16(849);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(850);
+emit_16(785);
+emit_16(850);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(851);
+emit_16(786);
+emit_16(851);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(852);
+emit_16(787);
+emit_16(852);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(853);
+emit_16(788);
+emit_16(853);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(854);
+emit_16(789);
+emit_16(854);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(855);
+emit_16(790);
+emit_16(855);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(856);
+emit_16(791);
+emit_16(856);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(857);
+emit_16(792);
+emit_16(857);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(858);
+emit_16(793);
+emit_16(858);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(859);
+emit_16(794);
+emit_16(859);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(860);
+emit_16(795);
+emit_16(860);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(861);
+emit_16(796);
+emit_16(861);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(862);
+emit_16(797);
+emit_16(862);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(863);
+emit_16(798);
+emit_16(863);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(864);
+emit_16(799);
+emit_16(864);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(865);
+emit_16(800);
+emit_16(865);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(866);
+emit_16(801);
+emit_16(866);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(867);
+emit_16(802);
+emit_16(867);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(868);
+emit_16(803);
+emit_16(868);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(869);
+emit_16(804);
+emit_16(869);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(870);
+emit_16(805);
+emit_16(870);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(871);
+emit_16(806);
+emit_16(871);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(872);
+emit_16(807);
+emit_16(872);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(873);
+emit_16(808);
+emit_16(873);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(874);
+emit_16(809);
+emit_16(874);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(875);
+emit_16(810);
+emit_16(875);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(876);
+emit_16(811);
+emit_16(876);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(877);
+emit_16(812);
+emit_16(877);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(878);
+emit_16(813);
+emit_16(878);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(879);
+emit_16(814);
+emit_16(879);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(880);
+emit_16(815);
+emit_16(880);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(881);
+emit_16(816);
+emit_16(881);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(882);
+emit_16(817);
+emit_16(882);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(883);
+emit_16(818);
+emit_16(883);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(884);
+emit_16(819);
+emit_16(884);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(885);
+emit_16(820);
+emit_16(885);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(886);
+emit_16(821);
+emit_16(886);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(887);
+emit_16(822);
+emit_16(887);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(888);
+emit_16(823);
+emit_16(888);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(889);
+emit_16(824);
+emit_16(889);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(890);
+emit_16(825);
+emit_16(890);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(891);
+emit_16(826);
+emit_16(891);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(892);
+emit_16(827);
+emit_16(892);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(893);
+emit_16(828);
+emit_16(893);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(894);
+emit_16(829);
+emit_16(894);
+emit_16(830);
+emit_16(895);
+emit_16(831);
+emit_16(895);
+emit_16(830);
+emit_16(896);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(897);
+emit_16(832);
+emit_16(897);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(898);
+emit_16(833);
+emit_16(898);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(899);
+emit_16(834);
+emit_16(899);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(900);
+emit_16(835);
+emit_16(900);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(901);
+emit_16(836);
+emit_16(901);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(902);
+emit_16(837);
+emit_16(902);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(903);
+emit_16(838);
+emit_16(903);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(904);
+emit_16(839);
+emit_16(904);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(905);
+emit_16(840);
+emit_16(905);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(906);
+emit_16(841);
+emit_16(906);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(907);
+emit_16(842);
+emit_16(907);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(908);
+emit_16(843);
+emit_16(908);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(909);
+emit_16(844);
+emit_16(909);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(910);
+emit_16(845);
+emit_16(910);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(911);
+emit_16(846);
+emit_16(911);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(912);
+emit_16(847);
+emit_16(912);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(913);
+emit_16(848);
+emit_16(913);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(914);
+emit_16(849);
+emit_16(914);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(915);
+emit_16(850);
+emit_16(915);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(916);
+emit_16(851);
+emit_16(916);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(917);
+emit_16(852);
+emit_16(917);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(918);
+emit_16(853);
+emit_16(918);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(919);
+emit_16(854);
+emit_16(919);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(920);
+emit_16(855);
+emit_16(920);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(921);
+emit_16(856);
+emit_16(921);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(922);
+emit_16(857);
+emit_16(922);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(923);
+emit_16(858);
+emit_16(923);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(924);
+emit_16(859);
+emit_16(924);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(925);
+emit_16(860);
+emit_16(925);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(926);
+emit_16(861);
+emit_16(926);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(927);
+emit_16(862);
+emit_16(927);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(928);
+emit_16(863);
+emit_16(928);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(929);
+emit_16(864);
+emit_16(929);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(930);
+emit_16(865);
+emit_16(930);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(931);
+emit_16(866);
+emit_16(931);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(932);
+emit_16(867);
+emit_16(932);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(933);
+emit_16(868);
+emit_16(933);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(934);
+emit_16(869);
+emit_16(934);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(935);
+emit_16(870);
+emit_16(935);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(936);
+emit_16(871);
+emit_16(936);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(937);
+emit_16(872);
+emit_16(937);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(938);
+emit_16(873);
+emit_16(938);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(939);
+emit_16(874);
+emit_16(939);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(940);
+emit_16(875);
+emit_16(940);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(941);
+emit_16(876);
+emit_16(941);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(942);
+emit_16(877);
+emit_16(942);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(943);
+emit_16(878);
+emit_16(943);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(944);
+emit_16(879);
+emit_16(944);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(945);
+emit_16(880);
+emit_16(945);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(946);
+emit_16(881);
+emit_16(946);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(947);
+emit_16(882);
+emit_16(947);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(948);
+emit_16(883);
+emit_16(948);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(949);
+emit_16(884);
+emit_16(949);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(950);
+emit_16(885);
+emit_16(950);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(951);
+emit_16(886);
+emit_16(951);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(952);
+emit_16(887);
+emit_16(952);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(953);
+emit_16(888);
+emit_16(953);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(954);
+emit_16(889);
+emit_16(954);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(955);
+emit_16(890);
+emit_16(955);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(956);
+emit_16(891);
+emit_16(956);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(957);
+emit_16(892);
+emit_16(957);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(958);
+emit_16(893);
+emit_16(958);
+emit_16(894);
+emit_16(959);
+emit_16(895);
+emit_16(959);
+emit_16(894);
+emit_16(960);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(961);
+emit_16(896);
+emit_16(961);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(962);
+emit_16(897);
+emit_16(962);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(963);
+emit_16(898);
+emit_16(963);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(964);
+emit_16(899);
+emit_16(964);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(965);
+emit_16(900);
+emit_16(965);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(966);
+emit_16(901);
+emit_16(966);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(967);
+emit_16(902);
+emit_16(967);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(968);
+emit_16(903);
+emit_16(968);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(969);
+emit_16(904);
+emit_16(969);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(970);
+emit_16(905);
+emit_16(970);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(971);
+emit_16(906);
+emit_16(971);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(972);
+emit_16(907);
+emit_16(972);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(973);
+emit_16(908);
+emit_16(973);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(974);
+emit_16(909);
+emit_16(974);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(975);
+emit_16(910);
+emit_16(975);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(976);
+emit_16(911);
+emit_16(976);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(977);
+emit_16(912);
+emit_16(977);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(978);
+emit_16(913);
+emit_16(978);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(979);
+emit_16(914);
+emit_16(979);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(980);
+emit_16(915);
+emit_16(980);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(981);
+emit_16(916);
+emit_16(981);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(982);
+emit_16(917);
+emit_16(982);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(983);
+emit_16(918);
+emit_16(983);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(984);
+emit_16(919);
+emit_16(984);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(985);
+emit_16(920);
+emit_16(985);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(986);
+emit_16(921);
+emit_16(986);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(987);
+emit_16(922);
+emit_16(987);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(988);
+emit_16(923);
+emit_16(988);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(989);
+emit_16(924);
+emit_16(989);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(990);
+emit_16(925);
+emit_16(990);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(991);
+emit_16(926);
+emit_16(991);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(992);
+emit_16(927);
+emit_16(992);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(993);
+emit_16(928);
+emit_16(993);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(994);
+emit_16(929);
+emit_16(994);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(995);
+emit_16(930);
+emit_16(995);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(996);
+emit_16(931);
+emit_16(996);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(997);
+emit_16(932);
+emit_16(997);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(998);
+emit_16(933);
+emit_16(998);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(999);
+emit_16(934);
+emit_16(999);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1000);
+emit_16(935);
+emit_16(1000);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1001);
+emit_16(936);
+emit_16(1001);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1002);
+emit_16(937);
+emit_16(1002);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1003);
+emit_16(938);
+emit_16(1003);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1004);
+emit_16(939);
+emit_16(1004);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1005);
+emit_16(940);
+emit_16(1005);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1006);
+emit_16(941);
+emit_16(1006);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1007);
+emit_16(942);
+emit_16(1007);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1008);
+emit_16(943);
+emit_16(1008);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1009);
+emit_16(944);
+emit_16(1009);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1010);
+emit_16(945);
+emit_16(1010);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1011);
+emit_16(946);
+emit_16(1011);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1012);
+emit_16(947);
+emit_16(1012);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1013);
+emit_16(948);
+emit_16(1013);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1014);
+emit_16(949);
+emit_16(1014);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1015);
+emit_16(950);
+emit_16(1015);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1016);
+emit_16(951);
+emit_16(1016);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1017);
+emit_16(952);
+emit_16(1017);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1018);
+emit_16(953);
+emit_16(1018);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1019);
+emit_16(954);
+emit_16(1019);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1020);
+emit_16(955);
+emit_16(1020);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1021);
+emit_16(956);
+emit_16(1021);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1022);
+emit_16(957);
+emit_16(1022);
+emit_16(958);
+emit_16(1023);
+emit_16(959);
+emit_16(1023);
+emit_16(958);
+emit_16(1024);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1025);
+emit_16(960);
+emit_16(1025);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1026);
+emit_16(961);
+emit_16(1026);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1027);
+emit_16(962);
+emit_16(1027);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1028);
+emit_16(963);
+emit_16(1028);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1029);
+emit_16(964);
+emit_16(1029);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1030);
+emit_16(965);
+emit_16(1030);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1031);
+emit_16(966);
+emit_16(1031);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1032);
+emit_16(967);
+emit_16(1032);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1033);
+emit_16(968);
+emit_16(1033);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1034);
+emit_16(969);
+emit_16(1034);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1035);
+emit_16(970);
+emit_16(1035);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1036);
+emit_16(971);
+emit_16(1036);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1037);
+emit_16(972);
+emit_16(1037);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1038);
+emit_16(973);
+emit_16(1038);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1039);
+emit_16(974);
+emit_16(1039);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1040);
+emit_16(975);
+emit_16(1040);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1041);
+emit_16(976);
+emit_16(1041);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1042);
+emit_16(977);
+emit_16(1042);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1043);
+emit_16(978);
+emit_16(1043);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1044);
+emit_16(979);
+emit_16(1044);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1045);
+emit_16(980);
+emit_16(1045);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1046);
+emit_16(981);
+emit_16(1046);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1047);
+emit_16(982);
+emit_16(1047);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1048);
+emit_16(983);
+emit_16(1048);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1049);
+emit_16(984);
+emit_16(1049);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1050);
+emit_16(985);
+emit_16(1050);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1051);
+emit_16(986);
+emit_16(1051);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1052);
+emit_16(987);
+emit_16(1052);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1053);
+emit_16(988);
+emit_16(1053);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1054);
+emit_16(989);
+emit_16(1054);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1055);
+emit_16(990);
+emit_16(1055);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1056);
+emit_16(991);
+emit_16(1056);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1057);
+emit_16(992);
+emit_16(1057);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1058);
+emit_16(993);
+emit_16(1058);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1059);
+emit_16(994);
+emit_16(1059);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1060);
+emit_16(995);
+emit_16(1060);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1061);
+emit_16(996);
+emit_16(1061);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1062);
+emit_16(997);
+emit_16(1062);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1063);
+emit_16(998);
+emit_16(1063);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1064);
+emit_16(999);
+emit_16(1064);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1065);
+emit_16(1000);
+emit_16(1065);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1066);
+emit_16(1001);
+emit_16(1066);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1067);
+emit_16(1002);
+emit_16(1067);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1068);
+emit_16(1003);
+emit_16(1068);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1069);
+emit_16(1004);
+emit_16(1069);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1070);
+emit_16(1005);
+emit_16(1070);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1071);
+emit_16(1006);
+emit_16(1071);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1072);
+emit_16(1007);
+emit_16(1072);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1073);
+emit_16(1008);
+emit_16(1073);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1074);
+emit_16(1009);
+emit_16(1074);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1075);
+emit_16(1010);
+emit_16(1075);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1076);
+emit_16(1011);
+emit_16(1076);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1077);
+emit_16(1012);
+emit_16(1077);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1078);
+emit_16(1013);
+emit_16(1078);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1079);
+emit_16(1014);
+emit_16(1079);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1080);
+emit_16(1015);
+emit_16(1080);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1081);
+emit_16(1016);
+emit_16(1081);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1082);
+emit_16(1017);
+emit_16(1082);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1083);
+emit_16(1018);
+emit_16(1083);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1084);
+emit_16(1019);
+emit_16(1084);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1085);
+emit_16(1020);
+emit_16(1085);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1086);
+emit_16(1021);
+emit_16(1086);
+emit_16(1022);
+emit_16(1087);
+emit_16(1023);
+emit_16(1087);
+emit_16(1022);
+emit_16(1088);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1089);
+emit_16(1024);
+emit_16(1089);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1090);
+emit_16(1025);
+emit_16(1090);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1091);
+emit_16(1026);
+emit_16(1091);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1092);
+emit_16(1027);
+emit_16(1092);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1093);
+emit_16(1028);
+emit_16(1093);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1094);
+emit_16(1029);
+emit_16(1094);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1095);
+emit_16(1030);
+emit_16(1095);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1096);
+emit_16(1031);
+emit_16(1096);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1097);
+emit_16(1032);
+emit_16(1097);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1098);
+emit_16(1033);
+emit_16(1098);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1099);
+emit_16(1034);
+emit_16(1099);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1100);
+emit_16(1035);
+emit_16(1100);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1101);
+emit_16(1036);
+emit_16(1101);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1102);
+emit_16(1037);
+emit_16(1102);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1103);
+emit_16(1038);
+emit_16(1103);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1104);
+emit_16(1039);
+emit_16(1104);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1105);
+emit_16(1040);
+emit_16(1105);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1106);
+emit_16(1041);
+emit_16(1106);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1107);
+emit_16(1042);
+emit_16(1107);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1108);
+emit_16(1043);
+emit_16(1108);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1109);
+emit_16(1044);
+emit_16(1109);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1110);
+emit_16(1045);
+emit_16(1110);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1111);
+emit_16(1046);
+emit_16(1111);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1112);
+emit_16(1047);
+emit_16(1112);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1113);
+emit_16(1048);
+emit_16(1113);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1114);
+emit_16(1049);
+emit_16(1114);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1115);
+emit_16(1050);
+emit_16(1115);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1116);
+emit_16(1051);
+emit_16(1116);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1117);
+emit_16(1052);
+emit_16(1117);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1118);
+emit_16(1053);
+emit_16(1118);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1119);
+emit_16(1054);
+emit_16(1119);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1120);
+emit_16(1055);
+emit_16(1120);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1121);
+emit_16(1056);
+emit_16(1121);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1122);
+emit_16(1057);
+emit_16(1122);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1123);
+emit_16(1058);
+emit_16(1123);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1124);
+emit_16(1059);
+emit_16(1124);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1125);
+emit_16(1060);
+emit_16(1125);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1126);
+emit_16(1061);
+emit_16(1126);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1127);
+emit_16(1062);
+emit_16(1127);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1128);
+emit_16(1063);
+emit_16(1128);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1129);
+emit_16(1064);
+emit_16(1129);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1130);
+emit_16(1065);
+emit_16(1130);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1131);
+emit_16(1066);
+emit_16(1131);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1132);
+emit_16(1067);
+emit_16(1132);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1133);
+emit_16(1068);
+emit_16(1133);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1134);
+emit_16(1069);
+emit_16(1134);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1135);
+emit_16(1070);
+emit_16(1135);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1136);
+emit_16(1071);
+emit_16(1136);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1137);
+emit_16(1072);
+emit_16(1137);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1138);
+emit_16(1073);
+emit_16(1138);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1139);
+emit_16(1074);
+emit_16(1139);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1140);
+emit_16(1075);
+emit_16(1140);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1141);
+emit_16(1076);
+emit_16(1141);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1142);
+emit_16(1077);
+emit_16(1142);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1143);
+emit_16(1078);
+emit_16(1143);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1144);
+emit_16(1079);
+emit_16(1144);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1145);
+emit_16(1080);
+emit_16(1145);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1146);
+emit_16(1081);
+emit_16(1146);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1147);
+emit_16(1082);
+emit_16(1147);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1148);
+emit_16(1083);
+emit_16(1148);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1149);
+emit_16(1084);
+emit_16(1149);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1150);
+emit_16(1085);
+emit_16(1150);
+emit_16(1086);
+emit_16(1151);
+emit_16(1087);
+emit_16(1151);
+emit_16(1086);
+emit_16(1152);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1153);
+emit_16(1088);
+emit_16(1153);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1154);
+emit_16(1089);
+emit_16(1154);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1155);
+emit_16(1090);
+emit_16(1155);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1156);
+emit_16(1091);
+emit_16(1156);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1157);
+emit_16(1092);
+emit_16(1157);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1158);
+emit_16(1093);
+emit_16(1158);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1159);
+emit_16(1094);
+emit_16(1159);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1160);
+emit_16(1095);
+emit_16(1160);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1161);
+emit_16(1096);
+emit_16(1161);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1162);
+emit_16(1097);
+emit_16(1162);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1163);
+emit_16(1098);
+emit_16(1163);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1164);
+emit_16(1099);
+emit_16(1164);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1165);
+emit_16(1100);
+emit_16(1165);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1166);
+emit_16(1101);
+emit_16(1166);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1167);
+emit_16(1102);
+emit_16(1167);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1168);
+emit_16(1103);
+emit_16(1168);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1169);
+emit_16(1104);
+emit_16(1169);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1170);
+emit_16(1105);
+emit_16(1170);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1171);
+emit_16(1106);
+emit_16(1171);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1172);
+emit_16(1107);
+emit_16(1172);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1173);
+emit_16(1108);
+emit_16(1173);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1174);
+emit_16(1109);
+emit_16(1174);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1175);
+emit_16(1110);
+emit_16(1175);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1176);
+emit_16(1111);
+emit_16(1176);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1177);
+emit_16(1112);
+emit_16(1177);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1178);
+emit_16(1113);
+emit_16(1178);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1179);
+emit_16(1114);
+emit_16(1179);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1180);
+emit_16(1115);
+emit_16(1180);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1181);
+emit_16(1116);
+emit_16(1181);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1182);
+emit_16(1117);
+emit_16(1182);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1183);
+emit_16(1118);
+emit_16(1183);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1184);
+emit_16(1119);
+emit_16(1184);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1185);
+emit_16(1120);
+emit_16(1185);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1186);
+emit_16(1121);
+emit_16(1186);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1187);
+emit_16(1122);
+emit_16(1187);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1188);
+emit_16(1123);
+emit_16(1188);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1189);
+emit_16(1124);
+emit_16(1189);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1190);
+emit_16(1125);
+emit_16(1190);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1191);
+emit_16(1126);
+emit_16(1191);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1192);
+emit_16(1127);
+emit_16(1192);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1193);
+emit_16(1128);
+emit_16(1193);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1194);
+emit_16(1129);
+emit_16(1194);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1195);
+emit_16(1130);
+emit_16(1195);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1196);
+emit_16(1131);
+emit_16(1196);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1197);
+emit_16(1132);
+emit_16(1197);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1198);
+emit_16(1133);
+emit_16(1198);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1199);
+emit_16(1134);
+emit_16(1199);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1200);
+emit_16(1135);
+emit_16(1200);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1201);
+emit_16(1136);
+emit_16(1201);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1202);
+emit_16(1137);
+emit_16(1202);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1203);
+emit_16(1138);
+emit_16(1203);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1204);
+emit_16(1139);
+emit_16(1204);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1205);
+emit_16(1140);
+emit_16(1205);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1206);
+emit_16(1141);
+emit_16(1206);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1207);
+emit_16(1142);
+emit_16(1207);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1208);
+emit_16(1143);
+emit_16(1208);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1209);
+emit_16(1144);
+emit_16(1209);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1210);
+emit_16(1145);
+emit_16(1210);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1211);
+emit_16(1146);
+emit_16(1211);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1212);
+emit_16(1147);
+emit_16(1212);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1213);
+emit_16(1148);
+emit_16(1213);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1214);
+emit_16(1149);
+emit_16(1214);
+emit_16(1150);
+emit_16(1215);
+emit_16(1151);
+emit_16(1215);
+emit_16(1150);
+emit_16(1216);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1217);
+emit_16(1152);
+emit_16(1217);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1218);
+emit_16(1153);
+emit_16(1218);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1219);
+emit_16(1154);
+emit_16(1219);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1220);
+emit_16(1155);
+emit_16(1220);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1221);
+emit_16(1156);
+emit_16(1221);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1222);
+emit_16(1157);
+emit_16(1222);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1223);
+emit_16(1158);
+emit_16(1223);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1224);
+emit_16(1159);
+emit_16(1224);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1225);
+emit_16(1160);
+emit_16(1225);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1226);
+emit_16(1161);
+emit_16(1226);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1227);
+emit_16(1162);
+emit_16(1227);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1228);
+emit_16(1163);
+emit_16(1228);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1229);
+emit_16(1164);
+emit_16(1229);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1230);
+emit_16(1165);
+emit_16(1230);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1231);
+emit_16(1166);
+emit_16(1231);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1232);
+emit_16(1167);
+emit_16(1232);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1233);
+emit_16(1168);
+emit_16(1233);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1234);
+emit_16(1169);
+emit_16(1234);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1235);
+emit_16(1170);
+emit_16(1235);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1236);
+emit_16(1171);
+emit_16(1236);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1237);
+emit_16(1172);
+emit_16(1237);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1238);
+emit_16(1173);
+emit_16(1238);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1239);
+emit_16(1174);
+emit_16(1239);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1240);
+emit_16(1175);
+emit_16(1240);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1241);
+emit_16(1176);
+emit_16(1241);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1242);
+emit_16(1177);
+emit_16(1242);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1243);
+emit_16(1178);
+emit_16(1243);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1244);
+emit_16(1179);
+emit_16(1244);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1245);
+emit_16(1180);
+emit_16(1245);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1246);
+emit_16(1181);
+emit_16(1246);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1247);
+emit_16(1182);
+emit_16(1247);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1248);
+emit_16(1183);
+emit_16(1248);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1249);
+emit_16(1184);
+emit_16(1249);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1250);
+emit_16(1185);
+emit_16(1250);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1251);
+emit_16(1186);
+emit_16(1251);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1252);
+emit_16(1187);
+emit_16(1252);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1253);
+emit_16(1188);
+emit_16(1253);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1254);
+emit_16(1189);
+emit_16(1254);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1255);
+emit_16(1190);
+emit_16(1255);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1256);
+emit_16(1191);
+emit_16(1256);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1257);
+emit_16(1192);
+emit_16(1257);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1258);
+emit_16(1193);
+emit_16(1258);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1259);
+emit_16(1194);
+emit_16(1259);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1260);
+emit_16(1195);
+emit_16(1260);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1261);
+emit_16(1196);
+emit_16(1261);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1262);
+emit_16(1197);
+emit_16(1262);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1263);
+emit_16(1198);
+emit_16(1263);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1264);
+emit_16(1199);
+emit_16(1264);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1265);
+emit_16(1200);
+emit_16(1265);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1266);
+emit_16(1201);
+emit_16(1266);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1267);
+emit_16(1202);
+emit_16(1267);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1268);
+emit_16(1203);
+emit_16(1268);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1269);
+emit_16(1204);
+emit_16(1269);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1270);
+emit_16(1205);
+emit_16(1270);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1271);
+emit_16(1206);
+emit_16(1271);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1272);
+emit_16(1207);
+emit_16(1272);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1273);
+emit_16(1208);
+emit_16(1273);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1274);
+emit_16(1209);
+emit_16(1274);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1275);
+emit_16(1210);
+emit_16(1275);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1276);
+emit_16(1211);
+emit_16(1276);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1277);
+emit_16(1212);
+emit_16(1277);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1278);
+emit_16(1213);
+emit_16(1278);
+emit_16(1214);
+emit_16(1279);
+emit_16(1215);
+emit_16(1279);
+emit_16(1214);
+emit_16(1280);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1281);
+emit_16(1216);
+emit_16(1281);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1282);
+emit_16(1217);
+emit_16(1282);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1283);
+emit_16(1218);
+emit_16(1283);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1284);
+emit_16(1219);
+emit_16(1284);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1285);
+emit_16(1220);
+emit_16(1285);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1286);
+emit_16(1221);
+emit_16(1286);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1287);
+emit_16(1222);
+emit_16(1287);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1288);
+emit_16(1223);
+emit_16(1288);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1289);
+emit_16(1224);
+emit_16(1289);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1290);
+emit_16(1225);
+emit_16(1290);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1291);
+emit_16(1226);
+emit_16(1291);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1292);
+emit_16(1227);
+emit_16(1292);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1293);
+emit_16(1228);
+emit_16(1293);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1294);
+emit_16(1229);
+emit_16(1294);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1295);
+emit_16(1230);
+emit_16(1295);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1296);
+emit_16(1231);
+emit_16(1296);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1297);
+emit_16(1232);
+emit_16(1297);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1298);
+emit_16(1233);
+emit_16(1298);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1299);
+emit_16(1234);
+emit_16(1299);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1300);
+emit_16(1235);
+emit_16(1300);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1301);
+emit_16(1236);
+emit_16(1301);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1302);
+emit_16(1237);
+emit_16(1302);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1303);
+emit_16(1238);
+emit_16(1303);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1304);
+emit_16(1239);
+emit_16(1304);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1305);
+emit_16(1240);
+emit_16(1305);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1306);
+emit_16(1241);
+emit_16(1306);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1307);
+emit_16(1242);
+emit_16(1307);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1308);
+emit_16(1243);
+emit_16(1308);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1309);
+emit_16(1244);
+emit_16(1309);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1310);
+emit_16(1245);
+emit_16(1310);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1311);
+emit_16(1246);
+emit_16(1311);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1312);
+emit_16(1247);
+emit_16(1312);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1313);
+emit_16(1248);
+emit_16(1313);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1314);
+emit_16(1249);
+emit_16(1314);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1315);
+emit_16(1250);
+emit_16(1315);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1316);
+emit_16(1251);
+emit_16(1316);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1317);
+emit_16(1252);
+emit_16(1317);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1318);
+emit_16(1253);
+emit_16(1318);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1319);
+emit_16(1254);
+emit_16(1319);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1320);
+emit_16(1255);
+emit_16(1320);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1321);
+emit_16(1256);
+emit_16(1321);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1322);
+emit_16(1257);
+emit_16(1322);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1323);
+emit_16(1258);
+emit_16(1323);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1324);
+emit_16(1259);
+emit_16(1324);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1325);
+emit_16(1260);
+emit_16(1325);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1326);
+emit_16(1261);
+emit_16(1326);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1327);
+emit_16(1262);
+emit_16(1327);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1328);
+emit_16(1263);
+emit_16(1328);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1329);
+emit_16(1264);
+emit_16(1329);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1330);
+emit_16(1265);
+emit_16(1330);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1331);
+emit_16(1266);
+emit_16(1331);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1332);
+emit_16(1267);
+emit_16(1332);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1333);
+emit_16(1268);
+emit_16(1333);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1334);
+emit_16(1269);
+emit_16(1334);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1335);
+emit_16(1270);
+emit_16(1335);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1336);
+emit_16(1271);
+emit_16(1336);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1337);
+emit_16(1272);
+emit_16(1337);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1338);
+emit_16(1273);
+emit_16(1338);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1339);
+emit_16(1274);
+emit_16(1339);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1340);
+emit_16(1275);
+emit_16(1340);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1341);
+emit_16(1276);
+emit_16(1341);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1342);
+emit_16(1277);
+emit_16(1342);
+emit_16(1278);
+emit_16(1343);
+emit_16(1279);
+emit_16(1343);
+emit_16(1278);
+emit_16(1344);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1345);
+emit_16(1280);
+emit_16(1345);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1346);
+emit_16(1281);
+emit_16(1346);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1347);
+emit_16(1282);
+emit_16(1347);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1348);
+emit_16(1283);
+emit_16(1348);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1349);
+emit_16(1284);
+emit_16(1349);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1350);
+emit_16(1285);
+emit_16(1350);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1351);
+emit_16(1286);
+emit_16(1351);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1352);
+emit_16(1287);
+emit_16(1352);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1353);
+emit_16(1288);
+emit_16(1353);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1354);
+emit_16(1289);
+emit_16(1354);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1355);
+emit_16(1290);
+emit_16(1355);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1356);
+emit_16(1291);
+emit_16(1356);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1357);
+emit_16(1292);
+emit_16(1357);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1358);
+emit_16(1293);
+emit_16(1358);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1359);
+emit_16(1294);
+emit_16(1359);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1360);
+emit_16(1295);
+emit_16(1360);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1361);
+emit_16(1296);
+emit_16(1361);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1362);
+emit_16(1297);
+emit_16(1362);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1363);
+emit_16(1298);
+emit_16(1363);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1364);
+emit_16(1299);
+emit_16(1364);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1365);
+emit_16(1300);
+emit_16(1365);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1366);
+emit_16(1301);
+emit_16(1366);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1367);
+emit_16(1302);
+emit_16(1367);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1368);
+emit_16(1303);
+emit_16(1368);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1369);
+emit_16(1304);
+emit_16(1369);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1370);
+emit_16(1305);
+emit_16(1370);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1371);
+emit_16(1306);
+emit_16(1371);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1372);
+emit_16(1307);
+emit_16(1372);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1373);
+emit_16(1308);
+emit_16(1373);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1374);
+emit_16(1309);
+emit_16(1374);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1375);
+emit_16(1310);
+emit_16(1375);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1376);
+emit_16(1311);
+emit_16(1376);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1377);
+emit_16(1312);
+emit_16(1377);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1378);
+emit_16(1313);
+emit_16(1378);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1379);
+emit_16(1314);
+emit_16(1379);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1380);
+emit_16(1315);
+emit_16(1380);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1381);
+emit_16(1316);
+emit_16(1381);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1382);
+emit_16(1317);
+emit_16(1382);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1383);
+emit_16(1318);
+emit_16(1383);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1384);
+emit_16(1319);
+emit_16(1384);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1385);
+emit_16(1320);
+emit_16(1385);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1386);
+emit_16(1321);
+emit_16(1386);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1387);
+emit_16(1322);
+emit_16(1387);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1388);
+emit_16(1323);
+emit_16(1388);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1389);
+emit_16(1324);
+emit_16(1389);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1390);
+emit_16(1325);
+emit_16(1390);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1391);
+emit_16(1326);
+emit_16(1391);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1392);
+emit_16(1327);
+emit_16(1392);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1393);
+emit_16(1328);
+emit_16(1393);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1394);
+emit_16(1329);
+emit_16(1394);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1395);
+emit_16(1330);
+emit_16(1395);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1396);
+emit_16(1331);
+emit_16(1396);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1397);
+emit_16(1332);
+emit_16(1397);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1398);
+emit_16(1333);
+emit_16(1398);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1399);
+emit_16(1334);
+emit_16(1399);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1400);
+emit_16(1335);
+emit_16(1400);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1401);
+emit_16(1336);
+emit_16(1401);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1402);
+emit_16(1337);
+emit_16(1402);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1403);
+emit_16(1338);
+emit_16(1403);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1404);
+emit_16(1339);
+emit_16(1404);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1405);
+emit_16(1340);
+emit_16(1405);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1406);
+emit_16(1341);
+emit_16(1406);
+emit_16(1342);
+emit_16(1407);
+emit_16(1343);
+emit_16(1407);
+emit_16(1342);
+emit_16(1408);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1409);
+emit_16(1344);
+emit_16(1409);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1410);
+emit_16(1345);
+emit_16(1410);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1411);
+emit_16(1346);
+emit_16(1411);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1412);
+emit_16(1347);
+emit_16(1412);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1413);
+emit_16(1348);
+emit_16(1413);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1414);
+emit_16(1349);
+emit_16(1414);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1415);
+emit_16(1350);
+emit_16(1415);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1416);
+emit_16(1351);
+emit_16(1416);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1417);
+emit_16(1352);
+emit_16(1417);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1418);
+emit_16(1353);
+emit_16(1418);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1419);
+emit_16(1354);
+emit_16(1419);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1420);
+emit_16(1355);
+emit_16(1420);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1421);
+emit_16(1356);
+emit_16(1421);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1422);
+emit_16(1357);
+emit_16(1422);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1423);
+emit_16(1358);
+emit_16(1423);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1424);
+emit_16(1359);
+emit_16(1424);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1425);
+emit_16(1360);
+emit_16(1425);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1426);
+emit_16(1361);
+emit_16(1426);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1427);
+emit_16(1362);
+emit_16(1427);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1428);
+emit_16(1363);
+emit_16(1428);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1429);
+emit_16(1364);
+emit_16(1429);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1430);
+emit_16(1365);
+emit_16(1430);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1431);
+emit_16(1366);
+emit_16(1431);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1432);
+emit_16(1367);
+emit_16(1432);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1433);
+emit_16(1368);
+emit_16(1433);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1434);
+emit_16(1369);
+emit_16(1434);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1435);
+emit_16(1370);
+emit_16(1435);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1436);
+emit_16(1371);
+emit_16(1436);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1437);
+emit_16(1372);
+emit_16(1437);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1438);
+emit_16(1373);
+emit_16(1438);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1439);
+emit_16(1374);
+emit_16(1439);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1440);
+emit_16(1375);
+emit_16(1440);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1441);
+emit_16(1376);
+emit_16(1441);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1442);
+emit_16(1377);
+emit_16(1442);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1443);
+emit_16(1378);
+emit_16(1443);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1444);
+emit_16(1379);
+emit_16(1444);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1445);
+emit_16(1380);
+emit_16(1445);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1446);
+emit_16(1381);
+emit_16(1446);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1447);
+emit_16(1382);
+emit_16(1447);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1448);
+emit_16(1383);
+emit_16(1448);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1449);
+emit_16(1384);
+emit_16(1449);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1450);
+emit_16(1385);
+emit_16(1450);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1451);
+emit_16(1386);
+emit_16(1451);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1452);
+emit_16(1387);
+emit_16(1452);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1453);
+emit_16(1388);
+emit_16(1453);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1454);
+emit_16(1389);
+emit_16(1454);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1455);
+emit_16(1390);
+emit_16(1455);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1456);
+emit_16(1391);
+emit_16(1456);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1457);
+emit_16(1392);
+emit_16(1457);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1458);
+emit_16(1393);
+emit_16(1458);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1459);
+emit_16(1394);
+emit_16(1459);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1460);
+emit_16(1395);
+emit_16(1460);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1461);
+emit_16(1396);
+emit_16(1461);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1462);
+emit_16(1397);
+emit_16(1462);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1463);
+emit_16(1398);
+emit_16(1463);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1464);
+emit_16(1399);
+emit_16(1464);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1465);
+emit_16(1400);
+emit_16(1465);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1466);
+emit_16(1401);
+emit_16(1466);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1467);
+emit_16(1402);
+emit_16(1467);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1468);
+emit_16(1403);
+emit_16(1468);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1469);
+emit_16(1404);
+emit_16(1469);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1470);
+emit_16(1405);
+emit_16(1470);
+emit_16(1406);
+emit_16(1471);
+emit_16(1407);
+emit_16(1471);
+emit_16(1406);
+emit_16(1472);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1473);
+emit_16(1408);
+emit_16(1473);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1474);
+emit_16(1409);
+emit_16(1474);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1475);
+emit_16(1410);
+emit_16(1475);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1476);
+emit_16(1411);
+emit_16(1476);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1477);
+emit_16(1412);
+emit_16(1477);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1478);
+emit_16(1413);
+emit_16(1478);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1479);
+emit_16(1414);
+emit_16(1479);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1480);
+emit_16(1415);
+emit_16(1480);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1481);
+emit_16(1416);
+emit_16(1481);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1482);
+emit_16(1417);
+emit_16(1482);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1483);
+emit_16(1418);
+emit_16(1483);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1484);
+emit_16(1419);
+emit_16(1484);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1485);
+emit_16(1420);
+emit_16(1485);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1486);
+emit_16(1421);
+emit_16(1486);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1487);
+emit_16(1422);
+emit_16(1487);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1488);
+emit_16(1423);
+emit_16(1488);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1489);
+emit_16(1424);
+emit_16(1489);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1490);
+emit_16(1425);
+emit_16(1490);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1491);
+emit_16(1426);
+emit_16(1491);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1492);
+emit_16(1427);
+emit_16(1492);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1493);
+emit_16(1428);
+emit_16(1493);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1494);
+emit_16(1429);
+emit_16(1494);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1495);
+emit_16(1430);
+emit_16(1495);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1496);
+emit_16(1431);
+emit_16(1496);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1497);
+emit_16(1432);
+emit_16(1497);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1498);
+emit_16(1433);
+emit_16(1498);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1499);
+emit_16(1434);
+emit_16(1499);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1500);
+emit_16(1435);
+emit_16(1500);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1501);
+emit_16(1436);
+emit_16(1501);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1502);
+emit_16(1437);
+emit_16(1502);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1503);
+emit_16(1438);
+emit_16(1503);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1504);
+emit_16(1439);
+emit_16(1504);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1505);
+emit_16(1440);
+emit_16(1505);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1506);
+emit_16(1441);
+emit_16(1506);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1507);
+emit_16(1442);
+emit_16(1507);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1508);
+emit_16(1443);
+emit_16(1508);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1509);
+emit_16(1444);
+emit_16(1509);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1510);
+emit_16(1445);
+emit_16(1510);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1511);
+emit_16(1446);
+emit_16(1511);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1512);
+emit_16(1447);
+emit_16(1512);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1513);
+emit_16(1448);
+emit_16(1513);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1514);
+emit_16(1449);
+emit_16(1514);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1515);
+emit_16(1450);
+emit_16(1515);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1516);
+emit_16(1451);
+emit_16(1516);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1517);
+emit_16(1452);
+emit_16(1517);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1518);
+emit_16(1453);
+emit_16(1518);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1519);
+emit_16(1454);
+emit_16(1519);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1520);
+emit_16(1455);
+emit_16(1520);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1521);
+emit_16(1456);
+emit_16(1521);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1522);
+emit_16(1457);
+emit_16(1522);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1523);
+emit_16(1458);
+emit_16(1523);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1524);
+emit_16(1459);
+emit_16(1524);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1525);
+emit_16(1460);
+emit_16(1525);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1526);
+emit_16(1461);
+emit_16(1526);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1527);
+emit_16(1462);
+emit_16(1527);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1528);
+emit_16(1463);
+emit_16(1528);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1529);
+emit_16(1464);
+emit_16(1529);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1530);
+emit_16(1465);
+emit_16(1530);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1531);
+emit_16(1466);
+emit_16(1531);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1532);
+emit_16(1467);
+emit_16(1532);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1533);
+emit_16(1468);
+emit_16(1533);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1534);
+emit_16(1469);
+emit_16(1534);
+emit_16(1470);
+emit_16(1535);
+emit_16(1471);
+emit_16(1535);
+emit_16(1470);
+emit_16(1536);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1537);
+emit_16(1472);
+emit_16(1537);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1538);
+emit_16(1473);
+emit_16(1538);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1539);
+emit_16(1474);
+emit_16(1539);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1540);
+emit_16(1475);
+emit_16(1540);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1541);
+emit_16(1476);
+emit_16(1541);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1542);
+emit_16(1477);
+emit_16(1542);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1543);
+emit_16(1478);
+emit_16(1543);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1544);
+emit_16(1479);
+emit_16(1544);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1545);
+emit_16(1480);
+emit_16(1545);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1546);
+emit_16(1481);
+emit_16(1546);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1547);
+emit_16(1482);
+emit_16(1547);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1548);
+emit_16(1483);
+emit_16(1548);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1549);
+emit_16(1484);
+emit_16(1549);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1550);
+emit_16(1485);
+emit_16(1550);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1551);
+emit_16(1486);
+emit_16(1551);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1552);
+emit_16(1487);
+emit_16(1552);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1553);
+emit_16(1488);
+emit_16(1553);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1554);
+emit_16(1489);
+emit_16(1554);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1555);
+emit_16(1490);
+emit_16(1555);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1556);
+emit_16(1491);
+emit_16(1556);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1557);
+emit_16(1492);
+emit_16(1557);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1558);
+emit_16(1493);
+emit_16(1558);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1559);
+emit_16(1494);
+emit_16(1559);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1560);
+emit_16(1495);
+emit_16(1560);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1561);
+emit_16(1496);
+emit_16(1561);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1562);
+emit_16(1497);
+emit_16(1562);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1563);
+emit_16(1498);
+emit_16(1563);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1564);
+emit_16(1499);
+emit_16(1564);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1565);
+emit_16(1500);
+emit_16(1565);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1566);
+emit_16(1501);
+emit_16(1566);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1567);
+emit_16(1502);
+emit_16(1567);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1568);
+emit_16(1503);
+emit_16(1568);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1569);
+emit_16(1504);
+emit_16(1569);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1570);
+emit_16(1505);
+emit_16(1570);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1571);
+emit_16(1506);
+emit_16(1571);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1572);
+emit_16(1507);
+emit_16(1572);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1573);
+emit_16(1508);
+emit_16(1573);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1574);
+emit_16(1509);
+emit_16(1574);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1575);
+emit_16(1510);
+emit_16(1575);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1576);
+emit_16(1511);
+emit_16(1576);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1577);
+emit_16(1512);
+emit_16(1577);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1578);
+emit_16(1513);
+emit_16(1578);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1579);
+emit_16(1514);
+emit_16(1579);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1580);
+emit_16(1515);
+emit_16(1580);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1581);
+emit_16(1516);
+emit_16(1581);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1582);
+emit_16(1517);
+emit_16(1582);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1583);
+emit_16(1518);
+emit_16(1583);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1584);
+emit_16(1519);
+emit_16(1584);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1585);
+emit_16(1520);
+emit_16(1585);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1586);
+emit_16(1521);
+emit_16(1586);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1587);
+emit_16(1522);
+emit_16(1587);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1588);
+emit_16(1523);
+emit_16(1588);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1589);
+emit_16(1524);
+emit_16(1589);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1590);
+emit_16(1525);
+emit_16(1590);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1591);
+emit_16(1526);
+emit_16(1591);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1592);
+emit_16(1527);
+emit_16(1592);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1593);
+emit_16(1528);
+emit_16(1593);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1594);
+emit_16(1529);
+emit_16(1594);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1595);
+emit_16(1530);
+emit_16(1595);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1596);
+emit_16(1531);
+emit_16(1596);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1597);
+emit_16(1532);
+emit_16(1597);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1598);
+emit_16(1533);
+emit_16(1598);
+emit_16(1534);
+emit_16(1599);
+emit_16(1535);
+emit_16(1599);
+emit_16(1534);
+emit_16(1600);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1601);
+emit_16(1536);
+emit_16(1601);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1602);
+emit_16(1537);
+emit_16(1602);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1603);
+emit_16(1538);
+emit_16(1603);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1604);
+emit_16(1539);
+emit_16(1604);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1605);
+emit_16(1540);
+emit_16(1605);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1606);
+emit_16(1541);
+emit_16(1606);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1607);
+emit_16(1542);
+emit_16(1607);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1608);
+emit_16(1543);
+emit_16(1608);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1609);
+emit_16(1544);
+emit_16(1609);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1610);
+emit_16(1545);
+emit_16(1610);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1611);
+emit_16(1546);
+emit_16(1611);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1612);
+emit_16(1547);
+emit_16(1612);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1613);
+emit_16(1548);
+emit_16(1613);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1614);
+emit_16(1549);
+emit_16(1614);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1615);
+emit_16(1550);
+emit_16(1615);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1616);
+emit_16(1551);
+emit_16(1616);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1617);
+emit_16(1552);
+emit_16(1617);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1618);
+emit_16(1553);
+emit_16(1618);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1619);
+emit_16(1554);
+emit_16(1619);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1620);
+emit_16(1555);
+emit_16(1620);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1621);
+emit_16(1556);
+emit_16(1621);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1622);
+emit_16(1557);
+emit_16(1622);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1623);
+emit_16(1558);
+emit_16(1623);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1624);
+emit_16(1559);
+emit_16(1624);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1625);
+emit_16(1560);
+emit_16(1625);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1626);
+emit_16(1561);
+emit_16(1626);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1627);
+emit_16(1562);
+emit_16(1627);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1628);
+emit_16(1563);
+emit_16(1628);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1629);
+emit_16(1564);
+emit_16(1629);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1630);
+emit_16(1565);
+emit_16(1630);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1631);
+emit_16(1566);
+emit_16(1631);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1632);
+emit_16(1567);
+emit_16(1632);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1633);
+emit_16(1568);
+emit_16(1633);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1634);
+emit_16(1569);
+emit_16(1634);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1635);
+emit_16(1570);
+emit_16(1635);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1636);
+emit_16(1571);
+emit_16(1636);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1637);
+emit_16(1572);
+emit_16(1637);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1638);
+emit_16(1573);
+emit_16(1638);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1639);
+emit_16(1574);
+emit_16(1639);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1640);
+emit_16(1575);
+emit_16(1640);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1641);
+emit_16(1576);
+emit_16(1641);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1642);
+emit_16(1577);
+emit_16(1642);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1643);
+emit_16(1578);
+emit_16(1643);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1644);
+emit_16(1579);
+emit_16(1644);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1645);
+emit_16(1580);
+emit_16(1645);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1646);
+emit_16(1581);
+emit_16(1646);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1647);
+emit_16(1582);
+emit_16(1647);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1648);
+emit_16(1583);
+emit_16(1648);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1649);
+emit_16(1584);
+emit_16(1649);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1650);
+emit_16(1585);
+emit_16(1650);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1651);
+emit_16(1586);
+emit_16(1651);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1652);
+emit_16(1587);
+emit_16(1652);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1653);
+emit_16(1588);
+emit_16(1653);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1654);
+emit_16(1589);
+emit_16(1654);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1655);
+emit_16(1590);
+emit_16(1655);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1656);
+emit_16(1591);
+emit_16(1656);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1657);
+emit_16(1592);
+emit_16(1657);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1658);
+emit_16(1593);
+emit_16(1658);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1659);
+emit_16(1594);
+emit_16(1659);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1660);
+emit_16(1595);
+emit_16(1660);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1661);
+emit_16(1596);
+emit_16(1661);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1662);
+emit_16(1597);
+emit_16(1662);
+emit_16(1598);
+emit_16(1663);
+emit_16(1599);
+emit_16(1663);
+emit_16(1598);
+emit_16(1664);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1665);
+emit_16(1600);
+emit_16(1665);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1666);
+emit_16(1601);
+emit_16(1666);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1667);
+emit_16(1602);
+emit_16(1667);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1668);
+emit_16(1603);
+emit_16(1668);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1669);
+emit_16(1604);
+emit_16(1669);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1670);
+emit_16(1605);
+emit_16(1670);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1671);
+emit_16(1606);
+emit_16(1671);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1672);
+emit_16(1607);
+emit_16(1672);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1673);
+emit_16(1608);
+emit_16(1673);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1674);
+emit_16(1609);
+emit_16(1674);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1675);
+emit_16(1610);
+emit_16(1675);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1676);
+emit_16(1611);
+emit_16(1676);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1677);
+emit_16(1612);
+emit_16(1677);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1678);
+emit_16(1613);
+emit_16(1678);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1679);
+emit_16(1614);
+emit_16(1679);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1680);
+emit_16(1615);
+emit_16(1680);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1681);
+emit_16(1616);
+emit_16(1681);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1682);
+emit_16(1617);
+emit_16(1682);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1683);
+emit_16(1618);
+emit_16(1683);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1684);
+emit_16(1619);
+emit_16(1684);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1685);
+emit_16(1620);
+emit_16(1685);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1686);
+emit_16(1621);
+emit_16(1686);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1687);
+emit_16(1622);
+emit_16(1687);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1688);
+emit_16(1623);
+emit_16(1688);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1689);
+emit_16(1624);
+emit_16(1689);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1690);
+emit_16(1625);
+emit_16(1690);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1691);
+emit_16(1626);
+emit_16(1691);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1692);
+emit_16(1627);
+emit_16(1692);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1693);
+emit_16(1628);
+emit_16(1693);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1694);
+emit_16(1629);
+emit_16(1694);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1695);
+emit_16(1630);
+emit_16(1695);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1696);
+emit_16(1631);
+emit_16(1696);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1697);
+emit_16(1632);
+emit_16(1697);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1698);
+emit_16(1633);
+emit_16(1698);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1699);
+emit_16(1634);
+emit_16(1699);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1700);
+emit_16(1635);
+emit_16(1700);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1701);
+emit_16(1636);
+emit_16(1701);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1702);
+emit_16(1637);
+emit_16(1702);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1703);
+emit_16(1638);
+emit_16(1703);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1704);
+emit_16(1639);
+emit_16(1704);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1705);
+emit_16(1640);
+emit_16(1705);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1706);
+emit_16(1641);
+emit_16(1706);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1707);
+emit_16(1642);
+emit_16(1707);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1708);
+emit_16(1643);
+emit_16(1708);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1709);
+emit_16(1644);
+emit_16(1709);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1710);
+emit_16(1645);
+emit_16(1710);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1711);
+emit_16(1646);
+emit_16(1711);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1712);
+emit_16(1647);
+emit_16(1712);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1713);
+emit_16(1648);
+emit_16(1713);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1714);
+emit_16(1649);
+emit_16(1714);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1715);
+emit_16(1650);
+emit_16(1715);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1716);
+emit_16(1651);
+emit_16(1716);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1717);
+emit_16(1652);
+emit_16(1717);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1718);
+emit_16(1653);
+emit_16(1718);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1719);
+emit_16(1654);
+emit_16(1719);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1720);
+emit_16(1655);
+emit_16(1720);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1721);
+emit_16(1656);
+emit_16(1721);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1722);
+emit_16(1657);
+emit_16(1722);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1723);
+emit_16(1658);
+emit_16(1723);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1724);
+emit_16(1659);
+emit_16(1724);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1725);
+emit_16(1660);
+emit_16(1725);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1726);
+emit_16(1661);
+emit_16(1726);
+emit_16(1662);
+emit_16(1727);
+emit_16(1663);
+emit_16(1727);
+emit_16(1662);
+emit_16(1728);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1729);
+emit_16(1664);
+emit_16(1729);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1730);
+emit_16(1665);
+emit_16(1730);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1731);
+emit_16(1666);
+emit_16(1731);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1732);
+emit_16(1667);
+emit_16(1732);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1733);
+emit_16(1668);
+emit_16(1733);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1734);
+emit_16(1669);
+emit_16(1734);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1735);
+emit_16(1670);
+emit_16(1735);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1736);
+emit_16(1671);
+emit_16(1736);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1737);
+emit_16(1672);
+emit_16(1737);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1738);
+emit_16(1673);
+emit_16(1738);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1739);
+emit_16(1674);
+emit_16(1739);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1740);
+emit_16(1675);
+emit_16(1740);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1741);
+emit_16(1676);
+emit_16(1741);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1742);
+emit_16(1677);
+emit_16(1742);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1743);
+emit_16(1678);
+emit_16(1743);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1744);
+emit_16(1679);
+emit_16(1744);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1745);
+emit_16(1680);
+emit_16(1745);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1746);
+emit_16(1681);
+emit_16(1746);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1747);
+emit_16(1682);
+emit_16(1747);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1748);
+emit_16(1683);
+emit_16(1748);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1749);
+emit_16(1684);
+emit_16(1749);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1750);
+emit_16(1685);
+emit_16(1750);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1751);
+emit_16(1686);
+emit_16(1751);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1752);
+emit_16(1687);
+emit_16(1752);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1753);
+emit_16(1688);
+emit_16(1753);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1754);
+emit_16(1689);
+emit_16(1754);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1755);
+emit_16(1690);
+emit_16(1755);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1756);
+emit_16(1691);
+emit_16(1756);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1757);
+emit_16(1692);
+emit_16(1757);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1758);
+emit_16(1693);
+emit_16(1758);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1759);
+emit_16(1694);
+emit_16(1759);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1760);
+emit_16(1695);
+emit_16(1760);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1761);
+emit_16(1696);
+emit_16(1761);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1762);
+emit_16(1697);
+emit_16(1762);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1763);
+emit_16(1698);
+emit_16(1763);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1764);
+emit_16(1699);
+emit_16(1764);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1765);
+emit_16(1700);
+emit_16(1765);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1766);
+emit_16(1701);
+emit_16(1766);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1767);
+emit_16(1702);
+emit_16(1767);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1768);
+emit_16(1703);
+emit_16(1768);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1769);
+emit_16(1704);
+emit_16(1769);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1770);
+emit_16(1705);
+emit_16(1770);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1771);
+emit_16(1706);
+emit_16(1771);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1772);
+emit_16(1707);
+emit_16(1772);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1773);
+emit_16(1708);
+emit_16(1773);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1774);
+emit_16(1709);
+emit_16(1774);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1775);
+emit_16(1710);
+emit_16(1775);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1776);
+emit_16(1711);
+emit_16(1776);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1777);
+emit_16(1712);
+emit_16(1777);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1778);
+emit_16(1713);
+emit_16(1778);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1779);
+emit_16(1714);
+emit_16(1779);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1780);
+emit_16(1715);
+emit_16(1780);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1781);
+emit_16(1716);
+emit_16(1781);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1782);
+emit_16(1717);
+emit_16(1782);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1783);
+emit_16(1718);
+emit_16(1783);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1784);
+emit_16(1719);
+emit_16(1784);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1785);
+emit_16(1720);
+emit_16(1785);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1786);
+emit_16(1721);
+emit_16(1786);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1787);
+emit_16(1722);
+emit_16(1787);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1788);
+emit_16(1723);
+emit_16(1788);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1789);
+emit_16(1724);
+emit_16(1789);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1790);
+emit_16(1725);
+emit_16(1790);
+emit_16(1726);
+emit_16(1791);
+emit_16(1727);
+emit_16(1791);
+emit_16(1726);
+emit_16(1792);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1793);
+emit_16(1728);
+emit_16(1793);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1794);
+emit_16(1729);
+emit_16(1794);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1795);
+emit_16(1730);
+emit_16(1795);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1796);
+emit_16(1731);
+emit_16(1796);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1797);
+emit_16(1732);
+emit_16(1797);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1798);
+emit_16(1733);
+emit_16(1798);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1799);
+emit_16(1734);
+emit_16(1799);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1800);
+emit_16(1735);
+emit_16(1800);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1801);
+emit_16(1736);
+emit_16(1801);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1802);
+emit_16(1737);
+emit_16(1802);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1803);
+emit_16(1738);
+emit_16(1803);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1804);
+emit_16(1739);
+emit_16(1804);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1805);
+emit_16(1740);
+emit_16(1805);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1806);
+emit_16(1741);
+emit_16(1806);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1807);
+emit_16(1742);
+emit_16(1807);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1808);
+emit_16(1743);
+emit_16(1808);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1809);
+emit_16(1744);
+emit_16(1809);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1810);
+emit_16(1745);
+emit_16(1810);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1811);
+emit_16(1746);
+emit_16(1811);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1812);
+emit_16(1747);
+emit_16(1812);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1813);
+emit_16(1748);
+emit_16(1813);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1814);
+emit_16(1749);
+emit_16(1814);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1815);
+emit_16(1750);
+emit_16(1815);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1816);
+emit_16(1751);
+emit_16(1816);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1817);
+emit_16(1752);
+emit_16(1817);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1818);
+emit_16(1753);
+emit_16(1818);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1819);
+emit_16(1754);
+emit_16(1819);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1820);
+emit_16(1755);
+emit_16(1820);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1821);
+emit_16(1756);
+emit_16(1821);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1822);
+emit_16(1757);
+emit_16(1822);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1823);
+emit_16(1758);
+emit_16(1823);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1824);
+emit_16(1759);
+emit_16(1824);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1825);
+emit_16(1760);
+emit_16(1825);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1826);
+emit_16(1761);
+emit_16(1826);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1827);
+emit_16(1762);
+emit_16(1827);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1828);
+emit_16(1763);
+emit_16(1828);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1829);
+emit_16(1764);
+emit_16(1829);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1830);
+emit_16(1765);
+emit_16(1830);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1831);
+emit_16(1766);
+emit_16(1831);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1832);
+emit_16(1767);
+emit_16(1832);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1833);
+emit_16(1768);
+emit_16(1833);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1834);
+emit_16(1769);
+emit_16(1834);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1835);
+emit_16(1770);
+emit_16(1835);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1836);
+emit_16(1771);
+emit_16(1836);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1837);
+emit_16(1772);
+emit_16(1837);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1838);
+emit_16(1773);
+emit_16(1838);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1839);
+emit_16(1774);
+emit_16(1839);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1840);
+emit_16(1775);
+emit_16(1840);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1841);
+emit_16(1776);
+emit_16(1841);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1842);
+emit_16(1777);
+emit_16(1842);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1843);
+emit_16(1778);
+emit_16(1843);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1844);
+emit_16(1779);
+emit_16(1844);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1845);
+emit_16(1780);
+emit_16(1845);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1846);
+emit_16(1781);
+emit_16(1846);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1847);
+emit_16(1782);
+emit_16(1847);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1848);
+emit_16(1783);
+emit_16(1848);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1849);
+emit_16(1784);
+emit_16(1849);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1850);
+emit_16(1785);
+emit_16(1850);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1851);
+emit_16(1786);
+emit_16(1851);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1852);
+emit_16(1787);
+emit_16(1852);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1853);
+emit_16(1788);
+emit_16(1853);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1854);
+emit_16(1789);
+emit_16(1854);
+emit_16(1790);
+emit_16(1855);
+emit_16(1791);
+emit_16(1855);
+emit_16(1790);
+emit_16(1856);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1857);
+emit_16(1792);
+emit_16(1857);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1858);
+emit_16(1793);
+emit_16(1858);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1859);
+emit_16(1794);
+emit_16(1859);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1860);
+emit_16(1795);
+emit_16(1860);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1861);
+emit_16(1796);
+emit_16(1861);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1862);
+emit_16(1797);
+emit_16(1862);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1863);
+emit_16(1798);
+emit_16(1863);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1864);
+emit_16(1799);
+emit_16(1864);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1865);
+emit_16(1800);
+emit_16(1865);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1866);
+emit_16(1801);
+emit_16(1866);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1867);
+emit_16(1802);
+emit_16(1867);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1868);
+emit_16(1803);
+emit_16(1868);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1869);
+emit_16(1804);
+emit_16(1869);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1870);
+emit_16(1805);
+emit_16(1870);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1871);
+emit_16(1806);
+emit_16(1871);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1872);
+emit_16(1807);
+emit_16(1872);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1873);
+emit_16(1808);
+emit_16(1873);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1874);
+emit_16(1809);
+emit_16(1874);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1875);
+emit_16(1810);
+emit_16(1875);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1876);
+emit_16(1811);
+emit_16(1876);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1877);
+emit_16(1812);
+emit_16(1877);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1878);
+emit_16(1813);
+emit_16(1878);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1879);
+emit_16(1814);
+emit_16(1879);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1880);
+emit_16(1815);
+emit_16(1880);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1881);
+emit_16(1816);
+emit_16(1881);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1882);
+emit_16(1817);
+emit_16(1882);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1883);
+emit_16(1818);
+emit_16(1883);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1884);
+emit_16(1819);
+emit_16(1884);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1885);
+emit_16(1820);
+emit_16(1885);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1886);
+emit_16(1821);
+emit_16(1886);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1887);
+emit_16(1822);
+emit_16(1887);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1888);
+emit_16(1823);
+emit_16(1888);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1889);
+emit_16(1824);
+emit_16(1889);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1890);
+emit_16(1825);
+emit_16(1890);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1891);
+emit_16(1826);
+emit_16(1891);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1892);
+emit_16(1827);
+emit_16(1892);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1893);
+emit_16(1828);
+emit_16(1893);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1894);
+emit_16(1829);
+emit_16(1894);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1895);
+emit_16(1830);
+emit_16(1895);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1896);
+emit_16(1831);
+emit_16(1896);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1897);
+emit_16(1832);
+emit_16(1897);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1898);
+emit_16(1833);
+emit_16(1898);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1899);
+emit_16(1834);
+emit_16(1899);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1900);
+emit_16(1835);
+emit_16(1900);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1901);
+emit_16(1836);
+emit_16(1901);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1902);
+emit_16(1837);
+emit_16(1902);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1903);
+emit_16(1838);
+emit_16(1903);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1904);
+emit_16(1839);
+emit_16(1904);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1905);
+emit_16(1840);
+emit_16(1905);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1906);
+emit_16(1841);
+emit_16(1906);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1907);
+emit_16(1842);
+emit_16(1907);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1908);
+emit_16(1843);
+emit_16(1908);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1909);
+emit_16(1844);
+emit_16(1909);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1910);
+emit_16(1845);
+emit_16(1910);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1911);
+emit_16(1846);
+emit_16(1911);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1912);
+emit_16(1847);
+emit_16(1912);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1913);
+emit_16(1848);
+emit_16(1913);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1914);
+emit_16(1849);
+emit_16(1914);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1915);
+emit_16(1850);
+emit_16(1915);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1916);
+emit_16(1851);
+emit_16(1916);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1917);
+emit_16(1852);
+emit_16(1917);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1918);
+emit_16(1853);
+emit_16(1918);
+emit_16(1854);
+emit_16(1919);
+emit_16(1855);
+emit_16(1919);
+emit_16(1854);
+emit_16(1920);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1921);
+emit_16(1856);
+emit_16(1921);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1922);
+emit_16(1857);
+emit_16(1922);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1923);
+emit_16(1858);
+emit_16(1923);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1924);
+emit_16(1859);
+emit_16(1924);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1925);
+emit_16(1860);
+emit_16(1925);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1926);
+emit_16(1861);
+emit_16(1926);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1927);
+emit_16(1862);
+emit_16(1927);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1928);
+emit_16(1863);
+emit_16(1928);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1929);
+emit_16(1864);
+emit_16(1929);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1930);
+emit_16(1865);
+emit_16(1930);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1931);
+emit_16(1866);
+emit_16(1931);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1932);
+emit_16(1867);
+emit_16(1932);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1933);
+emit_16(1868);
+emit_16(1933);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1934);
+emit_16(1869);
+emit_16(1934);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1935);
+emit_16(1870);
+emit_16(1935);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1936);
+emit_16(1871);
+emit_16(1936);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1937);
+emit_16(1872);
+emit_16(1937);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1938);
+emit_16(1873);
+emit_16(1938);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1939);
+emit_16(1874);
+emit_16(1939);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1940);
+emit_16(1875);
+emit_16(1940);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1941);
+emit_16(1876);
+emit_16(1941);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1942);
+emit_16(1877);
+emit_16(1942);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1943);
+emit_16(1878);
+emit_16(1943);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1944);
+emit_16(1879);
+emit_16(1944);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1945);
+emit_16(1880);
+emit_16(1945);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1946);
+emit_16(1881);
+emit_16(1946);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1947);
+emit_16(1882);
+emit_16(1947);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1948);
+emit_16(1883);
+emit_16(1948);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1949);
+emit_16(1884);
+emit_16(1949);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1950);
+emit_16(1885);
+emit_16(1950);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1951);
+emit_16(1886);
+emit_16(1951);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1952);
+emit_16(1887);
+emit_16(1952);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1953);
+emit_16(1888);
+emit_16(1953);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1954);
+emit_16(1889);
+emit_16(1954);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1955);
+emit_16(1890);
+emit_16(1955);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1956);
+emit_16(1891);
+emit_16(1956);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1957);
+emit_16(1892);
+emit_16(1957);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1958);
+emit_16(1893);
+emit_16(1958);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1959);
+emit_16(1894);
+emit_16(1959);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1960);
+emit_16(1895);
+emit_16(1960);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1961);
+emit_16(1896);
+emit_16(1961);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1962);
+emit_16(1897);
+emit_16(1962);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1963);
+emit_16(1898);
+emit_16(1963);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1964);
+emit_16(1899);
+emit_16(1964);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1965);
+emit_16(1900);
+emit_16(1965);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1966);
+emit_16(1901);
+emit_16(1966);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1967);
+emit_16(1902);
+emit_16(1967);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1968);
+emit_16(1903);
+emit_16(1968);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1969);
+emit_16(1904);
+emit_16(1969);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1970);
+emit_16(1905);
+emit_16(1970);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1971);
+emit_16(1906);
+emit_16(1971);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1972);
+emit_16(1907);
+emit_16(1972);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1973);
+emit_16(1908);
+emit_16(1973);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1974);
+emit_16(1909);
+emit_16(1974);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1975);
+emit_16(1910);
+emit_16(1975);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1976);
+emit_16(1911);
+emit_16(1976);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1977);
+emit_16(1912);
+emit_16(1977);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1978);
+emit_16(1913);
+emit_16(1978);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1979);
+emit_16(1914);
+emit_16(1979);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1980);
+emit_16(1915);
+emit_16(1980);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1981);
+emit_16(1916);
+emit_16(1981);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1982);
+emit_16(1917);
+emit_16(1982);
+emit_16(1918);
+emit_16(1983);
+emit_16(1919);
+emit_16(1983);
+emit_16(1918);
+emit_16(1984);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1985);
+emit_16(1920);
+emit_16(1985);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1986);
+emit_16(1921);
+emit_16(1986);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1987);
+emit_16(1922);
+emit_16(1987);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1988);
+emit_16(1923);
+emit_16(1988);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1989);
+emit_16(1924);
+emit_16(1989);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1990);
+emit_16(1925);
+emit_16(1990);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1991);
+emit_16(1926);
+emit_16(1991);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1992);
+emit_16(1927);
+emit_16(1992);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1993);
+emit_16(1928);
+emit_16(1993);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1994);
+emit_16(1929);
+emit_16(1994);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1995);
+emit_16(1930);
+emit_16(1995);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1996);
+emit_16(1931);
+emit_16(1996);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1997);
+emit_16(1932);
+emit_16(1997);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1998);
+emit_16(1933);
+emit_16(1998);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(1999);
+emit_16(1934);
+emit_16(1999);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2000);
+emit_16(1935);
+emit_16(2000);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2001);
+emit_16(1936);
+emit_16(2001);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2002);
+emit_16(1937);
+emit_16(2002);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2003);
+emit_16(1938);
+emit_16(2003);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2004);
+emit_16(1939);
+emit_16(2004);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2005);
+emit_16(1940);
+emit_16(2005);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2006);
+emit_16(1941);
+emit_16(2006);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2007);
+emit_16(1942);
+emit_16(2007);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2008);
+emit_16(1943);
+emit_16(2008);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2009);
+emit_16(1944);
+emit_16(2009);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2010);
+emit_16(1945);
+emit_16(2010);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2011);
+emit_16(1946);
+emit_16(2011);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2012);
+emit_16(1947);
+emit_16(2012);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2013);
+emit_16(1948);
+emit_16(2013);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2014);
+emit_16(1949);
+emit_16(2014);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2015);
+emit_16(1950);
+emit_16(2015);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2016);
+emit_16(1951);
+emit_16(2016);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2017);
+emit_16(1952);
+emit_16(2017);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2018);
+emit_16(1953);
+emit_16(2018);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2019);
+emit_16(1954);
+emit_16(2019);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2020);
+emit_16(1955);
+emit_16(2020);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2021);
+emit_16(1956);
+emit_16(2021);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2022);
+emit_16(1957);
+emit_16(2022);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2023);
+emit_16(1958);
+emit_16(2023);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2024);
+emit_16(1959);
+emit_16(2024);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2025);
+emit_16(1960);
+emit_16(2025);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2026);
+emit_16(1961);
+emit_16(2026);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2027);
+emit_16(1962);
+emit_16(2027);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2028);
+emit_16(1963);
+emit_16(2028);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2029);
+emit_16(1964);
+emit_16(2029);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2030);
+emit_16(1965);
+emit_16(2030);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2031);
+emit_16(1966);
+emit_16(2031);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2032);
+emit_16(1967);
+emit_16(2032);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2033);
+emit_16(1968);
+emit_16(2033);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2034);
+emit_16(1969);
+emit_16(2034);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2035);
+emit_16(1970);
+emit_16(2035);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2036);
+emit_16(1971);
+emit_16(2036);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2037);
+emit_16(1972);
+emit_16(2037);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2038);
+emit_16(1973);
+emit_16(2038);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2039);
+emit_16(1974);
+emit_16(2039);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2040);
+emit_16(1975);
+emit_16(2040);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2041);
+emit_16(1976);
+emit_16(2041);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2042);
+emit_16(1977);
+emit_16(2042);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2043);
+emit_16(1978);
+emit_16(2043);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2044);
+emit_16(1979);
+emit_16(2044);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2045);
+emit_16(1980);
+emit_16(2045);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2046);
+emit_16(1981);
+emit_16(2046);
+emit_16(1982);
+emit_16(2047);
+emit_16(1983);
+emit_16(2047);
+emit_16(1982);
+emit_16(2048);
+emit_16(1984);
+emit_16(2049);
+emit_16(1985);
+emit_16(2049);
+emit_16(1984);
+emit_16(2049);
+emit_16(1985);
+emit_16(2050);
+emit_16(1986);
+emit_16(2050);
+emit_16(1985);
+emit_16(2050);
+emit_16(1986);
+emit_16(2051);
+emit_16(1987);
+emit_16(2051);
+emit_16(1986);
+emit_16(2051);
+emit_16(1987);
+emit_16(2052);
+emit_16(1988);
+emit_16(2052);
+emit_16(1987);
+emit_16(2052);
+emit_16(1988);
+emit_16(2053);
+emit_16(1989);
+emit_16(2053);
+emit_16(1988);
+emit_16(2053);
+emit_16(1989);
+emit_16(2054);
+emit_16(1990);
+emit_16(2054);
+emit_16(1989);
+emit_16(2054);
+emit_16(1990);
+emit_16(2055);
+emit_16(1991);
+emit_16(2055);
+emit_16(1990);
+emit_16(2055);
+emit_16(1991);
+emit_16(2056);
+emit_16(1992);
+emit_16(2056);
+emit_16(1991);
+emit_16(2056);
+emit_16(1992);
+emit_16(2057);
+emit_16(1993);
+emit_16(2057);
+emit_16(1992);
+emit_16(2057);
+emit_16(1993);
+emit_16(2058);
+emit_16(1994);
+emit_16(2058);
+emit_16(1993);
+emit_16(2058);
+emit_16(1994);
+emit_16(2059);
+emit_16(1995);
+emit_16(2059);
+emit_16(1994);
+emit_16(2059);
+emit_16(1995);
+emit_16(2060);
+emit_16(1996);
+emit_16(2060);
+emit_16(1995);
+emit_16(2060);
+emit_16(1996);
+emit_16(2061);
+emit_16(1997);
+emit_16(2061);
+emit_16(1996);
+emit_16(2061);
+emit_16(1997);
+emit_16(2062);
+emit_16(1998);
+emit_16(2062);
+emit_16(1997);
+emit_16(2062);
+emit_16(1998);
+emit_16(2063);
+emit_16(1999);
+emit_16(2063);
+emit_16(1998);
+emit_16(2063);
+emit_16(1999);
+emit_16(2064);
+emit_16(2000);
+emit_16(2064);
+emit_16(1999);
+emit_16(2064);
+emit_16(2000);
+emit_16(2065);
+emit_16(2001);
+emit_16(2065);
+emit_16(2000);
+emit_16(2065);
+emit_16(2001);
+emit_16(2066);
+emit_16(2002);
+emit_16(2066);
+emit_16(2001);
+emit_16(2066);
+emit_16(2002);
+emit_16(2067);
+emit_16(2003);
+emit_16(2067);
+emit_16(2002);
+emit_16(2067);
+emit_16(2003);
+emit_16(2068);
+emit_16(2004);
+emit_16(2068);
+emit_16(2003);
+emit_16(2068);
+emit_16(2004);
+emit_16(2069);
+emit_16(2005);
+emit_16(2069);
+emit_16(2004);
+emit_16(2069);
+emit_16(2005);
+emit_16(2070);
+emit_16(2006);
+emit_16(2070);
+emit_16(2005);
+emit_16(2070);
+emit_16(2006);
+emit_16(2071);
+emit_16(2007);
+emit_16(2071);
+emit_16(2006);
+emit_16(2071);
+emit_16(2007);
+emit_16(2072);
+emit_16(2008);
+emit_16(2072);
+emit_16(2007);
+emit_16(2072);
+emit_16(2008);
+emit_16(2073);
+emit_16(2009);
+emit_16(2073);
+emit_16(2008);
+emit_16(2073);
+emit_16(2009);
+emit_16(2074);
+emit_16(2010);
+emit_16(2074);
+emit_16(2009);
+emit_16(2074);
+emit_16(2010);
+emit_16(2075);
+emit_16(2011);
+emit_16(2075);
+emit_16(2010);
+emit_16(2075);
+emit_16(2011);
+emit_16(2076);
+emit_16(2012);
+emit_16(2076);
+emit_16(2011);
+emit_16(2076);
+emit_16(2012);
+emit_16(2077);
+emit_16(2013);
+emit_16(2077);
+emit_16(2012);
+emit_16(2077);
+emit_16(2013);
+emit_16(2078);
+emit_16(2014);
+emit_16(2078);
+emit_16(2013);
+emit_16(2078);
+emit_16(2014);
+emit_16(2079);
+emit_16(2015);
+emit_16(2079);
+emit_16(2014);
+emit_16(2079);
+emit_16(2015);
+emit_16(2080);
+emit_16(2016);
+emit_16(2080);
+emit_16(2015);
+emit_16(2080);
+emit_16(2016);
+emit_16(2081);
+emit_16(2017);
+emit_16(2081);
+emit_16(2016);
+emit_16(2081);
+emit_16(2017);
+emit_16(2082);
+emit_16(2018);
+emit_16(2082);
+emit_16(2017);
+emit_16(2082);
+emit_16(2018);
+emit_16(2083);
+emit_16(2019);
+emit_16(2083);
+emit_16(2018);
+emit_16(2083);
+emit_16(2019);
+emit_16(2084);
+emit_16(2020);
+emit_16(2084);
+emit_16(2019);
+emit_16(2084);
+emit_16(2020);
+emit_16(2085);
+emit_16(2021);
+emit_16(2085);
+emit_16(2020);
+emit_16(2085);
+emit_16(2021);
+emit_16(2086);
+emit_16(2022);
+emit_16(2086);
+emit_16(2021);
+emit_16(2086);
+emit_16(2022);
+emit_16(2087);
+emit_16(2023);
+emit_16(2087);
+emit_16(2022);
+emit_16(2087);
+emit_16(2023);
+emit_16(2088);
+emit_16(2024);
+emit_16(2088);
+emit_16(2023);
+emit_16(2088);
+emit_16(2024);
+emit_16(2089);
+emit_16(2025);
+emit_16(2089);
+emit_16(2024);
+emit_16(2089);
+emit_16(2025);
+emit_16(2090);
+emit_16(2026);
+emit_16(2090);
+emit_16(2025);
+emit_16(2090);
+emit_16(2026);
+emit_16(2091);
+emit_16(2027);
+emit_16(2091);
+emit_16(2026);
+emit_16(2091);
+emit_16(2027);
+emit_16(2092);
+emit_16(2028);
+emit_16(2092);
+emit_16(2027);
+emit_16(2092);
+emit_16(2028);
+emit_16(2093);
+emit_16(2029);
+emit_16(2093);
+emit_16(2028);
+emit_16(2093);
+emit_16(2029);
+emit_16(2094);
+emit_16(2030);
+emit_16(2094);
+emit_16(2029);
+emit_16(2094);
+emit_16(2030);
+emit_16(2095);
+emit_16(2031);
+emit_16(2095);
+emit_16(2030);
+emit_16(2095);
+emit_16(2031);
+emit_16(2096);
+emit_16(2032);
+emit_16(2096);
+emit_16(2031);
+emit_16(2096);
+emit_16(2032);
+emit_16(2097);
+emit_16(2033);
+emit_16(2097);
+emit_16(2032);
+emit_16(2097);
+emit_16(2033);
+emit_16(2098);
+emit_16(2034);
+emit_16(2098);
+emit_16(2033);
+emit_16(2098);
+emit_16(2034);
+emit_16(2099);
+emit_16(2035);
+emit_16(2099);
+emit_16(2034);
+emit_16(2099);
+emit_16(2035);
+emit_16(2100);
+emit_16(2036);
+emit_16(2100);
+emit_16(2035);
+emit_16(2100);
+emit_16(2036);
+emit_16(2101);
+emit_16(2037);
+emit_16(2101);
+emit_16(2036);
+emit_16(2101);
+emit_16(2037);
+emit_16(2102);
+emit_16(2038);
+emit_16(2102);
+emit_16(2037);
+emit_16(2102);
+emit_16(2038);
+emit_16(2103);
+emit_16(2039);
+emit_16(2103);
+emit_16(2038);
+emit_16(2103);
+emit_16(2039);
+emit_16(2104);
+emit_16(2040);
+emit_16(2104);
+emit_16(2039);
+emit_16(2104);
+emit_16(2040);
+emit_16(2105);
+emit_16(2041);
+emit_16(2105);
+emit_16(2040);
+emit_16(2105);
+emit_16(2041);
+emit_16(2106);
+emit_16(2042);
+emit_16(2106);
+emit_16(2041);
+emit_16(2106);
+emit_16(2042);
+emit_16(2107);
+emit_16(2043);
+emit_16(2107);
+emit_16(2042);
+emit_16(2107);
+emit_16(2043);
+emit_16(2108);
+emit_16(2044);
+emit_16(2108);
+emit_16(2043);
+emit_16(2108);
+emit_16(2044);
+emit_16(2109);
+emit_16(2045);
+emit_16(2109);
+emit_16(2044);
+emit_16(2109);
+emit_16(2045);
+emit_16(2110);
+emit_16(2046);
+emit_16(2110);
+emit_16(2045);
+emit_16(2110);
+emit_16(2046);
+emit_16(2111);
+emit_16(2047);
+emit_16(2111);
+emit_16(2046);
+emit_16(2112);
+emit_16(2048);
+emit_16(2113);
+emit_16(2049);
+emit_16(2113);
+emit_16(2048);
+emit_16(2113);
+emit_16(2049);
+emit_16(2114);
+emit_16(2050);
+emit_16(2114);
+emit_16(2049);
+emit_16(2114);
+emit_16(2050);
+emit_16(2115);
+emit_16(2051);
+emit_16(2115);
+emit_16(2050);
+emit_16(2115);
+emit_16(2051);
+emit_16(2116);
+emit_16(2052);
+emit_16(2116);
+emit_16(2051);
+emit_16(2116);
+emit_16(2052);
+emit_16(2117);
+emit_16(2053);
+emit_16(2117);
+emit_16(2052);
+emit_16(2117);
+emit_16(2053);
+emit_16(2118);
+emit_16(2054);
+emit_16(2118);
+emit_16(2053);
+emit_16(2118);
+emit_16(2054);
+emit_16(2119);
+emit_16(2055);
+emit_16(2119);
+emit_16(2054);
+emit_16(2119);
+emit_16(2055);
+emit_16(2120);
+emit_16(2056);
+emit_16(2120);
+emit_16(2055);
+emit_16(2120);
+emit_16(2056);
+emit_16(2121);
+emit_16(2057);
+emit_16(2121);
+emit_16(2056);
+emit_16(2121);
+emit_16(2057);
+emit_16(2122);
+emit_16(2058);
+emit_16(2122);
+emit_16(2057);
+emit_16(2122);
+emit_16(2058);
+emit_16(2123);
+emit_16(2059);
+emit_16(2123);
+emit_16(2058);
+emit_16(2123);
+emit_16(2059);
+emit_16(2124);
+emit_16(2060);
+emit_16(2124);
+emit_16(2059);
+emit_16(2124);
+emit_16(2060);
+emit_16(2125);
+emit_16(2061);
+emit_16(2125);
+emit_16(2060);
+emit_16(2125);
+emit_16(2061);
+emit_16(2126);
+emit_16(2062);
+emit_16(2126);
+emit_16(2061);
+emit_16(2126);
+emit_16(2062);
+emit_16(2127);
+emit_16(2063);
+emit_16(2127);
+emit_16(2062);
+emit_16(2127);
+emit_16(2063);
+emit_16(2128);
+emit_16(2064);
+emit_16(2128);
+emit_16(2063);
+emit_16(2128);
+emit_16(2064);
+emit_16(2129);
+emit_16(2065);
+emit_16(2129);
+emit_16(2064);
+emit_16(2129);
+emit_16(2065);
+emit_16(2130);
+emit_16(2066);
+emit_16(2130);
+emit_16(2065);
+emit_16(2130);
+emit_16(2066);
+emit_16(2131);
+emit_16(2067);
+emit_16(2131);
+emit_16(2066);
+emit_16(2131);
+emit_16(2067);
+emit_16(2132);
+emit_16(2068);
+emit_16(2132);
+emit_16(2067);
+emit_16(2132);
+emit_16(2068);
+emit_16(2133);
+emit_16(2069);
+emit_16(2133);
+emit_16(2068);
+emit_16(2133);
+emit_16(2069);
+emit_16(2134);
+emit_16(2070);
+emit_16(2134);
+emit_16(2069);
+emit_16(2134);
+emit_16(2070);
+emit_16(2135);
+emit_16(2071);
+emit_16(2135);
+emit_16(2070);
+emit_16(2135);
+emit_16(2071);
+emit_16(2136);
+emit_16(2072);
+emit_16(2136);
+emit_16(2071);
+emit_16(2136);
+emit_16(2072);
+emit_16(2137);
+emit_16(2073);
+emit_16(2137);
+emit_16(2072);
+emit_16(2137);
+emit_16(2073);
+emit_16(2138);
+emit_16(2074);
+emit_16(2138);
+emit_16(2073);
+emit_16(2138);
+emit_16(2074);
+emit_16(2139);
+emit_16(2075);
+emit_16(2139);
+emit_16(2074);
+emit_16(2139);
+emit_16(2075);
+emit_16(2140);
+emit_16(2076);
+emit_16(2140);
+emit_16(2075);
+emit_16(2140);
+emit_16(2076);
+emit_16(2141);
+emit_16(2077);
+emit_16(2141);
+emit_16(2076);
+emit_16(2141);
+emit_16(2077);
+emit_16(2142);
+emit_16(2078);
+emit_16(2142);
+emit_16(2077);
+emit_16(2142);
+emit_16(2078);
+emit_16(2143);
+emit_16(2079);
+emit_16(2143);
+emit_16(2078);
+emit_16(2143);
+emit_16(2079);
+emit_16(2144);
+emit_16(2080);
+emit_16(2144);
+emit_16(2079);
+emit_16(2144);
+emit_16(2080);
+emit_16(2145);
+emit_16(2081);
+emit_16(2145);
+emit_16(2080);
+emit_16(2145);
+emit_16(2081);
+emit_16(2146);
+emit_16(2082);
+emit_16(2146);
+emit_16(2081);
+emit_16(2146);
+emit_16(2082);
+emit_16(2147);
+emit_16(2083);
+emit_16(2147);
+emit_16(2082);
+emit_16(2147);
+emit_16(2083);
+emit_16(2148);
+emit_16(2084);
+emit_16(2148);
+emit_16(2083);
+emit_16(2148);
+emit_16(2084);
+emit_16(2149);
+emit_16(2085);
+emit_16(2149);
+emit_16(2084);
+emit_16(2149);
+emit_16(2085);
+emit_16(2150);
+emit_16(2086);
+emit_16(2150);
+emit_16(2085);
+emit_16(2150);
+emit_16(2086);
+emit_16(2151);
+emit_16(2087);
+emit_16(2151);
+emit_16(2086);
+emit_16(2151);
+emit_16(2087);
+emit_16(2152);
+emit_16(2088);
+emit_16(2152);
+emit_16(2087);
+emit_16(2152);
+emit_16(2088);
+emit_16(2153);
+emit_16(2089);
+emit_16(2153);
+emit_16(2088);
+emit_16(2153);
+emit_16(2089);
+emit_16(2154);
+emit_16(2090);
+emit_16(2154);
+emit_16(2089);
+emit_16(2154);
+emit_16(2090);
+emit_16(2155);
+emit_16(2091);
+emit_16(2155);
+emit_16(2090);
+emit_16(2155);
+emit_16(2091);
+emit_16(2156);
+emit_16(2092);
+emit_16(2156);
+emit_16(2091);
+emit_16(2156);
+emit_16(2092);
+emit_16(2157);
+emit_16(2093);
+emit_16(2157);
+emit_16(2092);
+emit_16(2157);
+emit_16(2093);
+emit_16(2158);
+emit_16(2094);
+emit_16(2158);
+emit_16(2093);
+emit_16(2158);
+emit_16(2094);
+emit_16(2159);
+emit_16(2095);
+emit_16(2159);
+emit_16(2094);
+emit_16(2159);
+emit_16(2095);
+emit_16(2160);
+emit_16(2096);
+emit_16(2160);
+emit_16(2095);
+emit_16(2160);
+emit_16(2096);
+emit_16(2161);
+emit_16(2097);
+emit_16(2161);
+emit_16(2096);
+emit_16(2161);
+emit_16(2097);
+emit_16(2162);
+emit_16(2098);
+emit_16(2162);
+emit_16(2097);
+emit_16(2162);
+emit_16(2098);
+emit_16(2163);
+emit_16(2099);
+emit_16(2163);
+emit_16(2098);
+emit_16(2163);
+emit_16(2099);
+emit_16(2164);
+emit_16(2100);
+emit_16(2164);
+emit_16(2099);
+emit_16(2164);
+emit_16(2100);
+emit_16(2165);
+emit_16(2101);
+emit_16(2165);
+emit_16(2100);
+emit_16(2165);
+emit_16(2101);
+emit_16(2166);
+emit_16(2102);
+emit_16(2166);
+emit_16(2101);
+emit_16(2166);
+emit_16(2102);
+emit_16(2167);
+emit_16(2103);
+emit_16(2167);
+emit_16(2102);
+emit_16(2167);
+emit_16(2103);
+emit_16(2168);
+emit_16(2104);
+emit_16(2168);
+emit_16(2103);
+emit_16(2168);
+emit_16(2104);
+emit_16(2169);
+emit_16(2105);
+emit_16(2169);
+emit_16(2104);
+emit_16(2169);
+emit_16(2105);
+emit_16(2170);
+emit_16(2106);
+emit_16(2170);
+emit_16(2105);
+emit_16(2170);
+emit_16(2106);
+emit_16(2171);
+emit_16(2107);
+emit_16(2171);
+emit_16(2106);
+emit_16(2171);
+emit_16(2107);
+emit_16(2172);
+emit_16(2108);
+emit_16(2172);
+emit_16(2107);
+emit_16(2172);
+emit_16(2108);
+emit_16(2173);
+emit_16(2109);
+emit_16(2173);
+emit_16(2108);
+emit_16(2173);
+emit_16(2109);
+emit_16(2174);
+emit_16(2110);
+emit_16(2174);
+emit_16(2109);
+emit_16(2174);
+emit_16(2110);
+emit_16(2175);
+emit_16(2111);
+emit_16(2175);
+emit_16(2110);
+emit_16(2176);
+emit_16(2112);
+emit_16(2177);
+emit_16(2113);
+emit_16(2177);
+emit_16(2112);
+emit_16(2177);
+emit_16(2113);
+emit_16(2178);
+emit_16(2114);
+emit_16(2178);
+emit_16(2113);
+emit_16(2178);
+emit_16(2114);
+emit_16(2179);
+emit_16(2115);
+emit_16(2179);
+emit_16(2114);
+emit_16(2179);
+emit_16(2115);
+emit_16(2180);
+emit_16(2116);
+emit_16(2180);
+emit_16(2115);
+emit_16(2180);
+emit_16(2116);
+emit_16(2181);
+emit_16(2117);
+emit_16(2181);
+emit_16(2116);
+emit_16(2181);
+emit_16(2117);
+emit_16(2182);
+emit_16(2118);
+emit_16(2182);
+emit_16(2117);
+emit_16(2182);
+emit_16(2118);
+emit_16(2183);
+emit_16(2119);
+emit_16(2183);
+emit_16(2118);
+emit_16(2183);
+emit_16(2119);
+emit_16(2184);
+emit_16(2120);
+emit_16(2184);
+emit_16(2119);
+emit_16(2184);
+emit_16(2120);
+emit_16(2185);
+emit_16(2121);
+emit_16(2185);
+emit_16(2120);
+emit_16(2185);
+emit_16(2121);
+emit_16(2186);
+emit_16(2122);
+emit_16(2186);
+emit_16(2121);
+emit_16(2186);
+emit_16(2122);
+emit_16(2187);
+emit_16(2123);
+emit_16(2187);
+emit_16(2122);
+emit_16(2187);
+emit_16(2123);
+emit_16(2188);
+emit_16(2124);
+emit_16(2188);
+emit_16(2123);
+emit_16(2188);
+emit_16(2124);
+emit_16(2189);
+emit_16(2125);
+emit_16(2189);
+emit_16(2124);
+emit_16(2189);
+emit_16(2125);
+emit_16(2190);
+emit_16(2126);
+emit_16(2190);
+emit_16(2125);
+emit_16(2190);
+emit_16(2126);
+emit_16(2191);
+emit_16(2127);
+emit_16(2191);
+emit_16(2126);
+emit_16(2191);
+emit_16(2127);
+emit_16(2192);
+emit_16(2128);
+emit_16(2192);
+emit_16(2127);
+emit_16(2192);
+emit_16(2128);
+emit_16(2193);
+emit_16(2129);
+emit_16(2193);
+emit_16(2128);
+emit_16(2193);
+emit_16(2129);
+emit_16(2194);
+emit_16(2130);
+emit_16(2194);
+emit_16(2129);
+emit_16(2194);
+emit_16(2130);
+emit_16(2195);
+emit_16(2131);
+emit_16(2195);
+emit_16(2130);
+emit_16(2195);
+emit_16(2131);
+emit_16(2196);
+emit_16(2132);
+emit_16(2196);
+emit_16(2131);
+emit_16(2196);
+emit_16(2132);
+emit_16(2197);
+emit_16(2133);
+emit_16(2197);
+emit_16(2132);
+emit_16(2197);
+emit_16(2133);
+emit_16(2198);
+emit_16(2134);
+emit_16(2198);
+emit_16(2133);
+emit_16(2198);
+emit_16(2134);
+emit_16(2199);
+emit_16(2135);
+emit_16(2199);
+emit_16(2134);
+emit_16(2199);
+emit_16(2135);
+emit_16(2200);
+emit_16(2136);
+emit_16(2200);
+emit_16(2135);
+emit_16(2200);
+emit_16(2136);
+emit_16(2201);
+emit_16(2137);
+emit_16(2201);
+emit_16(2136);
+emit_16(2201);
+emit_16(2137);
+emit_16(2202);
+emit_16(2138);
+emit_16(2202);
+emit_16(2137);
+emit_16(2202);
+emit_16(2138);
+emit_16(2203);
+emit_16(2139);
+emit_16(2203);
+emit_16(2138);
+emit_16(2203);
+emit_16(2139);
+emit_16(2204);
+emit_16(2140);
+emit_16(2204);
+emit_16(2139);
+emit_16(2204);
+emit_16(2140);
+emit_16(2205);
+emit_16(2141);
+emit_16(2205);
+emit_16(2140);
+emit_16(2205);
+emit_16(2141);
+emit_16(2206);
+emit_16(2142);
+emit_16(2206);
+emit_16(2141);
+emit_16(2206);
+emit_16(2142);
+emit_16(2207);
+emit_16(2143);
+emit_16(2207);
+emit_16(2142);
+emit_16(2207);
+emit_16(2143);
+emit_16(2208);
+emit_16(2144);
+emit_16(2208);
+emit_16(2143);
+emit_16(2208);
+emit_16(2144);
+emit_16(2209);
+emit_16(2145);
+emit_16(2209);
+emit_16(2144);
+emit_16(2209);
+emit_16(2145);
+emit_16(2210);
+emit_16(2146);
+emit_16(2210);
+emit_16(2145);
+emit_16(2210);
+emit_16(2146);
+emit_16(2211);
+emit_16(2147);
+emit_16(2211);
+emit_16(2146);
+emit_16(2211);
+emit_16(2147);
+emit_16(2212);
+emit_16(2148);
+emit_16(2212);
+emit_16(2147);
+emit_16(2212);
+emit_16(2148);
+emit_16(2213);
+emit_16(2149);
+emit_16(2213);
+emit_16(2148);
+emit_16(2213);
+emit_16(2149);
+emit_16(2214);
+emit_16(2150);
+emit_16(2214);
+emit_16(2149);
+emit_16(2214);
+emit_16(2150);
+emit_16(2215);
+emit_16(2151);
+emit_16(2215);
+emit_16(2150);
+emit_16(2215);
+emit_16(2151);
+emit_16(2216);
+emit_16(2152);
+emit_16(2216);
+emit_16(2151);
+emit_16(2216);
+emit_16(2152);
+emit_16(2217);
+emit_16(2153);
+emit_16(2217);
+emit_16(2152);
+emit_16(2217);
+emit_16(2153);
+emit_16(2218);
+emit_16(2154);
+emit_16(2218);
+emit_16(2153);
+emit_16(2218);
+emit_16(2154);
+emit_16(2219);
+emit_16(2155);
+emit_16(2219);
+emit_16(2154);
+emit_16(2219);
+emit_16(2155);
+emit_16(2220);
+emit_16(2156);
+emit_16(2220);
+emit_16(2155);
+emit_16(2220);
+emit_16(2156);
+emit_16(2221);
+emit_16(2157);
+emit_16(2221);
+emit_16(2156);
+emit_16(2221);
+emit_16(2157);
+emit_16(2222);
+emit_16(2158);
+emit_16(2222);
+emit_16(2157);
+emit_16(2222);
+emit_16(2158);
+emit_16(2223);
+emit_16(2159);
+emit_16(2223);
+emit_16(2158);
+emit_16(2223);
+emit_16(2159);
+emit_16(2224);
+emit_16(2160);
+emit_16(2224);
+emit_16(2159);
+emit_16(2224);
+emit_16(2160);
+emit_16(2225);
+emit_16(2161);
+emit_16(2225);
+emit_16(2160);
+emit_16(2225);
+emit_16(2161);
+emit_16(2226);
+emit_16(2162);
+emit_16(2226);
+emit_16(2161);
+emit_16(2226);
+emit_16(2162);
+emit_16(2227);
+emit_16(2163);
+emit_16(2227);
+emit_16(2162);
+emit_16(2227);
+emit_16(2163);
+emit_16(2228);
+emit_16(2164);
+emit_16(2228);
+emit_16(2163);
+emit_16(2228);
+emit_16(2164);
+emit_16(2229);
+emit_16(2165);
+emit_16(2229);
+emit_16(2164);
+emit_16(2229);
+emit_16(2165);
+emit_16(2230);
+emit_16(2166);
+emit_16(2230);
+emit_16(2165);
+emit_16(2230);
+emit_16(2166);
+emit_16(2231);
+emit_16(2167);
+emit_16(2231);
+emit_16(2166);
+emit_16(2231);
+emit_16(2167);
+emit_16(2232);
+emit_16(2168);
+emit_16(2232);
+emit_16(2167);
+emit_16(2232);
+emit_16(2168);
+emit_16(2233);
+emit_16(2169);
+emit_16(2233);
+emit_16(2168);
+emit_16(2233);
+emit_16(2169);
+emit_16(2234);
+emit_16(2170);
+emit_16(2234);
+emit_16(2169);
+emit_16(2234);
+emit_16(2170);
+emit_16(2235);
+emit_16(2171);
+emit_16(2235);
+emit_16(2170);
+emit_16(2235);
+emit_16(2171);
+emit_16(2236);
+emit_16(2172);
+emit_16(2236);
+emit_16(2171);
+emit_16(2236);
+emit_16(2172);
+emit_16(2237);
+emit_16(2173);
+emit_16(2237);
+emit_16(2172);
+emit_16(2237);
+emit_16(2173);
+emit_16(2238);
+emit_16(2174);
+emit_16(2238);
+emit_16(2173);
+emit_16(2238);
+emit_16(2174);
+emit_16(2239);
+emit_16(2175);
+emit_16(2239);
+emit_16(2174);
+emit_start(Landscape08Idx)
+emit_16(0);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(2);
+emit_16(1);
+emit_16(2);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(4);
+emit_16(3);
+emit_16(4);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(6);
+emit_16(5);
+emit_16(6);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(8);
+emit_16(7);
+emit_16(8);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(10);
+emit_16(9);
+emit_16(10);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(12);
+emit_16(11);
+emit_16(12);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(14);
+emit_16(13);
+emit_16(14);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(16);
+emit_16(15);
+emit_16(16);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(18);
+emit_16(17);
+emit_16(18);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(20);
+emit_16(19);
+emit_16(20);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(22);
+emit_16(21);
+emit_16(22);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(24);
+emit_16(23);
+emit_16(24);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(26);
+emit_16(25);
+emit_16(26);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(28);
+emit_16(27);
+emit_16(28);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(30);
+emit_16(29);
+emit_16(30);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(32);
+emit_16(31);
+emit_16(32);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(34);
+emit_16(33);
+emit_16(34);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(36);
+emit_16(35);
+emit_16(36);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(38);
+emit_16(37);
+emit_16(38);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(40);
+emit_16(39);
+emit_16(40);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(42);
+emit_16(41);
+emit_16(42);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(44);
+emit_16(43);
+emit_16(44);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(46);
+emit_16(45);
+emit_16(46);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(48);
+emit_16(47);
+emit_16(48);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(50);
+emit_16(49);
+emit_16(50);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(52);
+emit_16(51);
+emit_16(52);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(54);
+emit_16(53);
+emit_16(54);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(56);
+emit_16(55);
+emit_16(56);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(58);
+emit_16(57);
+emit_16(58);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(60);
+emit_16(59);
+emit_16(60);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(62);
+emit_16(61);
+emit_16(62);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(64);
+emit_16(63);
+emit_16(64);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(66);
+emit_16(65);
+emit_16(66);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(68);
+emit_16(67);
+emit_16(68);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(70);
+emit_16(69);
+emit_16(70);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(72);
+emit_16(71);
+emit_16(72);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(74);
+emit_16(73);
+emit_16(74);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(76);
+emit_16(75);
+emit_16(76);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(78);
+emit_16(77);
+emit_16(78);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(80);
+emit_16(79);
+emit_16(80);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(82);
+emit_16(81);
+emit_16(82);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(84);
+emit_16(83);
+emit_16(84);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(86);
+emit_16(85);
+emit_16(86);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(88);
+emit_16(87);
+emit_16(88);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(90);
+emit_16(89);
+emit_16(90);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(92);
+emit_16(91);
+emit_16(92);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(94);
+emit_16(93);
+emit_16(94);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(96);
+emit_16(95);
+emit_16(96);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(98);
+emit_16(97);
+emit_16(98);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(100);
+emit_16(99);
+emit_16(100);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(102);
+emit_16(101);
+emit_16(102);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(104);
+emit_16(103);
+emit_16(104);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(106);
+emit_16(105);
+emit_16(106);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(108);
+emit_16(107);
+emit_16(108);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(110);
+emit_16(109);
+emit_16(110);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(112);
+emit_16(111);
+emit_16(112);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(114);
+emit_16(113);
+emit_16(114);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(116);
+emit_16(115);
+emit_16(116);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(118);
+emit_16(117);
+emit_16(118);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(120);
+emit_16(119);
+emit_16(120);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(122);
+emit_16(121);
+emit_16(122);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(124);
+emit_16(123);
+emit_16(124);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(126);
+emit_16(125);
+emit_16(126);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(128);
+emit_16(127);
+emit_16(128);
+emit_16(129);
+emit_16(130);
+emit_16(131);
+emit_16(130);
+emit_16(129);
+emit_16(132);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(133);
+emit_16(0);
+emit_16(133);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(134);
+emit_16(2);
+emit_16(134);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(135);
+emit_16(4);
+emit_16(135);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(136);
+emit_16(6);
+emit_16(136);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(137);
+emit_16(8);
+emit_16(137);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(138);
+emit_16(10);
+emit_16(138);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(139);
+emit_16(12);
+emit_16(139);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(140);
+emit_16(14);
+emit_16(140);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(141);
+emit_16(16);
+emit_16(141);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(142);
+emit_16(18);
+emit_16(142);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(143);
+emit_16(20);
+emit_16(143);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(144);
+emit_16(22);
+emit_16(144);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(145);
+emit_16(24);
+emit_16(145);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(146);
+emit_16(26);
+emit_16(146);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(147);
+emit_16(28);
+emit_16(147);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(148);
+emit_16(30);
+emit_16(148);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(149);
+emit_16(32);
+emit_16(149);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(150);
+emit_16(34);
+emit_16(150);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(151);
+emit_16(36);
+emit_16(151);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(152);
+emit_16(38);
+emit_16(152);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(153);
+emit_16(40);
+emit_16(153);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(154);
+emit_16(42);
+emit_16(154);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(155);
+emit_16(44);
+emit_16(155);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(156);
+emit_16(46);
+emit_16(156);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(157);
+emit_16(48);
+emit_16(157);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(158);
+emit_16(50);
+emit_16(158);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(159);
+emit_16(52);
+emit_16(159);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(160);
+emit_16(54);
+emit_16(160);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(161);
+emit_16(56);
+emit_16(161);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(162);
+emit_16(58);
+emit_16(162);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(163);
+emit_16(60);
+emit_16(163);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(164);
+emit_16(62);
+emit_16(164);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(165);
+emit_16(64);
+emit_16(165);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(166);
+emit_16(66);
+emit_16(166);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(167);
+emit_16(68);
+emit_16(167);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(168);
+emit_16(70);
+emit_16(168);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(169);
+emit_16(72);
+emit_16(169);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(170);
+emit_16(74);
+emit_16(170);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(171);
+emit_16(76);
+emit_16(171);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(172);
+emit_16(78);
+emit_16(172);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(173);
+emit_16(80);
+emit_16(173);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(174);
+emit_16(82);
+emit_16(174);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(175);
+emit_16(84);
+emit_16(175);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(176);
+emit_16(86);
+emit_16(176);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(177);
+emit_16(88);
+emit_16(177);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(178);
+emit_16(90);
+emit_16(178);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(179);
+emit_16(92);
+emit_16(179);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(180);
+emit_16(94);
+emit_16(180);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(181);
+emit_16(96);
+emit_16(181);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(182);
+emit_16(98);
+emit_16(182);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(183);
+emit_16(100);
+emit_16(183);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(184);
+emit_16(102);
+emit_16(184);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(185);
+emit_16(104);
+emit_16(185);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(186);
+emit_16(106);
+emit_16(186);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(187);
+emit_16(108);
+emit_16(187);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(188);
+emit_16(110);
+emit_16(188);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(189);
+emit_16(112);
+emit_16(189);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(190);
+emit_16(114);
+emit_16(190);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(191);
+emit_16(116);
+emit_16(191);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(192);
+emit_16(118);
+emit_16(192);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(193);
+emit_16(120);
+emit_16(193);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(194);
+emit_16(122);
+emit_16(194);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(195);
+emit_16(124);
+emit_16(195);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(196);
+emit_16(126);
+emit_16(196);
+emit_16(128);
+emit_16(197);
+emit_16(130);
+emit_16(197);
+emit_16(128);
+emit_16(198);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(199);
+emit_16(132);
+emit_16(199);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(200);
+emit_16(133);
+emit_16(200);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(201);
+emit_16(134);
+emit_16(201);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(202);
+emit_16(135);
+emit_16(202);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(203);
+emit_16(136);
+emit_16(203);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(204);
+emit_16(137);
+emit_16(204);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(205);
+emit_16(138);
+emit_16(205);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(206);
+emit_16(139);
+emit_16(206);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(207);
+emit_16(140);
+emit_16(207);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(208);
+emit_16(141);
+emit_16(208);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(209);
+emit_16(142);
+emit_16(209);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(210);
+emit_16(143);
+emit_16(210);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(211);
+emit_16(144);
+emit_16(211);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(212);
+emit_16(145);
+emit_16(212);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(213);
+emit_16(146);
+emit_16(213);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(214);
+emit_16(147);
+emit_16(214);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(215);
+emit_16(148);
+emit_16(215);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(216);
+emit_16(149);
+emit_16(216);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(217);
+emit_16(150);
+emit_16(217);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(218);
+emit_16(151);
+emit_16(218);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(219);
+emit_16(152);
+emit_16(219);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(220);
+emit_16(153);
+emit_16(220);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(221);
+emit_16(154);
+emit_16(221);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(222);
+emit_16(155);
+emit_16(222);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(223);
+emit_16(156);
+emit_16(223);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(224);
+emit_16(157);
+emit_16(224);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(225);
+emit_16(158);
+emit_16(225);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(226);
+emit_16(159);
+emit_16(226);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(227);
+emit_16(160);
+emit_16(227);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(228);
+emit_16(161);
+emit_16(228);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(229);
+emit_16(162);
+emit_16(229);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(230);
+emit_16(163);
+emit_16(230);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(231);
+emit_16(164);
+emit_16(231);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(232);
+emit_16(165);
+emit_16(232);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(233);
+emit_16(166);
+emit_16(233);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(234);
+emit_16(167);
+emit_16(234);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(235);
+emit_16(168);
+emit_16(235);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(236);
+emit_16(169);
+emit_16(236);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(237);
+emit_16(170);
+emit_16(237);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(238);
+emit_16(171);
+emit_16(238);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(239);
+emit_16(172);
+emit_16(239);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(240);
+emit_16(173);
+emit_16(240);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(241);
+emit_16(174);
+emit_16(241);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(242);
+emit_16(175);
+emit_16(242);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(243);
+emit_16(176);
+emit_16(243);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(244);
+emit_16(177);
+emit_16(244);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(245);
+emit_16(178);
+emit_16(245);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(246);
+emit_16(179);
+emit_16(246);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(247);
+emit_16(180);
+emit_16(247);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(248);
+emit_16(181);
+emit_16(248);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(249);
+emit_16(182);
+emit_16(249);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(250);
+emit_16(183);
+emit_16(250);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(251);
+emit_16(184);
+emit_16(251);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(252);
+emit_16(185);
+emit_16(252);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(253);
+emit_16(186);
+emit_16(253);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(254);
+emit_16(187);
+emit_16(254);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(255);
+emit_16(188);
+emit_16(255);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(256);
+emit_16(189);
+emit_16(256);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(257);
+emit_16(190);
+emit_16(257);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(258);
+emit_16(191);
+emit_16(258);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(259);
+emit_16(192);
+emit_16(259);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(260);
+emit_16(193);
+emit_16(260);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(261);
+emit_16(194);
+emit_16(261);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(262);
+emit_16(195);
+emit_16(262);
+emit_16(196);
+emit_16(263);
+emit_16(197);
+emit_16(263);
+emit_16(196);
+emit_16(264);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(265);
+emit_16(198);
+emit_16(265);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(266);
+emit_16(199);
+emit_16(266);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(267);
+emit_16(200);
+emit_16(267);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(268);
+emit_16(201);
+emit_16(268);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(269);
+emit_16(202);
+emit_16(269);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(270);
+emit_16(203);
+emit_16(270);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(271);
+emit_16(204);
+emit_16(271);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(272);
+emit_16(205);
+emit_16(272);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(273);
+emit_16(206);
+emit_16(273);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(274);
+emit_16(207);
+emit_16(274);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(275);
+emit_16(208);
+emit_16(275);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(276);
+emit_16(209);
+emit_16(276);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(277);
+emit_16(210);
+emit_16(277);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(278);
+emit_16(211);
+emit_16(278);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(279);
+emit_16(212);
+emit_16(279);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(280);
+emit_16(213);
+emit_16(280);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(281);
+emit_16(214);
+emit_16(281);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(282);
+emit_16(215);
+emit_16(282);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(283);
+emit_16(216);
+emit_16(283);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(284);
+emit_16(217);
+emit_16(284);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(285);
+emit_16(218);
+emit_16(285);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(286);
+emit_16(219);
+emit_16(286);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(287);
+emit_16(220);
+emit_16(287);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(288);
+emit_16(221);
+emit_16(288);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(289);
+emit_16(222);
+emit_16(289);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(290);
+emit_16(223);
+emit_16(290);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(291);
+emit_16(224);
+emit_16(291);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(292);
+emit_16(225);
+emit_16(292);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(293);
+emit_16(226);
+emit_16(293);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(294);
+emit_16(227);
+emit_16(294);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(295);
+emit_16(228);
+emit_16(295);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(296);
+emit_16(229);
+emit_16(296);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(297);
+emit_16(230);
+emit_16(297);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(298);
+emit_16(231);
+emit_16(298);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(299);
+emit_16(232);
+emit_16(299);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(300);
+emit_16(233);
+emit_16(300);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(301);
+emit_16(234);
+emit_16(301);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(302);
+emit_16(235);
+emit_16(302);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(303);
+emit_16(236);
+emit_16(303);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(304);
+emit_16(237);
+emit_16(304);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(305);
+emit_16(238);
+emit_16(305);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(306);
+emit_16(239);
+emit_16(306);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(307);
+emit_16(240);
+emit_16(307);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(308);
+emit_16(241);
+emit_16(308);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(309);
+emit_16(242);
+emit_16(309);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(310);
+emit_16(243);
+emit_16(310);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(311);
+emit_16(244);
+emit_16(311);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(312);
+emit_16(245);
+emit_16(312);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(313);
+emit_16(246);
+emit_16(313);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(314);
+emit_16(247);
+emit_16(314);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(315);
+emit_16(248);
+emit_16(315);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(316);
+emit_16(249);
+emit_16(316);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(317);
+emit_16(250);
+emit_16(317);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(318);
+emit_16(251);
+emit_16(318);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(319);
+emit_16(252);
+emit_16(319);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(320);
+emit_16(253);
+emit_16(320);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(321);
+emit_16(254);
+emit_16(321);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(322);
+emit_16(255);
+emit_16(322);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(323);
+emit_16(256);
+emit_16(323);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(324);
+emit_16(257);
+emit_16(324);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(325);
+emit_16(258);
+emit_16(325);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(326);
+emit_16(259);
+emit_16(326);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(327);
+emit_16(260);
+emit_16(327);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(328);
+emit_16(261);
+emit_16(328);
+emit_16(262);
+emit_16(329);
+emit_16(263);
+emit_16(329);
+emit_16(262);
+emit_16(330);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(331);
+emit_16(264);
+emit_16(331);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(332);
+emit_16(265);
+emit_16(332);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(333);
+emit_16(266);
+emit_16(333);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(334);
+emit_16(267);
+emit_16(334);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(335);
+emit_16(268);
+emit_16(335);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(336);
+emit_16(269);
+emit_16(336);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(337);
+emit_16(270);
+emit_16(337);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(338);
+emit_16(271);
+emit_16(338);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(339);
+emit_16(272);
+emit_16(339);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(340);
+emit_16(273);
+emit_16(340);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(341);
+emit_16(274);
+emit_16(341);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(342);
+emit_16(275);
+emit_16(342);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(343);
+emit_16(276);
+emit_16(343);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(344);
+emit_16(277);
+emit_16(344);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(345);
+emit_16(278);
+emit_16(345);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(346);
+emit_16(279);
+emit_16(346);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(347);
+emit_16(280);
+emit_16(347);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(348);
+emit_16(281);
+emit_16(348);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(349);
+emit_16(282);
+emit_16(349);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(350);
+emit_16(283);
+emit_16(350);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(351);
+emit_16(284);
+emit_16(351);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(352);
+emit_16(285);
+emit_16(352);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(353);
+emit_16(286);
+emit_16(353);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(354);
+emit_16(287);
+emit_16(354);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(355);
+emit_16(288);
+emit_16(355);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(356);
+emit_16(289);
+emit_16(356);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(357);
+emit_16(290);
+emit_16(357);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(358);
+emit_16(291);
+emit_16(358);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(359);
+emit_16(292);
+emit_16(359);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(360);
+emit_16(293);
+emit_16(360);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(361);
+emit_16(294);
+emit_16(361);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(362);
+emit_16(295);
+emit_16(362);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(363);
+emit_16(296);
+emit_16(363);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(364);
+emit_16(297);
+emit_16(364);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(365);
+emit_16(298);
+emit_16(365);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(366);
+emit_16(299);
+emit_16(366);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(367);
+emit_16(300);
+emit_16(367);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(368);
+emit_16(301);
+emit_16(368);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(369);
+emit_16(302);
+emit_16(369);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(370);
+emit_16(303);
+emit_16(370);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(371);
+emit_16(304);
+emit_16(371);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(372);
+emit_16(305);
+emit_16(372);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(373);
+emit_16(306);
+emit_16(373);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(374);
+emit_16(307);
+emit_16(374);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(375);
+emit_16(308);
+emit_16(375);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(376);
+emit_16(309);
+emit_16(376);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(377);
+emit_16(310);
+emit_16(377);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(378);
+emit_16(311);
+emit_16(378);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(379);
+emit_16(312);
+emit_16(379);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(380);
+emit_16(313);
+emit_16(380);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(381);
+emit_16(314);
+emit_16(381);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(382);
+emit_16(315);
+emit_16(382);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(383);
+emit_16(316);
+emit_16(383);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(384);
+emit_16(317);
+emit_16(384);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(385);
+emit_16(318);
+emit_16(385);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(386);
+emit_16(319);
+emit_16(386);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(387);
+emit_16(320);
+emit_16(387);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(388);
+emit_16(321);
+emit_16(388);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(389);
+emit_16(322);
+emit_16(389);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(390);
+emit_16(323);
+emit_16(390);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(391);
+emit_16(324);
+emit_16(391);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(392);
+emit_16(325);
+emit_16(392);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(393);
+emit_16(326);
+emit_16(393);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(394);
+emit_16(327);
+emit_16(394);
+emit_16(328);
+emit_16(395);
+emit_16(329);
+emit_16(395);
+emit_16(328);
+emit_16(396);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(397);
+emit_16(330);
+emit_16(397);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(398);
+emit_16(331);
+emit_16(398);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(399);
+emit_16(332);
+emit_16(399);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(400);
+emit_16(333);
+emit_16(400);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(401);
+emit_16(334);
+emit_16(401);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(402);
+emit_16(335);
+emit_16(402);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(403);
+emit_16(336);
+emit_16(403);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(404);
+emit_16(337);
+emit_16(404);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(405);
+emit_16(338);
+emit_16(405);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(406);
+emit_16(339);
+emit_16(406);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(407);
+emit_16(340);
+emit_16(407);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(408);
+emit_16(341);
+emit_16(408);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(409);
+emit_16(342);
+emit_16(409);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(410);
+emit_16(343);
+emit_16(410);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(411);
+emit_16(344);
+emit_16(411);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(412);
+emit_16(345);
+emit_16(412);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(413);
+emit_16(346);
+emit_16(413);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(414);
+emit_16(347);
+emit_16(414);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(415);
+emit_16(348);
+emit_16(415);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(416);
+emit_16(349);
+emit_16(416);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(417);
+emit_16(350);
+emit_16(417);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(418);
+emit_16(351);
+emit_16(418);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(419);
+emit_16(352);
+emit_16(419);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(420);
+emit_16(353);
+emit_16(420);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(421);
+emit_16(354);
+emit_16(421);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(422);
+emit_16(355);
+emit_16(422);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(423);
+emit_16(356);
+emit_16(423);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(424);
+emit_16(357);
+emit_16(424);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(425);
+emit_16(358);
+emit_16(425);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(426);
+emit_16(359);
+emit_16(426);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(427);
+emit_16(360);
+emit_16(427);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(428);
+emit_16(361);
+emit_16(428);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(429);
+emit_16(362);
+emit_16(429);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(430);
+emit_16(363);
+emit_16(430);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(431);
+emit_16(364);
+emit_16(431);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(432);
+emit_16(365);
+emit_16(432);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(433);
+emit_16(366);
+emit_16(433);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(434);
+emit_16(367);
+emit_16(434);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(435);
+emit_16(368);
+emit_16(435);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(436);
+emit_16(369);
+emit_16(436);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(437);
+emit_16(370);
+emit_16(437);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(438);
+emit_16(371);
+emit_16(438);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(439);
+emit_16(372);
+emit_16(439);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(440);
+emit_16(373);
+emit_16(440);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(441);
+emit_16(374);
+emit_16(441);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(442);
+emit_16(375);
+emit_16(442);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(443);
+emit_16(376);
+emit_16(443);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(444);
+emit_16(377);
+emit_16(444);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(445);
+emit_16(378);
+emit_16(445);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(446);
+emit_16(379);
+emit_16(446);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(447);
+emit_16(380);
+emit_16(447);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(448);
+emit_16(381);
+emit_16(448);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(449);
+emit_16(382);
+emit_16(449);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(450);
+emit_16(383);
+emit_16(450);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(451);
+emit_16(384);
+emit_16(451);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(452);
+emit_16(385);
+emit_16(452);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(453);
+emit_16(386);
+emit_16(453);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(454);
+emit_16(387);
+emit_16(454);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(455);
+emit_16(388);
+emit_16(455);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(456);
+emit_16(389);
+emit_16(456);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(457);
+emit_16(390);
+emit_16(457);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(458);
+emit_16(391);
+emit_16(458);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(459);
+emit_16(392);
+emit_16(459);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(460);
+emit_16(393);
+emit_16(460);
+emit_16(394);
+emit_16(461);
+emit_16(395);
+emit_16(461);
+emit_16(394);
+emit_16(462);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(463);
+emit_16(396);
+emit_16(463);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(464);
+emit_16(397);
+emit_16(464);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(465);
+emit_16(398);
+emit_16(465);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(466);
+emit_16(399);
+emit_16(466);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(467);
+emit_16(400);
+emit_16(467);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(468);
+emit_16(401);
+emit_16(468);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(469);
+emit_16(402);
+emit_16(469);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(470);
+emit_16(403);
+emit_16(470);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(471);
+emit_16(404);
+emit_16(471);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(472);
+emit_16(405);
+emit_16(472);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(473);
+emit_16(406);
+emit_16(473);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(474);
+emit_16(407);
+emit_16(474);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(475);
+emit_16(408);
+emit_16(475);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(476);
+emit_16(409);
+emit_16(476);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(477);
+emit_16(410);
+emit_16(477);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(478);
+emit_16(411);
+emit_16(478);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(479);
+emit_16(412);
+emit_16(479);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(480);
+emit_16(413);
+emit_16(480);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(481);
+emit_16(414);
+emit_16(481);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(482);
+emit_16(415);
+emit_16(482);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(483);
+emit_16(416);
+emit_16(483);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(484);
+emit_16(417);
+emit_16(484);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(485);
+emit_16(418);
+emit_16(485);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(486);
+emit_16(419);
+emit_16(486);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(487);
+emit_16(420);
+emit_16(487);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(488);
+emit_16(421);
+emit_16(488);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(489);
+emit_16(422);
+emit_16(489);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(490);
+emit_16(423);
+emit_16(490);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(491);
+emit_16(424);
+emit_16(491);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(492);
+emit_16(425);
+emit_16(492);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(493);
+emit_16(426);
+emit_16(493);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(494);
+emit_16(427);
+emit_16(494);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(495);
+emit_16(428);
+emit_16(495);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(496);
+emit_16(429);
+emit_16(496);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(497);
+emit_16(430);
+emit_16(497);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(498);
+emit_16(431);
+emit_16(498);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(499);
+emit_16(432);
+emit_16(499);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(500);
+emit_16(433);
+emit_16(500);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(501);
+emit_16(434);
+emit_16(501);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(502);
+emit_16(435);
+emit_16(502);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(503);
+emit_16(436);
+emit_16(503);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(504);
+emit_16(437);
+emit_16(504);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(505);
+emit_16(438);
+emit_16(505);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(506);
+emit_16(439);
+emit_16(506);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(507);
+emit_16(440);
+emit_16(507);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(508);
+emit_16(441);
+emit_16(508);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(509);
+emit_16(442);
+emit_16(509);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(510);
+emit_16(443);
+emit_16(510);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(511);
+emit_16(444);
+emit_16(511);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(512);
+emit_16(445);
+emit_16(512);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(513);
+emit_16(446);
+emit_16(513);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(514);
+emit_16(447);
+emit_16(514);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(515);
+emit_16(448);
+emit_16(515);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(516);
+emit_16(449);
+emit_16(516);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(517);
+emit_16(450);
+emit_16(517);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(518);
+emit_16(451);
+emit_16(518);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(519);
+emit_16(452);
+emit_16(519);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(520);
+emit_16(453);
+emit_16(520);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(521);
+emit_16(454);
+emit_16(521);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(522);
+emit_16(455);
+emit_16(522);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(523);
+emit_16(456);
+emit_16(523);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(524);
+emit_16(457);
+emit_16(524);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(525);
+emit_16(458);
+emit_16(525);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(526);
+emit_16(459);
+emit_16(526);
+emit_16(460);
+emit_16(527);
+emit_16(461);
+emit_16(527);
+emit_16(460);
+emit_16(528);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(529);
+emit_16(462);
+emit_16(529);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(530);
+emit_16(463);
+emit_16(530);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(531);
+emit_16(464);
+emit_16(531);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(532);
+emit_16(465);
+emit_16(532);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(533);
+emit_16(466);
+emit_16(533);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(534);
+emit_16(467);
+emit_16(534);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(535);
+emit_16(468);
+emit_16(535);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(536);
+emit_16(469);
+emit_16(536);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(537);
+emit_16(470);
+emit_16(537);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(538);
+emit_16(471);
+emit_16(538);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(539);
+emit_16(472);
+emit_16(539);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(540);
+emit_16(473);
+emit_16(540);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(541);
+emit_16(474);
+emit_16(541);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(542);
+emit_16(475);
+emit_16(542);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(543);
+emit_16(476);
+emit_16(543);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(544);
+emit_16(477);
+emit_16(544);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(545);
+emit_16(478);
+emit_16(545);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(546);
+emit_16(479);
+emit_16(546);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(547);
+emit_16(480);
+emit_16(547);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(548);
+emit_16(481);
+emit_16(548);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(549);
+emit_16(482);
+emit_16(549);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(550);
+emit_16(483);
+emit_16(550);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(551);
+emit_16(484);
+emit_16(551);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(552);
+emit_16(485);
+emit_16(552);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(553);
+emit_16(486);
+emit_16(553);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(554);
+emit_16(487);
+emit_16(554);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(555);
+emit_16(488);
+emit_16(555);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(556);
+emit_16(489);
+emit_16(556);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(557);
+emit_16(490);
+emit_16(557);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(558);
+emit_16(491);
+emit_16(558);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(559);
+emit_16(492);
+emit_16(559);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(560);
+emit_16(493);
+emit_16(560);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(561);
+emit_16(494);
+emit_16(561);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(562);
+emit_16(495);
+emit_16(562);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(563);
+emit_16(496);
+emit_16(563);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(564);
+emit_16(497);
+emit_16(564);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(565);
+emit_16(498);
+emit_16(565);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(566);
+emit_16(499);
+emit_16(566);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(567);
+emit_16(500);
+emit_16(567);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(568);
+emit_16(501);
+emit_16(568);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(569);
+emit_16(502);
+emit_16(569);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(570);
+emit_16(503);
+emit_16(570);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(571);
+emit_16(504);
+emit_16(571);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(572);
+emit_16(505);
+emit_16(572);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(573);
+emit_16(506);
+emit_16(573);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(574);
+emit_16(507);
+emit_16(574);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(575);
+emit_16(508);
+emit_16(575);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(576);
+emit_16(509);
+emit_16(576);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(577);
+emit_16(510);
+emit_16(577);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(578);
+emit_16(511);
+emit_16(578);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(579);
+emit_16(512);
+emit_16(579);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(580);
+emit_16(513);
+emit_16(580);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(581);
+emit_16(514);
+emit_16(581);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(582);
+emit_16(515);
+emit_16(582);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(583);
+emit_16(516);
+emit_16(583);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(584);
+emit_16(517);
+emit_16(584);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(585);
+emit_16(518);
+emit_16(585);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(586);
+emit_16(519);
+emit_16(586);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(587);
+emit_16(520);
+emit_16(587);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(588);
+emit_16(521);
+emit_16(588);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(589);
+emit_16(522);
+emit_16(589);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(590);
+emit_16(523);
+emit_16(590);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(591);
+emit_16(524);
+emit_16(591);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(592);
+emit_16(525);
+emit_16(592);
+emit_16(526);
+emit_16(593);
+emit_16(527);
+emit_16(593);
+emit_16(526);
+emit_16(594);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(595);
+emit_16(528);
+emit_16(595);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(596);
+emit_16(529);
+emit_16(596);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(597);
+emit_16(530);
+emit_16(597);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(598);
+emit_16(531);
+emit_16(598);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(599);
+emit_16(532);
+emit_16(599);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(600);
+emit_16(533);
+emit_16(600);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(601);
+emit_16(534);
+emit_16(601);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(602);
+emit_16(535);
+emit_16(602);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(603);
+emit_16(536);
+emit_16(603);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(604);
+emit_16(537);
+emit_16(604);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(605);
+emit_16(538);
+emit_16(605);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(606);
+emit_16(539);
+emit_16(606);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(607);
+emit_16(540);
+emit_16(607);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(608);
+emit_16(541);
+emit_16(608);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(609);
+emit_16(542);
+emit_16(609);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(610);
+emit_16(543);
+emit_16(610);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(611);
+emit_16(544);
+emit_16(611);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(612);
+emit_16(545);
+emit_16(612);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(613);
+emit_16(546);
+emit_16(613);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(614);
+emit_16(547);
+emit_16(614);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(615);
+emit_16(548);
+emit_16(615);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(616);
+emit_16(549);
+emit_16(616);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(617);
+emit_16(550);
+emit_16(617);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(618);
+emit_16(551);
+emit_16(618);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(619);
+emit_16(552);
+emit_16(619);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(620);
+emit_16(553);
+emit_16(620);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(621);
+emit_16(554);
+emit_16(621);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(622);
+emit_16(555);
+emit_16(622);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(623);
+emit_16(556);
+emit_16(623);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(624);
+emit_16(557);
+emit_16(624);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(625);
+emit_16(558);
+emit_16(625);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(626);
+emit_16(559);
+emit_16(626);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(627);
+emit_16(560);
+emit_16(627);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(628);
+emit_16(561);
+emit_16(628);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(629);
+emit_16(562);
+emit_16(629);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(630);
+emit_16(563);
+emit_16(630);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(631);
+emit_16(564);
+emit_16(631);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(632);
+emit_16(565);
+emit_16(632);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(633);
+emit_16(566);
+emit_16(633);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(634);
+emit_16(567);
+emit_16(634);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(635);
+emit_16(568);
+emit_16(635);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(636);
+emit_16(569);
+emit_16(636);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(637);
+emit_16(570);
+emit_16(637);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(638);
+emit_16(571);
+emit_16(638);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(639);
+emit_16(572);
+emit_16(639);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(640);
+emit_16(573);
+emit_16(640);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(641);
+emit_16(574);
+emit_16(641);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(642);
+emit_16(575);
+emit_16(642);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(643);
+emit_16(576);
+emit_16(643);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(644);
+emit_16(577);
+emit_16(644);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(645);
+emit_16(578);
+emit_16(645);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(646);
+emit_16(579);
+emit_16(646);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(647);
+emit_16(580);
+emit_16(647);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(648);
+emit_16(581);
+emit_16(648);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(649);
+emit_16(582);
+emit_16(649);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(650);
+emit_16(583);
+emit_16(650);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(651);
+emit_16(584);
+emit_16(651);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(652);
+emit_16(585);
+emit_16(652);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(653);
+emit_16(586);
+emit_16(653);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(654);
+emit_16(587);
+emit_16(654);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(655);
+emit_16(588);
+emit_16(655);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(656);
+emit_16(589);
+emit_16(656);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(657);
+emit_16(590);
+emit_16(657);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(658);
+emit_16(591);
+emit_16(658);
+emit_16(592);
+emit_16(659);
+emit_16(593);
+emit_16(659);
+emit_16(592);
+emit_16(660);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(661);
+emit_16(594);
+emit_16(661);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(662);
+emit_16(595);
+emit_16(662);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(663);
+emit_16(596);
+emit_16(663);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(664);
+emit_16(597);
+emit_16(664);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(665);
+emit_16(598);
+emit_16(665);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(666);
+emit_16(599);
+emit_16(666);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(667);
+emit_16(600);
+emit_16(667);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(668);
+emit_16(601);
+emit_16(668);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(669);
+emit_16(602);
+emit_16(669);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(670);
+emit_16(603);
+emit_16(670);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(671);
+emit_16(604);
+emit_16(671);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(672);
+emit_16(605);
+emit_16(672);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(673);
+emit_16(606);
+emit_16(673);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(674);
+emit_16(607);
+emit_16(674);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(675);
+emit_16(608);
+emit_16(675);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(676);
+emit_16(609);
+emit_16(676);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(677);
+emit_16(610);
+emit_16(677);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(678);
+emit_16(611);
+emit_16(678);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(679);
+emit_16(612);
+emit_16(679);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(680);
+emit_16(613);
+emit_16(680);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(681);
+emit_16(614);
+emit_16(681);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(682);
+emit_16(615);
+emit_16(682);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(683);
+emit_16(616);
+emit_16(683);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(684);
+emit_16(617);
+emit_16(684);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(685);
+emit_16(618);
+emit_16(685);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(686);
+emit_16(619);
+emit_16(686);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(687);
+emit_16(620);
+emit_16(687);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(688);
+emit_16(621);
+emit_16(688);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(689);
+emit_16(622);
+emit_16(689);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(690);
+emit_16(623);
+emit_16(690);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(691);
+emit_16(624);
+emit_16(691);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(692);
+emit_16(625);
+emit_16(692);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(693);
+emit_16(626);
+emit_16(693);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(694);
+emit_16(627);
+emit_16(694);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(695);
+emit_16(628);
+emit_16(695);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(696);
+emit_16(629);
+emit_16(696);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(697);
+emit_16(630);
+emit_16(697);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(698);
+emit_16(631);
+emit_16(698);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(699);
+emit_16(632);
+emit_16(699);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(700);
+emit_16(633);
+emit_16(700);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(701);
+emit_16(634);
+emit_16(701);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(702);
+emit_16(635);
+emit_16(702);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(703);
+emit_16(636);
+emit_16(703);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(704);
+emit_16(637);
+emit_16(704);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(705);
+emit_16(638);
+emit_16(705);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(706);
+emit_16(639);
+emit_16(706);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(707);
+emit_16(640);
+emit_16(707);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(708);
+emit_16(641);
+emit_16(708);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(709);
+emit_16(642);
+emit_16(709);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(710);
+emit_16(643);
+emit_16(710);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(711);
+emit_16(644);
+emit_16(711);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(712);
+emit_16(645);
+emit_16(712);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(713);
+emit_16(646);
+emit_16(713);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(714);
+emit_16(647);
+emit_16(714);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(715);
+emit_16(648);
+emit_16(715);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(716);
+emit_16(649);
+emit_16(716);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(717);
+emit_16(650);
+emit_16(717);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(718);
+emit_16(651);
+emit_16(718);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(719);
+emit_16(652);
+emit_16(719);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(720);
+emit_16(653);
+emit_16(720);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(721);
+emit_16(654);
+emit_16(721);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(722);
+emit_16(655);
+emit_16(722);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(723);
+emit_16(656);
+emit_16(723);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(724);
+emit_16(657);
+emit_16(724);
+emit_16(658);
+emit_16(725);
+emit_16(659);
+emit_16(725);
+emit_16(658);
+emit_16(726);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(727);
+emit_16(660);
+emit_16(727);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(728);
+emit_16(661);
+emit_16(728);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(729);
+emit_16(662);
+emit_16(729);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(730);
+emit_16(663);
+emit_16(730);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(731);
+emit_16(664);
+emit_16(731);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(732);
+emit_16(665);
+emit_16(732);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(733);
+emit_16(666);
+emit_16(733);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(734);
+emit_16(667);
+emit_16(734);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(735);
+emit_16(668);
+emit_16(735);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(736);
+emit_16(669);
+emit_16(736);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(737);
+emit_16(670);
+emit_16(737);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(738);
+emit_16(671);
+emit_16(738);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(739);
+emit_16(672);
+emit_16(739);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(740);
+emit_16(673);
+emit_16(740);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(741);
+emit_16(674);
+emit_16(741);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(742);
+emit_16(675);
+emit_16(742);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(743);
+emit_16(676);
+emit_16(743);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(744);
+emit_16(677);
+emit_16(744);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(745);
+emit_16(678);
+emit_16(745);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(746);
+emit_16(679);
+emit_16(746);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(747);
+emit_16(680);
+emit_16(747);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(748);
+emit_16(681);
+emit_16(748);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(749);
+emit_16(682);
+emit_16(749);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(750);
+emit_16(683);
+emit_16(750);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(751);
+emit_16(684);
+emit_16(751);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(752);
+emit_16(685);
+emit_16(752);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(753);
+emit_16(686);
+emit_16(753);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(754);
+emit_16(687);
+emit_16(754);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(755);
+emit_16(688);
+emit_16(755);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(756);
+emit_16(689);
+emit_16(756);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(757);
+emit_16(690);
+emit_16(757);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(758);
+emit_16(691);
+emit_16(758);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(759);
+emit_16(692);
+emit_16(759);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(760);
+emit_16(693);
+emit_16(760);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(761);
+emit_16(694);
+emit_16(761);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(762);
+emit_16(695);
+emit_16(762);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(763);
+emit_16(696);
+emit_16(763);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(764);
+emit_16(697);
+emit_16(764);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(765);
+emit_16(698);
+emit_16(765);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(766);
+emit_16(699);
+emit_16(766);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(767);
+emit_16(700);
+emit_16(767);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(768);
+emit_16(701);
+emit_16(768);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(769);
+emit_16(702);
+emit_16(769);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(770);
+emit_16(703);
+emit_16(770);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(771);
+emit_16(704);
+emit_16(771);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(772);
+emit_16(705);
+emit_16(772);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(773);
+emit_16(706);
+emit_16(773);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(774);
+emit_16(707);
+emit_16(774);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(775);
+emit_16(708);
+emit_16(775);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(776);
+emit_16(709);
+emit_16(776);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(777);
+emit_16(710);
+emit_16(777);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(778);
+emit_16(711);
+emit_16(778);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(779);
+emit_16(712);
+emit_16(779);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(780);
+emit_16(713);
+emit_16(780);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(781);
+emit_16(714);
+emit_16(781);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(782);
+emit_16(715);
+emit_16(782);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(783);
+emit_16(716);
+emit_16(783);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(784);
+emit_16(717);
+emit_16(784);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(785);
+emit_16(718);
+emit_16(785);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(786);
+emit_16(719);
+emit_16(786);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(787);
+emit_16(720);
+emit_16(787);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(788);
+emit_16(721);
+emit_16(788);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(789);
+emit_16(722);
+emit_16(789);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(790);
+emit_16(723);
+emit_16(790);
+emit_16(724);
+emit_16(791);
+emit_16(725);
+emit_16(791);
+emit_16(724);
+emit_16(792);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(793);
+emit_16(726);
+emit_16(793);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(794);
+emit_16(727);
+emit_16(794);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(795);
+emit_16(728);
+emit_16(795);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(796);
+emit_16(729);
+emit_16(796);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(797);
+emit_16(730);
+emit_16(797);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(798);
+emit_16(731);
+emit_16(798);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(799);
+emit_16(732);
+emit_16(799);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(800);
+emit_16(733);
+emit_16(800);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(801);
+emit_16(734);
+emit_16(801);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(802);
+emit_16(735);
+emit_16(802);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(803);
+emit_16(736);
+emit_16(803);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(804);
+emit_16(737);
+emit_16(804);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(805);
+emit_16(738);
+emit_16(805);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(806);
+emit_16(739);
+emit_16(806);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(807);
+emit_16(740);
+emit_16(807);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(808);
+emit_16(741);
+emit_16(808);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(809);
+emit_16(742);
+emit_16(809);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(810);
+emit_16(743);
+emit_16(810);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(811);
+emit_16(744);
+emit_16(811);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(812);
+emit_16(745);
+emit_16(812);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(813);
+emit_16(746);
+emit_16(813);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(814);
+emit_16(747);
+emit_16(814);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(815);
+emit_16(748);
+emit_16(815);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(816);
+emit_16(749);
+emit_16(816);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(817);
+emit_16(750);
+emit_16(817);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(818);
+emit_16(751);
+emit_16(818);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(819);
+emit_16(752);
+emit_16(819);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(820);
+emit_16(753);
+emit_16(820);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(821);
+emit_16(754);
+emit_16(821);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(822);
+emit_16(755);
+emit_16(822);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(823);
+emit_16(756);
+emit_16(823);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(824);
+emit_16(757);
+emit_16(824);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(825);
+emit_16(758);
+emit_16(825);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(826);
+emit_16(759);
+emit_16(826);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(827);
+emit_16(760);
+emit_16(827);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(828);
+emit_16(761);
+emit_16(828);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(829);
+emit_16(762);
+emit_16(829);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(830);
+emit_16(763);
+emit_16(830);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(831);
+emit_16(764);
+emit_16(831);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(832);
+emit_16(765);
+emit_16(832);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(833);
+emit_16(766);
+emit_16(833);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(834);
+emit_16(767);
+emit_16(834);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(835);
+emit_16(768);
+emit_16(835);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(836);
+emit_16(769);
+emit_16(836);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(837);
+emit_16(770);
+emit_16(837);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(838);
+emit_16(771);
+emit_16(838);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(839);
+emit_16(772);
+emit_16(839);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(840);
+emit_16(773);
+emit_16(840);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(841);
+emit_16(774);
+emit_16(841);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(842);
+emit_16(775);
+emit_16(842);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(843);
+emit_16(776);
+emit_16(843);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(844);
+emit_16(777);
+emit_16(844);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(845);
+emit_16(778);
+emit_16(845);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(846);
+emit_16(779);
+emit_16(846);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(847);
+emit_16(780);
+emit_16(847);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(848);
+emit_16(781);
+emit_16(848);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(849);
+emit_16(782);
+emit_16(849);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(850);
+emit_16(783);
+emit_16(850);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(851);
+emit_16(784);
+emit_16(851);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(852);
+emit_16(785);
+emit_16(852);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(853);
+emit_16(786);
+emit_16(853);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(854);
+emit_16(787);
+emit_16(854);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(855);
+emit_16(788);
+emit_16(855);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(856);
+emit_16(789);
+emit_16(856);
+emit_16(790);
+emit_16(857);
+emit_16(791);
+emit_16(857);
+emit_16(790);
+emit_16(858);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(859);
+emit_16(792);
+emit_16(859);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(860);
+emit_16(793);
+emit_16(860);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(861);
+emit_16(794);
+emit_16(861);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(862);
+emit_16(795);
+emit_16(862);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(863);
+emit_16(796);
+emit_16(863);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(864);
+emit_16(797);
+emit_16(864);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(865);
+emit_16(798);
+emit_16(865);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(866);
+emit_16(799);
+emit_16(866);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(867);
+emit_16(800);
+emit_16(867);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(868);
+emit_16(801);
+emit_16(868);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(869);
+emit_16(802);
+emit_16(869);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(870);
+emit_16(803);
+emit_16(870);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(871);
+emit_16(804);
+emit_16(871);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(872);
+emit_16(805);
+emit_16(872);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(873);
+emit_16(806);
+emit_16(873);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(874);
+emit_16(807);
+emit_16(874);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(875);
+emit_16(808);
+emit_16(875);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(876);
+emit_16(809);
+emit_16(876);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(877);
+emit_16(810);
+emit_16(877);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(878);
+emit_16(811);
+emit_16(878);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(879);
+emit_16(812);
+emit_16(879);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(880);
+emit_16(813);
+emit_16(880);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(881);
+emit_16(814);
+emit_16(881);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(882);
+emit_16(815);
+emit_16(882);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(883);
+emit_16(816);
+emit_16(883);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(884);
+emit_16(817);
+emit_16(884);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(885);
+emit_16(818);
+emit_16(885);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(886);
+emit_16(819);
+emit_16(886);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(887);
+emit_16(820);
+emit_16(887);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(888);
+emit_16(821);
+emit_16(888);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(889);
+emit_16(822);
+emit_16(889);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(890);
+emit_16(823);
+emit_16(890);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(891);
+emit_16(824);
+emit_16(891);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(892);
+emit_16(825);
+emit_16(892);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(893);
+emit_16(826);
+emit_16(893);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(894);
+emit_16(827);
+emit_16(894);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(895);
+emit_16(828);
+emit_16(895);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(896);
+emit_16(829);
+emit_16(896);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(897);
+emit_16(830);
+emit_16(897);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(898);
+emit_16(831);
+emit_16(898);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(899);
+emit_16(832);
+emit_16(899);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(900);
+emit_16(833);
+emit_16(900);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(901);
+emit_16(834);
+emit_16(901);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(902);
+emit_16(835);
+emit_16(902);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(903);
+emit_16(836);
+emit_16(903);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(904);
+emit_16(837);
+emit_16(904);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(905);
+emit_16(838);
+emit_16(905);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(906);
+emit_16(839);
+emit_16(906);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(907);
+emit_16(840);
+emit_16(907);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(908);
+emit_16(841);
+emit_16(908);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(909);
+emit_16(842);
+emit_16(909);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(910);
+emit_16(843);
+emit_16(910);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(911);
+emit_16(844);
+emit_16(911);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(912);
+emit_16(845);
+emit_16(912);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(913);
+emit_16(846);
+emit_16(913);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(914);
+emit_16(847);
+emit_16(914);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(915);
+emit_16(848);
+emit_16(915);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(916);
+emit_16(849);
+emit_16(916);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(917);
+emit_16(850);
+emit_16(917);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(918);
+emit_16(851);
+emit_16(918);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(919);
+emit_16(852);
+emit_16(919);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(920);
+emit_16(853);
+emit_16(920);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(921);
+emit_16(854);
+emit_16(921);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(922);
+emit_16(855);
+emit_16(922);
+emit_16(856);
+emit_16(923);
+emit_16(857);
+emit_16(923);
+emit_16(856);
+emit_16(924);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(925);
+emit_16(858);
+emit_16(925);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(926);
+emit_16(859);
+emit_16(926);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(927);
+emit_16(860);
+emit_16(927);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(928);
+emit_16(861);
+emit_16(928);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(929);
+emit_16(862);
+emit_16(929);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(930);
+emit_16(863);
+emit_16(930);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(931);
+emit_16(864);
+emit_16(931);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(932);
+emit_16(865);
+emit_16(932);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(933);
+emit_16(866);
+emit_16(933);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(934);
+emit_16(867);
+emit_16(934);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(935);
+emit_16(868);
+emit_16(935);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(936);
+emit_16(869);
+emit_16(936);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(937);
+emit_16(870);
+emit_16(937);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(938);
+emit_16(871);
+emit_16(938);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(939);
+emit_16(872);
+emit_16(939);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(940);
+emit_16(873);
+emit_16(940);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(941);
+emit_16(874);
+emit_16(941);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(942);
+emit_16(875);
+emit_16(942);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(943);
+emit_16(876);
+emit_16(943);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(944);
+emit_16(877);
+emit_16(944);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(945);
+emit_16(878);
+emit_16(945);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(946);
+emit_16(879);
+emit_16(946);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(947);
+emit_16(880);
+emit_16(947);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(948);
+emit_16(881);
+emit_16(948);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(949);
+emit_16(882);
+emit_16(949);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(950);
+emit_16(883);
+emit_16(950);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(951);
+emit_16(884);
+emit_16(951);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(952);
+emit_16(885);
+emit_16(952);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(953);
+emit_16(886);
+emit_16(953);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(954);
+emit_16(887);
+emit_16(954);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(955);
+emit_16(888);
+emit_16(955);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(956);
+emit_16(889);
+emit_16(956);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(957);
+emit_16(890);
+emit_16(957);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(958);
+emit_16(891);
+emit_16(958);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(959);
+emit_16(892);
+emit_16(959);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(960);
+emit_16(893);
+emit_16(960);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(961);
+emit_16(894);
+emit_16(961);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(962);
+emit_16(895);
+emit_16(962);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(963);
+emit_16(896);
+emit_16(963);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(964);
+emit_16(897);
+emit_16(964);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(965);
+emit_16(898);
+emit_16(965);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(966);
+emit_16(899);
+emit_16(966);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(967);
+emit_16(900);
+emit_16(967);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(968);
+emit_16(901);
+emit_16(968);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(969);
+emit_16(902);
+emit_16(969);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(970);
+emit_16(903);
+emit_16(970);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(971);
+emit_16(904);
+emit_16(971);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(972);
+emit_16(905);
+emit_16(972);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(973);
+emit_16(906);
+emit_16(973);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(974);
+emit_16(907);
+emit_16(974);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(975);
+emit_16(908);
+emit_16(975);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(976);
+emit_16(909);
+emit_16(976);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(977);
+emit_16(910);
+emit_16(977);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(978);
+emit_16(911);
+emit_16(978);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(979);
+emit_16(912);
+emit_16(979);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(980);
+emit_16(913);
+emit_16(980);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(981);
+emit_16(914);
+emit_16(981);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(982);
+emit_16(915);
+emit_16(982);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(983);
+emit_16(916);
+emit_16(983);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(984);
+emit_16(917);
+emit_16(984);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(985);
+emit_16(918);
+emit_16(985);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(986);
+emit_16(919);
+emit_16(986);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(987);
+emit_16(920);
+emit_16(987);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(988);
+emit_16(921);
+emit_16(988);
+emit_16(922);
+emit_16(989);
+emit_16(923);
+emit_16(989);
+emit_16(922);
+emit_16(990);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(991);
+emit_16(924);
+emit_16(991);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(992);
+emit_16(925);
+emit_16(992);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(993);
+emit_16(926);
+emit_16(993);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(994);
+emit_16(927);
+emit_16(994);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(995);
+emit_16(928);
+emit_16(995);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(996);
+emit_16(929);
+emit_16(996);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(997);
+emit_16(930);
+emit_16(997);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(998);
+emit_16(931);
+emit_16(998);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(999);
+emit_16(932);
+emit_16(999);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1000);
+emit_16(933);
+emit_16(1000);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1001);
+emit_16(934);
+emit_16(1001);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1002);
+emit_16(935);
+emit_16(1002);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1003);
+emit_16(936);
+emit_16(1003);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1004);
+emit_16(937);
+emit_16(1004);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1005);
+emit_16(938);
+emit_16(1005);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1006);
+emit_16(939);
+emit_16(1006);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1007);
+emit_16(940);
+emit_16(1007);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1008);
+emit_16(941);
+emit_16(1008);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1009);
+emit_16(942);
+emit_16(1009);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1010);
+emit_16(943);
+emit_16(1010);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1011);
+emit_16(944);
+emit_16(1011);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1012);
+emit_16(945);
+emit_16(1012);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1013);
+emit_16(946);
+emit_16(1013);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1014);
+emit_16(947);
+emit_16(1014);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1015);
+emit_16(948);
+emit_16(1015);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1016);
+emit_16(949);
+emit_16(1016);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1017);
+emit_16(950);
+emit_16(1017);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1018);
+emit_16(951);
+emit_16(1018);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1019);
+emit_16(952);
+emit_16(1019);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1020);
+emit_16(953);
+emit_16(1020);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1021);
+emit_16(954);
+emit_16(1021);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1022);
+emit_16(955);
+emit_16(1022);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1023);
+emit_16(956);
+emit_16(1023);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1024);
+emit_16(957);
+emit_16(1024);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1025);
+emit_16(958);
+emit_16(1025);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1026);
+emit_16(959);
+emit_16(1026);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1027);
+emit_16(960);
+emit_16(1027);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1028);
+emit_16(961);
+emit_16(1028);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1029);
+emit_16(962);
+emit_16(1029);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1030);
+emit_16(963);
+emit_16(1030);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1031);
+emit_16(964);
+emit_16(1031);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1032);
+emit_16(965);
+emit_16(1032);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1033);
+emit_16(966);
+emit_16(1033);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1034);
+emit_16(967);
+emit_16(1034);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1035);
+emit_16(968);
+emit_16(1035);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1036);
+emit_16(969);
+emit_16(1036);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1037);
+emit_16(970);
+emit_16(1037);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1038);
+emit_16(971);
+emit_16(1038);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1039);
+emit_16(972);
+emit_16(1039);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1040);
+emit_16(973);
+emit_16(1040);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1041);
+emit_16(974);
+emit_16(1041);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1042);
+emit_16(975);
+emit_16(1042);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1043);
+emit_16(976);
+emit_16(1043);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1044);
+emit_16(977);
+emit_16(1044);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1045);
+emit_16(978);
+emit_16(1045);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1046);
+emit_16(979);
+emit_16(1046);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1047);
+emit_16(980);
+emit_16(1047);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1048);
+emit_16(981);
+emit_16(1048);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1049);
+emit_16(982);
+emit_16(1049);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1050);
+emit_16(983);
+emit_16(1050);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1051);
+emit_16(984);
+emit_16(1051);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1052);
+emit_16(985);
+emit_16(1052);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1053);
+emit_16(986);
+emit_16(1053);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1054);
+emit_16(987);
+emit_16(1054);
+emit_16(988);
+emit_16(1055);
+emit_16(989);
+emit_16(1055);
+emit_16(988);
+emit_16(1056);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1057);
+emit_16(990);
+emit_16(1057);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1058);
+emit_16(991);
+emit_16(1058);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1059);
+emit_16(992);
+emit_16(1059);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1060);
+emit_16(993);
+emit_16(1060);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1061);
+emit_16(994);
+emit_16(1061);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1062);
+emit_16(995);
+emit_16(1062);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1063);
+emit_16(996);
+emit_16(1063);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1064);
+emit_16(997);
+emit_16(1064);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1065);
+emit_16(998);
+emit_16(1065);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1066);
+emit_16(999);
+emit_16(1066);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1067);
+emit_16(1000);
+emit_16(1067);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1068);
+emit_16(1001);
+emit_16(1068);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1069);
+emit_16(1002);
+emit_16(1069);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1070);
+emit_16(1003);
+emit_16(1070);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1071);
+emit_16(1004);
+emit_16(1071);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1072);
+emit_16(1005);
+emit_16(1072);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1073);
+emit_16(1006);
+emit_16(1073);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1074);
+emit_16(1007);
+emit_16(1074);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1075);
+emit_16(1008);
+emit_16(1075);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1076);
+emit_16(1009);
+emit_16(1076);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1077);
+emit_16(1010);
+emit_16(1077);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1078);
+emit_16(1011);
+emit_16(1078);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1079);
+emit_16(1012);
+emit_16(1079);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1080);
+emit_16(1013);
+emit_16(1080);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1081);
+emit_16(1014);
+emit_16(1081);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1082);
+emit_16(1015);
+emit_16(1082);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1083);
+emit_16(1016);
+emit_16(1083);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1084);
+emit_16(1017);
+emit_16(1084);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1085);
+emit_16(1018);
+emit_16(1085);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1086);
+emit_16(1019);
+emit_16(1086);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1087);
+emit_16(1020);
+emit_16(1087);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1088);
+emit_16(1021);
+emit_16(1088);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1089);
+emit_16(1022);
+emit_16(1089);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1090);
+emit_16(1023);
+emit_16(1090);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1091);
+emit_16(1024);
+emit_16(1091);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1092);
+emit_16(1025);
+emit_16(1092);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1093);
+emit_16(1026);
+emit_16(1093);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1094);
+emit_16(1027);
+emit_16(1094);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1095);
+emit_16(1028);
+emit_16(1095);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1096);
+emit_16(1029);
+emit_16(1096);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1097);
+emit_16(1030);
+emit_16(1097);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1098);
+emit_16(1031);
+emit_16(1098);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1099);
+emit_16(1032);
+emit_16(1099);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1100);
+emit_16(1033);
+emit_16(1100);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1101);
+emit_16(1034);
+emit_16(1101);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1102);
+emit_16(1035);
+emit_16(1102);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1103);
+emit_16(1036);
+emit_16(1103);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1104);
+emit_16(1037);
+emit_16(1104);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1105);
+emit_16(1038);
+emit_16(1105);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1106);
+emit_16(1039);
+emit_16(1106);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1107);
+emit_16(1040);
+emit_16(1107);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1108);
+emit_16(1041);
+emit_16(1108);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1109);
+emit_16(1042);
+emit_16(1109);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1110);
+emit_16(1043);
+emit_16(1110);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1111);
+emit_16(1044);
+emit_16(1111);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1112);
+emit_16(1045);
+emit_16(1112);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1113);
+emit_16(1046);
+emit_16(1113);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1114);
+emit_16(1047);
+emit_16(1114);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1115);
+emit_16(1048);
+emit_16(1115);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1116);
+emit_16(1049);
+emit_16(1116);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1117);
+emit_16(1050);
+emit_16(1117);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1118);
+emit_16(1051);
+emit_16(1118);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1119);
+emit_16(1052);
+emit_16(1119);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1120);
+emit_16(1053);
+emit_16(1120);
+emit_16(1054);
+emit_16(1121);
+emit_16(1055);
+emit_16(1121);
+emit_16(1054);
+emit_16(1122);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1123);
+emit_16(1056);
+emit_16(1123);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1124);
+emit_16(1057);
+emit_16(1124);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1125);
+emit_16(1058);
+emit_16(1125);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1126);
+emit_16(1059);
+emit_16(1126);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1127);
+emit_16(1060);
+emit_16(1127);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1128);
+emit_16(1061);
+emit_16(1128);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1129);
+emit_16(1062);
+emit_16(1129);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1130);
+emit_16(1063);
+emit_16(1130);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1131);
+emit_16(1064);
+emit_16(1131);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1132);
+emit_16(1065);
+emit_16(1132);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1133);
+emit_16(1066);
+emit_16(1133);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1134);
+emit_16(1067);
+emit_16(1134);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1135);
+emit_16(1068);
+emit_16(1135);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1136);
+emit_16(1069);
+emit_16(1136);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1137);
+emit_16(1070);
+emit_16(1137);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1138);
+emit_16(1071);
+emit_16(1138);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1139);
+emit_16(1072);
+emit_16(1139);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1140);
+emit_16(1073);
+emit_16(1140);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1141);
+emit_16(1074);
+emit_16(1141);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1142);
+emit_16(1075);
+emit_16(1142);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1143);
+emit_16(1076);
+emit_16(1143);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1144);
+emit_16(1077);
+emit_16(1144);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1145);
+emit_16(1078);
+emit_16(1145);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1146);
+emit_16(1079);
+emit_16(1146);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1147);
+emit_16(1080);
+emit_16(1147);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1148);
+emit_16(1081);
+emit_16(1148);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1149);
+emit_16(1082);
+emit_16(1149);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1150);
+emit_16(1083);
+emit_16(1150);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1151);
+emit_16(1084);
+emit_16(1151);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1152);
+emit_16(1085);
+emit_16(1152);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1153);
+emit_16(1086);
+emit_16(1153);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1154);
+emit_16(1087);
+emit_16(1154);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1155);
+emit_16(1088);
+emit_16(1155);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1156);
+emit_16(1089);
+emit_16(1156);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1157);
+emit_16(1090);
+emit_16(1157);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1158);
+emit_16(1091);
+emit_16(1158);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1159);
+emit_16(1092);
+emit_16(1159);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1160);
+emit_16(1093);
+emit_16(1160);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1161);
+emit_16(1094);
+emit_16(1161);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1162);
+emit_16(1095);
+emit_16(1162);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1163);
+emit_16(1096);
+emit_16(1163);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1164);
+emit_16(1097);
+emit_16(1164);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1165);
+emit_16(1098);
+emit_16(1165);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1166);
+emit_16(1099);
+emit_16(1166);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1167);
+emit_16(1100);
+emit_16(1167);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1168);
+emit_16(1101);
+emit_16(1168);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1169);
+emit_16(1102);
+emit_16(1169);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1170);
+emit_16(1103);
+emit_16(1170);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1171);
+emit_16(1104);
+emit_16(1171);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1172);
+emit_16(1105);
+emit_16(1172);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1173);
+emit_16(1106);
+emit_16(1173);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1174);
+emit_16(1107);
+emit_16(1174);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1175);
+emit_16(1108);
+emit_16(1175);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1176);
+emit_16(1109);
+emit_16(1176);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1177);
+emit_16(1110);
+emit_16(1177);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1178);
+emit_16(1111);
+emit_16(1178);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1179);
+emit_16(1112);
+emit_16(1179);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1180);
+emit_16(1113);
+emit_16(1180);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1181);
+emit_16(1114);
+emit_16(1181);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1182);
+emit_16(1115);
+emit_16(1182);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1183);
+emit_16(1116);
+emit_16(1183);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1184);
+emit_16(1117);
+emit_16(1184);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1185);
+emit_16(1118);
+emit_16(1185);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1186);
+emit_16(1119);
+emit_16(1186);
+emit_16(1120);
+emit_16(1187);
+emit_16(1121);
+emit_16(1187);
+emit_16(1120);
+emit_16(1188);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1189);
+emit_16(1122);
+emit_16(1189);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1190);
+emit_16(1123);
+emit_16(1190);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1191);
+emit_16(1124);
+emit_16(1191);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1192);
+emit_16(1125);
+emit_16(1192);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1193);
+emit_16(1126);
+emit_16(1193);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1194);
+emit_16(1127);
+emit_16(1194);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1195);
+emit_16(1128);
+emit_16(1195);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1196);
+emit_16(1129);
+emit_16(1196);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1197);
+emit_16(1130);
+emit_16(1197);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1198);
+emit_16(1131);
+emit_16(1198);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1199);
+emit_16(1132);
+emit_16(1199);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1200);
+emit_16(1133);
+emit_16(1200);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1201);
+emit_16(1134);
+emit_16(1201);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1202);
+emit_16(1135);
+emit_16(1202);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1203);
+emit_16(1136);
+emit_16(1203);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1204);
+emit_16(1137);
+emit_16(1204);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1205);
+emit_16(1138);
+emit_16(1205);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1206);
+emit_16(1139);
+emit_16(1206);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1207);
+emit_16(1140);
+emit_16(1207);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1208);
+emit_16(1141);
+emit_16(1208);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1209);
+emit_16(1142);
+emit_16(1209);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1210);
+emit_16(1143);
+emit_16(1210);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1211);
+emit_16(1144);
+emit_16(1211);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1212);
+emit_16(1145);
+emit_16(1212);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1213);
+emit_16(1146);
+emit_16(1213);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1214);
+emit_16(1147);
+emit_16(1214);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1215);
+emit_16(1148);
+emit_16(1215);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1216);
+emit_16(1149);
+emit_16(1216);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1217);
+emit_16(1150);
+emit_16(1217);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1218);
+emit_16(1151);
+emit_16(1218);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1219);
+emit_16(1152);
+emit_16(1219);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1220);
+emit_16(1153);
+emit_16(1220);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1221);
+emit_16(1154);
+emit_16(1221);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1222);
+emit_16(1155);
+emit_16(1222);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1223);
+emit_16(1156);
+emit_16(1223);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1224);
+emit_16(1157);
+emit_16(1224);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1225);
+emit_16(1158);
+emit_16(1225);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1226);
+emit_16(1159);
+emit_16(1226);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1227);
+emit_16(1160);
+emit_16(1227);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1228);
+emit_16(1161);
+emit_16(1228);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1229);
+emit_16(1162);
+emit_16(1229);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1230);
+emit_16(1163);
+emit_16(1230);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1231);
+emit_16(1164);
+emit_16(1231);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1232);
+emit_16(1165);
+emit_16(1232);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1233);
+emit_16(1166);
+emit_16(1233);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1234);
+emit_16(1167);
+emit_16(1234);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1235);
+emit_16(1168);
+emit_16(1235);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1236);
+emit_16(1169);
+emit_16(1236);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1237);
+emit_16(1170);
+emit_16(1237);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1238);
+emit_16(1171);
+emit_16(1238);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1239);
+emit_16(1172);
+emit_16(1239);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1240);
+emit_16(1173);
+emit_16(1240);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1241);
+emit_16(1174);
+emit_16(1241);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1242);
+emit_16(1175);
+emit_16(1242);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1243);
+emit_16(1176);
+emit_16(1243);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1244);
+emit_16(1177);
+emit_16(1244);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1245);
+emit_16(1178);
+emit_16(1245);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1246);
+emit_16(1179);
+emit_16(1246);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1247);
+emit_16(1180);
+emit_16(1247);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1248);
+emit_16(1181);
+emit_16(1248);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1249);
+emit_16(1182);
+emit_16(1249);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1250);
+emit_16(1183);
+emit_16(1250);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1251);
+emit_16(1184);
+emit_16(1251);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1252);
+emit_16(1185);
+emit_16(1252);
+emit_16(1186);
+emit_16(1253);
+emit_16(1187);
+emit_16(1253);
+emit_16(1186);
+emit_16(1254);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1255);
+emit_16(1188);
+emit_16(1255);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1256);
+emit_16(1189);
+emit_16(1256);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1257);
+emit_16(1190);
+emit_16(1257);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1258);
+emit_16(1191);
+emit_16(1258);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1259);
+emit_16(1192);
+emit_16(1259);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1260);
+emit_16(1193);
+emit_16(1260);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1261);
+emit_16(1194);
+emit_16(1261);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1262);
+emit_16(1195);
+emit_16(1262);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1263);
+emit_16(1196);
+emit_16(1263);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1264);
+emit_16(1197);
+emit_16(1264);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1265);
+emit_16(1198);
+emit_16(1265);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1266);
+emit_16(1199);
+emit_16(1266);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1267);
+emit_16(1200);
+emit_16(1267);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1268);
+emit_16(1201);
+emit_16(1268);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1269);
+emit_16(1202);
+emit_16(1269);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1270);
+emit_16(1203);
+emit_16(1270);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1271);
+emit_16(1204);
+emit_16(1271);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1272);
+emit_16(1205);
+emit_16(1272);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1273);
+emit_16(1206);
+emit_16(1273);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1274);
+emit_16(1207);
+emit_16(1274);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1275);
+emit_16(1208);
+emit_16(1275);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1276);
+emit_16(1209);
+emit_16(1276);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1277);
+emit_16(1210);
+emit_16(1277);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1278);
+emit_16(1211);
+emit_16(1278);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1279);
+emit_16(1212);
+emit_16(1279);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1280);
+emit_16(1213);
+emit_16(1280);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1281);
+emit_16(1214);
+emit_16(1281);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1282);
+emit_16(1215);
+emit_16(1282);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1283);
+emit_16(1216);
+emit_16(1283);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1284);
+emit_16(1217);
+emit_16(1284);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1285);
+emit_16(1218);
+emit_16(1285);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1286);
+emit_16(1219);
+emit_16(1286);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1287);
+emit_16(1220);
+emit_16(1287);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1288);
+emit_16(1221);
+emit_16(1288);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1289);
+emit_16(1222);
+emit_16(1289);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1290);
+emit_16(1223);
+emit_16(1290);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1291);
+emit_16(1224);
+emit_16(1291);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1292);
+emit_16(1225);
+emit_16(1292);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1293);
+emit_16(1226);
+emit_16(1293);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1294);
+emit_16(1227);
+emit_16(1294);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1295);
+emit_16(1228);
+emit_16(1295);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1296);
+emit_16(1229);
+emit_16(1296);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1297);
+emit_16(1230);
+emit_16(1297);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1298);
+emit_16(1231);
+emit_16(1298);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1299);
+emit_16(1232);
+emit_16(1299);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1300);
+emit_16(1233);
+emit_16(1300);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1301);
+emit_16(1234);
+emit_16(1301);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1302);
+emit_16(1235);
+emit_16(1302);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1303);
+emit_16(1236);
+emit_16(1303);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1304);
+emit_16(1237);
+emit_16(1304);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1305);
+emit_16(1238);
+emit_16(1305);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1306);
+emit_16(1239);
+emit_16(1306);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1307);
+emit_16(1240);
+emit_16(1307);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1308);
+emit_16(1241);
+emit_16(1308);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1309);
+emit_16(1242);
+emit_16(1309);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1310);
+emit_16(1243);
+emit_16(1310);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1311);
+emit_16(1244);
+emit_16(1311);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1312);
+emit_16(1245);
+emit_16(1312);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1313);
+emit_16(1246);
+emit_16(1313);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1314);
+emit_16(1247);
+emit_16(1314);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1315);
+emit_16(1248);
+emit_16(1315);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1316);
+emit_16(1249);
+emit_16(1316);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1317);
+emit_16(1250);
+emit_16(1317);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1318);
+emit_16(1251);
+emit_16(1318);
+emit_16(1252);
+emit_16(1319);
+emit_16(1253);
+emit_16(1319);
+emit_16(1252);
+emit_16(1320);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1321);
+emit_16(1254);
+emit_16(1321);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1322);
+emit_16(1255);
+emit_16(1322);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1323);
+emit_16(1256);
+emit_16(1323);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1324);
+emit_16(1257);
+emit_16(1324);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1325);
+emit_16(1258);
+emit_16(1325);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1326);
+emit_16(1259);
+emit_16(1326);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1327);
+emit_16(1260);
+emit_16(1327);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1328);
+emit_16(1261);
+emit_16(1328);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1329);
+emit_16(1262);
+emit_16(1329);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1330);
+emit_16(1263);
+emit_16(1330);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1331);
+emit_16(1264);
+emit_16(1331);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1332);
+emit_16(1265);
+emit_16(1332);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1333);
+emit_16(1266);
+emit_16(1333);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1334);
+emit_16(1267);
+emit_16(1334);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1335);
+emit_16(1268);
+emit_16(1335);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1336);
+emit_16(1269);
+emit_16(1336);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1337);
+emit_16(1270);
+emit_16(1337);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1338);
+emit_16(1271);
+emit_16(1338);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1339);
+emit_16(1272);
+emit_16(1339);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1340);
+emit_16(1273);
+emit_16(1340);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1341);
+emit_16(1274);
+emit_16(1341);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1342);
+emit_16(1275);
+emit_16(1342);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1343);
+emit_16(1276);
+emit_16(1343);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1344);
+emit_16(1277);
+emit_16(1344);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1345);
+emit_16(1278);
+emit_16(1345);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1346);
+emit_16(1279);
+emit_16(1346);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1347);
+emit_16(1280);
+emit_16(1347);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1348);
+emit_16(1281);
+emit_16(1348);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1349);
+emit_16(1282);
+emit_16(1349);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1350);
+emit_16(1283);
+emit_16(1350);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1351);
+emit_16(1284);
+emit_16(1351);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1352);
+emit_16(1285);
+emit_16(1352);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1353);
+emit_16(1286);
+emit_16(1353);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1354);
+emit_16(1287);
+emit_16(1354);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1355);
+emit_16(1288);
+emit_16(1355);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1356);
+emit_16(1289);
+emit_16(1356);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1357);
+emit_16(1290);
+emit_16(1357);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1358);
+emit_16(1291);
+emit_16(1358);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1359);
+emit_16(1292);
+emit_16(1359);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1360);
+emit_16(1293);
+emit_16(1360);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1361);
+emit_16(1294);
+emit_16(1361);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1362);
+emit_16(1295);
+emit_16(1362);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1363);
+emit_16(1296);
+emit_16(1363);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1364);
+emit_16(1297);
+emit_16(1364);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1365);
+emit_16(1298);
+emit_16(1365);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1366);
+emit_16(1299);
+emit_16(1366);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1367);
+emit_16(1300);
+emit_16(1367);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1368);
+emit_16(1301);
+emit_16(1368);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1369);
+emit_16(1302);
+emit_16(1369);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1370);
+emit_16(1303);
+emit_16(1370);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1371);
+emit_16(1304);
+emit_16(1371);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1372);
+emit_16(1305);
+emit_16(1372);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1373);
+emit_16(1306);
+emit_16(1373);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1374);
+emit_16(1307);
+emit_16(1374);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1375);
+emit_16(1308);
+emit_16(1375);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1376);
+emit_16(1309);
+emit_16(1376);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1377);
+emit_16(1310);
+emit_16(1377);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1378);
+emit_16(1311);
+emit_16(1378);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1379);
+emit_16(1312);
+emit_16(1379);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1380);
+emit_16(1313);
+emit_16(1380);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1381);
+emit_16(1314);
+emit_16(1381);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1382);
+emit_16(1315);
+emit_16(1382);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1383);
+emit_16(1316);
+emit_16(1383);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1384);
+emit_16(1317);
+emit_16(1384);
+emit_16(1318);
+emit_16(1385);
+emit_16(1319);
+emit_16(1385);
+emit_16(1318);
+emit_16(1386);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1387);
+emit_16(1320);
+emit_16(1387);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1388);
+emit_16(1321);
+emit_16(1388);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1389);
+emit_16(1322);
+emit_16(1389);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1390);
+emit_16(1323);
+emit_16(1390);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1391);
+emit_16(1324);
+emit_16(1391);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1392);
+emit_16(1325);
+emit_16(1392);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1393);
+emit_16(1326);
+emit_16(1393);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1394);
+emit_16(1327);
+emit_16(1394);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1395);
+emit_16(1328);
+emit_16(1395);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1396);
+emit_16(1329);
+emit_16(1396);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1397);
+emit_16(1330);
+emit_16(1397);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1398);
+emit_16(1331);
+emit_16(1398);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1399);
+emit_16(1332);
+emit_16(1399);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1400);
+emit_16(1333);
+emit_16(1400);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1401);
+emit_16(1334);
+emit_16(1401);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1402);
+emit_16(1335);
+emit_16(1402);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1403);
+emit_16(1336);
+emit_16(1403);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1404);
+emit_16(1337);
+emit_16(1404);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1405);
+emit_16(1338);
+emit_16(1405);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1406);
+emit_16(1339);
+emit_16(1406);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1407);
+emit_16(1340);
+emit_16(1407);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1408);
+emit_16(1341);
+emit_16(1408);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1409);
+emit_16(1342);
+emit_16(1409);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1410);
+emit_16(1343);
+emit_16(1410);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1411);
+emit_16(1344);
+emit_16(1411);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1412);
+emit_16(1345);
+emit_16(1412);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1413);
+emit_16(1346);
+emit_16(1413);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1414);
+emit_16(1347);
+emit_16(1414);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1415);
+emit_16(1348);
+emit_16(1415);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1416);
+emit_16(1349);
+emit_16(1416);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1417);
+emit_16(1350);
+emit_16(1417);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1418);
+emit_16(1351);
+emit_16(1418);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1419);
+emit_16(1352);
+emit_16(1419);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1420);
+emit_16(1353);
+emit_16(1420);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1421);
+emit_16(1354);
+emit_16(1421);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1422);
+emit_16(1355);
+emit_16(1422);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1423);
+emit_16(1356);
+emit_16(1423);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1424);
+emit_16(1357);
+emit_16(1424);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1425);
+emit_16(1358);
+emit_16(1425);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1426);
+emit_16(1359);
+emit_16(1426);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1427);
+emit_16(1360);
+emit_16(1427);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1428);
+emit_16(1361);
+emit_16(1428);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1429);
+emit_16(1362);
+emit_16(1429);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1430);
+emit_16(1363);
+emit_16(1430);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1431);
+emit_16(1364);
+emit_16(1431);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1432);
+emit_16(1365);
+emit_16(1432);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1433);
+emit_16(1366);
+emit_16(1433);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1434);
+emit_16(1367);
+emit_16(1434);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1435);
+emit_16(1368);
+emit_16(1435);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1436);
+emit_16(1369);
+emit_16(1436);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1437);
+emit_16(1370);
+emit_16(1437);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1438);
+emit_16(1371);
+emit_16(1438);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1439);
+emit_16(1372);
+emit_16(1439);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1440);
+emit_16(1373);
+emit_16(1440);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1441);
+emit_16(1374);
+emit_16(1441);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1442);
+emit_16(1375);
+emit_16(1442);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1443);
+emit_16(1376);
+emit_16(1443);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1444);
+emit_16(1377);
+emit_16(1444);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1445);
+emit_16(1378);
+emit_16(1445);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1446);
+emit_16(1379);
+emit_16(1446);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1447);
+emit_16(1380);
+emit_16(1447);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1448);
+emit_16(1381);
+emit_16(1448);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1449);
+emit_16(1382);
+emit_16(1449);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1450);
+emit_16(1383);
+emit_16(1450);
+emit_16(1384);
+emit_16(1451);
+emit_16(1385);
+emit_16(1451);
+emit_16(1384);
+emit_16(1452);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1453);
+emit_16(1386);
+emit_16(1453);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1454);
+emit_16(1387);
+emit_16(1454);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1455);
+emit_16(1388);
+emit_16(1455);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1456);
+emit_16(1389);
+emit_16(1456);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1457);
+emit_16(1390);
+emit_16(1457);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1458);
+emit_16(1391);
+emit_16(1458);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1459);
+emit_16(1392);
+emit_16(1459);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1460);
+emit_16(1393);
+emit_16(1460);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1461);
+emit_16(1394);
+emit_16(1461);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1462);
+emit_16(1395);
+emit_16(1462);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1463);
+emit_16(1396);
+emit_16(1463);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1464);
+emit_16(1397);
+emit_16(1464);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1465);
+emit_16(1398);
+emit_16(1465);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1466);
+emit_16(1399);
+emit_16(1466);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1467);
+emit_16(1400);
+emit_16(1467);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1468);
+emit_16(1401);
+emit_16(1468);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1469);
+emit_16(1402);
+emit_16(1469);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1470);
+emit_16(1403);
+emit_16(1470);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1471);
+emit_16(1404);
+emit_16(1471);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1472);
+emit_16(1405);
+emit_16(1472);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1473);
+emit_16(1406);
+emit_16(1473);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1474);
+emit_16(1407);
+emit_16(1474);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1475);
+emit_16(1408);
+emit_16(1475);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1476);
+emit_16(1409);
+emit_16(1476);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1477);
+emit_16(1410);
+emit_16(1477);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1478);
+emit_16(1411);
+emit_16(1478);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1479);
+emit_16(1412);
+emit_16(1479);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1480);
+emit_16(1413);
+emit_16(1480);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1481);
+emit_16(1414);
+emit_16(1481);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1482);
+emit_16(1415);
+emit_16(1482);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1483);
+emit_16(1416);
+emit_16(1483);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1484);
+emit_16(1417);
+emit_16(1484);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1485);
+emit_16(1418);
+emit_16(1485);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1486);
+emit_16(1419);
+emit_16(1486);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1487);
+emit_16(1420);
+emit_16(1487);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1488);
+emit_16(1421);
+emit_16(1488);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1489);
+emit_16(1422);
+emit_16(1489);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1490);
+emit_16(1423);
+emit_16(1490);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1491);
+emit_16(1424);
+emit_16(1491);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1492);
+emit_16(1425);
+emit_16(1492);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1493);
+emit_16(1426);
+emit_16(1493);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1494);
+emit_16(1427);
+emit_16(1494);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1495);
+emit_16(1428);
+emit_16(1495);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1496);
+emit_16(1429);
+emit_16(1496);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1497);
+emit_16(1430);
+emit_16(1497);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1498);
+emit_16(1431);
+emit_16(1498);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1499);
+emit_16(1432);
+emit_16(1499);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1500);
+emit_16(1433);
+emit_16(1500);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1501);
+emit_16(1434);
+emit_16(1501);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1502);
+emit_16(1435);
+emit_16(1502);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1503);
+emit_16(1436);
+emit_16(1503);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1504);
+emit_16(1437);
+emit_16(1504);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1505);
+emit_16(1438);
+emit_16(1505);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1506);
+emit_16(1439);
+emit_16(1506);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1507);
+emit_16(1440);
+emit_16(1507);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1508);
+emit_16(1441);
+emit_16(1508);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1509);
+emit_16(1442);
+emit_16(1509);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1510);
+emit_16(1443);
+emit_16(1510);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1511);
+emit_16(1444);
+emit_16(1511);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1512);
+emit_16(1445);
+emit_16(1512);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1513);
+emit_16(1446);
+emit_16(1513);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1514);
+emit_16(1447);
+emit_16(1514);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1515);
+emit_16(1448);
+emit_16(1515);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1516);
+emit_16(1449);
+emit_16(1516);
+emit_16(1450);
+emit_16(1517);
+emit_16(1451);
+emit_16(1517);
+emit_16(1450);
+emit_16(1518);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1519);
+emit_16(1452);
+emit_16(1519);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1520);
+emit_16(1453);
+emit_16(1520);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1521);
+emit_16(1454);
+emit_16(1521);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1522);
+emit_16(1455);
+emit_16(1522);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1523);
+emit_16(1456);
+emit_16(1523);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1524);
+emit_16(1457);
+emit_16(1524);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1525);
+emit_16(1458);
+emit_16(1525);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1526);
+emit_16(1459);
+emit_16(1526);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1527);
+emit_16(1460);
+emit_16(1527);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1528);
+emit_16(1461);
+emit_16(1528);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1529);
+emit_16(1462);
+emit_16(1529);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1530);
+emit_16(1463);
+emit_16(1530);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1531);
+emit_16(1464);
+emit_16(1531);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1532);
+emit_16(1465);
+emit_16(1532);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1533);
+emit_16(1466);
+emit_16(1533);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1534);
+emit_16(1467);
+emit_16(1534);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1535);
+emit_16(1468);
+emit_16(1535);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1536);
+emit_16(1469);
+emit_16(1536);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1537);
+emit_16(1470);
+emit_16(1537);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1538);
+emit_16(1471);
+emit_16(1538);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1539);
+emit_16(1472);
+emit_16(1539);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1540);
+emit_16(1473);
+emit_16(1540);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1541);
+emit_16(1474);
+emit_16(1541);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1542);
+emit_16(1475);
+emit_16(1542);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1543);
+emit_16(1476);
+emit_16(1543);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1544);
+emit_16(1477);
+emit_16(1544);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1545);
+emit_16(1478);
+emit_16(1545);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1546);
+emit_16(1479);
+emit_16(1546);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1547);
+emit_16(1480);
+emit_16(1547);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1548);
+emit_16(1481);
+emit_16(1548);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1549);
+emit_16(1482);
+emit_16(1549);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1550);
+emit_16(1483);
+emit_16(1550);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1551);
+emit_16(1484);
+emit_16(1551);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1552);
+emit_16(1485);
+emit_16(1552);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1553);
+emit_16(1486);
+emit_16(1553);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1554);
+emit_16(1487);
+emit_16(1554);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1555);
+emit_16(1488);
+emit_16(1555);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1556);
+emit_16(1489);
+emit_16(1556);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1557);
+emit_16(1490);
+emit_16(1557);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1558);
+emit_16(1491);
+emit_16(1558);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1559);
+emit_16(1492);
+emit_16(1559);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1560);
+emit_16(1493);
+emit_16(1560);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1561);
+emit_16(1494);
+emit_16(1561);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1562);
+emit_16(1495);
+emit_16(1562);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1563);
+emit_16(1496);
+emit_16(1563);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1564);
+emit_16(1497);
+emit_16(1564);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1565);
+emit_16(1498);
+emit_16(1565);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1566);
+emit_16(1499);
+emit_16(1566);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1567);
+emit_16(1500);
+emit_16(1567);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1568);
+emit_16(1501);
+emit_16(1568);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1569);
+emit_16(1502);
+emit_16(1569);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1570);
+emit_16(1503);
+emit_16(1570);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1571);
+emit_16(1504);
+emit_16(1571);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1572);
+emit_16(1505);
+emit_16(1572);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1573);
+emit_16(1506);
+emit_16(1573);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1574);
+emit_16(1507);
+emit_16(1574);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1575);
+emit_16(1508);
+emit_16(1575);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1576);
+emit_16(1509);
+emit_16(1576);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1577);
+emit_16(1510);
+emit_16(1577);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1578);
+emit_16(1511);
+emit_16(1578);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1579);
+emit_16(1512);
+emit_16(1579);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1580);
+emit_16(1513);
+emit_16(1580);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1581);
+emit_16(1514);
+emit_16(1581);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1582);
+emit_16(1515);
+emit_16(1582);
+emit_16(1516);
+emit_16(1583);
+emit_16(1517);
+emit_16(1583);
+emit_16(1516);
+emit_16(1584);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1585);
+emit_16(1518);
+emit_16(1585);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1586);
+emit_16(1519);
+emit_16(1586);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1587);
+emit_16(1520);
+emit_16(1587);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1588);
+emit_16(1521);
+emit_16(1588);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1589);
+emit_16(1522);
+emit_16(1589);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1590);
+emit_16(1523);
+emit_16(1590);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1591);
+emit_16(1524);
+emit_16(1591);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1592);
+emit_16(1525);
+emit_16(1592);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1593);
+emit_16(1526);
+emit_16(1593);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1594);
+emit_16(1527);
+emit_16(1594);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1595);
+emit_16(1528);
+emit_16(1595);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1596);
+emit_16(1529);
+emit_16(1596);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1597);
+emit_16(1530);
+emit_16(1597);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1598);
+emit_16(1531);
+emit_16(1598);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1599);
+emit_16(1532);
+emit_16(1599);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1600);
+emit_16(1533);
+emit_16(1600);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1601);
+emit_16(1534);
+emit_16(1601);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1602);
+emit_16(1535);
+emit_16(1602);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1603);
+emit_16(1536);
+emit_16(1603);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1604);
+emit_16(1537);
+emit_16(1604);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1605);
+emit_16(1538);
+emit_16(1605);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1606);
+emit_16(1539);
+emit_16(1606);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1607);
+emit_16(1540);
+emit_16(1607);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1608);
+emit_16(1541);
+emit_16(1608);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1609);
+emit_16(1542);
+emit_16(1609);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1610);
+emit_16(1543);
+emit_16(1610);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1611);
+emit_16(1544);
+emit_16(1611);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1612);
+emit_16(1545);
+emit_16(1612);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1613);
+emit_16(1546);
+emit_16(1613);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1614);
+emit_16(1547);
+emit_16(1614);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1615);
+emit_16(1548);
+emit_16(1615);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1616);
+emit_16(1549);
+emit_16(1616);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1617);
+emit_16(1550);
+emit_16(1617);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1618);
+emit_16(1551);
+emit_16(1618);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1619);
+emit_16(1552);
+emit_16(1619);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1620);
+emit_16(1553);
+emit_16(1620);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1621);
+emit_16(1554);
+emit_16(1621);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1622);
+emit_16(1555);
+emit_16(1622);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1623);
+emit_16(1556);
+emit_16(1623);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1624);
+emit_16(1557);
+emit_16(1624);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1625);
+emit_16(1558);
+emit_16(1625);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1626);
+emit_16(1559);
+emit_16(1626);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1627);
+emit_16(1560);
+emit_16(1627);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1628);
+emit_16(1561);
+emit_16(1628);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1629);
+emit_16(1562);
+emit_16(1629);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1630);
+emit_16(1563);
+emit_16(1630);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1631);
+emit_16(1564);
+emit_16(1631);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1632);
+emit_16(1565);
+emit_16(1632);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1633);
+emit_16(1566);
+emit_16(1633);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1634);
+emit_16(1567);
+emit_16(1634);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1635);
+emit_16(1568);
+emit_16(1635);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1636);
+emit_16(1569);
+emit_16(1636);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1637);
+emit_16(1570);
+emit_16(1637);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1638);
+emit_16(1571);
+emit_16(1638);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1639);
+emit_16(1572);
+emit_16(1639);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1640);
+emit_16(1573);
+emit_16(1640);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1641);
+emit_16(1574);
+emit_16(1641);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1642);
+emit_16(1575);
+emit_16(1642);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1643);
+emit_16(1576);
+emit_16(1643);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1644);
+emit_16(1577);
+emit_16(1644);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1645);
+emit_16(1578);
+emit_16(1645);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1646);
+emit_16(1579);
+emit_16(1646);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1647);
+emit_16(1580);
+emit_16(1647);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1648);
+emit_16(1581);
+emit_16(1648);
+emit_16(1582);
+emit_16(1649);
+emit_16(1583);
+emit_16(1649);
+emit_16(1582);
+emit_16(1650);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1651);
+emit_16(1584);
+emit_16(1651);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1652);
+emit_16(1585);
+emit_16(1652);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1653);
+emit_16(1586);
+emit_16(1653);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1654);
+emit_16(1587);
+emit_16(1654);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1655);
+emit_16(1588);
+emit_16(1655);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1656);
+emit_16(1589);
+emit_16(1656);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1657);
+emit_16(1590);
+emit_16(1657);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1658);
+emit_16(1591);
+emit_16(1658);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1659);
+emit_16(1592);
+emit_16(1659);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1660);
+emit_16(1593);
+emit_16(1660);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1661);
+emit_16(1594);
+emit_16(1661);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1662);
+emit_16(1595);
+emit_16(1662);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1663);
+emit_16(1596);
+emit_16(1663);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1664);
+emit_16(1597);
+emit_16(1664);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1665);
+emit_16(1598);
+emit_16(1665);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1666);
+emit_16(1599);
+emit_16(1666);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1667);
+emit_16(1600);
+emit_16(1667);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1668);
+emit_16(1601);
+emit_16(1668);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1669);
+emit_16(1602);
+emit_16(1669);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1670);
+emit_16(1603);
+emit_16(1670);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1671);
+emit_16(1604);
+emit_16(1671);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1672);
+emit_16(1605);
+emit_16(1672);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1673);
+emit_16(1606);
+emit_16(1673);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1674);
+emit_16(1607);
+emit_16(1674);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1675);
+emit_16(1608);
+emit_16(1675);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1676);
+emit_16(1609);
+emit_16(1676);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1677);
+emit_16(1610);
+emit_16(1677);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1678);
+emit_16(1611);
+emit_16(1678);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1679);
+emit_16(1612);
+emit_16(1679);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1680);
+emit_16(1613);
+emit_16(1680);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1681);
+emit_16(1614);
+emit_16(1681);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1682);
+emit_16(1615);
+emit_16(1682);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1683);
+emit_16(1616);
+emit_16(1683);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1684);
+emit_16(1617);
+emit_16(1684);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1685);
+emit_16(1618);
+emit_16(1685);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1686);
+emit_16(1619);
+emit_16(1686);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1687);
+emit_16(1620);
+emit_16(1687);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1688);
+emit_16(1621);
+emit_16(1688);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1689);
+emit_16(1622);
+emit_16(1689);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1690);
+emit_16(1623);
+emit_16(1690);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1691);
+emit_16(1624);
+emit_16(1691);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1692);
+emit_16(1625);
+emit_16(1692);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1693);
+emit_16(1626);
+emit_16(1693);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1694);
+emit_16(1627);
+emit_16(1694);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1695);
+emit_16(1628);
+emit_16(1695);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1696);
+emit_16(1629);
+emit_16(1696);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1697);
+emit_16(1630);
+emit_16(1697);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1698);
+emit_16(1631);
+emit_16(1698);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1699);
+emit_16(1632);
+emit_16(1699);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1700);
+emit_16(1633);
+emit_16(1700);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1701);
+emit_16(1634);
+emit_16(1701);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1702);
+emit_16(1635);
+emit_16(1702);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1703);
+emit_16(1636);
+emit_16(1703);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1704);
+emit_16(1637);
+emit_16(1704);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1705);
+emit_16(1638);
+emit_16(1705);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1706);
+emit_16(1639);
+emit_16(1706);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1707);
+emit_16(1640);
+emit_16(1707);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1708);
+emit_16(1641);
+emit_16(1708);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1709);
+emit_16(1642);
+emit_16(1709);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1710);
+emit_16(1643);
+emit_16(1710);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1711);
+emit_16(1644);
+emit_16(1711);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1712);
+emit_16(1645);
+emit_16(1712);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1713);
+emit_16(1646);
+emit_16(1713);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1714);
+emit_16(1647);
+emit_16(1714);
+emit_16(1648);
+emit_16(1715);
+emit_16(1649);
+emit_16(1715);
+emit_16(1648);
+emit_16(1716);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1717);
+emit_16(1650);
+emit_16(1717);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1718);
+emit_16(1651);
+emit_16(1718);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1719);
+emit_16(1652);
+emit_16(1719);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1720);
+emit_16(1653);
+emit_16(1720);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1721);
+emit_16(1654);
+emit_16(1721);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1722);
+emit_16(1655);
+emit_16(1722);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1723);
+emit_16(1656);
+emit_16(1723);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1724);
+emit_16(1657);
+emit_16(1724);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1725);
+emit_16(1658);
+emit_16(1725);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1726);
+emit_16(1659);
+emit_16(1726);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1727);
+emit_16(1660);
+emit_16(1727);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1728);
+emit_16(1661);
+emit_16(1728);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1729);
+emit_16(1662);
+emit_16(1729);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1730);
+emit_16(1663);
+emit_16(1730);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1731);
+emit_16(1664);
+emit_16(1731);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1732);
+emit_16(1665);
+emit_16(1732);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1733);
+emit_16(1666);
+emit_16(1733);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1734);
+emit_16(1667);
+emit_16(1734);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1735);
+emit_16(1668);
+emit_16(1735);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1736);
+emit_16(1669);
+emit_16(1736);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1737);
+emit_16(1670);
+emit_16(1737);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1738);
+emit_16(1671);
+emit_16(1738);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1739);
+emit_16(1672);
+emit_16(1739);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1740);
+emit_16(1673);
+emit_16(1740);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1741);
+emit_16(1674);
+emit_16(1741);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1742);
+emit_16(1675);
+emit_16(1742);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1743);
+emit_16(1676);
+emit_16(1743);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1744);
+emit_16(1677);
+emit_16(1744);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1745);
+emit_16(1678);
+emit_16(1745);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1746);
+emit_16(1679);
+emit_16(1746);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1747);
+emit_16(1680);
+emit_16(1747);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1748);
+emit_16(1681);
+emit_16(1748);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1749);
+emit_16(1682);
+emit_16(1749);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1750);
+emit_16(1683);
+emit_16(1750);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1751);
+emit_16(1684);
+emit_16(1751);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1752);
+emit_16(1685);
+emit_16(1752);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1753);
+emit_16(1686);
+emit_16(1753);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1754);
+emit_16(1687);
+emit_16(1754);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1755);
+emit_16(1688);
+emit_16(1755);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1756);
+emit_16(1689);
+emit_16(1756);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1757);
+emit_16(1690);
+emit_16(1757);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1758);
+emit_16(1691);
+emit_16(1758);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1759);
+emit_16(1692);
+emit_16(1759);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1760);
+emit_16(1693);
+emit_16(1760);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1761);
+emit_16(1694);
+emit_16(1761);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1762);
+emit_16(1695);
+emit_16(1762);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1763);
+emit_16(1696);
+emit_16(1763);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1764);
+emit_16(1697);
+emit_16(1764);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1765);
+emit_16(1698);
+emit_16(1765);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1766);
+emit_16(1699);
+emit_16(1766);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1767);
+emit_16(1700);
+emit_16(1767);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1768);
+emit_16(1701);
+emit_16(1768);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1769);
+emit_16(1702);
+emit_16(1769);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1770);
+emit_16(1703);
+emit_16(1770);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1771);
+emit_16(1704);
+emit_16(1771);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1772);
+emit_16(1705);
+emit_16(1772);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1773);
+emit_16(1706);
+emit_16(1773);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1774);
+emit_16(1707);
+emit_16(1774);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1775);
+emit_16(1708);
+emit_16(1775);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1776);
+emit_16(1709);
+emit_16(1776);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1777);
+emit_16(1710);
+emit_16(1777);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1778);
+emit_16(1711);
+emit_16(1778);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1779);
+emit_16(1712);
+emit_16(1779);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1780);
+emit_16(1713);
+emit_16(1780);
+emit_16(1714);
+emit_16(1781);
+emit_16(1715);
+emit_16(1781);
+emit_16(1714);
+emit_16(1782);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1783);
+emit_16(1716);
+emit_16(1783);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1784);
+emit_16(1717);
+emit_16(1784);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1785);
+emit_16(1718);
+emit_16(1785);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1786);
+emit_16(1719);
+emit_16(1786);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1787);
+emit_16(1720);
+emit_16(1787);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1788);
+emit_16(1721);
+emit_16(1788);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1789);
+emit_16(1722);
+emit_16(1789);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1790);
+emit_16(1723);
+emit_16(1790);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1791);
+emit_16(1724);
+emit_16(1791);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1792);
+emit_16(1725);
+emit_16(1792);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1793);
+emit_16(1726);
+emit_16(1793);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1794);
+emit_16(1727);
+emit_16(1794);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1795);
+emit_16(1728);
+emit_16(1795);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1796);
+emit_16(1729);
+emit_16(1796);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1797);
+emit_16(1730);
+emit_16(1797);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1798);
+emit_16(1731);
+emit_16(1798);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1799);
+emit_16(1732);
+emit_16(1799);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1800);
+emit_16(1733);
+emit_16(1800);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1801);
+emit_16(1734);
+emit_16(1801);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1802);
+emit_16(1735);
+emit_16(1802);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1803);
+emit_16(1736);
+emit_16(1803);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1804);
+emit_16(1737);
+emit_16(1804);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1805);
+emit_16(1738);
+emit_16(1805);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1806);
+emit_16(1739);
+emit_16(1806);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1807);
+emit_16(1740);
+emit_16(1807);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1808);
+emit_16(1741);
+emit_16(1808);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1809);
+emit_16(1742);
+emit_16(1809);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1810);
+emit_16(1743);
+emit_16(1810);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1811);
+emit_16(1744);
+emit_16(1811);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1812);
+emit_16(1745);
+emit_16(1812);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1813);
+emit_16(1746);
+emit_16(1813);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1814);
+emit_16(1747);
+emit_16(1814);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1815);
+emit_16(1748);
+emit_16(1815);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1816);
+emit_16(1749);
+emit_16(1816);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1817);
+emit_16(1750);
+emit_16(1817);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1818);
+emit_16(1751);
+emit_16(1818);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1819);
+emit_16(1752);
+emit_16(1819);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1820);
+emit_16(1753);
+emit_16(1820);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1821);
+emit_16(1754);
+emit_16(1821);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1822);
+emit_16(1755);
+emit_16(1822);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1823);
+emit_16(1756);
+emit_16(1823);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1824);
+emit_16(1757);
+emit_16(1824);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1825);
+emit_16(1758);
+emit_16(1825);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1826);
+emit_16(1759);
+emit_16(1826);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1827);
+emit_16(1760);
+emit_16(1827);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1828);
+emit_16(1761);
+emit_16(1828);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1829);
+emit_16(1762);
+emit_16(1829);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1830);
+emit_16(1763);
+emit_16(1830);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1831);
+emit_16(1764);
+emit_16(1831);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1832);
+emit_16(1765);
+emit_16(1832);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1833);
+emit_16(1766);
+emit_16(1833);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1834);
+emit_16(1767);
+emit_16(1834);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1835);
+emit_16(1768);
+emit_16(1835);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1836);
+emit_16(1769);
+emit_16(1836);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1837);
+emit_16(1770);
+emit_16(1837);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1838);
+emit_16(1771);
+emit_16(1838);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1839);
+emit_16(1772);
+emit_16(1839);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1840);
+emit_16(1773);
+emit_16(1840);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1841);
+emit_16(1774);
+emit_16(1841);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1842);
+emit_16(1775);
+emit_16(1842);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1843);
+emit_16(1776);
+emit_16(1843);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1844);
+emit_16(1777);
+emit_16(1844);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1845);
+emit_16(1778);
+emit_16(1845);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1846);
+emit_16(1779);
+emit_16(1846);
+emit_16(1780);
+emit_16(1847);
+emit_16(1781);
+emit_16(1847);
+emit_16(1780);
+emit_16(1848);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1849);
+emit_16(1782);
+emit_16(1849);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1850);
+emit_16(1783);
+emit_16(1850);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1851);
+emit_16(1784);
+emit_16(1851);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1852);
+emit_16(1785);
+emit_16(1852);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1853);
+emit_16(1786);
+emit_16(1853);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1854);
+emit_16(1787);
+emit_16(1854);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1855);
+emit_16(1788);
+emit_16(1855);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1856);
+emit_16(1789);
+emit_16(1856);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1857);
+emit_16(1790);
+emit_16(1857);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1858);
+emit_16(1791);
+emit_16(1858);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1859);
+emit_16(1792);
+emit_16(1859);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1860);
+emit_16(1793);
+emit_16(1860);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1861);
+emit_16(1794);
+emit_16(1861);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1862);
+emit_16(1795);
+emit_16(1862);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1863);
+emit_16(1796);
+emit_16(1863);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1864);
+emit_16(1797);
+emit_16(1864);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1865);
+emit_16(1798);
+emit_16(1865);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1866);
+emit_16(1799);
+emit_16(1866);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1867);
+emit_16(1800);
+emit_16(1867);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1868);
+emit_16(1801);
+emit_16(1868);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1869);
+emit_16(1802);
+emit_16(1869);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1870);
+emit_16(1803);
+emit_16(1870);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1871);
+emit_16(1804);
+emit_16(1871);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1872);
+emit_16(1805);
+emit_16(1872);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1873);
+emit_16(1806);
+emit_16(1873);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1874);
+emit_16(1807);
+emit_16(1874);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1875);
+emit_16(1808);
+emit_16(1875);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1876);
+emit_16(1809);
+emit_16(1876);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1877);
+emit_16(1810);
+emit_16(1877);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1878);
+emit_16(1811);
+emit_16(1878);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1879);
+emit_16(1812);
+emit_16(1879);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1880);
+emit_16(1813);
+emit_16(1880);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1881);
+emit_16(1814);
+emit_16(1881);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1882);
+emit_16(1815);
+emit_16(1882);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1883);
+emit_16(1816);
+emit_16(1883);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1884);
+emit_16(1817);
+emit_16(1884);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1885);
+emit_16(1818);
+emit_16(1885);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1886);
+emit_16(1819);
+emit_16(1886);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1887);
+emit_16(1820);
+emit_16(1887);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1888);
+emit_16(1821);
+emit_16(1888);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1889);
+emit_16(1822);
+emit_16(1889);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1890);
+emit_16(1823);
+emit_16(1890);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1891);
+emit_16(1824);
+emit_16(1891);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1892);
+emit_16(1825);
+emit_16(1892);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1893);
+emit_16(1826);
+emit_16(1893);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1894);
+emit_16(1827);
+emit_16(1894);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1895);
+emit_16(1828);
+emit_16(1895);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1896);
+emit_16(1829);
+emit_16(1896);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1897);
+emit_16(1830);
+emit_16(1897);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1898);
+emit_16(1831);
+emit_16(1898);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1899);
+emit_16(1832);
+emit_16(1899);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1900);
+emit_16(1833);
+emit_16(1900);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1901);
+emit_16(1834);
+emit_16(1901);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1902);
+emit_16(1835);
+emit_16(1902);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1903);
+emit_16(1836);
+emit_16(1903);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1904);
+emit_16(1837);
+emit_16(1904);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1905);
+emit_16(1838);
+emit_16(1905);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1906);
+emit_16(1839);
+emit_16(1906);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1907);
+emit_16(1840);
+emit_16(1907);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1908);
+emit_16(1841);
+emit_16(1908);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1909);
+emit_16(1842);
+emit_16(1909);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1910);
+emit_16(1843);
+emit_16(1910);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1911);
+emit_16(1844);
+emit_16(1911);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1912);
+emit_16(1845);
+emit_16(1912);
+emit_16(1846);
+emit_16(1913);
+emit_16(1847);
+emit_16(1913);
+emit_16(1846);
+emit_16(1914);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1915);
+emit_16(1848);
+emit_16(1915);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1916);
+emit_16(1849);
+emit_16(1916);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1917);
+emit_16(1850);
+emit_16(1917);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1918);
+emit_16(1851);
+emit_16(1918);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1919);
+emit_16(1852);
+emit_16(1919);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1920);
+emit_16(1853);
+emit_16(1920);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1921);
+emit_16(1854);
+emit_16(1921);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1922);
+emit_16(1855);
+emit_16(1922);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1923);
+emit_16(1856);
+emit_16(1923);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1924);
+emit_16(1857);
+emit_16(1924);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1925);
+emit_16(1858);
+emit_16(1925);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1926);
+emit_16(1859);
+emit_16(1926);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1927);
+emit_16(1860);
+emit_16(1927);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1928);
+emit_16(1861);
+emit_16(1928);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1929);
+emit_16(1862);
+emit_16(1929);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1930);
+emit_16(1863);
+emit_16(1930);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1931);
+emit_16(1864);
+emit_16(1931);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1932);
+emit_16(1865);
+emit_16(1932);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1933);
+emit_16(1866);
+emit_16(1933);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1934);
+emit_16(1867);
+emit_16(1934);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1935);
+emit_16(1868);
+emit_16(1935);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1936);
+emit_16(1869);
+emit_16(1936);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1937);
+emit_16(1870);
+emit_16(1937);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1938);
+emit_16(1871);
+emit_16(1938);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1939);
+emit_16(1872);
+emit_16(1939);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1940);
+emit_16(1873);
+emit_16(1940);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1941);
+emit_16(1874);
+emit_16(1941);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1942);
+emit_16(1875);
+emit_16(1942);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1943);
+emit_16(1876);
+emit_16(1943);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1944);
+emit_16(1877);
+emit_16(1944);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1945);
+emit_16(1878);
+emit_16(1945);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1946);
+emit_16(1879);
+emit_16(1946);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1947);
+emit_16(1880);
+emit_16(1947);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1948);
+emit_16(1881);
+emit_16(1948);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1949);
+emit_16(1882);
+emit_16(1949);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1950);
+emit_16(1883);
+emit_16(1950);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1951);
+emit_16(1884);
+emit_16(1951);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1952);
+emit_16(1885);
+emit_16(1952);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1953);
+emit_16(1886);
+emit_16(1953);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1954);
+emit_16(1887);
+emit_16(1954);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1955);
+emit_16(1888);
+emit_16(1955);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1956);
+emit_16(1889);
+emit_16(1956);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1957);
+emit_16(1890);
+emit_16(1957);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1958);
+emit_16(1891);
+emit_16(1958);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1959);
+emit_16(1892);
+emit_16(1959);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1960);
+emit_16(1893);
+emit_16(1960);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1961);
+emit_16(1894);
+emit_16(1961);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1962);
+emit_16(1895);
+emit_16(1962);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1963);
+emit_16(1896);
+emit_16(1963);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1964);
+emit_16(1897);
+emit_16(1964);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1965);
+emit_16(1898);
+emit_16(1965);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1966);
+emit_16(1899);
+emit_16(1966);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1967);
+emit_16(1900);
+emit_16(1967);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1968);
+emit_16(1901);
+emit_16(1968);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1969);
+emit_16(1902);
+emit_16(1969);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1970);
+emit_16(1903);
+emit_16(1970);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1971);
+emit_16(1904);
+emit_16(1971);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1972);
+emit_16(1905);
+emit_16(1972);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1973);
+emit_16(1906);
+emit_16(1973);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1974);
+emit_16(1907);
+emit_16(1974);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1975);
+emit_16(1908);
+emit_16(1975);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1976);
+emit_16(1909);
+emit_16(1976);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1977);
+emit_16(1910);
+emit_16(1977);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1978);
+emit_16(1911);
+emit_16(1978);
+emit_16(1912);
+emit_16(1979);
+emit_16(1913);
+emit_16(1979);
+emit_16(1912);
+emit_16(1980);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1981);
+emit_16(1914);
+emit_16(1981);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1982);
+emit_16(1915);
+emit_16(1982);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1983);
+emit_16(1916);
+emit_16(1983);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1984);
+emit_16(1917);
+emit_16(1984);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1985);
+emit_16(1918);
+emit_16(1985);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1986);
+emit_16(1919);
+emit_16(1986);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1987);
+emit_16(1920);
+emit_16(1987);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1988);
+emit_16(1921);
+emit_16(1988);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1989);
+emit_16(1922);
+emit_16(1989);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1990);
+emit_16(1923);
+emit_16(1990);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1991);
+emit_16(1924);
+emit_16(1991);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1992);
+emit_16(1925);
+emit_16(1992);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1993);
+emit_16(1926);
+emit_16(1993);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1994);
+emit_16(1927);
+emit_16(1994);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1995);
+emit_16(1928);
+emit_16(1995);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1996);
+emit_16(1929);
+emit_16(1996);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1997);
+emit_16(1930);
+emit_16(1997);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1998);
+emit_16(1931);
+emit_16(1998);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(1999);
+emit_16(1932);
+emit_16(1999);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2000);
+emit_16(1933);
+emit_16(2000);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2001);
+emit_16(1934);
+emit_16(2001);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2002);
+emit_16(1935);
+emit_16(2002);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2003);
+emit_16(1936);
+emit_16(2003);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2004);
+emit_16(1937);
+emit_16(2004);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2005);
+emit_16(1938);
+emit_16(2005);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2006);
+emit_16(1939);
+emit_16(2006);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2007);
+emit_16(1940);
+emit_16(2007);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2008);
+emit_16(1941);
+emit_16(2008);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2009);
+emit_16(1942);
+emit_16(2009);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2010);
+emit_16(1943);
+emit_16(2010);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2011);
+emit_16(1944);
+emit_16(2011);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2012);
+emit_16(1945);
+emit_16(2012);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2013);
+emit_16(1946);
+emit_16(2013);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2014);
+emit_16(1947);
+emit_16(2014);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2015);
+emit_16(1948);
+emit_16(2015);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2016);
+emit_16(1949);
+emit_16(2016);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2017);
+emit_16(1950);
+emit_16(2017);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2018);
+emit_16(1951);
+emit_16(2018);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2019);
+emit_16(1952);
+emit_16(2019);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2020);
+emit_16(1953);
+emit_16(2020);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2021);
+emit_16(1954);
+emit_16(2021);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2022);
+emit_16(1955);
+emit_16(2022);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2023);
+emit_16(1956);
+emit_16(2023);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2024);
+emit_16(1957);
+emit_16(2024);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2025);
+emit_16(1958);
+emit_16(2025);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2026);
+emit_16(1959);
+emit_16(2026);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2027);
+emit_16(1960);
+emit_16(2027);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2028);
+emit_16(1961);
+emit_16(2028);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2029);
+emit_16(1962);
+emit_16(2029);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2030);
+emit_16(1963);
+emit_16(2030);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2031);
+emit_16(1964);
+emit_16(2031);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2032);
+emit_16(1965);
+emit_16(2032);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2033);
+emit_16(1966);
+emit_16(2033);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2034);
+emit_16(1967);
+emit_16(2034);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2035);
+emit_16(1968);
+emit_16(2035);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2036);
+emit_16(1969);
+emit_16(2036);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2037);
+emit_16(1970);
+emit_16(2037);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2038);
+emit_16(1971);
+emit_16(2038);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2039);
+emit_16(1972);
+emit_16(2039);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2040);
+emit_16(1973);
+emit_16(2040);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2041);
+emit_16(1974);
+emit_16(2041);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2042);
+emit_16(1975);
+emit_16(2042);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2043);
+emit_16(1976);
+emit_16(2043);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2044);
+emit_16(1977);
+emit_16(2044);
+emit_16(1978);
+emit_16(2045);
+emit_16(1979);
+emit_16(2045);
+emit_16(1978);
+emit_16(2046);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2047);
+emit_16(1980);
+emit_16(2047);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2048);
+emit_16(1981);
+emit_16(2048);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2049);
+emit_16(1982);
+emit_16(2049);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2050);
+emit_16(1983);
+emit_16(2050);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2051);
+emit_16(1984);
+emit_16(2051);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2052);
+emit_16(1985);
+emit_16(2052);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2053);
+emit_16(1986);
+emit_16(2053);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2054);
+emit_16(1987);
+emit_16(2054);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2055);
+emit_16(1988);
+emit_16(2055);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2056);
+emit_16(1989);
+emit_16(2056);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2057);
+emit_16(1990);
+emit_16(2057);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2058);
+emit_16(1991);
+emit_16(2058);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2059);
+emit_16(1992);
+emit_16(2059);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2060);
+emit_16(1993);
+emit_16(2060);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2061);
+emit_16(1994);
+emit_16(2061);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2062);
+emit_16(1995);
+emit_16(2062);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2063);
+emit_16(1996);
+emit_16(2063);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2064);
+emit_16(1997);
+emit_16(2064);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2065);
+emit_16(1998);
+emit_16(2065);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2066);
+emit_16(1999);
+emit_16(2066);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2067);
+emit_16(2000);
+emit_16(2067);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2068);
+emit_16(2001);
+emit_16(2068);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2069);
+emit_16(2002);
+emit_16(2069);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2070);
+emit_16(2003);
+emit_16(2070);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2071);
+emit_16(2004);
+emit_16(2071);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2072);
+emit_16(2005);
+emit_16(2072);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2073);
+emit_16(2006);
+emit_16(2073);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2074);
+emit_16(2007);
+emit_16(2074);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2075);
+emit_16(2008);
+emit_16(2075);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2076);
+emit_16(2009);
+emit_16(2076);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2077);
+emit_16(2010);
+emit_16(2077);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2078);
+emit_16(2011);
+emit_16(2078);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2079);
+emit_16(2012);
+emit_16(2079);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2080);
+emit_16(2013);
+emit_16(2080);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2081);
+emit_16(2014);
+emit_16(2081);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2082);
+emit_16(2015);
+emit_16(2082);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2083);
+emit_16(2016);
+emit_16(2083);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2084);
+emit_16(2017);
+emit_16(2084);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2085);
+emit_16(2018);
+emit_16(2085);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2086);
+emit_16(2019);
+emit_16(2086);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2087);
+emit_16(2020);
+emit_16(2087);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2088);
+emit_16(2021);
+emit_16(2088);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2089);
+emit_16(2022);
+emit_16(2089);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2090);
+emit_16(2023);
+emit_16(2090);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2091);
+emit_16(2024);
+emit_16(2091);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2092);
+emit_16(2025);
+emit_16(2092);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2093);
+emit_16(2026);
+emit_16(2093);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2094);
+emit_16(2027);
+emit_16(2094);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2095);
+emit_16(2028);
+emit_16(2095);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2096);
+emit_16(2029);
+emit_16(2096);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2097);
+emit_16(2030);
+emit_16(2097);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2098);
+emit_16(2031);
+emit_16(2098);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2099);
+emit_16(2032);
+emit_16(2099);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2100);
+emit_16(2033);
+emit_16(2100);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2101);
+emit_16(2034);
+emit_16(2101);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2102);
+emit_16(2035);
+emit_16(2102);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2103);
+emit_16(2036);
+emit_16(2103);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2104);
+emit_16(2037);
+emit_16(2104);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2105);
+emit_16(2038);
+emit_16(2105);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2106);
+emit_16(2039);
+emit_16(2106);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2107);
+emit_16(2040);
+emit_16(2107);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2108);
+emit_16(2041);
+emit_16(2108);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2109);
+emit_16(2042);
+emit_16(2109);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2110);
+emit_16(2043);
+emit_16(2110);
+emit_16(2044);
+emit_16(2111);
+emit_16(2045);
+emit_16(2111);
+emit_16(2044);
+emit_16(2112);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2113);
+emit_16(2046);
+emit_16(2113);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2114);
+emit_16(2047);
+emit_16(2114);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2115);
+emit_16(2048);
+emit_16(2115);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2116);
+emit_16(2049);
+emit_16(2116);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2117);
+emit_16(2050);
+emit_16(2117);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2118);
+emit_16(2051);
+emit_16(2118);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2119);
+emit_16(2052);
+emit_16(2119);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2120);
+emit_16(2053);
+emit_16(2120);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2121);
+emit_16(2054);
+emit_16(2121);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2122);
+emit_16(2055);
+emit_16(2122);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2123);
+emit_16(2056);
+emit_16(2123);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2124);
+emit_16(2057);
+emit_16(2124);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2125);
+emit_16(2058);
+emit_16(2125);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2126);
+emit_16(2059);
+emit_16(2126);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2127);
+emit_16(2060);
+emit_16(2127);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2128);
+emit_16(2061);
+emit_16(2128);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2129);
+emit_16(2062);
+emit_16(2129);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2130);
+emit_16(2063);
+emit_16(2130);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2131);
+emit_16(2064);
+emit_16(2131);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2132);
+emit_16(2065);
+emit_16(2132);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2133);
+emit_16(2066);
+emit_16(2133);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2134);
+emit_16(2067);
+emit_16(2134);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2135);
+emit_16(2068);
+emit_16(2135);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2136);
+emit_16(2069);
+emit_16(2136);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2137);
+emit_16(2070);
+emit_16(2137);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2138);
+emit_16(2071);
+emit_16(2138);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2139);
+emit_16(2072);
+emit_16(2139);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2140);
+emit_16(2073);
+emit_16(2140);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2141);
+emit_16(2074);
+emit_16(2141);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2142);
+emit_16(2075);
+emit_16(2142);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2143);
+emit_16(2076);
+emit_16(2143);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2144);
+emit_16(2077);
+emit_16(2144);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2145);
+emit_16(2078);
+emit_16(2145);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2146);
+emit_16(2079);
+emit_16(2146);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2147);
+emit_16(2080);
+emit_16(2147);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2148);
+emit_16(2081);
+emit_16(2148);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2149);
+emit_16(2082);
+emit_16(2149);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2150);
+emit_16(2083);
+emit_16(2150);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2151);
+emit_16(2084);
+emit_16(2151);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2152);
+emit_16(2085);
+emit_16(2152);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2153);
+emit_16(2086);
+emit_16(2153);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2154);
+emit_16(2087);
+emit_16(2154);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2155);
+emit_16(2088);
+emit_16(2155);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2156);
+emit_16(2089);
+emit_16(2156);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2157);
+emit_16(2090);
+emit_16(2157);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2158);
+emit_16(2091);
+emit_16(2158);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2159);
+emit_16(2092);
+emit_16(2159);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2160);
+emit_16(2093);
+emit_16(2160);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2161);
+emit_16(2094);
+emit_16(2161);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2162);
+emit_16(2095);
+emit_16(2162);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2163);
+emit_16(2096);
+emit_16(2163);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2164);
+emit_16(2097);
+emit_16(2164);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2165);
+emit_16(2098);
+emit_16(2165);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2166);
+emit_16(2099);
+emit_16(2166);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2167);
+emit_16(2100);
+emit_16(2167);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2168);
+emit_16(2101);
+emit_16(2168);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2169);
+emit_16(2102);
+emit_16(2169);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2170);
+emit_16(2103);
+emit_16(2170);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2171);
+emit_16(2104);
+emit_16(2171);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2172);
+emit_16(2105);
+emit_16(2172);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2173);
+emit_16(2106);
+emit_16(2173);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2174);
+emit_16(2107);
+emit_16(2174);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2175);
+emit_16(2108);
+emit_16(2175);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2176);
+emit_16(2109);
+emit_16(2176);
+emit_16(2110);
+emit_16(2177);
+emit_16(2111);
+emit_16(2177);
+emit_16(2110);
+emit_start(LandscapeIdxCount)
+emit_32(11718);
+emit_32(11310);
+emit_32(11718);
+emit_32(12096);
+emit_32(12870);
+emit_32(13260);
+emit_32(12852);
+emit_32(12480);
+emit_start(_ZTV14BenchmarkDemo4)
+emit_32(0);
+emit_32(_ZTI14BenchmarkDemo4);
+emit_32(_ZN15DemoApplication6myinitEv__index__);
+emit_32(_ZN15DemoApplication16getDynamicsWorldEv__index__);
+emit_32(_ZN15DemoApplication20localCreateRigidBodyEfRK11btTransformP16btCollisionShape__index__);
+emit_32(_ZN14BenchmarkDemo4D1Ev__index__);
+emit_32(_ZN14BenchmarkDemo4D0Ev__index__);
+emit_32(_ZN13BenchmarkDemo20clientMoveAndDisplayEv__index__);
+emit_32(_ZN13BenchmarkDemo15displayCallbackEv__index__);
+emit_start(_ZTI14BenchmarkDemo4)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS14BenchmarkDemo4);
+emit_32(_ZTI13BenchmarkDemo);
+emit_start(_ZTS14BenchmarkDemo4)
+emit_string('14BenchmarkDemo4\x00');
+emit_start(_ZL14benchmarkDemo4)
+emit_32(_ZTV14BenchmarkDemo4+8);
+emit_32(0);
+emit_32(1566444395);
+emit_fill(0,1);
+emit_fill(0,3);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_8(1);
+emit_fill(0,3);
+emit_fill(0,1);
+emit_fill(0,3);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_8(1);
+emit_fill(0,3);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(4);
+emit_32(0);
+emit_32(0);
+emit_start(_ZTI21btBroadphaseInterface)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS21btBroadphaseInterface);
+emit_start(_ZTS21btBroadphaseInterface)
+emit_string('21btBroadphaseInterface\x00');
+emit_start(_ZTI25btOverlappingPairCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS25btOverlappingPairCallback);
+emit_start(_ZTS25btOverlappingPairCallback)
+emit_string('25btOverlappingPairCallback\x00');
+emit_start(_ZTI22btOverlappingPairCache)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS22btOverlappingPairCache);
+emit_32(_ZTI25btOverlappingPairCallback);
+emit_start(_ZTS22btOverlappingPairCache)
+emit_string('22btOverlappingPairCache\x00');
+emit_start(_ZTV15btNullPairCache)
+emit_32(0);
+emit_32(_ZTI15btNullPairCache);
+emit_32(_ZN15btNullPairCacheD1Ev__index__);
+emit_32(_ZN15btNullPairCacheD0Ev__index__);
+emit_32(_ZN15btNullPairCache18addOverlappingPairEP17btBroadphaseProxyS1___index__);
+emit_32(_ZN15btNullPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher__index__);
+emit_32(_ZN15btNullPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN15btNullPairCache26getOverlappingPairArrayPtrEv__index__);
+emit_32(_ZNK15btNullPairCache26getOverlappingPairArrayPtrEv__index__);
+emit_32(_ZN15btNullPairCache23getOverlappingPairArrayEv__index__);
+emit_32(_ZN15btNullPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher__index__);
+emit_32(_ZNK15btNullPairCache22getNumOverlappingPairsEv__index__);
+emit_32(_ZN15btNullPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN15btNullPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback__index__);
+emit_32(_ZN15btNullPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher__index__);
+emit_32(_ZN15btNullPairCache8findPairEP17btBroadphaseProxyS1___index__);
+emit_32(_ZN15btNullPairCache18hasDeferredRemovalEv__index__);
+emit_32(_ZN15btNullPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback__index__);
+emit_32(_ZN15btNullPairCache20sortOverlappingPairsEP12btDispatcher__index__);
+emit_start(_ZTI15btNullPairCache)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS15btNullPairCache);
+emit_32(_ZTI22btOverlappingPairCache);
+emit_start(_ZTS15btNullPairCache)
+emit_string('15btNullPairCache\x00');
+emit_start(_2E_str11)
+emit_string('handle > 0 && handle < m_maxHandles\x00');
+emit_start(_2E_str112)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btAxisSweep3.h\x00');
+emit_start(_2E_str213)
+emit_string('m_firstFreeHandle\x00');
+emit_start(_2E_str314)
+emit_string('!pair.m_algorithm\x00');
+emit_start(_ZTV20btAxisSweep3InternalItE)
+emit_32(0);
+emit_32(_ZTI20btAxisSweep3InternalItE);
+emit_32(_ZN20btAxisSweep3InternalItED1Ev__index__);
+emit_32(_ZN20btAxisSweep3InternalItED0Ev__index__);
+emit_32(_ZN20btAxisSweep3InternalItE11createProxyERK9btVector3S3_iPvssP12btDispatcherS4___index__);
+emit_32(_ZN20btAxisSweep3InternalItE12destroyProxyEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE7setAabbEP17btBroadphaseProxyRK9btVector3S5_P12btDispatcher__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE7getAabbEP17btBroadphaseProxyR9btVector3S4___index__);
+emit_32(_ZN20btAxisSweep3InternalItE7rayTestERK9btVector3S3_R23btBroadphaseRayCallbackS3_S3___index__);
+emit_32(_ZN20btAxisSweep3InternalItE8aabbTestERK9btVector3S3_R24btBroadphaseAabbCallback__index__);
+emit_32(_ZN20btAxisSweep3InternalItE25calculateOverlappingPairsEP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE17getBroadphaseAabbER9btVector3S2___index__);
+emit_32(_ZN20btAxisSweep3InternalItE9resetPoolEP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE10printStatsEv__index__);
+emit_start(_ZTI20btAxisSweep3InternalItE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS20btAxisSweep3InternalItE);
+emit_32(_ZTI21btBroadphaseInterface);
+emit_start(_ZTS20btAxisSweep3InternalItE)
+emit_string('20btAxisSweep3InternalItE\x00');
+emit_start(_ZTV12btAxisSweep3)
+emit_32(0);
+emit_32(_ZTI12btAxisSweep3);
+emit_32(_ZN12btAxisSweep3D1Ev__index__);
+emit_32(_ZN12btAxisSweep3D0Ev__index__);
+emit_32(_ZN20btAxisSweep3InternalItE11createProxyERK9btVector3S3_iPvssP12btDispatcherS4___index__);
+emit_32(_ZN20btAxisSweep3InternalItE12destroyProxyEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE7setAabbEP17btBroadphaseProxyRK9btVector3S5_P12btDispatcher__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE7getAabbEP17btBroadphaseProxyR9btVector3S4___index__);
+emit_32(_ZN20btAxisSweep3InternalItE7rayTestERK9btVector3S3_R23btBroadphaseRayCallbackS3_S3___index__);
+emit_32(_ZN20btAxisSweep3InternalItE8aabbTestERK9btVector3S3_R24btBroadphaseAabbCallback__index__);
+emit_32(_ZN20btAxisSweep3InternalItE25calculateOverlappingPairsEP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK20btAxisSweep3InternalItE17getBroadphaseAabbER9btVector3S2___index__);
+emit_32(_ZN20btAxisSweep3InternalItE9resetPoolEP12btDispatcher__index__);
+emit_32(_ZN20btAxisSweep3InternalItE10printStatsEv__index__);
+emit_start(_ZTI12btAxisSweep3)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS12btAxisSweep3);
+emit_32(_ZTI20btAxisSweep3InternalItE);
+emit_start(_ZTS12btAxisSweep3)
+emit_string('12btAxisSweep3\x00');
+emit_start(_ZTV20btCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI20btCollisionAlgorithm);
+emit_32(_ZN20btCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN20btCollisionAlgorithmD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTI20btCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS20btCollisionAlgorithm);
+emit_start(_ZTS20btCollisionAlgorithm)
+emit_string('20btCollisionAlgorithm\x00');
+emit_start(_ZTIN6btDbvt8ICollideE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN6btDbvt8ICollideE);
+emit_start(_ZTSN6btDbvt8ICollideE)
+emit_string('N6btDbvt8ICollideE\x00');
+emit_start(_2E_str1118)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btDbvt.cpp\x00');
+emit_start(_2E_str22)
+emit_string('n==p->childs[i]\x00');
+emit_start(_ZTV18btDbvtTreeCollider)
+emit_32(0);
+emit_32(_ZTI18btDbvtTreeCollider);
+emit_32(_ZN18btDbvtTreeColliderD1Ev__index__);
+emit_32(_ZN18btDbvtTreeColliderD0Ev__index__);
+emit_32(_ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNodeS2___index__);
+emit_32(_ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef__index__);
+emit_32(_ZN6btDbvt8ICollide7DescentEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode__index__);
+emit_start(_ZTI18btDbvtTreeCollider)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS18btDbvtTreeCollider);
+emit_32(_ZTIN6btDbvt8ICollideE);
+emit_start(_ZTS18btDbvtTreeCollider)
+emit_string('18btDbvtTreeCollider\x00');
+emit_start(_ZTV19BroadphaseRayTester)
+emit_32(0);
+emit_32(_ZTI19BroadphaseRayTester);
+emit_32(_ZN19BroadphaseRayTesterD1Ev__index__);
+emit_32(_ZN19BroadphaseRayTesterD0Ev__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3___index__);
+emit_32(_ZN19BroadphaseRayTester7ProcessEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef__index__);
+emit_32(_ZN6btDbvt8ICollide7DescentEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode__index__);
+emit_start(_ZTI19BroadphaseRayTester)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS19BroadphaseRayTester);
+emit_32(_ZTIN6btDbvt8ICollideE);
+emit_start(_ZTS19BroadphaseRayTester)
+emit_string('19BroadphaseRayTester\x00');
+emit_start(_ZTV20BroadphaseAabbTester)
+emit_32(0);
+emit_32(_ZTI20BroadphaseAabbTester);
+emit_32(_ZN20BroadphaseAabbTesterD1Ev__index__);
+emit_32(_ZN20BroadphaseAabbTesterD0Ev__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3___index__);
+emit_32(_ZN20BroadphaseAabbTester7ProcessEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef__index__);
+emit_32(_ZN6btDbvt8ICollide7DescentEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode__index__);
+emit_start(_ZTI20BroadphaseAabbTester)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS20BroadphaseAabbTester);
+emit_32(_ZTIN6btDbvt8ICollideE);
+emit_start(_ZTS20BroadphaseAabbTester)
+emit_string('20BroadphaseAabbTester\x00');
+emit_start(_2E_str18)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp\x00');
+emit_start(_ZTV16btDbvtBroadphase)
+emit_32(0);
+emit_32(_ZTI16btDbvtBroadphase);
+emit_32(_ZN16btDbvtBroadphaseD1Ev__index__);
+emit_32(_ZN16btDbvtBroadphaseD0Ev__index__);
+emit_32(_ZN16btDbvtBroadphase11createProxyERK9btVector3S2_iPvssP12btDispatcherS3___index__);
+emit_32(_ZN16btDbvtBroadphase12destroyProxyEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN16btDbvtBroadphase7setAabbEP17btBroadphaseProxyRK9btVector3S4_P12btDispatcher__index__);
+emit_32(_ZNK16btDbvtBroadphase7getAabbEP17btBroadphaseProxyR9btVector3S3___index__);
+emit_32(_ZN16btDbvtBroadphase7rayTestERK9btVector3S2_R23btBroadphaseRayCallbackS2_S2___index__);
+emit_32(_ZN16btDbvtBroadphase8aabbTestERK9btVector3S2_R24btBroadphaseAabbCallback__index__);
+emit_32(_ZN16btDbvtBroadphase25calculateOverlappingPairsEP12btDispatcher__index__);
+emit_32(_ZN16btDbvtBroadphase23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK16btDbvtBroadphase23getOverlappingPairCacheEv__index__);
+emit_32(_ZNK16btDbvtBroadphase17getBroadphaseAabbER9btVector3S1___index__);
+emit_32(_ZN16btDbvtBroadphase9resetPoolEP12btDispatcher__index__);
+emit_32(_ZN16btDbvtBroadphase10printStatsEv__index__);
+emit_start(_ZTI16btDbvtBroadphase)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS16btDbvtBroadphase);
+emit_32(_ZTI21btBroadphaseInterface);
+emit_start(_ZTS16btDbvtBroadphase)
+emit_string('16btDbvtBroadphase\x00');
+emit_start(_ZTV12btDispatcher)
+emit_32(0);
+emit_32(_ZTI12btDispatcher);
+emit_32(_ZN12btDispatcherD1Ev__index__);
+emit_32(_ZN12btDispatcherD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTI12btDispatcher)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS12btDispatcher);
+emit_start(_ZTS12btDispatcher)
+emit_string('12btDispatcher\x00');
+emit_start(_ZTI21btNodeOverlapCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS21btNodeOverlapCallback);
+emit_start(_ZTS21btNodeOverlapCallback)
+emit_string('21btNodeOverlapCallback\x00');
+emit_start(_2E_str10)
+emit_string('0\x00');
+emit_start(_2E_str212)
+emit_string('m_useQuantization\x00');
+emit_start(_2E_str313)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h\x00');
+emit_start(_2E_str414)
+emit_string('point.getX() <= m_bvhAabbMax.getX()\x00');
+emit_start(_2E_str515)
+emit_string('point.getY() <= m_bvhAabbMax.getY()\x00');
+emit_start(_2E_str616)
+emit_string('point.getZ() <= m_bvhAabbMax.getZ()\x00');
+emit_start(_2E_str717)
+emit_string('point.getX() >= m_bvhAabbMin.getX()\x00');
+emit_start(_2E_str820)
+emit_string('point.getY() >= m_bvhAabbMin.getY()\x00');
+emit_start(_2E_str9)
+emit_string('point.getZ() >= m_bvhAabbMin.getZ()\x00');
+emit_start(_ZTI17btOverlapCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS17btOverlapCallback);
+emit_start(_ZTS17btOverlapCallback)
+emit_string('17btOverlapCallback\x00');
+emit_start(_ZTVZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback)
+emit_32(0);
+emit_32(_ZTIZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback);
+emit_32(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD1Ev__index__);
+emit_32(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD0Ev__index__);
+emit_32(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallback14processOverlapER16btBroadphasePair__index__);
+emit_start(_ZTIZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback);
+emit_32(_ZTI17btOverlapCallback);
+emit_start(_ZTSZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback)
+emit_string('ZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherE17CleanPairCallback\x00');
+emit_start(_ZTVZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback)
+emit_32(0);
+emit_32(_ZTIZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback);
+emit_32(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD1Ev__index__);
+emit_32(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD0Ev__index__);
+emit_32(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallback14processOverlapER16btBroadphasePair__index__);
+emit_start(_ZTIZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback);
+emit_32(_ZTI17btOverlapCallback);
+emit_start(_ZTSZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback)
+emit_string('ZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherE18RemovePairCallback\x00');
+emit_start(_ZTV28btHashedOverlappingPairCache)
+emit_32(0);
+emit_32(_ZTI28btHashedOverlappingPairCache);
+emit_32(_ZN28btHashedOverlappingPairCacheD1Ev__index__);
+emit_32(_ZN28btHashedOverlappingPairCacheD0Ev__index__);
+emit_32(_ZN28btHashedOverlappingPairCache18addOverlappingPairEP17btBroadphaseProxyS1___index__);
+emit_32(_ZN28btHashedOverlappingPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher__index__);
+emit_32(_ZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv__index__);
+emit_32(_ZNK28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv__index__);
+emit_32(_ZN28btHashedOverlappingPairCache23getOverlappingPairArrayEv__index__);
+emit_32(_ZN28btHashedOverlappingPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher__index__);
+emit_32(_ZNK28btHashedOverlappingPairCache22getNumOverlappingPairsEv__index__);
+emit_32(_ZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher__index__);
+emit_32(_ZN28btHashedOverlappingPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback__index__);
+emit_32(_ZN28btHashedOverlappingPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher__index__);
+emit_32(_ZN28btHashedOverlappingPairCache8findPairEP17btBroadphaseProxyS1___index__);
+emit_32(_ZN28btHashedOverlappingPairCache18hasDeferredRemovalEv__index__);
+emit_32(_ZN28btHashedOverlappingPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback__index__);
+emit_32(_ZN28btHashedOverlappingPairCache20sortOverlappingPairsEP12btDispatcher__index__);
+emit_start(_ZTI28btHashedOverlappingPairCache)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS28btHashedOverlappingPairCache);
+emit_32(_ZTI22btOverlappingPairCache);
+emit_start(_ZTS28btHashedOverlappingPairCache)
+emit_string('28btHashedOverlappingPairCache\x00');
+emit_start(_2E_str121)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp\x00');
+emit_start(_2E_str222)
+emit_string('index < m_overlappingPairArray.size()\x00');
+emit_start(_2E_str323)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h\x00');
+emit_start(_2E_str424)
+emit_string('pair->m_pProxy0->getUid() == proxyId1\x00');
+emit_start(_2E_str525)
+emit_string('pair->m_pProxy1->getUid() == proxyId2\x00');
+emit_start(_2E_str626)
+emit_string('pairIndex < m_overlappingPairArray.size()\x00');
+emit_start(_2E_str727)
+emit_string('index != BT_NULL_PAIR\x00');
+emit_start(_2E_str32)
+emit_string('btOptimizedBvhNodeData\x00');
+emit_start(_2E_str133)
+emit_string('btQuantizedBvhNodeData\x00');
+emit_start(_2E_str234)
+emit_string('btBvhSubtreeInfoData\x00');
+emit_start(_2E_str335)
+emit_string('btQuantizedBvhFloatData\x00');
+emit_start(_ZTV14btQuantizedBvh)
+emit_32(0);
+emit_32(_ZTI14btQuantizedBvh);
+emit_32(_ZN14btQuantizedBvhD1Ev__index__);
+emit_32(_ZN14btQuantizedBvhD0Ev__index__);
+emit_32(_ZNK14btQuantizedBvh9serializeEPvjb__index__);
+emit_32(_ZNK14btQuantizedBvh31calculateSerializeBufferSizeNewEv__index__);
+emit_32(_ZNK14btQuantizedBvh9serializeEPvP12btSerializer__index__);
+emit_32(_ZN14btQuantizedBvh16deSerializeFloatER23btQuantizedBvhFloatData__index__);
+emit_32(_ZN14btQuantizedBvh17deSerializeDoubleER24btQuantizedBvhDoubleData__index__);
+emit_start(_ZTI14btQuantizedBvh)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS14btQuantizedBvh);
+emit_start(_ZTS14btQuantizedBvh)
+emit_string('14btQuantizedBvh\x00');
+emit_start(_2E_str537)
+emit_string('../../../../src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp\x00');
+emit_start(_2E_str638)
+emit_string('m_subtreeHeaderCount == m_SubtreeHeaders.size()\x00');
+emit_start(_2E_str739)
+emit_string('isLeafNode()\x00');
+emit_start(_2E_str941)
+emit_string('!isLeafNode()\x00');
+emit_start(_2E_str1143)
+emit_string('walkIterations < subTreeSize\x00');
+emit_start(_2E_str1844)
+emit_string('!m_useQuantization\x00');
+emit_start(_2E_str1921)
+emit_string('walkIterations < m_curNodeIndex\x00');
+emit_start(_2E_str21)
+emit_string('!unbal\x00');
+emit_start(_2E_str2246)
+emit_string('numIndices>0\x00');
+emit_start(_ZTV30btActivatingCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_32(_ZN30btActivatingCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN30btActivatingCollisionAlgorithmD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTI30btActivatingCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS30btActivatingCollisionAlgorithm);
+emit_32(_ZTI20btCollisionAlgorithm);
+emit_start(_ZTS30btActivatingCollisionAlgorithm)
+emit_string('30btActivatingCollisionAlgorithm\x00');
+emit_start(_2E_str59)
+emit_string('m_manifoldPtr\x00');
+emit_start(_2E_str160)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btManifoldResult.h\x00');
+emit_start(_ZTV26btBoxBoxCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI26btBoxBoxCollisionAlgorithm);
+emit_32(_ZN26btBoxBoxCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI26btBoxBoxCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS26btBoxBoxCollisionAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS26btBoxBoxCollisionAlgorithm)
+emit_string('26btBoxBoxCollisionAlgorithm\x00');
+emit_start(_ZTI36btDiscreteCollisionDetectorInterface)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS36btDiscreteCollisionDetectorInterface);
+emit_start(_ZTS36btDiscreteCollisionDetectorInterface)
+emit_string('36btDiscreteCollisionDetectorInterface\x00');
+emit_start(_ZTV16btBoxBoxDetector)
+emit_32(0);
+emit_32(_ZTI16btBoxBoxDetector);
+emit_32(_ZN16btBoxBoxDetectorD1Ev__index__);
+emit_32(_ZN16btBoxBoxDetectorD0Ev__index__);
+emit_32(_ZN16btBoxBoxDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__);
+emit_start(_ZTI16btBoxBoxDetector)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS16btBoxBoxDetector);
+emit_32(_ZTI36btDiscreteCollisionDetectorInterface);
+emit_start(_ZTS16btBoxBoxDetector)
+emit_string('16btBoxBoxDetector\x00');
+emit_start(_2E_str65)
+emit_string('*iret != i0\x00');
+emit_start(_2E_str166)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp\x00');
+emit_start(_ZTIN36btDiscreteCollisionDetectorInterface6ResultE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN36btDiscreteCollisionDetectorInterface6ResultE);
+emit_start(_ZTSN36btDiscreteCollisionDetectorInterface6ResultE)
+emit_string('N36btDiscreteCollisionDetectorInterface6ResultE\x00');
+emit_start(_ZTV23btCollisionPairCallback)
+emit_32(0);
+emit_32(_ZTI23btCollisionPairCallback);
+emit_32(_ZN23btCollisionPairCallbackD1Ev__index__);
+emit_32(_ZN23btCollisionPairCallbackD0Ev__index__);
+emit_32(_ZN23btCollisionPairCallback14processOverlapER16btBroadphasePair__index__);
+emit_start(_ZTI23btCollisionPairCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS23btCollisionPairCallback);
+emit_32(_ZTI17btOverlapCallback);
+emit_start(_ZTS23btCollisionPairCallback)
+emit_string('23btCollisionPairCallback\x00');
+emit_start(_2E_str169)
+emit_string('../../../../src/LinearMath/btPoolAllocator.h\x00');
+emit_start(_2E_str270)
+emit_string('!size || size<=m_elemSize\x00');
+emit_start(_2E_str371)
+emit_string('m_freeCount>0\x00');
+emit_start(_2E_str472)
+emit_string('findIndex < m_manifoldsPtr.size()\x00');
+emit_start(_2E_str573)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp\x00');
+emit_start(_ZTV21btCollisionDispatcher)
+emit_32(0);
+emit_32(_ZTI21btCollisionDispatcher);
+emit_32(_ZN21btCollisionDispatcherD1Ev__index__);
+emit_32(_ZN21btCollisionDispatcherD0Ev__index__);
+emit_32(_ZN21btCollisionDispatcher13findAlgorithmEP17btCollisionObjectS1_P20btPersistentManifold__index__);
+emit_32(_ZN21btCollisionDispatcher14getNewManifoldEPvS0___index__);
+emit_32(_ZN21btCollisionDispatcher15releaseManifoldEP20btPersistentManifold__index__);
+emit_32(_ZN21btCollisionDispatcher13clearManifoldEP20btPersistentManifold__index__);
+emit_32(_ZN21btCollisionDispatcher14needsCollisionEP17btCollisionObjectS1___index__);
+emit_32(_ZN21btCollisionDispatcher13needsResponseEP17btCollisionObjectS1___index__);
+emit_32(_ZN21btCollisionDispatcher25dispatchAllCollisionPairsEP22btOverlappingPairCacheRK16btDispatcherInfoP12btDispatcher__index__);
+emit_32(_ZNK21btCollisionDispatcher15getNumManifoldsEv__index__);
+emit_32(_ZN21btCollisionDispatcher26getManifoldByIndexInternalEi__index__);
+emit_32(_ZN21btCollisionDispatcher26getInternalManifoldPointerEv__index__);
+emit_32(_ZN21btCollisionDispatcher26allocateCollisionAlgorithmEi__index__);
+emit_32(_ZN21btCollisionDispatcher22freeCollisionAlgorithmEPv__index__);
+emit_start(_ZTI21btCollisionDispatcher)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS21btCollisionDispatcher);
+emit_32(_ZTI12btDispatcher);
+emit_start(_ZTS21btCollisionDispatcher)
+emit_string('21btCollisionDispatcher\x00');
+emit_start(_2E_str674)
+emit_string('m_doubleDispatch[i][j]\x00');
+emit_start(_2E_str775)
+emit_string('body0\x00');
+emit_start(_2E_str876)
+emit_string('body1\x00');
+emit_start(_2E_str977)
+emit_string('warning btCollisionDispatcher::needsCollision: static-static collision!\x0a\x00');
+emit_start(_ZTV17btCollisionObject)
+emit_32(0);
+emit_32(_ZTI17btCollisionObject);
+emit_32(_ZN17btCollisionObject24checkCollideWithOverrideEPS___index__);
+emit_32(_ZN17btCollisionObjectD1Ev__index__);
+emit_32(_ZN17btCollisionObjectD0Ev__index__);
+emit_32(_ZN17btCollisionObject17setCollisionShapeEP16btCollisionShape__index__);
+emit_32(_ZNK17btCollisionObject28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK17btCollisionObject9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK17btCollisionObject21serializeSingleObjectEP12btSerializer__index__);
+emit_start(_ZTI17btCollisionObject)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS17btCollisionObject);
+emit_start(_ZTS17btCollisionObject)
+emit_string('17btCollisionObject\x00');
+emit_start(_2E_str78)
+emit_string('btCollisionObjectFloatData\x00');
+emit_start(_ZTIN16btCollisionWorld20ConvexResultCallbackE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN16btCollisionWorld20ConvexResultCallbackE);
+emit_start(_ZTSN16btCollisionWorld20ConvexResultCallbackE)
+emit_string('N16btCollisionWorld20ConvexResultCallbackE\x00');
+emit_start(_ZTI30btConvexPenetrationDepthSolver)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS30btConvexPenetrationDepthSolver);
+emit_start(_ZTS30btConvexPenetrationDepthSolver)
+emit_string('30btConvexPenetrationDepthSolver\x00');
+emit_start(_ZTVN12btConvexCast10CastResultE)
+emit_32(0);
+emit_32(_ZTIN12btConvexCast10CastResultE);
+emit_32(_ZN12btConvexCast10CastResult9DebugDrawEf__index__);
+emit_32(_ZN12btConvexCast10CastResult15drawCoordSystemERK11btTransform__index__);
+emit_32(_ZN12btConvexCast10CastResultD1Ev__index__);
+emit_32(_ZN12btConvexCast10CastResultD0Ev__index__);
+emit_start(_ZTIN12btConvexCast10CastResultE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN12btConvexCast10CastResultE);
+emit_start(_ZTSN12btConvexCast10CastResultE)
+emit_string('N12btConvexCast10CastResultE\x00');
+emit_start(_ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D1Ev__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D0Ev__index__);
+emit_32(_ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder215addSingleResultERNS_14LocalRayResultEb__index__);
+emit_start(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2);
+emit_32(_ZTIN16btCollisionWorld17RayResultCallbackE);
+emit_start(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2)
+emit_string('ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE15LocalInfoAdder2\x00');
+emit_start(_ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD1Ev__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD0Ev__index__);
+emit_32(_ZNK16btCollisionWorld20ConvexResultCallback14needsCollisionEP17btBroadphaseProxy__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdder15addSingleResultERNS_17LocalConvexResultEb__index__);
+emit_start(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder);
+emit_32(_ZTIN16btCollisionWorld20ConvexResultCallbackE);
+emit_start(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder)
+emit_string('ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE14LocalInfoAdder\x00');
+emit_start(_ZTI24btBroadphaseAabbCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS24btBroadphaseAabbCallback);
+emit_start(_ZTS24btBroadphaseAabbCallback)
+emit_string('24btBroadphaseAabbCallback\x00');
+emit_start(_ZTI23btBroadphaseRayCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS23btBroadphaseRayCallback);
+emit_32(_ZTI24btBroadphaseAabbCallback);
+emit_start(_ZTS23btBroadphaseRayCallback)
+emit_string('23btBroadphaseRayCallback\x00');
+emit_start(_ZTV17DebugDrawcallback)
+emit_32(0);
+emit_32(_ZTI17DebugDrawcallback);
+emit_32(_ZN17DebugDrawcallbackD1Ev__index__);
+emit_32(_ZN17DebugDrawcallbackD0Ev__index__);
+emit_32(_ZN17DebugDrawcallback15processTriangleEP9btVector3ii__index__);
+emit_32(_ZN17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii__index__);
+emit_32(4294967292);
+emit_32(_ZTI17DebugDrawcallback);
+emit_32(_ZThn4_N17DebugDrawcallbackD1Ev__index__);
+emit_32(_ZThn4_N17DebugDrawcallbackD0Ev__index__);
+emit_32(_ZThn4_N17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii__index__);
+emit_start(_ZTI17DebugDrawcallback)
+emit_32(_ZTVN10__cxxabiv121__vmi_class_type_infoE+8);
+emit_32(_ZTS17DebugDrawcallback);
+emit_32(0);
+emit_32(2);
+emit_32(_ZTI18btTriangleCallback);
+emit_32(2);
+emit_32(_ZTI31btInternalTriangleIndexCallback);
+emit_32(1026);
+emit_start(_ZTS17DebugDrawcallback)
+emit_string('17DebugDrawcallback\x00');
+emit_start(_ZTI18btTriangleCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS18btTriangleCallback);
+emit_start(_ZTS18btTriangleCallback)
+emit_string('18btTriangleCallback\x00');
+emit_start(_ZTI31btInternalTriangleIndexCallback)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS31btInternalTriangleIndexCallback);
+emit_start(_ZTS31btInternalTriangleIndexCallback)
+emit_string('31btInternalTriangleIndexCallback\x00');
+emit_start(_ZTV16btCollisionWorld)
+emit_32(0);
+emit_32(_ZTI16btCollisionWorld);
+emit_32(_ZN16btCollisionWorldD1Ev__index__);
+emit_32(_ZN16btCollisionWorldD0Ev__index__);
+emit_32(_ZN16btCollisionWorld11updateAabbsEv__index__);
+emit_32(_ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw__index__);
+emit_32(_ZN16btCollisionWorld14getDebugDrawerEv__index__);
+emit_32(_ZN16btCollisionWorld14debugDrawWorldEv__index__);
+emit_32(_ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3__index__);
+emit_32(_ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE__index__);
+emit_32(_ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss__index__);
+emit_32(_ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject__index__);
+emit_32(_ZN16btCollisionWorld33performDiscreteCollisionDetectionEv__index__);
+emit_32(_ZN16btCollisionWorld9serializeEP12btSerializer__index__);
+emit_start(_ZTI16btCollisionWorld)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS16btCollisionWorld);
+emit_start(_ZTS16btCollisionWorld)
+emit_string('16btCollisionWorld\x00');
+emit_start(_ZTI16btManifoldResult)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS16btManifoldResult);
+emit_32(_ZTIN36btDiscreteCollisionDetectorInterface6ResultE);
+emit_start(_ZTS16btManifoldResult)
+emit_string('16btManifoldResult\x00');
+emit_start(_ZTV21btSingleSweepCallback)
+emit_32(0);
+emit_32(_ZTI21btSingleSweepCallback);
+emit_32(_ZN21btSingleSweepCallbackD1Ev__index__);
+emit_32(_ZN21btSingleSweepCallbackD0Ev__index__);
+emit_32(_ZN21btSingleSweepCallback7processEPK17btBroadphaseProxy__index__);
+emit_start(_ZTI21btSingleSweepCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS21btSingleSweepCallback);
+emit_32(_ZTI23btBroadphaseRayCallback);
+emit_start(_ZTS21btSingleSweepCallback)
+emit_string('21btSingleSweepCallback\x00');
+emit_start(_ZTV19btSingleRayCallback)
+emit_32(0);
+emit_32(_ZTI19btSingleRayCallback);
+emit_32(_ZN19btSingleRayCallbackD1Ev__index__);
+emit_32(_ZN19btSingleRayCallbackD0Ev__index__);
+emit_32(_ZN19btSingleRayCallback7processEPK17btBroadphaseProxy__index__);
+emit_start(_ZTI19btSingleRayCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS19btSingleRayCallback);
+emit_32(_ZTI23btBroadphaseRayCallback);
+emit_start(_ZTS19btSingleRayCallback)
+emit_string('19btSingleRayCallback\x00');
+emit_start(_2E_str382)
+emit_string('index < m_cachedPoints\x00');
+emit_start(_2E_str483)
+emit_string('../../../../src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h\x00');
+emit_start(_2E_str584)
+emit_string('s != btScalar(0.0)\x00');
+emit_start(_2E_str685)
+emit_string('../../../../src/LinearMath/btQuaternion.h\x00');
+emit_start(_2E_str786)
+emit_string('collisionObject\x00');
+emit_start(_2E_str887)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp\x00');
+emit_start(_2E_str988)
+emit_string('m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size()\x00');
+emit_start(_ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1E_0v__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0E_0v__index__);
+emit_32(_ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitE_0RK9btVector3SG_fii__index__);
+emit_start(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0);
+emit_32(_ZTI28btTriangleConvexcastCallback);
+emit_start(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0)
+emit_string('ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback_0\x00');
+emit_start(_ZTI28btTriangleConvexcastCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS28btTriangleConvexcastCallback);
+emit_32(_ZTI18btTriangleCallback);
+emit_start(_ZTS28btTriangleConvexcastCallback)
+emit_string('28btTriangleConvexcastCallback\x00');
+emit_start(_ZTVZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1Ev__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0Ev__index__);
+emit_32(_ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii__index__);
+emit_32(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitERK9btVector3SG_fii__index__);
+emit_start(_ZTIZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback);
+emit_32(_ZTI28btTriangleConvexcastCallback);
+emit_start(_ZTSZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback)
+emit_string('ZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfE32BridgeTriangleConvexcastCallback\x00');
+emit_start(_ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1E_0v__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0E_0v__index__);
+emit_32(_ZN25btTriangleRaycastCallback15processTriangleEP9btVector3ii__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitE_0RK9btVector3fii__index__);
+emit_start(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0);
+emit_32(_ZTI25btTriangleRaycastCallback);
+emit_start(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0)
+emit_string('ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback_0\x00');
+emit_start(_ZTI25btTriangleRaycastCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS25btTriangleRaycastCallback);
+emit_32(_ZTI18btTriangleCallback);
+emit_start(_ZTS25btTriangleRaycastCallback)
+emit_string('25btTriangleRaycastCallback\x00');
+emit_start(_ZTVZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback)
+emit_32(0);
+emit_32(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1Ev__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0Ev__index__);
+emit_32(_ZN25btTriangleRaycastCallback15processTriangleEP9btVector3ii__index__);
+emit_32(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitERK9btVector3fii__index__);
+emit_start(_ZTIZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback);
+emit_32(_ZTI25btTriangleRaycastCallback);
+emit_start(_ZTSZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback)
+emit_string('ZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEE29BridgeTriangleRaycastCallback\x00');
+emit_start(_2E_str1089)
+emit_string('convexSweepTest\x00');
+emit_start(_2E_str1190)
+emit_string('performDiscreteCollisionDetection\x00');
+emit_start(_2E_str1291)
+emit_string('calculateOverlappingPairs\x00');
+emit_start(_2E_str1392)
+emit_string('dispatchAllCollisionPairs\x00');
+emit_start(_2E_str1493)
+emit_string('convexSweepCompound\x00');
+emit_start(_2E_str1594)
+emit_string('Overflow in AABB, object removed from simulation\x00');
+emit_start(_2E_str1695)
+emit_string('If you can reproduce this, please email bugs@continuousphysics.com\x0a\x00');
+emit_start(_2E_str1796)
+emit_string('Please include above information, your Platform, version of OS.\x0a\x00');
+emit_start(_2E_str1897)
+emit_string('Thanks.\x0a\x00');
+emit_start(_2E_str1998)
+emit_string('updateAabbs\x00');
+emit_start(_ZTV22btCompoundLeafCallback)
+emit_32(0);
+emit_32(_ZTI22btCompoundLeafCallback);
+emit_32(_ZN22btCompoundLeafCallbackD1Ev__index__);
+emit_32(_ZN22btCompoundLeafCallbackD0Ev__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3___index__);
+emit_32(_ZN22btCompoundLeafCallback7ProcessEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef__index__);
+emit_32(_ZN6btDbvt8ICollide7DescentEPK10btDbvtNode__index__);
+emit_32(_ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode__index__);
+emit_start(_ZTI22btCompoundLeafCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS22btCompoundLeafCallback);
+emit_32(_ZTIN6btDbvt8ICollideE);
+emit_start(_ZTS22btCompoundLeafCallback)
+emit_string('22btCompoundLeafCallback\x00');
+emit_start(_2E_str99)
+emit_string('colObj->getCollisionShape()->isCompound()\x00');
+emit_start(_2E_str1100)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp\x00');
+emit_start(_2E_str2101)
+emit_string('localAabbMin.getX() <= localAabbMax.getX()\x00');
+emit_start(_2E_str3102)
+emit_string('../../../../src/LinearMath/btAabbUtil2.h\x00');
+emit_start(_2E_str4103)
+emit_string('localAabbMin.getY() <= localAabbMax.getY()\x00');
+emit_start(_2E_str5104)
+emit_string('localAabbMin.getZ() <= localAabbMax.getZ()\x00');
+emit_start(_2E_str6105)
+emit_string('index>=0\x00');
+emit_start(_2E_str7106)
+emit_string('index<compoundShape->getNumChildShapes()\x00');
+emit_start(_ZTV28btCompoundCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI28btCompoundCollisionAlgorithm);
+emit_32(_ZN28btCompoundCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI28btCompoundCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS28btCompoundCollisionAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS28btCompoundCollisionAlgorithm)
+emit_string('28btCompoundCollisionAlgorithm\x00');
+emit_start(_2E_str109)
+emit_string('Triangle\x00');
+emit_start(_ZTV24btConvexTriangleCallback)
+emit_32(0);
+emit_32(_ZTI24btConvexTriangleCallback);
+emit_32(_ZN24btConvexTriangleCallbackD1Ev__index__);
+emit_32(_ZN24btConvexTriangleCallbackD0Ev__index__);
+emit_32(_ZN24btConvexTriangleCallback15processTriangleEP9btVector3ii__index__);
+emit_start(_ZTI24btConvexTriangleCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS24btConvexTriangleCallback);
+emit_32(_ZTI18btTriangleCallback);
+emit_start(_ZTS24btConvexTriangleCallback)
+emit_string('24btConvexTriangleCallback\x00');
+emit_start(_ZTVZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback)
+emit_32(0);
+emit_32(_ZTIZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback);
+emit_32(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD1Ev__index__);
+emit_32(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD0Ev__index__);
+emit_32(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallback15processTriangleEP9btVector3ii__index__);
+emit_start(_ZTIZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback);
+emit_32(_ZTI18btTriangleCallback);
+emit_start(_ZTSZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback)
+emit_string('ZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultE31LocalTriangleSphereCastCallback\x00');
+emit_start(_ZTV15btTriangleShape)
+emit_32(0);
+emit_32(_ZTI15btTriangleShape);
+emit_32(_ZN15btTriangleShapeD1Ev__index__);
+emit_32(_ZN15btTriangleShapeD0Ev__index__);
+emit_32(_ZNK15btTriangleShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN21btConvexInternalShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK21btConvexInternalShape15getLocalScalingEv__index__);
+emit_32(_ZNK15btTriangleShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK15btTriangleShape7getNameEv__index__);
+emit_32(_ZN21btConvexInternalShape9setMarginEf__index__);
+emit_32(_ZNK21btConvexInternalShape9getMarginEv__index__);
+emit_32(_ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK21btConvexInternalShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK21btConvexInternalShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK15btTriangleShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK15btTriangleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__);
+emit_32(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK15btTriangleShape36getNumPreferredPenetrationDirectionsEv__index__);
+emit_32(_ZNK15btTriangleShape32getPreferredPenetrationDirectionEiR9btVector3__index__);
+emit_32(_ZNK15btTriangleShape14getNumVerticesEv__index__);
+emit_32(_ZNK15btTriangleShape11getNumEdgesEv__index__);
+emit_32(_ZNK15btTriangleShape7getEdgeEiR9btVector3S1___index__);
+emit_32(_ZNK15btTriangleShape9getVertexEiR9btVector3__index__);
+emit_32(_ZNK15btTriangleShape12getNumPlanesEv__index__);
+emit_32(_ZNK15btTriangleShape8getPlaneER9btVector3S1_i__index__);
+emit_32(_ZNK15btTriangleShape8isInsideERK9btVector3f__index__);
+emit_32(_ZNK15btTriangleShape16getPlaneEquationEiR9btVector3S1___index__);
+emit_start(_ZTI15btTriangleShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS15btTriangleShape);
+emit_32(_ZTI23btPolyhedralConvexShape);
+emit_start(_ZTS15btTriangleShape)
+emit_string('15btTriangleShape\x00');
+emit_start(_ZTI23btPolyhedralConvexShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS23btPolyhedralConvexShape);
+emit_32(_ZTI21btConvexInternalShape);
+emit_start(_ZTS23btPolyhedralConvexShape)
+emit_string('23btPolyhedralConvexShape\x00');
+emit_start(_ZTI21btConvexInternalShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS21btConvexInternalShape);
+emit_32(_ZTI13btConvexShape);
+emit_start(_ZTS21btConvexInternalShape)
+emit_string('21btConvexInternalShape\x00');
+emit_start(_ZTI13btConvexShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS13btConvexShape);
+emit_32(_ZTI16btCollisionShape);
+emit_start(_ZTS13btConvexShape)
+emit_string('13btConvexShape\x00');
+emit_start(_ZTI16btCollisionShape)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS16btCollisionShape);
+emit_start(_ZTS16btCollisionShape)
+emit_string('16btCollisionShape\x00');
+emit_start(_2E_str1110)
+emit_string('btConvexInternalShapeData\x00');
+emit_start(_2E_str3112)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btTriangleShape.h\x00');
+emit_start(_ZTV33btConvexConcaveCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI33btConvexConcaveCollisionAlgorithm);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI33btConvexConcaveCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS33btConvexConcaveCollisionAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS33btConvexConcaveCollisionAlgorithm)
+emit_string('33btConvexConcaveCollisionAlgorithm\x00');
+emit_start(_ZTI30btCollisionAlgorithmCreateFunc)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTS30btCollisionAlgorithmCreateFunc)
+emit_string('30btCollisionAlgorithmCreateFunc\x00');
+emit_start(_ZTVN23btConvexConvexAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN23btConvexConvexAlgorithm10CreateFuncE);
+emit_32(_ZN23btConvexConvexAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN23btConvexConvexAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN23btConvexConvexAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN23btConvexConvexAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN23btConvexConvexAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN23btConvexConvexAlgorithm10CreateFuncE)
+emit_string('N23btConvexConvexAlgorithm10CreateFuncE\x00');
+emit_start(_ZTV24btPerturbedContactResult)
+emit_32(0);
+emit_32(_ZTI24btPerturbedContactResult);
+emit_32(_ZN24btPerturbedContactResultD1Ev__index__);
+emit_32(_ZN24btPerturbedContactResultD0Ev__index__);
+emit_32(_ZN16btManifoldResult20setShapeIdentifiersAEii__index__);
+emit_32(_ZN16btManifoldResult20setShapeIdentifiersBEii__index__);
+emit_32(_ZN24btPerturbedContactResult15addContactPointERK9btVector3S2_f__index__);
+emit_start(_ZTI24btPerturbedContactResult)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS24btPerturbedContactResult);
+emit_32(_ZTI16btManifoldResult);
+emit_start(_ZTS24btPerturbedContactResult)
+emit_string('24btPerturbedContactResult\x00');
+emit_start(_2E_str115)
+emit_string('d != btScalar(0.0)\x00');
+emit_start(_2E_str4119)
+emit_string('normalOnB.length2()>=(SIMD_EPSILON*SIMD_EPSILON)\x00');
+emit_start(_2E_str5120)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp\x00');
+emit_start(_ZTV23btConvexConvexAlgorithm)
+emit_32(0);
+emit_32(_ZTI23btConvexConvexAlgorithm);
+emit_32(_ZN23btConvexConvexAlgorithmD1Ev__index__);
+emit_32(_ZN23btConvexConvexAlgorithmD0Ev__index__);
+emit_32(_ZN23btConvexConvexAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN23btConvexConvexAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN23btConvexConvexAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI23btConvexConvexAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS23btConvexConvexAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS23btConvexConvexAlgorithm)
+emit_string('23btConvexConvexAlgorithm\x00');
+emit_start(_ZTV31btConvexPlaneCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI31btConvexPlaneCollisionAlgorithm);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI31btConvexPlaneCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS31btConvexPlaneCollisionAlgorithm);
+emit_32(_ZTI20btCollisionAlgorithm);
+emit_start(_ZTS31btConvexPlaneCollisionAlgorithm)
+emit_string('31btConvexPlaneCollisionAlgorithm\x00');
+emit_start(_ZTVN31btConvexPlaneCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN31btConvexPlaneCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN31btConvexPlaneCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN31btConvexPlaneCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN31btConvexPlaneCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN31btConvexPlaneCollisionAlgorithm10CreateFuncE)
+emit_string('N31btConvexPlaneCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_ZTI24btCollisionConfiguration)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS24btCollisionConfiguration);
+emit_start(_ZTS24btCollisionConfiguration)
+emit_string('24btCollisionConfiguration\x00');
+emit_start(_ZTVN33btConvexConcaveCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN33btConvexConcaveCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN33btConvexConcaveCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN33btConvexConcaveCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN33btConvexConcaveCollisionAlgorithm10CreateFuncE)
+emit_string('N33btConvexConcaveCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_ZTVN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE)
+emit_32(0);
+emit_32(_ZTIN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD1Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD0Ev__index__);
+emit_32(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE)
+emit_string('N33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncE\x00');
+emit_start(_ZTVN28btCompoundCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN28btCompoundCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN28btCompoundCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN28btCompoundCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN28btCompoundCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN28btCompoundCollisionAlgorithm10CreateFuncE)
+emit_string('N28btCompoundCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_ZTVN28btCompoundCollisionAlgorithm17SwappedCreateFuncE)
+emit_32(0);
+emit_32(_ZTIN28btCompoundCollisionAlgorithm17SwappedCreateFuncE);
+emit_32(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD1Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD0Ev__index__);
+emit_32(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN28btCompoundCollisionAlgorithm17SwappedCreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN28btCompoundCollisionAlgorithm17SwappedCreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN28btCompoundCollisionAlgorithm17SwappedCreateFuncE)
+emit_string('N28btCompoundCollisionAlgorithm17SwappedCreateFuncE\x00');
+emit_start(_ZTVN16btEmptyAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN16btEmptyAlgorithm10CreateFuncE);
+emit_32(_ZN16btEmptyAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN16btEmptyAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN16btEmptyAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN16btEmptyAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN16btEmptyAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN16btEmptyAlgorithm10CreateFuncE)
+emit_string('N16btEmptyAlgorithm10CreateFuncE\x00');
+emit_start(_ZTVN32btSphereSphereCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN32btSphereSphereCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN32btSphereSphereCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN32btSphereSphereCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN32btSphereSphereCollisionAlgorithm10CreateFuncE)
+emit_string('N32btSphereSphereCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_ZTVN34btSphereTriangleCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN34btSphereTriangleCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN34btSphereTriangleCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN34btSphereTriangleCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN34btSphereTriangleCollisionAlgorithm10CreateFuncE)
+emit_string('N34btSphereTriangleCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_ZTVN26btBoxBoxCollisionAlgorithm10CreateFuncE)
+emit_32(0);
+emit_32(_ZTIN26btBoxBoxCollisionAlgorithm10CreateFuncE);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm10CreateFuncD1Ev__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm10CreateFuncD0Ev__index__);
+emit_32(_ZN26btBoxBoxCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__);
+emit_start(_ZTIN26btBoxBoxCollisionAlgorithm10CreateFuncE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN26btBoxBoxCollisionAlgorithm10CreateFuncE);
+emit_32(_ZTI30btCollisionAlgorithmCreateFunc);
+emit_start(_ZTSN26btBoxBoxCollisionAlgorithm10CreateFuncE)
+emit_string('N26btBoxBoxCollisionAlgorithm10CreateFuncE\x00');
+emit_start(_2E_str128)
+emit_string('usedsize==0\x00');
+emit_start(_2E_str1129)
+emit_string('../../../../src/LinearMath/btStackAlloc.h\x00');
+emit_start(_ZTV31btDefaultCollisionConfiguration)
+emit_32(0);
+emit_32(_ZTI31btDefaultCollisionConfiguration);
+emit_32(_ZN31btDefaultCollisionConfigurationD1Ev__index__);
+emit_32(_ZN31btDefaultCollisionConfigurationD0Ev__index__);
+emit_32(_ZN31btDefaultCollisionConfiguration25getPersistentManifoldPoolEv__index__);
+emit_32(_ZN31btDefaultCollisionConfiguration25getCollisionAlgorithmPoolEv__index__);
+emit_32(_ZN31btDefaultCollisionConfiguration17getStackAllocatorEv__index__);
+emit_32(_ZN31btDefaultCollisionConfiguration31getCollisionAlgorithmCreateFuncEii__index__);
+emit_32(_ZN31btDefaultCollisionConfiguration16getSimplexSolverEv__index__);
+emit_start(_ZTI31btDefaultCollisionConfiguration)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS31btDefaultCollisionConfiguration);
+emit_32(_ZTI24btCollisionConfiguration);
+emit_start(_ZTS31btDefaultCollisionConfiguration)
+emit_string('31btDefaultCollisionConfiguration\x00');
+emit_start(_ZTV16btEmptyAlgorithm)
+emit_32(0);
+emit_32(_ZTI16btEmptyAlgorithm);
+emit_32(_ZN16btEmptyAlgorithmD1Ev__index__);
+emit_32(_ZN16btEmptyAlgorithmD0Ev__index__);
+emit_32(_ZN16btEmptyAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN16btEmptyAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN16btEmptyAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI16btEmptyAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS16btEmptyAlgorithm);
+emit_32(_ZTI20btCollisionAlgorithm);
+emit_start(_ZTS16btEmptyAlgorithm)
+emit_string('16btEmptyAlgorithm\x00');
+emit_start(_ZTV16btManifoldResult)
+emit_32(0);
+emit_32(_ZTI16btManifoldResult);
+emit_32(_ZN16btManifoldResultD1Ev__index__);
+emit_32(_ZN16btManifoldResultD0Ev__index__);
+emit_32(_ZN16btManifoldResult20setShapeIdentifiersAEii__index__);
+emit_32(_ZN16btManifoldResult20setShapeIdentifiersBEii__index__);
+emit_32(_ZN16btManifoldResult15addContactPointERK9btVector3S2_f__index__);
+emit_start(_2E_str2149)
+emit_string('validContactDistance(newPoint)\x00');
+emit_start(_2E_str3150)
+emit_string('lifeTime>=0\x00');
+emit_start(_2E_str5152)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btManifoldResult.cpp\x00');
+emit_start(_2E_str155)
+emit_string('islandUnionFindAndQuickSort\x00');
+emit_start(_2E_str1156)
+emit_string('(colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1)\x00');
+emit_start(_2E_str2157)
+emit_string('../../../../src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp\x00');
+emit_start(_2E_str3158)
+emit_string('processIslands\x00');
+emit_start(_ZTV25btSimulationIslandManager)
+emit_32(0);
+emit_32(_ZTI25btSimulationIslandManager);
+emit_32(_ZN25btSimulationIslandManagerD1Ev__index__);
+emit_32(_ZN25btSimulationIslandManagerD0Ev__index__);
+emit_32(_ZN25btSimulationIslandManager21updateActivationStateEP16btCollisionWorldP12btDispatcher__index__);
+emit_32(_ZN25btSimulationIslandManager26storeIslandActivationStateEP16btCollisionWorld__index__);
+emit_start(_ZTI25btSimulationIslandManager)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS25btSimulationIslandManager);
+emit_start(_ZTS25btSimulationIslandManager)
+emit_string('25btSimulationIslandManager\x00');
+emit_start(_ZTV32btSphereSphereCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI32btSphereSphereCollisionAlgorithm);
+emit_32(_ZN32btSphereSphereCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN32btSphereSphereCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI32btSphereSphereCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS32btSphereSphereCollisionAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS32btSphereSphereCollisionAlgorithm)
+emit_string('32btSphereSphereCollisionAlgorithm\x00');
+emit_start(_ZTV34btSphereTriangleCollisionAlgorithm)
+emit_32(0);
+emit_32(_ZTI34btSphereTriangleCollisionAlgorithm);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithmD1Ev__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithmD0Ev__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__);
+emit_32(_ZN34btSphereTriangleCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__);
+emit_start(_ZTI34btSphereTriangleCollisionAlgorithm)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS34btSphereTriangleCollisionAlgorithm);
+emit_32(_ZTI30btActivatingCollisionAlgorithm);
+emit_start(_ZTS34btSphereTriangleCollisionAlgorithm)
+emit_string('34btSphereTriangleCollisionAlgorithm\x00');
+emit_start(_ZTV22SphereTriangleDetector)
+emit_32(0);
+emit_32(_ZTI22SphereTriangleDetector);
+emit_32(_ZN22SphereTriangleDetectorD1Ev__index__);
+emit_32(_ZN22SphereTriangleDetectorD0Ev__index__);
+emit_32(_ZN22SphereTriangleDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__);
+emit_start(_ZTI22SphereTriangleDetector)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS22SphereTriangleDetector);
+emit_32(_ZTI36btDiscreteCollisionDetectorInterface);
+emit_start(_ZTS22SphereTriangleDetector)
+emit_string('22SphereTriangleDetector\x00');
+emit_start(_2E_str173)
+emit_string('Box\x00');
+emit_start(_2E_str2175)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btBoxShape.h\x00');
+emit_start(_ZTV10btBoxShape)
+emit_32(0);
+emit_32(_ZTI10btBoxShape);
+emit_32(_ZN10btBoxShapeD1Ev__index__);
+emit_32(_ZN10btBoxShapeD0Ev__index__);
+emit_32(_ZNK10btBoxShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN10btBoxShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK21btConvexInternalShape15getLocalScalingEv__index__);
+emit_32(_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK10btBoxShape7getNameEv__index__);
+emit_32(_ZN10btBoxShape9setMarginEf__index__);
+emit_32(_ZNK21btConvexInternalShape9getMarginEv__index__);
+emit_32(_ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK21btConvexInternalShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK10btBoxShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK10btBoxShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK10btBoxShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__);
+emit_32(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK10btBoxShape36getNumPreferredPenetrationDirectionsEv__index__);
+emit_32(_ZNK10btBoxShape32getPreferredPenetrationDirectionEiR9btVector3__index__);
+emit_32(_ZNK10btBoxShape14getNumVerticesEv__index__);
+emit_32(_ZNK10btBoxShape11getNumEdgesEv__index__);
+emit_32(_ZNK10btBoxShape7getEdgeEiR9btVector3S1___index__);
+emit_32(_ZNK10btBoxShape9getVertexEiR9btVector3__index__);
+emit_32(_ZNK10btBoxShape12getNumPlanesEv__index__);
+emit_32(_ZNK10btBoxShape8getPlaneER9btVector3S1_i__index__);
+emit_32(_ZNK10btBoxShape8isInsideERK9btVector3f__index__);
+emit_32(_ZNK10btBoxShape16getPlaneEquationER9btVector4i__index__);
+emit_start(_ZTI10btBoxShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS10btBoxShape);
+emit_32(_ZTI23btPolyhedralConvexShape);
+emit_start(_ZTS10btBoxShape)
+emit_string('10btBoxShape\x00');
+emit_start(_2E_str181)
+emit_string('BVHTRIANGLEMESH\x00');
+emit_start(_ZTVZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_32(0);
+emit_32(_ZTIZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback);
+emit_32(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev__index__);
+emit_32(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev__index__);
+emit_32(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii__index__);
+emit_start(_ZTIZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback);
+emit_32(_ZTI21btNodeOverlapCallback);
+emit_start(_ZTSZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_string('ZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback\x00');
+emit_start(_ZTVZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback)
+emit_32(0);
+emit_32(_ZTIZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback);
+emit_32(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD1Ev__index__);
+emit_32(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD0Ev__index__);
+emit_32(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallback11processNodeEii__index__);
+emit_start(_ZTIZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback);
+emit_32(_ZTI21btNodeOverlapCallback);
+emit_start(_ZTSZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback)
+emit_string('ZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_E21MyNodeOverlapCallback\x00');
+emit_start(_ZTVZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_32(0);
+emit_32(_ZTIZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback);
+emit_32(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev__index__);
+emit_32(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev__index__);
+emit_32(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii__index__);
+emit_start(_ZTIZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback);
+emit_32(_ZTI21btNodeOverlapCallback);
+emit_start(_ZTSZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback)
+emit_string('ZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E21MyNodeOverlapCallback\x00');
+emit_start(_2E_str5186)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btTriangleMeshShape.h\x00');
+emit_start(_2E_str6187)
+emit_string('indicestype==PHY_INTEGER||indicestype==PHY_SHORT\x00');
+emit_start(_2E_str7188)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp\x00');
+emit_start(_2E_str8189)
+emit_string('btTriangleMeshShapeData\x00');
+emit_start(_ZTV22btBvhTriangleMeshShape)
+emit_32(0);
+emit_32(_ZTI22btBvhTriangleMeshShape);
+emit_32(_ZN22btBvhTriangleMeshShapeD1Ev__index__);
+emit_32(_ZN22btBvhTriangleMeshShapeD0Ev__index__);
+emit_32(_ZNK19btTriangleMeshShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN22btBvhTriangleMeshShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK19btTriangleMeshShape15getLocalScalingEv__index__);
+emit_32(_ZNK19btTriangleMeshShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape7getNameEv__index__);
+emit_32(_ZN14btConcaveShape9setMarginEf__index__);
+emit_32(_ZNK14btConcaveShape9getMarginEv__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4___index__);
+emit_32(_ZNK19btTriangleMeshShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK19btTriangleMeshShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape18serializeSingleBvhEP12btSerializer__index__);
+emit_32(_ZNK22btBvhTriangleMeshShape30serializeSingleTriangleInfoMapEP12btSerializer__index__);
+emit_start(_ZTI22btBvhTriangleMeshShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS22btBvhTriangleMeshShape);
+emit_32(_ZTI19btTriangleMeshShape);
+emit_start(_ZTS22btBvhTriangleMeshShape)
+emit_string('22btBvhTriangleMeshShape\x00');
+emit_start(_ZTI19btTriangleMeshShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS19btTriangleMeshShape);
+emit_32(_ZTI14btConcaveShape);
+emit_start(_ZTS19btTriangleMeshShape)
+emit_string('19btTriangleMeshShape\x00');
+emit_start(_ZTI14btConcaveShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS14btConcaveShape);
+emit_32(_ZTI16btCollisionShape);
+emit_start(_ZTS14btConcaveShape)
+emit_string('14btConcaveShape\x00');
+emit_start(_2E_str194)
+emit_string('CapsuleShape\x00');
+emit_start(_2E_str4198)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btConvexInternalShape.h\x00');
+emit_start(_2E_str6199)
+emit_string('btCapsuleShapeData\x00');
+emit_start(_ZTV14btCapsuleShape)
+emit_32(0);
+emit_32(_ZTI14btCapsuleShape);
+emit_32(_ZN14btCapsuleShapeD1Ev__index__);
+emit_32(_ZN14btCapsuleShapeD0Ev__index__);
+emit_32(_ZNK14btCapsuleShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN14btCapsuleShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK21btConvexInternalShape15getLocalScalingEv__index__);
+emit_32(_ZNK14btCapsuleShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK14btCapsuleShape7getNameEv__index__);
+emit_32(_ZN14btCapsuleShape9setMarginEf__index__);
+emit_32(_ZNK21btConvexInternalShape9getMarginEv__index__);
+emit_32(_ZNK14btCapsuleShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK14btCapsuleShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK21btConvexInternalShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK14btCapsuleShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK14btCapsuleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__);
+emit_32(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv__index__);
+emit_32(_ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3__index__);
+emit_start(_ZTI14btCapsuleShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS14btCapsuleShape);
+emit_32(_ZTI21btConvexInternalShape);
+emit_start(_ZTS14btCapsuleShape)
+emit_string('14btCapsuleShape\x00');
+emit_start(_2E_str200)
+emit_string('btCollisionShapeData\x00');
+emit_start(_ZTV14btConcaveShape)
+emit_32(0);
+emit_32(_ZTI14btConcaveShape);
+emit_32(_ZN14btConcaveShapeD1Ev__index__);
+emit_32(_ZN14btConcaveShapeD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZN14btConcaveShape9setMarginEf__index__);
+emit_32(_ZNK14btConcaveShape9getMarginEv__index__);
+emit_32(_ZNK16btCollisionShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK16btCollisionShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_2E_str219)
+emit_string('Convex\x00');
+emit_start(_2E_str3222)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btConvexHullShape.cpp\x00');
+emit_start(_ZTV17btConvexHullShape)
+emit_32(0);
+emit_32(_ZTI17btConvexHullShape);
+emit_32(_ZN17btConvexHullShapeD1Ev__index__);
+emit_32(_ZN17btConvexHullShapeD0Ev__index__);
+emit_32(_ZNK34btPolyhedralConvexAabbCachingShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN17btConvexHullShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK21btConvexInternalShape15getLocalScalingEv__index__);
+emit_32(_ZNK23btPolyhedralConvexShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK17btConvexHullShape7getNameEv__index__);
+emit_32(_ZN21btConvexInternalShape9setMarginEf__index__);
+emit_32(_ZNK21btConvexInternalShape9getMarginEv__index__);
+emit_32(_ZNK17btConvexHullShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK17btConvexHullShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK17btConvexHullShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK17btConvexHullShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK17btConvexHullShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__);
+emit_32(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv__index__);
+emit_32(_ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3__index__);
+emit_32(_ZNK17btConvexHullShape14getNumVerticesEv__index__);
+emit_32(_ZNK17btConvexHullShape11getNumEdgesEv__index__);
+emit_32(_ZNK17btConvexHullShape7getEdgeEiR9btVector3S1___index__);
+emit_32(_ZNK17btConvexHullShape9getVertexEiR9btVector3__index__);
+emit_32(_ZNK17btConvexHullShape12getNumPlanesEv__index__);
+emit_32(_ZNK17btConvexHullShape8getPlaneER9btVector3S1_i__index__);
+emit_32(_ZNK17btConvexHullShape8isInsideERK9btVector3f__index__);
+emit_start(_ZTI17btConvexHullShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS17btConvexHullShape);
+emit_32(_ZTI34btPolyhedralConvexAabbCachingShape);
+emit_start(_ZTS17btConvexHullShape)
+emit_string('17btConvexHullShape\x00');
+emit_start(_ZTI34btPolyhedralConvexAabbCachingShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS34btPolyhedralConvexAabbCachingShape);
+emit_32(_ZTI23btPolyhedralConvexShape);
+emit_start(_ZTS34btPolyhedralConvexAabbCachingShape)
+emit_string('34btPolyhedralConvexAabbCachingShape\x00');
+emit_start(_2E_str5223)
+emit_string('btVector3FloatData\x00');
+emit_start(_2E_str6224)
+emit_string('btConvexHullShapeData\x00');
+emit_start(_2E_str6232)
+emit_string('m_isLocalAabbValid\x00');
+emit_start(_ZTV13btConvexShape)
+emit_32(0);
+emit_32(_ZTI13btConvexShape);
+emit_32(_ZN13btConvexShapeD1Ev__index__);
+emit_32(_ZN13btConvexShapeD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZNK16btCollisionShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK16btCollisionShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_2E_str6249)
+emit_string('ptIndex >= 0\x00');
+emit_start(_2E_str7250)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btConvexShape.cpp\x00');
+emit_start(_ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback)
+emit_32(0);
+emit_32(_ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD1Ev__index__);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD0Ev__index__);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallback28internalProcessTriangleIndexEPS2_ii__index__);
+emit_start(_ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback);
+emit_32(_ZTI31btInternalTriangleIndexCallback);
+emit_start(_ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback)
+emit_string('ZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E20NodeTriangleCallback\x00');
+emit_start(_ZTVZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback)
+emit_32(0);
+emit_32(_ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD1Ev__index__);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD0Ev__index__);
+emit_32(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallback28internalProcessTriangleIndexEPS2_ii__index__);
+emit_start(_ZTIZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback);
+emit_32(_ZTI31btInternalTriangleIndexCallback);
+emit_start(_ZTSZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback)
+emit_string('ZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_E29QuantizedNodeTriangleCallback\x00');
+emit_start(_2E_str10306)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp\x00');
+emit_start(_2E_str18314)
+emit_string('partId < (1<<MAX_NUM_PARTS_IN_BITS)\x00');
+emit_start(_2E_str19315)
+emit_string('triangleIndex < (1<<(31-MAX_NUM_PARTS_IN_BITS))\x00');
+emit_start(_2E_str20316)
+emit_string('triangleIndex>=0\x00');
+emit_start(_ZTV14btOptimizedBvh)
+emit_32(0);
+emit_32(_ZTI14btOptimizedBvh);
+emit_32(_ZN14btOptimizedBvhD1Ev__index__);
+emit_32(_ZN14btOptimizedBvhD0Ev__index__);
+emit_32(_ZNK14btQuantizedBvh9serializeEPvjb__index__);
+emit_32(_ZNK14btQuantizedBvh31calculateSerializeBufferSizeNewEv__index__);
+emit_32(_ZNK14btQuantizedBvh9serializeEPvP12btSerializer__index__);
+emit_32(_ZN14btQuantizedBvh16deSerializeFloatER23btQuantizedBvhFloatData__index__);
+emit_32(_ZN14btQuantizedBvh17deSerializeDoubleER24btQuantizedBvhDoubleData__index__);
+emit_32(_ZNK14btOptimizedBvh16serializeInPlaceEPvjb__index__);
+emit_start(_ZTI14btOptimizedBvh)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS14btOptimizedBvh);
+emit_32(_ZTI14btQuantizedBvh);
+emit_start(_ZTS14btOptimizedBvh)
+emit_string('14btOptimizedBvh\x00');
+emit_start(_2E_str7331)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h\x00');
+emit_start(_2E_str342)
+emit_string('SPHERE\x00');
+emit_start(_ZTV13btSphereShape)
+emit_32(0);
+emit_32(_ZTI13btSphereShape);
+emit_32(_ZN13btSphereShapeD1Ev__index__);
+emit_32(_ZN13btSphereShapeD0Ev__index__);
+emit_32(_ZNK13btSphereShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN21btConvexInternalShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK21btConvexInternalShape15getLocalScalingEv__index__);
+emit_32(_ZNK13btSphereShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK13btSphereShape7getNameEv__index__);
+emit_32(_ZN13btSphereShape9setMarginEf__index__);
+emit_32(_ZNK13btSphereShape9getMarginEv__index__);
+emit_32(_ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK21btConvexInternalShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK13btSphereShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK13btSphereShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_32(_ZNK13btSphereShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__);
+emit_32(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv__index__);
+emit_32(_ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3__index__);
+emit_start(_ZTI13btSphereShape)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS13btSphereShape);
+emit_32(_ZTI21btConvexInternalShape);
+emit_start(_ZTS13btSphereShape)
+emit_string('13btSphereShape\x00');
+emit_start(_2E_str349)
+emit_string('btIntIndexData\x00');
+emit_start(_2E_str1350)
+emit_string('btShortIntIndexTripletData\x00');
+emit_start(_2E_str3352)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp\x00');
+emit_start(_2E_str5354)
+emit_string('btVector3DoubleData\x00');
+emit_start(_2E_str6355)
+emit_string('(type == PHY_FLOAT) || (type == PHY_DOUBLE)\x00');
+emit_start(_2E_str7356)
+emit_string('btMeshPartData\x00');
+emit_start(_2E_str8357)
+emit_string('btStridingMeshInterfaceData\x00');
+emit_start(_2E_str9358)
+emit_string('(gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT)\x00');
+emit_start(_ZTV23btStridingMeshInterface)
+emit_32(0);
+emit_32(_ZTI23btStridingMeshInterface);
+emit_32(_ZN23btStridingMeshInterfaceD1Ev__index__);
+emit_32(_ZN23btStridingMeshInterfaceD0Ev__index__);
+emit_32(_ZNK23btStridingMeshInterface27InternalProcessAllTrianglesEP31btInternalTriangleIndexCallbackRK9btVector3S4___index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZNK23btStridingMeshInterface14hasPremadeAabbEv__index__);
+emit_32(_ZNK23btStridingMeshInterface14setPremadeAabbERK9btVector3S2___index__);
+emit_32(_ZNK23btStridingMeshInterface14getPremadeAabbEP9btVector3S1___index__);
+emit_32(_ZNK23btStridingMeshInterface28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK23btStridingMeshInterface9serializeEPvP12btSerializer__index__);
+emit_start(_ZTI23btStridingMeshInterface)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS23btStridingMeshInterface);
+emit_start(_ZTS23btStridingMeshInterface)
+emit_string('23btStridingMeshInterface\x00');
+emit_start(_ZTV31btInternalTriangleIndexCallback)
+emit_32(0);
+emit_32(_ZTI31btInternalTriangleIndexCallback);
+emit_32(_ZN31btInternalTriangleIndexCallbackD1Ev__index__);
+emit_32(_ZN31btInternalTriangleIndexCallbackD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTV18btTriangleCallback)
+emit_32(0);
+emit_32(_ZTI18btTriangleCallback);
+emit_32(_ZN18btTriangleCallbackD1Ev__index__);
+emit_32(_ZN18btTriangleCallbackD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_2E_str367)
+emit_string('subpart< getNumSubParts()\x00');
+emit_start(_2E_str1368)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp\x00');
+emit_start(_ZTV26btTriangleIndexVertexArray)
+emit_32(0);
+emit_32(_ZTI26btTriangleIndexVertexArray);
+emit_32(_ZN26btTriangleIndexVertexArrayD1Ev__index__);
+emit_32(_ZN26btTriangleIndexVertexArrayD0Ev__index__);
+emit_32(_ZNK23btStridingMeshInterface27InternalProcessAllTrianglesEP31btInternalTriangleIndexCallbackRK9btVector3S4___index__);
+emit_32(_ZN26btTriangleIndexVertexArray24getLockedVertexIndexBaseEPPhRiR14PHY_ScalarTypeS2_S1_S2_S2_S4_i__index__);
+emit_32(_ZNK26btTriangleIndexVertexArray32getLockedReadOnlyVertexIndexBaseEPPKhRiR14PHY_ScalarTypeS3_S2_S3_S3_S5_i__index__);
+emit_32(_ZN26btTriangleIndexVertexArray16unLockVertexBaseEi__index__);
+emit_32(_ZNK26btTriangleIndexVertexArray24unLockReadOnlyVertexBaseEi__index__);
+emit_32(_ZNK26btTriangleIndexVertexArray14getNumSubPartsEv__index__);
+emit_32(_ZN26btTriangleIndexVertexArray19preallocateVerticesEi__index__);
+emit_32(_ZN26btTriangleIndexVertexArray18preallocateIndicesEi__index__);
+emit_32(_ZNK26btTriangleIndexVertexArray14hasPremadeAabbEv__index__);
+emit_32(_ZNK26btTriangleIndexVertexArray14setPremadeAabbERK9btVector3S2___index__);
+emit_32(_ZNK26btTriangleIndexVertexArray14getPremadeAabbEP9btVector3S1___index__);
+emit_32(_ZNK23btStridingMeshInterface28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK23btStridingMeshInterface9serializeEPvP12btSerializer__index__);
+emit_start(_ZTI26btTriangleIndexVertexArray)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS26btTriangleIndexVertexArray);
+emit_32(_ZTI23btStridingMeshInterface);
+emit_start(_ZTS26btTriangleIndexVertexArray)
+emit_string('26btTriangleIndexVertexArray\x00');
+emit_start(_2E_str372)
+emit_string('TRIANGLEMESH\x00');
+emit_start(_ZTV21SupportVertexCallback)
+emit_32(0);
+emit_32(_ZTI21SupportVertexCallback);
+emit_32(_ZN21SupportVertexCallbackD1Ev__index__);
+emit_32(_ZN21SupportVertexCallbackD0Ev__index__);
+emit_32(_ZN21SupportVertexCallback15processTriangleEP9btVector3ii__index__);
+emit_start(_ZTI21SupportVertexCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS21SupportVertexCallback);
+emit_32(_ZTI18btTriangleCallback);
+emit_start(_ZTS21SupportVertexCallback)
+emit_string('21SupportVertexCallback\x00');
+emit_start(_ZTVZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback)
+emit_32(0);
+emit_32(_ZTIZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback);
+emit_32(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD1Ev__index__);
+emit_32(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD0Ev__index__);
+emit_32(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallback28internalProcessTriangleIndexEPS2_ii__index__);
+emit_start(_ZTIZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback);
+emit_32(_ZTI31btInternalTriangleIndexCallback);
+emit_start(_ZTSZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback)
+emit_string('ZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_E16FilteredCallback\x00');
+emit_start(_2E_str3375)
+emit_string('../../../../src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp\x00');
+emit_start(_ZTV19btTriangleMeshShape)
+emit_32(0);
+emit_32(_ZTI19btTriangleMeshShape);
+emit_32(_ZN19btTriangleMeshShapeD1Ev__index__);
+emit_32(_ZN19btTriangleMeshShapeD0Ev__index__);
+emit_32(_ZNK19btTriangleMeshShape7getAabbERK11btTransformR9btVector3S4___index__);
+emit_32(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__);
+emit_32(_ZNK16btCollisionShape20getAngularMotionDiscEv__index__);
+emit_32(_ZNK16btCollisionShape27getContactBreakingThresholdEf__index__);
+emit_32(_ZN19btTriangleMeshShape15setLocalScalingERK9btVector3__index__);
+emit_32(_ZNK19btTriangleMeshShape15getLocalScalingEv__index__);
+emit_32(_ZNK19btTriangleMeshShape21calculateLocalInertiaEfR9btVector3__index__);
+emit_32(_ZNK19btTriangleMeshShape7getNameEv__index__);
+emit_32(_ZN14btConcaveShape9setMarginEf__index__);
+emit_32(_ZNK14btConcaveShape9getMarginEv__index__);
+emit_32(_ZNK16btCollisionShape28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK16btCollisionShape9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__);
+emit_32(_ZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4___index__);
+emit_32(_ZNK19btTriangleMeshShape24localGetSupportingVertexERK9btVector3__index__);
+emit_32(_ZNK19btTriangleMeshShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__);
+emit_start(_ZTV16btPointCollector)
+emit_32(0);
+emit_32(_ZTI16btPointCollector);
+emit_32(_ZN16btPointCollectorD1Ev__index__);
+emit_32(_ZN16btPointCollectorD0Ev__index__);
+emit_32(_ZN16btPointCollector20setShapeIdentifiersAEii__index__);
+emit_32(_ZN16btPointCollector20setShapeIdentifiersBEii__index__);
+emit_32(_ZN16btPointCollector15addContactPointERK9btVector3S2_f__index__);
+emit_start(_ZTI16btPointCollector)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS16btPointCollector);
+emit_32(_ZTIN36btDiscreteCollisionDetectorInterface6ResultE);
+emit_start(_ZTS16btPointCollector)
+emit_string('16btPointCollector\x00');
+emit_start(_ZTV27btContinuousConvexCollision)
+emit_32(0);
+emit_32(_ZTI27btContinuousConvexCollision);
+emit_32(_ZN27btContinuousConvexCollisionD1Ev__index__);
+emit_32(_ZN27btContinuousConvexCollisionD0Ev__index__);
+emit_32(_ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__);
+emit_start(_ZTI27btContinuousConvexCollision)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS27btContinuousConvexCollision);
+emit_32(_ZTI12btConvexCast);
+emit_start(_ZTS27btContinuousConvexCollision)
+emit_string('27btContinuousConvexCollision\x00');
+emit_start(_ZTI12btConvexCast)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS12btConvexCast);
+emit_start(_ZTS12btConvexCast)
+emit_string('12btConvexCast\x00');
+emit_start(_ZTV12btConvexCast)
+emit_32(0);
+emit_32(_ZTI12btConvexCast);
+emit_32(_ZN12btConvexCastD1Ev__index__);
+emit_32(_ZN12btConvexCastD0Ev__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTV15btGjkConvexCast)
+emit_32(0);
+emit_32(_ZTI15btGjkConvexCast);
+emit_32(_ZN15btGjkConvexCastD1Ev__index__);
+emit_32(_ZN15btGjkConvexCastD0Ev__index__);
+emit_32(_ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__);
+emit_start(_ZTI15btGjkConvexCast)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS15btGjkConvexCast);
+emit_32(_ZTI12btConvexCast);
+emit_start(_ZTS15btGjkConvexCast)
+emit_string('15btGjkConvexCast\x00');
+emit_start(_ZZN12gjkepa2_impl3GJK13projectoriginERK9btVector3S3_S3_PfRjE4imd3)
+emit_32(1);
+emit_32(2);
+emit_32(0);
+emit_start(_ZZN12gjkepa2_impl3EPA6expandEjPNS_3GJK3sSVEPNS0_5sFaceEjRNS0_8sHorizonEE4i2m3)
+emit_32(2);
+emit_32(0);
+emit_32(1);
+emit_start(_ZTV30btGjkEpaPenetrationDepthSolver)
+emit_32(0);
+emit_32(_ZTI30btGjkEpaPenetrationDepthSolver);
+emit_32(_ZN30btGjkEpaPenetrationDepthSolverD1Ev__index__);
+emit_32(_ZN30btGjkEpaPenetrationDepthSolverD0Ev__index__);
+emit_32(_ZN30btGjkEpaPenetrationDepthSolver12calcPenDepthER22btVoronoiSimplexSolverPK13btConvexShapeS4_RK11btTransformS7_R9btVector3S9_S9_P12btIDebugDrawP12btStackAlloc__index__);
+emit_start(_ZTI30btGjkEpaPenetrationDepthSolver)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS30btGjkEpaPenetrationDepthSolver);
+emit_32(_ZTI30btConvexPenetrationDepthSolver);
+emit_start(_ZTS30btGjkEpaPenetrationDepthSolver)
+emit_string('30btGjkEpaPenetrationDepthSolver\x00');
+emit_start(_ZTV17btGjkPairDetector)
+emit_32(0);
+emit_32(_ZTI17btGjkPairDetector);
+emit_32(_ZN17btGjkPairDetectorD1Ev__index__);
+emit_32(_ZN17btGjkPairDetectorD0Ev__index__);
+emit_32(_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__);
+emit_start(_ZTI17btGjkPairDetector)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS17btGjkPairDetector);
+emit_32(_ZTI36btDiscreteCollisionDetectorInterface);
+emit_start(_ZTS17btGjkPairDetector)
+emit_string('17btGjkPairDetector\x00');
+emit_start(_2E_str425)
+emit_string('btGjkPairDetector maxIter exceeded:%i\x0a\x00');
+emit_start(_2E_str1426)
+emit_string('sepAxis=(%f,%f,%f), squaredDistance = %f, shapeTypeA=%i,shapeTypeB=%i\x0a\x00');
+emit_start(_2E_str2427)
+emit_string('s > btScalar(0.0)\x00');
+emit_start(_2E_str3428)
+emit_string('../../../../src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp\x00');
+emit_start(gContactBreakingThreshold)
+emit_32(1017370378);
+emit_start(_2E_str434)
+emit_string('m_pointCache[lastUsedIndex].m_userPersistentData==0\x00');
+emit_start(_2E_str3437)
+emit_string('../../../../src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp\x00');
+emit_start(_2E_str4438)
+emit_string('m_pointCache[insertIndex].m_userPersistentData==0\x00');
+emit_start(_ZTV28btTriangleConvexcastCallback)
+emit_32(0);
+emit_32(_ZTI28btTriangleConvexcastCallback);
+emit_32(_ZN28btTriangleConvexcastCallbackD1Ev__index__);
+emit_32(_ZN28btTriangleConvexcastCallbackD0Ev__index__);
+emit_32(_ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_start(_ZTV22btSubsimplexConvexCast)
+emit_32(0);
+emit_32(_ZTI22btSubsimplexConvexCast);
+emit_32(_ZN22btSubsimplexConvexCastD1Ev__index__);
+emit_32(_ZN22btSubsimplexConvexCastD0Ev__index__);
+emit_32(_ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__);
+emit_start(_ZTI22btSubsimplexConvexCast)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS22btSubsimplexConvexCast);
+emit_32(_ZTI12btConvexCast);
+emit_start(_ZTS22btSubsimplexConvexCast)
+emit_string('22btSubsimplexConvexCast\x00');
+emit_start(_2E_str457)
+emit_string('m_numVertices>0\x00');
+emit_start(_2E_str1458)
+emit_string('../../../../src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp\x00');
+emit_start(_ZTVN16btCollisionWorld27ClosestConvexResultCallbackE)
+emit_32(0);
+emit_32(_ZTIN16btCollisionWorld27ClosestConvexResultCallbackE);
+emit_32(_ZN16btCollisionWorld27ClosestConvexResultCallbackD1Ev__index__);
+emit_32(_ZN16btCollisionWorld27ClosestConvexResultCallbackD0Ev__index__);
+emit_32(_ZNK16btCollisionWorld20ConvexResultCallback14needsCollisionEP17btBroadphaseProxy__index__);
+emit_32(_ZN16btCollisionWorld27ClosestConvexResultCallback15addSingleResultERNS_17LocalConvexResultEb__index__);
+emit_start(_ZTIN16btCollisionWorld27ClosestConvexResultCallbackE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN16btCollisionWorld27ClosestConvexResultCallbackE);
+emit_32(_ZTIN16btCollisionWorld20ConvexResultCallbackE);
+emit_start(_ZTSN16btCollisionWorld27ClosestConvexResultCallbackE)
+emit_string('N16btCollisionWorld27ClosestConvexResultCallbackE\x00');
+emit_start(_2E_str36)
+emit_string('convexResult.m_hitFraction <= m_closestHitFraction\x00');
+emit_start(_2E_str239)
+emit_string('btConeTwistConstraintData\x00');
+emit_start(_ZTV21btConeTwistConstraint)
+emit_32(0);
+emit_32(_ZTI21btConeTwistConstraint);
+emit_32(_ZN21btConeTwistConstraintD1Ev__index__);
+emit_32(_ZN21btConeTwistConstraintD0Ev__index__);
+emit_32(_ZN21btConeTwistConstraint13buildJacobianEv__index__);
+emit_32(_ZN17btTypedConstraint21setupSolverConstraintER20btAlignedObjectArrayI18btSolverConstraintEiif__index__);
+emit_32(_ZN21btConeTwistConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E__index__);
+emit_32(_ZN21btConeTwistConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E__index__);
+emit_32(_ZN21btConeTwistConstraint23solveConstraintObsoleteER11btRigidBodyS1_f__index__);
+emit_32(_ZN21btConeTwistConstraint8setParamEifi__index__);
+emit_32(_ZNK21btConeTwistConstraint8getParamEii__index__);
+emit_32(_ZNK21btConeTwistConstraint28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK21btConeTwistConstraint9serializeEPvP12btSerializer__index__);
+emit_start(_ZTI21btConeTwistConstraint)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS21btConeTwistConstraint);
+emit_32(_ZTI17btTypedConstraint);
+emit_start(_ZTS21btConeTwistConstraint)
+emit_string('21btConeTwistConstraint\x00');
+emit_start(_2E_str1340)
+emit_string('m_flags & BT_CONETWIST_FLAGS_LIN_ERP\x00');
+emit_start(_2E_str24)
+emit_string('../../../../src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp\x00');
+emit_start(_2E_str442)
+emit_string('m_flags & BT_CONETWIST_FLAGS_LIN_CFM\x00');
+emit_start(_2E_str543)
+emit_string('m_flags & BT_CONETWIST_FLAGS_ANG_CFM\x00');
+emit_start(_2E_str846)
+emit_string('m_Adiag > btScalar(0.0)\x00');
+emit_start(_2E_str947)
+emit_string('../../../../src/BulletDynamics/ConstraintSolver/btJacobianEntry.h\x00');
+emit_start(_2E_str1149)
+emit_string('!m_useSolveConstraintObsolete\x00');
+emit_start(_2E_str29)
+emit_string('btHingeConstraintFloatData\x00');
+emit_start(_ZTV17btHingeConstraint)
+emit_32(0);
+emit_32(_ZTI17btHingeConstraint);
+emit_32(_ZN17btHingeConstraintD1Ev__index__);
+emit_32(_ZN17btHingeConstraintD0Ev__index__);
+emit_32(_ZN17btHingeConstraint13buildJacobianEv__index__);
+emit_32(_ZN17btTypedConstraint21setupSolverConstraintER20btAlignedObjectArrayI18btSolverConstraintEiif__index__);
+emit_32(_ZN17btHingeConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E__index__);
+emit_32(_ZN17btHingeConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E__index__);
+emit_32(_ZN17btTypedConstraint23solveConstraintObsoleteER11btRigidBodyS1_f__index__);
+emit_32(_ZN17btHingeConstraint8setParamEifi__index__);
+emit_32(_ZNK17btHingeConstraint8getParamEii__index__);
+emit_32(_ZNK17btHingeConstraint28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK17btHingeConstraint9serializeEPvP12btSerializer__index__);
+emit_start(_ZTI17btHingeConstraint)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS17btHingeConstraint);
+emit_32(_ZTI17btTypedConstraint);
+emit_start(_ZTS17btHingeConstraint)
+emit_string('17btHingeConstraint\x00');
+emit_start(_2E_str130)
+emit_string('m_flags & BT_HINGE_FLAGS_ERP_STOP\x00');
+emit_start(_2E_str231)
+emit_string('../../../../src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp\x00');
+emit_start(_2E_str332)
+emit_string('m_flags & BT_HINGE_FLAGS_CFM_STOP\x00');
+emit_start(_2E_str433)
+emit_string('m_flags & BT_HINGE_FLAGS_CFM_NORM\x00');
+emit_start(_ZTI18btConstraintSolver)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS18btConstraintSolver);
+emit_start(_ZTS18btConstraintSolver)
+emit_string('18btConstraintSolver\x00');
+emit_start(_ZTV35btSequentialImpulseConstraintSolver)
+emit_32(0);
+emit_32(_ZTI35btSequentialImpulseConstraintSolver);
+emit_32(_ZN35btSequentialImpulseConstraintSolverD1Ev__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolverD0Ev__index__);
+emit_32(_ZN18btConstraintSolver12prepareSolveEii__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver10solveGroupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAllocP12btDispatcher__index__);
+emit_32(_ZN18btConstraintSolver9allSolvedERK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver5resetEv__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver45solveGroupCacheFriendlySplitImpulseIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver29solveGroupCacheFriendlyFinishEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver28solveGroupCacheFriendlySetupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__);
+emit_32(_ZN35btSequentialImpulseConstraintSolver33solveGroupCacheFriendlyIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__);
+emit_start(_ZTI35btSequentialImpulseConstraintSolver)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS35btSequentialImpulseConstraintSolver);
+emit_32(_ZTI18btConstraintSolver);
+emit_start(_ZTS35btSequentialImpulseConstraintSolver)
+emit_string('35btSequentialImpulseConstraintSolver\x00');
+emit_start(_2E_str248)
+emit_string('m_constraintRefs.size()==0\x00');
+emit_start(_2E_str34955)
+emit_string('../../../../src/BulletDynamics/Dynamics/btRigidBody.h\x00');
+emit_start(_2E_str450)
+emit_string('solveGroup\x00');
+emit_start(_2E_str551)
+emit_string('bodies\x00');
+emit_start(_2E_str652)
+emit_string('../../../../src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp\x00');
+emit_start(_2E_str753)
+emit_string('numBodies\x00');
+emit_start(_2E_str854)
+emit_string('solveGroupCacheFriendlyIterations\x00');
+emit_start(_2E_str955)
+emit_string('pt\x00');
+emit_start(_2E_str1056)
+emit_string('solveGroupCacheFriendlySetup\x00');
+emit_start(_2E_str1157)
+emit_string('currentRow<totalNumRows\x00');
+emit_start(_2E_str76)
+emit_string('btTypedConstraintData\x00');
+emit_start(_ZTI23btDiscreteDynamicsWorld)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS23btDiscreteDynamicsWorld);
+emit_32(_ZTI15btDynamicsWorld);
+emit_start(_ZTS23btDiscreteDynamicsWorld)
+emit_string('23btDiscreteDynamicsWorld\x00');
+emit_start(_ZTI15btDynamicsWorld)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS15btDynamicsWorld);
+emit_32(_ZTI16btCollisionWorld);
+emit_start(_ZTS15btDynamicsWorld)
+emit_string('15btDynamicsWorld\x00');
+emit_start(_ZTIN25btSimulationIslandManager14IslandCallbackE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN25btSimulationIslandManager14IslandCallbackE);
+emit_start(_ZTSN25btSimulationIslandManager14IslandCallbackE)
+emit_string('N25btSimulationIslandManager14IslandCallbackE\x00');
+emit_start(_ZTV34btClosestNotMeConvexResultCallback)
+emit_32(0);
+emit_32(_ZTI34btClosestNotMeConvexResultCallback);
+emit_32(_ZN34btClosestNotMeConvexResultCallbackD1Ev__index__);
+emit_32(_ZN34btClosestNotMeConvexResultCallbackD0Ev__index__);
+emit_32(_ZNK34btClosestNotMeConvexResultCallback14needsCollisionEP17btBroadphaseProxy__index__);
+emit_32(_ZN34btClosestNotMeConvexResultCallback15addSingleResultERN16btCollisionWorld17LocalConvexResultEb__index__);
+emit_start(_ZTI34btClosestNotMeConvexResultCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS34btClosestNotMeConvexResultCallback);
+emit_32(_ZTIN16btCollisionWorld27ClosestConvexResultCallbackE);
+emit_start(_ZTS34btClosestNotMeConvexResultCallback)
+emit_string('34btClosestNotMeConvexResultCallback\x00');
+emit_start(_ZTVZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback)
+emit_32(0);
+emit_32(_ZTIZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback);
+emit_32(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD1Ev__index__);
+emit_32(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD0Ev__index__);
+emit_32(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback13ProcessIslandEPP17btCollisionObjectiPP20btPersistentManifoldii__index__);
+emit_start(_ZTIZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback);
+emit_32(_ZTIN25btSimulationIslandManager14IslandCallbackE);
+emit_start(_ZTSZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback)
+emit_string('ZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoE27InplaceSolverIslandCallback\x00');
+emit_start(_2E_str87)
+emit_string('predictUnconstraintMotion\x00');
+emit_start(_2E_str188)
+emit_string('calculateSimulationIslands\x00');
+emit_start(_2E_str289)
+emit_string('updateActions\x00');
+emit_start(_2E_str794)
+emit_string('integrateTransforms\x00');
+emit_start(_2E_str895)
+emit_string('CCD motion clamping\x00');
+emit_start(_2E_str996)
+emit_string('solveConstraints\x00');
+emit_start(_2E_str1097)
+emit_string('updateActivationState\x00');
+emit_start(_2E_str1198)
+emit_string('internalSingleStepSimulation\x00');
+emit_start(_2E_str1299)
+emit_string('stepSimulation\x00');
+emit_start(_2E_str13100)
+emit_string('body\x00');
+emit_start(_2E_str1461)
+emit_string('../../../../src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp\x00');
+emit_start(_2E_str1562)
+emit_string('synchronizeMotionStates\x00');
+emit_start(_2E_str16101)
+emit_string('debugDrawWorld\x00');
+emit_start(_ZTV15btDynamicsWorld)
+emit_32(0);
+emit_32(_ZTI15btDynamicsWorld);
+emit_32(_ZN15btDynamicsWorldD1Ev__index__);
+emit_32(_ZN15btDynamicsWorldD0Ev__index__);
+emit_32(_ZN16btCollisionWorld11updateAabbsEv__index__);
+emit_32(_ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw__index__);
+emit_32(_ZN16btCollisionWorld14getDebugDrawerEv__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3__index__);
+emit_32(_ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE__index__);
+emit_32(_ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss__index__);
+emit_32(_ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject__index__);
+emit_32(_ZN16btCollisionWorld33performDiscreteCollisionDetectionEv__index__);
+emit_32(_ZN16btCollisionWorld9serializeEP12btSerializer__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZN15btDynamicsWorld13addConstraintEP17btTypedConstraintb__index__);
+emit_32(_ZN15btDynamicsWorld16removeConstraintEP17btTypedConstraint__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZNK15btDynamicsWorld17getNumConstraintsEv__index__);
+emit_32(_ZN15btDynamicsWorld13getConstraintEi__index__);
+emit_32(_ZNK15btDynamicsWorld13getConstraintEi__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(__cxa_pure_virtual__index__);
+emit_32(_ZN15btDynamicsWorld10addVehicleEP17btActionInterface__index__);
+emit_32(_ZN15btDynamicsWorld13removeVehicleEP17btActionInterface__index__);
+emit_32(_ZN15btDynamicsWorld12addCharacterEP17btActionInterface__index__);
+emit_32(_ZN15btDynamicsWorld15removeCharacterEP17btActionInterface__index__);
+emit_start(_ZTV23btDiscreteDynamicsWorld)
+emit_32(0);
+emit_32(_ZTI23btDiscreteDynamicsWorld);
+emit_32(_ZN23btDiscreteDynamicsWorldD1Ev__index__);
+emit_32(_ZN23btDiscreteDynamicsWorldD0Ev__index__);
+emit_32(_ZN16btCollisionWorld11updateAabbsEv__index__);
+emit_32(_ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw__index__);
+emit_32(_ZN16btCollisionWorld14getDebugDrawerEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld14debugDrawWorldEv__index__);
+emit_32(_ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3__index__);
+emit_32(_ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld18addCollisionObjectEP17btCollisionObjectss__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld21removeCollisionObjectEP17btCollisionObject__index__);
+emit_32(_ZN16btCollisionWorld33performDiscreteCollisionDetectionEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld9serializeEP12btSerializer__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld14stepSimulationEfif__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld13addConstraintEP17btTypedConstraintb__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld16removeConstraintEP17btTypedConstraint__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld9addActionEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld12removeActionEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld10setGravityERK9btVector3__index__);
+emit_32(_ZNK23btDiscreteDynamicsWorld10getGravityEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld23synchronizeMotionStatesEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBody__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld15removeRigidBodyEP11btRigidBody__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld19setConstraintSolverEP18btConstraintSolver__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld19getConstraintSolverEv__index__);
+emit_32(_ZNK23btDiscreteDynamicsWorld17getNumConstraintsEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld13getConstraintEi__index__);
+emit_32(_ZNK23btDiscreteDynamicsWorld13getConstraintEi__index__);
+emit_32(_ZNK23btDiscreteDynamicsWorld12getWorldTypeEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld11clearForcesEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld10addVehicleEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld13removeVehicleEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld12addCharacterEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld15removeCharacterEP17btActionInterface__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld25predictUnconstraintMotionEf__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld19integrateTransformsEf__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld26calculateSimulationIslandsEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfo__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld28internalSingleStepSimulationEf__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld18saveKinematicStateEf__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBodyss__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld12applyGravityEv__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld11setNumTasksEi__index__);
+emit_32(_ZN23btDiscreteDynamicsWorld14updateVehiclesEf__index__);
+emit_start(_ZTV11btRigidBody)
+emit_32(0);
+emit_32(_ZTI11btRigidBody);
+emit_32(_ZN11btRigidBody24checkCollideWithOverrideEP17btCollisionObject__index__);
+emit_32(_ZN11btRigidBodyD1Ev__index__);
+emit_32(_ZN11btRigidBodyD0Ev__index__);
+emit_32(_ZN17btCollisionObject17setCollisionShapeEP16btCollisionShape__index__);
+emit_32(_ZNK11btRigidBody28calculateSerializeBufferSizeEv__index__);
+emit_32(_ZNK11btRigidBody9serializeEPvP12btSerializer__index__);
+emit_32(_ZNK11btRigidBody21serializeSingleObjectEP12btSerializer__index__);
+emit_start(_ZTI11btRigidBody)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS11btRigidBody);
+emit_32(_ZTI17btCollisionObject);
+emit_start(_ZTS11btRigidBody)
+emit_string('11btRigidBody\x00');
+emit_start(_2E_str4144)
+emit_string('btRigidBodyFloatData\x00');
+emit_start(_ZN15CProfileManager11CurrentNodeE)
+emit_32(_ZN15CProfileManager4RootE);
+emit_start(_2E_str729)
+emit_string('Root\x00');
+emit_start(llvm_2E_eh_2E_catch_2E_all_2E_value)
+emit_32(0);
+emit_start(_ZTIN4__rw10__rw_facetE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN4__rw10__rw_facetE);
+emit_32(_ZTIN4__rw17__rw_synchronizedE);
+emit_start(_ZTSN4__rw10__rw_facetE)
+emit_string('N4__rw10__rw_facetE\x00');
+emit_start(_ZTIN4__rw17__rw_synchronizedE)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSN4__rw17__rw_synchronizedE);
+emit_start(_ZTSN4__rw17__rw_synchronizedE)
+emit_string('N4__rw17__rw_synchronizedE\x00');
+emit_start(_2E_str4131)
+emit_string('exception\x00');
+emit_start(_2E_str15132)
+emit_string('unexpected exception\x00');
+emit_start(_2E_str26)
+emit_fill(0,1);
+emit_start(_2E_str3133)
+emit_string('Exception: %s.\x0a\x00');
+emit_start(_2E_str47)
+emit_string('bad_alloc: out of memory\x00');
+emit_start(_2E_str5134)
+emit_string('unknown exception\x00');
+emit_start(_ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E6buffer)
+emit_string('rwstderr:1\x00');
+emit_start(_2E_str7136)
+emit_string('%d\x00');
+emit_start(_ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E8__catset)
+emit_32(1);
+emit_start(_ZZN4__rwL13__rw_vfmtwhatEPcjiS0_E5__cat)
+emit_32(4294967295);
+emit_start(_ZZN4__rw10__rw_throwEizE6errors)
+emit_32(_2E_str8137);
+emit_32(_2E_str9138);
+emit_32(_2E_str10139);
+emit_32(_2E_str11140);
+emit_32(_2E_str12141);
+emit_32(_2E_str138142);
+emit_32(_2E_str14143);
+emit_32(_2E_str159144);
+emit_32(_2E_str16145);
+emit_32(_2E_str17146);
+emit_32(_2E_str18147);
+emit_32(_2E_str19148);
+emit_32(_2E_str20149);
+emit_32(_2E_str21150);
+emit_32(_2E_str22151);
+emit_32(_2E_str23152);
+emit_32(_2E_str24153);
+emit_32(_2E_str25154);
+emit_32(_2E_str2610);
+emit_32(_2E_str27);
+emit_32(_2E_str28155);
+emit_32(_2E_str29156);
+emit_32(_2E_str30);
+emit_32(_2E_str31);
+emit_32(_2E_str32157);
+emit_start(_2E_str8137)
+emit_string('%s: %s: unspecified error\x00');
+emit_start(_2E_str9138)
+emit_string('%s: %s: exception\x00');
+emit_start(_2E_str10139)
+emit_string('%s: %s: unexpected exception\x00');
+emit_start(_2E_str11140)
+emit_string('%s: %s: bad_alloc: out of memory\x00');
+emit_start(_2E_str12141)
+emit_string('%s: %s: bad cast\x00');
+emit_start(_2E_str138142)
+emit_string('%s: %s: logic error\x00');
+emit_start(_2E_str14143)
+emit_string('%s: %s: domain error\x00');
+emit_start(_2E_str159144)
+emit_string('%s: %s: invalid argument\x00');
+emit_start(_2E_str16145)
+emit_string('%s: %s: length error: size %u out of range [0, %u)\x00');
+emit_start(_2E_str17146)
+emit_string('%s: %s: argument value %u out of range [0, %u)\x00');
+emit_start(_2E_str18147)
+emit_string('%s: %s: runtime error\x00');
+emit_start(_2E_str19148)
+emit_string('%s: %s: range error: invalid range [%d, %d)\x00');
+emit_start(_2E_str20149)
+emit_string('%s: %s: overflow error\x00');
+emit_start(_2E_str21150)
+emit_string('%s: %s: underflow error\x00');
+emit_start(_2E_str22151)
+emit_string('%s: stream object has set ios::failbit\x00');
+emit_start(_2E_str23152)
+emit_string('%s: stream object has set ios::badbit\x00');
+emit_start(_2E_str24153)
+emit_string('%s: stream object has set ios::eofbit\x00');
+emit_start(_2E_str25154)
+emit_string('%s: stream object has set %s\x00');
+emit_start(_2E_str2610)
+emit_string('%s: %s: facet %u not found in locale (\x22%s\x22)\x00');
+emit_start(_2E_str27)
+emit_string('%s: %s: bad locale name: \x22%s\x22\x00');
+emit_start(_2E_str28155)
+emit_string('%s: %s: failed to construct locale name\x00');
+emit_start(_2E_str29156)
+emit_string('%s: %s: conversion failed\x00');
+emit_start(_2E_str30)
+emit_string('%s: %s: invalid pointer %p\x00');
+emit_start(_2E_str31)
+emit_string('%s: %s: transformation failed\x00');
+emit_start(_2E_str32157)
+emit_string('%s: %s: bad category value: %#x\x00');
+emit_start(_2E_str33)
+emit_string('LC_COLLATE\x00');
+emit_start(_2E_str134)
+emit_string('LC_CTYPE\x00');
+emit_start(_2E_str235)
+emit_string('LC_MONETARY\x00');
+emit_start(_2E_str336)
+emit_string('LC_NUMERIC\x00');
+emit_start(_2E_str437)
+emit_string('LC_TIME\x00');
+emit_start(_ZTVN4__rw10__rw_facetE)
+emit_32(0);
+emit_32(_ZTIN4__rw10__rw_facetE);
+emit_32(_ZN4__rw10__rw_facetD1Ev__index__);
+emit_32(_ZN4__rw10__rw_facetD0Ev__index__);
+emit_start(_2E_str538)
+emit_string('C\x00');
+emit_start(_ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE10std_facets)
+emit_32(_ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE13std_facet_buf);
+emit_start(_ZZN4__rw10__rw_facet9_C_manageEPS0_NS0_13_C_facet_typeEPKcPFS1_jS4_EE17std_facet_bufsize)
+emit_32(416);
+emit_start(_ZZN4__rw10__rw_facetD4EvE9destroyed)
+emit_string('*** destroyed facet ***\x00');
+emit_start(_ZN4__rw9__rw_catsE)
+emit_32(1);
+emit_32(_2E_str33);
+emit_32(8193);
+emit_32(2);
+emit_32(_2E_str134);
+emit_32(49158);
+emit_32(3);
+emit_32(_2E_str235);
+emit_32(983160);
+emit_32(4);
+emit_32(_2E_str336);
+emit_32(7340928);
+emit_32(5);
+emit_32(_2E_str437);
+emit_32(25168896);
+emit_32(1);
+emit_32(_2E_str33);
+emit_32(8193);
+emit_start(_2E_str785)
+emit_string(';\x00');
+emit_start(_ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE7locales)
+emit_32(_ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE10locale_buf);
+emit_start(_ZZN4__rw11__rw_locale9_C_manageEPS0_PKcE14locale_bufsize)
+emit_32(8);
+emit_start(_2E_str292167)
+emit_string('LC_\x00');
+emit_start(_2E_str10100175)
+emit_string('locale::locale (const char*)\x00');
+emit_start(_2E_str12102177)
+emit_string('../stdcxx/locale_combine.cpp:650\x00');
+emit_start(_ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE8catalogs)
+emit_32(_ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE11catalog_buf);
+emit_start(_ZZN4__rwL20__rw_manage_cat_dataERiPNS_18__rw_open_cat_dataEE15catalog_bufsize)
+emit_32(8);
+emit_start(_2E_str115180)
+emit_string('../stdcxx/messages.cpp:308\x00');
+emit_start(_2E_str1116181)
+emit_string('__rw_cat_close (int cat)\x00');
+emit_start(_2E_str2131)
+emit_string('.\x00');
+emit_start(_2E_str4133)
+emit_string(',\x00');
+emit_start(_ZTVSt8messagesIcE)
+emit_32(0);
+emit_32(_ZTISt8messagesIcE);
+emit_32(_ZNSt8messagesIcED1Ev__index__);
+emit_32(_ZNSt8messagesIcED0Ev__index__);
+emit_32(_ZNKSt8messagesIcE7do_openERKSsRKSt6locale__index__);
+emit_32(_ZNKSt8messagesIcE6do_getEiiiRKSs__index__);
+emit_32(_ZNKSt8messagesIcE8do_closeEi__index__);
+emit_start(_ZTISt8messagesIcE)
+emit_32(_ZTVN10__cxxabiv121__vmi_class_type_infoE+8);
+emit_32(_ZTSSt8messagesIcE);
+emit_32(0);
+emit_32(2);
+emit_32(_ZTIN4__rw10__rw_facetE);
+emit_32(2);
+emit_32(_ZTISt13messages_base);
+emit_32(2);
+emit_start(_ZTSSt8messagesIcE)
+emit_string('St8messagesIcE\x00');
+emit_start(_ZTISt13messages_base)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSSt13messages_base);
+emit_start(_ZTSSt13messages_base)
+emit_string('St13messages_base\x00');
+emit_start(_2E_str2360)
+emit_string('../stdcxx/include/string.cc:88\x00');
+emit_start(_2E_str3361)
+emit_string('basic_string::_C_get_rep (size_type, size_type)\x00');
+emit_start(_2E_str4362)
+emit_string('../stdcxx/include/string.cc:95\x00');
+emit_start(_ZTVSt9type_info)
+emit_32(0);
+emit_32(_ZTISt9type_info);
+emit_32(_ZNSt9type_infoD1Ev__index__);
+emit_32(_ZNSt9type_infoD0Ev__index__);
+emit_32(_ZNKSt9type_info15__is_function_pEv__index__);
+emit_32(_ZNKSt9type_info10__do_catchEPKS_PPvj__index__);
+emit_start(_ZTISt9type_info)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTSSt9type_info);
+emit_start(_ZTSSt9type_info)
+emit_string('St9type_info\x00');
+emit_start(_2E_str643)
+emit_string('tlsf_create: Pool size must be between %d and %d bytes.\x0a\x00');
+emit_start(_2E_str1648)
+emit_string('rb\x00');
+emit_start(_2E_str4651)
+emit_string('rb+\x00');
+emit_start(_2E_str5652)
+emit_string('wb+\x00');
+emit_start(my_ctype)
+emit_32(0);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(40);
+emit_32(40);
+emit_32(40);
+emit_32(40);
+emit_32(40);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(32);
+emit_32(72);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(132);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(129);
+emit_32(129);
+emit_32(129);
+emit_32(129);
+emit_32(129);
+emit_32(129);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(1);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(130);
+emit_32(130);
+emit_32(130);
+emit_32(130);
+emit_32(130);
+emit_32(130);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(2);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(16);
+emit_32(32);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_32(0);
+emit_start(_ZL8nextRand)
+emit_32(1);
+emit_start(_2E_str7654)
+emit_string('inf\x00');
+emit_start(_2E_str9655)
+emit_string('nan\x00');
+emit_start(_ZL8pad_line)
+emit_string('                \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00');
+emit_string('0000000000000000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00');
+emit_start(_ZTI14CFileInterface)
+emit_32(_ZTVN10__cxxabiv117__class_type_infoE+8);
+emit_32(_ZTS14CFileInterface);
+emit_start(_ZTS14CFileInterface)
+emit_string('14CFileInterface\x00');
+emit_start(_ZTV11CFileSystem)
+emit_32(0);
+emit_32(_ZTI11CFileSystem);
+emit_32(_ZNK11CFileSystem12IsFileSystemEv__index__);
+emit_32(_ZN11CFileSystem5freadEPvjj__index__);
+emit_32(_ZN11CFileSystem6fwriteEPKvjj__index__);
+emit_32(_ZN11CFileSystem6fflushEv__index__);
+emit_32(_ZN11CFileSystem6fcloseEv__index__);
+emit_32(_ZN11CFileSystem5ftellEv__index__);
+emit_32(_ZN11CFileSystem4feofEv__index__);
+emit_32(_ZN11CFileSystem5fseekEli__index__);
+emit_32(_ZN11CFileSystem6ungetcEi__index__);
+emit_start(_ZTI11CFileSystem)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS11CFileSystem);
+emit_32(_ZTI14CFileInterface);
+emit_start(_ZTS11CFileSystem)
+emit_string('11CFileSystem\x00');
+emit_start(_ZL13s_file_stdout)
+emit_32(_ZTV11CFileStdout+8);
+emit_start(_ZTV7CFileLS)
+emit_32(0);
+emit_32(_ZTI7CFileLS);
+emit_32(_ZNK14CFileInterface12IsFileSystemEv__index__);
+emit_32(_ZN7CFileLS5freadEPvjj__index__);
+emit_32(_ZN7CFileLS6fwriteEPKvjj__index__);
+emit_32(_ZN7CFileLS6fflushEv__index__);
+emit_32(_ZN7CFileLS6fcloseEv__index__);
+emit_32(_ZN7CFileLS5ftellEv__index__);
+emit_32(_ZN7CFileLS4feofEv__index__);
+emit_32(_ZN7CFileLS5fseekEli__index__);
+emit_32(_ZN7CFileLS6ungetcEi__index__);
+emit_start(_ZTI7CFileLS)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS7CFileLS);
+emit_32(_ZTI14CFileInterface);
+emit_start(_ZTS7CFileLS)
+emit_string('7CFileLS\x00');
+emit_start(_ZTV10CFileCloud)
+emit_32(0);
+emit_32(_ZTI10CFileCloud);
+emit_32(_ZNK14CFileInterface12IsFileSystemEv__index__);
+emit_32(_ZN10CFileCloud5freadEPvjj__index__);
+emit_32(_ZN10CFileCloud6fwriteEPKvjj__index__);
+emit_32(_ZN10CFileCloud6fflushEv__index__);
+emit_32(_ZN10CFileCloud6fcloseEv__index__);
+emit_32(_ZN10CFileCloud5ftellEv__index__);
+emit_32(_ZN10CFileCloud4feofEv__index__);
+emit_32(_ZN10CFileCloud5fseekEli__index__);
+emit_32(_ZN10CFileCloud6ungetcEi__index__);
+emit_start(_ZTI10CFileCloud)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS10CFileCloud);
+emit_32(_ZTI14CFileInterface);
+emit_start(_ZTS10CFileCloud)
+emit_string('10CFileCloud\x00');
+emit_start(_ZTV11CFileStdout)
+emit_32(0);
+emit_32(_ZTI11CFileStdout);
+emit_32(_ZNK14CFileInterface12IsFileSystemEv__index__);
+emit_32(_ZN11CFileStdout5freadEPvjj__index__);
+emit_32(_ZN11CFileStdout6fwriteEPKvjj__index__);
+emit_32(_ZN11CFileStdout6fflushEv__index__);
+emit_32(_ZN11CFileStdout6fcloseEv__index__);
+emit_32(_ZN11CFileStdout5ftellEv__index__);
+emit_32(_ZN11CFileStdout4feofEv__index__);
+emit_32(_ZN11CFileStdout5fseekEli__index__);
+emit_32(_ZN11CFileStdout6ungetcEi__index__);
+emit_start(_ZTI11CFileStdout)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTS11CFileStdout);
+emit_32(_ZTI14CFileInterface);
+emit_start(_ZTS11CFileStdout)
+emit_string('11CFileStdout\x00');
+emit_start(_2E_str31677)
+emit_string('r+b\x00');
+emit_start(_2E_str32678)
+emit_string('w+b\x00');
+emit_start(_2E_str33679)
+emit_string('/ls/\x00');
+emit_start(_2E_str34680)
+emit_string('/cloud/\x00');
+emit_start(_2E_str35681)
+emit_string('trying to open file (%s) with write attributes (%s)\x0a\x00');
+emit_start(_2E_str37683)
+emit_string('/ls\x00');
+emit_start(_2E_str38684)
+emit_string('(null)\x00');
+emit_start(_ZN12mandreel_b64L9b64_charsE)
+emit_string('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\x00');
+emit_start(_ZN12mandreel_b64L11b64_indexesE)
+emit_string('\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff>\xff\xff\xff?456789:;<=\xff\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\xff\xff\xff\xff\xff\xff\x1a\x1b\x1c\x1d\x1e\x1f !\x22#$%&\x27()*+,-./0123\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff');
+emit_start(_ZL25s_mandreel_internal_width)
+emit_32(1024);
+emit_start(_ZL26s_mandreel_internal_height)
+emit_32(768);
+emit_start(_2E_str779)
+emit_string('mandreel.fat\x00');
+emit_start(_2E_str3782)
+emit_string('asynctexture\x00');
+emit_start(_2E_str4783)
+emit_string('warning: asynctexture data not valid\x00');
+emit_start(_2E_str5784)
+emit_string('packtexture\x00');
+emit_start(_2E_str6785)
+emit_string('unpackedtextures\x00');
+emit_start(_ZTVN10__cxxabiv120__si_class_type_infoE)
+emit_32(0);
+emit_32(_ZTIN10__cxxabiv120__si_class_type_infoE);
+emit_32(_ZN10__cxxabiv120__si_class_type_infoD1Ev__index__);
+emit_32(_ZN10__cxxabiv120__si_class_type_infoD0Ev__index__);
+emit_32(_ZNKSt9type_info15__is_function_pEv__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv__index__);
+emit_32(_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE__index__);
+emit_32(_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE__index__);
+emit_32(_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2___index__);
+emit_start(_ZTIN10__cxxabiv120__si_class_type_infoE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN10__cxxabiv120__si_class_type_infoE);
+emit_32(_ZTIN10__cxxabiv117__class_type_infoE);
+emit_start(_ZTSN10__cxxabiv120__si_class_type_infoE)
+emit_string('N10__cxxabiv120__si_class_type_infoE\x00');
+emit_start(_ZTIN10__cxxabiv117__class_type_infoE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN10__cxxabiv117__class_type_infoE);
+emit_32(_ZTISt9type_info);
+emit_start(_ZTSN10__cxxabiv117__class_type_infoE)
+emit_string('N10__cxxabiv117__class_type_infoE\x00');
+emit_start(_ZTVN10__cxxabiv117__class_type_infoE)
+emit_32(0);
+emit_32(_ZTIN10__cxxabiv117__class_type_infoE);
+emit_32(_ZN10__cxxabiv117__class_type_infoD1Ev__index__);
+emit_32(_ZN10__cxxabiv117__class_type_infoD0Ev__index__);
+emit_32(_ZNKSt9type_info15__is_function_pEv__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2___index__);
+emit_start(_ZTVN10__cxxabiv121__vmi_class_type_infoE)
+emit_32(0);
+emit_32(_ZTIN10__cxxabiv121__vmi_class_type_infoE);
+emit_32(_ZN10__cxxabiv121__vmi_class_type_infoD1Ev__index__);
+emit_32(_ZN10__cxxabiv121__vmi_class_type_infoD0Ev__index__);
+emit_32(_ZNKSt9type_info15__is_function_pEv__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj__index__);
+emit_32(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv__index__);
+emit_32(_ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE__index__);
+emit_32(_ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE__index__);
+emit_32(_ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2___index__);
+emit_start(_ZTIN10__cxxabiv121__vmi_class_type_infoE)
+emit_32(_ZTVN10__cxxabiv120__si_class_type_infoE+8);
+emit_32(_ZTSN10__cxxabiv121__vmi_class_type_infoE);
+emit_32(_ZTIN10__cxxabiv117__class_type_infoE);
+emit_start(_ZTSN10__cxxabiv121__vmi_class_type_infoE)
+emit_string('N10__cxxabiv121__vmi_class_type_infoE\x00');
+emit_start(_2E_str221)
+emit_string('g_bInit\x00');
+emit_start(_2E_str1222)
+emit_string('MandreelAudioLib.cpp\x00');
+emit_start(_2E_str3224)
+emit_string('Mandreel_Audio_GetSoundDuration warning: sound duration not found(%s)\x0a\x00');
+emit_start(_2E_str4225)
+emit_string('sandbox\x00');
+emit_start(_2E_str12233)
+emit_string('%s%s\x00');
+emit_start(_2E_str22243)
+emit_string('LoadSoundDuractions\x0a\x00');
+emit_start(_2E_str24245)
+emit_string('error: mandreel.fat file not found. Maybe the working folder is not correctly set???\x0a\x00');
+emit_start(_2E_str26247)
+emit_string('version\x00');
+emit_start(_2E_str27248)
+emit_string('1.4\x00');
+emit_start(_2E_str28249)
+emit_string('ERROR: mandreel.fat version number is (%s) instead of (%s)\x0a\x00');
+emit_start(_2E_str29250)
+emit_string('audiofile\x00');
+emit_start(_2E_str30251)
+emit_string('??\x00');
+emit_start(_2E_str31252)
+emit_string('warning: audiofile(%s) duration can\x27t be read, invalid mandreel.fat file?\x0a\x00');
+emit_start(_2E_str32253)
+emit_string('file\x00');
+emit_start(_2E_str33254)
+emit_string('dir\x00');
+emit_start(_2E_str34255)
+emit_string('!g_bInit\x00');
+emit_start(_2E_str35256)
+emit_string('Mandreel_Audio_Init()\x00');
+emit_start(_ZL13s_fifo_errors)
+emit_32(0);
+emit_32(_ZL13s_fifo_errors+8);
+emit_32(0);
+emit_32(_ZL13s_fifo_errors+8);
+emit_32(0);
+emit_32(0);
+emit_start(llvm_2E_global_ctors)
+emit_32(65535);
+emit_32(_GLOBAL__I_Landscape02Vtx__index__);
+emit_32(65535);
+emit_32(_GLOBAL__I__ZN7btClockC2Ev__index__);
+emit_32(65535);
+emit_32(_GLOBAL__I__ZN4__rw9__catfindEPNS_8__rw_catE__index__);
+emit_32(65535);
+emit_32(_GLOBAL__I__mandreel_create_tcp_socket__index__);
+emit_32(65535);
+emit_32(_GLOBAL__I__ZN5my_gl14glAttachShaderEjj__index__);
+emit_start(llvm_2E_global_dtors)
+emit_32(65535);
+emit_32(_GLOBAL__D_Landscape02Vtx__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__Z6mymainiPPc__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__ZN19btGenericMemoryPool24allocate_from_free_nodesEj__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__ZN7btClockC2Ev__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__ZN4__rw9__catfindEPNS_8__rw_catE__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__ZN8OpenGLES12OpenGLESUtil15getCurrentErrorEv__index__);
+emit_32(65535);
+emit_32(_GLOBAL__D__ZN5my_gl14glAttachShaderEjj__index__);
+emit_start(llvm_2E_used)
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+emit_32(llvm_2E_eh_2E_catch_2E_all_2E_value);
+mandreel_call_constructors(llvm_2E_global_ctors,5,stackPos);
+}
+var _GLOBAL__D_Landscape02Vtx__index__ = register_delegate(_GLOBAL__D_Landscape02Vtx);
+var _GLOBAL__D__Z6mymainiPPc__index__ = register_delegate(_GLOBAL__D__Z6mymainiPPc);
+var _GLOBAL__D__ZN19btGenericMemoryPool24allocate_from_free_nodesEj__index__ = register_delegate(_GLOBAL__D__ZN19btGenericMemoryPool24allocate_from_free_nodesEj);
+var _GLOBAL__D__ZN4__rw9__catfindEPNS_8__rw_catE__index__ = register_delegate(_GLOBAL__D__ZN4__rw9__catfindEPNS_8__rw_catE);
+var _GLOBAL__D__ZN5my_gl14glAttachShaderEjj__index__ = register_delegate(_GLOBAL__D__ZN5my_gl14glAttachShaderEjj);
+var _GLOBAL__D__ZN7btClockC2Ev__index__ = register_delegate(_GLOBAL__D__ZN7btClockC2Ev);
+var _GLOBAL__D__ZN8OpenGLES12OpenGLESUtil15getCurrentErrorEv__index__ = register_delegate(_GLOBAL__D__ZN8OpenGLES12OpenGLESUtil15getCurrentErrorEv);
+var _GLOBAL__I_Landscape02Vtx__index__ = register_delegate(_GLOBAL__I_Landscape02Vtx);
+var _GLOBAL__I__ZN4__rw9__catfindEPNS_8__rw_catE__index__ = register_delegate(_GLOBAL__I__ZN4__rw9__catfindEPNS_8__rw_catE);
+var _GLOBAL__I__ZN5my_gl14glAttachShaderEjj__index__ = register_delegate(_GLOBAL__I__ZN5my_gl14glAttachShaderEjj);
+var _GLOBAL__I__ZN7btClockC2Ev__index__ = register_delegate(_GLOBAL__I__ZN7btClockC2Ev);
+var _GLOBAL__I__mandreel_create_tcp_socket__index__ = register_delegate(_GLOBAL__I__mandreel_create_tcp_socket);
+var _Z31MandreelDefaultDebugMsgCallbackiPKc__index__ = register_delegate(_Z31MandreelDefaultDebugMsgCallbackiPKc);
+var _ZN10CFileCloud4feofEv__index__ = register_delegate(_ZN10CFileCloud4feofEv);
+var _ZN10CFileCloud5freadEPvjj__index__ = register_delegate(_ZN10CFileCloud5freadEPvjj);
+var _ZN10CFileCloud5fseekEli__index__ = register_delegate(_ZN10CFileCloud5fseekEli);
+var _ZN10CFileCloud5ftellEv__index__ = register_delegate(_ZN10CFileCloud5ftellEv);
+var _ZN10CFileCloud6fcloseEv__index__ = register_delegate(_ZN10CFileCloud6fcloseEv);
+var _ZN10CFileCloud6fflushEv__index__ = register_delegate(_ZN10CFileCloud6fflushEv);
+var _ZN10CFileCloud6fwriteEPKvjj__index__ = register_delegate(_ZN10CFileCloud6fwriteEPKvjj);
+var _ZN10CFileCloud6ungetcEi__index__ = register_delegate(_ZN10CFileCloud6ungetcEi);
+var _ZN10__cxxabiv117__class_type_infoD0Ev__index__ = register_delegate(_ZN10__cxxabiv117__class_type_infoD0Ev);
+var _ZN10__cxxabiv117__class_type_infoD1Ev__index__ = register_delegate(_ZN10__cxxabiv117__class_type_infoD1Ev);
+var _ZN10__cxxabiv120__si_class_type_infoD0Ev__index__ = register_delegate(_ZN10__cxxabiv120__si_class_type_infoD0Ev);
+var _ZN10__cxxabiv120__si_class_type_infoD1Ev__index__ = register_delegate(_ZN10__cxxabiv120__si_class_type_infoD1Ev);
+var _ZN10__cxxabiv121__vmi_class_type_infoD0Ev__index__ = register_delegate(_ZN10__cxxabiv121__vmi_class_type_infoD0Ev);
+var _ZN10__cxxabiv121__vmi_class_type_infoD1Ev__index__ = register_delegate(_ZN10__cxxabiv121__vmi_class_type_infoD1Ev);
+var _ZN10btBoxShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN10btBoxShape15setLocalScalingERK9btVector3);
+var _ZN10btBoxShape9setMarginEf__index__ = register_delegate(_ZN10btBoxShape9setMarginEf);
+var _ZN10btBoxShapeD0Ev__index__ = register_delegate(_ZN10btBoxShapeD0Ev);
+var _ZN10btBoxShapeD1Ev__index__ = register_delegate(_ZN10btBoxShapeD1Ev);
+var _ZN11CFileStdout4feofEv__index__ = register_delegate(_ZN11CFileStdout4feofEv);
+var _ZN11CFileStdout5freadEPvjj__index__ = register_delegate(_ZN11CFileStdout5freadEPvjj);
+var _ZN11CFileStdout5fseekEli__index__ = register_delegate(_ZN11CFileStdout5fseekEli);
+var _ZN11CFileStdout5ftellEv__index__ = register_delegate(_ZN11CFileStdout5ftellEv);
+var _ZN11CFileStdout6fcloseEv__index__ = register_delegate(_ZN11CFileStdout6fcloseEv);
+var _ZN11CFileStdout6fflushEv__index__ = register_delegate(_ZN11CFileStdout6fflushEv);
+var _ZN11CFileStdout6fwriteEPKvjj__index__ = register_delegate(_ZN11CFileStdout6fwriteEPKvjj);
+var _ZN11CFileStdout6ungetcEi__index__ = register_delegate(_ZN11CFileStdout6ungetcEi);
+var _ZN11CFileSystem4feofEv__index__ = register_delegate(_ZN11CFileSystem4feofEv);
+var _ZN11CFileSystem5freadEPvjj__index__ = register_delegate(_ZN11CFileSystem5freadEPvjj);
+var _ZN11CFileSystem5fseekEli__index__ = register_delegate(_ZN11CFileSystem5fseekEli);
+var _ZN11CFileSystem5ftellEv__index__ = register_delegate(_ZN11CFileSystem5ftellEv);
+var _ZN11CFileSystem6fcloseEv__index__ = register_delegate(_ZN11CFileSystem6fcloseEv);
+var _ZN11CFileSystem6fflushEv__index__ = register_delegate(_ZN11CFileSystem6fflushEv);
+var _ZN11CFileSystem6fwriteEPKvjj__index__ = register_delegate(_ZN11CFileSystem6fwriteEPKvjj);
+var _ZN11CFileSystem6ungetcEi__index__ = register_delegate(_ZN11CFileSystem6ungetcEi);
+var _ZN11btRigidBody24checkCollideWithOverrideEP17btCollisionObject__index__ = register_delegate(_ZN11btRigidBody24checkCollideWithOverrideEP17btCollisionObject);
+var _ZN11btRigidBodyD0Ev__index__ = register_delegate(_ZN11btRigidBodyD0Ev);
+var _ZN11btRigidBodyD1Ev__index__ = register_delegate(_ZN11btRigidBodyD1Ev);
+var _ZN12btAxisSweep3D0Ev__index__ = register_delegate(_ZN12btAxisSweep3D0Ev);
+var _ZN12btAxisSweep3D1Ev__index__ = register_delegate(_ZN12btAxisSweep3D1Ev);
+var _ZN12btConvexCast10CastResult15drawCoordSystemERK11btTransform__index__ = register_delegate(_ZN12btConvexCast10CastResult15drawCoordSystemERK11btTransform);
+var _ZN12btConvexCast10CastResult9DebugDrawEf__index__ = register_delegate(_ZN12btConvexCast10CastResult9DebugDrawEf);
+var _ZN12btConvexCast10CastResultD0Ev__index__ = register_delegate(_ZN12btConvexCast10CastResultD0Ev);
+var _ZN12btConvexCast10CastResultD1Ev__index__ = register_delegate(_ZN12btConvexCast10CastResultD1Ev);
+var _ZN12btConvexCastD0Ev__index__ = register_delegate(_ZN12btConvexCastD0Ev);
+var _ZN12btConvexCastD1Ev__index__ = register_delegate(_ZN12btConvexCastD1Ev);
+var _ZN12btDispatcherD0Ev__index__ = register_delegate(_ZN12btDispatcherD0Ev);
+var _ZN12btDispatcherD1Ev__index__ = register_delegate(_ZN12btDispatcherD1Ev);
+var _ZN13BenchmarkDemo15displayCallbackEv__index__ = register_delegate(_ZN13BenchmarkDemo15displayCallbackEv);
+var _ZN13BenchmarkDemo20clientMoveAndDisplayEv__index__ = register_delegate(_ZN13BenchmarkDemo20clientMoveAndDisplayEv);
+var _ZN13BenchmarkDemoD0Ev__index__ = register_delegate(_ZN13BenchmarkDemoD0Ev);
+var _ZN13BenchmarkDemoD1Ev__index__ = register_delegate(_ZN13BenchmarkDemoD1Ev);
+var _ZN13btConvexShapeD0Ev__index__ = register_delegate(_ZN13btConvexShapeD0Ev);
+var _ZN13btConvexShapeD1Ev__index__ = register_delegate(_ZN13btConvexShapeD1Ev);
+var _ZN13btSphereShape9setMarginEf__index__ = register_delegate(_ZN13btSphereShape9setMarginEf);
+var _ZN13btSphereShapeD0Ev__index__ = register_delegate(_ZN13btSphereShapeD0Ev);
+var _ZN13btSphereShapeD1Ev__index__ = register_delegate(_ZN13btSphereShapeD1Ev);
+var _ZN14BenchmarkDemo4D0Ev__index__ = register_delegate(_ZN14BenchmarkDemo4D0Ev);
+var _ZN14BenchmarkDemo4D1Ev__index__ = register_delegate(_ZN14BenchmarkDemo4D1Ev);
+var _ZN14btCapsuleShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN14btCapsuleShape15setLocalScalingERK9btVector3);
+var _ZN14btCapsuleShape9setMarginEf__index__ = register_delegate(_ZN14btCapsuleShape9setMarginEf);
+var _ZN14btCapsuleShapeD0Ev__index__ = register_delegate(_ZN14btCapsuleShapeD0Ev);
+var _ZN14btCapsuleShapeD1Ev__index__ = register_delegate(_ZN14btCapsuleShapeD1Ev);
+var _ZN14btConcaveShape9setMarginEf__index__ = register_delegate(_ZN14btConcaveShape9setMarginEf);
+var _ZN14btConcaveShapeD0Ev__index__ = register_delegate(_ZN14btConcaveShapeD0Ev);
+var _ZN14btConcaveShapeD1Ev__index__ = register_delegate(_ZN14btConcaveShapeD1Ev);
+var _ZN14btOptimizedBvhD0Ev__index__ = register_delegate(_ZN14btOptimizedBvhD0Ev);
+var _ZN14btOptimizedBvhD1Ev__index__ = register_delegate(_ZN14btOptimizedBvhD1Ev);
+var _ZN14btQuantizedBvh16deSerializeFloatER23btQuantizedBvhFloatData__index__ = register_delegate(_ZN14btQuantizedBvh16deSerializeFloatER23btQuantizedBvhFloatData);
+var _ZN14btQuantizedBvh17deSerializeDoubleER24btQuantizedBvhDoubleData__index__ = register_delegate(_ZN14btQuantizedBvh17deSerializeDoubleER24btQuantizedBvhDoubleData);
+var _ZN14btQuantizedBvhD0Ev__index__ = register_delegate(_ZN14btQuantizedBvhD0Ev);
+var _ZN14btQuantizedBvhD1Ev__index__ = register_delegate(_ZN14btQuantizedBvhD1Ev);
+var _ZN15DemoApplication16getDynamicsWorldEv__index__ = register_delegate(_ZN15DemoApplication16getDynamicsWorldEv);
+var _ZN15DemoApplication20localCreateRigidBodyEfRK11btTransformP16btCollisionShape__index__ = register_delegate(_ZN15DemoApplication20localCreateRigidBodyEfRK11btTransformP16btCollisionShape);
+var _ZN15DemoApplication6myinitEv__index__ = register_delegate(_ZN15DemoApplication6myinitEv);
+var _ZN15btDynamicsWorld10addVehicleEP17btActionInterface__index__ = register_delegate(_ZN15btDynamicsWorld10addVehicleEP17btActionInterface);
+var _ZN15btDynamicsWorld12addCharacterEP17btActionInterface__index__ = register_delegate(_ZN15btDynamicsWorld12addCharacterEP17btActionInterface);
+var _ZN15btDynamicsWorld13addConstraintEP17btTypedConstraintb__index__ = register_delegate(_ZN15btDynamicsWorld13addConstraintEP17btTypedConstraintb);
+var _ZN15btDynamicsWorld13getConstraintEi__index__ = register_delegate(_ZN15btDynamicsWorld13getConstraintEi);
+var _ZN15btDynamicsWorld13removeVehicleEP17btActionInterface__index__ = register_delegate(_ZN15btDynamicsWorld13removeVehicleEP17btActionInterface);
+var _ZN15btDynamicsWorld15removeCharacterEP17btActionInterface__index__ = register_delegate(_ZN15btDynamicsWorld15removeCharacterEP17btActionInterface);
+var _ZN15btDynamicsWorld16removeConstraintEP17btTypedConstraint__index__ = register_delegate(_ZN15btDynamicsWorld16removeConstraintEP17btTypedConstraint);
+var _ZN15btDynamicsWorldD0Ev__index__ = register_delegate(_ZN15btDynamicsWorldD0Ev);
+var _ZN15btDynamicsWorldD1Ev__index__ = register_delegate(_ZN15btDynamicsWorldD1Ev);
+var _ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__ = register_delegate(_ZN15btGjkConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE);
+var _ZN15btGjkConvexCastD0Ev__index__ = register_delegate(_ZN15btGjkConvexCastD0Ev);
+var _ZN15btGjkConvexCastD1Ev__index__ = register_delegate(_ZN15btGjkConvexCastD1Ev);
+var _ZN15btNullPairCache18addOverlappingPairEP17btBroadphaseProxyS1___index__ = register_delegate(_ZN15btNullPairCache18addOverlappingPairEP17btBroadphaseProxyS1_);
+var _ZN15btNullPairCache18hasDeferredRemovalEv__index__ = register_delegate(_ZN15btNullPairCache18hasDeferredRemovalEv);
+var _ZN15btNullPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher);
+var _ZN15btNullPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher);
+var _ZN15btNullPairCache20sortOverlappingPairsEP12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache20sortOverlappingPairsEP12btDispatcher);
+var _ZN15btNullPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher);
+var _ZN15btNullPairCache23getOverlappingPairArrayEv__index__ = register_delegate(_ZN15btNullPairCache23getOverlappingPairArrayEv);
+var _ZN15btNullPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback__index__ = register_delegate(_ZN15btNullPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback);
+var _ZN15btNullPairCache26getOverlappingPairArrayPtrEv__index__ = register_delegate(_ZN15btNullPairCache26getOverlappingPairArrayPtrEv);
+var _ZN15btNullPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher);
+var _ZN15btNullPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback__index__ = register_delegate(_ZN15btNullPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback);
+var _ZN15btNullPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN15btNullPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher);
+var _ZN15btNullPairCache8findPairEP17btBroadphaseProxyS1___index__ = register_delegate(_ZN15btNullPairCache8findPairEP17btBroadphaseProxyS1_);
+var _ZN15btNullPairCacheD0Ev__index__ = register_delegate(_ZN15btNullPairCacheD0Ev);
+var _ZN15btNullPairCacheD1Ev__index__ = register_delegate(_ZN15btNullPairCacheD1Ev);
+var _ZN15btTriangleShapeD0Ev__index__ = register_delegate(_ZN15btTriangleShapeD0Ev);
+var _ZN15btTriangleShapeD1Ev__index__ = register_delegate(_ZN15btTriangleShapeD1Ev);
+var _ZN16btBoxBoxDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__ = register_delegate(_ZN16btBoxBoxDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb);
+var _ZN16btBoxBoxDetectorD0Ev__index__ = register_delegate(_ZN16btBoxBoxDetectorD0Ev);
+var _ZN16btBoxBoxDetectorD1Ev__index__ = register_delegate(_ZN16btBoxBoxDetectorD1Ev);
+var _ZN16btCollisionWorld11updateAabbsEv__index__ = register_delegate(_ZN16btCollisionWorld11updateAabbsEv);
+var _ZN16btCollisionWorld14debugDrawWorldEv__index__ = register_delegate(_ZN16btCollisionWorld14debugDrawWorldEv);
+var _ZN16btCollisionWorld14getDebugDrawerEv__index__ = register_delegate(_ZN16btCollisionWorld14getDebugDrawerEv);
+var _ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw__index__ = register_delegate(_ZN16btCollisionWorld14setDebugDrawerEP12btIDebugDraw);
+var _ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3__index__ = register_delegate(_ZN16btCollisionWorld15debugDrawObjectERK11btTransformPK16btCollisionShapeRK9btVector3);
+var _ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss__index__ = register_delegate(_ZN16btCollisionWorld18addCollisionObjectEP17btCollisionObjectss);
+var _ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject__index__ = register_delegate(_ZN16btCollisionWorld21removeCollisionObjectEP17btCollisionObject);
+var _ZN16btCollisionWorld24ClosestRayResultCallback15addSingleResultERNS_14LocalRayResultEb__index__ = register_delegate(_ZN16btCollisionWorld24ClosestRayResultCallback15addSingleResultERNS_14LocalRayResultEb);
+var _ZN16btCollisionWorld24ClosestRayResultCallbackD0Ev__index__ = register_delegate(_ZN16btCollisionWorld24ClosestRayResultCallbackD0Ev);
+var _ZN16btCollisionWorld24ClosestRayResultCallbackD1Ev__index__ = register_delegate(_ZN16btCollisionWorld24ClosestRayResultCallbackD1Ev);
+var _ZN16btCollisionWorld27ClosestConvexResultCallback15addSingleResultERNS_17LocalConvexResultEb__index__ = register_delegate(_ZN16btCollisionWorld27ClosestConvexResultCallback15addSingleResultERNS_17LocalConvexResultEb);
+var _ZN16btCollisionWorld27ClosestConvexResultCallbackD0Ev__index__ = register_delegate(_ZN16btCollisionWorld27ClosestConvexResultCallbackD0Ev);
+var _ZN16btCollisionWorld27ClosestConvexResultCallbackD1Ev__index__ = register_delegate(_ZN16btCollisionWorld27ClosestConvexResultCallbackD1Ev);
+var _ZN16btCollisionWorld33performDiscreteCollisionDetectionEv__index__ = register_delegate(_ZN16btCollisionWorld33performDiscreteCollisionDetectionEv);
+var _ZN16btCollisionWorld9serializeEP12btSerializer__index__ = register_delegate(_ZN16btCollisionWorld9serializeEP12btSerializer);
+var _ZN16btCollisionWorldD0Ev__index__ = register_delegate(_ZN16btCollisionWorldD0Ev);
+var _ZN16btCollisionWorldD1Ev__index__ = register_delegate(_ZN16btCollisionWorldD1Ev);
+var _ZN16btDbvtBroadphase10printStatsEv__index__ = register_delegate(_ZN16btDbvtBroadphase10printStatsEv);
+var _ZN16btDbvtBroadphase11createProxyERK9btVector3S2_iPvssP12btDispatcherS3___index__ = register_delegate(_ZN16btDbvtBroadphase11createProxyERK9btVector3S2_iPvssP12btDispatcherS3_);
+var _ZN16btDbvtBroadphase12destroyProxyEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN16btDbvtBroadphase12destroyProxyEP17btBroadphaseProxyP12btDispatcher);
+var _ZN16btDbvtBroadphase23getOverlappingPairCacheEv__index__ = register_delegate(_ZN16btDbvtBroadphase23getOverlappingPairCacheEv);
+var _ZN16btDbvtBroadphase25calculateOverlappingPairsEP12btDispatcher__index__ = register_delegate(_ZN16btDbvtBroadphase25calculateOverlappingPairsEP12btDispatcher);
+var _ZN16btDbvtBroadphase7rayTestERK9btVector3S2_R23btBroadphaseRayCallbackS2_S2___index__ = register_delegate(_ZN16btDbvtBroadphase7rayTestERK9btVector3S2_R23btBroadphaseRayCallbackS2_S2_);
+var _ZN16btDbvtBroadphase7setAabbEP17btBroadphaseProxyRK9btVector3S4_P12btDispatcher__index__ = register_delegate(_ZN16btDbvtBroadphase7setAabbEP17btBroadphaseProxyRK9btVector3S4_P12btDispatcher);
+var _ZN16btDbvtBroadphase8aabbTestERK9btVector3S2_R24btBroadphaseAabbCallback__index__ = register_delegate(_ZN16btDbvtBroadphase8aabbTestERK9btVector3S2_R24btBroadphaseAabbCallback);
+var _ZN16btDbvtBroadphase9resetPoolEP12btDispatcher__index__ = register_delegate(_ZN16btDbvtBroadphase9resetPoolEP12btDispatcher);
+var _ZN16btDbvtBroadphaseD0Ev__index__ = register_delegate(_ZN16btDbvtBroadphaseD0Ev);
+var _ZN16btDbvtBroadphaseD1Ev__index__ = register_delegate(_ZN16btDbvtBroadphaseD1Ev);
+var _ZN16btEmptyAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN16btEmptyAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN16btEmptyAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN16btEmptyAlgorithm10CreateFuncD0Ev);
+var _ZN16btEmptyAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN16btEmptyAlgorithm10CreateFuncD1Ev);
+var _ZN16btEmptyAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN16btEmptyAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN16btEmptyAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN16btEmptyAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN16btEmptyAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN16btEmptyAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN16btEmptyAlgorithmD0Ev__index__ = register_delegate(_ZN16btEmptyAlgorithmD0Ev);
+var _ZN16btEmptyAlgorithmD1Ev__index__ = register_delegate(_ZN16btEmptyAlgorithmD1Ev);
+var _ZN16btManifoldResult15addContactPointERK9btVector3S2_f__index__ = register_delegate(_ZN16btManifoldResult15addContactPointERK9btVector3S2_f);
+var _ZN16btManifoldResult20setShapeIdentifiersAEii__index__ = register_delegate(_ZN16btManifoldResult20setShapeIdentifiersAEii);
+var _ZN16btManifoldResult20setShapeIdentifiersBEii__index__ = register_delegate(_ZN16btManifoldResult20setShapeIdentifiersBEii);
+var _ZN16btManifoldResultD0Ev__index__ = register_delegate(_ZN16btManifoldResultD0Ev);
+var _ZN16btManifoldResultD1Ev__index__ = register_delegate(_ZN16btManifoldResultD1Ev);
+var _ZN16btPointCollector15addContactPointERK9btVector3S2_f__index__ = register_delegate(_ZN16btPointCollector15addContactPointERK9btVector3S2_f);
+var _ZN16btPointCollector20setShapeIdentifiersAEii__index__ = register_delegate(_ZN16btPointCollector20setShapeIdentifiersAEii);
+var _ZN16btPointCollector20setShapeIdentifiersBEii__index__ = register_delegate(_ZN16btPointCollector20setShapeIdentifiersBEii);
+var _ZN16btPointCollectorD0Ev__index__ = register_delegate(_ZN16btPointCollectorD0Ev);
+var _ZN16btPointCollectorD1Ev__index__ = register_delegate(_ZN16btPointCollectorD1Ev);
+var _ZN17DebugDrawcallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZN17DebugDrawcallback15processTriangleEP9btVector3ii);
+var _ZN17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii__index__ = register_delegate(_ZN17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii);
+var _ZN17DebugDrawcallbackD0Ev__index__ = register_delegate(_ZN17DebugDrawcallbackD0Ev);
+var _ZN17DebugDrawcallbackD1Ev__index__ = register_delegate(_ZN17DebugDrawcallbackD1Ev);
+var _ZN17btCollisionObject17setCollisionShapeEP16btCollisionShape__index__ = register_delegate(_ZN17btCollisionObject17setCollisionShapeEP16btCollisionShape);
+var _ZN17btCollisionObject24checkCollideWithOverrideEPS___index__ = register_delegate(_ZN17btCollisionObject24checkCollideWithOverrideEPS_);
+var _ZN17btCollisionObjectD0Ev__index__ = register_delegate(_ZN17btCollisionObjectD0Ev);
+var _ZN17btCollisionObjectD1Ev__index__ = register_delegate(_ZN17btCollisionObjectD1Ev);
+var _ZN17btConvexHullShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN17btConvexHullShape15setLocalScalingERK9btVector3);
+var _ZN17btConvexHullShapeD0Ev__index__ = register_delegate(_ZN17btConvexHullShapeD0Ev);
+var _ZN17btConvexHullShapeD1Ev__index__ = register_delegate(_ZN17btConvexHullShapeD1Ev);
+var _ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__ = register_delegate(_ZN17btGjkPairDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb);
+var _ZN17btGjkPairDetectorD0Ev__index__ = register_delegate(_ZN17btGjkPairDetectorD0Ev);
+var _ZN17btGjkPairDetectorD1Ev__index__ = register_delegate(_ZN17btGjkPairDetectorD1Ev);
+var _ZN17btHingeConstraint13buildJacobianEv__index__ = register_delegate(_ZN17btHingeConstraint13buildJacobianEv);
+var _ZN17btHingeConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E__index__ = register_delegate(_ZN17btHingeConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E);
+var _ZN17btHingeConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E__index__ = register_delegate(_ZN17btHingeConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E);
+var _ZN17btHingeConstraint8setParamEifi__index__ = register_delegate(_ZN17btHingeConstraint8setParamEifi);
+var _ZN17btHingeConstraintD0Ev__index__ = register_delegate(_ZN17btHingeConstraintD0Ev);
+var _ZN17btHingeConstraintD1Ev__index__ = register_delegate(_ZN17btHingeConstraintD1Ev);
+var _ZN17btTypedConstraint21setupSolverConstraintER20btAlignedObjectArrayI18btSolverConstraintEiif__index__ = register_delegate(_ZN17btTypedConstraint21setupSolverConstraintER20btAlignedObjectArrayI18btSolverConstraintEiif);
+var _ZN17btTypedConstraint23solveConstraintObsoleteER11btRigidBodyS1_f__index__ = register_delegate(_ZN17btTypedConstraint23solveConstraintObsoleteER11btRigidBodyS1_f);
+var _ZN18btConstraintSolver12prepareSolveEii__index__ = register_delegate(_ZN18btConstraintSolver12prepareSolveEii);
+var _ZN18btConstraintSolver9allSolvedERK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN18btConstraintSolver9allSolvedERK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc);
+var _ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNode__index__ = register_delegate(_ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNode);
+var _ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNodeS2___index__ = register_delegate(_ZN18btDbvtTreeCollider7ProcessEPK10btDbvtNodeS2_);
+var _ZN18btDbvtTreeColliderD0Ev__index__ = register_delegate(_ZN18btDbvtTreeColliderD0Ev);
+var _ZN18btDbvtTreeColliderD1Ev__index__ = register_delegate(_ZN18btDbvtTreeColliderD1Ev);
+var _ZN18btTriangleCallbackD0Ev__index__ = register_delegate(_ZN18btTriangleCallbackD0Ev);
+var _ZN18btTriangleCallbackD1Ev__index__ = register_delegate(_ZN18btTriangleCallbackD1Ev);
+var _ZN19BroadphaseRayTester7ProcessEPK10btDbvtNode__index__ = register_delegate(_ZN19BroadphaseRayTester7ProcessEPK10btDbvtNode);
+var _ZN19BroadphaseRayTesterD0Ev__index__ = register_delegate(_ZN19BroadphaseRayTesterD0Ev);
+var _ZN19BroadphaseRayTesterD1Ev__index__ = register_delegate(_ZN19BroadphaseRayTesterD1Ev);
+var _ZN19btSingleRayCallback7processEPK17btBroadphaseProxy__index__ = register_delegate(_ZN19btSingleRayCallback7processEPK17btBroadphaseProxy);
+var _ZN19btSingleRayCallbackD0Ev__index__ = register_delegate(_ZN19btSingleRayCallbackD0Ev);
+var _ZN19btSingleRayCallbackD1Ev__index__ = register_delegate(_ZN19btSingleRayCallbackD1Ev);
+var _ZN19btTriangleMeshShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN19btTriangleMeshShape15setLocalScalingERK9btVector3);
+var _ZN19btTriangleMeshShapeD0Ev__index__ = register_delegate(_ZN19btTriangleMeshShapeD0Ev);
+var _ZN19btTriangleMeshShapeD1Ev__index__ = register_delegate(_ZN19btTriangleMeshShapeD1Ev);
+var _ZN20BroadphaseAabbTester7ProcessEPK10btDbvtNode__index__ = register_delegate(_ZN20BroadphaseAabbTester7ProcessEPK10btDbvtNode);
+var _ZN20BroadphaseAabbTesterD0Ev__index__ = register_delegate(_ZN20BroadphaseAabbTesterD0Ev);
+var _ZN20BroadphaseAabbTesterD1Ev__index__ = register_delegate(_ZN20BroadphaseAabbTesterD1Ev);
+var _ZN20btAxisSweep3InternalItE10printStatsEv__index__ = register_delegate(_ZN20btAxisSweep3InternalItE10printStatsEv);
+var _ZN20btAxisSweep3InternalItE11createProxyERK9btVector3S3_iPvssP12btDispatcherS4___index__ = register_delegate(_ZN20btAxisSweep3InternalItE11createProxyERK9btVector3S3_iPvssP12btDispatcherS4_);
+var _ZN20btAxisSweep3InternalItE12destroyProxyEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN20btAxisSweep3InternalItE12destroyProxyEP17btBroadphaseProxyP12btDispatcher);
+var _ZN20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__ = register_delegate(_ZN20btAxisSweep3InternalItE23getOverlappingPairCacheEv);
+var _ZN20btAxisSweep3InternalItE25calculateOverlappingPairsEP12btDispatcher__index__ = register_delegate(_ZN20btAxisSweep3InternalItE25calculateOverlappingPairsEP12btDispatcher);
+var _ZN20btAxisSweep3InternalItE7rayTestERK9btVector3S3_R23btBroadphaseRayCallbackS3_S3___index__ = register_delegate(_ZN20btAxisSweep3InternalItE7rayTestERK9btVector3S3_R23btBroadphaseRayCallbackS3_S3_);
+var _ZN20btAxisSweep3InternalItE7setAabbEP17btBroadphaseProxyRK9btVector3S5_P12btDispatcher__index__ = register_delegate(_ZN20btAxisSweep3InternalItE7setAabbEP17btBroadphaseProxyRK9btVector3S5_P12btDispatcher);
+var _ZN20btAxisSweep3InternalItE8aabbTestERK9btVector3S3_R24btBroadphaseAabbCallback__index__ = register_delegate(_ZN20btAxisSweep3InternalItE8aabbTestERK9btVector3S3_R24btBroadphaseAabbCallback);
+var _ZN20btAxisSweep3InternalItE9resetPoolEP12btDispatcher__index__ = register_delegate(_ZN20btAxisSweep3InternalItE9resetPoolEP12btDispatcher);
+var _ZN20btAxisSweep3InternalItED0Ev__index__ = register_delegate(_ZN20btAxisSweep3InternalItED0Ev);
+var _ZN20btAxisSweep3InternalItED1Ev__index__ = register_delegate(_ZN20btAxisSweep3InternalItED1Ev);
+var _ZN20btCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN20btCollisionAlgorithmD0Ev);
+var _ZN20btCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN20btCollisionAlgorithmD1Ev);
+var _ZN20btDefaultMotionState17setWorldTransformERK11btTransform__index__ = register_delegate(_ZN20btDefaultMotionState17setWorldTransformERK11btTransform);
+var _ZN20btDefaultMotionStateD0Ev__index__ = register_delegate(_ZN20btDefaultMotionStateD0Ev);
+var _ZN20btDefaultMotionStateD1Ev__index__ = register_delegate(_ZN20btDefaultMotionStateD1Ev);
+var _ZN21SupportVertexCallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZN21SupportVertexCallback15processTriangleEP9btVector3ii);
+var _ZN21SupportVertexCallbackD0Ev__index__ = register_delegate(_ZN21SupportVertexCallbackD0Ev);
+var _ZN21SupportVertexCallbackD1Ev__index__ = register_delegate(_ZN21SupportVertexCallbackD1Ev);
+var _ZN21btCollisionDispatcher13clearManifoldEP20btPersistentManifold__index__ = register_delegate(_ZN21btCollisionDispatcher13clearManifoldEP20btPersistentManifold);
+var _ZN21btCollisionDispatcher13findAlgorithmEP17btCollisionObjectS1_P20btPersistentManifold__index__ = register_delegate(_ZN21btCollisionDispatcher13findAlgorithmEP17btCollisionObjectS1_P20btPersistentManifold);
+var _ZN21btCollisionDispatcher13needsResponseEP17btCollisionObjectS1___index__ = register_delegate(_ZN21btCollisionDispatcher13needsResponseEP17btCollisionObjectS1_);
+var _ZN21btCollisionDispatcher14getNewManifoldEPvS0___index__ = register_delegate(_ZN21btCollisionDispatcher14getNewManifoldEPvS0_);
+var _ZN21btCollisionDispatcher14needsCollisionEP17btCollisionObjectS1___index__ = register_delegate(_ZN21btCollisionDispatcher14needsCollisionEP17btCollisionObjectS1_);
+var _ZN21btCollisionDispatcher15releaseManifoldEP20btPersistentManifold__index__ = register_delegate(_ZN21btCollisionDispatcher15releaseManifoldEP20btPersistentManifold);
+var _ZN21btCollisionDispatcher19defaultNearCallbackER16btBroadphasePairRS_RK16btDispatcherInfo__index__ = register_delegate(_ZN21btCollisionDispatcher19defaultNearCallbackER16btBroadphasePairRS_RK16btDispatcherInfo);
+var _ZN21btCollisionDispatcher22freeCollisionAlgorithmEPv__index__ = register_delegate(_ZN21btCollisionDispatcher22freeCollisionAlgorithmEPv);
+var _ZN21btCollisionDispatcher25dispatchAllCollisionPairsEP22btOverlappingPairCacheRK16btDispatcherInfoP12btDispatcher__index__ = register_delegate(_ZN21btCollisionDispatcher25dispatchAllCollisionPairsEP22btOverlappingPairCacheRK16btDispatcherInfoP12btDispatcher);
+var _ZN21btCollisionDispatcher26allocateCollisionAlgorithmEi__index__ = register_delegate(_ZN21btCollisionDispatcher26allocateCollisionAlgorithmEi);
+var _ZN21btCollisionDispatcher26getInternalManifoldPointerEv__index__ = register_delegate(_ZN21btCollisionDispatcher26getInternalManifoldPointerEv);
+var _ZN21btCollisionDispatcher26getManifoldByIndexInternalEi__index__ = register_delegate(_ZN21btCollisionDispatcher26getManifoldByIndexInternalEi);
+var _ZN21btCollisionDispatcherD0Ev__index__ = register_delegate(_ZN21btCollisionDispatcherD0Ev);
+var _ZN21btCollisionDispatcherD1Ev__index__ = register_delegate(_ZN21btCollisionDispatcherD1Ev);
+var _ZN21btConeTwistConstraint13buildJacobianEv__index__ = register_delegate(_ZN21btConeTwistConstraint13buildJacobianEv);
+var _ZN21btConeTwistConstraint23solveConstraintObsoleteER11btRigidBodyS1_f__index__ = register_delegate(_ZN21btConeTwistConstraint23solveConstraintObsoleteER11btRigidBodyS1_f);
+var _ZN21btConeTwistConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E__index__ = register_delegate(_ZN21btConeTwistConstraint8getInfo1EPN17btTypedConstraint17btConstraintInfo1E);
+var _ZN21btConeTwistConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E__index__ = register_delegate(_ZN21btConeTwistConstraint8getInfo2EPN17btTypedConstraint17btConstraintInfo2E);
+var _ZN21btConeTwistConstraint8setParamEifi__index__ = register_delegate(_ZN21btConeTwistConstraint8setParamEifi);
+var _ZN21btConeTwistConstraintD0Ev__index__ = register_delegate(_ZN21btConeTwistConstraintD0Ev);
+var _ZN21btConeTwistConstraintD1Ev__index__ = register_delegate(_ZN21btConeTwistConstraintD1Ev);
+var _ZN21btConvexInternalShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN21btConvexInternalShape15setLocalScalingERK9btVector3);
+var _ZN21btConvexInternalShape9setMarginEf__index__ = register_delegate(_ZN21btConvexInternalShape9setMarginEf);
+var _ZN21btSingleSweepCallback7processEPK17btBroadphaseProxy__index__ = register_delegate(_ZN21btSingleSweepCallback7processEPK17btBroadphaseProxy);
+var _ZN21btSingleSweepCallbackD0Ev__index__ = register_delegate(_ZN21btSingleSweepCallbackD0Ev);
+var _ZN21btSingleSweepCallbackD1Ev__index__ = register_delegate(_ZN21btSingleSweepCallbackD1Ev);
+var _ZN22SphereTriangleDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb__index__ = register_delegate(_ZN22SphereTriangleDetector16getClosestPointsERKN36btDiscreteCollisionDetectorInterface17ClosestPointInputERNS0_6ResultEP12btIDebugDrawb);
+var _ZN22SphereTriangleDetectorD0Ev__index__ = register_delegate(_ZN22SphereTriangleDetectorD0Ev);
+var _ZN22SphereTriangleDetectorD1Ev__index__ = register_delegate(_ZN22SphereTriangleDetectorD1Ev);
+var _ZN22btBvhTriangleMeshShape15setLocalScalingERK9btVector3__index__ = register_delegate(_ZN22btBvhTriangleMeshShape15setLocalScalingERK9btVector3);
+var _ZN22btBvhTriangleMeshShapeD0Ev__index__ = register_delegate(_ZN22btBvhTriangleMeshShapeD0Ev);
+var _ZN22btBvhTriangleMeshShapeD1Ev__index__ = register_delegate(_ZN22btBvhTriangleMeshShapeD1Ev);
+var _ZN22btCompoundLeafCallback7ProcessEPK10btDbvtNode__index__ = register_delegate(_ZN22btCompoundLeafCallback7ProcessEPK10btDbvtNode);
+var _ZN22btCompoundLeafCallbackD0Ev__index__ = register_delegate(_ZN22btCompoundLeafCallbackD0Ev);
+var _ZN22btCompoundLeafCallbackD1Ev__index__ = register_delegate(_ZN22btCompoundLeafCallbackD1Ev);
+var _ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__ = register_delegate(_ZN22btSubsimplexConvexCast16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE);
+var _ZN22btSubsimplexConvexCastD0Ev__index__ = register_delegate(_ZN22btSubsimplexConvexCastD0Ev);
+var _ZN22btSubsimplexConvexCastD1Ev__index__ = register_delegate(_ZN22btSubsimplexConvexCastD1Ev);
+var _ZN23btCollisionPairCallback14processOverlapER16btBroadphasePair__index__ = register_delegate(_ZN23btCollisionPairCallback14processOverlapER16btBroadphasePair);
+var _ZN23btCollisionPairCallbackD0Ev__index__ = register_delegate(_ZN23btCollisionPairCallbackD0Ev);
+var _ZN23btCollisionPairCallbackD1Ev__index__ = register_delegate(_ZN23btCollisionPairCallbackD1Ev);
+var _ZN23btConvexConvexAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN23btConvexConvexAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN23btConvexConvexAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN23btConvexConvexAlgorithm10CreateFuncD0Ev);
+var _ZN23btConvexConvexAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN23btConvexConvexAlgorithm10CreateFuncD1Ev);
+var _ZN23btConvexConvexAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN23btConvexConvexAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN23btConvexConvexAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN23btConvexConvexAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN23btConvexConvexAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN23btConvexConvexAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN23btConvexConvexAlgorithmD0Ev__index__ = register_delegate(_ZN23btConvexConvexAlgorithmD0Ev);
+var _ZN23btConvexConvexAlgorithmD1Ev__index__ = register_delegate(_ZN23btConvexConvexAlgorithmD1Ev);
+var _ZN23btDiscreteDynamicsWorld10addVehicleEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld10addVehicleEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld10setGravityERK9btVector3__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld10setGravityERK9btVector3);
+var _ZN23btDiscreteDynamicsWorld11clearForcesEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld11clearForcesEv);
+var _ZN23btDiscreteDynamicsWorld11setNumTasksEi__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld11setNumTasksEi);
+var _ZN23btDiscreteDynamicsWorld12addCharacterEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld12addCharacterEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBody__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBody);
+var _ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBodyss__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld12addRigidBodyEP11btRigidBodyss);
+var _ZN23btDiscreteDynamicsWorld12applyGravityEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld12applyGravityEv);
+var _ZN23btDiscreteDynamicsWorld12removeActionEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld12removeActionEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld13addConstraintEP17btTypedConstraintb__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld13addConstraintEP17btTypedConstraintb);
+var _ZN23btDiscreteDynamicsWorld13getConstraintEi__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld13getConstraintEi);
+var _ZN23btDiscreteDynamicsWorld13removeVehicleEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld13removeVehicleEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld14debugDrawWorldEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld14debugDrawWorldEv);
+var _ZN23btDiscreteDynamicsWorld14stepSimulationEfif__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld14stepSimulationEfif);
+var _ZN23btDiscreteDynamicsWorld14updateVehiclesEf__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld14updateVehiclesEf);
+var _ZN23btDiscreteDynamicsWorld15removeCharacterEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld15removeCharacterEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld15removeRigidBodyEP11btRigidBody__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld15removeRigidBodyEP11btRigidBody);
+var _ZN23btDiscreteDynamicsWorld16removeConstraintEP17btTypedConstraint__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld16removeConstraintEP17btTypedConstraint);
+var _ZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfo__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfo);
+var _ZN23btDiscreteDynamicsWorld18addCollisionObjectEP17btCollisionObjectss__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld18addCollisionObjectEP17btCollisionObjectss);
+var _ZN23btDiscreteDynamicsWorld18saveKinematicStateEf__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld18saveKinematicStateEf);
+var _ZN23btDiscreteDynamicsWorld19getConstraintSolverEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld19getConstraintSolverEv);
+var _ZN23btDiscreteDynamicsWorld19integrateTransformsEf__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld19integrateTransformsEf);
+var _ZN23btDiscreteDynamicsWorld19setConstraintSolverEP18btConstraintSolver__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld19setConstraintSolverEP18btConstraintSolver);
+var _ZN23btDiscreteDynamicsWorld21removeCollisionObjectEP17btCollisionObject__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld21removeCollisionObjectEP17btCollisionObject);
+var _ZN23btDiscreteDynamicsWorld23synchronizeMotionStatesEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld23synchronizeMotionStatesEv);
+var _ZN23btDiscreteDynamicsWorld25predictUnconstraintMotionEf__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld25predictUnconstraintMotionEf);
+var _ZN23btDiscreteDynamicsWorld26calculateSimulationIslandsEv__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld26calculateSimulationIslandsEv);
+var _ZN23btDiscreteDynamicsWorld28internalSingleStepSimulationEf__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld28internalSingleStepSimulationEf);
+var _ZN23btDiscreteDynamicsWorld9addActionEP17btActionInterface__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld9addActionEP17btActionInterface);
+var _ZN23btDiscreteDynamicsWorld9serializeEP12btSerializer__index__ = register_delegate(_ZN23btDiscreteDynamicsWorld9serializeEP12btSerializer);
+var _ZN23btDiscreteDynamicsWorldD0Ev__index__ = register_delegate(_ZN23btDiscreteDynamicsWorldD0Ev);
+var _ZN23btDiscreteDynamicsWorldD1Ev__index__ = register_delegate(_ZN23btDiscreteDynamicsWorldD1Ev);
+var _ZN23btStridingMeshInterfaceD0Ev__index__ = register_delegate(_ZN23btStridingMeshInterfaceD0Ev);
+var _ZN23btStridingMeshInterfaceD1Ev__index__ = register_delegate(_ZN23btStridingMeshInterfaceD1Ev);
+var _ZN24btConvexTriangleCallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZN24btConvexTriangleCallback15processTriangleEP9btVector3ii);
+var _ZN24btConvexTriangleCallbackD0Ev__index__ = register_delegate(_ZN24btConvexTriangleCallbackD0Ev);
+var _ZN24btConvexTriangleCallbackD1Ev__index__ = register_delegate(_ZN24btConvexTriangleCallbackD1Ev);
+var _ZN24btPerturbedContactResult15addContactPointERK9btVector3S2_f__index__ = register_delegate(_ZN24btPerturbedContactResult15addContactPointERK9btVector3S2_f);
+var _ZN24btPerturbedContactResultD0Ev__index__ = register_delegate(_ZN24btPerturbedContactResultD0Ev);
+var _ZN24btPerturbedContactResultD1Ev__index__ = register_delegate(_ZN24btPerturbedContactResultD1Ev);
+var _ZN25btSimulationIslandManager21updateActivationStateEP16btCollisionWorldP12btDispatcher__index__ = register_delegate(_ZN25btSimulationIslandManager21updateActivationStateEP16btCollisionWorldP12btDispatcher);
+var _ZN25btSimulationIslandManager26storeIslandActivationStateEP16btCollisionWorld__index__ = register_delegate(_ZN25btSimulationIslandManager26storeIslandActivationStateEP16btCollisionWorld);
+var _ZN25btSimulationIslandManagerD0Ev__index__ = register_delegate(_ZN25btSimulationIslandManagerD0Ev);
+var _ZN25btSimulationIslandManagerD1Ev__index__ = register_delegate(_ZN25btSimulationIslandManagerD1Ev);
+var _ZN25btTriangleRaycastCallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZN25btTriangleRaycastCallback15processTriangleEP9btVector3ii);
+var _ZN26btBoxBoxCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN26btBoxBoxCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN26btBoxBoxCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN26btBoxBoxCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN26btBoxBoxCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN26btBoxBoxCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN26btBoxBoxCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithmD0Ev);
+var _ZN26btBoxBoxCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN26btBoxBoxCollisionAlgorithmD1Ev);
+var _ZN26btTriangleIndexVertexArray16unLockVertexBaseEi__index__ = register_delegate(_ZN26btTriangleIndexVertexArray16unLockVertexBaseEi);
+var _ZN26btTriangleIndexVertexArray18preallocateIndicesEi__index__ = register_delegate(_ZN26btTriangleIndexVertexArray18preallocateIndicesEi);
+var _ZN26btTriangleIndexVertexArray19preallocateVerticesEi__index__ = register_delegate(_ZN26btTriangleIndexVertexArray19preallocateVerticesEi);
+var _ZN26btTriangleIndexVertexArray24getLockedVertexIndexBaseEPPhRiR14PHY_ScalarTypeS2_S1_S2_S2_S4_i__index__ = register_delegate(_ZN26btTriangleIndexVertexArray24getLockedVertexIndexBaseEPPhRiR14PHY_ScalarTypeS2_S1_S2_S2_S4_i);
+var _ZN26btTriangleIndexVertexArrayD0Ev__index__ = register_delegate(_ZN26btTriangleIndexVertexArrayD0Ev);
+var _ZN26btTriangleIndexVertexArrayD1Ev__index__ = register_delegate(_ZN26btTriangleIndexVertexArrayD1Ev);
+var _ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE__index__ = register_delegate(_ZN27btContinuousConvexCollision16calcTimeOfImpactERK11btTransformS2_S2_S2_RN12btConvexCast10CastResultE);
+var _ZN27btContinuousConvexCollisionD0Ev__index__ = register_delegate(_ZN27btContinuousConvexCollisionD0Ev);
+var _ZN27btContinuousConvexCollisionD1Ev__index__ = register_delegate(_ZN27btContinuousConvexCollisionD1Ev);
+var _ZN28btCompoundCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN28btCompoundCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN28btCompoundCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN28btCompoundCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN28btCompoundCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD0Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD0Ev);
+var _ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD1Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm17SwappedCreateFuncD1Ev);
+var _ZN28btCompoundCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN28btCompoundCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN28btCompoundCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithmD0Ev);
+var _ZN28btCompoundCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN28btCompoundCollisionAlgorithmD1Ev);
+var _ZN28btHashedOverlappingPairCache18addOverlappingPairEP17btBroadphaseProxyS1___index__ = register_delegate(_ZN28btHashedOverlappingPairCache18addOverlappingPairEP17btBroadphaseProxyS1_);
+var _ZN28btHashedOverlappingPairCache18hasDeferredRemovalEv__index__ = register_delegate(_ZN28btHashedOverlappingPairCache18hasDeferredRemovalEv);
+var _ZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcher);
+var _ZN28btHashedOverlappingPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache20cleanOverlappingPairER16btBroadphasePairP12btDispatcher);
+var _ZN28btHashedOverlappingPairCache20sortOverlappingPairsEP12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache20sortOverlappingPairsEP12btDispatcher);
+var _ZN28btHashedOverlappingPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache21removeOverlappingPairEP17btBroadphaseProxyS1_P12btDispatcher);
+var _ZN28btHashedOverlappingPairCache23getOverlappingPairArrayEv__index__ = register_delegate(_ZN28btHashedOverlappingPairCache23getOverlappingPairArrayEv);
+var _ZN28btHashedOverlappingPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback__index__ = register_delegate(_ZN28btHashedOverlappingPairCache24setOverlapFilterCallbackEP23btOverlapFilterCallback);
+var _ZN28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv__index__ = register_delegate(_ZN28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv);
+var _ZN28btHashedOverlappingPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache26processAllOverlappingPairsEP17btOverlapCallbackP12btDispatcher);
+var _ZN28btHashedOverlappingPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback__index__ = register_delegate(_ZN28btHashedOverlappingPairCache28setInternalGhostPairCallbackEP25btOverlappingPairCallback);
+var _ZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher__index__ = register_delegate(_ZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcher);
+var _ZN28btHashedOverlappingPairCache8findPairEP17btBroadphaseProxyS1___index__ = register_delegate(_ZN28btHashedOverlappingPairCache8findPairEP17btBroadphaseProxyS1_);
+var _ZN28btHashedOverlappingPairCacheD0Ev__index__ = register_delegate(_ZN28btHashedOverlappingPairCacheD0Ev);
+var _ZN28btHashedOverlappingPairCacheD1Ev__index__ = register_delegate(_ZN28btHashedOverlappingPairCacheD1Ev);
+var _ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZN28btTriangleConvexcastCallback15processTriangleEP9btVector3ii);
+var _ZN28btTriangleConvexcastCallbackD0Ev__index__ = register_delegate(_ZN28btTriangleConvexcastCallbackD0Ev);
+var _ZN28btTriangleConvexcastCallbackD1Ev__index__ = register_delegate(_ZN28btTriangleConvexcastCallbackD1Ev);
+var _ZN30btActivatingCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN30btActivatingCollisionAlgorithmD0Ev);
+var _ZN30btActivatingCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN30btActivatingCollisionAlgorithmD1Ev);
+var _ZN30btGjkEpaPenetrationDepthSolver12calcPenDepthER22btVoronoiSimplexSolverPK13btConvexShapeS4_RK11btTransformS7_R9btVector3S9_S9_P12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN30btGjkEpaPenetrationDepthSolver12calcPenDepthER22btVoronoiSimplexSolverPK13btConvexShapeS4_RK11btTransformS7_R9btVector3S9_S9_P12btIDebugDrawP12btStackAlloc);
+var _ZN30btGjkEpaPenetrationDepthSolverD0Ev__index__ = register_delegate(_ZN30btGjkEpaPenetrationDepthSolverD0Ev);
+var _ZN30btGjkEpaPenetrationDepthSolverD1Ev__index__ = register_delegate(_ZN30btGjkEpaPenetrationDepthSolverD1Ev);
+var _ZN31btConvexPlaneCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN31btConvexPlaneCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN31btConvexPlaneCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN31btConvexPlaneCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN31btConvexPlaneCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithmD0Ev);
+var _ZN31btConvexPlaneCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN31btConvexPlaneCollisionAlgorithmD1Ev);
+var _ZN31btDefaultCollisionConfiguration16getSimplexSolverEv__index__ = register_delegate(_ZN31btDefaultCollisionConfiguration16getSimplexSolverEv);
+var _ZN31btDefaultCollisionConfiguration17getStackAllocatorEv__index__ = register_delegate(_ZN31btDefaultCollisionConfiguration17getStackAllocatorEv);
+var _ZN31btDefaultCollisionConfiguration25getCollisionAlgorithmPoolEv__index__ = register_delegate(_ZN31btDefaultCollisionConfiguration25getCollisionAlgorithmPoolEv);
+var _ZN31btDefaultCollisionConfiguration25getPersistentManifoldPoolEv__index__ = register_delegate(_ZN31btDefaultCollisionConfiguration25getPersistentManifoldPoolEv);
+var _ZN31btDefaultCollisionConfiguration31getCollisionAlgorithmCreateFuncEii__index__ = register_delegate(_ZN31btDefaultCollisionConfiguration31getCollisionAlgorithmCreateFuncEii);
+var _ZN31btDefaultCollisionConfigurationD0Ev__index__ = register_delegate(_ZN31btDefaultCollisionConfigurationD0Ev);
+var _ZN31btDefaultCollisionConfigurationD1Ev__index__ = register_delegate(_ZN31btDefaultCollisionConfigurationD1Ev);
+var _ZN31btInternalTriangleIndexCallbackD0Ev__index__ = register_delegate(_ZN31btInternalTriangleIndexCallbackD0Ev);
+var _ZN31btInternalTriangleIndexCallbackD1Ev__index__ = register_delegate(_ZN31btInternalTriangleIndexCallbackD1Ev);
+var _ZN32btSphereSphereCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN32btSphereSphereCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN32btSphereSphereCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN32btSphereSphereCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN32btSphereSphereCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN32btSphereSphereCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN32btSphereSphereCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithmD0Ev);
+var _ZN32btSphereSphereCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN32btSphereSphereCollisionAlgorithmD1Ev);
+var _ZN33btConvexConcaveCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN33btConvexConcaveCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD0Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD0Ev);
+var _ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD1Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm17SwappedCreateFuncD1Ev);
+var _ZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN33btConvexConcaveCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN33btConvexConcaveCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithmD0Ev);
+var _ZN33btConvexConcaveCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN33btConvexConcaveCollisionAlgorithmD1Ev);
+var _ZN34btClosestNotMeConvexResultCallback15addSingleResultERN16btCollisionWorld17LocalConvexResultEb__index__ = register_delegate(_ZN34btClosestNotMeConvexResultCallback15addSingleResultERN16btCollisionWorld17LocalConvexResultEb);
+var _ZN34btClosestNotMeConvexResultCallbackD0Ev__index__ = register_delegate(_ZN34btClosestNotMeConvexResultCallbackD0Ev);
+var _ZN34btClosestNotMeConvexResultCallbackD1Ev__index__ = register_delegate(_ZN34btClosestNotMeConvexResultCallbackD1Ev);
+var _ZN34btSphereTriangleCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4___index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm10CreateFunc24CreateCollisionAlgorithmER36btCollisionAlgorithmConstructionInfoP17btCollisionObjectS4_);
+var _ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD0Ev__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD0Ev);
+var _ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD1Ev__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm10CreateFuncD1Ev);
+var _ZN34btSphereTriangleCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm16processCollisionEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN34btSphereTriangleCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResult);
+var _ZN34btSphereTriangleCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithm22getAllContactManifoldsER20btAlignedObjectArrayIP20btPersistentManifoldE);
+var _ZN34btSphereTriangleCollisionAlgorithmD0Ev__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithmD0Ev);
+var _ZN34btSphereTriangleCollisionAlgorithmD1Ev__index__ = register_delegate(_ZN34btSphereTriangleCollisionAlgorithmD1Ev);
+var _ZN35btSequentialImpulseConstraintSolver10solveGroupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAllocP12btDispatcher__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver10solveGroupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAllocP12btDispatcher);
+var _ZN35btSequentialImpulseConstraintSolver28solveGroupCacheFriendlySetupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver28solveGroupCacheFriendlySetupEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc);
+var _ZN35btSequentialImpulseConstraintSolver29solveGroupCacheFriendlyFinishEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver29solveGroupCacheFriendlyFinishEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc);
+var _ZN35btSequentialImpulseConstraintSolver33solveGroupCacheFriendlyIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver33solveGroupCacheFriendlyIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc);
+var _ZN35btSequentialImpulseConstraintSolver45solveGroupCacheFriendlySplitImpulseIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver45solveGroupCacheFriendlySplitImpulseIterationsEPP17btCollisionObjectiPP20btPersistentManifoldiPP17btTypedConstraintiRK19btContactSolverInfoP12btIDebugDrawP12btStackAlloc);
+var _ZN35btSequentialImpulseConstraintSolver5resetEv__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolver5resetEv);
+var _ZN35btSequentialImpulseConstraintSolverD0Ev__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolverD0Ev);
+var _ZN35btSequentialImpulseConstraintSolverD1Ev__index__ = register_delegate(_ZN35btSequentialImpulseConstraintSolverD1Ev);
+var _ZN4__rw10__rw_facetD0Ev__index__ = register_delegate(_ZN4__rw10__rw_facetD0Ev);
+var _ZN4__rw10__rw_facetD1Ev__index__ = register_delegate(_ZN4__rw10__rw_facetD1Ev);
+var _ZN6btDbvt8ICollide7DescentEPK10btDbvtNode__index__ = register_delegate(_ZN6btDbvt8ICollide7DescentEPK10btDbvtNode);
+var _ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3___index__ = register_delegate(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodeS3_);
+var _ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef__index__ = register_delegate(_ZN6btDbvt8ICollide7ProcessEPK10btDbvtNodef);
+var _ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode__index__ = register_delegate(_ZN6btDbvt8ICollide9AllLeavesEPK10btDbvtNode);
+var _ZN7CFileLS4feofEv__index__ = register_delegate(_ZN7CFileLS4feofEv);
+var _ZN7CFileLS5freadEPvjj__index__ = register_delegate(_ZN7CFileLS5freadEPvjj);
+var _ZN7CFileLS5fseekEli__index__ = register_delegate(_ZN7CFileLS5fseekEli);
+var _ZN7CFileLS5ftellEv__index__ = register_delegate(_ZN7CFileLS5ftellEv);
+var _ZN7CFileLS6fcloseEv__index__ = register_delegate(_ZN7CFileLS6fcloseEv);
+var _ZN7CFileLS6fflushEv__index__ = register_delegate(_ZN7CFileLS6fflushEv);
+var _ZN7CFileLS6fwriteEPKvjj__index__ = register_delegate(_ZN7CFileLS6fwriteEPKvjj);
+var _ZN7CFileLS6ungetcEi__index__ = register_delegate(_ZN7CFileLS6ungetcEi);
+var _ZN7RagDollD0Ev__index__ = register_delegate(_ZN7RagDollD0Ev);
+var _ZN7RagDollD1Ev__index__ = register_delegate(_ZN7RagDollD1Ev);
+var _ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj__index__ = register_delegate(_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj);
+var _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE__index__ = register_delegate(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE);
+var _ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv__index__ = register_delegate(_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv);
+var _ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE__index__ = register_delegate(_ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE);
+var _ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2___index__ = register_delegate(_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_);
+var _ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE__index__ = register_delegate(_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE);
+var _ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE__index__ = register_delegate(_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE);
+var _ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2___index__ = register_delegate(_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_);
+var _ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE__index__ = register_delegate(_ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE);
+var _ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE__index__ = register_delegate(_ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE);
+var _ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2___index__ = register_delegate(_ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_);
+var _ZNK10btBoxShape11getNumEdgesEv__index__ = register_delegate(_ZNK10btBoxShape11getNumEdgesEv);
+var _ZNK10btBoxShape12getNumPlanesEv__index__ = register_delegate(_ZNK10btBoxShape12getNumPlanesEv);
+var _ZNK10btBoxShape14getNumVerticesEv__index__ = register_delegate(_ZNK10btBoxShape14getNumVerticesEv);
+var _ZNK10btBoxShape16getPlaneEquationER9btVector4i__index__ = register_delegate(_ZNK10btBoxShape16getPlaneEquationER9btVector4i);
+var _ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK10btBoxShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK10btBoxShape24localGetSupportingVertexERK9btVector3__index__ = register_delegate(_ZNK10btBoxShape24localGetSupportingVertexERK9btVector3);
+var _ZNK10btBoxShape32getPreferredPenetrationDirectionEiR9btVector3__index__ = register_delegate(_ZNK10btBoxShape32getPreferredPenetrationDirectionEiR9btVector3);
+var _ZNK10btBoxShape36getNumPreferredPenetrationDirectionsEv__index__ = register_delegate(_ZNK10btBoxShape36getNumPreferredPenetrationDirectionsEv);
+var _ZNK10btBoxShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK10btBoxShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK10btBoxShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__ = register_delegate(_ZNK10btBoxShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i);
+var _ZNK10btBoxShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK10btBoxShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNK10btBoxShape7getEdgeEiR9btVector3S1___index__ = register_delegate(_ZNK10btBoxShape7getEdgeEiR9btVector3S1_);
+var _ZNK10btBoxShape7getNameEv__index__ = register_delegate(_ZNK10btBoxShape7getNameEv);
+var _ZNK10btBoxShape8getPlaneER9btVector3S1_i__index__ = register_delegate(_ZNK10btBoxShape8getPlaneER9btVector3S1_i);
+var _ZNK10btBoxShape8isInsideERK9btVector3f__index__ = register_delegate(_ZNK10btBoxShape8isInsideERK9btVector3f);
+var _ZNK10btBoxShape9getVertexEiR9btVector3__index__ = register_delegate(_ZNK10btBoxShape9getVertexEiR9btVector3);
+var _ZNK11CFileSystem12IsFileSystemEv__index__ = register_delegate(_ZNK11CFileSystem12IsFileSystemEv);
+var _ZNK11btRigidBody21serializeSingleObjectEP12btSerializer__index__ = register_delegate(_ZNK11btRigidBody21serializeSingleObjectEP12btSerializer);
+var _ZNK11btRigidBody28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK11btRigidBody28calculateSerializeBufferSizeEv);
+var _ZNK11btRigidBody9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK11btRigidBody9serializeEPvP12btSerializer);
+var _ZNK13btConvexShape31localGetSupportVertexNonVirtualERK9btVector3__index__ = register_delegate(_ZNK13btConvexShape31localGetSupportVertexNonVirtualERK9btVector3);
+var _ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3__index__ = register_delegate(_ZNK13btConvexShape44localGetSupportVertexWithoutMarginNonVirtualERK9btVector3);
+var _ZNK13btSphereShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK13btSphereShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK13btSphereShape24localGetSupportingVertexERK9btVector3__index__ = register_delegate(_ZNK13btSphereShape24localGetSupportingVertexERK9btVector3);
+var _ZNK13btSphereShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK13btSphereShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK13btSphereShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__ = register_delegate(_ZNK13btSphereShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i);
+var _ZNK13btSphereShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK13btSphereShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNK13btSphereShape7getNameEv__index__ = register_delegate(_ZNK13btSphereShape7getNameEv);
+var _ZNK13btSphereShape9getMarginEv__index__ = register_delegate(_ZNK13btSphereShape9getMarginEv);
+var _ZNK14CFileInterface12IsFileSystemEv__index__ = register_delegate(_ZNK14CFileInterface12IsFileSystemEv);
+var _ZNK14btCapsuleShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK14btCapsuleShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK14btCapsuleShape28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK14btCapsuleShape28calculateSerializeBufferSizeEv);
+var _ZNK14btCapsuleShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK14btCapsuleShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK14btCapsuleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__ = register_delegate(_ZNK14btCapsuleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i);
+var _ZNK14btCapsuleShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK14btCapsuleShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNK14btCapsuleShape7getNameEv__index__ = register_delegate(_ZNK14btCapsuleShape7getNameEv);
+var _ZNK14btCapsuleShape9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK14btCapsuleShape9serializeEPvP12btSerializer);
+var _ZNK14btConcaveShape9getMarginEv__index__ = register_delegate(_ZNK14btConcaveShape9getMarginEv);
+var _ZNK14btOptimizedBvh16serializeInPlaceEPvjb__index__ = register_delegate(_ZNK14btOptimizedBvh16serializeInPlaceEPvjb);
+var _ZNK14btQuantizedBvh31calculateSerializeBufferSizeNewEv__index__ = register_delegate(_ZNK14btQuantizedBvh31calculateSerializeBufferSizeNewEv);
+var _ZNK14btQuantizedBvh9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK14btQuantizedBvh9serializeEPvP12btSerializer);
+var _ZNK14btQuantizedBvh9serializeEPvjb__index__ = register_delegate(_ZNK14btQuantizedBvh9serializeEPvjb);
+var _ZNK15btDynamicsWorld13getConstraintEi__index__ = register_delegate(_ZNK15btDynamicsWorld13getConstraintEi);
+var _ZNK15btDynamicsWorld17getNumConstraintsEv__index__ = register_delegate(_ZNK15btDynamicsWorld17getNumConstraintsEv);
+var _ZNK15btNullPairCache22getNumOverlappingPairsEv__index__ = register_delegate(_ZNK15btNullPairCache22getNumOverlappingPairsEv);
+var _ZNK15btNullPairCache26getOverlappingPairArrayPtrEv__index__ = register_delegate(_ZNK15btNullPairCache26getOverlappingPairArrayPtrEv);
+var _ZNK15btTriangleShape11getNumEdgesEv__index__ = register_delegate(_ZNK15btTriangleShape11getNumEdgesEv);
+var _ZNK15btTriangleShape12getNumPlanesEv__index__ = register_delegate(_ZNK15btTriangleShape12getNumPlanesEv);
+var _ZNK15btTriangleShape14getNumVerticesEv__index__ = register_delegate(_ZNK15btTriangleShape14getNumVerticesEv);
+var _ZNK15btTriangleShape16getPlaneEquationEiR9btVector3S1___index__ = register_delegate(_ZNK15btTriangleShape16getPlaneEquationEiR9btVector3S1_);
+var _ZNK15btTriangleShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK15btTriangleShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK15btTriangleShape32getPreferredPenetrationDirectionEiR9btVector3__index__ = register_delegate(_ZNK15btTriangleShape32getPreferredPenetrationDirectionEiR9btVector3);
+var _ZNK15btTriangleShape36getNumPreferredPenetrationDirectionsEv__index__ = register_delegate(_ZNK15btTriangleShape36getNumPreferredPenetrationDirectionsEv);
+var _ZNK15btTriangleShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK15btTriangleShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK15btTriangleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__ = register_delegate(_ZNK15btTriangleShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i);
+var _ZNK15btTriangleShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK15btTriangleShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNK15btTriangleShape7getEdgeEiR9btVector3S1___index__ = register_delegate(_ZNK15btTriangleShape7getEdgeEiR9btVector3S1_);
+var _ZNK15btTriangleShape7getNameEv__index__ = register_delegate(_ZNK15btTriangleShape7getNameEv);
+var _ZNK15btTriangleShape8getPlaneER9btVector3S1_i__index__ = register_delegate(_ZNK15btTriangleShape8getPlaneER9btVector3S1_i);
+var _ZNK15btTriangleShape8isInsideERK9btVector3f__index__ = register_delegate(_ZNK15btTriangleShape8isInsideERK9btVector3f);
+var _ZNK15btTriangleShape9getVertexEiR9btVector3__index__ = register_delegate(_ZNK15btTriangleShape9getVertexEiR9btVector3);
+var _ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf__index__ = register_delegate(_ZNK16btCollisionShape17getBoundingSphereER9btVector3Rf);
+var _ZNK16btCollisionShape20getAngularMotionDiscEv__index__ = register_delegate(_ZNK16btCollisionShape20getAngularMotionDiscEv);
+var _ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer__index__ = register_delegate(_ZNK16btCollisionShape20serializeSingleShapeEP12btSerializer);
+var _ZNK16btCollisionShape27getContactBreakingThresholdEf__index__ = register_delegate(_ZNK16btCollisionShape27getContactBreakingThresholdEf);
+var _ZNK16btCollisionShape28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK16btCollisionShape28calculateSerializeBufferSizeEv);
+var _ZNK16btCollisionShape9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK16btCollisionShape9serializeEPvP12btSerializer);
+var _ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy__index__ = register_delegate(_ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy);
+var _ZNK16btCollisionWorld20ConvexResultCallback14needsCollisionEP17btBroadphaseProxy__index__ = register_delegate(_ZNK16btCollisionWorld20ConvexResultCallback14needsCollisionEP17btBroadphaseProxy);
+var _ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE__index__ = register_delegate(_ZNK16btCollisionWorld7rayTestERK9btVector3S2_RNS_17RayResultCallbackE);
+var _ZNK16btDbvtBroadphase17getBroadphaseAabbER9btVector3S1___index__ = register_delegate(_ZNK16btDbvtBroadphase17getBroadphaseAabbER9btVector3S1_);
+var _ZNK16btDbvtBroadphase23getOverlappingPairCacheEv__index__ = register_delegate(_ZNK16btDbvtBroadphase23getOverlappingPairCacheEv);
+var _ZNK16btDbvtBroadphase7getAabbEP17btBroadphaseProxyR9btVector3S3___index__ = register_delegate(_ZNK16btDbvtBroadphase7getAabbEP17btBroadphaseProxyR9btVector3S3_);
+var _ZNK17btCollisionObject21serializeSingleObjectEP12btSerializer__index__ = register_delegate(_ZNK17btCollisionObject21serializeSingleObjectEP12btSerializer);
+var _ZNK17btCollisionObject28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK17btCollisionObject28calculateSerializeBufferSizeEv);
+var _ZNK17btCollisionObject9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK17btCollisionObject9serializeEPvP12btSerializer);
+var _ZNK17btConvexHullShape11getNumEdgesEv__index__ = register_delegate(_ZNK17btConvexHullShape11getNumEdgesEv);
+var _ZNK17btConvexHullShape12getNumPlanesEv__index__ = register_delegate(_ZNK17btConvexHullShape12getNumPlanesEv);
+var _ZNK17btConvexHullShape14getNumVerticesEv__index__ = register_delegate(_ZNK17btConvexHullShape14getNumVerticesEv);
+var _ZNK17btConvexHullShape24localGetSupportingVertexERK9btVector3__index__ = register_delegate(_ZNK17btConvexHullShape24localGetSupportingVertexERK9btVector3);
+var _ZNK17btConvexHullShape28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK17btConvexHullShape28calculateSerializeBufferSizeEv);
+var _ZNK17btConvexHullShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK17btConvexHullShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK17btConvexHullShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i__index__ = register_delegate(_ZNK17btConvexHullShape49batchedUnitVectorGetSupportingVertexWithoutMarginEPK9btVector3PS0_i);
+var _ZNK17btConvexHullShape7getEdgeEiR9btVector3S1___index__ = register_delegate(_ZNK17btConvexHullShape7getEdgeEiR9btVector3S1_);
+var _ZNK17btConvexHullShape7getNameEv__index__ = register_delegate(_ZNK17btConvexHullShape7getNameEv);
+var _ZNK17btConvexHullShape8getPlaneER9btVector3S1_i__index__ = register_delegate(_ZNK17btConvexHullShape8getPlaneER9btVector3S1_i);
+var _ZNK17btConvexHullShape8isInsideERK9btVector3f__index__ = register_delegate(_ZNK17btConvexHullShape8isInsideERK9btVector3f);
+var _ZNK17btConvexHullShape9getVertexEiR9btVector3__index__ = register_delegate(_ZNK17btConvexHullShape9getVertexEiR9btVector3);
+var _ZNK17btConvexHullShape9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK17btConvexHullShape9serializeEPvP12btSerializer);
+var _ZNK17btHingeConstraint28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK17btHingeConstraint28calculateSerializeBufferSizeEv);
+var _ZNK17btHingeConstraint8getParamEii__index__ = register_delegate(_ZNK17btHingeConstraint8getParamEii);
+var _ZNK17btHingeConstraint9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK17btHingeConstraint9serializeEPvP12btSerializer);
+var _ZNK19btTriangleMeshShape15getLocalScalingEv__index__ = register_delegate(_ZNK19btTriangleMeshShape15getLocalScalingEv);
+var _ZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4___index__ = register_delegate(_ZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_);
+var _ZNK19btTriangleMeshShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK19btTriangleMeshShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK19btTriangleMeshShape24localGetSupportingVertexERK9btVector3__index__ = register_delegate(_ZNK19btTriangleMeshShape24localGetSupportingVertexERK9btVector3);
+var _ZNK19btTriangleMeshShape37localGetSupportingVertexWithoutMarginERK9btVector3__index__ = register_delegate(_ZNK19btTriangleMeshShape37localGetSupportingVertexWithoutMarginERK9btVector3);
+var _ZNK19btTriangleMeshShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK19btTriangleMeshShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNK19btTriangleMeshShape7getNameEv__index__ = register_delegate(_ZNK19btTriangleMeshShape7getNameEv);
+var _ZNK20btAxisSweep3InternalItE17getBroadphaseAabbER9btVector3S2___index__ = register_delegate(_ZNK20btAxisSweep3InternalItE17getBroadphaseAabbER9btVector3S2_);
+var _ZNK20btAxisSweep3InternalItE23getOverlappingPairCacheEv__index__ = register_delegate(_ZNK20btAxisSweep3InternalItE23getOverlappingPairCacheEv);
+var _ZNK20btAxisSweep3InternalItE7getAabbEP17btBroadphaseProxyR9btVector3S4___index__ = register_delegate(_ZNK20btAxisSweep3InternalItE7getAabbEP17btBroadphaseProxyR9btVector3S4_);
+var _ZNK20btDefaultMotionState17getWorldTransformER11btTransform__index__ = register_delegate(_ZNK20btDefaultMotionState17getWorldTransformER11btTransform);
+var _ZNK21btCollisionDispatcher15getNumManifoldsEv__index__ = register_delegate(_ZNK21btCollisionDispatcher15getNumManifoldsEv);
+var _ZNK21btConeTwistConstraint28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK21btConeTwistConstraint28calculateSerializeBufferSizeEv);
+var _ZNK21btConeTwistConstraint8getParamEii__index__ = register_delegate(_ZNK21btConeTwistConstraint8getParamEii);
+var _ZNK21btConeTwistConstraint9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK21btConeTwistConstraint9serializeEPvP12btSerializer);
+var _ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK21btConvexInternalShape11getAabbSlowERK11btTransformR9btVector3S4_);
+var _ZNK21btConvexInternalShape15getLocalScalingEv__index__ = register_delegate(_ZNK21btConvexInternalShape15getLocalScalingEv);
+var _ZNK21btConvexInternalShape24localGetSupportingVertexERK9btVector3__index__ = register_delegate(_ZNK21btConvexInternalShape24localGetSupportingVertexERK9btVector3);
+var _ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK21btConvexInternalShape28calculateSerializeBufferSizeEv);
+var _ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3__index__ = register_delegate(_ZNK21btConvexInternalShape32getPreferredPenetrationDirectionEiR9btVector3);
+var _ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv__index__ = register_delegate(_ZNK21btConvexInternalShape36getNumPreferredPenetrationDirectionsEv);
+var _ZNK21btConvexInternalShape9getMarginEv__index__ = register_delegate(_ZNK21btConvexInternalShape9getMarginEv);
+var _ZNK21btConvexInternalShape9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK21btConvexInternalShape9serializeEPvP12btSerializer);
+var _ZNK22btBvhTriangleMeshShape18serializeSingleBvhEP12btSerializer__index__ = register_delegate(_ZNK22btBvhTriangleMeshShape18serializeSingleBvhEP12btSerializer);
+var _ZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4___index__ = register_delegate(_ZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_);
+var _ZNK22btBvhTriangleMeshShape28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK22btBvhTriangleMeshShape28calculateSerializeBufferSizeEv);
+var _ZNK22btBvhTriangleMeshShape30serializeSingleTriangleInfoMapEP12btSerializer__index__ = register_delegate(_ZNK22btBvhTriangleMeshShape30serializeSingleTriangleInfoMapEP12btSerializer);
+var _ZNK22btBvhTriangleMeshShape7getNameEv__index__ = register_delegate(_ZNK22btBvhTriangleMeshShape7getNameEv);
+var _ZNK22btBvhTriangleMeshShape9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK22btBvhTriangleMeshShape9serializeEPvP12btSerializer);
+var _ZNK23btDiscreteDynamicsWorld10getGravityEv__index__ = register_delegate(_ZNK23btDiscreteDynamicsWorld10getGravityEv);
+var _ZNK23btDiscreteDynamicsWorld12getWorldTypeEv__index__ = register_delegate(_ZNK23btDiscreteDynamicsWorld12getWorldTypeEv);
+var _ZNK23btDiscreteDynamicsWorld13getConstraintEi__index__ = register_delegate(_ZNK23btDiscreteDynamicsWorld13getConstraintEi);
+var _ZNK23btDiscreteDynamicsWorld17getNumConstraintsEv__index__ = register_delegate(_ZNK23btDiscreteDynamicsWorld17getNumConstraintsEv);
+var _ZNK23btPolyhedralConvexShape21calculateLocalInertiaEfR9btVector3__index__ = register_delegate(_ZNK23btPolyhedralConvexShape21calculateLocalInertiaEfR9btVector3);
+var _ZNK23btStridingMeshInterface14getPremadeAabbEP9btVector3S1___index__ = register_delegate(_ZNK23btStridingMeshInterface14getPremadeAabbEP9btVector3S1_);
+var _ZNK23btStridingMeshInterface14hasPremadeAabbEv__index__ = register_delegate(_ZNK23btStridingMeshInterface14hasPremadeAabbEv);
+var _ZNK23btStridingMeshInterface14setPremadeAabbERK9btVector3S2___index__ = register_delegate(_ZNK23btStridingMeshInterface14setPremadeAabbERK9btVector3S2_);
+var _ZNK23btStridingMeshInterface27InternalProcessAllTrianglesEP31btInternalTriangleIndexCallbackRK9btVector3S4___index__ = register_delegate(_ZNK23btStridingMeshInterface27InternalProcessAllTrianglesEP31btInternalTriangleIndexCallbackRK9btVector3S4_);
+var _ZNK23btStridingMeshInterface28calculateSerializeBufferSizeEv__index__ = register_delegate(_ZNK23btStridingMeshInterface28calculateSerializeBufferSizeEv);
+var _ZNK23btStridingMeshInterface9serializeEPvP12btSerializer__index__ = register_delegate(_ZNK23btStridingMeshInterface9serializeEPvP12btSerializer);
+var _ZNK26btTriangleIndexVertexArray14getNumSubPartsEv__index__ = register_delegate(_ZNK26btTriangleIndexVertexArray14getNumSubPartsEv);
+var _ZNK26btTriangleIndexVertexArray14getPremadeAabbEP9btVector3S1___index__ = register_delegate(_ZNK26btTriangleIndexVertexArray14getPremadeAabbEP9btVector3S1_);
+var _ZNK26btTriangleIndexVertexArray14hasPremadeAabbEv__index__ = register_delegate(_ZNK26btTriangleIndexVertexArray14hasPremadeAabbEv);
+var _ZNK26btTriangleIndexVertexArray14setPremadeAabbERK9btVector3S2___index__ = register_delegate(_ZNK26btTriangleIndexVertexArray14setPremadeAabbERK9btVector3S2_);
+var _ZNK26btTriangleIndexVertexArray24unLockReadOnlyVertexBaseEi__index__ = register_delegate(_ZNK26btTriangleIndexVertexArray24unLockReadOnlyVertexBaseEi);
+var _ZNK26btTriangleIndexVertexArray32getLockedReadOnlyVertexIndexBaseEPPKhRiR14PHY_ScalarTypeS3_S2_S3_S3_S5_i__index__ = register_delegate(_ZNK26btTriangleIndexVertexArray32getLockedReadOnlyVertexIndexBaseEPPKhRiR14PHY_ScalarTypeS3_S2_S3_S3_S5_i);
+var _ZNK28btHashedOverlappingPairCache22getNumOverlappingPairsEv__index__ = register_delegate(_ZNK28btHashedOverlappingPairCache22getNumOverlappingPairsEv);
+var _ZNK28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv__index__ = register_delegate(_ZNK28btHashedOverlappingPairCache26getOverlappingPairArrayPtrEv);
+var _ZNK34btClosestNotMeConvexResultCallback14needsCollisionEP17btBroadphaseProxy__index__ = register_delegate(_ZNK34btClosestNotMeConvexResultCallback14needsCollisionEP17btBroadphaseProxy);
+var _ZNK34btPolyhedralConvexAabbCachingShape7getAabbERK11btTransformR9btVector3S4___index__ = register_delegate(_ZNK34btPolyhedralConvexAabbCachingShape7getAabbERK11btTransformR9btVector3S4_);
+var _ZNKSt8messagesIcE6do_getEiiiRKSs__index__ = register_delegate(_ZNKSt8messagesIcE6do_getEiiiRKSs);
+var _ZNKSt8messagesIcE7do_openERKSsRKSt6locale__index__ = register_delegate(_ZNKSt8messagesIcE7do_openERKSsRKSt6locale);
+var _ZNKSt8messagesIcE8do_closeEi__index__ = register_delegate(_ZNKSt8messagesIcE8do_closeEi);
+var _ZNKSt9type_info10__do_catchEPKS_PPvj__index__ = register_delegate(_ZNKSt9type_info10__do_catchEPKS_PPvj);
+var _ZNKSt9type_info15__is_function_pEv__index__ = register_delegate(_ZNKSt9type_info15__is_function_pEv);
+var _ZNSt8messagesIcED0Ev__index__ = register_delegate(_ZNSt8messagesIcED0Ev);
+var _ZNSt8messagesIcED1Ev__index__ = register_delegate(_ZNSt8messagesIcED1Ev);
+var _ZNSt9type_infoD0Ev__index__ = register_delegate(_ZNSt9type_infoD0Ev);
+var _ZNSt9type_infoD1Ev__index__ = register_delegate(_ZNSt9type_infoD1Ev);
+var _ZThn4_N17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii__index__ = register_delegate(_ZThn4_N17DebugDrawcallback28internalProcessTriangleIndexEP9btVector3ii);
+var _ZThn4_N17DebugDrawcallbackD0Ev__index__ = register_delegate(_ZThn4_N17DebugDrawcallbackD0Ev);
+var _ZThn4_N17DebugDrawcallbackD1Ev__index__ = register_delegate(_ZThn4_N17DebugDrawcallbackD1Ev);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallback28internalProcessTriangleIndexEPS2_ii__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallback28internalProcessTriangleIndexEPS2_ii);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD0Ev__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD0Ev);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD1Ev__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN20NodeTriangleCallbackD1Ev);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallback28internalProcessTriangleIndexEPS2_ii__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallback28internalProcessTriangleIndexEPS2_ii);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD0Ev__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD0Ev);
+var _ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD1Ev__index__ = register_delegate(_ZZN14btOptimizedBvh5buildEP23btStridingMeshInterfacebRK9btVector3S4_EN29QuantizedNodeTriangleCallbackD1Ev);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder215addSingleResultERNS_14LocalRayResultEb__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder215addSingleResultERNS_14LocalRayResultEb);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D0Ev__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D0Ev);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D1Ev__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN15LocalInfoAdder2D1Ev);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitERK9btVector3fii__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitERK9btVector3fii);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitE_0RK9btVector3fii__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallback9reportHitE_0RK9btVector3fii);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0E_0v__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0E_0v);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0Ev__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD0Ev);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1E_0v__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1E_0v);
+var _ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1Ev__index__ = register_delegate(_ZZN16btCollisionWorld13rayTestSingleERK11btTransformS2_P17btCollisionObjectPK16btCollisionShapeS2_RNS_17RayResultCallbackEEN29BridgeTriangleRaycastCallbackD1Ev);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdder15addSingleResultERNS_17LocalConvexResultEb__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdder15addSingleResultERNS_17LocalConvexResultEb);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD0Ev__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD0Ev);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD1Ev__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN14LocalInfoAdderD1Ev);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitERK9btVector3SG_fii__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitERK9btVector3SG_fii);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitE_0RK9btVector3SG_fii__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallback9reportHitE_0RK9btVector3SG_fii);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0E_0v__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0E_0v);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0Ev__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD0Ev);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1E_0v__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1E_0v);
+var _ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1Ev__index__ = register_delegate(_ZZN16btCollisionWorld17objectQuerySingleEPK13btConvexShapeRK11btTransformS5_P17btCollisionObjectPK16btCollisionShapeS5_RNS_20ConvexResultCallbackEfEN32BridgeTriangleConvexcastCallbackD1Ev);
+var _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii);
+var _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev);
+var _ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape14performRaycastEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev);
+var _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallback11processNodeEii__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallback11processNodeEii);
+var _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD0Ev__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD0Ev);
+var _ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD1Ev__index__ = register_delegate(_ZZN22btBvhTriangleMeshShape17performConvexcastEP18btTriangleCallbackRK9btVector3S4_S4_S4_EN21MyNodeOverlapCallbackD1Ev);
+var _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback13ProcessIslandEPP17btCollisionObjectiPP20btPersistentManifoldii__index__ = register_delegate(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallback13ProcessIslandEPP17btCollisionObjectiPP20btPersistentManifoldii);
+var _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD0Ev__index__ = register_delegate(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD0Ev);
+var _ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD1Ev__index__ = register_delegate(_ZZN23btDiscreteDynamicsWorld16solveConstraintsER19btContactSolverInfoEN27InplaceSolverIslandCallbackD1Ev);
+var _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallback14processOverlapER16btBroadphasePair__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallback14processOverlapER16btBroadphasePair);
+var _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD0Ev__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD0Ev);
+var _ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD1Ev__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache19cleanProxyFromPairsEP17btBroadphaseProxyP12btDispatcherEN17CleanPairCallbackD1Ev);
+var _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallback14processOverlapER16btBroadphasePair__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallback14processOverlapER16btBroadphasePair);
+var _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD0Ev__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD0Ev);
+var _ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD1Ev__index__ = register_delegate(_ZZN28btHashedOverlappingPairCache37removeOverlappingPairsContainingProxyEP17btBroadphaseProxyP12btDispatcherEN18RemovePairCallbackD1Ev);
+var _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallback15processTriangleEP9btVector3ii__index__ = register_delegate(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallback15processTriangleEP9btVector3ii);
+var _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD0Ev__index__ = register_delegate(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD0Ev);
+var _ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD1Ev__index__ = register_delegate(_ZZN33btConvexConcaveCollisionAlgorithm21calculateTimeOfImpactEP17btCollisionObjectS1_RK16btDispatcherInfoP16btManifoldResultEN31LocalTriangleSphereCastCallbackD1Ev);
+var _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallback28internalProcessTriangleIndexEPS2_ii__index__ = register_delegate(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallback28internalProcessTriangleIndexEPS2_ii);
+var _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD0Ev__index__ = register_delegate(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD0Ev);
+var _ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD1Ev__index__ = register_delegate(_ZZNK19btTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN16FilteredCallbackD1Ev);
+var _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii__index__ = register_delegate(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallback11processNodeEii);
+var _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev__index__ = register_delegate(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD0Ev);
+var _ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev__index__ = register_delegate(_ZZNK22btBvhTriangleMeshShape19processAllTrianglesEP18btTriangleCallbackRK9btVector3S4_EN21MyNodeOverlapCallbackD1Ev);
+var __cxa_pure_virtual__index__ = register_delegate(__cxa_pure_virtual);
+var __fwrite__index__ = register_delegate(__fwrite);
+var __mandreel_internal_SetResolution__index__ = register_delegate(__mandreel_internal_SetResolution);
+var __resize__index__ = register_delegate(__resize);
+var cmpfacets__index__ = register_delegate(cmpfacets);
+var cmplocales__index__ = register_delegate(cmplocales);
+var iMandreel_TextureAsync_GetPackOffset__index__ = register_delegate(iMandreel_TextureAsync_GetPackOffset);
+var iMandreel_TextureAsync_IsCompressed__index__ = register_delegate(iMandreel_TextureAsync_IsCompressed);
+var imandreel_restore_glcontext__index__ = register_delegate(imandreel_restore_glcontext);
+var imandreel_viewport_resize__index__ = register_delegate(imandreel_viewport_resize);
+var mandreel_flash_tcp_onError__index__ = register_delegate(mandreel_flash_tcp_onError);
+var swrite__index__ = register_delegate(swrite);
+var _objc_sections = {};
+var _objc_sections_size = {};
+
+// End of mandreel.js file.
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/navier-stokes.js b/suite/cts/deviceTests/browserbench/assets/octane/navier-stokes.js
new file mode 100644
index 0000000..a33e7cd
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/navier-stokes.js
@@ -0,0 +1,409 @@
+/**
+ * Copyright 2012 the V8 project authors. All rights reserved.
+ * Copyright 2009 Oliver Hunt <http://nerget.com>
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+var NavierStokes = new BenchmarkSuite('NavierStokes', 1484000,
+                                      [new Benchmark('NavierStokes',
+                                                     runNavierStokes,
+                                                     setupNavierStokes,
+                                                     tearDownNavierStokes,
+                                                     16)]);
+
+var solver = null;
+var nsFrameCounter = 0;
+
+function runNavierStokes()
+{
+    solver.update();
+    nsFrameCounter++;
+
+    if(nsFrameCounter==15)
+        checkResult(solver.getDens());
+}
+
+function checkResult(dens) {
+
+    this.result = 0;
+    for (var i=7000;i<7100;i++) {
+        this.result+=~~((dens[i]*10));
+    }
+
+    if (this.result!=74) {
+        alert("checksum failed: " + this.result);
+    }
+}
+
+function setupNavierStokes()
+{
+    solver = new FluidField(null);
+    solver.setResolution(128, 128);
+    solver.setIterations(20);
+    solver.setDisplayFunction(function(){});
+    solver.setUICallback(prepareFrame);
+    solver.reset();
+}
+
+function tearDownNavierStokes()
+{
+    solver = null;
+}
+
+function addPoints(field) {
+    var n = 64;
+    for (var i = 1; i <= n; i++) {
+        field.setVelocity(i, i, n, n);
+        field.setDensity(i, i, 5);
+        field.setVelocity(i, n - i, -n, -n);
+        field.setDensity(i, n - i, 20);
+        field.setVelocity(128 - i, n + i, -n, -n);
+        field.setDensity(128 - i, n + i, 30);
+    }
+}
+
+var framesTillAddingPoints = 0;
+var framesBetweenAddingPoints = 5;
+
+function prepareFrame(field)
+{
+    if (framesTillAddingPoints == 0) {
+        addPoints(field);
+        framesTillAddingPoints = framesBetweenAddingPoints;
+        framesBetweenAddingPoints++;
+    } else {
+        framesTillAddingPoints--;
+    }
+}
+
+// Code from Oliver Hunt (http://nerget.com/fluidSim/pressure.js) starts here.
+function FluidField(canvas) {
+    function addFields(x, s, dt)
+    {
+        for (var i=0; i<size ; i++ ) x[i] += dt*s[i];
+    }
+
+    function set_bnd(b, x)
+    {
+        if (b===1) {
+            for (var i = 1; i <= width; i++) {
+                x[i] =  x[i + rowSize];
+                x[i + (height+1) *rowSize] = x[i + height * rowSize];
+            }
+
+            for (var j = 1; i <= height; i++) {
+                x[j * rowSize] = -x[1 + j * rowSize];
+                x[(width + 1) + j * rowSize] = -x[width + j * rowSize];
+            }
+        } else if (b === 2) {
+            for (var i = 1; i <= width; i++) {
+                x[i] = -x[i + rowSize];
+                x[i + (height + 1) * rowSize] = -x[i + height * rowSize];
+            }
+
+            for (var j = 1; j <= height; j++) {
+                x[j * rowSize] =  x[1 + j * rowSize];
+                x[(width + 1) + j * rowSize] =  x[width + j * rowSize];
+            }
+        } else {
+            for (var i = 1; i <= width; i++) {
+                x[i] =  x[i + rowSize];
+                x[i + (height + 1) * rowSize] = x[i + height * rowSize];
+            }
+
+            for (var j = 1; j <= height; j++) {
+                x[j * rowSize] =  x[1 + j * rowSize];
+                x[(width + 1) + j * rowSize] =  x[width + j * rowSize];
+            }
+        }
+        var maxEdge = (height + 1) * rowSize;
+        x[0]                 = 0.5 * (x[1] + x[rowSize]);
+        x[maxEdge]           = 0.5 * (x[1 + maxEdge] + x[height * rowSize]);
+        x[(width+1)]         = 0.5 * (x[width] + x[(width + 1) + rowSize]);
+        x[(width+1)+maxEdge] = 0.5 * (x[width + maxEdge] + x[(width + 1) + height * rowSize]);
+    }
+
+    function lin_solve(b, x, x0, a, c)
+    {
+        if (a === 0 && c === 1) {
+            for (var j=1 ; j<=height; j++) {
+                var currentRow = j * rowSize;
+                ++currentRow;
+                for (var i = 0; i < width; i++) {
+                    x[currentRow] = x0[currentRow];
+                    ++currentRow;
+                }
+            }
+            set_bnd(b, x);
+        } else {
+            var invC = 1 / c;
+            for (var k=0 ; k<iterations; k++) {
+                for (var j=1 ; j<=height; j++) {
+                    var lastRow = (j - 1) * rowSize;
+                    var currentRow = j * rowSize;
+                    var nextRow = (j + 1) * rowSize;
+                    var lastX = x[currentRow];
+                    ++currentRow;
+                    for (var i=1; i<=width; i++)
+                        lastX = x[currentRow] = (x0[currentRow] + a*(lastX+x[++currentRow]+x[++lastRow]+x[++nextRow])) * invC;
+                }
+                set_bnd(b, x);
+            }
+        }
+    }
+
+    function diffuse(b, x, x0, dt)
+    {
+        var a = 0;
+        lin_solve(b, x, x0, a, 1 + 4*a);
+    }
+
+    function lin_solve2(x, x0, y, y0, a, c)
+    {
+        if (a === 0 && c === 1) {
+            for (var j=1 ; j <= height; j++) {
+                var currentRow = j * rowSize;
+                ++currentRow;
+                for (var i = 0; i < width; i++) {
+                    x[currentRow] = x0[currentRow];
+                    y[currentRow] = y0[currentRow];
+                    ++currentRow;
+                }
+            }
+            set_bnd(1, x);
+            set_bnd(2, y);
+        } else {
+            var invC = 1/c;
+            for (var k=0 ; k<iterations; k++) {
+                for (var j=1 ; j <= height; j++) {
+                    var lastRow = (j - 1) * rowSize;
+                    var currentRow = j * rowSize;
+                    var nextRow = (j + 1) * rowSize;
+                    var lastX = x[currentRow];
+                    var lastY = y[currentRow];
+                    ++currentRow;
+                    for (var i = 1; i <= width; i++) {
+                        lastX = x[currentRow] = (x0[currentRow] + a * (lastX + x[currentRow] + x[lastRow] + x[nextRow])) * invC;
+                        lastY = y[currentRow] = (y0[currentRow] + a * (lastY + y[++currentRow] + y[++lastRow] + y[++nextRow])) * invC;
+                    }
+                }
+                set_bnd(1, x);
+                set_bnd(2, y);
+            }
+        }
+    }
+
+    function diffuse2(x, x0, y, y0, dt)
+    {
+        var a = 0;
+        lin_solve2(x, x0, y, y0, a, 1 + 4 * a);
+    }
+
+    function advect(b, d, d0, u, v, dt)
+    {
+        var Wdt0 = dt * width;
+        var Hdt0 = dt * height;
+        var Wp5 = width + 0.5;
+        var Hp5 = height + 0.5;
+        for (var j = 1; j<= height; j++) {
+            var pos = j * rowSize;
+            for (var i = 1; i <= width; i++) {
+                var x = i - Wdt0 * u[++pos];
+                var y = j - Hdt0 * v[pos];
+                if (x < 0.5)
+                    x = 0.5;
+                else if (x > Wp5)
+                    x = Wp5;
+                var i0 = x | 0;
+                var i1 = i0 + 1;
+                if (y < 0.5)
+                    y = 0.5;
+                else if (y > Hp5)
+                    y = Hp5;
+                var j0 = y | 0;
+                var j1 = j0 + 1;
+                var s1 = x - i0;
+                var s0 = 1 - s1;
+                var t1 = y - j0;
+                var t0 = 1 - t1;
+                var row1 = j0 * rowSize;
+                var row2 = j1 * rowSize;
+                d[pos] = s0 * (t0 * d0[i0 + row1] + t1 * d0[i0 + row2]) + s1 * (t0 * d0[i1 + row1] + t1 * d0[i1 + row2]);
+            }
+        }
+        set_bnd(b, d);
+    }
+
+    function project(u, v, p, div)
+    {
+        var h = -0.5 / Math.sqrt(width * height);
+        for (var j = 1 ; j <= height; j++ ) {
+            var row = j * rowSize;
+            var previousRow = (j - 1) * rowSize;
+            var prevValue = row - 1;
+            var currentRow = row;
+            var nextValue = row + 1;
+            var nextRow = (j + 1) * rowSize;
+            for (var i = 1; i <= width; i++ ) {
+                div[++currentRow] = h * (u[++nextValue] - u[++prevValue] + v[++nextRow] - v[++previousRow]);
+                p[currentRow] = 0;
+            }
+        }
+        set_bnd(0, div);
+        set_bnd(0, p);
+
+        lin_solve(0, p, div, 1, 4 );
+        var wScale = 0.5 * width;
+        var hScale = 0.5 * height;
+        for (var j = 1; j<= height; j++ ) {
+            var prevPos = j * rowSize - 1;
+            var currentPos = j * rowSize;
+            var nextPos = j * rowSize + 1;
+            var prevRow = (j - 1) * rowSize;
+            var currentRow = j * rowSize;
+            var nextRow = (j + 1) * rowSize;
+
+            for (var i = 1; i<= width; i++) {
+                u[++currentPos] -= wScale * (p[++nextPos] - p[++prevPos]);
+                v[currentPos]   -= hScale * (p[++nextRow] - p[++prevRow]);
+            }
+        }
+        set_bnd(1, u);
+        set_bnd(2, v);
+    }
+
+    function dens_step(x, x0, u, v, dt)
+    {
+        addFields(x, x0, dt);
+        diffuse(0, x0, x, dt );
+        advect(0, x, x0, u, v, dt );
+    }
+
+    function vel_step(u, v, u0, v0, dt)
+    {
+        addFields(u, u0, dt );
+        addFields(v, v0, dt );
+        var temp = u0; u0 = u; u = temp;
+        var temp = v0; v0 = v; v = temp;
+        diffuse2(u,u0,v,v0, dt);
+        project(u, v, u0, v0);
+        var temp = u0; u0 = u; u = temp;
+        var temp = v0; v0 = v; v = temp;
+        advect(1, u, u0, u0, v0, dt);
+        advect(2, v, v0, u0, v0, dt);
+        project(u, v, u0, v0 );
+    }
+    var uiCallback = function(d,u,v) {};
+
+    function Field(dens, u, v) {
+        // Just exposing the fields here rather than using accessors is a measurable win during display (maybe 5%)
+        // but makes the code ugly.
+        this.setDensity = function(x, y, d) {
+             dens[(x + 1) + (y + 1) * rowSize] = d;
+        }
+        this.getDensity = function(x, y) {
+             return dens[(x + 1) + (y + 1) * rowSize];
+        }
+        this.setVelocity = function(x, y, xv, yv) {
+             u[(x + 1) + (y + 1) * rowSize] = xv;
+             v[(x + 1) + (y + 1) * rowSize] = yv;
+        }
+        this.getXVelocity = function(x, y) {
+             return u[(x + 1) + (y + 1) * rowSize];
+        }
+        this.getYVelocity = function(x, y) {
+             return v[(x + 1) + (y + 1) * rowSize];
+        }
+        this.width = function() { return width; }
+        this.height = function() { return height; }
+    }
+    function queryUI(d, u, v)
+    {
+        for (var i = 0; i < size; i++)
+            u[i] = v[i] = d[i] = 0.0;
+        uiCallback(new Field(d, u, v));
+    }
+
+    this.update = function () {
+        queryUI(dens_prev, u_prev, v_prev);
+        vel_step(u, v, u_prev, v_prev, dt);
+        dens_step(dens, dens_prev, u, v, dt);
+        displayFunc(new Field(dens, u, v));
+    }
+    this.setDisplayFunction = function(func) {
+        displayFunc = func;
+    }
+
+    this.iterations = function() { return iterations; }
+    this.setIterations = function(iters) {
+        if (iters > 0 && iters <= 100)
+           iterations = iters;
+    }
+    this.setUICallback = function(callback) {
+        uiCallback = callback;
+    }
+    var iterations = 10;
+    var visc = 0.5;
+    var dt = 0.1;
+    var dens;
+    var dens_prev;
+    var u;
+    var u_prev;
+    var v;
+    var v_prev;
+    var width;
+    var height;
+    var rowSize;
+    var size;
+    var displayFunc;
+    function reset()
+    {
+        rowSize = width + 2;
+        size = (width+2)*(height+2);
+        dens = new Array(size);
+        dens_prev = new Array(size);
+        u = new Array(size);
+        u_prev = new Array(size);
+        v = new Array(size);
+        v_prev = new Array(size);
+        for (var i = 0; i < size; i++)
+            dens_prev[i] = u_prev[i] = v_prev[i] = dens[i] = u[i] = v[i] = 0;
+    }
+    this.reset = reset;
+    this.getDens = function()
+    {
+        return dens;
+    }
+    this.setResolution = function (hRes, wRes)
+    {
+        var res = wRes * hRes;
+        if (res > 0 && res < 1000000 && (wRes != width || hRes != height)) {
+            width = wRes;
+            height = hRes;
+            reset();
+            return true;
+        }
+        return false;
+    }
+    this.setResolution(64, 64);
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/pdfjs.js b/suite/cts/deviceTests/browserbench/assets/octane/pdfjs.js
new file mode 100644
index 0000000..a915220
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/pdfjs.js
@@ -0,0 +1,33056 @@
+// Portions copyright 2012 Google, Inc.
+// Portions copyright 2011 Mozilla Foundation. All rights reserved.
+
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+// The PDF-JS code in this file has been written by Mozilla.
+// It is available in its latest version from:
+//
+//   https://github.com/mozilla/pdf.js
+
+
+//////// Benchmark set-up. (c) by Google. ////////
+
+var pdf_file = "test.pdf";
+var canvas_logs = [];
+
+var PdfJS = new BenchmarkSuite("PdfJS", 9000000, [
+  new Benchmark("PdfJS", runPdfJS, setupPdfJS, tearDownPdfJS, 4)
+]);
+
+function setupPdfJS() {
+  // Check for Typed Arrays support, throw error if not.
+  if (!(typeof Uint8Array != "undefined" &&
+    typeof Float64Array != "undefined" &&
+    typeof (new Uint8Array(0)).subarray != "undefined")) {
+      throw "TypedArrayUnsupported";
+    }
+
+  PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF()));
+}
+
+function runPdfJS() {
+  PDFJS.getDocument(pdf_file).then(function(pdf) {
+    var canvas = PdfJS_window.document.getElementById('canvas');
+    var context = canvas.getContext('2d');
+    var renderContext = {canvasContext: context};
+    canvas_logs.push(context.__log__);
+
+    // Cycle through all pages.
+    function renderPages(i, j) {
+      if (i > j) return;
+      context.clearRect(0, 0, canvas.width, canvas.height);
+      pdf.getPage(i).then(function(page) {
+        renderContext.viewport = page.getViewport(1);
+        canvas.height = renderContext.viewport.height;
+        canvas.width = renderContext.viewport.width;
+        page.render(renderContext).then(renderPages.bind(null, i + 1, j));
+      });
+    }
+    renderPages(1, pdf.numPages);
+  });
+
+  // Wait for everything to complete.
+  PdfJS_window.flushTimeouts();
+}
+
+function tearDownPdfJS() {
+  // Should produce 36788 939524096 for all runs.
+  for (var i = 0; i < canvas_logs.length; ++i) {
+    var log_length = canvas_logs[i].length;
+    var log_hash = hash(canvas_logs[i].join(" "));
+    var expected_length = 36788;
+    var expected_hash = 939524096;
+    if (log_length !== expected_length || log_hash !== expected_hash) {
+      var message = "PdfJS produced incorrect output: " +
+          "expected " + expected_length + " " + expected_hash + ", " +
+          "got " + log_length + " " + log_hash;
+      console.log(message + "\n");
+      throw message;
+    }
+  }
+  // Allow GC of global state.
+  delete this.PDFJS;
+  delete this.PdfJS_window;
+}
+
+function buffer(s) {
+  var b = new ArrayBuffer(s.length);
+  var a = new Uint8Array(b);
+  for (var i = 0; i < s.length; ++i) a[i] = s.charCodeAt(i);
+  return b;
+}
+
+function hash(s) {
+  var up = Math.floor((s.length + 3) / 4);
+  var h = 0;
+  for (var i = 0; 4*i - 3 < s.length; i += 4) {
+    for (var j = 0; j < 4 && i + j < s.length; ++j)
+      h = (h + s.charCodeAt(i + j) << (8*j)) | 0;
+  }
+  return h;
+}
+
+
+///////// Mocks of relevant browser functionality. (c) by Google. ////////
+
+// Every acces to window will be redirected to PdfJS_window.
+var PdfJS_window = Object.create(this);
+
+function PdfJS_windowInstall(name, x) {
+  Object.defineProperty(PdfJS_window, name, {value: x});
+}
+
+PdfJS_windowInstall("setTimeout", function(cmd, delay) {
+  PdfJS_window.__timeouts__.push(cmd);
+});
+
+PdfJS_windowInstall("flushTimeouts", function() {
+  while (PdfJS_window.__timeouts__.length != 0) {
+    var next = PdfJS_window.__timeouts__.pop();
+    if (typeof next === "function")
+      next({data: "{}"});
+    else
+      eval(next);
+  }
+});
+
+PdfJS_windowInstall("window", PdfJS_window);
+
+PdfJS_window.__timeouts__ = [];
+PdfJS_window.__resources__ = {};
+
+
+// Base64 encoding/decoding is based on code by Grant Galitz.
+PdfJS_window.__to64__ = [
+  "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+  "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+  "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
+  "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
+  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/", "="
+];
+
+PdfJS_windowInstall("btoa", function(data) {
+  var result = "";
+  if (data.length > 0) {
+    var i = 0;
+    while (i < data.length) {
+      var b1 = data.charCodeAt(i++) & 0xff;
+      var b2 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
+      var b3 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
+      result += PdfJS_window.__to64__[b1 >> 2];
+      if (i === data.length + 2) {
+        result += PdfJS_window.__to64__[(b1 & 0x3) << 4] + "==";
+      } else {
+        result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)];
+        if (i === data.length + 1) {
+          result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "=";
+        } else {
+          result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] +
+	      PdfJS_window.__to64__[b3 & 0x3F];
+        }
+      }
+    }
+  }
+  return result;
+});
+
+PdfJS_window.__from64__ =
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+PdfJS_windowInstall("atob", function(data) {
+  var result = "";
+  var i = 0;
+  while (i < data.length) {
+    var x1 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
+    var x2 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
+    var x3 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
+    var x4 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
+    result += String.fromCharCode((x1 << 2) | (x2 >> 4));
+    if (x3 != 0x40) {
+       result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2));
+       if (x4 != 0x40) {
+         result += String.fromCharCode(((x3 & 0x03) << 6) | x4);
+      }
+    }
+  }
+  return result;
+});
+
+
+PdfJS_windowInstall("XMLHttpRequest", function() {
+  this.open = function(type, url, some_bool) {
+    this.url = url;
+  }
+  this.overrideMimeType = function() {}
+  this.send = function() {
+    this.response = PdfJS_window.__resources__[this.url];
+    this.readyState = 4;
+    this.status = 0;
+    this.onreadystatechange();
+  }
+});
+
+PdfJS_windowInstall("console", this.console ? this.console : {
+  log: function(s) {
+    // To verify that the test produces the right results,
+    // uncomment this code.
+    /*
+    var re = new RegExp("%d", "g");
+    var args = arguments;
+    var i = 0;
+    print(s.replace(re, function() { return args[++i] }));
+    */
+  }
+});
+
+PdfJS_windowInstall("location", {
+  protocol: ""
+});
+
+PdfJS_windowInstall("Event", function() {
+  this.initEvent = function(name) {
+    this.name = name;
+  }
+});
+
+PdfJS_windowInstall("Element", function(type) {
+  this.__listeners__ = {};
+  this.element_type = type;
+  this.insertBefore = function() {};
+  this.addEventListener = function(name, listener) {
+    this.__listeners__[name] = listener;
+  };
+  this.removeEventListener = function(name) {
+    delete this.__listeners__[name];
+  };
+  this.dispatchEvent = function(event) {
+    this.__listeners__[event.name](event)
+  };
+  this.getElementsByTagName = function(name) {
+    if (name === "head") {
+      return [{appendChild: function() {}}]
+    }
+  };
+  this.appendChild = function() {};
+  this.setAttribute = function() {};
+  this.sheet = {
+    cssRules: [],
+    insertRule: function() {}
+  };
+});
+
+PdfJS_windowInstall("Context", function() {
+  this.__log__ = [];
+  this.save = function() {
+    this.__log__.push("save","\n");
+  }
+  this.restore = function() {
+    this.__log__.push("restore","\n");
+  }
+  this.transform = function(a,b,c,d,e,f) {
+    this.__log__.push("transform",a,b,c,d,e,f,"\n");
+  }
+  this.translate = function(x,y) {
+    this.__log__.push("translate",x,y,"\n");
+  }
+  this.scale = function(x,y) {
+    this.__log__.push("scale",x,y,"\n");
+  }
+  this.rect = function(x,y,w,h) {
+    this.__log__.push("rect",x,y,w,h,"\n");
+  }
+  this.clip = function() {
+    this.__log__.push("clip","\n");
+  }
+  this.fill = function() {
+    this.__log__.push("fill","\n");
+  }
+  this.stroke = function() {
+    this.__log__.push("stroke","\n");
+  }
+  this.beginPath = function() {
+    this.__log__.push("beginPath","\n");
+  }
+  this.closePath = function() {
+    this.__log__.push("closePath","\n");
+  }
+  this.moveTo = function(x,y) {
+    this.__log__.push("moveTo",x,y,"\n");
+  }
+  this.lineTo = function(x,y) {
+    this.__log__.push("lineTo",x,y,"\n");
+  }
+  this.fillRect = function(x,y,w,h) {
+    this.__log__.push("fillRect",x,y,w,h,"\n");
+  }
+  this.fillText = function(s,x,y,w) {
+    this.__log__.push("fillText",s,x,y,"\n");
+  }
+  this.strokeText = function(s,x,y,w) {
+    this.__log__.push("strokeText",s,x,y,"\n");
+  }
+  this.getImageData = function(x,y,w,h) {
+    this.__log__.push("getImageData",x,y,w,h,"\n");
+    return {data: []};
+  }
+  this.putImageData = function(data,x,y) {
+    this.__log__.push("putImageData","{...}",x,y,"\n");
+  }
+  this.drawImage = function(image,x,y) {
+    this.__log__.push("drawImage","<elem>",x,y,"\n");
+  }
+  this.getParameter = function(name) {
+    this.__log__.push("getParameter",name,"\n");
+    return null;
+  }
+  this.enable = function() {
+    this.__log__.push("enable","\n");
+  }
+  this.disable = function() {
+    this.__log__.push("disable","\n");
+  }
+  this.depthFunc = function(param) {
+    this.__log__.push("depthFunc",param,"\n");
+  }
+  this.clearColor = function(r,g,b,a) {
+    this.__log__.push("clearColor",r,g,b,a,"\n");
+  }
+  this.clear = function(m) {
+    this.__log__.push("clear",m,"\n");
+  }
+  this.clearRect = function(x,y,w,h) {
+    this.__log__.push("createRect",x,y,w,h,"\n");
+  }
+});
+
+PdfJS_windowInstall("Canvas", function() {
+  this.getContext = function() {
+    return new PdfJS_window.Context();
+  }
+  this.width = 100;
+  this.height = 100;
+  this.style = { visibility: "visibile" };
+});
+
+PdfJS_windowInstall("document", {
+  body : new PdfJS_window.Element("body"),
+  documentElement : new PdfJS_window.Element("document"),
+  createElement : function(element_type) {
+    var element;
+    if (element_type === "canvas") {
+      element = new PdfJS_window.Canvas();
+    } else {
+      element = new PdfJS_window.Element(element_type);
+    }
+    element.parentNode = new PdfJS_window.Element("dummy_parent");
+    return element;
+  },
+  getElementById : function(name) {
+    if (name === "canvas") {
+      return new PdfJS_window.Canvas();
+    } else {
+      return undefined;
+    }
+  },
+  getElementsByTagName : function(element) {
+    if (element === "script") {
+      return new Array(new this.createElement(element));
+    }
+  },
+  createEvent : function() { return new PdfJS_window.Event() }
+});
+
+PdfJS_window.window.addEventListener = function(name, listener) {
+  PdfJS_window.setTimeout(listener)
+}
+
+PdfJS_windowInstall("Worker", undefined);
+
+
+///////// The PDF we want to render, encoded in base64. ////////
+
+function getPDF() {
+  return "JVBERi0xLjQKJdDUxdgKMyAwIG9iaiA8PAovTGVuZ3RoIDMxMTAgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjalVlLk+O2Eb7Pr1B8MadqRfP9uGX9iu2yEyc7VU7V7h4wFCTRQ5EKQM7u5pK/nq8flMhdeVO5iECj0Wh0N7o/QF8/3H31fVxs4jJM4jzbPOw3cZGEZVRtyjgP4zrfPOw2r4PfjvdJEXy436ZREnx/X9bB1DdjO/SmE9qvbjg4czq1/UEIv5hxtM7fv3346avvk3gTx2Gd5wmtkBR1WOX1pgiTrBT5b6IoFda4XLJukzwL87jebNMizDGHuX8ajj1WgUY/TIej9S+oUwY/9n5sx4nUsvdx0At1Pzjh/daM5h6EZ/qxo+39032eB+b8glbeZBm2XWy2cRrWs1rfHE13ol2wgIf7Kg7sU9/qRFXhfhsH/7nP6igYDhiB8KEzIjOFKdNcZVYiM4uTupCpf8G0qg6G0T7eb2meO8i8bVqHRVqvJ7767btvv/trKFPd76fjnxsfNrSeahl6KzZMk00d1kVSkAlzGLuAqKwKy0pFvXz0ozPNKOzVgnsbF3GYRwk1wlTt/RIGSPIi8MN+pPXe3SdVYJwVKuleBbYZTpb5yuA0zGOm30njNJCZHNxihQfs586+f0EbT4J2FLb2cxKcTm1PZ15ycKPpSRWdPA6qJi01ugmLNdyklrNi2TiDRTN8Ochkf7x6ncu+bNfBxlmaBL/dVyl1tzDW1IyTszvhEztUSzvUqjtGrfEfpMUKkVzXjpaCNEovo8VldGcfp4OOYj9xsJPxsxtI/nO7syrZyKcZus7y6RPGYc9bi3RThWyKLI7pu6mj6WkBdY5mpFYRNKYXkvpOqM5uJ097ZOZhJu6mRhn2UG4iO0j3vDrzBSkmpvcwYJ7FwTcDu+eZzSqemlMGpnemP0zmYP1Ke3XJuTO0alZEkNo39jxONC/L66BrT+3oZYxMQLTxqMziEvr5IAQo+djZkxc+jgejky6bp87VXMa1sAK2UCUpch1iYJHrWIHPKj75I9gSMvfgSThO60VlkB9NQ+o9YYEyiYIfSaN+ntEq09lIiFsnfYlMEeaPgwSfziGnEv0akoMM7a0hZ3kZRpQIdbkb9D+7m5bipKqgjxvbhmyDQM2Q3o8tEq/bDm5HKhLLLNdLl88tNTrz7w/Sss/3dKC7yRCfCpJQxGgjwTK69nEardAODlvoeHotEQkie6qEp7a3NCb3jeJ/eI4CEZ+XrFQU2PeGsg4XjDq+WJWGTqZvz9ggL11SlPlRZ8lWQBud1bnJHPwy4O2zipIcxyGOmbyjCbm5bWaS6Q4DNDye/Itb6vNaWVxQkkPY2jm/EUmCPC5JfBycj2arEYy6xgxHOyF24SjpvonyiGMdbUOq0TRdXQTtSdlBOy/h4jdRnDUthwYm/SirIwW2B9vzeQRVcgTr2N9KPAdzslucX3YC54akLmd7eSgVc35Ng1cty6TRi0/VfWXwQQYkqZayd2o8saF1VFJoGfipaaz3+6lbLUaZiRPrKupvBs18BrYpFOOUnqYZcu9oOo4/UG+VHaJzXNL3qLMQtJ2Q5DS6DtlECnO2Qf1Js4LBDZQAQCjmohzDRTEOJKyeUv0isSgGk2T6Tyo1ZidxWAFa8ewHzh1pVq9yB/VnOh80+gKYnc6jdFh5fHf2hKMLUMDxn0fYXEx5hJu8MTC9idNMN4feZXNfqCgpL2gtUwxrtCgUt5IMK1gsrJ1R/FPEnhUXzRZ/IRrJicwomfhBWrIRYCHbnYWy1uJargTPgWDfn7uhHWUe52cWuZM01VMUjhoUlwXkFN6IesSeOv1Rqw+Fwsk8SXWk+NF4aTprnAy/E5Nx8HCx4OgjBfJAd7yKSg6jzS0I80mdirN1fc7inA1NA2Qz6iMpdXKWBQkAFjdm4qIVM9qgzyXR0UwkaS+JkYbmmu4seY0oXGTAdykG4R+jrgcOq4KMxGWmyBZJFR14xHZ7bXv5EpICcpeOUaKRz7ymch5brrNH6TrbcHZuJVHrzHFWQRf+Uultf57G9SIUH7fytTtMiywdFRcIR+2d7XRBirksyjWHR8VyRaIP08hLUtt4YRHIAAJq+NSNyJoFAM0DZ8czVRS2+lVorpbMFvlOJd3UfWcp3feMaoHeaGpCRrGO4BKRyJ38xQpOmnsC0+pcBu/10tQrOZPrhSIQucj/jxVRxeg80agC/+K6qY9Kp57ASaORpqWU5uhbaeVIa43wYRyp4BGh06qtE5RxhWRY0HxrSa/QTxjPjnBdKxdKAr2428E/CLOjTIkD/79lnhgkyEVOmLtWqtwtpwFxtb1xlF9Kcji0xo/ii3JlI+CNYgYvYmz6CshMS4QgIZVFrSgJZ9IZAZ2TWVnMaUE6C/cR8yXRob1Wy/5LMJ4e/4+28LeJVgN+6IfR6IlFb49rzcDXSy+EB85prrfuS6VczU+9X1qH3RmCOQ+/EK4Q8mudV+Vv+WEgCh4pZuk8A+UAPU/dTjivt5+YLjpmZ3BVkN47gKRbuvdcBVJyPb8rZEnw1IvWSKWsGUYpimloXYLSK86gWClTRmi6C2Eg03tpKgUlGbXZuKel5DT4h/WoIpcMB8qrjy+lN7T/edyFbKg/KiMPArOSwGtcCBgkiqxl6NnACsr0MiA3dGpcK+elcBGdz3S9tkZyhdAnxYjJfJWmGZzkE2B0P6FiU1TublSS+eRD2QzTVo8MWQ1rOfkC8nth4dwKigYbzEW+qJPk0wp61VDnzDcUSbIgUDCIUN8e+kUZwJhHaF/wOx3GHCUchfeGV8RqrqXo42OLAjowNE6jOji08/2Zu0Y+AhG6ySp/r7nMybA6qz9Yxto4K5xEWZ7FgeLagf3q7FWcRtVi3yxsUCzUqg79zW34dme3lCFS2zCYwrICb0hTflQBdHsphEWxTgWIyAS5DoJ0NNenA6Hw0QPLvIRQtTRREwC0F5YZvJLA4XSW+yQ4BOSli4pKKl0y9u0yaen23sObNDev2AP0YIAv/PY7LeWE5IfJsdvAxQeVHhmmA/uUoASnYtAUtYIL+FCKh3QFj9BsvVeDWQTBCu9tM6nJQG4dUJddHjihb4Xb893qjxJYHq+9JSSxfZ4sokcGVK04mC/wVvhENXlQoS8ANQzr5XKf5rlA3qvkeJFxiX0OYth2p5LGi0StLbR8e+Iwriu55dzYFWzR2iu0y2ZTZuUC9suAZNByZqjgIRi7F6IM0gGwvnHto4D3JTcsls/vL0tx8yHhGzUHe1XRDXd+hFRtribytzCMGAon8GqoqPzEUBhnQ2FIrikfpEOG4hONzNdbYbxI3DvLMJ3azur7GnVW6WdeXa0fsSFbt+SE+5VNApoG2kZVFSzkvLnlpS09yaXzkxVaLR2NrM6XibbQ+zc15MK5t26+aSjmLbgu9v5s5pEv6L0OGVauwcRA+93x20aR8K1Q6fORk4HPvwss8iBkCxClexs/nitYoIEFCptfC+ZklF0MmF4qyOVBtLw+iPKoQljr6L1NwNPddw93/7qLoVm0iTdlsonzIoyrbNOc7l6/jTY70KF3mNbV5h1znTZxFYV5VKLdbV7d/f3ua/qXJyk3eViXJT8eVFmYlDEgQB2iLn38H0xSbaqwLgr+PygLAZs22zSsonr11ABwuXpqQH+nWRLNvSPbUyuuq4wfzcr5URBZuXUNP7Zp3+gsI5/F/y7onexpUKGDLnSiuK85RCv6XwptwCF+d67K4FXXHo5syU45nH1u/bzYM7O76yGk/zryqsI3gu91l+asezP87k/Hmes+5GNHtbTkuY5JdSRMjDBAef3DdKijtx/xEbWq31K0AtxotFZlMN8S5cpWycMXfR+Nn5efh+S6V9G7SHtoBaygdzUaMbPR5NEpXngzWm+yd8N+f8PpSRlmdQ1uqexc1+ioFmUgtq3FthlArt217Edqs4Oo8bMBCket/qd0Zf9o0CsKfR+dvEpk8t8PfZtu8Nat2WSrWRycp8eu9cd5nYW5OIUUxXUJhu7c4iTIjVmsAmRUVXG87nNlE+vcwKGXUlZHmQXg3TFUyINfO2vknYYKcjNJey4PIPqVeYgydLvt3vgj/Su5U25OrxpeW2/HUR8q6WbY71Yiy2DP/1lQHRlFoj60LZedH7aFrO+XFV2whLJ4qV3s9AdD/1fW9B/Xn8L5hZEYojrmKEiSsI5jmKkOq+szpWal/wISIDWMCmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMgMyAwIFIKL1Jlc291cmNlcyAxIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCAxMyAwIFIKPj4gZW5kb2JqCjEgMCBvYmogPDwKL0ZvbnQgPDwgL0YxNiA0IDAgUiAvRjIxIDUgMCBSIC9GMTcgNiAwIFIgL0YzMiA3IDAgUiAvRjggOCAwIFIgL0YzNCA5IDAgUiAvRjI3IDEwIDAgUiAvRjI4IDExIDAgUiAvRjMxIDEyIDAgUiA+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTQgMCBvYmoKWzUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNV0KZW5kb2JqCjE1IDAgb2JqClsyODUuNSA1MTMuOSA4NTYuNSA1MTMuOSA4NTYuNSA3OTkuNCAyODUuNSAzOTkuNyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0aDMgMAovTGVuZ3RoIDk1MDQgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjajbYFUBtaEzaMuxa3ErRAcXd3Kw7FAwQIFgjBvbh78aItLsWtWPHiFHfXAm1x60d7733t/2e+bzKTnN19dvc8K2fCQKOhzSZlBbEAyUOcYGxc7JzCABk1aQMuTgAnJw87Jyc3BgODDhjmAPpHj8GgB4K6giFOwv+BkIGCgLAnnSwQ9gRUgzgBlN0cAFw8AC5+YS4BYU5OADcnp9A/QAhUGCALdAdbAdTYAcoQJ5ArBoMMxNkLCraxhT3l+ecIYLJkBnAJCQmw/nEHSDmCoGBLoBNADQizBTk+ZbQEOgC0IZZgEMzrv0IwidrCYM7CHBweHh7sQEdXdgjURpyZFeABhtkCtECuIKg7yArwmzJAHegI+psaOwYDQMcW7PqXQRtiDfMAQkGAJ4UD2BLk5Prk4uZkBYICnrIDtJVUAa+cQU5/gVX/ArAC/i4OgIud61/h/vb+HQjs9McZaGkJcXQGOnmBnWwA1mAHEOCVvCo7zBPGCgA6Wf0GAh1cIU/+QHcg2AFo8QT4c3UgQF5KEwB8Yvg3P1dLKNgZ5sruCnb4zZHjd5inMss5WclAHB1BTjBXjN/3kwVDQZZPdffi+Lu59k4QDyeffyRrsJOV9W8aVm7OHLpOYBc3kJLs35gnFca/dTYgGICPk5NTgF8QAHIBgDwtbTl+J9Dxcgb9MXL9Vj9x8PNxhjgDrJ9ogPzA1qCnHwwfV6A7CACDuoH8fP7T8N8SBhcXwApsCQNYgGzAThj/jv6kBln/JT/1Hwr2BBhxPo0fF4Dz9+dfJ5OnCbOCODl4/Rv+p8UcmoYqWrJqL/+m/C+jtDTEE+DDxscPYOPm4wRwcfHzAgSeDn7/HedfFfiH/R+tBhD89+3+I6KSkzUEIPQXiafq/UPE/e/JYPp7bZgB/51BHfI0zyAA07/H35iTj9Py6Yvr/3kJ/rj8/83+7yj/1/H/3xvJuzk4/LEz/QX4/9iBjmAHr78RT/PsBnvaDTXI04Y4/S9UH/TXQktDHKz+16YEAz5tiJSTjcO/ygh2lQd7gqw0wDBL27+G6J8uPAV3ADuBNCCu4N8PDoCNi5Pzf2xPO2dp//SouD716o8J9LRS/51SzskSYvV797if+g6EQoFeGE+tf5L4AD5cT0tqBfL8M9sADnYnCOzJBfBEzg9gDYFi/O4oPx+AQ+q36o8kJADgAP5bEgRwWPxbEgJwWP5L4uLiBXBA/0N8iuP6HyI/gAP2R/yv21q6QaFPm/xnnp6o/CP/eTZAIE+QJcbCLMRSJMSuNqT9ukaKwoNtZ0xsmmFHP52ZzWcB+sntFgc1lbk6+80a9FIqdagHb3lLjulCcpH6weeopR41vDVZs+3O994sUWtypw1jfoK4f7zoSKqujwqdkk1Hctf3wcVXL8gesQW+U5khz8VNEEejgODao1fBs66vbGkkbHZHc7eaXwXzvmyKLVY3xjio+CtDvkXODCktCoyNCo3l2Zkn7teLy+lnueO/qJUTX2L4HcfyvPcxXOeOu5nxXqnQ4XbtIqMnMySlQrx4NjLJ6CO9/1aZZM6n5EPMmtjcO4HI+MHFkN6kGRU9Mlp/DVJoSCmbWFagaicBfVeuh2UW1EHPclwdwPiCug7NJ5ShRME6uYpuqMQshxIccPNAR6WdZABv9fJT9/Ou4xPdThbfpHhSYa7YvTHH55diBJsdOf789zcoHOXASQVV5FRruFW6RfVXxFOj2vl+clpDrrH1RT5Gfb/y2T9csdkh2oX7foA5Gq8K92J6CpJojN1ZaNTvJ59+e3jfmWA7ZNRQQ3hBFDyBZ9YhFLE1AeN+5EluFPgewqrETSKN8608R3BQOX2Nc4bQ0ZVSF0F/QvPWyuCYhnKyTwJn+iGn41uZxJLmybNj3m8grWjFWEyT6Sj2DOcAs4lRSonsoG3Bk3fCkAPhJl1ytyLZZEMjxwxTjkFgw/TybsAsbxpag8M572DSDPEOTFXUn5FaPzO0wkMVKGTzTAOt28V2QzMwcyyPuMvOvWqSOfTUxPWjixbtw0T1QCjdfQLopIuqKfXmAdlQJUBD8SwRKp8leiWnXFB7lylCsT7Jru5/VBqoN13jgqaq/NJsEs1uun4TA/b42l1loYD6E8jYDS1D9UzTJU5UL0lJajaU/PBGCNiOarb6gvFQXrZJSIFOr+39jaS7fdQQrJldjtLXu7zTsACcJfJO/SPWKxVqDsFbMtoztEm8UkWpRYGOWQlx2vJ3hTkksOO3Qx4iLJM7EQ58mJ2Y8vLY0vrbt1yh2s9pHvsQirhZGo4pUL6OmlPECAobJLQG/XDQLSdHbQ5RKjiXMPIoRyDfHLFEZzTcMy8mmyzN7VitwXK1UgTJf0h7QdzM4rq7jz01EaRjJfRVGrheFI33JnTRKG4EmEj/1qaWq+3eGhfVeD8VlfMAXeDbc6DWuCk+U+a9KokdPt0XGkePVe42ujanL9ANet/oX5M6z76poqYkm0z4lBsUm/+65e1jV0j1IGis2F7y1bjmlj60Wa73+Glh3yVf8w4TM0i9otjaTiTOSoIuwYH2Jf9xOVWPDcJuvM/NBT7LzerJtzSySUwCVm3NbRzuD20FdxWML0qcKsmMzWtNNKNDgoX3cTZXWnr4HcicOC2EwhxN2s++sx5xLJa8N35Nz09u9DJIVy6Krr85Ri3/1TET9ngtu+z9hmr1Zhmp8QXLhuS1N8+L4g+ME6n8H0LOuNOWUaI6GZBfMqWeZ9oHmteSyq49ctQOIqTaMz0bSoqLt0/Hc67GgZlfmh5If74NJ92c+WisGOR/+JrA7LL0S1L9IxHaHYElQxeuPxMhzSKGsvucKw6uX/qAkMusx+7Eus9WHn/Ys6ox17FkfLWQDPRrRk22z85v9l5EMkZlqDHWCtTjt+C/hRmu3SEZQ6kCfPlS1Yqb+Wjr3rB0VON2Uh0vHorWxIylysbF1LG2qf60tnuZkng83PGp8wv85VHuUA6tJ2fPlS0dYvmam5Hkot/G/gLtbDDGkJVSohwLOivArnPXZLfPnb0b5tmCRlSKfppkL9f92qGg+oOfVTg7G0gZc69u4EImIRU14IMYdanKFnGDLLadU7USrRehQTgF1rJso+81Y3t+xOcLe/F9cE57z8IxHhwhgWdNzJFFi1uPBMWHsMmPSYMA1oxTvRbXHO+u1PsdKUvsgDZshefTWAX9opYOpf2n443PvbVlFJusED+qxpbwI+W8HYH1dVEbIyybTBjkDTrYfEUc/mSfZPKaeRYJunCBLPjitFV8bV1AMTevzRy+Nw61PeBFbyMzPhSjdbNxKq4uV2FothrhfQGioX+WzF4aRrQuOxK2XLRM2wZPLrLfrC3I6W1v8aYcQWIFzU2QzL2R58ioZ5VTj4wLXQOdDriVHe8cfK0/x/EdvMMSLKFivjj0Lr8Xb+GB4pffgY3IWGdiLW5FsmTRpxjxWcXqwIruo7ub09IlRyehEa6MW7bwq528O6JSI7wkBPiKb33Yn7H2YHYCmGg8fWorXpveH0J2WTckDM+aJHdvtQg1pMHiP7cnjt6fHi+5R+jJzxhL2dp/hKQ3ViGv42ULIlGjIGQgnZ6yoHT2U0WqK5FruhcL8SJ4t/2K5J27cgzCBTgJMlPJ5hyuWZgMLLxD/SV6OqrLZLNzMX+zylRk/oo7LbrloYh0yduCB5lzC/PLBRupjl6NT3s1+rWZ4mlCtGm4UQeIwEF6YHMTOy2O6p43Rv17KGC76zaCuEVcvFMMlFvMo5k8wZb5gtNrcu1bKWluHN2FMpo+gBNtbSWCQsD4LvQZ7IyvapmMJzZFjDru81g72XwrEkkJbs+sr5FW5sZHcb4gpViCkLIcaNMFlieebZWtF82Wvd4X7cEqgXAlzGsd20GgTvIF4QrkaCjoKiSOqQpL38pVV+la7NTkdjoDT813Gjkz0Ur52vh1mRZOuYJXIG4TrxUT3pp6/BZlsw8tscONcRTAxH6wSlAPI+Ma/vRM6lRMbPwaegHQ2zYNuGTZcfS8YAJdVVD+EDPuH66huXnM+yzd+M5CMHCiZdIAezZDrbTmU31M5bP54s1nYAznuPX0aOYB6GkpVp7/9grXz0zMnrn4TFRRkQAr1mrTaf73O9Y5rBpdzmMlvmdV9u1agq0CDefPxcGYESgRjR9BANPOkLrsHPWpAkrJthrbZ/s55tVG0vLhHausqgxfHXUps9v3CeqlQYHtLPQ11E4Qzw0eFQDeRc9PPfoOowKj7piH0HRrXREy3sfo2Np3ZJoodi0/k25D6hKjUGzawqlt0tYgq8vYNAxUuuSEXe22ke9L25aZvuYAuC/2W+Zy6zo/BhcUswI26tczPr0iNZqISBozM5aI04d9ER0M5RBpicVqoN3Voqx0XOmpys1irrosJcySizOGDupzYXVPTyZBUt5PEMB5bc1GLjBLj0SdGXdILtoEHcSMK0s4AuRcXBZSQs4FeU1nJ4c3cTsnZXMbKYH3QgJYW0XNXRM+lUPFWc/KDWnqzczZoIsOC/Esp20u8G+ySN9tUy60zkflw7CQVGXgbaYwhJ0slNEjblVbe13iyVMGoHt2fKa9Qohl6lp6dcq4e5UCIKL1HwlOtQzHG+M1BK/7U90GYbMBb58vIUWQ8PY3R2+JutDqw6SNRfKlSq6RTe4LC5Gf115QWJMOeXh5+SoS5vschun6E4s6dI4AH9W+UyGnY8F1BOKfuC7Ntcyv45pNtvfejc2Iy49F96ZFuSdphg/Z4eY+4pMjJN1W5fATMbyzDESkKxrwb0jATIv68moXGRsRhDAVmRj+ArigzZX5YxwUDtjtkcd0w3Y1BdOSHhyGetV7JLCmNAT7o8ucvU/y39TqTzJvZ6V4sKMNfrkwWKFiH4utyUcSmT2sFFxm9+VeLuy7hQ7zCW41bh5tbFideIPHwYr7Xd2GLz0JO+9hMovktKvEEgb4OmLcGa7eom/TGIoeK4QjVf553VD0xv1l2TBKtarMdlvq2MsSqiVBhHjCt5Q3XtHsnjJTC/25jG86dUtS/RaMlXbII6DUOcO3wyTKNhRYOV0bwrtLshKk5KXDgCRUpqwf5Pjd7G+PqfhiDbSwzDmWbj+V+KAKmVcJrhPhxkdv9i7KP5NlVH0z4ms288g+VJGX5A48XNfeSRMR0GUYsRdB3FLFkpY2P4HZF/mhy/Xs4DYEGkcoamH3j9LKZxx+M8CrCfdd9ho/dfPf0cS3LbfvdOfVQ50uyoMnOnimot86liP4vSQloIeHIA7+Dn/m9b3pfCLbN/UFJr90Kj/MmWT2n4n64HIiYNFUCIUYvEdwsQRlObn/SLYhIm8F4OSk4VQdb1TcU2QVZwij2D8i25IjT3F/vPzl87gRBmnHg0Y2gQks4nfamdynD2Es3/vkUgYgLs9FOiNm2sY5dvHjWvkPjUqwVPFmT/Agzd0UTTpYP5bRSvPlI1NqxcXa8b7PC541RtEnvMu12olmpOOknoRcp8DcjOqnNUdH7uR0B2goSfu+GFOvJrgSeMj9+nldUb1wzN9arj8XixlGoCmIjv2tThSLwdOBMYiiGGP2vBLvxF/adlNsXb6+YI2W27jFhHU7YPqjJBTEVILjIL/H0hf1WuB+IXZx3rwI86OztgRDM9j3S/QNzBfOCO2K2EL0hkJATewme0qAxHVowqmB/M0EXuNkmQc37yreXGiXFYfFiay/EXP1DaoNb3E+z/7DigIjHIezenAPA24q1YJIZTsseRcbPk0YPobUef8Q65DwpsfPQy2TCJ8Dzgf9/XhFYCEnu0Vp2pYdjeFWnKRodNEu9pvLR2+vWYevzL8eaGsBS2cXKvkE41vBXSu6jpCpjBO0Be4iOEuEND/mwJytPe/kdWEyUfyPV6cXSyHyN9ToeZCes75gvNJ32/sKqrhewzqLAj9E5ZZONx+7XCL1/WXqC24cX5P9FNsDbbFbMdxi7XKK//ogskbQGd/URL/93XQMIU+c9XU2O5X83XJKEXxmLgN8isJnklZCuw5WRrgTYl3GMe2KMk7cwwyKmPJ07cpRmw7jreaeu6iMo5VJpJe2guzhhDRDxfUSib94/ZBf9o0Mneenn1rJjMzmi1wePVfo7agpDCzq7zOkk6pPIs0vrTudwgO5yLWI4yJ0aqmWob95DFSZl6T3XZDVr8yInj7n0FCvQzGdSOVh4VS52A466H1Y7m9i9ptGrFI+ULOhnaLnuxX8btZhUy7jyi3TIMCqkpOLO/NOAm2sbWycOW83NYJ3FesWZ5mLDr4H0lr+tqWJhEiJ2sAyR+Nq3j+yiQtQeIAG/PFm2/R9H+8D0RA/1XQKsx3Vqw+LQCJALxDbFOL1EGuaVz7FKESwlhZ5gbY3UM5Q0Ckq6rFZImYvkTKGuPRoJ1mh4Utpf0kcwFso/3gc5urHYvDweV7lg11xxk9LZ5MA/wxB0S7JrYTudJ7GQruWHe6c8DcMqfBCAupjZ/Te/gmmPd1RCOKOqp9V1beErrwij+q6ycKO0eAAwDlmlHFq3XtmWXaJ0Vm4WaH2nGprXq1L7rLTuEmDlpYRbDQPuue4ZlreFGiGI27MLhvrPoBbgkucCzQe2y3t47WsPQ2idXzZ4b4kTxRmQbTp4160ZIbZtJ6dBE0T0a+Q3hHriWj/WessMZfsT02Eyr3lFbI0hksdMyqyFENTlt1Xh0w7ogUGpAMJpOw5+9QTigct2DyKxBEDcKGlyvEXPYgaAtdJqXRfnsdrvWy21N0op9LR2YBnesdM3Xgvp2JqtcRQ30X741E7ml2lryyX0VfAJdxjRuGBbD7r9h39ul7kpHp+x/yjg+MUvwu3sVJYwHpaTOsy3GjncRFthCSQh7kXIw8TXl1gX1mgjhrp6waXQOnOrEq9N4ucCOnazfAoKb45hMH1OcGQlgQjAzGJVzdJRJmBfpqa3kKNn0zp6A316Jccm879UmtG1kHj+dnTn+uixhy9x4FL9QYFRJUS/EmQ8ZPPGwpmj6uBefezjmfJVJcf247VHWiYphdy3p5q3X2VnWl/Z8IWDn+1rfHTmvnFsfs9b9R4ebecsl7AmJFQp+N7EYSIY2gCDhSBJhZ0PHosUu9pOnUSvKwenD6ScVCRaCeg/+GQLqtuKgllGjVlbrhuaKBVWk+BKWAdvE1itK1UrC8lKtm8v5UlVsN/KVFNcGADhx9Dj60zrFB69Cw/iFPdVZXvYgFu7CBRlfqnWxRbHDz/rI2Z+y0Chuou5L1cdXN/gb8Sc70KDY/B9zGPT88w4VQ1r3ae+Vx1p8PGQCnsFJeW/cZsaMVSuVLp3S/geNRwhwh8V2q3VkBFpc7nH12JCEwFVbjS77xYbDhSTntLFgUqDrUBWKJgQiO7wRTL3gd9d5X36GSDS5WeBgb9dAhKkFCBaMy4rstl/JkNzBJly03hoZfazzuD21CYAGn7zsDiNSTa40FXE8a06qVNk2z7n996tOtVT72OV80e7a6/pGvNNYqebgF+jLTMoEE5msq7SbJsULuXvai2VlUKWYkSeiCEfNqK2HQqubgkRoxYcxWku+eWfVh5ZMg/RESzrFqo8ZA+165t9kstvDh4SSko6eWlqX3kNox/mjJu4P34zvFggcdz7jwSrEITW+nqFj2RZBVdtyAGJZX5aCDx06E9OHVEL0DfymtliU8ZN6Fuct9++YjzaPIaU7u1zVZ7RaVlO5a5mQg58Hng3G0ZeWRqg0OzxYbrGUXNow/8kbCST705I0Db+XHmK1YtfEF6YtXrVZtiRHGh0quJUQDeMnTUmiZYuHCOyGPdCYd6UQS3JRVwICl1q4KeKWET14OknugSdpiGxAtXK4jH3Buv834Uvc8SruvZSkm6lnbLuMrwqPCRPW/hT8JlbbS3fgsiPKJvlw6HG0QP0wDauqYIY9HxEOdzvPpf1rR8klLR6AW73y1cCA/hTSgvO/RnWfRexT9Xq4QtzrJqn9mYoZmZNORxhkZVHbIpDBvMXHvX7b9U8E1Cy7c2S4KayCkkLq0BXZay42wSih3RZ0wa1JwKf6WhuTPVyNZy1J8vqlqU4wccRM9ZbZ4uaFWKLClkSUgAlT/r6eBuPHqZ7i9V/mqyKXT0X880rzXkjtnfmIjwjUae8NmWUrZM09S6LsJycbJiWsVdyvbK+NF0CZEdNdcpU5aJR1r+qRjurQVcPh+YptK4r30onEvBmzuMHPbsz5aRbHuMSVZzHhM1io/lHJcoeQANiCAY6hyex78MLdUyKrC/tukbL479RUgUPEmSAkQO7aQtc8Ex/Wgxe1bTsbYwiM6ydR9A9ngMvTpe+O5bJSzchKeHrJ4g/apb1xtnaFnR4gyoUC2riFP9jZ6fnhem2t6AV61sAd+A0a50oq5EKjOb7dIAZFfJwGftr8QSD5RJ8sJwSEUTePHO0ToZk7EeMszVt1EqHLoLfpwKLcXfcaOqxXbsXgGpjwfC52YgSHKJAKSl746JTvwMmfK/klBoEPB0wYtbR26jmZedO3rceSHOV9Sud5ok+6lyorlANpTnvg0AMs4XTtfJeLdX9GSkpYNKVffuPEe5XM1KK8iYjLmHtwy3OwzZp5cxFCSuVjYpgg5B5Dkx9W6NjYIH2Lg8685v7wXxZV1Yk/s7GK9XcI141LDON1xRemGzHATjZd3NOlgieydJd424MiJEKSaysh/dOFcQUAuxZoo0743EvAMfh99r5LOoyOi6JNnnwaXEMIUPQUk/Dh43EKY2OKazawnE7wzn4CGJR4g7VOugIDvyh7U6G+HhfkcUWSf84DdUaWCg0x0Tbifl4T8z2tuaFoIx55BsfypNKEApJ9VotTq1QaMSw33eg17WYMi/m1miLe/gsoNSs0FTXptMgF7EFSwosbSFxDbk7ivpG3VwJHTJJT8/zrJ2dpl7EWgWqPc1+4AGxvJskhpN2PH6G3NWua2LnUlYEZvyUINqjtT6cgO7lZvuWl4epGHvhOj5QSbwQ3zPnbcuP/K4eZPpd+XWiLioMPiAFjyMReFHGPN3vAi6PZhnqZrS6f37JHMFsTW68u0kxyBA0gFb0YQaWmqNj/UMr1JYITrp/kki7KbGmIgavuwkW3aI3XfYcWKWjFFB1W7Yf1XGOmAE9g1bZL+Az+p6ubDhEvZ1B/xmJ49sXpkW6jwpem3HHEVhmte4GgxMCHyUxnK17dvjjjtzPg97xr4epegsBwTKRTsk55tzvN5Ikspw4NgnFELx8uqDIqOVNTakxQKRCTA2X9PtHXl0PVww2QR+dhfLDZrRffvFW93IbArW2Zs2rQKfEmohuGHzzEv2KHBZ7/ZtGJSHYpsxluWTRTC99sfMt1aDVlUR8Z8UeCsnTKcFw5n0hMcy4UP7NobRLvJZzCxFXRgr9RbF6d0QYH4Q1fxWZ+y0UYrIAn18KZdldyRPk9g7pI+Zi1HNjl3MB0V7fNm3K28ldIPIF9m+1bVSENL/CNTiri6jw6Dw8h4TFHCs4abye8nz2fsAbxfJ7N01T9HHhud6KIadp3j8J+VxSD/pTSIr+Pq6hn8Fv7SqYFuu9H1FUmb6+u1Ep6lNCGF26EP+PVnZe1Wly7NGedvbCprCn3ppc/4Yt+p0GNvwX45MDVzEp8KoPcnPTXSn5nnCD8LVi61j8AFqsTiD5Sy1YvSvlr6tpwNx+Q6Ja34SBBh8cubJXSup82TlPv2kPW9upmfGjai/5EEx9wE2Z1YfVoofAg/de/MVmku3r0P+Da5ApISQW6yQJhF3XZi7iDw8U2oI9yGxEIWhyvfdcz741rItjJMmkRuvJmtETZwmv8rPpbiJF3y3YMdCRaxQH3+OZ1zxvGEsous+r1ORAQ6i5q9eIQwSmZtgTD2ijpaUPlbZibDtc0p+tP/VduQaikOT0TwJP2hcPXDc+wsuKojudqIO+/aKhIa8L6dzkXjB/luJ9FAzaqz5zi2ek1AgGXXufvQdmvgEJupNAaZLAktFP5aTrX1F35tB7reoeIGBjOItrDmXi0fve7ZQhKztzcTeoTXlaw14KvdDnAa0vtJEvmpz/nlxuuibpzDmUp/McLrvpxFVRbGgPguxeQxuRyYMdIu/LWn0XMPv+KCR8D1Vb8fChu8kXc1ttiuCR8y0h+9b58OJuPyKwSukZHvtz4OUC3sO2838jZbkcxbCmYdT2mHl0hZo77HWB+FE/ZSgonUaucwJmXBZ1gyj2u/SAjBnE7eRWL+JWums9Ym4phjSI3eYF1dY12mvVyVq40zb45e4ppRd2KbqjfK1Jnb+INcDN3Fpa5Kd4nhpE8ZsITiWCS2plzT99BgLUCyuIIge42DEM4Rf2fpKysBjSboI94gbLI6eJpDPulMUJdXGITm4cPhO4M2PEYEqS6NwK//dlzh2YzpNe6XjYu28ZZjXCO8xsGg9KH00e7BnpoKVkHO5KztNBBrTduOnLqBten30j32fZwj2WzgdWr5jP2+60Vo8tqmsbfdvr9wo1FXG3GmB6/nFP2nV1MFwc41fZD2G1DNm6KG+xV7ycycbOfmRwDtg0z1urLPHWF7HZelt0kAeweD3aI7XRZKTR9TDvjtu7fLTLzQ9Rdzyl9x3Bd0b7zJfRvckF39+sLstR9Y/Sb4OGHi/aGJRa90fwnv12a36fNjCTUXe9JkgvSmTENRcXczoqq0qu5d+08MzUlvB8Ch0yLKxQYdeS1Ua4kf8QXEmR4TXhvsrdxyzH4MbvzirWcGVMhlfMh23BlV9mm7TvMRlE0segnhgOB3qevTqugTE1facdsHvetRtBzEOtqJFy32hY+kxVNqBQzG9oKkaOVo4QLbIlnlHPF/aUr3QKYQ0ebz2EVENkfBcysraJzKZKA7KicFkn9GuSBtJShU5DrvJMJLc6TNrD1pM79NzuNk9JeZ62RjO4ijM/8kkp0Mb9ypkMpAYPTorH0mYDWWAQ63nR3OjzJgxe9J56QCWv43KDV0/Ek5JoMtFzJywIyZnore8nNfHH6+Q7poWAAaJ1XDxYTnn6N65iw6vhC74UK/H8JrEh3d7t4kZGsfF8SzdXyWHRUiShEjy97T6z8csf/ZvjMaYHMh37UIIJo9K8N0ZeE3iwYocT9lHHvdK1VKSIYaoTKcjP2RG2oZp2XhG0fzgrDvBuoQZ66drglJwAAo2xzE1TRQK3jn2BDdlzLFy4MPN7tDq3alXRmr6DmxJpyxGp5uO0arPupzkcDbOOVxQXGtrA3+7ntBKbj+P2EWTWt3iyjtkHm/GtPGmtrwFX7fqXms/VFw7pd13lNsriHed+XlUvIqyWNUKrfHWvN9mbWunSriwbsNWzWn5IMYBXa3E0CU1+RhsPnhQkQQjlmDUSvXnDaOmzh2SicHK49cECECv9vHuNu+X0iv7gdczqePM/Eh+VxBe7w83QV54lPhf4KQFL3wtwNplhcoWG9U+4Qv6SJkvuLriggRIRVEFJ7r6MRpc9s2Fkt+4q/VIBVFkwDsVB0xewpv8oNwEJ+0LH2TfTsIyylDwTND7744ZO2DpyQNQhu52KzvZrkssXupT5z6l6VW+Ghq6BImrF0nyj5G8iJ5hr8+TKt50bhQM056KZzF9TXX7ccAZKIlJOtVv4gMocbW9RP9y73Nthqcazo5/KX1Y79T7k+So0Etft1/bf7RP5qLoNnhcWPhGAl2yLxL+/tMCn3vmZnzexhhDNGiFg1opnaVQ+ajb1Gmwja4clZiAeRHBaJ2XrB/nE7bm01+6xS+tjJAxTER07pj154eL1pm9R2u9NYteQ/a8QoLRMbkOjwr3396JyTvIdbEFJxNTUQy3RssfVJrVmyhKpo+Zb++tUfgPpSTlbJVE3agfQ6h3f9DZrsu03rJ+GYZ9cdEJhYlGSqcA3nK+0e3+GhIQCTAncn7PdLCReS+XG5K1lNwsEzHgK7akREVHj2JH0h1d60NF76uAu2AP/SJCKZ5xHUfXay1Ulu9tJyHCp1Bp+uJBnwmVJpKLBVsselXzbdWXOHi6OGtVv9VCheaOFZ6EW6lhQVEEC5FnxPXThMPcUpN7XY2KD+TMcr0VgbwDqxOC7NFC7Hbw+s2w3A+I6ka7kXNGQZUh2l3nL86DpE3eSOy428tDIlZIabTsDjaK5D/Tqp3RwNYaITHZz2nQFX0S92iK+VkwK1MTaX3PZCUmolnQsggxMjl3mx1vsQb4jg7Eul2FRLO25sbYxCUjlB8jV+Mb1ZA9m5txyBPtL8gWvrR1zbsc0ioQN8dgje31l9VwXCkXAdfdSMNu/Eew7eAakZreyCOS36yHmA5gDM9qu/sXWm+tp+f1fc++rw96Zdc/6iDHuZFTes+oWsP1WqXurehJ+f2wN4sukf+5eCFLid/D/A9GatEbzbQP2WZ1kgJhZpefTIo+LpvvpyJSsZYd6++AO04DgqTfHiMZZl+yq3QRZd3NRmmnjmAmwUOHSqd0v2armaF/r2rbQUTajI2Hy3fwhQ665wo1JHP6uGUly4QEdezA9NbIeg+tPHQgZuQ9D/eHj5c70ikIIMbOrGeGmBpaaIvCzcTGdbMWFLFqvBMLMfBMjk06+LTo1NUIhV8Pgi/iI7W6xAHWNA/Q5QbphrIt4SGj1EgLPE8POiXYqeNiodwBPd3Gt8I96x/aiSken22PjxvLGKmDj8mEMAha6dEFhsckPvySvvzU21vDHSJC2Rc00sXwMgi8eFymsXDRf0IKrPjGhsBdi0CM6jEi/n8AGodoJwplbmRzdHJlYW0KZW5kb2JqCjI0IDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL1FaS1JETStDTUJYMTAKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNTYgLTI1MCAxMTY0IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODYKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgMTE0Ci9YSGVpZ2h0IDQ0NAovQ2hhclNldCAoL0EvYS9iL2Mvci9zL3QpCi9Gb250RmlsZSAyMyAwIFIKPj4gZW5kb2JqCjI1IDAgb2JqIDw8Ci9MZW5ndGgxIDE1MjYKL0xlbmd0aDIgNzE5MwovTGVuZ3RoMyAwCi9MZW5ndGggODE5NCAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqNtwVUVN8bLgwiIS2dcihphu6QlpQGSYeZAQaGGRgapEtCBJFWKelS6QaRbqQ7JBQJSSm56K//37fWvWvWmjnPm/vZ+3n3OsPOrGvApwBF2cBUUUg3PkF+ASlASVvRVFAIEBAQ5hcQEMJnZzeEuyFgf9nx2Y1haFc4Cin1rwglNAzsdm1TBrtdB2qjkICGOwIQFAYExaQExaUEBAAhAQHJvwJRaClAGewBhwLa/IAGCglzxWdXQjl7o+F29m7Xff56BDghXICgpKQ47+90QMEJhoZDwEhAG+xmD3O67ggBIwADFAQOc/P+TwlOGXs3N2cpEMjT05Mf7OTKj0LbyXHxAp5wN3tAH+YKQ3vAoMAvyoAO2An2JzV+fHbA0B7u+ofDAGXr5glGw4BrAwIOgSFdr1PckVAYGrjuDhioawEPnGHIP4K1/gjgBf7cHECQX/Dvcn9m/yoER/5OBkMgKCdnMNIbjrQDbOEIGPBAVYvfzcuNFwAjob8CwQhX1HU+2AMMR4BtrgN+Lx0MqCroAeBrhn/yc4Wg4c5urvyucMQvjqBfZa63WQUJVUI5OcGQbq74v9anDEfDINf77g3683AdkShPpO9fyBaOhNr+ogF1dwYZIeEu7jB15T9jrk34/9jsYG6AqICAgLiYJABzAWBeEHvQrwaG3s6w307BX+ZrDn6+zihnwPaaBswPbgu7/sH3dQV7wAA3tDvMz/ffjv8ifEFBAAqHuAE2MDs4Ev+f6tdmmO0f+Pr80XAvwFzgWn6CgMCvz99PltcKg6KQCO9/wn8fMUjNVE1NUY/nT8p/OxUVUV6AL5+oMMAnJCoICAoKSwLiogKA33/r/L0Df7H/bdUFw/9cncA/FdWRtihA8g8S17v3FxGPP5XB+efYcAH/7aCDutYzDOD8R/4WAqICkOsvwf/nIfid8v+n/V9V/q/y/98VqbojEL/9nH8E/H/8YCc4wvvPiGs9u7tdz4Y26npCkP8bagL7Y6AVUQjo//rU3cDXE6KAtEP8vY1wV1W4FwyqC3eD2P8hor9O4bo4Ao6E6aJc4b8uHIBPUEDgf3zXMwdxvL5UXK/P6rcLdj1S/22pgoSgoL9mT0hUDACj0WBvfIFrgQmJigK+gtdDCoV5/dY2AOJHotyuU4Brcn6ALQqN/+tExYUBkPov028kKQmAIH+jX+sBQf8FRQEQ/B8oeO1F/gsKAiDU31DkutL1dfgvtwgAQv8LigEgt39BcQDk/hv+hx3EHY2+nvzf+rum/hf+fc3AYF4wCP70BAoiHerwPrTxx1sFek++tUHZT+xrJilcfL7T6Cb3M2LcRK7yl8GL6GOFxJ4PpHOrKpxH92aYLn236ipxI+oT9BrOH19Yx+uPrDXgTw1TdQ692VKo6GC8xcBneG/98aXLY+MgR6w6zBYN9kwXdwli3WzyH54f1bwqOopm+8Mn1vTWy8U0CS6KRvmeGsVYBOWPsWfZvBqnYcFx42PE4ybb8yIZOzr+RJYxdMWkEc+D7/ftqXCur9mSUOzpuM98iaGQaystG60ZDSPWEVn/yF1fxc0kDepJ34K8Zxrh0Xm2jFYTNXJNJGAXkXfMLdMyRX1Dy300X6yDlIpIVkfCn0H0VtgVe74gDDKaacgyK8TzRy8FrXPwXfWaNy6pfKJLx16iQ+Q7Hd22dYUiUtufI+6EHnHK4zRvRmwmTYpN0WZ3dkj6j3JUPr8KuBc/JWST5Wbe5gv2ItpuviH+47vf0JAaEu+1+aHhw205w2EMhh5WcK+gPXOGNM6j7dcm3Z1lZFeOcpj0hU9Hbmg69L9b1GjxIb5q13m9BQmRn7GSWT+9R3hjadLFcM09dApaZA4biU1zkNJoQ97s0zyPYhUyyH5r/mKr45WiDZl8f4k2ZjAq9L14eQEY/CYpMpuDrjbC7jD/RJdRarBypHD0CcEXaLki9PnjEfWi4Z2w+1aeT7RJyoqHYKzKyruCr4qFTRJyWiP5+4cPWjT4qcQmy8YYZVIMabV7vrFUyYWiaThpS3SCuyhfJxGuhLCmy9WYObQd22f3VPGkGP30LL/6vop/UckW97l9eMVi2USHXymX03jUYldnfZ0hs+lDrfBtYuwxBfl9hDWpa1uhdrhuzUkRQXOst62Bd8HyRIvN0u2B9keS7ozOsZ3HuivdcW913NETXFqy7vaFsePBo93Kg9NZ9W26Y9FW+X40NbVM2K2tY/if+QoGfYy4B2bvCJds+B+v3s/1pA7xWdOTujHeg9vARDyxPMD/YoQS4lVfRJXjQZNcRMeZFkwmYyYTJTaVJqo5O5ZWgfmJx+fitlpTlgAmV2sA+mFJQpTUZDlFDyQbk0qRqDBLXN14POgSe2It0+SqLl3fkqjqpeRHbDOzdEanxxBqVGjEu7ignmB1C6dwHYxwf2Tqi69r24THmbQCFrSXtlqE6eibUxM3ExuDHny88sebmR/Yjk0vbSXBxJLGDOXs5ZhZZwpKbrN9F0J0AcqFmCSHKKd0XdIWSGCG9J7pd3JakBSE1g+SZ9/8OD3aknbB5rxHnsA8zMI4dyBZEaMPyIqb7fsVvpyLs+TZ8oGF0Rjjmqf23qLDcaria+ZeXG1dEsmjYJt+Yaxsxlee1FaWOmYyo5nkXFVOuJNdW53lb+h+krs38WCrQpAyvoT5NIjBH5x+V1zkTcgGdsyXudGWDlxe2XqeviJjVWrIunCH8Ns+2i4Jxw4C+2/W2Ns4iAbKDQUkXtwiOG2tKrjmWKe1i2isRWovK988lW0gAyo1DIdQTqQ6XCqdawt9ftQvii7TenYglUPzueJN99lSafOA/9JPSCbZpPajWwVLkeTMtpLWcrpfy/3wVN8UHpfKYU+tp5AnVqfgruGJJDQySvjAbhjh8WjQbGOf0jrepiWUkeO9719mVdyNaSRX7n+bbMGf66YkdZJaBh+FdSjP0FgETrLQj8Y4pzT4+ungK0EM9LvEwm+HHXJmxTv9C/JDsQMSK7pmmE6bcTisTjBl3cORtIInYvX08S9OJfM8ZO1VWq1NOTu948J1fqTgckrS5W9QQ0UnZLIXTEWKsBtEyZmf7RGaKqXjvFW5o3EcW9xcQ2oxNWZpmkVBU590p7Is/WIawV071k8v9ZChik+OwblH/DixVqv+vLJryux1l5J/RRfi6PSoJIqsAZoq+GZAChR0Btgx81J04TfN+T3NItYb5NnDlRQ29gWaE/WeIia21MqqqleIxDGYpZluYHq78CyvF38nGtWoTAxQ2MLGubXuceIAQg+Pz7wMMWPUJeUSeWs7wfPA2dT6iZs/IJpk/kzfjE3GPlNpwTOlien7uYiuAvkLT3ubloD7p8JwFb/Q4Cpzklynbz4nifqUP9gYP11gmatkiviSh3109tEHmZx+Iea71RBUALZWx16vSnCyTyiC2e5zNNYGbpi7pNfk4/G/mlAScGcwyj5h/NZ0t2htlldh5JYnHwuPSAXbQq7caN2bFFnWMtg9TW6TG40qkeVuN617+DSaXnQR2DAO5kTkHJhBn+0V2kckxb2PfvZRzktnuzB7wXn1mStW3qs6Na3A6Qe59nIHGZ9QTw8/bWUWvKJrxZjRkN7T4LFwwh9kYtCgPRej6f3gSEseO+EUJMmCo0MIPFIebTNv2gM27cU8fRVIIDKyC2Uefun9JLoYSrmLeKPcUY9dFSaTv9lqdvIclgoyB5U+zU8wQJ6+6Vj1Z30aYH2bO9yS8XWVBXyPmfJUYwD+stelL8VJA9CsAGybMp94cxucYhL7HUfC1YzFPME1mNTLbE7vwz1kSH3M9OittMY3BHS+6rukHTPPcov3uGs9aByUtQkY8N+5sJ7XuHWpFKwuLyP6PRebwJDQxzW/ctvPXetRkvZUYFEzi/hrzeZPBFg7JxsN+5/D5yW8HwDRvvv7cW8eZ3o84rrzgV85nIFBOGt6PVGTLZGWImfzVmojwCsc8D4taXTetf2VMnXD0if9q8iE3A+GRNWB/ZB3uMVC3+JD2IMuvJUttCtvG0jen9rTe9o4/gpte6iWb3VhISoakci6Ou1BaR72cKiSi3KDSvOzQa4VQ6U/si61VJvO9JxX4m6OOJioE8r2M3k+kcDKDWRCFjTlPdQS0PKRJh/voESkVk/Tl2tadgAjzES5ESrXgKKDfZ0xS3eeTqSDh/LBSO7pPte6snn2uOSY1RmbRaxF8ymxFpOuad+ijw1xXoZZOGT0xO8qaJuLnVprStP2gRDJfFnQyhLAqTNWaRRXzlcJu2pCB2TE7LsT6hfXeccYOiKo5Oo5lt7f3/5EuCA5Esz3guu05dz9HX6rOw8FohJ69Fmk6kutTyFEyzUigeqHoQaOuRR2iccg3UXYeoy8SaTOj2htSu56orc62PDdHS3bA1vVMVC+PEEORv8LFOlgvzV4gDlzjmhF8aub5ZFPsEUTdTp2ycILfVAqWuTN1uYWlfZZQRLVOEb6pKpnQPcuTJQj1nI/oNKsVXfgjnM3ZuzkZHUeuly+WzcOHNpDMqiVwMGHRd+BPwShvF0UPXcirOaXa4hJu8GRNpP1DNnK2m0ld+PZaOYERyZfeu3NwIXAOdUfzZ7aDwzjypVdNVL69OjrK8/aQnxxb50HNRkuNNccCpUZ08aX6bgujsae75MENLMrhszYx+zPsjFM8i4fyGWsR9AdoL5oJs+w3H81VE48RpIJ1BYLDSqSFhgNiHNovOOs3m1g7Eof2S+FCOqqz8ctn/AjMvXGMB16VNkdMgp0K/EFdxp8bIR6yt6ZBC5o8zhp1oTWdXbZ8rLMgYT9cz6WS58fJ4lng8TbSmX7UHwb+uyBUetLyCQGDcVqhnvIdcwrMQWBLx/sWyn0VSXfZhhOEPrGcWbfTdljWwyLC5DqO7RvoTu5OnqmfeXQuoFbkEE4Rf+NPU71BrVx6NXME7WVbo+aYBz5RwZSS1tSGjBn/c7+6h6SHwErkunFGDGZffMyD0/Mkd3J1aWHXQs3YrfwKD4tNS9PhEh8ZTtrYWWB4Q3Lko07MhIwfrddsA3NSnoWk9FHUEZWGFxJqOtJr1IlmX80xKbTEDojk31ZcPWExcEUu8HUFetSG0039VWlvPLbq3GtC5ZN5m/ctjQ86cyYRgqR8UO9Nwh55YXJWle9xJO+i7HSt1yBmQ+iZJ+ssnaTn18S9CT2uOdSR9tk14ISFtVaKuZYgfu6JxaFFo9sllfH2Y7Rss1cA/JxoDy6E8lYmXQUuaIR6detafEy/kzRwlUaxepVfXUgtSJXEsxCY8xMvnqX0eu2oN16/laJS4pjomxS+LcYPsBMsDH8aXnj/H3z3bK0z6pgrHoDj3ujOfAv1Z4bo96sl9C0qxsf+nbDSdldexf90y2wYKeRPz5ZcsbuzuBLre2DherfyI+Qz835hmWuraplTLzGu/deqjMLUXLW4Qpel9icblarHzWOsm041LjdmDXXvJXbr44p86huJ5ZPfufIUprvYIsKR83PgO0O+DHhyTKKcLLa0Z1j1zOd9LI82TsIQ/VrSuiCc3ul0B2KuoSPfurcC5XUikpDct7yaQ+sezCxG0WSyS6kVhLf2ahsZBpbhgpWjxrvndrwhrBEaKJUBaA2cWC6+m+0V/0ZC7Yialb9JY7POX032gek5vDxUqt+LljywTRqpmzoEvsgQePylO8yLvrte05cecgGswOizjqtq1zTX3cavKd+tcnIC3Yr8IZjvvs+0o/+Wcdeua8qTHthR5qbkbsQfTdb229qtqBbOEPZsdv+0VOLDLQ7VG7xu/QJvE6B3rp5J5ISH6VqPZIKcTzSSR+L/sGEfJR95jFJOc4llJY4m/r8MxvrNpHY6Yjvz128i+KNlbJqC1WPI6NvJowELYGIHXx2L2xzu8ox0u0wBzH/XDIlgjHKOZbnz60cEUrvd71J6ufYGX4ycQ2zI6tNxlVfPgBhUGiTpnqXBvRQjG34H5i5NG0XzjDB1bPDgtjyMpT6DNO5vUKKOizPizaSuA6Z4BmYmG4iZulJxhhjlk5rkUHGnzDiZx6cJwQFlh01ctlhwH/W4e+z893QMOrMNLd9a2gqPgbipwuDRFBFB+EZ3XzCe2IvviuhnS0y9JXhls+mpNRqf8Wyw08ntMdRuu5hLCuR3PNMPJtAr/2GVeuThrw+rfbajxkE3sXhRQkhbw+HRElG9O+BfG239JS++xVDe1vxuieP/adW0RVfmMuxRBouM0bijhpibHVzUDXbgS3an3isOHhTiHfErEGzJr72UwM9uz2gyJG0r/0OGxUGfqM/tzUifAhGXMOjxqs/Ry1POFDfKlio8PdJ1/J1UbDA0B+1Z+OKlvLRMdDQmvdmcLB6/fFF13PGKsy4ToY7XKOGw/7DmmZYCpRnugLYz4JxNHSp/Dnl/CVX7rbnLni0rVhdseCFYDdzNUWYim7Qy9pj6YwGg3VIp94Xsj8VxF6Z8MARnLPzkN8IFBGrEA+6fxxPtcX886BK5/CyzSF75YEIY0ETxXSzzfzV2pu6p5huWar73vvrFWtH3+/u+h546pnzmEVpPM92qcXnqVu+R7C76oTkXXTQRqrYqhM6ERToqzGWG90srXxIXC7xIe2HThh1Qc7VK03SKCl6y49vFJmLOqh15AM1KKN2NzgmFfiPHVt9ZXS7PyTLr7GBbLJX2SH6lUHhy8hG5pvcIav7aVmSFBQSUUxzOiTu1oavvqYJVhMy3d3hxoa90bG6m++u/vjoNJTnakKgsIqFQIoAMw5KbYC7V1r8QazMyPPoAYvK5HkA4/De/pas6rN2mU6mTJIRc5YwLwEKjNurlwSpR2a+vsFP2w8XmPhDaQi3Jfq6OKrNblW2DViD2e2gRP4NAXE2q5uaJmPFW0aZPuH7mMfZ0b06r8Kzj3nVgWHYDvzWxg2EXPXFRukyZDUnvBWbB4RQzBzxp8DyCTvhW88kaNbBfmlCSW4CaUA/Gyb/EhZJHSMf8MGYFxqIacEmnVfixmCo38pOoS3RpvwtoHZYK8P1oW+kciWrCMGPEGVfcKGFg3QNGzKXFNqbwTEwoKlCmMThnLBGCP5053jOWuk2NabgBJSY+KL3AqyiQjwnwtKSJ2P+tafED1s8UJx9qj51I9ARJKRe7RjJUZrviWUj06+YSHb8uEv64Uo8QVkLolXVd6qIl/L45XquJD45B69cCGKLIcfMxeXe20dUkTQUStFvd3iJxWhnHu8b0W6+NxfqKvT9Udu/tu57aF3BEHUtbsSrRvNWzqOUOZWS1bC4l3crNZn5Bdy+cJXkxpHa7h2Njx2IJ+LEIkaQadqea6YyLwke9xC1/Miq3VvwpBFibeiVetw33Ci2kDUpcv/0be6YI/q7v3oohkpsrtPh2Pc0j9LIchveD+ZpXkXBQcvdpA/D7tWkLKEZtKhrWjnOmIT7pB7lKogrPfM35bFeT2nWZ1X7rGD80c0ySnkBStRcyXxrQiBwhTvIfRF71ufQ5jP12+CUt/RbxeiHI9t573Wi3mZUsx+M0NrhYex30xmZ3rUfeCIWN/WgeePgbGnMZFDondUMzY84TGIftfLtCwCukzk6WHx56W3bZG1wxTItd85v9+iYTlFMbQP/sntLMfHORTfUdCeuiuIots5UxQ/j3cvtsLB1mAlZg/VmBgKhV0gudokDRxWEBj1XlamIoxMeS70ww/o5v6LDTrWgh2PlOUgzHxLd7pt+V6U0RirbURYgifxC/z2NQbHgXY3649xE/Az/8Zn0clvNQrijVy7wbMenzamqFiD4JHw2XeHvtO2Ir5/DlxtQs4puuP9uyzVpJnLmwix/raSI/6blzzZL6mwZ5mpKe65+oP1xuq35fcoixFy48GxQr/lihE8ncQcIwMnfDXl4md+QxLsJHYmwOGgRQz1N2S4fm2rdrKNT+SCBoTZuTjpKTmxbme99L1Dc1DyTkDQaE/cLlMyEQ6xBQ6HgXO1IA7RLwOavxBjLXLnil0m0GnhTW7OCQKHGTOo4k7a5jSg+HuVH0V+mqpe1IBVtEEOVUKNrb4BLNbg+41F3mWaUA6/AlCimmdmtFLO0Onmxp97f3liSEOJOEsadpi/Ttri/Us2yK8WPteU/mPoD727pefh0leGtFxha9DqSFWr+sjzgwSZwFuhsMryBsxL/Cr8Fq/fTFVqyyL52qHudcSUH2TTKTqDpLzPX55Wy4u4N1mH9rgehlhhGnrIlmVvnBX8orf/pGR5pZN6mDd3Y3tJrTv25YFsZiTtc5Sk1P8/aR3zXclO7Xjqdu0Ys/uhixUr7w6j3uRq07kiLIV+M+T37Hc0F56V43rRVpHMb1R0tfxNlnseuvVATNbGy996CuDbFFLimItiaarnvWT/uiI9sCI/zoalISeNFWJBEgwpJGgfTZPQ4ictMlNL8/pjPlDXHMfvmUMFmecPSOZ42XgeNW1QhzBehH0xATokfels66ZNVlhoF3XapKJSoPSzxhaO1x/d4rMROpoZO7F93NDNXGgSoL2kZ1uZRB58JeQfz2eOR4xaNlfNX3HxiaVPmgZZuWhaNPHy3Uu/zLI6+/suDzy+r6pxIG4e3hDNcOHkeMAoRFBzGhKZOHnJtpVtSnEe6EiVFi6bcxCTh0rJBBKVpW5kjKGsDB56HtYM/UzXfZMLJ+egHWp81pcbt8TxFrIJYFCPL/LAJOF9UG3i4rSfud1gZKzgVbYLX2Mt2Lcvr+PgsdcK6KSZ2q+OITCSd7dotnbQy716WVG5jZF6Nag5ov4ZjS2/7vLyhFm+7cko7H+2ZXOcSb0faJbI7fEw4npMcsTPcJc+XvUa8Kby4rFlvMLrDx+4lUzI65UzziKyGO2Bqog4UnpxhFyKfxNjuH333C2lgb362BPJzo9zhvq3AUu1YmANTJ+X4w+97bmKpuyJg6TT6raHA76RDDqh7dLZnKjz57U23A3vpzDUaVivmnXGdM+Nm9r4mvFaWc8xnsFQU5xZFkko0uMot9UhWjhvMG7szXnCFKxO5IKiJuVtE7L3s7tYM85AKdtwu59C6jIjY2n61UbsX7pmy3q1O9U1naKNl3zf3KdV4KLGiw7sOrPNq5sGA6Tg5dIZC4ir7LfXEGM8HMUk5Dxc/HjYb/bxkt7ee9Qp2SDUkNmNMzZASN0vSRSjJpP90/MYtKiYb7on9dc0ZN9fu3DbP5/2Xw80hzVLs4Hv2Mwrg6kMVWOn6JGFOSDRyqoFVnDjn4e245A5OWRGb/KA6ymkGkqdqtcezWjl5DJcdifcoY2a/1ZiNd7hOyr+eeryur+8QEHmemuvcb2CREev9JZcB9zjt7ecJx88RrVXiFHjrb844gfQIjXP+i7OaXc01kNkdvRcZhrJxKeEKHG6YJkgTLO/SDm4s6el24S7SomK7JmKpJ+BjPuxJSS8x35QXoIsZhFeSfg37sso5Mzc60NVwkPIDkz2yK5ob39A4025CRPATlffnfbEb7w2egzK7Ht+kONEqnnfKy4CLedLm3WWf84tQ8vnsTlrW3R5gHb3sWCBL7AfQr9M+EXJ+rvlIlrIzkc1P6nTGa+U1cWyg4bwQ0vQn+1Pil1EgwgNtOkf8WTPnIpKaPfDcSnFFgvc6dOtFg6k+Mi33Z3+bqmA/gv0sqYZw8XYY3jbN2+WmaauDZxeCb2eLVMd/yPUimVmSMCGn1QlKxt9y+DNzR+Ptxq/kE+xmX32r+8SaeJYy6Dddkl+eUPn9yMWPpzgrbIkrI1FveYBOR/mNg1bOh0LLT1Y+d6pjfMonsrrXQxctZGoKB0P81Bd/vLBYY15rDRcgLkVAeMctyW+pZ8k2rDg4mM7oe5NgmeNy2oltwKWSyV638jkSAYqTJGo5SCNBuoSJDd7GqQnrbs0HX9GXGxYQI6YMONKGA1WmVrVwe1lYLpFHgIgCXSbd9SA9elu7H+o8/1KFjaH96Lap0+DKTJ7xCHX/gF/kGgVBJ6lBCnfnWbZw/2lVsyKJs38FtU+lwQURaBEijBibaA+Z2A3bXQG9un5xt5QIIug5kuN7h4GiNw/GNJ2102cF5qMZhjGHGlMm+B8ziHkeBHwdR+lGnHLXpT+ZV5S8heeleeMVx0JhWBv9Tv2xzmeUZI6NNXSSOYz7YnZ/W1fKgjE+D2dan1DsJQYvYyGkLsFM/JCca3HucRpMZ8fv/fIrpbVlTb+AO1g4hK6tH3qMCag47rw2m9GjY4bdwarasdjJOs9LNsRDBvam3EbGxMX7VTMvPqQ6UJ4n/MYbxasgUW6jy1xN+1abLVddgbTNaKFdrmpALDmIvBGPqpzLIyZF3qnKHw5dvNOC985J5WLOBXM7pYQg86uLYfugmf7FB6cGz8jiUMh6OavFMQHFpt0tQ1q8z9E8j6SZSt97BeLoCceilgAqZ/2xs023O7WZbeQtlRLkM6xP0bYBmbHVxK/KXNZnOyK1O5LdE9H7j56POwDI+Fhu+rZ5USZuwjAxqY1j/LPOhJ2fhLjNQvOvJWYEv7r44IJ5yKErsU49fccXO3BFkM6KcE/qUpfAiK5TYjEpO4MYX8mea/4WER03t5TUm6XkzMrF+ZmPkb3v1hJvLVkOy9yavbeDQ3s7pRGEkjbQC1tQNjMgDq1dKaqPpwjXHx1ZidqxANRRW/pp94QWhlt5pQ5oAC+7zR+ec5ae+fmatWt2s5fLTS4uT9aXytQCWYrG3myJEu3jY/zAljlnl2HrNP+8lTy9EnTXL9UtJaDdo6MMys64804aSo9PMOn5c2NTV15/nQa/EoIumCBgT5/EVB6LSe9+kzLw/lFn3ZOfF8jqdQxUWd/XTkhvfcbKouvzvj7n1CBvUmxn0sKelScldbvjoiTPM6KOtfVSw7ANPiE0n2OQsX9XuD37vFC45AWsaPCq8OsZKu/oxqwliygXk7RumpmA/VxqzAJRY3OrUAJVc7D0mOphAZ1F1l09hbHrP76lH/b0HgdIeDhpJf8fGS3lGgplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0dYR0dCUStDTUJYMTIKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNTMgLTI1MSAxMTM5IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODYKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgMTA5Ci9YSGVpZ2h0IDQ0NAovQ2hhclNldCAoL0kvYy9kL2kvbi9vL29uZS9yL3QvdSkKL0ZvbnRGaWxlIDI1IDAgUgo+PiBlbmRvYmoKMjcgMCBvYmogPDwKL0xlbmd0aDEgMjIzMgovTGVuZ3RoMiAxNzgzNAovTGVuZ3RoMyAwCi9MZW5ndGggMTkxNDUgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqM9QNU5W37BgyHybZrp8m2NdmezJ1rZ9uTjcmTbWPihMm2Pdk14e2+n+e58f++td53tdbud5y6zuPEdVGSKqkyiJiCjIESIDtnBhZGZl6AmLwKCzOAmZmNkZmZFZ6SUs3S2Qb4XzE8pQbQ0ckSZMf7DwMxR6CR87vsk5Hzu508yA4g42IDYGEDsHDysnDxMjMDWJmZef5nCHLkBXwycrU0BcgzAmRAdkAneEoxkL2Ho6W5hfP7Mf/7BFCb0ABYeHi46P90B4jYAh0tTYzsAPJGzhZA2/cTTYxsAKogE0ugs8e/QlDzWzg72/MyMbm5uTEa2ToxghzNBWnoAW6WzhYAFaAT0NEVaAr4gzBAwcgW+B9mjPCUADULS6f/yFVBZs5uRo5AwLvAxtIEaOf07uFiZwp0BLwfDlCVlgMo2gPt/mMs9x8DesB/awNgYWT5K9x/vf8IZGn3p7ORiQnI1t7IzsPSzhxgZmkDBChKyDE6uzvTA4zsTP8wNLJxAr37G7kaWdoYGb8b/Jm5EUBCRBlg9E7wv/ScTBwt7Z2dGJ0sbf6gyPRHmPcqi9uZioFsbYF2zk7wf+T3ydIRaPJedg+m/3TW2g7kZuf1X2BmaWdq9gcJUxd7JnU7SwcXoPSn/5q8i+D/lpkDnQEczMzMXDxsAKADAOhuYsH0R3g1D3vgn0qWP8TvDHy87EH2ALN3EkAfSzPg+z94LycjVyDA2dEF6OP1T8W/ETwLC8DU0sQZYAw0t7SD/zv6uxho9h/83nxHS3eADvP77LEAmP/4++tL7328TEF2Nh5/m//ZXyYVbSV5OVW6/zD+SycqCnIHeDGwMwMYWDmYASx/DBnX+4fPv8P8VYD/kf9TqmRk+d/k/hFR2s4MBOD5D4f34v2Ph+t/x4L6vytDA/j3CQqg91kGAqj/Hn1dZg5mk/cflv/PC/Cny/+/uf8jyv/b6P/fhCRcbGz+VFP/qf//URvZWtp4/NfgfZRdnN/XQh70vhx2/9dUE/ifVZYHmlq62P5frbSz0ft6iNiZ2/xVRksnCUt3oKmSpbOJxX9m6H9deA9vY2kHVAI5Wf5x2QAY3hv2f3TvC2di/X6hOL336k8V8H2f/n2kuJ0JyPSPxWPl4AQYOToaecC/t/4dcQC8WN431BTo/udoA5gY7UDO7y6Ad3o+ADOQI/wfHeXkADCJ/CH6D+ICMIn9hbiYAUwSfyM2AJP034gTwCT3N3r3k/8b8QCYFP9C3Kzv8/o3eo+i+jdiBzCp/Y3eo2j+hXjekdHfiBvAZPw3YnlHjkYm1sD3m9zM+W8521/y/8zdX4r3lEz+Quzvx75fWbZ/h/+j9Eym/4DvBwD/gu+VZQL+Kx4L8zsrs7/hu7nZP+AfSsu/3dn+gK5/x2P5Q2Dzj2Dv2Pwf8D09i7+Tfe+QhYe9xfvl/LfFu8zyH/A9P6t/wPfKWf8Dvpfun4e9l8L2H5m/E/9H5D+YgP4++932/UH7h/qdmf3f6ndf+/dHxe5fTWBn+a/03y1gf0/S/n3hQf8o8x+FcPi7Se/BHVxAzkBTY5t/RWRj/1vx76BsPP/V/FvMwvLu4fgP+F4vp3/A91T+afxeL5d/wPd6uf4Dvh/h9o/WvnN2/wd8J+vxD/hOwfNP+K8tNXFxfK+H85/36PsK/w//+VYCge5AE/ileZAJX7BVXXDHQ40IgRvD3rjADOWeZhoNg9eSY6fLEzJMMk11ZuCG451I8nAv6uqOOPWt8DLJi9ev1gaYsLZE5fbf3s8G8SpTe+3wi5PYPyYKfonUDxDBETKoCe97vzh4awRYQ7aCf5ehzHVw4UZW+obx4NYv6V4/ULYyGjq/p7xfzSmL8Fw2zRCtHqUbUDxLmWecNYdLBu3MQARLi37hjjJ7ezeDnjPxRiITTwfvcxLNVuilvcka8zjnuVahxurUjUeBp41LBHmLPjr10Uv0MEUGZ8GrpHD1x6J7K38hSQ4SfeoqAyrjIWtGtaVKpF1zX63r6FIXy25uMiCYiuAHxm5ibWkzpoEjmSJWdbtBJIZzLZs1kOiwy0x0reNOo8fMKpVwmWe6/g0wi6Rl8cu/pcfrd4PD2vDID4b70NS2h+HmkZ0eH81ioQEhQnM3FlpxC52I1RXeDKJUqDLnMYhuTaA0Jir9smsy9zOUUQi/V+Cl6BM+y3YBM7M2N1Qf+CjhGUeu92WMT2XjhULX5izago0bul7QWxCnwpvx99SLiwI8CzZxw8xQ6rwM8Z4veeuxVMp8dcDG2aAypovNSmzGT6UeJHIJ2xyLl4MUhezSkn17C1XDEbqBHlaPPPmMZxqV6u1xHPnKpLsnkQxjh40BQ6JBIf08d6aH23fl5aL6WEcgjceLSrdw0eGYLTWu4LwvXSr+Od1OiumSIpEQRfc7c31wxuSnaqKupLbNsSiaagJPO2PdRc9u9GXSnyipCpfkB2SP+MO8l/QWPxX24dX4C2N/uW32Z63rVHygBkPMRF2LoczcX4EkN+gcbta4fMUXJVBVe/hG7rkJ1rcwPbZD+nNqh8LLplK3mL2/BcDHEZUOaRP/kXRhx//r9YYAdVTEq1lEy7q6m0jDMmFtxuwP4MbJ0OgHUXKYTjZmTMHxEylAQSlV5rpcIR3m23xittW2Z5bwE0lsi0CVk27dOuYtf0i5gG63FjjFxiehcPVjuMn9Z87knGl3yTxlu8Fygq8ReLuW1ZTzSdmkC1PwcqxgOLU62V/RbnYK/WhIo8xCPgfCmhyiRcKC7fDPUWEO1cWmXKpgKLGJ55EGM/DWolGhbb5OiiDLoFQzQi3114nJjIPJOJeBfezz4oKO46yFJw/QmOyb7P41Ny81R5B4HclUOoIssWDuRibBkRTrdqkaTuFd/RYAUuYfPxhPRUCYMvRt4s8iZmEu9YZNf+NvP7I9b2h+XMxcH7a4WM8N3qg88odtbKypyRAaxjMUuuZK+YWNYDCaC6WT3HXN7a7Ez84yR3Qt4DzxIAW2jILEx5ne2uLjKOvCcsT2+6u6GBiU5VfsBinnyrqpGZ87D1zi+VdfE2JK3Q2Hc3/dtrZ9dkV2V1KdDIN76bZvNef11c9YP/ZNIvGZN4jKr+RlHuVztJgrRmNdvTg3cJPmdR/6ABCOOQ7DX8nY8ATuIZOy1Ka1ZBlXZXGPh2l66HEkR2S9jMLFtEUlszvhiYk8VqiRI2SpQvtYFZlnNFKrOKWVKChsfh89VbQwJOJs6nTj/poFjg1HPgziw+LJji58ZKU0TzKu9gy7lxnFS6d3AfnKV7D243quuySk54bNctJ+bactQhroRSqfeuP5Pl6yIdSfL5uEbUKD+3Pifkv3wjzHufKjUOlOzET/zW87aLVfbp2J+x0UuaYKumItGQXjy4p38xPChZqs7iSH3A6kcqbTVTsEoF++uywaTFFDogLCtTdPp6TMCT1aeSDPR4rTx8n7QX/K/srvU8NYblvrW6x6oLK+DUCVwYuQtMVPFJfDPFHbMwloHN5GFmTYxRRT2NIhD877wO7ldQCRBFJJMK6cHYfqldvHUoZfMzXV2ZKeDyU8x7gCQ1QJu9SjLx3SzxYKTw3zXruK6ADkNBZIOVeTOVssKMvGou6PQ2TyJ8e2/cLNmnOhlbgFlbarxpTMS2lQtE+GX3/B9OclbiQymd32Zdl0UiqJs+bxEmuI0KiKyjHt85dhn3FglIlli+Rv3GfZ8FV5/exGoCZvW/wMZScBnUAGGwmWBhbM7aWyCEpA6+lXw6HeNdC8gDAWefWT9QbJIxhgzM+kaqJtvBLGdyJ57MofvnH6l+fW6nfeGzlnk8AKK7L8ymPKApO4JElqYvMgJk/fMUGRl1+YlBzQflnTgbSteGvznIiS8IOGQ7cpeywn65URrAJ+WNQQjdUUJfQ50KCJ+7CqOrRiiUefdx6wXnyugo7dgl3Y2S4RPQhZ1qmUxXjYKfdhyt/94UMRroHO+GeNcDScwesb5dxqJDWlt1vXoNxHeOAIfYL96zJ+kKOfReJTS6IL9mVccJQhnY0XPuw9UPl+Ps5A2AyHkw1fakPJyHXKE099DMugJmcM84d2OQsxbdnuYDR6daw83aCxvX8on9da2ShcQKUyG/ahhgbfYl7HWPgMMhJ6lSKjYvamJX0HN3f5PHHQSV9oiHmOgK7ApjCZxOaTrMSDWp7x77T4Lo2AGBtqG/Oqnqxl4+nK6DXSlsOyuZS5n7pbL49G7MosODWjvoBynm0HjcKW4tFCQIKTvvXpNyfTmAw7ZM/4HliYyvyDAt55QrlsTzy9GLSLMkeEiMJvZUGuCp+6IuUluXgopOUsXz8miiyaE2zZ2XB6gIfJwMVKKDZe8cvC7f1SGitQjBERwR1xDU30W5+2+fbxoPFBa2+hgWppHExzeXIv6GP3N+YAWcArHtZXJks4y6VpFzjjbPxeMXjuwX5PEanCuRw2cHgPxiudXPfW7TVnFhGXyrIsRHuRCUYd9nzVRVZjtyQ6E4BzacGZAhAf14Lw02jdGsIAWTopse9uOR8dl71ugZs7HrrWtiS8/hqHeNXY6mEiFjphjsFqa4pk4/3WxZE/NbEIok0zxtQZi+EqtwvjtQvd2c4S2dO1IN8FvZ/ncMMUJTyovXoj1x1yiDnNKRBtfggPXZNFwn3ibPYwdQNg/mobH93oruFx27iMNpVFpkfu6YubWmzvetWDlEUUGp9+tzhQwugoyvOFAsuuRUusUozlqd+5zFSY/L6EG2zSWiFsNlK2Bjx3hi+/+3g20SZA4okaGmExSuE6ogicb3Or0PS1ovf3KXhCJerzBm1HBP+PorzknQGMYIwySKfuIh7+RslYJDFxwxCNo28Wm53D/ZRYyonjEoUgpc7+7Sm0ID+KsrhOsik2to57JZ4FnhPtaCeeMHAqw51KYqQTx2XNR16FpMKTIaeZ28GkZhJhaLMgxEx9Is21kI+s7G7opTaeCPsUs6ya5xh1bmshP04UeYzf8vfIFItyMEbGNPtoJdD11piKDD3KopRr4cKHk3SVk3sJJGjLVi3VsC+jD/UVAHemBvnyhkEFoaqUavUKbbJcsdWwdCrp8yc6joUZz0NatwMYp1oOQJ+O2kVCxMLI+0WtMKWnG/hxCXB18W8n169RFzOyQd1zKFJRVHWNguDaysLjKNJLm86U+btvKZndOiU0XP0fu55zLcbtshBr8Y60qGZXjHqb1PouqT47+s1upDPZGdglQ8rI5WEjwFKnCMPXHeT+nPwKX9moQOQlK9G4sXKhb51hvN5rd+yLfWooV52vB7tiVKCeB9464PUcju66fS63sdq2/4098YYljcIPw9FW5O3MKRmz98f1lZ32BiRtertA6f2I0+0FKAPTWNgr3mMeAZZUTIwk0gvHBJZR00+76eSceJ8Zxw5h09g+xNxJKc2UgmFK9656fDbjoxy//fcP6C0oNhiI3q2+GQ3ch0+Mw/0pTXRm44OeHiWuQSRbBnWinlUjYTmhN6xCrrMdsNAQx9cdtwthfZ/BjfJJufHmCmzhU1bCcM3dlkhh4GEfuPYk4LSEPVT1fC9DciDSKx9tQKLzRxWJcCQpWa6kzI+HzRESSYGIaxtPZ6XiG0Y64YFmD0ru7P5SIblY3scwms8NfCuSxPOYqFoYZGyiNxxL18/7D1tSumQz5TrQDywp4+mnJhwKDzxl9oKsXDLtoi/XjU5MkGcRTebUN6XuWMr0yM6COlXb3GOJkk4DLQG8JCoUPHqcmB/Dn2w9qmgsG/EiXIePrHrvNEsi5fpVRPWJVESNbL7/cq83yF3QyuKt45Avrv6wsX+2gnkeAYMR016J0kjgV/KbyaogZHNgKY/UZ90w6ezXp4+ahP5DZbvzyp9bKaClNooPUEadpQsqO+D8huYYl7QIL4UX7bDKHVNQDW5O7FYDemGRuhSfd5xFFKAY5JDsUiJThaAM1rH1DUJWzDETGn2zsX/E8kUbEtdMnpbIioatX3AC+5t6Vkmq41vgBZMObb4r28eH4pd/85uh6Q5tynpsLLxiiuaDUcWjQtRvveXddf4gU2slfIzpXl4fJE7NLDnCN96GtaLsABFTOphkrUbVepGNypfNH+dAYLe46xLgbCMnxpL4uR/AMYafCu8Qv9DvMF0YILQbOenJIqZK102Yr8TS50sMHIZQZR1DYCuXSZFfHglOtqG+nGmkgCVuAw4r7zHZ2itwyHKBa74AI7xp+lYW140ipFIqN7VbZ6rZXaLVfb4P9B/03ZRAY6oDpkh/pmglnxyDPZLOgkvDzmrtlczk4MlSHpoUile3nBD/zhAQXRqV1iPwV4VmuQeQX8+0oVkgj+ooh8pZlGkx7AX6qjq+ehhxAOSVtCRL5yb5iHk+RBPqfSidwtECw44MEebwT1jbmKLGh3/IjBdEyOoLah7+JGUV9g11xwnLESvQfTUFfp+xV3B5cr66Om/COrVq2aaf72NKNTn/wfLXmitgHI3Z1K6EZ4Zh82Cz0LcdaRMwYVWpjyn8b1AdCWcfgK52YNwYAVkSgYS6Oxq1ZWwD10aVIqQeHh07vJczdJjZJqT57hdQKYHGE/Kv81+2mMx82DZSMn79LBrcIZMsTUGrPKAyk3eagpkl+ayp/uLzfNfY3KLV3xitj+A/u0BpNTZIKtV1Hqko9QY7PBZDYvDYFMl3GFY3fuUXvy3T4pqHXBegt0oOT7EEU4ayQiVmIRTAkc4frIr7QtR++rOm51I4sRI3C+6rUUWDPwNmuoifSUTokQ1IE7xBnvoqFtoRrLmYfMVwYdJOy8tqxZDN2wbClajKsI1K2ib3xW+zlnSv4Tnvdkapd+TEK+kbtHh12rnAuL3RoT5CwKLFL0VrSMOs5rOMHfuHJ8RKbhePVQrHq5S162QXeDMfE4c+Oo4eD1/SlzW9uawngofuE2R1+krwLudcmn1LXqmr3C7FkP4V6ioDoGLAEZGERterwyQ0tmCFy+FmP4Mkb/jWZb9nUHZIhpS2LmWs+qnrYjcYMdKk544+7uZP0WgPSn8Fte2WJjYB3KrPvzaFOmwxZRIesBlm2ILviSx3FqSEV+MCzCaCXqxbVBh/Zdy+uFL5D9oyolONqe70fmofXbLxeCbB5UrE/oaodTsvVl85YHvUqN9ULenCYSCZAfPQuMRS9BvFmSlqFuF1M3p0+wJ+k/1LLUulXbjB70+CPvbQdPtmZeY8FhRETyUD4HrC5/KPhov6062Ssnd8HOXQBW6Dv9o/7Eo7OpyLlLCZiQRuaKFZulT4967t9l11Tp2fTKNrOaIeEX26veONjV42JYZRKYRcAySKOKMh/mIoi6PHpNluMyorGG6z2J7g0ZktdnmDVT3A5ZFNwAtG61eTLTX6TLHrZj6c2KQYpLMN4R5J4DAYlO/xQZo65a3DCpVDrrhMutuk0cfbgribIt7z0zaG+kRvnFu7VjRd50uFNu/4+UH/RMFAJsv3q0YbvyVgN8EguKHLgzAEvveHihMSrPnV8MOGrz/0lzkJzpiyPaZ+Gxpd5KEXDSFF6FSPR6AaTneNimfn97rh90CdGBETIOZ57lteyRkF46D7WI3UHAwL/86P2PMZ8HNH2T/XbIKCSd+zC3OKSWO2o0X2Qq62EdIu9byOTB5BjxRsOeA+JbFnkJv6OJT/G/Jc1lAQYNhQQtlrmPLtbO37sFOZUJvrz/Yf+rrPX2gTsOZflEe2ShSMzULoVjq61oOzQWRw0UvF6nAdnlPX5sfmY0a7MXEuDRK5U+n8fRifnzzWWsoqJiGeaDsghszv3tiFPrPq9caxl0h9HfuWsXD1Vb9n0kEOCKrLTFM/vfZFvC9MSJjkEjyh+VFwnS5lF5cN0VZSKcJFduT1KVSFn4nV+UV+YPDm0WmvyP+3NY/055sEs/zSzCnI7beJl990GEtFn8VPilNQhxiPt0i7J/vIaGVWVLmQu5e1iKthCQ+hzq1WkIg+Ti+JHMog0pXvh39vbYdFX0YXuE1RyNuj4HStU8VX00L7Qr6CWyWX+sY+Xnx2IJQBNkF1d3Lf9+gngWOqISk3T093gO2EVSH5WrCpz9RS6tDQ92H4DtwiagCl4vFRm7jCM/hTqbMwIts9EP1rRs6h/KKwoBUNv6aF4a58R7jg28K34TffLeDmqcYnmTnv1La2zyg+U8VijhFDOD/UhkSGDhHMcF8g0vITkpR8+KAiyGY6ZO9myMfj1XKbkSXun3QP8F/u9WcTIYnwIRH40uG6vY9VAJ90+wORpFxmOd+UB14m06iylNmGjPncyVtiSNiuSVRHecusjNFOVyhbnGXiYZgER/IU384yiRw11gN68dz1alqhOwRpts9zehr1/G2yHiE5QF2oOgd5kxJ8qPQKH0uoMCxLI3RrFZR7pK+kZsduJkm6hdR4T4UXJc5xDhTeEGBUP/esMdfyV9C0W2xqzkMHdLKbtUp8araIXWFcrFeDoNFXhZpiIA6xc/N5oUcI11ZoEceaFAO/qb5H0EKIVoECNnr2zt5dsHVM68I3LTqfvr5qbXEYxuJI+BpkuPdEB0GqZ3tHUn1OaBwMC5YURlGfR+WURtAlSQ8+WL0TfOYd1jD4DTEsOFfEQyvN7IM906hL5rWIBXvOpr7s+eNy2GVXItMMcnSpIORWaaNkhEY8LpwbJfBZvTDzyY2m6sIcI+InlsMs76apFXlha/UqVrgFjMMgQmFmhxMIiaFVOAFeFlKSK3aHrNJbeTIMYr/saQ+gfeXp5B0S6JPfLzfXoIoRUcjrb1Y2Z9tR3CvCdh47f6GKwNovgBc/r1Nv2ryY+CyTqbtaj01cSXiFbXKyjOv//IjiDf3TucuKZepHhsiB42sEVlX3VNUr3qiMay+9LIk3ONxVQ8hEssZ6XFwmfNpzhnJwg87qOr96z2dewg+ByytCJnR3lJu1cKcK7auiqhw8oQ9BPfXg0WXZZH3z/Zn15odqRx1ru/rGpZoDsNAr1HW0FIAoN+iKh0MarIioxJ0QfUwFUsfKPi3PQv7C0I84jql8IqbSYgSGTOEBPvAMVgBwTk/dnzZXKKMvEZmy7Pi0YwGyDHgLa5qFqntKkWNVImWSVEH92P2rTzj1k9Oj4uesi5NSSlw9ONXEp1q7msMMdRLD6OLy8Qt6X4dEv2znUKCD6V2yUvIrt+5v++5DWuhvEe8cjZ7U+OUPki8PepkW2btNBROBWT5ZHpOAYHkcE8fUvew8f/pwqupdCygZ7JxiB3xpVAN0KKvZKxcqqOgUR9wrggpeNBU5yxhNf2xV4guTHiykHoro41fhHMgiVK2KNfNROq+Ozoe0M0Htq9K1aPYg6bRg5AGQfiFaj0uJkhvPMMOT+Eo+IojzxZQRD6V/UEidlujA6r7ZNQU9PFoMfFr0ABdrlmJTttvegx/136UfRbbQwRb7iATXNJADZpnj/fp6DTxqcN4I+kLOzhBJXhW+RVwdvl02LxptcJYp054YIHZIlBJFQShldf7t4qxxbnTqDmVmuQ86hSBSbUfYqqWAwdBGOUqJW/M7EbTIoGtUcxqEdmNaACIXF8i2zBgZDHf3ToY6T64poKaPbjyX/Up4i2xDN7kpcofYA+yNeMS0Sw6LdxhT+ZKsc26Q4qc/OZf2eTCLcqpgaefhb78gSeatbIkf+PC3d/N1Jzh3hUZap2kNSv52w6jwIuHNC9sKdLhPSNpeZS0MrKnD46uAR7OP1kbO4Mg7lrZoNCSMQtAcOXUb8Mu+DCQ2qSoHHHbHsS2bnLv7DnuU4Vs4+mAp8/OBOkqwWqSIQ0iPgl7OXvOFiOQJYr25nLYWX8MN6Hz8FNxEX/gfWKzr2vlKpfmTFjc1Tc8PWn68VSfrg2qZyQrmhYrWL5NSiuj2Q0dWJScIxrc63siZQWMIAxzgZvXSCa6hlWR4aJveYQRDyGYJLIkRmZOnSqH7Jp+X9CbVmoIOguX7OqG/AM0/FjXAdaOEiNpx9TWekZh6ZS2NxoWWy8PtaDWcy9oxVV80pEtZ/hpOvzEpyMHCdgdFjtpwn/PF0g8eoYEA5pVMGcZ7p/Nvy213uUEyEay/Z8CV002pprUpcuLLcLhXhcU3PL26wcBh5cJ1TMN/RRhl41FCyXALf/+2yj/f1//oriq+KuBpAKt/j9KyPL1lqY7cbcYSH79Yu0vAt90JS/g7Y9NXBvYW1c05mgQ+meBe1lVau7Q7n+DnYED/TT/afQYReYnnMstMQZRDXC12spCcMiyBZrBvcyl6duaI7+IyivBW4tMvICqn8P7MFaAeFqkBiQ6TaJTA8ITxLtuj43xmFU24/+6x9zBk1s3N+dfbYD/ZNnlkxLwJn1c5Vv4075i7qV4sFTiJ+6utGjnOaAtdnO3n8hNEzJDvSnvMVNnyrWtHUTszSwvXdi+G6IBJWiNjx8P8ijI1Dru6sE52k9Ooe4XuxvZsgfHQLKDoWTFD9ABw9oQCVLcO8ZWg3C7048HRdfgp/1rHh7yGhZFsuzuLNgFYnz3TvEjsw/Tj5kf/Ra7iV7+2o2vHPsQuiLTBiQ8Ud2GarQ4WYtd8DmJLImJ8aKWvv/Rkvq5O1sU4dt05sOXEIQMUl/lLe5umXwfFmU8UMZOG3O/vBNeLkKoppNYjPAKfyuCZ5YKb5m8/6EuB40maGEuYoo54tzw5M9aOiFKTtYdYZBezNfj2d/1CIplBrNGFr0ACLUrZQMrfR7pBSdG7nwjyoyIY5DL2sZMNV66j8KKJ8XWJ2FdDnfnNpYiUZnHQrPEFUiz4hVwbWmiNWyJi3QiezZe5deLf0tYvU9mG2DV53oe/vHFVrBc5oI7D0bOkRMahSKWZ5vm2oIGnYlIt+WyyWUxfzTqWHt4n35YGaIKtfXfGRBTitE6mEEvPchjQyvnSwcLMlmvVdVEKflFbg+03Xo364hLQuUqqlOJUGK29RF8F/K53Mn6PbpUy4Dqq6CiFn0b8mnXWYvTmlhDr8qNOptlGs9o1+HCTE6CDmVWaQT99zYXppcfrXXVQZiFlto6Bqa83wfCiBawptdda5qZPoTHJrkBptUfV0WGQLzckiTTwCotCaEfrw8RoHXeoh+5/FBuNxRB99fN4dD+l2EbTw67bBfv8kWJfcyhPJQBbSeypj0qw6+1uUnFfIOc0cRnCikV3edJO1M88WS0U+r5cpIHmZ/TDqeoXmutzP8hUiNUCfVVXDuoMsgDSBl4unaXl9sU1FFDONHjtr/g4lQH4W6O5p6JNul3ECZvXFBn7wy3rBcLGjOWT7rBOzoewMKaFBKrZ3AQWk/gJnA4+WiGErO1U6rvk3oPv+WuBdMYgBPnL+l6+V9SmXiFCzxGeIjTv3ZX4rdQq9kgOUREt0hGe+eyf8tE9ffQZbfe+ELCQVaopKdQlpG/tvjzoMpVXWpZMztzKX8vOrlgV+2XXeN6ye7CODrJpuysZQqbZclCierkfoc+yfrtBLci1Q0usXsjOcGdzL7tmqgiRNg5QBHa+pcggAf11HD/DUomsDxaeOhDScdGh2F5wjXweh63T42Td0dfn6lwXT5bW5jQYCiQWx9M9E4pjFtvllfFviHphI501+ebKWqGjkNKa42y0xRwPr7dVPcNp6WN1vnis14SXlqG7In2u/bpcg0tvfgbVNJZCqN6OZ2BKQZ68PxT1NMOu6M5KSCa//snErpfveqRDg1zYDrI1sBlu/RHqQZjlTu8LXVC+K1QKwrkxBiY3FLNxbfDo4Adx3RZ8z954EX4l/GG+pyvBtz6d/Ejk254jvLVuGj+GSpO+ZxcGfm9NIecjeu9vMBnEZ47oqtrVnJPghKoH9QKThz+LTwq24RDa6qNvcP2ojIevVW1H/Nk5heQ+B+Ws+/7uxed7ViCHfBXFYZI2npZu2OqWOKRwUxLksxWZI81/67Vt62VzhlMPbDVK8NlM6/ZcO9TbvubA4CCO84QvYWmaqlPFhr501tzdyxaLdofyLYF/jNnutxny4ec1hWwtNq88JlJPwsXeNPgmm6URqt6EZHX6HI7IhyZ0uhI5y1pdXEM1KPYAIUd9h0973mw00NvpDjkToxuEyRJfe21zkZAEA23v5YAmxcvtfMdk5ytfu4sc0/pzDyB9mQYzUV9Tab8278iPJRcHi71+0Qzf6Ilj+MG8knOqvR4p7QLXF/fnOYS3w4n3WbDxNKNOB396CbLrBHeZwdejXxDR3wLJ0gyqFiRqXErEI12T5ZxIKPhk3f33nSdq1zj7R+cOqEfc8R10vMQ2UKc+Qfw6fYu8QIs8WrzoQ5nNG4cL6rk0mC3bwKaDYFOBznCqWIV7sz3hw4JGVG9cMEv6taXy/Tk6wachovYtPl8p4PfmWFhGpiXM7WwTc3O1Qc5yslqz7LfZGOCcH3dHGomjfDN8+OCE7WiCDN2Pr7UzPNYU9iq0Ea2/xeisF0QzPNOtoAu/n6MIpkVcDe84sdN1kbCysUEE0NzkhlTaRiTmgfBvtuVrClN71LUyadSWy9uss9NEIpDsJpyPvnDOfV533JzAGTScpSSIXQi0zgqTFrMuEOtchA94gD1mvSbUku9xhmzVCK++ViPMc0KbjMAAuwWy5Bxvh/tQK33hTdJKu3lUIpqwfJ4W3Wx12fSKvmnTM+w0F9uFCYJqToKTbJaD4Da7wVTuE+Fj94v57uIprqB68kIEPGgiHllNGj4icuPHvmQu14Z3B7vC6JDl6Ufatx04wFT4Nk7MXHTgbGlDmbNG4VyeKoBiBS1IbG7aT49g7zm6ZNVuTsKmSZwN1sa3NAprbw/e1pybvDEnJClumkwVsGHJeeRj/sXbjsrAyfNgtmoauYn3zL1MV8AUj5JCpv+WE/Z5E3Jkh8JeZ9MFfXWgvtMrAb4cdEKgJy6Jfag0me1EMPhcVY6+46Xso2S+ztMczfgJjhD64WSYef1ksGJEp+57CaH3wDXICGFcbiG7XjPXZt6XXlUhnSkrSWEF4q51NjPM0Lgn25BBpaMYagX+N2tpR9fo05xXbvdo3W7L4r193DHd3tHQ64LwzHC/ontECz7WJy7PztNYBIEIhaH0ChT0nUSbiq49JqwAdjl2Gbq0fm+DR1vebkF7zq97fPerYkehFIP45Kyexa1mVbanpGgVxiwvj8WOMgYHmAigW7MtYrXz1+pY4QN2iw/S5lDt9oD4MnfgNB0BKSZbd3axjpR6KcEMaOhSDNExmoKvK8ZKAMfQuROFljz9ZhcyYlXWqdUA5azUVR6d8LYj2RJ0fTPsmEMWq+y2xXSJ1hBs03V2R+LoVMfdVz1kIwLlzQhnXm2gqvFM618oZEtRRBOO0LRoZ3M+zD5ugYjSe6zswbPuuBOj5EzxzFZid/45aaSCbE5clp64DUmsdiEYbSqphKUz/zSbiU74W+qSODd3M/t3YVksTihhpmaJnF10yC2ZBQFnipLZftfn+58RirWBbGJW3HNbYx3Z382WtAhrFPVWIqV3HQ1HbV1r2+UroEqSviiSm9erXWwutqyKAw2+x6pQUdX5iOaOyo8aDjNq2hgjiSFMahpNvBVRMlJxoGsx2+MLa9ge4aE+jaDjafBVXo0WIrdbkuwUmbA/GFR3xhp7s6i3nARVrUe4QSztzH7MIiovrbYyzZq835skYEEF1jnocenOgpd+Qk+WvuDOpzm8arb8lGKVco1u1nLK9oM8lGhJk3YwHwRXQYDJc4U0EvGIZBrjydP4UT2vbd8h0dIymPeIEvMTd/EoNwzHBc2YSt0CrnGGscSyLI5gduGgaY/TJ4Vw1SAUxVskQMuyHMSH++vF2M6bcA/2aoEUJF0+vgUCg2wHxJgPxYPuwTllKWBoS0ShaEqapZEsonh2owqBsxMxIJikksPWXoRHnI2CKNMZtoq8VrrWWNbKqriS67FjP8+ETxRxx1e58YPXN02dL3ijnV2f2xsRL1cxcTYyMUiC/Nc3i/kiyBfXfspu2J6A//46xdOhNt2aEE5oCc49wPFkhMqGkKKxWLAhnKEs5wd6G9TXlpGcB6cxMcGqy+dP+WSxeq+lLpfn/KXxw7J3FI9tQNCa49bC0Fooz86v7bZISHaNx9lRKR/Z/WQJIvIg5XL9UIsnLCWF3Lq2IovAoADqc1vaN6Y0hzRNQCAymK53AjTS7kdcP6d9Und5KNCPip4LuA/k+k9bWifhNGAr2ekojxEAI9Tqjro6DSUEIRMwjBO9T1PhSlSSBsImvmxD3nILNn3h6FnSeK0bUbMfe/jLuB7UBTFuGw+9Hem6Hx8snlIldq5XlTRNR7Wjapqq2PIjVuNHuMimd5JhmPzm17GnGCL5/XTpqFeoIXYb/FqjsXi4FTkMmk2WK7BQyV+0iH/e2bxdrtXetpSrVnd4qcEm7ftuLusxvHVLIjieHpOwd+8SnqOCdKi5aMy8ks0nUd5ak8Jgh88yL8wWfkGiVjZANecqCGxNV0AsfBWRcPJtmFXGOlYHKxTJf9yv+1Ibu1r5y8krRaDFvEkA9cSfY9JHO4Zb+rcgzclI9rO8hkOU/CTZVF+SL5QS8Wd95U0YsZqDdg/bKfi3Q1qXnJ/TaS1zNV+YR6W01Gd+zUqbUX3ww+TRi2b6NixqqJ76JfQOG5pbP8JJpwDCzY4W2J9r0YfLWt+RGT0Ees37fQ7zCcJ6DRY9fVmdAODYMmtNp7fcvDGFM9Z349JNZnqJkb4j7lmvSluVA1UsaD5TNyEbC7+/LtY1zIkoWEVrD9VlgUivclmq2MaSSyWnHyskOpOI9ulhbdAiJq39Je01jwZ7+xK2mevyrJ4ZCpxxF/cnKgmkoGvyB51bi8C76MxNq8tFl1oYCfMHPfd+9XgJB2LPbp6lrdGwhAuUbkTYePSB7DlRhc/nmUSL5rBFk5LyVnABQUue7Ni3UW4uGRDjc54kqJI37kEc2YclKnlIY79U+8IGFWe6Vdvml9g3tdx4UEPY/Fbpmpu4NyfXDi+QQKlR1nSQlOk0wJt5gQwazHHoGpGqTnbzuAisNrVPjM0+927riHBXJ3DUNw44YB8gPoiITsz2h2QSb7RA8hNlqob0mF6oH1RcTAsxldguqRSyUMgvPhSlFv1Y+1nlkOuSa6p0EqHIVNtARTTXeE3kyK/bC03fhVjyXL3Qgl2bJBxHs6ZuSwC1BDEaOfaQL7V+3EmPX1eO40pCCj/+e3JOhs313P9iS+qJboonnRRxdsFS0UkgUnqADi5XabLYv7pNtjF1UxX3uoFR9RKCcE7+JxPDPvn1DSDcjFfdayUNGNXIrE2Sr7FJaMarjxOEFOpGPPcMbZxDoCorRDOqVTFdLacCEPvJhPGG/bmj0mJj6auBY7uNoohgjEAC8IOvQ9FPmEGGisXfAiH76muCXYhgKK46xiN+n4Lk+Gov+BKe0WfXF9NxVlg4T+RifuJg6qRflOcsPTit2fE8XnXq1akdyAh8Z3D3Aa08x3HiJJJPCRre40Cc3evGXTRc9SLtcaVBRrdIdhcX5Riyhp4mRpTcXZBQ+xr6f6syrpNa7u3bZq4bzSbqs8rL8cB6Eo1ADfHhaFhI6VtFnF5vSqXiZWOfsISvHChOJ1HxNaKGkQHzh76+pohUU4OwVtw/+hX1DQw3w6ntczKSq2+G8R0Qu8+grdmb0jIPVKjXPotDuqONqExglvCTfJPN75fhTohq37YvrdJeyXi9L+uN1BjiRLRcDB8wHv+pT2P+hGxjpWX39fuGLu8o5ce+GmdiIgSZWpmo53IKdGyoQd/p/bi+OoWw/E6mpQ9GD8cp3+EVBUUE5/Wdf12xWDOeC24l0JqMELweOqPnaXpHjoqkCh+wrUpZS7CULBmUZLSskuHghiQjsGl/0Ilzs38myR+vrv6dulAXyJcDkheyXBY9wUDos3GpMs4JQAHj20zpHlfxS/iK4c0v/v1JLY5a6keesx5Y/SoPZU3bqpLXI2G2BldnEQGbIq1YC9hXpSVrBNao/go2e7+CSW0QJg01xhVxuIpP9hld3GflZvHGbKM2WaQMyx+/Fa+vmXEMI6gGYcAiK3bKi+ZKpco/BCFfDPsfi6k8WQ5h0FMQlXr8cJptOmLibG7Dg8O8vVXW/rrDdd2wI2tUzrgNr7gWK9w2DvrmBQOzAIO4XDSwzNt2Rc6Xe78aBY5d4dQwOtDu9jpftjhWa6D8YkgOzjqeDs1MkZDy+Vns2Tpbw8XwaMG9Vh5TmoGimFvLY+FTEzYT0reqh7arl4P5HyKi7UlGXvp+tYexl+Flzaor7fO3+nlg8uEuYAkl1LP4NB42A8fCYTEg3XrCade9GVArB79sXQ1vPaQ21GpL/twLcWaXN03dmDJxSBfA/ex3yg/Has6gihlLVXY0wga7+ggwr7357qHML08wAykKzuhssZk8e6UMTgRfSwecVtSqY9MUe2O5y9dzwGP2XYRGNfTvDycvfJ0s0z9mAnbc18m1qR5PjV2xbUNtc5+ItJjL+O4WYdgU4SatGOSmAcl5BDcok2uJHvkzX+jNVjSildNUg5tqm5cZ9rzrQnr7KILIpg8ma+Ivws1ogeOBlSvdlC121nJwMAOvso2GJIMz3vQdRvyRnRsn0jyQji1U7vTexZnGw31GyrSpgWHjlTTssqpcg3c4UBQMfqmLdk9ECbM04U3OkJ3mgiFlqWCMyzJhEaIcXZz9Gfj5KFH7hnNjZtmzr3lTtAuNWU4INnrE2q9dF9WGlCMGuqrFO7dOuLIzqao3ROkzLl87tu2w3SIoJHar0QYFVDj11r6jaK8HQ3b6wwtqYQSsg2G0Aqv8+q1uGQ29pNXDmBAUeTf4xjim57ThRHl5i4fl5dMmZIsfw2rtg9K5r7jvCnWlEC5jSt3bWXmNaEr3EpX1GVfN90PpoKsmV8Y2wj4mK/bCpV+Nzl+xEIdvYE9BZRuITGpYgnkDHobXTtvNj9bcQatoPffn5orMVjB9LAtWHZwdxJS6sEYOBAI3c6UA7lbFisTZVcdmCdzxtLEUsC+YmOayRwidx07hYnxaMo0RlCqrdTbP44vj/l8DGvn7KmCEzh4OVQxKXKE/7BZluw+f4CsvhdZDUr3E+58UTFFI9gaSbLIRJ8bRV38ZunsYqqRrHyMi+uJJhqgqK4AFIpiDEWT7tuKk6yUfjf09xwaM0egkusXSPIYa4gtDZHc5T+pYkSQM0fe5cSHqYqo4xRu4O0xfOVFIE1W9XNxbZP2WhboEmQv5sMcO5u2E3Hr825tNpd+jPELdV1ZK46X1ZhWwgsxmV/qHafK9zovoIzJbcp12QLA6rIl+HozQ7WzLnxtdv0wziIYr9A4H/L9gQQ3TpNsnwfK3JNQXC9Ma/po0AqXKxbjeWuMMwAVPwGy7CZ/bCUu8IEE5uktbJZGCJOAKbQrpxo69fMp8qOteV7qTBPhtAQ2I61Nl5pBYUGsmmLc/LWtJMKX4o2rRiVDpknRvrReFlqt9YgHfNscCR94qT4QMCm6/6NxBpvbSKDVKeMspTytCPjcXfOaU4s7y/l6tux7DmxPIjkSBZ2dBkWW1bpgqopNDYX7KRCJasUOuZs8SupEoUnO54w0skow+2d5VyOMmtNosbP0maX2iLrg/erSKS5iNKoSursISda2ssarZ0ysjMdhbdDxMauI7RRZTjdMdJdlmna5o6jEQvclbN7KIHcpzxyK+ovaiS7NW7ZuXzQWtNivUTsXWibwUFtBTOOsTjGpT9bbrJRKulh298eR/1FALW4lsLkckZasYv0JqPoJ3yejzW9r/PmlPGvGEYfHCtFtsSwgS+dw6sJX65SHKkd0NAnMW0xUH6qZAVk6mYBFudH4RD+omoKv16wvmFIFYYRMLJ7Rpvu42vu2VNB4jka3rWV7gevDxK22c9U9zA5ZobtXLpkmjXkdX5s/neg/Le1yKwB+FS9IbWTO9A1+0an5xfWuMn13I7zNEgIKQR3ySF3S77fw5vmMn/LAnALdVotAl0Za9diZjoMwmMxYman1KDINvkT7rUcm+GWeDF4H/FrHcYqxMk3lIADAmtT+471cziFZAZPTS8mkSJYx/OGD3gdSb+Uw09tpnAx0p+93e5fK3FwmbPclYgn4l7/5HDTkXQgSG741z4gPoD+6jK8/nanKNwwkUzPM9yaacqDeCJ7cQO+oS+lsJn0Q/7gQQS2dCRqupy7UgBwvyPrLU1uAh9pl8XbJskTcj/aEHb3JqhOlmphZzbk0wts0O0xtPmRb+dCy81+2fvhwk4dk4aWzw+Wsfrqqu2hlmsO42qE09Fqp3U+sm2Qgh3QpjimhQK73pubCEgl6H5Ba6pMeE2V5qIo/UdwVsLQrKUi4I+1Wcr40eN/zRX13ptw4hPIN+67awn3KG2q7DTF9E8zHYmpSb1pTrudLhsNiElMKJvhTZyeNBWeCuO9PCGpOSWMDIRK+gAcyR8Q/2tZTvltxj9vJTseHBRTPtPZecwhq917bIEggsit70VR4DyHL+o3A5e/tXMszqcuR7vzL1IO4FZ4+p2b4XWhL6c9lmD4fZTB+efYHciT+OFSiIOhdk4Uj6KSSKjPr147lbO9VEC+X+yDoU3vl1qbCl+tjVx3htfEjzMo4e58mXcNh4qBKsvYlyMOoRVBgpDb6XUgnnq5QqYw5LtlIx/AXeiu15yOe85WsTkamPo2J7W9EaMcPi+IeIi+Fhv9yZfzXb2j3sPsx886GAYZwbZsWo6q7J9eU5E+TC2mBwNcl3BeUEeYYp/B4zEnUlmNXi82GVN5ArsSliEIsOr4siR+aIKaag+41NuBmsXmqR7edIaz9SwwGfU4x9VyLFuxSY11/oB8oUr58kJOpXNceKzrCcmZBEB4+SZO0QYRonLKMREKq1TRWlW6DrTJ31n7SN741Z+SA1w0wkEY9vTQ7BL2p9G99DDCWwa+GVzF4wI0mntN9+Ylno1KnnQngiFJT/YBPbeV+l26Dkl3e5Lt4DofZ5u0fve4HSRAOO0aqgZmW5ENMXsZp2ZUh3FAHBDxdW51/5kD8GoDQzCjZgUdcMHpMdm+geJrQP+GDZrgjcCmV6lbk/sHuUFx1+Ue+VBdWgHFVoj76hPu+J1sCRT2PmjDnieChIvSxcwCbST8ORyc+l+QpsG943gUm1SLvD8padoknm0qsYf2yvkEGrHkKyEe5n7Wj3azpJQ00ljuXnkqlB+unzUP62LN5G8UNEnNf/GwPnZGxcabp+eOIYppyhp0uobwQ9SzdH3i5UFj7tycBakoApbher7ipjCfSH1vKDkyjGh70bsr4a0czok1sht2/dyWXGEo8sM53AV9jL8bRPtj77XbiXKpGfCCSsiR7LjoQ2QGGNNqs2iI+/N8XOvRm1XPTiVMa4JzjsKwjX5AaPQu34nLGz5QsxlVJOrjN7nMuOdRAFONQ+gxAYGKw1fH8bOprdSLdK2ctIYtugl3RQNedCAaxJUX7L8lN1BVTXm04mYaw3mR+2x0WphqV8ampCnxH/MKwxccBFrF1la1BwhzgPf4+UkKekODJZABmmto5KF7T0po3z4afViGc8Di2FyL54MSpBbH/vaLnCk9+2oEIED7QTb0KKTRB/zJaClmw5UajssK1Q5furCo3ZkmESVfNVJp9+EAEC4/tYPP/HWJ2vbFUs64hKDnz2DHc6pUk58uDd4KmwQnC15emXtT5s+BFWIZnLr1ctTzB7q3eccPo2Z8g3vDVeWkhmHu6OJ4xcmrrJzjsUU6ed5tVg2/SEuPueMIuNMn2Xlls/DppK3eRuWn80qtVKf2jjN9v0mvNuwOU/V79n8w3cNL+A19tLS307eGSJmOkOP5R+LNE3bQqevwUUb1XweyHLV9aU4lj5kpO8WR02bwuC+gyPB40F5o5ce281gmPQaOhTfMXCOM+0gm63c49ZxRJjxjawWUIczltA3RvIQlIM6aOrZyrVXYsthNdbO1QtU9G22PjZ9Bh+wRrWWS9WlZ7PE5USzSgfLxt3so/AYhxfTtwnW77T9auXD/nhqa10ugTNoj6HkIA/R46U9mHANaAnckTB0lpbctv8BJsBDfGFnjE2rcg5h+i+fL/gMcOYyczt5O6nauWSNtKV46hrcwJyuGloPfVLU/TusiJ0xTl/ArmKUheHDRbL1XtEGLNdCa1Vf64O5GORvNo540fhynY9KsPBEp+c+TJQwPOdXbmpKkvf+GmENXDelYZ7VCO1YL7iejhuexylTKycMi5jaKN72XXqLfU09ZKmLLpBYnENQugBMHlePQhsaF5PnvgqxAkykKexT5zDYPZjKgcYT1siFNTlOOhKfE5ZTwsAXo9nvHajdWmalFk9U5AOOL1iQTJ6o7ateGg2DQWU9dp/Jpc3281aE9a7gTp1WemRkomFi503uGqq9zlu5hYa2ZVjzxGhvLV2g/oCvoSP4tdnCIcSqcPpSfiTR36sMBmKQAAM+NWH4aJVgbeLrgCg1cx86N3KniP7iXjGl6WCi37Iieyr95d9psZg2Pq3iXyKb4bEzGBJ9fIRuqS/C6Q93Am0WFykvgdvi2ce3YpALSXDK47RDPzcbp/JpCGORQuVYdk9r4k8FscQ3qfId9kW9+82ifOJwoYrsO2C2G7m30PSDuiL+2xIhszL6dQTRnNDbYk+lA1yXuvN9edTeCSN7ACeDFNVWOkG16HnHbF9VIWG42umd70tIxo+TaFH5a3glJRRmhtAThDPpK9CNdCPRF3hYk2adaHMmI1BWmsSPo1CT6bNpEVevxkjmqAHlQcn9c2WzfS219OuQOx+1JsP1OrQ0NVgCUpELifbkhjIoTBQnWPRUdrugw8eOZAbsV4+lfeZWrPMXiJtCAkiccS2QqdmwKVisMpY5YQ1dPX8sYX782J+igGktf3ymw9f/CUqlzyO/OdSiJlO8Lgs1Bhv6YNW6NqSbglUp1ASvryL2tNHMoPKFOsAsuTMahiNr2Re2T0vE0eNEpBXEJaiqHDmAyOuP/yX6k/Yws6whltdLzrQvJWr3JWNn5/vlFerF8Bmyw2HxLCz67dGv6WkSltmsceEIE9MiuMJ4+v3fOopkoTYeCu8Io82W2WCsLYbvkaBTeH3+1TOw/lJ2qej8EjVIXhUZMHq5DZhG5R7z//0MdLuKlo/Rs6oA1WG9J507rp5WHusQKPgIIjUP3cxNw6Z8aftGg6kjNNnno1CNwMcX9ukUfaCwx07nmcW03XQTLesf+SNC4RxxdgBVlbjD/W5qmgu/N+S7TLzzysK/HkPWayEiH1S4F/ukeaN+J9u4nzWU7SVq/SCe70m/cCmEtDTMT0gf3DvFF3GyLDdpexoaDVK7irpVGJOlhJfkhLThB5DN3V0D9pAckSliBwDLShqBYXOZZV1tp/2HjE9Aw44KAU9lfUu+mOhvPD3EYQgqeVGmhPiqy6xDCr8Ouq/oinfZFrDamOhpbDq+Ae6J9YyQ5EH4vKMtmkaqDsqZJcxikh9o389rSjIEBWds61TL3rMekZga1AUfvoorGcImB1rHf61YIwGnuLcItgQlxeFJjgTC6l+9hAnv6jVycEBIUVZdAw/rsipiK0ix6teGkbHX4ndyUvADxYKi8PZDwgMOhFg/W1/loFPlhrfkeYCHSC+FV3mq/cos88ARkt7ngYJegub+/W2nDbvKRDUea3qu0AtxuD5w01p6cK48hyOKW+UmQQVBu8z1XcswRAZ70PVlMBcfl1UIUz3kEtFASTbvEka+rCTCEt7U1lD0MUXwXwSJ/nqHSWvifCjwJKLqjG1Jn6QdeG5Oar+ZD8BmBz0JxO8yNYGJDDEB4nK8D0uCUJhoy5qezCWWvtdsK7wxuHTJj18jrDBNYUhejOaOiojT7oiBiMFTHhqxTZCE7N2bw8MvB7D3To2XY/6U8zvWXIt7FJIQUIoJPhJs2O7elPtu6/ssBikvzylkZa19Ch4OitqoQHGrmiceuIzJuUO2UdxsdZI4JDmzVLMLk+/tKJqdC0cn1WRptWTfDTQnL/f7H/dk+n4cpj5DMmQ8nNAG9+1lFPH0zzwuINv5nOdiSk1jQSSbzg7N+WBtY+JH8YHjm0mq1xzbBDysRYMh7GNhdAZb/TKA+QbO2xRrIJN+HHgEqkU7VQipSfzI8kRqacDxDT4QlHKDPIu4eXLyXeZSP6Nxo82gdOvEzlxBXtf8vw3Dw7KvrYkM4rhiDyFpTai3gbzU5zSY4kIT6vgcvkCEJpvGtk7J3BlyeJIwyS6dF4+enKF2MhzbLuYuN+7FgFfRPWKpVg+lGnfEm7Uq0BdBD/wjaQ/VM9SpsCDBJgoqrQnETlDpxwSoaC8+aH6FFXOEQEYQ6Is3JFutL6k5T8J3JC7A+THKXQStO9PzV6SyJMZBU2Mzr7RjDiYK0C69PCFkRorRzwfXG2yfxIrljMUWlyFKZyNZlTHw5Rlg5sPOJWug5vRwA8WslUho83t4Hk9iK6ArZDS3SLX56CVVu3HGa/uERVyzRtX1R24tHEpk8MUl1l+lv5/AjgJx/ZP2C578oV5apsunveomjb9J4Y5drIC75QhTaCMK4xctaAqlG9JTGquwpgPXjnfYWVUFsBG4xIIH2dDrKY3ToEMS3kFpWLrCK+MSvwjy1Yz87LnEAe5MUnKDeNhOcaZG4BLTKeoBIaySfKcfiX07sO4BS2lkGYEN13+HxIWw5RWpJPBEB761OY9l0yWQpPYlWQlzUXApaQZ134E75wwHzykSIjpGiZmQrcP1w5zg6YcW9Fu920cM2ydDW6sCxdftcQRDu56AqnrVLnwtdYf8PDa2d1r0cYpyooIxaiFcECXAOYpcN1Is+c27qv4vGiGL6wQJ2cgA/t7ybJGJpIZ10X8iU+0xni/4EOHRvqL6ed87H10e05MiMBbuJXL2ODh+wQ9YU5eiKTxgFr+0qurcMn/dkmUoj7iHzY5GTh1LZNRjQN3/X2Dw1hEmcJaNEiIeUj/DwpJsMOI6OUM15OSUCs/rjdZwqY3pkZckpqjWwL8WnhSp2uoPf4xEJfsbpV5Bb963EFBjtn98Rvueq10YkzEv+mHXgjw5lC2xQtN5SgqgOVwaDdnl2utzPb6yaAB7nqlGlBibGCDqiG1iJ8okR9keh7HtLuoHCQ/XsF4Yl8uUAkZw3vdGMizLxB26VGIq0PWNORjyh9VMunnRfU+YsWzHwMLtxSVIO2AfV5Ygxpn9oJZmAw3XlHF/4Bz9IOmBZm9ntVn+DUpg9OmUYetKAKw4aO2lIpGTG1celOq70cQAk9PxkDKvWNmqB+Q9RQG/M/gRw6AOBo+eIob/VgwR6/pNOYcTMja8B/V5Rnh9sb8gfrOiYYrgYl7Jk55QgfaeM8kPJVPcXd5yW0WSbgLQhMVbOJ8lgl0AV3QXqd5RQMbXP5pQw6xX4Erk+YgjWVVQciHGpX5L0Ph4wDLQDslLyILjs4ONymjHqjBIJTU04Cv/CSbWhaoABrmO0aT6hwwtI9d4E1XH1bJI8tJ4IoELLyIVbOMyWztHCDEGVXc8Nw3ohDlY1mH+GSLFzdtjhS+HGN0y5Bc9qvSFRAh06NVod/YZlAJ8enIkFV9gS4JpW99HjmqzScFlcf/dmtJOw0VYSa5oFNndIXYTOF7yxGzQVutsWkhBves52wTxwedfQ5ZODtRDlVxV88cvnEVcWaO0+mSkFbcdgTH8MlxhXGa29NmUA22Zjx/UlMFrbpe6Fltwc0inD7nklF7E2odan6Mh2O2h9F6bcUuMASV+IxVPNUtHeIbsG84Z/jpQIYPOMDpz//AVSZPkWbv4gHRj1sgOyI3RYwLqaM/HBKjknWvu5PplYQsOPW9LRNFBrAb/sJoFW8LXfB8Voq9srTpcgP1bIflzXmFRjgGCRbqWyQXcFA+iG8VygWg2jDCq3xA9a/qSu4dl3lOa7ppi9SwJZJj94+0L1PD27u9IgsRl9s1u8zo1UEhyhe5eOOM9j9L0iTfpmbzmnA+1fDwzk/eK25ccdvz+ho343AJRHHcm2JI9EJOVtm5W5KZFuLaktkjeK3h/3TlSasEIQDitjRrEn+ZF3Wt+riFsAf7NXedZCr7YmyIJudIaS77ECXIcjAV/enwHLbPnL2kTbQi82+B3FbufxIpTld1ZykJaUNcw+qLDzaObKgGZA17jMaTlROlwOFEAqAaGtRsUkiOEuvi7tuW3sP3lZaZkT8VGITEhnM4R90aEbLwyPPQx/woHpVxlOzQPnjLuYDM3X8NVKhovw2z/n6czdhtoaduL0XihEJJHimI+tb7nlXWmvjBYoTXeWONjhJzWJEAS6wUtRS/iAawEcGZxFeHuSIaeXMx0WFZLdFX5XpqmItAIQDcE8chGNMpglolPrq4YX2rUNPnDa7oNAzjUMrdlHSGhB7R3fqBdvc5R4KNAVeKIevtcU0410kXpjXl+JmA2Nhopn7g4gdKJI0F8Bsd/odJr5tXPtVQWWH3AjTGUV+UB0l55yBpQ/lO/mQvCKieA5VyGkPDjGmZUUQ2FSOh1FfaLK/uhnNXjOCORsWqLlkHW3+/KTOQlQCEhWVtDr1/ZOsSJMZZPiSnuPL5IQm9ZaYY0Dl+7knP+nOhF82rXCIlV5pR8pBCXgQImyYpHeWlPiPyHqTdvxfWekc7y+SDCrXFjWFMA50gV1ZbJIvhg1JiSFl3BmWhUA8IQAFvbF8GVQvngL5yxH+rjdrCnz3+Ulu7vKTYdmogqoxiXcR1hbN/hOmo9PLdbFZXBYv9p/6QJ3850XnuqlhcDDQiZs5y1sNUNuK8Wbear3QJbNLW6ezgGbmleEQCHoQyhiVforzK/dLxGuHHzbXgY4n7K/sJatVLImGNgD5iJvt9bDFyFo50se4AhMiqcErEMI7X2eXW/oGeorridrhOhXhoVow9J8zeKldQkwRVkDtDs9FExZrRMJVCM6hK1njA/Ne2O12TvNsoq6avSmEqoj+/oiK57l+vUVz7JsFUStgB1YHowm+r2UZTsCiX8KTddvOgbjdG/JXdhkS0236CHImkfPHMHuqo2zKKIiFGPn7yaJoEEBSdc3Q3gjjuwkAp+Z9gaOsMrSKBiId5slXTl6ItbE52prLq7f66XLhGpUWyIPkv2tcFOgTFB/kr6ZLkDl+egDrOVLKxzpl1aWm/7w9SSSN4z5FnuH+EPoqggHMgWJuTMCXEsDs7fU3H6AJlVes9m06yk1IJDd1S2D9KPRwRsuXrZTL2UuWk2gQwCK3JrmndjxCZgnQAKEad5kxQ2E/A3c2tqLXqVvOGc1Z1jgTuCBb4OmedGZ/SOiSzPyY7MVk78T9JCNRWxGzeEKou6/TcxCXAWzwb45QLdBJeZ+QMChHBorH1/ulBVeSUpiiXtv6blMlewyNMQeukHN8qd7K5g/jKMkN59Rj0znKTLhV6Mt59KxFLtEdHwpFZV+ohizyj708aChr/vK7LfuoFdZuFWGbOLkz33HxszURk7GFo/rWff1wgyzJCqoL/QATMcpU1deTRRdTO1OzLhAsv1YD8Ggf1FTdsY72P/QaJOz0m0CqISs6IXaYkCiIKHI53waHbm8tPJdvA6dpMpth+DJXzmlke1B4/HJ6NSZU6bMKhNtu54vd3eLZOfZMZjQQuXJvjq5IL4gkLh4+i8CdJjMt8grHXv7TkdGQXUW5uJaPcnDTW1ftimXJ0a5IKZW5kc3RyZWFtCmVuZG9iagoyOCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9SWlBNTFMrQ01SMTAKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNDAgLTI1MCAxMDA5IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODMKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgNjkKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvQS9DL0YvSS9ML00vTy9SL1MvVC9XL2EvYi9icmFja2V0bGVmdC9icmFja2V0cmlnaHQvYy9jb21tYS9kL2UvZWlnaHQvZi9mZi9maS9maXZlL2ZsL2cvaC9oeXBoZW4vaS9qL2svbC9tL24vby9vbmUvcC9wYXJlbmxlZnQvcGFyZW5yaWdodC9wZXJpb2QvcS9xdW90ZWRibGxlZnQvcXVvdGVkYmxyaWdodC9xdW90ZXJpZ2h0L3Ivcy90L3Uvdi93L3gveS96KQovRm9udEZpbGUgMjcgMCBSCj4+IGVuZG9iagoyOSAwIG9iaiA8PAovTGVuZ3RoMSAxOTc3Ci9MZW5ndGgyIDEzMDU1Ci9MZW5ndGgzIDAKL0xlbmd0aCAxNDI3MSAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o23BVSb2xYtjLu7E9zdHYpT3KVQLECQ4O7uFKe4F3d3l1Io7q4tFIo7lMeRe3ru/f8x3hsZI/nmsj3n3mvtJDQUqhosEub2pkAZe7ALCwcruyBAUkmdgxPAzs7Fys7OiURDowlysQX+bUai0QY6OYPswYL/CpB0Apq4vNqkTFxe45TswQAFV1sABxeAg1eQg0+QnR3Ayc4u8J9AeydBgJSJG8gcoMQKULAHA52RaCTtHTydQJZWLq/L/OcRQG/GAOAQEOBj/jMdIGEHdAKZmYABSiYuVkC71xXNTGwBGvZmIKCL53+VoBe2cnFxEGRjc3d3ZzWxc2a1d7IUZWAGuINcrADqQGegkxvQHPCHYICyiR3wL2WsSDQATSuQ8192DXsLF3cTJyDg1WALMgOCnV8zXMHmQCfA6+IADXlFgIoDEPxXsOJfAcyAv/cGwMHK8U+5v7P/KAQC/5lsYmZmb+dgAvYEgS0BFiBbIEBFRpHVxcOFGWACNv8j0MTW2f4138TNBGRrYvoa8CdzE4CMhBrA5FXg3/KczZxADi7OrM4g2z8ksv1R5nWXpcHmkvZ2dkCwizPSH/ykQE5As9dt92T762RtwPbuYO+/gQUIbG7xhwhzVwc2LTDI0RUoL/V3yKsJ6bfNEugC4GFnZ+cT4AYAHQFADzMrtj/Ka3o6AP90cvxhflXg6+1g7wCweBUB9AVZAF8/kLydTdyAABcnV6Cv978d/42QODgA5iAzF4Ap0BIERvpd/dUMtPgLvx6+E8gDYMD+2nscAPY/Xv88Gb62l7k92Nbzd/if58umKvdGV0qN6S/F//jevLH3AHizcHEDWDh5OAAC/PwAPh52gO9/V/lH/3+0/2lVNQH9zY39d0F5sIU9QOAvCa979x8Zbn93Bf3fE8MA+O8VlO1fWxkIoP/d+e/YedjNXt84/p/7/8+U/7+2/6PK/63z/5eQjKut7Z9u+j/9/x+3iR3I1vPvgNdOdnV5nQol+9fZAP9vqA7wr0lWApqDXO3+1yvvYvI6HRJgS9t/thHkLAPyAJqrglzMrP5qof+cwmt5WxAYqGrvDPrjrgGwcLCz/4/vdd7MbF7vE+fXs/rTBXwdp/9eUhpsZm/+x9xx8vACTJycTDyR2F/bi5OHB+DN8Tqg5kCPPzsbwMYKtnd5TQG8yvMFWNg7If1xorx8ADbJP0x/IX4Am9RvJABgk/4H8XEA2GR/I04Am9xvxAVgk/+NuAFsCr/Ra03lfxD/a6TGb/QaqfkbvXLR+QcJvCKT31xeI01cfjtfi5r+Rq9Ezf5B3K+hr/eR3e9kDs7XWuYgoBPQ+fUu+sf6OmRswH/BV0kW/0CeP5C9q9O//K/ULf8FX5ex+hfkAbCB/gV5AWzW/4KvBGz+BV/p2/4LvvK3+w052AFs4N9EXlPBr73wL/8rb/vfcl+T7f/L/crc4bf7lYjD65zZm/8r4pX6v4RxvFL/vS08r07n1wvpt/u1wu+df21ENhd3+3+5X/m5/gu+SnP7E/5Xn5q5Ojm93t9/3iSvTfwf/OeXBRDoATRDWl6wNxMKsa4P6byrlSB2Z9n/KjJLs6/zkYHFe9mpy/UBDT6FoSYraNPpRiLlcz/G2q40/bX4Cvmz94+2Rvjw9iS1jkefp/cJ6tP7HUhLU3jDk0U/JBqGSBFJWDTFD3yeHX20A22g2yB7FGjyHF350VQLsO/cB2U9GobKV8fDFvbVDmp43yI/lc+wxGrFvAssmaPJN82eJ6CEc2EhRWDEOvNAn7u+mcXKnXwhV0hgQvI9juUq9tbf4oy7n/dar9TkdO4lpCbUJyCFvsYan6b1fvM9VQF/0bu0eNNpPG0er2ti2y6Zw/Y7vde+svqd0+GFES3NpCA9IQEbNI58dMxmu1yiXQlFIhx39tmawqaH/AVfm6kzs0oi6EXFlq+BRx1ZYL/vIbfB6zs8PW69LmO4uhVuSgM5eIAnnBQyt4EWLaJw33LkKRZ/492I2frYOk5TqwCasTRpW1fAjmVWvXvg4bomxec1j1H5uXMFr5kIt8NdRlucsyuzTPvhnoMJZ3M7QiPIFJqmpiCR77XtKblSyEzE0XgN2aSuNwJtxLBEsVQpWRl5bVxNqsgj7w3r938gM2TWfO8Ycke6ixg62sUp1yp/kaipyuPPwixClIP/EHffAhW+PeGKJzu1LSi1gRW+rRAR94s+rOBSp6r/cqL78tSwkIVdmLXcUuMNOoqybTK2fo5KvOLpbH4cD7GRQOMAzi/BkrftjLA+P2WQgkJevAciASvhAeUL0sybhDmPjp1Q+KJd1uxGaR4/UuvVhn7R6Q4cnvgfhkZ2gghRPgsReup/Vr12aYXZLYDCE32pW1pz+EbGEaihXQvp+2FE8FPvRrnJpTm71eCit7+/sB3cPKf7yXhu6kMYbqglz7AfdFDq6CkE0n0wCbGAbJBVQIzf5MnlHIMwl8Y0AWqoeU8FlMIAxAK+IpkjY/R1Dw1x6K6wOx1HnnPgpZGylFthc0wORhar7GCjBrjTQ//0Z1Eintds5iNrtkZ0ktIVOUPYqvDnlpifbs+qs1YBVMIc8lQq7/ed14s6Bkdlbi1dawd2T/BMt6xXmVzgwu5ekhLzzx5Rc+1UKxg86B52P9By8nobO1gsWKFH4t9OPmHAx4Jgni3PSZUqJt91KMNXXqKdk9WJaWeUzuB7zGTqAn+aETuAPo29RelLRz9M41vrF1P7SIuXyQ01qD84x5D2q4iJKNJObZAOW4B3e0meD67AhH+fTioLapqSXJe98HysNeOe6WjSfN3wzWEqzgyq2EiiZYmJZ/OpxKf6aaO9lnJjuA/XAngZPKyHoBSm4JhuBViPGhTBvsKDtclTPV/1b5OWI/sCfjVThy6HtloPuF4U5YZ04U5ij2KMFuSbdz7x8zfT9AXSV7J9wz3isB0omGCbTD+v78CTlaihQpUb0YGNXYWcmAaJXIacrx8rwg0GEeE6KnEySLUiB0SeYT1PYwl4rnEdks9a1XO1blsvsGlH2DvbS7Hjg+hSWbYyy+r5sVOmXeRfJDwYxwuptynWLMnVoQnkAjQgSCqE1Pu0IU60tgKOxShsP8UqLVdOc1piq3xfZcUJ1RzkSyJ4aHafTPJnEGuDLpZE2MxL1TbF4TPascnMKbtWEKo0Q0VS7k1mvERdjpUl6f1UtLXsk5k4N0AWoVX0YjZRvVnwHe1zqe2c/3YS74xVBi+sASLn8mbTVG48Gbn+lpvWVcaObaeqDw2D9kgrmt1Z+2JFNikWlghtpwnSt0q8K4W4AeePIe9JC8frE9NhPeP8l4l8vNWDCmJ5BxtzxtLepH3gs5a/JYIPxA8PGP3ImUb03GCCE/lUQoPy8lGcjxtZ/AUC94ibPpGkk1UE8idggtw4Z8aKzqFyZpfJI8VtQtc3rF4sehxTdoELU4pUMC3IqPlDU/5sbjwjbRv3ucOS045H7NM2DxCaLO+DkRV6po34ucb78bh9cklbIyO4cd+VZhZHAfH26U3gywaieF3Hr0/weS0+Ue5KUU5JZjgCm6q49Hs5wjb8HfA1QinlfCNybEmFLdxp6ityBB083VWzAXAL+1pNuIvMMiQ+E4xrwTEh0NiVUSbk+w6RaATByhooUwYUtFWw2PEk+0PU/j7zt3Y0UKKaXZM2tdsIh06uobV64krgqBbXrzrGNGJE6Gr8pFfuslyWpAG/hDqRzYvhWtdsx+wRJ4jaOJ9RkrS2L69de3l3PkouRNMQDelpXtOpX8WMEFnPQOTaL3CQKpWDfRV/fWCCOEsSVPnVxDZufCse/G02dzZuHxcC9zN3a1xjhQISWsgblOjxUeoKPZP5WjlcRIkEf0t2PHm1ZMJL4Q0huLRHNx/hE174OdnlPXGXWEfdsBjR7c8fHOTxq2hq6cl0r9xSxg74fDkaBSBtKyRq3q5UB0CS8xZjIqSmGib1YTBlPGzV2SZcvefFvaRLJfwxxbVmbMOoidJMX11mmDOAzsujvsRi0EcvXXUsoUDB5SwIC2SUKDhaKxxHgdX/VT4q7dyoPB1j12g2VX7Oyrp6L4oS3h8xe5ElqtYTTttGnDriUb3/Y7zNC/wRrScizEaytNbCUYdlOeU5mNcx0h6e8aMDE+uNpbWtfp4TmZUL8YevYlyCnMUuy+fLnrTEMukU7sI3juSnaCe1HTKsSrNo3gRl20IZEuzgB9PEajG3QWw95a9MCmnDuzXYQ7y0edTHmY/xwsieWEdUDui3k7XQYKLgK+taVs29FGSI63CC77QVmOH8+3O5XnVD2bL2EQK943OURvhV9wHqGEXYHuE++hRGQ+jd7tImixZ1Mz8/t4DsXrJiubmJ2UyrlV+O6YjSb6DfrvZz7Xdhnl8c1gVWqFhNKkiMpGc0dIoalWAJuOXOxnsyEsPTydu5tM5WC5orU52mBRUmK84SH5ioe+QNUIQ+mVN0qSNDJmf6R2Q0MZ7nwQX27Akc5OFrVA9JmWPbLA0QJZpS1z5on4+ElRu5pHL7WvEAEzbklCOcBuWq5IuZVVrgeem2igm3JzFtCxrIwzKRQl7ClFWOCFaoPEwgEMdUNHMQtPdZOuhbKBSaWvS7PXU3EbtKKQxrvBbXxBdZmwPK7nFReE4iISZZPiRJKTbyvHdalts/rHK0DCqpYSNz+lYShPHdcqJGlSYp2gNQaX7Uk9rrkTcn8Wz2Y+jjWPtkfsGTnvk6fQijYM6dfay5cURBgYTSg6ppSEwYC7goIfywxgUm0ZCqqThy2NaS9vMssDStCv17qimPOfY0o4o0Ik88ap2WptUD4bqtW49AB/F7Bsj7OcJxagfJzIzhH6QYTOP0rUpxiPOdK6qP2tGJKg75YyMuZpLG7fN5O+yZcYP1AdX8PJV6EvRDdIeJERwKGcgMKEQ12MmzImNgMWmHuLhtE0fMgqh3NfdHdAxf3nMvk3b7vtXLr2FqMl8QNTLb0I7mHcZil9YfdmEefcbBJmSoBN1AA/0BKuQNVbO5PGDMT8Qg/jc8vxgPhkPSPLbAXeLkfdKPUFKqL6LteUBqHPnr1WOjVvByrwmyXrko7l1+gQ3VVrW7WJ/DwHbjy0TSwPO2S1M2HulqL8V7DkDn7KC5U7138ZM5SuIuc9KM+IUh01JzQleU5Cq6V9s1GNMb5pBd/ViruufteQwJM+184MohMXntO6Lhqvi1vakCDsU3tRWTWFQKe/WQTWe9l78GzltJHfDx2XEnADgQX3VDFbAwE97y6StKUZoUplxZHMhzlJKIzVm7DNB95hdko4+Rz5HNz12Bh4MYa+KNGoEhDP+IKhzMlF9f5nQDuMvyyFmyDvwiEtHoX9Mh0LPvNSDfTQHzabjZCRMoq9yjq+wgEZnKDaflbGgqZJkASRbLoij4LeaWDbdypXrcAdtkKRUBXXB3isPjfiT5YnTPOAFOuzflnFZaGio3UKzZDIMAbeEOB0VyNW0knY+vnsV4ZJkapqZKyW0T/oj0CM+nIZTWeTDmK0o1ry7FoCUV2Hwy3CDJHXMvJBBMH2K+HJdmP2dPflvyPvQ42Z4TbVd4vaMcESqijmQEtQ8diizcQylevscIqeuqyoDaXErzSH8B4x5lZsB6sGUrKAnko8L6TVrA3VQDqt156A28V/z2QsZoI0VTBqflGVTRwhMObynG1uqEKbyZ00fytovVBB0iDjR/CcpNsG7B+DlHE2QHdyg4IfAtaZ+KJAueskTZtogAviWPyImOkcfEOD2sR2Dj4MtKjrQ/WW3figs/Poavcu7Vgnyc1FhIcuLHyJ6KjGLyHorAeILPUBuwAZSGvpDNMjg9Q70Jy9Ka2JyjduogYcRP/U5cJnjsIz+GKMgsdhJHvsN2RGlk0ergemsTL0BUw62+f0EtR9saLGliS0vXMUMKRN3nSFriyfVM4G8gZkNpX4DTbt+tKblaLmkbuAgMysZgNJLxJSKnEkNRJT6Iaw1ggXs69Uslshvwsz5LzkpEkHEj0R4GkEe+PVtixYB/R6dXcDMcd6UfFJWLHUsaGbHgc4AlQAuf1TWEtmHhxIe+3Ryg1ukHbmEBKPJEqmHtn7AZREF1kRAYJAUFqKi7Akvwn0T3ZQcnkYu9IB5qrFW/1DBb63wLTMZTX6l25Wt0RD3uuLO2s0UKi8rgyqVYOyMUcEoM+UEUC0I8xDB2HeSnqOehJmowgym919JKf1IZE/LzXS1Fb8W8MxcNiRolQhhDG0+9RyW3bO+Gh4W01Xqydyt+jsplwmygVKPxEhmkLtWCgHQVbsFV4FWXTbsZa1wbD3ez29hrwKe5vh/oyG2YwTGsFFGV9A15WnvPuTYyZ/N8jYNN+2MYCvlQCFgny7eYCFssn3oX08WuZtHH1p5wgxj1SE64eZqZA6TQ2PHhjEuSmRKKXYgH4wZwCV7LWseH3zL42aRkjC8r0UlEl6yqi0qStG8qGfk+GIaZK75xbaV3/zg6RAuYl1VgRD+d69aIZffB+S7pMWzfUwxSjgl4K64s/jHmB87HW4uawb31+2DOjdqiftCCUz7fNGwYDUkBtkfU9AR3MV/0Cf+XlpOQgLrw0QIeG795wV9d2VLuDpQVQtbntRIwD1WIX4011N8168Gg1bHOuCtv4T9L1iXY7HtiV/htuMpRHdLzo00q8zUA3NA32eTxyZAthb4nsStZEHkvJT7KcJEiJsUGa7jLgR18perYT+Afflx5Xu+ZWBQFB5RmSXCJSd/Esapj5L5Bg9yE3Q9MgzWb1PJRuShlatMipW50mhZZDo+MryYGxz83fuMxHk8pZN7aZps7M3IS4hEjEhhbOkMXVctSXpTVB8EHV27eZiVYpoU5iHiHzb5HH01nn5ObEKX/0uiq0zVb7OWTqTneuKstr7RbY8G4WRjC248LP272rXrFSDgtS51nwo3FvZpxXwl96UPE/WUqR5B2wScUULjYXkGQwhuL0DzC7B+k6p+g4EHee3JUjdxWyPShkHnElkN+nUj83SwLcYtHoV0TOOJ39L7HmQRPkQd4mllwmshKaVkhqlV1QcanDnMR+cZeMd6/6DKzIjxQIk9xmTISkb7gC/8UdllMFFDOWO4b37SVlyPNW3fOHhA5dQai147vjMPg3/gXcSh8LS9jjF2s7SlTNEhvGYx1ZjSzvBZf8rOzsXArleRfHxvBDglDRRXQdNAX/2CEGTw+DF0Skgfic2ip4GxOCVJTrGjgqy9y6EVtwTMX/8agbtj3YiW2YmAX6iBGdexRmMbODON+IGbv1XCR2bKGIL/jqvxGDp3uGLLhLA5/SFunHDeGQpd3Dpih23HJ5u/rfOc5kZ1xQr/qK8ARedLF3rvnvPwxYhDu1hU28uAK/1ut80ihLKpnxLsifMkLBYg8hkDazV47pUgaYpjdvPEe+Ix3MBI9fVPjF3wOkpV5hYolWMUKb9rYr28wrzPV/e4L7V54hYLjqhDdVHcYsGVrnnb3VQlo0OstDGk+qLgE+n9o298lsLXolLCB38nHEv28kBu63UTu2ywe8X6ypX73BbbsUgeH9lspAyzV/dfFgNqMmIVHpnx86s/xnAeg9+llb7K93GBOjUkMJQ9HDM2YvgcETse0hzTCMgaP3TdV7ysRs7d1ht3mL76bGP0FZz9MvnoZd2nXro1UxlysadB5CVe4vGAScko35BS30r3c8lWEKY/10OV90wwzXcCnflWGlcupkhwnxlnMbW6dUIdF6jxkEi1vUpaY5tLpoDeRxJeA3JgwIseVvPQCJBNjlXEfx91I84+w+RvbX7kOiaBnB9qpt4/YLn1mlNQfWliMY4i3alDKhHgPlB58hnIHLP0uAm71AK7lBnW2F/T2ncsvcHOBlkTpttLox+5JLa19CyFMATH+DlfmKw26tjgfpHRdyXEKcmSR28hMOZWggFWo+5GMwMXFu02Q+qquB3+bxPc0abAGVso7ddx8uDzPNOnZbfTAzH7o9P5gYuvJJ00BDoJT1aQSp5rm5StDTZ/BaVf2dK8tHaUojW8itfFJ0JdgYsh1ouAZm8z7zF+DsQjAuVjm77GD83fkEoULMtlLNo1spu+ud7/Xu8mv3x58hmpBhs5Xw9rAusyGlKqbO7p8tLlzTi2wEm3OMA5NyDWJLVOtpfezplGtDmsd/SyKjtQkq2Obohg4LQaVnh2+13R2/+kGZj2hjLYvysr1GoK2i0wCMowaIyYodo7mIU7A7J0qCqUsPeUGytBO+f3zdVPY9jHs594+nJQZDAivUBiSmNw0JsqkvQDiVpyV1uBy7R25qPTE6xXCplgO2ZXcWzmPqB099M5DzfqJmYrPkM7xLAMOGjFwFX2SDfV5joJIQdACAh5AMzhD9VlvL8k66PB2MU+Vdo0F1gOmLU0q4ydjyiVAIOKwTUKWDadEpug+LUmwUf36d0J1r2kRC8zIw1SGO0trifUkOo9w0zeq5sI1u8VGM3HMsxToA/lu8/t2S8gKFAl1jMLVdWwa9VCj/VAiSuMCvrqkBqvqXNsPEpxMysHmPyh33CBkeBGlrxMNTlnR87/O6isrB0kRk+72fyO3IsCNKfQhxzp7+02UZyaalYf+7fYD7qwoE3xYMBN3h+e8eCnuBmx23NSb+Z8GeuStncnXiJWkLMZPmDEpkckJ5xMJFMUlLD5l1+raSk68iObUmNaxtxXu1UCi3Paq2BN6GlZj1psLVJfeJCRjgvNR/4ic7zeNH8Ac+1YAdLDX9CpQPXsrgAp8b7eHs6FSC/VrOYzAvd9dxZVReeQOzQbCwywqO/1Fu3CuT6BSrt+Rv5bzc9EkJtd5wdeLi0X/+cyrgmDWQI0MOKZRfHFa9K6ohHeD04a92aY6m/kUBcobxQ7LuCYDP9kTLT502n5YB3fMIklLxaI0OsB/l3QSPK+9JMXcnztWw4ARKdyDSPiOszOerdNEDI3H702WYCeptdQi1KLm8ot4N9ugOkp/sxwL03o4o9FHD1qNm3z0QFIYVx84ufQT335v/0Eq1PlygR9yUq7iIXsVZkzpSi7te9tZ3jcuiJN069OOKp/QAQf+s9AFEfIXR0yxmc5Q7BYRaWk04BS06A5vzttAXwvOc3eTBEMTUVFrmc8tdaG/kNJy0sqfnTtDm6cgWi8QoxJH4buftOOjeZKguh6/FA0KMYInTKkvNKrdTqyevrAE8HtOfImv22r+9ZNM5AzkvNobQ+5En82GegpEh+Cn045oe9CPVGTn409XxEUdYShrlX5QapsYG58OeJss1R+yR0ul8QKpS3r0BI3C/Nl3f3uF16Z9EsLU1CNl47iB1aAKK3+abBfrMCwEYjb1EY69Olmev/bFBNE75mPVJoFlxG1/7zEOXCAyae5LY5GcNnV++n5C1Hn+FLW1gj/Q6VwExez4ReXA5NlAo+O22Iah5QFjzAk7KPdrpSSSZnndiF/J+bH5XahRwM10VJf0C7klt8P6gA183aq6XS41fEve9CEHHqU9TFCjYbbfDL2vqkpqIejlSzM/sYiuKdZK+AZjY29mhmUZbbvCA1EaF9a8gUoKZRi2HCcayWR/dTb+mEVKrjihpNEbNi8FeRI4Aj+74dbcGZj9Ql/TOFCSplfOAj3jltTkDwZPJxF/lBb4inGDkPDw0IVmlPIcrT08UZT2M8WRN+FJmdXzM2VJufbtlg8plqzDyRZP3FYJV08T1Eee2Vm2wdraDdRDfaThUkdeUOkXGXoOW+hv5PS2diqWW+DLQE69AlKEJc+fpT8dmFlMsjgyDsEVBeDLpNp7GJi7RkIgHoaSq8opcJhZXSCPr71rDZy3p0OLcQcoOT2TtDvAbAY2TKvylcjiofjFq0Jd0TeiP8zd0lbz1juHWI5pxqkEf6P7Epwep6zs82GmFLqc5PPJkWvisQvptqXwUd5Vn1z14g0kKfdUq0fvVH7eJHFLHbRC/lXg93fh/NaRAc0/276aHdCpidRvnbslQrZsN/djehoVvuxt52uvn2F9fuCaS/3a6Uv841C9We5g7LZk0fwLez7rw5T9vLopTNUMBAI1c7ip1u43WER3S32xcqkQUCs9FurPXr0sT8GnfXVXScUJca5KBNcvRDJyyG7BH144r7hcxrvwvhO6twdzvnM72H6suCzpxqbFulVeUP2SdBDCChD98pPbOyhodwc++hfPBkx1u4RgD4m3PUMGAsUec9r4815kWgAkB4H/idqvfp1MdKhUSlkYqlEIZ2ZhtbiFWsCN7+1GhuAPK6pJd3Yrpu4PtQcnKdcfed6JnEbtlrwrfFYJU0+aJyTLnRwdsnesJZ4HSyL30s4g0jA3tIf7IqL3BcCKFvRjPmiUF91UYXq7YF3pDE9YQdfkmaqtoeozD5pBT6suSFvWzGQHZTJUiYi6x23jPJc3pqoimDRHXZQxuRiuoJtoU7mhre2lLk1Lju1huwrZWqfC0Uvue9I8HrgrmfkF2502fNzevxiRQ0l6Lq+aieb16vgi/nIUTs4CVfoRp2ZKX+S0xZuHLzrufcw17EBTm7A0d+K2NlFZOUynNVXsSBMUucse3Et7ffCmtANxSJa1Qqx9mR9J7chIdXa38htzvhvoNAHptCcHtXeFbV/IZKH1A2U59bSfWh9G2Jp/VqkT8NlYptT4Fz8SyEcX+8tW/sQtcBX0DxDGazdjeZ+hF5BAkBnRe2JCEqoQeK9WmLVz5MV0O8P00dtBDjzDDhnOpkLJZTjeBFfrCIXlwjx51g2o9fU39QjEi88MNE10lUZeCQ4y1nHmCzpxvqIm21ZZ4YM/Y35BzMfVurc0pt6XKCRf8ZzOfqSYRbcFhJTt3n9YUlq0UszARijYVKB1HYuCB8AXWMU7SAIGn+HvtAL2fMKCES7j88mMTX6eYKIxiruk4TC8lXazdQIZH1AYWIAJghBWOrDVjBjxwoanaEqgxjZd2xo9cs9oxtFrna1Wxg4fr5Rdi83LyzC2ZrK1H7ISpTCof630f/PBAbUk3jZVJ/vJE/hs5QzRRS9k0vOHt6lGl3hFruThPN5psQ5HyDpQXEhBFrIFhpUPBwbY3MrmnK+8F7OiDRN+IIbU0BJZXlXTdF2m3Oy0A/WcfM7CP3SNC+gTETNlHTqii188l5JpKKkowVxHsukKaMQtn9Tj4gE+nkhqiVK63hapKq57HYudij0P8wcT79Q30iUWNCcmf/Sto23duG8XVMbtM0mA5JXWZ3yeQY/OTeO04uXpbxU/3KBKNVIGIHmLed08exfOjZ28mOrdfiTe7ZnoZ9MrvLf5aZeW7KVWtwH7eDlKN5H19uGxhvJd6Qs00eMM5rFHmQ8lxJqr0qFAco7sVf92N1TCtzckethFo/RnqFtJhRg9NVkVHwwXdiW6o6TEn5dxOexkr/RQgAVEG35e0t4pngmL6fl5e99sadlrrcOTJnjZ7jrdVGvAeTEHVRxx9NiWewqN+y+BJ9/QyWqg5nPlLpqsJK7CwT8ci+wx4MIvC5Sfcy6DT/fS+xo8ke+fpXrN81JI98qtciJuT849CB9dJ4XS5GTMRPg2XEMarYPwOC4Vv05wNF9dVBqAUD54M7kC6e9tc5z3qHL0JTsE1RXcq/FCctp0cTrJ7vM/xd8U5+JXeWAshQdb1Fb4AEF6JqpCyA7zrCKViFlFvRWWuAJyyeoHe9ElvdnimgKeoYR4W4EtRr2KOaQd88+aYndRk619KsYN1c/x4A5nL7IxBgmeH+9Dao6IZE5HON8SUQJ4JgeEmbchOJAHovWQI5S3irGidpbIA1GlkryEJw9zD7NURj0riamXBNxfzr9DjLZIPVJkCxJmz3FcH/fp/JxZENido0F9z9jc8qWW2RuLz4s0Y5wdtu1OusgTpWz0JzNoWcIkzBPqVH6tym8YJBjCP+sjZU3+JLfnMcCIpSy5gSAToy7ChHJj2N3F996NHCEtRP50pp8ST8VjIgJ0gXmDlXAT6iAZk19IgKFHl6glOPGVRO8Lsdv7bjVJdKCJnrOoXRGiUszkcE2c8F30DLG2QcAK9fvd8V2xEyWbrnYlDzcVJtfq3qklhVQW+7xY1G26GY+Hz9IRQr1C3qZFUYEtEaW/qvmC3B6Q2ySYXCzN9yTIHhGyYXfZg0prP+yMYYTJCx6pa2F6PFyqyDU6OkSRf43tXY+v8jcYcwQxUKRXoNbd3VNy6IWwphjCP9j9HEe1P9yv/nDlPVxJW128HFsUxcsdkWk5vdiO+6Pcy799wCPlBEsy4od3M7eIv0UkVc1NPVu2rdmkrnuHXZ10746MotFuBX/ObJVc3Db7lb02rE/1r22ITi+8Uf8j95m8DGxrZW+VTjrlw9zHM5umGVmz0FHLkZV9nBorf4nqys41WmfDgdwtso/9So0d4EOcthzpT8scDPfmF/mwek+tii3w78MXcYRDIMc+5DdX4PZwdCHMDu1mPkAk1H0Cm0gt4MLsOcuSBjDkWGr5nMlVSME0ygAMdnWDGhGvEjk/EfVdEjI0k43s8rwNm2EbdPGGY/S+d2GV/W7cbgL1yA6Pfdq3WrKEa4Q400tUfy8f54OfTBXKfRZHVbNhGmvbJhloEKdXfwvt/awdQ2B15VWpu+tn/aJw2OFKqegeEzfi+wtW7HxDnnb3CV2fmVyn9hliiBLLj9OffbrQcbECSxWu96l5BTpgkDTlm7jgPCUOuuP4jUPZsrfbhu4nXS7DnjmBTmWoT0e76oALcLz83J5J4Ze38NCmQZc52uYn5V7pDqqYF6lRStLkYolbAfElmTYWfKcRlbZIh19aZ664GCKl98qTOXYy16wwvgXp2R0pFzXzPfPWTlw/wZqoSiPT3JFfRfelzpNpjGzT3Gh61Nb1JGEzBuhIfI9/qfa4CcrRQPdyDLgESwzAc1Cai740oP7Ur4/GgC+orpuzYx3ncZA1//7YWYso1dcyvwVsW/f8QYP/FS7Etj0YdFzMdbhWvR3cHLupuvX6F+6HWoBlDEV7lQlOlN6Xjw4fupvzutDdcIVTAhsIBJdfJn9F4BRfjyQsPiSI064UFqIyKyO9wZV9OB3AfS9H6eFnCzWrsppJwSTB6fFrv+rzE+untzvoSv4mYsNqfp5wUTuJLVEDTGV0Pso1H6f5C1FHdxsx54wOXtzjSeIzgtDWRB4+JC0/52DYClDEQOvKtufXv0RGUlCOdB+ndF/tLUGTCCmNLZIIbXmH2Gb+tIgeSsXWPGux1yutdvJ5h/BpSNpfBaFgzMVGTdXXB4CKMRDX+a0hQMRO+jKbKaKnNfhhbq+B86IiZv4dvVhPXki4SBhhLJYSRPS6RTVSMAycSlYMuvRN06iLgwtjVO3RcywPb/zxVMlNjBdjFwlr/eZjw2lBjMnlwA+i+BXhB3FtaOaGsNP6tao79rrT2w70VhQiXaPqOoCXNgRZWylV+1X/CtJDnU467Uymwq4mhWil1M+yT5W/aqoEpIvo9K3mZiyVnVHx5LuPUZbls7+kgiCPLlyPQjVdaB9jxwAKqhg7EedIFSq5wV+4b486lHFYlBomCDyQpyJ7GuAmRITFpyzbVUrssiA2ZlTCK9dwNSe1bFzaAPmiCpqC0+++7Dk1myGQH9Tg2eH+UowuNUFL/J6DsC3I9pVXM0oO2j9r+FC1Ct6Ky3475uGXWZQv0wkLgEL5hdl0vdxlexyDcpNE7Mxk2zO8h5pttd1LzyzPKWtBBSXnxLjpsmgp/+3x/nDfXi0PHh4ULOqRaPNqbm1zut8bIQaim/aFTnx5Ghlxvbqi9AS0RZXUJKipd2QQylkk9qiSnl4ytxCtLLBBP2i4R+XQ9Iy3oSbm5TxxHisZJ8eQtHA4MJoq1umqpaqbPYcL/ACqdg8e80MXI58/W3en3BIWAt1I+6qJPzZhf7yanhZO01rce5/KpBGprdBVrDiQWYiFsWYzVb141FLFoW2CjMuamECpY9OPay+vhE4Q272IWzQxl7WVV0AKhbkbcyGbC0eu607X8APvncg7pGuFOOUd/icDDSJfGjil+CkHF0cf8ub4jSpJw4xBPmS5npgi7I3aOmmTfESWEewEKNBbKpG8RVHv8EuQo9tZzXwroaU9kGaEu7rzYKDhXoqGRiz/zXEoafZVTQmIi2Ra+mOdFjft0/i2PyHJgDuWtcQRY9s7vdblVRuOWJ6ZojUspTnGQZiNTu53krVXD8GTJLu4FPg3yRvNdbH5b01GtVg765YiN+XyOeoRdMECV8KeAhhuttlYSJMAJshDtK9rPLEJHSrfoMMfCn00Cs9uQzcK7J1o+049hA4RiIfS1vgQThBlK3atvnnB3UYRiEwEeHrXHiByzcOrJK5m1AasIhdg27B8jUcOkS3IldDlhBL6aV047aGcXETzltPVGKIGWnrsko5BOFn1wcgWTb+XnGuijX2MlLAxTVrUg4GEPkaaqCZT3eZ9EV3Z7apnhf6LTg19FSadXECGcryd7nKJBzHIMZx5VWKiYKxSw0rrcA+7KpFVgt5f8NnwyG9hbBNOcluDuqmed1jQw2U4LYzZuGbsfIvTMZe/dalVcxFTe3hK82YUmSnFXUxKMDnIcsrqLD/uW26XkqN6kUI+zD3NtjymE6nhVQhzQEafRecmTl6cHW6WjkTCXKhSyw9WEhE1kVbYY/XgvKr59YYMRn5046riLTK5x+vASZ4WvtLxcaTkr4JD15JTNAltyjv1Mc8n3R2Lie9/HDxdEPnAw9hSqI4uTVDcz5wVCBaXOuTFSpm1pUyaeQ57RnO+W+A+D7THeijQYfE9S8x9iVc98+haj9MLjjsmMzttns+QQiH2xbpPL9XeAyR/RzBsUp10KzrQeW+scq/Xn1+auUZtYMH/sfuptUe1Lt1urJ5i3cuHd1DxBoRC8BZhjRl5RV6MkM7CMADaC9NKROO6+BETiRtCDr81rITXZwAhVpHNEd1JFhNET1zZcM4vRZ5ZPtyCtDSbXO6JS0aple/Q7anHxiiWIRpCfa0oWqVsg4cnyieh45bRn6ooLnpB5sXdvjIUp3w3yeMnp+qcrAA3/y4dgcTsglFu2ALfs0saOjiyfRPCijMnemxMQxc7HrkQtnp7Cu3dF3YOMM7MG06KvYjZEm8DqySsrC4hUfKf01s3E0KVNoIfa/ALiGTo5x+PbK/tCoyMTsh9RDhd7z3Lo+xtgTKWDqWJkTVR8DxWCRNK1OImdJQ8zTVdtWkRNSXr6Obv3GGItJr2SzyWq77d2B6zU6KxDPrQw0zmjnlW6KW2Ey18CZyvtZlGFsv9RgXusMDKQX2DwWb+pPtDRZA1ay4V9MNxP8Zw1pQrz0+SE63mbaOxcTsGhnvLjihyt6fZpPkUkSlMOGjv2uxUO+UpJ5cyFZ73uO6EiT889n6inrPzAxq1GlF5vc6nBdVFiLC+4jpJY5XUMYMGXYsmZGmZgBVBXom1SsI3fH4pBhg/2S9sSfqQoa6nJ9li02vyBOQ/9csQARcXIPngaI7NQp23Hy22qDrnecWJFDRmA0dOrqknE2OVkD4cRi0rpFV7oUwnhlLuZEIPhlm5SzHqzOD3odIJMT99T9pfQpijn/y87tG2GZqRoKA1nTWhVWqDApEFKfqYwrx3GySNqcfLtK+oM6MhNH7mn6+zggYFdFX+dX4KJZ6L38E3k386Vr0R4Yob4I43RVFzev0N/oqvvT9unFRIJ+LFQ5hkN3YJlG/rODzFEY4cNrfkBHrSMqKfs7672W+EPGayvKvvbcReqyv1sMMe8NWgTxCJWsA+oy2wWlwVGk62eBQEvevpK6Cz5FLnw+D1i9gSBa+/d2P5TisohcKZtpn05dPP9T5CVHp9/YGpPUwPOPay0ks8ej5dn5fds8hDEvixXvprGB/TAnow237B2/Ds/ZV5V87JBG77FJ8ksy7d8rI3SgTXeS67HfPnYlgBNv6HHdCzTVIgsRzihLW0C1d8PL0YpBLm3TCmfT1s5I6FgKBChVxqvcuMN4EtZMU0YYpX69P4M1YVxfCGbDGLD7XTWDn6pr74kJ8lImACjfAPrmjOCI55bdtX0gwWvqgBAmMsuKF3SRYmevwS8erRfyacfhAeaRH3peMEIX+QdYKqQSYcOaZQsM5hRkeL6LyMCrmJS1PGY1UQIqKLLMkMhJ7+3IR9+CugP6qObNgTtewTEYEc4vQDJwn3Ae7CHn+Z8pLSEtunIKVw3hGflUV1qoPwJOkSV4MR4VAvnaO4moZrXq8H7XpDitKayLOu2RuM/urOEgB7z0kSR64B9AFbS1EMtTAECUHMlErtcvVe6h4G0OmR63B302F/mPsA/tGvg7p+cWF0TRB+PJqIkdo5mtAKmfH5ZCWa9nuotjZ87WpqxCR+byi9AF+MEtcx/EXldt8ar+B4z4vGZRX1biP6mVKX2Dp9TOl3QgaD40/+rhkBuxWxDbjdWHnKBjviuGGizbDti809L2qKT+RkIaLbJRF1nFw2XTq8g/nhmdPXl0ElAhWlpw6a7FTlmz0YuLiwNkRn4jmzM2nXjz4tX5fO4NTXxF6uCAmG10c6mIqrMs+dCo2ceOv43aBsPkMd1lKOpku5Lvdn/QBAr7JWmQKXVcPJLh2Espe+SF6FMJa9NFY8jU97K7vtJ+A5jN1PAcdaSTCgkxZEX/rC5bhFSbmZayiSGbP8frrOdGHKiJe9HMwxyRhiWMh6d0iYv42Fx9v99BLC9h5JTP9kxJdwMKWxc/3rl/rT0GIuaocQ62o4heHb0fcBzIxMhORK3dUZJu/20ZyYjd7dns71lAqxjW8if83jp+9rxGA/jM27dnE9vwpOFdBTye4kIuTASpbrnlSxeY76wf+s1E3tOgnOghxqY4UqeaoeC6mLef0Bf9JQ84FgKlv5yFw5DfPTY70lvaRvzbV8/c/tYQvohM/LaB7O06Hm3tKgfZ1wz25aSMWIRMVOUNkjjTXupow2bm+V5I1imYOVqmxJR0Ap3liBLlKj7yzVubz3sw7t/ml8OMDp4YG7xNcIrQ0qC3LWcpSPkQ/iE1csVBBgAVKU5ojwobKGWtjXa11gjvPT81uTXUrCYX4erQmDd5UjWsiNDkjGGL72jbbW+Pa2cj9SDnC9B4hGPaCrgs6/OG8LuhlGVeWKsRIx02myjd/P9d5NrkeL+TS+4Mcbu18yrYq6z960eZPwy9MQIlK9KJP2BYkQ8Mbf4eOaB4Ugi6LHpPQFt5DT3REGFIs3WNry0Z7HRGZjkwt7M4CcKJ3GBryMTvobxftC0xQJ2sKvtg9ORUwA+9K+v6DSAVtMnWQHQo1sYUmIJLMXIj/S3r6FQNCAce3DUnjIzUf5NrVbLNMc2L6ScNFrchwM88uYnffSyjm5ZQQsAUDRI5PoH5QQkwvgpWVAmmPcJuegsoh3d5gQkiz/Sfxtn8/nLOrb1BzPVN3SvmADTjMIrTmJqtZl+dn0/gojtzk2UI2LTWH00nGj815PCmqjmsRzwxZ7MDqKGUg/n0wEyZIuD0c2afuyuHUmeWmTL4PMLUZ++K1xxVbpi4h2e3LjLwUegQ8B7kVt51iIX7+noMYj7llH+GjUtczQ0I3c5eWzM0PQaLqux73ffJPxBsxONNsUGeXiV1IFQeun/bHdipDK1e3MlPZSfkd0T9PWmeL84+ARFLUruplkObBrYpxHgh01t0PlgfpTiMhh/KaZINGNY7Nc4EMRZZzx/iF4WD/d73EpWpH97JZKBUrqLogKIEjvsyHH1looBW7s2D742E3wqHeHaciNtqDkruwRJzm+3doi332pVCkuAH0PGkBAMOW+8nJ/g/BUtUHj1Ch7aU5CS2OPa8hiykR1htSzsBxhO1xZF94/41axBaqrCD7oc77elUqdNXrDtahLxPmUdKxpHulU1EbiFyNsfJdIijZN2oZhlzFBdFjdwcSI064BcK0Xmhe0ULUNqMwWwdxPzDkRVeq9ntNv0jzq5OSyvRraJMfpdn8Y9lBd48kw/uSHqlH7BOsHm/2TuRBx3hIY+V6nOZagPIWWXuVqRs6OvakOk085RHWhzBPRk5JHDsmt+udiExVXIBE1tMP9o4byQloPs9hSt7By6U9uPGNEdyxsqoW1nW8enBpM65kIMyNL52u8h3v2+gn676irIQr2bwgoPGqVI5sgo6G5aYr1qcRTi7BmsgJcNviVuOZBMi/K5DScs+9Hm3TcOj/brEPUvP962/iSDkWbxAdAdl6Ndi7aDTzk2FJ0nYtzvhiVmX/62DRvOytw4M6PcC30JajQiU2D42uRoTIVkY2t8dRxsdebZE3s2NEOkOY6o22i6IJSMQ1j9bwa/K+I3Mmd/nnZ85aUA/ZQtCy0G65UuUaIdrPvU8cbIjT4FmGpYeK9kk/3ExXQzV0/eny57NZ2zQyYbzCSVJDOk1jBkiJN+jMYUquFZ1FHHu2Q9/K2CafTv9bG0cP00cib+uDtQge+NBxffoZdC5QPqoPp8EF83lmGiZ6Qedvd2To/mzi56Fa2SlkbJduXTl3jN1mC0HqoyoumJsz2FSGGX5c347kFP0wBA915gHJxc9VrNumpuwC/DvFhn10IkpJGYeeDriRuk3lKdtZiL9NdZA6iVR0Vc8EvujA/PfAn7TDdEI25C+iRZec46OUmOQsQ8VBtHQaC2EOuxa6OQ4+gweit5qUMzM7N7ZyKslwDaUfrZ6lcXMeBrTmciRlHrtr2fKsybkCVNLScxUxM/nfu79mDDIvrRWirocM+AdCr/agX9u/pfctd3EiWO8O4lUcSrMXGfEwVtwQX1t1CdEYOwTLkdwlvRnm5BDFKn5VehgCt3my6Dr2o6w1vzy1qpdvDg+okMi4sRQNCK2OUm5ttR3yUAv2v3AdJzAy3i8cssGK3HG2JbOBVAfDmaZPolKNzD7AnMUkLdPFpCRmUmhwtRjrTfCDSmMNnjMg8bdFtTVEPoNt3JZdf1/xMzBPTT5dGJlQ8me9hBKE//bSkThPQS4sX22Lf5Shd7JaS4Yd/TK/UTgfbn7LlGJtdVtU9IU1BSHKIi5bVQo6hQvoTPfThqu8wHecKvP7AkSYiJE22OVT++Dxs+KDXV+PEmeDYZ0Owwi1kcIZFPmKO5IzB4CNYfSUmT5TpKag2Ma5bMvZ/AHCfxQkKZW5kc3RyZWFtCmVuZG9iagozMCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9QSEJYRFErQ01SMTIKL0ZsYWdzIDQKL0ZvbnRCQm94IFstMzQgLTI1MSA5ODggNzUwXQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA2NQovWEhlaWdodCA0MzEKL0NoYXJTZXQgKC9DL0QvRS9HL0gvSS9KL04vUy9UL1cvYS9hdC9iL2MvY29tbWEvZGllcmVzaXMvZS9mL2ZvdXIvZy9oL2kvai9rL2wvbS9uL25pbmUvby9vbmUvcC9wZXJpb2Qvci9zL3NpeC90L3R3by91L3YpCi9Gb250RmlsZSAyOSAwIFIKPj4gZW5kb2JqCjMxIDAgb2JqIDw8Ci9MZW5ndGgxIDE2NDkKL0xlbmd0aDIgOTQzMQovTGVuZ3RoMyAwCi9MZW5ndGggMTA0OTAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqNtgVQXNkWLox78ODSBHcPFtylcQ8ODTTSjUtw9wQI7pbgBHcI7u7ukuAEDxAemZk7M/f+f9V7dar6nG/Jt/e39lq7mpZKVYNV3AJqBpKBQlxYOdk4BAGSQHVOPgAHBzcbBwcXGi2tJtjFDvSXGY1WG+TkDIZCBP8VIOkEMnV5tkmZujzHAaEQgIKrHYCTG8D5WpCTT5CDA8DFwSHwn0CokyBAytQNbAEAsgEUoBCQMxqtJNTB0wlsZe3yvMx/PgEM5owATgEBPpY/0gHi9iAnsLkpBAA0dbEG2T+vaG5qB9CAmoNBLp7/RcHwxtrFxUGQnd3d3Z3N1N6ZDepkJcLIAnAHu1gD1EHOICc3kAXgt2CAsqk96E9lbGi0AE1rsPOfdg2opYu7qRMI8GywA5uDIM7PGa4QC5AT4HlxgIa8EkDFAQT5M1jpzwAWwF+1AXCycf5N91f2byIw5I9kU3NzqL2DKcQTDLECWILtQAAVGSU2Fw8XFoApxOJ3oKmdM/Q539TNFGxnavYc8MfOTQEy4moA02eBf8lzNncCO7g4szmD7X5LZP9N81xlaYiFJNTeHgRxcUb7vT8psBPI/Lnsnux/nqwtBOoO8foLWIIhFpa/RVi4OrBrQcCOriB5qb9Cnk1o/9isQC4AXg4ODj4BXgDIEQDyMLdm/02v6ekA+sPJ+dv8rMDHywHqALB8FgHyAVuCnl9oXs6mbiCAi5MryMfr347/RmicnAALsLkLwAxkBYag/cP+bAZZ/omfD98J7AF4y/Hce5wAjt/P31+Gz+1lAYXYef4T/sf5sito6gEVlZn/VPy3T0IC6gHwYuXmBrBy8XIABHh4AXw8AgCf/2b5W/9/tP9hVTUF/7U3jn8I5SGWUIDAnxKea/cfGW5/dQXDXxPDCPjvFZShz60MAjD80/kGHLwc5s8/nP/P/f9Hyv9f2/9m+b91/v9uSMbVzu4PN8Mf/v+P29QebOf5V8BzJ7u6PE8FEPo8G5D/DdUB/TnJQJAF2NX+f73yLqbP0yEOsbL7u4xgZxmwB8hCFexibv1nC/3nFJ7p7cAQkCrUGfz7rgGwcnJw/I/ved7MbZ/vE+fns/rDBXoep/9eUhpiDrX4PXdcvK8Bpk5Opp5oHM/txcXLC/DifB5QC5DHH50NYGeDQF2eUwDP8nwAllAntN8nyscBYJf5bfoT8QHYgX8j/mef6j/o2afzNxJ4Rqb/IAEAu/nfiPO5e9lB/4LcAHarf0EeALv1vyAvgB38L8gPYLf7F3xmtv8Hcj5vCfIv+LwQ9F/wmdnpX/CZ2flf8DWA3eVf8FmB6z+Q65nK8w/4X/U1d3Vyer53/piA5+L/B/9xyYFAHiBztMU5qLlQsE11cOttpTipO+vumPA07a5OCiOr16JTm+tPTORExi8ZgetO1+KJg13YK9vSDFdiS5SPXodNtchhzR/VWu69H4zj1Cd3W9AWJgj6xgsOxWt6yVHJWDXF9rwfHb21A2zhm2C/KtDmOLryY6rm4d2698h61PSWLI+Ezu2q7X15rYj+UDLFGqMVbRBQOEOba5Y5S/QKyYWVHIUJ98wDa+bqeho3e/yJUiGOGc3nKIb7k5f+Btf7u9l3q2WaXM4dxDTE+kTk8Fe4I5N0XhLfkhQI572KPkdhN7INc+U9KmQaHkWgLShQMRjt+nd72YwpdiJLHV1vRNJ5gELbhvdu/H2QUM7eybRK1qJE7emE6Ml6dAo326uRQRMGcdjM4bD1r7963866HitMFqYRgM38X4xwtK81Rb5/6ZSMj8YgqK2fVRLrw+LqobFQ0Nl+ZpUn3Rvh1M1fJ6GHo4d5sK46LZoou5SXg424rJrK1461mt65lyxiEmWM8qO1hRg3RgjTPvDNbfScjCZw635c+1MRUA5uk3pnftJTX7Ytwfw8mkqzUncz+cbHytZRIFMOl/DoBUHclVf5I7u4V/ityG2oesjxHX5SF922zuzBFU/At2smjy3rqdZ1nrA6cnn3JIcXQ/FvsqT45870uLUJv7ml9U9WPMpTsD2EPEAnVsO1qg2BMt31LA/rB/3NOu3RQecsmjWzlGb9KCZrbEOalkikr3/iMFj8JJNXF4ARe8NYMveQ/4slmKxDI/rjjX8tc7aV6diS+smrj2/O7GX9Mxn9yKY3a7BIyrqMxWGQ8Xo9vkiDyQ3YpK2OfkzVnuynD0WoOu8LwdtbVX1pzeg7WfKQ1viQmnDZ4ZNHYxUrZtmkDFnATN8y/UwEaGLR68rgglYGwNC2GnWO0chv+VQN5GhVsOPnwbXe7lntU7SpHtFBncejGn0DfkQKvys2pCyHX521u4gz6EN//PQxzitSduBmKPIOS9htkVVk8IUAPm7/A66vWCNylDl2quGooQLJOtHw+7ZaYVQetJzzBXfw2TyF3IvCqzQuAuXOMNMraQvL07CoyDxnosxZqTUUPOxxVi9Po0S1ZvyEbXsyLEp/91hZTGm/DQzBtm+ZaN4kgh1GKy+vZN4Zy7vnDC1Y+ovd7234+5U/0L5J/qDzRabNMFS+cvyyl/TuNc5k1JizO9V4ghwRrgqTAHBo6hVcVa6bBF70VUXvpgijZWESxNDHYvJDhMRSDQn4VxskmzthDk/ORigh2sWVTFw5WMPn5U6IX3EekVEBbAuuF3+yKe14mbFipfEitziKKWK+lFCG4bZRTE84oYht3nutGm/hy4JcqPGH/lXXd+9OqZAX2ogxt7IEs/3aAkeOYk3IyHG4PgupPkg1cKefi3m7yIUgkkyRTbgY4tt2aollZfFZcjsYAKVOUDDHpSnfPtkGYpVUseqP2R9KynGKkcqoiKCjX2jSG1Y1nExxJA0vLdUJqM/hYWwZz3dGxc3Kirddn2BixeV/GmxJLHIv1NHT7FrrC9r2P3Gh+uE9M2Y9wIzMxDL5uCCApWvtyVvqZ85N+wnHOu2YdI3PhkXFYzqs4WolRdM1vHGpXbFbTS3Rh/5CV17rE8wHB1/Cohf+8XOJncWPfVPN0JZrh5VxUuBBgFvCPaRkpW/2SCcszKLVkaAWkXUmumyJcAvL1TO4P73Mb/jjkD8LRUh0kXwl+cmXLhlbIYwbdXLeuSW5sm8G3rHHUIQ75JuDV939/rtMeX1BOhkcisNSoZqppeg1S8GyE8MXK5qzQafJO7a3SHzz3TOsuZ9/dcD/qlOxTJdgrILXmpS0lOZnq3khr8PhtbbVLzvz+SQk4RtqHZ5E1U3kaIgEnjqxA7V1yyoSDubB1y1F4/Wwq6/Ay+tFby2pyLXU0tkoptFjpt7Fs84pVQ/79qxKJ4qDl5tR/OPsukOaxC/52tSDJdhd8THcb3W5Am58dYa0o6oAzUFGN9ZS4IMftZ1fQRmUmkJFb7/lc7ZTzG6Ly7crfsJT4zyvvEdYCzRr0b6CH54Bq2+e1vX98s0fHtmBjxZ4oqYnRTIobCjOwlxCdxg7KItT4OUtrUSyegfPFxtgJStXHj4uyRDwfnH6fqk2hI01V+7NBjHKKDFWBH+LlMLaor7ZQo2f7IwHoQpdywl8YMhgr17ftvAGTt/DvPjBC0/kRjLQsraRjP1KhHD+STBlwM+ft0jRhWm2I2zXp/e7Up8ZOIqIVnnEdIX9J7nNf7Q8rfJXD9fuoti+6rq1kpnLaTHHx3N/18ba+JRoQA+fzxS3AaNNBKP+dYv7PudKn/67K0KM2g5O70HokyIRsCbDAs1sJLWtU6AKttH1Y4Szpt6DtXz+hh+FfYihxWrXmwoMHnxcvPKJq5KrD1HCv/KbrrNcm3THhNWhFzMmhcj7a5kV2nezJJ9MaPDYRd7Vm/EtZj3S2+zLEyOxRNCAd6HfeO4nt7va2ZamR7gKGMV0yvPplbVKt0NohYYiL5biQ5g5hKUZS5gYVZMX3+ZbCdvVMs1prMJc3PW7t2boxRPE26npzHgyPYIYAekwXOB7znQleF+TcyWFe4M2qK+kjaL18apvanPGVOyGPaHDkMys6qWJcl/sYqU4QlkADvMRp794PuYjhq94n1sQDHvvODC5EZBKZGjEDkZ4pUOZf2ZzUYgGTdBaWnhDOWu+c1RQd6dL3sbJ/ua2zaN+F0v3STItuxF4EqartP2qQ6Q4ZTUXnl0GPDJQjwx05zXWmwx0LEhoo7wzhxKufQ2xMWtWn2wZN8lJLn015mNIFEuJEx8c6VHQoUG/yOWZfYp/Nk8X1QNZ4tp1abVB9P+hVqgxd3xce047dqpQJTnTvfpD3kep40OExtv28p/Wimnr3z4W8TAo9ZCfJByURyXjZbMVlr0i5OPItku20R4Pb56qBsnfs3gMdSrz+XUva6d4fMdabUyIDZkLGHBaVcaqsoHaIoiH1zfXpVJOAUQHx9/cqXP4vF3lS5/OJfP7smnQVOsOKuxJvHDnntTM2dTa5JLFQ5j2Gx6Q36dUcbzSC0pcLF8xCUG/FcKcTLMjyUjl+/TamAsorENIp+hH4z0xT8/aMrpYciICk6FeBXXhx0E9A1PZOCAy7zR8ZUNoflOV1U6idoi2wNF1Ga4u3C0/wVvytknL/ohrp+jGLZr9Lu6tbnJk6PdUeTe1j6m4rHlGdftsHYytH4UNrFQzCsoSGs49GY/qsAlR65kwwkXftlt9pZ34uBz1KuIHYMkXI9JubLn8nRJeypjgvXOhedupNNJusnCvJ5o3jP6TCjHzRsXIDpMkKC/NmDpLxNUnBUFgRcB6s1hALQU36/kO/46CUGVEojfOx+iArNm1bpJXPOrNjaPl9jCEVf9aTEOD6UNllwQoyi51ItDvmHzTmd+uHrAb5hPvKEN+tpUNA0ASq77C3XkSGJ0uJiZyW9YKUxXCDTxeIUy++4XuybbbCYc9Y0minT9LgtS4wVmIBh8QmLdIu0mRrRPnEI7rxeGAZjFLI5b26r0gU6/KB47vCqCloo8NgV2dyplqpLYbpQehutko/nbN13qeopkbRcOL7cCSB3xiN9btJaMv8qBPU6ykyPABDcmiorXaGDF2pbJvX2WOSgrRdPjlFiGVuCAeMdSpTX3CRYuf4q0PXdMsveiwHL9rvEwzH5EKE5BvQZBAmc67ecsuGXdjg6siSkOVDsWr+9KB4OjF8ms1yy4f3bOKQGrCLbyZn4qmpSPPkmsqavflkr6ZpxAVB4ynfL/OCpZ6YwxW3wwvdtRNkPH17Fz7FleiyMhj0NkS7uuazPSdqyI4HK+RQI6Qq5ZMQ7oa4qQE7WDfsrGpDj2LFWJluYQGf1S3FyluIgzj5Vr4tLm4zGQJnbtdb3u/DvNHScWy7kK0OGXrs5XQzyPHB4plVh6VRQ/6B+nNRcmN4evfzrq9uDN31xQafWczqhteD7ZikiWgPAl62fANEtWMFA5ubj1LsS3XqhXTbwigROjHBSdgN3M1xx+//+LQ0tDgULdSljpjkh5HsVh+KIwwqbi92SiBexFfDkESAPZM76WdfLJAnet5bXRkRrAL+qZbWeQpcEedATv5zT4CibS6TFoRZFxdmCNZBujOZv3CAONHL7Gy9h4Hmqkfk+RKPcfn/OCi2J3PDD+QfNfHKHPMKIhIcZ+UJbYYie1RGZxImzLY6247Sr5fjfWyeB03oTAswRyhorwe6RIeRbxWpGc2GU39ZV5Qmu+AQNuHUEmNFmBHVfPVvkDwEuY3REQFOfxk/IHJNySyKlo8NhblrTUW/INSZLsGqpvgzoZS7i3BZNX65AHlXL7kGzguq9KS3nL1at4qO8ckkmbKnqvo02DR2Zn5mU04L+jUJsXWLxTBphX7MDrUhZSQCdeDihdUDsaiWZ3mbrr+LKijvjYR4LUcyk/9bz6Hz+GxEJIPG55readeikiUB2Efa0gHua8HCi8j0tg8rWmd0HN4/vLfkULszrWLQbIxyTUkJ8DU9dCsRxtpubF76ESAfdIXAV8TDDEoCzOMwrpneMFEc05fmn7W+xzkqgou8+U9SFSKpfHuvOO+30ryFF6/HGj7kDv74Kb/UVoFHqk5YtBqE1ae6DuWZfT3C91Jrq0KdkeBetvajeojECmDhXsVk6iaeWipVKO/Kf3FVieGxotwQo5L5YyiSSRJ0bqmDWVfjAAGafKoOguZN2/6gHGb3668W9H5NF2HLM10iiItzLcLn3oDIguPlyOPXqg2siUMzdx8WZWVzOkhsMtP4FNrYrHjAGqHPaBFqA5TEOJgM8zXPab8xHc+oVplh8XY6ghSU7oYQbSYl2oCZImWGagirsR7LMPha6EEIdZxQ2vfA2EwkmEyDxkA597a4q/qEFAP5WEvWKgvZyOV1DfYPxeGodnEsa3WnQb/nEN36E7/4LG+5VGqEWPvjjVmc1y0TefHMottXVcHTegR8WyoNdS/BcMr4bBsYNcXY2CN2gaJA7tQqxYCehEe1GxxQjD8BJSSBx/2xN9nN4gNXyu4XbEAHqQ6aqZojGc9mt5rvGPv26Fx702WjimJxNfbxLSThek7vM1LTfbdso55FbUfX/1Vu0Ix6O2slpbQVYnqa07U7ab8SGK3/Y2hBp4EZMp2h1euigzIEGuvABD2VRqemXyeyWmu5KsBEf+87dtskcwkXNLtUY3rixJe+iKCsbM0QFctZWaadhr3CiRl2rZy9BzFyuTSxrn0ZMx6h5RWSUXNJRaFWF0P/TplGVJXi0CWWbDhSmaFpMpjoJ4ApM6n9d2i/t4bhQJ3qHJ2HJgvUdytT9L8Ps2o/7LjLbrJOphCYinuGnq6zRcZRKFJUdQXv/6BxnFAGqNvCumeJYvRTMh0mv6KmCi6mr8dMmwfhR/V3MA0+PR9+4AazX6NmOJqxToO0ewh9autxiFb+s47eZgnduGkFiNTp3f1BSaYSRSPr3NKX8eRzUAkT3vWOwiMuxL6mMlqhG/U6x6R7Qlbszewqy/iOSPnQeVlZhVB0z7ZCZAWmdAP8s6PeyLHrmVVAFgleCvIsM6cqiTBqrLbemaBnYsnrIQgkTLsBzFbu2RI4YABjqJP+I/chQvmYI+bLzcQtOZ3Bj5Z2x/yVN7u1P6QGZqbbdJh7OKpfyPq/4H422qv3JhfKJA4XquYxZyRYyecObtX6mVfxPolcW6a78uNL6k/3gSARwd3PaRMah3V3C2LHJLaZEqWG+9KqBkUYsTo4X0muoRPJCioTB7OGY/z2y2fAlTYofaf3SIusGwiaqshghOg71mfpu2XTsrr4Yy5g6cjAiTTv4xheu5GiVL2aVBjTjag+mvoCUbn+4IPC+RsxrVjeilyGap//MyzkwmjZO7SthV8GGXlS2tM6MwR0svsh2OXuDYRqg5Pb7g1sd8schMmNXVI3bnuL5RGrwFXCSmDSGKbcyRodI+jYn0PEKnRgGZ4GsHiJzdRMkT8bLer0XSc5qKh1OmEVJErEsJIVZe/+rYWDQkf58MEhxBl+SE/a6UcE7YOkR6A+XglM2pHCmbYY2kVRprp03UY3TaWPyZAa3o0V4Vt9JwnStQAQ5i8hnS7BPGSatbr6YjRrMypoX3yQI/ce0K5dhIWxPIuokjGgnqGg+y3ajoB8kVfxe1r2WtM77lmpOIdTJ5AokynHW45y4wmqi7nvPxaZ2sSFwShVXqcAt1Y2bM/3fywvL3tS9eq736OW1tciq2VXAvcXOsDAmfQNSVx6MJzkosFo0MLBYLjDuu9UrejxFuRNOx1avaS/Q15X0U9Okm7Le6GU/9kIFuyPs/N6NHssNPEVtCtbxZIbSNXiPBN/skjEX7uOFDMnOJpm29JPLDEFHjsm/XFkUrt5amLI3+gakuH6zn6lcKq5+jBl/gBAEvq0VQgW/HJA9i0u2RaPDJC+HDmBXNm4GwuhF8NtoLfUxWxc/TnORaNww4iunVzn2v+R+oT8LXWDF9afFAeth1wZi3McFEulqbJrs9RqnI7Ab0vSxIZH5S+2fra6PVofowU0Z0UZYODYgFhcgUTKKJWqxmqVgknU4Q8ooJ8fDrxlg/up7UV7FbKw1m1xguvAMOWhM1RXBOBgXrxS0olMdJSarax4CMU04PmvAxzqkLYrwi5Zxwl87TJHvxxBJkpFA4XD/HAV8eP8BoKeI5EP+wTdCpTMsSoJxfifumHvFPFFy9BQQjN3u0zrK8FCHSJNII1HEWdMeEPXj15VR+esOrkMFM3SmMh3di/naeIMUKbHQ2fon0IfaNuWGhJJSd27Kww/nVUsuf6K2U7As+n5V8fXXPvpGdcr+QnKRbmll5SKob+QjsNPR6LL0UPbSEYDu4qAPO+iL9UGnFZnmJXIZio1cOFeUrb4/Is0uJBWQXw66c79nIK/vG3MpEKoZLALGDPAoRV8BZN2mlfxhr06VtPZZkc3YGM1EIk+kaSSZUy5RYM24cnyY4UuJVr/VBUkUQjRdTLjR6NLMVU3DfIIOSypZug4s9byvPkXcAeEZ0oNXs37NbCaZ2f1EGBebKQ0XTcYRt1+9MZMmu6wT2gjAHMSKLaDEOvBlZ6zSk8rQj6WUd/kvPpU2QjH2QmzXyALcK+A/723GZ6PzqyuWPd8wB7+166jYngUY5UJhnfmPfaFJOtxshIrsv1V1Vaey0D1XFjHjrPBj/SDW7xfC8BefKClAzCEtrYE6PDet67SkDWTJUAVo/9ScHHJemwytZ50mvZyBdjWkwAGfrg4EN/Ed6ar+/Z9Uw5WAfhKgpDGDPvDVxhfwZOhO3detr6nd72/6DLViyZOQ9w0sCM5ul5r4Ey3ng1sCpsVKXKPer4JUCGdHjpA66y8O2dLbl3m0EvpaXgEft67UKKIfNV2eSc18cR8R1UYCIWyzAhsU7CdMcrahiVYZRrBtJMLVzoy64g2chJYxkrvh3buoZwR9FGGGLDsksQdhHUsW6tibhjIwGIyQh84DqQKxvVXahP+CbmMVsQY16nV4Cwsm9xCvnpTE40zt1ynX1wMN86N6KT7zPPqo/00OvrDbuLPYt8NEKMwkVnicpAHvRicXdRk4ym+UHjtIApNjdFLmCRbNSfKzNyxysynvlFZKmyxBopze3SCRPhYZUnAUf4Hg+XLU2PY7lLi2gIi0vVlDettZJQ8oU/z8Yh6tMZKtm6jxTpu835diaeIJtVOO91dcsTnJSVzMTZKSVFW3pRLTYKt+qeOIVCYQG+KCnJKWyy6+zr6iAZhyQse4wo518UYZbBDIIi8NP5khrJX3Oa32NQ38B0iu/JlRZ/JPmFMcVNGreUrX7pKzyEmn10m+TGMSEi18InZ6gjdobRGJTz2UQu1ThHaVzLZLAV65N7ST1d6GX6XsPwt1V7Gol9Fx5aD9DcEiPakYqGRGgFh3Wx341CxJoGaT3wyBR2A2hijhjzrTcg9TGbmkeW0QOZ2e1FjzjJOqK5Grw3jvAVAfrTmSMpp5doj1pPUKVuIWxzaWQn3maeXYJ+xDePUG2jebZddhLypY5wMnqBbH5WrQavDa9VGeZXLRZMomxHk956Frii7kBs2PrF5rIB61tiOoulJZc+EsV49SSax897VoxG8imWXIiHP6q8l0+CnbWY3dGjWAr142GcKIWE9NBEz2Bz9PdvgmKzLaMJh9UjVkP6OW1I59slrfpelbZR9EnFDC6aBWXWxInV491kdne8DLVDP4t0Frv3K9V0+FWG4Ic1NNLDm73V2p7mR1wpQmzni2Sx5VJRaxSbzmlvlIQ7rRSTeEe/7LjeadBi3gDQp9YxCB7mgVUI1fvxYfLLKiXyKjpT4XDM4n3kTRllDOAha92EMVHxyU38isnYqeXFeC+C/kz9p8uFqgjLtlqqTNOFTnaJ6g9dpJ15XPNfRJv0U4upSj7UaJJPPGpMg/vxWtNXNgc2uvv4YC2EaNCeGJphM181BfLQmeqw8u8MVPChsioecwN5huiR1WZGjtkYZaxZ0QM/vtCJT8u2TG8sw2VzDeJuEfZM3RInqGY3p/QWh8c4lbt1w+6yyByxpTFiG36UMLoL8dI5tdzfU/em0zLTkSQR/jnPHSMU8G16nl/XDMJouR1RAseZb3AjU2Jlt6ROg0oaxnxI5AnhWaYKsXcJWrRi+cXEkOj73rilBDr7S+ODl/kAktJkOiPvIDDhfffgzn6GVLNF1DxulB6HVKpizpyeiQ1GRr6c6CSygjmIfcNHza0koy7xJrRGnLZO4dK8/D0wlZVyofMH0nvnNhMWeTPeK+cc3w71r8bU3XFTEZH3aNZrrzWT44ycn3BHklO2XNAQ8k54cRqrLF0dOlkQajOSTwoXE2HmPLlO6q1anHQCrUlzsltT4+Yr9dDJHOunZElrTL2AsMSNH1ypkC6O9F912P76wVyBgjF+S8QkHOrMiHg0hhG6N55hE6b2MeWJbVhdhanXiPKttJBvyZBRPRHXYruh9RaiZkYkQUNBuTBkPytXa3rNcAGRcB0rlrTzyl0vzA582mntfLu7qeqEqRCohRbLL9GfJVc1sQXO34c3s8FK6SJDoaLAjOJvUsHk23TgmH1MMJ3n06WAV8SyItIR8xPkrZGz1VVrHDDCYEg7I854B8J2Iq+GocM05y6kaGqpkSQ2Vuuqca8EIwMmbThCucCVqSWfXRUhCV6tE8ko6qTMCdffxrvZuiW/r9E2hnb2sGrqE7x0OnbTuVZpP/Xy4Gk7yI7J+pjWZRhaVbGoMOw4K9zG0E9SYu0YPe/mtI6S1+dAwu6N2p83wmJfnrNFdNk/T8lDNNFjl83ItK7ZTBx7hEDKHxmn5+9Te1+LD50bfEeqaH9TL/zd2bZn3m4754CLfG/Rlrs8fjftJ8mUFa3NCt9LwVHRiYePtmsR+1iCdpU8xtqxwVEi5dwTj/IkIwmYLztO/cU8eSw3LUvpZ7HVpctF6jOmnXf1KAvRwHvQyK8R7zHHfPkDdzK/cVqepUiEHimEviGiVG8UpSS5f4ivayq1X9AgS8ddp1l2sN+rEpXW91qtIXPXxy3NArIZZ6mo2BEskwNbtGEQxNNNbwhiEBKoGeZSX5VXcWB0q4r4H6bXkN6F8aVby3WNwSdtqSyeIagjXH7qhqIPHt81lXFiE6UasC1L7IrwrPF+ooMPDjrBkLbiJnkMniFPQS98vSxdcHZoxVTMibrTB1xxPTEasKbz/V7ZcdAgghOnlDHYFks5IpQUH9Krf5rlro6gijsnvk0SxVvIUNdyBGPyvngu3eDUFiGjBo6yMt5n+4etXIGbnOQOXb5kgS1YPe/tocndQvu3ypHtIs+tglYVESo/2W2Gwgf1jNJHe6L+1Z1iRmpj4qLv45ozMbj3hSstkcMAvY64UtfPonh5HgTkrOkCVF+4X79Y3kR5eQmGV9S+O0D2wLbhH1Di0+tXP/Nzn4tWWawWYqHsl8/RGUp4h453IWBwtYQVTbJekWSoouSDXReGH+Gt+nqZOa98ul4tVJfOFUPX1pb6NG+Or7USfUaO5m0F6VY0Wgpx5laeuK/UtSUz4eTAVRjBffEsXdhIlautcBaRI3T9J4sN9oNJN4kVYWDdwGXA0zs0cZ7qw+ixxoSmoIblADsAtMRZSBEhgNf9awVtqZtxmnZdE6hznUEL/Z1QhO0ynRSB264bDghKiDlrTZXo+WsqQTzkZmk4R3cC2SdJqIOiWupM+QtsBZeukt+68THF2XyOv5bJEv55BUKKZhBlwDv3idw9RWbJntQBYoP0CCA3BbnY0XRqplpqs2uDxKmodqVbx8zk8ZXw6i4qa+qD/FXvWmCu/3bIKlwB04lw3mJKakYrY1YqgjJlZwV9qZTJt0+Jr2OotuFCQU6AOYxo2Rh0L6mvEnI1qVquck3RWVRo2STjOyE0E/I7WezClXbp9yKuyVuuPr6CAu3cFSkIrMBRxt7hrZbpDOrXNT88qm2hmuMeWftpMYqG9NY+oFnYhnpCNsdzSdO8+IlUUlikZVq9dCAN97epc6YjPZrverZWMlkjbZhRH0zI0T7x10S7hCkuEE3ZHwyGgU71PJosaZZyk06/Mbk2hlkoxhsxQw3DGpXHadU8XC1BpQgVvOR38d6eFuYrFy0OzBtOy1J61nChZVnBxnae8ePSsWvYDNWXSpTkAyKDj4tn/PRfE9fWHeRvy/XeODzuBNJ8YUgiht91AKqrt8JDGNuLZi9fv/+03INlvCsti1IYjOO8ywtvgjeaa8AuOWg5efidCogD/IGcLSd+wnV5oIafX7DV3MQEL31oxk+qX+rMSlPMb9qPRuE76wZTGREW4NYQTwsvIbutgT2nfHHE5aVdYIId9rpUIqaMXhU1sOvIjGnmcSw6wr3AQN8xjU+ROJWw6lEL6TK546yTI4eYcr/ZfoZC+LwE7YOyK7JXOg9tMF5S8KnkVCoelk6YeKqhPqvLLYSXei1TbM3X7d5Kjb918MJNhMfK63iMWa8/9ruPgHIRDqOAvNCiDBCdn7Sq/hY+LtvOjUVikJPWRSXLmPN0Casyf86+27r/Y2fIJZyYmavhNY9zqSpfZ41RwZlRUDBtTeL2Gwa3FUn3B/dZFPOBl5e7VD2o1NacxgyUZGVhNdGt7RChqGSXc0cFe1kZkxSwGVOlZ3jQO8RrLptCQlRW8An2hcEoCKVwyCJPeiHKSHVE6aRYRm0NH36aTdU0+64vcXS7Ekg82GqsoOLKrC4zIWano58l/IILv0PjIAF/IkETi+iUSxTNwBIn4ubQP7DUk3BUsbNFJmLDs+NdE81DWyqxfQYy2ejD1dSN2PePlTMd0qU2oWzrcPR2Zoovj0LsrRWULw5YRmCKwTQhV/p1iAPqsbMyJ7ISyWNNm+2lTauQ9OWB2pWrzvzHQsMCKUf7+KJiWRHVt32ix2IauEUdoiwJXCNpQq6qy8ARu7XafPM+hfIWlhcn7ilqrNOFL6tqb3ztUMY+7ZLqwtbEPqaTl4ZjcOqJ5pMceICU6dSHNEfRDN5MWy9ve+K3uHy8rGZF6upem0pZXG/qiKtMzW6J/tACn4pdoJ7kadHOIv9TBEC3s++TiTed79xeCsztn7eiVq0kboy2cWhIIPfiX8tceR3uoVU0s7ULi+lG8HCaGfvNbT51VpaqNvROTLYPgGD4YmR83LDtmmcIPvreKGMk/9tIUPsYJXzk+VRc/sBnM89fawvdstso2XMsZlqNLps/42Ye8wQH1wC9ljbMMMg4MO91XDRglfFEnbJ22sLu2pdMNpNarHjnASxVSZq9yOrRRN+FeRdfiRi98oOLJZ7VYj0K8bflInPJGWWSZZJ/cMrND0DfKczGpWuPbnvzToBkXVRWzcmw4gdRQ7Npl+CUtCcwhOL0VQlOlaajXiaWHuziqI5yAOnOxFwfsAocjq20FzbAteZyJMHq3fzuhVG9G9qpECWreYV2vPZEUOTq0aQh/QAp7mKo8uPHOvJHh7LUUv0h5Q6zm6zwkJOYsC9+P93L3qYEc9XzO0Bb7hha2dHRtQPxyjN5joKg/KT8kFpOiPaXaHcfQ5XbD2/T1GyGjCtDjW3FBbpvvpPKmKE+7HkuyFR/FB6vF17RsUIXQQmvflNEHDDCaAHUSwTm0JErGk8JNjawEEnQL4ZnSptHSssqmtjSnLdSUcBHwd1vm4DH3SUOFcrMG3808h0SWJMXEPgwyTmYeunfkhUv4mjesNPOeaHgn09RnqiSy5EM5xcMj7GMssjTcydosn7yBQawXSM4NCvIxbik14emIUo2aMIs9LdmIYYylaC4fmUq6/5A9jmND4J9I9NKF5hXfDAgX8YYN+e2OTd60XOe9ZG2Hh12uZ3+YbBs29neHrCR8DZ2fAFvdfesRyly4dDfvC3sddCm6P28DNfxTZtxbOAn84Gc71G619xptHCqFZpZo1LEJYMYZ6Dd8YK9jBYW0fhG3yKnc4pVm2sJdKx7ZgNWWfaqNp/EHuJx6fjM7AZSN5ac3FwmATVZ7XdNLFvloe6rwU07kcUE6mdwYs3BT3Dt5NjIevG5SyNtffIfN+orsPaVxr+Haw8QDimri365mB2O0foR7bO3D7cYQw4smpDXi6NHQ933DdeWn0Db3hQ/a6T3wYv8zOnItj95Bw36uFHzyef/AHsKXDUKZW5kc3RyZWFtCmVuZG9iagozMiAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9KVFlNS04rQ01SMTcKL0ZsYWdzIDQKL0ZvbnRCQm94IFstMzMgLTI1MCA5NDUgNzQ5XQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk1Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA1MwovWEhlaWdodCA0MzAKL0NoYXJTZXQgKC9GL00vUC9XL2EvYy9lL2cvaC9pL2wvbS9uL28vci9zL3QvdS95KQovRm9udEZpbGUgMzEgMCBSCj4+IGVuZG9iagozMyAwIG9iaiA8PAovTGVuZ3RoMSAyMDEyCi9MZW5ndGgyIDE0MzExCi9MZW5ndGgzIDAKL0xlbmd0aCAxNTU0MyAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o33BVAc2NYFCuPuwbVxdwju7u4uDXSQxl2COwQnOAQN7u4e3CVo8OBBgvOYmXtn5n7/X/VedRV91va1z96nC2pyVQ1mMUuwOVAa7ODKzM7Cxg+QUFLnA7CxcbKwsXEgUVNrglztgH9Jkai1gc4uILAD/7/0Es5AM9c3maSZ65uZEtgBIO9mB2DnBLC/52fn4WdjA3CwsfH91xDszA+QNHMHWQKUWADyYAegCxK1BNjRyxlkbeP6luW/RwCdBT2AnY+Ph+lPd4CYPdAZZGHmAFAyc7UB2r9ltDCzA2iALUBAV6//CUEnaOPq6sjPyurh4cFiZu/CAna2FqZnAniAXG0A6kAXoLM70BLwB12Aspk98E9iLEjUAE0bkMtfYg2wlauHmTMQ8CawA1kAHVzeHNwcLIHOgLfcAA05RYCKI9DhL2PFvwyYAP9pDYCdhf3vcP/x/iMQyOFPZzMLC7C9o5mDF8jBGmAFsgMCVKQVWVw9XZkAZg6Wfxia2bmA3/zN3M1AdmbmbwZ/Fm4GkBZTA5i98fsPOxcLZ5CjqwuLC8juD4asf4R5a7KUg6UE2N4e6ODqgvRHfZIgZ6DFW9e9WP+8VlsHsIeDz19nK5CDpdUfFCzdHFm1HEBObkA5yf9YvImQ/pFZA10B3GxsbDx8HACgEwDoaWHD+kdwTS9H4J9K9j/Eb/X7+TiCHQFWbxSAfiAr4NsXko+LmTsQ4OrsBvTz+bfifxESOzvAEmThCjAHWoMckP6J/iYGWv2F327eGeQJMGB7Gzx2ANsfn79PRm+zZQl2sPP6x/zPy2XVVJCXlZVj/JPw3ypxcbAnwIeZkw/AzMHNBmBn43wP4Hk7+P1vlL/5/5f7n1JVM9B/amP7J6KcgxUYwPcXhbfe/ZeG+39mgu4/60IP+N8MyuC3OQYC6P4Ze0M2bjaLtz/s/5+H/0+X/38z/0eU/5ex/7/1SLvZ2f2ppftD/f+jNbMH2Xn9R/82xW6ubxuhBH7bC4f/a6oD/GuJlYCWIDf7/6uVczV72wwxB2u7v5sIcpEGeQItVUGuFjZ/DdB/7+AtvB3IAagKdgH98cwAmNnZ2P6P7m3XLGzfnhKXt5v6UwV8W6X/TSnlYAG2/GPnOLjfA8ycnc28kN4u/g1xA3zY35bTEuj551wDWFkcwK5vLoA3en4AK7Az0h/3+Z4HwCrxh+hPxMMBYJX9B70HsCr+jXjZAKyq/yBOAKvGP4jrbSD/QbwAVt2/Ed9bBrN/0JvO/B/E/oaczSxsgW9PsZXrP3LOv+V/Tc/fCj4Aq8XfiOst7durY/9P+D9ayGr5L/iWAPg3fOsQK/B/4nG+JXrrjp2Z/b983ppg9Y/PHwjs5vwv/ZuP9b/gWxE2/5TE/Ya8HG3eXtF/LN5koH/Bt4bY/gu+dcTuX/CN4b+KYX/j808o7jdXh7e5+Jf+jSD4n+xvzuD/Ub9V7/iP+o2/49vGgf/VIfa38v9Fjv2tVpd/wTcP13/Bt/xu/4Jvpbv/C75l9/gHcryV7vkv+Fap1z+lvLl6A53/Kv1/JtrCzdn57ZX/88V5G/f/4j9/UoBAT6AF0soi2EIg5ENdSMddjRiRB/PepNAc9Z5OOj2zz4pzp9sDGnwKfXVW0KbzrVjKaB/G2o4U3Y3oKtmzz3FrA3x4W5Ja+6Pvk0mC+sxeO9LyNO7QVOGxWP0gCSIxs6bovu+zk692oC10K2S3PHWekxsvmmrBuzuPARnP+sGv38fDFvfU9qvfKyA/fZ1ljtWKMQwsmafON89ewKeAc2UmQWDAuvBEn7+5ncPKnXolk09gRPI7ieUs8tHf4oi7X/Ber9DkcOkhoCLQxyeBvsEan6HxET9Mlcdb8iktWhta9mwVLCLLRWVKW2PGYDnkyKwGqUc7NPfXuo+vdLHv5qUAQmiJht7tJtWWNWObOFOo4FS3m0S/c63ltAWSHHZZia933Gr3Wn1II17lm61/BSzwkCfVouZEekys6/L3oHDm5xbKe5xPFJ4mpMsp4H7YfrQi0HnCe5YjPGGxdZcYG9cxWeeujS2x/q6jf5Omc6vy5L9mRK5A4TnSP7wcOePsdiI/XxQjIj2x+v74Xj4bzykSQhi68FLc+MuMFRqtIEdXgnnCbiKxRiWcN242jDBrq+3mvlnnj9Eu1UqKD5d9gYlr+K5bfgZYq5Q4aQaO+wl7JugmyPCnlwXvRI/04E9XsG/JR1sfXaYxJ8nc/NeWYFgjeJWAZBIcjD4Ji5746FQMDSe+RY9rYbb02c01kg8nw6MonBKzUclRWqmd74jhJD3G7i+Oklg/9afMRCVWfOGBdkvW4Hi9dm9fnww8QfGP2PdyvR1TsKT4tmdFrp89FSrC8rNpeLjobPxG076xQPzZbl/2OitvTErLIERfOqiuzFTt2ovedGMGb+3O2hJIIC2XVuSsxTwk7/9KFO15Y33KFaage1aJGu/TuxJQUf87KSMFNWSf54jqpWHvMl1FVOnx6xcRw8wxODoiRexImB9lcRkI3tS5MAuECsryT0mmA+WFs36LOu9bCgby8MUQYlWJMN4rH8VkUkTxmLZ3rCW5LSgjfdE40xX9xQCaG2B68ZT7nsWgwkqR2oPcjOTKLkBlFzQy/kqNOgiIy198dKTMF2cs8Fta/dj+eIdDO1RbV6yuYZxXhDunOtb42Sxc+uaoBp6uyz+7Dr/hFo0SrbWnLCRkHbvie3fI12Vxuhk5Yhp40T7M3P2diV0yv0jm7XR+nz0vMQiqFnv+O5igSNpvfsVzJe8+GBv+fB1oE95xeT4Apo5YD257w5IzrTWusya7XTQTM0PyNbn5JRYBExrlvGCnHOeaXKhI4iwPSEaWlNVYp+f4KgSJc9FmTc97UU1MQz7bC6xyuX0ys8CH8XSuJO9eR1AUR5Ho6fjkRoEWjomvIPkzThUDnDrTYXHvLWiradcdK0KQtW1E/rj+eem7cHPrxs7LMGnsclOIdUjyl7nQD0LCxOy1Acly9nwP5KaP+jT5WvmYOBp6WWpjYCDm3kgd4lL3IQqbTLEw4Lk2U4T/hOVy/wvgSNlyKN8oFaf7TiuRu7r8q9BZIf8szAJzGdH6vDcp2Xv0hGx8GOs1LBq1nRp9OYNGQZ0UU5Emqv4CsP87e/Jd1UHIyeNTSaHgq8lYtDT3l7Vhiv3dmx8Dvau4rbXjpYFcOMqHbvr6TSLZ6Irqjmqnvzq+2NxVBRJ9+yCwd2xxbQSkW2ucCCXYq0J8hMIwXycINWtHYJQc/6r0vGIsQLPq4GatvVW6/uUOWsgll6G68L1hXUDBT8jg6hxiuCurx83PqR15vfajW3jqhh7y7ohT6o63NZd7dP5h5wBbfuT8iFgt9J/mgOaauh/8GxPbiflp5o5bUiuMp9hsmJWQYhaWui+Q2eWZiu+sTBSuFZpOz5af4+RZIO1iY/3O+rwoVu2reshNKFdLPM1nfztyKxu8MKh7uaQlUx3zm7Oe1osC9D6LfVN4gHnnY1W6sumfzlM1R/Yb8R5hWziLvreMbhlyHAUfW20QMbLH+D1Jq4z4VBO9BL5V1pBdZI91i9D0lyOImOf6gYCKojakYUfKd1J5ocdxTW3xqWBqEOglpVOTlxihz52Jmsbn/TKFHIWqm7CWHcpssUOm33nOUe6P4Z2vX37CL7n9RDj8AJu/5pWDLmtsHJST+UnkI0Usr1htfxhkXEzXhsILlo1JQ43O/JrT/kTfGp1O2U9QBmQLIVcurEu8yUZXdjlFBevPUXOmnZk13K9wO4feGTnHe/td2kF91l/sGu8IvvOatMLKlH74MOUpIa1ZMfBFh6KD3Z04myYtSRtP1E+cN1mnpKSgbdQ1D5bPCsHa+gnu98YOvMsS4roCiT1JPLKfp8HNMDmLvoT1ulju/fcKsvEb6GtBPvcpUkm6GUsbvikm0miwwgzX9EeRbl2gMfZ8QDwu6YDUeY9wZHITnD1IbQ5/TDhH8bU0K5P06RQpcvSqFMaX7gg6jUN4i4icITYwkIiWMIr6MCpfORAFD22RhxhqvsBRGBP1l47zu252+M5RCGRlH8UVfsYa4f7noitG6P6J1NSbFn6tuLFbePpjm19jgiXrrqvL/lBFH9hR1HKqmDn9Pqd8IVvTRMLWcGM2wodhuMAy9WFqDKDTbppuP8gj2yxmWnVv6O4PISNnnF/UNyq+pjul0HUIB/VRVwcnl+gNXykLSXq1cpoq4rnBRXESLrWOPa2230QdVFss83MHjWoCAn8snNHQ9SGP0+mxsOLd6Hdr+0ZHM/KIzQT5cX2Fb/qI9Lh51IqyVePV0fru+yznPQ398g73MoWKlmOG76h9fb583Vv5xxZqyRLfLQX5jKcQjRpxntc+wW/gbfAu+M2e/XyFKf9d2OlU2OKmFpU7G7PizPpBceqyI4ZZrGajUkQ0ZDLDafKm5k67c5DuyOwGgrKc12tLm1CQS5Zei6Rf7iGRt8m2YSx+YEL98cZX4HrSG45RNnM8oMiAyCAHQA76zSE+zuObxwRt8jmdKLcuMJHtfoaZRSnGYcU9QZEJIRtrkXIkdWpcQ8nPHPv3Am6x8r3S15u5cbOKzsclhYMf6FCB9zCbxVdqotvQTa8i91juqmyGsoEbHQ64/vlnbDe5/nVctPuz6z0yLT1WSBBF+FzPIL7yCl0bcHlnBuEUl+pcnfe8Pvv0iu7ZzuQFIJTtY92oR81wv3KsSDknC9TYvHmvbOUgIxST8r4J2nEouy9WX1SoS11t0Hc2Fs3RjeFtHhCOauf1r/iIVNsD55cvWaCx/cy5tBe8JQHo8hVTCWOsCdCI5Y1tDyozs4pXjDFnFkGucpAxWKq5F/2xTA3DeNWT54YzqFPEiCNEbLojkx/e/FuhU5XASs6zXdiv/m73YTLtiPCo3fjnhtJtVJykg4lzbhvsuTmYPCo9jNXjU42tQJklqGCAi8ajP6Hku6Iq1mBK+ea1GKVBzyzGQZpt4q+Wmh9Z8hNssofibAu9CVHWPQZaGfOQJlOQ0PjgPQi5Pzu2/xD2DVLWaKXRLnt9FmwllYA8YSkuLSDN+FnRkREYcNKkHf+4Xlxl7zFbIhPMhtP7HlddLwvlSJaGzzoyBL5A+H6FfRxEOqpTndYvJzKUFjJYP1LMQRTWl3KhJ+A1F2QNxr1fKWmrfWyH+hCJDTpoMSqq1HlUq+rzMul+T6CQxz5kIooj62PqGXiAEe95VYNkYl1nbTgo1+waeUaWWRsXHcFtP0CdCyT+7ct22kMMwxrAqQny9jiBCd49hXXy+5ZapHyzf1/yslX/AplDLCcGlPmNKkQbpysBBTuDNslbGnMMjjESWXgK+BoD3PNI+0xnzyBsMHAnw3fYUHPWa8FiziMFuxIK5VfZVYmt8YtOqnBhQt5/WjIATd081BPR1NwhoJHhIqImpR6xWQbzmCQNLE5fl4sdgcaDQ56oEfxzvnjyZdMUjCICz3dfFVli43MgHWvLJ46JpMhe9fu40gtMp4Yvk0DF9nmpxoizkvInFJOKfDGvr//2GUXM+dRZ68Jwv0od2JpuoN3z8IfEpvVpcjscl58qKRAZnQZs14HPlvjtN20PajN1gJ7ww6R2uzL4JHB4OTrk2m5oHQ3hQ46QgOd5zMtA5XXmtz5O9D16uBVymSvXuvZlK3kjglA6hJtvHD5r9CBn9lhe1lTLLL3BET12MWtBrful5HGbI60Xv+sd55YmaGNmJVvGqMl1CPOdekd/u+8JHtwsaN21fGYYmp0I8aKL9IXl/aRYeeRdGCaWtHyIC3U8+GaohgE8r5RC/FKR57zh5JW1r8LDTq2ywW4uVUsBtJwCfcOnnxISx3LU95Vd6Rw+CSOhU3xFQ/mGRKiC/tpmiiWWFg3G9DQfPZdCvZ7NyFShk49bb7mucx2Fl0kJGbYxszBnBl0dQ3o0aPBNNRll0IlQNnfCHlNOVFzcQfBMfA97J7lgw8REmUUImdqyXTG6dKIr9P0XvmiMRVIMWVXoJHISl4iT8G40+ckeTyathPoUSh1/mCOpId2Vs4x2rRzMt0Ybzongkmp09hST4BX8/Duk8IXuuZDrEbVIF3P3diRXooiZ/o4BKmGvM6Fj5h++B1EVkt1ka7Li5S9t46TNY6ysfbvre0Gw1jP2i/cwIhoDeNL3KkQYUr0OPHODGydam3FRWkk/rVbWC5Y6pNDQpz2fK+2L2vu7wlbnTT6HwZZIFqqbHRMv3W06EPROMiwI3UFB/ah230zZ5HhOPBk+3LopXnL9STJxAITfj0bo2NT1jXf7EBgH4J5MZ2j2SUq7dPVsHkE3x1nsnbWDSqLRXiwCkA+qFR/FXHrXXeEKk9N/9jTI+rKxzk2z0/NCYkgpimZWYv0J+okKi3uSygY+eEpgkcz+o5ZnGb3v58E99WJHK0QGPemxFNl373pc0AiZg5HIGIIOugaFmJKpuGC9j/fQbEPMbS+I3UUi5DWlvNk2dU2sNSg2NNe7pbrmkyas1kmfGtL10pCJNXDPTPmyMNJW6wtdoOCjUR1f7ywEB7+VLotIzgTOXxtV399m7CHudeNmvIoPy4jg1vFSNFAElLrO8kndaeDTj2DNDorvevKDzbZ/hlodIlRHS9KkmRAJvtCh8ty8ZiqnKtK2Uc+ZsD92a0JvV73ng/ZylI5q+TUgvIVxYbhJK+EJ7a+o3E4/O3iuvQ8bv5F8U39OqsK2TvFYk59xHTlHIAYwTBksu0APGBnwyHiZOPK68Vam4EwKTshnNNM7l6OgQDSILNPq8uCS6VsKT6Wb3N7OqV+uxr/hgrIU1OmEATU4GsOGcT8BbZwe0TzxmFs9UCrGq9fMri+uheGcV8Ne331dLSUzy/zFEIGGrY7NaHnYw+SRkjf8Q7vEPq8h3r/jSmzmZZ7+9M5XbtcrqyigOYNIFA+p4NOrGHVsBpvDByBCeJNgHKckkRH6VzSiaCEShYv5r/p+9OKgPUqv3xYw8jTHtttuiz9dAl6sl3Vg1wmlDMjUSfA8oLEE5ukL8R40pfU2AyeDe9ncmJDxFCPgNdM2xuJO4n6T9JPbvXeEnqK7+6QuT8MVOVuyNxnuLUn3mxeoc/PpKEWqRQWQCnfaSmcuq8x3+rMQSw5i8jqWw2lUKT6HIkIe1/E30WY9VgdoPL5PccmT75idDvlDiI+nsaoows3S+fys7rq1BgPxqaxu6m/zPiBNVBkmTNGVjb6JSuleobYaZc5PeYGBCoKvo5CcGE7vlxV0A9Wsyr6NIz6NKWGUCtY+pD8doau2WE4P2OxjyIcRdwbFA0B76HjyI6uiemB5ovBSZADB3gpc7oxV/2qwmNeUmzaIcurqiJj3lYumWpK/2VKFBrJHWlCN3cQx3HawfkhQPHyIZktiNUHJ9N1LOXMw295edTyBtYDpXax9IzJw/JPvjrA4I1u8Ehpx1KVhbAwst7mkncGGTgtGe9aHI2H5PbdLunj1tdKt6bTB8H6lx7MsgWAt6Zrp083GsuX29xauA3RXPWOkPfVwavZHfvT2Nojt7xqO3rV1gprYnbfWIR0Socjos9RyzgMiMZcbunvqJ7uOPViTfX62XxUmPG3V4kTIcQpMccVZb1+7MNVO7+9F4mf3fu79fmqp5oKy32EbQXISaqLBGOwVDZlYUxx6KeyzTHRBJlmErcAJPchM7P2OViL002kEU4I5OXEZmqyVnqLYjP+zU/DBIh7b6XcWq4w4DocbCzBTdJX1One18yhlWMut71GIfTUb9wb82N4sWP7acUA25lKioRns5oN8SoJV+KLK7oe7iAjCp9FEte0tIL+w1Qd2jH9zAEWx3X+84g01s3cKQFu2y2glj0bn2Gq4eEkgHizRy8TKeBfU7gLvl1YjFYurKFktM6XBQC+qzBvJTS8x9J0pE9/j5q5xNoNLqHP+PYWSt2tcjtF3MXl6I8WkLDjngBgGOYfU6lwJ4wM1crlOrBI8XDXtxKyai89RezH6dU9YFlEcqwuftDDCChcEJhHEY9K60aTNL6UXqlMSeK8D8GAcdHMb0+RIEmHEFAHGMTcJDH1BmSFglqNUwweNs+1bwr0VmHg9ObcTL3xdl0qRd8ik4+w5JD3dV9Px/IUysFWW1QdOkKXXylTy1l9hHxwUXXZ9xJ30vhl9IEhptHrRE191Po6LOg25+QXqwh+74q5z1IiBK++VqK/Lc+JHCoLm4/MEWsAZqc/5eEvUQoe3iXiptGkssuwzbmlSmj7JMzQEMZRWqThPLPEjszPXdciYYVBI65p3wHOkD6pIMwoCdkhU4x2xhzXp9SDozIK0XxWQSCGKatv1E2fyx2MfRSMi1rtU+LPrdp1rjeP2+ZWK+Vy+oryE5s44iYYwSCY+6KWbYATMCULImQtLXAINzuJaRadLjKiDSIpHPhJRKvBEk2XP/3w4HFH/kJBlyyGWKbxHQxxsXLd+SKDuPSNkhRl5lEp/Z/1BbD2J1jPcXFzVUrB6p8h4No5pjhy9P999Yc9+GVmePKGWQbCqllWjDmqkD0pIaZzPT5fE4Ls65/aDGAejcrDlMcUPdwjp94hSN4kG5yzo+ZNz+srKQZJEJDt9B2Q2+DgxX3zJsC4UDoS5Z6NZuOkUth9w5oQZ4cOCGbnavRZES3E2YLPjpsUXzgz0yFo6km8QK0iYTZ8wY1IikxMuJxLIi0qYfctu1LWVnN8jWlJhfoj9Xe5RBSTMbauMPaWjZjFluf2F6tqThGSKfzkSEJFzeNsQ78C+ZwNAd/Ce+Q5Uz976SOlwb7+LvaFSA/WyEobv0eeh4sagPHyHZgvhaRGV/flV+8t8L1+FbJ8Tbw3HaOEUJudlweSvX0sBC5nXBcEsgRoZcIwjeKI06J1RCYYDM0Y92eY6m/nkBcobRY4rOGb9Z2yJVvEddvHrDu1zSFKSsSgNjvCHEs78lzVXJJh78ydqGDBCX3YhEg6xf4xn6zQSQePy+pAm2EtoLTcLNKu5vhDtZBtURelvfsXC/DCU0eCrB63GRTayLyGIow+cWj7DA+/uPUgGCseehMVcaYvClOH0oqm/D/9dnA8vt844+AEUU6TUif1jKZYlTsAPb1MdYjEwm+2R/JiTUZyNS+XBabPQq+4YW3LPcffBFhrN31kbJlZrEc2u75d0wovQVP92nr8C9hnTWjzydMi3eijnwwsgeXRpKKfHqTPA12q6KfHFlyjArga3hwMCbYmL4rfdHiRw8XPTEe2hnPIME/dtleK4rZIUKR3fpE2R+leZq1AlWp0bxF+17tkO7k5JPPjqnbc8vRgnpQ72jroYsbVJzscPJW2RvLM0JbaQJLnrVn2KGrLyX+fBl8AXLsaObtgWngNo2mgA5eu13bV/qLfjL7JsudGPQj1T8AyHI1e2rbwvdyKI96Hs3IIZcd0H37My8JxMrLtOrj8b9RtJJ5SEQC5JccuF56L2Hp68OpcBil6eLVNl565dojlwqL+3g5LCRUKZ6MkSweNqlJWnKLhj/vH0wVbrckDaTLzavrE8iyzYZfPoT+kEeFHphr/rSstLWmury/dzr1vr3Fr0dRXWsVAm5tCgpdgUBPOmyVuYaDcCgrUrJNx68BCKiVDy7XphO6awptC85ZBa+EXXZBfdYzIXkPJb3FalCgl50Dqbh+GU+E5lDmEiPtCkSG6grRdBRvKkTdJ/NjL8ACxhEBwZsWoOoDCukfgUGv3qyIaMpAGx/7WLu4boM+ERRvNaEPFzlK2hrxBz/HqoQfIeLeYJ7Uh0hZ0NhO9sg3KG3WmwRPdMHrsR09UX8ZH+rRNPGe3XNKcMiu6bOeIsO/QbcKbQZSrPe8u7tS+Nt67ze6CgvTyCZXkKZ8cZEehyCcJs9yxQZtbGS1JOin4Pij3KOmSy7yOU/4i+jmPBB3YNoztpdY2khkveCnAqSileVGbCIJkDG1xlBWn6VAJEcRXKI2KkV3Y2FR2pxIVb6iLa8MVN6A4bm/tzF+bH1fazWlcsHirFRL2aD4P0q2Rh8BE8zipcFLXpJZpAncnDBYHBcaPDyF6j+oj86Oal+rNVH/Ly/RqI5lfvBeRyIuwxaS7N3C86zlre4PpFJRik0LaPFugvwm1LIQEhvITNNZ8wlScmXmyq0eRnrBQLcXCj4sZyE4qVy0viY0KlSEvr9xXpq1zRvvWZdNgRDY2XVQY+JJdnaf96v45DoeJP/UE5jzmf1NCk3z7ZsFR4ID5ppkUkNdyoGZcANlepezO4kfiQWZ/kEqAthWdBRd/8EOvPG7mq/Y3LG5qapNftoKKeLN5B9ivtjt1L2C8ZaIoVLQ8HIjspdnk/P7pfH1DdE+ZEaviwavOYD2f14A6FPIkvPfFCyYUkmULcxq5+Fuf5IVHN+4vXYvfEWoP8KZ7MznS0LOjUzU3b1EjyRUpReBcNVkULQArjlUZaes6tE0zTzz+pI6oDd+t2ej9GCkbn2jdRxEDCVm16tX/06XRIhWK3L5MiVbeQyUu7DgzJ6yEn1amJiE11SLOwMuMPXKEedeU2LapEbEuBoXiokvOCuXtwJqrMVL4QoXpxcOiHHHrE16WdSrMlcAdqE/uQs25bhuMlSTnfu35XMuDzxDSvJfWSG4xDB92QZQoOwN2eBjEKTnEGdJbsEoh9eWrE+1XWuEBWJkYFv43yTSR/yvArwUR7Uau/xAHmDH6rFxDN8gP0yBPUnvROunaNX+Bm5X35SGNmzMUTCH/xLrwzsibniRiBYm0T3ZlylWhvMHzZ0k3hKSQ85Kfo1NJuHoGctxRFFQD/LvjrR8XRVQETN5jQVBcVRJjNWaXufdYAsMosjr2vaAulfdt0QXcGDuENh9kUGoAMD2h6izZs7Gq8rePtgFyXZu5eiWTEQgnyG9y8Sz2JIcBdYGFfPrghWRjQvx+LsjCfCOAdl+jXfFROo95ROAUmIXz/iXZnfF4aIz6cPqBZ2CGPPZQYiaVMYkM0bEy09nsTZlMmtkto/040cn+ryPvDAnXDo3S2ymb4WavU3nTP72Uxa7Zqhd2nJNJUreQtDkfRPKpJqlNL3l8YIjFPox/HEp/ViOv7EgBWCCUJaKTIUBHmVeBt5pk1acK46XfMhKHvrK5rz0F7VCZRUuRXZMeYQRETcbbSOy3jDfl8t19f0QWJJwiXfGhBXquGzW2qMa881Yta4pPx46qXsi8zHBIwosa79SXk2p2IuYzcIQy/aJwWm7HRfwHV3U61otn9ZtG4jqopBPzzLDfHIftDPKovT7TlE9Rvpp0sU0osmqe52LcFdrhweMj7BiLBLuFahtigMj5zP2apOh5pMeobH9m5LzfBfp5ZkAcFCObB3DGVocsPrh1K+KNt1QUc6PDSq7O7xWco48PLmdIn7nGST0PA4Ql1XyUSmZBdjHl+b85FnQvGtJL6968jJZHFDJqwz2ytWNFyggNbfXZXez9Dtao62RQrSySHVGlbEca4V9+XU6IJJTjm7XMhyD14aKImG+kOx0RKhRVISabDc+F5Z7pQ/lpU+izty6z0Ja6Q4wL9PmsrrTz9RWIwsemFZnVIYimI3vC9lu0kgiuCxEIeUaNsDi5l6IiKsNyqh14iyV4hj0v8vNKnBowxmb2sPaYxcWVwJpHNbzY+e3bHZ5t8eJXuQ4udhPn3Wx6bRTexT4onGGXU4Nj6k1NKb9SACm5vhdW7fFTLnYLXI8W5bX4rsXdxh8s//LPSk0POQPHd1HuSMmUjmUnr+S74aewL4k2/f8ywYJ7wVzTzPDAi7n4q1CBMHlsvR03MT2c8a/LJudP4JtdD0PBgir9FQRQivubQ6J625+uW743XYQ3LU70zT3sR1NyWcibilLg7ZtC+dsujaJwoBVIhk+LQiKiUKfGpbTfw7c08EF4mRPY484WUa5lcHmo8/NGTYT4jotHSdZP7mMrfik89zfNplSY2zgNjpazeF/JpMxIaXPjFbKBu7/UY7fMs00Z09TELbLuX1bcrJb786ZPvekWoz7FNaDZhHuoS39fwBh2tspBsI1GMN/gm/U4HESRPplS2XSSJvIvm6u6+Uzy/36dH34UKwMJocyboLkZpd/UmR9ZNwLTSbaXpcMcz4ef5JaVkgphnx3Oqge/4/lYbTpYf8gTkcD/wOY8+o220cNWysM+F9lWWyX14YlA55YeTmQeoPAU7k5Nt68wYtKo2XXGaoy0w9/ilRbTsSXKDe2yEXbLJvWHlCF2osIhewUdCTiYzXTKDRRQJjrBTboMRjDu/ao3uLbBVVHDmKqvBFk71FHiK+0Q496z3lOrom8Sl7WfyG8YQDIPzHjVyWnVlZuQEDqy2uiaXHl5MjdDJXkXOsdDQbLmQGvRBI0UtUf1q5NcPKlGYHYlkuC1/7Q1hTQhacWRMCPsWz+lxHsigW1vygMVxGoCdH+73Bcugr8GqWzDRDUGTF6bRZD+yp1T0WI1k/acCexfBtNeymD5p1yuVnRBxh7iQfq8VKaQrmlnBaJi7H130k936zmo/VJI0l2pd+ndzaZ0EAeghrcVvRl5WIpvGLNtFh17Gjyfw89Fqki1ZNos7Q8TsQiFvhJ/ZD+gkZcQbTPeHxssZGKbOut+rDwoEsH26orKY4inG/up+t3j7JdB8T6LWvi7cAkdgsPZ6SUx5NT/5By6+8hMfzxUcRVpQ2QNiNnVyyZcSxbbfy1fFSCI9HVlI7Cct6Ab3yoQTLsZstj9jwMxLK4fOjeJpvbU5qjGMxQMHmHJBGHqtnB9/aWaTfuwPbjprUmjL2dMgMxFbHRcvsOLs+/zBNAtz7rEfo4/x3foIey/ejdq2AU1jzCM57tjsnLtaGrxYz1mZsgyyAqpnebBGvGf1B6T1lO2f3ol0umx340U0a5BDdfadwSnuQBsygKw3cJNLNPzQrFVKy5XTOyKa9id9/QgvkgXAinI9oVX3s1vih4B3fZpgyrZXA/IuuMwtlbJUvz2OK5LN1G44Qd4k8uGD7X3MrATmpaN6cChZFQeEwlAkgQCzYSAeBehXMOYvUyPmiE8Qly7Ee3LrEDHG/TVxml2bEvEcX2vrIlMVvIA4Iy60PwbX6n5h87j06TYLPDL16mxkNNf5ypw4FCTTAYlLKZEk6o+RnzUNCM0nmII9w+LqMmFF6eQ2/XnJu3od8ykNJi/08FYJEzSJBGz5GP37Kfaa1LVhPtoZ2y1rclpDwzJumY4LYbbmMGBfjUw5ojaCIze2s3KboDwT906nLKuiivN9R4ZiiX6rRcANzaawmiYaDPs6tSloW3PLtiiu1EsYSqzYIiT8wFu+eyUwcwqQzdFz3r5jjXIa6mfFxeK7hjNlwu7SUlTLFLZk/0gr+qMx3jqAcw2e6vDXyJYqZmOGabryjg1m281O2wq2+9p6070+CnHctkWVdectUQF7fBeJopn5UwnfqHYaMcGPjGuFpYJMOs8jvsM9dJ9dzPfwY5HvtHUM1DldLlfrcnchcEIDuQpwT/z1tpP6Jt75KFGNsyC3wDLxfxlpfk8QsdpVtIg9raZO8H2AA75EqLLfWFl2JhRFqQO/SM+XU5BugHZ/54GHFeWDZ6pJyFSKb7r5HbDqIxvRsjPU+acgmiE6mzzsLRYOipQxDBYWyi/Y9dKtwm7KYfa3d2q3C8slKKjkN8KpIluve/39FQDFA37nVT3Yw/rUA7ntVcoa/ASKS+49GLomRn/NL/xF+7l3W/pOOsCrASdEIytNPTB5gQpse4EHmBB3Oq+LnGzKiZdyhXw/C9Mhr5YXYmlGbJllELYgVvOxrN6Rj/N70XTx622hY/eID+1oGaaGAmUV5H2tYEejKS4Lr/0uIKQUwg5BJk7Nq/qY7rUtT64zQo7aTy8N9VtfwvceQ35Lw53drvyIGYnqh9/fTy9+Rp2Wq+lqaxW1cxsW9v/q0RHk7q/73HhC28en5d8FWSTx6dujAio0RcCwM9Xc9xJWhuQVbuPxWwC/xmSZFMK3QKQQL5uaRBM6/qfRjg8wnASo454mGph+Xs4dBefRzXg9xtPzfXaYftxr6Ff6M4bk4oVlOx3YxR+yU4TFyYhpU2NKfxxVRInXaqEs7q8sf8+Qqz/PZhSU5GdYai+4Rlu9zHCTYZrBidBoJ+lAm+tW0u+Or+l2DyRsgbwIjVqXXlxBevVBn//eGRs+3yMoFgCa5Y8eHbha7Hj41kobLMQYW5bWa0cfce5fHelB4ZEGpb7rmP/SQMMXnsUflk8Sl7RKdiNh3hQXC3ciZM+Uz8ty0ZuSPyyjw+V+S7Hp94V0I+kO5RmV3iBHoGs5PZj8yY6kOkNshRpxhKfHGa7CBF3uUzFUmNLXSiborcUcyyEJhMMDSGhzscauhlMaNB9XSj54dRfy3npjjfKD8zamlpITNipTx6SPwbH+1ZQwrFfqcmPkhQZ4Mf2PwwWJweMZHzMq4gNWniwLW5jCrCEbQ3wR3KwuqSCijf00YbdnMvf6KqRzhz99LCgqXm4mLbuIJzXXlM+SIGwtBS7O8YuWROHbmCFAj1DBhED7IYhcKW78zP6pJTNo+Jv7Z6QFix5UVc3zYhK71OxR/0Ppif+lxYI+2jcEoUp2Q3gnekx6Kyoy9qZgEAxHmZKbak591IDe+pkw7nUuy9kDZFFqPu6hm8g3mCcbz64cyP72vB1HayIB9R3cGrQaf6sGViUDSrSZqtJCylMhWUp1LNGGro+wTvQ/JhzNHS5cHHjqdrnP2jHIVuuCBrdTBTO8x2XKO1krZZU0Tb88MwkRHpbyuBjbr62lseWIFMyVDMtaKaHqNd+2lfRT1zqblmTwVUxEwDi16N99j3SvrOSRwK3VYwt9/LiTBSQU3P98zvT8mExXUXfLaGwQUms6JZq04Xxz1DaqSa3bRlBEC/lRpIMEaHA+7fApw6BvoR7dw3Lk7KYy4f3m5IUPx5U/gjd7IMUz5BzadkKbBRU8qgFdKlyQDjhpSDqvxfw258gibECq3/z13hxy4tZApg1Q1BXOEcBDp8208XA0PSXMNI4NMWtl70YwnXhTRIVcy1yEliQCPU9pVBRa0n8liGv2PHqTj4/aBJkZJQf/nRpInGNaX+S8rBEemiXZognQKD5GuIUvS7JFhHrZjNLZGh5Ebpgzuk0DnT+2ojL2xya6pXyDrc9cQVhg4EDsHt/2+VmHk7K1RR8eEi1Mp0OxTvfO+Xf1F9vj+gz0zMSJGbrOa3Z/FfN4uVquWlm5CjX+jDAhPYl4k51Dzr0TfcqBVcNSxwdTi3KMGJLyAt5ryanDClbW67FcXVktbluX+Yr7h7od11O4bF3P9Yc674gInxEbLTrrUng1Mwb/acRkDtwTORGkHzkUnmTYEjeKQiMyw7VaQjyasE3nkx0u+OpbbDLLzNbbfd+wk+nEs6qDe8Jm5b39rVweDXPpG/eZa+3yEIc3Y2nHDziZNr/kPDfCYL0jpBlCGhelw4ez+63vfIWuROrrmBUwyEuRbe1bwoC5o2dxnfDJjUzqgtsR8LWCNMvZSpV5reYZHTT3m3wQ1+r6QaLnK36pksTLpLpcJW3vJ7mCVzgbufvSu3NyhB0YXmB4KDMeLyLnjsWDDLnbQ9kdiTyV9kcQ9pAOT+S5LUrnqPB7knwiDyb0bB/un+qXsEi7NTLRnnsp97FslI05qO1kdvvZP5a45QEnFE/GYpkVlNg6tE/+zAOStj8+GSMWl2c9xlII+n87hkJyWF1774y3sVSJaNzLNgVmm4RwdhxDNOijCf2KidgEicVlvtdc8RqkR2OAU0Ohi0Q4bx+Tqt/KZNO1GCuSATPZBDzeJy0pOGsPFKbclvEUUyggd0aXqgv+gcZ+mEOMcZrightxl9z9pH0JeV+ukEuf9p0cu7qTmyghrXIef6E/FG94oTYrKyz/PRLLg82xzhm6uDCizWvheRioil/cdWkKEClo1X46AH4uuCTs8JyqfXQO/ohyZqxpLbSLwFyIIP1x3LPekR+7cKhOKLZCij1ZzU9aqrtcaeE8QV/dR/nBwATNu3rwKm3BKYGpSxB2OGYGjmwlqCvZffzJYB6C5uwEaF94AyJSr/NRwvZAEH8+IT0DLqCSIDXX+gPHOpWE2Knl/D36KDhkOx6dl52ABWHQn26nJgBji6OOQPMQxKxf5QkN8k+7B89F1bFaGebwOPOqVnEjeWY6HCGvBYR2yP7zUwbyijWYwlcf1HzSj0K+iiUZCXvjKsWyUMYdm/X32hGwxuj64FPSWYzKc8n4U/i2o0P3h2rX16eAogjXkJRSIcLEj6HqgXh5QA+DYcyO5ZURtxX49gSIlEwAVN0Y0SLqAs6BX9yYW39uAbhwFKqXI72SSw58t02EGUN4FXi59R0w8CXPR6OdgcskJGyZU7p/keF99kVzvPChk6D5LoOQu4Oqye9hVeqOIrnYL/Eb1iv3kYw5oTrOOXBKYkSvlH25eDd0wmICSMqKpzWuvSmnzkHW0x5GC/LhEfrYTzCjBzfp5UJqc+W/K+zp97syWVFYKYDErCsslOa0YgPgqcaqsOaajrWPpgFTCyng4FznFlsArfYKLyxMDSp5C8V5I8cKyPIVfEvXpeOP88i06dN2rhWtLyXhtWfpVq8PdeadTbvAqYOktqqmLGra+eubot556u3U98NsONsMaPqDdz2wwHRn6681RtAPtIqp3Uhf0JVc/Ed3LjxcVLsS9c/cHS7xRcdpkBXXU8ZLDp7giiAxJQd5rGaujhp4hj5jX72cDGQbfLXHwPvkSbJLeyC2TyjmMNdcI6V2AqI67cV06zEVOcrbfMYhGOJa9dyp409Iv8JfjDhqNUCWzNLad2pgn+ePQqmyOn4qED7HKaiQf5+2FOEUN/vOJQW/3EY+sQHfD7/hY/TtJJ2Pc41zcH/InfBPcgm0ohHQj9WvuMxfYncS1izzbyEDTwYZItoy4bW2koOAuFJ5Fte9cWoqdtvKHRaMBMplmuNDNs/5oKDH9EBacRQoZ030aCYohPh4Q3QZZd4VyRuzh128cSWFz/OXwD2ZkkPCJY8oXGIp1Wxd6QllrLJrlXQ0H3sexXh+Hc1v2RAY0HUC1ammB0VlYeiMheDBDRhyXjXK3ktIRWkE0oZKoUWuzY5p5wJ1a8ZMBRaDamwT3TzlDjwauSAB/zUvrSHNEoqBM19AeGYVTysVQHC7Vp6UH3t1OdrI/uBLGbMpnetjN4s072abv+ahooauTJwcH1sAZF1wGmlgpLXZhSVXkp8GwnyXtAAcxWbKbY4Cl09+K+JvLX2R+bpPnzL9DJUS3EBjgpadWnUdfZMkPOjggezNzpjWRottD0ob5sSrhlLis+wRZmTlNU4pA2y6r8TDBpDqa69Bl3QHu98u+i7ZpDjn8oR/KY/B8yXJVTE35bQpajjEMteMnCMxF9GFJgH7vtTatmt+bqghhdEhAcB2DJQiFRe+LkNchEIv4DIAw4NWIOUJzDuxoY6D2OtbyMu4dXHO28CUtZdViHaD9DWSvTDN6XOPLPcGWXVd19LHfWXiQ2m1T3n8RXuBVK9RBwVVuKrMEvD2Y93LhTuzJBcE8/dXbJywk15ijgYSqLaxSkTrpJDGuu4hB/KjjU3Kk0ieVaJr4S6o6aY4GJC3Q1cSz3VYYzT9AvABu61FE7BA1vWin1NJgOp2i+aMlE0nwSnAoFgBu6ZlDy4Sr14Y9fEjnn7HJLNPxzu3ogGb7J25uP0HV80cdfQXgnVqD/uMyiz25dBDW7kKyBvZp3TEifYweVeQuwwFChUkAgRdfqKkL05GoH1zOAU9notdNBSf3mik86pDHsek+cOBa5ZLlP+B7tICy27o6hg+kqFtDt7z8KKJ6HAzG2zEDjqxkpIBwxrJryWzz7KMWoB9lOOuTatD1pfITDPXxQy4ymFmSoVHUU0KlLiM/R2OT2YU32Ag8nZzwwXCW1sF6JM1Bh/RfOlZOAa6TcbuL83SxH6cQYNhpTk5Z/sWakZ+4/cmpB9zEXDP6CGKF0sOcX+6dMGJXw2HdpyHkPmawy2PdI1V/oPiKtGGGRwj5Rti8CwoxfSDxJ6iFXhR8fIxNge4vEVuDEAmMV4kDih9ZOXOVIYlFD29MN4zmL4ngJJB85TfP0fKM/3m1ZMPrVyzFuEt+l1vD1jX84hwdnCSkHTyZWwpTuODN1uefXiJzbBFUnk6vrLar0u8ZLLnbAI6/ix6Le+nJ+8ppkM72M8gLYUSAufA5jGMFnuJOcN8Q9UJ2EZL3a6P6KhwcLS4RBZat9V2Eyrkx3IuRCqMaDSSWrdCbogoLwuGZMS3ObxjOIgU3y1FJt6LIRR97UFlO/cJpcQyxGKrRIVaw+0VvKes3VJWwsgtkxZIZ0PzmDmqdezJXUytrQTJDVLclgoyWE99Hd0jFmGN55ejFlOVmp4m/Mydtf8hGGXswJmSZNo7jW3yddtjpUhAgSp+eufR3rknY+650Vbk8++guJRNyN6L5I3xdSH97BoNmou19qFN4tbXwwvDnDQPr6YfpvjLGBELuxJGdiZx0uuWeXvu4deLIgaebCxekZLUU7Z75lFRvLR9Q6EKlFRGUocsGVSfzLQD8qmnmnwoMK3O1J43t8uY4VdkUyxY/bqRr/ttr3P8ZGGigcUZLBo2ByRdCHupPcDJw31NX2TdT1k/TA0ACDy0TXfoQeE/eR0/TRY2UX70grH6tHpeXf8Y1t1TosAj2ouvdpUq3fItuFVJgn2cKtE/ufkH5M/n544A2p254rQsFb7fxfEQCbNxDV9wTo3ZQFS0fRpgCJnVneShAxSLgheZLXKqMQ5DkkfJLmw4eTW52YbmvCuXuVYY/M/Iukm29P4c5x865gTWZBGapMXrXzwyRhDsdnT2oq2M3Rfu9iwhE2h2fhSgBGiHHaDBqUxX26m2wxdsYsoSq47zRj+74p4Wjzr135NDTkjHvNLWNLezkc/8JA/UCkexTSfYw4QXUtkmqmh1RCHWFQqLn0ndWiv0r5/Zy91u6wi5VFVnKTr6dvZLPVLirJBAWpIxx/M1xauxdLa0Is25DK4WmuWuaHXyHIH0h2ZvI2lcdPdT3iCnXuN8NuLBkIr5ZL2wbjHoAKaZVNQjcSr2qB6f5ptNfE4v3kJNWaAMdbuHTpigvfckij8kplW6lqqpE7rSKK3HvVZ9SnD7GocaP7VW1vZ3TCMBELgH8fP3+FncO1/jySTO+gax7B2sAitbF2+u4o4Kux08d4YO16cFHV8n3vkhNhv0ZtiG6qkwf2Sx3w7ZZXM31SjuA0VHv5cKn4KZ7eoUcNG52MwUpXWFGpjMMjUJkBpbGvV+Koqsn2Eyxnr5e9dZQZTkeitdf8pPeUhinc6ytMIB0ZFUsmwpG2t56KJT38QHUiriKcU0bJSeNb6u3DvSag1r9a4zFs8CIp2Erwa6i2HhCIxOzgBMKt92kEp+788106vXRsBRE3WP9IeYLc+sfqkilM/ZkcBBtP+ZPs4oaGA5yviJaH3cJSn9aeIR5sfljv6w3QVfiLIYA86wp8Xnjayj+vReI7xxU4gbrFEvyal09sTPR2H8uvhMSZcPqMFQSPkzHYPsBzZavgw3v9pDtNnhTomiFGGdU+K2N6ZlNAWe+oTk4dyGkkaDfOG32M6hJhhtNmI27ewac3bv3COjc0e9femqzZLdTANgiprYkeEhNmJvL+7xJ8r2omx0PounJr5X+yzgdyYgqkA1hiEe2ayrmycZsuDAS850FE1xY8zDnqgWnLTIx4GUj3k5obmRV8Uv1IBFJLxqWVTCm8oR5RnOgnMb0sFMrucshODxGjn/ovIFgjHO+RgPz0AUFlrg+f4meZ75VtgTbVSVrfIi2zDOsB/j4dRekm9rL+lT3AC8ly2OUwRPaRtUsTF+2OSwyhap3HO8hUlmPUS5Nsrhvf/HUnXVb9o5yuBHHTzaEOJpbZ5LnYfCdhHMNheSrpsJyx14Bde4QRWXOOvwzhR3SuUFq7BFMyZvf2Mh5JPLSayimIUujpLJ4ASUCnGT3wWm/DylutQs3cIfNnZ/1CGNs214jiDmG8tfXaXuSkDOClWRkyCFY3hdU7uf9rlikjmvaUIXaltF0TjhtVlS5vRbVhdLCrcT8CBMIbOlaSmUAkScfkcBZ3ocrTBdbq9mt6n8XmvuR2Uc/GkXh3t8UtxzIT5eJdZThFxlm3Ou92hi2+w6MPzipdReAdV7mMF9pqlbE0EKM486oFiobzMoUXWINSJDs7PeHYoPPz1uYQd5tLBcynwiJbIlV2k/JxGVywrtXsGmd8AeHeEO1gJb5QyN6yf5rvVQrMRiPQYX0zWTx49p+uXIQiTT1Rqx1FCLlPiqoBSI1qO1fUMzQZ/Y2JgZZBk7QCcJwct7CsWxMUf3P6tldzsXx2y3Z848INzKXS0cwwkLObEpvtY/doZs1+Odc7ohxVpowCGX2VRLnLE/NXGT4OZKHkyLJrVpHtOf6cW8+I6sNnEfKi6mzByOfOaW3zJyFdU8JKbWWkGJitwIRWuhIcCr9lJX7pzU08GCePT2D78SflzbWi693kkFOaoJLZFTs7ci2OMOvy5a+jeT4PRauWprRofMfNCUUW8OMoZagSXpz0hHJ+QIfHM3chkWY3d/gwtDQ8sOFU1Wi2HYNQD5V92AnkUho5L2qzE3h1Irwu0GF4Dfgu+j8klQ8G9buehbS1QZscYgSYMJCesX/ffvkI9qZSUhZHWgvokQXwhjNqGxMAU6CAESxfO4ghL7qz1l+c1X08ztHH/apN5UkxCNhmJn5q+1hMzzgNMXpdogJZL8MhSEcW4+Ep+df6UgYe+n79wEMrdSeGhgNFTrQC6uHnB/v2TN//n/AEGINnUKZW5kc3RyZWFtCmVuZG9iagozNCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9US0pISEkrQ01SOQovRmxhZ3MgNAovRm9udEJCb3ggWy0zOSAtMjUwIDEwMzYgNzUwXQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA3NAovWEhlaWdodCA0MzEKL0NoYXJTZXQgKC9DL0gvTC9QL1MvVC9YL2EvYi9icmFja2V0bGVmdC9icmFja2V0cmlnaHQvYy9jb21tYS9kL2UvZWlnaHQvZXhjbGFtL2YvZm91ci9nL2gvaHlwaGVuL2kvay9sL20vbi9uaW5lL28vb25lL3AvcGVyaW9kL3Ivcy90L3Uvdi93L3gveS96ZXJvKQovRm9udEZpbGUgMzMgMCBSCj4+IGVuZG9iagozNSAwIG9iaiA8PAovTGVuZ3RoMSAxNDA4Ci9MZW5ndGgyIDYwMzkKL0xlbmd0aDMgMAovTGVuZ3RoIDY5OTggICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjajXgHVFPr0jYC0qQjSDcgvSYgvXeQ3kFqSAIEQoIkdJBepTfpCEoHAeldqQLSBQEVpChdelFBvujx3HvP/f+1vm9lrWS/M8/MvM87z+y9VzjZDIwFlaAoB5g6CokRBAkBpQEqusaWICAACBQVAgJFSDg5TeAYBOxvOwmnGcwDDUchpf8DoeIBA2OwNlUwBgvURSEB9zwRAJAoACQuDZKQBgIBIkCg1N9AlIc0QBXsBYcCdIUA91BIGJqEUwXl7usBd3LGYOv8fQnggfACQFJSEgK/wwFKbjAPOASMBOiCMc4wN2xFCBgBMEZB4DCM7z9S8Mg6YzDu0sLC3t7eQmA3tBDKw0meVwDgDcc4A4xgaJiHFwwK+EUZoAd2g/2hJkTCCTBxhqP/chijHDHeYA8YAGtAwCEwJBob4omEwjwA2OoAYy0dgL47DPkXWOcvgADgz+EAQEKgf6X7E/0rERz5OxgMgaDc3MFIXzjSCeAIR8AA+uo6QhgfjAAAjIT+AoIRaBQ2HuwFhiPADljA762DAepKhgAwluEffmiIB9wdgxZCwxG/OAr/SoM9ZjUkVAXl5gZDYtAkv/anCveAQbDn7iv8p7muSJQ30v/vlSMcCXX8RQPq6S5sioQ/8IRpqf7BYE0k/7Y5wTAAMaCUuLgYCAB7AID5QJyFfxUw8XWH/Xb+NmM5BPq7o9wBjlgasEC4Iwz7Q+KPBnvBABgPT1ig/386/rkiAYEAUDgEA3CAOcGRJP/OjjXDHP9aY/vvAfcBWAGx8gMBgL8+/7qywSoMikIifP8N/91iYVM1rfuW5vx/KP/LqayM8gH4C4pIAQSlxIEAEAgkDpCQEAME/jPPv07gb/a/rQZg+J/d/UdGLaQjCiD1Fwns6f1NxOuPMnj+jA0v4J8V9FBYPcMAPP+WvzVQDAjBfoH+z0PwO+T/p/1fWf5X+f/3jtQ9EYjffp6/AP+PH+wGR/j+QWD17InBzoYuCjshyP+GmsP+GmhdGBTu6fbfXi0MGDsjSkgnrM4FQXeFgHf/ssPR6nAfGNQAjoE4/6Wlv5uBrYGAI2EGKDT8130HGwUE/pcPO3oQV+y9BY1t2W8XDDtZ/6yrhoSgoL9GUERMHAD28AD7kmAVgF2JAfxB2FmFwnx+SxwgLIREYbAhACzHQIAjyoPkV2NFAcJgNJYzHO2K7YPzLyfJPwpAPD08sDP4WwnY6n+vfw88DOYDg5DMz6IgMuEuL8I7zmuVmLwFP48SLC13xSRZ9keLYbjePfF31iHM1ph6oGwPraYfeWwwVx45ORvAxPf1fMzH+lVuyGKGZgEGR61/VXlfsHDo29ErJxgrFMXoNC7xOGaVai/ZkIXC3grfijvVfPYiQqJHdP35l2eXXej1+1LbADdAySklWwYTJl4pv2sb95ElG8cyZtjSmjKB2sMq09NEy3T8EvcRPOFMuSOO4ZvvqlVC1vDHj69zB/ofix4WaffWiFdH0jDc9LvHlj+SMshAm5x7rxmNw6UsdqpSnp7EzlDsFsm1iGcvsfhjumigPXlQ1LPRSU8l5Ib+wzdNnvUosVm5/J7FQ2a7tRyTb8Jk9C0pMc4CtY85lDlroDinw5l7NaKIgl58OlYAQX3X+yvdaVRp2ZmlDu5CUxzhwzBR2y8T9Of28dnJIBGbdDmE5OCnp8riBghW9xFH84UL2XQADSMnjYEWnh6by7LnyB0BoZOn/fBKi9upyOONltcdwz1R+yiOryy0UyFJFp3Z231byc1aYqdvqcz41MQxddrvUN12vIn5idNBRgX5+AbtXRoy9xWl5ibYE81EKQpNqN6Z6KzjZOoRW0pHKAVPU5LTuH4tZ3m+UCX+5olcaItcumQw8OH7if1rqoY7iZR1qzcMe75dt01y8NgXFiGy1S7ouu9sX6rHfQ9zNwnetJ10saFsORWyLzG7WKD80zTIjqbsoXWBY/yPhJP148a9Agul+uj7iJi07qmgVbunb1g67w8kMGe+nNjp7eROX/fRbPx+ir9P4zCsIT3IHl6MqGxKFGtT+ThAG2NqNQDW6ThuIfLoeePYdPyNFGR1JnN3LcTddqNRb8/9R8UDZVUANQX3XISU6Gq1bjCXlD8+abRZkCrZiSQ1GXiiMVRkFimE4+zYRLKGUNBeoCvatuJ41BJLVf9dw33/tJf5I01bHbPwvUE/yBlecai65A8vA9EPn4Qt9MVf+yqhuuu+PtxetzF/wKQaqttKEG15d6n0KLKFqsgyceZNkYWB2r7OpciqnUjrjerWcpRmuj8J6JbPFMPNoS3u7g5PhoB2FNn56XdzvdssRtlqaYclu1mtidO4xz+40lYzEbfVr+isg3SocI2cQc9Z1fMdDkqqxwP5oxBkKuc2gJLi9z08ROHMXo4zqDB+x3H6XN3t3dv1gWcIBWYI32I0+9dq2yCjqi82FW6Ra5Rv4aXh2hX6Q1MJbFo34l5Mv/ixTn9iRPXTDjNtLpPV/eYgc9BTkedOBYbvTSnN9A3TJ7n+AasnJ4aBYNHP6mUIvPSuI0kf/ComwmdTmBRNc6WynuoVmXq2BbPFiZ9kKm3DN8PMUPWP33u15e+kKPTUp92WScutkxv5IC8QPrBaWtllzV75rSk9+9ak0e51LyOV9Lli/FxDVWcSBvJpRTuB/EG6kVyKTldqungHR8S6kta5gS1uRX2W93w2TQlUa0jTz5UHciYa5vMjiTV2KGTHeNjUQKve0V97rHwUzRhB+nXUsqajcFd4x+tV4rhVYeuPOdYWHU79QsXtLM2wyFRq2UUD7oR7T0feB3klzwgMcDSwO5uW6ioc128rLKe6882GS3iRv7sl994AhA5c1aBIVXymlyJmuy+aHmPyuV7SsS0SwOhrWBIV1qrPG95AVgWUmP4yxUkeQRyuQfrse4qR31OaoyPHTf+oCVsqVecPx7JrRf5ZWSvK6SNbs4HfXw7M56NFHLlVjnwXV2rtBp9PP1e0gbBKptYhGSUecIcxfLmmHX1x11Vf7tbuz0rFWVNAStkHhMBHA5Tao8VbX1xx32bxkUsQPcCzWmAj2Dn73jw2tzFtjWoPtX3H0cwV9/no0IZKEpGeuNaMbuUKD38lnLSyYsubzWbyuS8YTHaEu1z1dX6ifpkupNOYvVAmcSP9wtMWxziGREnsMEtcWY7qfZEX8n2WySpRdVZi3XgHe8TkWTmNjTDBqGBQoH/05MCQYsF0Bv8j5mw4+bXLcgh4zB059H61YfrTjH8FmV55KM6eMyf6W8Xmfj4Ap/Xdst4zutC1z1VmC2tjg2Hd4PJsm+MNhRkBUtzdQwdMISI105lSPPlKP9qrx66UwGjzTb1UkjHAFs9gl83Q/Yz4VRLTWauH+FnHK5ni+vsZG90Da15zrFKupL5UCXSNmim+7jKMqkPvVgGpLgy7oNwJ6X2jcJuqjzkOfhoqCuycoQGwj8XebBt1GaPi8SPFRgYbHF+aW6WvOt/yDnUmqN2Z2yiGclf1fu5mEmxtIn0tgiPM1A/gPEgIjJrvZoqb+3CL1G0koub+BWNfkQ655PjL4/l4yMhR4zjq5jxuVWyOjmbx2zbtD8dHTfm8mSeED/L5372HWPqm94+2FxfkXCOhsdN9E3dpL6hYTwikNiO4ZOI+zh2vmzgtxxiXDT2jgCp8rLOgxafhCbMMi+g7c9Uzb7R8uas+J7uhHFifsela/76XcMlol2dhZtxWZI6TEoirdHG54xbejhM3RrGJCHALQ02/3im/y2D4uY22OrzQN48mIDVxwes29R7/w6RnBax9aWqNkIS3L+bxUnQHtt8JV5+y0G1j5iLwLjRh2ZHzBioNm156X9fZNcQDSUt2yL4SFuTbNIIKlW4lvYxL4w9Yr+VZazWbOViK1SirQkiEajsymd/0W/QosNuV+6HB7s9dcXck0kIXUMLTTd+bXhe5x+An/KG+ad5vSqf3fnhAa4zqNdaBu4IU35aBarvuTbGM942/txwpDS5HVRFF179eZphrUVpLa33ViUF01Y1pXhZa4ZiE+KDHdItYIgxi+BqewGDliSWOJV043q4LUfSs55ogXgmiskQ4e/xE714oB5Bl7mdIQ2WvmQK8m5o6xu9oXXKgP6C7WB565eJrkh0f0tto5jb45fEyw4PSN04qwwzJR8l7cy/bsq9J+V1v/2wSrbIYJNyHediW3J8Zeb0UxcK3+1gqbsBjfEbrUSHKpcZ0V/uUxselsE2IWIBg9JzfAVQ7++KAtFcrB6Gqs2d4H0805KzJQBCJOu447OSWnbDsXCKACe6AhM/J4wokQuL41MTuPIZGHTxDJWT426hUyHP8xFMn9nNim4jme4pqw5m+7hL7VlDvR8juaPFoNepQMrFf29vQ6WO8ey4fyJaGPFRoNjY6b6xnu45Uxyzm4fHrq4tzN7KbCPAYmQ3nzR0h9hL7pPZyu+eGzXDmIMY195en/Qmsw4SE6BRcMV8hi7BEPOap0ee8B1+Yi0wKd3FKTqEg7YIi18rKN7EuH4Mqi4iYkEC/WxUaz1mWbz+IaU7cBpebG25y+oVP09970Tpn8YyxqEcUo+UL7Ot6KoQ/fSem3yr1zjOWMNU7am9DU9zda9T5KstO6hYzvfY89KehY0gJ5I1nVFN4jlJhfDVMOxbSJ13r8oMd2dJ8o4s6LI64o/G0vVIpXOAUFxl+Fn/admAUMe/EglKKU2+tNt9WiIV2D+57syZuv/n7R2+UWBZ4iZFfT8dv1M+YdKRR9WYlvdcZWyK/t713uGmrCi+7tCrZl0bL5n1oEelhO7i5aBr1PSAHJ+MOwTcxs/Btx0nT2K0HBiGBZxdTAXJXcdnY95keMf0Ag16CDXS21EEpa0Lg2udUPhIWfid3pWCBWoFXcgEulSJiVCpDoRI5JzOkKXsZNY2P55gpg4Q2hdXLmJiGWkeARRkYo9zltlhcIXZmbxipMyNDN7lB8BPY2qyb++HXe1GoBsXaupWMkCu7/S2lqSDR0hVD2s1uZVaz44cc+1JqRW10SS5yJI9sFACVG3n+3tdr7CjERM+K1b86TXfX381TztpYy9lRKqukXu588GJ8f4Ti9tLLxcm7jYSxrFHPkia+gp4bONK/Ja46Epg17i8QP17tuM78xONZqVXyx1de9p9IOxrrfsTfOu4O8jnT4LgqYAov3hoXCixsHbvxJq257NaH8S710aw0SG1ddnKoHH31K0e2W9du8410VggRCK97E/TFGEm28SjOzz/K9iODtHQq9upxabk9zv/4VN6C7bVbOuxgWHEMQUdufsU+ZaaiuXGeJ/nW9dZM8nVZ3/NcPU8ycBrhVnFZZ79QycAeLkavobgvGiHygrLFVUnLJor3lu45RVCTcdGXK8uMeWQjY2g8AUFW4gxXGZ9tAstgMvcFRBGHYoX+gqt5KEB2aaz/2eOzLtZJxt1a6qut+Qr+NAh5dXCTbOFDX263HbRslulmiJQ7m10Xbqlhx8LJGneJXo5Gw97y9Ux5ctz+stGXLjYN1MgjUQv5e4V+CvOqu8FyeucR1zodkGQs8f4PbjlY8sizz0vybTzqGhp1LfMVPUetxJ7jfAAEH8VorvaQJap6r7Se2zwLJu1kSqLdhj7xV0uhHS7ufeQdMs+wnEUlxEFrtrzuzIjJPfVz5XB15bC5u11Di78PcWwp/F5D2a6Cb56heDhy9EM07/Sx+22EYc2TVMMvWTH4DstltMLuR9caj54wm6Q+6FKflMS3+zmjRJXSjdymMXxLeFXkpp3gz+UnIzvTnU8Q4na4agWXeDNO17Cd+/SAm4/u8oFFsMk15CFGlmkmzvVQmEihXMSNgTd/ZNzxuLVmN315pejc9w7Pao0954J/BRNlKVuHIWuuMJALveTTeuy4rlzJXzXj8WhPbWnPCjO54KSvzRxv+JTjO8cLuZuMn0Lf5SpsQRVFIbyUNqIVjBnkWzPMMzicfLqBmsy9jFmbxfkyKtCny5nXhzzcOxlqQTddLgvUqRgpu6MhEWgWTPquBvfZiop1Rps7L3417ynBz1y729lURbx1Mzyt33OKG2/o6raRNNaHkz0Y8OJqqhk+U1n6LKqH06RzH13vbWLg6Z9Mh+5oG689N8h/xC+YV11eaProcZ36iem5AXu79lhkJH9lx5RlF0yCRgFYyZN+SgSHMjFl6zTIOLkSSr2i5rHUEkyKQ9g/P/kqYz9Du/5FaYJIU7rh+ZNlS00WB1Bq40q75qB/i3fYoJGt5WQ2A7kAyRMO9bK3GZqq84dmjAruh4S+k49bbxoscqrLtYf2DA4oRxGczp8WamjPGTjXP9RrsGrB1xq224oOViHaN6HzW5xyJF4nlp3OSIu7CLlmfxf7VFYDzd7j7rhc/shhH2hETEARSrgQZF0WTLWiJ+LqWAQ+QnnekxDNC6Lcajj0Wt7qPg7Sfm/un6s7vSiq8C4xvlz30OabtDmDzE0qr9tJEZSZ1y1WZK6HK99OIY4ptaBJFDJY1pJRKGAzeRYNELrRjKbbwTs1tVl7HpYiN2kR+/PGZYpYw8vYYI9gXYy8r1xNJN9qiIMKXtdDW7JOTD+TkkddIYK76by/JP3i6Jr18dlcwRCzTgjudlihQSqXBAZDgXvqqeEno+10d+FoMp5VptmTl32zXub7B+P0jB6vzpH9ixOVh/UK3ffC2oVT1NnFTYVqgfLrBLjH/B+0DafDgQzsw9OVk3LbIQfozcXdMB/UPZvldxVsb7wvxPU/CgU+yg/GbI8EiVHtF5mtjJTX81dRFTdXVb+8YJGIrTdFh2Y/ny0f8F3/PNyXSmhSEKcidqHh4bRiStBHKfaGIzHqcRxXQG1iY3cs0cP0jxoVa3OS+Y+3yAprCHS9Pi/xuNzClIatLgHIDsaLkAe7OTZjNv2GuG/M6SP055IZo93IheKeJlTvExtZdd2ayETpybrc+UL0kzt0va8DVE0zR/5SJvA2xX6EtW5QHmSWR3oOllincBoRuUpzP+suq3a0UxR+ef/Gs57ydQoaxbhck6o0wAw3+JSdc0A7wN5QO/BT0evVQ0/VyNzUGPLAI67gyz5JKaHL2dL2dQdGL2UIf5BaN78C6ZBYSTQXQurYotVAfgLpdEyspb4urdCDSZtLIjA21R+DDJC7iKi4WRV/qtSXkA9xNf/uWlxU3ok7YlHDHfbiK0sJXS4FbY+saemLd3rvJXVQUJf36HfkopRR8qRZd5gYDzImMdwW6VBaKX41ibp9vTUCoixonKR/v81hnFtrnnAUw42BA8r89ncJtMVQRi+GR5a4kQSWGac/b3uj3GmON7PYstT6DPIk1BVQ9ON9LgYUUiuH1ew5r5xSlWPz4sb65w2+JhzLKNsaJuqXp4p+6+ZTviFaH+aJbMfjaF7SGiDfuiqw0yeA/bR/S3I7k+Plkn1ooKAUraFwX/Fn3XpYcL7C3KvBoa2p2sZrrJQ7zmt4NrElDvvdxJeb7VuVdlsispPnoxkD/PiUOxjmnopaq/HcumiGe4U/y/UVn3HqJmuFLm6SYUoa57wIwiJnrBlbhR1WJ3sPdc3UaYeBYldj/K5an0XMpeQdMwLLmwGUE+d9TceimKimyqu2QpeKyJLeAPbShi/HX5NmSQoGh6xop3VinQtwEyypaet551BiEq60Sz9T73AGEWqmWOMIVPmMBRyja9A+u8Wa+bLq2lSra1Fz10d3nUtvtN4Xn6CPwHETWJx0NhY0v0+dSI43do+eu7n2bFiubO2Dt97nvHowokI6huNcX2zJYC3cu9duIkYNGMumvSgaMzHCbvt58pvTg59SwDpHtQEeGXd2uZ/DjpB3QjmuGujdGZWR7ZDVWGL9bwfb9tTDRKXuKZn+LUtlWuK3VDK0L1XwhL1r89xuElZ+GDZ+y/Hc8AfrpIrOcdFRcgudT6Y38aeuEpYI9ZbFnOtcZA/Zw9fUUuVHIwOaZOzxKfpJvX5wnt9eqDGx2oXMEtjshcJwY9k1HpsyusQvVRKE+8buY7x8ZqQ9oYbJdJ73fe1uvjCBsqdWPHXgX3+lH2kzh6jx+cQt7n24Km7xQoWyW1WbVZ+Q4VWUYw6Pk6K3jWOJWdZIj9VW0MPtOJD6t01WWwolUa8q4sEV/RyvqRrmJpFrXqQkft8/m7Qsfh8Bzn+86XDnNOeaVY6f73jKDAc+DFT13nVG7DHUSGnHnqc/QtE/Se66r7l89370mvz35Jp1X8Uv/VetpsvfiX7/pdCrKTMI8c/Yl/VVdpAoR7Bx+SS27V9XLI96u5dOJAgtxH/f6bm2ZY3TM4r7hT0z6Izb8+twAC2b/HvRH8CG+Fu9HU9tZ56n0fPOZAn6N+snttbqz34XoTQq62mg8Hm9sU10O9qwn+jYW9lpInml49L4sj0/h/1dBSLHYf/UT6a1LlPLd8Za7d31VyNbMe4eZa66pM2KBIo9MK6XT0TTMxG9wzEY47MvfZwsIbu8G8LuRoPni/MvK9jpRRo9STLVYCli5/x987Xo0vuH3IxEN+taS08yP607RBu+YDzerzVGUBe49J8CkhgY/Qi9GHAoF4NXHnIK0Wj7WevdLIwNX79YPaNT2yIUWIWZiUxRyeneQtHw3hQMuQcZNPv0THqK0XReZLJFfggU/e51KjtFt6F525Mw/cuTyeS7fPp+P9qEIC1HLpC0Skuui6UPc3PjNIk7W3LbEtRplvRZDafnr/e3BJTEkMNaS+qx6cK5ChdvYrOWyWzAaKEGPb71FyZt9YBJqaSr0SYFORPWKcZP7BtuSwDWKqdrTzwqDr2gH/V8MH1rPM4Cqot5OTd77Mp6NrxIRn0PmGmWM+35N+fNFVD4UJngyufMTVz5OK8rlfK0eu1dqerOj5G+3j45DF/D+jvEuvviS6YF304iaPBqffN+Zn4nPTemvs5w/9tmysIgAtGcf0IP+1JLfZh3Oi0qV/HZVTxhUbjHxQJP9XJ39NsAjeNJdFDdOpDCJ3NF1d2WaKljiVTstMr4rY5xvBlDmOnG4SjgBXcsEI1yPtKqdal9lX0t6ojl0+xmtl2NykFqqTPF5A8EiTOaNV2vir6EqCz/WKJoKK+0KX4DovWWe+fTVvxke9P4686LzjVi4IsjtqICxUP/cmOgwEoYrfpkhlFltHKjAX8bjuQ6b80dDriFAwc82dQvQlqTGZV9e1fIddJrZ+DEOZbNJqe6sRK68DTeCP9BhcPuBZG+8tURp9obk83U3NyF2ciUCOYDrkKqhGNkglTjng6RaFxWPRl/5Zfo9ISGNMo2P4zA1ToVO7UNYTmVtV1mUCquOvZBGC77SGNSjTWRPXQMggcSL+lXm7LjwWUQo/EhOOzn2ncgx106YSNWsAbR8FkX/Q9W6JGrCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvVUVJWllXK0NNU1kxMAovRmxhZ3MgNAovRm9udEJCb3ggWy0yOSAtOTYwIDExMTYgNzc1XQovQXNjZW50IDc1MAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAtMTQKL1N0ZW1WIDQwCi9YSGVpZ2h0IDQzMQovQ2hhclNldCAoL2FzdGVyaXNrbWF0aCkKL0ZvbnRGaWxlIDM1IDAgUgo+PiBlbmRvYmoKMzcgMCBvYmogPDwKL0xlbmd0aDEgMTM5OQovTGVuZ3RoMiA2MDg1Ci9MZW5ndGgzIDAKL0xlbmd0aCA3MDQ3ICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o12B1RTa9MuAtKrNBGQANIhJPSq0ntvUhQCCRAhCSShhCIovfcivQgoXQSp0hTpCAgIKE2lg9JBpPxRz/nOf75717p37bX23u/MMzPv884ze21eLiNTUWUoygGmgUJiRcFAkDxAVd/UShoAAkkAQSBxCl5eMzjWDfaXmYLXAobGwFFI+f8FUEXDIFi8TQ2CxeP0UUiAjqcbACwBAEvLg2XkQSCAOAgk9zcQhZYHqEG84FCAPhCgg0LCMBS8qih3HBru7ILFl/n7FSDgKAgAy8nJiPwOBygjYGi4IwQJ0IdgXWAIfEVHiBvAFOUIh2Fx/0ohoOiCxbrLi4l5e3sDIQgMEIV2vikoAvCGY10AJjAMDO0FgwJ+EQYYQBCwP8yAFLwAMxc45o/dFOWE9YagYQC8wQ3uCENi8BGeSCgMDcAXB5hq6wEM3WHIP2C9PwARwF9nAwADwf9J91f0r0Rw5O9giKMjCuEOQeLgSGeAE9wNBjDU0ANifbAiAAgS+gsIccOg8PEQLwjcDeKAB/zeOQSgoWwMgOAJ/kUP44iGu2MxQAzc7RdFsV9p8KesjoSqohAIGBKLofi1PzU4GuaIP3ac2J/OuiJR3ki/vxZOcCTU6RcJqKe7mDkS7uEJ01b7C4I3Ufxjc4ZhAVIgOWlpSRkAzAMA83F0EfuV3gznDvvtBP8y4xkE+Lmj3AFOeBKwALgTDP+g8MNAvGAALNoTFuD3vx3/XlGAwQAo3BELcIA5w5EU/2THm2FOf9b45qPhPgAbEF57YADo1/Wft7t4eUFRSDfcP/Df/RXTNDe0NNMV/sP4Pz4VFZQPwE9UEiAqJymLl6u4HEBGVhoQ8O8s/+H/N/ffViMI/K+9gf5JqI10QgHk/lDAn93fNLz+UoXAXxMjCPh3BQMUXsowgMA/yrcFSYEc8Tfw/7f+f4f832T/K8v/S/n/vSENTze3326B3/7/ww1BwN1wfwHwSvbE4qdCH4WfDeR/Qy1hfyZZHwaFeyL+26uNheCnQxnpjFe4KFgSCJL8Y4djNOA+MKgRHOvo8kdHf7cCX8MNjoQZoTDwXx8cfBQI9F8+/NA5uuI/Khh8w367YPiZ+ndddaQjCvpr+MSlpAEQNBqCowDhNSYuJQXwA+OnFArz+S1vgBgQicLiQwB4jgEAJxSa4ldbJQBiEAyeMxzjiu+Cyy8nxb8KOHqi0fjp+60DfPW/179HHQbzgTlSTE+iHBVC7teGtB7XKLN5iy4NkcwvtkUmWHVHSGH5PuT7ueiRZmqOeajYQyuvDqQbTT0LG530ZxP6djzsY9uZ/XAuTSsPS6De/UVlW7Sg78depzPsOhR1zfmdTHrkF/rvicYctPY2xDb8yZaTp6EyXRIrVctPztowK9ZyGwAEoOSQjiuNDRurnNu2QRhtxXVjEdtvZUsXdwVtk+Fppm3+7owwGh53pNIaw/oD98Um7nH/7Gxv9tvudIndQt3X1dKVYQysjL46XLkDST2sTInZOg0YAj4VqUPVZ6kJ3KzFiDC+OSJE7TiYnf1G3BtWEAJQyn5/QBkecSkJrZWvdH3zfpVSq2LiIGLy6b5v6traSI7bPGPk65nHodaOZ8XefncZDG32CZcAzKodt2zIMkZZrODMGtU8O8e+lYHuB2kEWaPddBcbdE2QMr4E7PRZAj0SA3yk+GCofsCQxNezzSC8tpOEXDd7xcVucfTQ4mKfv3nGg8RpiS/L+6mQD/LFOtb6TdXklazG7ZdPCKV5HjCktZqU5y8jjjUXUzrYgQUQferU6IZm/x7bOSIB8jUL8OyEC/DB5dI9tZhhrUP989AJGdLsW9ZSSs9SbXX1MwxsKmpLMNJP51fvyNNGjLx6KhWaP6S9qKjyssUhnZ9anTncsL05o61ViLNVXHVTgWz1Fq8/uj0Yd71067G2EMdnYvCoaVxsZaprN00WtjZ+I9rUk+rgmTChXMEI5UKqtDbikQ1NgagrCfCRJWk0XfKu/PDngepnrLU037K5nPYJrqRuyun3sohgwqH7V9vLIebsN+a0+PQ2F+06JhWvRvRBxH8GdTMosGwJHsiKjPPKSz3/VmzwlWoDaWMxSd+gEhn3lejVrWBJJgnOOlc1kQq29mWOLrf1XTRisGt9aHd3uVXuZwZv5VmiSX7egDVRoeKCg6FvoGRVjYVQ5Nu24esVmhy+7Zrc9tmLoIOsVu73npsp7g/oBB/yX6GgUJ6Hse/0bOurX3ocLsFASOSYMJOgqz6vTIfWYGwbryWhqXypfpqxAN7Ya5kXoJKtPKHrZTyXWxgYba0pneQHU7AXf7oOFsOpLH0K8rNzgYae3n1eaeZ+KQqX0ZvkkHpqsijEA9RM1qL7Sh8BUs7cICAkZ7Cxc2EQuMTS/9rkNNLdj4Frm8pch1lt1Yps6WJEQAvdw8bW+l73JMCeUepOpfzjt8L3I15xSkhXPrvM0LSj1OM6GtJpyez5YkvyDqHL9xWPUTesFppssenFKoeux30tav+fDoiSH3lhpwjEzYCC7Z4cSoXkjLCuxhlFjPHnlpe1ULWcvBCupvNRHirymqwo5VcVfAVywYcGNdPrYVxS2elJtipaQlphK8BZiRP6qC5eKoKLsmjnlyWGm8ETOYq6DsbT8RZZLTuc68YHPvqgR5lf67/n003n6tFWu/XS7R/0bQ4HzXJRNotZta3UKK6hBeO0CqDKJXWUChKTRRvlURbU56/TtDkQYU/iVLgCvh8RhSglnSx3RnvZSWbWIjCLyzLlFYtrl0cIWd/rhzhI2AGqijHMoywfI6nortfBbcEXRlA2tHlPyz3PLvAMevt7k8haRJTi+tTrR1mUcLrruDs/LbH30j4bqSdAHnEXYTiytIhiHKlXHJ+7tmIHfnKuGMlt7gykvYUCYysaprWxN3ruUuoe31xbjFo5lnVw+3iZfW2/6lOUtH71JiufboE5BhhLKRj3zEh6Wj2eZCLdozC+TwoFI2bVelUadtiN+QAe8GX7IHUS8hCiC2qYxp7KvtnkuK5W50j0aFRNIJsswz1IJGQzfjKI5c1wx6c6lvACCekj25eKD+b9Ys76KESkaqRItotuBvoPBLN396VoMn7Su0harJJWW/c5dX0QmFg9EUv7NUwwieeDULdpCiFY7fv91w9+tozPUNtk+dymZavppBAvSr0qPJgn4GBZHcsdPc2TSb5eyPjF7WYeNViSqO/DEz+EKt/YS+VlqTg4mlw+MVLQ79vJ99Win85NcDtmYf2wA2Oyu8p9mlzDyuz7FK3XugZzxr6r1Q7kfZKVDLjKfXO7TOUhQnEVerx9HgC0CtsqdSsCgqPHdVXBocfK63O7l4Ib2bOXJIuFYBp3glJuTjrFBUkKuspSpr4/Tb1iEHfDXubny/SMe7QpxQx6ThcFH07kU6LT7cvcSq9QvnlkDFW6ytXTmmvn7vEpI8rnnPCwqSGbfNqWLXqVpo5djt7vKbfhmJSfXM+8bMUxg0ih95A6H6vZpRLUcre29r1kkkUBZrajNW0mqi8bCeS7Bi72glMLt88d/AOpgy5pJtl5kjXvHvjnKRtzf37onUGCatQjBYu2N1zN1uGL/dx+Y/g7O5zR5NLrwIKVFS29ca/xxsPww55ui5tstm0Ha+FgYlsQcSW1mOIYTmvTX3q+9Lbf45yzNzEKTSxblz77aVDzCdIzgUD9ompSN+5113Y8nhB6L6Sze6PRTjZnt5jn6LoEB3kTvDSUrruJmWMxySxV3XGCslKkIczhUs0rC1xaobvriFCWMESmwuhV7eYlpWYeixGCq2QH4cpMvExDc7Z5nQzsCeJscwM/p9n3FEHFd31Rwq0bR6eTDa8aQYdjq559F/I255WFl9kb6xO1F/S/nhioEFVVP09meP0ybVbTuKt/7VtBSG1LhNUkxLI+wsNfd/KlzOGaBlkF1xno3nnoVw6FjiE+noCKi8FhMu1S674njLt0nbEsedQD7VfDkrocdaeM1V+V73WTsVe2BBHLzRf1hzfMM9Dy8MUeeVPZ7g34BqDkDHdlf/Zbc2A0buZqvI5V/Ob/Kbcj8pLpzJ1Pkhvn4+mnln3sN/2PB6Y8RzK+WOwurJPKWqKK2yZkLdNcXwzEQFtjFKT4Su19PiTto1ghBTLWCJrq3Ox9YaMsipS1ZFIlmmkXEhoKpae6kOAIG+tmj74UD1KNcMfryrxaU/lEL6GONdItD0XW+68R9dSEfmQJjdr2OZp727BeFGt2n8etMH+kzsw+vDQ28Qln/W65AOOQ5d1dDHSfkdJO1+An26zXkLrMlXpyhxo+rqKgiOSvELIVJbCn3iXfZfok7nbhg4wicRxRZ7F9rhIv0Ce+afTY7UTf+W1wPavmTMD7afHbN3L3b4U8knVa293KWiBjfLGHDnJuYZyIne9KC460quOKsi8LPCJRRKQ2exIQhDMX/Ci+l0ksN1dLDOJpL7pP+WbG8EbHADLXvUCzQW63rJ6KO/BphX+KxM/yABKBYi0im5yw+0SzVQ6FQPT0j+X6awScM5Zviax1NKU4HFO3nTwVGtx5xPKauhgnl546K9BecwgLcxHceAxw2qJqsmdMNX7sW1ga83MQqYV6o/hslRj1tWr2TrFl6NE00c6FcccLxVlnTibrhQ8GbXvh+g3EjVycE1xq0o/KV3nP3uKuzd4vXPO42x2DrdbNY4DsEM4YMXC30DOvWgUvqkaYCTwLOVCgiy+Magvwzuw66U/1/jB0J2LQVjgFVkNSdqP+hZqqZUVg9WVu1Rqz/S+921hFyQP+9g+kKf1uUIJbAzsUU6VRLKtq4lyNwqgVWirFm7HN4zsFpwlb4yFXfOmxD9T00mdM3lPT08qEUXpwE3VLrhCIu8dZ3DcHUUL8qY4WbxTO8hCILFRDSvPfemrQG5xuVhKtSfl2FzbTfzQpDtLIE+fgER+cVqNou3z/no+a2tip9vE7hIHfyZoiSVQlT4+DzTAp6JxygDfqcE17Irb2wpB9PqVHoTD+aq/1BOdM+tcjEcRcgxvp+13gBBdTeSRfBA0BdeISy6T1fuLjOlFT8QqNKp/KweetTjUNmLCki0RkEwDwlJC4taDnpMi0pi45t3JBbL/8HEgQKD3zyjAPSPA+35wwZoTGI1DpiX83dG1Wk8c1oQJ41m5va/tiNCwoa5DAa32+qad+3Mrj9CgA5LEBssNde17ScoQ4wr6+MI0U/V4fN29871kHaqe4pqC4L4fMFNZDZeFHygSgHfUS9oV7ywDrrKvkk4RjGF1bcrJ7pVoCk+bv4uSSclgeLN2yBCtoTvtnpRyJxRCduN6xtGUYg1gg619IysssDBtTbqE0GfxGhJEtlfmZ0FSEzKzp9LkW52UI9c8bQ7GPXuoLFVtmYZY7cyveET/RU0GhCeIOlUgJmp329VIyF6Js7UQ77lcuLbT3DAvk23TfVeDvCqa8kgZce9r7Y69u9fVC7IWuqIBjPiIUW1yiOdlhP6/0zUvJUe9ns967CMy7x4/HPiGuJrRiftAATdoU/K5ETaYxMS20sLK+VjSfoJBLCzo7+yYYraPRGMBgkpHqOp4d+QroMuOmVfSwRXJoz8CDA8XA2OSr87EfZucgv9PlpzGNzHlKXW2lBvYNqrXBVSgM1xFfckgZSnqfV3mW0hplwkYyySVNGR4ZRSxaX35av79UEXA/7NRGKpLrczJV65Oib/kSr9dzfGJW6aOtziqOC1y03aVielDYemGO2QrR3o4Y0P5Yvzdlrn/qJLcRVY5JUGalpVnAi+AynfRBbw8+1sy3InnuWulQXjCffvX6hOyYXs72bMeqX2Bp/2fRLta2G2Np5/6nAhmzRuGyOo9h5WlGJR20Hx2Ew39C5/oj7lxgPqle1WWJePZZA2dDWqktzc98vJ6y4vOKiWQk4N33nkGvexJn7qFk7cZ3zq2MNJF5sxvEhXrtA4Nf6/MRFMepZalmFPS72uMDLoI0hbyV9z67DdpRXJlPKwzQXTNhhPVKf+9KLS87yxo7/+q7mxpBLn1k4f7cfb2efz5qj+fN0ojU6FzYC1t+odkPJzLirfd0SCXzbuxeBt6Zi5197TZNPqJ9qeABJ+0FYtK19LES6RyW99ZVQqmnk3T3ZqhVGz64iWFshW98MGX2yZ3tmCQVYk6mAy4vfnKKS0vFEPRYH5m5iU4f5PfmL3ME/xACQc2/beDCy7Joa9ero7/7x3y55suHSOhuz7NPO6VpD9JtXaLsK4gbGWHUrvqc+mpM1Utg2C9NcOnuI5EtgaSuvNUE+CkyR76f15SKo6DywWS0A0itKtvHOL4Yzu9bTPs6Z5WL7vygGLSRoW9duFRn5dhV881A6sNeBaUCW1gF+0DnyqnZ4gyOxSdamVuUxodYTaTUr8rr/TvVss47ZmlMwr59y7w/ZnYmiwyuSNunkD7mTfpB06oPdB13k+VWsup836Z1WBHVfauempc0lDzK9za53aFpz1cnA9DOoX3RJzK52arJr9JNznIBpurZclebrAMRhV5fceW0R0MHOznWH6SqIQ+ZCgKR5rM/TK5HVhQrCBgvPdnVwoRJmccyy/YMUAutd9oXyIfs8RVJp7h2WwdZV34caq4u7ErdDC4pu08NJoUhervnyPqf3cOV1kXJ1mu5xiPvpWp9YWmeuGNYpHP54XPRqcvpcyrXtn3YTzR4X+g7ACojbdOJOgjMU/ausbWWONwS6HOE67VTQyp2JA92bwPUed3J0S6GnaBlM9p3uQkRpChfnORD0xOT3sy3BsdnwHmzM1fLLiyriWPKe95ZIUn6J/V87WyT0ZIxJ0D2b62PNarNNApgAq++63qaT0Y2Md+WJZA6+CEjF7wmvx69olhpYJ5WjQsMMchKWZk0x6lQ9DOdHvOsk8ul3/voxnmdxKOuhTmca7pIbgDtNyTzqmc1zk4789E5gFUs8Qe0XIZsynRkoCsQbFEDNuFFjBMmi0JaPF6ReQgEmWZUJRJyeAK/RBDSx5tdefyw1r2kaPMCwWx5SJT0tkC4U1/BGPWoOdEiOfjumucsn2W74tTCG1Hr8yS7idDxwRWYH3xEckHn/bzQ9fdvsqW/toragjkPv4Q8dF59YsZIKP+hWY0sXaGw15Yu76SD4Q0zrfO7SFRjQdHUzHuIddgjos0RdUzwbWms0y5Njp+9/GcC7FireHknj+heCZSSLSDuSUR4R0yPgVY50zCg8f7hm9CutcaaV6SEss6PvTJQ51uCnFSNyeoeQp0Pn79VG3tPJEE6x8Cb08RDtXUT6OI7sPz6+uBNYresbBpMZxrY+oJ7D8T30UQ/kOp0Yhqoy5C8lzW3HSHDbzVlkFGQSDMYiGMAsXxKySUUoq8CJAcJr4slzYSX0NyZhb8x0Jp82ggp+EEunog4yNUAtNYUmTUw5ryJp/riRBNNL9LYpP3U1npI7b4eGY08fDLB/2ai70744SrF8iZHkEYtNiFlpYrT+SSJacukz2HpPrQMRzs3coiItfsZz9Wyyh+ZHcQ4LgQwO7nCGgx4gBMMOOxtBa+ocqZ/aOFJW5PfZuQX96qPEmXJciL5TlL7rMzd9VbKm4Rhpskp+mHf06uM75ZDNxfe1hUKZeFUIXbL9BE3P66ndG1acB+MGB4Kk4wbohi9rgEyvSR8vOPfeFP2R8Pc1HTSdF2kzjXbLAPYaerjVEUCbI+frC/xFRpNxb2jpdXYd/Y10gmvOYyv2Imdp/94LuNp0V+WS1cSFDejx+I3wqMslYUdzmp+YKXFG/dcRW9M//kVDBkxTbUB1yCmX7fiGuYJEeCLXrIpgJzCWjo31I5/SvfVbdK9iiT5+Q3lx+2Un1r0G69KOWUkhhAM0+WKLHEH1da0Ssjjf0ko5HQKpFAyQzzB7EFmlhMfgoazlReVW/NqS2BKAd8YXTQsdJhfUCeV5nSDRFv7yVZJogt/NJsd8MuAvHGv1Htk2+70DUbK+Rcx0qfGKXldIZN3QFi7XEfSPL9jnCFmI3pLHPA5mXu79Jvhc9fDpTaY/QtKllhiaNP6wvPy0imhVTTw5jXWIGQ9Vif8xcObeTGnukVsGarxR7MkU8WRSr15w5NYLu9nQ6G5EvwGP3drnVezYCICalnuBbsnht+KsFM2o0aCAzQDXX1HJwq+lvTP6raYjusOb0ObSs18Vbb2NvrM0HM6WyYWKGcF+sqasnHB5UNv5IXredJash6vkmQOooe1dOI9QUQmjY34YCPXxsSdIFbfnOKEL6P96A3TBb18EWxsIPPHL7ueFdRnW6SI8PNDH0pKt8tpjmLXCGrG6GzXoStFHzsUb5iIdW6ak9ePvPq8krVKae+7+eWWh2fH03cl5AEvWAdmX7hXsLdr9PfXZnLeOm2kWvRgzRJUimKelf9kt2jqDTIUeCEW2uZh1JVtMnH+9iy77Sgmp16yO+QFtig24DDa9Im7acdGggbrdlndXm/bElPr6Gzptnnt1oVMRaumPUsrNM+kjF1cfWE5z8TspU3nXX+CVKFRhoV7yQ+GBJkZFscb7opPt/B+kx+uC7c5i+z7EZ/qd3leT9o9fTOmxebBgkOhuKpn7mg2T56jS/XXs5SRhxFjXCXb2kFSjnVdvsnG6tyCYU4Jq5pxFFCSLjdn5KQlq+M7y9mlkAVsOY6b7i3Rqr5+sO5y2neC4u1n1jd+sPVh5mnk2Tgl7q7hsv1DxYS45w+uR1Il4sJ8/RJM7rJjB3NG27XKj+qD3vJ92xHYO/TgrHuCSXeW34dvhzdFNPeeBYH1NJONXAhuW1pmRt10pbDsNF+vadixZxPcdPf5bFru0CLLGt44PiWJk6pIIA4v5JdNvQXOXGUR6dh67yckoix6SugkN0ywlTduUItzvUf8wbKiYO5BUX2ygvMDI0OMoQtylz92mTlHWWIYHBg68Vbi8lFV3rPR93WhLgUFsESBngzetytaXoTrz7c6t8Tv6k/LzdaExeWG2KY2MxoqGV9TfyZbaL/A8JJ29Wi0JW9/p7PBYfbK4mvu0Z8T+VEt3wnhbSrYmLFzOV6j2FvX6+I3HhBi6m2EU8qzsoL10t+dFZjsd6HpZIvjBOaSCNAr9diAgpOlKRVjTRiXsaVJxcpJ+PLk88tPesqxJjWR9xlseho1dc5I5rl9lK/JbWnFGIQxXyvPhN6mDpe8iauab7oan93Xf8+kZox789KC3pHHegfgYwdu7MMYh7o+Oo2kbBKoQhmF46C1S2tuaxORCiPVPrLwSj58fqcjQKoLE3g5iBLbEKSx/zNsMK3p0BROox4JHaJStVI45lnkyYzmcuSaD2HrKU1CSRhyRuF2m220rHbnyby9Im/NlBA08XM/uMdwychaMd49fzpfq8qiJzHvkDDgaYlxb5U5gcIb5nxz02zTbJlMpQ54r5KIVJmPKtWjc/QmkIsR/VDwOOx/ALLUoVYKZW5kc3RyZWFtCmVuZG9iagozOCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9HVU9XVEsrQ01TWTYKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNCAtOTQ4IDEzMjkgNzg2XQovQXNjZW50IDc1MAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAtMTQKL1N0ZW1WIDUyCi9YSGVpZ2h0IDQzMQovQ2hhclNldCAoL2FzdGVyaXNrbWF0aCkKL0ZvbnRGaWxlIDM3IDAgUgo+PiBlbmRvYmoKMzkgMCBvYmogPDwKL0xlbmd0aDEgMTQyOAovTGVuZ3RoMiA2Mjk3Ci9MZW5ndGgzIDAKL0xlbmd0aCA3MjYyICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o10B1RTa7M2VSA0AZUmsEFAkZLQpal0kSJNpEMIIQRCAiEJIEWqFEWk916lg3REutJ7U5AiTRABaaKAXiznnO98/7/WvStr7eyZeWbeed55ZvNx6xoIK9pibOBqGDROWFQEIgsoaxsaygAQiLgIBCIG4uMzROJQ8D9uEJ8RHOuKxKBl/wOgjIVDcac+FSjuFKeNQQO38ShAVBwQlZIVlZaFQAAxCETmLyAGKwuoQAlIW0BbBLiNQcNdQXzKGGcPLBJhjzs95q9X4ApMABCVkZEW+pUOKDrBsUgYFA1oQ3H2cKfTE2FQFGCAgSHhOI9/lbgib4/DOcuCwW5ubiJQJ1cRDBZxXUAIcEPi7AF9uCscS4DbAj8JAzpQJ/hvZiIgPsDQHun622+AscO5QbFw4NSBQsLgaNfTDDzaFo4FTg8HDDS0gDvOcPRvsNZvgBDw524AURHRv8v9yf5ZCIn+lQyFwTBOzlC0BxKNAOyQKDhwR01LBOeOEwKgaNufQCjKFXOaDyVAkSiozSngV+dQQE1RD4CeEvxDzxWGRTrjXEVckaifFME/y5zesiraVhnj5ARH41xBP/tTQWLhsNNr9wD/nqwjGuOG9vxj2CHRtnY/SdjincF30UgXPFxD5Q/k1AX6x4eA4wBJCARyTVwUgLsAcHeYPfhneUMPZ/iv4C/3KQNvT2eMM2B3SgLujbSDn/6BPF2hBDiAw+Lh3p7/Gfi3BRIVBWyRMBxgA0cg0aB/qp+64Xa/7dPhY5HugBnkVHuiAOTn7+83i1N52WLQKI9/4L/mC9ZW01ZRVBP8zfjvmJISxh3wFJYChMXExQFJCTFASuYa4P3vIn/T/4v6L68uFPmnNcg/9TTQdhhA5jeD06v7iwXhjyiu/FkYAeDfJ+hgTpUMB678I3xziCQEdvoQ/T/L/1fK/0/1P6v8b8L/74bU8CjUr/CVX/H/Jwx1QqI8/gBOhYzHnS6FNuZ0NdD/Db0H/73I2nBbJN7pv6MaOOjpciiiEai/rxHpqoZ0h9vqInEw+19y+WsIp9VRSDRcF+OK/PmlAYRFIZD/ip1uG8zx9GviejqqXyH46TL9+0RVNAxj+3PrxCSlACgWC/UAQU7FJSYpCXiKnq6nLdz9l64BsAgagztNAU7ZeQN2GCzo50BFIWIA+JfvtykKAcDo/zBFATDmP0wJAIz9Zf6rCRgeiz1dzV8qOe3wL/vXdwAOd4fDQG8mMDC5QIfKwBeH5YrsbsLLAwqjfMv3EgSEPd9gm/Df6ChiBcpS/OewB4qx3W1nZxZVr+zffMt14vmxvooiuCFar/HI69gqUn94uRE0NXTh1WDOR8XnnRxUF4UNb654nbh4Gfk5ktYTN9/my3DBX6PTzWI6dOtQd3/eWTjd93BiWW+lTEqT+rhwRDj87mNzv/wxvkyb1HEWnjM4YQ7Kq4zb7vRj+wejjOmDP7huRwqCvDfCxXM9TefFnnwdv/+u2FDMtYWVl9WUhYN0n7FvmN9T6UPcbeZJz4K8x3MKk2kQARGiKXRr1raSreUBOJdbTFh9UtBnJ89mmEj6OaBzyI8K+G5L5Eqyn7DAh5Gs3RbXqTvqHyLTrYDJbN4VijH5WOEPOU+uVdl8sFrRI3hHsdVWvl43FeHyad2fG2meZj/nniOnJHhcbVzPP5Mu8ABTmcgIOip5CdX4bE2cm6e4JdLL1BqEseoERvyLbFMTLd5sPLvpGk/qzN0+PRkv1/y1WfB4fhOAFWgnPxC4C1x1yk1rHYnMkhBkxfBmkXDdrQpQhcWoXi05tiJVB0Xun++hsBUpbrybPSozeHjwNvdSgsXKNW7aeANvMDQ+vzHnQtEaT9cB14jENVUjedrriTpyKWw1oxRpM8sHTWYyvezR3Lk8OY5Wj0Yf8hLpD4/aMI8nDCM6dylpuvFP3AtGjbTtN8a0eMV1SRKmP50beePRSCeZUnxOqBnDMyR9OWS14eqZT6o5gfJkFabEP0bX8mGNnwv7ba6FY3mt1VqWKGfzwRWp37AHe59eBL07bLPwjZZV2t8lXdYw5/WJVxiLzKpa9x0MCajNepJw4U3vucOulK5m7qX1uMrWCr2WKoOrZFZaAx5Lxj2Iq03cl5Tk1GzPeXyToSWoiTS4t/Hfm/FlHlwdgYVqmo2svSz55rBXAgqY+UxbOWeYImzvUJcwRtYSRSk7UbneZwPrHM1yZ//qM4TgdGQhgzxIssw2jbMYKKjifywujnj8WXxl3c1J7AtZyxNnpccpGn2+5HShsj4RLsVqdPNr/qF4+XeWLETbGqoKg1eHbw+JlJi6PRyBbZKJ+zFMXGPfMKmYEBE966Cp6BouV5+73dH45Iv1gL7lmAeXsp4EpUdjyJPZLrplmprX/J6s+IhtPYQaaIg1l4Cq1M3cqntWntXX2gLqga92KKh7oNxA7haEnAaGsDPZ/N+aGTAydrVvkXovnKvaOmeHPSic9MawSMoLDk971Uinzftb7lIwKhHhC6lkXddWOYJLEgNfe0h/XMqieBGRqn952bCJIrQxaIhkyBPmh00Bb9tshN23w/d57NfNvqJgEbbSPLF/65MGuF44iMwurhstuQ69En8/Nu6R3X3uSyd5QYR3pvgXc0SmKzxG7XdVu9O/uZUcngjvEV8kutn44MwisEZyoeYNElg6gmoIJlDrr5/ta67QjfuR91LO+IUyIAVv+siR3CK46RAKn+wxq26R/sx8IGzpEEWc9d5s69xbVhAbIvRJucyjs6HiJTRT7UGvmFWetbJFfQ0JpYLx0VTUTSVOe5TdVlZ4dp98PeYTM8OIGQ4gJCbG9Dy77m+00ile4JT4o1SGudV/O1XhnnNeiOAiaiKiFT0ZzCWOyCi4JP1KtkfPj6X1ZrWuz4jwBv7maIXKlpE5u6vBsyi57+5yoIDbpcWDtKWXnSPiiXdADR43+r5HWCp37zPufNWgreF9ekvdJAM3as1GG0hJv2Y+zayV4sB3YlecMkDq/nptw+BMMsXbx9iNdzMvC85BvssppKHkypfafTO0hzWuYwDltWoeEJXTq9nnEY17hRqxlrI95+94NeNFLN8P6zCs4nfZUtxsrDeGZRokr1fmHM5S2t6+HURT3rEN+bS3a/w0b7ubw/kgncxsALf7bp6Jk7wb/4HLkm8qb8ea4/I+CGL4IJOGTMOTiitIykEhk/UbSZ9b2BRVd1Nu89tQysbeTumHrIddCScvzwxObzB1fn0r6/kt79wz+v30huAbqFtVLxIFduJXr0XcKbXLyXIyRguFPedM6J2Lp9VNImlCIr9PdVsY89PFflI6cvdkS5DkeF1sd1H1Zchs6UsVdtz86v0JGXSvR6ZSEGdnB5C8iBOkWpJ4HEL2vec8vVCG8yRv1k13/hMvzq2OAolbPhKMm49vSxco+c8nyWclD7UVnVOu6NZdGSJO8Wv1xt//0OaV+gXRzkCMFb6QxCDLlvEBv0S8m8m6N2/WrvLBXA6QN96fsXZjG4VEcIZ2a9hbjJKU61h4LPICXmLTC7XHP5zPL/CzKHGAXjrzPAjLnbk0rn4btk5EpZZ6wGmShgn3pmxWTMgbYDoaXcin6BX4GHGCUO06ZITp28YjiBpWd7+mC1mpnU3Oxngx4ZfMit+fOxjT0xCGned1LYubJ9PfCj96dja6t19kjfBxp95CPjXpQGPwgcEzeiPhBGHlMHvD1+5qdKDYizjej/45OUyDHzZjr+lvaqexTVJAxMRXkv1mUeHlltmOpVrfZItK6Km1uK68HePRah+j+cHprxD2Jc0A63B0NvYz9YknqazTD8904jdzzBhdkwWHFHr/UAAZcf68paSD77PiocaoxEsn6tW6te+mAywlzLTjzD/V+Q0w5BPvl4RErnrYSPnntD19vTiU605uP55APQQ4yNTcR3SJJHa17YAb3kuoMXMtJeWEZeXkTs/RxShKH50nM/B+eoVlctWrrc6tiYHf/S4HcPM5wam6itjPhqI+qjaBWEBbWotSOQAELztZ7CwPEeUYVRx8PuoV41I3xkGWwnIiK8n1ubNJjbjadSf8kEnTcvvDg6692cQ+dvUg7l6lxDA6Z8toJmIm+eOEV/oqGV5ZF/mdK49I3gV2xys4s2zb0n9oUngXRib+2kFl+QdhrSuuZHdGFPTqI/TwjP4NdJdK/o4qu+81Nip/0cHWHy0TYqCisNurSlw4C596R6ZetRn88ybijsyHTPa3b+GJfbI6usgKGj5F58WEL41k6WWkfVqgKL9MNfjgbcqQeoYoeRE/BYS7SXgb7rrhKXtL+J6f76poxX7DMTN8Vr22YeER6Rh5oekbr7ZgAVUZGV6pgk+5+d90bgCBpi2apuvZOYQD+NjM9G7vDVzXB+x084MMMd8Drdpz8ypTW0nWLsS1hJDCe53cY6QGac7EX0rOpNdJAGq0e75z6yL9va0hGYW0zw9Fx9+IF5a03o8+rixAJi6c5IHs3i/E4eq8SJo3TCuveF3dWfEzjuLlVVUlfv6O3f3aElI3n1K2aeEb1SI12L7Mgl5kiJK+HlFcny6EfdZrEvVuN8zp5TemNN4ZwGWwvsNRSK8y0r6NnfPMrmRgZH4qt5KFZUV06mt7hYP1Q9ZbZ9rVFGi7W5qiPAM1T6YjbHp4S6FxNDVzU4UyLynNvJjk/c6ZN/hg7lksJfRmeCs4y+neuiMNoqBmMKr27yJqMn6xeovXIPfGpVXkyTuDPfuyVw3UxViSqSr9RMb3TPeUL2+mIOiUdF+U98JDkDTnzc6o9oatDuGRHoSmm+7Ore7xA2EkIaOWuWeC6YXMeyA/Zr8u8W3rONz4PDepSKsf8Hjt5gOvAs0W3a9nJRTBIWd3fCuE7y0MpMamfkoa2WS0jH93znRJQ1gme6IzPEO3zIeJNQYZGB2lsW2y+B7LVUR3R7tCsv8s9kcRd7AtaTqif2HI113IO1Doy/SFT1lJarfQqk2ctUnGnCo8X0fpLDKCiE9QvPy0jPOThCYRk+vefowZFTZ3jzRYDDwTu8Wk3yp8Jn02skFBo6aU7Bg4exmUt+oLBJOK+PB0dD3YW8Klf7rDcl9YXP+IPmzlTa1pv1l8fGQ0/8hit73K9y9e5Yp6c+rKtwBZ88thddbQ8OGARbH6A08FTMZ1cjzZEP8TyEn9XGOMHPxhKUTUwmiAslMMVnCYk/LkuXVSxsNo5Y7bon6M4PRhrbJ732kTTGCO3ZU5OaFDlOQcVPvt3rD8a2+JtZS9Cio6EQF8L0yKuGREHkfuVN9I3mVJIm6Eh1YOCfr6j9O16474HWxpSAh5X8rwIFKdCk48sOAz7LvedxKw/ZbRW6jVgCqH+8HVB60iuzk0VNEJhATc8pD0wy+7HMxmrHdqs9u4KvTJDotMaoKZHnaf2diPM0gxGCuUHE9DCV6n63/ygqiiDkUvVbZ8t9SkYevZ5ZKCr1ZZznxkFFsK5ccWlrKOYkAni00zufhIJQFPYv49ICIi3pE76WHpKjr1275Y36OAm3p+kVeJmJkIw95jkvfFneanknbAr/YLyp4Xp7NWWdGH7vo0rw2p220TMatvFEZGS8T4C+WWPFpXyJM8OuTLfFtvsaSaeivMDt097ev+6JX+xaqdb+laYK7L9YA0pUhK7eJnOPmXwab8wKdlwcHs0BF17+Uglg9t9NjKTJDPFwGaIgt53ljy7TIxfHUOu/wJQX5nUkeXyStLsetYnc0xp49ahELXpOTV8CjnHbmCxiYl/ZSLAiXPMMVrRuvl7dsG31fkO/wT5KCdepyij/H3ISGaHXwc+t0EYjRCLtKzlLDvWNTJvjm05DMViu61DKIIbbl2c7ax0OSgdrzuyhRbqfv2m9gruNdc/MYmO8KNJdJXi9h3IFvu0QJ9qps45WY3OQSUR1Syw8LM7jlKhGr+g2n4Sk6fhs0TxIWn465u84bh/EXP8kz76k4EVIJulbA+xBXCaWr6pLLqaH3aJL9M1txIYZsqzagafE1+tNDaRjHnGLLEEXQRKyJQE4uqOsiM7XK3qmTmvBGiV3JvWFwsiCLpCqpg8SMtR9jKsJffnUkbYbW41WELkbiLpfqpuirnY+THKhZVju7Mq5DXJVuotJW2aZFzKZCBlxO7slro9ls1N8++3i8pz7GemO9WC0DoWfVogN6fJ0cfueiWNTbUFlldSUBMqbNr8jt1NODq7retHZdYERdiqCetJfLvS+QIh0tTijpu2dK7xj51KzB3pzVNj7pGWkW75mGemKRfQ8KeNTeysT2IIuq7OcbpO50ctDuz0lZdxUtWULbdf+lRN3sb9HKt55j/U+RzJh9NlMPwspHS5ufN6Pt3qx6AjUVpDDKXXBTqvtvzS+N3i8jU94wKPlAqWo21indoH399v+DTZhmUjFshgQRXkpCo88u/7joam4z1HmHZPrSfrW5/tPQNEtidA3szUv4xIvY6fSBRzV4kRiqkSWDOU08pptjY7NKscoeGuEPAd/huVAhYx5c0veGuMYNgzkdWognr4A+RPGHkZ3XNzI/miQIalhSNG6BsXsgcsrgYmlvoEi7HeiG2WurRG9SRt8OtPMQtGdrIYf2H3l4XoDhmuiaq4/AL8qTv5UQJUTczZz0ZVEeKi7p66Wlpks5ltYKTVDekBW/QsVtXjwlKtxlyjJEndIeAs9J9ssWistTgy4/DajWSdyUFDEoZjN9wEXTCquABKdFBXVRKI6XNTh5toR1WohMSuOPOz58yvoyh4iFucT9A4pouIMP3X2cGwxlL+trNi4lHX9zfehKFulgYbMFnk0vmfIJIneGSVqdkF2jCvS83mzcKHdbJfDn13ef1Hcu84ITVx2O0HCQE67CiY4L1cLATPagzxDjDvq7gJP469kJFs2yADJxd1GBPR3ljnhe2MnXIRxNK33dun5erLU/IMFP7jFjYoPKdd8dGmfB0hdjD1wYk0gv4bL9Yq4hAOk/3FNrYt7wbspdMd5AvRXuCC1Ep1B607TWWXnpHaZnlWoMhsGZ+1qFb6CiBGUqqwYKer11e9nCWdpZ3tC3en+mSNQ4btAf3KLNex94b375KLyhsWvxxTsh2ttDDLrPAiTCWbIGj+i5HxsFu/ZbBD1M1xWoRE3bvVjFj+ad5E9J33syXdXWsGwzwSnYXeIVSt8ZjR7UOxpZ2axW+udE7PYc4sRtRnh1bpopD+SVShxjeQeNYs6UmtXmMewMWLx74ubxYVnliB+lxcpW5wdGRlmSVFLHihL5lvagYpDjJ4DSS1MAKmpgpiYZGbWXFEX14vOlgh+67OzWd+LhdOS25HpqNqwU/nlntWGki2iFMz0zOvdV1uajKq6NrafUmyN/26wdCRd1BPg+9YTqRshnwvdmroIkuz23ET9RLmnEvXolv9EfNBzt/rmzmeyXhPLYtC1KUehQa0KYvI6kP6TpVRRbkXxqkIlO+tsYzjScKMI0LVqdR9/ENdZKZWMtRRcSHlUpyB2titAwa43XGOaMO7HXtl1S239boRyayCL8MLK1nM9hZW3kUuNp4g8pvJ295PMfg2hEZVxh3YbxQz+AF6sAiwqAO88VKM9IXgHU3jxIFdCWqTXKCq+3SE1ZbtwaKtXt8JqjQlz4XmGXBVf7XS00L5OBjaq2eOpcyPEc+effckPY4RICYEuxZDWqDsmjmrXGmeTw0V1kvfNBT5td0PYNH9Yzdrk3yOis1SYKc5cWGqE6oGSMQAy/n+Ak9XbesNIryBJ6/fqelz7Jw9UkFey25Xhui27iMCJ9kJDQUxVPIZ/X0GcdTrYHAHB4Jwkx9btubZwTf9kbT1/vc5KDl8b7NozmTm4daYaHnPB/0EeYaIgX9KB4N6Fw1uRDdK+iCtDik3ARbagkscoZVhXFEsTt5zImyKeyGBGuuVzM9oU0s8/FEVuM8R9Bvb1x+GCxWacsmVL3UlDzAMIQN2cRFzj3v/hJzIPxCbSaoJI8xLOdMiBqKlVqLyiOU1O7VitoN7Q++Vln+765CWxniHnOy10+RdLSySY43LI02xbY95m4sDs22zacVo3u0OJBMh/xW4AbmGZRzsbu3w/Mk3pKydBHCy4DABG6VQe/tZhLWnUSO+7OUplvAsJtpnrLNtjy+it9qWQiDhxa63soU21f5KRzde+T2Mh19pWYejtC5dweQ8DWM01oaiw1rPUZYZEYdsu8G9Rk5ldWWEOdp27t/WUrX5d+6MuSZzr6y4484yhqynMhm7jqh6sgZi+r1+lTRcGXD1rFrma15A5w5MNMQfst3LIbUZfD2Zbdipc1sXGkTe75vvN+DNMSdd9Z3KjJy52Bje/XRNKXmKZpXd8EJ/QxHVWdL6ygTXyCeVsqYHshDCEtKkbV7nPc0FeIfLOlFWkBlzsoPthjJC5dow20svWZ9s13Ys1t4OiwH+yb5UUwZXmsRrusI5I9hPYUarhZGhrV97CjZMuBkRsTBOiJLjNW6Mlq3GxQINW5LSWrXQFUXwcMOR0983V41XRgmvWFaquPkr3z3wcOqb1O0x5ETEbFyKN8WGJmcpUJ+4ZcXYKIeVb9LH+eDXHgNnMfZqdgNWyi2mQEasIiLpqJqPzXnilRcBP3nkrze9Xbrfj0VZsXBwiGOyxPoPCkyijsFJ+oji7wLlCr9UXtcZnqNq9dc5XVUpBIQsmU6sQXeEdci+pvw0d7ZUFp4vsLDz5ISftUCi0uSzP74J7VIfP5t+l1RDm2zj1VPnZPcRut55kO81BDeTLZ4jX7rPMJJwuCc7xnvi92By3dPWr9qTpWEUrtbQISubdHofVaTUrmo03Zc95lGXm8DJoOQFMKfNWXkwXPORQo0iVZeZJl/rAJRei45CWg/8c66ZvO9f0HoQAhQfwkTgIHQ6+Sxkxz+ADZnTUgR5RWylTAYcexg6MzmI3diP1MYDm27bKrtmHFLyyXyBa0Yk5Zq9MRK84my8Bj51OubC+F07GE1NALnNCw0SJgv6VhyjpgSVW/rXnL0HqDjLV9Oi5CyIva9YbNuO5d8mEVxd0HFswz84SXBZnYO0Sw9OBTC/p4i/odKjXB7TllG+oSGdLelc9Ctp4mfgw7Q8lsYVHimFDhTPkiBGYhr2U2fkPmuazQ7auMwV55O8wmnRf9ijt1f4gSyVhgZ0hBHU8oW6sX1hTF8TCFnU8HQNq397sOqXfib6+18MYbc189uuXS4fMnLZVyk4xw4GUnhm/P09XGrVeZEn6wNmMwpKYXdNHCv9UibTDTzOjwrYAL+Ed60XoZJGzBu4lgw962mnVXmfeipnSXMtirHxK6cekl+0CvR1NyIKPAE3yu1I9+2c18xvfdcImfCxY6jveiXGjXQGoKhE7OncIRpQnXZRuKOD6NpvVTu19x74WPwc4rmiqJtiwxS5Q0rDTWhm7WtgoalMlZsZavZPY54uUcOkj9Yols2YoQD+nRlTTdWk5fx+qFuz9wcJR6aUQZTv832XogZJGbSaGYK1Q34zL60ryRZziUT9drPG8qqxr1HnhcnLUt0eB5MgEtR9KSHlZ6VX/GSnBwqDM7de+da68ZaQW4ZYwDOlyg5THCpGWvmUxXMK5bjkHPc4r/W12CheT08Of3JVZ4lv3YGa0WDR01mfUmB6xzjokLQc3ukfG6xsIT19/vTqKeVAylXqMyCWRsky4VaZsT7Vibuv8GGxC7XToegrvebyXdbtw9p5HgLpTWptCKqTLk+yf8P4ygJngplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL01GTURBRitDTVRUOQovRmxhZ3MgNAovRm9udEJCb3ggWy02IC0yMzMgNTQyIDY5OF0KL0FzY2VudCA2MTEKL0NhcEhlaWdodCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNzQKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvZi9uL28vcikKL0ZvbnRGaWxlIDM5IDAgUgo+PiBlbmRvYmoKNyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9RWktSRE0rQ01CWDEwCi9Gb250RGVzY3JpcHRvciAyNCAwIFIKL0ZpcnN0Q2hhciA2NQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTkgMCBSCj4+IGVuZG9iago5IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dYR0dCUStDTUJYMTIKL0ZvbnREZXNjcmlwdG9yIDI2IDAgUgovRmlyc3RDaGFyIDQ5Ci9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNyAwIFIKPj4gZW5kb2JqCjggMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvUlpQTUxTK0NNUjEwCi9Gb250RGVzY3JpcHRvciAyOCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTIyCi9XaWR0aHMgMTggMCBSCj4+IGVuZG9iago2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1BIQlhEUStDTVIxMgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9GaXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDIwIDAgUgo+PiBlbmRvYmoKNCAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9KVFlNS04rQ01SMTcKL0ZvbnREZXNjcmlwdG9yIDMyIDAgUgovRmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMjEKL1dpZHRocyAyMiAwIFIKPj4gZW5kb2JqCjExIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1RLSkhISStDTVI5Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL0ZpcnN0Q2hhciAzMwovTGFzdENoYXIgMTIxCi9XaWR0aHMgMTUgMCBSCj4+IGVuZG9iago1IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1VFSVpZVytDTVNZMTAKL0ZvbnREZXNjcmlwdG9yIDM2IDAgUgovRmlyc3RDaGFyIDMKL0xhc3RDaGFyIDMKL1dpZHRocyAyMSAwIFIKPj4gZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dVT1dUSytDTVNZNgovRm9udERlc2NyaXB0b3IgMzggMCBSCi9GaXJzdENoYXIgMwovTGFzdENoYXIgMwovV2lkdGhzIDE2IDAgUgo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUZNREFGK0NNVFQ5Ci9Gb250RGVzY3JpcHRvciA0MCAwIFIKL0ZpcnN0Q2hhciAxMDIKL0xhc3RDaGFyIDExNAovV2lkdGhzIDE0IDAgUgo+PiBlbmRvYmoKMTMgMCBvYmogPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFsyIDAgUl0KPj4gZW5kb2JqCjQxIDAgb2JqIDw8Ci9UeXBlIC9DYXRhbG9nCi9QYWdlcyAxMyAwIFIKPj4gZW5kb2JqCjQyIDAgb2JqIDw8Ci9Qcm9kdWNlciAocGRmVGVYLTEuNDAuMTApCi9DcmVhdG9yIChUZVgpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA2MTExODA4NDYrMDInMDAnKQovTW9kRGF0ZSAoRDoyMDEyMDYxMTE4MDg0NiswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQovUFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjYtMS40MC4xMC0yLjIgKFRlWCBMaXZlIDIwMDkvRGViaWFuKSBrcGF0aHNlYSB2ZXJzaW9uIDUuMC4wKQo+PiBlbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMzMxNiAwMDAwMCBuIAowMDAwMDAzMjA0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDEwODgzNCAwMDAwMCBuIAowMDAwMTA5MTEyIDAwMDAwIG4gCjAwMDAxMDg2OTUgMDAwMDAgbiAKMDAwMDEwODI3NiAwMDAwMCBuIAowMDAwMTA4NTU2IDAwMDAwIG4gCjAwMDAxMDg0MTYgMDAwMDAgbiAKMDAwMDEwOTI0OSAwMDAwMCBuIAowMDAwMTA4OTczIDAwMDAwIG4gCjAwMDAxMDkzODYgMDAwMDAgbiAKMDAwMDEwOTUyNyAwMDAwMCBuIAowMDAwMDAzNDc0IDAwMDAwIG4gCjAwMDAwMDM1NDQgMDAwMDAgbiAKMDAwMDAwNDA3MSAwMDAwMCBuIAowMDAwMDA0MDk1IDAwMDAwIG4gCjAwMDAwMDQ1MDEgMDAwMDAgbiAKMDAwMDAwNTEyMyAwMDAwMCBuIAowMDAwMDA1NDQxIDAwMDAwIG4gCjAwMDAwMDU5MDYgMDAwMDAgbiAKMDAwMDAwNTkyOCAwMDAwMCBuIAowMDAwMDA2MjU0IDAwMDAwIG4gCjAwMDAwMTU4NzcgMDAwMDAgbiAKMDAwMDAxNjEwOCAwMDAwMCBuIAowMDAwMDI0NDIxIDAwMDAwIG4gCjAwMDAwMjQ2NjAgMDAwMDAgbiAKMDAwMDA0MzkyNSAwMDAwMCBuIAowMDAwMDQ0MzQyIDAwMDAwIG4gCjAwMDAwNTg3MzMgMDAwMDAgbiAKMDAwMDA1OTA1NiAwMDAwMCBuIAowMDAwMDY5NjY1IDAwMDAwIG4gCjAwMDAwNjk5MTcgMDAwMDAgbiAKMDAwMDA4NTU4MCAwMDAwMCBuIAowMDAwMDg1OTMxIDAwMDAwIG4gCjAwMDAwOTMwNDggMDAwMDAgbiAKMDAwMDA5MzI3OSAwMDAwMCBuIAowMDAwMTAwNDQ1IDAwMDAwIG4gCjAwMDAxMDA2NzQgMDAwMDAgbiAKMDAwMDEwODA1NSAwMDAwMCBuIAowMDAwMTA5NTg1IDAwMDAwIG4gCjAwMDAxMDk2MzYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MwovUm9vdCA0MSAwIFIKL0luZm8gNDIgMCBSCi9JRCBbPEE1MTIyOERDMEI2RDhERTcwNDA5QjM4RUY1MDJDQkYwPiA8QTUxMjI4REMwQjZEOERFNzA0MDlCMzhFRjUwMkNCRjA+XSA+PgpzdGFydHhyZWYKMTA5OTAyCiUlRU9GCg=="
+}
+
+
+///////// Rest taken from generated pdf.js. (c) by Mozilla. ////////
+///////// File unchanged, except that all references to DOM- ////////
+///////// specific global names have been prefixed by PdfJS_window., ////////
+///////// to avoid interference with the benchmark runner script. ////////
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+var PDFJS = {};
+
+(function pdfjsWrapper() {
+  // Use strict in our context only - users might not want it
+  'use strict';
+
+  PDFJS.build = '3cc61f0';
+
+  // Files are inserted below - see Makefile
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var globalScope = (typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window;
+
+var isWorker = (typeof PdfJS_window.window == 'undefined');
+
+var ERRORS = 0, WARNINGS = 1, TODOS = 5;
+var verbosity = WARNINGS;
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+  globalScope.PDFJS = {};
+}
+
+// getPdf()
+// Convenience function to perform binary Ajax GET
+// Usage: getPdf('http://...', callback)
+//        getPdf({
+//                 url:String ,
+//                 [,progress:Function, error:Function]
+//               },
+//               callback)
+function getPdf(arg, callback) {
+  var params = arg;
+  if (typeof arg === 'string')
+    params = { url: arg };
+
+  var xhr = new PdfJS_window.XMLHttpRequest();
+  xhr.open('GET', params.url);
+  xhr.mozResponseType = xhr.responseType = 'arraybuffer';
+  var protocol = params.url.indexOf(':') < 0 ? PdfJS_window.window.location.protocol :
+    params.url.substring(0, params.url.indexOf(':') + 1);
+  xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
+
+  if ('progress' in params)
+    xhr.onprogress = params.progress || undefined;
+
+  if ('error' in params)
+    xhr.onerror = params.error || undefined;
+
+  xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
+    if (xhr.readyState === 4) {
+      if (xhr.status === xhr.expected) {
+        var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
+                    xhr.responseArrayBuffer || xhr.response);
+        callback(data);
+      } else if (params.error) {
+        params.error(e);
+      }
+    }
+  };
+  xhr.send(null);
+}
+globalScope.PDFJS.getPdf = getPdf;
+globalScope.PDFJS.pdfBug = false;
+
+var Page = (function PageClosure() {
+  function Page(xref, pageNumber, pageDict, ref) {
+    this.pageNumber = pageNumber;
+    this.pageDict = pageDict;
+    this.xref = xref;
+    this.ref = ref;
+
+    this.displayReadyPromise = null;
+  }
+
+  Page.prototype = {
+    getPageProp: function Page_getPageProp(key) {
+      return this.pageDict.get(key);
+    },
+    inheritPageProp: function Page_inheritPageProp(key) {
+      var dict = this.pageDict;
+      var obj = dict.get(key);
+      while (obj === undefined) {
+        dict = dict.get('Parent');
+        if (!dict)
+          break;
+        obj = dict.get(key);
+      }
+      return obj;
+    },
+    get content() {
+      return shadow(this, 'content', this.getPageProp('Contents'));
+    },
+    get resources() {
+      return shadow(this, 'resources', this.inheritPageProp('Resources'));
+    },
+    get mediaBox() {
+      var obj = this.inheritPageProp('MediaBox');
+      // Reset invalid media box to letter size.
+      if (!isArray(obj) || obj.length !== 4)
+        obj = [0, 0, 612, 792];
+      return shadow(this, 'mediaBox', obj);
+    },
+    get view() {
+      var mediaBox = this.mediaBox;
+      var cropBox = this.inheritPageProp('CropBox');
+      if (!isArray(cropBox) || cropBox.length !== 4)
+        return shadow(this, 'view', mediaBox);
+
+      // From the spec, 6th ed., p.963:
+      // "The crop, bleed, trim, and art boxes should not ordinarily
+      // extend beyond the boundaries of the media box. If they do, they are
+      // effectively reduced to their intersection with the media box."
+      cropBox = Util.intersect(cropBox, mediaBox);
+      if (!cropBox)
+        return shadow(this, 'view', mediaBox);
+
+      return shadow(this, 'view', cropBox);
+    },
+    get annotations() {
+      return shadow(this, 'annotations', this.inheritPageProp('Annots'));
+    },
+    get rotate() {
+      var rotate = this.inheritPageProp('Rotate') || 0;
+      // Normalize rotation so it's a multiple of 90 and between 0 and 270
+      if (rotate % 90 != 0) {
+        rotate = 0;
+      } else if (rotate >= 360) {
+        rotate = rotate % 360;
+      } else if (rotate < 0) {
+        // The spec doesn't cover negatives, assume its counterclockwise
+        // rotation. The following is the other implementation of modulo.
+        rotate = ((rotate % 360) + 360) % 360;
+      }
+      return shadow(this, 'rotate', rotate);
+    },
+
+    getOperatorList: function Page_getOperatorList(handler, dependency) {
+      var xref = this.xref;
+      var content = this.content;
+      var resources = this.resources;
+      if (isArray(content)) {
+        // fetching items
+        var streams = [];
+        var i, n = content.length;
+        for (i = 0; i < n; ++i)
+          streams.push(xref.fetchIfRef(content[i]));
+        content = new StreamsSequenceStream(streams);
+      } else if (isStream(content)) {
+        content.reset();
+      } else if (!content) {
+        // replacing non-existent page content with empty one
+        content = new Stream(new Uint8Array(0));
+      }
+
+      var pe = this.pe = new PartialEvaluator(
+                                xref, handler, 'p' + this.pageNumber + '_');
+
+      return pe.getOperatorList(content, resources, dependency);
+    },
+
+    getLinks: function Page_getLinks() {
+      var links = [];
+      var annotations = pageGetAnnotations();
+      var i, n = annotations.length;
+      for (i = 0; i < n; ++i) {
+        if (annotations[i].type != 'Link')
+          continue;
+        links.push(annotations[i]);
+      }
+      return links;
+    },
+    getAnnotations: function Page_getAnnotations() {
+      var xref = this.xref;
+      function getInheritableProperty(annotation, name) {
+        var item = annotation;
+        while (item && !item.has(name)) {
+          item = item.get('Parent');
+        }
+        if (!item)
+          return null;
+        return item.get(name);
+      }
+      function isValidUrl(url) {
+        if (!url)
+          return false;
+        var colon = url.indexOf(':');
+        if (colon < 0)
+          return false;
+        var protocol = url.substr(0, colon);
+        switch (protocol) {
+          case 'http':
+          case 'https':
+          case 'ftp':
+          case 'mailto':
+            return true;
+          default:
+            return false;
+        }
+      }
+
+      var annotations = this.annotations || [];
+      var i, n = annotations.length;
+      var items = [];
+      for (i = 0; i < n; ++i) {
+        var annotationRef = annotations[i];
+        var annotation = xref.fetch(annotationRef);
+        if (!isDict(annotation))
+          continue;
+        var subtype = annotation.get('Subtype');
+        if (!isName(subtype))
+          continue;
+        var rect = annotation.get('Rect');
+
+        var item = {};
+        item.type = subtype.name;
+        item.rect = rect;
+        switch (subtype.name) {
+          case 'Link':
+            var a = annotation.get('A');
+            if (a) {
+              switch (a.get('S').name) {
+                case 'URI':
+                  var url = a.get('URI');
+                  // TODO: pdf spec mentions urls can be relative to a Base
+                  // entry in the dictionary.
+                  if (!isValidUrl(url))
+                    url = '';
+                  item.url = url;
+                  break;
+                case 'GoTo':
+                  item.dest = a.get('D');
+                  break;
+                default:
+                  TODO('other link types');
+              }
+            } else if (annotation.has('Dest')) {
+              // simple destination link
+              var dest = annotation.get('Dest');
+              item.dest = isName(dest) ? dest.name : dest;
+            }
+            break;
+          case 'Widget':
+            var fieldType = getInheritableProperty(annotation, 'FT');
+            if (!isName(fieldType))
+              break;
+            item.fieldType = fieldType.name;
+            // Building the full field name by collecting the field and
+            // its ancestors 'T' properties and joining them using '.'.
+            var fieldName = [];
+            var namedItem = annotation, ref = annotationRef;
+            while (namedItem) {
+              var parent = namedItem.get('Parent');
+              var parentRef = namedItem.getRaw('Parent');
+              var name = namedItem.get('T');
+              if (name) {
+                fieldName.unshift(stringToPDFString(name));
+              } else {
+                // The field name is absent, that means more than one field
+                // with the same name may exist. Replacing the empty name
+                // with the '`' plus index in the parent's 'Kids' array.
+                // This is not in the PDF spec but necessary to id the
+                // the input controls.
+                var kids = parent.get('Kids');
+                var j, jj;
+                for (j = 0, jj = kids.length; j < jj; j++) {
+                  var kidRef = kids[j];
+                  if (kidRef.num == ref.num && kidRef.gen == ref.gen)
+                    break;
+                }
+                fieldName.unshift('`' + j);
+              }
+              namedItem = parent;
+              ref = parentRef;
+            }
+            item.fullName = fieldName.join('.');
+            var alternativeText = stringToPDFString(annotation.get('TU') || '');
+            item.alternativeText = alternativeText;
+            var da = getInheritableProperty(annotation, 'DA') || '';
+            var m = /([\d\.]+)\sTf/.exec(da);
+            if (m)
+              item.fontSize = parseFloat(m[1]);
+            item.textAlignment = getInheritableProperty(annotation, 'Q');
+            item.flags = getInheritableProperty(annotation, 'Ff') || 0;
+            break;
+          case 'Text':
+            var content = annotation.get('Contents');
+            var title = annotation.get('T');
+            item.content = stringToPDFString(content || '');
+            item.title = stringToPDFString(title || '');
+            item.name = !annotation.has('Name') ? 'Note' :
+              annotation.get('Name').name;
+            break;
+          default:
+            TODO('unimplemented annotation type: ' + subtype.name);
+            break;
+        }
+        items.push(item);
+      }
+      return items;
+    }
+  };
+
+  return Page;
+})();
+
+/**
+ * The `PDFDocument` holds all the data of the PDF file. Compared to the
+ * `PDFDoc`, this one doesn't have any job management code.
+ * Right now there exists one PDFDocument on the main thread + one object
+ * for each worker. If there is no worker support enabled, there are two
+ * `PDFDocument` objects on the main thread created.
+ */
+var PDFDocument = (function PDFDocumentClosure() {
+  function PDFDocument(arg, callback) {
+    if (isStream(arg))
+      init.call(this, arg);
+    else if (isArrayBuffer(arg))
+      init.call(this, new Stream(arg));
+    else
+      error('PDFDocument: Unknown argument type');
+  }
+
+  function init(stream) {
+    assertWellFormed(stream.length > 0, 'stream must have data');
+    this.stream = stream;
+    this.setup();
+    this.acroForm = this.catalog.catDict.get('AcroForm');
+  }
+
+  function find(stream, needle, limit, backwards) {
+    var pos = stream.pos;
+    var end = stream.end;
+    var str = '';
+    if (pos + limit > end)
+      limit = end - pos;
+    for (var n = 0; n < limit; ++n)
+      str += stream.getChar();
+    stream.pos = pos;
+    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+    if (index == -1)
+      return false; /* not found */
+    stream.pos += index;
+    return true; /* found */
+  }
+
+  PDFDocument.prototype = {
+    get linearization() {
+      var length = this.stream.length;
+      var linearization = false;
+      if (length) {
+        linearization = new Linearization(this.stream);
+        if (linearization.length != length)
+          linearization = false;
+      }
+      // shadow the prototype getter with a data property
+      return shadow(this, 'linearization', linearization);
+    },
+    get startXRef() {
+      var stream = this.stream;
+      var startXRef = 0;
+      var linearization = this.linearization;
+      if (linearization) {
+        // Find end of first obj.
+        stream.reset();
+        if (find(stream, 'endobj', 1024))
+          startXRef = stream.pos + 6;
+      } else {
+        // Find startxref by jumping backward from the end of the file.
+        var step = 1024;
+        var found = false, pos = stream.end;
+        while (!found && pos > 0) {
+          pos -= step - 'startxref'.length;
+          if (pos < 0)
+            pos = 0;
+          stream.pos = pos;
+          found = find(stream, 'startxref', step, true);
+        }
+        if (found) {
+          stream.skip(9);
+          var ch;
+          do {
+            ch = stream.getChar();
+          } while (Lexer.isSpace(ch));
+          var str = '';
+          while ((ch - '0') <= 9) {
+            str += ch;
+            ch = stream.getChar();
+          }
+          startXRef = parseInt(str, 10);
+          if (isNaN(startXRef))
+            startXRef = 0;
+        }
+      }
+      // shadow the prototype getter with a data property
+      return shadow(this, 'startXRef', startXRef);
+    },
+    get mainXRefEntriesOffset() {
+      var mainXRefEntriesOffset = 0;
+      var linearization = this.linearization;
+      if (linearization)
+        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
+      // shadow the prototype getter with a data property
+      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
+    },
+    // Find the header, remove leading garbage and setup the stream
+    // starting from the header.
+    checkHeader: function PDFDocument_checkHeader() {
+      var stream = this.stream;
+      stream.reset();
+      if (find(stream, '%PDF-', 1024)) {
+        // Found the header, trim off any garbage before it.
+        stream.moveStart();
+        return;
+      }
+      // May not be a PDF file, continue anyway.
+    },
+    setup: function PDFDocument_setup(ownerPassword, userPassword) {
+      this.checkHeader();
+      var xref = new XRef(this.stream,
+                          this.startXRef,
+                          this.mainXRefEntriesOffset);
+      this.xref = xref;
+      this.catalog = new Catalog(xref);
+    },
+    get numPages() {
+      var linearization = this.linearization;
+      var num = linearization ? linearization.numPages : this.catalog.numPages;
+      // shadow the prototype getter
+      return shadow(this, 'numPages', num);
+    },
+    getDocumentInfo: function PDFDocument_getDocumentInfo() {
+      var info;
+      if (this.xref.trailer.has('Info')) {
+        var infoDict = this.xref.trailer.get('Info');
+
+        info = {};
+        infoDict.forEach(function(key, value) {
+          info[key] = typeof value !== 'string' ? value :
+            stringToPDFString(value);
+        });
+      }
+
+      return shadow(this, 'getDocumentInfo', info);
+    },
+    getFingerprint: function PDFDocument_getFingerprint() {
+      var xref = this.xref, fileID;
+      if (xref.trailer.has('ID')) {
+        fileID = '';
+        var id = xref.trailer.get('ID')[0];
+        id.split('').forEach(function(el) {
+          fileID += Number(el.charCodeAt(0)).toString(16);
+        });
+      } else {
+        // If we got no fileID, then we generate one,
+        // from the first 100 bytes of PDF
+        var data = this.stream.bytes.subarray(0, 100);
+        var hash = calculateMD5(data, 0, data.length);
+        fileID = '';
+        for (var i = 0, length = hash.length; i < length; i++) {
+          fileID += Number(hash[i]).toString(16);
+        }
+      }
+
+      return shadow(this, 'getFingerprint', fileID);
+    },
+    getPage: function PDFDocument_getPage(n) {
+      return this.catalog.getPage(n);
+    }
+  };
+
+  return PDFDocument;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function log(msg) {
+  if (PdfJS_window.console && PdfJS_window.console.log)
+    PdfJS_window.console.log(msg);
+  else if (print)
+    print(msg);
+}
+
+function warn(msg) {
+  if (verbosity >= WARNINGS)
+    log('Warning: ' + msg);
+}
+
+function backtrace() {
+  try {
+    throw new Error();
+  } catch (e) {
+    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+  }
+}
+
+function error(msg) {
+  log('Error: ' + msg);
+  log(backtrace());
+  throw new Error(msg);
+}
+
+function TODO(what) {
+  if (verbosity >= TODOS)
+    log('TODO: ' + what);
+}
+
+function malformed(msg) {
+  error('Malformed PDF: ' + msg);
+}
+
+function assert(cond, msg) {
+  if (!cond)
+    error(msg);
+}
+
+// In a well-formed PDF, |cond| holds.  If it doesn't, subsequent
+// behavior is undefined.
+function assertWellFormed(cond, msg) {
+  if (!cond)
+    malformed(msg);
+}
+
+function shadow(obj, prop, value) {
+  Object.defineProperty(obj, prop, { value: value,
+                                     enumerable: true,
+                                     configurable: true,
+                                     writable: false });
+  return value;
+}
+
+function bytesToString(bytes) {
+  var str = '';
+  var length = bytes.length;
+  for (var n = 0; n < length; ++n)
+    str += String.fromCharCode(bytes[n]);
+  return str;
+}
+
+function stringToBytes(str) {
+  var length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var n = 0; n < length; ++n)
+    bytes[n] = str.charCodeAt(n) & 0xFF;
+  return bytes;
+}
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = PDFJS.Util = (function UtilClosure() {
+  function Util() {}
+
+  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
+    var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
+    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+  };
+
+  Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
+    c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
+    var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
+    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
+  };
+
+  // For 2d affine transforms
+  Util.applyTransform = function Util_applyTransform(p, m) {
+    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+    return [xt, yt];
+  };
+
+  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+    return [xt, yt];
+  };
+
+  Util.inverseTransform = function Util_inverseTransform(m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
+      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  };
+
+  // Apply a generic 3d matrix M on a 3-vector v:
+  //   | a b c |   | X |
+  //   | d e f | x | Y |
+  //   | g h i |   | Z |
+  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
+  // with v as [X,Y,Z]
+  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+    return [
+      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
+      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
+      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
+    ];
+  }
+
+  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
+  // For coordinate systems whose origin lies in the bottom-left, this
+  // means normalization to (BL,TR) ordering. For systems with origin in the
+  // top-left, this means (TL,BR) ordering.
+  Util.normalizeRect = function Util_normalizeRect(rect) {
+    var r = rect.slice(0); // clone rect
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  }
+
+  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
+  // intersection of rect1 and rect2. If no intersection, returns 'false'
+  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
+  Util.intersect = function Util_intersect(rect1, rect2) {
+    function compare(a, b) {
+      return a - b;
+    };
+
+    // Order points along the axes
+    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+        result = [];
+
+    rect1 = Util.normalizeRect(rect1);
+    rect2 = Util.normalizeRect(rect2);
+
+    // X: first and second points belong to different rectangles?
+    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
+        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
+      // Intersection must be between second and third points
+      result[0] = orderedX[1];
+      result[2] = orderedX[2];
+    } else {
+      return false;
+    }
+
+    // Y: first and second points belong to different rectangles?
+    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
+        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
+      // Intersection must be between second and third points
+      result[1] = orderedY[1];
+      result[3] = orderedY[2];
+    } else {
+      return false;
+    }
+
+    return result;
+  };
+
+  Util.sign = function Util_sign(num) {
+    return num < 0 ? -1 : 1;
+  };
+
+  return Util;
+})();
+
+var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
+  function PageViewport(viewBox, scale, rotate, offsetX, offsetY) {
+    // creating transform to convert pdf coordinate system to the normal
+    // canvas like coordinates taking in account scale and rotation
+    var centerX = (viewBox[2] + viewBox[0]) / 2;
+    var centerY = (viewBox[3] + viewBox[1]) / 2;
+    var rotateA, rotateB, rotateC, rotateD;
+    switch (rotate) {
+      case -180:
+      case 180:
+        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
+        break;
+      case -270:
+      case 90:
+        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
+        break;
+      case -90:
+      case 270:
+        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
+        break;
+      case 360:
+      case 0:
+      default:
+        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
+        break;
+    }
+    var offsetCanvasX, offsetCanvasY;
+    var width, height;
+    if (rotateA == 0) {
+      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+    } else {
+      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+    }
+    // creating transform for the following operations:
+    // translate(-centerX, -centerY), rotate and flip vertically,
+    // scale, and translate(offsetCanvasX, offsetCanvasY)
+    this.transform = [
+      rotateA * scale,
+      rotateB * scale,
+      rotateC * scale,
+      rotateD * scale,
+      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
+      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
+    ];
+
+    this.offsetX = offsetX;
+    this.offsetY = offsetY;
+    this.width = width;
+    this.height = height;
+    this.fontScale = scale;
+  }
+  PageViewport.prototype = {
+    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
+      return Util.applyTransform([x, y], this.transform);
+    },
+    convertToViewportRectangle:
+      function PageViewport_convertToViewportRectangle(rect) {
+      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
+      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
+      return [tl[0], tl[1], br[0], br[1]];
+    },
+    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
+      return Util.applyInverseTransform([x, y], this.transform);
+    }
+  };
+  return PageViewport;
+})();
+
+var PDFStringTranslateTable = [
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+  var i, n = str.length, str2 = '';
+  if (str[0] === '\xFE' && str[1] === '\xFF') {
+    // UTF16BE BOM
+    for (i = 2; i < n; i += 2)
+      str2 += String.fromCharCode(
+        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
+  } else {
+    for (i = 0; i < n; ++i) {
+      var code = PDFStringTranslateTable[str.charCodeAt(i)];
+      str2 += code ? String.fromCharCode(code) : str.charAt(i);
+    }
+  }
+  return str2;
+}
+
+function isBool(v) {
+  return typeof v == 'boolean';
+}
+
+function isInt(v) {
+  return typeof v == 'number' && ((v | 0) == v);
+}
+
+function isNum(v) {
+  return typeof v == 'number';
+}
+
+function isString(v) {
+  return typeof v == 'string';
+}
+
+function isNull(v) {
+  return v === null;
+}
+
+function isName(v) {
+  return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (!cmd || v.cmd == cmd);
+}
+
+function isDict(v, type) {
+  return v instanceof Dict && (!type || v.get('Type').name == type);
+}
+
+function isArray(v) {
+  return v instanceof Array;
+}
+
+function isStream(v) {
+  return typeof v == 'object' && v != null && ('getChar' in v);
+}
+
+function isArrayBuffer(v) {
+  return typeof v == 'object' && v != null && ('byteLength' in v);
+}
+
+function isRef(v) {
+  return v instanceof Ref;
+}
+
+function isPDFFunction(v) {
+  var fnDict;
+  if (typeof v != 'object')
+    return false;
+  else if (isDict(v))
+    fnDict = v;
+  else if (isStream(v))
+    fnDict = v.dict;
+  else
+    return false;
+  return fnDict.has('FunctionType');
+}
+
+/**
+ * 'Promise' object.
+ * Each object that is stored in PDFObjects is based on a Promise object that
+ * contains the status of the object and the data. There migth be situations,
+ * where a function want to use the value of an object, but it isn't ready at
+ * that time. To get a notification, once the object is ready to be used, s.o.
+ * can add a callback using the `then` method on the promise that then calls
+ * the callback once the object gets resolved.
+ * A promise can get resolved only once and only once the data of the promise
+ * can be set. If any of these happens twice or the data is required before
+ * it was set, an exception is throw.
+ */
+var Promise = PDFJS.Promise = (function PromiseClosure() {
+  var EMPTY_PROMISE = {};
+
+  /**
+   * If `data` is passed in this constructor, the promise is created resolved.
+   * If there isn't data, it isn't resolved at the beginning.
+   */
+  function Promise(name, data) {
+    this.name = name;
+    this.isRejected = false;
+    this.error = null;
+    // If you build a promise and pass in some data it's already resolved.
+    if (data != null) {
+      this.isResolved = true;
+      this._data = data;
+      this.hasData = true;
+    } else {
+      this.isResolved = false;
+      this._data = EMPTY_PROMISE;
+    }
+    this.callbacks = [];
+    this.errbacks = [];
+    this.progressbacks = [];
+  };
+  /**
+   * Builds a promise that is resolved when all the passed in promises are
+   * resolved.
+   * @param {Promise[]} promises Array of promises to wait for.
+   * @return {Promise} New dependant promise.
+   */
+  Promise.all = function Promise_all(promises) {
+    var deferred = new Promise();
+    var unresolved = promises.length;
+    var results = [];
+    if (unresolved === 0) {
+      deferred.resolve(results);
+      return deferred;
+    }
+    for (var i = 0, ii = promises.length; i < ii; ++i) {
+      var promise = promises[i];
+      promise.then((function(i) {
+        return function(value) {
+          results[i] = value;
+          unresolved--;
+          if (unresolved === 0)
+            deferred.resolve(results);
+        };
+      })(i));
+    }
+    return deferred;
+  };
+  Promise.prototype = {
+    hasData: false,
+
+    set data(value) {
+      if (value === undefined) {
+        return;
+      }
+      if (this._data !== EMPTY_PROMISE) {
+        error('Promise ' + this.name +
+              ': Cannot set the data of a promise twice');
+      }
+      this._data = value;
+      this.hasData = true;
+
+      if (this.onDataCallback) {
+        this.onDataCallback(value);
+      }
+    },
+
+    get data() {
+      if (this._data === EMPTY_PROMISE) {
+        error('Promise ' + this.name + ': Cannot get data that isn\'t set');
+      }
+      return this._data;
+    },
+
+    onData: function Promise_onData(callback) {
+      if (this._data !== EMPTY_PROMISE) {
+        callback(this._data);
+      } else {
+        this.onDataCallback = callback;
+      }
+    },
+
+    resolve: function Promise_resolve(data) {
+      if (this.isResolved) {
+        error('A Promise can be resolved only once ' + this.name);
+      }
+      if (this.isRejected) {
+        error('The Promise was already rejected ' + this.name);
+      }
+
+      this.isResolved = true;
+      this.data = data || null;
+      var callbacks = this.callbacks;
+
+      for (var i = 0, ii = callbacks.length; i < ii; i++) {
+        callbacks[i].call(null, data);
+      }
+    },
+
+    progress: function Promise_progress(data) {
+      var callbacks = this.progressbacks;
+      for (var i = 0, ii = callbacks.length; i < ii; i++) {
+        callbacks[i].call(null, data);
+      }
+    },
+
+    reject: function Promise_reject(reason) {
+      if (this.isRejected) {
+        error('A Promise can be rejected only once ' + this.name);
+      }
+      if (this.isResolved) {
+        error('The Promise was already resolved ' + this.name);
+      }
+
+      this.isRejected = true;
+      this.error = reason || null;
+      var errbacks = this.errbacks;
+
+      for (var i = 0, ii = errbacks.length; i < ii; i++) {
+        errbacks[i].call(null, reason);
+      }
+    },
+
+    then: function Promise_then(callback, errback, progressback) {
+      if (!callback) {
+        error('Requiring callback' + this.name);
+      }
+
+      // If the promise is already resolved, call the callback directly.
+      if (this.isResolved) {
+        var data = this.data;
+        callback.call(null, data);
+      } else if (this.isRejected && errback) {
+        var error = this.error;
+        errback.call(null, error);
+      } else {
+        this.callbacks.push(callback);
+        if (errback)
+          this.errbacks.push(errback);
+      }
+
+      if (progressback)
+        this.progressbacks.push(progressback);
+    }
+  };
+
+  return Promise;
+})();
+
+var StatTimer = (function StatTimerClosure() {
+  function rpad(str, pad, length) {
+    while (str.length < length)
+      str += pad;
+    return str;
+  }
+  function StatTimer() {
+    this.started = {};
+    this.times = [];
+    this.enabled = true;
+  }
+  StatTimer.prototype = {
+    time: function StatTimer_time(name) {
+      if (!this.enabled)
+        return;
+      if (name in this.started)
+        throw 'Timer is already running for ' + name;
+      this.started[name] = Date.now();
+    },
+    timeEnd: function StatTimer_timeEnd(name) {
+      if (!this.enabled)
+        return;
+      if (!(name in this.started))
+        throw 'Timer has not been started for ' + name;
+      this.times.push({
+        'name': name,
+        'start': this.started[name],
+        'end': Date.now()
+      });
+      // Remove timer from started so it can be called again.
+      delete this.started[name];
+    },
+    toString: function StatTimer_toString() {
+      var times = this.times;
+      var out = '';
+      // Find the longest name for padding purposes.
+      var longest = 0;
+      for (var i = 0, ii = times.length; i < ii; ++i) {
+        var name = times[i]['name'];
+        if (name.length > longest)
+          longest = name.length;
+      }
+      for (var i = 0, ii = times.length; i < ii; ++i) {
+        var span = times[i];
+        var duration = span.end - span.start;
+        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
+      }
+      return out;
+    }
+  };
+  return StatTimer;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+/**
+ * This is the main entry point for loading a PDF and interacting with it.
+ * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
+ * is used, which means it must follow the same origin rules that any XHR does
+ * e.g. No cross domain requests without CORS.
+ *
+ * @param {string|TypedAray} source Either a url to a PDF is located or a
+ * typed array already populated with data.
+ * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
+ */
+PDFJS.getDocument = function getDocument(source) {
+  var promise = new PDFJS.Promise();
+  var transport = new WorkerTransport(promise);
+  if (typeof source === 'string') {
+    // fetch url
+    PDFJS.getPdf(
+      {
+        url: source,
+        progress: function getPDFProgress(evt) {
+          if (evt.lengthComputable)
+            promise.progress({
+              loaded: evt.loaded,
+              total: evt.total
+            });
+        },
+        error: function getPDFError(e) {
+          promise.reject('Unexpected server response of ' +
+            e.target.status + '.');
+        }
+      },
+      function getPDFLoad(data) {
+        transport.sendData(data);
+      });
+  } else {
+    // assuming the source is array, instantiating directly from it
+    transport.sendData(source);
+  }
+  return promise;
+};
+
+/**
+ * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
+ * properties that can be read synchronously.
+ */
+var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
+  function PDFDocumentProxy(pdfInfo, transport) {
+    this.pdfInfo = pdfInfo;
+    this.transport = transport;
+  }
+  PDFDocumentProxy.prototype = {
+    /**
+     * @return {number} Total number of pages the PDF contains.
+     */
+    get numPages() {
+      return this.pdfInfo.numPages;
+    },
+    /**
+     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
+     * unique.
+     */
+    get fingerprint() {
+      return this.pdfInfo.fingerprint;
+    },
+    /**
+     * @param {number} The page number to get. The first page is 1.
+     * @return {Promise} A promise that is resolved with a {PDFPageProxy}
+     * object.
+     */
+    getPage: function PDFDocumentProxy_getPage(number) {
+      return this.transport.getPage(number);
+    },
+    /**
+     * @return {Promise} A promise that is resolved with a lookup table for
+     * mapping named destinations to reference numbers.
+     */
+    getDestinations: function PDFDocumentProxy_getDestinations() {
+      var promise = new PDFJS.Promise();
+      var destinations = this.pdfInfo.destinations;
+      promise.resolve(destinations);
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {array} that is a
+     * tree outline (if it has one) of the PDF. The tree is in the format of:
+     * [
+     *  {
+     *   title: string,
+     *   bold: boolean,
+     *   italic: boolean,
+     *   color: rgb array,
+     *   dest: dest obj,
+     *   items: array of more items like this
+     *  },
+     *  ...
+     * ].
+     */
+    getOutline: function PDFDocumentProxy_getOutline() {
+      var promise = new PDFJS.Promise();
+      var outline = this.pdfInfo.outline;
+      promise.resolve(outline);
+      return promise;
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {object} that has
+     * info and metadata properties.  Info is an {object} filled with anything
+     * available in the information dictionary and similarly metadata is a
+     * {Metadata} object with information from the metadata section of the PDF.
+     */
+    getMetadata: function PDFDocumentProxy_getMetadata() {
+      var promise = new PDFJS.Promise();
+      var info = this.pdfInfo.info;
+      var metadata = this.pdfInfo.metadata;
+      promise.resolve({
+        info: info,
+        metadata: metadata ? new PDFJS.Metadata(metadata) : null
+      });
+      return promise;
+    },
+    destroy: function PDFDocumentProxy_destroy() {
+      this.transport.destroy();
+    }
+  };
+  return PDFDocumentProxy;
+})();
+
+var PDFPageProxy = (function PDFPageProxyClosure() {
+  function PDFPageProxy(pageInfo, transport) {
+    this.pageInfo = pageInfo;
+    this.transport = transport;
+    this.stats = new StatTimer();
+    this.stats.enabled = !!globalScope.PDFJS.enableStats;
+    this.objs = transport.objs;
+    this.renderInProgress = false;
+  }
+  PDFPageProxy.prototype = {
+    /**
+     * @return {number} Page number of the page. First page is 1.
+     */
+    get pageNumber() {
+      return this.pageInfo.pageIndex + 1;
+    },
+    /**
+     * @return {number} The number of degrees the page is rotated clockwise.
+     */
+    get rotate() {
+      return this.pageInfo.rotate;
+    },
+    /**
+     * @return {object} The reference that points to this page. It has 'num' and
+     * 'gen' properties.
+     */
+    get ref() {
+      return this.pageInfo.ref;
+    },
+    /**
+     * @return {array} An array of the visible portion of the PDF page in the
+     * user space units - [x1, y1, x2, y2].
+     */
+    get view() {
+      return this.pageInfo.view;
+    },
+    /**
+     * @param {number} scale The desired scale of the viewport.
+     * @param {number} rotate Degrees to rotate the viewport. If omitted this
+     * defaults to the page rotation.
+     * @return {PageViewport} Contains 'width' and 'height' properties along
+     * with transforms required for rendering.
+     */
+    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
+      if (arguments.length < 2)
+        rotate = this.rotate;
+      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
+    },
+    /**
+     * @return {Promise} A promise that is resolved with an {array} of the
+     * annotation objects.
+     */
+    getAnnotations: function PDFPageProxy_getAnnotations() {
+      if (this.annotationsPromise)
+        return this.annotationsPromise;
+
+      var promise = new PDFJS.Promise();
+      this.annotationsPromise = promise;
+      this.transport.getAnnotations(this.pageInfo.pageIndex);
+      return promise;
+    },
+    /**
+     * Begins the process of rendering a page to the desired context.
+     * @param {object} params A parameter object that supports:
+     * {
+     *   canvasContext(required): A 2D context of a DOM Canvas object.,
+     *   textLayer(optional): An object that has beginLayout, endLayout, and
+     *                        appendText functions.
+     * }.
+     * @return {Promise} A promise that is resolved when the page finishes
+     * rendering.
+     */
+    render: function PDFPageProxy_render(params) {
+      this.renderInProgress = true;
+
+      var promise = new Promise();
+      var stats = this.stats;
+      stats.time('Overall');
+      // If there is no displayReadyPromise yet, then the operatorList was never
+      // requested before. Make the request and create the promise.
+      if (!this.displayReadyPromise) {
+        this.displayReadyPromise = new Promise();
+        this.destroyed = false;
+
+        this.stats.time('Page Request');
+        this.transport.messageHandler.send('RenderPageRequest', {
+          pageIndex: this.pageNumber - 1
+        });
+      }
+
+      var self = this;
+      function complete(error) {
+        self.renderInProgress = false;
+        if (self.destroyed) {
+          delete self.operatorList;
+          delete self.displayReadyPromise;
+        }
+
+        if (error)
+          promise.reject(error);
+        else
+          promise.resolve();
+      };
+
+      // Once the operatorList and fonts are loaded, do the actual rendering.
+      this.displayReadyPromise.then(
+        function pageDisplayReadyPromise() {
+          if (self.destroyed) {
+            complete();
+            return;
+          }
+
+          var gfx = new CanvasGraphics(params.canvasContext,
+            this.objs, params.textLayer);
+          try {
+           this.display(gfx, params.viewport, complete);
+          } catch (e) {
+            complete(e);
+          }
+        }.bind(this),
+        function pageDisplayReadPromiseError(reason) {
+          complete(reason);
+        }
+      );
+
+      return promise;
+    },
+    /**
+     * For internal use only.
+     */
+    startRenderingFromOperatorList:
+      function PDFPageProxy_startRenderingFromOperatorList(operatorList,
+                                                           fonts) {
+      var self = this;
+      this.operatorList = operatorList;
+
+      var displayContinuation = function pageDisplayContinuation() {
+        // Always defer call to display() to work around bug in
+        // Firefox error reporting from XHR callbacks.
+        PdfJS_window.setTimeout(function pageSetTimeout() {
+          self.displayReadyPromise.resolve();
+        });
+      };
+
+      this.ensureFonts(fonts,
+        function pageStartRenderingFromOperatorListEnsureFonts() {
+          displayContinuation();
+        }
+      );
+    },
+    /**
+     * For internal use only.
+     */
+    ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) {
+      this.stats.time('Font Loading');
+      // Convert the font names to the corresponding font obj.
+      for (var i = 0, ii = fonts.length; i < ii; i++) {
+        fonts[i] = this.objs.objs[fonts[i]].data;
+      }
+
+      // Load all the fonts
+      FontLoader.bind(
+        fonts,
+        function pageEnsureFontsFontObjs(fontObjs) {
+          this.stats.timeEnd('Font Loading');
+
+          callback.call(this);
+        }.bind(this)
+      );
+    },
+    /**
+     * For internal use only.
+     */
+    display: function PDFPageProxy_display(gfx, viewport, callback) {
+      var stats = this.stats;
+      stats.time('Rendering');
+
+      gfx.beginDrawing(viewport);
+
+      var startIdx = 0;
+      var length = this.operatorList.fnArray.length;
+      var operatorList = this.operatorList;
+      var stepper = null;
+      if (PDFJS.pdfBug && StepperManager.enabled) {
+        stepper = StepperManager.create(this.pageNumber - 1);
+        stepper.init(operatorList);
+        stepper.nextBreakPoint = stepper.getNextBreakPoint();
+      }
+
+      var self = this;
+      function next() {
+        startIdx =
+          gfx.executeOperatorList(operatorList, startIdx, next, stepper);
+        if (startIdx == length) {
+          gfx.endDrawing();
+          stats.timeEnd('Rendering');
+          stats.timeEnd('Overall');
+          if (callback) callback();
+        }
+      }
+      next();
+    },
+    /**
+     * Stub for future feature.
+     */
+    getTextContent: function PDFPageProxy_getTextContent() {
+      var promise = new PDFJS.Promise();
+      var textContent = 'page text'; // not implemented
+      promise.resolve(textContent);
+      return promise;
+    },
+    /**
+     * Stub for future feature.
+     */
+    getOperationList: function PDFPageProxy_getOperationList() {
+      var promise = new PDFJS.Promise();
+      var operationList = { // not implemented
+        dependencyFontsID: null,
+        operatorList: null
+      };
+      promise.resolve(operationList);
+      return promise;
+    },
+    /**
+     * Destroys resources allocated by the page.
+     */
+    destroy: function PDFPageProxy_destroy() {
+      this.destroyed = true;
+
+      if (!this.renderInProgress) {
+        delete this.operatorList;
+        delete this.displayReadyPromise;
+      }
+    }
+  };
+  return PDFPageProxy;
+})();
+/**
+ * For internal use only.
+ */
+var WorkerTransport = (function WorkerTransportClosure() {
+  function WorkerTransport(promise) {
+    this.workerReadyPromise = promise;
+    this.objs = new PDFObjects();
+
+    this.pageCache = [];
+    this.pagePromises = [];
+    this.fontsLoading = {};
+
+    // If worker support isn't disabled explicit and the browser has worker
+    // support, create a new web worker and test if it/the browser fullfills
+    // all requirements to run parts of pdf.js in a web worker.
+    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+    // as it arrives on the worker. Chrome added this with version 15.
+    if (!globalScope.PDFJS.disableWorker && typeof PdfJS_window.Worker !== 'undefined') {
+      var workerSrc = PDFJS.workerSrc;
+      if (typeof workerSrc === 'undefined') {
+        error('No PDFJS.workerSrc specified');
+      }
+
+      try {
+        var worker;
+        if (PDFJS.isFirefoxExtension) {
+          // The firefox extension can't load the worker from the resource://
+          // url so we have to inline the script and then use the blob loader.
+          var bb = new MozBlobBuilder();
+          bb.append(PdfJS_window.document.querySelector('#PDFJS_SCRIPT_TAG').textContent);
+          var blobUrl = PdfJS_window.window.URL.createObjectURL(bb.getBlob());
+          worker = new Worker(blobUrl);
+        } else {
+          // Some versions of FF can't create a worker on localhost, see:
+          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+          worker = new Worker(workerSrc);
+        }
+
+        var messageHandler = new MessageHandler('main', worker);
+        this.messageHandler = messageHandler;
+
+        messageHandler.on('test', function transportTest(supportTypedArray) {
+          if (supportTypedArray) {
+            this.worker = worker;
+            this.setupMessageHandler(messageHandler);
+          } else {
+            globalScope.PDFJS.disableWorker = true;
+            this.setupFakeWorker();
+          }
+        }.bind(this));
+
+        var testObj = new Uint8Array(1);
+        // Some versions of Opera throw a DATA_CLONE_ERR on
+        // serializing the typed array.
+        messageHandler.send('test', testObj);
+        return;
+      } catch (e) {
+        warn('The worker has been disabled.');
+      }
+    }
+    // Either workers are disabled, not supported or have thrown an exception.
+    // Thus, we fallback to a faked worker.
+    globalScope.PDFJS.disableWorker = true;
+    this.setupFakeWorker();
+  }
+  WorkerTransport.prototype = {
+    destroy: function WorkerTransport_destroy() {
+      if (this.worker)
+        this.worker.terminate();
+
+      this.pageCache = [];
+      this.pagePromises = [];
+    },
+    setupFakeWorker: function WorkerTransport_setupFakeWorker() {
+      // If we don't use a worker, just post/sendMessage to the main thread.
+      var fakeWorker = {
+        postMessage: function WorkerTransport_postMessage(obj) {
+          fakeWorker.onmessage({data: obj});
+        },
+        terminate: function WorkerTransport_terminate() {}
+      };
+
+      var messageHandler = new MessageHandler('main', fakeWorker);
+      this.setupMessageHandler(messageHandler);
+
+      // If the main thread is our worker, setup the handling for the messages
+      // the main thread sends to it self.
+      WorkerMessageHandler.setup(messageHandler);
+    },
+
+    setupMessageHandler:
+      function WorkerTransport_setupMessageHandler(messageHandler) {
+      this.messageHandler = messageHandler;
+
+      messageHandler.on('GetDoc', function transportDoc(data) {
+        var pdfInfo = data.pdfInfo;
+        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
+        this.pdfDocument = pdfDocument;
+        this.workerReadyPromise.resolve(pdfDocument);
+      }, this);
+
+      messageHandler.on('GetPage', function transportPage(data) {
+        var pageInfo = data.pageInfo;
+        var page = new PDFPageProxy(pageInfo, this);
+        this.pageCache[pageInfo.pageIndex] = page;
+        var promise = this.pagePromises[pageInfo.pageIndex];
+        promise.resolve(page);
+      }, this);
+
+      messageHandler.on('GetAnnotations', function transportAnnotations(data) {
+        var annotations = data.annotations;
+        var promise = this.pageCache[data.pageIndex].annotationsPromise;
+        promise.resolve(annotations);
+      }, this);
+
+      messageHandler.on('RenderPage', function transportRender(data) {
+        var page = this.pageCache[data.pageIndex];
+        var depFonts = data.depFonts;
+
+        page.stats.timeEnd('Page Request');
+        page.startRenderingFromOperatorList(data.operatorList, depFonts);
+      }, this);
+
+      messageHandler.on('obj', function transportObj(data) {
+        var id = data[0];
+        var type = data[1];
+        if (this.objs.hasData(id))
+          return;
+
+        switch (type) {
+          case 'JpegStream':
+            var imageData = data[2];
+            loadJpegStream(id, imageData, this.objs);
+            break;
+          case 'Image':
+            var imageData = data[2];
+            this.objs.resolve(id, imageData);
+            break;
+          case 'Font':
+            var name = data[2];
+            var file = data[3];
+            var properties = data[4];
+
+            if (file) {
+              // Rewrap the ArrayBuffer in a stream.
+              var fontFileDict = new Dict();
+              file = new Stream(file, 0, file.length, fontFileDict);
+            }
+
+            // At this point, only the font object is created but the font is
+            // not yet attached to the DOM. This is done in `FontLoader.bind`.
+            var font = new Font(name, file, properties);
+            this.objs.resolve(id, font);
+            break;
+          default:
+            error('Got unkown object type ' + type);
+        }
+      }, this);
+
+      messageHandler.on('PageError', function transportError(data) {
+        var page = this.pageCache[data.pageNum - 1];
+        if (page.displayReadyPromise)
+          page.displayReadyPromise.reject(data.error);
+        else
+          error(data.error);
+      }, this);
+
+      messageHandler.on('JpegDecode', function(data, promise) {
+        var imageData = data[0];
+        var components = data[1];
+        if (components != 3 && components != 1)
+          error('Only 3 component or 1 component can be returned');
+
+        var img = new Image();
+        img.onload = (function messageHandler_onloadClosure() {
+          var width = img.width;
+          var height = img.height;
+          var size = width * height;
+          var rgbaLength = size * 4;
+          var buf = new Uint8Array(size * components);
+          var tmpCanvas = createScratchCanvas(width, height);
+          var tmpCtx = tmpCanvas.getContext('2d');
+          tmpCtx.drawImage(img, 0, 0);
+          var data = tmpCtx.getImageData(0, 0, width, height).data;
+
+          if (components == 3) {
+            for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
+              buf[j] = data[i];
+              buf[j + 1] = data[i + 1];
+              buf[j + 2] = data[i + 2];
+            }
+          } else if (components == 1) {
+            for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
+              buf[j] = data[i];
+            }
+          }
+          promise.resolve({ data: buf, width: width, height: height});
+        }).bind(this);
+        var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
+        img.src = src;
+      });
+    },
+
+    sendData: function WorkerTransport_sendData(data) {
+      this.messageHandler.send('GetDocRequest', data);
+    },
+
+    getPage: function WorkerTransport_getPage(pageNumber, promise) {
+      var pageIndex = pageNumber - 1;
+      if (pageIndex in this.pagePromises)
+        return this.pagePromises[pageIndex];
+      var promise = new PDFJS.Promise('Page ' + pageNumber);
+      this.pagePromises[pageIndex] = promise;
+      this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
+      return promise;
+    },
+
+    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
+      this.messageHandler.send('GetAnnotationsRequest',
+        { pageIndex: pageIndex });
+    }
+  };
+  return WorkerTransport;
+
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+// <canvas> contexts store most of the state we need natively.
+// However, PDF needs a bit more state, which we store here.
+
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7
+};
+
+// Minimal font size that would be used during canvas fillText operations.
+var MIN_FONT_SIZE = 1;
+
+function createScratchCanvas(width, height) {
+  var canvas = PdfJS_window.document.createElement('canvas');
+  canvas.width = width;
+  canvas.height = height;
+  return canvas;
+}
+
+function addContextCurrentTransform(ctx) {
+  // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
+  if (!ctx.mozCurrentTransform) {
+    // Store the original context
+    ctx._originalSave = ctx.save;
+    ctx._originalRestore = ctx.restore;
+    ctx._originalRotate = ctx.rotate;
+    ctx._originalScale = ctx.scale;
+    ctx._originalTranslate = ctx.translate;
+    ctx._originalTransform = ctx.transform;
+
+    ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
+    ctx._transformStack = [];
+
+    Object.defineProperty(ctx, 'mozCurrentTransform', {
+      get: function getCurrentTransform() {
+        return this._transformMatrix;
+      }
+    });
+
+    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
+      get: function getCurrentTransformInverse() {
+        // Calculation done using WolframAlpha:
+        // http://www.wolframalpha.com/input/?
+        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
+
+        var m = this._transformMatrix;
+        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
+
+        var ad_bc = a * d - b * c;
+        var bc_ad = b * c - a * d;
+
+        return [
+          d / ad_bc,
+          b / bc_ad,
+          c / bc_ad,
+          a / ad_bc,
+          (d * e - c * f) / bc_ad,
+          (b * e - a * f) / ad_bc
+        ];
+      }
+    });
+
+    ctx.save = function ctxSave() {
+      var old = this._transformMatrix;
+      this._transformStack.push(old);
+      this._transformMatrix = old.slice(0, 6);
+
+      this._originalSave();
+    };
+
+    ctx.restore = function ctxRestore() {
+      var prev = this._transformStack.pop();
+      if (prev) {
+        this._transformMatrix = prev;
+        this._originalRestore();
+      }
+    };
+
+    ctx.translate = function ctxTranslate(x, y) {
+      var m = this._transformMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+
+      this._originalTranslate(x, y);
+    };
+
+    ctx.scale = function ctxScale(x, y) {
+      var m = this._transformMatrix;
+      m[0] = m[0] * x;
+      m[1] = m[1] * x;
+      m[2] = m[2] * y;
+      m[3] = m[3] * y;
+
+      this._originalScale(x, y);
+    };
+
+    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
+      var m = this._transformMatrix;
+      this._transformMatrix = [
+        m[0] * a + m[2] * b,
+        m[1] * a + m[3] * b,
+        m[0] * c + m[2] * d,
+        m[1] * c + m[3] * d,
+        m[0] * e + m[2] * f + m[4],
+        m[1] * e + m[3] * f + m[5]
+      ];
+
+      ctx._originalTransform(a, b, c, d, e, f);
+    };
+
+    ctx.rotate = function ctxRotate(angle) {
+      var cosValue = Math.cos(angle);
+      var sinValue = Math.sin(angle);
+
+      var m = this._transformMatrix;
+      this._transformMatrix = [
+        m[0] * cosValue + m[2] * sinValue,
+        m[1] * cosValue + m[3] * sinValue,
+        m[0] * (-sinValue) + m[2] * cosValue,
+        m[1] * (-sinValue) + m[3] * cosValue,
+        m[4],
+        m[5]
+      ];
+
+      this._originalRotate(angle);
+    };
+  }
+}
+
+var CanvasExtraState = (function CanvasExtraStateClosure() {
+  function CanvasExtraState(old) {
+    // Are soft masks and alpha values shapes or opacities?
+    this.alphaIsShape = false;
+    this.fontSize = 0;
+    this.fontSizeScale = 1;
+    this.textMatrix = IDENTITY_MATRIX;
+    this.fontMatrix = IDENTITY_MATRIX;
+    this.leading = 0;
+    // Current point (in user coordinates)
+    this.x = 0;
+    this.y = 0;
+    // Start of text line (in text coordinates)
+    this.lineX = 0;
+    this.lineY = 0;
+    // Character and word spacing
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.textHScale = 1;
+    this.textRenderingMode = TextRenderingMode.FILL;
+    // Color spaces
+    this.fillColorSpace = new DeviceGrayCS();
+    this.fillColorSpaceObj = null;
+    this.strokeColorSpace = new DeviceGrayCS();
+    this.strokeColorSpaceObj = null;
+    this.fillColorObj = null;
+    this.strokeColorObj = null;
+    // Default fore and background colors
+    this.fillColor = '#000000';
+    this.strokeColor = '#000000';
+    // Note: fill alpha applies to all non-stroking operations
+    this.fillAlpha = 1;
+    this.strokeAlpha = 1;
+    this.lineWidth = 1;
+
+    this.old = old;
+  }
+
+  CanvasExtraState.prototype = {
+    clone: function CanvasExtraState_clone() {
+      return Object.create(this);
+    },
+    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
+      this.x = x;
+      this.y = y;
+    }
+  };
+  return CanvasExtraState;
+})();
+
+var CanvasGraphics = (function CanvasGraphicsClosure() {
+  // Defines the time the executeOperatorList is going to be executing
+  // before it stops and shedules a continue of execution.
+  var kExecutionTime = 15;
+
+  function CanvasGraphics(canvasCtx, objs, textLayer) {
+    this.ctx = canvasCtx;
+    this.current = new CanvasExtraState();
+    this.stateStack = [];
+    this.pendingClip = null;
+    this.res = null;
+    this.xobjs = null;
+    this.objs = objs;
+    this.textLayer = textLayer;
+    if (canvasCtx) {
+      addContextCurrentTransform(canvasCtx);
+    }
+  }
+
+  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+  var NORMAL_CLIP = {};
+  var EO_CLIP = {};
+
+  CanvasGraphics.prototype = {
+    slowCommands: {
+      'stroke': true,
+      'closeStroke': true,
+      'fill': true,
+      'eoFill': true,
+      'fillStroke': true,
+      'eoFillStroke': true,
+      'closeFillStroke': true,
+      'closeEOFillStroke': true,
+      'showText': true,
+      'showSpacedText': true,
+      'setStrokeColorSpace': true,
+      'setFillColorSpace': true,
+      'setStrokeColor': true,
+      'setStrokeColorN': true,
+      'setFillColor': true,
+      'setFillColorN': true,
+      'setStrokeGray': true,
+      'setFillGray': true,
+      'setStrokeRGBColor': true,
+      'setFillRGBColor': true,
+      'setStrokeCMYKColor': true,
+      'setFillCMYKColor': true,
+      'paintJpegXObject': true,
+      'paintImageXObject': true,
+      'paintImageMaskXObject': true,
+      'shadingFill': true
+    },
+
+    beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
+      var transform = viewport.transform;
+      this.ctx.save();
+      this.ctx.transform.apply(this.ctx, transform);
+
+      if (this.textLayer)
+        this.textLayer.beginLayout();
+    },
+
+    executeOperatorList: function CanvasGraphics_executeOperatorList(
+                                    operatorList,
+                                    executionStartIdx, continueCallback,
+                                    stepper) {
+      var argsArray = operatorList.argsArray;
+      var fnArray = operatorList.fnArray;
+      var i = executionStartIdx || 0;
+      var argsArrayLen = argsArray.length;
+
+      // Sometimes the OperatorList to execute is empty.
+      if (argsArrayLen == i) {
+        return i;
+      }
+
+      var executionEndIdx;
+      var endTime = Date.now() + kExecutionTime;
+
+      var objs = this.objs;
+      var fnName;
+      var slowCommands = this.slowCommands;
+
+      while (true) {
+        if (stepper && i === stepper.nextBreakPoint) {
+          stepper.breakIt(i, continueCallback);
+          return i;
+        }
+
+        fnName = fnArray[i];
+
+        if (fnName !== 'dependency') {
+          this[fnName].apply(this, argsArray[i]);
+        } else {
+          var deps = argsArray[i];
+          for (var n = 0, nn = deps.length; n < nn; n++) {
+            var depObjId = deps[n];
+
+            // If the promise isn't resolved yet, add the continueCallback
+            // to the promise and bail out.
+            if (!objs.isResolved(depObjId)) {
+              objs.get(depObjId, continueCallback);
+              return i;
+            }
+          }
+        }
+
+        i++;
+
+        // If the entire operatorList was executed, stop as were done.
+        if (i == argsArrayLen) {
+          return i;
+        }
+
+        // If the execution took longer then a certain amount of time, shedule
+        // to continue exeution after a short delay.
+        // However, this is only possible if a 'continueCallback' is passed in.
+        if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
+          PdfJS_window.setTimeout(continueCallback, 0);
+          return i;
+        }
+
+        // If the operatorList isn't executed completely yet OR the execution
+        // time was short enough, do another execution round.
+      }
+    },
+
+    endDrawing: function CanvasGraphics_endDrawing() {
+      this.ctx.restore();
+
+      if (this.textLayer)
+        this.textLayer.endLayout();
+    },
+
+    // Graphics state
+    setLineWidth: function CanvasGraphics_setLineWidth(width) {
+      this.current.lineWidth = width;
+      this.ctx.lineWidth = width;
+    },
+    setLineCap: function CanvasGraphics_setLineCap(style) {
+      this.ctx.lineCap = LINE_CAP_STYLES[style];
+    },
+    setLineJoin: function CanvasGraphics_setLineJoin(style) {
+      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+    },
+    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
+      this.ctx.miterLimit = limit;
+    },
+    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
+      this.ctx.mozDash = dashArray;
+      this.ctx.mozDashOffset = dashPhase;
+      this.ctx.webkitLineDash = dashArray;
+      this.ctx.webkitLineDashOffset = dashPhase;
+    },
+    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
+      TODO('set rendering intent: ' + intent);
+    },
+    setFlatness: function CanvasGraphics_setFlatness(flatness) {
+      TODO('set flatness: ' + flatness);
+    },
+    setGState: function CanvasGraphics_setGState(states) {
+      for (var i = 0, ii = states.length; i < ii; i++) {
+        var state = states[i];
+        var key = state[0];
+        var value = state[1];
+
+        switch (key) {
+          case 'LW':
+            this.setLineWidth(value);
+            break;
+          case 'LC':
+            this.setLineCap(value);
+            break;
+          case 'LJ':
+            this.setLineJoin(value);
+            break;
+          case 'ML':
+            this.setMiterLimit(value);
+            break;
+          case 'D':
+            this.setDash(value[0], value[1]);
+            break;
+          case 'RI':
+            this.setRenderingIntent(value);
+            break;
+          case 'FL':
+            this.setFlatness(value);
+            break;
+          case 'Font':
+            this.setFont(state[1], state[2]);
+            break;
+          case 'CA':
+            this.current.strokeAlpha = state[1];
+            break;
+          case 'ca':
+            this.current.fillAlpha = state[1];
+            this.ctx.globalAlpha = state[1];
+            break;
+        }
+      }
+    },
+    save: function CanvasGraphics_save() {
+      this.ctx.save();
+      var old = this.current;
+      this.stateStack.push(old);
+      this.current = old.clone();
+    },
+    restore: function CanvasGraphics_restore() {
+      var prev = this.stateStack.pop();
+      if (prev) {
+        this.current = prev;
+        this.ctx.restore();
+      }
+    },
+    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
+      this.ctx.transform(a, b, c, d, e, f);
+    },
+
+    // Path
+    moveTo: function CanvasGraphics_moveTo(x, y) {
+      this.ctx.moveTo(x, y);
+      this.current.setCurrentPoint(x, y);
+    },
+    lineTo: function CanvasGraphics_lineTo(x, y) {
+      this.ctx.lineTo(x, y);
+      this.current.setCurrentPoint(x, y);
+    },
+    curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
+      this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
+      this.current.setCurrentPoint(x3, y3);
+    },
+    curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
+      var current = this.current;
+      this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
+      current.setCurrentPoint(x3, y3);
+    },
+    curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
+      this.curveTo(x1, y1, x3, y3, x3, y3);
+      this.current.setCurrentPoint(x3, y3);
+    },
+    closePath: function CanvasGraphics_closePath() {
+      this.ctx.closePath();
+    },
+    rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
+      this.ctx.rect(x, y, width, height);
+    },
+    stroke: function CanvasGraphics_stroke(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var strokeColor = this.current.strokeColor;
+      if (this.current.lineWidth === 0)
+        ctx.lineWidth = this.getSinglePixelWidth();
+      // For stroke we want to temporarily change the global alpha to the
+      // stroking alpha.
+      ctx.globalAlpha = this.current.strokeAlpha;
+      if (strokeColor && strokeColor.hasOwnProperty('type') &&
+          strokeColor.type === 'Pattern') {
+        // for patterns, we transform to pattern space, calculate
+        // the pattern, call stroke, and restore to user space
+        ctx.save();
+        ctx.strokeStyle = strokeColor.getPattern(ctx);
+        ctx.stroke();
+        ctx.restore();
+      } else {
+        ctx.stroke();
+      }
+      if (consumePath)
+        this.consumePath();
+      // Restore the global alpha to the fill alpha
+      ctx.globalAlpha = this.current.fillAlpha;
+    },
+    closeStroke: function CanvasGraphics_closeStroke() {
+      this.closePath();
+      this.stroke();
+    },
+    fill: function CanvasGraphics_fill(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var fillColor = this.current.fillColor;
+
+      if (fillColor && fillColor.hasOwnProperty('type') &&
+          fillColor.type === 'Pattern') {
+        ctx.save();
+        ctx.fillStyle = fillColor.getPattern(ctx);
+        ctx.fill();
+        ctx.restore();
+      } else {
+        ctx.fill();
+      }
+      if (consumePath)
+        this.consumePath();
+    },
+    eoFill: function CanvasGraphics_eoFill() {
+      var savedFillRule = this.setEOFillRule();
+      this.fill();
+      this.restoreFillRule(savedFillRule);
+    },
+    fillStroke: function CanvasGraphics_fillStroke() {
+      this.fill(false);
+      this.stroke(false);
+
+      this.consumePath();
+    },
+    eoFillStroke: function CanvasGraphics_eoFillStroke() {
+      var savedFillRule = this.setEOFillRule();
+      this.fillStroke();
+      this.restoreFillRule(savedFillRule);
+    },
+    closeFillStroke: function CanvasGraphics_closeFillStroke() {
+      this.closePath();
+      this.fillStroke();
+    },
+    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
+      var savedFillRule = this.setEOFillRule();
+      this.closePath();
+      this.fillStroke();
+      this.restoreFillRule(savedFillRule);
+    },
+    endPath: function CanvasGraphics_endPath() {
+      this.consumePath();
+    },
+
+    // Clipping
+    clip: function CanvasGraphics_clip() {
+      this.pendingClip = NORMAL_CLIP;
+    },
+    eoClip: function CanvasGraphics_eoClip() {
+      this.pendingClip = EO_CLIP;
+    },
+
+    // Text
+    beginText: function CanvasGraphics_beginText() {
+      this.current.textMatrix = IDENTITY_MATRIX;
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    endText: function CanvasGraphics_endText() {
+    },
+    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
+      this.current.charSpacing = spacing;
+    },
+    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
+      this.current.wordSpacing = spacing;
+    },
+    setHScale: function CanvasGraphics_setHScale(scale) {
+      this.current.textHScale = scale / 100;
+    },
+    setLeading: function CanvasGraphics_setLeading(leading) {
+      this.current.leading = -leading;
+    },
+    setFont: function CanvasGraphics_setFont(fontRefName, size) {
+      var fontObj = this.objs.get(fontRefName);
+      var current = this.current;
+
+      if (!fontObj)
+        error('Can\'t find font for ' + fontRefName);
+
+      // Slice-clone matrix so we can manipulate it without affecting original
+      if (fontObj.fontMatrix)
+        current.fontMatrix = fontObj.fontMatrix.slice(0);
+      else
+        current.fontMatrix = IDENTITY_MATRIX.slice(0);
+
+      // A valid matrix needs all main diagonal elements to be non-zero
+      // This also ensures we bypass FF bugzilla bug #719844.
+      if (current.fontMatrix[0] === 0 ||
+          current.fontMatrix[3] === 0) {
+        warn('Invalid font matrix for font ' + fontRefName);
+      }
+
+      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
+      // and in some docs this can be negative (inverted x-y axes).
+      // We implement this condition with fontMatrix.
+      if (size < 0) {
+        size = -size;
+        current.fontMatrix[0] *= -1;
+        current.fontMatrix[3] *= -1;
+      }
+
+      this.current.font = fontObj;
+      this.current.fontSize = size;
+
+      if (fontObj.coded)
+        return; // we don't need ctx.font for Type3 fonts
+
+      var name = fontObj.loadedName || 'sans-serif';
+      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+                                 (fontObj.bold ? 'bold' : 'normal');
+
+      var italic = fontObj.italic ? 'italic' : 'normal';
+      var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
+      var typeface = '"' + name + '", ' + serif;
+
+      // Some font backends cannot handle fonts below certain size.
+      // Keeping the font at minimal size and using the fontSizeScale to change
+      // the current transformation matrix before the fillText/strokeText.
+      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
+      var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
+      this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
+                                   size / MIN_FONT_SIZE;
+
+      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
+      this.ctx.font = rule;
+    },
+    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
+      if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
+        TODO('unsupported text rendering mode: ' + mode);
+      this.current.textRenderingMode = mode;
+    },
+    setTextRise: function CanvasGraphics_setTextRise(rise) {
+      TODO('text rise: ' + rise);
+    },
+    moveText: function CanvasGraphics_moveText(x, y) {
+      this.current.x = this.current.lineX += x;
+      this.current.y = this.current.lineY += y;
+    },
+    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
+      this.setLeading(-y);
+      this.moveText(x, y);
+    },
+    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
+      this.current.textMatrix = [a, b, c, d, e, f];
+
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    nextLine: function CanvasGraphics_nextLine() {
+      this.moveText(0, this.current.leading);
+    },
+    applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
+      var ctx = this.ctx;
+      var current = this.current;
+      var textHScale = current.textHScale;
+      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
+
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.scale(1, -1);
+      ctx.translate(current.x, -1 * current.y);
+      ctx.transform.apply(ctx, fontMatrix);
+      ctx.scale(textHScale, 1);
+    },
+    getTextGeometry: function CanvasGraphics_getTextGeometry() {
+      var geometry = {};
+      var ctx = this.ctx;
+      var font = this.current.font;
+      var ctxMatrix = ctx.mozCurrentTransform;
+      if (ctxMatrix) {
+        var bl = Util.applyTransform([0, 0], ctxMatrix);
+        var tr = Util.applyTransform([1, 1], ctxMatrix);
+        geometry.x = bl[0];
+        geometry.y = bl[1];
+        geometry.hScale = tr[0] - bl[0];
+        geometry.vScale = tr[1] - bl[1];
+      }
+      geometry.spaceWidth = font.spaceWidth;
+      return geometry;
+    },
+
+    showText: function CanvasGraphics_showText(str, skipTextSelection) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var glyphs = font.charsToGlyphs(str);
+      var fontSize = current.fontSize;
+      var fontSizeScale = current.fontSizeScale;
+      var charSpacing = current.charSpacing;
+      var wordSpacing = current.wordSpacing;
+      var textHScale = current.textHScale;
+      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
+      var textHScale2 = textHScale * fontMatrix[0];
+      var glyphsLength = glyphs.length;
+      var textLayer = this.textLayer;
+      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
+      var textSelection = textLayer && !skipTextSelection ? true : false;
+      var textRenderingMode = current.textRenderingMode;
+
+      // Type3 fonts - each glyph is a "mini-PDF"
+      if (font.coded) {
+        ctx.save();
+        ctx.transform.apply(ctx, current.textMatrix);
+        ctx.translate(current.x, current.y);
+
+        ctx.scale(textHScale, 1);
+
+        if (textSelection) {
+          this.save();
+          ctx.scale(1, -1);
+          text.geom = this.getTextGeometry();
+          this.restore();
+        }
+        for (var i = 0; i < glyphsLength; ++i) {
+
+          var glyph = glyphs[i];
+          if (glyph === null) {
+            // word break
+            this.ctx.translate(wordSpacing, 0);
+            continue;
+          }
+
+          this.save();
+          ctx.scale(fontSize, fontSize);
+          ctx.transform.apply(ctx, fontMatrix);
+          this.executeOperatorList(glyph.operatorList);
+          this.restore();
+
+          var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
+          var width = transformed[0] * fontSize +
+              Util.sign(current.fontMatrix[0]) * charSpacing;
+
+          ctx.translate(width, 0);
+          current.x += width * textHScale;
+
+          text.str += glyph.unicode;
+          text.length++;
+          text.canvasWidth += width;
+        }
+        ctx.restore();
+      } else {
+        ctx.save();
+        this.applyTextTransforms();
+
+        var lineWidth = current.lineWidth;
+        var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
+        if (scale == 0 || lineWidth == 0)
+          lineWidth = this.getSinglePixelWidth();
+        else
+          lineWidth /= scale;
+
+        if (textSelection)
+          text.geom = this.getTextGeometry();
+
+        if (fontSizeScale != 1.0) {
+          ctx.scale(fontSizeScale, fontSizeScale);
+          lineWidth /= fontSizeScale;
+        }
+
+        ctx.lineWidth = lineWidth;
+
+        var x = 0;
+        for (var i = 0; i < glyphsLength; ++i) {
+          var glyph = glyphs[i];
+          if (glyph === null) {
+            // word break
+            x += Util.sign(current.fontMatrix[0]) * wordSpacing;
+            continue;
+          }
+
+          var character = glyph.fontChar;
+          var charWidth = glyph.width * fontSize * 0.001 +
+              Util.sign(current.fontMatrix[0]) * charSpacing;
+
+          if (!glyph.disabled) {
+            var scaledX = x / fontSizeScale;
+            switch (textRenderingMode) {
+              default: // other unsupported rendering modes
+              case TextRenderingMode.FILL:
+              case TextRenderingMode.FILL_ADD_TO_PATH:
+                ctx.fillText(character, scaledX, 0);
+                break;
+              case TextRenderingMode.STROKE:
+              case TextRenderingMode.STROKE_ADD_TO_PATH:
+                ctx.strokeText(character, scaledX, 0);
+                break;
+              case TextRenderingMode.FILL_STROKE:
+              case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
+                ctx.fillText(character, scaledX, 0);
+                ctx.strokeText(character, scaledX, 0);
+                break;
+              case TextRenderingMode.INVISIBLE:
+                break;
+            }
+          }
+
+          x += charWidth;
+
+          var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
+          var glyphUnicodeLength = glyphUnicode.length;
+          //reverse an arabic ligature
+          if (glyphUnicodeLength > 1 &&
+              isRTLRangeFor(glyphUnicode.charCodeAt(0))) {
+            for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--)
+              text.str += glyphUnicode[ii];
+          } else
+            text.str += glyphUnicode;
+          text.length += glyphUnicodeLength;
+          text.canvasWidth += charWidth;
+        }
+        current.x += x * textHScale2;
+        ctx.restore();
+      }
+
+      if (textSelection)
+        this.textLayer.appendText(text, font.loadedName, fontSize);
+
+      return text;
+    },
+    showSpacedText: function CanvasGraphics_showSpacedText(arr) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var fontSize = current.fontSize;
+      var textHScale = current.textHScale;
+      if (!font.coded)
+        textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
+      var arrLength = arr.length;
+      var textLayer = this.textLayer;
+      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
+      var textSelection = textLayer ? true : false;
+
+      if (textSelection) {
+        ctx.save();
+        // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
+        if (font.coded) {
+          ctx.transform.apply(ctx, current.textMatrix);
+          ctx.scale(1, -1);
+          ctx.translate(current.x, -1 * current.y);
+          ctx.scale(textHScale, 1);
+        } else
+          this.applyTextTransforms();
+        text.geom = this.getTextGeometry();
+        ctx.restore();
+      }
+
+      for (var i = 0; i < arrLength; ++i) {
+        var e = arr[i];
+        if (isNum(e)) {
+          var spacingLength = -e * 0.001 * fontSize * textHScale;
+          current.x += spacingLength;
+
+          if (textSelection) {
+            // Emulate precise spacing via HTML spaces
+            text.canvasWidth += spacingLength;
+            if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero
+              var numFakeSpaces = Math.round(-e / text.geom.spaceWidth);
+              if (numFakeSpaces > 0) {
+                text.str += '\u00A0';
+                text.length++;
+              }
+            }
+          }
+        } else if (isString(e)) {
+          var shownText = this.showText(e, true);
+
+          if (textSelection) {
+            if (shownText.str === ' ') {
+              text.str += '\u00A0';
+            } else {
+              text.str += shownText.str;
+            }
+            text.canvasWidth += shownText.canvasWidth;
+            text.length += shownText.length;
+          }
+        } else {
+          malformed('TJ array element ' + e + ' is not string or num');
+        }
+      }
+
+      if (textSelection)
+        this.textLayer.appendText(text, font.loadedName, fontSize);
+    },
+    nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
+      this.nextLine();
+      this.showText(text);
+    },
+    nextLineSetSpacingShowText:
+      function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
+                                                         charSpacing,
+                                                         text) {
+      this.setWordSpacing(wordSpacing);
+      this.setCharSpacing(charSpacing);
+      this.nextLineShowText(text);
+    },
+
+    // Type3 fonts
+    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
+      // We can safely ignore this since the width should be the same
+      // as the width in the Widths array.
+    },
+    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
+                                                                        yWidth,
+                                                                        llx,
+                                                                        lly,
+                                                                        urx,
+                                                                        ury) {
+      // TODO According to the spec we're also suppose to ignore any operators
+      // that set color or include images while processing this type3 font.
+      this.rectangle(llx, lly, urx - llx, ury - lly);
+      this.clip();
+      this.endPath();
+    },
+
+    // Color
+    setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
+      this.current.strokeColorSpace = ColorSpace.fromIR(raw);
+    },
+    setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
+      this.current.fillColorSpace = ColorSpace.fromIR(raw);
+    },
+    setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
+      var cs = this.current.strokeColorSpace;
+      var rgbColor = cs.getRgb(arguments);
+      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
+      if (IR[0] == 'TilingPattern') {
+        var args = IR[1];
+        var base = cs.base;
+        var color;
+        if (base) {
+          var baseComps = base.numComps;
+
+          color = [];
+          for (var i = 0; i < baseComps; ++i)
+            color.push(args[i]);
+
+          color = base.getRgb(color);
+        }
+        var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
+      } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
+        var pattern = Pattern.shadingFromIR(IR);
+      } else {
+        error('Unkown IR type ' + IR[0]);
+      }
+      return pattern;
+    },
+    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
+      var cs = this.current.strokeColorSpace;
+
+      if (cs.name == 'Pattern') {
+        this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
+      } else {
+        this.setStrokeColor.apply(this, arguments);
+      }
+    },
+    setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
+      var cs = this.current.fillColorSpace;
+      var rgbColor = cs.getRgb(arguments);
+      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
+      var cs = this.current.fillColorSpace;
+
+      if (cs.name == 'Pattern') {
+        this.current.fillColor = this.getColorN_Pattern(arguments, cs);
+      } else {
+        this.setFillColor.apply(this, arguments);
+      }
+    },
+    setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
+      if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
+        this.current.strokeColorSpace = new DeviceGrayCS();
+
+      var color = Util.makeCssRgb(gray, gray, gray);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillGray: function CanvasGraphics_setFillGray(gray) {
+      if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
+        this.current.fillColorSpace = new DeviceGrayCS();
+
+      var color = Util.makeCssRgb(gray, gray, gray);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
+      if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
+        this.current.strokeColorSpace = new DeviceRgbCS();
+
+      var color = Util.makeCssRgb(r, g, b);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
+      if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
+        this.current.fillColorSpace = new DeviceRgbCS();
+
+      var color = Util.makeCssRgb(r, g, b);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+    setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
+      if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
+        this.current.strokeColorSpace = new DeviceCmykCS();
+
+      var color = Util.makeCssCmyk(c, m, y, k);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
+      if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
+        this.current.fillColorSpace = new DeviceCmykCS();
+
+      var color = Util.makeCssCmyk(c, m, y, k);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+    },
+
+    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
+      var ctx = this.ctx;
+
+      this.save();
+      var pattern = Pattern.shadingFromIR(patternIR);
+      ctx.fillStyle = pattern.getPattern(ctx);
+
+      var inv = ctx.mozCurrentTransformInverse;
+      if (inv) {
+        var canvas = ctx.canvas;
+        var width = canvas.width;
+        var height = canvas.height;
+
+        var bl = Util.applyTransform([0, 0], inv);
+        var br = Util.applyTransform([0, height], inv);
+        var ul = Util.applyTransform([width, 0], inv);
+        var ur = Util.applyTransform([width, height], inv);
+
+        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+
+        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+      } else {
+        // HACK to draw the gradient onto an infinite rectangle.
+        // PDF gradients are drawn across the entire image while
+        // Canvas only allows gradients to be drawn in a rectangle
+        // The following bug should allow us to remove this.
+        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
+
+        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+      }
+
+      this.restore();
+    },
+
+    // Images
+    beginInlineImage: function CanvasGraphics_beginInlineImage() {
+      error('Should not call beginInlineImage');
+    },
+    beginImageData: function CanvasGraphics_beginImageData() {
+      error('Should not call beginImageData');
+    },
+
+    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
+                                                                        bbox) {
+      this.save();
+
+      if (matrix && isArray(matrix) && 6 == matrix.length)
+        this.transform.apply(this, matrix);
+
+      if (bbox && isArray(bbox) && 4 == bbox.length) {
+        var width = bbox[2] - bbox[0];
+        var height = bbox[3] - bbox[1];
+        this.rectangle(bbox[0], bbox[1], width, height);
+        this.clip();
+        this.endPath();
+      }
+    },
+
+    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
+      this.restore();
+    },
+
+    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
+      var domImage = this.objs.get(objId);
+      if (!domImage) {
+        error('Dependent image isn\'t ready yet');
+      }
+
+      this.save();
+
+      var ctx = this.ctx;
+      // scale the image to the unit square
+      ctx.scale(1 / w, -1 / h);
+
+      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+                    0, -h, w, h);
+
+      this.restore();
+    },
+
+    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
+                             imgArray, inverseDecode, width, height) {
+      function applyStencilMask(buffer, inverseDecode) {
+        var imgArrayPos = 0;
+        var i, j, mask, buf;
+        // removing making non-masked pixels transparent
+        var bufferPos = 3; // alpha component offset
+        for (i = 0; i < height; i++) {
+          mask = 0;
+          for (j = 0; j < width; j++) {
+            if (!mask) {
+              buf = imgArray[imgArrayPos++];
+              mask = 128;
+            }
+            if (!(buf & mask) == inverseDecode) {
+              buffer[bufferPos] = 0;
+            }
+            bufferPos += 4;
+            mask >>= 1;
+          }
+        }
+      }
+
+      this.save();
+
+      var ctx = this.ctx;
+      var w = width, h = height;
+      // scale the image to the unit square
+      ctx.scale(1 / w, -1 / h);
+
+      var tmpCanvas = createScratchCanvas(w, h);
+      var tmpCtx = tmpCanvas.getContext('2d');
+
+      var fillColor = this.current.fillColor;
+      tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+                          fillColor.type === 'Pattern') ?
+                          fillColor.getPattern(tmpCtx) : fillColor;
+      tmpCtx.fillRect(0, 0, w, h);
+
+      var imgData = tmpCtx.getImageData(0, 0, w, h);
+      var pixels = imgData.data;
+
+      applyStencilMask(pixels, inverseDecode);
+
+      tmpCtx.putImageData(imgData, 0, 0);
+      ctx.drawImage(tmpCanvas, 0, -h);
+      this.restore();
+    },
+
+    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
+      var imgData = this.objs.get(objId);
+      if (!imgData)
+        error('Dependent image isn\'t ready yet');
+
+      this.save();
+      var ctx = this.ctx;
+      var w = imgData.width;
+      var h = imgData.height;
+      // scale the image to the unit square
+      ctx.scale(1 / w, -1 / h);
+
+      var tmpCanvas = createScratchCanvas(w, h);
+      var tmpCtx = tmpCanvas.getContext('2d');
+      this.putBinaryImageData(tmpCtx, imgData, w, h);
+
+      ctx.drawImage(tmpCanvas, 0, -h);
+      this.restore();
+    },
+
+    putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
+      //
+    },
+
+    // Marked content
+
+    markPoint: function CanvasGraphics_markPoint(tag) {
+      TODO('Marked content');
+    },
+    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
+      TODO('Marked content');
+    },
+    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
+      TODO('Marked content');
+    },
+    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
+                                        tag, properties) {
+      TODO('Marked content');
+    },
+    endMarkedContent: function CanvasGraphics_endMarkedContent() {
+      TODO('Marked content');
+    },
+
+    // Compatibility
+
+    beginCompat: function CanvasGraphics_beginCompat() {
+      TODO('ignore undefined operators (should we do that anyway?)');
+    },
+    endCompat: function CanvasGraphics_endCompat() {
+      TODO('stop ignoring undefined operators');
+    },
+
+    // Helper functions
+
+    consumePath: function CanvasGraphics_consumePath() {
+      if (this.pendingClip) {
+        var savedFillRule = null;
+        if (this.pendingClip == EO_CLIP)
+          savedFillRule = this.setEOFillRule();
+
+        this.ctx.clip();
+
+        this.pendingClip = null;
+        if (savedFillRule !== null)
+          this.restoreFillRule(savedFillRule);
+      }
+      this.ctx.beginPath();
+    },
+    // We generally keep the canvas context set for
+    // nonzero-winding, and just set evenodd for the operations
+    // that need them.
+    setEOFillRule: function CanvasGraphics_setEOFillRule() {
+      var savedFillRule = this.ctx.mozFillRule;
+      this.ctx.mozFillRule = 'evenodd';
+      return savedFillRule;
+    },
+    restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
+      this.ctx.mozFillRule = rule;
+    },
+    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
+      var inverse = this.ctx.mozCurrentTransformInverse;
+      return Math.abs(inverse[0] + inverse[2]);
+    }
+  };
+
+  return CanvasGraphics;
+})();
+
+if (!isWorker) {
+  // Feature detection if the browser can use an Uint8Array directly as imgData.
+  var canvas = PdfJS_window.document.createElement('canvas');
+  canvas.width = 1;
+  canvas.height = 1;
+  var ctx = canvas.getContext('2d');
+
+  try {
+    ctx.putImageData({
+      width: 1,
+      height: 1,
+      data: new Uint8Array(4)
+    }, 0, 0);
+
+    CanvasGraphics.prototype.putBinaryImageData =
+      function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
+        ctx.putImageData(imgData, 0, 0);
+      };
+  } catch (e) {
+    CanvasGraphics.prototype.putBinaryImageData =
+      function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
+        var tmpImgData = ctx.getImageData(0, 0, w, h);
+
+        // Copy over the imageData pixel by pixel.
+        var tmpImgDataPixels = tmpImgData.data;
+        var len = tmpImgDataPixels.length;
+
+        while (len--) {
+          tmpImgDataPixels[len] = imgData.data[len];
+        }
+
+        ctx.putImageData(tmpImgData, 0, 0);
+      };
+  }
+}
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Name = (function NameClosure() {
+  function Name(name) {
+    this.name = name;
+  }
+
+  Name.prototype = {};
+
+  return Name;
+})();
+
+var Cmd = (function CmdClosure() {
+  function Cmd(cmd) {
+    this.cmd = cmd;
+  }
+
+  Cmd.prototype = {};
+
+  var cmdCache = {};
+
+  Cmd.get = function Cmd_get(cmd) {
+    var cmdValue = cmdCache[cmd];
+    if (cmdValue)
+      return cmdValue;
+
+    return cmdCache[cmd] = new Cmd(cmd);
+  };
+
+  return Cmd;
+})();
+
+var Dict = (function DictClosure() {
+  // xref is optional
+  function Dict(xref) {
+    // Map should only be used internally, use functions below to access.
+    var map = Object.create(null);
+
+    this.assignXref = function Dict_assignXref(newXref) {
+      xref = newXref;
+    };
+
+    // automatically dereferences Ref objects
+    this.get = function Dict_get(key1, key2, key3) {
+      var value;
+      if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
+          typeof key2 == 'undefined') {
+        return xref ? xref.fetchIfRef(value) : value;
+      }
+      if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
+          typeof key3 == 'undefined') {
+        return xref ? xref.fetchIfRef(value) : value;
+      }
+      value = map[key3] || null;
+      return xref ? xref.fetchIfRef(value) : value;
+    };
+
+    // no dereferencing
+    this.getRaw = function Dict_getRaw(key) {
+      return map[key];
+    };
+
+    // creates new map and dereferences all Refs
+    this.getAll = function Dict_getAll() {
+      var all = {};
+      for (var key in map) {
+        var obj = this.get(key);
+        all[key] = obj instanceof Dict ? obj.getAll() : obj;
+      }
+      return all;
+    };
+
+    this.set = function Dict_set(key, value) {
+      map[key] = value;
+    };
+
+    this.has = function Dict_has(key) {
+      return key in map;
+    };
+
+    this.forEach = function Dict_forEach(callback) {
+      for (var key in map) {
+        callback(key, this.get(key));
+      }
+    };
+  };
+
+  return Dict;
+})();
+
+var Ref = (function RefClosure() {
+  function Ref(num, gen) {
+    this.num = num;
+    this.gen = gen;
+  }
+
+  Ref.prototype = {};
+
+  return Ref;
+})();
+
+// The reference is identified by number and generation,
+// this structure stores only one instance of the reference.
+var RefSet = (function RefSetClosure() {
+  function RefSet() {
+    this.dict = {};
+  }
+
+  RefSet.prototype = {
+    has: function RefSet_has(ref) {
+      return !!this.dict['R' + ref.num + '.' + ref.gen];
+    },
+
+    put: function RefSet_put(ref) {
+      this.dict['R' + ref.num + '.' + ref.gen] = ref;
+    }
+  };
+
+  return RefSet;
+})();
+
+var Catalog = (function CatalogClosure() {
+  function Catalog(xref) {
+    this.xref = xref;
+    var obj = xref.getCatalogObj();
+    assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
+    this.catDict = obj;
+  }
+
+  Catalog.prototype = {
+    get metadata() {
+      var stream = this.catDict.get('Metadata');
+      var metadata;
+      if (stream && isDict(stream.dict)) {
+        var type = stream.dict.get('Type');
+        var subtype = stream.dict.get('Subtype');
+
+        if (isName(type) && isName(subtype) &&
+            type.name === 'Metadata' && subtype.name === 'XML') {
+          metadata = stringToPDFString(bytesToString(stream.getBytes()));
+        }
+      }
+
+      return shadow(this, 'metadata', metadata);
+    },
+    get toplevelPagesDict() {
+      var pagesObj = this.catDict.get('Pages');
+      assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
+      // shadow the prototype getter
+      return shadow(this, 'toplevelPagesDict', pagesObj);
+    },
+    get documentOutline() {
+      var xref = this.xref;
+      var obj = this.catDict.get('Outlines');
+      var root = { items: [] };
+      if (isDict(obj)) {
+        obj = obj.getRaw('First');
+        var processed = new RefSet();
+        if (isRef(obj)) {
+          var queue = [{obj: obj, parent: root}];
+          // to avoid recursion keeping track of the items
+          // in the processed dictionary
+          processed.put(obj);
+          while (queue.length > 0) {
+            var i = queue.shift();
+            var outlineDict = xref.fetchIfRef(i.obj);
+            if (outlineDict === null)
+              continue;
+            if (!outlineDict.has('Title'))
+              error('Invalid outline item');
+            var dest = outlineDict.get('A');
+            if (dest)
+              dest = dest.get('D');
+            else if (outlineDict.has('Dest')) {
+              dest = outlineDict.getRaw('Dest');
+              if (isName(dest))
+                dest = dest.name;
+            }
+            var title = outlineDict.get('Title');
+            var outlineItem = {
+              dest: dest,
+              title: stringToPDFString(title),
+              color: outlineDict.get('C') || [0, 0, 0],
+              count: outlineDict.get('Count'),
+              bold: !!(outlineDict.get('F') & 2),
+              italic: !!(outlineDict.get('F') & 1),
+              items: []
+            };
+            i.parent.items.push(outlineItem);
+            obj = outlineDict.getRaw('First');
+            if (isRef(obj) && !processed.has(obj)) {
+              queue.push({obj: obj, parent: outlineItem});
+              processed.put(obj);
+            }
+            obj = outlineDict.getRaw('Next');
+            if (isRef(obj) && !processed.has(obj)) {
+              queue.push({obj: obj, parent: i.parent});
+              processed.put(obj);
+            }
+          }
+        }
+      }
+      obj = root.items.length > 0 ? root.items : null;
+      return shadow(this, 'documentOutline', obj);
+    },
+    get numPages() {
+      var obj = this.toplevelPagesDict.get('Count');
+      assertWellFormed(
+        isInt(obj),
+        'page count in top level pages object is not an integer'
+      );
+      // shadow the prototype getter
+      return shadow(this, 'num', obj);
+    },
+    traverseKids: function Catalog_traverseKids(pagesDict) {
+      var pageCache = this.pageCache;
+      var kids = pagesDict.get('Kids');
+      assertWellFormed(isArray(kids),
+                       'page dictionary kids object is not an array');
+      for (var i = 0, ii = kids.length; i < ii; ++i) {
+        var kid = kids[i];
+        assertWellFormed(isRef(kid),
+                        'page dictionary kid is not a reference');
+        var obj = this.xref.fetch(kid);
+        if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
+          pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
+        } else { // must be a child page dictionary
+          assertWellFormed(
+            isDict(obj),
+            'page dictionary kid reference points to wrong type of object'
+          );
+          this.traverseKids(obj);
+        }
+      }
+    },
+    get destinations() {
+      function fetchDestination(dest) {
+        return isDict(dest) ? dest.get('D') : dest;
+      }
+
+      var xref = this.xref;
+      var dests = {}, nameTreeRef, nameDictionaryRef;
+      var obj = this.catDict.get('Names');
+      if (obj)
+        nameTreeRef = obj.getRaw('Dests');
+      else if (this.catDict.has('Dests'))
+        nameDictionaryRef = this.catDict.get('Dests');
+
+      if (nameDictionaryRef) {
+        // reading simple destination dictionary
+        obj = nameDictionaryRef;
+        obj.forEach(function catalogForEach(key, value) {
+          if (!value) return;
+          dests[key] = fetchDestination(value);
+        });
+      }
+      if (nameTreeRef) {
+        // reading name tree
+        var processed = new RefSet();
+        processed.put(nameTreeRef);
+        var queue = [nameTreeRef];
+        while (queue.length > 0) {
+          var i, n;
+          obj = xref.fetch(queue.shift());
+          if (obj.has('Kids')) {
+            var kids = obj.get('Kids');
+            for (i = 0, n = kids.length; i < n; i++) {
+              var kid = kids[i];
+              if (processed.has(kid))
+                error('invalid destinations');
+              queue.push(kid);
+              processed.put(kid);
+            }
+            continue;
+          }
+          var names = obj.get('Names');
+          for (i = 0, n = names.length; i < n; i += 2) {
+            dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
+          }
+        }
+      }
+      return shadow(this, 'destinations', dests);
+    },
+    getPage: function Catalog_getPage(n) {
+      var pageCache = this.pageCache;
+      if (!pageCache) {
+        pageCache = this.pageCache = [];
+        this.traverseKids(this.toplevelPagesDict);
+      }
+      return this.pageCache[n - 1];
+    }
+  };
+
+  return Catalog;
+})();
+
+var XRef = (function XRefClosure() {
+  function XRef(stream, startXRef, mainXRefEntriesOffset) {
+    this.stream = stream;
+    this.entries = [];
+    this.xrefstms = {};
+    var trailerDict = this.readXRef(startXRef);
+    trailerDict.assignXref(this);
+    this.trailer = trailerDict;
+    // prepare the XRef cache
+    this.cache = [];
+
+    var encrypt = trailerDict.get('Encrypt');
+    if (encrypt) {
+      var fileId = trailerDict.get('ID');
+      this.encrypt = new CipherTransformFactory(encrypt,
+                                                fileId[0] /*, password */);
+    }
+
+    // get the root dictionary (catalog) object
+    if (!(this.root = trailerDict.get('Root')))
+      error('Invalid root reference');
+  }
+
+  XRef.prototype = {
+    readXRefTable: function XRef_readXRefTable(parser) {
+      // Example of cross-reference table:
+      // xref
+      // 0 1                    <-- subsection header (first obj #, obj count)
+      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
+      // 23 2                   <-- subsection header ... and so on ...
+      // 0000025518 00002 n
+      // 0000025635 00000 n
+      // trailer
+      // ...
+
+      // Outer loop is over subsection headers
+      var obj;
+      while (!isCmd(obj = parser.getObj(), 'trailer')) {
+        var first = obj,
+            count = parser.getObj();
+
+        if (!isInt(first) || !isInt(count))
+          error('Invalid XRef table: wrong types in subsection header');
+
+        // Inner loop is over objects themselves
+        for (var i = 0; i < count; i++) {
+          var entry = {};
+          entry.offset = parser.getObj();
+          entry.gen = parser.getObj();
+          var type = parser.getObj();
+
+          if (isCmd(type, 'f'))
+            entry.free = true;
+          else if (isCmd(type, 'n'))
+            entry.uncompressed = true;
+
+          // Validate entry obj
+          if (!isInt(entry.offset) || !isInt(entry.gen) ||
+              !(entry.free || entry.uncompressed)) {
+            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
+          }
+
+          if (!this.entries[i + first])
+            this.entries[i + first] = entry;
+        }
+      }
+
+      // Sanity check: as per spec, first object must be free
+      if (this.entries[0] && !this.entries[0].free)
+        error('Invalid XRef table: unexpected first object');
+
+      // Sanity check
+      if (!isCmd(obj, 'trailer'))
+        error('Invalid XRef table: could not find trailer dictionary');
+
+      // Read trailer dictionary, e.g.
+      // trailer
+      //    << /Size 22
+      //      /Root 20R
+      //      /Info 10R
+      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
+      //    >>
+      // The parser goes through the entire stream << ... >> and provides
+      // a getter interface for the key-value table
+      var dict = parser.getObj();
+      if (!isDict(dict))
+        error('Invalid XRef table: could not parse trailer dictionary');
+
+      return dict;
+    },
+    readXRefStream: function XRef_readXRefStream(stream) {
+      var streamParameters = stream.parameters;
+      var byteWidths = streamParameters.get('W');
+      var range = streamParameters.get('Index');
+      if (!range)
+        range = [0, streamParameters.get('Size')];
+      var i, j;
+      while (range.length > 0) {
+        var first = range[0], n = range[1];
+        if (!isInt(first) || !isInt(n))
+          error('Invalid XRef range fields: ' + first + ', ' + n);
+        var typeFieldWidth = byteWidths[0];
+        var offsetFieldWidth = byteWidths[1];
+        var generationFieldWidth = byteWidths[2];
+        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
+            !isInt(generationFieldWidth)) {
+          error('Invalid XRef entry fields length: ' + first + ', ' + n);
+        }
+        for (i = 0; i < n; ++i) {
+          var type = 0, offset = 0, generation = 0;
+          for (j = 0; j < typeFieldWidth; ++j)
+            type = (type << 8) | stream.getByte();
+          // if type field is absent, its default value = 1
+          if (typeFieldWidth == 0)
+            type = 1;
+          for (j = 0; j < offsetFieldWidth; ++j)
+            offset = (offset << 8) | stream.getByte();
+          for (j = 0; j < generationFieldWidth; ++j)
+            generation = (generation << 8) | stream.getByte();
+          var entry = {};
+          entry.offset = offset;
+          entry.gen = generation;
+          switch (type) {
+            case 0:
+              entry.free = true;
+              break;
+            case 1:
+              entry.uncompressed = true;
+              break;
+            case 2:
+              break;
+            default:
+              error('Invalid XRef entry type: ' + type);
+          }
+          if (!this.entries[first + i])
+            this.entries[first + i] = entry;
+        }
+        range.splice(0, 2);
+      }
+      return streamParameters;
+    },
+    indexObjects: function XRef_indexObjects() {
+      // Simple scan through the PDF content to find objects,
+      // trailers and XRef streams.
+      function readToken(data, offset) {
+        var token = '', ch = data[offset];
+        while (ch !== 13 && ch !== 10) {
+          if (++offset >= data.length)
+            break;
+          token += String.fromCharCode(ch);
+          ch = data[offset];
+        }
+        return token;
+      }
+      function skipUntil(data, offset, what) {
+        var length = what.length, dataLength = data.length;
+        var skipped = 0;
+        // finding byte sequence
+        while (offset < dataLength) {
+          var i = 0;
+          while (i < length && data[offset + i] == what[i])
+            ++i;
+          if (i >= length)
+            break; // sequence found
+
+          offset++;
+          skipped++;
+        }
+        return skipped;
+      }
+      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
+                                          101, 102]);
+      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
+      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+
+      var stream = this.stream;
+      stream.pos = 0;
+      var buffer = stream.getBytes();
+      var position = stream.start, length = buffer.length;
+      var trailers = [], xrefStms = [];
+      var state = 0;
+      var currentToken;
+      while (position < length) {
+        var ch = buffer[position];
+        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
+          ++position;
+          continue;
+        }
+        if (ch === 37) { // %-comment
+          do {
+            ++position;
+            ch = buffer[position];
+          } while (ch !== 13 && ch !== 10);
+          continue;
+        }
+        var token = readToken(buffer, position);
+        var m;
+        if (token === 'xref') {
+          position += skipUntil(buffer, position, trailerBytes);
+          trailers.push(position);
+          position += skipUntil(buffer, position, startxrefBytes);
+        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
+          this.entries[m[1]] = {
+            offset: position,
+            gen: m[2] | 0,
+            uncompressed: true
+          };
+
+          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
+          var content = buffer.subarray(position, position + contentLength);
+
+          // checking XRef stream suspect
+          // (it shall have '/XRef' and next char is not a letter)
+          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+          if (xrefTagOffset < contentLength &&
+              content[xrefTagOffset + 5] < 64) {
+            xrefStms.push(position);
+            this.xrefstms[position] = 1; // don't read it recursively
+          }
+
+          position += contentLength;
+        } else
+          position += token.length + 1;
+      }
+      // reading XRef streams
+      for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
+          this.readXRef(xrefStms[i], true);
+      }
+      // finding main trailer
+      var dict;
+      for (var i = 0, ii = trailers.length; i < ii; ++i) {
+        stream.pos = trailers[i];
+        var parser = new Parser(new Lexer(stream), true, null);
+        var obj = parser.getObj();
+        if (!isCmd(obj, 'trailer'))
+          continue;
+        // read the trailer dictionary
+        if (!isDict(dict = parser.getObj()))
+          continue;
+        // taking the first one with 'ID'
+        if (dict.has('ID'))
+          return dict;
+      }
+      // no tailer with 'ID', taking last one (if exists)
+      if (dict)
+        return dict;
+      // nothing helps
+      error('Invalid PDF structure');
+    },
+    readXRef: function XRef_readXRef(startXRef, recoveryMode) {
+      var stream = this.stream;
+      stream.pos = startXRef;
+
+      try {
+        var parser = new Parser(new Lexer(stream), true, null);
+        var obj = parser.getObj();
+        var dict;
+
+        // Get dictionary
+        if (isCmd(obj, 'xref')) {
+          // Parse end-of-file XRef
+          dict = this.readXRefTable(parser);
+
+          // Recursively get other XRefs 'XRefStm', if any
+          obj = dict.get('XRefStm');
+          if (isInt(obj)) {
+            var pos = obj;
+            // ignore previously loaded xref streams
+            // (possible infinite recursion)
+            if (!(pos in this.xrefstms)) {
+              this.xrefstms[pos] = 1;
+              this.readXRef(pos);
+            }
+          }
+        } else if (isInt(obj)) {
+          // Parse in-stream XRef
+          if (!isInt(parser.getObj()) ||
+              !isCmd(parser.getObj(), 'obj') ||
+              !isStream(obj = parser.getObj())) {
+            error('Invalid XRef stream');
+          }
+          dict = this.readXRefStream(obj);
+          if (!dict)
+            error('Failed to read XRef stream');
+        }
+
+        // Recursively get previous dictionary, if any
+        obj = dict.get('Prev');
+        if (isInt(obj))
+          this.readXRef(obj, recoveryMode);
+        else if (isRef(obj)) {
+          // The spec says Prev must not be a reference, i.e. "/Prev NNN"
+          // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
+          this.readXRef(obj.num, recoveryMode);
+        }
+
+        return dict;
+      } catch (e) {
+        log('(while reading XRef): ' + e);
+      }
+
+      if (recoveryMode)
+        return;
+
+      warn('Indexing all PDF objects');
+      return this.indexObjects();
+    },
+    getEntry: function XRef_getEntry(i) {
+      var e = this.entries[i];
+      if (e === null)
+        return null;
+      return e.free ? null : e; // returns null is the entry is free
+    },
+    fetchIfRef: function XRef_fetchIfRef(obj) {
+      if (!isRef(obj))
+        return obj;
+      return this.fetch(obj);
+    },
+    fetch: function XRef_fetch(ref, suppressEncryption) {
+      assertWellFormed(isRef(ref), 'ref object is not a reference');
+      var num = ref.num;
+      if (num in this.cache)
+        return this.cache[num];
+
+      var e = this.getEntry(num);
+
+      // the referenced entry can be free
+      if (e === null)
+        return (this.cache[num] = e);
+
+      var gen = ref.gen;
+      var stream, parser;
+      if (e.uncompressed) {
+        if (e.gen != gen)
+          error('inconsistent generation in XRef');
+        stream = this.stream.makeSubStream(e.offset);
+        parser = new Parser(new Lexer(stream), true, this);
+        var obj1 = parser.getObj();
+        var obj2 = parser.getObj();
+        var obj3 = parser.getObj();
+        if (!isInt(obj1) || obj1 != num ||
+            !isInt(obj2) || obj2 != gen ||
+            !isCmd(obj3)) {
+          error('bad XRef entry');
+        }
+        if (!isCmd(obj3, 'obj')) {
+          // some bad pdfs use "obj1234" and really mean 1234
+          if (obj3.cmd.indexOf('obj') == 0) {
+            num = parseInt(obj3.cmd.substring(3), 10);
+            if (!isNaN(num))
+              return num;
+          }
+          error('bad XRef entry');
+        }
+        if (this.encrypt && !suppressEncryption) {
+          try {
+            e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
+          } catch (ex) {
+            // almost all streams must be encrypted, but sometimes
+            // they are not probably due to some broken generators
+            // re-trying without encryption
+            return this.fetch(ref, true);
+          }
+        } else {
+          e = parser.getObj();
+        }
+        // Don't cache streams since they are mutable (except images).
+        if (!isStream(e) || e instanceof JpegStream)
+          this.cache[num] = e;
+        return e;
+      }
+
+      // compressed entry
+      stream = this.fetch(new Ref(e.offset, 0));
+      if (!isStream(stream))
+        error('bad ObjStm stream');
+      var first = stream.parameters.get('First');
+      var n = stream.parameters.get('N');
+      if (!isInt(first) || !isInt(n)) {
+        error('invalid first and n parameters for ObjStm stream');
+      }
+      parser = new Parser(new Lexer(stream), false, this);
+      var i, entries = [], nums = [];
+      // read the object numbers to populate cache
+      for (i = 0; i < n; ++i) {
+        num = parser.getObj();
+        if (!isInt(num)) {
+          error('invalid object number in the ObjStm stream: ' + num);
+        }
+        nums.push(num);
+        var offset = parser.getObj();
+        if (!isInt(offset)) {
+          error('invalid object offset in the ObjStm stream: ' + offset);
+        }
+      }
+      // read stream objects for cache
+      for (i = 0; i < n; ++i) {
+        entries.push(parser.getObj());
+        this.cache[nums[i]] = entries[i];
+      }
+      e = entries[e.gen];
+      if (!e) {
+        error('bad XRef entry for compressed object');
+      }
+      return e;
+    },
+    getCatalogObj: function XRef_getCatalogObj() {
+      return this.root;
+    }
+  };
+
+  return XRef;
+})();
+
+/**
+ * A PDF document and page is built of many objects. E.g. there are objects
+ * for fonts, images, rendering code and such. These objects might get processed
+ * inside of a worker. The `PDFObjects` implements some basic functions to
+ * manage these objects.
+ */
+var PDFObjects = (function PDFObjectsClosure() {
+  function PDFObjects() {
+    this.objs = {};
+  }
+
+  PDFObjects.prototype = {
+    objs: null,
+
+    /**
+     * Internal function.
+     * Ensures there is an object defined for `objId`. Stores `data` on the
+     * object *if* it is created.
+     */
+    ensureObj: function PDFObjects_ensureObj(objId, data) {
+      if (this.objs[objId])
+        return this.objs[objId];
+      return this.objs[objId] = new Promise(objId, data);
+    },
+
+    /**
+     * If called *without* callback, this returns the data of `objId` but the
+     * object needs to be resolved. If it isn't, this function throws.
+     *
+     * If called *with* a callback, the callback is called with the data of the
+     * object once the object is resolved. That means, if you call this
+     * function and the object is already resolved, the callback gets called
+     * right away.
+     */
+    get: function PDFObjects_get(objId, callback) {
+      // If there is a callback, then the get can be async and the object is
+      // not required to be resolved right now
+      if (callback) {
+        this.ensureObj(objId).then(callback);
+        return null;
+      }
+
+      // If there isn't a callback, the user expects to get the resolved data
+      // directly.
+      var obj = this.objs[objId];
+
+      // If there isn't an object yet or the object isn't resolved, then the
+      // data isn't ready yet!
+      if (!obj || !obj.isResolved)
+        error('Requesting object that isn\'t resolved yet ' + objId);
+
+      return obj.data;
+    },
+
+    /**
+     * Resolves the object `objId` with optional `data`.
+     */
+    resolve: function PDFObjects_resolve(objId, data) {
+      var objs = this.objs;
+
+      // In case there is a promise already on this object, just resolve it.
+      if (objs[objId]) {
+        objs[objId].resolve(data);
+      } else {
+        this.ensureObj(objId, data);
+      }
+    },
+
+    onData: function PDFObjects_onData(objId, callback) {
+      this.ensureObj(objId).onData(callback);
+    },
+
+    isResolved: function PDFObjects_isResolved(objId) {
+      var objs = this.objs;
+      if (!objs[objId]) {
+        return false;
+      } else {
+        return objs[objId].isResolved;
+      }
+    },
+
+    hasData: function PDFObjects_hasData(objId) {
+      var objs = this.objs;
+      if (!objs[objId]) {
+        return false;
+      } else {
+        return objs[objId].hasData;
+      }
+    },
+
+    /**
+     * Sets the data of an object but *doesn't* resolve it.
+     */
+    setData: function PDFObjects_setData(objId, data) {
+      // Watchout! If you call `this.ensureObj(objId, data)` you're going to
+      // create a *resolved* promise which shouldn't be the case!
+      this.ensureObj(objId).data = data;
+    }
+  };
+  return PDFObjects;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFFunction = (function PDFFunctionClosure() {
+  var CONSTRUCT_SAMPLED = 0;
+  var CONSTRUCT_INTERPOLATED = 2;
+  var CONSTRUCT_STICHED = 3;
+  var CONSTRUCT_POSTSCRIPT = 4;
+
+  return {
+    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
+                                                       str) {
+      var length = 1;
+      for (var i = 0, ii = size.length; i < ii; i++)
+        length *= size[i];
+      length *= outputSize;
+
+      var array = [];
+      var codeSize = 0;
+      var codeBuf = 0;
+      // 32 is a valid bps so shifting won't work
+      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+      var strBytes = str.getBytes((length * bps + 7) / 8);
+      var strIdx = 0;
+      for (var i = 0; i < length; i++) {
+        while (codeSize < bps) {
+          codeBuf <<= 8;
+          codeBuf |= strBytes[strIdx++];
+          codeSize += 8;
+        }
+        codeSize -= bps;
+        array.push((codeBuf >> codeSize) * sampleMul);
+        codeBuf &= (1 << codeSize) - 1;
+      }
+      return array;
+    },
+
+    getIR: function PDFFunction_getIR(xref, fn) {
+      var dict = fn.dict;
+      if (!dict)
+        dict = fn;
+
+      var types = [this.constructSampled,
+                   null,
+                   this.constructInterpolated,
+                   this.constructStiched,
+                   this.constructPostScript];
+
+      var typeNum = dict.get('FunctionType');
+      var typeFn = types[typeNum];
+      if (!typeFn)
+        error('Unknown type of function');
+
+      return typeFn.call(this, fn, dict, xref);
+    },
+
+    fromIR: function PDFFunction_fromIR(IR) {
+      var type = IR[0];
+      switch (type) {
+        case CONSTRUCT_SAMPLED:
+          return this.constructSampledFromIR(IR);
+        case CONSTRUCT_INTERPOLATED:
+          return this.constructInterpolatedFromIR(IR);
+        case CONSTRUCT_STICHED:
+          return this.constructStichedFromIR(IR);
+        case CONSTRUCT_POSTSCRIPT:
+        default:
+          return this.constructPostScriptFromIR(IR);
+      }
+    },
+
+    parse: function PDFFunction_parse(xref, fn) {
+      var IR = this.getIR(xref, fn);
+      return this.fromIR(IR);
+    },
+
+    constructSampled: function PDFFunction_constructSampled(str, dict) {
+      function toMultiArray(arr) {
+        var inputLength = arr.length;
+        var outputLength = arr.length / 2;
+        var out = [];
+        var index = 0;
+        for (var i = 0; i < inputLength; i += 2) {
+          out[index] = [arr[i], arr[i + 1]];
+          ++index;
+        }
+        return out;
+      }
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain || !range)
+        error('No domain or range');
+
+      var inputSize = domain.length / 2;
+      var outputSize = range.length / 2;
+
+      domain = toMultiArray(domain);
+      range = toMultiArray(range);
+
+      var size = dict.get('Size');
+      var bps = dict.get('BitsPerSample');
+      var order = dict.get('Order');
+      if (!order)
+        order = 1;
+      if (order !== 1)
+        error('No support for cubic spline interpolation: ' + order);
+
+      var encode = dict.get('Encode');
+      if (!encode) {
+        encode = [];
+        for (var i = 0; i < inputSize; ++i) {
+          encode.push(0);
+          encode.push(size[i] - 1);
+        }
+      }
+      encode = toMultiArray(encode);
+
+      var decode = dict.get('Decode');
+      if (!decode)
+        decode = range;
+      else
+        decode = toMultiArray(decode);
+
+      var samples = this.getSampleArray(size, outputSize, bps, str);
+
+      return [
+        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+        outputSize, Math.pow(2, bps) - 1, range
+      ];
+    },
+
+    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
+      // See chapter 3, page 109 of the PDF reference
+      function interpolate(x, xmin, xmax, ymin, ymax) {
+        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
+      }
+
+      return function constructSampledFromIRResult(args) {
+        // See chapter 3, page 110 of the PDF reference.
+        var m = IR[1];
+        var domain = IR[2];
+        var encode = IR[3];
+        var decode = IR[4];
+        var samples = IR[5];
+        var size = IR[6];
+        var n = IR[7];
+        var mask = IR[8];
+        var range = IR[9];
+
+        if (m != args.length)
+          error('Incorrect number of arguments: ' + inputSize + ' != ' +
+                args.length);
+
+        var x = args;
+
+        // Building the cube vertices: its part and sample index
+        // http://rjwagner49.com/Mathematics/Interpolation.pdf
+        var cubeVertices = 1 << m;
+        var cubeN = new Float64Array(cubeVertices);
+        var cubeVertex = new Uint32Array(cubeVertices);
+        for (var j = 0; j < cubeVertices; j++)
+          cubeN[j] = 1;
+
+        var k = n, pos = 1;
+        // Map x_i to y_j for 0 <= i < m using the sampled function.
+        for (var i = 0; i < m; ++i) {
+          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
+          var domain_2i = domain[i][0];
+          var domain_2i_1 = domain[i][1];
+          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
+
+          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
+          //                   Encode_2i, Encode_2i+1)
+          var e = interpolate(xi, domain_2i, domain_2i_1,
+                              encode[i][0], encode[i][1]);
+
+          // e_i' = min(max(e_i, 0), Size_i - 1)
+          var size_i = size[i];
+          e = Math.min(Math.max(e, 0), size_i - 1);
+
+          // Adjusting the cube: N and vertex sample index
+          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
+          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
+          var n1 = e - e0; // (e - e0) / (e1 - e0);
+          var offset0 = e0 * k;
+          var offset1 = offset0 + k; // e1 * k
+          for (var j = 0; j < cubeVertices; j++) {
+            if (j & pos) {
+              cubeN[j] *= n1;
+              cubeVertex[j] += offset1;
+            } else {
+              cubeN[j] *= n0;
+              cubeVertex[j] += offset0;
+            }
+          }
+
+          k *= size_i;
+          pos <<= 1;
+        }
+
+        var y = new Float64Array(n);
+        for (var j = 0; j < n; ++j) {
+          // Sum all cube vertices' samples portions
+          var rj = 0;
+          for (var i = 0; i < cubeVertices; i++)
+            rj += samples[cubeVertex[i] + j] * cubeN[i];
+
+          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
+          //                    Decode_2j, Decode_2j+1)
+          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+
+          // y_j = min(max(r_j, range_2j), range_2j+1)
+          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        }
+
+        return y;
+      }
+    },
+
+    constructInterpolated: function PDFFunction_constructInterpolated(str,
+                                                                      dict) {
+      var c0 = dict.get('C0') || [0];
+      var c1 = dict.get('C1') || [1];
+      var n = dict.get('N');
+
+      if (!isArray(c0) || !isArray(c1))
+        error('Illegal dictionary for interpolated function');
+
+      var length = c0.length;
+      var diff = [];
+      for (var i = 0; i < length; ++i)
+        diff.push(c1[i] - c0[i]);
+
+      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+    },
+
+    constructInterpolatedFromIR:
+      function PDFFunction_constructInterpolatedFromIR(IR) {
+      var c0 = IR[1];
+      var diff = IR[2];
+      var n = IR[3];
+
+      var length = diff.length;
+
+      return function constructInterpolatedFromIRResult(args) {
+        var x = n == 1 ? args[0] : Math.pow(args[0], n);
+
+        var out = [];
+        for (var j = 0; j < length; ++j)
+          out.push(c0[j] + (x * diff[j]));
+
+        return out;
+
+      }
+    },
+
+    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
+      var domain = dict.get('Domain');
+
+      if (!domain)
+        error('No domain');
+
+      var inputSize = domain.length / 2;
+      if (inputSize != 1)
+        error('Bad domain for stiched function');
+
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i)
+        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+
+      var bounds = dict.get('Bounds');
+      var encode = dict.get('Encode');
+
+      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+    },
+
+    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
+      var domain = IR[1];
+      var bounds = IR[2];
+      var encode = IR[3];
+      var fnsIR = IR[4];
+      var fns = [];
+
+      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+        fns.push(PDFFunction.fromIR(fnsIR[i]));
+      }
+
+      return function constructStichedFromIRResult(args) {
+        var clip = function constructStichedFromIRClip(v, min, max) {
+          if (v > max)
+            v = max;
+          else if (v < min)
+            v = min;
+          return v;
+        };
+
+        // clip to domain
+        var v = clip(args[0], domain[0], domain[1]);
+        // calulate which bound the value is in
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i])
+            break;
+        }
+
+        // encode value into domain of function
+        var dmin = domain[0];
+        if (i > 0)
+          dmin = bounds[i - 1];
+        var dmax = domain[1];
+        if (i < bounds.length)
+          dmax = bounds[i];
+
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+
+        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+        // call the appropropriate function
+        return fns[i]([v2]);
+      };
+    },
+
+    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
+                                                                  xref) {
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain)
+        error('No domain.');
+
+      if (!range)
+        error('No range.');
+
+      var lexer = new PostScriptLexer(fn);
+      var parser = new PostScriptParser(lexer);
+      var code = parser.parse();
+
+      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+    },
+
+    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
+                                          IR) {
+      var domain = IR[1];
+      var range = IR[2];
+      var code = IR[3];
+      var numOutputs = range.length / 2;
+      var evaluator = new PostScriptEvaluator(code);
+      // Cache the values for a big speed up, the cache size is limited though
+      // since the number of possible values can be huge from a PS function.
+      var cache = new FunctionCache();
+      return function constructPostScriptFromIRResult(args) {
+        var initialStack = [];
+        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
+          initialStack.push(args[i]);
+        }
+
+        var key = initialStack.join('_');
+        if (cache.has(key))
+          return cache.get(key);
+
+        var stack = evaluator.execute(initialStack);
+        var transformed = [];
+        for (i = numOutputs - 1; i >= 0; --i) {
+          var out = stack.pop();
+          var rangeIndex = 2 * i;
+          if (out < range[rangeIndex])
+            out = range[rangeIndex];
+          else if (out > range[rangeIndex + 1])
+            out = range[rangeIndex + 1];
+          transformed[i] = out;
+        }
+        cache.set(key, transformed);
+        return transformed;
+      };
+    }
+  };
+})();
+
+var FunctionCache = (function FunctionCacheClosure() {
+  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
+  // was 256. This still may need some tweaking in the future though.
+  var MAX_CACHE_SIZE = 1024;
+  function FunctionCache() {
+    this.cache = {};
+    this.total = 0;
+  }
+  FunctionCache.prototype = {
+    has: function FunctionCache_has(key) {
+      return key in this.cache;
+    },
+    get: function FunctionCache_get(key) {
+      return this.cache[key];
+    },
+    set: function FunctionCache_set(key, value) {
+      if (this.total < MAX_CACHE_SIZE) {
+        this.cache[key] = value;
+        this.total++;
+      }
+    }
+  };
+  return FunctionCache;
+})();
+
+var PostScriptStack = (function PostScriptStackClosure() {
+  var MAX_STACK_SIZE = 100;
+  function PostScriptStack(initialStack) {
+    this.stack = initialStack || [];
+  }
+
+  PostScriptStack.prototype = {
+    push: function PostScriptStack_push(value) {
+      if (this.stack.length >= MAX_STACK_SIZE)
+        error('PostScript function stack overflow.');
+      this.stack.push(value);
+    },
+    pop: function PostScriptStack_pop() {
+      if (this.stack.length <= 0)
+        error('PostScript function stack underflow.');
+      return this.stack.pop();
+    },
+    copy: function PostScriptStack_copy(n) {
+      if (this.stack.length + n >= MAX_STACK_SIZE)
+        error('PostScript function stack overflow.');
+      var stack = this.stack;
+      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
+        stack.push(stack[i]);
+    },
+    index: function PostScriptStack_index(n) {
+      this.push(this.stack[this.stack.length - n - 1]);
+    },
+    // rotate the last n stack elements p times
+    roll: function PostScriptStack_roll(n, p) {
+      var stack = this.stack;
+      var l = stack.length - n;
+      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
+      for (i = l, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = l, j = c - 1; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+      for (i = c, j = r; i < j; i++, j--) {
+        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+      }
+    }
+  };
+  return PostScriptStack;
+})();
+var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
+  function PostScriptEvaluator(operators, operands) {
+    this.operators = operators;
+    this.operands = operands;
+  }
+  PostScriptEvaluator.prototype = {
+    execute: function PostScriptEvaluator_execute(initialStack) {
+      var stack = new PostScriptStack(initialStack);
+      var counter = 0;
+      var operators = this.operators;
+      var length = operators.length;
+      var operator, a, b;
+      while (counter < length) {
+        operator = operators[counter++];
+        if (typeof operator == 'number') {
+          // Operator is really an operand and should be pushed to the stack.
+          stack.push(operator);
+          continue;
+        }
+        switch (operator) {
+          // non standard ps operators
+          case 'jz': // jump if false
+            b = stack.pop();
+            a = stack.pop();
+            if (!a)
+              counter = b;
+            break;
+          case 'j': // jump
+            a = stack.pop();
+            counter = a;
+            break;
+
+          // all ps operators in alphabetical order (excluding if/ifelse)
+          case 'abs':
+            a = stack.pop();
+            stack.push(Math.abs(a));
+            break;
+          case 'add':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a + b);
+            break;
+          case 'and':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b))
+              stack.push(a && b);
+            else
+              stack.push(a & b);
+            break;
+          case 'atan':
+            a = stack.pop();
+            stack.push(Math.atan(a));
+            break;
+          case 'bitshift':
+            b = stack.pop();
+            a = stack.pop();
+            if (a > 0)
+              stack.push(a << b);
+            else
+              stack.push(a >> b);
+            break;
+          case 'ceiling':
+            a = stack.pop();
+            stack.push(Math.ceil(a));
+            break;
+          case 'copy':
+            a = stack.pop();
+            stack.copy(a);
+            break;
+          case 'cos':
+            a = stack.pop();
+            stack.push(Math.cos(a));
+            break;
+          case 'cvi':
+            a = stack.pop() | 0;
+            stack.push(a);
+            break;
+          case 'cvr':
+            // noop
+            break;
+          case 'div':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b);
+            break;
+          case 'dup':
+            stack.copy(1);
+            break;
+          case 'eq':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a == b);
+            break;
+          case 'exch':
+            stack.roll(2, 1);
+            break;
+          case 'exp':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(Math.pow(a, b));
+            break;
+          case 'false':
+            stack.push(false);
+            break;
+          case 'floor':
+            a = stack.pop();
+            stack.push(Math.floor(a));
+            break;
+          case 'ge':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a >= b);
+            break;
+          case 'gt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a > b);
+            break;
+          case 'idiv':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push((a / b) | 0);
+            break;
+          case 'index':
+            a = stack.pop();
+            stack.index(a);
+            break;
+          case 'le':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a <= b);
+            break;
+          case 'ln':
+            a = stack.pop();
+            stack.push(Math.log(a));
+            break;
+          case 'log':
+            a = stack.pop();
+            stack.push(Math.log(a) / Math.LN10);
+            break;
+          case 'lt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a < b);
+            break;
+          case 'mod':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a % b);
+            break;
+          case 'mul':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a * b);
+            break;
+          case 'ne':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a != b);
+            break;
+          case 'neg':
+            a = stack.pop();
+            stack.push(-b);
+            break;
+          case 'not':
+            a = stack.pop();
+            if (isBool(a) && isBool(b))
+              stack.push(a && b);
+            else
+              stack.push(a & b);
+            break;
+          case 'or':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b))
+              stack.push(a || b);
+            else
+              stack.push(a | b);
+            break;
+          case 'pop':
+            stack.pop();
+            break;
+          case 'roll':
+            b = stack.pop();
+            a = stack.pop();
+            stack.roll(a, b);
+            break;
+          case 'round':
+            a = stack.pop();
+            stack.push(Math.round(a));
+            break;
+          case 'sin':
+            a = stack.pop();
+            stack.push(Math.sin(a));
+            break;
+          case 'sqrt':
+            a = stack.pop();
+            stack.push(Math.sqrt(a));
+            break;
+          case 'sub':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a - b);
+            break;
+          case 'true':
+            stack.push(true);
+            break;
+          case 'truncate':
+            a = stack.pop();
+            a = a < 0 ? Math.ceil(a) : Math.floor(a);
+            stack.push(a);
+            break;
+          case 'xor':
+            b = stack.pop();
+            a = stack.pop();
+            if (isBool(a) && isBool(b))
+              stack.push(a != b);
+            else
+              stack.push(a ^ b);
+            break;
+          default:
+            error('Unknown operator ' + operator);
+            break;
+        }
+      }
+      return stack.stack;
+    }
+  };
+  return PostScriptEvaluator;
+})();
+
+var PostScriptParser = (function PostScriptParserClosure() {
+  function PostScriptParser(lexer) {
+    this.lexer = lexer;
+    this.operators = [];
+    this.token;
+    this.prev;
+  }
+  PostScriptParser.prototype = {
+    nextToken: function PostScriptParser_nextToken() {
+      this.prev = this.token;
+      this.token = this.lexer.getToken();
+    },
+    accept: function PostScriptParser_accept(type) {
+      if (this.token.type == type) {
+        this.nextToken();
+        return true;
+      }
+      return false;
+    },
+    expect: function PostScriptParser_expect(type) {
+      if (this.accept(type))
+        return true;
+      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
+            type + '.');
+    },
+    parse: function PostScriptParser_parse() {
+      this.nextToken();
+      this.expect(PostScriptTokenTypes.LBRACE);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      return this.operators;
+    },
+    parseBlock: function PostScriptParser_parseBlock() {
+      while (true) {
+        if (this.accept(PostScriptTokenTypes.NUMBER)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+          this.parseCondition();
+        } else {
+          return;
+        }
+      }
+    },
+    parseCondition: function PostScriptParser_parseCondition() {
+      // Add two place holders that will be updated later
+      var conditionLocation = this.operators.length;
+      this.operators.push(null, null);
+
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      if (this.accept(PostScriptTokenTypes.IF)) {
+        // The true block is right after the 'if' so it just falls through on
+        // true else it jumps and skips the true block.
+        this.operators[conditionLocation] = this.operators.length;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+        var jumpLocation = this.operators.length;
+        this.operators.push(null, null);
+        var endOfTrue = this.operators.length;
+        this.parseBlock();
+        this.expect(PostScriptTokenTypes.RBRACE);
+        this.expect(PostScriptTokenTypes.IFELSE);
+        // The jump is added at the end of the true block to skip the false
+        // block.
+        this.operators[jumpLocation] = this.operators.length;
+        this.operators[jumpLocation + 1] = 'j';
+
+        this.operators[conditionLocation] = endOfTrue;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else {
+        error('PS Function: error parsing conditional.');
+      }
+    }
+  };
+  return PostScriptParser;
+})();
+
+var PostScriptTokenTypes = {
+  LBRACE: 0,
+  RBRACE: 1,
+  NUMBER: 2,
+  OPERATOR: 3,
+  IF: 4,
+  IFELSE: 5
+};
+
+var PostScriptToken = (function PostScriptTokenClosure() {
+  function PostScriptToken(type, value) {
+    this.type = type;
+    this.value = value;
+  }
+
+  var opCache = {};
+
+  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
+    var opValue = opCache[op];
+    if (opValue)
+      return opValue;
+
+    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+  };
+
+  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
+                                                '{');
+  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
+                                                '}');
+  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
+  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
+                                                'IFELSE');
+  return PostScriptToken;
+})();
+
+var PostScriptLexer = (function PostScriptLexerClosure() {
+  function PostScriptLexer(stream) {
+    this.stream = stream;
+  }
+  PostScriptLexer.prototype = {
+    getToken: function PostScriptLexer_getToken() {
+      var s = '';
+      var ch;
+      var comment = false;
+      var stream = this.stream;
+
+      // skip comments
+      while (true) {
+        if (!(ch = stream.getChar()))
+          return EOF;
+
+        if (comment) {
+          if (ch == '\x0a' || ch == '\x0d')
+            comment = false;
+        } else if (ch == '%') {
+          comment = true;
+        } else if (!Lexer.isSpace(ch)) {
+          break;
+        }
+      }
+      switch (ch) {
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+        case '+': case '-': case '.':
+          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
+                                      this.getNumber(ch));
+        case '{':
+          return PostScriptToken.LBRACE;
+        case '}':
+          return PostScriptToken.RBRACE;
+      }
+      // operator
+      var str = ch.toLowerCase();
+      while (true) {
+        ch = stream.lookChar();
+        if (ch === null)
+          break;
+        ch = ch.toLowerCase();
+        if (ch >= 'a' && ch <= 'z')
+          str += ch;
+        else
+          break;
+        stream.skip();
+      }
+      switch (str) {
+        case 'if':
+          return PostScriptToken.IF;
+        case 'ifelse':
+          return PostScriptToken.IFELSE;
+        default:
+          return PostScriptToken.getOperator(str);
+      }
+    },
+    getNumber: function PostScriptLexer_getNumber(ch) {
+      var str = ch;
+      var stream = this.stream;
+      while (true) {
+        ch = stream.lookChar();
+        if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
+          str += ch;
+        else
+          break;
+        stream.skip();
+      }
+      var value = parseFloat(str);
+      if (isNaN(value))
+        error('Invalid floating point number: ' + value);
+      return value;
+    }
+  };
+  return PostScriptLexer;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ISOAdobeCharset = [
+  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
+  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
+  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
+  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
+  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
+  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
+  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
+  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
+  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
+  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
+  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
+  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
+  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
+  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
+  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
+  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
+  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
+  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
+  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
+  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
+  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
+  'ugrave', 'yacute', 'ydieresis', 'zcaron'
+];
+
+var ExpertCharset = [
+  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
+  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
+  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
+  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
+  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
+  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
+  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
+  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
+  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
+  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
+  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
+  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+  'Ydieresissmall'
+];
+
+var ExpertSubsetCharset = [
+  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
+  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
+  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
+  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
+  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+  'periodinferior', 'commainferior'
+];
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var CIDToUnicodeMaps = {
+  'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
+    {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
+    [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
+    0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
+    [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
+    [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
+    198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
+    174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
+    {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
+    {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
+    {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
+    {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
+    {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
+    {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
+    65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
+    {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
+    [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
+    8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
+    {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
+    9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
+    8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
+    {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
+    8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
+    8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
+    {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
+    {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
+    {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
+    {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
+    21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
+    28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
+    22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
+    24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
+    20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
+    26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
+    [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
+    37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
+    39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
+    32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
+    [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
+    [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
+    28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
+    21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
+    29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
+    30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
+    22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
+    28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
+    40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
+    25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
+    [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
+    29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
+    19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
+    22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
+    [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
+    33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
+    38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
+    34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
+    22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
+    39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
+    38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
+    24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
+    39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
+    25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
+    [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
+    23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
+    28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
+    36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
+    33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
+    33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
+    24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
+    24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
+    27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
+    31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
+    35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
+    39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
+    32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
+    22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
+    26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
+    27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
+    36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
+    20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
+    31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
+    21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
+    33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
+    [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
+    31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
+    23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
+    28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
+    20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
+    23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
+    29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
+    39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
+    [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
+    [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
+    33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
+    20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
+    39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
+    20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
+    31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
+    34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
+    21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
+    24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
+    31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
+    35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
+    25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
+    [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
+    20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
+    25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
+    30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
+    36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
+    24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
+    35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
+    [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
+    31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
+    38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
+    23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
+    35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
+    20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
+    22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
+    24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
+    25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
+    28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
+    32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
+    [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
+    37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
+    21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
+    21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
+    33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
+    20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
+    26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
+    21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
+    35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
+    22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
+    29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
+    21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
+    32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
+    26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
+    21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
+    38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
+    20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
+    29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
+    27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
+    [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
+    24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
+    [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
+    32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
+    35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
+    20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
+    29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
+    [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
+    31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
+    24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
+    33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
+    29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
+    20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
+    23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
+    29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
+    21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
+    23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
+    32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
+    36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
+    24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
+    22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
+    36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
+    26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
+    37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
+    32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
+    24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
+    21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
+    [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
+    25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
+    27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
+    30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
+    33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
+    37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
+    20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
+    26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
+    22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
+    35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
+    23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
+    27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
+    [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
+    36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
+    29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
+    37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
+    28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
+    29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
+    26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
+    28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
+    25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
+    [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
+    35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
+    33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
+    31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
+    20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
+    32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
+    23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
+    26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
+    33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
+    37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
+    32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
+    29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
+    35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
+    21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
+    25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
+    29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
+    33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
+    38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
+    20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
+    20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
+    23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
+    21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
+    39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
+    25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
+    36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
+    38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
+    27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
+    21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
+    36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
+    22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
+    31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
+    24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
+    24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
+    39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
+    33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
+    27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
+    29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
+    24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
+    28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
+    36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
+    25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
+    26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
+    20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
+    22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
+    20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
+    24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
+    31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
+    [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
+    37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
+    22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
+    20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
+    22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
+    36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
+    24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
+    22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
+    26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
+    31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
+    35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
+    38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
+    31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
+    28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
+    20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
+    22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
+    37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
+    37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
+    [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
+    24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
+    22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
+    24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
+    22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
+    24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
+    32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
+    30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
+    26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
+    30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
+    31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
+    39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
+    24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
+    39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
+    38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
+    27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
+    31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
+    30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
+    25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
+    30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
+    [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
+    27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
+    [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
+    31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
+    27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
+    30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
+    25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
+    22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
+    26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
+    36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
+    33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
+    21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
+    25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
+    25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
+    19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
+    38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
+    21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
+    36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
+    37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
+    24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
+    21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
+    25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
+    33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
+    40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
+    {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
+    33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
+    [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
+    27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
+    30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
+    27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
+    [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
+    24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
+    23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
+    [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
+    40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
+    37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
+    [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
+    29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
+    [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
+    24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
+    37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
+    38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
+    21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
+    26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
+    36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
+    19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
+    25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
+    31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
+    38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
+    32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
+    37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
+    21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
+    [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
+    30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
+    [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
+    20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
+    31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
+    32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
+    40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
+    20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
+    38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
+    24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
+    21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
+    24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
+    [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
+    35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
+    20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
+    24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
+    20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
+    20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
+    20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
+    20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
+    20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
+    20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
+    20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
+    20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
+    20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
+    20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
+    20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
+    20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
+    31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
+    20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
+    {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
+    20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
+    [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
+    21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
+    21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
+    36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
+    21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
+    21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
+    21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
+    21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
+    [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
+    21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
+    21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
+    21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
+    21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
+    21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
+    {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
+    21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
+    21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
+    21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
+    21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
+    22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
+    22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
+    22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
+    22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
+    22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
+    22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
+    22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
+    {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
+    22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
+    22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
+    22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
+    {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
+    22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
+    22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
+    20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
+    23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
+    {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
+    23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
+    23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
+    {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
+    [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
+    23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
+    {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
+    [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
+    23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
+    23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
+    23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
+    23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
+    23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
+    23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
+    [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
+    {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
+    24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
+    [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
+    24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
+    24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
+    24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
+    24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
+    [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
+    24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
+    24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
+    24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
+    24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
+    24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
+    24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
+    24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
+    24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
+    {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
+    24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
+    24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
+    25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
+    25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
+    25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
+    25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
+    {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
+    25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
+    25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
+    25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
+    25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
+    25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
+    25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
+    25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
+    25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
+    25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
+    {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
+    25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
+    [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
+    25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
+    26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
+    [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
+    {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
+    26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
+    26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
+    26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
+    26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
+    26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
+    26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
+    26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
+    26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
+    26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
+    26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
+    26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
+    26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
+    26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
+    26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
+    26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
+    27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
+    27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
+    27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
+    27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
+    27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
+    27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
+    27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
+    27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
+    27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
+    27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
+    27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
+    [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
+    27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
+    27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
+    27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
+    27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
+    27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
+    27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
+    28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
+    28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
+    28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
+    28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
+    28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
+    28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
+    28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
+    28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
+    28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
+    28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
+    28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
+    28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
+    28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
+    28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
+    29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
+    29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
+    29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
+    29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
+    29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
+    29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
+    {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
+    29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
+    29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
+    29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
+    29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
+    29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
+    29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
+    29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
+    29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
+    30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
+    30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
+    30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
+    30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
+    30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
+    30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
+    {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
+    30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
+    30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
+    30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
+    {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
+    30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
+    30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
+    30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
+    30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
+    30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
+    30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
+    31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
+    31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
+    31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
+    31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
+    31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
+    31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
+    31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
+    31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
+    31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
+    31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
+    31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
+    31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
+    31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
+    31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
+    31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
+    31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
+    31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
+    31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
+    32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
+    32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
+    32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
+    32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
+    32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
+    32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
+    32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
+    32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
+    {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
+    {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
+    [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
+    32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
+    32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
+    {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
+    39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
+    32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
+    32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
+    32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
+    32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
+    33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
+    33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
+    33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
+    33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
+    33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
+    33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
+    33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
+    {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
+    33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
+    33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
+    33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
+    33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
+    33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
+    33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
+    33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
+    33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
+    33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
+    33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
+    34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
+    34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
+    34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
+    34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
+    34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
+    34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
+    34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
+    34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
+    34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
+    34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
+    34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
+    34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
+    34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
+    34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
+    34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
+    34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
+    34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
+    34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
+    35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
+    35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
+    35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
+    35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
+    35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
+    {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
+    35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
+    35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
+    35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
+    35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
+    35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
+    35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
+    35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
+    35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
+    [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
+    35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
+    {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
+    {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
+    40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
+    36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
+    {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
+    {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
+    36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
+    36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
+    36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
+    36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
+    36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
+    36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
+    36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
+    36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
+    36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
+    36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
+    36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
+    37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
+    37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
+    37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
+    37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
+    37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
+    37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
+    37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
+    37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
+    37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
+    37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
+    37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
+    37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
+    37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
+    38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
+    38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
+    38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
+    {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
+    38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
+    {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
+    38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
+    38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
+    38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
+    38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
+    38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
+    {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
+    [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
+    38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
+    39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
+    39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
+    39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
+    {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
+    39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
+    {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
+    39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
+    39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
+    39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
+    {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
+    39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
+    {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
+    39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
+    {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
+    39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
+    39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
+    39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
+    39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
+    40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
+    40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
+    {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
+    40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
+    40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
+    40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
+    {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
+    40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
+    40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
+    {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
+    40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
+    {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
+    40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
+    {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
+    13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
+    {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
+    13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
+    8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
+    0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
+    194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
+    0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
+    {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
+    64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
+    39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
+    28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
+    63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
+    {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
+    194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
+    {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
+    {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
+    {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
+    65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
+    9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
+    13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
+    13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
+    13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
+    {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
+    {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
+    12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
+    12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
+    12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
+    13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
+    8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
+    9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
+    9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
+    9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
+    9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
+    20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
+    8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
+    12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
+    37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
+    [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
+    20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
+    20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
+    21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
+    21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
+    64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
+    23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
+    23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
+    24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
+    24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
+    26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
+    26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
+    64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
+    27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
+    28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
+    28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
+    28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
+    29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
+    29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
+    30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
+    31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
+    31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
+    33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
+    64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
+    35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
+    64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
+    37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
+    37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
+    37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
+    37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
+    37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
+    38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
+    {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
+    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
+    8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
+    298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
+    {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
+    467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
+    8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
+    331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
+    {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
+    {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
+    {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
+    12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
+    {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
+    0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
+    {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
+    13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
+    {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
+    {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
+    13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
+    {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
+    {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
+    {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
+    {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
+    {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
+    {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
+    9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
+    {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
+    8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
+    9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
+    {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
+    64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
+    64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
+    64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
+    64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
+    24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
+    64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
+    64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
+    37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
+    37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
+    11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
+    171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
+    11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
+    23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
+    29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
+    0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
+    {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
+    [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
+    131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
+    {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
+    [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
+    {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
+    194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
+    20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
+    13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
+    0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
+    63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
+    194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
+    23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
+    26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
+    {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
+    30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
+    11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
+    [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
+    34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
+    0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
+    {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
+    19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
+    20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
+    20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
+    20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
+    20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
+    20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
+    [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
+    {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
+    21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
+    21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
+    21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
+    22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
+    22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
+    22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
+    22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
+    22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
+    23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
+    23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
+    {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
+    23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
+    23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
+    24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
+    24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
+    [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
+    [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
+    24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
+    24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
+    25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
+    25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
+    25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
+    {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
+    25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
+    26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
+    26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
+    26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
+    26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
+    26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
+    27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
+    27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
+    27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
+    [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
+    27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
+    27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
+    28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
+    28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
+    28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
+    [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
+    28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
+    29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
+    29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
+    29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
+    29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
+    29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
+    29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
+    29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
+    29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
+    [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
+    30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
+    30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
+    {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
+    30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
+    30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
+    31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
+    31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
+    31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
+    31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
+    31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
+    31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
+    31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
+    32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
+    32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
+    32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
+    32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
+    32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
+    32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
+    33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
+    33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
+    33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
+    33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
+    34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
+    34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
+    34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
+    34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
+    [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
+    {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
+    35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
+    35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
+    35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
+    36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
+    36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
+    36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
+    36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
+    37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
+    37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
+    37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
+    {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
+    37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
+    37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
+    38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
+    38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
+    38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
+    38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
+    39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
+    39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
+    {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
+    39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
+    39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
+    40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
+    40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
+    40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
+    40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
+    40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
+    28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
+    20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
+    29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
+    0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
+    13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
+    {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
+    {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
+    {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
+    474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
+    351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
+    344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
+    369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
+    625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
+    626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
+    608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
+    673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
+    0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
+    820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
+    {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
+    704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
+    {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
+    {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
+    {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
+    9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
+    {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
+    {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
+    20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
+    20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
+    21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
+    22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
+    22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
+    23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
+    138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
+    24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
+    24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
+    25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
+    26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
+    26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
+    144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
+    27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
+    27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
+    27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
+    28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
+    28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
+    29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
+    29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
+    30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
+    30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
+    152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
+    31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
+    31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
+    31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
+    32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
+    {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
+    33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
+    33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
+    33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
+    34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
+    34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
+    34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
+    35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
+    36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
+    36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
+    {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
+    37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
+    37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
+    18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
+    38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
+    39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
+    39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
+    40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
+    40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
+    13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
+    20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
+    20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
+    20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
+    131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
+    131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
+    20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
+    21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
+    133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
+    133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
+    {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
+    21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
+    21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
+    13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
+    21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
+    135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
+    22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
+    22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
+    22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
+    22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
+    22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
+    136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
+    22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
+    {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
+    158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
+    22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
+    23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
+    23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
+    23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
+    {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
+    23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
+    138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
+    23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
+    23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
+    23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
+    24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
+    {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
+    24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
+    24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
+    24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
+    24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
+    141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
+    141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
+    142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
+    {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
+    25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
+    {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
+    25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
+    25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
+    25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
+    26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
+    143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
+    26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
+    144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
+    26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
+    26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
+    26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
+    26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
+    26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
+    {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
+    26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
+    27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
+    27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
+    27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
+    27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
+    145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
+    27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
+    {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
+    27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
+    27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
+    {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
+    {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
+    146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
+    28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
+    {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
+    28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
+    28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
+    15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
+    28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
+    28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
+    28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
+    29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
+    29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
+    29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
+    29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
+    29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
+    29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
+    29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
+    150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
+    29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
+    150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
+    {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
+    {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
+    30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
+    {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
+    151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
+    30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
+    151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
+    30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
+    30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
+    30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
+    30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
+    31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
+    16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
+    31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
+    31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
+    31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
+    31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
+    31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
+    31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
+    155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
+    155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
+    155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
+    32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
+    32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
+    32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
+    32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
+    {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
+    32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
+    32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
+    157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
+    17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
+    33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
+    157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
+    33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
+    158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
+    33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
+    33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
+    {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
+    33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
+    33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
+    17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
+    34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
+    {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
+    34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
+    34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
+    160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
+    {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
+    34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
+    34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
+    160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
+    34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
+    34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
+    34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
+    35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
+    35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
+    35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
+    35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
+    35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
+    162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
+    35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
+    36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
+    {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
+    36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
+    36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
+    64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
+    165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
+    37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
+    37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
+    {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
+    {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
+    37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
+    37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
+    {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
+    166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
+    37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
+    37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
+    37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
+    167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
+    167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
+    38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
+    38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
+    38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
+    169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
+    39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
+    {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
+    {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
+    39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
+    39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
+    39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
+    39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
+    39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
+    {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
+    39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
+    {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
+    171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
+    {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
+    40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
+    40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
+    40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
+    40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
+    40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
+    40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
+    40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
+    19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
+    20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
+    20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
+    {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
+    20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
+    {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
+    21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
+    21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
+    21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
+    21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
+    21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
+    21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
+    22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
+    22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
+    22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
+    22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
+    22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
+    22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
+    23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
+    23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
+    23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
+    24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
+    24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
+    24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
+    25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
+    25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
+    25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
+    {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
+    25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
+    25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
+    26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
+    26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
+    26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
+    27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
+    27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
+    27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
+    28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
+    {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
+    28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
+    29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
+    29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
+    29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
+    30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
+    30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
+    30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
+    30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
+    {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
+    30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
+    30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
+    31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
+    31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
+    31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
+    {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
+    32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
+    32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
+    32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
+    {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
+    33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
+    33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
+    33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
+    33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
+    33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
+    34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
+    34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
+    34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
+    34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
+    35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
+    35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
+    35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
+    35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
+    36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
+    36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
+    36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
+    36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
+    36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
+    36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
+    36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
+    37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
+    37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
+    {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
+    37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
+    37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
+    38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
+    38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
+    38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
+    38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
+    39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
+    39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
+    39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
+    39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
+    40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
+    40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
+    {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
+    151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
+    {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
+    {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
+    0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
+    15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
+    162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
+    63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
+    38315, 38741, 171581, 173594],
+  'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
+    {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
+    8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
+    {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
+    {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
+    8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
+    9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
+    {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
+    {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
+    {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
+    730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
+    9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
+    9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
+    9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
+    8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
+    13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
+    {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
+    {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
+    9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
+    9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
+    9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
+    9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
+    {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
+    {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
+    {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
+    13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
+    {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
+    8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
+    13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
+    198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
+    {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
+    {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
+    312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
+    {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
+    {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
+    1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
+    {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
+    {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
+    44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
+    44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
+    {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
+    {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
+    44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
+    44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
+    44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
+    {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
+    44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
+    {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
+    {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
+    {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
+    44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
+    44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
+    {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
+    44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
+    44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
+    {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
+    {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
+    {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
+    {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
+    {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
+    {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
+    {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
+    {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
+    45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
+    45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
+    45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
+    {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
+    {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
+    {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
+    {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
+    {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
+    {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
+    {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
+    45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
+    45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
+    45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
+    {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
+    45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
+    {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
+    {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
+    {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
+    45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
+    {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
+    {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
+    {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
+    {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
+    45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
+    {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
+    46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
+    {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
+    {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
+    46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
+    {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
+    46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
+    {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
+    {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
+    {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
+    {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
+    {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
+    46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
+    46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
+    {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
+    {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
+    46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
+    46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
+    {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
+    {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
+    {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
+    {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
+    47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
+    47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
+    {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
+    {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
+    47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
+    {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
+    {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
+    {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
+    47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
+    {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
+    {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
+    47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
+    47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
+    47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
+    47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
+    {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
+    47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
+    {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
+    47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
+    48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
+    {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
+    {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
+    {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
+    {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
+    48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
+    {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
+    48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
+    {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
+    48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
+    {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
+    {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
+    48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
+    48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
+    {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
+    {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
+    {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
+    {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
+    {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
+    {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
+    {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
+    49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
+    {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
+    49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
+    {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
+    {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
+    {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
+    {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
+    {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
+    {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
+    {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
+    49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
+    49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
+    49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
+    {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
+    {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
+    {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
+    49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
+    49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
+    49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
+    49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
+    {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
+    {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
+    50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
+    {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
+    {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
+    {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
+    50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
+    50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
+    {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
+    {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
+    {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
+    {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
+    {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
+    50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
+    {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
+    {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
+    {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
+    {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
+    {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
+    {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
+    {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
+    50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
+    {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
+    {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
+    {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
+    {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
+    50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
+    50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
+    51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
+    51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
+    {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
+    {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
+    {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
+    51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
+    {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
+    {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
+    {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
+    {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
+    51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
+    {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
+    {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
+    51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
+    51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
+    {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
+    51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
+    {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
+    {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
+    {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
+    {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
+    {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
+    {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
+    {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
+    52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
+    {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
+    {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
+    {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
+    52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
+    {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
+    {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
+    {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
+    52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
+    52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
+    52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
+    52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
+    52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
+    {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
+    52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
+    {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
+    {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
+    {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
+    53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
+    {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
+    {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
+    53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
+    53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
+    {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
+    {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
+    53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
+    {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
+    53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
+    {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
+    {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
+    53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
+    {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
+    53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
+    53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
+    {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
+    {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
+    53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
+    {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
+    {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
+    {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
+    54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
+    54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
+    {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
+    {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
+    54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
+    54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
+    54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
+    54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
+    {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
+    {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
+    {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
+    54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
+    54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
+    {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
+    54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
+    {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
+    54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
+    54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
+    {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
+    55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
+    {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
+    {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
+    55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
+    55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
+    {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
+    21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
+    29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
+    36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
+    29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
+    23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
+    30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
+    35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
+    34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
+    26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
+    {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
+    22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
+    30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
+    37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
+    24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
+    33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
+    21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
+    36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
+    24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
+    26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
+    24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
+    35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
+    [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
+    32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
+    20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
+    24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
+    28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
+    32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
+    38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
+    23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
+    31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
+    21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
+    25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
+    32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
+    35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
+    26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
+    26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
+    20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
+    25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
+    [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
+    36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
+    23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
+    35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
+    21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
+    37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
+    25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
+    21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
+    30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
+    39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
+    [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
+    24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
+    27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
+    32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
+    36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
+    [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
+    21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
+    23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
+    21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
+    36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
+    36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
+    31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
+    30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
+    26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
+    29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
+    25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
+    37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
+    30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
+    22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
+    24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
+    27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
+    30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
+    32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
+    37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
+    21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
+    [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
+    25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
+    20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
+    [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
+    25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
+    [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
+    [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
+    [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
+    [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
+    27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
+    37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
+    26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
+    35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
+    22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
+    20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
+    25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
+    24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
+    23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
+    26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
+    31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
+    37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
+    31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
+    28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
+    21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
+    31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
+    31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
+    36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
+    37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
+    [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
+    [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
+    [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
+    [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
+    [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
+    27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
+    [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
+    [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
+    [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
+    [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
+    [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
+    [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
+    [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
+    [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
+    [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
+    [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
+    [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
+    [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
+    [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
+    [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
+    [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
+    28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
+    [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
+    31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
+    [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
+    28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
+    25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
+    [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
+    [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
+    [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
+    [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
+    [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
+    [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
+    [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
+    [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
+    [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
+    [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
+    [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
+    [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
+    [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
+    [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
+    [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
+    [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
+    32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
+    [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
+    [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
+    [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
+    [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
+    [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
+    [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
+    [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
+    [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
+    [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
+    38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
+    29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
+    24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
+    24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
+    34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
+    38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
+    33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
+    27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
+    39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
+    35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
+    [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
+    26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
+    40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
+    26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
+    [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
+    27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
+    26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
+    29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
+    25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
+    32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
+    20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
+    34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
+    23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
+    [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
+    24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
+    38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
+    27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
+    36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
+    26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
+    [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
+    25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
+    20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
+    [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
+    33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
+    20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
+    32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
+    20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
+    29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
+    38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
+    27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
+    34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
+    30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
+    26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
+    20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
+    29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
+    [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
+    35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
+    22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
+    34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
+    21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
+    24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
+    [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
+    36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
+    40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
+    24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
+    36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
+    32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
+    24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
+    {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
+    32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
+    36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
+    24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
+    36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
+    20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
+    [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
+    24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
+    28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
+    32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
+    36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
+    21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
+    37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
+    26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
+    20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
+    24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
+    [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
+    36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
+    [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
+    24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
+    26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
+    34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
+    [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
+    28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
+    21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
+    29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
+    34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
+    23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
+    [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
+    36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
+    24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
+    32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
+    31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
+    24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
+    28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
+    32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
+    39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
+    23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
+    24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
+    37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
+    23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
+    25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
+    29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
+    32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
+    35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
+    {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
+    22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
+    33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
+    27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
+    34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
+    36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
+    [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
+    25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
+    [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
+    26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
+    35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
+    24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
+    36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
+    24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
+    33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
+    22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
+    28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
+    [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
+    [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
+    40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
+    [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
+    23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
+    26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
+    33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
+    27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
+    30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
+    38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
+    25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
+    33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
+    26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
+    [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
+    28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
+    25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
+    23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
+    20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
+    33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
+    32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
+    25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
+    28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
+    36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
+    28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
+    [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
+    27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
+    29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
+    20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
+    34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
+    20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
+    23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
+    28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
+    29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
+    20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
+    28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
+    23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
+    32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
+    24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
+    23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
+    23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
+    31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
+    36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
+    20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
+    28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
+    37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
+    23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
+    30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
+    36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
+    26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
+    28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
+    39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
+    23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
+    29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
+    [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
+    23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
+    33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
+    20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
+    24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
+    {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
+    30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
+    36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
+    [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
+    37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
+    24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
+    38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
+    33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
+    27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
+    35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
+    24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
+    [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
+    28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
+    21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
+    33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
+    [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
+    24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
+    33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
+    23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
+    30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
+    38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
+    33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
+    26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
+    22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
+    27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
+    33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
+    [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
+    26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
+    29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
+    25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
+    32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
+    38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
+    30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
+    [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
+    20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
+    24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
+    [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
+    35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
+    39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
+    21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
+    25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
+    24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
+    26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
+    28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
+    31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
+    37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
+    21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
+    33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
+    [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
+    25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
+    28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
+    31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
+    35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
+    26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
+    20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
+    32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
+    24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
+    21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
+    27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
+    32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
+    36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
+    20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
+    30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
+    34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
+    25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
+    21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
+    26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
+    31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
+    35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
+    21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
+    28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
+    32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
+    [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
+    23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
+    36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
+    38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
+    24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
+    25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
+    29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
+    39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
+    22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
+    21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
+    27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
+    20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
+    37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
+    20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
+    30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
+    25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
+    36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
+    28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
+    30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
+    30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
+    35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
+    36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
+    26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
+    32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
+    37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
+    26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
+    34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
+    27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
+    37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
+    30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
+    36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
+    34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
+    23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
+    40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
+    23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
+    31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
+    [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
+    23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
+    31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
+    25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
+    22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
+    37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
+    35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
+    23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
+    27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
+    25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
+    31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
+    22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
+    24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
+    32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
+    36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
+    25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
+    28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
+    31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
+    33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
+    38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
+    24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
+    33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
+    [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
+    27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
+    31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
+    [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
+    29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
+    20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
+    36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
+    24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
+    38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
+    28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
+    38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
+    26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
+    21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
+    35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
+    26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
+    38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
+    27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
+    [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
+    [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
+    34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
+    [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
+    33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
+    27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
+    34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
+    26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
+    22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
+    28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
+    29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
+    34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
+    23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
+    24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
+    21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
+    33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
+    20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
+    28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
+    29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
+    {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
+    31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
+    24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
+    28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
+    23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
+    28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
+    21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
+    21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
+    [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
+    24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
+    28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
+    33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
+    35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
+    20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
+    25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
+    35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
+    {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
+    {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
+    {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
+    8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
+    8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
+    0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
+    {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
+    {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
+    8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
+    0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
+    {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
+    9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
+    {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
+    8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
+    {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
+    8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
+    {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
+    0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
+    {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
+    {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
+    44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
+    {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
+    {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
+    {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
+    {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
+    {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
+    44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
+    {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
+    {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
+    {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
+    {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
+    44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
+    {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
+    {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
+    {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
+    {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
+    {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
+    {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
+    {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
+    {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
+    {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
+    44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
+    {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
+    {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
+    {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
+    {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
+    {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
+    {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
+    {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
+    {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
+    {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
+    {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
+    {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
+    {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
+    {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
+    {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
+    {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
+    {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
+    {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
+    {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
+    {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
+    {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
+    45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
+    {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
+    {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
+    {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
+    {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
+    {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
+    {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
+    {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
+    {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
+    {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
+    45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
+    {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
+    {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
+    {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
+    45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
+    {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
+    {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
+    {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
+    {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
+    {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
+    {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
+    {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
+    {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
+    {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
+    {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
+    46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
+    {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
+    {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
+    {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
+    46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
+    {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
+    {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
+    {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
+    {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
+    {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
+    {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
+    {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
+    {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
+    {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
+    {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
+    {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
+    {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
+    {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
+    {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
+    {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
+    {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
+    {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
+    {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
+    {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
+    {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
+    {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
+    {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
+    47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
+    {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
+    47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
+    {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
+    {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
+    {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
+    {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
+    {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
+    {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
+    47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
+    {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
+    {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
+    {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
+    {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
+    {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
+    47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
+    {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
+    {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
+    {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
+    {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
+    {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
+    {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
+    47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
+    {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
+    {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
+    {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
+    {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
+    {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
+    {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
+    {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
+    {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
+    {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
+    {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
+    {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
+    {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
+    {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
+    {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
+    {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
+    {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
+    {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
+    {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
+    {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
+    {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
+    {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
+    48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
+    {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
+    {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
+    {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
+    {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
+    {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
+    {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
+    {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
+    {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
+    {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
+    {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
+    {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
+    {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
+    {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
+    {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
+    {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
+    {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
+    {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
+    {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
+    {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
+    {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
+    {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
+    {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
+    {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
+    49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
+    49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
+    {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
+    {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
+    {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
+    {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
+    {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
+    {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
+    {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
+    {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
+    {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
+    49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
+    {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
+    {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
+    {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
+    {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
+    49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
+    {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
+    {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
+    {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
+    {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
+    {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
+    {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
+    {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
+    49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
+    {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
+    {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
+    {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
+    {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
+    {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
+    {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
+    {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
+    {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
+    {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
+    {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
+    {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
+    {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
+    50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
+    {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
+    {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
+    {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
+    {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
+    {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
+    {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
+    {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
+    50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
+    {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
+    {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
+    {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
+    {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
+    {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
+    {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
+    {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
+    {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
+    50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
+    {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
+    {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
+    {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
+    {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
+    {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
+    {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
+    {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
+    {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
+    {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
+    {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
+    51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
+    {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
+    {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
+    {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
+    {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
+    {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
+    {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
+    51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
+    {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
+    {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
+    {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
+    {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
+    {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
+    {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
+    {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
+    {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
+    {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
+    {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
+    {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
+    {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
+    {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
+    51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
+    {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
+    {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
+    {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
+    {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
+    {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
+    51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
+    {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
+    {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
+    {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
+    {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
+    {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
+    {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
+    {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
+    {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
+    {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
+    {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
+    {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
+    52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
+    {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
+    {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
+    {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
+    52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
+    {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
+    {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
+    {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
+    52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
+    {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
+    {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
+    {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
+    {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
+    {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
+    52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
+    {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
+    {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
+    {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
+    {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
+    {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
+    {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
+    {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
+    {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
+    {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
+    {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
+    {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
+    53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
+    {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
+    {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
+    {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
+    {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
+    {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
+    {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
+    {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
+    {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
+    {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
+    {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
+    {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
+    {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
+    {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
+    {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
+    {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
+    53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
+    {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
+    {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
+    {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
+    {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
+    {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
+    {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
+    {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
+    {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
+    {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
+    {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
+    54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
+    {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
+    {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
+    {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
+    {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
+    54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
+    {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
+    {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
+    {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
+    {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
+    {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
+    {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
+    {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
+    54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
+    {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
+    {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
+    {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
+    54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
+    {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
+    {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
+    {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
+    {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
+    {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
+    {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
+    {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
+    {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
+    {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
+    {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
+    {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
+    54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
+    {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
+    {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
+    55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
+    {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
+    {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
+    {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
+    {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
+    55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
+    55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
+    {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
+    {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
+    {f: 6, c: 55198}],
+  'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
+    8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
+    183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
+    {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
+    {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
+    {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
+    {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
+    {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
+    65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
+    9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
+    {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
+    65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
+    8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
+    8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
+    9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
+    0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
+    8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
+    {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
+    [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
+    [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
+    9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
+    9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
+    9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
+    {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
+    {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+    {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
+    [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
+    [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
+    [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
+    [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
+    [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
+    [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
+    [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
+    [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
+    [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
+    [12057, 21353, 63192], [12059, 21430, 63193],
+    [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
+    [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
+    [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
+    [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
+    [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
+    9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
+    [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
+    [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
+    [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
+    19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
+    20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
+    [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
+    [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
+    [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
+    [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
+    [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
+    19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
+    20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
+    {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
+    20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
+    21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
+    22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
+    24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
+    [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
+    [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
+    [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
+    [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
+    [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
+    [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
+    [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
+    20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
+    {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
+    {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
+    21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
+    21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
+    21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
+    22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
+    24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
+    {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
+    {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
+    27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
+    [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
+    [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
+    [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
+    [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
+    [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
+    20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
+    {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
+    20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
+    {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
+    {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
+    21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
+    22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
+    {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
+    {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
+    24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
+    {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
+    {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
+    27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
+    27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
+    [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
+    [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
+    [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
+    {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
+    [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
+    [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
+    [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
+    20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
+    20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
+    20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
+    {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
+    {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
+    21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
+    21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
+    21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
+    22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
+    22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
+    22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
+    {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
+    24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
+    24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
+    25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
+    25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
+    25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
+    26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
+    27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
+    27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
+    27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
+    28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
+    {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
+    32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
+    33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
+    [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
+    [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
+    [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
+    24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
+    [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
+    20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
+    20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
+    20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
+    20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
+    21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
+    21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
+    21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
+    21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
+    22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
+    {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
+    22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
+    23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
+    23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
+    24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
+    {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
+    24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
+    24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
+    25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
+    25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
+    [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
+    {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
+    26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
+    26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
+    26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
+    26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
+    27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
+    27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
+    27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
+    27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
+    29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
+    29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
+    30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
+    31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
+    32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
+    33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
+    33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
+    34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
+    [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
+    38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
+    [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
+    20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
+    20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
+    20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
+    21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
+    21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
+    21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
+    22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
+    22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
+    23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
+    23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
+    24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
+    24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
+    24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
+    24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
+    25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
+    25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
+    26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
+    26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
+    26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
+    26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
+    27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
+    {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
+    27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
+    28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
+    29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
+    30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
+    {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
+    30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
+    31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
+    31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
+    32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
+    32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
+    33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
+    33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
+    33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
+    35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
+    36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
+    36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
+    {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
+    [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
+    [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
+    20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
+    20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
+    20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
+    20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
+    20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
+    21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
+    21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
+    21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
+    22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
+    23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
+    23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
+    23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
+    24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
+    24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
+    24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
+    25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
+    25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
+    26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
+    26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
+    26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
+    26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
+    27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
+    28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
+    28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
+    28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
+    29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
+    30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
+    30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
+    {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
+    30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
+    31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
+    31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
+    32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
+    32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
+    32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
+    33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
+    33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
+    33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
+    33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
+    34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
+    34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
+    35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
+    36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
+    36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
+    37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
+    38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
+    [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
+    [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
+    20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
+    20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
+    21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
+    21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
+    21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
+    21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
+    22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
+    23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
+    23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
+    {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
+    23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
+    {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
+    24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
+    24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
+    24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
+    {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
+    25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
+    25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
+    25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
+    25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
+    26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
+    26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
+    26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
+    27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
+    28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
+    28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
+    28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
+    28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
+    29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
+    29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
+    {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
+    30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
+    30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
+    31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
+    31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
+    32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
+    32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
+    33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
+    33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
+    {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
+    34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
+    34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
+    35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
+    36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
+    36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
+    36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
+    37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
+    38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
+    31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
+    [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
+    20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
+    21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
+    21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
+    21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
+    21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
+    22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
+    [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
+    23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
+    24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
+    24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
+    24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
+    24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
+    25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
+    {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
+    25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
+    26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
+    26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
+    26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
+    26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
+    {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
+    28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
+    28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
+    28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
+    {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
+    29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
+    29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
+    {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
+    30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
+    30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
+    31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
+    31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
+    32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
+    32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
+    33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
+    33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
+    33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
+    33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
+    34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
+    35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
+    35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
+    36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
+    36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
+    36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
+    37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
+    37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
+    38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
+    38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
+    38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
+    [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
+    {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
+    21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
+    21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
+    21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
+    22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
+    22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
+    23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
+    24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
+    24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
+    {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
+    25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
+    26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
+    26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
+    26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
+    27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
+    28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
+    28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
+    29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
+    29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
+    29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
+    30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
+    {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
+    30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
+    30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
+    31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
+    31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
+    32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
+    32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
+    {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
+    33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
+    33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
+    34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
+    35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
+    {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
+    35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
+    35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
+    36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
+    36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
+    36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
+    36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
+    37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
+    37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
+    {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
+    {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
+    {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
+    [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
+    20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
+    21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
+    22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
+    22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
+    22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
+    23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
+    23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
+    24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
+    24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
+    25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
+    25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
+    27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
+    27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
+    28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
+    28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
+    28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
+    29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
+    29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
+    30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
+    30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
+    31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
+    [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
+    {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
+    32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
+    32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
+    33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
+    33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
+    33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
+    34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
+    35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
+    35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
+    36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
+    36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
+    36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
+    37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
+    38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
+    38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
+    39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
+    40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
+    20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
+    {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
+    22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
+    22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
+    23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
+    {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
+    24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
+    24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
+    24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
+    25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
+    25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
+    {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
+    27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
+    27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
+    28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
+    28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
+    29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
+    30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
+    30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
+    30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
+    31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
+    31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
+    32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
+    32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
+    34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
+    34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
+    34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
+    35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
+    35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
+    35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
+    {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
+    36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
+    36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
+    36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
+    37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
+    37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
+    38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
+    39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
+    {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
+    40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
+    20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
+    22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
+    22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
+    23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
+    25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
+    25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
+    26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
+    27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
+    27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
+    28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
+    29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
+    29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
+    30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
+    31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
+    31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
+    32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
+    {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
+    {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
+    34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
+    35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
+    35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
+    35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
+    36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
+    36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
+    37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
+    37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
+    38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
+    38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
+    39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
+    39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
+    [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
+    22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
+    23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
+    24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
+    25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
+    {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
+    27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
+    28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
+    28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
+    29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
+    29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
+    30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
+    31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
+    31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
+    32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
+    32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
+    33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
+    33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
+    34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
+    34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
+    35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
+    35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
+    36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
+    36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
+    37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
+    37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
+    38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
+    39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
+    40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
+    25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
+    26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
+    27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
+    {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
+    30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
+    {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
+    31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
+    32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
+    34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
+    35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
+    36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
+    37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
+    37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
+    38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
+    38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
+    39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
+    39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
+    22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
+    25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
+    28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
+    29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
+    31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
+    32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
+    33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
+    34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
+    35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
+    36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
+    37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
+    37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
+    38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
+    39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
+    40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
+    22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
+    25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
+    29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
+    31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
+    33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
+    {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
+    35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
+    37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
+    39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
+    40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
+    25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
+    29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
+    34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
+    35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
+    37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
+    38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
+    39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
+    40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
+    23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
+    29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
+    33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
+    37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
+    39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
+    40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
+    25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
+    32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
+    37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
+    39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
+    28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
+    35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
+    38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
+    {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
+    34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
+    40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
+    36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
+    38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
+    [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
+    [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
+    20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
+    22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
+    [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
+    21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
+    23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
+    27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
+    32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
+    20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
+    21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
+    22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
+    22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
+    [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
+    25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
+    26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
+    27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
+    28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
+    [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
+    37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
+    20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
+    20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
+    21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
+    21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
+    21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
+    22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
+    22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
+    23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
+    24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
+    24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
+    24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
+    {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
+    25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
+    26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
+    {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
+    27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
+    27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
+    29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
+    {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
+    33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
+    [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
+    38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
+    20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
+    20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
+    20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
+    21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
+    21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
+    21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
+    22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
+    {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
+    22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
+    22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
+    23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
+    23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
+    24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
+    24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
+    24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
+    24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
+    25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
+    26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
+    26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
+    26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
+    26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
+    27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
+    27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
+    27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
+    27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
+    28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
+    29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
+    29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
+    30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
+    30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
+    31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
+    33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
+    33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
+    34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
+    36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
+    38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
+    20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
+    20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
+    21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
+    21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
+    21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
+    22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
+    22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
+    23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
+    23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
+    23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
+    23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
+    24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
+    24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
+    24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
+    25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
+    25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
+    25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
+    26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
+    26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
+    26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
+    26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
+    26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
+    27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
+    27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
+    27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
+    27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
+    28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
+    {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
+    29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
+    29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
+    29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
+    30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
+    30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
+    30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
+    31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
+    {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
+    {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
+    32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
+    32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
+    33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
+    33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
+    34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
+    35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
+    37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
+    38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
+    20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
+    20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
+    20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
+    {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
+    21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
+    21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
+    {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
+    22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
+    23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
+    23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
+    23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
+    24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
+    24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
+    25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
+    25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
+    25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
+    25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
+    {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
+    26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
+    26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
+    26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
+    27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
+    27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
+    28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
+    28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
+    28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
+    28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
+    28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
+    29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
+    29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
+    29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
+    30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
+    30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
+    30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
+    30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
+    31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
+    31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
+    31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
+    31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
+    32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
+    32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
+    33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
+    33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
+    33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
+    33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
+    33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
+    34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
+    34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
+    34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
+    34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
+    36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
+    36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
+    37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
+    37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
+    20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
+    20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
+    {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
+    21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
+    21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
+    21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
+    21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
+    22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
+    22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
+    22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
+    [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
+    23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
+    23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
+    23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
+    23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
+    23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
+    24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
+    {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
+    24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
+    25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
+    25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
+    25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
+    26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
+    {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
+    26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
+    26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
+    26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
+    {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
+    28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
+    28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
+    28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
+    28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
+    28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
+    28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
+    29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
+    29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
+    29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
+    30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
+    30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
+    30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
+    31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
+    31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
+    31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
+    31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
+    32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
+    {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
+    32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
+    33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
+    33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
+    33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
+    33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
+    33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
+    33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
+    34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
+    {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
+    34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
+    34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
+    35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
+    36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
+    {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
+    37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
+    37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
+    37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
+    38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
+    20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
+    20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
+    21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
+    21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
+    21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
+    22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
+    22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
+    23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
+    23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
+    23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
+    23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
+    23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
+    23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
+    24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
+    24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
+    24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
+    25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
+    25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
+    25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
+    25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
+    26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
+    26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
+    26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
+    26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
+    26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
+    {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
+    26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
+    27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
+    28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
+    28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
+    28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
+    28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
+    {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
+    28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
+    {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
+    29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
+    29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
+    29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
+    30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
+    30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
+    {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
+    30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
+    31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
+    31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
+    32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
+    32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
+    {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
+    33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
+    {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
+    [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
+    33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
+    33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
+    [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
+    33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
+    33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
+    34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
+    34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
+    34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
+    {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
+    {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
+    35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
+    36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
+    36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
+    {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
+    36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
+    37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
+    37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
+    37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
+    37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
+    38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
+    38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
+    20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
+    20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
+    {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
+    [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
+    21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
+    22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
+    22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
+    23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
+    23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
+    23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
+    24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
+    24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
+    24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
+    25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
+    25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
+    25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
+    25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
+    26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
+    26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
+    26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
+    26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
+    26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
+    26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
+    27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
+    28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
+    28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
+    28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
+    28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
+    29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
+    28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
+    29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
+    29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
+    29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
+    29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
+    30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
+    30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
+    30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
+    30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
+    30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
+    31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
+    31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
+    31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
+    32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
+    32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
+    {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
+    33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
+    33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
+    33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
+    33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
+    33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
+    33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
+    33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
+    33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
+    34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
+    35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
+    35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
+    35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
+    35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
+    {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
+    36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
+    36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
+    {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
+    37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
+    37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
+    37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
+    37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
+    37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
+    38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
+    {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
+    39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
+    20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
+    20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
+    22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
+    22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
+    22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
+    22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
+    23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
+    23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
+    23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
+    23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
+    24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
+    24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
+    24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
+    25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
+    25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
+    25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
+    26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
+    27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
+    27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
+    27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
+    27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
+    {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
+    28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
+    28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
+    28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
+    28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
+    29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
+    29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
+    29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
+    30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
+    30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
+    30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
+    {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
+    31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
+    31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
+    31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
+    32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
+    32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
+    32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
+    32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
+    33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
+    33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
+    33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
+    34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
+    33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
+    34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
+    34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
+    34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
+    35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
+    35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
+    35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
+    36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
+    {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
+    37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
+    37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
+    37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
+    37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
+    37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
+    38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
+    {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
+    39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
+    {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
+    20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
+    20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
+    22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
+    22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
+    22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
+    23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
+    23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
+    24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
+    24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
+    25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
+    25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
+    25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
+    {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
+    27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
+    27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
+    27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
+    27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
+    27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
+    28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
+    28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
+    28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
+    28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
+    29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
+    29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
+    29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
+    29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
+    30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
+    30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
+    30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
+    31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
+    31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
+    31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
+    32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
+    32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
+    33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
+    33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
+    34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
+    34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
+    34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
+    {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
+    34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
+    34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
+    34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
+    34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
+    {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
+    35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
+    35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
+    35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
+    36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
+    36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
+    36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
+    {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
+    {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
+    {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
+    37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
+    37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
+    37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
+    38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
+    38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
+    38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
+    {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
+    39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
+    39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
+    39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
+    40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
+    {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
+    22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
+    22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
+    23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
+    23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
+    23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
+    24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
+    25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
+    24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
+    25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
+    {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
+    27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
+    27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
+    27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
+    27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
+    27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
+    28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
+    28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
+    29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
+    29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
+    {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
+    29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
+    30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
+    30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
+    30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
+    {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
+    31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
+    31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
+    {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
+    32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
+    32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
+    32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
+    33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
+    34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
+    34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
+    34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
+    34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
+    34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
+    34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
+    35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
+    {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
+    35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
+    36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
+    36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
+    36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
+    37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
+    37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
+    37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
+    37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
+    37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
+    38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
+    38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
+    38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
+    39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
+    39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
+    39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
+    40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
+    40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
+    40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
+    {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
+    22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
+    23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
+    25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
+    25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
+    27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
+    27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
+    27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
+    28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
+    29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
+    29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
+    29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
+    30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
+    {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
+    31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
+    31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
+    31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
+    31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
+    32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
+    32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
+    33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
+    34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
+    34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
+    34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
+    34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
+    34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
+    34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
+    35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
+    {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
+    35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
+    35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
+    36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
+    37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
+    37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
+    37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
+    37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
+    38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
+    38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
+    38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
+    39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
+    39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
+    39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
+    39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
+    40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
+    {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
+    40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
+    [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
+    22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
+    25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
+    25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
+    26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
+    27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
+    28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
+    [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
+    29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
+    30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
+    {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
+    31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
+    31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
+    32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
+    33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
+    34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
+    34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
+    34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
+    34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
+    35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
+    35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
+    35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
+    35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
+    36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
+    {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
+    37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
+    37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
+    37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
+    38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
+    38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
+    38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
+    39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
+    39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
+    39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
+    39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
+    40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
+    40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
+    40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
+    {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
+    {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
+    25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
+    27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
+    27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
+    28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
+    29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
+    {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
+    31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
+    32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
+    32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
+    33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
+    34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
+    34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
+    34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
+    {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
+    35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
+    35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
+    {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
+    36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
+    37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
+    37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
+    37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
+    38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
+    {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
+    39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
+    39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
+    39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
+    39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
+    39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
+    {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
+    40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
+    40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
+    22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
+    {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
+    {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
+    {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
+    28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
+    29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
+    {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
+    31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
+    31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
+    33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
+    34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
+    34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
+    35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
+    36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
+    37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
+    37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
+    37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
+    38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
+    39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
+    39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
+    39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
+    39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
+    39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
+    40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
+    40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
+    40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
+    40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
+    24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
+    {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
+    29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
+    31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
+    32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
+    34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
+    34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
+    35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
+    36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
+    37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
+    38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
+    39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
+    39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
+    39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
+    40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
+    40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
+    40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
+    40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
+    24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
+    {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
+    29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
+    31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
+    {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
+    34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
+    35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
+    36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
+    {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
+    39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
+    39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
+    39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
+    40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
+    40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
+    40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
+    24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
+    {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
+    30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
+    34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
+    35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
+    37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
+    39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
+    40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
+    40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
+    40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
+    40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
+    23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
+    29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
+    33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
+    {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
+    38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
+    40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
+    40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
+    {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
+    28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
+    32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
+    35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
+    37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
+    40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
+    40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
+    38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
+    40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
+    34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
+    39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
+    25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
+    40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
+    {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
+    65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
+    [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
+    [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
+    [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
+    [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
+    [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
+    [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
+    [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
+    [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
+    [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
+    [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
+    [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
+    [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
+    [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
+    [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
+    [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
+    [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
+    [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
+    [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
+    [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
+    [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
+    [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
+    [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
+    [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
+    [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
+    [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
+    [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
+    [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
+    [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
+    [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
+    [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
+    [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
+    [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
+    [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
+    [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
+    [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
+    [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
+    [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
+    [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
+    [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
+    [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
+    [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
+    [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
+    [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
+    [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
+    [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
+    [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
+    [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
+    [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
+    [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
+    [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
+    [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
+    [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
+    [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
+    [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
+    [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
+    [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
+    [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
+    [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
+    [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
+    [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
+    [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
+    {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
+    [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
+    [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
+    9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
+    9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
+    {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
+    [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
+    [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
+    [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
+    [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
+    [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
+    [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
+    [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
+    [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
+    [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
+    [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
+    [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
+    [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
+    [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
+    [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
+    [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
+    [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
+    [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
+    [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
+    [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
+    [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
+    [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
+    [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
+    [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
+    [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
+    [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
+    [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
+    [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
+    [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
+    [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
+    [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
+    [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
+    [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
+    [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
+    [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
+    [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
+    [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
+    [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
+    [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
+    [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
+    [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
+    [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
+    [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
+    [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
+    [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
+    [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
+    [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
+    [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
+    [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
+    [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
+    [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
+    [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
+    [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
+    [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
+    [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
+    [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
+    [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
+    [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
+    [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
+    [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
+    [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
+    [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
+    [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
+    [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
+    [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
+    [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
+    [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
+    [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
+    [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
+    [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
+    [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
+    [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
+    [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
+    [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
+    [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
+    [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
+    [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
+    [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
+    [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
+    [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
+    [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
+    [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
+    [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
+    [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
+    [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
+    [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
+    [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
+    [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
+    [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
+    [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
+    [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
+    [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
+    [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
+    [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
+    [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
+    [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
+    [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
+    [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
+    [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
+    [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
+    [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
+    [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
+    [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
+    [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
+    [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
+    [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
+    [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
+    [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
+    [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
+    [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
+    [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
+    [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
+    [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
+    [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
+    [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
+    [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
+    [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
+    [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
+    [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
+    [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
+    [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
+    [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
+    [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
+    [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
+    [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
+    [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
+    [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
+    [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
+    [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
+    [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
+    [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
+    [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
+    [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
+    [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
+    [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
+    [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
+    [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
+    [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
+    [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
+    [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
+    [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
+    [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
+    [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
+    [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
+    [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
+    [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
+    [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
+    [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
+    [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
+    [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
+    [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
+    [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
+    [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
+    [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
+    [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
+    [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
+    [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
+    [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
+    [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
+    [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
+    [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
+    [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
+    [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
+    [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
+    [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
+    [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
+    [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
+    [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
+    [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
+    [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
+    [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
+    [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
+    [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
+    [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
+    [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
+    [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
+    [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
+    [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
+    [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
+    [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
+    [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
+    [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
+    [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
+    [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
+    [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
+    [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
+    [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
+    [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
+    [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
+    [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
+    [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
+    [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
+    [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
+    [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
+    [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
+    [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
+    [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
+    [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
+    [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
+    [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
+    [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
+    [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
+    [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
+    [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
+    [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
+    [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
+    [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
+    [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
+    [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
+    [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
+    [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
+    [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
+    [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
+    [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
+    [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
+    [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
+    [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
+    [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
+    [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
+    [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
+    [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
+    [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
+    [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
+    [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
+    [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
+    [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
+    [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
+    [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
+    [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
+    [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
+    [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
+    [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
+    [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
+    [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
+    [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
+    [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
+    [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
+    [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
+    [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
+    [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
+    [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
+    [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
+    [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
+    [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
+    [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
+    [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
+    [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
+    [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
+    [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
+    [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
+    [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
+    [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
+    [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
+    [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
+    [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
+    [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
+    [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
+    [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
+    [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
+    [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
+    [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
+    [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
+    [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
+    [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
+    [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
+    [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
+    [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
+    [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
+    [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
+    [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
+    [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
+    [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
+    [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
+    [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
+    [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
+    [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
+    [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
+    [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
+    [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
+    [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
+    [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
+    [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
+    [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
+    [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
+    [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
+    [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
+    [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
+    [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
+    [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
+    [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
+    [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
+    [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
+    [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
+    [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
+    [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
+    [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
+    [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
+    [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
+    [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
+    [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
+    [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
+    [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
+    [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
+    [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
+    [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
+    [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
+    [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
+    [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
+    [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
+    [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
+    [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
+    [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
+    [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
+    [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
+    [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
+    [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
+    [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
+    [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
+    [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
+    [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
+    [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
+    [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
+    [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
+    [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
+    [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
+    [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
+    [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
+    [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
+    [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
+    [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
+    [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
+    [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
+    [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
+    [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
+    [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
+    [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
+    [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
+    [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
+    [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
+    [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
+    [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
+    [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
+    [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
+    [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
+    [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
+    [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
+    [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
+    [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
+    [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
+    [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
+    [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
+    [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
+    [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
+    [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
+    [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
+    [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
+    [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
+    [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
+    [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
+    [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
+    [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
+    [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
+    [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
+    [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
+    [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
+    [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
+    [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
+    [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
+    [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
+    [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
+    [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
+    [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
+    [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
+    [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
+    [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
+    [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
+    [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
+    [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
+    [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
+    [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
+    [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
+    [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
+    [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
+    [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
+    [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
+    [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
+    [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
+    [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
+    [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
+    [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
+    [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
+    [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
+    [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
+    [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
+    [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
+    [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
+    [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
+    [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
+    [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
+    [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
+    [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
+    [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
+    [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
+    [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
+    [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
+    [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
+    [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
+    [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
+    [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
+    [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
+    [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
+    [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
+    [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
+    [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
+    [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
+    [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
+    [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
+    [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
+    [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
+    [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
+    [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
+    [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
+    [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
+    [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
+    [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
+    [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
+    [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
+    [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
+    [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
+    [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
+    [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
+    [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
+    [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
+    [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
+    [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
+    [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
+    [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
+    [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
+    [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
+    [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
+    [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
+    [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
+    [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
+    [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
+    [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
+    [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
+    [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
+    [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
+    [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
+    [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
+    [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
+    [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
+    [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
+    [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
+    [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
+    [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
+    [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
+    [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
+    [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
+    [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
+    [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
+    [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
+    [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
+    [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
+    [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
+    [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
+    [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
+    [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
+    [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
+    [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
+    [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
+    [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
+    [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
+    [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
+    [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
+    [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
+    [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
+    [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
+    [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
+    [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
+    [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
+    [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
+    [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
+    [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
+    [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
+    [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
+    [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
+    [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
+    [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
+    [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
+    [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
+    [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
+    [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
+    [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
+    [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
+    [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
+    [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
+    [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
+    [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
+    60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
+    [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
+    [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
+    [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
+    [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
+    [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
+    [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
+    [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
+    [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
+    [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
+    [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
+    60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
+    60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
+    [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
+    [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
+    [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
+    [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
+    [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
+    [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
+    [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
+    [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
+    [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
+    [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
+    [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
+    [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
+    [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
+    [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
+    [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
+    [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
+    [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
+    [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
+    [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
+    [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
+    [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
+    [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
+    [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
+    [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
+    [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
+    [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
+    [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
+    [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
+    [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
+    [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
+    [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
+    [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
+    [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
+    [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
+    [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
+    [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
+    [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
+    [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
+    [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
+    [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
+    [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
+    [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
+    [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
+    [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
+    [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
+    [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
+    [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
+    [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
+    [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
+    [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
+    [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
+    [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
+    [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
+    [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
+    [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
+    [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
+    [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
+    [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
+    [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
+    [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
+    [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
+    [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
+    [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
+    [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
+    [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
+    [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
+    [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
+    [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
+    [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
+    [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
+    [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
+    [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
+    [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
+    [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
+    [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
+    [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
+    [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
+    [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
+    [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
+    [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
+    [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
+    [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
+    [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
+    [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
+    [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
+    [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
+    [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
+    [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
+    [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
+    [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
+    [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
+    [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
+    [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
+    [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
+    [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
+    [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
+    [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
+    [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
+    [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
+    [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
+    [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
+    [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
+    [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
+    [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
+    [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
+    [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
+    [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
+    [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
+    [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
+    [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
+    [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
+    [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
+    [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
+    [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
+    [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
+    [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
+    [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
+    [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
+    [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
+    [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
+    [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
+    [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
+    [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
+    [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
+    [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
+    [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
+    [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
+    [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
+    [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
+    [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
+    [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
+    [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
+    [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
+    [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
+    [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
+    [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
+    [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
+    [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
+    [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
+    [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
+    [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
+    [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
+    [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
+    [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
+    [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
+    [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
+    [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
+    [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
+    [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
+    [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
+    [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
+    [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
+    [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
+    [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
+    [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
+    [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
+    [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
+    [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
+    [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
+    [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
+    [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
+    [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
+    [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
+    [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
+    [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
+    [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
+    [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
+    [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
+    [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
+    [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
+    [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
+    [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
+    [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
+    [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
+    [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
+    [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
+    [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
+    [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
+    [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
+    [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
+    [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
+    [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
+    [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
+    [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
+    [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
+    [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
+    [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
+    [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
+    [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
+    [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
+    [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
+    [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
+    [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
+    [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
+    [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
+    [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
+    [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
+    [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
+    [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
+    [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
+    [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
+    [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
+    [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
+    [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
+    [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
+    [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
+    [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
+    [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
+    [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
+    [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
+    [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
+    [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
+    [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
+    [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
+    [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
+    [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
+    [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
+    [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
+    [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
+    [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
+    [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
+    [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
+    [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
+    [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
+    [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
+    [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
+    [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
+    [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
+    [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
+    [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
+    [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
+    [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
+    [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
+    [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
+    [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
+    [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
+    [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
+    [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
+    [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
+    [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
+    [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
+    [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
+    [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
+    [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
+    [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
+    [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
+    [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
+    [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
+    0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
+    [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
+    [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
+    [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
+    [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
+    [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
+    [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
+    [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
+    [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
+    [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
+    [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
+    [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
+    [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
+    [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
+    [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
+    {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
+    {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
+    {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
+    {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
+    [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
+    [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
+    [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
+    [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
+    [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
+    [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
+    [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
+    [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
+    [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
+    [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
+    [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
+    [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
+    [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
+    [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
+    [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
+    [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
+    [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
+    [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
+    [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
+    [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
+    [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
+    [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
+    [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
+    [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
+    [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
+    [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
+    [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
+    [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
+    [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
+    [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
+    [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
+    [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
+    [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
+    [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
+    [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
+    [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
+    [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
+    [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
+    [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
+    [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
+    [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
+    [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
+    [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
+    [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
+    [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
+    [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
+    [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
+    [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
+    [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
+    [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
+    [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
+    [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
+    [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
+    [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
+    [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
+    [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
+    [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
+    [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
+    [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
+    [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
+    [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
+    [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
+    [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
+    [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
+    [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
+    [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
+    [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
+    [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
+    [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
+    [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
+    [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
+    [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
+    [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
+    [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
+    [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
+    [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
+    [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
+    [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
+    [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
+    [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
+    [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
+    [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
+    [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
+    [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
+    [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
+    [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
+    [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
+    [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
+    [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
+    [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
+    [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
+    [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
+    [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
+    [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
+    [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
+    [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
+    [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
+    [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
+    [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
+    [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
+    [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
+    [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
+    [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
+    [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
+    [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
+    [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
+    [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
+    [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
+    [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
+    [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
+    [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
+    [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
+    [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
+    [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
+    [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
+    [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
+    [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
+    [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
+    [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
+    [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
+    [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
+    [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
+    [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
+    [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
+    [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
+    [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
+    [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
+    [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
+    [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
+    [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
+    [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
+    [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
+    [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
+    [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
+    [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
+    [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
+    [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
+    [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
+    [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
+    [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
+    [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
+    [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
+    [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
+    [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
+    [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
+    [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
+    [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
+    [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
+    [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
+    [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
+    [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
+    [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
+    [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
+    [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
+    [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
+    [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
+    [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
+    [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
+    [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
+    [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
+    [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
+    [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
+    [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
+    [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
+    [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
+    [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
+    [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
+    [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
+    [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
+    [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
+    [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
+    [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
+    [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
+    [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
+    [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
+    [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
+    [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
+    [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
+    [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
+    [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
+    [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
+    [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
+    [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
+    [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
+    [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
+    [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
+    [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
+    [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
+    [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
+    [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
+    [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
+    [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
+    [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
+    [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
+    [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
+    [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
+    [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
+    [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
+    [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
+    [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
+    [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
+    [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
+    [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
+    [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
+    [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
+    [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
+    [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
+    [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
+    [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
+    [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
+    [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
+    [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
+    [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
+    [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
+    [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
+    [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
+    [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
+    [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
+    [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
+    [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
+    [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
+    [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
+    [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
+    [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
+    [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
+    [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
+    [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
+    [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
+    [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
+    [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
+    [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
+    [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
+    [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
+    [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
+    [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
+    [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
+    [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
+    [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
+    [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
+    [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
+    [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
+    [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
+    [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
+    [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
+    [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
+    [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
+    [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
+    [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
+    [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
+    [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
+    [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
+    [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
+    [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
+    [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
+    [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
+    [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
+    [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
+    [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
+    [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
+    [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
+    [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
+    [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
+    [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
+    [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
+    [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
+    [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
+    [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
+    [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
+    [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
+    [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
+    [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
+    [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
+    [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
+    [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
+    [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
+    [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
+    [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
+    [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
+    [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
+    [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
+    [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
+    [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
+    [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
+    [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
+    [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
+    [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
+    [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
+    [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
+    [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
+    [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
+    [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
+    [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
+    [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
+    [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
+    [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
+    [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
+    [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
+    [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
+    [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
+    [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
+    [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
+    [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
+    [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
+    36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
+    [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
+    [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
+    34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
+    [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
+    20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
+    24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
+    [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
+    [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
+    31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
+    62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
+    [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
+    34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
+    [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
+    23446, 62959, 32347],
+  'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
+    12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
+    {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
+    {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
+    8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
+    8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
+    8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
+    8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
+    9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
+    {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
+    {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
+    {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
+    {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
+    {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
+    {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
+    {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
+    462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
+    250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
+    {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
+    25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
+    29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
+    26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
+    22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
+    [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
+    38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
+    25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
+    25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
+    27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
+    32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
+    25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
+    21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
+    34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
+    36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
+    34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
+    24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
+    36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
+    24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
+    28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
+    30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
+    25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
+    39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
+    31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
+    36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
+    24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
+    26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
+    21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
+    25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
+    20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
+    32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
+    26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
+    24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
+    27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
+    20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
+    30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
+    23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
+    23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
+    32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
+    38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
+    25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
+    24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
+    26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
+    30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
+    32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
+    20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
+    28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
+    25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
+    [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
+    36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
+    27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
+    33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
+    21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
+    30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
+    31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
+    24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
+    38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
+    30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
+    29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
+    39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
+    25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
+    [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
+    29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
+    28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
+    38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
+    36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
+    21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
+    24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
+    [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
+    21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
+    30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
+    33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
+    25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
+    21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
+    33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
+    22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
+    38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
+    20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
+    27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
+    29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
+    36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
+    [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
+    22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
+    [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
+    36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
+    31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
+    21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
+    [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
+    32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
+    [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
+    [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
+    33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
+    20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
+    [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
+    21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
+    20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
+    [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
+    36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
+    36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
+    39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
+    38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
+    26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
+    22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
+    33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
+    38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
+    30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
+    21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
+    29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
+    33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
+    20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
+    21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
+    36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
+    24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
+    29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
+    34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
+    20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
+    27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
+    38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
+    31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
+    21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
+    21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
+    25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
+    35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
+    22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
+    31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
+    38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
+    30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
+    37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
+    39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
+    30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
+    30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
+    38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
+    21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
+    31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
+    31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
+    20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
+    [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
+    38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
+    33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
+    35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
+    31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
+    [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
+    [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
+    23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
+    25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
+    21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
+    25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
+    38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
+    21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
+    21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
+    28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
+    39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
+    32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
+    25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
+    24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
+    24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
+    20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
+    24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
+    22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
+    34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
+    35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
+    26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
+    28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
+    22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
+    29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
+    40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
+    21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
+    [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
+    38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
+    32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
+    20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
+    20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
+    29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
+    21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
+    28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
+    39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
+    31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
+    28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
+    40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
+    24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
+    32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
+    28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
+    32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
+    33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
+    39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
+    30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
+    33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
+    [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
+    29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
+    27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
+    33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
+    31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
+    23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
+    [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
+    34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
+    34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
+    33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
+    28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
+    27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
+    30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
+    27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
+    33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
+    38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
+    34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
+    23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
+    29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
+    33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
+    34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
+    34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
+    25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
+    30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
+    21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
+    36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
+    28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
+    30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
+    33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
+    20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
+    25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
+    20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
+    36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
+    22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
+    26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
+    22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
+    36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
+    36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
+    38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
+    38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
+    27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
+    38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
+    32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
+    20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
+    38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
+    39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
+    22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
+    28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
+    27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
+    30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
+    20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
+    24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
+    20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
+    33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
+    [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
+    [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
+    33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
+    21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
+    29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
+    27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
+    [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
+    21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
+    23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
+    21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
+    25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
+    [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
+    32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
+    30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
+    35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
+    20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
+    23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
+    20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
+    20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
+    25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
+    30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
+    28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
+    34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
+    25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
+    34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
+    [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
+    26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
+    32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
+    24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
+    33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
+    35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
+    30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
+    26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
+    22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
+    27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
+    22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
+    25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
+    31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
+    33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
+    30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
+    20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
+    [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
+    36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
+    20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
+    24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
+    36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
+    [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
+    35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
+    39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
+    23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
+    39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
+    23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
+    26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
+    26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
+    20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
+    39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
+    [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
+    29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
+    24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
+    26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
+    20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
+    35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
+    38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
+    29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
+    21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
+    38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
+    25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
+    38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
+    39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
+    [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
+    21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
+    38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
+    [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
+    27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
+    20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
+    33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
+    34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
+    [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
+    21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
+    31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
+    35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
+    32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
+    30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
+    [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
+    27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
+    21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
+    21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
+    30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
+    22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
+    38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
+    31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
+    20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
+    23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
+    26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
+    21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
+    38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
+    33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
+    [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
+    20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
+    24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
+    32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
+    21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
+    27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
+    36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
+    33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
+    24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
+    37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
+    20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
+    27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
+    28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
+    35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
+    21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
+    35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
+    21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
+    33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
+    23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
+    38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
+    26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
+    26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
+    26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
+    25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
+    21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
+    20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
+    27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
+    26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
+    24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
+    38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
+    21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
+    27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
+    26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
+    24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
+    37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
+    33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
+    20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
+    25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
+    31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
+    24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
+    [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
+    21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
+    35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
+    20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
+    31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
+    36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
+    38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
+    26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
+    36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
+    [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
+    32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
+    [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
+    22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
+    20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
+    19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
+    [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
+    22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
+    20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
+    21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
+    21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
+    {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
+    21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
+    20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
+    20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
+    20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
+    20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
+    20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
+    20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
+    20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
+    20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
+    [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
+    [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
+    20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
+    32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
+    20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
+    {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
+    {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
+    35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
+    35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
+    35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
+    {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
+    38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
+    38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
+    37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
+    37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
+    37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
+    37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
+    21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
+    20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
+    22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
+    {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
+    22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
+    22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
+    22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
+    22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
+    39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
+    33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
+    33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
+    33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
+    33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
+    33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
+    33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
+    33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
+    33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
+    {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
+    33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
+    33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
+    33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
+    33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
+    {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
+    33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
+    33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
+    29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
+    34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
+    34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
+    34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
+    [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
+    [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
+    25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
+    25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
+    25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
+    25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
+    25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
+    25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
+    21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
+    {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
+    21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
+    21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
+    21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
+    {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
+    21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
+    21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
+    {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
+    21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
+    21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
+    21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
+    21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
+    22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
+    22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
+    22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
+    22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
+    24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
+    23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
+    23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
+    23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
+    23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
+    23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
+    23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
+    24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
+    29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
+    29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
+    29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
+    29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
+    [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
+    {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
+    {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
+    24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
+    24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
+    24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
+    24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
+    24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
+    24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
+    24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
+    24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
+    38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
+    38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
+    {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
+    27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
+    27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
+    27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
+    27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
+    27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
+    27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
+    28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
+    28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
+    {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
+    28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
+    28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
+    28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
+    28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
+    28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
+    [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
+    23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
+    36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
+    36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
+    {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
+    36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
+    21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
+    33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
+    22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
+    22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
+    23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
+    23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
+    23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
+    23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
+    23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
+    {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
+    39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
+    32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
+    {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
+    {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
+    32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
+    {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
+    32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
+    [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
+    29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
+    29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
+    29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
+    29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
+    {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
+    29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
+    26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
+    26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
+    26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
+    26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
+    26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
+    26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
+    {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
+    26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
+    26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
+    27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
+    27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
+    27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
+    27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
+    27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
+    36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
+    {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
+    {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
+    25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
+    29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
+    26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
+    26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
+    26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
+    36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
+    36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
+    29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
+    25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
+    27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
+    27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
+    34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
+    32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
+    32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
+    33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
+    33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
+    {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
+    33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
+    27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
+    [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
+    26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
+    28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
+    28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
+    29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
+    29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
+    31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
+    31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
+    24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
+    24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
+    27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
+    26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
+    30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
+    30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
+    30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
+    31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
+    30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
+    30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
+    30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
+    30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
+    32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
+    30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
+    {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
+    38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
+    {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
+    {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
+    38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
+    {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
+    38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
+    {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
+    38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
+    {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
+    {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
+    {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
+    {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
+    31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
+    39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
+    40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
+    {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
+    {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
+    40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
+    30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
+    30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
+    30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
+    30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
+    30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
+    30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
+    31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
+    34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
+    35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
+    35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
+    [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
+    32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
+    32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
+    39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
+    {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
+    34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
+    34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
+    34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
+    34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
+    34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
+    34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
+    {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
+    34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
+    34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
+    34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
+    34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
+    {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
+    31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
+    31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
+    31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
+    31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
+    31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
+    31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
+    33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
+    33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
+    33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
+    35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
+    31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
+    {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
+    32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
+    32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
+    36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
+    37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
+    37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
+    {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
+    36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
+    36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
+    36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
+    36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
+    {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
+    36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
+    35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
+    35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
+    38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
+    {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
+    {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
+    37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
+    40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
+    {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
+    {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
+    {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
+    38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
+    39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
+    {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
+    39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
+    39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
+    {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
+    40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
+    40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
+    12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
+    25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
+    23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
+    32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
+    36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
+    25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
+    24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
+    35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
+    39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
+    [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
+    36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
+    31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
+    30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
+    24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
+    37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
+    27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
+    32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
+    38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
+    29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
+    38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
+    29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
+    36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
+    22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
+    39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
+    36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
+    23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
+    20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
+    39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
+    [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
+    22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
+    40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
+    25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
+    31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
+    36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
+    26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
+    38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
+    27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
+    25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
+    [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
+    28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
+    25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
+    31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
+    30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
+    31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
+    32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
+    27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
+    23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
+    34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
+    34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
+    21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
+    39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
+    32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
+    25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
+    29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
+    39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
+    27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
+    28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
+    24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
+    20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
+    39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
+    21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
+    35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
+    22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
+    40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
+    24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
+    22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
+    33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
+    30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
+    24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
+    [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
+    36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
+    22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
+    27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
+    31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
+    30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
+    32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
+    21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
+    36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
+    35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
+    24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
+    36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
+    36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
+    35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
+    35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
+    25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
+    30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
+    35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
+    32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
+    39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
+    [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
+    32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
+    31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
+    35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
+    23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
+    39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
+    35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
+    33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
+    38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
+    21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
+    21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
+    30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
+    27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
+    37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
+    35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
+    23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
+    31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
+    29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
+    39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
+    22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
+    38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
+    36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
+    36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
+    36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
+    36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
+    38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
+    25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
+    35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
+    36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
+    35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
+    28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
+    21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
+    21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
+    20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
+    33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
+    35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
+    35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
+    35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
+    35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
+    35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
+    38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
+    24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
+    22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
+    34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
+    34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
+    40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
+    34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
+    25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
+    22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
+    22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
+    22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
+    23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
+    24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
+    39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
+    39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
+    25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
+    24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
+    38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
+    38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
+    28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
+    28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
+    28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
+    23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
+    23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
+    39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
+    39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
+    {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
+    32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
+    32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
+    32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
+    32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
+    32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
+    32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
+    29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
+    27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
+    27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
+    27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
+    36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
+    36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
+    36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
+    36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
+    36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
+    35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
+    33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
+    36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
+    31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
+    30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
+    30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
+    37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
+    37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
+    37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
+    37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
+    37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
+    37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
+    37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
+    {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
+    37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
+    37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
+    37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
+    {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
+    37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
+    37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
+    40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
+    40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
+    40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
+    40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
+    30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
+    30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
+    32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
+    38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
+    34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
+    34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
+    31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
+    31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
+    36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
+    36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
+    40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
+    40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
+    31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
+    39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
+    39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
+    39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
+    39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
+    39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
+    40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
+    40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
+    22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
+    39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
+    [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
+    38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
+    31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
+    38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
+    8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
+    {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
+    {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
+    {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
+    13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
+    12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
+    {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
+    12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
+    {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
+    20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
+    20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
+    {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
+    {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
+    20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
+    {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
+    {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
+    20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
+    {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
+    {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
+    20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
+    20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
+    {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
+    20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
+    {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
+    20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
+    {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
+    {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
+    20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
+    20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
+    {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
+    {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
+    {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
+    {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
+    {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
+    {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
+    {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
+    {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
+    {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
+    {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
+    20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
+    {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
+    {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
+    20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
+    {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
+    {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
+    {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
+    20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
+    {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
+    {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
+    {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
+    {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
+    {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
+    {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
+    21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
+    {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
+    {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
+    {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
+    21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
+    {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
+    {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
+    {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
+    {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
+    {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
+    {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
+    {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
+    {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
+    {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
+    21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
+    {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
+    {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
+    {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
+    {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
+    {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
+    21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
+    {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
+    21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
+    21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
+    21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
+    {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
+    {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
+    {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
+    21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
+    {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
+    {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
+    21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
+    {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
+    {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
+    {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
+    {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
+    {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
+    {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
+    {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
+    21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
+    21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
+    {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
+    {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
+    {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
+    {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
+    {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
+    {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
+    22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
+    22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
+    {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
+    {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
+    22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
+    {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
+    {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
+    22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
+    {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
+    {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
+    {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
+    {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
+    {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
+    {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
+    22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
+    {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
+    22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
+    {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
+    {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
+    {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
+    {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
+    {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
+    {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
+    {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
+    {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
+    {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
+    {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
+    {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
+    {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
+    22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
+    {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
+    {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
+    {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
+    {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
+    {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
+    22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
+    22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
+    22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
+    {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
+    {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
+    {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
+    {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
+    23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
+    {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
+    {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
+    {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
+    {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
+    {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
+    {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
+    {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
+    {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
+    23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
+    {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
+    {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
+    {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
+    {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
+    {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
+    {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
+    {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
+    {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
+    {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
+    {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
+    {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
+    {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
+    23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
+    {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
+    23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
+    {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
+    {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
+    23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
+    {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
+    {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
+    {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
+    {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
+    {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
+    23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
+    {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
+    {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
+    {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
+    {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
+    {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
+    {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
+    {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
+    {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
+    23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
+    24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
+    {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
+    24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
+    {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
+    {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
+    {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
+    {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
+    {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
+    24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
+    24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
+    {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
+    24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
+    {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
+    {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
+    {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
+    {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
+    24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
+    {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
+    24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
+    24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
+    {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
+    {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
+    {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
+    {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
+    {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
+    {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
+    {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
+    {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
+    {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
+    {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
+    {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
+    {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
+    {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
+    {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
+    {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
+    {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
+    {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
+    {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
+    {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
+    {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
+    {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
+    {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
+    {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
+    {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
+    {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
+    {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
+    {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
+    {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
+    {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
+    25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
+    25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
+    {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
+    {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
+    {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
+    25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
+    {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
+    {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
+    {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
+    {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
+    {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
+    {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
+    {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
+    {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
+    {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
+    {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
+    {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
+    25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
+    25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
+    25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
+    {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
+    {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
+    {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
+    {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
+    {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
+    {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
+    {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
+    {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
+    {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
+    25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
+    {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
+    25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
+    25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
+    {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
+    {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
+    {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
+    {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
+    {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
+    25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
+    {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
+    {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
+    26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
+    {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
+    {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
+    {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
+    {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
+    {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
+    {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
+    {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
+    {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
+    {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
+    26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
+    {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
+    {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
+    {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
+    {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
+    {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
+    {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
+    {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
+    26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
+    {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
+    {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
+    {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
+    26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
+    {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
+    {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
+    26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
+    {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
+    26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
+    {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
+    26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
+    {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
+    26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
+    {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
+    26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
+    {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
+    {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
+    {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
+    {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
+    26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
+    {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
+    {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
+    {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
+    {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
+    {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
+    {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
+    {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
+    {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
+    {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
+    {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
+    27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
+    {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
+    {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
+    {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
+    {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
+    {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
+    27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
+    {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
+    {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
+    {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
+    {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
+    {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
+    27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
+    {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
+    {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
+    {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
+    {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
+    27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
+    {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
+    {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
+    27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
+    {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
+    27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
+    {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
+    {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
+    {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
+    {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
+    27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
+    {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
+    27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
+    {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
+    {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
+    27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
+    27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
+    {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
+    {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
+    {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
+    {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
+    {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
+    {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
+    {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
+    {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
+    {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
+    27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
+    {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
+    {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
+    28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
+    28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
+    {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
+    {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
+    {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
+    28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
+    {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
+    {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
+    28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
+    {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
+    {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
+    {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
+    {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
+    {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
+    28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
+    {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
+    {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
+    {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
+    {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
+    {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
+    {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
+    {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
+    {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
+    {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
+    {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
+    {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
+    {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
+    {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
+    {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
+    {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
+    {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
+    {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
+    28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
+    {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
+    {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
+    {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
+    {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
+    {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
+    28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
+    {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
+    {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
+    {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
+    28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
+    {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
+    {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
+    29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
+    29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
+    29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
+    {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
+    {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
+    29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
+    {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
+    {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
+    {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
+    29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
+    {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
+    {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
+    {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
+    29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
+    {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
+    {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
+    {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
+    29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
+    {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
+    29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
+    {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
+    {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
+    {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
+    {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
+    {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
+    {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
+    29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
+    29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
+    {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
+    29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
+    {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
+    {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
+    {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
+    29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
+    {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
+    {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
+    {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
+    {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
+    {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
+    {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
+    {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
+    {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
+    {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
+    {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
+    {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
+    {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
+    30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
+    {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
+    {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
+    {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
+    {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
+    30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
+    {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
+    {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
+    {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
+    {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
+    {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
+    {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
+    {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
+    {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
+    {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
+    30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
+    {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
+    {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
+    30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
+    {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
+    {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
+    30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
+    {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
+    {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
+    {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
+    {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
+    30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
+    {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
+    {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
+    {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
+    {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
+    {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
+    {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
+    {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
+    {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
+    {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
+    30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
+    {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
+    {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
+    {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
+    {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
+    {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
+    {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
+    {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
+    {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
+    {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
+    {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
+    {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
+    {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
+    {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
+    {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
+    {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
+    {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
+    31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
+    {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
+    {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
+    31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
+    31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
+    {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
+    31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
+    {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
+    {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
+    31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
+    31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
+    {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
+    {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
+    31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
+    {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
+    {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
+    {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
+    {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
+    {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
+    {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
+    {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
+    31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
+    {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
+    {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
+    {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
+    {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
+    {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
+    31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
+    {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
+    31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
+    {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
+    {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
+    31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
+    {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
+    {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
+    31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
+    {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
+    {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
+    31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
+    31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
+    {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
+    {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
+    32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
+    {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
+    {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
+    {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
+    {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
+    {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
+    {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
+    32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
+    32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
+    {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
+    {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
+    {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
+    {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
+    {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
+    32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
+    {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
+    32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
+    {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
+    32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
+    {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
+    {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
+    {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
+    {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
+    {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
+    {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
+    32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
+    {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
+    {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
+    {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
+    {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
+    {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
+    {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
+    {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
+    {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
+    {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
+    32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
+    {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
+    {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
+    {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
+    33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
+    33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
+    33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
+    {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
+    {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
+    {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
+    {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
+    {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
+    {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
+    {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
+    {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
+    {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
+    {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
+    {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
+    {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
+    {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
+    33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
+    33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
+    {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
+    33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
+    {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
+    33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
+    {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
+    {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
+    {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
+    {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
+    {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
+    {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
+    {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
+    {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
+    {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
+    {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
+    {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
+    {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
+    {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
+    {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
+    33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
+    {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
+    {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
+    {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
+    {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
+    {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
+    {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
+    {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
+    {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
+    {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
+    {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
+    {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
+    {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
+    34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
+    {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
+    {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
+    34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
+    {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
+    {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
+    {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
+    34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
+    {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
+    {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
+    {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
+    34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
+    {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
+    {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
+    {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
+    {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
+    {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
+    {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
+    34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
+    {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
+    {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
+    34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
+    {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
+    {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
+    {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
+    {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
+    {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
+    {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
+    34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
+    {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
+    {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
+    {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
+    {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
+    {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
+    34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
+    {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
+    {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
+    {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
+    {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
+    {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
+    35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
+    {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
+    {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
+    {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
+    {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
+    {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
+    {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
+    {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
+    {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
+    {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
+    {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
+    {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
+    {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
+    {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
+    {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
+    {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
+    {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
+    {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
+    {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
+    {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
+    {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
+    {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
+    35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
+    {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
+    {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
+    {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
+    {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
+    35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
+    {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
+    {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
+    35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
+    35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
+    {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
+    {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
+    {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
+    {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
+    {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
+    35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
+    35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
+    {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
+    {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
+    {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
+    {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
+    {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
+    {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
+    {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
+    {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
+    36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
+    {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
+    {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
+    {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
+    {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
+    {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
+    {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
+    {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
+    36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
+    {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
+    {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
+    {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
+    {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
+    36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
+    36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
+    36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
+    {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
+    {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
+    {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
+    {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
+    {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
+    {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
+    {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
+    {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
+    36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
+    {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
+    {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
+    {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
+    36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
+    {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
+    36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
+    {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
+    {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
+    36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
+    36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
+    {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
+    {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
+    37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
+    {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
+    {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
+    37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
+    {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
+    37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
+    {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
+    {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
+    {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
+    37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
+    37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
+    {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
+    {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
+    {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
+    {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
+    {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
+    {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
+    {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
+    {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
+    37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
+    {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
+    37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
+    {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
+    {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
+    {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
+    {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
+    37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
+    37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
+    {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
+    {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
+    {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
+    {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
+    {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
+    {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
+    {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
+    {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
+    37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
+    {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
+    {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
+    {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
+    {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
+    {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
+    {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
+    37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
+    {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
+    {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
+    {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
+    38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
+    38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
+    {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
+    {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
+    {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
+    {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
+    {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
+    {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
+    {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
+    {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
+    38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
+    {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
+    38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
+    38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
+    {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
+    38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
+    {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
+    {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
+    {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
+    {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
+    {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
+    38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
+    {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
+    {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
+    {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
+    {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
+    {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
+    {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
+    {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
+    {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
+    {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
+    38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
+    {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
+    {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
+    {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
+    39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
+    {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
+    39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
+    {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
+    {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
+    {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
+    {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
+    {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
+    {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
+    {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
+    {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
+    39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
+    39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
+    {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
+    {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
+    {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
+    {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
+    39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
+    {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
+    {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
+    39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
+    {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
+    {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
+    {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
+    {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
+    {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
+    {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
+    39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
+    {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
+    {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
+    {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
+    {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
+    {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
+    {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
+    {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
+    {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
+    {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
+    39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
+    {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
+    {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
+    {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
+    40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
+    {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
+    {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
+    {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
+    40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
+    {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
+    {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
+    {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
+    {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
+    {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
+    {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
+    {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
+    {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
+    40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
+    {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
+    {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
+    {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
+    {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
+    {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
+    40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
+    {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
+    {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
+    {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
+    40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
+    {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
+    {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
+    {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
+    {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
+    {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
+    {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
+    {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
+    {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
+    [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
+    11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
+    59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
+    11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
+    {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
+    18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
+    18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
+    18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
+    19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
+    {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
+    {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
+    {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
+    {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
+    {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
+    {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
+    {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
+    {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
+    {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
+    {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
+    {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
+    {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
+    {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
+    {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
+    {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
+    {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
+    {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
+    {f: 7, c: 19887}]
+};
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ColorSpace = (function ColorSpaceClosure() {
+  // Constructor should define this.numComps, this.defaultColor, this.name
+  function ColorSpace() {
+    error('should not call ColorSpace constructor');
+  }
+
+  ColorSpace.prototype = {
+    // Input: array of size numComps representing color component values
+    // Output: array of rgb values, each value ranging from [0.1]
+    getRgb: function ColorSpace_getRgb(color) {
+      error('Should not call ColorSpace.getRgb: ' + color);
+    },
+    // Input: Uint8Array of component values, each value scaled to [0,255]
+    // Output: Uint8Array of rgb values, each value scaled to [0,255]
+    getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
+      error('Should not call ColorSpace.getRgbBuffer: ' + input);
+    }
+  };
+
+  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
+    var IR = ColorSpace.parseToIR(cs, xref, res);
+    if (IR instanceof AlternateCS)
+      return IR;
+
+    return ColorSpace.fromIR(IR);
+  };
+
+  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
+    var name = isArray(IR) ? IR[0] : IR;
+
+    switch (name) {
+      case 'DeviceGrayCS':
+        return new DeviceGrayCS();
+      case 'DeviceRgbCS':
+        return new DeviceRgbCS();
+      case 'DeviceCmykCS':
+        return new DeviceCmykCS();
+      case 'PatternCS':
+        var basePatternCS = IR[1];
+        if (basePatternCS)
+          basePatternCS = ColorSpace.fromIR(basePatternCS);
+        return new PatternCS(basePatternCS);
+      case 'IndexedCS':
+        var baseIndexedCS = IR[1];
+        var hiVal = IR[2];
+        var lookup = IR[3];
+        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+      case 'AlternateCS':
+        var numComps = IR[1];
+        var alt = IR[2];
+        var tintFnIR = IR[3];
+
+        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+                                PDFFunction.fromIR(tintFnIR));
+      case 'LabCS':
+        var whitePoint = IR[1].WhitePoint;
+        var blackPoint = IR[1].BlackPoint;
+        var range = IR[1].Range;
+        return new LabCS(whitePoint, blackPoint, range);
+      default:
+        error('Unkown name ' + name);
+    }
+    return null;
+  };
+
+  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
+    if (isName(cs)) {
+      var colorSpaces = res.get('ColorSpace');
+      if (isDict(colorSpaces)) {
+        var refcs = colorSpaces.get(cs.name);
+        if (refcs)
+          cs = refcs;
+      }
+    }
+
+    cs = xref.fetchIfRef(cs);
+    var mode;
+
+    if (isName(cs)) {
+      mode = cs.name;
+      this.mode = mode;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'Pattern':
+          return ['PatternCS', null];
+        default:
+          error('unrecognized colorspace ' + mode);
+      }
+    } else if (isArray(cs)) {
+      mode = cs[0].name;
+      this.mode = mode;
+
+      switch (mode) {
+        case 'DeviceGray':
+        case 'G':
+          return 'DeviceGrayCS';
+        case 'DeviceRGB':
+        case 'RGB':
+          return 'DeviceRgbCS';
+        case 'DeviceCMYK':
+        case 'CMYK':
+          return 'DeviceCmykCS';
+        case 'CalGray':
+          return 'DeviceGrayCS';
+        case 'CalRGB':
+          return 'DeviceRgbCS';
+        case 'ICCBased':
+          var stream = xref.fetchIfRef(cs[1]);
+          var dict = stream.dict;
+          var numComps = dict.get('N');
+          if (numComps == 1)
+            return 'DeviceGrayCS';
+          if (numComps == 3)
+            return 'DeviceRgbCS';
+          if (numComps == 4)
+            return 'DeviceCmykCS';
+          break;
+        case 'Pattern':
+          var basePatternCS = cs[1];
+          if (basePatternCS)
+            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+          return ['PatternCS', basePatternCS];
+        case 'Indexed':
+        case 'I':
+          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+          var hiVal = cs[2] + 1;
+          var lookup = xref.fetchIfRef(cs[3]);
+          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+        case 'Separation':
+        case 'DeviceN':
+          var name = cs[1];
+          var numComps = 1;
+          if (isName(name))
+            numComps = 1;
+          else if (isArray(name))
+            numComps = name.length;
+          var alt = ColorSpace.parseToIR(cs[2], xref, res);
+          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+          return ['AlternateCS', numComps, alt, tintFnIR];
+        case 'Lab':
+          var params = cs[1].getAll();
+          return ['LabCS', params];
+        default:
+          error('unimplemented color space object "' + mode + '"');
+      }
+    } else {
+      error('unrecognized color space object: "' + cs + '"');
+    }
+    return null;
+  };
+  /**
+   * Checks if a decode map matches the default decode map for a color space.
+   * This handles the general decode maps where there are two values per
+   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
+   * This does not handle Lab, Indexed, or Pattern decode maps since they are
+   * slightly different.
+   * @param {Array} decode Decode map (usually from an image).
+   * @param {Number} n Number of components the color space has.
+   */
+  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
+    if (!decode)
+      return true;
+
+    if (n * 2 !== decode.length) {
+      warning('The decode map is not the correct length');
+      return true;
+    }
+    for (var i = 0, ii = decode.length; i < ii; i += 2) {
+      if (decode[i] != 0 || decode[i + 1] != 1)
+        return false;
+    }
+    return true;
+  };
+
+  return ColorSpace;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces.  A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function AlternateCSClosure() {
+  function AlternateCS(numComps, base, tintFn) {
+    this.name = 'Alternate';
+    this.numComps = numComps;
+    this.defaultColor = [];
+    for (var i = 0; i < numComps; ++i)
+      this.defaultColor.push(1);
+    this.base = base;
+    this.tintFn = tintFn;
+  }
+
+  AlternateCS.prototype = {
+    getRgb: function AlternateCS_getRgb(color) {
+      var tinted = this.tintFn(color);
+      return this.base.getRgb(tinted);
+    },
+    getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
+      var tintFn = this.tintFn;
+      var base = this.base;
+      var scale = 1 / ((1 << bits) - 1);
+      var length = input.length;
+      var pos = 0;
+      var baseNumComps = base.numComps;
+      var baseBuf = new Uint8Array(baseNumComps * length);
+      var numComps = this.numComps;
+      var scaled = [];
+
+      for (var i = 0; i < length; i += numComps) {
+        for (var z = 0; z < numComps; ++z)
+          scaled[z] = input[i + z] * scale;
+
+        var tinted = tintFn(scaled);
+        for (var j = 0; j < baseNumComps; ++j)
+          baseBuf[pos++] = 255 * tinted[j];
+      }
+      return base.getRgbBuffer(baseBuf, 8);
+    },
+    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  };
+
+  return AlternateCS;
+})();
+
+var PatternCS = (function PatternCSClosure() {
+  function PatternCS(baseCS) {
+    this.name = 'Pattern';
+    this.base = baseCS;
+  }
+  PatternCS.prototype = {};
+
+  return PatternCS;
+})();
+
+var IndexedCS = (function IndexedCSClosure() {
+  function IndexedCS(base, highVal, lookup) {
+    this.name = 'Indexed';
+    this.numComps = 1;
+    this.defaultColor = [0];
+    this.base = base;
+    this.highVal = highVal;
+
+    var baseNumComps = base.numComps;
+    var length = baseNumComps * highVal;
+    var lookupArray = new Uint8Array(length);
+
+    if (isStream(lookup)) {
+      var bytes = lookup.getBytes(length);
+      lookupArray.set(bytes);
+    } else if (isString(lookup)) {
+      for (var i = 0; i < length; ++i)
+        lookupArray[i] = lookup.charCodeAt(i);
+    } else {
+      error('Unrecognized lookup table: ' + lookup);
+    }
+    this.lookup = lookupArray;
+  }
+
+  IndexedCS.prototype = {
+    getRgb: function IndexedCS_getRgb(color) {
+      var numComps = this.base.numComps;
+      var start = color[0] * numComps;
+      var c = [];
+
+      for (var i = start, ii = start + numComps; i < ii; ++i)
+        c.push(this.lookup[i]);
+
+      return this.base.getRgb(c);
+    },
+    getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
+      var base = this.base;
+      var numComps = base.numComps;
+      var lookup = this.lookup;
+      var length = input.length;
+      var baseBuf = new Uint8Array(length * numComps);
+      var baseBufPos = 0;
+
+      for (var i = 0; i < length; ++i) {
+        var lookupPos = input[i] * numComps;
+        for (var j = 0; j < numComps; ++j) {
+          baseBuf[baseBufPos++] = lookup[lookupPos + j];
+        }
+      }
+
+      return base.getRgbBuffer(baseBuf, 8);
+    },
+    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
+      // indexed color maps shouldn't be changed
+      return true;
+    }
+  };
+  return IndexedCS;
+})();
+
+var DeviceGrayCS = (function DeviceGrayCSClosure() {
+  function DeviceGrayCS() {
+    this.name = 'DeviceGray';
+    this.numComps = 1;
+    this.defaultColor = [0];
+  }
+
+  DeviceGrayCS.prototype = {
+    getRgb: function DeviceGrayCS_getRgb(color) {
+      var c = color[0];
+      return [c, c, c];
+    },
+    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
+      var scale = 255 / ((1 << bits) - 1);
+      var length = input.length;
+      var rgbBuf = new Uint8Array(length * 3);
+      for (var i = 0, j = 0; i < length; ++i) {
+        var c = (scale * input[i]) | 0;
+        rgbBuf[j++] = c;
+        rgbBuf[j++] = c;
+        rgbBuf[j++] = c;
+      }
+      return rgbBuf;
+    },
+    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  };
+  return DeviceGrayCS;
+})();
+
+var DeviceRgbCS = (function DeviceRgbCSClosure() {
+  function DeviceRgbCS() {
+    this.name = 'DeviceRGB';
+    this.numComps = 3;
+    this.defaultColor = [0, 0, 0];
+  }
+  DeviceRgbCS.prototype = {
+    getRgb: function DeviceRgbCS_getRgb(color) {
+      return color;
+    },
+    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
+      if (bits == 8)
+        return input;
+      var scale = 255 / ((1 << bits) - 1);
+      var i, length = input.length;
+      var rgbBuf = new Uint8Array(length);
+      for (i = 0; i < length; ++i)
+        rgbBuf[i] = (scale * input[i]) | 0;
+      return rgbBuf;
+    },
+    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  };
+  return DeviceRgbCS;
+})();
+
+var DeviceCmykCS = (function DeviceCmykCSClosure() {
+  function DeviceCmykCS() {
+    this.name = 'DeviceCMYK';
+    this.numComps = 4;
+    this.defaultColor = [0, 0, 0, 1];
+  }
+  DeviceCmykCS.prototype = {
+    getRgb: function DeviceCmykCS_getRgb(color) {
+      var c = color[0], m = color[1], y = color[2], k = color[3];
+
+      // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
+      c = (c * (1 - k) + k);
+      m = (m * (1 - k) + k);
+      y = (y * (1 - k) + k);
+
+      // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
+      var r = (1 - c);
+      var g = (1 - m);
+      var b = (1 - y);
+
+      return [r, g, b];
+    },
+    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
+      var scale = 1 / ((1 << bits) - 1);
+      var length = colorBuf.length / 4;
+      var rgbBuf = new Uint8Array(length * 3);
+      var rgbBufPos = 0;
+      var colorBufPos = 0;
+
+      for (var i = 0; i < length; i++) {
+        var cmyk = [];
+        for (var j = 0; j < 4; ++j)
+          cmyk.push(scale * colorBuf[colorBufPos++]);
+
+        var rgb = this.getRgb(cmyk);
+        for (var j = 0; j < 3; ++j)
+          rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
+      }
+
+      return rgbBuf;
+    },
+    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  };
+
+  return DeviceCmykCS;
+})();
+
+//
+// LabCS: Based on "PDF Reference, Sixth Ed", p.250
+//
+var LabCS = (function LabCSClosure() {
+  function LabCS(whitePoint, blackPoint, range) {
+    this.name = 'Lab';
+    this.numComps = 3;
+    this.defaultColor = [0, 0, 0];
+
+    if (!whitePoint)
+      error('WhitePoint missing - required for color space Lab');
+    blackPoint = blackPoint || [0, 0, 0];
+    range = range || [-100, 100, -100, 100];
+
+    // Translate args to spec variables
+    this.XW = whitePoint[0];
+    this.YW = whitePoint[1];
+    this.ZW = whitePoint[2];
+    this.amin = range[0];
+    this.amax = range[1];
+    this.bmin = range[2];
+    this.bmax = range[3];
+
+    // These are here just for completeness - the spec doesn't offer any
+    // formulas that use BlackPoint in Lab
+    this.XB = blackPoint[0];
+    this.YB = blackPoint[1];
+    this.ZB = blackPoint[2];
+
+    // Validate vars as per spec
+    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
+      error('Invalid WhitePoint components, no fallback available');
+
+    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+      warn('Invalid BlackPoint, falling back to default');
+      this.XB = this.YB = this.ZB = 0;
+    }
+
+    if (this.amin > this.amax || this.bmin > this.bmax) {
+      warn('Invalid Range, falling back to defaults');
+      this.amin = -100;
+      this.amax = 100;
+      this.bmin = -100;
+      this.bmax = 100;
+    }
+  };
+
+  // Function g(x) from spec
+  function g(x) {
+    if (x >= 6 / 29)
+      return x * x * x;
+    else
+      return (108 / 841) * (x - 4 / 29);
+  }
+
+  LabCS.prototype = {
+    getRgb: function LabCS_getRgb(color) {
+      // Ls,as,bs <---> L*,a*,b* in the spec
+      var Ls = color[0], as = color[1], bs = color[2];
+
+      // Adjust limits of 'as' and 'bs'
+      as = as > this.amax ? this.amax : as;
+      as = as < this.amin ? this.amin : as;
+      bs = bs > this.bmax ? this.bmax : bs;
+      bs = bs < this.bmin ? this.bmin : bs;
+
+      // Computes intermediate variables X,Y,Z as per spec
+      var M = (Ls + 16) / 116;
+      var L = M + (as / 500);
+      var N = M - (bs / 200);
+      var X = this.XW * g(L);
+      var Y = this.YW * g(M);
+      var Z = this.ZW * g(N);
+
+      // XYZ to RGB 3x3 matrix, from:
+      // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
+      var XYZtoRGB = [3.240479, -1.537150, -0.498535,
+                      -0.969256, 1.875992, 0.041556,
+                      0.055648, -0.204043, 1.057311];
+
+      return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
+    },
+    getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
+      if (bits == 8)
+        return input;
+      var scale = 255 / ((1 << bits) - 1);
+      var i, length = input.length / 3;
+      var rgbBuf = new Uint8Array(length);
+
+      var j = 0;
+      for (i = 0; i < length; ++i) {
+        // Convert L*, a*, s* into RGB
+        var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
+        rgbBuf[j++] = rgb[0];
+        rgbBuf[j++] = rgb[1];
+        rgbBuf[j++] = rgb[2];
+      }
+
+      return rgbBuf;
+    },
+    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
+      // From Table 90 in Adobe's:
+      // "Document management - Portable document format", 1st ed, 2008
+      if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
+          decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
+          decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
+        return true;
+      else
+        return false;
+    }
+  };
+  return LabCS;
+})();
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var ARCFourCipher = (function ARCFourCipherClosure() {
+  function ARCFourCipher(key) {
+    this.a = 0;
+    this.b = 0;
+    var s = new Uint8Array(256);
+    var i, j = 0, tmp, keyLength = key.length;
+    for (i = 0; i < 256; ++i)
+      s[i] = i;
+    for (i = 0; i < 256; ++i) {
+      tmp = s[i];
+      j = (j + tmp + key[i % keyLength]) & 0xFF;
+      s[i] = s[j];
+      s[j] = tmp;
+    }
+    this.s = s;
+  }
+
+  ARCFourCipher.prototype = {
+    encryptBlock: function ARCFourCipher_encryptBlock(data) {
+      var i, n = data.length, tmp, tmp2;
+      var a = this.a, b = this.b, s = this.s;
+      var output = new Uint8Array(n);
+      for (i = 0; i < n; ++i) {
+        a = (a + 1) & 0xFF;
+        tmp = s[a];
+        b = (b + tmp) & 0xFF;
+        tmp2 = s[b];
+        s[a] = tmp2;
+        s[b] = tmp;
+        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
+      }
+      this.a = a;
+      this.b = b;
+      return output;
+    }
+  };
+  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
+
+  return ARCFourCipher;
+})();
+
+var calculateMD5 = (function calculateMD5Closure() {
+  var r = new Uint8Array([
+    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+
+  var k = new Int32Array([
+    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
+    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
+    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
+    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
+    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
+    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
+    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
+    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
+    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
+    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
+    -145523070, -1120210379, 718787259, -343485551]);
+
+  function hash(data, offset, length) {
+    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
+    // pre-processing
+    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
+    var padded = new Uint8Array(paddedLength);
+    var i, j, n;
+    for (i = 0; i < length; ++i)
+      padded[i] = data[offset++];
+    padded[i++] = 0x80;
+    n = paddedLength - 8;
+    while (i < n)
+      padded[i++] = 0;
+    padded[i++] = (length << 3) & 0xFF;
+    padded[i++] = (length >> 5) & 0xFF;
+    padded[i++] = (length >> 13) & 0xFF;
+    padded[i++] = (length >> 21) & 0xFF;
+    padded[i++] = (length >>> 29) & 0xFF;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    // chunking
+    // TODO ArrayBuffer ?
+    var w = new Int32Array(16);
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j, i += 4) {
+        w[j] = (padded[i] | (padded[i + 1] << 8) |
+                (padded[i + 2] << 16) | (padded[i + 3] << 24));
+      }
+      var a = h0, b = h1, c = h2, d = h3, f, g;
+      for (j = 0; j < 64; ++j) {
+        if (j < 16) {
+          f = (b & c) | ((~b) & d);
+          g = j;
+        } else if (j < 32) {
+          f = (d & b) | ((~d) & c);
+          g = (5 * j + 1) & 15;
+        } else if (j < 48) {
+          f = b ^ c ^ d;
+          g = (3 * j + 5) & 15;
+        } else {
+          f = c ^ (b | (~d));
+          g = (7 * j) & 15;
+        }
+        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
+        d = c;
+        c = b;
+        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
+        a = tmp;
+      }
+      h0 = (h0 + a) | 0;
+      h1 = (h1 + b) | 0;
+      h2 = (h2 + c) | 0;
+      h3 = (h3 + d) | 0;
+    }
+    return new Uint8Array([
+        h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
+        h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
+        h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
+        h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
+    ]);
+  }
+  return hash;
+})();
+
+var NullCipher = (function NullCipherClosure() {
+  function NullCipher() {
+  }
+
+  NullCipher.prototype = {
+    decryptBlock: function NullCipher_decryptBlock(data) {
+      return data;
+    }
+  };
+
+  return NullCipher;
+})();
+
+var AES128Cipher = (function AES128CipherClosure() {
+  var rcon = new Uint8Array([
+    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+    0x74, 0xe8, 0xcb, 0x8d]);
+
+  var s = new Uint8Array([
+    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+    0xb0, 0x54, 0xbb, 0x16]);
+
+  var inv_s = new Uint8Array([
+    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+    0x55, 0x21, 0x0c, 0x7d]);
+
+  var mix = new Uint32Array([
+    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+  function expandKey128(cipherKey) {
+    var b = 176, result = new Uint8Array(b);
+    result.set(cipherKey);
+    for (var j = 16, i = 1; j < b; ++i) {
+      // RotWord
+      var t1 = result[j - 3], t2 = result[j - 2],
+          t3 = result[j - 1], t4 = result[j - 4];
+      // SubWord
+      t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
+      // Rcon
+      t1 = t1 ^ rcon[i];
+      for (var n = 0; n < 4; ++n) {
+        result[j] = (t1 ^= result[j - 16]); j++;
+        result[j] = (t2 ^= result[j - 16]); j++;
+        result[j] = (t3 ^= result[j - 16]); j++;
+        result[j] = (t4 ^= result[j - 16]); j++;
+      }
+    }
+    return result;
+  }
+
+  function decrypt128(input, key) {
+    var state = new Uint8Array(16);
+    state.set(input);
+    var i, j, k;
+    var t, u, v;
+    // AddRoundKey
+    for (j = 0, k = 160; j < 16; ++j, ++k)
+      state[j] ^= key[k];
+    for (i = 9; i >= 1; --i) {
+      // InvShiftRows
+      t = state[13]; state[13] = state[9]; state[9] = state[5];
+      state[5] = state[1]; state[1] = t;
+      t = state[14]; u = state[10]; state[14] = state[6];
+      state[10] = state[2]; state[6] = t; state[2] = u;
+      t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+      state[11] = t; state[7] = u; state[3] = v;
+      // InvSubBytes
+      for (j = 0; j < 16; ++j)
+        state[j] = inv_s[state[j]];
+      // AddRoundKey
+      for (j = 0, k = i * 16; j < 16; ++j, ++k)
+        state[j] ^= key[k];
+      // InvMixColumns
+      for (j = 0; j < 16; j += 4) {
+        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+            (s3 >>> 24) ^ (s3 << 8));
+        state[j] = (t >>> 24) & 0xFF;
+        state[j + 1] = (t >> 16) & 0xFF;
+        state[j + 2] = (t >> 8) & 0xFF;
+        state[j + 3] = t & 0xFF;
+      }
+    }
+    // InvShiftRows
+    t = state[13]; state[13] = state[9]; state[9] = state[5];
+    state[5] = state[1]; state[1] = t;
+    t = state[14]; u = state[10]; state[14] = state[6];
+    state[10] = state[2]; state[6] = t; state[2] = u;
+    t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
+    state[11] = t; state[7] = u; state[3] = v;
+    for (j = 0; j < 16; ++j) {
+      // InvSubBytes
+      state[j] = inv_s[state[j]];
+      // AddRoundKey
+      state[j] ^= key[j];
+    }
+    return state;
+  }
+
+  function AES128Cipher(key) {
+    this.key = expandKey128(key);
+    this.buffer = new Uint8Array(16);
+    this.bufferPosition = 0;
+  }
+
+  function decryptBlock2(data) {
+    var i, j, ii, sourceLength = data.length,
+        buffer = this.buffer, bufferLength = this.bufferPosition,
+        result = [], iv = this.iv;
+    for (i = 0; i < sourceLength; ++i) {
+      buffer[bufferLength] = data[i];
+      ++bufferLength;
+      if (bufferLength < 16)
+        continue;
+      // buffer is full, decrypting
+      var plain = decrypt128(buffer, this.key);
+      // xor-ing the IV vector to get plain text
+      for (j = 0; j < 16; ++j)
+        plain[j] ^= iv[j];
+      iv = buffer;
+      result.push(plain);
+      buffer = new Uint8Array(16);
+      bufferLength = 0;
+    }
+    // saving incomplete buffer
+    this.buffer = buffer;
+    this.bufferLength = bufferLength;
+    this.iv = iv;
+    if (result.length == 0)
+      return new Uint8Array([]);
+    if (result.length == 1)
+      return result[0];
+    // combining plain text blocks into one
+    var output = new Uint8Array(16 * result.length);
+    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
+      output.set(result[i], j);
+    return output;
+  }
+
+  AES128Cipher.prototype = {
+    decryptBlock: function AES128Cipher_decryptBlock(data) {
+      var i, sourceLength = data.length;
+      var buffer = this.buffer, bufferLength = this.bufferPosition;
+      // waiting for IV values -- they are at the start of the stream
+      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
+        buffer[bufferLength] = data[i];
+      if (bufferLength < 16) {
+        // need more data
+        this.bufferLength = bufferLength;
+        return new Uint8Array([]);
+      }
+      this.iv = buffer;
+      this.buffer = new Uint8Array(16);
+      this.bufferLength = 0;
+      // starting decryption
+      this.decryptBlock = decryptBlock2;
+      return this.decryptBlock(data.subarray(16));
+    }
+  };
+
+  return AES128Cipher;
+})();
+
+var CipherTransform = (function CipherTransformClosure() {
+  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
+    this.stringCipherConstructor = stringCipherConstructor;
+    this.streamCipherConstructor = streamCipherConstructor;
+  }
+  CipherTransform.prototype = {
+    createStream: function CipherTransform_createStream(stream) {
+      var cipher = new this.streamCipherConstructor();
+      return new DecryptStream(stream,
+        function cipherTransformDecryptStream(data) {
+          return cipher.decryptBlock(data);
+        }
+      );
+    },
+    decryptString: function CipherTransform_decryptString(s) {
+      var cipher = new this.stringCipherConstructor();
+      var data = stringToBytes(s);
+      data = cipher.decryptBlock(data);
+      return bytesToString(data);
+    }
+  };
+  return CipherTransform;
+})();
+
+var CipherTransformFactory = (function CipherTransformFactoryClosure() {
+  function prepareKeyData(fileId, password, ownerPassword, userPassword,
+                          flags, revision, keyLength, encryptMetadata) {
+    var defaultPasswordBytes = new Uint8Array([
+      0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
+      0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+      0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
+      0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+    var hashData = new Uint8Array(100), i = 0, j, n;
+    if (password) {
+      n = Math.min(32, password.length);
+      for (; i < n; ++i)
+        hashData[i] = password[i];
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+    // as now the padded password in the hashData[0..i]
+    for (j = 0, n = ownerPassword.length; j < n; ++j)
+      hashData[i++] = ownerPassword[j];
+    hashData[i++] = flags & 0xFF;
+    hashData[i++] = (flags >> 8) & 0xFF;
+    hashData[i++] = (flags >> 16) & 0xFF;
+    hashData[i++] = (flags >>> 24) & 0xFF;
+    for (j = 0, n = fileId.length; j < n; ++j)
+      hashData[i++] = fileId[j];
+    if (revision >= 4 && !encryptMetadata) {
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+    }
+    var hash = calculateMD5(hashData, 0, i);
+    var keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+         hash = calculateMD5(hash, 0, keyLengthInBytes);
+      }
+    }
+    var encryptionKey = hash.subarray(0, keyLengthInBytes);
+    var cipher, checkData;
+
+    if (revision >= 3) {
+      // padded password in hashData, we can use this array for user
+      // password check
+      i = 32;
+      for (j = 0, n = fileId.length; j < n; ++j)
+        hashData[i++] = fileId[j];
+      cipher = new ARCFourCipher(encryptionKey);
+      var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+      n = encryptionKey.length;
+      var derivedKey = new Uint8Array(n), k;
+      for (j = 1; j <= 19; ++j) {
+        for (k = 0; k < n; ++k)
+          derivedKey[k] = encryptionKey[k] ^ j;
+        cipher = new ARCFourCipher(derivedKey);
+        checkData = cipher.encryptBlock(checkData);
+      }
+    } else {
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(hashData.subarray(0, 32));
+    }
+    for (j = 0, n = checkData.length; j < n; ++j) {
+      if (userPassword[j] != checkData[j])
+        error('incorrect password');
+    }
+    return encryptionKey;
+  }
+
+  var identityName = new Name('Identity');
+
+  function CipherTransformFactory(dict, fileId, password) {
+    var filter = dict.get('Filter');
+    if (!isName(filter) || filter.name != 'Standard')
+      error('unknown encryption method');
+    this.dict = dict;
+    var algorithm = dict.get('V');
+    if (!isInt(algorithm) ||
+      (algorithm != 1 && algorithm != 2 && algorithm != 4))
+      error('unsupported encryption algorithm');
+    this.algorithm = algorithm;
+    var keyLength = dict.get('Length') || 40;
+    if (!isInt(keyLength) ||
+      keyLength < 40 || (keyLength % 8) != 0)
+      error('invalid key length');
+    // prepare keys
+    var ownerPassword = stringToBytes(dict.get('O'));
+    var userPassword = stringToBytes(dict.get('U'));
+    var flags = dict.get('P');
+    var revision = dict.get('R');
+    var encryptMetadata =
+      dict.get('EncryptMetadata') !== false; // makes true as default value
+    var fileIdBytes = stringToBytes(fileId);
+    var passwordBytes;
+    if (password)
+      passwordBytes = stringToBytes(password);
+
+    this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
+                                        ownerPassword, userPassword,
+                                        flags, revision,
+                                        keyLength, encryptMetadata);
+    if (algorithm == 4) {
+      this.cf = dict.get('CF');
+      this.stmf = dict.get('StmF') || identityName;
+      this.strf = dict.get('StrF') || identityName;
+      this.eff = dict.get('EFF') || this.strf;
+    }
+  }
+
+  function buildObjectKey(num, gen, encryptionKey, isAes) {
+    var key = new Uint8Array(encryptionKey.length + 9), i, n;
+    for (i = 0, n = encryptionKey.length; i < n; ++i)
+      key[i] = encryptionKey[i];
+    key[i++] = num & 0xFF;
+    key[i++] = (num >> 8) & 0xFF;
+    key[i++] = (num >> 16) & 0xFF;
+    key[i++] = gen & 0xFF;
+    key[i++] = (gen >> 8) & 0xFF;
+    if (isAes) {
+      key[i++] = 0x73;
+      key[i++] = 0x41;
+      key[i++] = 0x6C;
+      key[i++] = 0x54;
+    }
+    var hash = calculateMD5(key, 0, i);
+    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+  }
+
+  function buildCipherConstructor(cf, name, num, gen, key) {
+    var cryptFilter = cf.get(name.name);
+    var cfm;
+    if (cryptFilter != null)
+      cfm = cryptFilter.get('CFM');
+    if (!cfm || cfm.name == 'None') {
+      return function cipherTransformFactoryBuildCipherConstructorNone() {
+        return new NullCipher();
+      };
+    }
+    if ('V2' == cfm.name) {
+      return function cipherTransformFactoryBuildCipherConstructorV2() {
+        return new ARCFourCipher(
+          buildObjectKey(num, gen, key, false));
+      };
+    }
+    if ('AESV2' == cfm.name) {
+      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+        return new AES128Cipher(
+          buildObjectKey(num, gen, key, true));
+      };
+    }
+    error('Unknown crypto method');
+  }
+
+  CipherTransformFactory.prototype = {
+    createCipherTransform:
+      function CipherTransformFactory_createCipherTransform(num, gen) {
+      if (this.algorithm == 4) {
+        return new CipherTransform(
+          buildCipherConstructor(this.cf, this.stmf,
+            num, gen, this.encryptionKey),
+          buildCipherConstructor(this.cf, this.strf,
+            num, gen, this.encryptionKey));
+      }
+      // algorithms 1 and 2
+      var key = buildObjectKey(num, gen, this.encryptionKey, false);
+      var cipherConstructor = function buildCipherCipherConstructor() {
+        return new ARCFourCipher(key);
+      };
+      return new CipherTransform(cipherConstructor, cipherConstructor);
+    }
+  };
+
+  return CipherTransformFactory;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PartialEvaluator = (function PartialEvaluatorClosure() {
+  function PartialEvaluator(xref, handler, uniquePrefix) {
+    this.state = new EvalState();
+    this.stateStack = [];
+
+    this.xref = xref;
+    this.handler = handler;
+    this.uniquePrefix = uniquePrefix;
+    this.objIdCounter = 0;
+  }
+
+  var OP_MAP = {
+    // Graphics state
+    w: 'setLineWidth',
+    J: 'setLineCap',
+    j: 'setLineJoin',
+    M: 'setMiterLimit',
+    d: 'setDash',
+    ri: 'setRenderingIntent',
+    i: 'setFlatness',
+    gs: 'setGState',
+    q: 'save',
+    Q: 'restore',
+    cm: 'transform',
+
+    // Path
+    m: 'moveTo',
+    l: 'lineTo',
+    c: 'curveTo',
+    v: 'curveTo2',
+    y: 'curveTo3',
+    h: 'closePath',
+    re: 'rectangle',
+    S: 'stroke',
+    s: 'closeStroke',
+    f: 'fill',
+    F: 'fill',
+    'f*': 'eoFill',
+    B: 'fillStroke',
+    'B*': 'eoFillStroke',
+    b: 'closeFillStroke',
+    'b*': 'closeEOFillStroke',
+    n: 'endPath',
+
+    // Clipping
+    W: 'clip',
+    'W*': 'eoClip',
+
+    // Text
+    BT: 'beginText',
+    ET: 'endText',
+    Tc: 'setCharSpacing',
+    Tw: 'setWordSpacing',
+    Tz: 'setHScale',
+    TL: 'setLeading',
+    Tf: 'setFont',
+    Tr: 'setTextRenderingMode',
+    Ts: 'setTextRise',
+    Td: 'moveText',
+    TD: 'setLeadingMoveText',
+    Tm: 'setTextMatrix',
+    'T*': 'nextLine',
+    Tj: 'showText',
+    TJ: 'showSpacedText',
+    "'": 'nextLineShowText',
+    '"': 'nextLineSetSpacingShowText',
+
+    // Type3 fonts
+    d0: 'setCharWidth',
+    d1: 'setCharWidthAndBounds',
+
+    // Color
+    CS: 'setStrokeColorSpace',
+    cs: 'setFillColorSpace',
+    SC: 'setStrokeColor',
+    SCN: 'setStrokeColorN',
+    sc: 'setFillColor',
+    scn: 'setFillColorN',
+    G: 'setStrokeGray',
+    g: 'setFillGray',
+    RG: 'setStrokeRGBColor',
+    rg: 'setFillRGBColor',
+    K: 'setStrokeCMYKColor',
+    k: 'setFillCMYKColor',
+
+    // Shading
+    sh: 'shadingFill',
+
+    // Images
+    BI: 'beginInlineImage',
+    ID: 'beginImageData',
+    EI: 'endInlineImage',
+
+    // XObjects
+    Do: 'paintXObject',
+
+    // Marked content
+    MP: 'markPoint',
+    DP: 'markPointProps',
+    BMC: 'beginMarkedContent',
+    BDC: 'beginMarkedContentProps',
+    EMC: 'endMarkedContent',
+
+    // Compatibility
+    BX: 'beginCompat',
+    EX: 'endCompat'
+  };
+
+  function splitCombinedOperations(operations) {
+    // Two operations can be combined together, trying to find which two
+    // operations were concatenated.
+    for (var i = operations.length - 1; i > 0; i--) {
+      var op1 = operations.substring(0, i), op2 = operations.substring(i);
+      if (op1 in OP_MAP && op2 in OP_MAP)
+        return [op1, op2]; // operations found
+    }
+    return null;
+  }
+
+  PartialEvaluator.prototype = {
+    getOperatorList: function PartialEvaluator_getOperatorList(stream,
+                                                               resources,
+                                                               dependency,
+                                                               queue) {
+
+      var self = this;
+      var xref = this.xref;
+      var handler = this.handler;
+      var uniquePrefix = this.uniquePrefix || '';
+
+      function insertDependency(depList) {
+        fnArray.push('dependency');
+        argsArray.push(depList);
+        for (var i = 0, ii = depList.length; i < ii; i++) {
+          var dep = depList[i];
+          if (dependency.indexOf(dep) == -1) {
+            dependency.push(depList[i]);
+          }
+        }
+      }
+
+      function handleSetFont(fontName, font) {
+        var loadedName = null;
+
+        var fontRes = resources.get('Font');
+
+        assert(fontRes, 'fontRes not available');
+
+        font = xref.fetchIfRef(font) || fontRes.get(fontName);
+        assertWellFormed(isDict(font));
+        ++self.objIdCounter;
+        if (!font.translated) {
+          font.translated = self.translateFont(font, xref, resources,
+                                               dependency);
+          if (font.translated) {
+            // keep track of each font we translated so the caller can
+            // load them asynchronously before calling display on a page
+            loadedName = 'font_' + uniquePrefix + self.objIdCounter;
+            font.translated.properties.loadedName = loadedName;
+            font.loadedName = loadedName;
+
+            var translated = font.translated;
+            // Convert the file to an ArrayBuffer which will be turned back into
+            // a Stream in the main thread.
+            if (translated.file)
+              translated.file = translated.file.getBytes();
+            if (translated.properties.file) {
+              translated.properties.file =
+                  translated.properties.file.getBytes();
+            }
+
+            handler.send('obj', [
+                loadedName,
+                'Font',
+                translated.name,
+                translated.file,
+                translated.properties
+            ]);
+          }
+        }
+        loadedName = loadedName || font.loadedName;
+
+        // Ensure the font is ready before the font is set
+        // and later on used for drawing.
+        // OPTIMIZE: This should get insert to the operatorList only once per
+        // page.
+        insertDependency([loadedName]);
+        return loadedName;
+      }
+
+      function buildPaintImageXObject(image, inline) {
+        var dict = image.dict;
+        var w = dict.get('Width', 'W');
+        var h = dict.get('Height', 'H');
+
+        var imageMask = dict.get('ImageMask', 'IM') || false;
+        if (imageMask) {
+          // This depends on a tmpCanvas beeing filled with the
+          // current fillStyle, such that processing the pixel
+          // data can't be done here. Instead of creating a
+          // complete PDFImage, only read the information needed
+          // for later.
+
+          var width = dict.get('Width', 'W');
+          var height = dict.get('Height', 'H');
+          var bitStrideLength = (width + 7) >> 3;
+          var imgArray = image.getBytes(bitStrideLength * height);
+          var decode = dict.get('Decode', 'D');
+          var inverseDecode = !!decode && decode[0] > 0;
+
+          fn = 'paintImageMaskXObject';
+          args = [imgArray, inverseDecode, width, height];
+          return;
+        }
+
+        // If there is no imageMask, create the PDFImage and a lot
+        // of image processing can be done here.
+        var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
+        insertDependency([objId]);
+        args = [objId, w, h];
+
+        var softMask = dict.get('SMask', 'IM') || false;
+        if (!softMask && image instanceof JpegStream &&
+            image.isNativelySupported(xref, resources)) {
+          // These JPEGs don't need any more processing so we can just send it.
+          fn = 'paintJpegXObject';
+          handler.send('obj', [objId, 'JpegStream', image.getIR()]);
+          return;
+        }
+
+        fn = 'paintImageXObject';
+
+        PDFImage.buildImage(function(imageObj) {
+            var drawWidth = imageObj.drawWidth;
+            var drawHeight = imageObj.drawHeight;
+            var imgData = {
+              width: drawWidth,
+              height: drawHeight,
+              data: new Uint8Array(drawWidth * drawHeight * 4)
+            };
+            var pixels = imgData.data;
+            imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
+            handler.send('obj', [objId, 'Image', imgData]);
+          }, handler, xref, resources, image, inline);
+      }
+
+      if (!queue)
+        queue = {};
+
+      if (!queue.argsArray) {
+        queue.argsArray = [];
+      }
+      if (!queue.fnArray) {
+        queue.fnArray = [];
+      }
+
+      var fnArray = queue.fnArray, argsArray = queue.argsArray;
+      var dependencyArray = dependency || [];
+
+      resources = resources || new Dict();
+      var xobjs = resources.get('XObject') || new Dict();
+      var patterns = resources.get('Pattern') || new Dict();
+      var parser = new Parser(new Lexer(stream), false, xref);
+      var res = resources;
+      var hasNextObj = false, nextObj;
+      var args = [], obj;
+      var TILING_PATTERN = 1, SHADING_PATTERN = 2;
+
+      while (true) {
+        if (hasNextObj) {
+          obj = nextObj;
+          hasNextObj = false;
+        } else {
+          obj = parser.getObj();
+          if (isEOF(obj))
+            break;
+        }
+
+        if (isCmd(obj)) {
+          var cmd = obj.cmd;
+          var fn = OP_MAP[cmd];
+          if (!fn) {
+            // invalid content command, trying to recover
+            var cmds = splitCombinedOperations(cmd);
+            if (cmds) {
+              cmd = cmds[0];
+              fn = OP_MAP[cmd];
+              // feeding other command on the next interation
+              hasNextObj = true;
+              nextObj = Cmd.get(cmds[1]);
+            }
+          }
+          assertWellFormed(fn, 'Unknown command "' + cmd + '"');
+          // TODO figure out how to type-check vararg functions
+
+          if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
+            // compile tiling patterns
+            var patternName = args[args.length - 1];
+            // SCN/scn applies patterns along with normal colors
+            if (isName(patternName)) {
+              var pattern = patterns.get(patternName.name);
+              if (pattern) {
+                var dict = isStream(pattern) ? pattern.dict : pattern;
+                var typeNum = dict.get('PatternType');
+
+                if (typeNum == TILING_PATTERN) {
+                  // Create an IR of the pattern code.
+                  var depIdx = dependencyArray.length;
+                  var operatorList = this.getOperatorList(pattern,
+                      dict.get('Resources') || resources, dependencyArray);
+
+                  // Add the dependencies that are required to execute the
+                  // operatorList.
+                  insertDependency(dependencyArray.slice(depIdx));
+
+                  args = TilingPattern.getIR(operatorList, dict, args);
+                }
+                else if (typeNum == SHADING_PATTERN) {
+                  var shading = dict.get('Shading');
+                  var matrix = dict.get('Matrix');
+                  var pattern = Pattern.parseShading(shading, matrix, xref,
+                                                     res);
+                  args = pattern.getIR();
+                } else {
+                  error('Unkown PatternType ' + typeNum);
+                }
+              }
+            }
+          } else if (cmd == 'Do' && !args[0].code) {
+            // eagerly compile XForm objects
+            var name = args[0].name;
+            var xobj = xobjs.get(name);
+            if (xobj) {
+              assertWellFormed(isStream(xobj), 'XObject should be a stream');
+
+              var type = xobj.dict.get('Subtype');
+              assertWellFormed(
+                isName(type),
+                'XObject should have a Name subtype'
+              );
+
+              if ('Form' == type.name) {
+                var matrix = xobj.dict.get('Matrix');
+                var bbox = xobj.dict.get('BBox');
+
+                fnArray.push('paintFormXObjectBegin');
+                argsArray.push([matrix, bbox]);
+
+                // This adds the operatorList of the xObj to the current queue.
+                var depIdx = dependencyArray.length;
+
+                // Pass in the current `queue` object. That means the `fnArray`
+                // and the `argsArray` in this scope is reused and new commands
+                // are added to them.
+                this.getOperatorList(xobj,
+                    xobj.dict.get('Resources') || resources,
+                    dependencyArray, queue);
+
+               // Add the dependencies that are required to execute the
+               // operatorList.
+               insertDependency(dependencyArray.slice(depIdx));
+
+                fn = 'paintFormXObjectEnd';
+                args = [];
+              } else if ('Image' == type.name) {
+                buildPaintImageXObject(xobj, false);
+              } else {
+                error('Unhandled XObject subtype ' + type.name);
+              }
+            }
+          } else if (cmd == 'Tf') { // eagerly collect all fonts
+            args[0] = handleSetFont(args[0].name);
+          } else if (cmd == 'EI') {
+            buildPaintImageXObject(args[0], true);
+          }
+
+          switch (fn) {
+            // Parse the ColorSpace data to a raw format.
+            case 'setFillColorSpace':
+            case 'setStrokeColorSpace':
+              args = [ColorSpace.parseToIR(args[0], xref, resources)];
+              break;
+            case 'shadingFill':
+              var shadingRes = res.get('Shading');
+              if (!shadingRes)
+                error('No shading resource found');
+
+              var shading = shadingRes.get(args[0].name);
+              if (!shading)
+                error('No shading object found');
+
+              var shadingFill = Pattern.parseShading(shading, null, xref, res);
+              var patternIR = shadingFill.getIR();
+              args = [patternIR];
+              fn = 'shadingFill';
+              break;
+            case 'setGState':
+              var dictName = args[0];
+              var extGState = resources.get('ExtGState');
+
+              if (!isDict(extGState) || !extGState.has(dictName.name))
+                break;
+
+              var gsState = extGState.get(dictName.name);
+
+              // This array holds the converted/processed state data.
+              var gsStateObj = [];
+
+              gsState.forEach(
+                function canvasGraphicsSetGStateForEach(key, value) {
+                  switch (key) {
+                    case 'Type':
+                      break;
+                    case 'LW':
+                    case 'LC':
+                    case 'LJ':
+                    case 'ML':
+                    case 'D':
+                    case 'RI':
+                    case 'FL':
+                    case 'CA':
+                    case 'ca':
+                      gsStateObj.push([key, value]);
+                      break;
+                    case 'Font':
+                      gsStateObj.push([
+                        'Font',
+                        handleSetFont(null, value[0]),
+                        value[1]
+                      ]);
+                      break;
+                    case 'OP':
+                    case 'op':
+                    case 'OPM':
+                    case 'BG':
+                    case 'BG2':
+                    case 'UCR':
+                    case 'UCR2':
+                    case 'TR':
+                    case 'TR2':
+                    case 'HT':
+                    case 'SM':
+                    case 'SA':
+                    case 'BM':
+                    case 'SMask':
+                    case 'AIS':
+                    case 'TK':
+                      TODO('graphic state operator ' + key);
+                      break;
+                    default:
+                      warn('Unknown graphic state operator ' + key);
+                      break;
+                  }
+                }
+              );
+              args = [gsStateObj];
+              break;
+          } // switch
+
+          fnArray.push(fn);
+          argsArray.push(args);
+          args = [];
+        } else if (obj != null) {
+          assertWellFormed(args.length <= 33, 'Too many arguments');
+          args.push(obj instanceof Dict ? obj.getAll() : obj);
+        }
+      }
+
+      return queue;
+    },
+
+    extractDataStructures: function
+      partialEvaluatorExtractDataStructures(dict, baseDict,
+                                            xref, properties) {
+      // 9.10.2
+      var toUnicode = dict.get('ToUnicode') ||
+        baseDict.get('ToUnicode');
+      if (toUnicode)
+        properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
+
+      if (properties.composite) {
+        // CIDSystemInfo helps to match CID to glyphs
+        var cidSystemInfo = dict.get('CIDSystemInfo');
+        if (isDict(cidSystemInfo)) {
+          properties.cidSystemInfo = {
+            registry: cidSystemInfo.get('Registry'),
+            ordering: cidSystemInfo.get('Ordering'),
+            supplement: cidSystemInfo.get('Supplement')
+          };
+        }
+
+        var cidToGidMap = dict.get('CIDToGIDMap');
+        if (isStream(cidToGidMap))
+          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+      }
+
+      var flags = properties.flags;
+      var differences = [];
+      var baseEncoding = !!(flags & FontFlags.Symbolic) ?
+                         Encodings.symbolsEncoding : Encodings.StandardEncoding;
+      var hasEncoding = dict.has('Encoding');
+      if (hasEncoding) {
+        var encoding = dict.get('Encoding');
+        if (isDict(encoding)) {
+          var baseName = encoding.get('BaseEncoding');
+          if (baseName)
+            baseEncoding = Encodings[baseName.name];
+          else
+            hasEncoding = false; // base encoding was not provided
+
+          // Load the differences between the base and original
+          if (encoding.has('Differences')) {
+            var diffEncoding = encoding.get('Differences');
+            var index = 0;
+            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+              var data = diffEncoding[j];
+              if (isNum(data))
+                index = data;
+              else
+                differences[index++] = data.name;
+            }
+          }
+        } else if (isName(encoding)) {
+          baseEncoding = Encodings[encoding.name];
+        } else {
+          error('Encoding is not a Name nor a Dict');
+        }
+      }
+
+      properties.differences = differences;
+      properties.baseEncoding = baseEncoding;
+      properties.hasEncoding = hasEncoding;
+    },
+
+    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
+                                                           properties) {
+      var cmapObj = toUnicode;
+      var charToUnicode = [];
+      if (isName(cmapObj)) {
+        var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
+        if (!isIdentityMap)
+          error('ToUnicode file cmap translation not implemented');
+      } else if (isStream(cmapObj)) {
+        var tokens = [];
+        var token = '';
+        var beginArrayToken = {};
+
+        var cmap = cmapObj.getBytes(cmapObj.length);
+        for (var i = 0, ii = cmap.length; i < ii; i++) {
+          var octet = cmap[i];
+          if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
+              octet == 0x3C || octet == 0x5B || octet == 0x5D) {
+            switch (token) {
+              case 'usecmap':
+                error('usecmap is not implemented');
+                break;
+
+              case 'beginbfchar':
+              case 'beginbfrange':
+              case 'begincidchar':
+              case 'begincidrange':
+                token = '';
+                tokens = [];
+                break;
+
+              case 'endcidrange':
+              case 'endbfrange':
+                for (var j = 0, jj = tokens.length; j < jj; j += 3) {
+                  var startRange = tokens[j];
+                  var endRange = tokens[j + 1];
+                  var code = tokens[j + 2];
+                  if (code == 0xFFFF) {
+                    // CMap is broken, assuming code == startRange
+                    code = startRange;
+                  }
+                  if (isArray(code)) {
+                    var codeindex = 0;
+                    while (startRange <= endRange) {
+                      charToUnicode[startRange] = code[codeindex++];
+                      ++startRange;
+                    }
+                  } else {
+                    while (startRange <= endRange) {
+                      charToUnicode[startRange] = code++;
+                      ++startRange;
+                    }
+                  }
+                }
+                break;
+
+              case 'endcidchar':
+              case 'endbfchar':
+                for (var j = 0, jj = tokens.length; j < jj; j += 2) {
+                  var index = tokens[j];
+                  var code = tokens[j + 1];
+                  charToUnicode[index] = code;
+                }
+                break;
+
+              case '':
+                break;
+
+              default:
+                if (token[0] >= '0' && token[0] <= '9')
+                  token = parseInt(token, 10); // a number
+                tokens.push(token);
+                token = '';
+            }
+            switch (octet) {
+              case 0x5B:
+                // begin list parsing
+                tokens.push(beginArrayToken);
+                break;
+              case 0x5D:
+                // collect array items
+                var items = [], item;
+                while (tokens.length &&
+                       (item = tokens.pop()) != beginArrayToken)
+                  items.unshift(item);
+                tokens.push(items);
+                break;
+            }
+          } else if (octet == 0x3E) {
+            if (token.length) {
+              // XXX guessing chars size by checking number size in the CMap
+              if (token.length <= 2 && properties.composite)
+                properties.wideChars = false;
+
+              if (token.length <= 4) {
+                // parsing hex number
+                tokens.push(parseInt(token, 16));
+                token = '';
+              } else {
+                // parsing hex UTF-16BE numbers
+                var str = [];
+                for (var k = 0, kk = token.length; k < kk; k += 4) {
+                  var b = parseInt(token.substr(k, 4), 16);
+                  if (b <= 0x10) {
+                    k += 4;
+                    b = (b << 16) | parseInt(token.substr(k, 4), 16);
+                    b -= 0x10000;
+                    str.push(0xD800 | (b >> 10));
+                    str.push(0xDC00 | (b & 0x3FF));
+                    break;
+                  }
+                  str.push(b);
+                }
+                tokens.push(String.fromCharCode.apply(String, str));
+                token = '';
+              }
+            }
+          } else {
+            token += String.fromCharCode(octet);
+          }
+        }
+      }
+      return charToUnicode;
+    },
+    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
+      // Extract the encoding from the CIDToGIDMap
+      var glyphsData = cidToGidStream.getBytes();
+
+      // Set encoding 0 to later verify the font has an encoding
+      var result = [];
+      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
+        if (glyphID == 0)
+          continue;
+
+        var code = j >> 1;
+        result[code] = glyphID;
+      }
+      return result;
+    },
+
+    extractWidths: function PartialEvaluator_extractWidths(dict,
+                                                   xref,
+                                                   descriptor,
+                                                   properties) {
+      var glyphsWidths = [];
+      var defaultWidth = 0;
+      if (properties.composite) {
+        defaultWidth = dict.get('DW') || 1000;
+
+        var widths = dict.get('W');
+        if (widths) {
+          var start = 0, end = 0;
+          for (var i = 0, ii = widths.length; i < ii; i++) {
+            var code = widths[i];
+            if (isArray(code)) {
+              for (var j = 0, jj = code.length; j < jj; j++)
+                glyphsWidths[start++] = code[j];
+              start = 0;
+            } else if (start) {
+              var width = widths[++i];
+              for (var j = start; j <= code; j++)
+                glyphsWidths[j] = width;
+              start = 0;
+            } else {
+              start = code;
+            }
+          }
+        }
+      } else {
+        var firstChar = properties.firstChar;
+        var widths = dict.get('Widths');
+        if (widths) {
+          var j = firstChar;
+          for (var i = 0, ii = widths.length; i < ii; i++)
+            glyphsWidths[j++] = widths[i];
+          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
+        } else {
+          // Trying get the BaseFont metrics (see comment above).
+          var baseFontName = dict.get('BaseFont');
+          if (isName(baseFontName)) {
+            var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+            glyphsWidths = metrics.widths;
+            defaultWidth = metrics.defaultWidth;
+          }
+        }
+      }
+
+      properties.defaultWidth = defaultWidth;
+      properties.widths = glyphsWidths;
+    },
+
+    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
+      var defaultWidth = 0, widths = [];
+      var glyphWidths = Metrics[stdFontMap[name] || name];
+      if (isNum(glyphWidths)) {
+        defaultWidth = glyphWidths;
+      } else {
+        widths = glyphWidths;
+      }
+
+      return {
+        defaultWidth: defaultWidth,
+        widths: widths
+      };
+    },
+
+    translateFont: function PartialEvaluator_translateFont(dict,
+                                                           xref,
+                                                           resources,
+                                                           dependency) {
+      var baseDict = dict;
+      var type = dict.get('Subtype');
+      assertWellFormed(isName(type), 'invalid font Subtype');
+
+      var composite = false;
+      if (type.name == 'Type0') {
+        // If font is a composite
+        //  - get the descendant font
+        //  - set the type according to the descendant font
+        //  - get the FontDescriptor from the descendant font
+        var df = dict.get('DescendantFonts');
+        if (!df)
+          return null;
+
+        dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
+
+        type = dict.get('Subtype');
+        assertWellFormed(isName(type), 'invalid font Subtype');
+        composite = true;
+      }
+      var maxCharIndex = composite ? 0xFFFF : 0xFF;
+
+      var descriptor = dict.get('FontDescriptor');
+      if (!descriptor) {
+        if (type.name == 'Type3') {
+          // FontDescriptor is only required for Type3 fonts when the document
+          // is a tagged pdf. Create a barbebones one to get by.
+          descriptor = new Dict();
+          descriptor.set('FontName', new Name(type.name));
+        } else {
+          // Before PDF 1.5 if the font was one of the base 14 fonts, having a
+          // FontDescriptor was not required.
+          // This case is here for compatibility.
+          var baseFontName = dict.get('BaseFont');
+          if (!isName(baseFontName))
+            return null;
+
+          // Using base font name as a font name.
+          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+          var metrics = this.getBaseFontMetrics(baseFontName);
+
+          // Simulating descriptor flags attribute
+          var fontNameWoStyle = baseFontName.split('-')[0];
+          var flags = (serifFonts[fontNameWoStyle] ||
+            (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
+            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
+            FontFlags.Nonsymbolic);
+
+          var properties = {
+            type: type.name,
+            widths: metrics.widths,
+            defaultWidth: metrics.defaultWidth,
+            flags: flags,
+            firstChar: 0,
+            lastChar: maxCharIndex
+          };
+          this.extractDataStructures(dict, dict, xref, properties);
+
+          return {
+            name: baseFontName,
+            dict: baseDict,
+            properties: properties
+          };
+        }
+      }
+
+      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
+      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
+      // to ignore this rule when a variant of a standart font is used.
+      // TODO Fill the width array depending on which of the base font this is
+      // a variant.
+      var firstChar = dict.get('FirstChar') || 0;
+      var lastChar = dict.get('LastChar') || maxCharIndex;
+      var fontName = descriptor.get('FontName');
+      // Some bad pdf's have a string as the font name.
+      if (isString(fontName))
+        fontName = new Name(fontName);
+      assertWellFormed(isName(fontName), 'invalid font name');
+
+      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+      if (fontFile) {
+        if (fontFile.dict) {
+          var subtype = fontFile.dict.get('Subtype');
+          if (subtype)
+            subtype = subtype.name;
+
+          var length1 = fontFile.dict.get('Length1');
+
+          var length2 = fontFile.dict.get('Length2');
+        }
+      }
+
+      var properties = {
+        type: type.name,
+        subtype: subtype,
+        file: fontFile,
+        length1: length1,
+        length2: length2,
+        composite: composite,
+        wideChars: composite,
+        fixedPitch: false,
+        fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
+        firstChar: firstChar || 0,
+        lastChar: lastChar || maxCharIndex,
+        bbox: descriptor.get('FontBBox'),
+        ascent: descriptor.get('Ascent'),
+        descent: descriptor.get('Descent'),
+        xHeight: descriptor.get('XHeight'),
+        capHeight: descriptor.get('CapHeight'),
+        flags: descriptor.get('Flags'),
+        italicAngle: descriptor.get('ItalicAngle'),
+        coded: false
+      };
+      this.extractWidths(dict, xref, descriptor, properties);
+      this.extractDataStructures(dict, baseDict, xref, properties);
+
+      if (type.name === 'Type3') {
+        properties.coded = true;
+        var charProcs = dict.get('CharProcs').getAll();
+        var fontResources = dict.get('Resources') || resources;
+        properties.charProcOperatorList = {};
+        for (var key in charProcs) {
+          var glyphStream = charProcs[key];
+          properties.charProcOperatorList[key] =
+            this.getOperatorList(glyphStream, fontResources, dependency);
+        }
+      }
+
+      return {
+        name: fontName.name,
+        dict: baseDict,
+        file: fontFile,
+        properties: properties
+      };
+    }
+  };
+
+  return PartialEvaluator;
+})();
+
+var EvalState = (function EvalStateClosure() {
+  function EvalState() {
+    // Are soft masks and alpha values shapes or opacities?
+    this.alphaIsShape = false;
+    this.fontSize = 0;
+    this.textMatrix = IDENTITY_MATRIX;
+    this.leading = 0;
+    // Start of text line (in text coordinates)
+    this.lineX = 0;
+    this.lineY = 0;
+    // Character and word spacing
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.textHScale = 1;
+    // Color spaces
+    this.fillColorSpace = null;
+    this.strokeColorSpace = null;
+  }
+  EvalState.prototype = {
+  };
+  return EvalState;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+/**
+ * Maximum time to wait for a font to be loaded by font-face rules.
+ */
+var kMaxWaitForFontFace = 1000;
+
+// Unicode Private Use Area
+var kCmapGlyphOffset = 0xE000;
+var kSizeOfGlyphArea = 0x1900;
+var kSymbolicFontGlyphOffset = 0xF000;
+
+// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
+// except for Type 3 fonts
+var kPDFGlyphSpaceUnits = 1000;
+
+// Until hinting is fully supported this constant can be used
+var kHintingEnabled = false;
+
+var FontFlags = {
+  FixedPitch: 1,
+  Serif: 2,
+  Symbolic: 4,
+  Script: 8,
+  Nonsymbolic: 32,
+  Italic: 64,
+  AllCap: 65536,
+  SmallCap: 131072,
+  ForceBold: 262144
+};
+
+var Encodings = {
+  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
+    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
+    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
+    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
+    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
+    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
+    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
+    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
+    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
+    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
+    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
+    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
+    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
+    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
+    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
+    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
+    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
+    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
+    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
+    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+    'Ydieresissmall'],
+  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
+    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
+    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
+    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
+    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
+    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
+    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
+    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
+    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
+    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
+    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
+    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
+    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
+    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
+    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
+    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
+    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
+    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
+    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
+    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
+    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
+    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
+    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
+    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
+    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
+    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
+    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
+    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
+    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
+    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
+    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
+  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
+    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
+    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
+    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
+    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
+    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
+    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
+    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
+    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
+    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
+    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
+    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
+    'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
+    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
+    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
+    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
+    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
+    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
+    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
+    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
+    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
+    'ogonek', 'caron'],
+  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
+    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
+    'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
+    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
+    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
+    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
+    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
+    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
+    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
+    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
+  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
+    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
+    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
+    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
+    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
+    'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
+    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
+    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
+    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
+    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
+    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
+    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
+    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
+    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
+    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
+    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
+    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
+    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
+    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
+    'ydieresis'],
+  symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
+    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
+    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
+    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
+    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
+    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
+    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
+    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
+    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
+    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
+    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
+    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
+    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
+    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
+    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
+    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
+    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
+    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
+    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
+    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
+    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
+    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
+    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
+    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
+    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
+    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
+    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
+    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
+    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
+    'bracerightbt'],
+  zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
+    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
+    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
+    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
+    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
+    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
+    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
+    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
+    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
+    'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+    '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
+    'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
+    'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
+    'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
+    'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
+    'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
+    'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
+    'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
+    'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
+    'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
+    'a188', 'a189', 'a190', 'a191']
+};
+
+/**
+ * Hold a map of decoded fonts and of the standard fourteen Type1
+ * fonts and their acronyms.
+ */
+var stdFontMap = {
+  'ArialNarrow': 'Helvetica',
+  'ArialNarrow-Bold': 'Helvetica-Bold',
+  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
+  'ArialNarrow-Italic': 'Helvetica-Oblique',
+  'ArialBlack': 'Helvetica',
+  'ArialBlack-Bold': 'Helvetica-Bold',
+  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
+  'ArialBlack-Italic': 'Helvetica-Oblique',
+  'Arial': 'Helvetica',
+  'Arial-Bold': 'Helvetica-Bold',
+  'Arial-BoldItalic': 'Helvetica-BoldOblique',
+  'Arial-Italic': 'Helvetica-Oblique',
+  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
+  'Arial-BoldMT': 'Helvetica-Bold',
+  'Arial-ItalicMT': 'Helvetica-Oblique',
+  'ArialMT': 'Helvetica',
+  'Courier-Bold': 'Courier-Bold',
+  'Courier-BoldItalic': 'Courier-BoldOblique',
+  'Courier-Italic': 'Courier-Oblique',
+  'CourierNew': 'Courier',
+  'CourierNew-Bold': 'Courier-Bold',
+  'CourierNew-BoldItalic': 'Courier-BoldOblique',
+  'CourierNew-Italic': 'Courier-Oblique',
+  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
+  'CourierNewPS-BoldMT': 'Courier-Bold',
+  'CourierNewPS-ItalicMT': 'Courier-Oblique',
+  'CourierNewPSMT': 'Courier',
+  'Helvetica-Bold': 'Helvetica-Bold',
+  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
+  'Helvetica-Italic': 'Helvetica-Oblique',
+  'Symbol-Bold': 'Symbol',
+  'Symbol-BoldItalic': 'Symbol',
+  'Symbol-Italic': 'Symbol',
+  'TimesNewRoman': 'Times-Roman',
+  'TimesNewRoman-Bold': 'Times-Bold',
+  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRoman-Italic': 'Times-Italic',
+  'TimesNewRomanPS': 'Times-Roman',
+  'TimesNewRomanPS-Bold': 'Times-Bold',
+  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
+  'TimesNewRomanPS-BoldMT': 'Times-Bold',
+  'TimesNewRomanPS-Italic': 'Times-Italic',
+  'TimesNewRomanPS-ItalicMT': 'Times-Italic',
+  'TimesNewRomanPSMT': 'Times-Roman',
+  'TimesNewRomanPSMT-Bold': 'Times-Bold',
+  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
+  'TimesNewRomanPSMT-Italic': 'Times-Italic'
+};
+
+/**
+ * Holds the map of the non-standard fonts that might be included as a standard
+ * fonts without glyph data.
+ */
+var nonStdFontMap = {
+  'ComicSansMS': 'Comic Sans MS',
+  'ComicSansMS-Bold': 'Comic Sans MS-Bold',
+  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
+  'ComicSansMS-Italic': 'Comic Sans MS-Italic',
+  'LucidaConsole': 'Courier',
+  'LucidaConsole-Bold': 'Courier-Bold',
+  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
+  'LucidaConsole-Italic': 'Courier-Oblique'
+};
+
+var serifFonts = {
+  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
+  'Aldus': true, 'Alexandria': true, 'Algerian': true,
+  'American Typewriter': true, 'Antiqua': true, 'Apex': true,
+  'Arno': true, 'Aster': true, 'Aurora': true,
+  'Baskerville': true, 'Bell': true, 'Bembo': true,
+  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
+  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
+  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
+  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
+  'Calvert': true, 'Capitals': true, 'Cambria': true,
+  'Cartier': true, 'Caslon': true, 'Catull': true,
+  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
+  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
+  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
+  'Cochin': true, 'Colonna': true, 'Computer Modern': true,
+  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
+  'Corona': true, 'Ecotype': true, 'Egyptienne': true,
+  'Elephant': true, 'Excelsior': true, 'Fairfield': true,
+  'FF Scala': true, 'Folkard': true, 'Footlight': true,
+  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
+  'Gentium': true, 'Georgia': true, 'Gloucester': true,
+  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
+  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
+  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
+  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
+  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
+  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
+  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
+  'Lucida Bright': true, 'Melior': true, 'Memphis': true,
+  'Miller': true, 'Minion': true, 'Modern': true,
+  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
+  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
+  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
+  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
+  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
+  'Requiem': true, 'Rockwell': true, 'Roman': true,
+  'Rotis Serif': true, 'Sabon': true, 'Scala': true,
+  'Seagull': true, 'Sistina': true, 'Souvenir': true,
+  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
+  'Sylfaen': true, 'Times': true, 'Trajan': true,
+  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
+  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
+  'Versailles': true, 'Wanted': true, 'Weiss': true,
+  'Wide Latin': true, 'Windsor': true, 'XITS': true
+};
+
+var symbolsFonts = {
+  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
+};
+
+// Some characters, e.g. copyrightserif, mapped to the private use area and
+// might not be displayed using standard fonts. Mapping/hacking well-known chars
+// to the similar equivalents in the normal characters range.
+function mapPrivateUseChars(code) {
+  switch (code) {
+    case 0xF8E9: // copyrightsans
+    case 0xF6D9: // copyrightserif
+      return 0x00A9; // copyright
+    default:
+      return code;
+  }
+}
+
+var FontLoader = {
+  listeningForFontLoad: false,
+
+  bind: function fontLoaderBind(fonts, callback) {
+    function checkFontsLoaded() {
+      for (var i = 0, ii = fonts.length; i < ii; i++) {
+        var fontObj = fonts[i];
+        if (fontObj.loading) {
+          return false;
+        }
+      }
+
+      PdfJS_window.document.documentElement.removeEventListener(
+        'pdfjsFontLoad', checkFontsLoaded, false);
+
+      callback();
+      return true;
+    }
+
+    var rules = [], names = [], fontsToLoad = [];
+    var fontCreateTimer = 0;
+
+    for (var i = 0, ii = fonts.length; i < ii; i++) {
+      var font = fonts[i];
+
+      // Add the font to the DOM only once or skip if the font
+      // is already loaded.
+      if (font.attached || font.loading == false) {
+        continue;
+      }
+      font.attached = true;
+
+      fontsToLoad.push(font);
+
+      var str = '';
+      var data = font.data;
+      if (data) {
+        var length = data.length;
+        for (var j = 0; j < length; j++)
+          str += String.fromCharCode(data[j]);
+
+        var rule = font.bindDOM(str);
+        if (rule) {
+          rules.push(rule);
+          names.push(font.loadedName);
+        }
+      }
+    }
+
+    this.listeningForFontLoad = false;
+    if (!isWorker && rules.length) {
+      FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
+    }
+
+    if (!checkFontsLoaded()) {
+      PdfJS_window.document.documentElement.addEventListener(
+        'pdfjsFontLoad', checkFontsLoaded, false);
+    }
+  },
+  // Set things up so that at least one pdfjsFontLoad event is
+  // dispatched when all the @font-face |rules| for |names| have been
+  // loaded in a subdocument.  It's expected that the load of |rules|
+  // has already started in this (outer) document, so that they should
+  // be ordered before the load in the subdocument.
+  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
+                                                                fonts) {
+      /** Hack begin */
+      // There's no event when a font has finished downloading so the
+      // following code is a dirty hack to 'guess' when a font is
+      // ready.  This code will be obsoleted by Mozilla bug 471915.
+      //
+      // The only reliable way to know if a font is loaded in Gecko
+      // (at the moment) is document.onload in a document with
+      // a @font-face rule defined in a "static" stylesheet.  We use a
+      // subdocument in an <iframe>, set up properly, to know when
+      // our @font-face rule was loaded.  However, the subdocument and
+      // outer document can't share CSS rules, so the inner document
+      // is only part of the puzzle.  The second piece is an invisible
+      // div created in order to force loading of the @font-face in
+      // the *outer* document.  (The font still needs to be loaded for
+      // its metrics, for reflow).  We create the div first for the
+      // outer document, then create the iframe.  Unless something
+      // goes really wonkily, we expect the @font-face for the outer
+      // document to be processed before the inner.  That's still
+      // fragile, but seems to work in practice.
+      //
+      // The postMessage() hackery was added to work around chrome bug
+      // 82402.
+
+      // Validate the names parameter -- the values can used to construct HTML.
+      if (!/^\w+$/.test(names.join(''))) {
+        error('Invalid font name(s): ' + names.join());
+
+        // Normally the error-function throws. But if a malicious code
+        // intercepts the function call then the return is needed.
+        return;
+      }
+
+      var div = PdfJS_window.document.createElement('div');
+      div.setAttribute('style',
+                       'visibility: hidden;' +
+                       'width: 10px; height: 10px;' +
+                       'position: absolute; top: 0px; left: 0px;');
+      var html = '';
+      for (var i = 0, ii = names.length; i < ii; ++i) {
+        html += '<span style="font-family:' + names[i] + '">Hi</span>';
+      }
+      div.innerHTML = html;
+      PdfJS_window.document.body.appendChild(div);
+
+      if (!this.listeningForFontLoad) {
+        PdfJS_window.window.addEventListener(
+          'message',
+          function fontLoaderMessage(e) {
+            var fontNames = JSON.parse(e.data);
+            for (var i = 0, ii = fonts.length; i < ii; ++i) {
+              var font = fonts[i];
+              font.loading = false;
+            }
+            var evt = PdfJS_window.document.createEvent('Events');
+            evt.initEvent('pdfjsFontLoad', true, false);
+            PdfJS_window.document.documentElement.dispatchEvent(evt);
+          },
+          false);
+        this.listeningForFontLoad = true;
+      }
+
+      // XXX we should have a time-out here too, and maybe fire
+      // pdfjsFontLoadFailed?
+      var src = '<!DOCTYPE HTML><html><head>';
+      src += '<style type="text/css">';
+      for (var i = 0, ii = rules.length; i < ii; ++i) {
+        src += rules[i];
+      }
+      src += '</style>';
+      src += '<script type="application/javascript">';
+      var fontNamesArray = '';
+      for (var i = 0, ii = names.length; i < ii; ++i) {
+        fontNamesArray += '"' + names[i] + '", ';
+      }
+      src += '  var fontNames=[' + fontNamesArray + '];\n';
+      src += '  PdfJS_window.window.onload = function fontLoaderOnload() {\n';
+      src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
+      src += '  }';
+      // Hack so the end script tag isn't counted if this is inline JS.
+      src += '</scr' + 'ipt></head><body>';
+      for (var i = 0, ii = names.length; i < ii; ++i) {
+        src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
+      }
+      src += '</body></html>';
+      var frame = PdfJS_window.document.createElement('iframe');
+      frame.src = 'data:text/html,' + src;
+      frame.setAttribute('style',
+                         'visibility: hidden;' +
+                         'width: 10px; height: 10px;' +
+                         'position: absolute; top: 0px; left: 0px;');
+      PdfJS_window.document.body.appendChild(frame);
+      /** Hack end */
+  }
+};
+
+var UnicodeRanges = [
+  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
+  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
+  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
+  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
+  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
+  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
+  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
+  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
+  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
+  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
+  { 'begin': 0x0530, 'end': 0x058F }, // Armenian
+  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
+  { 'begin': 0xA500, 'end': 0xA63F }, // Vai
+  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
+  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
+  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
+  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
+  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
+  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
+  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
+  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
+  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
+  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
+  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
+  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
+  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
+  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
+  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
+  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
+  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
+  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
+  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
+  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
+  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
+  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
+  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
+  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
+  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
+  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
+  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
+  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
+  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
+  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
+  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
+  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
+  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
+  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
+  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
+  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
+  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
+  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
+  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
+  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
+  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
+  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
+  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
+  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
+  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
+  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
+  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
+  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
+  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
+  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
+  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
+  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
+  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
+  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
+  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
+  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
+  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
+  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
+  { 'begin': 0x0700, 'end': 0x074F }, // Syriac
+  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
+  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
+  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
+  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
+  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
+  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
+  { 'begin': 0x1680, 'end': 0x169F }, // Ogham
+  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
+  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
+  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
+  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
+  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
+  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
+  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
+  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
+  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
+  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
+  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
+  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
+  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
+  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
+  { 'begin': 0x1900, 'end': 0x194F }, // Limbu
+  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
+  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
+  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
+  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
+  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
+  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
+  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
+  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
+  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
+  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
+  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
+  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
+  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
+  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
+  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
+  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
+  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
+  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
+  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
+  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
+  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
+  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
+  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
+  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
+  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
+  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
+  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
+  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
+  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
+];
+
+var MacStandardGlyphOrdering = [
+  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
+  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
+  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
+  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
+  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
+  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
+  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
+  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
+  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
+  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
+  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
+  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
+  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
+  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
+  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
+  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
+  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
+  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
+  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
+  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
+  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
+  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
+  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
+  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
+  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+
+function getUnicodeRangeFor(value) {
+  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+    var range = UnicodeRanges[i];
+    if (value >= range.begin && value < range.end)
+      return i;
+  }
+  return -1;
+}
+
+function isRTLRangeFor(value) {
+  var range = UnicodeRanges[13];
+  if (value >= range.begin && value < range.end)
+    return true;
+  range = UnicodeRanges[11];
+  if (value >= range.begin && value < range.end)
+    return true;
+  return false;
+}
+
+function isSpecialUnicode(unicode) {
+  return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
+    (unicode >= kCmapGlyphOffset &&
+    unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
+}
+
+/**
+ * 'Font' is the class the outside world should use, it encapsulate all the font
+ * decoding logics whatever type it is (assuming the font type is supported).
+ *
+ * For example to read a Type1 font and to attach it to the document:
+ *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
+ *   type1Font.bind();
+ */
+var Font = (function FontClosure() {
+  function Font(name, file, properties) {
+    this.name = name;
+    this.coded = properties.coded;
+    this.charProcOperatorList = properties.charProcOperatorList;
+    this.sizes = [];
+
+    var names = name.split('+');
+    names = names.length > 1 ? names[1] : names[0];
+    names = names.split(/[-,_]/g)[0];
+    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
+    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+
+    var type = properties.type;
+    this.type = type;
+
+    // If the font is to be ignored, register it like an already loaded font
+    // to avoid the cost of waiting for it be be loaded by the platform.
+    if (properties.ignore) {
+      this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif';
+      this.loading = false;
+      return;
+    }
+
+    this.differences = properties.differences;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.composite = properties.composite;
+    this.wideChars = properties.wideChars;
+    this.hasEncoding = properties.hasEncoding;
+
+    this.fontMatrix = properties.fontMatrix;
+    this.widthMultiplier = 1.0;
+    if (properties.type == 'Type3') {
+      this.encoding = properties.baseEncoding;
+      return;
+    }
+
+    // Trying to fix encoding using glyph CIDSystemInfo.
+    this.loadCidToUnicode(properties);
+
+    if (properties.toUnicode)
+      this.toUnicode = properties.toUnicode;
+    else
+      this.rebuildToUnicode(properties);
+
+    this.toFontChar = this.buildToFontChar(this.toUnicode);
+
+    if (!file) {
+      // The file data is not specified. Trying to fix the font name
+      // to be used with the canvas.font.
+      var fontName = name.replace(/[,_]/g, '-');
+      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+
+      this.bold = (fontName.search(/bold/gi) != -1);
+      this.italic = (fontName.search(/oblique/gi) != -1) ||
+                    (fontName.search(/italic/gi) != -1);
+
+      // Use 'name' instead of 'fontName' here because the original
+      // name ArialBlack for example will be replaced by Helvetica.
+      this.black = (name.search(/Black/g) != -1);
+
+      this.encoding = properties.baseEncoding;
+      this.noUnicodeAdaptation = true;
+      this.loadedName = fontName.split('-')[0];
+      this.loading = false;
+      return;
+    }
+
+    var data;
+    switch (type) {
+      case 'Type1':
+      case 'CIDFontType0':
+        this.mimetype = 'font/opentype';
+
+        var subtype = properties.subtype;
+        var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
+          new CFFFont(file, properties) : new Type1Font(name, file, properties);
+
+        // Wrap the CFF data inside an OTF font file
+        data = this.convert(name, cff, properties);
+        break;
+
+      case 'TrueType':
+      case 'CIDFontType2':
+        this.mimetype = 'font/opentype';
+
+        // Repair the TrueType file. It is can be damaged in the point of
+        // view of the sanitizer
+        data = this.checkAndRepair(name, file, properties);
+        break;
+
+      default:
+        warn('Font ' + properties.type + ' is not supported');
+        break;
+    }
+
+    this.data = data;
+    this.fontMatrix = properties.fontMatrix;
+    this.widthMultiplier = !properties.fontMatrix ? 1.0 :
+      1.0 / properties.fontMatrix[0];
+    this.encoding = properties.baseEncoding;
+    this.loadedName = properties.loadedName;
+    this.loading = true;
+  };
+
+  var numFonts = 0;
+  function getUniqueName() {
+    return 'pdfFont' + numFonts++;
+  }
+
+  function stringToArray(str) {
+    var array = [];
+    for (var i = 0, ii = str.length; i < ii; ++i)
+      array[i] = str.charCodeAt(i);
+
+    return array;
+  };
+
+  function arrayToString(arr) {
+    var str = '';
+    for (var i = 0, ii = arr.length; i < ii; ++i)
+      str += String.fromCharCode(arr[i]);
+
+    return str;
+  };
+
+  function int16(bytes) {
+    return (bytes[0] << 8) + (bytes[1] & 0xff);
+  };
+
+  function int32(bytes) {
+    return (bytes[0] << 24) + (bytes[1] << 16) +
+           (bytes[2] << 8) + (bytes[3] & 0xff);
+  };
+
+  function getMaxPower2(number) {
+    var maxPower = 0;
+    var value = number;
+    while (value >= 2) {
+      value /= 2;
+      maxPower++;
+    }
+
+    value = 2;
+    for (var i = 1; i < maxPower; i++)
+      value *= 2;
+    return value;
+  };
+
+  function string16(value) {
+    return String.fromCharCode((value >> 8) & 0xff) +
+           String.fromCharCode(value & 0xff);
+  };
+
+  function safeString16(value) {
+    // clamp value to the 16-bit int range
+    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
+    return String.fromCharCode((value >> 8) & 0xff) +
+           String.fromCharCode(value & 0xff);
+  };
+
+  function string32(value) {
+    return String.fromCharCode((value >> 24) & 0xff) +
+           String.fromCharCode((value >> 16) & 0xff) +
+           String.fromCharCode((value >> 8) & 0xff) +
+           String.fromCharCode(value & 0xff);
+  };
+
+  function createOpenTypeHeader(sfnt, file, numTables) {
+    // Windows hates the Mac TrueType sfnt version number
+    if (sfnt == 'true')
+      sfnt = string32(0x00010000);
+
+    // sfnt version (4 bytes)
+    var header = sfnt;
+
+    // numTables (2 bytes)
+    header += string16(numTables);
+
+    // searchRange (2 bytes)
+    var tablesMaxPower2 = getMaxPower2(numTables);
+    var searchRange = tablesMaxPower2 * 16;
+    header += string16(searchRange);
+
+    // entrySelector (2 bytes)
+    header += string16(Math.log(tablesMaxPower2) / Math.log(2));
+
+    // rangeShift (2 bytes)
+    header += string16(numTables * 16 - searchRange);
+
+    file.file += header;
+    file.virtualOffset += header.length;
+  };
+
+  function createTableEntry(file, tag, data) {
+    // offset
+    var offset = file.virtualOffset;
+
+    // length
+    var length = data.length;
+
+    // Per spec tables must be 4-bytes align so add padding as needed
+    while (data.length & 3)
+      data.push(0x00);
+
+    while (file.virtualOffset & 3)
+      file.virtualOffset++;
+
+    // checksum
+    var checksum = 0, n = data.length;
+    for (var i = 0; i < n; i += 4)
+      checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
+                                    data[i + 3]])) | 0;
+
+    var tableEntry = (tag + string32(checksum) +
+                      string32(offset) + string32(length));
+    file.file += tableEntry;
+    file.virtualOffset += data.length;
+  };
+
+  function getRanges(glyphs) {
+    // Array.sort() sorts by characters, not numerically, so convert to an
+    // array of characters.
+    var codes = [];
+    var length = glyphs.length;
+    for (var n = 0; n < length; ++n)
+      codes.push({ unicode: glyphs[n].unicode, code: n });
+    codes.sort(function fontGetRangesSort(a, b) {
+      return a.unicode - b.unicode;
+    });
+
+    // Split the sorted codes into ranges.
+    var ranges = [];
+    for (var n = 0; n < length; ) {
+      var start = codes[n].unicode;
+      var codeIndices = [codes[n].code];
+      ++n;
+      var end = start;
+      while (n < length && end + 1 == codes[n].unicode) {
+        codeIndices.push(codes[n].code);
+        ++end;
+        ++n;
+      }
+      ranges.push([start, end, codeIndices]);
+    }
+
+    return ranges;
+  };
+
+  function createCMapTable(glyphs, deltas) {
+    var ranges = getRanges(glyphs);
+
+    var numTables = 1;
+    var cmap = '\x00\x00' + // version
+               string16(numTables) +  // numTables
+               '\x00\x03' + // platformID
+               '\x00\x01' + // encodingID
+               string32(4 + numTables * 8); // start of the table record
+
+    var segCount = ranges.length + 1;
+    var segCount2 = segCount * 2;
+    var searchRange = getMaxPower2(segCount) * 2;
+    var searchEntry = Math.log(segCount) / Math.log(2);
+    var rangeShift = 2 * segCount - searchRange;
+
+    // Fill up the 4 parallel arrays describing the segments.
+    var startCount = '';
+    var endCount = '';
+    var idDeltas = '';
+    var idRangeOffsets = '';
+    var glyphsIds = '';
+    var bias = 0;
+
+    if (deltas) {
+      for (var i = 0; i < segCount - 1; i++) {
+        var range = ranges[i];
+        var start = range[0];
+        var end = range[1];
+        var offset = (segCount - i) * 2 + bias * 2;
+        bias += (end - start + 1);
+
+        startCount += string16(start);
+        endCount += string16(end);
+        idDeltas += string16(0);
+        idRangeOffsets += string16(offset);
+
+        var codes = range[2];
+        for (var j = 0, jj = codes.length; j < jj; ++j)
+          glyphsIds += string16(deltas[codes[j]]);
+      }
+    } else {
+      for (var i = 0; i < segCount - 1; i++) {
+        var range = ranges[i];
+        var start = range[0];
+        var end = range[1];
+        var startCode = range[2][0];
+
+        startCount += string16(start);
+        endCount += string16(end);
+        idDeltas += string16((startCode - start + 1) & 0xFFFF);
+        idRangeOffsets += string16(0);
+      }
+    }
+
+    endCount += '\xFF\xFF';
+    startCount += '\xFF\xFF';
+    idDeltas += '\x00\x01';
+    idRangeOffsets += '\x00\x00';
+
+    var format314 = '\x00\x00' + // language
+                    string16(segCount2) +
+                    string16(searchRange) +
+                    string16(searchEntry) +
+                    string16(rangeShift) +
+                    endCount + '\x00\x00' + startCount +
+                    idDeltas + idRangeOffsets + glyphsIds;
+
+    return stringToArray(cmap +
+                         '\x00\x04' + // format
+                         string16(format314.length + 4) + // length
+                         format314);
+  };
+
+  function createOS2Table(properties, charstrings, override) {
+    override = override || {
+      unitsPerEm: 0,
+      yMax: 0,
+      yMin: 0,
+      ascent: 0,
+      descent: 0
+    };
+
+    var ulUnicodeRange1 = 0;
+    var ulUnicodeRange2 = 0;
+    var ulUnicodeRange3 = 0;
+    var ulUnicodeRange4 = 0;
+
+    var firstCharIndex = null;
+    var lastCharIndex = 0;
+
+    if (charstrings) {
+      for (var i = 0; i < charstrings.length; ++i) {
+        var code = charstrings[i].unicode;
+        if (firstCharIndex > code || !firstCharIndex)
+          firstCharIndex = code;
+        if (lastCharIndex < code)
+          lastCharIndex = code;
+
+        var position = getUnicodeRangeFor(code);
+        if (position < 32) {
+          ulUnicodeRange1 |= 1 << position;
+        } else if (position < 64) {
+          ulUnicodeRange2 |= 1 << position - 32;
+        } else if (position < 96) {
+          ulUnicodeRange3 |= 1 << position - 64;
+        } else if (position < 123) {
+          ulUnicodeRange4 |= 1 << position - 96;
+        } else {
+          error('Unicode ranges Bits > 123 are reserved for internal usage');
+        }
+      }
+    } else {
+      // TODO
+      firstCharIndex = 0;
+      lastCharIndex = 255;
+    }
+
+    var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
+    var typoAscent = override.ascent || properties.ascent;
+    var typoDescent = override.descent || properties.descent;
+    var winAscent = override.yMax || typoAscent;
+    var winDescent = -override.yMin || -typoDescent;
+
+    // if there is a units per em value but no other override
+    // then scale the calculated ascent
+    if (unitsPerEm != kPDFGlyphSpaceUnits &&
+        'undefined' == typeof(override.ascent)) {
+      // if the font units differ to the PDF glyph space units
+      // then scale up the values
+      typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
+      typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
+      winAscent = typoAscent;
+      winDescent = -typoDescent;
+    }
+
+    return '\x00\x03' + // version
+           '\x02\x24' + // xAvgCharWidth
+           '\x01\xF4' + // usWeightClass
+           '\x00\x05' + // usWidthClass
+           '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
+           '\x02\x8A' + // ySubscriptXSize
+           '\x02\xBB' + // ySubscriptYSize
+           '\x00\x00' + // ySubscriptXOffset
+           '\x00\x8C' + // ySubscriptYOffset
+           '\x02\x8A' + // ySuperScriptXSize
+           '\x02\xBB' + // ySuperScriptYSize
+           '\x00\x00' + // ySuperScriptXOffset
+           '\x01\xDF' + // ySuperScriptYOffset
+           '\x00\x31' + // yStrikeOutSize
+           '\x01\x02' + // yStrikeOutPosition
+           '\x00\x00' + // sFamilyClass
+           '\x00\x00\x06' +
+           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
+           '\x00\x00\x00\x00\x00\x00' + // Panose
+           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
+           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
+           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
+           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
+           '\x2A\x32\x31\x2A' + // achVendID
+           string16(properties.italicAngle ? 1 : 0) + // fsSelection
+           string16(firstCharIndex ||
+                    properties.firstChar) + // usFirstCharIndex
+           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
+           string16(typoAscent) + // sTypoAscender
+           string16(typoDescent) + // sTypoDescender
+           '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
+           string16(winAscent) + // usWinAscent
+           string16(winDescent) + // usWinDescent
+           '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
+           '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
+           string16(properties.xHeight) + // sxHeight
+           string16(properties.capHeight) + // sCapHeight
+           string16(0) + // usDefaultChar
+           string16(firstCharIndex || properties.firstChar) + // usBreakChar
+           '\x00\x03';  // usMaxContext
+  };
+
+  function createPostTable(properties) {
+    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
+    return '\x00\x03\x00\x00' + // Version number
+           string32(angle) + // italicAngle
+           '\x00\x00' + // underlinePosition
+           '\x00\x00' + // underlineThickness
+           string32(properties.fixedPitch) + // isFixedPitch
+           '\x00\x00\x00\x00' + // minMemType42
+           '\x00\x00\x00\x00' + // maxMemType42
+           '\x00\x00\x00\x00' + // minMemType1
+           '\x00\x00\x00\x00';  // maxMemType1
+  };
+
+  function createNameTable(name) {
+    var strings = [
+      'Original licence',  // 0.Copyright
+      name,                // 1.Font family
+      'Unknown',           // 2.Font subfamily (font weight)
+      'uniqueID',          // 3.Unique ID
+      name,                // 4.Full font name
+      'Version 0.11',      // 5.Version
+      '',                  // 6.Postscript name
+      'Unknown',           // 7.Trademark
+      'Unknown',           // 8.Manufacturer
+      'Unknown'            // 9.Designer
+    ];
+
+    // Mac want 1-byte per character strings while Windows want
+    // 2-bytes per character, so duplicate the names table
+    var stringsUnicode = [];
+    for (var i = 0, ii = strings.length; i < ii; i++) {
+      var str = strings[i];
+
+      var strUnicode = '';
+      for (var j = 0, jj = str.length; j < jj; j++)
+        strUnicode += string16(str.charCodeAt(j));
+      stringsUnicode.push(strUnicode);
+    }
+
+    var names = [strings, stringsUnicode];
+    var platforms = ['\x00\x01', '\x00\x03'];
+    var encodings = ['\x00\x00', '\x00\x01'];
+    var languages = ['\x00\x00', '\x04\x09'];
+
+    var namesRecordCount = strings.length * platforms.length;
+    var nameTable =
+      '\x00\x00' +                           // format
+      string16(namesRecordCount) +           // Number of names Record
+      string16(namesRecordCount * 12 + 6);   // Storage
+
+    // Build the name records field
+    var strOffset = 0;
+    for (var i = 0, ii = platforms.length; i < ii; i++) {
+      var strs = names[i];
+      for (var j = 0, jj = strs.length; j < jj; j++) {
+        var str = strs[j];
+        var nameRecord =
+          platforms[i] + // platform ID
+          encodings[i] + // encoding ID
+          languages[i] + // language ID
+          string16(j) + // name ID
+          string16(str.length) +
+          string16(strOffset);
+        nameTable += nameRecord;
+        strOffset += str.length;
+      }
+    }
+
+    nameTable += strings.join('') + stringsUnicode.join('');
+    return nameTable;
+  }
+
+  Font.prototype = {
+    name: null,
+    font: null,
+    mimetype: null,
+    encoding: null,
+
+    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
+      function readTableEntry(file) {
+        var tag = file.getBytes(4);
+        tag = String.fromCharCode(tag[0]) +
+              String.fromCharCode(tag[1]) +
+              String.fromCharCode(tag[2]) +
+              String.fromCharCode(tag[3]);
+
+        var checksum = int32(file.getBytes(4));
+        var offset = int32(file.getBytes(4));
+        var length = int32(file.getBytes(4));
+
+        // Read the table associated data
+        var previousPosition = file.pos;
+        file.pos = file.start ? file.start : 0;
+        file.skip(offset);
+        var data = file.getBytes(length);
+        file.pos = previousPosition;
+
+        if (tag == 'head') {
+          // clearing checksum adjustment
+          data[8] = data[9] = data[10] = data[11] = 0;
+          data[17] |= 0x20; //Set font optimized for cleartype flag
+        }
+
+        return {
+          tag: tag,
+          checksum: checksum,
+          length: length,
+          offset: offset,
+          data: data
+        };
+      };
+
+      function readOpenTypeHeader(ttf) {
+        return {
+          version: arrayToString(ttf.getBytes(4)),
+          numTables: int16(ttf.getBytes(2)),
+          searchRange: int16(ttf.getBytes(2)),
+          entrySelector: int16(ttf.getBytes(2)),
+          rangeShift: int16(ttf.getBytes(2))
+        };
+      };
+
+      function createGlyphNameMap(glyphs, ids, properties) {
+        var glyphNames = properties.glyphNames;
+        if (!glyphNames) {
+          properties.glyphNameMap = {};
+          return;
+        }
+        var glyphsLength = glyphs.length;
+        var glyphNameMap = {};
+        var encoding = [];
+        for (var i = 0; i < glyphsLength; ++i) {
+          var glyphName = glyphNames[ids[i]];
+          if (!glyphName)
+            continue;
+          var unicode = glyphs[i].unicode;
+          glyphNameMap[glyphName] = unicode;
+          var code = glyphs[i].code;
+          encoding[code] = glyphName;
+        }
+        properties.glyphNameMap = glyphNameMap;
+        if (!properties.hasEncoding)
+          properties.baseEncoding = encoding;
+      }
+
+      function readCMapTable(cmap, font) {
+        var start = (font.start ? font.start : 0) + cmap.offset;
+        font.pos = start;
+
+        var version = int16(font.getBytes(2));
+        var numRecords = int16(font.getBytes(2));
+
+        var records = [];
+        for (var i = 0; i < numRecords; i++) {
+          records.push({
+            platformID: int16(font.getBytes(2)),
+            encodingID: int16(font.getBytes(2)),
+            offset: int32(font.getBytes(4))
+          });
+        }
+
+        // Check that table are sorted by platformID then encodingID,
+        records.sort(function fontReadCMapTableSort(a, b) {
+          return ((a.platformID << 16) + a.encodingID) -
+                 ((b.platformID << 16) + b.encodingID);
+        });
+
+        var tables = [records[0]];
+        for (var i = 1; i < numRecords; i++) {
+          // The sanitizer will drop the font if 2 tables have the same
+          // platformID and the same encodingID, this will be correct for
+          // most cases but if the font has been made for Mac it could
+          // exist a few platformID: 1, encodingID: 0 but with a different
+          // language field and that's correct. But the sanitizer does not
+          // seem to support this case.
+          var current = records[i];
+          var previous = records[i - 1];
+          if (((current.platformID << 16) + current.encodingID) <=
+             ((previous.platformID << 16) + previous.encodingID))
+                continue;
+          tables.push(current);
+        }
+
+        var missing = numRecords - tables.length;
+        if (missing) {
+          numRecords = tables.length;
+          var data = string16(version) + string16(numRecords);
+
+          for (var i = 0; i < numRecords; i++) {
+            var table = tables[i];
+            data += string16(table.platformID) +
+                    string16(table.encodingID) +
+                    string32(table.offset);
+          }
+
+          for (var i = 0, ii = data.length; i < ii; i++)
+            cmap.data[i] = data.charCodeAt(i);
+        }
+
+        for (var i = 0; i < numRecords; i++) {
+          var table = tables[i];
+          font.pos = start + table.offset;
+
+          var format = int16(font.getBytes(2));
+          var length = int16(font.getBytes(2));
+          var language = int16(font.getBytes(2));
+
+          if (format == 0) {
+            // Characters below 0x20 are controls characters that are hardcoded
+            // into the platform so if some characters in the font are assigned
+            // under this limit they will not be displayed so let's rewrite the
+            // CMap.
+            var glyphs = [];
+            var ids = [];
+            for (var j = 0; j < 256; j++) {
+              var index = font.getByte();
+              if (index) {
+                glyphs.push({ unicode: j, code: j });
+                ids.push(index);
+              }
+            }
+            return {
+              glyphs: glyphs,
+              ids: ids,
+              hasShortCmap: true
+            };
+          } else if (format == 4) {
+            // re-creating the table in format 4 since the encoding
+            // might be changed
+            var segCount = (int16(font.getBytes(2)) >> 1);
+            font.getBytes(6); // skipping range fields
+            var segIndex, segments = [];
+            for (segIndex = 0; segIndex < segCount; segIndex++) {
+              segments.push({ end: int16(font.getBytes(2)) });
+            }
+            font.getBytes(2);
+            for (segIndex = 0; segIndex < segCount; segIndex++) {
+              segments[segIndex].start = int16(font.getBytes(2));
+            }
+
+            for (segIndex = 0; segIndex < segCount; segIndex++) {
+              segments[segIndex].delta = int16(font.getBytes(2));
+            }
+
+            var offsetsCount = 0;
+            for (segIndex = 0; segIndex < segCount; segIndex++) {
+              var segment = segments[segIndex];
+              var rangeOffset = int16(font.getBytes(2));
+              if (!rangeOffset) {
+                segment.offsetIndex = -1;
+                continue;
+              }
+
+              var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+              segment.offsetIndex = offsetIndex;
+              offsetsCount = Math.max(offsetsCount, offsetIndex +
+                segment.end - segment.start + 1);
+            }
+
+            var offsets = [];
+            for (var j = 0; j < offsetsCount; j++)
+              offsets.push(int16(font.getBytes(2)));
+
+            var glyphs = [], ids = [];
+
+            for (segIndex = 0; segIndex < segCount; segIndex++) {
+              var segment = segments[segIndex];
+              var start = segment.start, end = segment.end;
+              var delta = segment.delta, offsetIndex = segment.offsetIndex;
+
+              for (var j = start; j <= end; j++) {
+                if (j == 0xFFFF)
+                  continue;
+
+                var glyphCode = offsetIndex < 0 ? j :
+                  offsets[offsetIndex + j - start];
+                glyphCode = (glyphCode + delta) & 0xFFFF;
+                if (glyphCode == 0)
+                  continue;
+
+                glyphs.push({ unicode: j, code: j });
+                ids.push(glyphCode);
+              }
+            }
+
+            return {
+              glyphs: glyphs,
+              ids: ids
+            };
+          } else if (format == 6) {
+            // Format 6 is a 2-bytes dense mapping, which means the font data
+            // lives glue together even if they are pretty far in the unicode
+            // table. (This looks weird, so I can have missed something), this
+            // works on Linux but seems to fails on Mac so let's rewrite the
+            // cmap table to a 3-1-4 style
+            var firstCode = int16(font.getBytes(2));
+            var entryCount = int16(font.getBytes(2));
+
+            var glyphs = [];
+            var ids = [];
+            for (var j = 0; j < entryCount; j++) {
+              var glyphCode = int16(font.getBytes(2));
+              var code = firstCode + j;
+
+              glyphs.push({ unicode: code, code: code });
+              ids.push(glyphCode);
+            }
+
+            return {
+              glyphs: glyphs,
+              ids: ids
+            };
+          }
+        }
+        error('Unsupported cmap table format');
+      };
+
+      function sanitizeMetrics(font, header, metrics, numGlyphs) {
+        if (!header && !metrics)
+          return;
+
+        // The vhea/vmtx tables are not required, so it happens that
+        // some fonts embed a vmtx table without a vhea table. In this
+        // situation the sanitizer assume numOfLongVerMetrics = 1. As
+        // a result it tries to read numGlyphs - 1 SHORT from the vmtx
+        // table, and if it is not possible, the font is rejected.
+        // So remove the vmtx table if there is no vhea table.
+        if (!header && metrics) {
+          metrics.data = null;
+          return;
+        }
+
+        font.pos = (font.start ? font.start : 0) + header.offset;
+        font.pos += header.length - 2;
+        var numOfMetrics = int16(font.getBytes(2));
+
+        var numOfSidebearings = numGlyphs - numOfMetrics;
+        var numMissing = numOfSidebearings -
+          ((hmtx.length - numOfMetrics * 4) >> 1);
+        if (numMissing > 0) {
+          font.pos = (font.start ? font.start : 0) + metrics.offset;
+          var entries = '';
+          for (var i = 0, ii = hmtx.length; i < ii; i++)
+            entries += String.fromCharCode(font.getByte());
+          for (var i = 0; i < numMissing; i++)
+            entries += '\x00\x00';
+          metrics.data = stringToArray(entries);
+        }
+      };
+
+      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
+        if (sourceEnd - sourceStart <= 12) {
+          // glyph with data less than 12 is invalid one
+          return 0;
+        }
+        var glyf = source.subarray(sourceStart, sourceEnd);
+        var contoursCount = (glyf[0] << 8) | glyf[1];
+        if (contoursCount & 0x8000) {
+          // complex glyph, writing as is
+          dest.set(glyf, destStart);
+          return glyf.length;
+        }
+
+        var j = 10, flagsCount = 0;
+        for (var i = 0; i < contoursCount; i++) {
+          var endPoint = (glyf[j] << 8) | glyf[j + 1];
+          flagsCount = endPoint + 1;
+          j += 2;
+        }
+        // skipping instructions
+        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
+        j += 2 + instructionsLength;
+        // validating flags
+        var coordinatesLength = 0;
+        for (var i = 0; i < flagsCount; i++) {
+          var flag = glyf[j++];
+          if (flag & 0xC0) {
+            // reserved flags must be zero, rejecting
+            return 0;
+          }
+          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
+                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
+          coordinatesLength += xyLength;
+          if (flag & 8) {
+            var repeat = glyf[j++];
+            i += repeat;
+            coordinatesLength += repeat * xyLength;
+          }
+        }
+        var glyphDataLength = j + coordinatesLength;
+        if (glyphDataLength > glyf.length) {
+          // not enough data for coordinates
+          return 0;
+        }
+        if (glyf.length - glyphDataLength > 3) {
+          // truncating and aligning to 4 bytes the long glyph data
+          glyphDataLength = (glyphDataLength + 3) & ~3;
+          dest.set(glyf.subarray(0, glyphDataLength), destStart);
+          return glyphDataLength;
+        }
+        // glyph data is fine
+        dest.set(glyf, destStart);
+        return glyf.length;
+      }
+
+      function sanitizeGlyphLocations(loca, glyf, numGlyphs,
+                                      isGlyphLocationsLong) {
+        var itemSize, itemDecode, itemEncode;
+        if (isGlyphLocationsLong) {
+          itemSize = 4;
+          itemDecode = function fontItemDecodeLong(data, offset) {
+            return (data[offset] << 24) | (data[offset + 1] << 16) |
+                   (data[offset + 2] << 8) | data[offset + 3];
+          };
+          itemEncode = function fontItemEncodeLong(data, offset, value) {
+            data[offset] = (value >>> 24) & 0xFF;
+            data[offset + 1] = (value >> 16) & 0xFF;
+            data[offset + 2] = (value >> 8) & 0xFF;
+            data[offset + 3] = value & 0xFF;
+          };
+        } else {
+          itemSize = 2;
+          itemDecode = function fontItemDecode(data, offset) {
+            return (data[offset] << 9) | (data[offset + 1] << 1);
+          };
+          itemEncode = function fontItemEncode(data, offset, value) {
+            data[offset] = (value >> 9) & 0xFF;
+            data[offset + 1] = (value >> 1) & 0xFF;
+          };
+        }
+        var locaData = loca.data;
+        // removing the invalid glyphs
+        var oldGlyfData = glyf.data;
+        var oldGlyfDataLength = oldGlyfData.length;
+        var newGlyfData = new Uint8Array(oldGlyfDataLength);
+        var startOffset = itemDecode(locaData, 0);
+        var writeOffset = 0;
+        itemEncode(locaData, 0, writeOffset);
+        for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+          var endOffset = itemDecode(locaData, j);
+          if (endOffset > oldGlyfDataLength) {
+            // glyph end offset points outside glyf data, rejecting the glyph
+            itemEncode(locaData, j, writeOffset);
+            startOffset = endOffset;
+            continue;
+          }
+
+          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
+                                        newGlyfData, writeOffset);
+          writeOffset += newLength;
+          itemEncode(locaData, j, writeOffset);
+          startOffset = endOffset;
+        }
+
+        if (writeOffset == 0) {
+          // glyf table cannot be empty -- redoing the glyf and loca tables
+          // to have single glyph with one point
+          var simpleGlyph = new Uint8Array(
+            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
+          for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
+            itemEncode(locaData, j, simpleGlyph.length);
+          glyf.data = simpleGlyph;
+          return;
+        }
+
+        glyf.data = newGlyfData.subarray(0, writeOffset);
+      }
+
+      function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
+        var itemSize, itemDecode;
+        if (isGlyphLocationsLong) {
+          itemSize = 4;
+          itemDecode = function fontItemDecodeLong(data, offset) {
+            return (data[offset] << 24) | (data[offset + 1] << 16) |
+                   (data[offset + 2] << 8) | data[offset + 3];
+          };
+        } else {
+          itemSize = 2;
+          itemDecode = function fontItemDecode(data, offset) {
+            return (data[offset] << 9) | (data[offset + 1] << 1);
+          };
+        }
+        var data = locaTable.data, length = data.length;
+        var lastOffset = itemDecode(data, 0);
+        for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
+          var offset = itemDecode(data, i);
+          if (offset == lastOffset)
+            emptyGlyphIds[j] = true;
+          lastOffset = offset;
+        }
+      }
+
+      function readGlyphNameMap(post, properties) {
+        var start = (font.start ? font.start : 0) + post.offset;
+        font.pos = start;
+
+        var length = post.length, end = start + length;
+        var version = int32(font.getBytes(4));
+        // skip rest to the tables
+        font.getBytes(28);
+
+        var glyphNames;
+        switch (version) {
+          case 0x00010000:
+            glyphNames = MacStandardGlyphOrdering;
+            break;
+          case 0x00020000:
+            var numGlyphs = int16(font.getBytes(2));
+            var glyphNameIndexes = [];
+            for (var i = 0; i < numGlyphs; ++i)
+              glyphNameIndexes.push(int16(font.getBytes(2)));
+            var customNames = [];
+            while (font.pos < end) {
+              var stringLength = font.getByte();
+              var string = '';
+              for (var i = 0; i < stringLength; ++i)
+                string += font.getChar();
+              customNames.push(string);
+            }
+            glyphNames = [];
+            for (var i = 0; i < numGlyphs; ++i) {
+              var j = glyphNameIndexes[i];
+              if (j < 258) {
+                glyphNames.push(MacStandardGlyphOrdering[j]);
+                continue;
+              }
+              glyphNames.push(customNames[j - 258]);
+            }
+            break;
+          case 0x00030000:
+            break;
+          default:
+            warn('Unknown/unsupported post table version ' + version);
+            break;
+        }
+        properties.glyphNames = glyphNames;
+      }
+
+      function isOS2Valid(os2Table) {
+        var data = os2Table.data;
+        // usWinAscent == 0 makes font unreadable by windows
+        var usWinAscent = (data[74] << 8) | data[75];
+        if (usWinAscent == 0)
+          return false;
+
+        return true;
+      }
+
+      // Check that required tables are present
+      var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
+                             'hmtx', 'maxp', 'name', 'post'];
+
+      var header = readOpenTypeHeader(font);
+      var numTables = header.numTables;
+
+      var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2;
+      var tables = [];
+      for (var i = 0; i < numTables; i++) {
+        var table = readTableEntry(font);
+        var index = requiredTables.indexOf(table.tag);
+        if (index != -1) {
+          if (table.tag == 'cmap')
+            cmap = table;
+          else if (table.tag == 'post')
+            post = table;
+          else if (table.tag == 'maxp')
+            maxp = table;
+          else if (table.tag == 'hhea')
+            hhea = table;
+          else if (table.tag == 'hmtx')
+            hmtx = table;
+          else if (table.tag == 'head')
+            head = table;
+          else if (table.tag == 'OS/2')
+            os2 = table;
+
+          requiredTables.splice(index, 1);
+        } else {
+          if (table.tag == 'vmtx')
+            vmtx = table;
+          else if (table.tag == 'vhea')
+            vhea = table;
+          else if (table.tag == 'loca')
+            loca = table;
+          else if (table.tag == 'glyf')
+            glyf = table;
+        }
+        tables.push(table);
+      }
+
+      var numTables = tables.length + requiredTables.length;
+
+      // header and new offsets. Table entry information is appended to the
+      // end of file. The virtualOffset represents where to put the actual
+      // data of a particular table;
+      var ttf = {
+        file: '',
+        virtualOffset: numTables * (4 * 4)
+      };
+
+      // The new numbers of tables will be the last one plus the num
+      // of missing tables
+      createOpenTypeHeader(header.version, ttf, numTables);
+
+      // Invalid OS/2 can break the font for the Windows
+      if (os2 && !isOS2Valid(os2)) {
+        tables.splice(tables.indexOf(os2), 1);
+        os2 = null;
+      }
+
+      // Ensure the [h/v]mtx tables contains the advance width and
+      // sidebearings information for numGlyphs in the maxp table
+      font.pos = (font.start || 0) + maxp.offset;
+      var version = int16(font.getBytes(4));
+      var numGlyphs = int16(font.getBytes(2));
+
+      sanitizeMetrics(font, hhea, hmtx, numGlyphs);
+      sanitizeMetrics(font, vhea, vmtx, numGlyphs);
+
+      var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
+      if (head && loca && glyf) {
+        sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
+      }
+
+      var emptyGlyphIds = [];
+      if (glyf)
+        findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
+
+      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
+      // Sometimes it's 0. That needs to be fixed
+      if (hhea.data[10] == 0 && hhea.data[11] == 0) {
+        hhea.data[10] = 0xFF;
+        hhea.data[11] = 0xFF;
+      }
+
+      // The 'post' table has glyphs names.
+      if (post) {
+        readGlyphNameMap(post, properties);
+      }
+
+      var glyphs, ids;
+      if (properties.type == 'CIDFontType2') {
+        // Replace the old CMAP table with a shiny new one
+        // Type2 composite fonts map characters directly to glyphs so the cmap
+        // table must be replaced.
+        // canvas fillText will reencode some characters even if the font has a
+        // glyph at that position - e.g. newline is converted to a space and
+        // U+00AD (soft hyphen) is not drawn.
+        // So, offset all the glyphs by 0xFF to avoid these cases and use
+        // the encoding to map incoming characters to the new glyph positions
+        if (!cmap) {
+          cmap = {
+            tag: 'cmap',
+            data: null
+          };
+          tables.push(cmap);
+        }
+
+        var cidToGidMap = properties.cidToGidMap || [];
+        var gidToCidMap = [0];
+        if (cidToGidMap.length > 0) {
+          for (var j = cidToGidMap.length - 1; j >= 0; j--) {
+            var gid = cidToGidMap[j];
+            if (gid)
+              gidToCidMap[gid] = j;
+          }
+          // filling the gaps using CID above the CIDs currently used in font
+          var nextCid = cidToGidMap.length;
+          for (var i = 1; i < numGlyphs; i++) {
+            if (!gidToCidMap[i])
+              gidToCidMap[i] = nextCid++;
+          }
+        }
+
+        glyphs = [];
+        ids = [];
+
+        var usedUnicodes = [];
+        var unassignedUnicodeItems = [];
+        for (var i = 1; i < numGlyphs; i++) {
+          var cid = gidToCidMap[i] || i;
+          var unicode = this.toFontChar[cid];
+          if (!unicode || typeof unicode !== 'number' ||
+              isSpecialUnicode(unicode) || unicode in usedUnicodes) {
+            unassignedUnicodeItems.push(i);
+            continue;
+          }
+          usedUnicodes[unicode] = true;
+          glyphs.push({ unicode: unicode, code: cid });
+          ids.push(i);
+        }
+        // trying to fit as many unassigned symbols as we can
+        // in the range allocated for the user defined symbols
+        var unusedUnicode = kCmapGlyphOffset;
+        for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
+          var i = unassignedUnicodeItems[j];
+          var cid = gidToCidMap[i] || i;
+          while (unusedUnicode in usedUnicodes)
+            unusedUnicode++;
+          if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
+            break;
+          var unicode = unusedUnicode++;
+          this.toFontChar[cid] = unicode;
+          usedUnicodes[unicode] = true;
+          glyphs.push({ unicode: unicode, code: cid });
+          ids.push(i);
+        }
+      } else {
+        var cmapTable = readCMapTable(cmap, font);
+
+        glyphs = cmapTable.glyphs;
+        ids = cmapTable.ids;
+
+        var hasShortCmap = !!cmapTable.hasShortCmap;
+        var toFontChar = this.toFontChar;
+
+        if (hasShortCmap && ids.length == numGlyphs) {
+          // Fixes the short cmap tables -- some generators use incorrect
+          // glyph id.
+          for (var i = 0, ii = ids.length; i < ii; i++)
+            ids[i] = i;
+        }
+
+        var unusedUnicode = kCmapGlyphOffset;
+        var glyphNames = properties.glyphNames || [];
+        var encoding = properties.baseEncoding;
+        var differences = properties.differences;
+        if (toFontChar && toFontChar.length > 0) {
+          // checking if cmap is just identity map
+          var isIdentity = true;
+          for (var i = 0, ii = glyphs.length; i < ii; i++) {
+            if (glyphs[i].unicode != i + 1) {
+              isIdentity = false;
+              break;
+            }
+          }
+          // if it is, replacing with meaningful toUnicode values
+          if (isIdentity && !this.isSymbolicFont) {
+            var usedUnicodes = [], unassignedUnicodeItems = [];
+            for (var i = 0, ii = glyphs.length; i < ii; i++) {
+              var unicode = toFontChar[i + 1];
+              if (!unicode || typeof unicode !== 'number' ||
+                  unicode in usedUnicodes) {
+                unassignedUnicodeItems.push(i);
+                continue;
+              }
+              glyphs[i].unicode = unicode;
+              usedUnicodes[unicode] = true;
+            }
+            for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
+              var i = unassignedUnicodeItems[j];
+              while (unusedUnicode in usedUnicodes)
+                unusedUnicode++;
+              var cid = i + 1;
+              // override only if unicode mapping is not specified
+              if (!(cid in toFontChar))
+                toFontChar[cid] = unusedUnicode;
+              glyphs[i].unicode = unusedUnicode++;
+            }
+            this.useToFontChar = true;
+          }
+        }
+
+        // remove glyph references outside range of avaialable glyphs or empty
+        var glyphsRemoved = 0;
+        for (var i = ids.length - 1; i >= 0; i--) {
+          if (ids[i] < numGlyphs &&
+              (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
+            continue;
+          ids.splice(i, 1);
+          glyphs.splice(i, 1);
+          glyphsRemoved++;
+        }
+
+        // checking if it's a "true" symbolic font
+        if (this.isSymbolicFont) {
+          var minUnicode = 0xFFFF, maxUnicode = 0;
+          for (var i = 0, ii = glyphs.length; i < ii; i++) {
+            var unicode = glyphs[i].unicode;
+            minUnicode = Math.min(minUnicode, unicode);
+            maxUnicode = Math.max(maxUnicode, unicode);
+          }
+          // high byte must be the same for min and max unicodes
+          if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
+            this.isSymbolicFont = false;
+        }
+
+        // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
+        // does not set properly
+        if (glyphsRemoved > 2) {
+          warn('Switching TrueType encoding to MacRomanEncoding for ' +
+               this.name + ' font');
+          encoding = Encodings.MacRomanEncoding;
+        }
+
+        if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
+          // Re-encode short map encoding to unicode -- that simplifies the
+          // resolution of MacRoman encoded glyphs logic for TrueType fonts:
+          // copying all characters to private use area, all mapping all known
+          // glyphs to the unicodes. The glyphs and ids arrays will grow.
+          var usedUnicodes = [];
+          for (var i = 0, ii = glyphs.length; i < ii; i++) {
+            var code = glyphs[i].unicode;
+            var gid = ids[i];
+            glyphs[i].unicode += kCmapGlyphOffset;
+            toFontChar[code] = glyphs[i].unicode;
+
+            var glyphName = glyphNames[gid] || encoding[code];
+            if (glyphName in GlyphsUnicode) {
+              var unicode = GlyphsUnicode[glyphName];
+              if (unicode in usedUnicodes)
+                continue;
+
+              usedUnicodes[unicode] = true;
+              glyphs.push({
+                unicode: unicode,
+                code: glyphs[i].code
+              });
+              ids.push(gid);
+              toFontChar[code] = unicode;
+            }
+          }
+          this.useToFontChar = true;
+        } else if (!this.isSymbolicFont && (this.hasEncoding ||
+                    properties.glyphNames || differences.length > 0)) {
+          // Re-encode cmap encoding to unicode, based on the 'post' table data
+          // diffrence array or base encoding
+          var reverseMap = [];
+          for (var i = 0, ii = glyphs.length; i < ii; i++)
+            reverseMap[glyphs[i].unicode] = i;
+
+          var newGlyphUnicodes = [];
+          for (var i = 0, ii = glyphs.length; i < ii; i++) {
+            var code = glyphs[i].unicode;
+            var changeCode = false;
+            var gid = ids[i];
+
+            var glyphName = glyphNames[gid];
+            if (!glyphName) {
+              glyphName = differences[code] || encoding[code];
+              changeCode = true;
+            }
+            if (glyphName in GlyphsUnicode) {
+              var unicode = GlyphsUnicode[glyphName];
+              if (!unicode || reverseMap[unicode] === i)
+                continue; // unknown glyph name or in its own place
+
+              newGlyphUnicodes[i] = unicode;
+              if (changeCode)
+                toFontChar[code] = unicode;
+              delete reverseMap[code];
+            }
+          }
+          for (var index in newGlyphUnicodes) {
+            var unicode = newGlyphUnicodes[index];
+            if (reverseMap[unicode]) {
+              // avoiding assigning to the same unicode
+              glyphs[index].unicode = unusedUnicode++;
+              continue;
+            }
+            glyphs[index].unicode = unicode;
+            reverseMap[unicode] = index;
+          }
+          this.useToFontChar = true;
+        }
+
+        // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
+        if (this.isSymbolicFont) {
+          for (var i = 0, ii = glyphs.length; i < ii; i++) {
+            var code = glyphs[i].unicode & 0xFF;
+            var fontCharCode = kSymbolicFontGlyphOffset | code;
+            glyphs[i].unicode = toFontChar[code] = fontCharCode;
+          }
+          this.useToFontChar = true;
+        }
+
+        createGlyphNameMap(glyphs, ids, properties);
+        this.glyphNameMap = properties.glyphNameMap;
+      }
+
+      // Converting glyphs and ids into font's cmap table
+      cmap.data = createCMapTable(glyphs, ids);
+      var unicodeIsEnabled = [];
+      for (var i = 0, ii = glyphs.length; i < ii; i++) {
+        unicodeIsEnabled[glyphs[i].unicode] = true;
+      }
+      this.unicodeIsEnabled = unicodeIsEnabled;
+
+      if (!os2) {
+        // extract some more font properties from the OpenType head and
+        // hhea tables; yMin and descent value are always negative
+        var override = {
+          unitsPerEm: int16([head.data[18], head.data[19]]),
+          yMax: int16([head.data[42], head.data[43]]),
+          yMin: int16([head.data[38], head.data[39]]) - 0x10000,
+          ascent: int16([hhea.data[4], hhea.data[5]]),
+          descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
+        };
+
+        tables.push({
+          tag: 'OS/2',
+          data: stringToArray(createOS2Table(properties, glyphs, override))
+        });
+      }
+
+      // Rewrite the 'post' table if needed
+      if (requiredTables.indexOf('post') != -1) {
+        tables.push({
+          tag: 'post',
+          data: stringToArray(createPostTable(properties))
+        });
+      }
+
+      // Rewrite the 'name' table if needed
+      if (requiredTables.indexOf('name') != -1) {
+        tables.push({
+          tag: 'name',
+          data: stringToArray(createNameTable(this.name))
+        });
+      }
+
+      // Tables needs to be written by ascendant alphabetic order
+      tables.sort(function tables_sort(a, b) {
+        return (a.tag > b.tag) - (a.tag < b.tag);
+      });
+
+      // rewrite the tables but tweak offsets
+      for (var i = 0, ii = tables.length; i < ii; i++) {
+        var table = tables[i];
+        var data = [];
+
+        var tableData = table.data;
+        for (var j = 0, jj = tableData.length; j < jj; j++)
+          data.push(tableData[j]);
+        createTableEntry(ttf, table.tag, data);
+      }
+
+      // Add the table datas
+      for (var i = 0, ii = tables.length; i < ii; i++) {
+        var table = tables[i];
+        var tableData = table.data;
+        ttf.file += arrayToString(tableData);
+
+        // 4-byte aligned data
+        while (ttf.file.length & 3)
+          ttf.file += String.fromCharCode(0);
+      }
+
+      return stringToArray(ttf.file);
+    },
+
+    convert: function Font_convert(fontName, font, properties) {
+      function isFixedPitch(glyphs) {
+        for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
+          if (glyphs[i] != glyphs[i + 1])
+            return false;
+        }
+        return true;
+      }
+
+      // The offsets object holds at the same time a representation of where
+      // to write the table entry information about a table and another offset
+      // representing the offset where to draw the actual data of a particular
+      // table
+      var kRequiredTablesCount = 9;
+
+      var otf = {
+        file: '',
+        virtualOffset: 9 * (4 * 4)
+      };
+
+      createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
+
+      var charstrings = font.charstrings;
+      properties.fixedPitch = isFixedPitch(charstrings);
+
+      var glyphNameMap = {};
+      for (var i = 0; i < charstrings.length; ++i) {
+        var charstring = charstrings[i];
+        glyphNameMap[charstring.glyph] = charstring.unicode;
+      }
+      this.glyphNameMap = glyphNameMap;
+
+      if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
+          properties.subtype == 'CIDFontType0C')) {
+        var encoding = [];
+        for (var i = 0; i < charstrings.length; ++i) {
+          var charstring = charstrings[i];
+          encoding[charstring.code] = charstring.glyph;
+        }
+        properties.baseEncoding = encoding;
+      }
+      if (properties.subtype == 'CIDFontType0C') {
+        var toFontChar = [];
+        for (var i = 0; i < charstrings.length; ++i) {
+          var charstring = charstrings[i];
+          toFontChar[charstring.code] = charstring.unicode;
+        }
+        this.toFontChar = toFontChar;
+      }
+
+      var fields = {
+        // PostScript Font Program
+        'CFF ': font.data,
+
+        // OS/2 and Windows Specific metrics
+        'OS/2': stringToArray(createOS2Table(properties, charstrings)),
+
+        // Character to glyphs mapping
+        'cmap': createCMapTable(charstrings.slice(),
+                                ('glyphIds' in font) ? font.glyphIds : null),
+
+        // Font header
+        'head': (function fontFieldsHead() {
+          return stringToArray(
+              '\x00\x01\x00\x00' + // Version number
+              '\x00\x00\x10\x00' + // fontRevision
+              '\x00\x00\x00\x00' + // checksumAdjustement
+              '\x5F\x0F\x3C\xF5' + // magicNumber
+              '\x00\x00' + // Flags
+              '\x03\xE8' + // unitsPerEM (defaulting to 1000)
+              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
+              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
+              '\x00\x00' + // xMin
+              safeString16(properties.descent) + // yMin
+              '\x0F\xFF' + // xMax
+              safeString16(properties.ascent) + // yMax
+              string16(properties.italicAngle ? 2 : 0) + // macStyle
+              '\x00\x11' + // lowestRecPPEM
+              '\x00\x00' + // fontDirectionHint
+              '\x00\x00' + // indexToLocFormat
+              '\x00\x00');  // glyphDataFormat
+        })(),
+
+        // Horizontal header
+        'hhea': (function fontFieldsHhea() {
+          return stringToArray(
+              '\x00\x01\x00\x00' + // Version number
+              safeString16(properties.ascent) + // Typographic Ascent
+              safeString16(properties.descent) + // Typographic Descent
+              '\x00\x00' + // Line Gap
+              '\xFF\xFF' + // advanceWidthMax
+              '\x00\x00' + // minLeftSidebearing
+              '\x00\x00' + // minRightSidebearing
+              '\x00\x00' + // xMaxExtent
+              safeString16(properties.capHeight) + // caretSlopeRise
+              safeString16(Math.tan(properties.italicAngle) *
+                       properties.xHeight) + // caretSlopeRun
+              '\x00\x00' + // caretOffset
+              '\x00\x00' + // -reserved-
+              '\x00\x00' + // -reserved-
+              '\x00\x00' + // -reserved-
+              '\x00\x00' + // -reserved-
+              '\x00\x00' + // metricDataFormat
+              string16(charstrings.length + 1)); // Number of HMetrics
+        })(),
+
+        // Horizontal metrics
+        'hmtx': (function fontFieldsHmtx() {
+          var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
+          for (var i = 0, ii = charstrings.length; i < ii; i++) {
+            var charstring = charstrings[i];
+            var width = 'width' in charstring ? charstring.width : 0;
+            hmtx += string16(width) + string16(0);
+          }
+          return stringToArray(hmtx);
+        })(),
+
+        // Maximum profile
+        'maxp': (function fontFieldsMaxp() {
+          return stringToArray(
+              '\x00\x00\x50\x00' + // Version number
+             string16(charstrings.length + 1)); // Num of glyphs
+        })(),
+
+        // Naming tables
+        'name': stringToArray(createNameTable(fontName)),
+
+        // PostScript informations
+        'post': stringToArray(createPostTable(properties))
+      };
+
+      for (var field in fields)
+        createTableEntry(otf, field, fields[field]);
+
+      for (var field in fields) {
+        var table = fields[field];
+        otf.file += arrayToString(table);
+      }
+
+      return stringToArray(otf.file);
+    },
+
+    buildToFontChar: function Font_buildToFontChar(toUnicode) {
+      var result = [];
+      var unusedUnicode = kCmapGlyphOffset;
+      for (var i = 0, ii = toUnicode.length; i < ii; i++) {
+        var unicode = toUnicode[i];
+        var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
+          unicode;
+        if (typeof unicode !== 'undefined')
+          result[i] = fontCharCode;
+      }
+      return result;
+    },
+
+    rebuildToUnicode: function Font_rebuildToUnicode(properties) {
+      var firstChar = properties.firstChar, lastChar = properties.lastChar;
+      var map = [];
+      if (properties.composite) {
+        var isIdentityMap = this.cidToUnicode.length == 0;
+        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
+          // TODO missing map the character according font's CMap
+          var cid = i;
+          map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
+        }
+      } else {
+        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
+          var glyph = properties.differences[i];
+          if (!glyph)
+            glyph = properties.baseEncoding[i];
+          if (!!glyph && (glyph in GlyphsUnicode))
+            map[i] = GlyphsUnicode[glyph];
+        }
+      }
+      this.toUnicode = map;
+    },
+
+    loadCidToUnicode: function Font_loadCidToUnicode(properties) {
+      if (!properties.cidSystemInfo)
+        return;
+
+      var cidToUnicodeMap = [], unicodeToCIDMap = [];
+      this.cidToUnicode = cidToUnicodeMap;
+      this.unicodeToCID = unicodeToCIDMap;
+
+      var cidSystemInfo = properties.cidSystemInfo;
+      var cidToUnicode;
+      if (cidSystemInfo) {
+        cidToUnicode = CIDToUnicodeMaps[
+          cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
+      }
+
+      if (!cidToUnicode)
+        return; // identity encoding
+
+      var cid = 1, i, j, k, ii;
+      for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
+        var unicode = cidToUnicode[i];
+        if (isArray(unicode)) {
+          var length = unicode.length;
+          for (j = 0; j < length; j++) {
+            cidToUnicodeMap[cid] = unicode[j];
+            unicodeToCIDMap[unicode[j]] = cid;
+          }
+          cid++;
+        } else if (typeof unicode === 'object') {
+          var fillLength = unicode.f;
+          if (fillLength) {
+            k = unicode.c;
+            for (j = 0; j < fillLength; ++j) {
+              cidToUnicodeMap[cid] = k;
+              unicodeToCIDMap[k] = cid;
+              cid++;
+              k++;
+            }
+          } else
+            cid += unicode.s;
+        } else if (unicode) {
+          cidToUnicodeMap[cid] = unicode;
+          unicodeToCIDMap[unicode] = cid;
+          cid++;
+        } else
+          cid++;
+      }
+    },
+
+    bindDOM: function Font_bindDOM(data) {
+      var fontName = this.loadedName;
+
+      // Add the font-face rule to the document
+      var url = ('url(data:' + this.mimetype + ';base64,' +
+                 PdfJS_window.window.btoa(data) + ');');
+      var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
+
+      var styleElement = PdfJS_window.document.createElement('style');
+      PdfJS_window.document.documentElement.getElementsByTagName('head')[0].appendChild(
+        styleElement);
+
+      var styleSheet = styleElement.sheet;
+      styleSheet.insertRule(rule, styleSheet.cssRules.length);
+
+      if (PDFJS.pdfBug && FontInspector.enabled)
+        FontInspector.fontAdded(this, url);
+
+      return rule;
+    },
+
+    get spaceWidth() {
+      // trying to estimate space character width
+      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
+      var width;
+      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
+        var glyphName = possibleSpaceReplacements[i];
+        // if possible, getting width by glyph name
+        if (glyphName in this.widths) {
+          width = this.widths[glyphName];
+          break;
+        }
+        var glyphUnicode = GlyphsUnicode[glyphName];
+        // finding the charcode via unicodeToCID map
+        var charcode = 0;
+        if (this.composite)
+          charcode = this.unicodeToCID[glyphUnicode];
+        // ... via toUnicode map
+        if (!charcode && 'toUnicode' in this)
+          charcode = this.toUnicode.indexOf(glyphUnicode);
+        // setting it to unicode if negative or undefined
+        if (!(charcode > 0))
+          charcode = glyphUnicode;
+        // trying to get width via charcode
+        width = this.widths[charcode];
+        if (width)
+          break; // the non-zero width found
+      }
+      width = (width || this.defaultWidth) * this.widthMultiplier;
+      return shadow(this, 'spaceWidth', width);
+    },
+
+    charToGlyph: function Font_charToGlyph(charcode) {
+      var fontCharCode, width, operatorList, disabled;
+
+      var width = this.widths[charcode];
+
+      switch (this.type) {
+        case 'CIDFontType0':
+          if (this.noUnicodeAdaptation) {
+            width = this.widths[this.unicodeToCID[charcode] || charcode];
+            fontCharCode = mapPrivateUseChars(charcode);
+            break;
+          }
+          fontCharCode = this.toFontChar[charcode] || charcode;
+          break;
+        case 'CIDFontType2':
+          if (this.noUnicodeAdaptation) {
+            width = this.widths[this.unicodeToCID[charcode] || charcode];
+            fontCharCode = mapPrivateUseChars(charcode);
+            break;
+          }
+          fontCharCode = this.toFontChar[charcode] || charcode;
+          break;
+        case 'Type1':
+          var glyphName = this.differences[charcode] || this.encoding[charcode];
+          if (!isNum(width))
+            width = this.widths[glyphName];
+          if (this.noUnicodeAdaptation) {
+            fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
+              charcode);
+            break;
+          }
+          fontCharCode = this.glyphNameMap[glyphName] ||
+            GlyphsUnicode[glyphName] || charcode;
+          break;
+        case 'Type3':
+          var glyphName = this.differences[charcode] || this.encoding[charcode];
+          operatorList = this.charProcOperatorList[glyphName];
+          fontCharCode = charcode;
+          break;
+        case 'TrueType':
+          if (this.useToFontChar) {
+            fontCharCode = this.toFontChar[charcode] || charcode;
+            break;
+          }
+          var glyphName = this.differences[charcode] || this.encoding[charcode];
+          if (!glyphName)
+            glyphName = Encodings.StandardEncoding[charcode];
+          if (!isNum(width))
+            width = this.widths[glyphName];
+          if (this.noUnicodeAdaptation) {
+            fontCharCode = GlyphsUnicode[glyphName] || charcode;
+            break;
+          }
+          if (!this.hasEncoding || this.isSymbolicFont) {
+            fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
+              charcode;
+            break;
+          }
+
+          // MacRoman encoding address by re-encoding the cmap table
+          fontCharCode = glyphName in this.glyphNameMap ?
+            this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
+          break;
+        default:
+          warn('Unsupported font type: ' + this.type);
+          break;
+      }
+
+      var unicodeChars = !('toUnicode' in this) ? charcode :
+        this.toUnicode[charcode] || charcode;
+      if (typeof unicodeChars === 'number')
+        unicodeChars = String.fromCharCode(unicodeChars);
+
+      width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
+      disabled = this.unicodeIsEnabled ?
+        !this.unicodeIsEnabled[fontCharCode] : false;
+
+      return {
+        fontChar: String.fromCharCode(fontCharCode),
+        unicode: unicodeChars,
+        width: width,
+        disabled: disabled,
+        operatorList: operatorList
+      };
+    },
+
+    charsToGlyphs: function Font_charsToGlyphs(chars) {
+      var charsCache = this.charsCache;
+      var glyphs;
+
+      // if we translated this string before, just grab it from the cache
+      if (charsCache) {
+        glyphs = charsCache[chars];
+        if (glyphs)
+          return glyphs;
+      }
+
+      // lazily create the translation cache
+      if (!charsCache)
+        charsCache = this.charsCache = Object.create(null);
+
+      glyphs = [];
+
+      if (this.wideChars) {
+        // composite fonts have multi-byte strings convert the string from
+        // single-byte to multi-byte
+        // XXX assuming CIDFonts are two-byte - later need to extract the
+        // correct byte encoding according to the PDF spec
+        var length = chars.length - 1; // looping over two bytes at a time so
+                                       // loop should never end on the last byte
+        for (var i = 0; i < length; i++) {
+          var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
+          var glyph = this.charToGlyph(charcode);
+          glyphs.push(glyph);
+          // placing null after each word break charcode (ASCII SPACE)
+          if (charcode == 0x20)
+            glyphs.push(null);
+        }
+      }
+      else {
+        for (var i = 0, ii = chars.length; i < ii; ++i) {
+          var charcode = chars.charCodeAt(i);
+          var glyph = this.charToGlyph(charcode);
+          glyphs.push(glyph);
+          if (charcode == 0x20)
+            glyphs.push(null);
+        }
+      }
+
+      // Enter the translated string into the cache
+      return (charsCache[chars] = glyphs);
+    }
+  };
+
+  return Font;
+})();
+
+/*
+ * Type1Parser encapsulate the needed code for parsing a Type1 font
+ * program. Some of its logic depends on the Type2 charstrings
+ * structure.
+ */
+var Type1Parser = function type1Parser() {
+  /*
+   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
+   * of Plaintext Bytes. The function took a key as a parameter which can be
+   * for decrypting the eexec block of for decoding charStrings.
+   */
+  var kEexecEncryptionKey = 55665;
+  var kCharStringsEncryptionKey = 4330;
+
+  function decrypt(stream, key, discardNumber) {
+    var r = key, c1 = 52845, c2 = 22719;
+    var decryptedString = [];
+
+    var value = '';
+    var count = stream.length;
+    for (var i = 0; i < count; i++) {
+      value = stream[i];
+      decryptedString[i] = value ^ (r >> 8);
+      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+    }
+    return decryptedString.slice(discardNumber);
+  }
+
+  /*
+   * CharStrings are encoded following the the CharString Encoding sequence
+   * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
+   * The value in a byte indicates a command, a number, or subsequent bytes
+   * that are to be interpreted in a special way.
+   *
+   * CharString Number Encoding:
+   *  A CharString byte containing the values from 32 through 255 inclusive
+   *  indicate an integer. These values are decoded in four ranges.
+   *
+   * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
+   * indicate the integer v - 139. Thus, the integer values from -107 through
+   * 107 inclusive may be encoded in single byte.
+   *
+   * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
+   * indicates an integer involving the next byte, w, according to the formula:
+   * [(v - 247) x 256] + w + 108
+   *
+   * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
+   * indicates an integer involving the next byte, w, according to the formula:
+   * -[(v - 251) * 256] - w - 108
+   *
+   * 4. A CharString containing the value 255 indicates that the next 4 bytes
+   * are a two complement signed integer. The first of these bytes contains the
+   * highest order bits, the second byte contains the next higher order bits
+   * and the fourth byte contain the lowest order bits.
+   *
+   *
+   * CharString Command Encoding:
+   *  CharStrings commands are encoded in 1 or 2 bytes.
+   *
+   *  Single byte commands are encoded in 1 byte that contains a value between
+   *  0 and 31 inclusive.
+   *  If a command byte contains the value 12, then the value in the next byte
+   *  indicates a command. This "escape" mechanism allows many extra commands
+   * to be encoded and this encoding technique helps to minimize the length of
+   * the charStrings.
+   */
+  var charStringDictionary = {
+    '1': 'hstem',
+    '3': 'vstem',
+    '4': 'vmoveto',
+    '5': 'rlineto',
+    '6': 'hlineto',
+    '7': 'vlineto',
+    '8': 'rrcurveto',
+
+    // closepath is a Type1 command that do not take argument and is useless
+    // in Type2 and it can simply be ignored.
+    '9': null, // closepath
+
+    '10': 'callsubr',
+
+    // return is normally used inside sub-routines to tells to the execution
+    // flow that it can be back to normal.
+    // During the translation process Type1 charstrings will be flattened and
+    // sub-routines will be embedded directly into the charstring directly, so
+    // this can be ignored safely.
+    '11': 'return',
+
+    '12': {
+      // dotsection is a Type1 command to specify some hinting feature for dots
+      // that do not take a parameter and it can safely be ignored for Type2.
+      '0': null, // dotsection
+
+      // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
+      // parameters, so instead of returning [vh]stem3 take a shortcut and
+      // return [vhstem] instead.
+      '1': 'vstem',
+      '2': 'hstem',
+
+      // Type1 only command with command not (yet) built-in ,throw an error
+      '6': -1, // seac
+      '7': -1, // sbw
+
+      '11': 'sub',
+      '12': 'div',
+
+      // callothersubr is a mechanism to make calls on the postscript
+      // interpreter, this is not supported by Type2 charstring but hopefully
+      // most of the default commands can be ignored safely.
+      '16': 'callothersubr',
+
+      '17': 'pop',
+
+      // setcurrentpoint sets the current point to x, y without performing a
+      // moveto (this is a one shot positionning command). This is used only
+      // with the return of an OtherSubrs call.
+      // TODO Implement the OtherSubrs charstring embedding and replace this
+      // call by a no-op, like 2 'pop' commands for example.
+      '33': null // setcurrentpoint
+    },
+    '13': 'hsbw',
+    '14': 'endchar',
+    '21': 'rmoveto',
+    '22': 'hmoveto',
+    '30': 'vhcurveto',
+    '31': 'hvcurveto'
+  };
+
+  var kEscapeCommand = 12;
+
+  function decodeCharString(array) {
+    var charstring = [];
+    var lsb = 0;
+    var width = 0;
+    var flexState = 0;
+
+    var value = '';
+    var count = array.length;
+    for (var i = 0; i < count; i++) {
+      value = array[i];
+
+      if (value < 32) {
+        var command = null;
+        if (value == kEscapeCommand) {
+          var escape = array[++i];
+
+          // TODO Clean this code
+          if (escape == 16) {
+            var index = charstring.pop();
+            var argc = charstring.pop();
+            for (var j = 0; j < argc; j++)
+              charstring.push('drop');
+
+            // If the flex mechanism is not used in a font program, Adobe
+            // states that entries 0, 1 and 2 can simply be replaced by
+            // {}, which means that we can simply ignore them.
+            if (index < 3) {
+              continue;
+            }
+
+            // This is the same things about hint replacement, if it is not used
+            // entry 3 can be replaced by {3}
+            // TODO support hint replacment
+            if (index == 3) {
+              charstring.push(3);
+              i++;
+              continue;
+            }
+          } else if (escape == 17 || escape == 33) {
+            // pop or setcurrentpoint commands can be ignored
+            // since we are not doing callothersubr
+            continue;
+          } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
+            charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
+            continue;
+          }
+
+          command = charStringDictionary['12'][escape];
+        } else {
+          // TODO Clean this code
+          if (value == 13) { // hsbw
+            if (charstring.length == 2) {
+              lsb = charstring[0];
+              width = charstring[1];
+              charstring.splice(0, 1);
+            } else if (charstring.length == 4 && charstring[3] == 'div') {
+              lsb = charstring[0];
+              width = charstring[1] / charstring[2];
+              charstring.splice(0, 1);
+            } else if (charstring.length == 4 && charstring[2] == 'div') {
+              lsb = charstring[0] / charstring[1];
+              width = charstring[3];
+              charstring.splice(0, 3);
+            } else {
+              error('Unsupported hsbw format: ' + charstring);
+            }
+
+            charstring.push(lsb, 'hmoveto');
+            continue;
+          } else if (value == 10) { // callsubr
+            if (charstring[charstring.length - 1] < 3) { // subr #0..2
+              var subrNumber = charstring.pop();
+              switch (subrNumber) {
+                case 1:
+                  flexState = 1; // prepare for flex coordinates
+                  break;
+                case 2:
+                  flexState = 2; // flex in progress
+                  break;
+                case 0:
+                  // type2 flex command does not need final coords
+                  charstring.push('exch', 'drop', 'exch', 'drop');
+                  charstring.push('flex');
+                  flexState = 0;
+                  break;
+              }
+              continue;
+            }
+          } else if (value == 21 && flexState > 0) {
+            if (flexState > 1)
+              continue; // ignoring rmoveto
+            value = 5; // first segment replacing with rlineto
+          } else if (!kHintingEnabled && (value == 1 || value == 3)) {
+            charstring.push('drop', 'drop');
+            continue;
+          }
+          command = charStringDictionary[value];
+        }
+
+        // Some charstring commands are meaningless in Type2 and will return
+        // a null, let's just ignored them
+        if (!command && i < count) {
+          continue;
+        } else if (!command) {
+          break;
+        } else if (command == -1) {
+          warn('Support for Type1 command ' + value +
+                ' (' + escape + ') is not implemented in charstring: ' +
+                charstring);
+          if (value == 12) {
+            // we know how to ignore only some the Type1 commands
+            switch (escape) {
+              case 7:
+                charstring.push('drop', 'drop', 'drop', 'drop');
+                continue;
+              case 8:
+                charstring.push('drop');
+                continue;
+            }
+          }
+        }
+
+        value = command;
+      } else if (value <= 246) {
+        value = value - 139;
+      } else if (value <= 250) {
+        value = ((value - 247) * 256) + array[++i] + 108;
+      } else if (value <= 254) {
+        value = -((value - 251) * 256) - array[++i] - 108;
+      } else {
+        value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
+                (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
+      }
+
+      charstring.push(value);
+    }
+
+    return { charstring: charstring, width: width, lsb: lsb };
+  }
+
+  /*
+   * Returns an object containing a Subrs array and a CharStrings
+   * array extracted from and eexec encrypted block of data
+   */
+  function readNumberArray(str, index) {
+    var start = index;
+    while (str[index++] != '[')
+      start++;
+    start++;
+
+    var count = 0;
+    while (str[index++] != ']')
+      count++;
+
+    str = str.substr(start, count);
+
+    str = str.trim();
+    // Remove adjacent spaces
+    str = str.replace(/\s+/g, ' ');
+
+    var array = str.split(' ');
+    for (var i = 0, ii = array.length; i < ii; i++)
+      array[i] = parseFloat(array[i] || 0);
+    return array;
+  }
+
+  function readNumber(str, index) {
+    while (str[index] == ' ')
+      index++;
+
+    var start = index;
+
+    var count = 0;
+    while (str[index++] != ' ')
+      count++;
+
+    return parseFloat(str.substr(start, count) || 0);
+  }
+
+  function isSeparator(c) {
+    return c == ' ' || c == '\n' || c == '\x0d';
+  }
+
+  this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
+    var eexec = decrypt(stream, kEexecEncryptionKey, 4);
+    var eexecStr = '';
+    for (var i = 0, ii = eexec.length; i < ii; i++)
+      eexecStr += String.fromCharCode(eexec[i]);
+
+    var glyphsSection = false, subrsSection = false;
+    var program = {
+      subrs: [],
+      charstrings: [],
+      properties: {
+        'privateData': {
+          'lenIV': 4
+        }
+      }
+    };
+
+    var glyph = '';
+    var token = '';
+    var length = 0;
+
+    var c = '';
+    var count = eexecStr.length;
+    for (var i = 0; i < count; i++) {
+      var getToken = function getToken() {
+        while (i < count && isSeparator(eexecStr[i]))
+          ++i;
+
+        var token = '';
+        while (i < count && !isSeparator(eexecStr[i]))
+          token += eexecStr[i++];
+
+        return token;
+      };
+      var c = eexecStr[i];
+
+      if ((glyphsSection || subrsSection) &&
+          (token == 'RD' || token == '-|')) {
+        i++;
+        var data = eexec.slice(i, i + length);
+        var lenIV = program.properties.privateData['lenIV'];
+        var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+        var str = decodeCharString(encoded);
+
+        if (glyphsSection) {
+          program.charstrings.push({
+            glyph: glyph,
+            data: str.charstring,
+            lsb: str.lsb,
+            width: str.width
+          });
+        } else {
+          program.subrs.push(str.charstring);
+        }
+        i += length;
+        token = '';
+      } else if (isSeparator(c)) {
+        length = parseInt(token, 10);
+        token = '';
+      } else {
+        token += c;
+        if (!glyphsSection) {
+          switch (token) {
+            case '/CharString':
+              glyphsSection = true;
+              break;
+            case '/Subrs':
+              ++i;
+              var num = parseInt(getToken(), 10);
+              getToken(); // read in 'array'
+              for (var j = 0; j < num; ++j) {
+                var t = getToken(); // read in 'dup'
+                if (t == 'ND' || t == '|-' || t == 'noaccess')
+                  break;
+                var index = parseInt(getToken(), 10);
+                if (index > j)
+                  j = index;
+                var length = parseInt(getToken(), 10);
+                getToken(); // read in 'RD'
+                var data = eexec.slice(i + 1, i + 1 + length);
+                var lenIV = program.properties.privateData['lenIV'];
+                var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
+                var str = decodeCharString(encoded);
+                i = i + 1 + length;
+                t = getToken(); // read in 'NP'
+                if (t == 'noaccess')
+                  getToken(); // read in 'put'
+                program.subrs[index] = str.charstring;
+              }
+              break;
+            case '/BlueValues':
+            case '/OtherBlues':
+            case '/FamilyBlues':
+            case '/FamilyOtherBlues':
+            case '/StemSnapH':
+            case '/StemSnapV':
+              program.properties.privateData[token.substring(1)] =
+                readNumberArray(eexecStr, i + 1);
+              break;
+            case '/StdHW':
+            case '/StdVW':
+              program.properties.privateData[token.substring(1)] =
+                readNumberArray(eexecStr, i + 2)[0];
+              break;
+            case '/BlueShift':
+            case '/lenIV':
+            case '/BlueFuzz':
+            case '/BlueScale':
+            case '/LanguageGroup':
+            case '/ExpansionFactor':
+              program.properties.privateData[token.substring(1)] =
+                readNumber(eexecStr, i + 1);
+              break;
+          }
+        } else if (c == '/') {
+          token = glyph = '';
+          while ((c = eexecStr[++i]) != ' ')
+            glyph += c;
+        }
+      }
+    }
+
+    return program;
+  };
+
+  this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
+                                                                  properties) {
+    var headerString = '';
+    for (var i = 0, ii = stream.length; i < ii; i++)
+      headerString += String.fromCharCode(stream[i]);
+
+    var token = '';
+    var count = headerString.length;
+    for (var i = 0; i < count; i++) {
+      var getToken = function getToken() {
+        var character = headerString[i];
+        while (i < count && (isSeparator(character) || character == '/'))
+          character = headerString[++i];
+
+        var token = '';
+        while (i < count && !(isSeparator(character) || character == '/')) {
+          token += character;
+          character = headerString[++i];
+        }
+
+        return token;
+      };
+
+      var c = headerString[i];
+      if (isSeparator(c)) {
+        switch (token) {
+          case '/FontMatrix':
+            var matrix = readNumberArray(headerString, i + 1);
+
+            // The FontMatrix is in unitPerEm, so make it pixels
+            for (var j = 0, jj = matrix.length; j < jj; j++)
+              matrix[j] *= 1000;
+
+            // Make the angle into the right direction
+            matrix[2] *= -1;
+
+            properties.fontMatrix = matrix;
+            break;
+          case '/Encoding':
+            var encodingArg = getToken();
+            var encoding;
+            if (!/^\d+$/.test(encodingArg)) {
+              // encoding name is specified
+              encoding = Encodings[encodingArg];
+            } else {
+              encoding = [];
+              var size = parseInt(encodingArg, 10);
+              getToken(); // read in 'array'
+
+              for (var j = 0; j < size; j++) {
+                var token = getToken();
+                if (token == 'dup') {
+                  var index = parseInt(getToken(), 10);
+                  var glyph = getToken();
+                  encoding[index] = glyph;
+                  getToken(); // read the in 'put'
+                }
+              }
+            }
+            if (!properties.hasEncoding && encoding) {
+              properties.baseEncoding = encoding;
+              break;
+            }
+            break;
+        }
+        token = '';
+      } else {
+        token += c;
+      }
+    }
+  };
+};
+
+/**
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
+ */
+var CFFStandardStrings = [
+  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
+  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
+  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
+  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
+  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
+  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
+  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
+  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
+  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
+  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
+  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
+  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
+  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
+  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
+  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
+  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
+  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
+  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
+  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
+  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
+  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
+  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
+  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
+  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
+  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
+  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
+  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
+  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
+  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
+  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
+  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
+  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
+  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
+  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
+  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
+  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
+  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
+  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
+  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
+  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
+  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
+];
+
+var type1Parser = new Type1Parser();
+
+// Type1Font is also a CIDFontType0.
+var Type1Font = function Type1Font(name, file, properties) {
+  // Get the data block containing glyphs and subrs informations
+  var headerBlock = file.getBytes(properties.length1);
+  type1Parser.extractFontHeader(headerBlock, properties);
+
+  // Decrypt the data blocks and retrieve it's content
+  var eexecBlock = file.getBytes(properties.length2);
+  var data = type1Parser.extractFontProgram(eexecBlock);
+  for (var info in data.properties)
+    properties[info] = data.properties[info];
+
+  var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
+  var type2Charstrings = this.getType2Charstrings(charstrings);
+  var subrs = this.getType2Subrs(data.subrs);
+
+  this.charstrings = charstrings;
+  this.data = this.wrap(name, type2Charstrings, this.charstrings,
+                        subrs, properties);
+};
+
+Type1Font.prototype = {
+  createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
+                                                                isByte) {
+    // First 2 bytes contains the number of objects contained into this index
+    var count = objects.length;
+
+    // If there is no object, just create an array saying that with another
+    // offset byte.
+    if (count == 0)
+      return '\x00\x00\x00';
+
+    var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
+
+    // Next byte contains the offset size use to reference object in the file
+    // Actually we're using 0x04 to be sure to be able to store everything
+    // without thinking of it while coding.
+    data += '\x04';
+
+    // Add another offset after this one because we need a new offset
+    var relativeOffset = 1;
+    for (var i = 0; i < count + 1; i++) {
+      data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
+                                  (relativeOffset >> 16) & 0xFF,
+                                  (relativeOffset >> 8) & 0xFF,
+                                  relativeOffset & 0xFF);
+
+      if (objects[i])
+        relativeOffset += objects[i].length;
+    }
+
+    for (var i = 0; i < count; i++) {
+      for (var j = 0, jj = objects[i].length; j < jj; j++)
+        data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
+                objects[i][j];
+    }
+    return data;
+  },
+
+  encodeNumber: function Type1Font_encodeNumber(value) {
+    // some of the fonts has ouf-of-range values
+    // they are just arithmetic overflows
+    // make sanitizer happy
+    value |= 0;
+    if (value >= -32768 && value <= 32767) {
+      return '\x1c' +
+             String.fromCharCode((value >> 8) & 0xFF) +
+             String.fromCharCode(value & 0xFF);
+    } else {
+      return '\x1d' +
+             String.fromCharCode((value >> 24) & 0xFF) +
+             String.fromCharCode((value >> 16) & 0xFF) +
+             String.fromCharCode((value >> 8) & 0xFF) +
+             String.fromCharCode(value & 0xFF);
+    }
+  },
+
+  getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
+                                                            properties) {
+    var charstrings = [];
+    var i, length, glyphName;
+    var unusedUnicode = kCmapGlyphOffset;
+    for (i = 0, length = glyphs.length; i < length; i++) {
+      var item = glyphs[i];
+      var glyphName = item.glyph;
+      var unicode = glyphName in GlyphsUnicode ?
+        GlyphsUnicode[glyphName] : unusedUnicode++;
+      charstrings.push({
+        glyph: glyphName,
+        unicode: unicode,
+        gid: i,
+        charstring: item.data,
+        width: item.width,
+        lsb: item.lsb
+      });
+    }
+
+    charstrings.sort(function charstrings_sort(a, b) {
+      return a.unicode - b.unicode;
+    });
+    return charstrings;
+  },
+
+  getType2Charstrings: function Type1Font_getType2Charstrings(
+                                  type1Charstrings) {
+    var type2Charstrings = [];
+    var count = type1Charstrings.length;
+    for (var i = 0; i < count; i++) {
+      var charstring = type1Charstrings[i].charstring;
+      type2Charstrings.push(this.flattenCharstring(charstring.slice(),
+                                                   this.commandsMap));
+    }
+    return type2Charstrings;
+  },
+
+  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
+    var bias = 0;
+    var count = type1Subrs.length;
+    if (count < 1240)
+      bias = 107;
+    else if (count < 33900)
+      bias = 1131;
+    else
+      bias = 32768;
+
+    // Add a bunch of empty subrs to deal with the Type2 bias
+    var type2Subrs = [];
+    for (var i = 0; i < bias; i++)
+      type2Subrs.push([0x0B]);
+
+    for (var i = 0; i < count; i++) {
+      var subr = type1Subrs[i];
+      if (!subr)
+        subr = [0x0B];
+
+      type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
+    }
+
+    return type2Subrs;
+  },
+
+  /*
+   * Flatten the commands by interpreting the postscript code and replacing
+   * every 'callsubr', 'callothersubr' by the real commands.
+   */
+  commandsMap: {
+    'hstem': 1,
+    'vstem': 3,
+    'vmoveto': 4,
+    'rlineto': 5,
+    'hlineto': 6,
+    'vlineto': 7,
+    'rrcurveto': 8,
+    'callsubr': 10,
+    'return': 11,
+    'sub': [12, 11],
+    'div': [12, 12],
+    'exch': [12, 28],
+    'flex': [12, 35],
+    'drop' : [12, 18],
+    'endchar': 14,
+    'rmoveto': 21,
+    'hmoveto': 22,
+    'vhcurveto': 30,
+    'hvcurveto': 31
+  },
+
+  flattenCharstring: function Type1Font_flattenCharstring(charstring, map) {
+    // charstring changes size - can't cache .length in loop
+    for (var i = 0; i < charstring.length; i++) {
+      var command = charstring[i];
+      if (command.charAt) {
+        var cmd = map[command];
+        assert(cmd, 'Unknow command: ' + command);
+
+        if (isArray(cmd))
+          charstring.splice(i++, 1, cmd[0], cmd[1]);
+        else
+          charstring[i] = cmd;
+      } else {
+        // Type1 charstring use a division for number above 32000
+        if (command > 32000) {
+          var divisor = charstring[i + 1];
+          command /= divisor;
+          charstring.splice(i, 3, 28, command >> 8, command & 0xff);
+        } else {
+          charstring.splice(i, 1, 28, command >> 8, command & 0xff);
+        }
+        i += 2;
+      }
+    }
+    return charstring;
+  },
+
+  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
+    var fields = {
+      // major version, minor version, header size, offset size
+      'header': '\x01\x00\x04\x04',
+
+      'names': this.createCFFIndexHeader([name]),
+
+      'topDict': (function topDict(self) {
+        return function cffWrapTopDict() {
+          var header = '\x00\x01\x01\x01';
+          var dict =
+              '\xf8\x1b\x00' + // version
+              '\xf8\x1c\x01' + // Notice
+              '\xf8\x1d\x02' + // FullName
+              '\xf8\x1e\x03' + // FamilyName
+              '\xf8\x1f\x04' +  // Weight
+              '\x1c\x00\x00\x10'; // Encoding
+
+          var boundingBox = properties.bbox;
+          for (var i = 0, ii = boundingBox.length; i < ii; i++)
+            dict += self.encodeNumber(boundingBox[i]);
+          dict += '\x05'; // FontBBox;
+
+          var offset = fields.header.length +
+                       fields.names.length +
+                       (header.length + 1) +
+                       (dict.length + (4 + 4)) +
+                       fields.strings.length +
+                       fields.globalSubrs.length;
+
+          // If the offset if over 32767, encodeNumber is going to return
+          // 5 bytes to encode the position instead of 3.
+          if ((offset + fields.charstrings.length) > 32767) {
+            offset += 9;
+          } else {
+            offset += 7;
+          }
+
+          dict += self.encodeNumber(offset) + '\x0f'; // Charset
+
+          offset = offset + (glyphs.length * 2) + 1;
+          dict += self.encodeNumber(offset) + '\x11'; // Charstrings
+
+          offset = offset + fields.charstrings.length;
+          dict += self.encodeNumber(fields.privateData.length);
+          dict += self.encodeNumber(offset) + '\x12'; // Private
+
+          return header + String.fromCharCode(dict.length + 1) + dict;
+        };
+      })(this),
+
+      'strings': (function strings(self) {
+        var strings = [
+          'Version 0.11',         // Version
+          'See original notice',  // Notice
+          name,                   // FullName
+          name,                   // FamilyName
+          'Medium'                // Weight
+        ];
+        return self.createCFFIndexHeader(strings);
+      })(this),
+
+      'globalSubrs': this.createCFFIndexHeader([]),
+
+      'charset': (function charset(self) {
+        var charsetString = '\x00'; // Encoding
+
+        var count = glyphs.length;
+        for (var i = 0; i < count; i++) {
+          var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
+          // Some characters like asterikmath && circlecopyrt are
+          // missing from the original strings, for the moment let's
+          // map them to .notdef and see later if it cause any
+          // problems
+          if (index == -1)
+            index = 0;
+
+          charsetString += String.fromCharCode(index >> 8, index & 0xff);
+        }
+        return charsetString;
+      })(this),
+
+      'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
+                                               true),
+
+      'privateData': (function cffWrapPrivate(self) {
+        var data =
+            '\x8b\x14' + // defaultWidth
+            '\x8b\x15';  // nominalWidth
+        var fieldMap = {
+          BlueValues: '\x06',
+          OtherBlues: '\x07',
+          FamilyBlues: '\x08',
+          FamilyOtherBlues: '\x09',
+          StemSnapH: '\x0c\x0c',
+          StemSnapV: '\x0c\x0d',
+          BlueShift: '\x0c\x0a',
+          BlueFuzz: '\x0c\x0b',
+          BlueScale: '\x0c\x09',
+          LanguageGroup: '\x0c\x11',
+          ExpansionFactor: '\x0c\x18'
+        };
+        for (var field in fieldMap) {
+          if (!properties.privateData.hasOwnProperty(field))
+            continue;
+          var value = properties.privateData[field];
+
+          if (isArray(value)) {
+            data += self.encodeNumber(value[0]);
+            for (var i = 1, ii = value.length; i < ii; i++)
+              data += self.encodeNumber(value[i] - value[i - 1]);
+          } else {
+            data += self.encodeNumber(value);
+          }
+          data += fieldMap[field];
+        }
+
+        data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
+
+        return data;
+      })(this),
+
+      'localSubrs': this.createCFFIndexHeader(subrs, true)
+    };
+    fields.topDict = fields.topDict();
+
+
+    var cff = [];
+    for (var index in fields) {
+      var field = fields[index];
+      for (var i = 0, ii = field.length; i < ii; i++)
+        cff.push(field.charCodeAt(i));
+    }
+
+    return cff;
+  }
+};
+
+var CFFFont = (function CFFFontClosure() {
+  function CFFFont(file, properties) {
+    this.properties = properties;
+
+    var parser = new CFFParser(file, properties);
+    var cff = parser.parse();
+    var compiler = new CFFCompiler(cff);
+    this.readExtra(cff);
+    try {
+      this.data = compiler.compile();
+    } catch (e) {
+      warn('Failed to compile font ' + properties.loadedName);
+      // There may have just been an issue with the compiler, set the data
+      // anyway and hope the font loaded.
+      this.data = file;
+    }
+  }
+
+  CFFFont.prototype = {
+    readExtra: function CFFFont_readExtra(cff) {
+      // charstrings contains info about glyphs (one element per glyph
+      // containing mappings for {unicode, width})
+      var charset = cff.charset.charset;
+      var encoding = cff.encoding ? cff.encoding.encoding : null;
+      var charstrings = this.getCharStrings(charset, encoding);
+
+      // create the mapping between charstring and glyph id
+      var glyphIds = [];
+      for (var i = 0, ii = charstrings.length; i < ii; i++)
+        glyphIds.push(charstrings[i].gid);
+
+      this.charstrings = charstrings;
+      this.glyphIds = glyphIds;
+    },
+    getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
+      var charstrings = [];
+      var unicodeUsed = [];
+      var unassignedUnicodeItems = [];
+      var inverseEncoding = [];
+      // CID fonts don't have an encoding.
+      if (encoding !== null)
+        for (var charcode in encoding)
+          inverseEncoding[encoding[charcode]] = charcode | 0;
+      else
+        inverseEncoding = charsets;
+      for (var i = 0, ii = charsets.length; i < ii; i++) {
+        var glyph = charsets[i];
+        if (glyph == '.notdef')
+          continue;
+
+        var code = inverseEncoding[i];
+        if (!code || isSpecialUnicode(code)) {
+          unassignedUnicodeItems.push(i);
+          continue;
+        }
+        charstrings.push({
+          unicode: code,
+          code: code,
+          gid: i,
+          glyph: glyph
+        });
+        unicodeUsed[code] = true;
+      }
+
+      var nextUnusedUnicode = kCmapGlyphOffset;
+      for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
+        var i = unassignedUnicodeItems[j];
+        // giving unicode value anyway
+        while (nextUnusedUnicode in unicodeUsed)
+          nextUnusedUnicode++;
+        var unicode = nextUnusedUnicode++;
+        charstrings.push({
+          unicode: unicode,
+          code: inverseEncoding[i] || 0,
+          gid: i,
+          glyph: charsets[i]
+        });
+      }
+
+      // sort the array by the unicode value (again)
+      charstrings.sort(function getCharStringsSort(a, b) {
+        return a.unicode - b.unicode;
+      });
+      return charstrings;
+    }
+  };
+
+  return CFFFont;
+})();
+
+var CFFParser = (function CFFParserClosure() {
+  function CFFParser(file, properties) {
+    this.bytes = file.getBytes();
+    this.properties = properties;
+  }
+  CFFParser.prototype = {
+    parse: function CFFParser_parse() {
+      var properties = this.properties;
+      var cff = new CFF();
+      this.cff = cff;
+
+      // The first five sections must be in order, all the others are reached
+      // via offsets contained in one of the below.
+      var header = this.parseHeader();
+      var nameIndex = this.parseIndex(header.endPos);
+      var topDictIndex = this.parseIndex(nameIndex.endPos);
+      var stringIndex = this.parseIndex(topDictIndex.endPos);
+      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
+
+      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+
+      cff.header = header.obj;
+      cff.names = this.parseNameIndex(nameIndex.obj);
+      cff.strings = this.parseStringIndex(stringIndex.obj);
+      cff.topDict = topDict;
+      cff.globalSubrIndex = globalSubrIndex.obj;
+
+      this.parsePrivateDict(cff.topDict);
+
+      cff.isCIDFont = topDict.hasName('ROS');
+
+      var charStringOffset = topDict.getByName('CharStrings');
+      cff.charStrings = this.parseCharStrings(charStringOffset);
+
+      var charset, encoding;
+      if (cff.isCIDFont) {
+        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
+        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+          var dictRaw = fdArrayIndex.get(i);
+          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
+                                         cff.strings);
+          this.parsePrivateDict(fontDict);
+          cff.fdArray.push(fontDict);
+        }
+        // cid fonts don't have an encoding
+        encoding = null;
+        charset = this.parseCharsets(topDict.getByName('charset'),
+                                     cff.charStrings.count, cff.strings, true);
+        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
+                                             cff.charStrings.count);
+      } else {
+        charset = this.parseCharsets(topDict.getByName('charset'),
+                                     cff.charStrings.count, cff.strings, false);
+        encoding = this.parseEncoding(topDict.getByName('Encoding'),
+                                      properties,
+                                      cff.strings, charset.charset);
+      }
+      cff.charset = charset;
+      cff.encoding = encoding;
+
+      return cff;
+    },
+    parseHeader: function CFFParser_parseHeader() {
+      var bytes = this.bytes;
+      var offset = 0;
+
+      while (bytes[offset] != 1)
+        ++offset;
+
+      if (offset != 0) {
+        warn('cff data is shifted');
+        bytes = bytes.subarray(offset);
+        this.bytes = bytes;
+      }
+      var major = bytes[0];
+      var minor = bytes[1];
+      var hdrSize = bytes[2];
+      var offSize = bytes[3];
+      var header = new CFFHeader(major, minor, hdrSize, offSize);
+      return {obj: header, endPos: hdrSize};
+    },
+    parseDict: function CFFParser_parseDict(dict) {
+      var pos = 0;
+
+      function parseOperand() {
+        var value = dict[pos++];
+        if (value === 30) {
+          return parseFloatOperand(pos);
+        } else if (value === 28) {
+          value = dict[pos++];
+          value = (value << 8) | dict[pos++];
+          return value;
+        } else if (value === 29) {
+          value = dict[pos++];
+          value = (value << 8) | dict[pos++];
+          value = (value << 8) | dict[pos++];
+          value = (value << 8) | dict[pos++];
+          return value;
+        } else if (value >= 32 && value <= 246) {
+          return value - 139;
+        } else if (value >= 247 && value <= 250) {
+          return ((value - 247) * 256) + dict[pos++] + 108;
+        } else if (value >= 251 && value <= 254) {
+          return -((value - 251) * 256) - dict[pos++] - 108;
+        } else {
+          error('255 is not a valid DICT command');
+        }
+        return -1;
+      }
+
+      function parseFloatOperand() {
+        var str = '';
+        var eof = 15;
+        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
+            '9', '.', 'E', 'E-', null, '-'];
+        var length = dict.length;
+        while (pos < length) {
+          var b = dict[pos++];
+          var b1 = b >> 4;
+          var b2 = b & 15;
+
+          if (b1 == eof)
+            break;
+          str += lookup[b1];
+
+          if (b2 == eof)
+            break;
+          str += lookup[b2];
+        }
+        return parseFloat(str);
+      }
+
+      var operands = [];
+      var entries = [];
+
+      var pos = 0;
+      var end = dict.length;
+      while (pos < end) {
+        var b = dict[pos];
+        if (b <= 21) {
+          if (b === 12)
+            b = (b << 8) | dict[++pos];
+          entries.push([b, operands]);
+          operands = [];
+          ++pos;
+        } else {
+          operands.push(parseOperand());
+        }
+      }
+      return entries;
+    },
+    parseIndex: function CFFParser_parseIndex(pos) {
+      var cffIndex = new CFFIndex();
+      var bytes = this.bytes;
+      var count = (bytes[pos++] << 8) | bytes[pos++];
+      var offsets = [];
+      var start = pos;
+      var end = pos;
+
+      if (count != 0) {
+        var offsetSize = bytes[pos++];
+        // add 1 for offset to determine size of last object
+        var startPos = pos + ((count + 1) * offsetSize) - 1;
+
+        for (var i = 0, ii = count + 1; i < ii; ++i) {
+          var offset = 0;
+          for (var j = 0; j < offsetSize; ++j) {
+            offset <<= 8;
+            offset += bytes[pos++];
+          }
+          offsets.push(startPos + offset);
+        }
+        end = offsets[count];
+      }
+      for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
+        var offsetStart = offsets[i];
+        var offsetEnd = offsets[i + 1];
+        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+      }
+      return {obj: cffIndex, endPos: end};
+    },
+    parseNameIndex: function CFFParser_parseNameIndex(index) {
+      var names = [];
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var name = index.get(i);
+        // OTS doesn't allow names to be over 127 characters.
+        var length = Math.min(name.length, 127);
+        var data = [];
+        // OTS also only permits certain characters in the name.
+        for (var j = 0; j < length; ++j) {
+          var c = name[j];
+          if (j === 0 && c === 0) {
+            data[j] = c;
+            continue;
+          }
+          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
+              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
+              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
+              c === 47 /* / */ || c === 37 /* % */) {
+            data[j] = 95;
+            continue;
+          }
+          data[j] = c;
+        }
+        names.push(String.fromCharCode.apply(null, data));
+      }
+      return names;
+    },
+    parseStringIndex: function CFFParser_parseStringIndex(index) {
+      var strings = new CFFStrings();
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var data = index.get(i);
+        strings.add(String.fromCharCode.apply(null, data));
+      }
+      return strings;
+    },
+    createDict: function CFFParser_createDict(type, dict, strings) {
+      var cffDict = new type(strings);
+      var types = cffDict.types;
+
+      for (var i = 0, ii = dict.length; i < ii; ++i) {
+        var pair = dict[i];
+        var key = pair[0];
+        var value = pair[1];
+        cffDict.setByKey(key, value);
+      }
+      return cffDict;
+    },
+    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
+      var charStrings = this.parseIndex(charStringOffset).obj;
+      // The CFF specification state that the 'dotsection' command
+      // (12, 0) is deprecated and treated as a no-op, but all Type2
+      // charstrings processors should support them. Unfortunately
+      // the font sanitizer don't. As a workaround the sequence (12, 0)
+      // is replaced by a useless (0, hmoveto).
+      var count = charStrings.count;
+      for (var i = 0; i < count; i++) {
+        var charstring = charStrings.get(i);
+
+        var data = charstring;
+        var length = data.length;
+        for (var j = 0; j <= length; j) {
+          var value = data[j++];
+          if (value == 12 && data[j++] == 0) {
+              data[j - 2] = 139;
+              data[j - 1] = 22;
+          } else if (value === 28) {
+            j += 2;
+          } else if (value >= 247 && value <= 254) {
+            j++;
+          } else if (value == 255) {
+            j += 4;
+          }
+        }
+      }
+      return charStrings;
+    },
+    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
+      // no private dict, do nothing
+      if (!parentDict.hasName('Private'))
+        return;
+      var privateOffset = parentDict.getByName('Private');
+      // make sure the params are formatted correctly
+      if (!isArray(privateOffset) || privateOffset.length !== 2) {
+        parentDict.removeByName('Private');
+        return;
+      }
+      var size = privateOffset[0];
+      var offset = privateOffset[1];
+      // remove empty dicts or ones that refer to invalid location
+      if (size === 0 || offset >= this.bytes.length) {
+        parentDict.removeByName('Private');
+        return;
+      }
+
+      var privateDictEnd = offset + size;
+      var dictData = this.bytes.subarray(offset, privateDictEnd);
+      var dict = this.parseDict(dictData);
+      var privateDict = this.createDict(CFFPrivateDict, dict,
+                                        parentDict.strings);
+      parentDict.privateDict = privateDict;
+
+      // Parse the Subrs index also since it's relative to the private dict.
+      if (!privateDict.getByName('Subrs'))
+        return;
+      var subrsOffset = privateDict.getByName('Subrs');
+      var relativeOffset = offset + subrsOffset;
+      // Validate the offset.
+      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+        privateDict.removeByName('Subrs');
+        return;
+      }
+      var subrsIndex = this.parseIndex(relativeOffset);
+      privateDict.subrsIndex = subrsIndex.obj;
+    },
+    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
+      if (pos == 0) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
+                              ISOAdobeCharset);
+      } else if (pos == 1) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
+                              ExpertCharset);
+      } else if (pos == 2) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
+                              ExpertSubsetCharset);
+      }
+
+      var bytes = this.bytes;
+      var start = pos;
+      var format = bytes[pos++];
+      var charset = ['.notdef'];
+
+      // subtract 1 for the .notdef glyph
+      length -= 1;
+
+      switch (format) {
+        case 0:
+          for (var i = 0; i < length; i++) {
+            var id = (bytes[pos++] << 8) | bytes[pos++];
+            charset.push(cid ? id : strings.get(id));
+          }
+          break;
+        case 1:
+          while (charset.length <= length) {
+            var id = (bytes[pos++] << 8) | bytes[pos++];
+            var count = bytes[pos++];
+            for (var i = 0; i <= count; i++)
+              charset.push(cid ? id++ : strings.get(id++));
+          }
+          break;
+        case 2:
+          while (charset.length <= length) {
+            var id = (bytes[pos++] << 8) | bytes[pos++];
+            var count = (bytes[pos++] << 8) | bytes[pos++];
+            for (var i = 0; i <= count; i++)
+              charset.push(cid ? id++ : strings.get(id++));
+          }
+          break;
+        default:
+          error('Unknown charset format');
+      }
+      // Raw won't be needed if we actually compile the charset.
+      var end = pos;
+      var raw = bytes.subarray(start, end);
+
+      return new CFFCharset(false, format, charset, raw);
+    },
+    parseEncoding: function CFFParser_parseEncoding(pos,
+                                                    properties,
+                                                    strings,
+                                                    charset) {
+      var encoding = {};
+      var bytes = this.bytes;
+      var predefined = false;
+      var hasSupplement = false;
+      var format;
+      var raw = null;
+
+      function readSupplement() {
+        var supplementsCount = bytes[pos++];
+        for (var i = 0; i < supplementsCount; i++) {
+          var code = bytes[pos++];
+          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+          encoding[code] = properties.differences.indexOf(strings.get(sid));
+        }
+      }
+
+      if (pos == 0 || pos == 1) {
+        predefined = true;
+        format = pos;
+        var gid = 1;
+        var baseEncoding = pos ? Encodings.ExpertEncoding :
+                                 Encodings.StandardEncoding;
+        for (var i = 0, ii = charset.length; i < ii; i++) {
+          var index = baseEncoding.indexOf(charset[i]);
+          if (index != -1)
+            encoding[index] = gid++;
+        }
+      } else {
+        var dataStart = pos;
+        var format = bytes[pos++];
+        switch (format & 0x7f) {
+          case 0:
+            var glyphsCount = bytes[pos++];
+            for (var i = 1; i <= glyphsCount; i++)
+              encoding[bytes[pos++]] = i;
+            break;
+
+          case 1:
+            var rangesCount = bytes[pos++];
+            var gid = 1;
+            for (var i = 0; i < rangesCount; i++) {
+              var start = bytes[pos++];
+              var left = bytes[pos++];
+              for (var j = start; j <= start + left; j++)
+                encoding[j] = gid++;
+            }
+            break;
+
+          default:
+            error('Unknow encoding format: ' + format + ' in CFF');
+            break;
+        }
+        var dataEnd = pos;
+        if (format & 0x80) {
+          // The font sanitizer does not support CFF encoding with a
+          // supplement, since the encoding is not really used to map
+          // between gid to glyph, let's overwrite what is declared in
+          // the top dictionary to let the sanitizer think the font use
+          // StandardEncoding, that's a lie but that's ok.
+          bytes[dataStart] &= 0x7f;
+          readSupplement();
+          hasSupplement = true;
+        }
+        raw = bytes.subarray(dataStart, dataEnd);
+      }
+      format = format & 0x7f;
+      return new CFFEncoding(predefined, format, encoding, raw);
+    },
+    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
+      var start = pos;
+      var bytes = this.bytes;
+      var format = bytes[pos++];
+      var fdSelect = [];
+      switch (format) {
+        case 0:
+          for (var i = 0; i < length; ++i) {
+            var id = bytes[pos++];
+            fdSelect.push(id);
+          }
+          break;
+        case 3:
+          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
+          for (var i = 0; i < rangesCount; ++i) {
+            var first = (bytes[pos++] << 8) | bytes[pos++];
+            var fdIndex = bytes[pos++];
+            var next = (bytes[pos] << 8) | bytes[pos + 1];
+            for (var j = first; j < next; ++j)
+              fdSelect.push(fdIndex);
+          }
+          // Advance past the sentinel(next).
+          pos += 2;
+          break;
+        default:
+          error('Unknown fdselect format ' + format);
+          break;
+      }
+      var end = pos;
+      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
+    }
+  };
+  return CFFParser;
+})();
+
+// Compact Font Format
+var CFF = (function CFFClosure() {
+  function CFF() {
+    this.header = null;
+    this.names = [];
+    this.topDict = null;
+    this.strings = new CFFStrings();
+    this.globalSubrIndex = null;
+
+    // The following could really be per font, but since we only have one font
+    // store them here.
+    this.encoding = null;
+    this.charset = null;
+    this.charStrings = null;
+    this.fdArray = [];
+    this.fdSelect = null;
+
+    this.isCIDFont = false;
+  }
+  return CFF;
+})();
+
+var CFFHeader = (function CFFHeaderClosure() {
+  function CFFHeader(major, minor, hdrSize, offSize) {
+    this.major = major;
+    this.minor = minor;
+    this.hdrSize = hdrSize;
+    this.offSize = offSize;
+  }
+  return CFFHeader;
+})();
+
+var CFFStrings = (function CFFStringsClosure() {
+  function CFFStrings() {
+    this.strings = [];
+  }
+  CFFStrings.prototype = {
+    get: function CFFStrings_get(index) {
+      if (index >= 0 && index <= 390)
+        return CFFStandardStrings[index];
+      if (index - 391 <= this.strings.length)
+        return this.strings[index - 391];
+      return CFFStandardStrings[0];
+    },
+    add: function CFFStrings_add(value) {
+      this.strings.push(value);
+    },
+    get count() {
+      return this.strings.length;
+    }
+  };
+  return CFFStrings;
+})();
+
+var CFFIndex = (function CFFIndexClosure() {
+  function CFFIndex() {
+    this.objects = [];
+    this.length = 0;
+  }
+  CFFIndex.prototype = {
+    add: function CFFIndex_add(data) {
+      this.length += data.length;
+      this.objects.push(data);
+    },
+    get: function CFFIndex_get(index) {
+      return this.objects[index];
+    },
+    get count() {
+      return this.objects.length;
+    }
+  };
+  return CFFIndex;
+})();
+
+var CFFDict = (function CFFDictClosure() {
+  function CFFDict(tables, strings) {
+    this.keyToNameMap = tables.keyToNameMap;
+    this.nameToKeyMap = tables.nameToKeyMap;
+    this.defaults = tables.defaults;
+    this.types = tables.types;
+    this.opcodes = tables.opcodes;
+    this.order = tables.order;
+    this.strings = strings;
+    this.values = {};
+  }
+  CFFDict.prototype = {
+    // value should always be an array
+    setByKey: function CFFDict_setByKey(key, value) {
+      if (!(key in this.keyToNameMap))
+        return false;
+      // ignore empty values
+      if (value.length === 0)
+        return true;
+      var type = this.types[key];
+      // remove the array wrapping these types of values
+      if (type === 'num' || type === 'sid' || type === 'offset')
+        value = value[0];
+      this.values[key] = value;
+      return true;
+    },
+    hasName: function CFFDict_hasName(name) {
+      return this.nameToKeyMap[name] in this.values;
+    },
+    getByName: function CFFDict_getByName(name) {
+      if (!(name in this.nameToKeyMap))
+        error('Invalid dictionary name "' + name + '"');
+      var key = this.nameToKeyMap[name];
+      if (!(key in this.values))
+        return this.defaults[key];
+      return this.values[key];
+    },
+    removeByName: function CFFDict_removeByName(name) {
+      delete this.values[this.nameToKeyMap[name]];
+    }
+  };
+  CFFDict.createTables = function CFFDict_createTables(layout) {
+    var tables = {
+      keyToNameMap: {},
+      nameToKeyMap: {},
+      defaults: {},
+      types: {},
+      opcodes: {},
+      order: []
+    };
+    for (var i = 0, ii = layout.length; i < ii; ++i) {
+      var entry = layout[i];
+      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+      tables.keyToNameMap[key] = entry[1];
+      tables.nameToKeyMap[entry[1]] = key;
+      tables.types[key] = entry[2];
+      tables.defaults[key] = entry[3];
+      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
+      tables.order.push(key);
+    }
+    return tables;
+  };
+  return CFFDict;
+})();
+
+var CFFTopDict = (function CFFTopDictClosure() {
+  var layout = [
+    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
+    [[12, 20], 'SyntheticBase', 'num', null],
+    [0, 'version', 'sid', null],
+    [1, 'Notice', 'sid', null],
+    [[12, 0], 'Copyright', 'sid', null],
+    [2, 'FullName', 'sid', null],
+    [3, 'FamilyName', 'sid', null],
+    [4, 'Weight', 'sid', null],
+    [[12, 1], 'isFixedPitch', 'num', 0],
+    [[12, 2], 'ItalicAngle', 'num', 0],
+    [[12, 3], 'UnderlinePosition', 'num', -100],
+    [[12, 4], 'UnderlineThickness', 'num', 50],
+    [[12, 5], 'PaintType', 'num', 0],
+    [[12, 6], 'CharstringType', 'num', 2],
+    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
+                            [.001, 0, 0, .001, 0, 0]],
+    [13, 'UniqueID', 'num', null],
+    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
+    [[12, 8], 'StrokeWidth', 'num', 0],
+    [14, 'XUID', 'array', null],
+    [15, 'charset', 'offset', 0],
+    [16, 'Encoding', 'offset', 0],
+    [17, 'CharStrings', 'offset', 0],
+    [18, 'Private', ['offset', 'offset'], null],
+    [[12, 21], 'PostScript', 'sid', null],
+    [[12, 22], 'BaseFontName', 'sid', null],
+    [[12, 23], 'BaseFontBlend', 'delta', null],
+    [[12, 31], 'CIDFontVersion', 'num', 0],
+    [[12, 32], 'CIDFontRevision', 'num', 0],
+    [[12, 33], 'CIDFontType', 'num', 0],
+    [[12, 34], 'CIDCount', 'num', 8720],
+    [[12, 35], 'UIDBase', 'num', null],
+    [[12, 36], 'FDArray', 'offset', null],
+    [[12, 37], 'FDSelect', 'offset', null],
+    [[12, 38], 'FontName', 'sid', null]];
+  var tables = null;
+  function CFFTopDict(strings) {
+    if (tables === null)
+      tables = CFFDict.createTables(layout);
+    CFFDict.call(this, tables, strings);
+    this.privateDict = null;
+  }
+  CFFTopDict.prototype = Object.create(CFFDict.prototype);
+  return CFFTopDict;
+})();
+
+var CFFPrivateDict = (function CFFPrivateDictClosure() {
+  var layout = [
+    [6, 'BlueValues', 'delta', null],
+    [7, 'OtherBlues', 'delta', null],
+    [8, 'FamilyBlues', 'delta', null],
+    [9, 'FamilyOtherBlues', 'delta', null],
+    [[12, 9], 'BlueScale', 'num', 0.039625],
+    [[12, 10], 'BlueShift', 'num', 7],
+    [[12, 11], 'BlueFuzz', 'num', 1],
+    [10, 'StdHW', 'num', null],
+    [11, 'StdVW', 'num', null],
+    [[12, 12], 'StemSnapH', 'delta', null],
+    [[12, 13], 'StemSnapV', 'delta', null],
+    [[12, 14], 'ForceBold', 'num', 0],
+    [[12, 17], 'LanguageGroup', 'num', 0],
+    [[12, 18], 'ExpansionFactor', 'num', 0.06],
+    [[12, 19], 'initialRandomSeed', 'num', 0],
+    [19, 'Subrs', 'offset', null],
+    [20, 'defaultWidthX', 'num', 0],
+    [21, 'nominalWidthX', 'num', 0]
+  ];
+  var tables = null;
+  function CFFPrivateDict(strings) {
+    if (tables === null)
+      tables = CFFDict.createTables(layout);
+    CFFDict.call(this, tables, strings);
+    this.subrsIndex = null;
+  }
+  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
+  return CFFPrivateDict;
+})();
+
+var CFFCharsetPredefinedTypes = {
+  ISO_ADOBE: 0,
+  EXPERT: 1,
+  EXPERT_SUBSET: 2
+};
+var CFFCharsetEmbeddedTypes = {
+  FORMAT0: 0,
+  FORMAT1: 1,
+  FORMAT2: 2
+};
+var CFFCharset = (function CFFCharsetClosure() {
+  function CFFCharset(predefined, format, charset, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.charset = charset;
+    this.raw = raw;
+  }
+  return CFFCharset;
+})();
+
+var CFFEncodingPredefinedTypes = {
+  STANDARD: 0,
+  EXPERT: 1
+};
+var CFFCharsetEmbeddedTypes = {
+  FORMAT0: 0,
+  FORMAT1: 1
+};
+var CFFEncoding = (function CFFEncodingClosure() {
+  function CFFEncoding(predefined, format, encoding, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.encoding = encoding;
+    this.raw = raw;
+  }
+  return CFFEncoding;
+})();
+
+var CFFFDSelect = (function CFFFDSelectClosure() {
+  function CFFFDSelect(fdSelect, raw) {
+    this.fdSelect = fdSelect;
+    this.raw = raw;
+  }
+  return CFFFDSelect;
+})();
+
+// Helper class to keep track of where an offset is within the data and helps
+// filling in that offset once it's known.
+var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
+  function CFFOffsetTracker() {
+    this.offsets = {};
+  }
+  CFFOffsetTracker.prototype = {
+    isTracking: function CFFOffsetTracker_isTracking(key) {
+      return key in this.offsets;
+    },
+    track: function CFFOffsetTracker_track(key, location) {
+      if (key in this.offsets)
+        error('Already tracking location of ' + key);
+      this.offsets[key] = location;
+    },
+    offset: function CFFOffsetTracker_offset(value) {
+      for (var key in this.offsets) {
+        this.offsets[key] += value;
+      }
+    },
+    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
+                                                                 values,
+                                                                 output) {
+      if (!(key in this.offsets))
+        error('Not tracking location of ' + key);
+      var data = output.data;
+      var dataOffset = this.offsets[key];
+      var size = 5;
+      for (var i = 0, ii = values.length; i < ii; ++i) {
+        var offset0 = i * size + dataOffset;
+        var offset1 = offset0 + 1;
+        var offset2 = offset0 + 2;
+        var offset3 = offset0 + 3;
+        var offset4 = offset0 + 4;
+        // It's easy to screw up offsets so perform this sanity check.
+        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
+            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
+          error('writing to an offset that is not empty');
+        var value = values[i];
+        data[offset0] = 0x1d;
+        data[offset1] = (value >> 24) & 0xFF;
+        data[offset2] = (value >> 16) & 0xFF;
+        data[offset3] = (value >> 8) & 0xFF;
+        data[offset4] = value & 0xFF;
+      }
+    }
+  };
+  return CFFOffsetTracker;
+})();
+
+// Takes a CFF and converts it to the binary representation.
+var CFFCompiler = (function CFFCompilerClosure() {
+  function stringToArray(str) {
+    var array = [];
+    for (var i = 0, ii = str.length; i < ii; ++i)
+      array[i] = str.charCodeAt(i);
+
+    return array;
+  };
+  function CFFCompiler(cff) {
+    this.cff = cff;
+  }
+  CFFCompiler.prototype = {
+    compile: function CFFCompiler_compile() {
+      var cff = this.cff;
+      var output = {
+        data: [],
+        length: 0,
+        add: function CFFCompiler_add(data) {
+          this.data = this.data.concat(data);
+          this.length = this.data.length;
+        }
+      };
+
+      // Compile the five entries that must be in order.
+      var header = this.compileHeader(cff.header);
+      output.add(header);
+
+      var nameIndex = this.compileNameIndex(cff.names);
+      output.add(nameIndex);
+
+      var compiled = this.compileTopDicts([cff.topDict], output.length);
+      output.add(compiled.output);
+      var topDictTracker = compiled.trackers[0];
+
+      var stringIndex = this.compileStringIndex(cff.strings.strings);
+      output.add(stringIndex);
+
+      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+      output.add(globalSubrIndex);
+
+      // Now start on the other entries that have no specfic order.
+      if (cff.encoding && cff.topDict.hasName('Encoding')) {
+        if (cff.encoding.predefined) {
+          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
+                                          output);
+        } else {
+          var encoding = this.compileEncoding(cff.encoding);
+          topDictTracker.setEntryLocation('Encoding', [output.length], output);
+          output.add(encoding);
+        }
+      }
+
+      if (cff.charset && cff.topDict.hasName('charset')) {
+        if (cff.charset.predefined) {
+          topDictTracker.setEntryLocation('charset', [cff.charset.format],
+                                          output);
+        } else {
+          var charset = this.compileCharset(cff.charset);
+          topDictTracker.setEntryLocation('charset', [output.length], output);
+          output.add(charset);
+        }
+      }
+
+      var charStrings = this.compileCharStrings(cff.charStrings);
+      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
+      output.add(charStrings);
+
+      if (cff.isCIDFont) {
+        // For some reason FDSelect must be in front of FDArray on windows. OSX
+        // and linux don't seem to care.
+        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
+        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
+        output.add(fdSelect);
+
+        var compiled = this.compileTopDicts(cff.fdArray, output.length);
+        topDictTracker.setEntryLocation('FDArray', [output.length], output);
+        output.add(compiled.output);
+        var fontDictTrackers = compiled.trackers;
+
+        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
+      }
+
+      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+
+      return output.data;
+    },
+    encodeNumber: function CFFCompiler_encodeNumber(value) {
+      if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
+        return this.encodeInteger(value);
+      else
+        return this.encodeFloat(value);
+    },
+    encodeFloat: function CFFCompiler_encodeFloat(value) {
+      value = value.toString();
+      // Strip off the any leading zeros.
+      if (value.substr(0, 2) === '0.')
+        value = value.substr(1);
+      else if (value.substr(0, 3) === '-0.')
+        value = '-' + value.substr(2);
+      var nibbles = [];
+      for (var i = 0, ii = value.length; i < ii; ++i) {
+        var a = value.charAt(i), b = value.charAt(i + 1);
+        var nibble;
+        if (a === 'e' && b === '-') {
+          nibble = 0xc;
+          ++i;
+        } else if (a === '.') {
+          nibble = 0xa;
+        } else if (a === 'E') {
+          nibble = 0xb;
+        } else if (a === '-') {
+          nibble = 0xe;
+        } else {
+          nibble = a;
+        }
+        nibbles.push(nibble);
+      }
+      nibbles.push(0xf);
+      if (nibbles.length % 2)
+        nibbles.push(0xf);
+      var out = [30];
+      for (var i = 0, ii = nibbles.length; i < ii; i += 2)
+        out.push(nibbles[i] << 4 | nibbles[i + 1]);
+      return out;
+    },
+    encodeInteger: function CFFCompiler_encodeInteger(value) {
+      var code;
+      if (value >= -107 && value <= 107) {
+        code = [value + 139];
+      } else if (value >= 108 && value <= 1131) {
+        value = [value - 108];
+        code = [(value >> 8) + 247, value & 0xFF];
+      } else if (value >= -1131 && value <= -108) {
+        value = -value - 108;
+        code = [(value >> 8) + 251, value & 0xFF];
+      } else if (value >= -32768 && value <= 32767) {
+        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
+      } else {
+        code = [0x1d,
+                (value >> 24) & 0xFF,
+                (value >> 16) & 0xFF,
+                (value >> 8) & 0xFF,
+                 value & 0xFF];
+      }
+      return code;
+    },
+    compileHeader: function CFFCompiler_compileHeader(header) {
+      return [
+        header.major,
+        header.minor,
+        header.hdrSize,
+        header.offSize
+      ];
+    },
+    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
+      var nameIndex = new CFFIndex();
+      for (var i = 0, ii = names.length; i < ii; ++i)
+        nameIndex.add(stringToArray(names[i]));
+      return this.compileIndex(nameIndex);
+    },
+    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
+      var fontDictTrackers = [];
+      var fdArrayIndex = new CFFIndex();
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        var fontDictTracker = new CFFOffsetTracker();
+        var fontDictData = this.compileDict(fontDict, fontDictTracker);
+        fontDictTrackers.push(fontDictTracker);
+        fdArrayIndex.add(fontDictData);
+        fontDictTracker.offset(length);
+      }
+      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+      return {
+        trackers: fontDictTrackers,
+        output: fdArrayIndex
+      };
+    },
+    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
+                                                                  trackers,
+                                                                  output) {
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        if (!fontDict.privateDict || !fontDict.hasName('Private'))
+          continue;
+        var privateDict = fontDict.privateDict;
+        var privateDictTracker = new CFFOffsetTracker();
+        var privateDictData = this.compileDict(privateDict, privateDictTracker);
+
+        privateDictTracker.offset(output.length);
+        trackers[i].setEntryLocation('Private',
+                                     [privateDictData.length, output.length],
+                                     output);
+        output.add(privateDictData);
+
+        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
+          var subrs = this.compileIndex(privateDict.subrsIndex);
+          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
+                                              output);
+          output.add(subrs);
+        }
+      }
+    },
+    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
+      var out = [];
+      // The dictionary keys must be in a certain order.
+      var order = dict.order;
+      for (var i = 0; i < order.length; ++i) {
+        var key = order[i];
+        if (!(key in dict.values))
+          continue;
+        var values = dict.values[key];
+        var types = dict.types[key];
+        if (!isArray(types)) types = [types];
+        if (!isArray(values)) values = [values];
+
+        // Remove any empty dict values.
+        if (values.length === 0)
+          continue;
+
+        for (var j = 0, jj = types.length; j < jj; ++j) {
+          var type = types[j];
+          var value = values[j];
+          switch (type) {
+            case 'num':
+            case 'sid':
+              out = out.concat(this.encodeNumber(value));
+              break;
+            case 'offset':
+              // For offsets we just insert a 32bit integer so we don't have to
+              // deal with figuring out the length of the offset when it gets
+              // replaced later on by the compiler.
+              var name = dict.keyToNameMap[key];
+              // Some offsets have the offset and the length, so just record the
+              // position of the first one.
+              if (!offsetTracker.isTracking(name))
+                offsetTracker.track(name, out.length);
+              out = out.concat([0x1d, 0, 0, 0, 0]);
+              break;
+            case 'array':
+            case 'delta':
+              out = out.concat(this.encodeNumber(value));
+              for (var k = 1, kk = values.length; k < kk; ++k)
+                out = out.concat(this.encodeNumber(values[k]));
+              break;
+            default:
+              error('Unknown data type of ' + type);
+              break;
+          }
+        }
+        out = out.concat(dict.opcodes[key]);
+      }
+      return out;
+    },
+    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
+      var stringIndex = new CFFIndex();
+      for (var i = 0, ii = strings.length; i < ii; ++i)
+        stringIndex.add(stringToArray(strings[i]));
+      return this.compileIndex(stringIndex);
+    },
+    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
+      var globalSubrIndex = this.cff.globalSubrIndex;
+      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
+    },
+    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
+      return this.compileIndex(charStrings);
+    },
+    compileCharset: function CFFCompiler_compileCharset(charset) {
+      return this.compileTypedArray(charset.raw);
+    },
+    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
+      return this.compileTypedArray(encoding.raw);
+    },
+    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
+      return this.compileTypedArray(fdSelect);
+    },
+    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
+      var out = [];
+      for (var i = 0, ii = data.length; i < ii; ++i)
+        out[i] = data[i];
+      return out;
+    },
+    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
+      trackers = trackers || [];
+      var objects = index.objects;
+      // First 2 bytes contains the number of objects contained into this index
+      var count = objects.length;
+
+      // If there is no object, just create an index. This technically
+      // should just be [0, 0] but OTS has an issue with that.
+      if (count == 0)
+        return [0, 0, 0];
+
+      var data = [(count >> 8) & 0xFF, count & 0xff];
+
+      var lastOffset = 1;
+      for (var i = 0; i < count; ++i)
+        lastOffset += objects[i].length;
+
+      var offsetSize;
+      if (lastOffset < 0x100)
+        offsetSize = 1;
+      else if (lastOffset < 0x10000)
+        offsetSize = 2;
+      else if (lastOffset < 0x1000000)
+        offsetSize = 3;
+      else
+        offsetSize = 4;
+
+      // Next byte contains the offset size use to reference object in the file
+      data.push(offsetSize);
+
+      // Add another offset after this one because we need a new offset
+      var relativeOffset = 1;
+      for (var i = 0; i < count + 1; i++) {
+        if (offsetSize === 1) {
+          data.push(relativeOffset & 0xFF);
+        } else if (offsetSize === 2) {
+          data.push((relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        } else if (offsetSize === 3) {
+          data.push((relativeOffset >> 16) & 0xFF,
+                    (relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        } else {
+          data.push((relativeOffset >>> 24) & 0xFF,
+                    (relativeOffset >> 16) & 0xFF,
+                    (relativeOffset >> 8) & 0xFF,
+                     relativeOffset & 0xFF);
+        }
+
+        if (objects[i])
+          relativeOffset += objects[i].length;
+      }
+      var offset = data.length;
+
+      for (var i = 0; i < count; i++) {
+        // Notify the tracker where the object will be offset in the data.
+        if (trackers[i])
+          trackers[i].offset(data.length);
+        for (var j = 0, jj = objects[i].length; j < jj; j++)
+          data.push(objects[i][j]);
+      }
+      return data;
+    }
+  };
+  return CFFCompiler;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var GlyphsUnicode = {
+  A: 0x0041,
+  AE: 0x00C6,
+  AEacute: 0x01FC,
+  AEmacron: 0x01E2,
+  AEsmall: 0xF7E6,
+  Aacute: 0x00C1,
+  Aacutesmall: 0xF7E1,
+  Abreve: 0x0102,
+  Abreveacute: 0x1EAE,
+  Abrevecyrillic: 0x04D0,
+  Abrevedotbelow: 0x1EB6,
+  Abrevegrave: 0x1EB0,
+  Abrevehookabove: 0x1EB2,
+  Abrevetilde: 0x1EB4,
+  Acaron: 0x01CD,
+  Acircle: 0x24B6,
+  Acircumflex: 0x00C2,
+  Acircumflexacute: 0x1EA4,
+  Acircumflexdotbelow: 0x1EAC,
+  Acircumflexgrave: 0x1EA6,
+  Acircumflexhookabove: 0x1EA8,
+  Acircumflexsmall: 0xF7E2,
+  Acircumflextilde: 0x1EAA,
+  Acute: 0xF6C9,
+  Acutesmall: 0xF7B4,
+  Acyrillic: 0x0410,
+  Adblgrave: 0x0200,
+  Adieresis: 0x00C4,
+  Adieresiscyrillic: 0x04D2,
+  Adieresismacron: 0x01DE,
+  Adieresissmall: 0xF7E4,
+  Adotbelow: 0x1EA0,
+  Adotmacron: 0x01E0,
+  Agrave: 0x00C0,
+  Agravesmall: 0xF7E0,
+  Ahookabove: 0x1EA2,
+  Aiecyrillic: 0x04D4,
+  Ainvertedbreve: 0x0202,
+  Alpha: 0x0391,
+  Alphatonos: 0x0386,
+  Amacron: 0x0100,
+  Amonospace: 0xFF21,
+  Aogonek: 0x0104,
+  Aring: 0x00C5,
+  Aringacute: 0x01FA,
+  Aringbelow: 0x1E00,
+  Aringsmall: 0xF7E5,
+  Asmall: 0xF761,
+  Atilde: 0x00C3,
+  Atildesmall: 0xF7E3,
+  Aybarmenian: 0x0531,
+  B: 0x0042,
+  Bcircle: 0x24B7,
+  Bdotaccent: 0x1E02,
+  Bdotbelow: 0x1E04,
+  Becyrillic: 0x0411,
+  Benarmenian: 0x0532,
+  Beta: 0x0392,
+  Bhook: 0x0181,
+  Blinebelow: 0x1E06,
+  Bmonospace: 0xFF22,
+  Brevesmall: 0xF6F4,
+  Bsmall: 0xF762,
+  Btopbar: 0x0182,
+  C: 0x0043,
+  Caarmenian: 0x053E,
+  Cacute: 0x0106,
+  Caron: 0xF6CA,
+  Caronsmall: 0xF6F5,
+  Ccaron: 0x010C,
+  Ccedilla: 0x00C7,
+  Ccedillaacute: 0x1E08,
+  Ccedillasmall: 0xF7E7,
+  Ccircle: 0x24B8,
+  Ccircumflex: 0x0108,
+  Cdot: 0x010A,
+  Cdotaccent: 0x010A,
+  Cedillasmall: 0xF7B8,
+  Chaarmenian: 0x0549,
+  Cheabkhasiancyrillic: 0x04BC,
+  Checyrillic: 0x0427,
+  Chedescenderabkhasiancyrillic: 0x04BE,
+  Chedescendercyrillic: 0x04B6,
+  Chedieresiscyrillic: 0x04F4,
+  Cheharmenian: 0x0543,
+  Chekhakassiancyrillic: 0x04CB,
+  Cheverticalstrokecyrillic: 0x04B8,
+  Chi: 0x03A7,
+  Chook: 0x0187,
+  Circumflexsmall: 0xF6F6,
+  Cmonospace: 0xFF23,
+  Coarmenian: 0x0551,
+  Csmall: 0xF763,
+  D: 0x0044,
+  DZ: 0x01F1,
+  DZcaron: 0x01C4,
+  Daarmenian: 0x0534,
+  Dafrican: 0x0189,
+  Dcaron: 0x010E,
+  Dcedilla: 0x1E10,
+  Dcircle: 0x24B9,
+  Dcircumflexbelow: 0x1E12,
+  Dcroat: 0x0110,
+  Ddotaccent: 0x1E0A,
+  Ddotbelow: 0x1E0C,
+  Decyrillic: 0x0414,
+  Deicoptic: 0x03EE,
+  Delta: 0x2206,
+  Deltagreek: 0x0394,
+  Dhook: 0x018A,
+  Dieresis: 0xF6CB,
+  DieresisAcute: 0xF6CC,
+  DieresisGrave: 0xF6CD,
+  Dieresissmall: 0xF7A8,
+  Digammagreek: 0x03DC,
+  Djecyrillic: 0x0402,
+  Dlinebelow: 0x1E0E,
+  Dmonospace: 0xFF24,
+  Dotaccentsmall: 0xF6F7,
+  Dslash: 0x0110,
+  Dsmall: 0xF764,
+  Dtopbar: 0x018B,
+  Dz: 0x01F2,
+  Dzcaron: 0x01C5,
+  Dzeabkhasiancyrillic: 0x04E0,
+  Dzecyrillic: 0x0405,
+  Dzhecyrillic: 0x040F,
+  E: 0x0045,
+  Eacute: 0x00C9,
+  Eacutesmall: 0xF7E9,
+  Ebreve: 0x0114,
+  Ecaron: 0x011A,
+  Ecedillabreve: 0x1E1C,
+  Echarmenian: 0x0535,
+  Ecircle: 0x24BA,
+  Ecircumflex: 0x00CA,
+  Ecircumflexacute: 0x1EBE,
+  Ecircumflexbelow: 0x1E18,
+  Ecircumflexdotbelow: 0x1EC6,
+  Ecircumflexgrave: 0x1EC0,
+  Ecircumflexhookabove: 0x1EC2,
+  Ecircumflexsmall: 0xF7EA,
+  Ecircumflextilde: 0x1EC4,
+  Ecyrillic: 0x0404,
+  Edblgrave: 0x0204,
+  Edieresis: 0x00CB,
+  Edieresissmall: 0xF7EB,
+  Edot: 0x0116,
+  Edotaccent: 0x0116,
+  Edotbelow: 0x1EB8,
+  Efcyrillic: 0x0424,
+  Egrave: 0x00C8,
+  Egravesmall: 0xF7E8,
+  Eharmenian: 0x0537,
+  Ehookabove: 0x1EBA,
+  Eightroman: 0x2167,
+  Einvertedbreve: 0x0206,
+  Eiotifiedcyrillic: 0x0464,
+  Elcyrillic: 0x041B,
+  Elevenroman: 0x216A,
+  Emacron: 0x0112,
+  Emacronacute: 0x1E16,
+  Emacrongrave: 0x1E14,
+  Emcyrillic: 0x041C,
+  Emonospace: 0xFF25,
+  Encyrillic: 0x041D,
+  Endescendercyrillic: 0x04A2,
+  Eng: 0x014A,
+  Enghecyrillic: 0x04A4,
+  Enhookcyrillic: 0x04C7,
+  Eogonek: 0x0118,
+  Eopen: 0x0190,
+  Epsilon: 0x0395,
+  Epsilontonos: 0x0388,
+  Ercyrillic: 0x0420,
+  Ereversed: 0x018E,
+  Ereversedcyrillic: 0x042D,
+  Escyrillic: 0x0421,
+  Esdescendercyrillic: 0x04AA,
+  Esh: 0x01A9,
+  Esmall: 0xF765,
+  Eta: 0x0397,
+  Etarmenian: 0x0538,
+  Etatonos: 0x0389,
+  Eth: 0x00D0,
+  Ethsmall: 0xF7F0,
+  Etilde: 0x1EBC,
+  Etildebelow: 0x1E1A,
+  Euro: 0x20AC,
+  Ezh: 0x01B7,
+  Ezhcaron: 0x01EE,
+  Ezhreversed: 0x01B8,
+  F: 0x0046,
+  Fcircle: 0x24BB,
+  Fdotaccent: 0x1E1E,
+  Feharmenian: 0x0556,
+  Feicoptic: 0x03E4,
+  Fhook: 0x0191,
+  Fitacyrillic: 0x0472,
+  Fiveroman: 0x2164,
+  Fmonospace: 0xFF26,
+  Fourroman: 0x2163,
+  Fsmall: 0xF766,
+  G: 0x0047,
+  GBsquare: 0x3387,
+  Gacute: 0x01F4,
+  Gamma: 0x0393,
+  Gammaafrican: 0x0194,
+  Gangiacoptic: 0x03EA,
+  Gbreve: 0x011E,
+  Gcaron: 0x01E6,
+  Gcedilla: 0x0122,
+  Gcircle: 0x24BC,
+  Gcircumflex: 0x011C,
+  Gcommaaccent: 0x0122,
+  Gdot: 0x0120,
+  Gdotaccent: 0x0120,
+  Gecyrillic: 0x0413,
+  Ghadarmenian: 0x0542,
+  Ghemiddlehookcyrillic: 0x0494,
+  Ghestrokecyrillic: 0x0492,
+  Gheupturncyrillic: 0x0490,
+  Ghook: 0x0193,
+  Gimarmenian: 0x0533,
+  Gjecyrillic: 0x0403,
+  Gmacron: 0x1E20,
+  Gmonospace: 0xFF27,
+  Grave: 0xF6CE,
+  Gravesmall: 0xF760,
+  Gsmall: 0xF767,
+  Gsmallhook: 0x029B,
+  Gstroke: 0x01E4,
+  H: 0x0048,
+  H18533: 0x25CF,
+  H18543: 0x25AA,
+  H18551: 0x25AB,
+  H22073: 0x25A1,
+  HPsquare: 0x33CB,
+  Haabkhasiancyrillic: 0x04A8,
+  Hadescendercyrillic: 0x04B2,
+  Hardsigncyrillic: 0x042A,
+  Hbar: 0x0126,
+  Hbrevebelow: 0x1E2A,
+  Hcedilla: 0x1E28,
+  Hcircle: 0x24BD,
+  Hcircumflex: 0x0124,
+  Hdieresis: 0x1E26,
+  Hdotaccent: 0x1E22,
+  Hdotbelow: 0x1E24,
+  Hmonospace: 0xFF28,
+  Hoarmenian: 0x0540,
+  Horicoptic: 0x03E8,
+  Hsmall: 0xF768,
+  Hungarumlaut: 0xF6CF,
+  Hungarumlautsmall: 0xF6F8,
+  Hzsquare: 0x3390,
+  I: 0x0049,
+  IAcyrillic: 0x042F,
+  IJ: 0x0132,
+  IUcyrillic: 0x042E,
+  Iacute: 0x00CD,
+  Iacutesmall: 0xF7ED,
+  Ibreve: 0x012C,
+  Icaron: 0x01CF,
+  Icircle: 0x24BE,
+  Icircumflex: 0x00CE,
+  Icircumflexsmall: 0xF7EE,
+  Icyrillic: 0x0406,
+  Idblgrave: 0x0208,
+  Idieresis: 0x00CF,
+  Idieresisacute: 0x1E2E,
+  Idieresiscyrillic: 0x04E4,
+  Idieresissmall: 0xF7EF,
+  Idot: 0x0130,
+  Idotaccent: 0x0130,
+  Idotbelow: 0x1ECA,
+  Iebrevecyrillic: 0x04D6,
+  Iecyrillic: 0x0415,
+  Ifraktur: 0x2111,
+  Igrave: 0x00CC,
+  Igravesmall: 0xF7EC,
+  Ihookabove: 0x1EC8,
+  Iicyrillic: 0x0418,
+  Iinvertedbreve: 0x020A,
+  Iishortcyrillic: 0x0419,
+  Imacron: 0x012A,
+  Imacroncyrillic: 0x04E2,
+  Imonospace: 0xFF29,
+  Iniarmenian: 0x053B,
+  Iocyrillic: 0x0401,
+  Iogonek: 0x012E,
+  Iota: 0x0399,
+  Iotaafrican: 0x0196,
+  Iotadieresis: 0x03AA,
+  Iotatonos: 0x038A,
+  Ismall: 0xF769,
+  Istroke: 0x0197,
+  Itilde: 0x0128,
+  Itildebelow: 0x1E2C,
+  Izhitsacyrillic: 0x0474,
+  Izhitsadblgravecyrillic: 0x0476,
+  J: 0x004A,
+  Jaarmenian: 0x0541,
+  Jcircle: 0x24BF,
+  Jcircumflex: 0x0134,
+  Jecyrillic: 0x0408,
+  Jheharmenian: 0x054B,
+  Jmonospace: 0xFF2A,
+  Jsmall: 0xF76A,
+  K: 0x004B,
+  KBsquare: 0x3385,
+  KKsquare: 0x33CD,
+  Kabashkircyrillic: 0x04A0,
+  Kacute: 0x1E30,
+  Kacyrillic: 0x041A,
+  Kadescendercyrillic: 0x049A,
+  Kahookcyrillic: 0x04C3,
+  Kappa: 0x039A,
+  Kastrokecyrillic: 0x049E,
+  Kaverticalstrokecyrillic: 0x049C,
+  Kcaron: 0x01E8,
+  Kcedilla: 0x0136,
+  Kcircle: 0x24C0,
+  Kcommaaccent: 0x0136,
+  Kdotbelow: 0x1E32,
+  Keharmenian: 0x0554,
+  Kenarmenian: 0x053F,
+  Khacyrillic: 0x0425,
+  Kheicoptic: 0x03E6,
+  Khook: 0x0198,
+  Kjecyrillic: 0x040C,
+  Klinebelow: 0x1E34,
+  Kmonospace: 0xFF2B,
+  Koppacyrillic: 0x0480,
+  Koppagreek: 0x03DE,
+  Ksicyrillic: 0x046E,
+  Ksmall: 0xF76B,
+  L: 0x004C,
+  LJ: 0x01C7,
+  LL: 0xF6BF,
+  Lacute: 0x0139,
+  Lambda: 0x039B,
+  Lcaron: 0x013D,
+  Lcedilla: 0x013B,
+  Lcircle: 0x24C1,
+  Lcircumflexbelow: 0x1E3C,
+  Lcommaaccent: 0x013B,
+  Ldot: 0x013F,
+  Ldotaccent: 0x013F,
+  Ldotbelow: 0x1E36,
+  Ldotbelowmacron: 0x1E38,
+  Liwnarmenian: 0x053C,
+  Lj: 0x01C8,
+  Ljecyrillic: 0x0409,
+  Llinebelow: 0x1E3A,
+  Lmonospace: 0xFF2C,
+  Lslash: 0x0141,
+  Lslashsmall: 0xF6F9,
+  Lsmall: 0xF76C,
+  M: 0x004D,
+  MBsquare: 0x3386,
+  Macron: 0xF6D0,
+  Macronsmall: 0xF7AF,
+  Macute: 0x1E3E,
+  Mcircle: 0x24C2,
+  Mdotaccent: 0x1E40,
+  Mdotbelow: 0x1E42,
+  Menarmenian: 0x0544,
+  Mmonospace: 0xFF2D,
+  Msmall: 0xF76D,
+  Mturned: 0x019C,
+  Mu: 0x039C,
+  N: 0x004E,
+  NJ: 0x01CA,
+  Nacute: 0x0143,
+  Ncaron: 0x0147,
+  Ncedilla: 0x0145,
+  Ncircle: 0x24C3,
+  Ncircumflexbelow: 0x1E4A,
+  Ncommaaccent: 0x0145,
+  Ndotaccent: 0x1E44,
+  Ndotbelow: 0x1E46,
+  Nhookleft: 0x019D,
+  Nineroman: 0x2168,
+  Nj: 0x01CB,
+  Njecyrillic: 0x040A,
+  Nlinebelow: 0x1E48,
+  Nmonospace: 0xFF2E,
+  Nowarmenian: 0x0546,
+  Nsmall: 0xF76E,
+  Ntilde: 0x00D1,
+  Ntildesmall: 0xF7F1,
+  Nu: 0x039D,
+  O: 0x004F,
+  OE: 0x0152,
+  OEsmall: 0xF6FA,
+  Oacute: 0x00D3,
+  Oacutesmall: 0xF7F3,
+  Obarredcyrillic: 0x04E8,
+  Obarreddieresiscyrillic: 0x04EA,
+  Obreve: 0x014E,
+  Ocaron: 0x01D1,
+  Ocenteredtilde: 0x019F,
+  Ocircle: 0x24C4,
+  Ocircumflex: 0x00D4,
+  Ocircumflexacute: 0x1ED0,
+  Ocircumflexdotbelow: 0x1ED8,
+  Ocircumflexgrave: 0x1ED2,
+  Ocircumflexhookabove: 0x1ED4,
+  Ocircumflexsmall: 0xF7F4,
+  Ocircumflextilde: 0x1ED6,
+  Ocyrillic: 0x041E,
+  Odblacute: 0x0150,
+  Odblgrave: 0x020C,
+  Odieresis: 0x00D6,
+  Odieresiscyrillic: 0x04E6,
+  Odieresissmall: 0xF7F6,
+  Odotbelow: 0x1ECC,
+  Ogoneksmall: 0xF6FB,
+  Ograve: 0x00D2,
+  Ogravesmall: 0xF7F2,
+  Oharmenian: 0x0555,
+  Ohm: 0x2126,
+  Ohookabove: 0x1ECE,
+  Ohorn: 0x01A0,
+  Ohornacute: 0x1EDA,
+  Ohorndotbelow: 0x1EE2,
+  Ohorngrave: 0x1EDC,
+  Ohornhookabove: 0x1EDE,
+  Ohorntilde: 0x1EE0,
+  Ohungarumlaut: 0x0150,
+  Oi: 0x01A2,
+  Oinvertedbreve: 0x020E,
+  Omacron: 0x014C,
+  Omacronacute: 0x1E52,
+  Omacrongrave: 0x1E50,
+  Omega: 0x2126,
+  Omegacyrillic: 0x0460,
+  Omegagreek: 0x03A9,
+  Omegaroundcyrillic: 0x047A,
+  Omegatitlocyrillic: 0x047C,
+  Omegatonos: 0x038F,
+  Omicron: 0x039F,
+  Omicrontonos: 0x038C,
+  Omonospace: 0xFF2F,
+  Oneroman: 0x2160,
+  Oogonek: 0x01EA,
+  Oogonekmacron: 0x01EC,
+  Oopen: 0x0186,
+  Oslash: 0x00D8,
+  Oslashacute: 0x01FE,
+  Oslashsmall: 0xF7F8,
+  Osmall: 0xF76F,
+  Ostrokeacute: 0x01FE,
+  Otcyrillic: 0x047E,
+  Otilde: 0x00D5,
+  Otildeacute: 0x1E4C,
+  Otildedieresis: 0x1E4E,
+  Otildesmall: 0xF7F5,
+  P: 0x0050,
+  Pacute: 0x1E54,
+  Pcircle: 0x24C5,
+  Pdotaccent: 0x1E56,
+  Pecyrillic: 0x041F,
+  Peharmenian: 0x054A,
+  Pemiddlehookcyrillic: 0x04A6,
+  Phi: 0x03A6,
+  Phook: 0x01A4,
+  Pi: 0x03A0,
+  Piwrarmenian: 0x0553,
+  Pmonospace: 0xFF30,
+  Psi: 0x03A8,
+  Psicyrillic: 0x0470,
+  Psmall: 0xF770,
+  Q: 0x0051,
+  Qcircle: 0x24C6,
+  Qmonospace: 0xFF31,
+  Qsmall: 0xF771,
+  R: 0x0052,
+  Raarmenian: 0x054C,
+  Racute: 0x0154,
+  Rcaron: 0x0158,
+  Rcedilla: 0x0156,
+  Rcircle: 0x24C7,
+  Rcommaaccent: 0x0156,
+  Rdblgrave: 0x0210,
+  Rdotaccent: 0x1E58,
+  Rdotbelow: 0x1E5A,
+  Rdotbelowmacron: 0x1E5C,
+  Reharmenian: 0x0550,
+  Rfraktur: 0x211C,
+  Rho: 0x03A1,
+  Ringsmall: 0xF6FC,
+  Rinvertedbreve: 0x0212,
+  Rlinebelow: 0x1E5E,
+  Rmonospace: 0xFF32,
+  Rsmall: 0xF772,
+  Rsmallinverted: 0x0281,
+  Rsmallinvertedsuperior: 0x02B6,
+  S: 0x0053,
+  SF010000: 0x250C,
+  SF020000: 0x2514,
+  SF030000: 0x2510,
+  SF040000: 0x2518,
+  SF050000: 0x253C,
+  SF060000: 0x252C,
+  SF070000: 0x2534,
+  SF080000: 0x251C,
+  SF090000: 0x2524,
+  SF100000: 0x2500,
+  SF110000: 0x2502,
+  SF190000: 0x2561,
+  SF200000: 0x2562,
+  SF210000: 0x2556,
+  SF220000: 0x2555,
+  SF230000: 0x2563,
+  SF240000: 0x2551,
+  SF250000: 0x2557,
+  SF260000: 0x255D,
+  SF270000: 0x255C,
+  SF280000: 0x255B,
+  SF360000: 0x255E,
+  SF370000: 0x255F,
+  SF380000: 0x255A,
+  SF390000: 0x2554,
+  SF400000: 0x2569,
+  SF410000: 0x2566,
+  SF420000: 0x2560,
+  SF430000: 0x2550,
+  SF440000: 0x256C,
+  SF450000: 0x2567,
+  SF460000: 0x2568,
+  SF470000: 0x2564,
+  SF480000: 0x2565,
+  SF490000: 0x2559,
+  SF500000: 0x2558,
+  SF510000: 0x2552,
+  SF520000: 0x2553,
+  SF530000: 0x256B,
+  SF540000: 0x256A,
+  Sacute: 0x015A,
+  Sacutedotaccent: 0x1E64,
+  Sampigreek: 0x03E0,
+  Scaron: 0x0160,
+  Scarondotaccent: 0x1E66,
+  Scaronsmall: 0xF6FD,
+  Scedilla: 0x015E,
+  Schwa: 0x018F,
+  Schwacyrillic: 0x04D8,
+  Schwadieresiscyrillic: 0x04DA,
+  Scircle: 0x24C8,
+  Scircumflex: 0x015C,
+  Scommaaccent: 0x0218,
+  Sdotaccent: 0x1E60,
+  Sdotbelow: 0x1E62,
+  Sdotbelowdotaccent: 0x1E68,
+  Seharmenian: 0x054D,
+  Sevenroman: 0x2166,
+  Shaarmenian: 0x0547,
+  Shacyrillic: 0x0428,
+  Shchacyrillic: 0x0429,
+  Sheicoptic: 0x03E2,
+  Shhacyrillic: 0x04BA,
+  Shimacoptic: 0x03EC,
+  Sigma: 0x03A3,
+  Sixroman: 0x2165,
+  Smonospace: 0xFF33,
+  Softsigncyrillic: 0x042C,
+  Ssmall: 0xF773,
+  Stigmagreek: 0x03DA,
+  T: 0x0054,
+  Tau: 0x03A4,
+  Tbar: 0x0166,
+  Tcaron: 0x0164,
+  Tcedilla: 0x0162,
+  Tcircle: 0x24C9,
+  Tcircumflexbelow: 0x1E70,
+  Tcommaaccent: 0x0162,
+  Tdotaccent: 0x1E6A,
+  Tdotbelow: 0x1E6C,
+  Tecyrillic: 0x0422,
+  Tedescendercyrillic: 0x04AC,
+  Tenroman: 0x2169,
+  Tetsecyrillic: 0x04B4,
+  Theta: 0x0398,
+  Thook: 0x01AC,
+  Thorn: 0x00DE,
+  Thornsmall: 0xF7FE,
+  Threeroman: 0x2162,
+  Tildesmall: 0xF6FE,
+  Tiwnarmenian: 0x054F,
+  Tlinebelow: 0x1E6E,
+  Tmonospace: 0xFF34,
+  Toarmenian: 0x0539,
+  Tonefive: 0x01BC,
+  Tonesix: 0x0184,
+  Tonetwo: 0x01A7,
+  Tretroflexhook: 0x01AE,
+  Tsecyrillic: 0x0426,
+  Tshecyrillic: 0x040B,
+  Tsmall: 0xF774,
+  Twelveroman: 0x216B,
+  Tworoman: 0x2161,
+  U: 0x0055,
+  Uacute: 0x00DA,
+  Uacutesmall: 0xF7FA,
+  Ubreve: 0x016C,
+  Ucaron: 0x01D3,
+  Ucircle: 0x24CA,
+  Ucircumflex: 0x00DB,
+  Ucircumflexbelow: 0x1E76,
+  Ucircumflexsmall: 0xF7FB,
+  Ucyrillic: 0x0423,
+  Udblacute: 0x0170,
+  Udblgrave: 0x0214,
+  Udieresis: 0x00DC,
+  Udieresisacute: 0x01D7,
+  Udieresisbelow: 0x1E72,
+  Udieresiscaron: 0x01D9,
+  Udieresiscyrillic: 0x04F0,
+  Udieresisgrave: 0x01DB,
+  Udieresismacron: 0x01D5,
+  Udieresissmall: 0xF7FC,
+  Udotbelow: 0x1EE4,
+  Ugrave: 0x00D9,
+  Ugravesmall: 0xF7F9,
+  Uhookabove: 0x1EE6,
+  Uhorn: 0x01AF,
+  Uhornacute: 0x1EE8,
+  Uhorndotbelow: 0x1EF0,
+  Uhorngrave: 0x1EEA,
+  Uhornhookabove: 0x1EEC,
+  Uhorntilde: 0x1EEE,
+  Uhungarumlaut: 0x0170,
+  Uhungarumlautcyrillic: 0x04F2,
+  Uinvertedbreve: 0x0216,
+  Ukcyrillic: 0x0478,
+  Umacron: 0x016A,
+  Umacroncyrillic: 0x04EE,
+  Umacrondieresis: 0x1E7A,
+  Umonospace: 0xFF35,
+  Uogonek: 0x0172,
+  Upsilon: 0x03A5,
+  Upsilon1: 0x03D2,
+  Upsilonacutehooksymbolgreek: 0x03D3,
+  Upsilonafrican: 0x01B1,
+  Upsilondieresis: 0x03AB,
+  Upsilondieresishooksymbolgreek: 0x03D4,
+  Upsilonhooksymbol: 0x03D2,
+  Upsilontonos: 0x038E,
+  Uring: 0x016E,
+  Ushortcyrillic: 0x040E,
+  Usmall: 0xF775,
+  Ustraightcyrillic: 0x04AE,
+  Ustraightstrokecyrillic: 0x04B0,
+  Utilde: 0x0168,
+  Utildeacute: 0x1E78,
+  Utildebelow: 0x1E74,
+  V: 0x0056,
+  Vcircle: 0x24CB,
+  Vdotbelow: 0x1E7E,
+  Vecyrillic: 0x0412,
+  Vewarmenian: 0x054E,
+  Vhook: 0x01B2,
+  Vmonospace: 0xFF36,
+  Voarmenian: 0x0548,
+  Vsmall: 0xF776,
+  Vtilde: 0x1E7C,
+  W: 0x0057,
+  Wacute: 0x1E82,
+  Wcircle: 0x24CC,
+  Wcircumflex: 0x0174,
+  Wdieresis: 0x1E84,
+  Wdotaccent: 0x1E86,
+  Wdotbelow: 0x1E88,
+  Wgrave: 0x1E80,
+  Wmonospace: 0xFF37,
+  Wsmall: 0xF777,
+  X: 0x0058,
+  Xcircle: 0x24CD,
+  Xdieresis: 0x1E8C,
+  Xdotaccent: 0x1E8A,
+  Xeharmenian: 0x053D,
+  Xi: 0x039E,
+  Xmonospace: 0xFF38,
+  Xsmall: 0xF778,
+  Y: 0x0059,
+  Yacute: 0x00DD,
+  Yacutesmall: 0xF7FD,
+  Yatcyrillic: 0x0462,
+  Ycircle: 0x24CE,
+  Ycircumflex: 0x0176,
+  Ydieresis: 0x0178,
+  Ydieresissmall: 0xF7FF,
+  Ydotaccent: 0x1E8E,
+  Ydotbelow: 0x1EF4,
+  Yericyrillic: 0x042B,
+  Yerudieresiscyrillic: 0x04F8,
+  Ygrave: 0x1EF2,
+  Yhook: 0x01B3,
+  Yhookabove: 0x1EF6,
+  Yiarmenian: 0x0545,
+  Yicyrillic: 0x0407,
+  Yiwnarmenian: 0x0552,
+  Ymonospace: 0xFF39,
+  Ysmall: 0xF779,
+  Ytilde: 0x1EF8,
+  Yusbigcyrillic: 0x046A,
+  Yusbigiotifiedcyrillic: 0x046C,
+  Yuslittlecyrillic: 0x0466,
+  Yuslittleiotifiedcyrillic: 0x0468,
+  Z: 0x005A,
+  Zaarmenian: 0x0536,
+  Zacute: 0x0179,
+  Zcaron: 0x017D,
+  Zcaronsmall: 0xF6FF,
+  Zcircle: 0x24CF,
+  Zcircumflex: 0x1E90,
+  Zdot: 0x017B,
+  Zdotaccent: 0x017B,
+  Zdotbelow: 0x1E92,
+  Zecyrillic: 0x0417,
+  Zedescendercyrillic: 0x0498,
+  Zedieresiscyrillic: 0x04DE,
+  Zeta: 0x0396,
+  Zhearmenian: 0x053A,
+  Zhebrevecyrillic: 0x04C1,
+  Zhecyrillic: 0x0416,
+  Zhedescendercyrillic: 0x0496,
+  Zhedieresiscyrillic: 0x04DC,
+  Zlinebelow: 0x1E94,
+  Zmonospace: 0xFF3A,
+  Zsmall: 0xF77A,
+  Zstroke: 0x01B5,
+  a: 0x0061,
+  aabengali: 0x0986,
+  aacute: 0x00E1,
+  aadeva: 0x0906,
+  aagujarati: 0x0A86,
+  aagurmukhi: 0x0A06,
+  aamatragurmukhi: 0x0A3E,
+  aarusquare: 0x3303,
+  aavowelsignbengali: 0x09BE,
+  aavowelsigndeva: 0x093E,
+  aavowelsigngujarati: 0x0ABE,
+  abbreviationmarkarmenian: 0x055F,
+  abbreviationsigndeva: 0x0970,
+  abengali: 0x0985,
+  abopomofo: 0x311A,
+  abreve: 0x0103,
+  abreveacute: 0x1EAF,
+  abrevecyrillic: 0x04D1,
+  abrevedotbelow: 0x1EB7,
+  abrevegrave: 0x1EB1,
+  abrevehookabove: 0x1EB3,
+  abrevetilde: 0x1EB5,
+  acaron: 0x01CE,
+  acircle: 0x24D0,
+  acircumflex: 0x00E2,
+  acircumflexacute: 0x1EA5,
+  acircumflexdotbelow: 0x1EAD,
+  acircumflexgrave: 0x1EA7,
+  acircumflexhookabove: 0x1EA9,
+  acircumflextilde: 0x1EAB,
+  acute: 0x00B4,
+  acutebelowcmb: 0x0317,
+  acutecmb: 0x0301,
+  acutecomb: 0x0301,
+  acutedeva: 0x0954,
+  acutelowmod: 0x02CF,
+  acutetonecmb: 0x0341,
+  acyrillic: 0x0430,
+  adblgrave: 0x0201,
+  addakgurmukhi: 0x0A71,
+  adeva: 0x0905,
+  adieresis: 0x00E4,
+  adieresiscyrillic: 0x04D3,
+  adieresismacron: 0x01DF,
+  adotbelow: 0x1EA1,
+  adotmacron: 0x01E1,
+  ae: 0x00E6,
+  aeacute: 0x01FD,
+  aekorean: 0x3150,
+  aemacron: 0x01E3,
+  afii00208: 0x2015,
+  afii08941: 0x20A4,
+  afii10017: 0x0410,
+  afii10018: 0x0411,
+  afii10019: 0x0412,
+  afii10020: 0x0413,
+  afii10021: 0x0414,
+  afii10022: 0x0415,
+  afii10023: 0x0401,
+  afii10024: 0x0416,
+  afii10025: 0x0417,
+  afii10026: 0x0418,
+  afii10027: 0x0419,
+  afii10028: 0x041A,
+  afii10029: 0x041B,
+  afii10030: 0x041C,
+  afii10031: 0x041D,
+  afii10032: 0x041E,
+  afii10033: 0x041F,
+  afii10034: 0x0420,
+  afii10035: 0x0421,
+  afii10036: 0x0422,
+  afii10037: 0x0423,
+  afii10038: 0x0424,
+  afii10039: 0x0425,
+  afii10040: 0x0426,
+  afii10041: 0x0427,
+  afii10042: 0x0428,
+  afii10043: 0x0429,
+  afii10044: 0x042A,
+  afii10045: 0x042B,
+  afii10046: 0x042C,
+  afii10047: 0x042D,
+  afii10048: 0x042E,
+  afii10049: 0x042F,
+  afii10050: 0x0490,
+  afii10051: 0x0402,
+  afii10052: 0x0403,
+  afii10053: 0x0404,
+  afii10054: 0x0405,
+  afii10055: 0x0406,
+  afii10056: 0x0407,
+  afii10057: 0x0408,
+  afii10058: 0x0409,
+  afii10059: 0x040A,
+  afii10060: 0x040B,
+  afii10061: 0x040C,
+  afii10062: 0x040E,
+  afii10063: 0xF6C4,
+  afii10064: 0xF6C5,
+  afii10065: 0x0430,
+  afii10066: 0x0431,
+  afii10067: 0x0432,
+  afii10068: 0x0433,
+  afii10069: 0x0434,
+  afii10070: 0x0435,
+  afii10071: 0x0451,
+  afii10072: 0x0436,
+  afii10073: 0x0437,
+  afii10074: 0x0438,
+  afii10075: 0x0439,
+  afii10076: 0x043A,
+  afii10077: 0x043B,
+  afii10078: 0x043C,
+  afii10079: 0x043D,
+  afii10080: 0x043E,
+  afii10081: 0x043F,
+  afii10082: 0x0440,
+  afii10083: 0x0441,
+  afii10084: 0x0442,
+  afii10085: 0x0443,
+  afii10086: 0x0444,
+  afii10087: 0x0445,
+  afii10088: 0x0446,
+  afii10089: 0x0447,
+  afii10090: 0x0448,
+  afii10091: 0x0449,
+  afii10092: 0x044A,
+  afii10093: 0x044B,
+  afii10094: 0x044C,
+  afii10095: 0x044D,
+  afii10096: 0x044E,
+  afii10097: 0x044F,
+  afii10098: 0x0491,
+  afii10099: 0x0452,
+  afii10100: 0x0453,
+  afii10101: 0x0454,
+  afii10102: 0x0455,
+  afii10103: 0x0456,
+  afii10104: 0x0457,
+  afii10105: 0x0458,
+  afii10106: 0x0459,
+  afii10107: 0x045A,
+  afii10108: 0x045B,
+  afii10109: 0x045C,
+  afii10110: 0x045E,
+  afii10145: 0x040F,
+  afii10146: 0x0462,
+  afii10147: 0x0472,
+  afii10148: 0x0474,
+  afii10192: 0xF6C6,
+  afii10193: 0x045F,
+  afii10194: 0x0463,
+  afii10195: 0x0473,
+  afii10196: 0x0475,
+  afii10831: 0xF6C7,
+  afii10832: 0xF6C8,
+  afii10846: 0x04D9,
+  afii299: 0x200E,
+  afii300: 0x200F,
+  afii301: 0x200D,
+  afii57381: 0x066A,
+  afii57388: 0x060C,
+  afii57392: 0x0660,
+  afii57393: 0x0661,
+  afii57394: 0x0662,
+  afii57395: 0x0663,
+  afii57396: 0x0664,
+  afii57397: 0x0665,
+  afii57398: 0x0666,
+  afii57399: 0x0667,
+  afii57400: 0x0668,
+  afii57401: 0x0669,
+  afii57403: 0x061B,
+  afii57407: 0x061F,
+  afii57409: 0x0621,
+  afii57410: 0x0622,
+  afii57411: 0x0623,
+  afii57412: 0x0624,
+  afii57413: 0x0625,
+  afii57414: 0x0626,
+  afii57415: 0x0627,
+  afii57416: 0x0628,
+  afii57417: 0x0629,
+  afii57418: 0x062A,
+  afii57419: 0x062B,
+  afii57420: 0x062C,
+  afii57421: 0x062D,
+  afii57422: 0x062E,
+  afii57423: 0x062F,
+  afii57424: 0x0630,
+  afii57425: 0x0631,
+  afii57426: 0x0632,
+  afii57427: 0x0633,
+  afii57428: 0x0634,
+  afii57429: 0x0635,
+  afii57430: 0x0636,
+  afii57431: 0x0637,
+  afii57432: 0x0638,
+  afii57433: 0x0639,
+  afii57434: 0x063A,
+  afii57440: 0x0640,
+  afii57441: 0x0641,
+  afii57442: 0x0642,
+  afii57443: 0x0643,
+  afii57444: 0x0644,
+  afii57445: 0x0645,
+  afii57446: 0x0646,
+  afii57448: 0x0648,
+  afii57449: 0x0649,
+  afii57450: 0x064A,
+  afii57451: 0x064B,
+  afii57452: 0x064C,
+  afii57453: 0x064D,
+  afii57454: 0x064E,
+  afii57455: 0x064F,
+  afii57456: 0x0650,
+  afii57457: 0x0651,
+  afii57458: 0x0652,
+  afii57470: 0x0647,
+  afii57505: 0x06A4,
+  afii57506: 0x067E,
+  afii57507: 0x0686,
+  afii57508: 0x0698,
+  afii57509: 0x06AF,
+  afii57511: 0x0679,
+  afii57512: 0x0688,
+  afii57513: 0x0691,
+  afii57514: 0x06BA,
+  afii57519: 0x06D2,
+  afii57534: 0x06D5,
+  afii57636: 0x20AA,
+  afii57645: 0x05BE,
+  afii57658: 0x05C3,
+  afii57664: 0x05D0,
+  afii57665: 0x05D1,
+  afii57666: 0x05D2,
+  afii57667: 0x05D3,
+  afii57668: 0x05D4,
+  afii57669: 0x05D5,
+  afii57670: 0x05D6,
+  afii57671: 0x05D7,
+  afii57672: 0x05D8,
+  afii57673: 0x05D9,
+  afii57674: 0x05DA,
+  afii57675: 0x05DB,
+  afii57676: 0x05DC,
+  afii57677: 0x05DD,
+  afii57678: 0x05DE,
+  afii57679: 0x05DF,
+  afii57680: 0x05E0,
+  afii57681: 0x05E1,
+  afii57682: 0x05E2,
+  afii57683: 0x05E3,
+  afii57684: 0x05E4,
+  afii57685: 0x05E5,
+  afii57686: 0x05E6,
+  afii57687: 0x05E7,
+  afii57688: 0x05E8,
+  afii57689: 0x05E9,
+  afii57690: 0x05EA,
+  afii57694: 0xFB2A,
+  afii57695: 0xFB2B,
+  afii57700: 0xFB4B,
+  afii57705: 0xFB1F,
+  afii57716: 0x05F0,
+  afii57717: 0x05F1,
+  afii57718: 0x05F2,
+  afii57723: 0xFB35,
+  afii57793: 0x05B4,
+  afii57794: 0x05B5,
+  afii57795: 0x05B6,
+  afii57796: 0x05BB,
+  afii57797: 0x05B8,
+  afii57798: 0x05B7,
+  afii57799: 0x05B0,
+  afii57800: 0x05B2,
+  afii57801: 0x05B1,
+  afii57802: 0x05B3,
+  afii57803: 0x05C2,
+  afii57804: 0x05C1,
+  afii57806: 0x05B9,
+  afii57807: 0x05BC,
+  afii57839: 0x05BD,
+  afii57841: 0x05BF,
+  afii57842: 0x05C0,
+  afii57929: 0x02BC,
+  afii61248: 0x2105,
+  afii61289: 0x2113,
+  afii61352: 0x2116,
+  afii61573: 0x202C,
+  afii61574: 0x202D,
+  afii61575: 0x202E,
+  afii61664: 0x200C,
+  afii63167: 0x066D,
+  afii64937: 0x02BD,
+  agrave: 0x00E0,
+  agujarati: 0x0A85,
+  agurmukhi: 0x0A05,
+  ahiragana: 0x3042,
+  ahookabove: 0x1EA3,
+  aibengali: 0x0990,
+  aibopomofo: 0x311E,
+  aideva: 0x0910,
+  aiecyrillic: 0x04D5,
+  aigujarati: 0x0A90,
+  aigurmukhi: 0x0A10,
+  aimatragurmukhi: 0x0A48,
+  ainarabic: 0x0639,
+  ainfinalarabic: 0xFECA,
+  aininitialarabic: 0xFECB,
+  ainmedialarabic: 0xFECC,
+  ainvertedbreve: 0x0203,
+  aivowelsignbengali: 0x09C8,
+  aivowelsigndeva: 0x0948,
+  aivowelsigngujarati: 0x0AC8,
+  akatakana: 0x30A2,
+  akatakanahalfwidth: 0xFF71,
+  akorean: 0x314F,
+  alef: 0x05D0,
+  alefarabic: 0x0627,
+  alefdageshhebrew: 0xFB30,
+  aleffinalarabic: 0xFE8E,
+  alefhamzaabovearabic: 0x0623,
+  alefhamzaabovefinalarabic: 0xFE84,
+  alefhamzabelowarabic: 0x0625,
+  alefhamzabelowfinalarabic: 0xFE88,
+  alefhebrew: 0x05D0,
+  aleflamedhebrew: 0xFB4F,
+  alefmaddaabovearabic: 0x0622,
+  alefmaddaabovefinalarabic: 0xFE82,
+  alefmaksuraarabic: 0x0649,
+  alefmaksurafinalarabic: 0xFEF0,
+  alefmaksurainitialarabic: 0xFEF3,
+  alefmaksuramedialarabic: 0xFEF4,
+  alefpatahhebrew: 0xFB2E,
+  alefqamatshebrew: 0xFB2F,
+  aleph: 0x2135,
+  allequal: 0x224C,
+  alpha: 0x03B1,
+  alphatonos: 0x03AC,
+  amacron: 0x0101,
+  amonospace: 0xFF41,
+  ampersand: 0x0026,
+  ampersandmonospace: 0xFF06,
+  ampersandsmall: 0xF726,
+  amsquare: 0x33C2,
+  anbopomofo: 0x3122,
+  angbopomofo: 0x3124,
+  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
+  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
+  angkhankhuthai: 0x0E5A,
+  angle: 0x2220,
+  anglebracketleft: 0x3008,
+  anglebracketleftvertical: 0xFE3F,
+  anglebracketright: 0x3009,
+  anglebracketrightvertical: 0xFE40,
+  angleleft: 0x2329,
+  angleright: 0x232A,
+  angstrom: 0x212B,
+  anoteleia: 0x0387,
+  anudattadeva: 0x0952,
+  anusvarabengali: 0x0982,
+  anusvaradeva: 0x0902,
+  anusvaragujarati: 0x0A82,
+  aogonek: 0x0105,
+  apaatosquare: 0x3300,
+  aparen: 0x249C,
+  apostrophearmenian: 0x055A,
+  apostrophemod: 0x02BC,
+  apple: 0xF8FF,
+  approaches: 0x2250,
+  approxequal: 0x2248,
+  approxequalorimage: 0x2252,
+  approximatelyequal: 0x2245,
+  araeaekorean: 0x318E,
+  araeakorean: 0x318D,
+  arc: 0x2312,
+  arighthalfring: 0x1E9A,
+  aring: 0x00E5,
+  aringacute: 0x01FB,
+  aringbelow: 0x1E01,
+  arrowboth: 0x2194,
+  arrowdashdown: 0x21E3,
+  arrowdashleft: 0x21E0,
+  arrowdashright: 0x21E2,
+  arrowdashup: 0x21E1,
+  arrowdblboth: 0x21D4,
+  arrowdbldown: 0x21D3,
+  arrowdblleft: 0x21D0,
+  arrowdblright: 0x21D2,
+  arrowdblup: 0x21D1,
+  arrowdown: 0x2193,
+  arrowdownleft: 0x2199,
+  arrowdownright: 0x2198,
+  arrowdownwhite: 0x21E9,
+  arrowheaddownmod: 0x02C5,
+  arrowheadleftmod: 0x02C2,
+  arrowheadrightmod: 0x02C3,
+  arrowheadupmod: 0x02C4,
+  arrowhorizex: 0xF8E7,
+  arrowleft: 0x2190,
+  arrowleftdbl: 0x21D0,
+  arrowleftdblstroke: 0x21CD,
+  arrowleftoverright: 0x21C6,
+  arrowleftwhite: 0x21E6,
+  arrowright: 0x2192,
+  arrowrightdblstroke: 0x21CF,
+  arrowrightheavy: 0x279E,
+  arrowrightoverleft: 0x21C4,
+  arrowrightwhite: 0x21E8,
+  arrowtableft: 0x21E4,
+  arrowtabright: 0x21E5,
+  arrowup: 0x2191,
+  arrowupdn: 0x2195,
+  arrowupdnbse: 0x21A8,
+  arrowupdownbase: 0x21A8,
+  arrowupleft: 0x2196,
+  arrowupleftofdown: 0x21C5,
+  arrowupright: 0x2197,
+  arrowupwhite: 0x21E7,
+  arrowvertex: 0xF8E6,
+  asciicircum: 0x005E,
+  asciicircummonospace: 0xFF3E,
+  asciitilde: 0x007E,
+  asciitildemonospace: 0xFF5E,
+  ascript: 0x0251,
+  ascriptturned: 0x0252,
+  asmallhiragana: 0x3041,
+  asmallkatakana: 0x30A1,
+  asmallkatakanahalfwidth: 0xFF67,
+  asterisk: 0x002A,
+  asteriskaltonearabic: 0x066D,
+  asteriskarabic: 0x066D,
+  asteriskmath: 0x2217,
+  asteriskmonospace: 0xFF0A,
+  asterisksmall: 0xFE61,
+  asterism: 0x2042,
+  asuperior: 0xF6E9,
+  asymptoticallyequal: 0x2243,
+  at: 0x0040,
+  atilde: 0x00E3,
+  atmonospace: 0xFF20,
+  atsmall: 0xFE6B,
+  aturned: 0x0250,
+  aubengali: 0x0994,
+  aubopomofo: 0x3120,
+  audeva: 0x0914,
+  augujarati: 0x0A94,
+  augurmukhi: 0x0A14,
+  aulengthmarkbengali: 0x09D7,
+  aumatragurmukhi: 0x0A4C,
+  auvowelsignbengali: 0x09CC,
+  auvowelsigndeva: 0x094C,
+  auvowelsigngujarati: 0x0ACC,
+  avagrahadeva: 0x093D,
+  aybarmenian: 0x0561,
+  ayin: 0x05E2,
+  ayinaltonehebrew: 0xFB20,
+  ayinhebrew: 0x05E2,
+  b: 0x0062,
+  babengali: 0x09AC,
+  backslash: 0x005C,
+  backslashmonospace: 0xFF3C,
+  badeva: 0x092C,
+  bagujarati: 0x0AAC,
+  bagurmukhi: 0x0A2C,
+  bahiragana: 0x3070,
+  bahtthai: 0x0E3F,
+  bakatakana: 0x30D0,
+  bar: 0x007C,
+  barmonospace: 0xFF5C,
+  bbopomofo: 0x3105,
+  bcircle: 0x24D1,
+  bdotaccent: 0x1E03,
+  bdotbelow: 0x1E05,
+  beamedsixteenthnotes: 0x266C,
+  because: 0x2235,
+  becyrillic: 0x0431,
+  beharabic: 0x0628,
+  behfinalarabic: 0xFE90,
+  behinitialarabic: 0xFE91,
+  behiragana: 0x3079,
+  behmedialarabic: 0xFE92,
+  behmeeminitialarabic: 0xFC9F,
+  behmeemisolatedarabic: 0xFC08,
+  behnoonfinalarabic: 0xFC6D,
+  bekatakana: 0x30D9,
+  benarmenian: 0x0562,
+  bet: 0x05D1,
+  beta: 0x03B2,
+  betasymbolgreek: 0x03D0,
+  betdagesh: 0xFB31,
+  betdageshhebrew: 0xFB31,
+  bethebrew: 0x05D1,
+  betrafehebrew: 0xFB4C,
+  bhabengali: 0x09AD,
+  bhadeva: 0x092D,
+  bhagujarati: 0x0AAD,
+  bhagurmukhi: 0x0A2D,
+  bhook: 0x0253,
+  bihiragana: 0x3073,
+  bikatakana: 0x30D3,
+  bilabialclick: 0x0298,
+  bindigurmukhi: 0x0A02,
+  birusquare: 0x3331,
+  blackcircle: 0x25CF,
+  blackdiamond: 0x25C6,
+  blackdownpointingtriangle: 0x25BC,
+  blackleftpointingpointer: 0x25C4,
+  blackleftpointingtriangle: 0x25C0,
+  blacklenticularbracketleft: 0x3010,
+  blacklenticularbracketleftvertical: 0xFE3B,
+  blacklenticularbracketright: 0x3011,
+  blacklenticularbracketrightvertical: 0xFE3C,
+  blacklowerlefttriangle: 0x25E3,
+  blacklowerrighttriangle: 0x25E2,
+  blackrectangle: 0x25AC,
+  blackrightpointingpointer: 0x25BA,
+  blackrightpointingtriangle: 0x25B6,
+  blacksmallsquare: 0x25AA,
+  blacksmilingface: 0x263B,
+  blacksquare: 0x25A0,
+  blackstar: 0x2605,
+  blackupperlefttriangle: 0x25E4,
+  blackupperrighttriangle: 0x25E5,
+  blackuppointingsmalltriangle: 0x25B4,
+  blackuppointingtriangle: 0x25B2,
+  blank: 0x2423,
+  blinebelow: 0x1E07,
+  block: 0x2588,
+  bmonospace: 0xFF42,
+  bobaimaithai: 0x0E1A,
+  bohiragana: 0x307C,
+  bokatakana: 0x30DC,
+  bparen: 0x249D,
+  bqsquare: 0x33C3,
+  braceex: 0xF8F4,
+  braceleft: 0x007B,
+  braceleftbt: 0xF8F3,
+  braceleftmid: 0xF8F2,
+  braceleftmonospace: 0xFF5B,
+  braceleftsmall: 0xFE5B,
+  bracelefttp: 0xF8F1,
+  braceleftvertical: 0xFE37,
+  braceright: 0x007D,
+  bracerightbt: 0xF8FE,
+  bracerightmid: 0xF8FD,
+  bracerightmonospace: 0xFF5D,
+  bracerightsmall: 0xFE5C,
+  bracerighttp: 0xF8FC,
+  bracerightvertical: 0xFE38,
+  bracketleft: 0x005B,
+  bracketleftbt: 0xF8F0,
+  bracketleftex: 0xF8EF,
+  bracketleftmonospace: 0xFF3B,
+  bracketlefttp: 0xF8EE,
+  bracketright: 0x005D,
+  bracketrightbt: 0xF8FB,
+  bracketrightex: 0xF8FA,
+  bracketrightmonospace: 0xFF3D,
+  bracketrighttp: 0xF8F9,
+  breve: 0x02D8,
+  brevebelowcmb: 0x032E,
+  brevecmb: 0x0306,
+  breveinvertedbelowcmb: 0x032F,
+  breveinvertedcmb: 0x0311,
+  breveinverteddoublecmb: 0x0361,
+  bridgebelowcmb: 0x032A,
+  bridgeinvertedbelowcmb: 0x033A,
+  brokenbar: 0x00A6,
+  bstroke: 0x0180,
+  bsuperior: 0xF6EA,
+  btopbar: 0x0183,
+  buhiragana: 0x3076,
+  bukatakana: 0x30D6,
+  bullet: 0x2022,
+  bulletinverse: 0x25D8,
+  bulletoperator: 0x2219,
+  bullseye: 0x25CE,
+  c: 0x0063,
+  caarmenian: 0x056E,
+  cabengali: 0x099A,
+  cacute: 0x0107,
+  cadeva: 0x091A,
+  cagujarati: 0x0A9A,
+  cagurmukhi: 0x0A1A,
+  calsquare: 0x3388,
+  candrabindubengali: 0x0981,
+  candrabinducmb: 0x0310,
+  candrabindudeva: 0x0901,
+  candrabindugujarati: 0x0A81,
+  capslock: 0x21EA,
+  careof: 0x2105,
+  caron: 0x02C7,
+  caronbelowcmb: 0x032C,
+  caroncmb: 0x030C,
+  carriagereturn: 0x21B5,
+  cbopomofo: 0x3118,
+  ccaron: 0x010D,
+  ccedilla: 0x00E7,
+  ccedillaacute: 0x1E09,
+  ccircle: 0x24D2,
+  ccircumflex: 0x0109,
+  ccurl: 0x0255,
+  cdot: 0x010B,
+  cdotaccent: 0x010B,
+  cdsquare: 0x33C5,
+  cedilla: 0x00B8,
+  cedillacmb: 0x0327,
+  cent: 0x00A2,
+  centigrade: 0x2103,
+  centinferior: 0xF6DF,
+  centmonospace: 0xFFE0,
+  centoldstyle: 0xF7A2,
+  centsuperior: 0xF6E0,
+  chaarmenian: 0x0579,
+  chabengali: 0x099B,
+  chadeva: 0x091B,
+  chagujarati: 0x0A9B,
+  chagurmukhi: 0x0A1B,
+  chbopomofo: 0x3114,
+  cheabkhasiancyrillic: 0x04BD,
+  checkmark: 0x2713,
+  checyrillic: 0x0447,
+  chedescenderabkhasiancyrillic: 0x04BF,
+  chedescendercyrillic: 0x04B7,
+  chedieresiscyrillic: 0x04F5,
+  cheharmenian: 0x0573,
+  chekhakassiancyrillic: 0x04CC,
+  cheverticalstrokecyrillic: 0x04B9,
+  chi: 0x03C7,
+  chieuchacirclekorean: 0x3277,
+  chieuchaparenkorean: 0x3217,
+  chieuchcirclekorean: 0x3269,
+  chieuchkorean: 0x314A,
+  chieuchparenkorean: 0x3209,
+  chochangthai: 0x0E0A,
+  chochanthai: 0x0E08,
+  chochingthai: 0x0E09,
+  chochoethai: 0x0E0C,
+  chook: 0x0188,
+  cieucacirclekorean: 0x3276,
+  cieucaparenkorean: 0x3216,
+  cieuccirclekorean: 0x3268,
+  cieuckorean: 0x3148,
+  cieucparenkorean: 0x3208,
+  cieucuparenkorean: 0x321C,
+  circle: 0x25CB,
+  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
+  circlemultiply: 0x2297,
+  circleot: 0x2299,
+  circleplus: 0x2295,
+  circlepostalmark: 0x3036,
+  circlewithlefthalfblack: 0x25D0,
+  circlewithrighthalfblack: 0x25D1,
+  circumflex: 0x02C6,
+  circumflexbelowcmb: 0x032D,
+  circumflexcmb: 0x0302,
+  clear: 0x2327,
+  clickalveolar: 0x01C2,
+  clickdental: 0x01C0,
+  clicklateral: 0x01C1,
+  clickretroflex: 0x01C3,
+  club: 0x2663,
+  clubsuitblack: 0x2663,
+  clubsuitwhite: 0x2667,
+  cmcubedsquare: 0x33A4,
+  cmonospace: 0xFF43,
+  cmsquaredsquare: 0x33A0,
+  coarmenian: 0x0581,
+  colon: 0x003A,
+  colonmonetary: 0x20A1,
+  colonmonospace: 0xFF1A,
+  colonsign: 0x20A1,
+  colonsmall: 0xFE55,
+  colontriangularhalfmod: 0x02D1,
+  colontriangularmod: 0x02D0,
+  comma: 0x002C,
+  commaabovecmb: 0x0313,
+  commaaboverightcmb: 0x0315,
+  commaaccent: 0xF6C3,
+  commaarabic: 0x060C,
+  commaarmenian: 0x055D,
+  commainferior: 0xF6E1,
+  commamonospace: 0xFF0C,
+  commareversedabovecmb: 0x0314,
+  commareversedmod: 0x02BD,
+  commasmall: 0xFE50,
+  commasuperior: 0xF6E2,
+  commaturnedabovecmb: 0x0312,
+  commaturnedmod: 0x02BB,
+  compass: 0x263C,
+  congruent: 0x2245,
+  contourintegral: 0x222E,
+  control: 0x2303,
+  controlACK: 0x0006,
+  controlBEL: 0x0007,
+  controlBS: 0x0008,
+  controlCAN: 0x0018,
+  controlCR: 0x000D,
+  controlDC1: 0x0011,
+  controlDC2: 0x0012,
+  controlDC3: 0x0013,
+  controlDC4: 0x0014,
+  controlDEL: 0x007F,
+  controlDLE: 0x0010,
+  controlEM: 0x0019,
+  controlENQ: 0x0005,
+  controlEOT: 0x0004,
+  controlESC: 0x001B,
+  controlETB: 0x0017,
+  controlETX: 0x0003,
+  controlFF: 0x000C,
+  controlFS: 0x001C,
+  controlGS: 0x001D,
+  controlHT: 0x0009,
+  controlLF: 0x000A,
+  controlNAK: 0x0015,
+  controlRS: 0x001E,
+  controlSI: 0x000F,
+  controlSO: 0x000E,
+  controlSOT: 0x0002,
+  controlSTX: 0x0001,
+  controlSUB: 0x001A,
+  controlSYN: 0x0016,
+  controlUS: 0x001F,
+  controlVT: 0x000B,
+  copyright: 0x00A9,
+  copyrightsans: 0xF8E9,
+  copyrightserif: 0xF6D9,
+  cornerbracketleft: 0x300C,
+  cornerbracketlefthalfwidth: 0xFF62,
+  cornerbracketleftvertical: 0xFE41,
+  cornerbracketright: 0x300D,
+  cornerbracketrighthalfwidth: 0xFF63,
+  cornerbracketrightvertical: 0xFE42,
+  corporationsquare: 0x337F,
+  cosquare: 0x33C7,
+  coverkgsquare: 0x33C6,
+  cparen: 0x249E,
+  cruzeiro: 0x20A2,
+  cstretched: 0x0297,
+  curlyand: 0x22CF,
+  curlyor: 0x22CE,
+  currency: 0x00A4,
+  cyrBreve: 0xF6D1,
+  cyrFlex: 0xF6D2,
+  cyrbreve: 0xF6D4,
+  cyrflex: 0xF6D5,
+  d: 0x0064,
+  daarmenian: 0x0564,
+  dabengali: 0x09A6,
+  dadarabic: 0x0636,
+  dadeva: 0x0926,
+  dadfinalarabic: 0xFEBE,
+  dadinitialarabic: 0xFEBF,
+  dadmedialarabic: 0xFEC0,
+  dagesh: 0x05BC,
+  dageshhebrew: 0x05BC,
+  dagger: 0x2020,
+  daggerdbl: 0x2021,
+  dagujarati: 0x0AA6,
+  dagurmukhi: 0x0A26,
+  dahiragana: 0x3060,
+  dakatakana: 0x30C0,
+  dalarabic: 0x062F,
+  dalet: 0x05D3,
+  daletdagesh: 0xFB33,
+  daletdageshhebrew: 0xFB33,
+  dalethebrew: 0x05D3,
+  dalfinalarabic: 0xFEAA,
+  dammaarabic: 0x064F,
+  dammalowarabic: 0x064F,
+  dammatanaltonearabic: 0x064C,
+  dammatanarabic: 0x064C,
+  danda: 0x0964,
+  dargahebrew: 0x05A7,
+  dargalefthebrew: 0x05A7,
+  dasiapneumatacyrilliccmb: 0x0485,
+  dblGrave: 0xF6D3,
+  dblanglebracketleft: 0x300A,
+  dblanglebracketleftvertical: 0xFE3D,
+  dblanglebracketright: 0x300B,
+  dblanglebracketrightvertical: 0xFE3E,
+  dblarchinvertedbelowcmb: 0x032B,
+  dblarrowleft: 0x21D4,
+  dblarrowright: 0x21D2,
+  dbldanda: 0x0965,
+  dblgrave: 0xF6D6,
+  dblgravecmb: 0x030F,
+  dblintegral: 0x222C,
+  dbllowline: 0x2017,
+  dbllowlinecmb: 0x0333,
+  dbloverlinecmb: 0x033F,
+  dblprimemod: 0x02BA,
+  dblverticalbar: 0x2016,
+  dblverticallineabovecmb: 0x030E,
+  dbopomofo: 0x3109,
+  dbsquare: 0x33C8,
+  dcaron: 0x010F,
+  dcedilla: 0x1E11,
+  dcircle: 0x24D3,
+  dcircumflexbelow: 0x1E13,
+  dcroat: 0x0111,
+  ddabengali: 0x09A1,
+  ddadeva: 0x0921,
+  ddagujarati: 0x0AA1,
+  ddagurmukhi: 0x0A21,
+  ddalarabic: 0x0688,
+  ddalfinalarabic: 0xFB89,
+  dddhadeva: 0x095C,
+  ddhabengali: 0x09A2,
+  ddhadeva: 0x0922,
+  ddhagujarati: 0x0AA2,
+  ddhagurmukhi: 0x0A22,
+  ddotaccent: 0x1E0B,
+  ddotbelow: 0x1E0D,
+  decimalseparatorarabic: 0x066B,
+  decimalseparatorpersian: 0x066B,
+  decyrillic: 0x0434,
+  degree: 0x00B0,
+  dehihebrew: 0x05AD,
+  dehiragana: 0x3067,
+  deicoptic: 0x03EF,
+  dekatakana: 0x30C7,
+  deleteleft: 0x232B,
+  deleteright: 0x2326,
+  delta: 0x03B4,
+  deltaturned: 0x018D,
+  denominatorminusonenumeratorbengali: 0x09F8,
+  dezh: 0x02A4,
+  dhabengali: 0x09A7,
+  dhadeva: 0x0927,
+  dhagujarati: 0x0AA7,
+  dhagurmukhi: 0x0A27,
+  dhook: 0x0257,
+  dialytikatonos: 0x0385,
+  dialytikatonoscmb: 0x0344,
+  diamond: 0x2666,
+  diamondsuitwhite: 0x2662,
+  dieresis: 0x00A8,
+  dieresisacute: 0xF6D7,
+  dieresisbelowcmb: 0x0324,
+  dieresiscmb: 0x0308,
+  dieresisgrave: 0xF6D8,
+  dieresistonos: 0x0385,
+  dihiragana: 0x3062,
+  dikatakana: 0x30C2,
+  dittomark: 0x3003,
+  divide: 0x00F7,
+  divides: 0x2223,
+  divisionslash: 0x2215,
+  djecyrillic: 0x0452,
+  dkshade: 0x2593,
+  dlinebelow: 0x1E0F,
+  dlsquare: 0x3397,
+  dmacron: 0x0111,
+  dmonospace: 0xFF44,
+  dnblock: 0x2584,
+  dochadathai: 0x0E0E,
+  dodekthai: 0x0E14,
+  dohiragana: 0x3069,
+  dokatakana: 0x30C9,
+  dollar: 0x0024,
+  dollarinferior: 0xF6E3,
+  dollarmonospace: 0xFF04,
+  dollaroldstyle: 0xF724,
+  dollarsmall: 0xFE69,
+  dollarsuperior: 0xF6E4,
+  dong: 0x20AB,
+  dorusquare: 0x3326,
+  dotaccent: 0x02D9,
+  dotaccentcmb: 0x0307,
+  dotbelowcmb: 0x0323,
+  dotbelowcomb: 0x0323,
+  dotkatakana: 0x30FB,
+  dotlessi: 0x0131,
+  dotlessj: 0xF6BE,
+  dotlessjstrokehook: 0x0284,
+  dotmath: 0x22C5,
+  dottedcircle: 0x25CC,
+  doubleyodpatah: 0xFB1F,
+  doubleyodpatahhebrew: 0xFB1F,
+  downtackbelowcmb: 0x031E,
+  downtackmod: 0x02D5,
+  dparen: 0x249F,
+  dsuperior: 0xF6EB,
+  dtail: 0x0256,
+  dtopbar: 0x018C,
+  duhiragana: 0x3065,
+  dukatakana: 0x30C5,
+  dz: 0x01F3,
+  dzaltone: 0x02A3,
+  dzcaron: 0x01C6,
+  dzcurl: 0x02A5,
+  dzeabkhasiancyrillic: 0x04E1,
+  dzecyrillic: 0x0455,
+  dzhecyrillic: 0x045F,
+  e: 0x0065,
+  eacute: 0x00E9,
+  earth: 0x2641,
+  ebengali: 0x098F,
+  ebopomofo: 0x311C,
+  ebreve: 0x0115,
+  ecandradeva: 0x090D,
+  ecandragujarati: 0x0A8D,
+  ecandravowelsigndeva: 0x0945,
+  ecandravowelsigngujarati: 0x0AC5,
+  ecaron: 0x011B,
+  ecedillabreve: 0x1E1D,
+  echarmenian: 0x0565,
+  echyiwnarmenian: 0x0587,
+  ecircle: 0x24D4,
+  ecircumflex: 0x00EA,
+  ecircumflexacute: 0x1EBF,
+  ecircumflexbelow: 0x1E19,
+  ecircumflexdotbelow: 0x1EC7,
+  ecircumflexgrave: 0x1EC1,
+  ecircumflexhookabove: 0x1EC3,
+  ecircumflextilde: 0x1EC5,
+  ecyrillic: 0x0454,
+  edblgrave: 0x0205,
+  edeva: 0x090F,
+  edieresis: 0x00EB,
+  edot: 0x0117,
+  edotaccent: 0x0117,
+  edotbelow: 0x1EB9,
+  eegurmukhi: 0x0A0F,
+  eematragurmukhi: 0x0A47,
+  efcyrillic: 0x0444,
+  egrave: 0x00E8,
+  egujarati: 0x0A8F,
+  eharmenian: 0x0567,
+  ehbopomofo: 0x311D,
+  ehiragana: 0x3048,
+  ehookabove: 0x1EBB,
+  eibopomofo: 0x311F,
+  eight: 0x0038,
+  eightarabic: 0x0668,
+  eightbengali: 0x09EE,
+  eightcircle: 0x2467,
+  eightcircleinversesansserif: 0x2791,
+  eightdeva: 0x096E,
+  eighteencircle: 0x2471,
+  eighteenparen: 0x2485,
+  eighteenperiod: 0x2499,
+  eightgujarati: 0x0AEE,
+  eightgurmukhi: 0x0A6E,
+  eighthackarabic: 0x0668,
+  eighthangzhou: 0x3028,
+  eighthnotebeamed: 0x266B,
+  eightideographicparen: 0x3227,
+  eightinferior: 0x2088,
+  eightmonospace: 0xFF18,
+  eightoldstyle: 0xF738,
+  eightparen: 0x247B,
+  eightperiod: 0x248F,
+  eightpersian: 0x06F8,
+  eightroman: 0x2177,
+  eightsuperior: 0x2078,
+  eightthai: 0x0E58,
+  einvertedbreve: 0x0207,
+  eiotifiedcyrillic: 0x0465,
+  ekatakana: 0x30A8,
+  ekatakanahalfwidth: 0xFF74,
+  ekonkargurmukhi: 0x0A74,
+  ekorean: 0x3154,
+  elcyrillic: 0x043B,
+  element: 0x2208,
+  elevencircle: 0x246A,
+  elevenparen: 0x247E,
+  elevenperiod: 0x2492,
+  elevenroman: 0x217A,
+  ellipsis: 0x2026,
+  ellipsisvertical: 0x22EE,
+  emacron: 0x0113,
+  emacronacute: 0x1E17,
+  emacrongrave: 0x1E15,
+  emcyrillic: 0x043C,
+  emdash: 0x2014,
+  emdashvertical: 0xFE31,
+  emonospace: 0xFF45,
+  emphasismarkarmenian: 0x055B,
+  emptyset: 0x2205,
+  enbopomofo: 0x3123,
+  encyrillic: 0x043D,
+  endash: 0x2013,
+  endashvertical: 0xFE32,
+  endescendercyrillic: 0x04A3,
+  eng: 0x014B,
+  engbopomofo: 0x3125,
+  enghecyrillic: 0x04A5,
+  enhookcyrillic: 0x04C8,
+  enspace: 0x2002,
+  eogonek: 0x0119,
+  eokorean: 0x3153,
+  eopen: 0x025B,
+  eopenclosed: 0x029A,
+  eopenreversed: 0x025C,
+  eopenreversedclosed: 0x025E,
+  eopenreversedhook: 0x025D,
+  eparen: 0x24A0,
+  epsilon: 0x03B5,
+  epsilontonos: 0x03AD,
+  equal: 0x003D,
+  equalmonospace: 0xFF1D,
+  equalsmall: 0xFE66,
+  equalsuperior: 0x207C,
+  equivalence: 0x2261,
+  erbopomofo: 0x3126,
+  ercyrillic: 0x0440,
+  ereversed: 0x0258,
+  ereversedcyrillic: 0x044D,
+  escyrillic: 0x0441,
+  esdescendercyrillic: 0x04AB,
+  esh: 0x0283,
+  eshcurl: 0x0286,
+  eshortdeva: 0x090E,
+  eshortvowelsigndeva: 0x0946,
+  eshreversedloop: 0x01AA,
+  eshsquatreversed: 0x0285,
+  esmallhiragana: 0x3047,
+  esmallkatakana: 0x30A7,
+  esmallkatakanahalfwidth: 0xFF6A,
+  estimated: 0x212E,
+  esuperior: 0xF6EC,
+  eta: 0x03B7,
+  etarmenian: 0x0568,
+  etatonos: 0x03AE,
+  eth: 0x00F0,
+  etilde: 0x1EBD,
+  etildebelow: 0x1E1B,
+  etnahtafoukhhebrew: 0x0591,
+  etnahtafoukhlefthebrew: 0x0591,
+  etnahtahebrew: 0x0591,
+  etnahtalefthebrew: 0x0591,
+  eturned: 0x01DD,
+  eukorean: 0x3161,
+  euro: 0x20AC,
+  evowelsignbengali: 0x09C7,
+  evowelsigndeva: 0x0947,
+  evowelsigngujarati: 0x0AC7,
+  exclam: 0x0021,
+  exclamarmenian: 0x055C,
+  exclamdbl: 0x203C,
+  exclamdown: 0x00A1,
+  exclamdownsmall: 0xF7A1,
+  exclammonospace: 0xFF01,
+  exclamsmall: 0xF721,
+  existential: 0x2203,
+  ezh: 0x0292,
+  ezhcaron: 0x01EF,
+  ezhcurl: 0x0293,
+  ezhreversed: 0x01B9,
+  ezhtail: 0x01BA,
+  f: 0x0066,
+  fadeva: 0x095E,
+  fagurmukhi: 0x0A5E,
+  fahrenheit: 0x2109,
+  fathaarabic: 0x064E,
+  fathalowarabic: 0x064E,
+  fathatanarabic: 0x064B,
+  fbopomofo: 0x3108,
+  fcircle: 0x24D5,
+  fdotaccent: 0x1E1F,
+  feharabic: 0x0641,
+  feharmenian: 0x0586,
+  fehfinalarabic: 0xFED2,
+  fehinitialarabic: 0xFED3,
+  fehmedialarabic: 0xFED4,
+  feicoptic: 0x03E5,
+  female: 0x2640,
+  ff: 0xFB00,
+  ffi: 0xFB03,
+  ffl: 0xFB04,
+  fi: 0xFB01,
+  fifteencircle: 0x246E,
+  fifteenparen: 0x2482,
+  fifteenperiod: 0x2496,
+  figuredash: 0x2012,
+  filledbox: 0x25A0,
+  filledrect: 0x25AC,
+  finalkaf: 0x05DA,
+  finalkafdagesh: 0xFB3A,
+  finalkafdageshhebrew: 0xFB3A,
+  finalkafhebrew: 0x05DA,
+  finalmem: 0x05DD,
+  finalmemhebrew: 0x05DD,
+  finalnun: 0x05DF,
+  finalnunhebrew: 0x05DF,
+  finalpe: 0x05E3,
+  finalpehebrew: 0x05E3,
+  finaltsadi: 0x05E5,
+  finaltsadihebrew: 0x05E5,
+  firsttonechinese: 0x02C9,
+  fisheye: 0x25C9,
+  fitacyrillic: 0x0473,
+  five: 0x0035,
+  fivearabic: 0x0665,
+  fivebengali: 0x09EB,
+  fivecircle: 0x2464,
+  fivecircleinversesansserif: 0x278E,
+  fivedeva: 0x096B,
+  fiveeighths: 0x215D,
+  fivegujarati: 0x0AEB,
+  fivegurmukhi: 0x0A6B,
+  fivehackarabic: 0x0665,
+  fivehangzhou: 0x3025,
+  fiveideographicparen: 0x3224,
+  fiveinferior: 0x2085,
+  fivemonospace: 0xFF15,
+  fiveoldstyle: 0xF735,
+  fiveparen: 0x2478,
+  fiveperiod: 0x248C,
+  fivepersian: 0x06F5,
+  fiveroman: 0x2174,
+  fivesuperior: 0x2075,
+  fivethai: 0x0E55,
+  fl: 0xFB02,
+  florin: 0x0192,
+  fmonospace: 0xFF46,
+  fmsquare: 0x3399,
+  fofanthai: 0x0E1F,
+  fofathai: 0x0E1D,
+  fongmanthai: 0x0E4F,
+  forall: 0x2200,
+  four: 0x0034,
+  fourarabic: 0x0664,
+  fourbengali: 0x09EA,
+  fourcircle: 0x2463,
+  fourcircleinversesansserif: 0x278D,
+  fourdeva: 0x096A,
+  fourgujarati: 0x0AEA,
+  fourgurmukhi: 0x0A6A,
+  fourhackarabic: 0x0664,
+  fourhangzhou: 0x3024,
+  fourideographicparen: 0x3223,
+  fourinferior: 0x2084,
+  fourmonospace: 0xFF14,
+  fournumeratorbengali: 0x09F7,
+  fouroldstyle: 0xF734,
+  fourparen: 0x2477,
+  fourperiod: 0x248B,
+  fourpersian: 0x06F4,
+  fourroman: 0x2173,
+  foursuperior: 0x2074,
+  fourteencircle: 0x246D,
+  fourteenparen: 0x2481,
+  fourteenperiod: 0x2495,
+  fourthai: 0x0E54,
+  fourthtonechinese: 0x02CB,
+  fparen: 0x24A1,
+  fraction: 0x2044,
+  franc: 0x20A3,
+  g: 0x0067,
+  gabengali: 0x0997,
+  gacute: 0x01F5,
+  gadeva: 0x0917,
+  gafarabic: 0x06AF,
+  gaffinalarabic: 0xFB93,
+  gafinitialarabic: 0xFB94,
+  gafmedialarabic: 0xFB95,
+  gagujarati: 0x0A97,
+  gagurmukhi: 0x0A17,
+  gahiragana: 0x304C,
+  gakatakana: 0x30AC,
+  gamma: 0x03B3,
+  gammalatinsmall: 0x0263,
+  gammasuperior: 0x02E0,
+  gangiacoptic: 0x03EB,
+  gbopomofo: 0x310D,
+  gbreve: 0x011F,
+  gcaron: 0x01E7,
+  gcedilla: 0x0123,
+  gcircle: 0x24D6,
+  gcircumflex: 0x011D,
+  gcommaaccent: 0x0123,
+  gdot: 0x0121,
+  gdotaccent: 0x0121,
+  gecyrillic: 0x0433,
+  gehiragana: 0x3052,
+  gekatakana: 0x30B2,
+  geometricallyequal: 0x2251,
+  gereshaccenthebrew: 0x059C,
+  gereshhebrew: 0x05F3,
+  gereshmuqdamhebrew: 0x059D,
+  germandbls: 0x00DF,
+  gershayimaccenthebrew: 0x059E,
+  gershayimhebrew: 0x05F4,
+  getamark: 0x3013,
+  ghabengali: 0x0998,
+  ghadarmenian: 0x0572,
+  ghadeva: 0x0918,
+  ghagujarati: 0x0A98,
+  ghagurmukhi: 0x0A18,
+  ghainarabic: 0x063A,
+  ghainfinalarabic: 0xFECE,
+  ghaininitialarabic: 0xFECF,
+  ghainmedialarabic: 0xFED0,
+  ghemiddlehookcyrillic: 0x0495,
+  ghestrokecyrillic: 0x0493,
+  gheupturncyrillic: 0x0491,
+  ghhadeva: 0x095A,
+  ghhagurmukhi: 0x0A5A,
+  ghook: 0x0260,
+  ghzsquare: 0x3393,
+  gihiragana: 0x304E,
+  gikatakana: 0x30AE,
+  gimarmenian: 0x0563,
+  gimel: 0x05D2,
+  gimeldagesh: 0xFB32,
+  gimeldageshhebrew: 0xFB32,
+  gimelhebrew: 0x05D2,
+  gjecyrillic: 0x0453,
+  glottalinvertedstroke: 0x01BE,
+  glottalstop: 0x0294,
+  glottalstopinverted: 0x0296,
+  glottalstopmod: 0x02C0,
+  glottalstopreversed: 0x0295,
+  glottalstopreversedmod: 0x02C1,
+  glottalstopreversedsuperior: 0x02E4,
+  glottalstopstroke: 0x02A1,
+  glottalstopstrokereversed: 0x02A2,
+  gmacron: 0x1E21,
+  gmonospace: 0xFF47,
+  gohiragana: 0x3054,
+  gokatakana: 0x30B4,
+  gparen: 0x24A2,
+  gpasquare: 0x33AC,
+  gradient: 0x2207,
+  grave: 0x0060,
+  gravebelowcmb: 0x0316,
+  gravecmb: 0x0300,
+  gravecomb: 0x0300,
+  gravedeva: 0x0953,
+  gravelowmod: 0x02CE,
+  gravemonospace: 0xFF40,
+  gravetonecmb: 0x0340,
+  greater: 0x003E,
+  greaterequal: 0x2265,
+  greaterequalorless: 0x22DB,
+  greatermonospace: 0xFF1E,
+  greaterorequivalent: 0x2273,
+  greaterorless: 0x2277,
+  greateroverequal: 0x2267,
+  greatersmall: 0xFE65,
+  gscript: 0x0261,
+  gstroke: 0x01E5,
+  guhiragana: 0x3050,
+  guillemotleft: 0x00AB,
+  guillemotright: 0x00BB,
+  guilsinglleft: 0x2039,
+  guilsinglright: 0x203A,
+  gukatakana: 0x30B0,
+  guramusquare: 0x3318,
+  gysquare: 0x33C9,
+  h: 0x0068,
+  haabkhasiancyrillic: 0x04A9,
+  haaltonearabic: 0x06C1,
+  habengali: 0x09B9,
+  hadescendercyrillic: 0x04B3,
+  hadeva: 0x0939,
+  hagujarati: 0x0AB9,
+  hagurmukhi: 0x0A39,
+  haharabic: 0x062D,
+  hahfinalarabic: 0xFEA2,
+  hahinitialarabic: 0xFEA3,
+  hahiragana: 0x306F,
+  hahmedialarabic: 0xFEA4,
+  haitusquare: 0x332A,
+  hakatakana: 0x30CF,
+  hakatakanahalfwidth: 0xFF8A,
+  halantgurmukhi: 0x0A4D,
+  hamzaarabic: 0x0621,
+  hamzalowarabic: 0x0621,
+  hangulfiller: 0x3164,
+  hardsigncyrillic: 0x044A,
+  harpoonleftbarbup: 0x21BC,
+  harpoonrightbarbup: 0x21C0,
+  hasquare: 0x33CA,
+  hatafpatah: 0x05B2,
+  hatafpatah16: 0x05B2,
+  hatafpatah23: 0x05B2,
+  hatafpatah2f: 0x05B2,
+  hatafpatahhebrew: 0x05B2,
+  hatafpatahnarrowhebrew: 0x05B2,
+  hatafpatahquarterhebrew: 0x05B2,
+  hatafpatahwidehebrew: 0x05B2,
+  hatafqamats: 0x05B3,
+  hatafqamats1b: 0x05B3,
+  hatafqamats28: 0x05B3,
+  hatafqamats34: 0x05B3,
+  hatafqamatshebrew: 0x05B3,
+  hatafqamatsnarrowhebrew: 0x05B3,
+  hatafqamatsquarterhebrew: 0x05B3,
+  hatafqamatswidehebrew: 0x05B3,
+  hatafsegol: 0x05B1,
+  hatafsegol17: 0x05B1,
+  hatafsegol24: 0x05B1,
+  hatafsegol30: 0x05B1,
+  hatafsegolhebrew: 0x05B1,
+  hatafsegolnarrowhebrew: 0x05B1,
+  hatafsegolquarterhebrew: 0x05B1,
+  hatafsegolwidehebrew: 0x05B1,
+  hbar: 0x0127,
+  hbopomofo: 0x310F,
+  hbrevebelow: 0x1E2B,
+  hcedilla: 0x1E29,
+  hcircle: 0x24D7,
+  hcircumflex: 0x0125,
+  hdieresis: 0x1E27,
+  hdotaccent: 0x1E23,
+  hdotbelow: 0x1E25,
+  he: 0x05D4,
+  heart: 0x2665,
+  heartsuitblack: 0x2665,
+  heartsuitwhite: 0x2661,
+  hedagesh: 0xFB34,
+  hedageshhebrew: 0xFB34,
+  hehaltonearabic: 0x06C1,
+  heharabic: 0x0647,
+  hehebrew: 0x05D4,
+  hehfinalaltonearabic: 0xFBA7,
+  hehfinalalttwoarabic: 0xFEEA,
+  hehfinalarabic: 0xFEEA,
+  hehhamzaabovefinalarabic: 0xFBA5,
+  hehhamzaaboveisolatedarabic: 0xFBA4,
+  hehinitialaltonearabic: 0xFBA8,
+  hehinitialarabic: 0xFEEB,
+  hehiragana: 0x3078,
+  hehmedialaltonearabic: 0xFBA9,
+  hehmedialarabic: 0xFEEC,
+  heiseierasquare: 0x337B,
+  hekatakana: 0x30D8,
+  hekatakanahalfwidth: 0xFF8D,
+  hekutaarusquare: 0x3336,
+  henghook: 0x0267,
+  herutusquare: 0x3339,
+  het: 0x05D7,
+  hethebrew: 0x05D7,
+  hhook: 0x0266,
+  hhooksuperior: 0x02B1,
+  hieuhacirclekorean: 0x327B,
+  hieuhaparenkorean: 0x321B,
+  hieuhcirclekorean: 0x326D,
+  hieuhkorean: 0x314E,
+  hieuhparenkorean: 0x320D,
+  hihiragana: 0x3072,
+  hikatakana: 0x30D2,
+  hikatakanahalfwidth: 0xFF8B,
+  hiriq: 0x05B4,
+  hiriq14: 0x05B4,
+  hiriq21: 0x05B4,
+  hiriq2d: 0x05B4,
+  hiriqhebrew: 0x05B4,
+  hiriqnarrowhebrew: 0x05B4,
+  hiriqquarterhebrew: 0x05B4,
+  hiriqwidehebrew: 0x05B4,
+  hlinebelow: 0x1E96,
+  hmonospace: 0xFF48,
+  hoarmenian: 0x0570,
+  hohipthai: 0x0E2B,
+  hohiragana: 0x307B,
+  hokatakana: 0x30DB,
+  hokatakanahalfwidth: 0xFF8E,
+  holam: 0x05B9,
+  holam19: 0x05B9,
+  holam26: 0x05B9,
+  holam32: 0x05B9,
+  holamhebrew: 0x05B9,
+  holamnarrowhebrew: 0x05B9,
+  holamquarterhebrew: 0x05B9,
+  holamwidehebrew: 0x05B9,
+  honokhukthai: 0x0E2E,
+  hookabovecomb: 0x0309,
+  hookcmb: 0x0309,
+  hookpalatalizedbelowcmb: 0x0321,
+  hookretroflexbelowcmb: 0x0322,
+  hoonsquare: 0x3342,
+  horicoptic: 0x03E9,
+  horizontalbar: 0x2015,
+  horncmb: 0x031B,
+  hotsprings: 0x2668,
+  house: 0x2302,
+  hparen: 0x24A3,
+  hsuperior: 0x02B0,
+  hturned: 0x0265,
+  huhiragana: 0x3075,
+  huiitosquare: 0x3333,
+  hukatakana: 0x30D5,
+  hukatakanahalfwidth: 0xFF8C,
+  hungarumlaut: 0x02DD,
+  hungarumlautcmb: 0x030B,
+  hv: 0x0195,
+  hyphen: 0x002D,
+  hypheninferior: 0xF6E5,
+  hyphenmonospace: 0xFF0D,
+  hyphensmall: 0xFE63,
+  hyphensuperior: 0xF6E6,
+  hyphentwo: 0x2010,
+  i: 0x0069,
+  iacute: 0x00ED,
+  iacyrillic: 0x044F,
+  ibengali: 0x0987,
+  ibopomofo: 0x3127,
+  ibreve: 0x012D,
+  icaron: 0x01D0,
+  icircle: 0x24D8,
+  icircumflex: 0x00EE,
+  icyrillic: 0x0456,
+  idblgrave: 0x0209,
+  ideographearthcircle: 0x328F,
+  ideographfirecircle: 0x328B,
+  ideographicallianceparen: 0x323F,
+  ideographiccallparen: 0x323A,
+  ideographiccentrecircle: 0x32A5,
+  ideographicclose: 0x3006,
+  ideographiccomma: 0x3001,
+  ideographiccommaleft: 0xFF64,
+  ideographiccongratulationparen: 0x3237,
+  ideographiccorrectcircle: 0x32A3,
+  ideographicearthparen: 0x322F,
+  ideographicenterpriseparen: 0x323D,
+  ideographicexcellentcircle: 0x329D,
+  ideographicfestivalparen: 0x3240,
+  ideographicfinancialcircle: 0x3296,
+  ideographicfinancialparen: 0x3236,
+  ideographicfireparen: 0x322B,
+  ideographichaveparen: 0x3232,
+  ideographichighcircle: 0x32A4,
+  ideographiciterationmark: 0x3005,
+  ideographiclaborcircle: 0x3298,
+  ideographiclaborparen: 0x3238,
+  ideographicleftcircle: 0x32A7,
+  ideographiclowcircle: 0x32A6,
+  ideographicmedicinecircle: 0x32A9,
+  ideographicmetalparen: 0x322E,
+  ideographicmoonparen: 0x322A,
+  ideographicnameparen: 0x3234,
+  ideographicperiod: 0x3002,
+  ideographicprintcircle: 0x329E,
+  ideographicreachparen: 0x3243,
+  ideographicrepresentparen: 0x3239,
+  ideographicresourceparen: 0x323E,
+  ideographicrightcircle: 0x32A8,
+  ideographicsecretcircle: 0x3299,
+  ideographicselfparen: 0x3242,
+  ideographicsocietyparen: 0x3233,
+  ideographicspace: 0x3000,
+  ideographicspecialparen: 0x3235,
+  ideographicstockparen: 0x3231,
+  ideographicstudyparen: 0x323B,
+  ideographicsunparen: 0x3230,
+  ideographicsuperviseparen: 0x323C,
+  ideographicwaterparen: 0x322C,
+  ideographicwoodparen: 0x322D,
+  ideographiczero: 0x3007,
+  ideographmetalcircle: 0x328E,
+  ideographmooncircle: 0x328A,
+  ideographnamecircle: 0x3294,
+  ideographsuncircle: 0x3290,
+  ideographwatercircle: 0x328C,
+  ideographwoodcircle: 0x328D,
+  ideva: 0x0907,
+  idieresis: 0x00EF,
+  idieresisacute: 0x1E2F,
+  idieresiscyrillic: 0x04E5,
+  idotbelow: 0x1ECB,
+  iebrevecyrillic: 0x04D7,
+  iecyrillic: 0x0435,
+  ieungacirclekorean: 0x3275,
+  ieungaparenkorean: 0x3215,
+  ieungcirclekorean: 0x3267,
+  ieungkorean: 0x3147,
+  ieungparenkorean: 0x3207,
+  igrave: 0x00EC,
+  igujarati: 0x0A87,
+  igurmukhi: 0x0A07,
+  ihiragana: 0x3044,
+  ihookabove: 0x1EC9,
+  iibengali: 0x0988,
+  iicyrillic: 0x0438,
+  iideva: 0x0908,
+  iigujarati: 0x0A88,
+  iigurmukhi: 0x0A08,
+  iimatragurmukhi: 0x0A40,
+  iinvertedbreve: 0x020B,
+  iishortcyrillic: 0x0439,
+  iivowelsignbengali: 0x09C0,
+  iivowelsigndeva: 0x0940,
+  iivowelsigngujarati: 0x0AC0,
+  ij: 0x0133,
+  ikatakana: 0x30A4,
+  ikatakanahalfwidth: 0xFF72,
+  ikorean: 0x3163,
+  ilde: 0x02DC,
+  iluyhebrew: 0x05AC,
+  imacron: 0x012B,
+  imacroncyrillic: 0x04E3,
+  imageorapproximatelyequal: 0x2253,
+  imatragurmukhi: 0x0A3F,
+  imonospace: 0xFF49,
+  increment: 0x2206,
+  infinity: 0x221E,
+  iniarmenian: 0x056B,
+  integral: 0x222B,
+  integralbottom: 0x2321,
+  integralbt: 0x2321,
+  integralex: 0xF8F5,
+  integraltop: 0x2320,
+  integraltp: 0x2320,
+  intersection: 0x2229,
+  intisquare: 0x3305,
+  invbullet: 0x25D8,
+  invcircle: 0x25D9,
+  invsmileface: 0x263B,
+  iocyrillic: 0x0451,
+  iogonek: 0x012F,
+  iota: 0x03B9,
+  iotadieresis: 0x03CA,
+  iotadieresistonos: 0x0390,
+  iotalatin: 0x0269,
+  iotatonos: 0x03AF,
+  iparen: 0x24A4,
+  irigurmukhi: 0x0A72,
+  ismallhiragana: 0x3043,
+  ismallkatakana: 0x30A3,
+  ismallkatakanahalfwidth: 0xFF68,
+  issharbengali: 0x09FA,
+  istroke: 0x0268,
+  isuperior: 0xF6ED,
+  iterationhiragana: 0x309D,
+  iterationkatakana: 0x30FD,
+  itilde: 0x0129,
+  itildebelow: 0x1E2D,
+  iubopomofo: 0x3129,
+  iucyrillic: 0x044E,
+  ivowelsignbengali: 0x09BF,
+  ivowelsigndeva: 0x093F,
+  ivowelsigngujarati: 0x0ABF,
+  izhitsacyrillic: 0x0475,
+  izhitsadblgravecyrillic: 0x0477,
+  j: 0x006A,
+  jaarmenian: 0x0571,
+  jabengali: 0x099C,
+  jadeva: 0x091C,
+  jagujarati: 0x0A9C,
+  jagurmukhi: 0x0A1C,
+  jbopomofo: 0x3110,
+  jcaron: 0x01F0,
+  jcircle: 0x24D9,
+  jcircumflex: 0x0135,
+  jcrossedtail: 0x029D,
+  jdotlessstroke: 0x025F,
+  jecyrillic: 0x0458,
+  jeemarabic: 0x062C,
+  jeemfinalarabic: 0xFE9E,
+  jeeminitialarabic: 0xFE9F,
+  jeemmedialarabic: 0xFEA0,
+  jeharabic: 0x0698,
+  jehfinalarabic: 0xFB8B,
+  jhabengali: 0x099D,
+  jhadeva: 0x091D,
+  jhagujarati: 0x0A9D,
+  jhagurmukhi: 0x0A1D,
+  jheharmenian: 0x057B,
+  jis: 0x3004,
+  jmonospace: 0xFF4A,
+  jparen: 0x24A5,
+  jsuperior: 0x02B2,
+  k: 0x006B,
+  kabashkircyrillic: 0x04A1,
+  kabengali: 0x0995,
+  kacute: 0x1E31,
+  kacyrillic: 0x043A,
+  kadescendercyrillic: 0x049B,
+  kadeva: 0x0915,
+  kaf: 0x05DB,
+  kafarabic: 0x0643,
+  kafdagesh: 0xFB3B,
+  kafdageshhebrew: 0xFB3B,
+  kaffinalarabic: 0xFEDA,
+  kafhebrew: 0x05DB,
+  kafinitialarabic: 0xFEDB,
+  kafmedialarabic: 0xFEDC,
+  kafrafehebrew: 0xFB4D,
+  kagujarati: 0x0A95,
+  kagurmukhi: 0x0A15,
+  kahiragana: 0x304B,
+  kahookcyrillic: 0x04C4,
+  kakatakana: 0x30AB,
+  kakatakanahalfwidth: 0xFF76,
+  kappa: 0x03BA,
+  kappasymbolgreek: 0x03F0,
+  kapyeounmieumkorean: 0x3171,
+  kapyeounphieuphkorean: 0x3184,
+  kapyeounpieupkorean: 0x3178,
+  kapyeounssangpieupkorean: 0x3179,
+  karoriisquare: 0x330D,
+  kashidaautoarabic: 0x0640,
+  kashidaautonosidebearingarabic: 0x0640,
+  kasmallkatakana: 0x30F5,
+  kasquare: 0x3384,
+  kasraarabic: 0x0650,
+  kasratanarabic: 0x064D,
+  kastrokecyrillic: 0x049F,
+  katahiraprolongmarkhalfwidth: 0xFF70,
+  kaverticalstrokecyrillic: 0x049D,
+  kbopomofo: 0x310E,
+  kcalsquare: 0x3389,
+  kcaron: 0x01E9,
+  kcedilla: 0x0137,
+  kcircle: 0x24DA,
+  kcommaaccent: 0x0137,
+  kdotbelow: 0x1E33,
+  keharmenian: 0x0584,
+  kehiragana: 0x3051,
+  kekatakana: 0x30B1,
+  kekatakanahalfwidth: 0xFF79,
+  kenarmenian: 0x056F,
+  kesmallkatakana: 0x30F6,
+  kgreenlandic: 0x0138,
+  khabengali: 0x0996,
+  khacyrillic: 0x0445,
+  khadeva: 0x0916,
+  khagujarati: 0x0A96,
+  khagurmukhi: 0x0A16,
+  khaharabic: 0x062E,
+  khahfinalarabic: 0xFEA6,
+  khahinitialarabic: 0xFEA7,
+  khahmedialarabic: 0xFEA8,
+  kheicoptic: 0x03E7,
+  khhadeva: 0x0959,
+  khhagurmukhi: 0x0A59,
+  khieukhacirclekorean: 0x3278,
+  khieukhaparenkorean: 0x3218,
+  khieukhcirclekorean: 0x326A,
+  khieukhkorean: 0x314B,
+  khieukhparenkorean: 0x320A,
+  khokhaithai: 0x0E02,
+  khokhonthai: 0x0E05,
+  khokhuatthai: 0x0E03,
+  khokhwaithai: 0x0E04,
+  khomutthai: 0x0E5B,
+  khook: 0x0199,
+  khorakhangthai: 0x0E06,
+  khzsquare: 0x3391,
+  kihiragana: 0x304D,
+  kikatakana: 0x30AD,
+  kikatakanahalfwidth: 0xFF77,
+  kiroguramusquare: 0x3315,
+  kiromeetorusquare: 0x3316,
+  kirosquare: 0x3314,
+  kiyeokacirclekorean: 0x326E,
+  kiyeokaparenkorean: 0x320E,
+  kiyeokcirclekorean: 0x3260,
+  kiyeokkorean: 0x3131,
+  kiyeokparenkorean: 0x3200,
+  kiyeoksioskorean: 0x3133,
+  kjecyrillic: 0x045C,
+  klinebelow: 0x1E35,
+  klsquare: 0x3398,
+  kmcubedsquare: 0x33A6,
+  kmonospace: 0xFF4B,
+  kmsquaredsquare: 0x33A2,
+  kohiragana: 0x3053,
+  kohmsquare: 0x33C0,
+  kokaithai: 0x0E01,
+  kokatakana: 0x30B3,
+  kokatakanahalfwidth: 0xFF7A,
+  kooposquare: 0x331E,
+  koppacyrillic: 0x0481,
+  koreanstandardsymbol: 0x327F,
+  koroniscmb: 0x0343,
+  kparen: 0x24A6,
+  kpasquare: 0x33AA,
+  ksicyrillic: 0x046F,
+  ktsquare: 0x33CF,
+  kturned: 0x029E,
+  kuhiragana: 0x304F,
+  kukatakana: 0x30AF,
+  kukatakanahalfwidth: 0xFF78,
+  kvsquare: 0x33B8,
+  kwsquare: 0x33BE,
+  l: 0x006C,
+  labengali: 0x09B2,
+  lacute: 0x013A,
+  ladeva: 0x0932,
+  lagujarati: 0x0AB2,
+  lagurmukhi: 0x0A32,
+  lakkhangyaothai: 0x0E45,
+  lamaleffinalarabic: 0xFEFC,
+  lamalefhamzaabovefinalarabic: 0xFEF8,
+  lamalefhamzaaboveisolatedarabic: 0xFEF7,
+  lamalefhamzabelowfinalarabic: 0xFEFA,
+  lamalefhamzabelowisolatedarabic: 0xFEF9,
+  lamalefisolatedarabic: 0xFEFB,
+  lamalefmaddaabovefinalarabic: 0xFEF6,
+  lamalefmaddaaboveisolatedarabic: 0xFEF5,
+  lamarabic: 0x0644,
+  lambda: 0x03BB,
+  lambdastroke: 0x019B,
+  lamed: 0x05DC,
+  lameddagesh: 0xFB3C,
+  lameddageshhebrew: 0xFB3C,
+  lamedhebrew: 0x05DC,
+  lamfinalarabic: 0xFEDE,
+  lamhahinitialarabic: 0xFCCA,
+  laminitialarabic: 0xFEDF,
+  lamjeeminitialarabic: 0xFCC9,
+  lamkhahinitialarabic: 0xFCCB,
+  lamlamhehisolatedarabic: 0xFDF2,
+  lammedialarabic: 0xFEE0,
+  lammeemhahinitialarabic: 0xFD88,
+  lammeeminitialarabic: 0xFCCC,
+  largecircle: 0x25EF,
+  lbar: 0x019A,
+  lbelt: 0x026C,
+  lbopomofo: 0x310C,
+  lcaron: 0x013E,
+  lcedilla: 0x013C,
+  lcircle: 0x24DB,
+  lcircumflexbelow: 0x1E3D,
+  lcommaaccent: 0x013C,
+  ldot: 0x0140,
+  ldotaccent: 0x0140,
+  ldotbelow: 0x1E37,
+  ldotbelowmacron: 0x1E39,
+  leftangleabovecmb: 0x031A,
+  lefttackbelowcmb: 0x0318,
+  less: 0x003C,
+  lessequal: 0x2264,
+  lessequalorgreater: 0x22DA,
+  lessmonospace: 0xFF1C,
+  lessorequivalent: 0x2272,
+  lessorgreater: 0x2276,
+  lessoverequal: 0x2266,
+  lesssmall: 0xFE64,
+  lezh: 0x026E,
+  lfblock: 0x258C,
+  lhookretroflex: 0x026D,
+  lira: 0x20A4,
+  liwnarmenian: 0x056C,
+  lj: 0x01C9,
+  ljecyrillic: 0x0459,
+  ll: 0xF6C0,
+  lladeva: 0x0933,
+  llagujarati: 0x0AB3,
+  llinebelow: 0x1E3B,
+  llladeva: 0x0934,
+  llvocalicbengali: 0x09E1,
+  llvocalicdeva: 0x0961,
+  llvocalicvowelsignbengali: 0x09E3,
+  llvocalicvowelsigndeva: 0x0963,
+  lmiddletilde: 0x026B,
+  lmonospace: 0xFF4C,
+  lmsquare: 0x33D0,
+  lochulathai: 0x0E2C,
+  logicaland: 0x2227,
+  logicalnot: 0x00AC,
+  logicalnotreversed: 0x2310,
+  logicalor: 0x2228,
+  lolingthai: 0x0E25,
+  longs: 0x017F,
+  lowlinecenterline: 0xFE4E,
+  lowlinecmb: 0x0332,
+  lowlinedashed: 0xFE4D,
+  lozenge: 0x25CA,
+  lparen: 0x24A7,
+  lslash: 0x0142,
+  lsquare: 0x2113,
+  lsuperior: 0xF6EE,
+  ltshade: 0x2591,
+  luthai: 0x0E26,
+  lvocalicbengali: 0x098C,
+  lvocalicdeva: 0x090C,
+  lvocalicvowelsignbengali: 0x09E2,
+  lvocalicvowelsigndeva: 0x0962,
+  lxsquare: 0x33D3,
+  m: 0x006D,
+  mabengali: 0x09AE,
+  macron: 0x00AF,
+  macronbelowcmb: 0x0331,
+  macroncmb: 0x0304,
+  macronlowmod: 0x02CD,
+  macronmonospace: 0xFFE3,
+  macute: 0x1E3F,
+  madeva: 0x092E,
+  magujarati: 0x0AAE,
+  magurmukhi: 0x0A2E,
+  mahapakhhebrew: 0x05A4,
+  mahapakhlefthebrew: 0x05A4,
+  mahiragana: 0x307E,
+  maichattawalowleftthai: 0xF895,
+  maichattawalowrightthai: 0xF894,
+  maichattawathai: 0x0E4B,
+  maichattawaupperleftthai: 0xF893,
+  maieklowleftthai: 0xF88C,
+  maieklowrightthai: 0xF88B,
+  maiekthai: 0x0E48,
+  maiekupperleftthai: 0xF88A,
+  maihanakatleftthai: 0xF884,
+  maihanakatthai: 0x0E31,
+  maitaikhuleftthai: 0xF889,
+  maitaikhuthai: 0x0E47,
+  maitholowleftthai: 0xF88F,
+  maitholowrightthai: 0xF88E,
+  maithothai: 0x0E49,
+  maithoupperleftthai: 0xF88D,
+  maitrilowleftthai: 0xF892,
+  maitrilowrightthai: 0xF891,
+  maitrithai: 0x0E4A,
+  maitriupperleftthai: 0xF890,
+  maiyamokthai: 0x0E46,
+  makatakana: 0x30DE,
+  makatakanahalfwidth: 0xFF8F,
+  male: 0x2642,
+  mansyonsquare: 0x3347,
+  maqafhebrew: 0x05BE,
+  mars: 0x2642,
+  masoracirclehebrew: 0x05AF,
+  masquare: 0x3383,
+  mbopomofo: 0x3107,
+  mbsquare: 0x33D4,
+  mcircle: 0x24DC,
+  mcubedsquare: 0x33A5,
+  mdotaccent: 0x1E41,
+  mdotbelow: 0x1E43,
+  meemarabic: 0x0645,
+  meemfinalarabic: 0xFEE2,
+  meeminitialarabic: 0xFEE3,
+  meemmedialarabic: 0xFEE4,
+  meemmeeminitialarabic: 0xFCD1,
+  meemmeemisolatedarabic: 0xFC48,
+  meetorusquare: 0x334D,
+  mehiragana: 0x3081,
+  meizierasquare: 0x337E,
+  mekatakana: 0x30E1,
+  mekatakanahalfwidth: 0xFF92,
+  mem: 0x05DE,
+  memdagesh: 0xFB3E,
+  memdageshhebrew: 0xFB3E,
+  memhebrew: 0x05DE,
+  menarmenian: 0x0574,
+  merkhahebrew: 0x05A5,
+  merkhakefulahebrew: 0x05A6,
+  merkhakefulalefthebrew: 0x05A6,
+  merkhalefthebrew: 0x05A5,
+  mhook: 0x0271,
+  mhzsquare: 0x3392,
+  middledotkatakanahalfwidth: 0xFF65,
+  middot: 0x00B7,
+  mieumacirclekorean: 0x3272,
+  mieumaparenkorean: 0x3212,
+  mieumcirclekorean: 0x3264,
+  mieumkorean: 0x3141,
+  mieumpansioskorean: 0x3170,
+  mieumparenkorean: 0x3204,
+  mieumpieupkorean: 0x316E,
+  mieumsioskorean: 0x316F,
+  mihiragana: 0x307F,
+  mikatakana: 0x30DF,
+  mikatakanahalfwidth: 0xFF90,
+  minus: 0x2212,
+  minusbelowcmb: 0x0320,
+  minuscircle: 0x2296,
+  minusmod: 0x02D7,
+  minusplus: 0x2213,
+  minute: 0x2032,
+  miribaarusquare: 0x334A,
+  mirisquare: 0x3349,
+  mlonglegturned: 0x0270,
+  mlsquare: 0x3396,
+  mmcubedsquare: 0x33A3,
+  mmonospace: 0xFF4D,
+  mmsquaredsquare: 0x339F,
+  mohiragana: 0x3082,
+  mohmsquare: 0x33C1,
+  mokatakana: 0x30E2,
+  mokatakanahalfwidth: 0xFF93,
+  molsquare: 0x33D6,
+  momathai: 0x0E21,
+  moverssquare: 0x33A7,
+  moverssquaredsquare: 0x33A8,
+  mparen: 0x24A8,
+  mpasquare: 0x33AB,
+  mssquare: 0x33B3,
+  msuperior: 0xF6EF,
+  mturned: 0x026F,
+  mu: 0x00B5,
+  mu1: 0x00B5,
+  muasquare: 0x3382,
+  muchgreater: 0x226B,
+  muchless: 0x226A,
+  mufsquare: 0x338C,
+  mugreek: 0x03BC,
+  mugsquare: 0x338D,
+  muhiragana: 0x3080,
+  mukatakana: 0x30E0,
+  mukatakanahalfwidth: 0xFF91,
+  mulsquare: 0x3395,
+  multiply: 0x00D7,
+  mumsquare: 0x339B,
+  munahhebrew: 0x05A3,
+  munahlefthebrew: 0x05A3,
+  musicalnote: 0x266A,
+  musicalnotedbl: 0x266B,
+  musicflatsign: 0x266D,
+  musicsharpsign: 0x266F,
+  mussquare: 0x33B2,
+  muvsquare: 0x33B6,
+  muwsquare: 0x33BC,
+  mvmegasquare: 0x33B9,
+  mvsquare: 0x33B7,
+  mwmegasquare: 0x33BF,
+  mwsquare: 0x33BD,
+  n: 0x006E,
+  nabengali: 0x09A8,
+  nabla: 0x2207,
+  nacute: 0x0144,
+  nadeva: 0x0928,
+  nagujarati: 0x0AA8,
+  nagurmukhi: 0x0A28,
+  nahiragana: 0x306A,
+  nakatakana: 0x30CA,
+  nakatakanahalfwidth: 0xFF85,
+  napostrophe: 0x0149,
+  nasquare: 0x3381,
+  nbopomofo: 0x310B,
+  nbspace: 0x00A0,
+  ncaron: 0x0148,
+  ncedilla: 0x0146,
+  ncircle: 0x24DD,
+  ncircumflexbelow: 0x1E4B,
+  ncommaaccent: 0x0146,
+  ndotaccent: 0x1E45,
+  ndotbelow: 0x1E47,
+  nehiragana: 0x306D,
+  nekatakana: 0x30CD,
+  nekatakanahalfwidth: 0xFF88,
+  newsheqelsign: 0x20AA,
+  nfsquare: 0x338B,
+  ngabengali: 0x0999,
+  ngadeva: 0x0919,
+  ngagujarati: 0x0A99,
+  ngagurmukhi: 0x0A19,
+  ngonguthai: 0x0E07,
+  nhiragana: 0x3093,
+  nhookleft: 0x0272,
+  nhookretroflex: 0x0273,
+  nieunacirclekorean: 0x326F,
+  nieunaparenkorean: 0x320F,
+  nieuncieuckorean: 0x3135,
+  nieuncirclekorean: 0x3261,
+  nieunhieuhkorean: 0x3136,
+  nieunkorean: 0x3134,
+  nieunpansioskorean: 0x3168,
+  nieunparenkorean: 0x3201,
+  nieunsioskorean: 0x3167,
+  nieuntikeutkorean: 0x3166,
+  nihiragana: 0x306B,
+  nikatakana: 0x30CB,
+  nikatakanahalfwidth: 0xFF86,
+  nikhahitleftthai: 0xF899,
+  nikhahitthai: 0x0E4D,
+  nine: 0x0039,
+  ninearabic: 0x0669,
+  ninebengali: 0x09EF,
+  ninecircle: 0x2468,
+  ninecircleinversesansserif: 0x2792,
+  ninedeva: 0x096F,
+  ninegujarati: 0x0AEF,
+  ninegurmukhi: 0x0A6F,
+  ninehackarabic: 0x0669,
+  ninehangzhou: 0x3029,
+  nineideographicparen: 0x3228,
+  nineinferior: 0x2089,
+  ninemonospace: 0xFF19,
+  nineoldstyle: 0xF739,
+  nineparen: 0x247C,
+  nineperiod: 0x2490,
+  ninepersian: 0x06F9,
+  nineroman: 0x2178,
+  ninesuperior: 0x2079,
+  nineteencircle: 0x2472,
+  nineteenparen: 0x2486,
+  nineteenperiod: 0x249A,
+  ninethai: 0x0E59,
+  nj: 0x01CC,
+  njecyrillic: 0x045A,
+  nkatakana: 0x30F3,
+  nkatakanahalfwidth: 0xFF9D,
+  nlegrightlong: 0x019E,
+  nlinebelow: 0x1E49,
+  nmonospace: 0xFF4E,
+  nmsquare: 0x339A,
+  nnabengali: 0x09A3,
+  nnadeva: 0x0923,
+  nnagujarati: 0x0AA3,
+  nnagurmukhi: 0x0A23,
+  nnnadeva: 0x0929,
+  nohiragana: 0x306E,
+  nokatakana: 0x30CE,
+  nokatakanahalfwidth: 0xFF89,
+  nonbreakingspace: 0x00A0,
+  nonenthai: 0x0E13,
+  nonuthai: 0x0E19,
+  noonarabic: 0x0646,
+  noonfinalarabic: 0xFEE6,
+  noonghunnaarabic: 0x06BA,
+  noonghunnafinalarabic: 0xFB9F,
+  nooninitialarabic: 0xFEE7,
+  noonjeeminitialarabic: 0xFCD2,
+  noonjeemisolatedarabic: 0xFC4B,
+  noonmedialarabic: 0xFEE8,
+  noonmeeminitialarabic: 0xFCD5,
+  noonmeemisolatedarabic: 0xFC4E,
+  noonnoonfinalarabic: 0xFC8D,
+  notcontains: 0x220C,
+  notelement: 0x2209,
+  notelementof: 0x2209,
+  notequal: 0x2260,
+  notgreater: 0x226F,
+  notgreaternorequal: 0x2271,
+  notgreaternorless: 0x2279,
+  notidentical: 0x2262,
+  notless: 0x226E,
+  notlessnorequal: 0x2270,
+  notparallel: 0x2226,
+  notprecedes: 0x2280,
+  notsubset: 0x2284,
+  notsucceeds: 0x2281,
+  notsuperset: 0x2285,
+  nowarmenian: 0x0576,
+  nparen: 0x24A9,
+  nssquare: 0x33B1,
+  nsuperior: 0x207F,
+  ntilde: 0x00F1,
+  nu: 0x03BD,
+  nuhiragana: 0x306C,
+  nukatakana: 0x30CC,
+  nukatakanahalfwidth: 0xFF87,
+  nuktabengali: 0x09BC,
+  nuktadeva: 0x093C,
+  nuktagujarati: 0x0ABC,
+  nuktagurmukhi: 0x0A3C,
+  numbersign: 0x0023,
+  numbersignmonospace: 0xFF03,
+  numbersignsmall: 0xFE5F,
+  numeralsigngreek: 0x0374,
+  numeralsignlowergreek: 0x0375,
+  numero: 0x2116,
+  nun: 0x05E0,
+  nundagesh: 0xFB40,
+  nundageshhebrew: 0xFB40,
+  nunhebrew: 0x05E0,
+  nvsquare: 0x33B5,
+  nwsquare: 0x33BB,
+  nyabengali: 0x099E,
+  nyadeva: 0x091E,
+  nyagujarati: 0x0A9E,
+  nyagurmukhi: 0x0A1E,
+  o: 0x006F,
+  oacute: 0x00F3,
+  oangthai: 0x0E2D,
+  obarred: 0x0275,
+  obarredcyrillic: 0x04E9,
+  obarreddieresiscyrillic: 0x04EB,
+  obengali: 0x0993,
+  obopomofo: 0x311B,
+  obreve: 0x014F,
+  ocandradeva: 0x0911,
+  ocandragujarati: 0x0A91,
+  ocandravowelsigndeva: 0x0949,
+  ocandravowelsigngujarati: 0x0AC9,
+  ocaron: 0x01D2,
+  ocircle: 0x24DE,
+  ocircumflex: 0x00F4,
+  ocircumflexacute: 0x1ED1,
+  ocircumflexdotbelow: 0x1ED9,
+  ocircumflexgrave: 0x1ED3,
+  ocircumflexhookabove: 0x1ED5,
+  ocircumflextilde: 0x1ED7,
+  ocyrillic: 0x043E,
+  odblacute: 0x0151,
+  odblgrave: 0x020D,
+  odeva: 0x0913,
+  odieresis: 0x00F6,
+  odieresiscyrillic: 0x04E7,
+  odotbelow: 0x1ECD,
+  oe: 0x0153,
+  oekorean: 0x315A,
+  ogonek: 0x02DB,
+  ogonekcmb: 0x0328,
+  ograve: 0x00F2,
+  ogujarati: 0x0A93,
+  oharmenian: 0x0585,
+  ohiragana: 0x304A,
+  ohookabove: 0x1ECF,
+  ohorn: 0x01A1,
+  ohornacute: 0x1EDB,
+  ohorndotbelow: 0x1EE3,
+  ohorngrave: 0x1EDD,
+  ohornhookabove: 0x1EDF,
+  ohorntilde: 0x1EE1,
+  ohungarumlaut: 0x0151,
+  oi: 0x01A3,
+  oinvertedbreve: 0x020F,
+  okatakana: 0x30AA,
+  okatakanahalfwidth: 0xFF75,
+  okorean: 0x3157,
+  olehebrew: 0x05AB,
+  omacron: 0x014D,
+  omacronacute: 0x1E53,
+  omacrongrave: 0x1E51,
+  omdeva: 0x0950,
+  omega: 0x03C9,
+  omega1: 0x03D6,
+  omegacyrillic: 0x0461,
+  omegalatinclosed: 0x0277,
+  omegaroundcyrillic: 0x047B,
+  omegatitlocyrillic: 0x047D,
+  omegatonos: 0x03CE,
+  omgujarati: 0x0AD0,
+  omicron: 0x03BF,
+  omicrontonos: 0x03CC,
+  omonospace: 0xFF4F,
+  one: 0x0031,
+  onearabic: 0x0661,
+  onebengali: 0x09E7,
+  onecircle: 0x2460,
+  onecircleinversesansserif: 0x278A,
+  onedeva: 0x0967,
+  onedotenleader: 0x2024,
+  oneeighth: 0x215B,
+  onefitted: 0xF6DC,
+  onegujarati: 0x0AE7,
+  onegurmukhi: 0x0A67,
+  onehackarabic: 0x0661,
+  onehalf: 0x00BD,
+  onehangzhou: 0x3021,
+  oneideographicparen: 0x3220,
+  oneinferior: 0x2081,
+  onemonospace: 0xFF11,
+  onenumeratorbengali: 0x09F4,
+  oneoldstyle: 0xF731,
+  oneparen: 0x2474,
+  oneperiod: 0x2488,
+  onepersian: 0x06F1,
+  onequarter: 0x00BC,
+  oneroman: 0x2170,
+  onesuperior: 0x00B9,
+  onethai: 0x0E51,
+  onethird: 0x2153,
+  oogonek: 0x01EB,
+  oogonekmacron: 0x01ED,
+  oogurmukhi: 0x0A13,
+  oomatragurmukhi: 0x0A4B,
+  oopen: 0x0254,
+  oparen: 0x24AA,
+  openbullet: 0x25E6,
+  option: 0x2325,
+  ordfeminine: 0x00AA,
+  ordmasculine: 0x00BA,
+  orthogonal: 0x221F,
+  oshortdeva: 0x0912,
+  oshortvowelsigndeva: 0x094A,
+  oslash: 0x00F8,
+  oslashacute: 0x01FF,
+  osmallhiragana: 0x3049,
+  osmallkatakana: 0x30A9,
+  osmallkatakanahalfwidth: 0xFF6B,
+  ostrokeacute: 0x01FF,
+  osuperior: 0xF6F0,
+  otcyrillic: 0x047F,
+  otilde: 0x00F5,
+  otildeacute: 0x1E4D,
+  otildedieresis: 0x1E4F,
+  oubopomofo: 0x3121,
+  overline: 0x203E,
+  overlinecenterline: 0xFE4A,
+  overlinecmb: 0x0305,
+  overlinedashed: 0xFE49,
+  overlinedblwavy: 0xFE4C,
+  overlinewavy: 0xFE4B,
+  overscore: 0x00AF,
+  ovowelsignbengali: 0x09CB,
+  ovowelsigndeva: 0x094B,
+  ovowelsigngujarati: 0x0ACB,
+  p: 0x0070,
+  paampssquare: 0x3380,
+  paasentosquare: 0x332B,
+  pabengali: 0x09AA,
+  pacute: 0x1E55,
+  padeva: 0x092A,
+  pagedown: 0x21DF,
+  pageup: 0x21DE,
+  pagujarati: 0x0AAA,
+  pagurmukhi: 0x0A2A,
+  pahiragana: 0x3071,
+  paiyannoithai: 0x0E2F,
+  pakatakana: 0x30D1,
+  palatalizationcyrilliccmb: 0x0484,
+  palochkacyrillic: 0x04C0,
+  pansioskorean: 0x317F,
+  paragraph: 0x00B6,
+  parallel: 0x2225,
+  parenleft: 0x0028,
+  parenleftaltonearabic: 0xFD3E,
+  parenleftbt: 0xF8ED,
+  parenleftex: 0xF8EC,
+  parenleftinferior: 0x208D,
+  parenleftmonospace: 0xFF08,
+  parenleftsmall: 0xFE59,
+  parenleftsuperior: 0x207D,
+  parenlefttp: 0xF8EB,
+  parenleftvertical: 0xFE35,
+  parenright: 0x0029,
+  parenrightaltonearabic: 0xFD3F,
+  parenrightbt: 0xF8F8,
+  parenrightex: 0xF8F7,
+  parenrightinferior: 0x208E,
+  parenrightmonospace: 0xFF09,
+  parenrightsmall: 0xFE5A,
+  parenrightsuperior: 0x207E,
+  parenrighttp: 0xF8F6,
+  parenrightvertical: 0xFE36,
+  partialdiff: 0x2202,
+  paseqhebrew: 0x05C0,
+  pashtahebrew: 0x0599,
+  pasquare: 0x33A9,
+  patah: 0x05B7,
+  patah11: 0x05B7,
+  patah1d: 0x05B7,
+  patah2a: 0x05B7,
+  patahhebrew: 0x05B7,
+  patahnarrowhebrew: 0x05B7,
+  patahquarterhebrew: 0x05B7,
+  patahwidehebrew: 0x05B7,
+  pazerhebrew: 0x05A1,
+  pbopomofo: 0x3106,
+  pcircle: 0x24DF,
+  pdotaccent: 0x1E57,
+  pe: 0x05E4,
+  pecyrillic: 0x043F,
+  pedagesh: 0xFB44,
+  pedageshhebrew: 0xFB44,
+  peezisquare: 0x333B,
+  pefinaldageshhebrew: 0xFB43,
+  peharabic: 0x067E,
+  peharmenian: 0x057A,
+  pehebrew: 0x05E4,
+  pehfinalarabic: 0xFB57,
+  pehinitialarabic: 0xFB58,
+  pehiragana: 0x307A,
+  pehmedialarabic: 0xFB59,
+  pekatakana: 0x30DA,
+  pemiddlehookcyrillic: 0x04A7,
+  perafehebrew: 0xFB4E,
+  percent: 0x0025,
+  percentarabic: 0x066A,
+  percentmonospace: 0xFF05,
+  percentsmall: 0xFE6A,
+  period: 0x002E,
+  periodarmenian: 0x0589,
+  periodcentered: 0x00B7,
+  periodhalfwidth: 0xFF61,
+  periodinferior: 0xF6E7,
+  periodmonospace: 0xFF0E,
+  periodsmall: 0xFE52,
+  periodsuperior: 0xF6E8,
+  perispomenigreekcmb: 0x0342,
+  perpendicular: 0x22A5,
+  perthousand: 0x2030,
+  peseta: 0x20A7,
+  pfsquare: 0x338A,
+  phabengali: 0x09AB,
+  phadeva: 0x092B,
+  phagujarati: 0x0AAB,
+  phagurmukhi: 0x0A2B,
+  phi: 0x03C6,
+  phi1: 0x03D5,
+  phieuphacirclekorean: 0x327A,
+  phieuphaparenkorean: 0x321A,
+  phieuphcirclekorean: 0x326C,
+  phieuphkorean: 0x314D,
+  phieuphparenkorean: 0x320C,
+  philatin: 0x0278,
+  phinthuthai: 0x0E3A,
+  phisymbolgreek: 0x03D5,
+  phook: 0x01A5,
+  phophanthai: 0x0E1E,
+  phophungthai: 0x0E1C,
+  phosamphaothai: 0x0E20,
+  pi: 0x03C0,
+  pieupacirclekorean: 0x3273,
+  pieupaparenkorean: 0x3213,
+  pieupcieuckorean: 0x3176,
+  pieupcirclekorean: 0x3265,
+  pieupkiyeokkorean: 0x3172,
+  pieupkorean: 0x3142,
+  pieupparenkorean: 0x3205,
+  pieupsioskiyeokkorean: 0x3174,
+  pieupsioskorean: 0x3144,
+  pieupsiostikeutkorean: 0x3175,
+  pieupthieuthkorean: 0x3177,
+  pieuptikeutkorean: 0x3173,
+  pihiragana: 0x3074,
+  pikatakana: 0x30D4,
+  pisymbolgreek: 0x03D6,
+  piwrarmenian: 0x0583,
+  plus: 0x002B,
+  plusbelowcmb: 0x031F,
+  pluscircle: 0x2295,
+  plusminus: 0x00B1,
+  plusmod: 0x02D6,
+  plusmonospace: 0xFF0B,
+  plussmall: 0xFE62,
+  plussuperior: 0x207A,
+  pmonospace: 0xFF50,
+  pmsquare: 0x33D8,
+  pohiragana: 0x307D,
+  pointingindexdownwhite: 0x261F,
+  pointingindexleftwhite: 0x261C,
+  pointingindexrightwhite: 0x261E,
+  pointingindexupwhite: 0x261D,
+  pokatakana: 0x30DD,
+  poplathai: 0x0E1B,
+  postalmark: 0x3012,
+  postalmarkface: 0x3020,
+  pparen: 0x24AB,
+  precedes: 0x227A,
+  prescription: 0x211E,
+  primemod: 0x02B9,
+  primereversed: 0x2035,
+  product: 0x220F,
+  projective: 0x2305,
+  prolongedkana: 0x30FC,
+  propellor: 0x2318,
+  propersubset: 0x2282,
+  propersuperset: 0x2283,
+  proportion: 0x2237,
+  proportional: 0x221D,
+  psi: 0x03C8,
+  psicyrillic: 0x0471,
+  psilipneumatacyrilliccmb: 0x0486,
+  pssquare: 0x33B0,
+  puhiragana: 0x3077,
+  pukatakana: 0x30D7,
+  pvsquare: 0x33B4,
+  pwsquare: 0x33BA,
+  q: 0x0071,
+  qadeva: 0x0958,
+  qadmahebrew: 0x05A8,
+  qafarabic: 0x0642,
+  qaffinalarabic: 0xFED6,
+  qafinitialarabic: 0xFED7,
+  qafmedialarabic: 0xFED8,
+  qamats: 0x05B8,
+  qamats10: 0x05B8,
+  qamats1a: 0x05B8,
+  qamats1c: 0x05B8,
+  qamats27: 0x05B8,
+  qamats29: 0x05B8,
+  qamats33: 0x05B8,
+  qamatsde: 0x05B8,
+  qamatshebrew: 0x05B8,
+  qamatsnarrowhebrew: 0x05B8,
+  qamatsqatanhebrew: 0x05B8,
+  qamatsqatannarrowhebrew: 0x05B8,
+  qamatsqatanquarterhebrew: 0x05B8,
+  qamatsqatanwidehebrew: 0x05B8,
+  qamatsquarterhebrew: 0x05B8,
+  qamatswidehebrew: 0x05B8,
+  qarneyparahebrew: 0x059F,
+  qbopomofo: 0x3111,
+  qcircle: 0x24E0,
+  qhook: 0x02A0,
+  qmonospace: 0xFF51,
+  qof: 0x05E7,
+  qofdagesh: 0xFB47,
+  qofdageshhebrew: 0xFB47,
+  qofhebrew: 0x05E7,
+  qparen: 0x24AC,
+  quarternote: 0x2669,
+  qubuts: 0x05BB,
+  qubuts18: 0x05BB,
+  qubuts25: 0x05BB,
+  qubuts31: 0x05BB,
+  qubutshebrew: 0x05BB,
+  qubutsnarrowhebrew: 0x05BB,
+  qubutsquarterhebrew: 0x05BB,
+  qubutswidehebrew: 0x05BB,
+  question: 0x003F,
+  questionarabic: 0x061F,
+  questionarmenian: 0x055E,
+  questiondown: 0x00BF,
+  questiondownsmall: 0xF7BF,
+  questiongreek: 0x037E,
+  questionmonospace: 0xFF1F,
+  questionsmall: 0xF73F,
+  quotedbl: 0x0022,
+  quotedblbase: 0x201E,
+  quotedblleft: 0x201C,
+  quotedblmonospace: 0xFF02,
+  quotedblprime: 0x301E,
+  quotedblprimereversed: 0x301D,
+  quotedblright: 0x201D,
+  quoteleft: 0x2018,
+  quoteleftreversed: 0x201B,
+  quotereversed: 0x201B,
+  quoteright: 0x2019,
+  quoterightn: 0x0149,
+  quotesinglbase: 0x201A,
+  quotesingle: 0x0027,
+  quotesinglemonospace: 0xFF07,
+  r: 0x0072,
+  raarmenian: 0x057C,
+  rabengali: 0x09B0,
+  racute: 0x0155,
+  radeva: 0x0930,
+  radical: 0x221A,
+  radicalex: 0xF8E5,
+  radoverssquare: 0x33AE,
+  radoverssquaredsquare: 0x33AF,
+  radsquare: 0x33AD,
+  rafe: 0x05BF,
+  rafehebrew: 0x05BF,
+  ragujarati: 0x0AB0,
+  ragurmukhi: 0x0A30,
+  rahiragana: 0x3089,
+  rakatakana: 0x30E9,
+  rakatakanahalfwidth: 0xFF97,
+  ralowerdiagonalbengali: 0x09F1,
+  ramiddlediagonalbengali: 0x09F0,
+  ramshorn: 0x0264,
+  ratio: 0x2236,
+  rbopomofo: 0x3116,
+  rcaron: 0x0159,
+  rcedilla: 0x0157,
+  rcircle: 0x24E1,
+  rcommaaccent: 0x0157,
+  rdblgrave: 0x0211,
+  rdotaccent: 0x1E59,
+  rdotbelow: 0x1E5B,
+  rdotbelowmacron: 0x1E5D,
+  referencemark: 0x203B,
+  reflexsubset: 0x2286,
+  reflexsuperset: 0x2287,
+  registered: 0x00AE,
+  registersans: 0xF8E8,
+  registerserif: 0xF6DA,
+  reharabic: 0x0631,
+  reharmenian: 0x0580,
+  rehfinalarabic: 0xFEAE,
+  rehiragana: 0x308C,
+  rekatakana: 0x30EC,
+  rekatakanahalfwidth: 0xFF9A,
+  resh: 0x05E8,
+  reshdageshhebrew: 0xFB48,
+  reshhebrew: 0x05E8,
+  reversedtilde: 0x223D,
+  reviahebrew: 0x0597,
+  reviamugrashhebrew: 0x0597,
+  revlogicalnot: 0x2310,
+  rfishhook: 0x027E,
+  rfishhookreversed: 0x027F,
+  rhabengali: 0x09DD,
+  rhadeva: 0x095D,
+  rho: 0x03C1,
+  rhook: 0x027D,
+  rhookturned: 0x027B,
+  rhookturnedsuperior: 0x02B5,
+  rhosymbolgreek: 0x03F1,
+  rhotichookmod: 0x02DE,
+  rieulacirclekorean: 0x3271,
+  rieulaparenkorean: 0x3211,
+  rieulcirclekorean: 0x3263,
+  rieulhieuhkorean: 0x3140,
+  rieulkiyeokkorean: 0x313A,
+  rieulkiyeoksioskorean: 0x3169,
+  rieulkorean: 0x3139,
+  rieulmieumkorean: 0x313B,
+  rieulpansioskorean: 0x316C,
+  rieulparenkorean: 0x3203,
+  rieulphieuphkorean: 0x313F,
+  rieulpieupkorean: 0x313C,
+  rieulpieupsioskorean: 0x316B,
+  rieulsioskorean: 0x313D,
+  rieulthieuthkorean: 0x313E,
+  rieultikeutkorean: 0x316A,
+  rieulyeorinhieuhkorean: 0x316D,
+  rightangle: 0x221F,
+  righttackbelowcmb: 0x0319,
+  righttriangle: 0x22BF,
+  rihiragana: 0x308A,
+  rikatakana: 0x30EA,
+  rikatakanahalfwidth: 0xFF98,
+  ring: 0x02DA,
+  ringbelowcmb: 0x0325,
+  ringcmb: 0x030A,
+  ringhalfleft: 0x02BF,
+  ringhalfleftarmenian: 0x0559,
+  ringhalfleftbelowcmb: 0x031C,
+  ringhalfleftcentered: 0x02D3,
+  ringhalfright: 0x02BE,
+  ringhalfrightbelowcmb: 0x0339,
+  ringhalfrightcentered: 0x02D2,
+  rinvertedbreve: 0x0213,
+  rittorusquare: 0x3351,
+  rlinebelow: 0x1E5F,
+  rlongleg: 0x027C,
+  rlonglegturned: 0x027A,
+  rmonospace: 0xFF52,
+  rohiragana: 0x308D,
+  rokatakana: 0x30ED,
+  rokatakanahalfwidth: 0xFF9B,
+  roruathai: 0x0E23,
+  rparen: 0x24AD,
+  rrabengali: 0x09DC,
+  rradeva: 0x0931,
+  rragurmukhi: 0x0A5C,
+  rreharabic: 0x0691,
+  rrehfinalarabic: 0xFB8D,
+  rrvocalicbengali: 0x09E0,
+  rrvocalicdeva: 0x0960,
+  rrvocalicgujarati: 0x0AE0,
+  rrvocalicvowelsignbengali: 0x09C4,
+  rrvocalicvowelsigndeva: 0x0944,
+  rrvocalicvowelsigngujarati: 0x0AC4,
+  rsuperior: 0xF6F1,
+  rtblock: 0x2590,
+  rturned: 0x0279,
+  rturnedsuperior: 0x02B4,
+  ruhiragana: 0x308B,
+  rukatakana: 0x30EB,
+  rukatakanahalfwidth: 0xFF99,
+  rupeemarkbengali: 0x09F2,
+  rupeesignbengali: 0x09F3,
+  rupiah: 0xF6DD,
+  ruthai: 0x0E24,
+  rvocalicbengali: 0x098B,
+  rvocalicdeva: 0x090B,
+  rvocalicgujarati: 0x0A8B,
+  rvocalicvowelsignbengali: 0x09C3,
+  rvocalicvowelsigndeva: 0x0943,
+  rvocalicvowelsigngujarati: 0x0AC3,
+  s: 0x0073,
+  sabengali: 0x09B8,
+  sacute: 0x015B,
+  sacutedotaccent: 0x1E65,
+  sadarabic: 0x0635,
+  sadeva: 0x0938,
+  sadfinalarabic: 0xFEBA,
+  sadinitialarabic: 0xFEBB,
+  sadmedialarabic: 0xFEBC,
+  sagujarati: 0x0AB8,
+  sagurmukhi: 0x0A38,
+  sahiragana: 0x3055,
+  sakatakana: 0x30B5,
+  sakatakanahalfwidth: 0xFF7B,
+  sallallahoualayhewasallamarabic: 0xFDFA,
+  samekh: 0x05E1,
+  samekhdagesh: 0xFB41,
+  samekhdageshhebrew: 0xFB41,
+  samekhhebrew: 0x05E1,
+  saraaathai: 0x0E32,
+  saraaethai: 0x0E41,
+  saraaimaimalaithai: 0x0E44,
+  saraaimaimuanthai: 0x0E43,
+  saraamthai: 0x0E33,
+  saraathai: 0x0E30,
+  saraethai: 0x0E40,
+  saraiileftthai: 0xF886,
+  saraiithai: 0x0E35,
+  saraileftthai: 0xF885,
+  saraithai: 0x0E34,
+  saraothai: 0x0E42,
+  saraueeleftthai: 0xF888,
+  saraueethai: 0x0E37,
+  saraueleftthai: 0xF887,
+  sarauethai: 0x0E36,
+  sarauthai: 0x0E38,
+  sarauuthai: 0x0E39,
+  sbopomofo: 0x3119,
+  scaron: 0x0161,
+  scarondotaccent: 0x1E67,
+  scedilla: 0x015F,
+  schwa: 0x0259,
+  schwacyrillic: 0x04D9,
+  schwadieresiscyrillic: 0x04DB,
+  schwahook: 0x025A,
+  scircle: 0x24E2,
+  scircumflex: 0x015D,
+  scommaaccent: 0x0219,
+  sdotaccent: 0x1E61,
+  sdotbelow: 0x1E63,
+  sdotbelowdotaccent: 0x1E69,
+  seagullbelowcmb: 0x033C,
+  second: 0x2033,
+  secondtonechinese: 0x02CA,
+  section: 0x00A7,
+  seenarabic: 0x0633,
+  seenfinalarabic: 0xFEB2,
+  seeninitialarabic: 0xFEB3,
+  seenmedialarabic: 0xFEB4,
+  segol: 0x05B6,
+  segol13: 0x05B6,
+  segol1f: 0x05B6,
+  segol2c: 0x05B6,
+  segolhebrew: 0x05B6,
+  segolnarrowhebrew: 0x05B6,
+  segolquarterhebrew: 0x05B6,
+  segoltahebrew: 0x0592,
+  segolwidehebrew: 0x05B6,
+  seharmenian: 0x057D,
+  sehiragana: 0x305B,
+  sekatakana: 0x30BB,
+  sekatakanahalfwidth: 0xFF7E,
+  semicolon: 0x003B,
+  semicolonarabic: 0x061B,
+  semicolonmonospace: 0xFF1B,
+  semicolonsmall: 0xFE54,
+  semivoicedmarkkana: 0x309C,
+  semivoicedmarkkanahalfwidth: 0xFF9F,
+  sentisquare: 0x3322,
+  sentosquare: 0x3323,
+  seven: 0x0037,
+  sevenarabic: 0x0667,
+  sevenbengali: 0x09ED,
+  sevencircle: 0x2466,
+  sevencircleinversesansserif: 0x2790,
+  sevendeva: 0x096D,
+  seveneighths: 0x215E,
+  sevengujarati: 0x0AED,
+  sevengurmukhi: 0x0A6D,
+  sevenhackarabic: 0x0667,
+  sevenhangzhou: 0x3027,
+  sevenideographicparen: 0x3226,
+  seveninferior: 0x2087,
+  sevenmonospace: 0xFF17,
+  sevenoldstyle: 0xF737,
+  sevenparen: 0x247A,
+  sevenperiod: 0x248E,
+  sevenpersian: 0x06F7,
+  sevenroman: 0x2176,
+  sevensuperior: 0x2077,
+  seventeencircle: 0x2470,
+  seventeenparen: 0x2484,
+  seventeenperiod: 0x2498,
+  seventhai: 0x0E57,
+  sfthyphen: 0x00AD,
+  shaarmenian: 0x0577,
+  shabengali: 0x09B6,
+  shacyrillic: 0x0448,
+  shaddaarabic: 0x0651,
+  shaddadammaarabic: 0xFC61,
+  shaddadammatanarabic: 0xFC5E,
+  shaddafathaarabic: 0xFC60,
+  shaddakasraarabic: 0xFC62,
+  shaddakasratanarabic: 0xFC5F,
+  shade: 0x2592,
+  shadedark: 0x2593,
+  shadelight: 0x2591,
+  shademedium: 0x2592,
+  shadeva: 0x0936,
+  shagujarati: 0x0AB6,
+  shagurmukhi: 0x0A36,
+  shalshelethebrew: 0x0593,
+  shbopomofo: 0x3115,
+  shchacyrillic: 0x0449,
+  sheenarabic: 0x0634,
+  sheenfinalarabic: 0xFEB6,
+  sheeninitialarabic: 0xFEB7,
+  sheenmedialarabic: 0xFEB8,
+  sheicoptic: 0x03E3,
+  sheqel: 0x20AA,
+  sheqelhebrew: 0x20AA,
+  sheva: 0x05B0,
+  sheva115: 0x05B0,
+  sheva15: 0x05B0,
+  sheva22: 0x05B0,
+  sheva2e: 0x05B0,
+  shevahebrew: 0x05B0,
+  shevanarrowhebrew: 0x05B0,
+  shevaquarterhebrew: 0x05B0,
+  shevawidehebrew: 0x05B0,
+  shhacyrillic: 0x04BB,
+  shimacoptic: 0x03ED,
+  shin: 0x05E9,
+  shindagesh: 0xFB49,
+  shindageshhebrew: 0xFB49,
+  shindageshshindot: 0xFB2C,
+  shindageshshindothebrew: 0xFB2C,
+  shindageshsindot: 0xFB2D,
+  shindageshsindothebrew: 0xFB2D,
+  shindothebrew: 0x05C1,
+  shinhebrew: 0x05E9,
+  shinshindot: 0xFB2A,
+  shinshindothebrew: 0xFB2A,
+  shinsindot: 0xFB2B,
+  shinsindothebrew: 0xFB2B,
+  shook: 0x0282,
+  sigma: 0x03C3,
+  sigma1: 0x03C2,
+  sigmafinal: 0x03C2,
+  sigmalunatesymbolgreek: 0x03F2,
+  sihiragana: 0x3057,
+  sikatakana: 0x30B7,
+  sikatakanahalfwidth: 0xFF7C,
+  siluqhebrew: 0x05BD,
+  siluqlefthebrew: 0x05BD,
+  similar: 0x223C,
+  sindothebrew: 0x05C2,
+  siosacirclekorean: 0x3274,
+  siosaparenkorean: 0x3214,
+  sioscieuckorean: 0x317E,
+  sioscirclekorean: 0x3266,
+  sioskiyeokkorean: 0x317A,
+  sioskorean: 0x3145,
+  siosnieunkorean: 0x317B,
+  siosparenkorean: 0x3206,
+  siospieupkorean: 0x317D,
+  siostikeutkorean: 0x317C,
+  six: 0x0036,
+  sixarabic: 0x0666,
+  sixbengali: 0x09EC,
+  sixcircle: 0x2465,
+  sixcircleinversesansserif: 0x278F,
+  sixdeva: 0x096C,
+  sixgujarati: 0x0AEC,
+  sixgurmukhi: 0x0A6C,
+  sixhackarabic: 0x0666,
+  sixhangzhou: 0x3026,
+  sixideographicparen: 0x3225,
+  sixinferior: 0x2086,
+  sixmonospace: 0xFF16,
+  sixoldstyle: 0xF736,
+  sixparen: 0x2479,
+  sixperiod: 0x248D,
+  sixpersian: 0x06F6,
+  sixroman: 0x2175,
+  sixsuperior: 0x2076,
+  sixteencircle: 0x246F,
+  sixteencurrencydenominatorbengali: 0x09F9,
+  sixteenparen: 0x2483,
+  sixteenperiod: 0x2497,
+  sixthai: 0x0E56,
+  slash: 0x002F,
+  slashmonospace: 0xFF0F,
+  slong: 0x017F,
+  slongdotaccent: 0x1E9B,
+  smileface: 0x263A,
+  smonospace: 0xFF53,
+  sofpasuqhebrew: 0x05C3,
+  softhyphen: 0x00AD,
+  softsigncyrillic: 0x044C,
+  sohiragana: 0x305D,
+  sokatakana: 0x30BD,
+  sokatakanahalfwidth: 0xFF7F,
+  soliduslongoverlaycmb: 0x0338,
+  solidusshortoverlaycmb: 0x0337,
+  sorusithai: 0x0E29,
+  sosalathai: 0x0E28,
+  sosothai: 0x0E0B,
+  sosuathai: 0x0E2A,
+  space: 0x0020,
+  spacehackarabic: 0x0020,
+  spade: 0x2660,
+  spadesuitblack: 0x2660,
+  spadesuitwhite: 0x2664,
+  sparen: 0x24AE,
+  squarebelowcmb: 0x033B,
+  squarecc: 0x33C4,
+  squarecm: 0x339D,
+  squarediagonalcrosshatchfill: 0x25A9,
+  squarehorizontalfill: 0x25A4,
+  squarekg: 0x338F,
+  squarekm: 0x339E,
+  squarekmcapital: 0x33CE,
+  squareln: 0x33D1,
+  squarelog: 0x33D2,
+  squaremg: 0x338E,
+  squaremil: 0x33D5,
+  squaremm: 0x339C,
+  squaremsquared: 0x33A1,
+  squareorthogonalcrosshatchfill: 0x25A6,
+  squareupperlefttolowerrightfill: 0x25A7,
+  squareupperrighttolowerleftfill: 0x25A8,
+  squareverticalfill: 0x25A5,
+  squarewhitewithsmallblack: 0x25A3,
+  srsquare: 0x33DB,
+  ssabengali: 0x09B7,
+  ssadeva: 0x0937,
+  ssagujarati: 0x0AB7,
+  ssangcieuckorean: 0x3149,
+  ssanghieuhkorean: 0x3185,
+  ssangieungkorean: 0x3180,
+  ssangkiyeokkorean: 0x3132,
+  ssangnieunkorean: 0x3165,
+  ssangpieupkorean: 0x3143,
+  ssangsioskorean: 0x3146,
+  ssangtikeutkorean: 0x3138,
+  ssuperior: 0xF6F2,
+  sterling: 0x00A3,
+  sterlingmonospace: 0xFFE1,
+  strokelongoverlaycmb: 0x0336,
+  strokeshortoverlaycmb: 0x0335,
+  subset: 0x2282,
+  subsetnotequal: 0x228A,
+  subsetorequal: 0x2286,
+  succeeds: 0x227B,
+  suchthat: 0x220B,
+  suhiragana: 0x3059,
+  sukatakana: 0x30B9,
+  sukatakanahalfwidth: 0xFF7D,
+  sukunarabic: 0x0652,
+  summation: 0x2211,
+  sun: 0x263C,
+  superset: 0x2283,
+  supersetnotequal: 0x228B,
+  supersetorequal: 0x2287,
+  svsquare: 0x33DC,
+  syouwaerasquare: 0x337C,
+  t: 0x0074,
+  tabengali: 0x09A4,
+  tackdown: 0x22A4,
+  tackleft: 0x22A3,
+  tadeva: 0x0924,
+  tagujarati: 0x0AA4,
+  tagurmukhi: 0x0A24,
+  taharabic: 0x0637,
+  tahfinalarabic: 0xFEC2,
+  tahinitialarabic: 0xFEC3,
+  tahiragana: 0x305F,
+  tahmedialarabic: 0xFEC4,
+  taisyouerasquare: 0x337D,
+  takatakana: 0x30BF,
+  takatakanahalfwidth: 0xFF80,
+  tatweelarabic: 0x0640,
+  tau: 0x03C4,
+  tav: 0x05EA,
+  tavdages: 0xFB4A,
+  tavdagesh: 0xFB4A,
+  tavdageshhebrew: 0xFB4A,
+  tavhebrew: 0x05EA,
+  tbar: 0x0167,
+  tbopomofo: 0x310A,
+  tcaron: 0x0165,
+  tccurl: 0x02A8,
+  tcedilla: 0x0163,
+  tcheharabic: 0x0686,
+  tchehfinalarabic: 0xFB7B,
+  tchehinitialarabic: 0xFB7C,
+  tchehmedialarabic: 0xFB7D,
+  tcircle: 0x24E3,
+  tcircumflexbelow: 0x1E71,
+  tcommaaccent: 0x0163,
+  tdieresis: 0x1E97,
+  tdotaccent: 0x1E6B,
+  tdotbelow: 0x1E6D,
+  tecyrillic: 0x0442,
+  tedescendercyrillic: 0x04AD,
+  teharabic: 0x062A,
+  tehfinalarabic: 0xFE96,
+  tehhahinitialarabic: 0xFCA2,
+  tehhahisolatedarabic: 0xFC0C,
+  tehinitialarabic: 0xFE97,
+  tehiragana: 0x3066,
+  tehjeeminitialarabic: 0xFCA1,
+  tehjeemisolatedarabic: 0xFC0B,
+  tehmarbutaarabic: 0x0629,
+  tehmarbutafinalarabic: 0xFE94,
+  tehmedialarabic: 0xFE98,
+  tehmeeminitialarabic: 0xFCA4,
+  tehmeemisolatedarabic: 0xFC0E,
+  tehnoonfinalarabic: 0xFC73,
+  tekatakana: 0x30C6,
+  tekatakanahalfwidth: 0xFF83,
+  telephone: 0x2121,
+  telephoneblack: 0x260E,
+  telishagedolahebrew: 0x05A0,
+  telishaqetanahebrew: 0x05A9,
+  tencircle: 0x2469,
+  tenideographicparen: 0x3229,
+  tenparen: 0x247D,
+  tenperiod: 0x2491,
+  tenroman: 0x2179,
+  tesh: 0x02A7,
+  tet: 0x05D8,
+  tetdagesh: 0xFB38,
+  tetdageshhebrew: 0xFB38,
+  tethebrew: 0x05D8,
+  tetsecyrillic: 0x04B5,
+  tevirhebrew: 0x059B,
+  tevirlefthebrew: 0x059B,
+  thabengali: 0x09A5,
+  thadeva: 0x0925,
+  thagujarati: 0x0AA5,
+  thagurmukhi: 0x0A25,
+  thalarabic: 0x0630,
+  thalfinalarabic: 0xFEAC,
+  thanthakhatlowleftthai: 0xF898,
+  thanthakhatlowrightthai: 0xF897,
+  thanthakhatthai: 0x0E4C,
+  thanthakhatupperleftthai: 0xF896,
+  theharabic: 0x062B,
+  thehfinalarabic: 0xFE9A,
+  thehinitialarabic: 0xFE9B,
+  thehmedialarabic: 0xFE9C,
+  thereexists: 0x2203,
+  therefore: 0x2234,
+  theta: 0x03B8,
+  theta1: 0x03D1,
+  thetasymbolgreek: 0x03D1,
+  thieuthacirclekorean: 0x3279,
+  thieuthaparenkorean: 0x3219,
+  thieuthcirclekorean: 0x326B,
+  thieuthkorean: 0x314C,
+  thieuthparenkorean: 0x320B,
+  thirteencircle: 0x246C,
+  thirteenparen: 0x2480,
+  thirteenperiod: 0x2494,
+  thonangmonthothai: 0x0E11,
+  thook: 0x01AD,
+  thophuthaothai: 0x0E12,
+  thorn: 0x00FE,
+  thothahanthai: 0x0E17,
+  thothanthai: 0x0E10,
+  thothongthai: 0x0E18,
+  thothungthai: 0x0E16,
+  thousandcyrillic: 0x0482,
+  thousandsseparatorarabic: 0x066C,
+  thousandsseparatorpersian: 0x066C,
+  three: 0x0033,
+  threearabic: 0x0663,
+  threebengali: 0x09E9,
+  threecircle: 0x2462,
+  threecircleinversesansserif: 0x278C,
+  threedeva: 0x0969,
+  threeeighths: 0x215C,
+  threegujarati: 0x0AE9,
+  threegurmukhi: 0x0A69,
+  threehackarabic: 0x0663,
+  threehangzhou: 0x3023,
+  threeideographicparen: 0x3222,
+  threeinferior: 0x2083,
+  threemonospace: 0xFF13,
+  threenumeratorbengali: 0x09F6,
+  threeoldstyle: 0xF733,
+  threeparen: 0x2476,
+  threeperiod: 0x248A,
+  threepersian: 0x06F3,
+  threequarters: 0x00BE,
+  threequartersemdash: 0xF6DE,
+  threeroman: 0x2172,
+  threesuperior: 0x00B3,
+  threethai: 0x0E53,
+  thzsquare: 0x3394,
+  tihiragana: 0x3061,
+  tikatakana: 0x30C1,
+  tikatakanahalfwidth: 0xFF81,
+  tikeutacirclekorean: 0x3270,
+  tikeutaparenkorean: 0x3210,
+  tikeutcirclekorean: 0x3262,
+  tikeutkorean: 0x3137,
+  tikeutparenkorean: 0x3202,
+  tilde: 0x02DC,
+  tildebelowcmb: 0x0330,
+  tildecmb: 0x0303,
+  tildecomb: 0x0303,
+  tildedoublecmb: 0x0360,
+  tildeoperator: 0x223C,
+  tildeoverlaycmb: 0x0334,
+  tildeverticalcmb: 0x033E,
+  timescircle: 0x2297,
+  tipehahebrew: 0x0596,
+  tipehalefthebrew: 0x0596,
+  tippigurmukhi: 0x0A70,
+  titlocyrilliccmb: 0x0483,
+  tiwnarmenian: 0x057F,
+  tlinebelow: 0x1E6F,
+  tmonospace: 0xFF54,
+  toarmenian: 0x0569,
+  tohiragana: 0x3068,
+  tokatakana: 0x30C8,
+  tokatakanahalfwidth: 0xFF84,
+  tonebarextrahighmod: 0x02E5,
+  tonebarextralowmod: 0x02E9,
+  tonebarhighmod: 0x02E6,
+  tonebarlowmod: 0x02E8,
+  tonebarmidmod: 0x02E7,
+  tonefive: 0x01BD,
+  tonesix: 0x0185,
+  tonetwo: 0x01A8,
+  tonos: 0x0384,
+  tonsquare: 0x3327,
+  topatakthai: 0x0E0F,
+  tortoiseshellbracketleft: 0x3014,
+  tortoiseshellbracketleftsmall: 0xFE5D,
+  tortoiseshellbracketleftvertical: 0xFE39,
+  tortoiseshellbracketright: 0x3015,
+  tortoiseshellbracketrightsmall: 0xFE5E,
+  tortoiseshellbracketrightvertical: 0xFE3A,
+  totaothai: 0x0E15,
+  tpalatalhook: 0x01AB,
+  tparen: 0x24AF,
+  trademark: 0x2122,
+  trademarksans: 0xF8EA,
+  trademarkserif: 0xF6DB,
+  tretroflexhook: 0x0288,
+  triagdn: 0x25BC,
+  triaglf: 0x25C4,
+  triagrt: 0x25BA,
+  triagup: 0x25B2,
+  ts: 0x02A6,
+  tsadi: 0x05E6,
+  tsadidagesh: 0xFB46,
+  tsadidageshhebrew: 0xFB46,
+  tsadihebrew: 0x05E6,
+  tsecyrillic: 0x0446,
+  tsere: 0x05B5,
+  tsere12: 0x05B5,
+  tsere1e: 0x05B5,
+  tsere2b: 0x05B5,
+  tserehebrew: 0x05B5,
+  tserenarrowhebrew: 0x05B5,
+  tserequarterhebrew: 0x05B5,
+  tserewidehebrew: 0x05B5,
+  tshecyrillic: 0x045B,
+  tsuperior: 0xF6F3,
+  ttabengali: 0x099F,
+  ttadeva: 0x091F,
+  ttagujarati: 0x0A9F,
+  ttagurmukhi: 0x0A1F,
+  tteharabic: 0x0679,
+  ttehfinalarabic: 0xFB67,
+  ttehinitialarabic: 0xFB68,
+  ttehmedialarabic: 0xFB69,
+  tthabengali: 0x09A0,
+  tthadeva: 0x0920,
+  tthagujarati: 0x0AA0,
+  tthagurmukhi: 0x0A20,
+  tturned: 0x0287,
+  tuhiragana: 0x3064,
+  tukatakana: 0x30C4,
+  tukatakanahalfwidth: 0xFF82,
+  tusmallhiragana: 0x3063,
+  tusmallkatakana: 0x30C3,
+  tusmallkatakanahalfwidth: 0xFF6F,
+  twelvecircle: 0x246B,
+  twelveparen: 0x247F,
+  twelveperiod: 0x2493,
+  twelveroman: 0x217B,
+  twentycircle: 0x2473,
+  twentyhangzhou: 0x5344,
+  twentyparen: 0x2487,
+  twentyperiod: 0x249B,
+  two: 0x0032,
+  twoarabic: 0x0662,
+  twobengali: 0x09E8,
+  twocircle: 0x2461,
+  twocircleinversesansserif: 0x278B,
+  twodeva: 0x0968,
+  twodotenleader: 0x2025,
+  twodotleader: 0x2025,
+  twodotleadervertical: 0xFE30,
+  twogujarati: 0x0AE8,
+  twogurmukhi: 0x0A68,
+  twohackarabic: 0x0662,
+  twohangzhou: 0x3022,
+  twoideographicparen: 0x3221,
+  twoinferior: 0x2082,
+  twomonospace: 0xFF12,
+  twonumeratorbengali: 0x09F5,
+  twooldstyle: 0xF732,
+  twoparen: 0x2475,
+  twoperiod: 0x2489,
+  twopersian: 0x06F2,
+  tworoman: 0x2171,
+  twostroke: 0x01BB,
+  twosuperior: 0x00B2,
+  twothai: 0x0E52,
+  twothirds: 0x2154,
+  u: 0x0075,
+  uacute: 0x00FA,
+  ubar: 0x0289,
+  ubengali: 0x0989,
+  ubopomofo: 0x3128,
+  ubreve: 0x016D,
+  ucaron: 0x01D4,
+  ucircle: 0x24E4,
+  ucircumflex: 0x00FB,
+  ucircumflexbelow: 0x1E77,
+  ucyrillic: 0x0443,
+  udattadeva: 0x0951,
+  udblacute: 0x0171,
+  udblgrave: 0x0215,
+  udeva: 0x0909,
+  udieresis: 0x00FC,
+  udieresisacute: 0x01D8,
+  udieresisbelow: 0x1E73,
+  udieresiscaron: 0x01DA,
+  udieresiscyrillic: 0x04F1,
+  udieresisgrave: 0x01DC,
+  udieresismacron: 0x01D6,
+  udotbelow: 0x1EE5,
+  ugrave: 0x00F9,
+  ugujarati: 0x0A89,
+  ugurmukhi: 0x0A09,
+  uhiragana: 0x3046,
+  uhookabove: 0x1EE7,
+  uhorn: 0x01B0,
+  uhornacute: 0x1EE9,
+  uhorndotbelow: 0x1EF1,
+  uhorngrave: 0x1EEB,
+  uhornhookabove: 0x1EED,
+  uhorntilde: 0x1EEF,
+  uhungarumlaut: 0x0171,
+  uhungarumlautcyrillic: 0x04F3,
+  uinvertedbreve: 0x0217,
+  ukatakana: 0x30A6,
+  ukatakanahalfwidth: 0xFF73,
+  ukcyrillic: 0x0479,
+  ukorean: 0x315C,
+  umacron: 0x016B,
+  umacroncyrillic: 0x04EF,
+  umacrondieresis: 0x1E7B,
+  umatragurmukhi: 0x0A41,
+  umonospace: 0xFF55,
+  underscore: 0x005F,
+  underscoredbl: 0x2017,
+  underscoremonospace: 0xFF3F,
+  underscorevertical: 0xFE33,
+  underscorewavy: 0xFE4F,
+  union: 0x222A,
+  universal: 0x2200,
+  uogonek: 0x0173,
+  uparen: 0x24B0,
+  upblock: 0x2580,
+  upperdothebrew: 0x05C4,
+  upsilon: 0x03C5,
+  upsilondieresis: 0x03CB,
+  upsilondieresistonos: 0x03B0,
+  upsilonlatin: 0x028A,
+  upsilontonos: 0x03CD,
+  uptackbelowcmb: 0x031D,
+  uptackmod: 0x02D4,
+  uragurmukhi: 0x0A73,
+  uring: 0x016F,
+  ushortcyrillic: 0x045E,
+  usmallhiragana: 0x3045,
+  usmallkatakana: 0x30A5,
+  usmallkatakanahalfwidth: 0xFF69,
+  ustraightcyrillic: 0x04AF,
+  ustraightstrokecyrillic: 0x04B1,
+  utilde: 0x0169,
+  utildeacute: 0x1E79,
+  utildebelow: 0x1E75,
+  uubengali: 0x098A,
+  uudeva: 0x090A,
+  uugujarati: 0x0A8A,
+  uugurmukhi: 0x0A0A,
+  uumatragurmukhi: 0x0A42,
+  uuvowelsignbengali: 0x09C2,
+  uuvowelsigndeva: 0x0942,
+  uuvowelsigngujarati: 0x0AC2,
+  uvowelsignbengali: 0x09C1,
+  uvowelsigndeva: 0x0941,
+  uvowelsigngujarati: 0x0AC1,
+  v: 0x0076,
+  vadeva: 0x0935,
+  vagujarati: 0x0AB5,
+  vagurmukhi: 0x0A35,
+  vakatakana: 0x30F7,
+  vav: 0x05D5,
+  vavdagesh: 0xFB35,
+  vavdagesh65: 0xFB35,
+  vavdageshhebrew: 0xFB35,
+  vavhebrew: 0x05D5,
+  vavholam: 0xFB4B,
+  vavholamhebrew: 0xFB4B,
+  vavvavhebrew: 0x05F0,
+  vavyodhebrew: 0x05F1,
+  vcircle: 0x24E5,
+  vdotbelow: 0x1E7F,
+  vecyrillic: 0x0432,
+  veharabic: 0x06A4,
+  vehfinalarabic: 0xFB6B,
+  vehinitialarabic: 0xFB6C,
+  vehmedialarabic: 0xFB6D,
+  vekatakana: 0x30F9,
+  venus: 0x2640,
+  verticalbar: 0x007C,
+  verticallineabovecmb: 0x030D,
+  verticallinebelowcmb: 0x0329,
+  verticallinelowmod: 0x02CC,
+  verticallinemod: 0x02C8,
+  vewarmenian: 0x057E,
+  vhook: 0x028B,
+  vikatakana: 0x30F8,
+  viramabengali: 0x09CD,
+  viramadeva: 0x094D,
+  viramagujarati: 0x0ACD,
+  visargabengali: 0x0983,
+  visargadeva: 0x0903,
+  visargagujarati: 0x0A83,
+  vmonospace: 0xFF56,
+  voarmenian: 0x0578,
+  voicediterationhiragana: 0x309E,
+  voicediterationkatakana: 0x30FE,
+  voicedmarkkana: 0x309B,
+  voicedmarkkanahalfwidth: 0xFF9E,
+  vokatakana: 0x30FA,
+  vparen: 0x24B1,
+  vtilde: 0x1E7D,
+  vturned: 0x028C,
+  vuhiragana: 0x3094,
+  vukatakana: 0x30F4,
+  w: 0x0077,
+  wacute: 0x1E83,
+  waekorean: 0x3159,
+  wahiragana: 0x308F,
+  wakatakana: 0x30EF,
+  wakatakanahalfwidth: 0xFF9C,
+  wakorean: 0x3158,
+  wasmallhiragana: 0x308E,
+  wasmallkatakana: 0x30EE,
+  wattosquare: 0x3357,
+  wavedash: 0x301C,
+  wavyunderscorevertical: 0xFE34,
+  wawarabic: 0x0648,
+  wawfinalarabic: 0xFEEE,
+  wawhamzaabovearabic: 0x0624,
+  wawhamzaabovefinalarabic: 0xFE86,
+  wbsquare: 0x33DD,
+  wcircle: 0x24E6,
+  wcircumflex: 0x0175,
+  wdieresis: 0x1E85,
+  wdotaccent: 0x1E87,
+  wdotbelow: 0x1E89,
+  wehiragana: 0x3091,
+  weierstrass: 0x2118,
+  wekatakana: 0x30F1,
+  wekorean: 0x315E,
+  weokorean: 0x315D,
+  wgrave: 0x1E81,
+  whitebullet: 0x25E6,
+  whitecircle: 0x25CB,
+  whitecircleinverse: 0x25D9,
+  whitecornerbracketleft: 0x300E,
+  whitecornerbracketleftvertical: 0xFE43,
+  whitecornerbracketright: 0x300F,
+  whitecornerbracketrightvertical: 0xFE44,
+  whitediamond: 0x25C7,
+  whitediamondcontainingblacksmalldiamond: 0x25C8,
+  whitedownpointingsmalltriangle: 0x25BF,
+  whitedownpointingtriangle: 0x25BD,
+  whiteleftpointingsmalltriangle: 0x25C3,
+  whiteleftpointingtriangle: 0x25C1,
+  whitelenticularbracketleft: 0x3016,
+  whitelenticularbracketright: 0x3017,
+  whiterightpointingsmalltriangle: 0x25B9,
+  whiterightpointingtriangle: 0x25B7,
+  whitesmallsquare: 0x25AB,
+  whitesmilingface: 0x263A,
+  whitesquare: 0x25A1,
+  whitestar: 0x2606,
+  whitetelephone: 0x260F,
+  whitetortoiseshellbracketleft: 0x3018,
+  whitetortoiseshellbracketright: 0x3019,
+  whiteuppointingsmalltriangle: 0x25B5,
+  whiteuppointingtriangle: 0x25B3,
+  wihiragana: 0x3090,
+  wikatakana: 0x30F0,
+  wikorean: 0x315F,
+  wmonospace: 0xFF57,
+  wohiragana: 0x3092,
+  wokatakana: 0x30F2,
+  wokatakanahalfwidth: 0xFF66,
+  won: 0x20A9,
+  wonmonospace: 0xFFE6,
+  wowaenthai: 0x0E27,
+  wparen: 0x24B2,
+  wring: 0x1E98,
+  wsuperior: 0x02B7,
+  wturned: 0x028D,
+  wynn: 0x01BF,
+  x: 0x0078,
+  xabovecmb: 0x033D,
+  xbopomofo: 0x3112,
+  xcircle: 0x24E7,
+  xdieresis: 0x1E8D,
+  xdotaccent: 0x1E8B,
+  xeharmenian: 0x056D,
+  xi: 0x03BE,
+  xmonospace: 0xFF58,
+  xparen: 0x24B3,
+  xsuperior: 0x02E3,
+  y: 0x0079,
+  yaadosquare: 0x334E,
+  yabengali: 0x09AF,
+  yacute: 0x00FD,
+  yadeva: 0x092F,
+  yaekorean: 0x3152,
+  yagujarati: 0x0AAF,
+  yagurmukhi: 0x0A2F,
+  yahiragana: 0x3084,
+  yakatakana: 0x30E4,
+  yakatakanahalfwidth: 0xFF94,
+  yakorean: 0x3151,
+  yamakkanthai: 0x0E4E,
+  yasmallhiragana: 0x3083,
+  yasmallkatakana: 0x30E3,
+  yasmallkatakanahalfwidth: 0xFF6C,
+  yatcyrillic: 0x0463,
+  ycircle: 0x24E8,
+  ycircumflex: 0x0177,
+  ydieresis: 0x00FF,
+  ydotaccent: 0x1E8F,
+  ydotbelow: 0x1EF5,
+  yeharabic: 0x064A,
+  yehbarreearabic: 0x06D2,
+  yehbarreefinalarabic: 0xFBAF,
+  yehfinalarabic: 0xFEF2,
+  yehhamzaabovearabic: 0x0626,
+  yehhamzaabovefinalarabic: 0xFE8A,
+  yehhamzaaboveinitialarabic: 0xFE8B,
+  yehhamzaabovemedialarabic: 0xFE8C,
+  yehinitialarabic: 0xFEF3,
+  yehmedialarabic: 0xFEF4,
+  yehmeeminitialarabic: 0xFCDD,
+  yehmeemisolatedarabic: 0xFC58,
+  yehnoonfinalarabic: 0xFC94,
+  yehthreedotsbelowarabic: 0x06D1,
+  yekorean: 0x3156,
+  yen: 0x00A5,
+  yenmonospace: 0xFFE5,
+  yeokorean: 0x3155,
+  yeorinhieuhkorean: 0x3186,
+  yerahbenyomohebrew: 0x05AA,
+  yerahbenyomolefthebrew: 0x05AA,
+  yericyrillic: 0x044B,
+  yerudieresiscyrillic: 0x04F9,
+  yesieungkorean: 0x3181,
+  yesieungpansioskorean: 0x3183,
+  yesieungsioskorean: 0x3182,
+  yetivhebrew: 0x059A,
+  ygrave: 0x1EF3,
+  yhook: 0x01B4,
+  yhookabove: 0x1EF7,
+  yiarmenian: 0x0575,
+  yicyrillic: 0x0457,
+  yikorean: 0x3162,
+  yinyang: 0x262F,
+  yiwnarmenian: 0x0582,
+  ymonospace: 0xFF59,
+  yod: 0x05D9,
+  yoddagesh: 0xFB39,
+  yoddageshhebrew: 0xFB39,
+  yodhebrew: 0x05D9,
+  yodyodhebrew: 0x05F2,
+  yodyodpatahhebrew: 0xFB1F,
+  yohiragana: 0x3088,
+  yoikorean: 0x3189,
+  yokatakana: 0x30E8,
+  yokatakanahalfwidth: 0xFF96,
+  yokorean: 0x315B,
+  yosmallhiragana: 0x3087,
+  yosmallkatakana: 0x30E7,
+  yosmallkatakanahalfwidth: 0xFF6E,
+  yotgreek: 0x03F3,
+  yoyaekorean: 0x3188,
+  yoyakorean: 0x3187,
+  yoyakthai: 0x0E22,
+  yoyingthai: 0x0E0D,
+  yparen: 0x24B4,
+  ypogegrammeni: 0x037A,
+  ypogegrammenigreekcmb: 0x0345,
+  yr: 0x01A6,
+  yring: 0x1E99,
+  ysuperior: 0x02B8,
+  ytilde: 0x1EF9,
+  yturned: 0x028E,
+  yuhiragana: 0x3086,
+  yuikorean: 0x318C,
+  yukatakana: 0x30E6,
+  yukatakanahalfwidth: 0xFF95,
+  yukorean: 0x3160,
+  yusbigcyrillic: 0x046B,
+  yusbigiotifiedcyrillic: 0x046D,
+  yuslittlecyrillic: 0x0467,
+  yuslittleiotifiedcyrillic: 0x0469,
+  yusmallhiragana: 0x3085,
+  yusmallkatakana: 0x30E5,
+  yusmallkatakanahalfwidth: 0xFF6D,
+  yuyekorean: 0x318B,
+  yuyeokorean: 0x318A,
+  yyabengali: 0x09DF,
+  yyadeva: 0x095F,
+  z: 0x007A,
+  zaarmenian: 0x0566,
+  zacute: 0x017A,
+  zadeva: 0x095B,
+  zagurmukhi: 0x0A5B,
+  zaharabic: 0x0638,
+  zahfinalarabic: 0xFEC6,
+  zahinitialarabic: 0xFEC7,
+  zahiragana: 0x3056,
+  zahmedialarabic: 0xFEC8,
+  zainarabic: 0x0632,
+  zainfinalarabic: 0xFEB0,
+  zakatakana: 0x30B6,
+  zaqefgadolhebrew: 0x0595,
+  zaqefqatanhebrew: 0x0594,
+  zarqahebrew: 0x0598,
+  zayin: 0x05D6,
+  zayindagesh: 0xFB36,
+  zayindageshhebrew: 0xFB36,
+  zayinhebrew: 0x05D6,
+  zbopomofo: 0x3117,
+  zcaron: 0x017E,
+  zcircle: 0x24E9,
+  zcircumflex: 0x1E91,
+  zcurl: 0x0291,
+  zdot: 0x017C,
+  zdotaccent: 0x017C,
+  zdotbelow: 0x1E93,
+  zecyrillic: 0x0437,
+  zedescendercyrillic: 0x0499,
+  zedieresiscyrillic: 0x04DF,
+  zehiragana: 0x305C,
+  zekatakana: 0x30BC,
+  zero: 0x0030,
+  zeroarabic: 0x0660,
+  zerobengali: 0x09E6,
+  zerodeva: 0x0966,
+  zerogujarati: 0x0AE6,
+  zerogurmukhi: 0x0A66,
+  zerohackarabic: 0x0660,
+  zeroinferior: 0x2080,
+  zeromonospace: 0xFF10,
+  zerooldstyle: 0xF730,
+  zeropersian: 0x06F0,
+  zerosuperior: 0x2070,
+  zerothai: 0x0E50,
+  zerowidthjoiner: 0xFEFF,
+  zerowidthnonjoiner: 0x200C,
+  zerowidthspace: 0x200B,
+  zeta: 0x03B6,
+  zhbopomofo: 0x3113,
+  zhearmenian: 0x056A,
+  zhebrevecyrillic: 0x04C2,
+  zhecyrillic: 0x0436,
+  zhedescendercyrillic: 0x0497,
+  zhedieresiscyrillic: 0x04DD,
+  zihiragana: 0x3058,
+  zikatakana: 0x30B8,
+  zinorhebrew: 0x05AE,
+  zlinebelow: 0x1E95,
+  zmonospace: 0xFF5A,
+  zohiragana: 0x305E,
+  zokatakana: 0x30BE,
+  zparen: 0x24B5,
+  zretroflexhook: 0x0290,
+  zstroke: 0x01B6,
+  zuhiragana: 0x305A,
+  zukatakana: 0x30BA,
+  '.notdef': 0x0000
+};
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PDFImage = (function PDFImageClosure() {
+  /**
+   * Decode the image in the main thread if it supported. Resovles the promise
+   * when the image data is ready.
+   */
+  function handleImageData(handler, xref, res, image, promise) {
+    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
+      // For natively supported jpegs send them to the main thread for decoding.
+      var dict = image.dict;
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      colorSpace = ColorSpace.parse(colorSpace, xref, res);
+      var numComps = colorSpace.numComps;
+      handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
+        var data = message.data;
+        var stream = new Stream(data, 0, data.length, image.dict);
+        promise.resolve(stream);
+      });
+    } else {
+      promise.resolve(image);
+    }
+  }
+  /**
+   * Decode and clamp a value. The formula is different from the spec because we
+   * don't decode to float range [0,1], we decode it in the [0,max] range.
+   */
+  function decodeAndClamp(value, addend, coefficient, max) {
+    value = addend + value * coefficient;
+    // Clamp the value to the range
+    return value < 0 ? 0 : value > max ? max : value;
+  }
+  function PDFImage(xref, res, image, inline, smask) {
+    this.image = image;
+    if (image.getParams) {
+      // JPX/JPEG2000 streams directly contain bits per component
+      // and color space mode information.
+      TODO('get params from actual stream');
+      // var bits = ...
+      // var colorspace = ...
+    }
+    // TODO cache rendered images?
+
+    var dict = image.dict;
+    this.width = dict.get('Width', 'W');
+    this.height = dict.get('Height', 'H');
+
+    if (this.width < 1 || this.height < 1)
+      error('Invalid image width: ' + this.width + ' or height: ' +
+            this.height);
+
+    this.interpolate = dict.get('Interpolate', 'I') || false;
+    this.imageMask = dict.get('ImageMask', 'IM') || false;
+
+    var bitsPerComponent = image.bitsPerComponent;
+    if (!bitsPerComponent) {
+      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+      if (!bitsPerComponent) {
+        if (this.imageMask)
+          bitsPerComponent = 1;
+        else
+          error('Bits per component missing in image: ' + this.imageMask);
+      }
+    }
+    this.bpc = bitsPerComponent;
+
+    if (!this.imageMask) {
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      if (!colorSpace) {
+        TODO('JPX images (which don"t require color spaces');
+        colorSpace = new Name('DeviceRGB');
+      }
+      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
+      this.numComps = this.colorSpace.numComps;
+    }
+
+    this.decode = dict.get('Decode', 'D');
+    this.needsDecode = false;
+    if (this.decode && this.colorSpace &&
+        !this.colorSpace.isDefaultDecode(this.decode)) {
+      this.needsDecode = true;
+      // Do some preprocessing to avoid more math.
+      var max = (1 << bitsPerComponent) - 1;
+      this.decodeCoefficients = [];
+      this.decodeAddends = [];
+      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+        var dmin = this.decode[i];
+        var dmax = this.decode[i + 1];
+        this.decodeCoefficients[j] = dmax - dmin;
+        this.decodeAddends[j] = max * dmin;
+      }
+    }
+
+    var mask = dict.get('Mask');
+
+    if (mask) {
+      TODO('masked images');
+    } else if (smask) {
+      this.smask = new PDFImage(xref, res, smask, false);
+    }
+  }
+  /**
+   * Handles processing of image data and calls the callback with an argument
+   * of a PDFImage when the image is ready to be used.
+   */
+  PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
+                                                     res, image, inline) {
+    var imageDataPromise = new Promise();
+    var smaskPromise = new Promise();
+    // The image data and smask data may not be ready yet, wait till both are
+    // resolved.
+    Promise.all([imageDataPromise, smaskPromise]).then(function(results) {
+      var imageData = results[0], smaskData = results[1];
+      var image = new PDFImage(xref, res, imageData, inline, smaskData);
+      callback(image);
+    });
+
+    handleImageData(handler, xref, res, image, imageDataPromise);
+
+    var smask = image.dict.get('SMask');
+    if (smask)
+      handleImageData(handler, xref, res, smask, smaskPromise);
+    else
+      smaskPromise.resolve(null);
+  };
+
+  /**
+   * Resize an image using the nearest neighbor algorithm.  Currently only
+   * supports one and three component images.
+   * @param {TypedArray} pixels The original image with one component.
+   * @param {Number} bpc Number of bits per component.
+   * @param {Number} components Number of color components, 1 or 3 is supported.
+   * @param {Number} w1 Original width.
+   * @param {Number} h1 Original height.
+   * @param {Number} w2 New width.
+   * @param {Number} h2 New height.
+   * @return {TypedArray} Resized image data.
+   */
+  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
+                                             w1, h1, w2, h2) {
+    var length = w2 * h2 * components;
+    var temp = bpc <= 8 ? new Uint8Array(length) :
+        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+    var xRatio = w1 / w2;
+    var yRatio = h1 / h2;
+    var px, py, newIndex, oldIndex;
+    for (var i = 0; i < h2; i++) {
+      for (var j = 0; j < w2; j++) {
+        px = Math.floor(j * xRatio);
+        py = Math.floor(i * yRatio);
+        newIndex = (i * w2) + j;
+        oldIndex = ((py * w1) + px);
+        if (components === 1) {
+          temp[newIndex] = pixels[oldIndex];
+        } else if (components === 3) {
+          newIndex *= 3;
+          oldIndex *= 3;
+          temp[newIndex] = pixels[oldIndex];
+          temp[newIndex + 1] = pixels[oldIndex + 1];
+          temp[newIndex + 2] = pixels[oldIndex + 2];
+        }
+      }
+    }
+    return temp;
+  };
+
+  PDFImage.prototype = {
+    get drawWidth() {
+      if (!this.smask)
+        return this.width;
+      return Math.max(this.width, this.smask.width);
+    },
+    get drawHeight() {
+      if (!this.smask)
+        return this.height;
+      return Math.max(this.height, this.smask.height);
+    },
+    getComponents: function PDFImage_getComponents(buffer) {
+      var bpc = this.bpc;
+      var needsDecode = this.needsDecode;
+      var decodeMap = this.decode;
+
+      // This image doesn't require any extra work.
+      if (bpc == 8 && !needsDecode)
+        return buffer;
+
+      var bufferLength = buffer.length;
+      var width = this.width;
+      var height = this.height;
+      var numComps = this.numComps;
+
+      var length = width * height * numComps;
+      var bufferPos = 0;
+      var output = bpc <= 8 ? new Uint8Array(length) :
+        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+      var rowComps = width * numComps;
+      var decodeAddends, decodeCoefficients;
+      if (needsDecode) {
+        decodeAddends = this.decodeAddends;
+        decodeCoefficients = this.decodeCoefficients;
+      }
+      var max = (1 << bpc) - 1;
+
+      if (bpc == 8) {
+        // Optimization for reading 8 bpc images that have a decode.
+        for (var i = 0, ii = length; i < ii; ++i) {
+          var compIndex = i % numComps;
+          var value = buffer[i];
+          value = decodeAndClamp(value, decodeAddends[compIndex],
+                          decodeCoefficients[compIndex], max);
+          output[i] = value;
+        }
+      } else if (bpc == 1) {
+        // Optimization for reading 1 bpc images.
+        var valueZero = 0, valueOne = 1;
+        if (decodeMap) {
+          valueZero = decodeMap[0] ? 1 : 0;
+          valueOne = decodeMap[1] ? 1 : 0;
+        }
+        var mask = 0;
+        var buf = 0;
+
+        for (var i = 0, ii = length; i < ii; ++i) {
+          if (i % rowComps == 0) {
+            mask = 0;
+            buf = 0;
+          } else {
+            mask >>= 1;
+          }
+
+          if (mask <= 0) {
+            buf = buffer[bufferPos++];
+            mask = 128;
+          }
+
+          output[i] = !(buf & mask) ? valueZero : valueOne;
+        }
+      } else {
+        // The general case that handles all other bpc values.
+        var bits = 0, buf = 0;
+        for (var i = 0, ii = length; i < ii; ++i) {
+          if (i % rowComps == 0) {
+            buf = 0;
+            bits = 0;
+          }
+
+          while (bits < bpc) {
+            buf = (buf << 8) | buffer[bufferPos++];
+            bits += 8;
+          }
+
+          var remainingBits = bits - bpc;
+          var value = buf >> remainingBits;
+          if (needsDecode) {
+            var compIndex = i % numComps;
+            value = decodeAndClamp(value, decodeAddends[compIndex],
+                            decodeCoefficients[compIndex], max);
+          }
+          output[i] = value;
+          buf = buf & ((1 << remainingBits) - 1);
+          bits = remainingBits;
+        }
+      }
+      return output;
+    },
+    getOpacity: function PDFImage_getOpacity(width, height) {
+      var smask = this.smask;
+      var originalWidth = this.width;
+      var originalHeight = this.height;
+      var buf;
+
+      if (smask) {
+        var sw = smask.width;
+        var sh = smask.height;
+        buf = new Uint8Array(sw * sh);
+        smask.fillGrayBuffer(buf);
+        if (sw != width || sh != height)
+          buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height);
+      } else {
+        buf = new Uint8Array(width * height);
+        for (var i = 0, ii = width * height; i < ii; ++i)
+          buf[i] = 255;
+      }
+      return buf;
+    },
+    applyStencilMask: function PDFImage_applyStencilMask(buffer,
+                                                         inverseDecode) {
+      var width = this.width, height = this.height;
+      var bitStrideLength = (width + 7) >> 3;
+      var imgArray = this.getImageBytes(bitStrideLength * height);
+      var imgArrayPos = 0;
+      var i, j, mask, buf;
+      // removing making non-masked pixels transparent
+      var bufferPos = 3; // alpha component offset
+      for (i = 0; i < height; i++) {
+        mask = 0;
+        for (j = 0; j < width; j++) {
+          if (!mask) {
+            buf = imgArray[imgArrayPos++];
+            mask = 128;
+          }
+          if (!(buf & mask) == inverseDecode) {
+            buffer[bufferPos] = 0;
+          }
+          bufferPos += 4;
+          mask >>= 1;
+        }
+      }
+    },
+    fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
+      var numComps = this.numComps;
+      var originalWidth = this.width;
+      var originalHeight = this.height;
+      var bpc = this.bpc;
+
+      // rows start at byte boundary;
+      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
+      var imgArray = this.getImageBytes(originalHeight * rowBytes);
+
+      var comps = this.colorSpace.getRgbBuffer(
+        this.getComponents(imgArray), bpc);
+      if (originalWidth != width || originalHeight != height)
+        comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
+                                originalHeight, width, height);
+      var compsPos = 0;
+      var opacity = this.getOpacity(width, height);
+      var opacityPos = 0;
+      var length = width * height * 4;
+
+      for (var i = 0; i < length; i += 4) {
+        buffer[i] = comps[compsPos++];
+        buffer[i + 1] = comps[compsPos++];
+        buffer[i + 2] = comps[compsPos++];
+        buffer[i + 3] = opacity[opacityPos++];
+      }
+    },
+    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
+      var numComps = this.numComps;
+      if (numComps != 1)
+        error('Reading gray scale from a color image: ' + numComps);
+
+      var width = this.width;
+      var height = this.height;
+      var bpc = this.bpc;
+
+      // rows start at byte boundary;
+      var rowBytes = (width * numComps * bpc + 7) >> 3;
+      var imgArray = this.getImageBytes(height * rowBytes);
+
+      var comps = this.getComponents(imgArray);
+      var length = width * height;
+      // we aren't using a colorspace so we need to scale the value
+      var scale = 255 / ((1 << bpc) - 1);
+      for (var i = 0; i < length; ++i)
+        buffer[i] = (scale * comps[i]) | 0;
+    },
+    getImageBytes: function PDFImage_getImageBytes(length) {
+      this.image.reset();
+      return this.image.getBytes(length);
+    }
+  };
+  return PDFImage;
+})();
+
+function loadJpegStream(id, imageData, objs) {
+  var img = new Image();
+  img.onload = (function loadJpegStream_onloadClosure() {
+    objs.resolve(id, img);
+  });
+  img.src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
+}
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+// The Metrics object contains glyph widths (in glyph space units).
+// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
+// space unit corresponds to 1/1000th of text space unit.
+var Metrics = {
+  'Courier': 600,
+  'Courier-Bold': 600,
+  'Courier-BoldOblique': 600,
+  'Courier-Oblique': 600,
+  'Helvetica' : {
+    'space': 278,
+    'exclam': 278,
+    'quotedbl': 355,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 667,
+    'quoteright': 222,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 556,
+    'at': 1015,
+    'A': 667,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 500,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 278,
+    'backslash': 278,
+    'bracketright': 278,
+    'asciicircum': 469,
+    'underscore': 556,
+    'quoteleft': 222,
+    'a': 556,
+    'b': 556,
+    'c': 500,
+    'd': 556,
+    'e': 556,
+    'f': 278,
+    'g': 556,
+    'h': 556,
+    'i': 222,
+    'j': 222,
+    'k': 500,
+    'l': 222,
+    'm': 833,
+    'n': 556,
+    'o': 556,
+    'p': 556,
+    'q': 556,
+    'r': 333,
+    's': 500,
+    't': 278,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 500,
+    'braceleft': 334,
+    'bar': 260,
+    'braceright': 334,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 191,
+    'quotedblleft': 333,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 537,
+    'bullet': 350,
+    'quotesinglbase': 222,
+    'quotedblbase': 333,
+    'quotedblright': 333,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 556,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 222,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 556,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 667,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 500,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 500,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 222,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 500,
+    'scedilla': 500,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 556,
+    'Amacron': 667,
+    'rcaron': 333,
+    'ccedilla': 500,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 643,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 584,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 500,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 260,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 333,
+    'omacron': 556,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 222,
+    'tcaron': 317,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 222,
+    'Oacute': 778,
+    'oacute': 556,
+    'amacron': 556,
+    'sacute': 500,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 556,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 299,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 556,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 556,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 556,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 556,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 556,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 556,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 500,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 584,
+    'odieresis': 556,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 556,
+    'eth': 556,
+    'zcaron': 500,
+    'ncommaaccent': 556,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-Bold': {
+    'space': 278,
+    'exclam': 333,
+    'quotedbl': 474,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 722,
+    'quoteright': 278,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 611,
+    'at': 975,
+    'A': 722,
+    'B': 722,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 556,
+    'K': 722,
+    'L': 611,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 584,
+    'underscore': 556,
+    'quoteleft': 278,
+    'a': 556,
+    'b': 611,
+    'c': 556,
+    'd': 611,
+    'e': 556,
+    'f': 333,
+    'g': 611,
+    'h': 611,
+    'i': 278,
+    'j': 278,
+    'k': 556,
+    'l': 278,
+    'm': 889,
+    'n': 611,
+    'o': 611,
+    'p': 611,
+    'q': 611,
+    'r': 389,
+    's': 556,
+    't': 333,
+    'u': 611,
+    'v': 556,
+    'w': 778,
+    'x': 556,
+    'y': 556,
+    'z': 500,
+    'braceleft': 389,
+    'bar': 280,
+    'braceright': 389,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 238,
+    'quotedblleft': 500,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 611,
+    'fl': 611,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 556,
+    'bullet': 350,
+    'quotesinglbase': 278,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 611,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 611,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 722,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 556,
+    'scommaaccent': 556,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 611,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 556,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 556,
+    'scedilla': 556,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 611,
+    'acircumflex': 556,
+    'Amacron': 722,
+    'rcaron': 389,
+    'ccedilla': 556,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 743,
+    'Umacron': 722,
+    'uring': 611,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 584,
+    'uacute': 611,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 556,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 556,
+    'nacute': 611,
+    'umacron': 611,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 280,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 611,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 389,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 611,
+    'amacron': 556,
+    'sacute': 556,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 611,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 611,
+    'igrave': 278,
+    'ohungarumlaut': 611,
+    'Eogonek': 667,
+    'dcroat': 611,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 400,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 611,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 611,
+    'ntilde': 611,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 611,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 611,
+    'Ccaron': 722,
+    'ugrave': 611,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 611,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 556,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 611,
+    'tcommaaccent': 333,
+    'logicalnot': 584,
+    'odieresis': 611,
+    'udieresis': 611,
+    'notequal': 549,
+    'gcommaaccent': 611,
+    'eth': 611,
+    'zcaron': 500,
+    'ncommaaccent': 611,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-BoldOblique': {
+    'space': 278,
+    'exclam': 333,
+    'quotedbl': 474,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 722,
+    'quoteright': 278,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 611,
+    'at': 975,
+    'A': 722,
+    'B': 722,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 556,
+    'K': 722,
+    'L': 611,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 584,
+    'underscore': 556,
+    'quoteleft': 278,
+    'a': 556,
+    'b': 611,
+    'c': 556,
+    'd': 611,
+    'e': 556,
+    'f': 333,
+    'g': 611,
+    'h': 611,
+    'i': 278,
+    'j': 278,
+    'k': 556,
+    'l': 278,
+    'm': 889,
+    'n': 611,
+    'o': 611,
+    'p': 611,
+    'q': 611,
+    'r': 389,
+    's': 556,
+    't': 333,
+    'u': 611,
+    'v': 556,
+    'w': 778,
+    'x': 556,
+    'y': 556,
+    'z': 500,
+    'braceleft': 389,
+    'bar': 280,
+    'braceright': 389,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 238,
+    'quotedblleft': 500,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 611,
+    'fl': 611,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 556,
+    'bullet': 350,
+    'quotesinglbase': 278,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 611,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 611,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 722,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 556,
+    'scommaaccent': 556,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 611,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 556,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 556,
+    'scedilla': 556,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 611,
+    'acircumflex': 556,
+    'Amacron': 722,
+    'rcaron': 389,
+    'ccedilla': 556,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 743,
+    'Umacron': 722,
+    'uring': 611,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 584,
+    'uacute': 611,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 556,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 556,
+    'nacute': 611,
+    'umacron': 611,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 280,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 611,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 389,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 611,
+    'amacron': 556,
+    'sacute': 556,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 611,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 611,
+    'igrave': 278,
+    'ohungarumlaut': 611,
+    'Eogonek': 667,
+    'dcroat': 611,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 400,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 611,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 611,
+    'ntilde': 611,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 611,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 611,
+    'Ccaron': 722,
+    'ugrave': 611,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 611,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 556,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 611,
+    'tcommaaccent': 333,
+    'logicalnot': 584,
+    'odieresis': 611,
+    'udieresis': 611,
+    'notequal': 549,
+    'gcommaaccent': 611,
+    'eth': 611,
+    'zcaron': 500,
+    'ncommaaccent': 611,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Helvetica-Oblique' : {
+    'space': 278,
+    'exclam': 278,
+    'quotedbl': 355,
+    'numbersign': 556,
+    'dollar': 556,
+    'percent': 889,
+    'ampersand': 667,
+    'quoteright': 222,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 389,
+    'plus': 584,
+    'comma': 278,
+    'hyphen': 333,
+    'period': 278,
+    'slash': 278,
+    'zero': 556,
+    'one': 556,
+    'two': 556,
+    'three': 556,
+    'four': 556,
+    'five': 556,
+    'six': 556,
+    'seven': 556,
+    'eight': 556,
+    'nine': 556,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 584,
+    'equal': 584,
+    'greater': 584,
+    'question': 556,
+    'at': 1015,
+    'A': 667,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 722,
+    'I': 278,
+    'J': 500,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 722,
+    'O': 778,
+    'P': 667,
+    'Q': 778,
+    'R': 722,
+    'S': 667,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 944,
+    'X': 667,
+    'Y': 667,
+    'Z': 611,
+    'bracketleft': 278,
+    'backslash': 278,
+    'bracketright': 278,
+    'asciicircum': 469,
+    'underscore': 556,
+    'quoteleft': 222,
+    'a': 556,
+    'b': 556,
+    'c': 500,
+    'd': 556,
+    'e': 556,
+    'f': 278,
+    'g': 556,
+    'h': 556,
+    'i': 222,
+    'j': 222,
+    'k': 500,
+    'l': 222,
+    'm': 833,
+    'n': 556,
+    'o': 556,
+    'p': 556,
+    'q': 556,
+    'r': 333,
+    's': 500,
+    't': 278,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 500,
+    'braceleft': 334,
+    'bar': 260,
+    'braceright': 334,
+    'asciitilde': 584,
+    'exclamdown': 333,
+    'cent': 556,
+    'sterling': 556,
+    'fraction': 167,
+    'yen': 556,
+    'florin': 556,
+    'section': 556,
+    'currency': 556,
+    'quotesingle': 191,
+    'quotedblleft': 333,
+    'guillemotleft': 556,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 556,
+    'dagger': 556,
+    'daggerdbl': 556,
+    'periodcentered': 278,
+    'paragraph': 537,
+    'bullet': 350,
+    'quotesinglbase': 222,
+    'quotedblbase': 333,
+    'quotedblright': 333,
+    'guillemotright': 556,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 611,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 370,
+    'Lslash': 556,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 365,
+    'ae': 889,
+    'dotlessi': 278,
+    'lslash': 222,
+    'oslash': 611,
+    'oe': 944,
+    'germandbls': 611,
+    'Idieresis': 278,
+    'eacute': 556,
+    'abreve': 556,
+    'uhungarumlaut': 556,
+    'ecaron': 556,
+    'Ydieresis': 667,
+    'divide': 584,
+    'Yacute': 667,
+    'Acircumflex': 667,
+    'aacute': 556,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 500,
+    'ecircumflex': 556,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 556,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 737,
+    'Emacron': 667,
+    'ccaron': 500,
+    'aring': 556,
+    'Ncommaaccent': 722,
+    'lacute': 222,
+    'agrave': 556,
+    'Tcommaaccent': 611,
+    'Cacute': 722,
+    'atilde': 556,
+    'Edotaccent': 667,
+    'scaron': 500,
+    'scedilla': 500,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 556,
+    'Amacron': 667,
+    'rcaron': 333,
+    'ccedilla': 500,
+    'Zdotaccent': 611,
+    'Thorn': 667,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 667,
+    'dcaron': 643,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 333,
+    'Ograve': 778,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 584,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 556,
+    'edieresis': 556,
+    'cacute': 500,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 278,
+    'plusminus': 584,
+    'brokenbar': 260,
+    'registered': 737,
+    'Gbreve': 778,
+    'Idotaccent': 278,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 333,
+    'omacron': 556,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 222,
+    'tcaron': 317,
+    'eogonek': 556,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 556,
+    'zacute': 500,
+    'iogonek': 222,
+    'Oacute': 778,
+    'oacute': 556,
+    'amacron': 556,
+    'sacute': 500,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 333,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 556,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 834,
+    'Scedilla': 667,
+    'lcaron': 299,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 1000,
+    'edotaccent': 556,
+    'Igrave': 278,
+    'Imacron': 278,
+    'Lcaron': 556,
+    'onehalf': 834,
+    'lessequal': 549,
+    'ocircumflex': 556,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 556,
+    'gbreve': 556,
+    'onequarter': 834,
+    'Scaron': 667,
+    'Scommaaccent': 667,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 556,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 556,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 556,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 778,
+    'zdotaccent': 500,
+    'Ecaron': 667,
+    'Iogonek': 278,
+    'kcommaaccent': 500,
+    'minus': 584,
+    'Icircumflex': 278,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 584,
+    'odieresis': 556,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 556,
+    'eth': 556,
+    'zcaron': 500,
+    'ncommaaccent': 556,
+    'onesuperior': 333,
+    'imacron': 278,
+    'Euro': 556
+  },
+  'Symbol': {
+    'space': 250,
+    'exclam': 333,
+    'universal': 713,
+    'numbersign': 500,
+    'existential': 549,
+    'percent': 833,
+    'ampersand': 778,
+    'suchthat': 439,
+    'parenleft': 333,
+    'parenright': 333,
+    'asteriskmath': 500,
+    'plus': 549,
+    'comma': 250,
+    'minus': 549,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 549,
+    'equal': 549,
+    'greater': 549,
+    'question': 444,
+    'congruent': 549,
+    'Alpha': 722,
+    'Beta': 667,
+    'Chi': 722,
+    'Delta': 612,
+    'Epsilon': 611,
+    'Phi': 763,
+    'Gamma': 603,
+    'Eta': 722,
+    'Iota': 333,
+    'theta1': 631,
+    'Kappa': 722,
+    'Lambda': 686,
+    'Mu': 889,
+    'Nu': 722,
+    'Omicron': 722,
+    'Pi': 768,
+    'Theta': 741,
+    'Rho': 556,
+    'Sigma': 592,
+    'Tau': 611,
+    'Upsilon': 690,
+    'sigma1': 439,
+    'Omega': 768,
+    'Xi': 645,
+    'Psi': 795,
+    'Zeta': 611,
+    'bracketleft': 333,
+    'therefore': 863,
+    'bracketright': 333,
+    'perpendicular': 658,
+    'underscore': 500,
+    'radicalex': 500,
+    'alpha': 631,
+    'beta': 549,
+    'chi': 549,
+    'delta': 494,
+    'epsilon': 439,
+    'phi': 521,
+    'gamma': 411,
+    'eta': 603,
+    'iota': 329,
+    'phi1': 603,
+    'kappa': 549,
+    'lambda': 549,
+    'mu': 576,
+    'nu': 521,
+    'omicron': 549,
+    'pi': 549,
+    'theta': 521,
+    'rho': 549,
+    'sigma': 603,
+    'tau': 439,
+    'upsilon': 576,
+    'omega1': 713,
+    'omega': 686,
+    'xi': 493,
+    'psi': 686,
+    'zeta': 494,
+    'braceleft': 480,
+    'bar': 200,
+    'braceright': 480,
+    'similar': 549,
+    'Euro': 750,
+    'Upsilon1': 620,
+    'minute': 247,
+    'lessequal': 549,
+    'fraction': 167,
+    'infinity': 713,
+    'florin': 500,
+    'club': 753,
+    'diamond': 753,
+    'heart': 753,
+    'spade': 753,
+    'arrowboth': 1042,
+    'arrowleft': 987,
+    'arrowup': 603,
+    'arrowright': 987,
+    'arrowdown': 603,
+    'degree': 400,
+    'plusminus': 549,
+    'second': 411,
+    'greaterequal': 549,
+    'multiply': 549,
+    'proportional': 713,
+    'partialdiff': 494,
+    'bullet': 460,
+    'divide': 549,
+    'notequal': 549,
+    'equivalence': 549,
+    'approxequal': 549,
+    'ellipsis': 1000,
+    'arrowvertex': 603,
+    'arrowhorizex': 1000,
+    'carriagereturn': 658,
+    'aleph': 823,
+    'Ifraktur': 686,
+    'Rfraktur': 795,
+    'weierstrass': 987,
+    'circlemultiply': 768,
+    'circleplus': 768,
+    'emptyset': 823,
+    'intersection': 768,
+    'union': 768,
+    'propersuperset': 713,
+    'reflexsuperset': 713,
+    'notsubset': 713,
+    'propersubset': 713,
+    'reflexsubset': 713,
+    'element': 713,
+    'notelement': 713,
+    'angle': 768,
+    'gradient': 713,
+    'registerserif': 790,
+    'copyrightserif': 790,
+    'trademarkserif': 890,
+    'product': 823,
+    'radical': 549,
+    'dotmath': 250,
+    'logicalnot': 713,
+    'logicaland': 603,
+    'logicalor': 603,
+    'arrowdblboth': 1042,
+    'arrowdblleft': 987,
+    'arrowdblup': 603,
+    'arrowdblright': 987,
+    'arrowdbldown': 603,
+    'lozenge': 494,
+    'angleleft': 329,
+    'registersans': 790,
+    'copyrightsans': 790,
+    'trademarksans': 786,
+    'summation': 713,
+    'parenlefttp': 384,
+    'parenleftex': 384,
+    'parenleftbt': 384,
+    'bracketlefttp': 384,
+    'bracketleftex': 384,
+    'bracketleftbt': 384,
+    'bracelefttp': 494,
+    'braceleftmid': 494,
+    'braceleftbt': 494,
+    'braceex': 494,
+    'angleright': 329,
+    'integral': 274,
+    'integraltp': 686,
+    'integralex': 686,
+    'integralbt': 686,
+    'parenrighttp': 384,
+    'parenrightex': 384,
+    'parenrightbt': 384,
+    'bracketrighttp': 384,
+    'bracketrightex': 384,
+    'bracketrightbt': 384,
+    'bracerighttp': 494,
+    'bracerightmid': 494,
+    'bracerightbt': 494,
+    'apple': 790
+  },
+  'Times-Roman': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 408,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 564,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 278,
+    'semicolon': 278,
+    'less': 564,
+    'equal': 564,
+    'greater': 564,
+    'question': 444,
+    'at': 921,
+    'A': 722,
+    'B': 667,
+    'C': 667,
+    'D': 722,
+    'E': 611,
+    'F': 556,
+    'G': 722,
+    'H': 722,
+    'I': 333,
+    'J': 389,
+    'K': 722,
+    'L': 611,
+    'M': 889,
+    'N': 722,
+    'O': 722,
+    'P': 556,
+    'Q': 722,
+    'R': 667,
+    'S': 556,
+    'T': 611,
+    'U': 722,
+    'V': 722,
+    'W': 944,
+    'X': 722,
+    'Y': 722,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 469,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 444,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 500,
+    'i': 278,
+    'j': 278,
+    'k': 500,
+    'l': 278,
+    'm': 778,
+    'n': 500,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 333,
+    's': 389,
+    't': 278,
+    'u': 500,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 444,
+    'braceleft': 480,
+    'bar': 200,
+    'braceright': 480,
+    'asciitilde': 541,
+    'exclamdown': 333,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 180,
+    'quotedblleft': 444,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 453,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 444,
+    'quotedblright': 444,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 444,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 889,
+    'ordfeminine': 276,
+    'Lslash': 611,
+    'Oslash': 722,
+    'OE': 889,
+    'ordmasculine': 310,
+    'ae': 667,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 500,
+    'Idieresis': 333,
+    'eacute': 444,
+    'abreve': 444,
+    'uhungarumlaut': 500,
+    'ecaron': 444,
+    'Ydieresis': 722,
+    'divide': 564,
+    'Yacute': 722,
+    'Acircumflex': 722,
+    'aacute': 444,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 444,
+    'Uacute': 722,
+    'uogonek': 500,
+    'Edieresis': 611,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 760,
+    'Emacron': 611,
+    'ccaron': 444,
+    'aring': 444,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 444,
+    'Tcommaaccent': 611,
+    'Cacute': 667,
+    'atilde': 444,
+    'Edotaccent': 611,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 667,
+    'Gcommaaccent': 722,
+    'ucircumflex': 500,
+    'acircumflex': 444,
+    'Amacron': 722,
+    'rcaron': 333,
+    'ccedilla': 444,
+    'Zdotaccent': 611,
+    'Thorn': 556,
+    'Omacron': 722,
+    'Racute': 667,
+    'Sacute': 556,
+    'dcaron': 588,
+    'Umacron': 722,
+    'uring': 500,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 564,
+    'uacute': 500,
+    'Tcaron': 611,
+    'partialdiff': 476,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 611,
+    'adieresis': 444,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 500,
+    'umacron': 500,
+    'Ncaron': 722,
+    'Iacute': 333,
+    'plusminus': 564,
+    'brokenbar': 200,
+    'registered': 760,
+    'Gbreve': 722,
+    'Idotaccent': 333,
+    'summation': 600,
+    'Egrave': 611,
+    'racute': 333,
+    'omacron': 500,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 326,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 444,
+    'zacute': 444,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 444,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 500,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 611,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 344,
+    'Kcommaaccent': 722,
+    'Lacute': 611,
+    'trademark': 980,
+    'edotaccent': 444,
+    'Igrave': 333,
+    'Imacron': 333,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 500,
+    'Uhungarumlaut': 722,
+    'Eacute': 611,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 500,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 333,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 667,
+    'Lcommaaccent': 611,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 722,
+    'zdotaccent': 444,
+    'Ecaron': 611,
+    'Iogonek': 333,
+    'kcommaaccent': 500,
+    'minus': 564,
+    'Icircumflex': 333,
+    'ncaron': 500,
+    'tcommaaccent': 278,
+    'logicalnot': 564,
+    'odieresis': 500,
+    'udieresis': 500,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 444,
+    'ncommaaccent': 500,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-Bold': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 555,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 1000,
+    'ampersand': 833,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 570,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 570,
+    'equal': 570,
+    'greater': 570,
+    'question': 500,
+    'at': 930,
+    'A': 722,
+    'B': 667,
+    'C': 722,
+    'D': 722,
+    'E': 667,
+    'F': 611,
+    'G': 778,
+    'H': 778,
+    'I': 389,
+    'J': 500,
+    'K': 778,
+    'L': 667,
+    'M': 944,
+    'N': 722,
+    'O': 778,
+    'P': 611,
+    'Q': 778,
+    'R': 722,
+    'S': 556,
+    'T': 667,
+    'U': 722,
+    'V': 722,
+    'W': 1000,
+    'X': 722,
+    'Y': 722,
+    'Z': 667,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 581,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 556,
+    'c': 444,
+    'd': 556,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 556,
+    'i': 278,
+    'j': 333,
+    'k': 556,
+    'l': 278,
+    'm': 833,
+    'n': 556,
+    'o': 500,
+    'p': 556,
+    'q': 556,
+    'r': 444,
+    's': 389,
+    't': 333,
+    'u': 556,
+    'v': 500,
+    'w': 722,
+    'x': 500,
+    'y': 500,
+    'z': 444,
+    'braceleft': 394,
+    'bar': 220,
+    'braceright': 394,
+    'asciitilde': 520,
+    'exclamdown': 333,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 278,
+    'quotedblleft': 500,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 540,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 1000,
+    'ordfeminine': 300,
+    'Lslash': 667,
+    'Oslash': 778,
+    'OE': 1000,
+    'ordmasculine': 330,
+    'ae': 722,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 556,
+    'Idieresis': 389,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 556,
+    'ecaron': 444,
+    'Ydieresis': 722,
+    'divide': 570,
+    'Yacute': 722,
+    'Acircumflex': 722,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 500,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 747,
+    'Emacron': 667,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 667,
+    'Cacute': 722,
+    'atilde': 500,
+    'Edotaccent': 667,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 722,
+    'Gcommaaccent': 778,
+    'ucircumflex': 556,
+    'acircumflex': 500,
+    'Amacron': 722,
+    'rcaron': 444,
+    'ccedilla': 444,
+    'Zdotaccent': 667,
+    'Thorn': 611,
+    'Omacron': 778,
+    'Racute': 722,
+    'Sacute': 556,
+    'dcaron': 672,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 300,
+    'Ograve': 778,
+    'Agrave': 722,
+    'Abreve': 722,
+    'multiply': 570,
+    'uacute': 556,
+    'Tcaron': 667,
+    'partialdiff': 494,
+    'ydieresis': 500,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 389,
+    'plusminus': 570,
+    'brokenbar': 220,
+    'registered': 747,
+    'Gbreve': 778,
+    'Idotaccent': 389,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 444,
+    'omacron': 500,
+    'Zacute': 667,
+    'Zcaron': 667,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 722,
+    'lcommaaccent': 278,
+    'tcaron': 416,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 722,
+    'Adieresis': 722,
+    'egrave': 444,
+    'zacute': 444,
+    'iogonek': 278,
+    'Oacute': 778,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 778,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 556,
+    'twosuperior': 300,
+    'Odieresis': 778,
+    'mu': 556,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 667,
+    'dcroat': 556,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 394,
+    'Kcommaaccent': 778,
+    'Lacute': 667,
+    'trademark': 1000,
+    'edotaccent': 444,
+    'Igrave': 389,
+    'Imacron': 389,
+    'Lcaron': 667,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 778,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 722,
+    'ugrave': 556,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 444,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 722,
+    'Lcommaaccent': 667,
+    'Atilde': 722,
+    'Aogonek': 722,
+    'Aring': 722,
+    'Otilde': 778,
+    'zdotaccent': 444,
+    'Ecaron': 667,
+    'Iogonek': 389,
+    'kcommaaccent': 556,
+    'minus': 570,
+    'Icircumflex': 389,
+    'ncaron': 556,
+    'tcommaaccent': 333,
+    'logicalnot': 570,
+    'odieresis': 500,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 444,
+    'ncommaaccent': 556,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-BoldItalic': {
+    'space': 250,
+    'exclam': 389,
+    'quotedbl': 555,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 570,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 570,
+    'equal': 570,
+    'greater': 570,
+    'question': 500,
+    'at': 832,
+    'A': 667,
+    'B': 667,
+    'C': 667,
+    'D': 722,
+    'E': 667,
+    'F': 667,
+    'G': 722,
+    'H': 778,
+    'I': 389,
+    'J': 500,
+    'K': 667,
+    'L': 611,
+    'M': 889,
+    'N': 722,
+    'O': 722,
+    'P': 611,
+    'Q': 722,
+    'R': 667,
+    'S': 556,
+    'T': 611,
+    'U': 722,
+    'V': 667,
+    'W': 889,
+    'X': 667,
+    'Y': 611,
+    'Z': 611,
+    'bracketleft': 333,
+    'backslash': 278,
+    'bracketright': 333,
+    'asciicircum': 570,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 333,
+    'g': 500,
+    'h': 556,
+    'i': 278,
+    'j': 278,
+    'k': 500,
+    'l': 278,
+    'm': 778,
+    'n': 556,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 389,
+    's': 389,
+    't': 278,
+    'u': 556,
+    'v': 444,
+    'w': 667,
+    'x': 500,
+    'y': 444,
+    'z': 389,
+    'braceleft': 348,
+    'bar': 220,
+    'braceright': 348,
+    'asciitilde': 570,
+    'exclamdown': 389,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 278,
+    'quotedblleft': 500,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 556,
+    'fl': 556,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 500,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 500,
+    'quotedblright': 500,
+    'guillemotright': 500,
+    'ellipsis': 1000,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 1000,
+    'AE': 944,
+    'ordfeminine': 266,
+    'Lslash': 611,
+    'Oslash': 722,
+    'OE': 944,
+    'ordmasculine': 300,
+    'ae': 722,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 722,
+    'germandbls': 500,
+    'Idieresis': 389,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 556,
+    'ecaron': 444,
+    'Ydieresis': 611,
+    'divide': 570,
+    'Yacute': 611,
+    'Acircumflex': 667,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 444,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 556,
+    'Edieresis': 667,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 747,
+    'Emacron': 667,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 722,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 611,
+    'Cacute': 667,
+    'atilde': 500,
+    'Edotaccent': 667,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 494,
+    'Rcaron': 667,
+    'Gcommaaccent': 722,
+    'ucircumflex': 556,
+    'acircumflex': 500,
+    'Amacron': 667,
+    'rcaron': 389,
+    'ccedilla': 444,
+    'Zdotaccent': 611,
+    'Thorn': 611,
+    'Omacron': 722,
+    'Racute': 667,
+    'Sacute': 556,
+    'dcaron': 608,
+    'Umacron': 722,
+    'uring': 556,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 667,
+    'Abreve': 667,
+    'multiply': 570,
+    'uacute': 556,
+    'Tcaron': 611,
+    'partialdiff': 494,
+    'ydieresis': 444,
+    'Nacute': 722,
+    'icircumflex': 278,
+    'Ecircumflex': 667,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 556,
+    'umacron': 556,
+    'Ncaron': 722,
+    'Iacute': 389,
+    'plusminus': 570,
+    'brokenbar': 220,
+    'registered': 747,
+    'Gbreve': 722,
+    'Idotaccent': 389,
+    'summation': 600,
+    'Egrave': 667,
+    'racute': 389,
+    'omacron': 500,
+    'Zacute': 611,
+    'Zcaron': 611,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 366,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 667,
+    'Adieresis': 667,
+    'egrave': 444,
+    'zacute': 389,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 576,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 667,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 556,
+    'lcaron': 382,
+    'Kcommaaccent': 667,
+    'Lacute': 611,
+    'trademark': 1000,
+    'edotaccent': 444,
+    'Igrave': 389,
+    'Imacron': 389,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 556,
+    'Uhungarumlaut': 722,
+    'Eacute': 667,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 556,
+    'Scommaaccent': 556,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 556,
+    'radical': 549,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 722,
+    'otilde': 500,
+    'Rcommaaccent': 667,
+    'Lcommaaccent': 611,
+    'Atilde': 667,
+    'Aogonek': 667,
+    'Aring': 667,
+    'Otilde': 722,
+    'zdotaccent': 389,
+    'Ecaron': 667,
+    'Iogonek': 389,
+    'kcommaaccent': 500,
+    'minus': 606,
+    'Icircumflex': 389,
+    'ncaron': 556,
+    'tcommaaccent': 278,
+    'logicalnot': 606,
+    'odieresis': 500,
+    'udieresis': 556,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 389,
+    'ncommaaccent': 556,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'Times-Italic': {
+    'space': 250,
+    'exclam': 333,
+    'quotedbl': 420,
+    'numbersign': 500,
+    'dollar': 500,
+    'percent': 833,
+    'ampersand': 778,
+    'quoteright': 333,
+    'parenleft': 333,
+    'parenright': 333,
+    'asterisk': 500,
+    'plus': 675,
+    'comma': 250,
+    'hyphen': 333,
+    'period': 250,
+    'slash': 278,
+    'zero': 500,
+    'one': 500,
+    'two': 500,
+    'three': 500,
+    'four': 500,
+    'five': 500,
+    'six': 500,
+    'seven': 500,
+    'eight': 500,
+    'nine': 500,
+    'colon': 333,
+    'semicolon': 333,
+    'less': 675,
+    'equal': 675,
+    'greater': 675,
+    'question': 500,
+    'at': 920,
+    'A': 611,
+    'B': 611,
+    'C': 667,
+    'D': 722,
+    'E': 611,
+    'F': 611,
+    'G': 722,
+    'H': 722,
+    'I': 333,
+    'J': 444,
+    'K': 667,
+    'L': 556,
+    'M': 833,
+    'N': 667,
+    'O': 722,
+    'P': 611,
+    'Q': 722,
+    'R': 611,
+    'S': 500,
+    'T': 556,
+    'U': 722,
+    'V': 611,
+    'W': 833,
+    'X': 611,
+    'Y': 556,
+    'Z': 556,
+    'bracketleft': 389,
+    'backslash': 278,
+    'bracketright': 389,
+    'asciicircum': 422,
+    'underscore': 500,
+    'quoteleft': 333,
+    'a': 500,
+    'b': 500,
+    'c': 444,
+    'd': 500,
+    'e': 444,
+    'f': 278,
+    'g': 500,
+    'h': 500,
+    'i': 278,
+    'j': 278,
+    'k': 444,
+    'l': 278,
+    'm': 722,
+    'n': 500,
+    'o': 500,
+    'p': 500,
+    'q': 500,
+    'r': 389,
+    's': 389,
+    't': 278,
+    'u': 500,
+    'v': 444,
+    'w': 667,
+    'x': 444,
+    'y': 444,
+    'z': 389,
+    'braceleft': 400,
+    'bar': 275,
+    'braceright': 400,
+    'asciitilde': 541,
+    'exclamdown': 389,
+    'cent': 500,
+    'sterling': 500,
+    'fraction': 167,
+    'yen': 500,
+    'florin': 500,
+    'section': 500,
+    'currency': 500,
+    'quotesingle': 214,
+    'quotedblleft': 556,
+    'guillemotleft': 500,
+    'guilsinglleft': 333,
+    'guilsinglright': 333,
+    'fi': 500,
+    'fl': 500,
+    'endash': 500,
+    'dagger': 500,
+    'daggerdbl': 500,
+    'periodcentered': 250,
+    'paragraph': 523,
+    'bullet': 350,
+    'quotesinglbase': 333,
+    'quotedblbase': 556,
+    'quotedblright': 556,
+    'guillemotright': 500,
+    'ellipsis': 889,
+    'perthousand': 1000,
+    'questiondown': 500,
+    'grave': 333,
+    'acute': 333,
+    'circumflex': 333,
+    'tilde': 333,
+    'macron': 333,
+    'breve': 333,
+    'dotaccent': 333,
+    'dieresis': 333,
+    'ring': 333,
+    'cedilla': 333,
+    'hungarumlaut': 333,
+    'ogonek': 333,
+    'caron': 333,
+    'emdash': 889,
+    'AE': 889,
+    'ordfeminine': 276,
+    'Lslash': 556,
+    'Oslash': 722,
+    'OE': 944,
+    'ordmasculine': 310,
+    'ae': 667,
+    'dotlessi': 278,
+    'lslash': 278,
+    'oslash': 500,
+    'oe': 667,
+    'germandbls': 500,
+    'Idieresis': 333,
+    'eacute': 444,
+    'abreve': 500,
+    'uhungarumlaut': 500,
+    'ecaron': 444,
+    'Ydieresis': 556,
+    'divide': 675,
+    'Yacute': 556,
+    'Acircumflex': 611,
+    'aacute': 500,
+    'Ucircumflex': 722,
+    'yacute': 444,
+    'scommaaccent': 389,
+    'ecircumflex': 444,
+    'Uring': 722,
+    'Udieresis': 722,
+    'aogonek': 500,
+    'Uacute': 722,
+    'uogonek': 500,
+    'Edieresis': 611,
+    'Dcroat': 722,
+    'commaaccent': 250,
+    'copyright': 760,
+    'Emacron': 611,
+    'ccaron': 444,
+    'aring': 500,
+    'Ncommaaccent': 667,
+    'lacute': 278,
+    'agrave': 500,
+    'Tcommaaccent': 556,
+    'Cacute': 667,
+    'atilde': 500,
+    'Edotaccent': 611,
+    'scaron': 389,
+    'scedilla': 389,
+    'iacute': 278,
+    'lozenge': 471,
+    'Rcaron': 611,
+    'Gcommaaccent': 722,
+    'ucircumflex': 500,
+    'acircumflex': 500,
+    'Amacron': 611,
+    'rcaron': 389,
+    'ccedilla': 444,
+    'Zdotaccent': 556,
+    'Thorn': 611,
+    'Omacron': 722,
+    'Racute': 611,
+    'Sacute': 500,
+    'dcaron': 544,
+    'Umacron': 722,
+    'uring': 500,
+    'threesuperior': 300,
+    'Ograve': 722,
+    'Agrave': 611,
+    'Abreve': 611,
+    'multiply': 675,
+    'uacute': 500,
+    'Tcaron': 556,
+    'partialdiff': 476,
+    'ydieresis': 444,
+    'Nacute': 667,
+    'icircumflex': 278,
+    'Ecircumflex': 611,
+    'adieresis': 500,
+    'edieresis': 444,
+    'cacute': 444,
+    'nacute': 500,
+    'umacron': 500,
+    'Ncaron': 667,
+    'Iacute': 333,
+    'plusminus': 675,
+    'brokenbar': 275,
+    'registered': 760,
+    'Gbreve': 722,
+    'Idotaccent': 333,
+    'summation': 600,
+    'Egrave': 611,
+    'racute': 389,
+    'omacron': 500,
+    'Zacute': 556,
+    'Zcaron': 556,
+    'greaterequal': 549,
+    'Eth': 722,
+    'Ccedilla': 667,
+    'lcommaaccent': 278,
+    'tcaron': 300,
+    'eogonek': 444,
+    'Uogonek': 722,
+    'Aacute': 611,
+    'Adieresis': 611,
+    'egrave': 444,
+    'zacute': 389,
+    'iogonek': 278,
+    'Oacute': 722,
+    'oacute': 500,
+    'amacron': 500,
+    'sacute': 389,
+    'idieresis': 278,
+    'Ocircumflex': 722,
+    'Ugrave': 722,
+    'Delta': 612,
+    'thorn': 500,
+    'twosuperior': 300,
+    'Odieresis': 722,
+    'mu': 500,
+    'igrave': 278,
+    'ohungarumlaut': 500,
+    'Eogonek': 611,
+    'dcroat': 500,
+    'threequarters': 750,
+    'Scedilla': 500,
+    'lcaron': 300,
+    'Kcommaaccent': 667,
+    'Lacute': 556,
+    'trademark': 980,
+    'edotaccent': 444,
+    'Igrave': 333,
+    'Imacron': 333,
+    'Lcaron': 611,
+    'onehalf': 750,
+    'lessequal': 549,
+    'ocircumflex': 500,
+    'ntilde': 500,
+    'Uhungarumlaut': 722,
+    'Eacute': 611,
+    'emacron': 444,
+    'gbreve': 500,
+    'onequarter': 750,
+    'Scaron': 500,
+    'Scommaaccent': 500,
+    'Ohungarumlaut': 722,
+    'degree': 400,
+    'ograve': 500,
+    'Ccaron': 667,
+    'ugrave': 500,
+    'radical': 453,
+    'Dcaron': 722,
+    'rcommaaccent': 389,
+    'Ntilde': 667,
+    'otilde': 500,
+    'Rcommaaccent': 611,
+    'Lcommaaccent': 556,
+    'Atilde': 611,
+    'Aogonek': 611,
+    'Aring': 611,
+    'Otilde': 722,
+    'zdotaccent': 389,
+    'Ecaron': 611,
+    'Iogonek': 333,
+    'kcommaaccent': 444,
+    'minus': 675,
+    'Icircumflex': 333,
+    'ncaron': 500,
+    'tcommaaccent': 278,
+    'logicalnot': 675,
+    'odieresis': 500,
+    'udieresis': 500,
+    'notequal': 549,
+    'gcommaaccent': 500,
+    'eth': 500,
+    'zcaron': 389,
+    'ncommaaccent': 500,
+    'onesuperior': 300,
+    'imacron': 278,
+    'Euro': 500
+  },
+  'ZapfDingbats': {
+    'space': 278,
+    'a1': 974,
+    'a2': 961,
+    'a202': 974,
+    'a3': 980,
+    'a4': 719,
+    'a5': 789,
+    'a119': 790,
+    'a118': 791,
+    'a117': 690,
+    'a11': 960,
+    'a12': 939,
+    'a13': 549,
+    'a14': 855,
+    'a15': 911,
+    'a16': 933,
+    'a105': 911,
+    'a17': 945,
+    'a18': 974,
+    'a19': 755,
+    'a20': 846,
+    'a21': 762,
+    'a22': 761,
+    'a23': 571,
+    'a24': 677,
+    'a25': 763,
+    'a26': 760,
+    'a27': 759,
+    'a28': 754,
+    'a6': 494,
+    'a7': 552,
+    'a8': 537,
+    'a9': 577,
+    'a10': 692,
+    'a29': 786,
+    'a30': 788,
+    'a31': 788,
+    'a32': 790,
+    'a33': 793,
+    'a34': 794,
+    'a35': 816,
+    'a36': 823,
+    'a37': 789,
+    'a38': 841,
+    'a39': 823,
+    'a40': 833,
+    'a41': 816,
+    'a42': 831,
+    'a43': 923,
+    'a44': 744,
+    'a45': 723,
+    'a46': 749,
+    'a47': 790,
+    'a48': 792,
+    'a49': 695,
+    'a50': 776,
+    'a51': 768,
+    'a52': 792,
+    'a53': 759,
+    'a54': 707,
+    'a55': 708,
+    'a56': 682,
+    'a57': 701,
+    'a58': 826,
+    'a59': 815,
+    'a60': 789,
+    'a61': 789,
+    'a62': 707,
+    'a63': 687,
+    'a64': 696,
+    'a65': 689,
+    'a66': 786,
+    'a67': 787,
+    'a68': 713,
+    'a69': 791,
+    'a70': 785,
+    'a71': 791,
+    'a72': 873,
+    'a73': 761,
+    'a74': 762,
+    'a203': 762,
+    'a75': 759,
+    'a204': 759,
+    'a76': 892,
+    'a77': 892,
+    'a78': 788,
+    'a79': 784,
+    'a81': 438,
+    'a82': 138,
+    'a83': 277,
+    'a84': 415,
+    'a97': 392,
+    'a98': 392,
+    'a99': 668,
+    'a100': 668,
+    'a89': 390,
+    'a90': 390,
+    'a93': 317,
+    'a94': 317,
+    'a91': 276,
+    'a92': 276,
+    'a205': 509,
+    'a85': 509,
+    'a206': 410,
+    'a86': 410,
+    'a87': 234,
+    'a88': 234,
+    'a95': 334,
+    'a96': 334,
+    'a101': 732,
+    'a102': 544,
+    'a103': 544,
+    'a104': 910,
+    'a106': 667,
+    'a107': 760,
+    'a108': 760,
+    'a112': 776,
+    'a111': 595,
+    'a110': 694,
+    'a109': 626,
+    'a120': 788,
+    'a121': 788,
+    'a122': 788,
+    'a123': 788,
+    'a124': 788,
+    'a125': 788,
+    'a126': 788,
+    'a127': 788,
+    'a128': 788,
+    'a129': 788,
+    'a130': 788,
+    'a131': 788,
+    'a132': 788,
+    'a133': 788,
+    'a134': 788,
+    'a135': 788,
+    'a136': 788,
+    'a137': 788,
+    'a138': 788,
+    'a139': 788,
+    'a140': 788,
+    'a141': 788,
+    'a142': 788,
+    'a143': 788,
+    'a144': 788,
+    'a145': 788,
+    'a146': 788,
+    'a147': 788,
+    'a148': 788,
+    'a149': 788,
+    'a150': 788,
+    'a151': 788,
+    'a152': 788,
+    'a153': 788,
+    'a154': 788,
+    'a155': 788,
+    'a156': 788,
+    'a157': 788,
+    'a158': 788,
+    'a159': 788,
+    'a160': 894,
+    'a161': 838,
+    'a163': 1016,
+    'a164': 458,
+    'a196': 748,
+    'a165': 924,
+    'a192': 748,
+    'a166': 918,
+    'a167': 927,
+    'a168': 928,
+    'a169': 928,
+    'a170': 834,
+    'a171': 873,
+    'a172': 828,
+    'a173': 924,
+    'a162': 924,
+    'a174': 917,
+    'a175': 930,
+    'a176': 931,
+    'a177': 463,
+    'a178': 883,
+    'a179': 836,
+    'a193': 836,
+    'a180': 867,
+    'a199': 867,
+    'a181': 696,
+    'a200': 696,
+    'a182': 874,
+    'a201': 874,
+    'a183': 760,
+    'a184': 946,
+    'a197': 771,
+    'a185': 865,
+    'a194': 771,
+    'a198': 888,
+    'a186': 967,
+    'a195': 888,
+    'a187': 831,
+    'a188': 873,
+    'a189': 927,
+    'a190': 970,
+    'a191': 918
+  }
+};
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var EOF = {};
+
+function isEOF(v) {
+  return v == EOF;
+}
+
+var Parser = (function ParserClosure() {
+  function Parser(lexer, allowStreams, xref) {
+    this.lexer = lexer;
+    this.allowStreams = allowStreams;
+    this.xref = xref;
+    this.inlineImg = 0;
+    this.refill();
+  }
+
+  Parser.prototype = {
+    refill: function Parser_refill() {
+      this.buf1 = this.lexer.getObj();
+      this.buf2 = this.lexer.getObj();
+    },
+    shift: function Parser_shift() {
+      if (isCmd(this.buf2, 'ID')) {
+        this.buf1 = this.buf2;
+        this.buf2 = null;
+        // skip byte after ID
+        this.lexer.skip();
+      } else {
+        this.buf1 = this.buf2;
+        this.buf2 = this.lexer.getObj();
+      }
+    },
+    getObj: function Parser_getObj(cipherTransform) {
+      if (isCmd(this.buf1, 'BI')) { // inline image
+        this.shift();
+        return this.makeInlineImage(cipherTransform);
+      }
+      if (isCmd(this.buf1, '[')) { // array
+        this.shift();
+        var array = [];
+        while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
+          array.push(this.getObj());
+        if (isEOF(this.buf1))
+          error('End of file inside array');
+        this.shift();
+        return array;
+      }
+      if (isCmd(this.buf1, '<<')) { // dictionary or stream
+        this.shift();
+        var dict = new Dict(this.xref);
+        while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
+          if (!isName(this.buf1))
+            error('Dictionary key must be a name object');
+
+          var key = this.buf1.name;
+          this.shift();
+          if (isEOF(this.buf1))
+            break;
+          dict.set(key, this.getObj(cipherTransform));
+        }
+        if (isEOF(this.buf1))
+          error('End of file inside dictionary');
+
+        // stream objects are not allowed inside content streams or
+        // object streams
+        if (isCmd(this.buf2, 'stream')) {
+          return this.allowStreams ?
+            this.makeStream(dict, cipherTransform) : dict;
+        }
+        this.shift();
+        return dict;
+      }
+      if (isInt(this.buf1)) { // indirect reference or integer
+        var num = this.buf1;
+        this.shift();
+        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
+          var ref = new Ref(num, this.buf1);
+          this.shift();
+          this.shift();
+          return ref;
+        }
+        return num;
+      }
+      if (isString(this.buf1)) { // string
+        var str = this.buf1;
+        this.shift();
+        if (cipherTransform)
+          str = cipherTransform.decryptString(str);
+        return str;
+      }
+
+      // simple object
+      var obj = this.buf1;
+      this.shift();
+      return obj;
+    },
+    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+
+      // parse dictionary
+      var dict = new Dict();
+      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
+        if (!isName(this.buf1))
+          error('Dictionary key must be a name object');
+
+        var key = this.buf1.name;
+        this.shift();
+        if (isEOF(this.buf1))
+          break;
+        dict.set(key, this.getObj(cipherTransform));
+      }
+
+      // parse image stream
+      var startPos = stream.pos;
+
+      // searching for the /EI\s/
+      var state = 0, ch;
+      while (state != 4 && (ch = stream.getByte()) != null) {
+        switch (ch) {
+          case 0x20:
+          case 0x0D:
+          case 0x0A:
+            state = state === 3 ? 4 : 0;
+            break;
+          case 0x45:
+            state = 2;
+            break;
+          case 0x49:
+            state = state === 2 ? 3 : 0;
+            break;
+          default:
+            state = 0;
+            break;
+        }
+      }
+
+      // TODO improve the small images performance to remove the limit
+      var inlineImgLimit = 500;
+      if (++this.inlineImg >= inlineImgLimit) {
+        if (this.inlineImg === inlineImgLimit)
+          warn('Too many inline images');
+        this.shift();
+        return null;
+      }
+
+      var length = (stream.pos - 4) - startPos;
+      var imageStream = stream.makeSubStream(startPos, length, dict);
+      if (cipherTransform)
+        imageStream = cipherTransform.createStream(imageStream);
+      imageStream = this.filter(imageStream, dict, length);
+      imageStream.parameters = dict;
+
+      this.buf2 = Cmd.get('EI');
+      this.shift();
+
+      return imageStream;
+    },
+    fetchIfRef: function Parser_fetchIfRef(obj) {
+      // not relying on the xref.fetchIfRef -- xref might not be set
+      return isRef(obj) ? this.xref.fetch(obj) : obj;
+    },
+    makeStream: function Parser_makeStream(dict, cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+
+      // get stream start position
+      lexer.skipToNextLine();
+      var pos = stream.pos;
+
+      // get length
+      var length = this.fetchIfRef(dict.get('Length'));
+      if (!isInt(length))
+        error('Bad ' + length + ' attribute in stream');
+
+      // skip over the stream data
+      stream.pos = pos + length;
+      this.shift(); // '>>'
+      this.shift(); // 'stream'
+      if (!isCmd(this.buf1, 'endstream'))
+        error('Missing endstream');
+      this.shift();
+
+      stream = stream.makeSubStream(pos, length, dict);
+      if (cipherTransform)
+        stream = cipherTransform.createStream(stream);
+      stream = this.filter(stream, dict, length);
+      stream.parameters = dict;
+      return stream;
+    },
+    filter: function Parser_filter(stream, dict, length) {
+      var filter = this.fetchIfRef(dict.get('Filter', 'F'));
+      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
+      if (isName(filter))
+        return this.makeFilter(stream, filter.name, length, params);
+      if (isArray(filter)) {
+        var filterArray = filter;
+        var paramsArray = params;
+        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+          filter = filterArray[i];
+          if (!isName(filter))
+            error('Bad filter name: ' + filter);
+
+          params = null;
+          if (isArray(paramsArray) && (i in paramsArray))
+            params = paramsArray[i];
+          stream = this.makeFilter(stream, filter.name, length, params);
+          // after the first stream the length variable is invalid
+          length = null;
+        }
+      }
+      return stream;
+    },
+    makeFilter: function Parser_makeFilter(stream, name, length, params) {
+      if (name == 'FlateDecode' || name == 'Fl') {
+        if (params) {
+          return new PredictorStream(new FlateStream(stream), params);
+        }
+        return new FlateStream(stream);
+      }
+      if (name == 'LZWDecode' || name == 'LZW') {
+        var earlyChange = 1;
+        if (params) {
+          if (params.has('EarlyChange'))
+            earlyChange = params.get('EarlyChange');
+          return new PredictorStream(
+            new LZWStream(stream, earlyChange), params);
+        }
+        return new LZWStream(stream, earlyChange);
+      }
+      if (name == 'DCTDecode' || name == 'DCT') {
+        var bytes = stream.getBytes(length);
+        return new JpegStream(bytes, stream.dict, this.xref);
+      }
+      if (name == 'JPXDecode' || name == 'JPX') {
+        var bytes = stream.getBytes(length);
+        return new JpxStream(bytes, stream.dict);
+      }
+      if (name == 'ASCII85Decode' || name == 'A85') {
+        return new Ascii85Stream(stream);
+      }
+      if (name == 'ASCIIHexDecode' || name == 'AHx') {
+        return new AsciiHexStream(stream);
+      }
+      if (name == 'CCITTFaxDecode' || name == 'CCF') {
+        return new CCITTFaxStream(stream, params);
+      }
+      if (name == 'RunLengthDecode' || name == 'RL') {
+        return new RunLengthStream(stream);
+      }
+      if (name == 'JBIG2Decode') {
+        error('JBIG2 image format is not currently supprted.');
+      }
+      warn('filter "' + name + '" not supported yet');
+      return stream;
+    }
+  };
+
+  return Parser;
+})();
+
+var Lexer = (function LexerClosure() {
+  function Lexer(stream) {
+    this.stream = stream;
+  }
+
+  Lexer.isSpace = function Lexer_isSpace(ch) {
+    return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
+  };
+
+  // A '1' in this array means the character is white space.  A '1' or
+  // '2' means the character ends a name or command.
+  var specialChars = [
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
+    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
+  ];
+
+  function toHexDigit(ch) {
+    if (ch >= '0' && ch <= '9')
+      return ch.charCodeAt(0) - 48;
+    ch = ch.toUpperCase();
+    if (ch >= 'A' && ch <= 'F')
+      return ch.charCodeAt(0) - 55;
+    return -1;
+  }
+
+  Lexer.prototype = {
+    getNumber: function Lexer_getNumber(ch) {
+      var floating = false;
+      var str = ch;
+      var stream = this.stream;
+      for (;;) {
+        ch = stream.lookChar();
+        if (ch == '.' && !floating) {
+          str += ch;
+          floating = true;
+        } else if (ch == '-') {
+          // ignore minus signs in the middle of numbers to match
+          // Adobe's behavior
+          warn('Badly formated number');
+        } else if (ch >= '0' && ch <= '9') {
+          str += ch;
+        } else if (ch == 'e' || ch == 'E') {
+          floating = true;
+        } else {
+          // the last character doesn't belong to us
+          break;
+        }
+        stream.skip();
+      }
+      var value = parseFloat(str);
+      if (isNaN(value))
+        error('Invalid floating point number: ' + value);
+      return value;
+    },
+    getString: function Lexer_getString() {
+      var numParen = 1;
+      var done = false;
+      var str = '';
+      var stream = this.stream;
+      var ch;
+      do {
+        ch = stream.getChar();
+        switch (ch) {
+          case undefined:
+            warn('Unterminated string');
+            done = true;
+            break;
+          case '(':
+            ++numParen;
+            str += ch;
+            break;
+          case ')':
+            if (--numParen == 0) {
+              done = true;
+            } else {
+              str += ch;
+            }
+            break;
+          case '\\':
+            ch = stream.getChar();
+            switch (ch) {
+              case undefined:
+                warn('Unterminated string');
+                done = true;
+                break;
+              case 'n':
+                str += '\n';
+                break;
+              case 'r':
+                str += '\r';
+                break;
+              case 't':
+                str += '\t';
+                break;
+              case 'b':
+                str += '\b';
+                break;
+              case 'f':
+                str += '\f';
+                break;
+              case '\\':
+              case '(':
+              case ')':
+                str += ch;
+                break;
+              case '0': case '1': case '2': case '3':
+              case '4': case '5': case '6': case '7':
+                var x = ch - '0';
+                ch = stream.lookChar();
+                if (ch >= '0' && ch <= '7') {
+                  stream.skip();
+                  x = (x << 3) + (ch - '0');
+                  ch = stream.lookChar();
+                  if (ch >= '0' && ch <= '7') {
+                    stream.skip();
+                    x = (x << 3) + (ch - '0');
+                  }
+                }
+
+                str += String.fromCharCode(x);
+                break;
+              case '\r':
+                ch = stream.lookChar();
+                if (ch == '\n')
+                  stream.skip();
+                break;
+              case '\n':
+                break;
+              default:
+                str += ch;
+            }
+            break;
+          default:
+            str += ch;
+        }
+      } while (!done);
+      return str;
+    },
+    getName: function Lexer_getName(ch) {
+      var str = '';
+      var stream = this.stream;
+      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+        stream.skip();
+        if (ch == '#') {
+          ch = stream.lookChar();
+          var x = toHexDigit(ch);
+          if (x != -1) {
+            stream.skip();
+            var x2 = toHexDigit(stream.getChar());
+            if (x2 == -1)
+              error('Illegal digit in hex char in name: ' + x2);
+            str += String.fromCharCode((x << 4) | x2);
+          } else {
+            str += '#';
+            str += ch;
+          }
+        } else {
+          str += ch;
+        }
+      }
+      if (str.length > 128)
+        error('Warning: name token is longer than allowed by the spec: ' +
+              str.length);
+      return new Name(str);
+    },
+    getHexString: function Lexer_getHexString(ch) {
+      var str = '';
+      var stream = this.stream;
+      for (;;) {
+        ch = stream.getChar();
+        if (ch == '>') {
+          break;
+        }
+        if (!ch) {
+          warn('Unterminated hex string');
+          break;
+        }
+        if (specialChars[ch.charCodeAt(0)] != 1) {
+          var x, x2;
+          if ((x = toHexDigit(ch)) == -1)
+            error('Illegal character in hex string: ' + ch);
+
+          ch = stream.getChar();
+          while (specialChars[ch.charCodeAt(0)] == 1)
+            ch = stream.getChar();
+
+          if ((x2 = toHexDigit(ch)) == -1)
+            error('Illegal character in hex string: ' + ch);
+
+          str += String.fromCharCode((x << 4) | x2);
+        }
+      }
+      return str;
+    },
+    getObj: function Lexer_getObj() {
+      // skip whitespace and comments
+      var comment = false;
+      var stream = this.stream;
+      var ch;
+      while (true) {
+        if (!(ch = stream.getChar()))
+          return EOF;
+        if (comment) {
+          if (ch == '\r' || ch == '\n')
+            comment = false;
+        } else if (ch == '%') {
+          comment = true;
+        } else if (specialChars[ch.charCodeAt(0)] != 1) {
+          break;
+        }
+      }
+
+      // start reading token
+      switch (ch) {
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+        case '+': case '-': case '.':
+          return this.getNumber(ch);
+        case '(':
+          return this.getString();
+        case '/':
+          return this.getName(ch);
+        // array punctuation
+        case '[':
+        case ']':
+          return Cmd.get(ch);
+        // hex string or dict punctuation
+        case '<':
+          ch = stream.lookChar();
+          if (ch == '<') {
+            // dict punctuation
+            stream.skip();
+            return Cmd.get('<<');
+          }
+          return this.getHexString(ch);
+        // dict punctuation
+        case '>':
+          ch = stream.lookChar();
+          if (ch == '>') {
+            stream.skip();
+            return Cmd.get('>>');
+          }
+        case '{':
+        case '}':
+          return Cmd.get(ch);
+        // fall through
+        case ')':
+          error('Illegal character: ' + ch);
+      }
+
+      // command
+      var str = ch;
+      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
+        stream.skip();
+        if (str.length == 128)
+          error('Command token too long: ' + str.length);
+
+        str += ch;
+      }
+      if (str == 'true')
+        return true;
+      if (str == 'false')
+        return false;
+      if (str == 'null')
+        return null;
+      return Cmd.get(str);
+    },
+    skipToNextLine: function Lexer_skipToNextLine() {
+      var stream = this.stream;
+      while (true) {
+        var ch = stream.getChar();
+        if (!ch || ch == '\n')
+          return;
+        if (ch == '\r') {
+          if ((ch = stream.lookChar()) == '\n')
+            stream.skip();
+          return;
+        }
+      }
+    },
+    skip: function Lexer_skip() {
+      this.stream.skip();
+    }
+  };
+
+  return Lexer;
+})();
+
+var Linearization = (function LinearizationClosure() {
+  function Linearization(stream) {
+    this.parser = new Parser(new Lexer(stream), false, null);
+    var obj1 = this.parser.getObj();
+    var obj2 = this.parser.getObj();
+    var obj3 = this.parser.getObj();
+    this.linDict = this.parser.getObj();
+    if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
+        isDict(this.linDict)) {
+      var obj = this.linDict.get('Linearized');
+      if (!(isNum(obj) && obj > 0))
+        this.linDict = null;
+    }
+  }
+
+  Linearization.prototype = {
+    getInt: function Linearization_getInt(name) {
+      var linDict = this.linDict;
+      var obj;
+      if (isDict(linDict) &&
+          isInt(obj = linDict.get(name)) &&
+          obj > 0) {
+        return obj;
+      }
+      error('"' + name + '" field in linearization table is invalid');
+    },
+    getHint: function Linearization_getHint(index) {
+      var linDict = this.linDict;
+      var obj1, obj2;
+      if (isDict(linDict) &&
+          isArray(obj1 = linDict.get('H')) &&
+          obj1.length >= 2 &&
+          isInt(obj2 = obj1[index]) &&
+          obj2 > 0) {
+        return obj2;
+      }
+      error('Hints table in linearization table is invalid: ' + index);
+    },
+    get length() {
+      if (!isDict(this.linDict))
+        return 0;
+      return this.getInt('L');
+    },
+    get hintsOffset() {
+      return this.getHint(0);
+    },
+    get hintsLength() {
+      return this.getHint(1);
+    },
+    get hintsOffset2() {
+      return this.getHint(2);
+    },
+    get hintsLenth2() {
+      return this.getHint(3);
+    },
+    get objectNumberFirst() {
+      return this.getInt('O');
+    },
+    get endFirst() {
+      return this.getInt('E');
+    },
+    get numPages() {
+      return this.getInt('N');
+    },
+    get mainXRefEntriesOffset() {
+      return this.getInt('T');
+    },
+    get pageFirst() {
+      return this.getInt('P');
+    }
+  };
+
+  return Linearization;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var PatternType = {
+  AXIAL: 2,
+  RADIAL: 3
+};
+
+var Pattern = (function PatternClosure() {
+  // Constructor should define this.getPattern
+  function Pattern() {
+    error('should not call Pattern constructor');
+  }
+
+  Pattern.prototype = {
+    // Input: current Canvas context
+    // Output: the appropriate fillStyle or strokeStyle
+    getPattern: function Pattern_getPattern(ctx) {
+      error('Should not call Pattern.getStyle: ' + ctx);
+    }
+  };
+
+  Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
+    return Shadings[raw[0]].fromIR(raw);
+  };
+
+  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
+                                                       res) {
+
+    var dict = isStream(shading) ? shading.dict : shading;
+    var type = dict.get('ShadingType');
+
+    switch (type) {
+      case PatternType.AXIAL:
+      case PatternType.RADIAL:
+        // Both radial and axial shadings are handled by RadialAxial shading.
+        return new Shadings.RadialAxial(dict, matrix, xref, res);
+      default:
+        return new Shadings.Dummy();
+    }
+  };
+  return Pattern;
+})();
+
+var Shadings = {};
+
+// Radial and axial shading have very similar implementations
+// If needed, the implementations can be broken into two classes
+Shadings.RadialAxial = (function RadialAxialClosure() {
+  function RadialAxial(dict, matrix, xref, res, ctx) {
+    this.matrix = matrix;
+    this.coordsArr = dict.get('Coords');
+    this.shadingType = dict.get('ShadingType');
+    this.type = 'Pattern';
+
+    this.ctx = ctx;
+    var cs = dict.get('ColorSpace', 'CS');
+    cs = ColorSpace.parse(cs, xref, res);
+    this.cs = cs;
+
+    var t0 = 0.0, t1 = 1.0;
+    if (dict.has('Domain')) {
+      var domainArr = dict.get('Domain');
+      t0 = domainArr[0];
+      t1 = domainArr[1];
+    }
+
+    var extendStart = false, extendEnd = false;
+    if (dict.has('Extend')) {
+      var extendArr = dict.get('Extend');
+      extendStart = extendArr[0];
+      extendEnd = extendArr[1];
+      TODO('Support extend');
+    }
+
+    this.extendStart = extendStart;
+    this.extendEnd = extendEnd;
+
+    var fnObj = dict.get('Function');
+    if (isArray(fnObj))
+      error('No support for array of functions');
+    if (!isPDFFunction(fnObj))
+      error('Invalid function');
+    var fn = PDFFunction.parse(xref, fnObj);
+
+    // 10 samples seems good enough for now, but probably won't work
+    // if there are sharp color changes. Ideally, we would implement
+    // the spec faithfully and add lossless optimizations.
+    var step = (t1 - t0) / 10;
+    var diff = t1 - t0;
+
+    var colorStops = [];
+    for (var i = t0; i <= t1; i += step) {
+      var rgbColor = cs.getRgb(fn([i]));
+      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      colorStops.push([(i - t0) / diff, cssColor]);
+    }
+
+    this.colorStops = colorStops;
+  }
+
+  RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
+    var type = raw[1];
+    var colorStops = raw[2];
+    var p0 = raw[3];
+    var p1 = raw[4];
+    var r0 = raw[5];
+    var r1 = raw[6];
+    return {
+      type: 'Pattern',
+      getPattern: function RadialAxial_getPattern(ctx) {
+        var curMatrix = ctx.mozCurrentTransform;
+        if (curMatrix) {
+          var userMatrix = ctx.mozCurrentTransformInverse;
+
+          p0 = Util.applyTransform(p0, curMatrix);
+          p0 = Util.applyTransform(p0, userMatrix);
+
+          p1 = Util.applyTransform(p1, curMatrix);
+          p1 = Util.applyTransform(p1, userMatrix);
+        }
+
+        var grad;
+        if (type == PatternType.AXIAL)
+          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+        else if (type == PatternType.RADIAL)
+          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+
+        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+          var c = colorStops[i];
+          grad.addColorStop(c[0], c[1]);
+        }
+        return grad;
+      }
+    };
+  };
+
+  RadialAxial.prototype = {
+    getIR: function RadialAxial_getIR() {
+      var coordsArr = this.coordsArr;
+      var type = this.shadingType;
+      if (type == PatternType.AXIAL) {
+        var p0 = [coordsArr[0], coordsArr[1]];
+        var p1 = [coordsArr[2], coordsArr[3]];
+        var r0 = null;
+        var r1 = null;
+      } else if (type == PatternType.RADIAL) {
+        var p0 = [coordsArr[0], coordsArr[1]];
+        var p1 = [coordsArr[3], coordsArr[4]];
+        var r0 = coordsArr[2];
+        var r1 = coordsArr[5];
+      } else {
+        error('getPattern type unknown: ' + type);
+      }
+
+      var matrix = this.matrix;
+      if (matrix) {
+        p0 = Util.applyTransform(p0, matrix);
+        p1 = Util.applyTransform(p1, matrix);
+      }
+
+      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+    }
+  };
+
+  return RadialAxial;
+})();
+
+Shadings.Dummy = (function DummyClosure() {
+  function Dummy() {
+    this.type = 'Pattern';
+  }
+
+  Dummy.fromIR = function Dummy_fromIR() {
+    return 'hotpink';
+  };
+
+  Dummy.prototype = {
+    getIR: function Dummy_getIR() {
+      return ['Dummy'];
+    }
+  };
+  return Dummy;
+})();
+
+var TilingPattern = (function TilingPatternClosure() {
+  var PaintType = {
+    COLORED: 1,
+    UNCOLORED: 2
+  };
+  var MAX_PATTERN_SIZE = 512;
+
+  function TilingPattern(IR, color, ctx, objs) {
+    var operatorList = IR[2];
+    this.matrix = IR[3];
+    var bbox = IR[4];
+    var xstep = IR[5];
+    var ystep = IR[6];
+    var paintType = IR[7];
+
+    TODO('TilingType');
+
+    this.curMatrix = ctx.mozCurrentTransform;
+    this.invMatrix = ctx.mozCurrentTransformInverse;
+    this.ctx = ctx;
+    this.type = 'Pattern';
+
+    var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
+
+    var topLeft = [x0, y0];
+    // we want the canvas to be as large as the step size
+    var botRight = [x0 + xstep, y0 + ystep];
+
+    var width = botRight[0] - topLeft[0];
+    var height = botRight[1] - topLeft[1];
+
+    // TODO: hack to avoid OOM, we would ideally compute the tiling
+    // pattern to be only as large as the acual size in device space
+    // This could be computed with .mozCurrentTransform, but still
+    // needs to be implemented
+    while (Math.abs(width) > MAX_PATTERN_SIZE ||
+           Math.abs(height) > MAX_PATTERN_SIZE) {
+      width = height = MAX_PATTERN_SIZE;
+    }
+
+    var tmpCanvas = createScratchCanvas(width, height);
+
+    // set the new canvas element context as the graphics context
+    var tmpCtx = tmpCanvas.getContext('2d');
+    var graphics = new CanvasGraphics(tmpCtx, objs);
+
+    switch (paintType) {
+      case PaintType.COLORED:
+        tmpCtx.fillStyle = ctx.fillStyle;
+        tmpCtx.strokeStyle = ctx.strokeStyle;
+        break;
+      case PaintType.UNCOLORED:
+        var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
+        tmpCtx.fillStyle = cssColor;
+        tmpCtx.strokeStyle = cssColor;
+        break;
+      default:
+        error('Unsupported paint type: ' + paintType);
+    }
+
+    var scale = [width / xstep, height / ystep];
+    this.scale = scale;
+
+    // transform coordinates to pattern space
+    var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+    var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+    graphics.transform.apply(graphics, tmpScale);
+    graphics.transform.apply(graphics, tmpTranslate);
+
+    if (bbox && isArray(bbox) && 4 == bbox.length) {
+      var bboxWidth = x1 - x0;
+      var bboxHeight = y1 - y0;
+      graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
+      graphics.clip();
+      graphics.endPath();
+    }
+
+    graphics.executeOperatorList(operatorList);
+
+    this.canvas = tmpCanvas;
+  }
+
+  TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
+    var matrix = dict.get('Matrix');
+    var bbox = dict.get('BBox');
+    var xstep = dict.get('XStep');
+    var ystep = dict.get('YStep');
+    var paintType = dict.get('PaintType');
+
+    return [
+      'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
+    ];
+  };
+
+  TilingPattern.prototype = {
+    getPattern: function TilingPattern_getPattern() {
+      var matrix = this.matrix;
+      var curMatrix = this.curMatrix;
+      var ctx = this.ctx;
+
+      if (curMatrix)
+        ctx.setTransform.apply(ctx, curMatrix);
+
+      if (matrix)
+        ctx.transform.apply(ctx, matrix);
+
+      var scale = this.scale;
+      ctx.scale(1 / scale[0], 1 / scale[1]);
+
+      return ctx.createPattern(this.canvas, 'repeat');
+    }
+  };
+
+  return TilingPattern;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Stream = (function StreamClosure() {
+  function Stream(arrayBuffer, start, length, dict) {
+    this.bytes = new Uint8Array(arrayBuffer);
+    this.start = start || 0;
+    this.pos = this.start;
+    this.end = (start + length) || this.bytes.length;
+    this.dict = dict;
+  }
+
+  // required methods for a stream. if a particular stream does not
+  // implement these, an error should be thrown
+  Stream.prototype = {
+    get length() {
+      return this.end - this.start;
+    },
+    getByte: function Stream_getByte() {
+      if (this.pos >= this.end)
+        return null;
+      return this.bytes[this.pos++];
+    },
+    // returns subarray of original buffer
+    // should only be read
+    getBytes: function Stream_getBytes(length) {
+      var bytes = this.bytes;
+      var pos = this.pos;
+      var strEnd = this.end;
+
+      if (!length)
+        return bytes.subarray(pos, strEnd);
+
+      var end = pos + length;
+      if (end > strEnd)
+        end = strEnd;
+
+      this.pos = end;
+      return bytes.subarray(pos, end);
+    },
+    lookChar: function Stream_lookChar() {
+      if (this.pos >= this.end)
+        return null;
+      return String.fromCharCode(this.bytes[this.pos]);
+    },
+    getChar: function Stream_getChar() {
+      if (this.pos >= this.end)
+        return null;
+      return String.fromCharCode(this.bytes[this.pos++]);
+    },
+    skip: function Stream_skip(n) {
+      if (!n)
+        n = 1;
+      this.pos += n;
+    },
+    reset: function Stream_reset() {
+      this.pos = this.start;
+    },
+    moveStart: function Stream_moveStart() {
+      this.start = this.pos;
+    },
+    makeSubStream: function Stream_makeSubStream(start, length, dict) {
+      return new Stream(this.bytes.buffer, start, length, dict);
+    },
+    isStream: true
+  };
+
+  return Stream;
+})();
+
+var StringStream = (function StringStreamClosure() {
+  function StringStream(str) {
+    var length = str.length;
+    var bytes = new Uint8Array(length);
+    for (var n = 0; n < length; ++n)
+      bytes[n] = str.charCodeAt(n);
+    Stream.call(this, bytes);
+  }
+
+  StringStream.prototype = Stream.prototype;
+
+  return StringStream;
+})();
+
+// super class for the decoding streams
+var DecodeStream = (function DecodeStreamClosure() {
+  function DecodeStream() {
+    this.pos = 0;
+    this.bufferLength = 0;
+    this.eof = false;
+    this.buffer = null;
+  }
+
+  DecodeStream.prototype = {
+    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
+      var buffer = this.buffer;
+      var current = buffer ? buffer.byteLength : 0;
+      if (requested < current)
+        return buffer;
+      var size = 512;
+      while (size < requested)
+        size <<= 1;
+      var buffer2 = new Uint8Array(size);
+      for (var i = 0; i < current; ++i)
+        buffer2[i] = buffer[i];
+      return (this.buffer = buffer2);
+    },
+    getByte: function DecodeStream_getByte() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return this.buffer[this.pos++];
+    },
+    getBytes: function DecodeStream_getBytes(length) {
+      var end, pos = this.pos;
+
+      if (length) {
+        this.ensureBuffer(pos + length);
+        end = pos + length;
+
+        while (!this.eof && this.bufferLength < end)
+          this.readBlock();
+
+        var bufEnd = this.bufferLength;
+        if (end > bufEnd)
+          end = bufEnd;
+      } else {
+        while (!this.eof)
+          this.readBlock();
+
+        end = this.bufferLength;
+
+        // checking if bufferLength is still 0 then
+        // the buffer has to be initialized
+        if (!end)
+          this.buffer = new Uint8Array(0);
+      }
+
+      this.pos = end;
+      return this.buffer.subarray(pos, end);
+    },
+    lookChar: function DecodeStream_lookChar() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return String.fromCharCode(this.buffer[this.pos]);
+    },
+    getChar: function DecodeStream_getChar() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof)
+          return null;
+        this.readBlock();
+      }
+      return String.fromCharCode(this.buffer[this.pos++]);
+    },
+    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
+      var end = start + length;
+      while (this.bufferLength <= end && !this.eof)
+        this.readBlock();
+      return new Stream(this.buffer, start, length, dict);
+    },
+    skip: function DecodeStream_skip(n) {
+      if (!n)
+        n = 1;
+      this.pos += n;
+    },
+    reset: function DecodeStream_reset() {
+      this.pos = 0;
+    }
+  };
+
+  return DecodeStream;
+})();
+
+var FakeStream = (function FakeStreamClosure() {
+  function FakeStream(stream) {
+    this.dict = stream.dict;
+    DecodeStream.call(this);
+  }
+
+  FakeStream.prototype = Object.create(DecodeStream.prototype);
+  FakeStream.prototype.readBlock = function FakeStream_readBlock() {
+    var bufferLength = this.bufferLength;
+    bufferLength += 1024;
+    var buffer = this.ensureBuffer(bufferLength);
+    this.bufferLength = bufferLength;
+  };
+
+  FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
+    var end, pos = this.pos;
+
+    if (length) {
+      this.ensureBuffer(pos + length);
+      end = pos + length;
+
+      while (!this.eof && this.bufferLength < end)
+        this.readBlock();
+
+      var bufEnd = this.bufferLength;
+      if (end > bufEnd)
+        end = bufEnd;
+    } else {
+      this.eof = true;
+      end = this.bufferLength;
+    }
+
+    this.pos = end;
+    return this.buffer.subarray(pos, end);
+  };
+
+  return FakeStream;
+})();
+
+var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
+  function StreamsSequenceStream(streams) {
+    this.streams = streams;
+    DecodeStream.call(this);
+  }
+
+  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
+
+  StreamsSequenceStream.prototype.readBlock =
+    function streamSequenceStreamReadBlock() {
+
+    var streams = this.streams;
+    if (streams.length == 0) {
+      this.eof = true;
+      return;
+    }
+    var stream = streams.shift();
+    var chunk = stream.getBytes();
+    var bufferLength = this.bufferLength;
+    var newLength = bufferLength + chunk.length;
+    var buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  };
+
+  return StreamsSequenceStream;
+})();
+
+var FlateStream = (function FlateStreamClosure() {
+  var codeLenCodeMap = new Uint32Array([
+    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+  ]);
+
+  var lengthDecode = new Uint32Array([
+    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+  ]);
+
+  var distDecode = new Uint32Array([
+    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+  ]);
+
+  var fixedLitCodeTab = [new Uint32Array([
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+  ]), 9];
+
+  var fixedDistCodeTab = [new Uint32Array([
+    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+  ]), 5];
+
+  function FlateStream(stream) {
+    var bytes = stream.getBytes();
+    var bytesPos = 0;
+
+    this.dict = stream.dict;
+    var cmf = bytes[bytesPos++];
+    var flg = bytes[bytesPos++];
+    if (cmf == -1 || flg == -1)
+      error('Invalid header in flate stream: ' + cmf + ', ' + flg);
+    if ((cmf & 0x0f) != 0x08)
+      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+    if ((((cmf << 8) + flg) % 31) != 0)
+      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+    if (flg & 0x20)
+      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+
+    this.bytes = bytes;
+    this.bytesPos = bytesPos;
+
+    this.codeSize = 0;
+    this.codeBuf = 0;
+
+    DecodeStream.call(this);
+  }
+
+  FlateStream.prototype = Object.create(DecodeStream.prototype);
+
+  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var bytes = this.bytes;
+    var bytesPos = this.bytesPos;
+
+    var b;
+    while (codeSize < bits) {
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad encoding in flate stream');
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    b = codeBuf & ((1 << bits) - 1);
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+    this.bytesPos = bytesPos;
+    return b;
+  };
+
+  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
+    var codes = table[0];
+    var maxLen = table[1];
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var bytes = this.bytes;
+    var bytesPos = this.bytesPos;
+
+    while (codeSize < maxLen) {
+      var b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad encoding in flate stream');
+      codeBuf |= (b << codeSize);
+      codeSize += 8;
+    }
+    var code = codes[codeBuf & ((1 << maxLen) - 1)];
+    var codeLen = code >> 16;
+    var codeVal = code & 0xffff;
+    if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
+      error('Bad encoding in flate stream');
+    this.codeBuf = (codeBuf >> codeLen);
+    this.codeSize = (codeSize - codeLen);
+    this.bytesPos = bytesPos;
+    return codeVal;
+  };
+
+  FlateStream.prototype.generateHuffmanTable =
+    function flateStreamGenerateHuffmanTable(lengths) {
+    var n = lengths.length;
+
+    // find max code length
+    var maxLen = 0;
+    for (var i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen)
+        maxLen = lengths[i];
+    }
+
+    // build the table
+    var size = 1 << maxLen;
+    var codes = new Uint32Array(size);
+    for (var len = 1, code = 0, skip = 2;
+         len <= maxLen;
+         ++len, code <<= 1, skip <<= 1) {
+      for (var val = 0; val < n; ++val) {
+        if (lengths[val] == len) {
+          // bit-reverse the code
+          var code2 = 0;
+          var t = code;
+          for (var i = 0; i < len; ++i) {
+            code2 = (code2 << 1) | (t & 1);
+            t >>= 1;
+          }
+
+          // fill the table entries
+          for (var i = code2; i < size; i += skip)
+            codes[i] = (len << 16) | val;
+
+          ++code;
+        }
+      }
+    }
+
+    return [codes, maxLen];
+  };
+
+  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
+    // read block header
+    var hdr = this.getBits(3);
+    if (hdr & 1)
+      this.eof = true;
+    hdr >>= 1;
+
+    if (hdr == 0) { // uncompressed block
+      var bytes = this.bytes;
+      var bytesPos = this.bytesPos;
+      var b;
+
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      var blockLen = b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      blockLen |= (b << 8);
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      var check = b;
+      if (typeof (b = bytes[bytesPos++]) == 'undefined')
+        error('Bad block header in flate stream');
+      check |= (b << 8);
+      if (check != (~blockLen & 0xffff))
+        error('Bad uncompressed block length in flate stream');
+
+      this.codeBuf = 0;
+      this.codeSize = 0;
+
+      var bufferLength = this.bufferLength;
+      var buffer = this.ensureBuffer(bufferLength + blockLen);
+      var end = bufferLength + blockLen;
+      this.bufferLength = end;
+      for (var n = bufferLength; n < end; ++n) {
+        if (typeof (b = bytes[bytesPos++]) == 'undefined') {
+          this.eof = true;
+          break;
+        }
+        buffer[n] = b;
+      }
+      this.bytesPos = bytesPos;
+      return;
+    }
+
+    var litCodeTable;
+    var distCodeTable;
+    if (hdr == 1) { // compressed block, fixed codes
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr == 2) { // compressed block, dynamic codes
+      var numLitCodes = this.getBits(5) + 257;
+      var numDistCodes = this.getBits(5) + 1;
+      var numCodeLenCodes = this.getBits(4) + 4;
+
+      // build the code lengths code table
+      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+
+      for (var i = 0; i < numCodeLenCodes; ++i)
+        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+      // build the literal and distance code tables
+      var len = 0;
+      var i = 0;
+      var codes = numLitCodes + numDistCodes;
+      var codeLengths = new Uint8Array(codes);
+      while (i < codes) {
+        var code = this.getCode(codeLenCodeTab);
+        if (code == 16) {
+          var bitsLength = 2, bitsOffset = 3, what = len;
+        } else if (code == 17) {
+          var bitsLength = 3, bitsOffset = 3, what = (len = 0);
+        } else if (code == 18) {
+          var bitsLength = 7, bitsOffset = 11, what = (len = 0);
+        } else {
+          codeLengths[i++] = len = code;
+          continue;
+        }
+
+        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        while (repeatLength-- > 0)
+          codeLengths[i++] = what;
+      }
+
+      litCodeTable =
+        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+      distCodeTable =
+        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+    } else {
+      error('Unknown block type in flate stream');
+    }
+
+    var buffer = this.buffer;
+    var limit = buffer ? buffer.length : 0;
+    var pos = this.bufferLength;
+    while (true) {
+      var code1 = this.getCode(litCodeTable);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
+        buffer[pos++] = code1;
+        continue;
+      }
+      if (code1 == 256) {
+        this.bufferLength = pos;
+        return;
+      }
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      var code2 = code1 >> 16;
+      if (code2 > 0)
+        code2 = this.getBits(code2);
+      var len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+      if (code2 > 0)
+        code2 = this.getBits(code2);
+      var dist = (code1 & 0xffff) + code2;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
+      for (var k = 0; k < len; ++k, ++pos)
+        buffer[pos] = buffer[pos - dist];
+    }
+  };
+
+  return FlateStream;
+})();
+
+var PredictorStream = (function PredictorStreamClosure() {
+  function PredictorStream(stream, params) {
+    var predictor = this.predictor = params.get('Predictor') || 1;
+
+    if (predictor <= 1)
+      return stream; // no prediction
+    if (predictor !== 2 && (predictor < 10 || predictor > 15))
+      error('Unsupported predictor: ' + predictor);
+
+    if (predictor === 2)
+      this.readBlock = this.readBlockTiff;
+    else
+      this.readBlock = this.readBlockPng;
+
+    this.stream = stream;
+    this.dict = stream.dict;
+
+    var colors = this.colors = params.get('Colors') || 1;
+    var bits = this.bits = params.get('BitsPerComponent') || 8;
+    var columns = this.columns = params.get('Columns') || 1;
+
+    this.pixBytes = (colors * bits + 7) >> 3;
+    this.rowBytes = (columns * colors * bits + 7) >> 3;
+
+    DecodeStream.call(this);
+    return this;
+  }
+
+  PredictorStream.prototype = Object.create(DecodeStream.prototype);
+
+  PredictorStream.prototype.readBlockTiff =
+    function predictorStreamReadBlockTiff() {
+    var rowBytes = this.rowBytes;
+
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+    var bits = this.bits;
+    var colors = this.colors;
+
+    var rawBytes = this.stream.getBytes(rowBytes);
+
+    var inbuf = 0, outbuf = 0;
+    var inbits = 0, outbits = 0;
+    var pos = bufferLength;
+
+    if (bits === 1) {
+      for (var i = 0; i < rowBytes; ++i) {
+        var c = rawBytes[i];
+        inbuf = (inbuf << 8) | c;
+        // bitwise addition is exclusive or
+        // first shift inbuf and then add
+        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
+        // truncate inbuf (assumes colors < 16)
+        inbuf &= 0xFFFF;
+      }
+    } else if (bits === 8) {
+      for (var i = 0; i < colors; ++i)
+        buffer[pos++] = rawBytes[i];
+      for (; i < rowBytes; ++i) {
+        buffer[pos] = buffer[pos - colors] + rawBytes[i];
+        pos++;
+      }
+    } else {
+      var compArray = new Uint8Array(colors + 1);
+      var bitMask = (1 << bits) - 1;
+      var j = 0, k = bufferLength;
+      var columns = this.columns;
+      for (var i = 0; i < columns; ++i) {
+        for (var kk = 0; kk < colors; ++kk) {
+          if (inbits < bits) {
+            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
+            inbits += 8;
+          }
+          compArray[kk] = (compArray[kk] +
+                           (inbuf >> (inbits - bits))) & bitMask;
+          inbits -= bits;
+          outbuf = (outbuf << bits) | compArray[kk];
+          outbits += bits;
+          if (outbits >= 8) {
+            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
+            outbits -= 8;
+          }
+        }
+      }
+      if (outbits > 0) {
+        buffer[k++] = (outbuf << (8 - outbits)) +
+        (inbuf & ((1 << (8 - outbits)) - 1));
+      }
+    }
+    this.bufferLength += rowBytes;
+  };
+
+  PredictorStream.prototype.readBlockPng =
+    function predictorStreamReadBlockPng() {
+
+    var rowBytes = this.rowBytes;
+    var pixBytes = this.pixBytes;
+
+    var predictor = this.stream.getByte();
+    var rawBytes = this.stream.getBytes(rowBytes);
+
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+    if (prevRow.length == 0)
+      prevRow = new Uint8Array(rowBytes);
+
+    var j = bufferLength;
+    switch (predictor) {
+      case 0:
+        for (var i = 0; i < rowBytes; ++i)
+          buffer[j++] = rawBytes[i];
+        break;
+      case 1:
+        for (var i = 0; i < pixBytes; ++i)
+          buffer[j++] = rawBytes[i];
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
+          j++;
+        }
+        break;
+      case 2:
+        for (var i = 0; i < rowBytes; ++i)
+          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
+        break;
+      case 3:
+        for (var i = 0; i < pixBytes; ++i)
+          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
+                           rawBytes[i]) & 0xFF;
+          j++;
+        }
+        break;
+      case 4:
+        // we need to save the up left pixels values. the simplest way
+        // is to create a new buffer
+        for (var i = 0; i < pixBytes; ++i) {
+          var up = prevRow[i];
+          var c = rawBytes[i];
+          buffer[j++] = up + c;
+        }
+        for (; i < rowBytes; ++i) {
+          var up = prevRow[i];
+          var upLeft = prevRow[i - pixBytes];
+          var left = buffer[j - pixBytes];
+          var p = left + up - upLeft;
+
+          var pa = p - left;
+          if (pa < 0)
+            pa = -pa;
+          var pb = p - up;
+          if (pb < 0)
+            pb = -pb;
+          var pc = p - upLeft;
+          if (pc < 0)
+            pc = -pc;
+
+          var c = rawBytes[i];
+          if (pa <= pb && pa <= pc)
+            buffer[j++] = left + c;
+          else if (pb <= pc)
+            buffer[j++] = up + c;
+          else
+            buffer[j++] = upLeft + c;
+        }
+        break;
+      default:
+        error('Unsupported predictor: ' + predictor);
+    }
+    this.bufferLength += rowBytes;
+  };
+
+  return PredictorStream;
+})();
+
+/**
+ * Depending on the type of JPEG a JpegStream is handled in different ways. For
+ * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
+ * data is stored and then loaded by the browser.  For unsupported JPEG's we use
+ * a library to decode these images and the stream behaves like all the other
+ * DecodeStreams.
+ */
+var JpegStream = (function JpegStreamClosure() {
+  function isAdobeImage(bytes) {
+    var maxBytesScanned = Math.max(bytes.length - 16, 1024);
+    // Looking for APP14, 'Adobe'
+    for (var i = 0; i < maxBytesScanned; ++i) {
+      if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
+          bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
+          bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
+          bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
+          bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
+          return true;
+      // scanning until frame tag
+      if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
+        break;
+    }
+    return false;
+  }
+
+  function fixAdobeImage(bytes) {
+    // Inserting 'EMBED' marker after JPEG signature
+    var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
+                                      0x44, 0]);
+    var newBytes = new Uint8Array(bytes.length + embedMarker.length);
+    newBytes.set(bytes, embedMarker.length);
+    // copy JPEG header
+    newBytes[0] = bytes[0];
+    newBytes[1] = bytes[1];
+    newBytes.set(embedMarker, 2);
+    return newBytes;
+  }
+
+  function JpegStream(bytes, dict, xref) {
+    // TODO: per poppler, some images may have 'junk' before that
+    // need to be removed
+    this.dict = dict;
+
+    this.isAdobeImage = false;
+    this.colorTransform = dict.get('ColorTransform') || -1;
+
+    if (isAdobeImage(bytes)) {
+      this.isAdobeImage = true;
+      bytes = fixAdobeImage(bytes);
+    }
+
+    this.bytes = bytes;
+
+    DecodeStream.call(this);
+  }
+
+  JpegStream.prototype = Object.create(DecodeStream.prototype);
+
+  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
+    if (this.bufferLength)
+      return;
+    try {
+      var jpegImage = new JpegImage();
+      if (this.colorTransform != -1)
+        jpegImage.colorTransform = this.colorTransform;
+      jpegImage.parse(this.bytes);
+      var width = jpegImage.width;
+      var height = jpegImage.height;
+      var data = jpegImage.getData(width, height);
+      this.buffer = data;
+      this.bufferLength = data.length;
+    } catch (e) {
+      error('JPEG error: ' + e);
+    }
+  };
+  JpegStream.prototype.getIR = function JpegStream_getIR() {
+    return bytesToString(this.bytes);
+  };
+  JpegStream.prototype.getChar = function JpegStream_getChar() {
+    error('internal error: getChar is not valid on JpegStream');
+  };
+  /**
+   * Checks if the image can be decoded and displayed by the browser without any
+   * further processing such as color space conversions.
+   */
+  JpegStream.prototype.isNativelySupported =
+    function JpegStream_isNativelySupported(xref, res) {
+    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
+    // when bug 674619 lands, let's check if browser can do
+    // normal cmyk and then we won't need to decode in JS
+    if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
+      return true;
+    if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
+        this.colorTransform < 1)
+      return true;
+    return false;
+  };
+  /**
+   * Checks if the image can be decoded by the browser.
+   */
+  JpegStream.prototype.isNativelyDecodable =
+    function JpegStream_isNativelyDecodable(xref, res) {
+    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
+    var numComps = cs.numComps;
+    if (numComps == 1 || numComps == 3)
+      return true;
+
+    return false;
+  };
+
+  return JpegStream;
+})();
+
+/**
+ * For JPEG 2000's we use a library to decode these images and
+ * the stream behaves like all the other DecodeStreams.
+ */
+var JpxStream = (function JpxStreamClosure() {
+  function JpxStream(bytes, dict) {
+    this.dict = dict;
+    this.bytes = bytes;
+
+    DecodeStream.call(this);
+  }
+
+  JpxStream.prototype = Object.create(DecodeStream.prototype);
+
+  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
+    if (this.bufferLength)
+      return;
+
+    var jpxImage = new JpxImage();
+    jpxImage.parse(this.bytes);
+
+    var width = jpxImage.width;
+    var height = jpxImage.height;
+    var componentsCount = jpxImage.componentsCount;
+    if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
+      error('JPX with ' + componentsCount + ' components is not supported');
+
+    var data = new Uint8Array(width * height * componentsCount);
+
+    for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
+      var tileCompoments = jpxImage.tiles[k];
+      var tileWidth = tileCompoments[0].width;
+      var tileHeight = tileCompoments[0].height;
+      var tileLeft = tileCompoments[0].left;
+      var tileTop = tileCompoments[0].top;
+
+      var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
+      switch (componentsCount) {
+        case 1:
+          data0 = tileCompoments[0].items;
+
+          dataPosition = width * tileTop + tileLeft;
+          rowFeed = width - tileWidth;
+          sourcePosition = 0;
+          for (var j = 0; j < tileHeight; j++) {
+            for (var i = 0; i < tileWidth; i++)
+              data[dataPosition++] = data0[sourcePosition++];
+            dataPosition += rowFeed;
+          }
+          break;
+        case 3:
+          data0 = tileCompoments[0].items;
+          data1 = tileCompoments[1].items;
+          data2 = tileCompoments[2].items;
+
+          dataPosition = (width * tileTop + tileLeft) * 3;
+          rowFeed = (width - tileWidth) * 3;
+          sourcePosition = 0;
+          for (var j = 0; j < tileHeight; j++) {
+            for (var i = 0; i < tileWidth; i++) {
+              data[dataPosition++] = data0[sourcePosition];
+              data[dataPosition++] = data1[sourcePosition];
+              data[dataPosition++] = data2[sourcePosition];
+              sourcePosition++;
+            }
+            dataPosition += rowFeed;
+          }
+          break;
+        case 4:
+          data0 = tileCompoments[0].items;
+          data1 = tileCompoments[1].items;
+          data2 = tileCompoments[2].items;
+          data3 = tileCompoments[3].items;
+
+          dataPosition = (width * tileTop + tileLeft) * 4;
+          rowFeed = (width - tileWidth) * 4;
+          sourcePosition = 0;
+          for (var j = 0; j < tileHeight; j++) {
+            for (var i = 0; i < tileWidth; i++) {
+              data[dataPosition++] = data0[sourcePosition];
+              data[dataPosition++] = data1[sourcePosition];
+              data[dataPosition++] = data2[sourcePosition];
+              data[dataPosition++] = data3[sourcePosition];
+              sourcePosition++;
+            }
+            dataPosition += rowFeed;
+          }
+          break;
+      }
+    }
+
+    this.buffer = data;
+    this.bufferLength = data.length;
+  };
+  JpxStream.prototype.getChar = function JpxStream_getChar() {
+    error('internal error: getChar is not valid on JpxStream');
+  };
+
+  return JpxStream;
+})();
+
+var DecryptStream = (function DecryptStreamClosure() {
+  function DecryptStream(str, decrypt) {
+    this.str = str;
+    this.dict = str.dict;
+    this.decrypt = decrypt;
+
+    DecodeStream.call(this);
+  }
+
+  var chunkSize = 512;
+
+  DecryptStream.prototype = Object.create(DecodeStream.prototype);
+
+  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
+    var chunk = this.str.getBytes(chunkSize);
+    if (!chunk || chunk.length == 0) {
+      this.eof = true;
+      return;
+    }
+    var decrypt = this.decrypt;
+    chunk = decrypt(chunk);
+
+    var bufferLength = this.bufferLength;
+    var i, n = chunk.length;
+    var buffer = this.ensureBuffer(bufferLength + n);
+    for (i = 0; i < n; i++)
+      buffer[bufferLength++] = chunk[i];
+    this.bufferLength = bufferLength;
+  };
+
+  return DecryptStream;
+})();
+
+var Ascii85Stream = (function Ascii85StreamClosure() {
+  function Ascii85Stream(str) {
+    this.str = str;
+    this.dict = str.dict;
+    this.input = new Uint8Array(5);
+
+    DecodeStream.call(this);
+  }
+
+  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
+
+  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
+    var tildaCode = '~'.charCodeAt(0);
+    var zCode = 'z'.charCodeAt(0);
+    var str = this.str;
+
+    var c = str.getByte();
+    while (Lexer.isSpace(String.fromCharCode(c)))
+      c = str.getByte();
+
+    if (!c || c === tildaCode) {
+      this.eof = true;
+      return;
+    }
+
+    var bufferLength = this.bufferLength, buffer;
+
+    // special code for z
+    if (c == zCode) {
+      buffer = this.ensureBuffer(bufferLength + 4);
+      for (var i = 0; i < 4; ++i)
+        buffer[bufferLength + i] = 0;
+      this.bufferLength += 4;
+    } else {
+      var input = this.input;
+      input[0] = c;
+      for (var i = 1; i < 5; ++i) {
+        c = str.getByte();
+        while (Lexer.isSpace(String.fromCharCode(c)))
+          c = str.getByte();
+
+        input[i] = c;
+
+        if (!c || c == tildaCode)
+          break;
+      }
+      buffer = this.ensureBuffer(bufferLength + i - 1);
+      this.bufferLength += i - 1;
+
+      // partial ending;
+      if (i < 5) {
+        for (; i < 5; ++i)
+          input[i] = 0x21 + 84;
+        this.eof = true;
+      }
+      var t = 0;
+      for (var i = 0; i < 5; ++i)
+        t = t * 85 + (input[i] - 0x21);
+
+      for (var i = 3; i >= 0; --i) {
+        buffer[bufferLength + i] = t & 0xFF;
+        t >>= 8;
+      }
+    }
+  };
+
+  return Ascii85Stream;
+})();
+
+var AsciiHexStream = (function AsciiHexStreamClosure() {
+  function AsciiHexStream(str) {
+    this.str = str;
+    this.dict = str.dict;
+
+    DecodeStream.call(this);
+  }
+
+  var hexvalueMap = {
+      9: -1, // \t
+      32: -1, // space
+      48: 0,
+      49: 1,
+      50: 2,
+      51: 3,
+      52: 4,
+      53: 5,
+      54: 6,
+      55: 7,
+      56: 8,
+      57: 9,
+      65: 10,
+      66: 11,
+      67: 12,
+      68: 13,
+      69: 14,
+      70: 15,
+      97: 10,
+      98: 11,
+      99: 12,
+      100: 13,
+      101: 14,
+      102: 15
+  };
+
+  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
+
+  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
+    var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
+        decodeLength, buffer, bufferLength, i, length;
+
+    decodeLength = (bytes.length + 1) >> 1;
+    buffer = this.ensureBuffer(this.bufferLength + decodeLength);
+    bufferLength = this.bufferLength;
+
+    for (i = 0, length = bytes.length; i < length; i++) {
+      c = hexvalueMap[bytes[i]];
+      while (c == -1 && (i + 1) < length) {
+        c = hexvalueMap[bytes[++i]];
+      }
+
+      if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
+        n = hexvalueMap[bytes[++i]];
+        buffer[bufferLength++] = c * 16 + n;
+      } else {
+        // EOD marker at an odd number, behave as if a 0 followed the last
+        // digit.
+        if (bytes[i] !== gtCode) {
+          buffer[bufferLength++] = c * 16;
+        }
+      }
+    }
+
+    this.bufferLength = bufferLength;
+    this.eof = true;
+  };
+
+  return AsciiHexStream;
+})();
+
+var RunLengthStream = (function RunLengthStreamClosure() {
+  function RunLengthStream(str) {
+    this.str = str;
+    this.dict = str.dict;
+
+    DecodeStream.call(this);
+  }
+
+  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
+
+  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
+    // The repeatHeader has following format. The first byte defines type of run
+    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
+    // (in addition to the second byte from the header), n = 129 through 255 -
+    // duplicate the second byte from the header (257 - n) times, n = 128 - end.
+    var repeatHeader = this.str.getBytes(2);
+    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
+      this.eof = true;
+      return;
+    }
+
+    var bufferLength = this.bufferLength;
+    var n = repeatHeader[0];
+    if (n < 128) {
+      // copy n bytes
+      var buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer[bufferLength++] = repeatHeader[1];
+      if (n > 0) {
+        var source = this.str.getBytes(n);
+        buffer.set(source, bufferLength);
+        bufferLength += n;
+      }
+    } else {
+      n = 257 - n;
+      var b = repeatHeader[1];
+      var buffer = this.ensureBuffer(bufferLength + n + 1);
+      for (var i = 0; i < n; i++)
+        buffer[bufferLength++] = b;
+    }
+    this.bufferLength = bufferLength;
+  };
+
+  return RunLengthStream;
+})();
+
+var CCITTFaxStream = (function CCITTFaxStreamClosure() {
+
+  var ccittEOL = -2;
+  var twoDimPass = 0;
+  var twoDimHoriz = 1;
+  var twoDimVert0 = 2;
+  var twoDimVertR1 = 3;
+  var twoDimVertL1 = 4;
+  var twoDimVertR2 = 5;
+  var twoDimVertL2 = 6;
+  var twoDimVertR3 = 7;
+  var twoDimVertL3 = 8;
+
+  var twoDimTable = [
+    [-1, -1], [-1, -1],                   // 000000x
+    [7, twoDimVertL3],                    // 0000010
+    [7, twoDimVertR3],                    // 0000011
+    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
+    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
+    [4, twoDimPass], [4, twoDimPass],     // 0001xxx
+    [4, twoDimPass], [4, twoDimPass],
+    [4, twoDimPass], [4, twoDimPass],
+    [4, twoDimPass], [4, twoDimPass],
+    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimHoriz], [3, twoDimHoriz],
+    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertL1], [3, twoDimVertL1],
+    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [3, twoDimVertR1], [3, twoDimVertR1],
+    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0],
+    [1, twoDimVert0], [1, twoDimVert0]
+  ];
+
+  var whiteTable1 = [
+    [-1, -1],                               // 00000
+    [12, ccittEOL],                         // 00001
+    [-1, -1], [-1, -1],                     // 0001x
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
+    [11, 1792], [11, 1792],                 // 1000x
+    [12, 1984],                             // 10010
+    [12, 2048],                             // 10011
+    [12, 2112],                             // 10100
+    [12, 2176],                             // 10101
+    [12, 2240],                             // 10110
+    [12, 2304],                             // 10111
+    [11, 1856], [11, 1856],                 // 1100x
+    [11, 1920], [11, 1920],                 // 1101x
+    [12, 2368],                             // 11100
+    [12, 2432],                             // 11101
+    [12, 2496],                             // 11110
+    [12, 2560]                              // 11111
+  ];
+
+  var whiteTable2 = [
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
+    [8, 29], [8, 29],                           // 00000010x
+    [8, 30], [8, 30],                           // 00000011x
+    [8, 45], [8, 45],                           // 00000100x
+    [8, 46], [8, 46],                           // 00000101x
+    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
+    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
+    [8, 47], [8, 47],                           // 00001010x
+    [8, 48], [8, 48],                           // 00001011x
+    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
+    [6, 13], [6, 13], [6, 13], [6, 13],
+    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
+    [8, 33], [8, 33],                           // 00010010x
+    [8, 34], [8, 34],                           // 00010011x
+    [8, 35], [8, 35],                           // 00010100x
+    [8, 36], [8, 36],                           // 00010101x
+    [8, 37], [8, 37],                           // 00010110x
+    [8, 38], [8, 38],                           // 00010111x
+    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
+    [8, 31], [8, 31],                           // 00011010x
+    [8, 32], [8, 32],                           // 00011011x
+    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
+    [6, 1], [6, 1], [6, 1], [6, 1],
+    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
+    [6, 12], [6, 12], [6, 12], [6, 12],
+    [8, 53], [8, 53],                           // 00100100x
+    [8, 54], [8, 54],                           // 00100101x
+    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
+    [8, 39], [8, 39],                           // 00101000x
+    [8, 40], [8, 40],                           // 00101001x
+    [8, 41], [8, 41],                           // 00101010x
+    [8, 42], [8, 42],                           // 00101011x
+    [8, 43], [8, 43],                           // 00101100x
+    [8, 44], [8, 44],                           // 00101101x
+    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
+    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
+    [8, 61], [8, 61],                           // 00110010x
+    [8, 62], [8, 62],                           // 00110011x
+    [8, 63], [8, 63],                           // 00110100x
+    [8, 0], [8, 0],                             // 00110101x
+    [8, 320], [8, 320],                         // 00110110x
+    [8, 384], [8, 384],                         // 00110111x
+    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 10], [5, 10], [5, 10], [5, 10],
+    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [5, 11], [5, 11], [5, 11], [5, 11],
+    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
+    [8, 59], [8, 59],                           // 01001010x
+    [8, 60], [8, 60],                           // 01001011x
+    [9, 1472],                                  // 010011000
+    [9, 1536],                                  // 010011001
+    [9, 1600],                                  // 010011010
+    [9, 1728],                                  // 010011011
+    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
+    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
+    [8, 49], [8, 49],                           // 01010010x
+    [8, 50], [8, 50],                           // 01010011x
+    [8, 51], [8, 51],                           // 01010100x
+    [8, 52], [8, 52],                           // 01010101x
+    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
+    [8, 55], [8, 55],                           // 01011000x
+    [8, 56], [8, 56],                           // 01011001x
+    [8, 57], [8, 57],                           // 01011010x
+    [8, 58], [8, 58],                           // 01011011x
+    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
+    [6, 192], [6, 192], [6, 192], [6, 192],
+    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
+    [6, 1664], [6, 1664], [6, 1664], [6, 1664],
+    [8, 448], [8, 448],                         // 01100100x
+    [8, 512], [8, 512],                         // 01100101x
+    [9, 704],                                   // 011001100
+    [9, 768],                                   // 011001101
+    [8, 640], [8, 640],                         // 01100111x
+    [8, 576], [8, 576],                         // 01101000x
+    [9, 832],                                   // 011010010
+    [9, 896],                                   // 011010011
+    [9, 960],                                   // 011010100
+    [9, 1024],                                  // 011010101
+    [9, 1088],                                  // 011010110
+    [9, 1152],                                  // 011010111
+    [9, 1216],                                  // 011011000
+    [9, 1280],                                  // 011011001
+    [9, 1344],                                  // 011011010
+    [9, 1408],                                  // 011011011
+    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
+    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 2], [4, 2], [4, 2], [4, 2],
+    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [4, 3], [4, 3], [4, 3], [4, 3],
+    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 128], [5, 128], [5, 128], [5, 128],
+    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 8], [5, 8], [5, 8], [5, 8],
+    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [5, 9], [5, 9], [5, 9], [5, 9],
+    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
+    [6, 16], [6, 16], [6, 16], [6, 16],
+    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
+    [6, 17], [6, 17], [6, 17], [6, 17],
+    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 4], [4, 4], [4, 4], [4, 4],
+    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [4, 5], [4, 5], [4, 5], [4, 5],
+    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
+    [6, 14], [6, 14], [6, 14], [6, 14],
+    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
+    [6, 15], [6, 15], [6, 15], [6, 15],
+    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [5, 64], [5, 64], [5, 64], [5, 64],
+    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 6], [4, 6], [4, 6], [4, 6],
+    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7],
+    [4, 7], [4, 7], [4, 7], [4, 7]
+  ];
+
+  var blackTable1 = [
+    [-1, -1], [-1, -1],                             // 000000000000x
+    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
+    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
+    [12, 1984], [12, 1984],                         // 000000010010x
+    [12, 2048], [12, 2048],                         // 000000010011x
+    [12, 2112], [12, 2112],                         // 000000010100x
+    [12, 2176], [12, 2176],                         // 000000010101x
+    [12, 2240], [12, 2240],                         // 000000010110x
+    [12, 2304], [12, 2304],                         // 000000010111x
+    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
+    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
+    [12, 2368], [12, 2368],                         // 000000011100x
+    [12, 2432], [12, 2432],                         // 000000011101x
+    [12, 2496], [12, 2496],                         // 000000011110x
+    [12, 2560], [12, 2560],                         // 000000011111x
+    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
+    [10, 18], [10, 18], [10, 18], [10, 18],
+    [12, 52], [12, 52],                             // 000000100100x
+    [13, 640],                                      // 0000001001010
+    [13, 704],                                      // 0000001001011
+    [13, 768],                                      // 0000001001100
+    [13, 832],                                      // 0000001001101
+    [12, 55], [12, 55],                             // 000000100111x
+    [12, 56], [12, 56],                             // 000000101000x
+    [13, 1280],                                     // 0000001010010
+    [13, 1344],                                     // 0000001010011
+    [13, 1408],                                     // 0000001010100
+    [13, 1472],                                     // 0000001010101
+    [12, 59], [12, 59],                             // 000000101011x
+    [12, 60], [12, 60],                             // 000000101100x
+    [13, 1536],                                     // 0000001011010
+    [13, 1600],                                     // 0000001011011
+    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
+    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
+    [13, 1664],                                     // 0000001100100
+    [13, 1728],                                     // 0000001100101
+    [12, 320], [12, 320],                           // 000000110011x
+    [12, 384], [12, 384],                           // 000000110100x
+    [12, 448], [12, 448],                           // 000000110101x
+    [13, 512],                                      // 0000001101100
+    [13, 576],                                      // 0000001101101
+    [12, 53], [12, 53],                             // 000000110111x
+    [12, 54], [12, 54],                             // 000000111000x
+    [13, 896],                                      // 0000001110010
+    [13, 960],                                      // 0000001110011
+    [13, 1024],                                     // 0000001110100
+    [13, 1088],                                     // 0000001110101
+    [13, 1152],                                     // 0000001110110
+    [13, 1216],                                     // 0000001110111
+    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
+    [10, 64], [10, 64], [10, 64], [10, 64]
+  ];
+
+  var blackTable2 = [
+    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [8, 13], [8, 13], [8, 13], [8, 13],
+    [11, 23], [11, 23],                     // 00000101000x
+    [12, 50],                               // 000001010010
+    [12, 51],                               // 000001010011
+    [12, 44],                               // 000001010100
+    [12, 45],                               // 000001010101
+    [12, 46],                               // 000001010110
+    [12, 47],                               // 000001010111
+    [12, 57],                               // 000001011000
+    [12, 58],                               // 000001011001
+    [12, 61],                               // 000001011010
+    [12, 256],                              // 000001011011
+    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
+    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
+    [12, 48],                               // 000001100100
+    [12, 49],                               // 000001100101
+    [12, 62],                               // 000001100110
+    [12, 63],                               // 000001100111
+    [12, 30],                               // 000001101000
+    [12, 31],                               // 000001101001
+    [12, 32],                               // 000001101010
+    [12, 33],                               // 000001101011
+    [12, 40],                               // 000001101100
+    [12, 41],                               // 000001101101
+    [11, 22], [11, 22],                     // 00000110111x
+    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [8, 14], [8, 14], [8, 14], [8, 14],
+    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 10], [7, 10], [7, 10], [7, 10],
+    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [7, 11], [7, 11], [7, 11], [7, 11],
+    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
+    [9, 15], [9, 15], [9, 15], [9, 15],
+    [12, 128],                              // 000011001000
+    [12, 192],                              // 000011001001
+    [12, 26],                               // 000011001010
+    [12, 27],                               // 000011001011
+    [12, 28],                               // 000011001100
+    [12, 29],                               // 000011001101
+    [11, 19], [11, 19],                     // 00001100111x
+    [11, 20], [11, 20],                     // 00001101000x
+    [12, 34],                               // 000011010010
+    [12, 35],                               // 000011010011
+    [12, 36],                               // 000011010100
+    [12, 37],                               // 000011010101
+    [12, 38],                               // 000011010110
+    [12, 39],                               // 000011010111
+    [11, 21], [11, 21],                     // 00001101100x
+    [12, 42],                               // 000011011010
+    [12, 43],                               // 000011011011
+    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
+    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12],
+    [7, 12], [7, 12], [7, 12], [7, 12]
+  ];
+
+  var blackTable3 = [
+    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
+    [6, 9],                                 // 000100
+    [6, 8],                                 // 000101
+    [5, 7], [5, 7],                         // 00011x
+    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
+    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
+    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
+    [3, 1], [3, 1], [3, 1], [3, 1],
+    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
+    [3, 4], [3, 4], [3, 4], [3, 4],
+    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 3], [2, 3], [2, 3], [2, 3],
+    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
+    [2, 2], [2, 2], [2, 2], [2, 2],
+    [2, 2], [2, 2], [2, 2], [2, 2],
+    [2, 2], [2, 2], [2, 2], [2, 2]
+  ];
+
+  function CCITTFaxStream(str, params) {
+    this.str = str;
+    this.dict = str.dict;
+
+    params = params || new Dict();
+
+    this.encoding = params.get('K') || 0;
+    this.eoline = params.get('EndOfLine') || false;
+    this.byteAlign = params.get('EncodedByteAlign') || false;
+    this.columns = params.get('Columns') || 1728;
+    this.rows = params.get('Rows') || 0;
+    var eoblock = params.get('EndOfBlock');
+    if (eoblock == null)
+      eoblock = true;
+    this.eoblock = eoblock;
+    this.black = params.get('BlackIs1') || false;
+
+    this.codingLine = new Uint32Array(this.columns + 1);
+    this.refLine = new Uint32Array(this.columns + 2);
+
+    this.codingLine[0] = this.columns;
+    this.codingPos = 0;
+
+    this.row = 0;
+    this.nextLine2D = this.encoding < 0;
+    this.inputBits = 0;
+    this.inputBuf = 0;
+    this.outputBits = 0;
+    this.buf = EOF;
+
+    var code1;
+    while ((code1 = this.lookBits(12)) == 0) {
+      this.eatBits(1);
+    }
+    if (code1 == 1) {
+      this.eatBits(12);
+    }
+    if (this.encoding > 0) {
+      this.nextLine2D = !this.lookBits(1);
+      this.eatBits(1);
+    }
+
+    DecodeStream.call(this);
+  }
+
+  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
+
+  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
+    while (!this.eof) {
+      var c = this.lookChar();
+      this.buf = EOF;
+      this.ensureBuffer(this.bufferLength + 1);
+      this.buffer[this.bufferLength++] = c;
+    }
+  };
+
+  CCITTFaxStream.prototype.addPixels =
+    function ccittFaxStreamAddPixels(a1, blackPixels) {
+    var codingLine = this.codingLine;
+    var codingPos = this.codingPos;
+
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        warn('row is wrong length');
+        this.err = true;
+        a1 = this.columns;
+      }
+      if ((codingPos & 1) ^ blackPixels) {
+        ++codingPos;
+      }
+
+      codingLine[codingPos] = a1;
+    }
+    this.codingPos = codingPos;
+  };
+
+  CCITTFaxStream.prototype.addPixelsNeg =
+    function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
+    var codingLine = this.codingLine;
+    var codingPos = this.codingPos;
+
+    if (a1 > codingLine[codingPos]) {
+      if (a1 > this.columns) {
+        warn('row is wrong length');
+        this.err = true;
+        a1 = this.columns;
+      }
+      if ((codingPos & 1) ^ blackPixels)
+        ++codingPos;
+
+      codingLine[codingPos] = a1;
+    } else if (a1 < codingLine[codingPos]) {
+      if (a1 < 0) {
+        warn('invalid code');
+        this.err = true;
+        a1 = 0;
+      }
+      while (codingPos > 0 && a1 < codingLine[codingPos - 1])
+        --codingPos;
+      codingLine[codingPos] = a1;
+    }
+
+    this.codingPos = codingPos;
+  };
+
+  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
+    if (this.buf != EOF)
+      return this.buf;
+
+    var refLine = this.refLine;
+    var codingLine = this.codingLine;
+    var columns = this.columns;
+
+    var refPos, blackPixels, bits;
+
+    if (this.outputBits == 0) {
+      if (this.eof)
+        return null;
+
+      this.err = false;
+
+      var code1, code2, code3;
+      if (this.nextLine2D) {
+        for (var i = 0; codingLine[i] < columns; ++i)
+          refLine[i] = codingLine[i];
+
+        refLine[i++] = columns;
+        refLine[i] = columns;
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        refPos = 0;
+        blackPixels = 0;
+
+        while (codingLine[this.codingPos] < columns) {
+          code1 = this.getTwoDimCode();
+          switch (code1) {
+            case twoDimPass:
+              this.addPixels(refLine[refPos + 1], blackPixels);
+              if (refLine[refPos + 1] < columns)
+                refPos += 2;
+              break;
+            case twoDimHoriz:
+              code1 = code2 = 0;
+              if (blackPixels) {
+                do {
+                  code1 += (code3 = this.getBlackCode());
+                } while (code3 >= 64);
+                do {
+                  code2 += (code3 = this.getWhiteCode());
+                } while (code3 >= 64);
+              } else {
+                do {
+                  code1 += (code3 = this.getWhiteCode());
+                } while (code3 >= 64);
+                do {
+                  code2 += (code3 = this.getBlackCode());
+                } while (code3 >= 64);
+              }
+              this.addPixels(codingLine[this.codingPos] +
+                             code1, blackPixels);
+              if (codingLine[this.codingPos] < columns) {
+                this.addPixels(codingLine[this.codingPos] + code2,
+                               blackPixels ^ 1);
+              }
+              while (refLine[refPos] <= codingLine[this.codingPos] &&
+                     refLine[refPos] < columns) {
+                refPos += 2;
+              }
+              break;
+            case twoDimVertR3:
+              this.addPixels(refLine[refPos] + 3, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case twoDimVertR2:
+              this.addPixels(refLine[refPos] + 2, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+              }
+              break;
+            case twoDimVertR1:
+              this.addPixels(refLine[refPos] + 1, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case twoDimVert0:
+              this.addPixels(refLine[refPos], blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case twoDimVertL3:
+              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0)
+                  --refPos;
+                else
+                  ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case twoDimVertL2:
+              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0)
+                  --refPos;
+                else
+                  ++refPos;
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case twoDimVertL1:
+              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
+              blackPixels ^= 1;
+              if (codingLine[this.codingPos] < columns) {
+                if (refPos > 0)
+                  --refPos;
+                else
+                  ++refPos;
+
+                while (refLine[refPos] <= codingLine[this.codingPos] &&
+                       refLine[refPos] < columns)
+                  refPos += 2;
+              }
+              break;
+            case EOF:
+              this.addPixels(columns, 0);
+              this.eof = true;
+              break;
+            default:
+              warn('bad 2d code');
+              this.addPixels(columns, 0);
+              this.err = true;
+          }
+        }
+      } else {
+        codingLine[0] = 0;
+        this.codingPos = 0;
+        blackPixels = 0;
+        while (codingLine[this.codingPos] < columns) {
+          code1 = 0;
+          if (blackPixels) {
+            do {
+              code1 += (code3 = this.getBlackCode());
+            } while (code3 >= 64);
+          } else {
+            do {
+              code1 += (code3 = this.getWhiteCode());
+            } while (code3 >= 64);
+          }
+          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
+          blackPixels ^= 1;
+        }
+      }
+
+      if (this.byteAlign)
+        this.inputBits &= ~7;
+
+      var gotEOL = false;
+
+      if (!this.eoblock && this.row == this.rows - 1) {
+        this.eof = true;
+      } else {
+        code1 = this.lookBits(12);
+        while (code1 == 0) {
+          this.eatBits(1);
+          code1 = this.lookBits(12);
+        }
+        if (code1 == 1) {
+          this.eatBits(12);
+          gotEOL = true;
+        } else if (code1 == EOF) {
+          this.eof = true;
+        }
+      }
+
+      if (!this.eof && this.encoding > 0) {
+        this.nextLine2D = !this.lookBits(1);
+        this.eatBits(1);
+      }
+
+      if (this.eoblock && gotEOL) {
+        code1 = this.lookBits(12);
+        if (code1 == 1) {
+          this.eatBits(12);
+          if (this.encoding > 0) {
+            this.lookBits(1);
+            this.eatBits(1);
+          }
+          if (this.encoding >= 0) {
+            for (var i = 0; i < 4; ++i) {
+              code1 = this.lookBits(12);
+              if (code1 != 1)
+                warn('bad rtc code: ' + code1);
+              this.eatBits(12);
+              if (this.encoding > 0) {
+                this.lookBits(1);
+                this.eatBits(1);
+              }
+            }
+          }
+          this.eof = true;
+        }
+      } else if (this.err && this.eoline) {
+        while (true) {
+          code1 = this.lookBits(13);
+          if (code1 == EOF) {
+            this.eof = true;
+            return null;
+          }
+          if ((code1 >> 1) == 1) {
+            break;
+          }
+          this.eatBits(1);
+        }
+        this.eatBits(12);
+        if (this.encoding > 0) {
+          this.eatBits(1);
+          this.nextLine2D = !(code1 & 1);
+        }
+      }
+
+      if (codingLine[0] > 0)
+        this.outputBits = codingLine[this.codingPos = 0];
+      else
+        this.outputBits = codingLine[this.codingPos = 1];
+      this.row++;
+    }
+
+    if (this.outputBits >= 8) {
+      this.buf = (this.codingPos & 1) ? 0 : 0xFF;
+      this.outputBits -= 8;
+      if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
+        this.codingPos++;
+        this.outputBits = (codingLine[this.codingPos] -
+                           codingLine[this.codingPos - 1]);
+      }
+    } else {
+      var bits = 8;
+      this.buf = 0;
+      do {
+        if (this.outputBits > bits) {
+          this.buf <<= bits;
+          if (!(this.codingPos & 1)) {
+            this.buf |= 0xFF >> (8 - bits);
+          }
+          this.outputBits -= bits;
+          bits = 0;
+        } else {
+          this.buf <<= this.outputBits;
+          if (!(this.codingPos & 1)) {
+            this.buf |= 0xFF >> (8 - this.outputBits);
+          }
+          bits -= this.outputBits;
+          this.outputBits = 0;
+          if (codingLine[this.codingPos] < columns) {
+            this.codingPos++;
+            this.outputBits = (codingLine[this.codingPos] -
+                               codingLine[this.codingPos - 1]);
+          } else if (bits > 0) {
+            this.buf <<= bits;
+            bits = 0;
+          }
+        }
+      } while (bits);
+    }
+    if (this.black) {
+      this.buf ^= 0xFF;
+    }
+    return this.buf;
+  };
+
+  // This functions returns the code found from the table.
+  // The start and end parameters set the boundaries for searching the table.
+  // The limit parameter is optional. Function returns an array with three
+  // values. The first array element indicates whether a valid code is being
+  // returned. The second array element is the actual code. The third array
+  // element indicates whether EOF was reached.
+  CCITTFaxStream.prototype.findTableCode =
+    function ccittFaxStreamFindTableCode(start, end, table, limit) {
+
+    var limitValue = limit || 0;
+    for (var i = start; i <= end; ++i) {
+      var code = this.lookBits(i);
+      if (code == EOF)
+        return [true, 1, false];
+      if (i < end)
+        code <<= end - i;
+      if (!limitValue || code >= limitValue) {
+        var p = table[code - limitValue];
+        if (p[0] == i) {
+          this.eatBits(i);
+          return [true, p[1], true];
+        }
+      }
+    }
+    return [false, 0, false];
+  };
+
+  CCITTFaxStream.prototype.getTwoDimCode =
+    function ccittFaxStreamGetTwoDimCode() {
+
+    var code = 0;
+    var p;
+    if (this.eoblock) {
+      code = this.lookBits(7);
+      p = twoDimTable[code];
+      if (p && p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(1, 7, twoDimTable);
+      if (result[0] && result[2])
+        return result[1];
+    }
+    warn('Bad two dim code');
+    return EOF;
+  };
+
+  CCITTFaxStream.prototype.getWhiteCode =
+    function ccittFaxStreamGetWhiteCode() {
+
+    var code = 0;
+    var p;
+    var n;
+    if (this.eoblock) {
+      code = this.lookBits(12);
+      if (code == EOF)
+        return 1;
+
+      if ((code >> 5) == 0)
+        p = whiteTable1[code];
+      else
+        p = whiteTable2[code >> 3];
+
+      if (p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(1, 9, whiteTable2);
+      if (result[0])
+        return result[1];
+
+      result = this.findTableCode(11, 12, whiteTable1);
+      if (result[0])
+        return result[1];
+    }
+    warn('bad white code');
+    this.eatBits(1);
+    return 1;
+  };
+
+  CCITTFaxStream.prototype.getBlackCode =
+    function ccittFaxStreamGetBlackCode() {
+
+    var code, p;
+    if (this.eoblock) {
+      code = this.lookBits(13);
+      if (code == EOF)
+        return 1;
+      if ((code >> 7) == 0)
+        p = blackTable1[code];
+      else if ((code >> 9) == 0 && (code >> 7) != 0)
+        p = blackTable2[(code >> 1) - 64];
+      else
+        p = blackTable3[code >> 7];
+
+      if (p[0] > 0) {
+        this.eatBits(p[0]);
+        return p[1];
+      }
+    } else {
+      var result = this.findTableCode(2, 6, blackTable3);
+      if (result[0])
+        return result[1];
+
+      result = this.findTableCode(7, 12, blackTable2, 64);
+      if (result[0])
+        return result[1];
+
+      result = this.findTableCode(10, 13, blackTable1);
+      if (result[0])
+        return result[1];
+    }
+    warn('bad black code');
+    this.eatBits(1);
+    return 1;
+  };
+
+  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
+    var c;
+    while (this.inputBits < n) {
+      if ((c = this.str.getByte()) == null) {
+        if (this.inputBits == 0)
+          return EOF;
+        return ((this.inputBuf << (n - this.inputBits)) &
+                (0xFFFF >> (16 - n)));
+      }
+      this.inputBuf = (this.inputBuf << 8) + c;
+      this.inputBits += 8;
+    }
+    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
+  };
+
+  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
+    if ((this.inputBits -= n) < 0)
+      this.inputBits = 0;
+  };
+
+  return CCITTFaxStream;
+})();
+
+var LZWStream = (function LZWStreamClosure() {
+  function LZWStream(str, earlyChange) {
+    this.str = str;
+    this.dict = str.dict;
+    this.cachedData = 0;
+    this.bitsCached = 0;
+
+    var maxLzwDictionarySize = 4096;
+    var lzwState = {
+      earlyChange: earlyChange,
+      codeLength: 9,
+      nextCode: 258,
+      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+      currentSequence: new Uint8Array(maxLzwDictionarySize),
+      currentSequenceLength: 0
+    };
+    for (var i = 0; i < 256; ++i) {
+      lzwState.dictionaryValues[i] = i;
+      lzwState.dictionaryLengths[i] = 1;
+    }
+    this.lzwState = lzwState;
+
+    DecodeStream.call(this);
+  }
+
+  LZWStream.prototype = Object.create(DecodeStream.prototype);
+
+  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
+    var bitsCached = this.bitsCached;
+    var cachedData = this.cachedData;
+    while (bitsCached < n) {
+      var c = this.str.getByte();
+      if (c == null) {
+        this.eof = true;
+        return null;
+      }
+      cachedData = (cachedData << 8) | c;
+      bitsCached += 8;
+    }
+    this.bitsCached = (bitsCached -= n);
+    this.cachedData = cachedData;
+    this.lastCode = null;
+    return (cachedData >>> bitsCached) & ((1 << n) - 1);
+  };
+
+  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
+    var blockSize = 512;
+    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
+    var i, j, q;
+
+    var lzwState = this.lzwState;
+    if (!lzwState)
+      return; // eof was found
+
+    var earlyChange = lzwState.earlyChange;
+    var nextCode = lzwState.nextCode;
+    var dictionaryValues = lzwState.dictionaryValues;
+    var dictionaryLengths = lzwState.dictionaryLengths;
+    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+    var codeLength = lzwState.codeLength;
+    var prevCode = lzwState.prevCode;
+    var currentSequence = lzwState.currentSequence;
+    var currentSequenceLength = lzwState.currentSequenceLength;
+
+    var decodedLength = 0;
+    var currentBufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+
+    for (i = 0; i < blockSize; i++) {
+      var code = this.readBits(codeLength);
+      var hasPrev = currentSequenceLength > 0;
+      if (code < 256) {
+        currentSequence[0] = code;
+        currentSequenceLength = 1;
+      } else if (code >= 258) {
+        if (code < nextCode) {
+          currentSequenceLength = dictionaryLengths[code];
+          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+            currentSequence[j] = dictionaryValues[q];
+            q = dictionaryPrevCodes[q];
+          }
+        } else {
+          currentSequence[currentSequenceLength++] = currentSequence[0];
+        }
+      } else if (code == 256) {
+        codeLength = 9;
+        nextCode = 258;
+        currentSequenceLength = 0;
+        continue;
+      } else {
+        this.eof = true;
+        delete this.lzwState;
+        break;
+      }
+
+      if (hasPrev) {
+        dictionaryPrevCodes[nextCode] = prevCode;
+        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+        dictionaryValues[nextCode] = currentSequence[0];
+        nextCode++;
+        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
+          codeLength : Math.min(Math.log(nextCode + earlyChange) /
+          0.6931471805599453 + 1, 12) | 0;
+      }
+      prevCode = code;
+
+      decodedLength += currentSequenceLength;
+      if (estimatedDecodedSize < decodedLength) {
+        do {
+          estimatedDecodedSize += decodedSizeDelta;
+        } while (estimatedDecodedSize < decodedLength);
+        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+      }
+      for (j = 0; j < currentSequenceLength; j++)
+        buffer[currentBufferLength++] = currentSequence[j];
+    }
+    lzwState.nextCode = nextCode;
+    lzwState.codeLength = codeLength;
+    lzwState.prevCode = prevCode;
+    lzwState.currentSequenceLength = currentSequenceLength;
+
+    this.bufferLength = currentBufferLength;
+  };
+
+  return LZWStream;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+function MessageHandler(name, comObj) {
+  this.name = name;
+  this.comObj = comObj;
+  this.callbackIndex = 1;
+  var callbacks = this.callbacks = {};
+  var ah = this.actionHandler = {};
+
+  ah['console_log'] = [function ahConsoleLog(data) {
+      PdfJS_window.console.log.apply(PdfJS_window.console, data);
+  }];
+  ah['console_error'] = [function ahConsoleError(data) {
+      PdfJS_window.console.error.apply(PdfJS_window.console, data);
+  }];
+
+  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+    var data = event.data;
+    if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacks) {
+        var callback = callbacks[callbackId];
+        delete callbacks[callbackId];
+        callback(data.data);
+      } else {
+        error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var promise = new Promise();
+        promise.then(function(resolvedData) {
+          comObj.postMessage({
+            isReply: true,
+            callbackId: data.callbackId,
+            data: resolvedData
+          });
+        });
+        action[0].call(action[1], data.data, promise);
+      } else {
+        action[0].call(action[1], data.data);
+      }
+    } else {
+      error('Unkown action from worker: ' + data.action);
+    }
+  };
+}
+
+MessageHandler.prototype = {
+  on: function messageHandlerOn(actionName, handler, scope) {
+    var ah = this.actionHandler;
+    if (ah[actionName]) {
+      error('There is already an actionName called "' + actionName + '"');
+    }
+    ah[actionName] = [handler, scope];
+  },
+  /**
+   * Sends a message to the comObj to invoke the action with the supplied data.
+   * @param {String} actionName Action to call.
+   * @param {JSON} data JSON data to send.
+   * @param {function} [callback] Optional callback that will handle a reply.
+   */
+  send: function messageHandlerSend(actionName, data, callback) {
+    var message = {
+      action: actionName,
+      data: data
+    };
+    if (callback) {
+      var callbackId = this.callbackIndex++;
+      this.callbacks[callbackId] = callback;
+      message.callbackId = callbackId;
+    }
+    this.comObj.postMessage(message);
+  }
+};
+
+var WorkerMessageHandler = {
+  setup: function wphSetup(handler) {
+    var pdfModel = null;
+
+    handler.on('test', function wphSetupTest(data) {
+      handler.send('test', data instanceof Uint8Array);
+    });
+
+    handler.on('GetDocRequest', function wphSetupDoc(data) {
+      // Create only the model of the PDFDoc, which is enough for
+      // processing the content of the pdf.
+      pdfModel = new PDFDocument(new Stream(data));
+      var doc = {
+        numPages: pdfModel.numPages,
+        fingerprint: pdfModel.getFingerprint(),
+        destinations: pdfModel.catalog.destinations,
+        outline: pdfModel.catalog.documentOutline,
+        info: pdfModel.getDocumentInfo(),
+        metadata: pdfModel.catalog.metadata
+      };
+      handler.send('GetDoc', {pdfInfo: doc});
+    });
+
+    handler.on('GetPageRequest', function wphSetupGetPage(data) {
+      var pageNumber = data.pageIndex + 1;
+      var pdfPage = pdfModel.getPage(pageNumber);
+      var page = {
+        pageIndex: data.pageIndex,
+        rotate: pdfPage.rotate,
+        ref: pdfPage.ref,
+        view: pdfPage.view
+      };
+      handler.send('GetPage', {pageInfo: page});
+    });
+
+    handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
+      var pdfPage = pdfModel.getPage(data.pageIndex + 1);
+      handler.send('GetAnnotations', {
+        pageIndex: data.pageIndex,
+        annotations: pdfPage.getAnnotations()
+      });
+    });
+
+    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
+      var pageNum = data.pageIndex + 1;
+
+
+      // The following code does quite the same as
+      // Page.prototype.startRendering, but stops at one point and sends the
+      // result back to the main thread.
+      var gfx = new CanvasGraphics(null);
+
+      var start = Date.now();
+
+      var dependency = [];
+      var operatorList = null;
+      try {
+        var page = pdfModel.getPage(pageNum);
+        // Pre compile the pdf page and fetch the fonts/images.
+        operatorList = page.getOperatorList(handler, dependency);
+      } catch (e) {
+        var minimumStackMessage =
+            'worker.js: while trying to getPage() and getOperatorList()';
+
+        // Turn the error into an obj that can be serialized
+        if (typeof e === 'string') {
+          e = {
+            message: e,
+            stack: minimumStackMessage
+          };
+        } else if (typeof e === 'object') {
+          e = {
+            message: e.message || e.toString(),
+            stack: e.stack || minimumStackMessage
+          };
+        } else {
+          e = {
+            message: 'Unknown exception type: ' + (typeof e),
+            stack: minimumStackMessage
+          };
+        }
+
+        handler.send('PageError', {
+          pageNum: pageNum,
+          error: e
+        });
+        return;
+      }
+
+      //comment out as it floods the logcat
+      //PdfJS_window.console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
+      //                        Date.now() - start, operatorList.fnArray.length);
+
+      // Filter the dependecies for fonts.
+      var fonts = {};
+      for (var i = 0, ii = dependency.length; i < ii; i++) {
+        var dep = dependency[i];
+        if (dep.indexOf('font_') == 0) {
+          fonts[dep] = true;
+        }
+      }
+      handler.send('RenderPage', {
+        pageIndex: data.pageIndex,
+        operatorList: operatorList,
+        depFonts: Object.keys(fonts)
+      });
+    }, this);
+  }
+};
+
+var consoleTimer = {};
+
+var workerConsole = {
+  log: function log() {
+    var args = Array.prototype.slice.call(arguments);
+    postMessage({
+      action: 'console_log',
+      data: args
+    });
+  },
+
+  error: function error() {
+    var args = Array.prototype.slice.call(arguments);
+    postMessage({
+      action: 'console_error',
+      data: args
+    });
+    throw 'pdf.js execution error';
+  },
+
+  time: function time(name) {
+    consoleTimer[name] = Date.now();
+  },
+
+  timeEnd: function timeEnd(name) {
+    var time = consoleTimer[name];
+    if (time == null) {
+      error('Unkown timer name ' + name);
+    }
+    this.log('Timer:', name, Date.now() - time);
+  }
+};
+
+// Worker thread?
+if (typeof PdfJS_window.window === 'undefined') {
+  globalScope.console = workerConsole;
+
+  var handler = new MessageHandler('worker_processor', this);
+  WorkerMessageHandler.setup(handler);
+}
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+// - The JPEG specification can be found in the ITU CCITT Recommendation T.81
+//   (www.w3.org/Graphics/JPEG/itu-t81.pdf)
+// - The JFIF specification can be found in the JPEG File Interchange Format
+//   (www.w3.org/Graphics/JPEG/jfif3.pdf)
+// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
+//   in PostScript Level 2, Technical Note #5116
+//   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
+
+var JpegImage = (function jpegImage() {
+  "use strict";
+  var dctZigZag = new Int32Array([
+     0,
+     1,  8,
+    16,  9,  2,
+     3, 10, 17, 24,
+    32, 25, 18, 11, 4,
+     5, 12, 19, 26, 33, 40,
+    48, 41, 34, 27, 20, 13,  6,
+     7, 14, 21, 28, 35, 42, 49, 56,
+    57, 50, 43, 36, 29, 22, 15,
+    23, 30, 37, 44, 51, 58,
+    59, 52, 45, 38, 31,
+    39, 46, 53, 60,
+    61, 54, 47,
+    55, 62,
+    63
+  ]);
+
+  var dctCos1  =  4017   // cos(pi/16)
+  var dctSin1  =   799   // sin(pi/16)
+  var dctCos3  =  3406   // cos(3*pi/16)
+  var dctSin3  =  2276   // sin(3*pi/16)
+  var dctCos6  =  1567   // cos(6*pi/16)
+  var dctSin6  =  3784   // sin(6*pi/16)
+  var dctSqrt2 =  5793   // sqrt(2)
+  var dctSqrt1d2 = 2896  // sqrt(2) / 2
+
+  function constructor() {
+  }
+
+  function buildHuffmanTable(codeLengths, values) {
+    var k = 0, code = [], i, j, length = 16;
+    while (length > 0 && !codeLengths[length - 1])
+      length--;
+    code.push({children: [], index: 0});
+    var p = code[0], q;
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < codeLengths[i]; j++) {
+        p = code.pop();
+        p.children[p.index] = values[k];
+        while (p.index > 0) {
+          p = code.pop();
+        }
+        p.index++;
+        code.push(p);
+        while (code.length <= i) {
+          code.push(q = {children: [], index: 0});
+          p.children[p.index] = q.children;
+          p = q;
+        }
+        k++;
+      }
+      if (i + 1 < length) {
+        // p here points to last code
+        code.push(q = {children: [], index: 0});
+        p.children[p.index] = q.children;
+        p = q;
+      }
+    }
+    return code[0].children;
+  }
+
+  function decodeScan(data, offset,
+                      frame, components, resetInterval,
+                      spectralStart, spectralEnd,
+                      successivePrev, successive) {
+    var precision = frame.precision;
+    var samplesPerLine = frame.samplesPerLine;
+    var scanLines = frame.scanLines;
+    var mcusPerLine = frame.mcusPerLine;
+    var progressive = frame.progressive;
+    var maxH = frame.maxH, maxV = frame.maxV;
+
+    var startOffset = offset, bitsData = 0, bitsCount = 0;
+    function readBit() {
+      if (bitsCount > 0) {
+        bitsCount--;
+        return (bitsData >> bitsCount) & 1;
+      }
+      bitsData = data[offset++];
+      if (bitsData == 0xFF) {
+        var nextByte = data[offset++];
+        if (nextByte) {
+          throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
+        }
+        // unstuff 0
+      }
+      bitsCount = 7;
+      return bitsData >>> 7;
+    }
+    function decodeHuffman(tree) {
+      var node = tree, bit;
+      while ((bit = readBit()) !== null) {
+        node = node[bit];
+        if (typeof node === 'number')
+          return node;
+        if (typeof node !== 'object')
+          throw "invalid huffman sequence";
+      }
+      return null;
+    }
+    function receive(length) {
+      var n = 0;
+      while (length > 0) {
+        var bit = readBit();
+        if (bit === null) return;
+        n = (n << 1) | bit;
+        length--;
+      }
+      return n;
+    }
+    function receiveAndExtend(length) {
+      var n = receive(length);
+      if (n >= 1 << (length - 1))
+        return n;
+      return n + (-1 << length) + 1;
+    }
+    function decodeBaseline(component, zz) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : receiveAndExtend(t);
+      zz[0]= (component.pred += diff);
+      var k = 1;
+      while (k < 64) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15, r = rs >> 4;
+        if (s === 0) {
+          if (r < 15)
+            break;
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        zz[z] = receiveAndExtend(s);
+        k++;
+      }
+    }
+    function decodeDCFirst(component, zz) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
+      zz[0] = (component.pred += diff);
+    }
+    function decodeDCSuccessive(component, zz) {
+      zz[0] |= readBit() << successive;
+    }
+    var eobrun = 0;
+    function decodeACFirst(component, zz) {
+      if (eobrun > 0) {
+        eobrun--;
+        return;
+      }
+      var k = spectralStart, e = spectralEnd;
+      while (k <= e) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15, r = rs >> 4;
+        if (s === 0) {
+          if (r < 15) {
+            eobrun = receive(r) + (1 << r) - 1;
+            break;
+          }
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        zz[z] = receiveAndExtend(s) * (1 << successive);
+        k++;
+      }
+    }
+    var successiveACState = 0, successiveACNextValue;
+    function decodeACSuccessive(component, zz) {
+      var k = spectralStart, e = spectralEnd, r = 0;
+      while (k <= e) {
+        var z = dctZigZag[k];
+        switch (successiveACState) {
+        case 0: // initial state
+          var rs = decodeHuffman(component.huffmanTableAC);
+          var s = rs & 15, r = rs >> 4;
+          if (s === 0) {
+            if (r < 15) {
+              eobrun = receive(r) + (1 << r);
+              successiveACState = 4;
+            } else {
+              r = 16;
+              successiveACState = 1;
+            }
+          } else {
+            if (s !== 1)
+              throw "invalid ACn encoding";
+            successiveACNextValue = receiveAndExtend(s);
+            successiveACState = r ? 2 : 3;
+          }
+          continue;
+        case 1: // skipping r zero items
+        case 2:
+          if (zz[z])
+            zz[z] += (readBit() << successive);
+          else {
+            r--;
+            if (r === 0)
+              successiveACState = successiveACState == 2 ? 3 : 0;
+          }
+          break;
+        case 3: // set value for a zero item
+          if (zz[z])
+            zz[z] += (readBit() << successive);
+          else {
+            zz[z] = successiveACNextValue << successive;
+            successiveACState = 0;
+          }
+          break;
+        case 4: // eob
+          if (zz[z])
+            zz[z] += (readBit() << successive);
+          break;
+        }
+        k++;
+      }
+      if (successiveACState === 4) {
+        eobrun--;
+        if (eobrun === 0)
+          successiveACState = 0;
+      }
+    }
+    function decodeMcu(component, decode, mcu, row, col) {
+      var mcuRow = (mcu / mcusPerLine) | 0;
+      var mcuCol = mcu % mcusPerLine;
+      var blockRow = mcuRow * component.v + row;
+      var blockCol = mcuCol * component.h + col;
+      decode(component, component.blocks[blockRow][blockCol]);
+    }
+    function decodeBlock(component, decode, mcu) {
+      var blockRow = (mcu / component.blocksPerLine) | 0;
+      var blockCol = mcu % component.blocksPerLine;
+      decode(component, component.blocks[blockRow][blockCol]);
+    }
+
+    var componentsLength = components.length;
+    var component, i, j, k, n;
+    var decodeFn;
+    if (progressive) {
+      if (spectralStart === 0)
+        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+      else
+        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+    } else {
+      decodeFn = decodeBaseline;
+    }
+
+    var mcu = 0, marker;
+    var mcuExpected;
+    if (componentsLength == 1) {
+      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+    } else {
+      mcuExpected = mcusPerLine * frame.mcusPerColumn;
+    }
+    if (!resetInterval) resetInterval = mcuExpected;
+
+    var h, v;
+    while (mcu < mcuExpected) {
+      // reset interval stuff
+      for (i = 0; i < componentsLength; i++)
+        components[i].pred = 0;
+      eobrun = 0;
+
+      if (componentsLength == 1) {
+        component = components[0];
+        for (n = 0; n < resetInterval; n++) {
+          decodeBlock(component, decodeFn, mcu);
+          mcu++;
+        }
+      } else {
+        for (n = 0; n < resetInterval; n++) {
+          for (i = 0; i < componentsLength; i++) {
+            component = components[i];
+            h = component.h;
+            v = component.v;
+            for (j = 0; j < v; j++) {
+              for (k = 0; k < h; k++) {
+                decodeMcu(component, decodeFn, mcu, j, k);
+              }
+            }
+          }
+          mcu++;
+        }
+      }
+
+      // find marker
+      bitsCount = 0;
+      marker = (data[offset] << 8) | data[offset + 1];
+      if (marker <= 0xFF00) {
+        throw "marker was not found";
+      }
+
+      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
+        offset += 2;
+      }
+      else
+        break;
+    }
+
+    return offset - startOffset;
+  }
+
+  function buildComponentData(frame, component) {
+    var lines = [];
+    var blocksPerLine = component.blocksPerLine;
+    var blocksPerColumn = component.blocksPerColumn;
+    var samplesPerLine = blocksPerLine << 3;
+    var R = new Int32Array(64), r = new Uint8Array(64);
+
+    // A port of poppler's IDCT method which in turn is taken from:
+    //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+    //   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
+    //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
+    //   988-991.
+    function quantizeAndInverse(zz, dataOut, dataIn) {
+      var qt = component.quantizationTable;
+      var v0, v1, v2, v3, v4, v5, v6, v7, t;
+      var p = dataIn;
+      var i;
+
+      // dequant
+      for (i = 0; i < 64; i++)
+        p[i] = zz[i] * qt[i];
+
+      // inverse DCT on rows
+      for (i = 0; i < 8; ++i) {
+        var row = 8 * i;
+
+        // check for all-zero AC coefficients
+        if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
+            p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
+            p[7 + row] == 0) {
+          t = (dctSqrt2 * p[0 + row] + 512) >> 10;
+          p[0 + row] = t;
+          p[1 + row] = t;
+          p[2 + row] = t;
+          p[3 + row] = t;
+          p[4 + row] = t;
+          p[5 + row] = t;
+          p[6 + row] = t;
+          p[7 + row] = t;
+          continue;
+        }
+
+        // stage 4
+        v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
+        v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
+        v2 = p[2 + row];
+        v3 = p[6 + row];
+        v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
+        v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
+        v5 = p[3 + row] << 4;
+        v6 = p[5 + row] << 4;
+
+        // stage 3
+        t = (v0 - v1+ 1) >> 1;
+        v0 = (v0 + v1 + 1) >> 1;
+        v1 = t;
+        t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
+        v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
+        v3 = t;
+        t = (v4 - v6 + 1) >> 1;
+        v4 = (v4 + v6 + 1) >> 1;
+        v6 = t;
+        t = (v7 + v5 + 1) >> 1;
+        v5 = (v7 - v5 + 1) >> 1;
+        v7 = t;
+
+        // stage 2
+        t = (v0 - v3 + 1) >> 1;
+        v0 = (v0 + v3 + 1) >> 1;
+        v3 = t;
+        t = (v1 - v2 + 1) >> 1;
+        v1 = (v1 + v2 + 1) >> 1;
+        v2 = t;
+        t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+        v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+        v7 = t;
+        t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+        v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+        v6 = t;
+
+        // stage 1
+        p[0 + row] = v0 + v7;
+        p[7 + row] = v0 - v7;
+        p[1 + row] = v1 + v6;
+        p[6 + row] = v1 - v6;
+        p[2 + row] = v2 + v5;
+        p[5 + row] = v2 - v5;
+        p[3 + row] = v3 + v4;
+        p[4 + row] = v3 - v4;
+      }
+
+      // inverse DCT on columns
+      for (i = 0; i < 8; ++i) {
+        var col = i;
+
+        // check for all-zero AC coefficients
+        if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
+            p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
+            p[7*8 + col] == 0) {
+          t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
+          p[0*8 + col] = t;
+          p[1*8 + col] = t;
+          p[2*8 + col] = t;
+          p[3*8 + col] = t;
+          p[4*8 + col] = t;
+          p[5*8 + col] = t;
+          p[6*8 + col] = t;
+          p[7*8 + col] = t;
+          continue;
+        }
+
+        // stage 4
+        v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
+        v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
+        v2 = p[2*8 + col];
+        v3 = p[6*8 + col];
+        v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
+        v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
+        v5 = p[3*8 + col];
+        v6 = p[5*8 + col];
+
+        // stage 3
+        t = (v0 - v1 + 1) >> 1;
+        v0 = (v0 + v1 + 1) >> 1;
+        v1 = t;
+        t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
+        v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
+        v3 = t;
+        t = (v4 - v6 + 1) >> 1;
+        v4 = (v4 + v6 + 1) >> 1;
+        v6 = t;
+        t = (v7 + v5 + 1) >> 1;
+        v5 = (v7 - v5 + 1) >> 1;
+        v7 = t;
+
+        // stage 2
+        t = (v0 - v3 + 1) >> 1;
+        v0 = (v0 + v3 + 1) >> 1;
+        v3 = t;
+        t = (v1 - v2 + 1) >> 1;
+        v1 = (v1 + v2 + 1) >> 1;
+        v2 = t;
+        t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+        v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+        v7 = t;
+        t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+        v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+        v6 = t;
+
+        // stage 1
+        p[0*8 + col] = v0 + v7;
+        p[7*8 + col] = v0 - v7;
+        p[1*8 + col] = v1 + v6;
+        p[6*8 + col] = v1 - v6;
+        p[2*8 + col] = v2 + v5;
+        p[5*8 + col] = v2 - v5;
+        p[3*8 + col] = v3 + v4;
+        p[4*8 + col] = v3 - v4;
+      }
+
+      // convert to 8-bit integers
+      for (i = 0; i < 64; ++i) {
+        var sample = 128 + ((p[i] + 8) >> 4);
+        dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
+      }
+    }
+
+    var i, j;
+    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+      var scanLine = blockRow << 3;
+      for (i = 0; i < 8; i++)
+        lines.push(new Uint8Array(samplesPerLine));
+      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+        quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
+
+        var offset = 0, sample = blockCol << 3;
+        for (j = 0; j < 8; j++) {
+          var line = lines[scanLine + j];
+          for (i = 0; i < 8; i++)
+            line[sample + i] = r[offset++];
+        }
+      }
+    }
+    return lines;
+  }
+
+  constructor.prototype = {
+    load: function load(path) {
+      var xhr = new PdfJS_window.XMLHttpRequest();
+      xhr.open("GET", path, true);
+      xhr.responseType = "arraybuffer";
+      xhr.onload = (function() {
+        // TODO catch parse error
+        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+        this.parse(data);
+        if (this.onload)
+          this.onload();
+      }).bind(this);
+      xhr.send(null);
+    },
+    parse: function parse(data) {
+      var offset = 0, length = data.length;
+      function readUint16() {
+        var value = (data[offset] << 8) | data[offset + 1];
+        offset += 2;
+        return value;
+      }
+      function readDataBlock() {
+        var length = readUint16();
+        var array = data.subarray(offset, offset + length - 2);
+        offset += array.length;
+        return array;
+      }
+      function prepareComponents(frame) {
+        var maxH = 0, maxV = 0;
+        var component, componentId;
+        for (componentId in frame.components) {
+          if (frame.components.hasOwnProperty(componentId)) {
+            component = frame.components[componentId];
+            if (maxH < component.h) maxH = component.h;
+            if (maxV < component.v) maxV = component.v;
+          }
+        }
+        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
+        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
+        for (componentId in frame.components) {
+          if (frame.components.hasOwnProperty(componentId)) {
+            component = frame.components[componentId];
+            var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
+            var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) * component.v / maxV);
+            var blocksPerLineForMcu = mcusPerLine * component.h;
+            var blocksPerColumnForMcu = mcusPerColumn * component.v;
+            var blocks = [];
+            for (var i = 0; i < blocksPerColumnForMcu; i++) {
+              var row = [];
+              for (var j = 0; j < blocksPerLineForMcu; j++)
+                row.push(new Int32Array(64));
+              blocks.push(row);
+            }
+            component.blocksPerLine = blocksPerLine;
+            component.blocksPerColumn = blocksPerColumn;
+            component.blocks = blocks;
+          }
+        }
+        frame.maxH = maxH;
+        frame.maxV = maxV;
+        frame.mcusPerLine = mcusPerLine;
+        frame.mcusPerColumn = mcusPerColumn;
+      }
+      var jfif = null;
+      var adobe = null;
+      var pixels = null;
+      var frame, resetInterval;
+      var quantizationTables = [], frames = [];
+      var huffmanTablesAC = [], huffmanTablesDC = [];
+      var fileMarker = readUint16();
+      if (fileMarker != 0xFFD8) { // SOI (Start of Image)
+        throw "SOI not found";
+      }
+
+      fileMarker = readUint16();
+      while (fileMarker != 0xFFD9) { // EOI (End of image)
+        var i, j, l;
+        switch(fileMarker) {
+          case 0xFFE0: // APP0 (Application Specific)
+          case 0xFFE1: // APP1
+          case 0xFFE2: // APP2
+          case 0xFFE3: // APP3
+          case 0xFFE4: // APP4
+          case 0xFFE5: // APP5
+          case 0xFFE6: // APP6
+          case 0xFFE7: // APP7
+          case 0xFFE8: // APP8
+          case 0xFFE9: // APP9
+          case 0xFFEA: // APP10
+          case 0xFFEB: // APP11
+          case 0xFFEC: // APP12
+          case 0xFFED: // APP13
+          case 0xFFEE: // APP14
+          case 0xFFEF: // APP15
+          case 0xFFFE: // COM (Comment)
+            var appData = readDataBlock();
+
+            if (fileMarker === 0xFFE0) {
+              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
+                appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
+                jfif = {
+                  version: { major: appData[5], minor: appData[6] },
+                  densityUnits: appData[7],
+                  xDensity: (appData[8] << 8) | appData[9],
+                  yDensity: (appData[10] << 8) | appData[11],
+                  thumbWidth: appData[12],
+                  thumbHeight: appData[13],
+                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+                };
+              }
+            }
+            // TODO APP1 - Exif
+            if (fileMarker === 0xFFEE) {
+              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
+                appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
+                adobe = {
+                  version: appData[6],
+                  flags0: (appData[7] << 8) | appData[8],
+                  flags1: (appData[9] << 8) | appData[10],
+                  transformCode: appData[11]
+                };
+              }
+            }
+            break;
+
+          case 0xFFDB: // DQT (Define Quantization Tables)
+            var quantizationTableCount = Math.floor((readUint16() - 2) / 65);
+            for (i = 0; i < quantizationTableCount; i++) {
+              var quantizationTableSpec = data[offset++];
+              var tableData = new Int32Array(64);
+              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
+                for (j = 0; j < 64; j++) {
+                  var z = dctZigZag[j];
+                  tableData[z] = data[offset++];
+                }
+              } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
+                for (j = 0; j < 64; j++) {
+                  var z = dctZigZag[j];
+                  tableData[z] = readUint16();
+                }
+              } else
+                throw "DQT: invalid table spec";
+              quantizationTables[quantizationTableSpec & 15] = tableData;
+            }
+            break;
+
+          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
+          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
+            readUint16(); // skip data length
+            frame = {};
+            frame.progressive = (fileMarker === 0xFFC2);
+            frame.precision = data[offset++];
+            frame.scanLines = readUint16();
+            frame.samplesPerLine = readUint16();
+            frame.components = {};
+            frame.componentsOrder = [];
+            var componentsCount = data[offset++], componentId;
+            var maxH = 0, maxV = 0;
+            for (i = 0; i < componentsCount; i++) {
+              componentId = data[offset];
+              var h = data[offset + 1] >> 4;
+              var v = data[offset + 1] & 15;
+              var qId = data[offset + 2];
+              frame.componentsOrder.push(componentId);
+              frame.components[componentId] = {
+                h: h,
+                v: v,
+                quantizationTable: quantizationTables[qId]
+              };
+              offset += 3;
+            }
+            prepareComponents(frame);
+            frames.push(frame);
+            break;
+
+          case 0xFFC4: // DHT (Define Huffman Tables)
+            var huffmanLength = readUint16();
+            for (i = 2; i < huffmanLength;) {
+              var huffmanTableSpec = data[offset++];
+              var codeLengths = new Uint8Array(16);
+              var codeLengthSum = 0;
+              for (j = 0; j < 16; j++, offset++)
+                codeLengthSum += (codeLengths[j] = data[offset]);
+              var huffmanValues = new Uint8Array(codeLengthSum);
+              for (j = 0; j < codeLengthSum; j++, offset++)
+                huffmanValues[j] = data[offset];
+              i += 17 + codeLengthSum;
+
+              ((huffmanTableSpec >> 4) === 0 ? 
+                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
+                buildHuffmanTable(codeLengths, huffmanValues);
+            }
+            break;
+
+          case 0xFFDD: // DRI (Define Restart Interval)
+            readUint16(); // skip data length
+            resetInterval = readUint16();
+            break;
+
+          case 0xFFDA: // SOS (Start of Scan)
+            var scanLength = readUint16();
+            var selectorsCount = data[offset++];
+            var components = [], component;
+            for (i = 0; i < selectorsCount; i++) {
+              component = frame.components[data[offset++]];
+              var tableSpec = data[offset++];
+              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+              components.push(component);
+            }
+            var spectralStart = data[offset++];
+            var spectralEnd = data[offset++];
+            var successiveApproximation = data[offset++];
+            var processed = decodeScan(data, offset,
+              frame, components, resetInterval,
+              spectralStart, spectralEnd,
+              successiveApproximation >> 4, successiveApproximation & 15);
+            offset += processed;
+            break;
+          default:
+            throw "unknown JPEG marker " + fileMarker.toString(16);
+        }
+        fileMarker = readUint16();
+      }
+      if (frames.length != 1)
+        throw "only single frame JPEGs supported";
+
+      this.width = frame.samplesPerLine;
+      this.height = frame.scanLines;
+      this.jfif = jfif;
+      this.adobe = adobe;
+      this.components = [];
+      for (var i = 0; i < frame.componentsOrder.length; i++) {
+        var component = frame.components[frame.componentsOrder[i]];
+        this.components.push({
+          lines: buildComponentData(frame, component),
+          scaleX: component.h / frame.maxH,
+          scaleY: component.v / frame.maxV
+        });
+      }
+    },
+    getData: function getData(width, height) {
+      function clampTo8bit(a) {
+        return a < 0 ? 0 : a > 255 ? 255 : a;
+      }
+      var scaleX = this.width / width, scaleY = this.height / height;
+
+      var component1, component2, component3, component4;
+      var component1Line, component2Line, component3Line, component4Line;
+      var x, y;
+      var offset = 0;
+      var Y, Cb, Cr, K, C, M, Ye, R, G, B;
+      var colorTransform;
+      var dataLength = width * height * this.components.length;
+      var data = new Uint8Array(dataLength);
+      switch (this.components.length) {
+        case 1:
+          component1 = this.components[0];
+          for (y = 0; y < height; y++) {
+            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+            for (x = 0; x < width; x++) {
+              Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+
+              data[offset++] = Y;
+            }
+          }
+          break;
+        case 3:
+          // The default transform for three components is true
+          colorTransform = true;
+          // The adobe transform marker overrides any previous setting
+          if (this.adobe && this.adobe.transformCode)
+            colorTransform = true;
+          else if (typeof this.colorTransform !== 'undefined')
+            colorTransform = !!this.colorTransform;
+
+          component1 = this.components[0];
+          component2 = this.components[1];
+          component3 = this.components[2];
+          for (y = 0; y < height; y++) {
+            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+            component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
+            component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
+            for (x = 0; x < width; x++) {
+              if (!colorTransform) {
+                R = component1Line[0 | (x * component1.scaleX * scaleX)];
+                G = component2Line[0 | (x * component2.scaleX * scaleX)];
+                B = component3Line[0 | (x * component3.scaleX * scaleX)];
+              } else {
+                Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+                Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
+                Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
+
+                R = clampTo8bit(Y + 1.402 * (Cr - 128));
+                G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+                B = clampTo8bit(Y + 1.772 * (Cb - 128));
+              }
+
+              data[offset++] = R;
+              data[offset++] = G;
+              data[offset++] = B;
+            }
+          }
+          break;
+        case 4:
+          if (!this.adobe)
+            throw 'Unsupported color mode (4 components)';
+          // The default transform for four components is false
+          colorTransform = false;
+          // The adobe transform marker overrides any previous setting
+          if (this.adobe && this.adobe.transformCode)
+            colorTransform = true;
+          else if (typeof this.colorTransform !== 'undefined')
+            colorTransform = !!this.colorTransform;
+
+          component1 = this.components[0];
+          component2 = this.components[1];
+          component3 = this.components[2];
+          component4 = this.components[3];
+          for (y = 0; y < height; y++) {
+            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
+            component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
+            component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
+            component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
+            for (x = 0; x < width; x++) {
+              if (!colorTransform) {
+                C = component1Line[0 | (x * component1.scaleX * scaleX)];
+                M = component2Line[0 | (x * component2.scaleX * scaleX)];
+                Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
+                K = component4Line[0 | (x * component4.scaleX * scaleX)];
+              } else {
+                Y = component1Line[0 | (x * component1.scaleX * scaleX)];
+                Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
+                Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
+                K = component4Line[0 | (x * component4.scaleX * scaleX)];
+
+                C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
+                M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
+                Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
+              }
+              data[offset++] = C;
+              data[offset++] = M;
+              data[offset++] = Ye;
+              data[offset++] = K;
+            }
+          }
+          break;
+        default:
+          throw 'Unsupported color mode';
+      }
+      return data;
+    },
+    copyToImageData: function copyToImageData(imageData) {
+      var width = imageData.width, height = imageData.height;
+      var imageDataArray = imageData.data;
+      var data = this.getData(width, height);
+      var i = 0, j = 0, x, y;
+      var Y, K, C, M, R, G, B;
+      switch (this.components.length) {
+        case 1:
+          for (y = 0; y < height; y++) {
+            for (x = 0; x < width; x++) {
+              Y = data[i++];
+
+              imageDataArray[j++] = Y;
+              imageDataArray[j++] = Y;
+              imageDataArray[j++] = Y;
+              imageDataArray[j++] = 255;
+            }
+          }
+          break;
+        case 3:
+          for (y = 0; y < height; y++) {
+            for (x = 0; x < width; x++) {
+              R = data[i++];
+              G = data[i++];
+              B = data[i++];
+
+              imageDataArray[j++] = R;
+              imageDataArray[j++] = G;
+              imageDataArray[j++] = B;
+              imageDataArray[j++] = 255;
+            }
+          }
+          break;
+        case 4:
+          for (y = 0; y < height; y++) {
+            for (x = 0; x < width; x++) {
+              C = data[i++];
+              M = data[i++];
+              Y = data[i++];
+              K = data[i++];
+
+              R = 255 - clampTo8bit(C * (1 - K / 255) + K);
+              G = 255 - clampTo8bit(M * (1 - K / 255) + K);
+              B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
+
+              imageDataArray[j++] = R;
+              imageDataArray[j++] = G;
+              imageDataArray[j++] = B;
+              imageDataArray[j++] = 255;
+            }
+          }
+          break;
+        default:
+          throw 'Unsupported color mode';
+      }
+    }
+  };
+
+  return constructor;
+})();
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var JpxImage = (function JpxImageClosure() {
+  // Table E.1
+  var SubbandsGainLog2 = {
+    'LL': 0,
+    'LH': 1,
+    'HL': 1,
+    'HH': 2
+  };
+  function JpxImage() {
+    this.failOnCorruptedImage = false;
+  }
+  JpxImage.prototype = {
+    load: function JpxImage_load(url) {
+      var xhr = new PdfJS_window.XMLHttpRequest();
+      xhr.open('GET', url, true);
+      xhr.responseType = 'arraybuffer';
+      xhr.onload = (function() {
+        // TODO catch parse error
+        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
+        this.parse(data);
+        if (this.onload)
+          this.onload();
+      }).bind(this);
+      xhr.send(null);
+    },
+    parse: function JpxImage_parse(data) {
+      function ReadUint(data, offset, bytes) {
+        var n = 0;
+        for (var i = 0; i < bytes; i++)
+          n = n * 256 + (data[offset + i] & 0xFF);
+        return n;
+      }
+      var position = 0, length = data.length;
+      while (position < length) {
+        var headerSize = 8;
+        var lbox = ReadUint(data, position, 4);
+        var tbox = ReadUint(data, position + 4, 4);
+        position += headerSize;
+        if (lbox == 1) {
+          lbox = ReadUint(data, position, 8);
+          position += 8;
+          headerSize += 8;
+        }
+        if (lbox == 0)
+          lbox = length - position + headerSize;
+        if (lbox < headerSize)
+          error('JPX error: Invalid box field size');
+        var dataLength = lbox - headerSize;
+        var jumpDataLength = true;
+        switch (tbox) {
+          case 0x6A501A1A: // 'jP\032\032'
+            // TODO
+            break;
+          case 0x6A703268: // 'jp2h'
+            jumpDataLength = false; // parsing child boxes
+            break;
+          case 0x636F6C72: // 'colr'
+            // TODO
+            break;
+          case 0x6A703263: // 'jp2c'
+            this.parseCodestream(data, position, position + dataLength);
+            break;
+        }
+        if (jumpDataLength)
+          position += dataLength;
+      }
+    },
+    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
+      var context = {};
+      try {
+        var position = start;
+        while (position < end) {
+          var code = readUint16(data, position);
+          position += 2;
+
+          var length = 0, j;
+          switch (code) {
+            case 0xFF4F: // Start of codestream (SOC)
+              context.mainHeader = true;
+              break;
+            case 0xFFD9: // End of codestream (EOC)
+              break;
+            case 0xFF51: // Image and tile size (SIZ)
+              length = readUint16(data, position);
+              var siz = {};
+              siz.Xsiz = readUint32(data, position + 4);
+              siz.Ysiz = readUint32(data, position + 8);
+              siz.XOsiz = readUint32(data, position + 12);
+              siz.YOsiz = readUint32(data, position + 16);
+              siz.XTsiz = readUint32(data, position + 20);
+              siz.YTsiz = readUint32(data, position + 24);
+              siz.XTOsiz = readUint32(data, position + 28);
+              siz.YTOsiz = readUint32(data, position + 32);
+              var componentsCount = readUint16(data, position + 36);
+              siz.Csiz = componentsCount;
+              var components = [];
+              j = position + 38;
+              for (var i = 0; i < componentsCount; i++) {
+                var component = {
+                  precision: (data[j] & 0x7F) + 1,
+                  isSigned: !!(data[j] & 0x80),
+                  XRsiz: data[j + 1],
+                  YRsiz: data[j + 1]
+                };
+                calculateComponentDimensions(component, siz);
+                components.push(component);
+              }
+              context.SIZ = siz;
+              context.components = components;
+              calculateTileGrids(context, components);
+              context.QCC = [];
+              context.COC = [];
+              break;
+            case 0xFF5C: // Quantization default (QCD)
+              length = readUint16(data, position);
+              var qcd = {};
+              j = position + 2;
+              var sqcd = data[j++];
+              var spqcdSize, scalarExpounded;
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw 'Invalid SQcd value ' + sqcd;
+              }
+              qcd.noQuantization = spqcdSize == 8;
+              qcd.scalarExpounded = scalarExpounded;
+              qcd.guardBits = sqcd >> 5;
+              var spqcds = [];
+              while (j < length + position) {
+                var spqcd = {};
+                if (spqcdSize == 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcd.SPqcds = spqcds;
+              if (context.mainHeader)
+                context.QCD = qcd;
+              else {
+                context.currentTile.QCD = qcd;
+                context.currentTile.QCC = [];
+              }
+              break;
+            case 0xFF5D: // Quantization component (QCC)
+              length = readUint16(data, position);
+              var qcc = {};
+              j = position + 2;
+              var cqcc;
+              if (context.SIZ.Csiz < 257)
+                cqcc = data[j++];
+              else {
+                cqcc = readUint16(data, j);
+                j += 2;
+              }
+              var sqcd = data[j++];
+              var spqcdSize, scalarExpounded;
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw 'Invalid SQcd value ' + sqcd;
+              }
+              qcc.noQuantization = spqcdSize == 8;
+              qcc.scalarExpounded = scalarExpounded;
+              qcc.guardBits = sqcd >> 5;
+              var spqcds = [];
+              while (j < length + position) {
+                var spqcd = {};
+                if (spqcdSize == 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcc.SPqcds = spqcds;
+              if (context.mainHeader)
+                context.QCC[cqcc] = qcc;
+              else
+                context.currentTile.QCC[cqcc] = qcc;
+              break;
+            case 0xFF52: // Coding style default (COD)
+              length = readUint16(data, position);
+              var cod = {};
+              j = position + 2;
+              var scod = data[j++];
+              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
+              cod.sopMarkerUsed = !!(scod & 2);
+              cod.ephMarkerUsed = !!(scod & 4);
+              var codingStyle = {};
+              cod.progressionOrder = data[j++];
+              cod.layersCount = readUint16(data, j);
+              j += 2;
+              cod.multipleComponentTransform = data[j++];
+
+              cod.decompositionLevelsCount = data[j++];
+              cod.xcb = (data[j++] & 0xF) + 2;
+              cod.ycb = (data[j++] & 0xF) + 2;
+              var blockStyle = data[j++];
+              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
+              cod.resetContextProbabilities = !!(blockStyle & 2);
+              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
+              cod.verticalyStripe = !!(blockStyle & 8);
+              cod.predictableTermination = !!(blockStyle & 16);
+              cod.segmentationSymbolUsed = !!(blockStyle & 32);
+              cod.transformation = data[j++];
+              if (cod.entropyCoderWithCustomPrecincts) {
+                var precinctsSizes = {};
+                while (j < length + position) {
+                  var precinctsSize = data[j];
+                  precinctsSizes.push({
+                    PPx: precinctsSize & 0xF,
+                    PPy: precinctsSize >> 4
+                  });
+                }
+                cod.precinctsSizes = precinctsSizes;
+              }
+
+              if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
+                  cod.selectiveArithmeticCodingBypass ||
+                  cod.resetContextProbabilities ||
+                  cod.terminationOnEachCodingPass ||
+                  cod.verticalyStripe || cod.predictableTermination ||
+                  cod.segmentationSymbolUsed)
+                throw 'Unsupported COD options: ' + uneval(cod);
+
+              if (context.mainHeader)
+                context.COD = cod;
+              else {
+                context.currentTile.COD = cod;
+                context.currentTile.COC = [];
+              }
+              break;
+            case 0xFF90: // Start of tile-part (SOT)
+              length = readUint16(data, position);
+              var tile = {};
+              tile.index = readUint16(data, position + 2);
+              tile.length = readUint32(data, position + 4);
+              tile.dataEnd = tile.length + position - 2;
+              tile.partIndex = data[position + 8];
+              tile.partsCount = data[position + 9];
+
+              context.mainHeader = false;
+              if (tile.partIndex == 0) {
+                // reset component specific settings
+                tile.COD = context.COD;
+                tile.COC = context.COC.slice(0); // clone of the global COC
+                tile.QCD = context.QCD;
+                tile.QCC = context.QCC.slice(0); // clone of the global COC
+              }
+              context.currentTile = tile;
+              break;
+            case 0xFF93: // Start of data (SOD)
+              var tile = context.currentTile;
+              if (tile.partIndex == 0) {
+                initializeTile(context, tile.index);
+                buildPackets(context);
+              }
+
+              // moving to the end of the data
+              length = tile.dataEnd - position;
+
+              parseTilePackets(context, data, position, length);
+              break;
+            case 0xFF64: // Comment (COM)
+              length = readUint16(data, position);
+              // skipping content
+              break;
+            default:
+              throw 'Unknown codestream code: ' + code.toString(16);
+          }
+          position += length;
+        }
+      } catch (e) {
+        if (this.failOnCorruptedImage)
+          error('JPX error: ' + e);
+        else
+          warn('JPX error: ' + e + '. Trying to recover');
+      }
+      this.tiles = transformComponents(context);
+      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
+      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
+      this.componentsCount = context.SIZ.Csiz;
+    }
+  };
+  function readUint32(data, offset) {
+    return (data[offset] << 24) | (data[offset + 1] << 16) |
+      (data[offset + 2] << 8) | data[offset + 3];
+  }
+  function readUint16(data, offset) {
+    return (data[offset] << 8) | data[offset + 1];
+  }
+  function log2(x) {
+    var n = 1, i = 0;
+    while (x > n) {
+      n <<= 1;
+      i++;
+    }
+    return i;
+  }
+  function calculateComponentDimensions(component, siz) {
+    // Section B.2 Component mapping
+    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
+    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
+    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
+    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
+    component.width = component.x1 - component.x0;
+    component.height = component.y1 - component.y0;
+  }
+  function calculateTileGrids(context, components) {
+    var siz = context.SIZ;
+    // Section B.3 Division into tile and tile-components
+    var tiles = [];
+    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
+    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+    for (var q = 0; q < numYtiles; q++) {
+      for (var p = 0; p < numXtiles; p++) {
+        var tile = {};
+        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
+        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
+        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
+        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
+        tile.width = tile.tx1 - tile.tx0;
+        tile.height = tile.ty1 - tile.ty0;
+        tile.components = [];
+        tiles.push(tile);
+      }
+    }
+    context.tiles = tiles;
+
+    var componentsCount = siz.Csiz;
+    for (var i = 0, ii = componentsCount; i < ii; i++) {
+      var component = components[i];
+      var tileComponents = [];
+      for (var j = 0, jj = tiles.length; j < jj; j++) {
+        var tileComponent = {}, tile = tiles[j];
+        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
+        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
+        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
+        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
+        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
+        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
+        tile.components[i] = tileComponent;
+      }
+    }
+  }
+  function getBlocksDimensions(context, component, r) {
+    var codOrCoc = component.codingStyleParameters;
+    var result = {};
+    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
+      result.PPx = 15;
+      result.PPy = 15;
+    } else {
+      result.PPx = codOrCoc.precinctsSizes[r].PPx;
+      result.PPy = codOrCoc.precinctsSizes[r].PPy;
+    }
+    // calculate codeblock size as described in section B.7
+    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
+      Math.min(codOrCoc.xcb, result.PPx);
+    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
+      Math.min(codOrCoc.ycb, result.PPy);
+    return result;
+  }
+  function buildPrecincts(context, resolution, dimensions) {
+    // Section B.6 Division resolution to precincts
+    var precinctWidth = 1 << dimensions.PPx;
+    var precinctHeight = 1 << dimensions.PPy;
+    var numprecinctswide = resolution.trx1 > resolution.trx0 ?
+      Math.ceil(resolution.trx1 / precinctWidth) -
+      Math.floor(resolution.trx0 / precinctWidth) : 0;
+    var numprecinctshigh = resolution.try1 > resolution.try0 ?
+      Math.ceil(resolution.try1 / precinctHeight) -
+      Math.floor(resolution.try0 / precinctHeight) : 0;
+    var numprecincts = numprecinctswide * numprecinctshigh;
+    var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
+      precinctWidth;
+    var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
+      precinctHeight;
+    resolution.precinctParameters = {
+      precinctXOffset: precinctXOffset,
+      precinctYOffset: precinctYOffset,
+      precinctWidth: precinctWidth,
+      precinctHeight: precinctHeight,
+      numprecinctswide: numprecinctswide,
+      numprecinctshigh: numprecinctshigh,
+      numprecincts: numprecincts
+    };
+  }
+  function buildCodeblocks(context, subband, dimensions) {
+    // Section B.7 Division sub-band into code-blocks
+    var xcb_ = dimensions.xcb_;
+    var ycb_ = dimensions.ycb_;
+    var codeblockWidth = 1 << xcb_;
+    var codeblockHeight = 1 << ycb_;
+    var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
+    var cby0 = Math.floor(subband.tby0 / codeblockHeight);
+    var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
+    var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
+    var precinctParameters = subband.resolution.precinctParameters;
+    var codeblocks = [];
+    var precincts = [];
+    for (var j = cby0; j < cby1; j++) {
+      for (var i = cbx0; i < cbx1; i++) {
+        var codeblock = {
+          cbx: i,
+          cby: j,
+          tbx0: codeblockWidth * i,
+          tby0: codeblockHeight * j,
+          tbx1: codeblockWidth * (i + 1),
+          tby1: codeblockHeight * (j + 1)
+        };
+        // calculate precinct number
+        var pi = Math.floor((codeblock.tbx0 -
+          precinctParameters.precinctXOffset) /
+          precinctParameters.precinctWidth);
+        var pj = Math.floor((codeblock.tby0 -
+          precinctParameters.precinctYOffset) /
+          precinctParameters.precinctHeight);
+        var precinctNumber = pj +
+          pi * precinctParameters.numprecinctswide;
+        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
+        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
+        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
+        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
+        codeblock.precinctNumber = precinctNumber;
+        codeblock.subbandType = subband.type;
+        var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
+          (codeblock.tby1_ - codeblock.tby0_);
+        codeblock.Lblock = 3;
+        codeblocks.push(codeblock);
+        // building precinct for the sub-band
+        var precinct;
+        if (precinctNumber in precincts) {
+          precinct = precincts[precinctNumber];
+          precinct.cbxMin = Math.min(precinct.cbxMin, i);
+          precinct.cbyMin = Math.min(precinct.cbyMin, j);
+          precinct.cbxMax = Math.max(precinct.cbxMax, i);
+          precinct.cbyMax = Math.max(precinct.cbyMax, j);
+        } else {
+          precincts[precinctNumber] = precinct = {
+            cbxMin: i,
+            cbyMin: j,
+            cbxMax: i,
+            cbyMax: j
+          };
+        }
+        codeblock.precinct = precinct;
+      }
+    }
+    subband.codeblockParameters = {
+      codeblockWidth: xcb_,
+      codeblockHeight: ycb_,
+      numcodeblockwide: cbx1 - cbx0 + 1,
+      numcodeblockhigh: cby1 - cby1 + 1
+    };
+    subband.codeblocks = codeblocks;
+    for (var i = 0, ii = codeblocks.length; i < ii; i++) {
+      var codeblock = codeblocks[i];
+      var precinctNumber = codeblock.precinctNumber;
+    }
+    subband.precincts = precincts;
+  }
+  function createPacket(resolution, precinctNumber, layerNumber) {
+    var precinctCodeblocks = [];
+    // Section B.10.8 Order of info in packet
+    var subbands = resolution.subbands;
+    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
+    for (var i = 0, ii = subbands.length; i < ii; i++) {
+      var subband = subbands[i];
+      var codeblocks = subband.codeblocks;
+      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
+        var codeblock = codeblocks[j];
+        if (codeblock.precinctNumber != precinctNumber)
+          continue;
+        precinctCodeblocks.push(codeblock);
+      }
+    }
+    return {
+      layerNumber: layerNumber,
+      codeblocks: precinctCodeblocks
+    };
+  }
+  function LayerResolutionComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+        tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+
+    var l = 0, r = 0, i = 0, k = 0;
+
+    this.nextPacket = function JpxImage_nextPacket() {
+      // Section B.12.1.1 Layer-resolution-component-position
+      for (; l < layersCount; l++) {
+        for (; r <= maxDecompositionLevelsCount; r++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount)
+              continue;
+
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        r = 0;
+      }
+      throw 'Out of packets';
+    };
+  }
+  function ResolutionLayerComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+        tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+
+    var r = 0, l = 0, i = 0, k = 0;
+
+    this.nextPacket = function JpxImage_nextPacket() {
+      // Section B.12.1.2 Resolution-layer-component-position
+      for (; r <= maxDecompositionLevelsCount; r++) {
+        for (; l < layersCount; l++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount)
+              continue;
+
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        l = 0;
+      }
+      throw 'Out of packets';
+    };
+  }
+  function buildPackets(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var componentsCount = siz.Csiz;
+    // Creating resolutions and sub-bands for each component
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var decompositionLevelsCount =
+        component.codingStyleParameters.decompositionLevelsCount;
+      // Section B.5 Resolution levels and sub-bands
+      var resolutions = [];
+      var subbands = [];
+      for (var r = 0; r <= decompositionLevelsCount; r++) {
+        var blocksDimensions = getBlocksDimensions(context, component, r);
+        var resolution = {};
+        var scale = 1 << (decompositionLevelsCount - r);
+        resolution.trx0 = Math.ceil(component.tcx0 / scale);
+        resolution.try0 = Math.ceil(component.tcy0 / scale);
+        resolution.trx1 = Math.ceil(component.tcx1 / scale);
+        resolution.try1 = Math.ceil(component.tcy1 / scale);
+        buildPrecincts(context, resolution, blocksDimensions);
+        resolutions.push(resolution);
+
+        var subband;
+        if (r == 0) {
+          // one sub-band (LL) with last decomposition
+          subband = {};
+          subband.type = 'LL';
+          subband.tbx0 = Math.ceil(component.tcx0 / scale);
+          subband.tby0 = Math.ceil(component.tcy0 / scale);
+          subband.tbx1 = Math.ceil(component.tcx1 / scale);
+          subband.tby1 = Math.ceil(component.tcy1 / scale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolution.subbands = [subband];
+        } else {
+          var bscale = 1 << (decompositionLevelsCount - r + 1);
+          var resolutionSubbands = [];
+          // three sub-bands (HL, LH and HH) with rest of decompositions
+          subband = {};
+          subband.type = 'HL';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          subband = {};
+          subband.type = 'LH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          subband = {};
+          subband.type = 'HH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+
+          resolution.subbands = resolutionSubbands;
+        }
+      }
+      component.resolutions = resolutions;
+      component.subbands = subbands;
+    }
+    // Generate the packets sequence
+    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
+    var packetsIterator;
+    switch (progressionOrder) {
+      case 0:
+        tile.packetsIterator =
+          new LayerResolutionComponentPositionIterator(context);
+        break;
+      case 1:
+        tile.packetsIterator =
+          new ResolutionLayerComponentPositionIterator(context);
+        break;
+      default:
+        throw 'Unsupported progression order ' + progressionOrder;
+    }
+  }
+  function parseTilePackets(context, data, offset, dataLength) {
+    var position = 0;
+    var buffer, bufferSize = 0, skipNextBit = false;
+    function readBits(count) {
+      while (bufferSize < count) {
+        var b = data[offset + position];
+        position++;
+        if (skipNextBit) {
+          buffer = (buffer << 7) | b;
+          bufferSize += 7;
+          skipNextBit = false;
+        } else {
+          buffer = (buffer << 8) | b;
+          bufferSize += 8;
+        }
+        if (b == 0xFF) {
+          skipNextBit = true;
+        }
+      }
+      bufferSize -= count;
+      return (buffer >>> bufferSize) & ((1 << count) - 1);
+    }
+    function alignToByte() {
+      bufferSize = 0;
+      if (skipNextBit) {
+        position++;
+        skipNextBit = false;
+      }
+    }
+    function readCodingpasses() {
+      var value = readBits(1);
+      if (value == 0)
+        return 1;
+      value = (value << 1) | readBits(1);
+      if (value == 0x02)
+        return 2;
+      value = (value << 2) | readBits(2);
+      if (value <= 0x0E)
+        return (value & 0x03) + 3;
+      value = (value << 5) | readBits(5);
+      if (value <= 0x1FE)
+        return (value & 0x1F) + 6;
+      value = (value << 7) | readBits(7);
+      return (value & 0x7F) + 37;
+    }
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var packetsIterator = tile.packetsIterator;
+    while (position < dataLength) {
+      var packet = packetsIterator.nextPacket();
+      if (!readBits(1)) {
+        alignToByte();
+        continue;
+      }
+      var layerNumber = packet.layerNumber;
+      var queue = [];
+      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
+        var codeblock = packet.codeblocks[i];
+        var precinct = codeblock.precinct;
+        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
+        var codeblockRow = codeblock.cby - precinct.cbyMin;
+        var codeblockIncluded = false;
+        var firstTimeInclusion = false;
+        if ('included' in codeblock) {
+          codeblockIncluded = !!readBits(1);
+        } else {
+          // reading inclusion tree
+          var precinct = codeblock.precinct;
+          var inclusionTree, zeroBitPlanesTree;
+          if ('inclusionTree' in precinct) {
+            inclusionTree = precinct.inclusionTree;
+          } else {
+            // building inclusion and zero bit-planes trees
+            var width = precinct.cbxMax - precinct.cbxMin + 1;
+            var height = precinct.cbyMax - precinct.cbyMin + 1;
+            inclusionTree = new InclusionTree(width, height, layerNumber);
+            zeroBitPlanesTree = new TagTree(width, height);
+            precinct.inclusionTree = inclusionTree;
+            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
+          }
+
+          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
+            while (true) {
+              if (readBits(1)) {
+                var valueReady = !inclusionTree.nextLevel();
+                if (valueReady) {
+                  codeblock.included = true;
+                  codeblockIncluded = firstTimeInclusion = true;
+                  break;
+                }
+              } else {
+                inclusionTree.incrementValue(layerNumber);
+                break;
+              }
+            }
+          }
+        }
+        if (!codeblockIncluded)
+          continue;
+        if (firstTimeInclusion) {
+          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
+          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
+          while (true) {
+            if (readBits(1)) {
+              var valueReady = !zeroBitPlanesTree.nextLevel();
+              if (valueReady)
+                break;
+            } else
+              zeroBitPlanesTree.incrementValue();
+          }
+          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
+        }
+        var codingpasses = readCodingpasses();
+        while (readBits(1))
+          codeblock.Lblock++;
+        var codingpassesLog2 = log2(codingpasses);
+        // rounding down log2
+        var bits = ((codingpasses < (1 << codingpassesLog2)) ?
+          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
+        var codedDataLength = readBits(bits);
+        queue.push({
+          codeblock: codeblock,
+          codingpasses: codingpasses,
+          dataLength: codedDataLength
+        });
+      }
+      alignToByte();
+      while (queue.length > 0) {
+        var packetItem = queue.shift();
+        var codeblock = packetItem.codeblock;
+        if (!('data' in codeblock))
+          codeblock.data = [];
+        codeblock.data.push({
+          data: data,
+          start: offset + position,
+          end: offset + position + packetItem.dataLength,
+          codingpasses: packetItem.codingpasses
+        });
+        position += packetItem.dataLength;
+      }
+    }
+    return position;
+  }
+  function copyCoefficients(coefficients, x0, y0, width, height,
+                            delta, mb, codeblocks, transformation) {
+    var r = 0.5; // formula (E-6)
+    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
+      var codeblock = codeblocks[i];
+      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
+      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
+      if (blockWidth == 0 || blockHeight == 0)
+        continue;
+      if (!('data' in codeblock))
+        continue;
+
+      var bitModel, currentCodingpassType;
+      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
+        codeblock.zeroBitPlanes);
+      currentCodingpassType = 2; // first bit plane starts from cleanup
+
+      // collect data
+      var data = codeblock.data, totalLength = 0, codingpasses = 0;
+      for (var q = 0, qq = data.length; q < qq; q++) {
+        var dataItem = data[q];
+        totalLength += dataItem.end - dataItem.start;
+        codingpasses += dataItem.codingpasses;
+      }
+      var encodedData = new Uint8Array(totalLength), k = 0;
+      for (var q = 0, qq = data.length; q < qq; q++) {
+        var dataItem = data[q];
+        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
+        encodedData.set(chunk, k);
+        k += chunk.length;
+      }
+      // decoding the item
+      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
+      bitModel.setDecoder(decoder);
+
+      for (var q = 0; q < codingpasses; q++) {
+        switch (currentCodingpassType) {
+          case 0:
+            bitModel.runSignificancePropogationPass();
+            break;
+          case 1:
+            bitModel.runMagnitudeRefinementPass();
+            break;
+          case 2:
+            bitModel.runCleanupPass();
+            break;
+        }
+        currentCodingpassType = (currentCodingpassType + 1) % 3;
+      }
+
+      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
+      var position = 0;
+      for (var j = 0; j < blockHeight; j++) {
+        for (var k = 0; k < blockWidth; k++) {
+          var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
+            bitModel.coefficentsMagnitude[position];
+          var nb = bitModel.bitsDecoded[position], correction;
+          if (transformation == 0 || mb > nb) {
+            // use r only if transformation is irreversible or
+            // not all bitplanes were decoded for reversible transformation
+            n += n < 0 ? n - r : n > 0 ? n + r : 0;
+            correction = 1 << (mb - nb);
+          } else
+            correction = 1;
+          coefficients[offset++] = n * correction * delta;
+          position++;
+        }
+        offset += width - blockWidth;
+      }
+    }
+  }
+  function transformTile(context, tile, c) {
+    var component = tile.components[c];
+    var codingStyleParameters = component.codingStyleParameters;
+    var quantizationParameters = component.quantizationParameters;
+    var decompositionLevelsCount =
+      codingStyleParameters.decompositionLevelsCount;
+    var spqcds = quantizationParameters.SPqcds;
+    var scalarExpounded = quantizationParameters.scalarExpounded;
+    var guardBits = quantizationParameters.guardBits;
+    var transformation = codingStyleParameters.transformation;
+    var precision = context.components[c].precision;
+
+    var subbandCoefficients = [];
+    var k = 0, b = 0;
+    for (var i = 0; i <= decompositionLevelsCount; i++) {
+      var resolution = component.resolutions[i];
+
+      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
+        var mu, epsilon;
+        if (!scalarExpounded) {
+          // formula E-5
+          mu = spqcds[0].mu;
+          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
+        } else {
+          mu = spqcds[b].mu;
+          epsilon = spqcds[b].epsilon;
+        }
+
+        var subband = resolution.subbands[j];
+        var width = subband.tbx1 - subband.tbx0;
+        var height = subband.tby1 - subband.tby0;
+        var gainLog2 = SubbandsGainLog2[subband.type];
+
+        // calulate quantization coefficient (Section E.1.1.1)
+        var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
+          (1 + mu / 2048);
+        var mb = (guardBits + epsilon - 1);
+
+        var coefficients = new Float32Array(width * height);
+        copyCoefficients(coefficients, subband.tbx0, subband.tby0,
+          width, height, delta, mb, subband.codeblocks, transformation);
+
+        subbandCoefficients.push({
+          width: width,
+          height: height,
+          items: coefficients
+        });
+
+        b++;
+      }
+    }
+
+    var transformation = codingStyleParameters.transformation;
+    var transform = transformation == 0 ? new IrreversibleTransform() :
+      new ReversibleTransform();
+    var result = transform.calculate(subbandCoefficients,
+      component.tcx0, component.tcy0);
+    return {
+      left: component.tcx0,
+      top: component.tcy0,
+      width: result.width,
+      height: result.height,
+      items: result.items
+    };
+  }
+  function transformComponents(context) {
+    var siz = context.SIZ;
+    var components = context.components;
+    var componentsCount = siz.Csiz;
+    var resultImages = [];
+    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
+      var tile = context.tiles[i];
+      var result = [];
+      for (var c = 0; c < componentsCount; c++) {
+        var image = transformTile(context, tile, c);
+        result.push(image);
+      }
+
+      // Section G.2.2 Inverse multi component transform
+      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
+        var y0items = result[0].items;
+        var y1items = result[1].items;
+        var y2items = result[2].items;
+        for (var j = 0, jj = y0items.length; j < jj; j++) {
+          var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
+          var i1 = y0 - ((y2 + y1) >> 2);
+          y1items[j] = i1;
+          y0items[j] = y2 + i1;
+          y2items[j] = y1 + i1;
+        }
+      }
+
+      // Section G.1 DC level shifting to unsigned component values
+      for (var c = 0; c < componentsCount; c++) {
+        var component = components[c];
+        if (component.isSigned)
+          continue;
+
+        var offset = 1 << (component.precision - 1);
+        var tileImage = result[c];
+        var items = tileImage.items;
+        for (var j = 0, jj = items.length; j < jj; j++)
+          items[j] += offset;
+      }
+
+      // To simplify things: shift and clamp output to 8 bit unsigned
+      for (var c = 0; c < componentsCount; c++) {
+        var component = components[c];
+        var offset = component.isSigned ? 128 : 0;
+        var shift = component.precision - 8;
+        var tileImage = result[c];
+        var items = tileImage.items;
+        var data = new Uint8Array(items.length);
+        for (var j = 0, jj = items.length; j < jj; j++) {
+          var value = (items[j] >> shift) + offset;
+          data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
+        }
+        result[c].items = data;
+      }
+
+      resultImages.push(result);
+    }
+    return resultImages;
+  }
+  function initializeTile(context, tileIndex) {
+    var siz = context.SIZ;
+    var componentsCount = siz.Csiz;
+    var tile = context.tiles[tileIndex];
+    var resultTiles = [];
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var qcdOrQcc = c in context.currentTile.QCC ?
+        context.currentTile.QCC[c] : context.currentTile.QCD;
+      component.quantizationParameters = qcdOrQcc;
+      var codOrCoc = c in context.currentTile.COC ?
+        context.currentTile.COC[c] : context.currentTile.COD;
+      component.codingStyleParameters = codOrCoc;
+    }
+    tile.codingStyleDefaultParameters = context.currentTile.COD;
+  }
+
+  // Section B.10.2 Tag trees
+  var TagTree = (function TagTreeClosure() {
+    function TagTree(width, height) {
+      var levelsLength = log2(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var level = {
+          width: width,
+          height: height,
+          items: []
+        };
+        this.levels.push(level);
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    TagTree.prototype = {
+      reset: function TagTree_reset(i, j) {
+        var currentLevel = 0, value = 0;
+        while (currentLevel < this.levels.length) {
+          var level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          if (index in level.items) {
+            value = level.items[index];
+            break;
+          }
+          level.index = index;
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        currentLevel--;
+        var level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        this.currentLevel = currentLevel;
+        delete this.value;
+      },
+      incrementValue: function TagTree_incrementValue() {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index]++;
+      },
+      nextLevel: function TagTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        currentLevel--;
+        if (currentLevel < 0) {
+          this.value = value;
+          return false;
+        }
+
+        this.currentLevel = currentLevel;
+        var level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return TagTree;
+  })();
+
+  var InclusionTree = (function InclusionTreeClosure() {
+    function InclusionTree(width, height,  defaultValue) {
+      var levelsLength = log2(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var items = new Uint8Array(width * height);
+        for (var j = 0, jj = items.length; j < jj; j++)
+          items[j] = defaultValue;
+
+        var level = {
+          width: width,
+          height: height,
+          items: items
+        };
+        this.levels.push(level);
+
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    InclusionTree.prototype = {
+      reset: function InclusionTree_reset(i, j, stopValue) {
+        var currentLevel = 0;
+        while (currentLevel < this.levels.length) {
+          var level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          level.index = index;
+          var value = level.items[index];
+
+          if (value == 0xFF)
+            break;
+
+          if (value > stopValue) {
+            this.currentLevel = currentLevel;
+            // already know about this one, propagating the value to top levels
+            this.propagateValues();
+            return false;
+          }
+
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        this.currentLevel = currentLevel - 1;
+        return true;
+      },
+      incrementValue: function InclusionTree_incrementValue(stopValue) {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index] = stopValue + 1;
+        this.propagateValues();
+      },
+      propagateValues: function InclusionTree_propagateValues() {
+        var levelIndex = this.currentLevel;
+        var level = this.levels[levelIndex];
+        var currentValue = level.items[level.index];
+        while (--levelIndex >= 0) {
+          var level = this.levels[levelIndex];
+          level.items[level.index] = currentValue;
+        }
+      },
+      nextLevel: function InclusionTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        level.items[level.index] = 0xFF;
+        currentLevel--;
+        if (currentLevel < 0)
+          return false;
+
+        this.currentLevel = currentLevel;
+        var level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return InclusionTree;
+  })();
+
+  // Implements C.3. Arithmetic decoding procedures
+  var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
+    var QeTable = [
+      {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
+      {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
+      {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
+      {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
+      {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
+      {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
+      {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
+      {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
+      {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
+      {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
+      {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
+      {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
+      {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
+      {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
+      {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
+      {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
+      {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
+      {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
+      {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
+      {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
+      {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
+      {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
+      {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
+      {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
+      {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
+      {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
+      {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
+      {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
+      {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
+      {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
+      {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
+      {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
+      {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
+      {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
+      {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
+      {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
+      {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
+      {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
+      {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
+      {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
+      {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
+      {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
+      {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
+      {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
+      {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
+      {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
+      {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
+    ];
+
+    function ArithmeticDecoder(data, start, end) {
+      this.data = data;
+      this.bp = start;
+      this.dataEnd = end;
+
+      this.chigh = data[start];
+      this.clow = 0;
+
+      this.byteIn();
+
+      this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
+      this.clow = (this.clow << 7) & 0xFFFF;
+      this.ct -= 7;
+      this.a = 0x8000;
+    }
+
+    ArithmeticDecoder.prototype = {
+      byteIn: function ArithmeticDecoder_byteIn() {
+        var data = this.data;
+        var bp = this.bp;
+        if (data[bp] == 0xFF) {
+          var b1 = data[bp + 1];
+          if (b1 > 0x8F) {
+            this.clow += 0xFF00;
+            this.ct = 8;
+          } else {
+            bp++;
+            this.clow += (data[bp] << 9);
+            this.ct = 7;
+            this.bp = bp;
+          }
+        } else {
+          bp++;
+          this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
+          this.ct = 8;
+          this.bp = bp;
+        }
+        if (this.clow > 0xFFFF) {
+          this.chigh += (this.clow >> 16);
+          this.clow &= 0xFFFF;
+        }
+      },
+      readBit: function ArithmeticDecoder_readBit(cx) {
+        var qeIcx = QeTable[cx.index].qe;
+        this.a -= qeIcx;
+
+        if (this.chigh < qeIcx) {
+          var d = this.exchangeLps(cx);
+          this.renormD();
+          return d;
+        } else {
+          this.chigh -= qeIcx;
+          if ((this.a & 0x8000) == 0) {
+            var d = this.exchangeMps(cx);
+            this.renormD();
+            return d;
+          } else {
+            return cx.mps;
+          }
+        }
+      },
+      renormD: function ArithmeticDecoder_renormD() {
+        do {
+          if (this.ct == 0)
+            this.byteIn();
+
+          this.a <<= 1;
+          this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
+          this.clow = (this.clow << 1) & 0xFFFF;
+          this.ct--;
+        } while ((this.a & 0x8000) == 0);
+      },
+      exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
+        var d;
+        var qeTableIcx = QeTable[cx.index];
+        if (this.a < qeTableIcx.qe) {
+          d = 1 - cx.mps;
+
+          if (qeTableIcx.switchFlag == 1) {
+            cx.mps = 1 - cx.mps;
+          }
+          cx.index = qeTableIcx.nlps;
+        } else {
+          d = cx.mps;
+          cx.index = qeTableIcx.nmps;
+        }
+        return d;
+      },
+      exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
+        var d;
+        var qeTableIcx = QeTable[cx.index];
+        if (this.a < qeTableIcx.qe) {
+          this.a = qeTableIcx.qe;
+          d = cx.mps;
+          cx.index = qeTableIcx.nmps;
+        } else {
+          this.a = qeTableIcx.qe;
+          d = 1 - cx.mps;
+
+          if (qeTableIcx.switchFlag == 1) {
+            cx.mps = 1 - cx.mps;
+          }
+          cx.index = qeTableIcx.nlps;
+        }
+        return d;
+      }
+    };
+
+    return ArithmeticDecoder;
+  })();
+
+  // Section D. Coefficient bit modeling
+  var BitModel = (function BitModelClosure() {
+    // Table D-1
+    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
+    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
+    var LLAndLHContextsLabel = new Uint8Array([
+      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
+      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
+      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
+    ]);
+    var HLContextLabel = new Uint8Array([
+      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
+      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
+      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
+    ]);
+    var HHContextLabel = new Uint8Array([
+      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
+      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
+      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
+    ]);
+
+    // Table D-2
+    function calcSignContribution(significance0, sign0, significance1, sign1) {
+      if (significance1) {
+        if (!sign1)
+          return significance0 ? (!sign0 ? 1 : 0) : 1;
+        else
+          return significance0 ? (!sign0 ? 0 : -1) : -1;
+      } else
+        return significance0 ? (!sign0 ? 1 : -1) : 0;
+    }
+    // Table D-3
+    var SignContextLabels = [
+      {contextLabel: 13, xorBit: 0},
+      {contextLabel: 12, xorBit: 0},
+      {contextLabel: 11, xorBit: 0},
+      {contextLabel: 10, xorBit: 0},
+      {contextLabel: 9, xorBit: 0},
+      {contextLabel: 10, xorBit: 1},
+      {contextLabel: 11, xorBit: 1},
+      {contextLabel: 12, xorBit: 1},
+      {contextLabel: 13, xorBit: 1}
+    ];
+
+    function BitModel(width, height, subband, zeroBitPlanes) {
+      this.width = width;
+      this.height = height;
+
+      this.contextLabelTable = subband == 'HH' ? HHContextLabel :
+        subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
+
+      var coefficientCount = width * height;
+
+      // coefficients outside the encoding region treated as insignificant
+      // add border state cells for significanceState
+      this.neighborsSignificance = new Uint8Array(coefficientCount);
+      this.coefficentsSign = new Uint8Array(coefficientCount);
+      this.coefficentsMagnitude = new Uint32Array(coefficientCount);
+      this.processingFlags = new Uint8Array(coefficientCount);
+
+      var bitsDecoded = new Uint8Array(this.width * this.height);
+      for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
+        bitsDecoded[i] = zeroBitPlanes;
+      this.bitsDecoded = bitsDecoded;
+
+      this.reset();
+    }
+
+    BitModel.prototype = {
+      setDecoder: function BitModel_setDecoder(decoder) {
+        this.decoder = decoder;
+      },
+      reset: function BitModel_reset() {
+        this.uniformContext = {index: 46, mps: 0};
+        this.runLengthContext = {index: 3, mps: 0};
+        this.contexts = [];
+        this.contexts.push({index: 4, mps: 0});
+        for (var i = 1; i <= 16; i++)
+          this.contexts.push({index: 0, mps: 0});
+      },
+      setNeighborsSignificance:
+        function BitModel_setNeighborsSignificance(row, column) {
+        var neighborsSignificance = this.neighborsSignificance;
+        var width = this.width, height = this.height;
+        var index = row * width + column;
+        if (row > 0) {
+          if (column > 0)
+            neighborsSignificance[index - width - 1] += 0x10;
+          if (column + 1 < width)
+            neighborsSignificance[index - width + 1] += 0x10;
+          neighborsSignificance[index - width] += 0x04;
+        }
+        if (row + 1 < height) {
+          if (column > 0)
+            neighborsSignificance[index + width - 1] += 0x10;
+          if (column + 1 < width)
+            neighborsSignificance[index + width + 1] += 0x10;
+          neighborsSignificance[index + width] += 0x04;
+        }
+        if (column > 0)
+          neighborsSignificance[index - 1] += 0x01;
+        if (column + 1 < width)
+          neighborsSignificance[index + 1] += 0x01;
+        neighborsSignificance[index] |= 0x80;
+      },
+      runSignificancePropogationPass:
+        function BitModel_runSignificancePropogationPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contextLabels = this.contextLabels;
+        var neighborsSignificance = this.neighborsSignificance;
+        var processingFlags = this.processingFlags;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        // clear processed flag
+        var processedInverseMask = ~1;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        for (var q = 0, qq = width * height; q < qq; q++)
+          processingFlags[q] &= processedInverseMask;
+
+        for (var i0 = 0; i0 < height; i0 += 4) {
+          for (var j = 0; j < width; j++) {
+            var index = i0 * width + j;
+            for (var i1 = 0; i1 < 4; i1++, index += width) {
+              var i = i0 + i1;
+              if (i >= height)
+                break;
+
+              if (coefficentsMagnitude[index] || !neighborsSignificance[index])
+                continue;
+
+              var contextLabel = labels[neighborsSignificance[index]];
+              var cx = contexts[contextLabel];
+              var decision = decoder.readBit(cx);
+              if (decision) {
+                var sign = this.decodeSignBit(i, j);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      decodeSignBit: function BitModel_decodeSignBit(row, column) {
+        var width = this.width, height = this.height;
+        var index = row * width + column;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var horizontalContribution = calcSignContribution(
+          column > 0 && coefficentsMagnitude[index - 1],
+          coefficentsSign[index - 1],
+          column + 1 < width && coefficentsMagnitude[index + 1],
+          coefficentsSign[index + 1]);
+        var verticalContribution = calcSignContribution(
+          row > 0 && coefficentsMagnitude[index - width],
+          coefficentsSign[index - width],
+          row + 1 < height && coefficentsMagnitude[index + width],
+          coefficentsSign[index + width]);
+
+        var contextLabelAndXor = SignContextLabels[
+          3 * (1 - horizontalContribution) + (1 - verticalContribution)];
+        var contextLabel = contextLabelAndXor.contextLabel;
+        var cx = this.contexts[contextLabel];
+        var decoded = this.decoder.readBit(cx);
+        return decoded ^ contextLabelAndXor.xorBit;
+      },
+      runMagnitudeRefinementPass:
+        function BitModel_runMagnitudeRefinementPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var neighborsSignificance = this.neighborsSignificance;
+        var contexts = this.contexts;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        for (var i0 = 0; i0 < height; i0 += 4) {
+          for (var j = 0; j < width; j++) {
+            for (var i1 = 0; i1 < 4; i1++) {
+              var i = i0 + i1;
+              if (i >= height)
+                break;
+              var index = i * width + j;
+
+              // significant but not those that have just become
+              if (!coefficentsMagnitude[index] ||
+                (processingFlags[index] & processedMask) != 0)
+                continue;
+
+              var contextLabel = 16;
+              if ((processingFlags[index] &
+                firstMagnitudeBitMask) != 0) {
+                processingFlags[i * width + j] ^= firstMagnitudeBitMask;
+                // first refinement
+                var significance = neighborsSignificance[index];
+                var sumOfSignificance = (significance & 3) +
+                  ((significance >> 2) & 3) + ((significance >> 4) & 7);
+                contextLabel = sumOfSignificance >= 1 ? 15 : 14;
+              }
+
+              var cx = contexts[contextLabel];
+              var bit = decoder.readBit(cx);
+              coefficentsMagnitude[index] =
+                (coefficentsMagnitude[index] << 1) | bit;
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      runCleanupPass: function BitModel_runCleanupPass() {
+        var decoder = this.decoder;
+        var width = this.width, height = this.height;
+        var neighborsSignificance = this.neighborsSignificance;
+        var significanceState = this.significanceState;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        var oneRowDown = width;
+        var twoRowsDown = width * 2;
+        var threeRowsDown = width * 3;
+        for (var i0 = 0; i0 < height; i0 += 4) {
+          for (var j = 0; j < width; j++) {
+            var index0 = i0 * width + j;
+            // using the property: labels[neighborsSignificance[index]] == 0
+            // when neighborsSignificance[index] == 0
+            var allEmpty = i0 + 3 < height &&
+              processingFlags[index0] == 0 &&
+              processingFlags[index0 + oneRowDown] == 0 &&
+              processingFlags[index0 + twoRowsDown] == 0 &&
+              processingFlags[index0 + threeRowsDown] == 0 &&
+              neighborsSignificance[index0] == 0 &&
+              neighborsSignificance[index0 + oneRowDown] == 0 &&
+              neighborsSignificance[index0 + twoRowsDown] == 0 &&
+              neighborsSignificance[index0 + threeRowsDown] == 0;
+            var i1 = 0, index = index0;
+            var cx, i;
+            if (allEmpty) {
+              cx = this.runLengthContext;
+              var hasSignificantCoefficent = decoder.readBit(cx);
+              if (!hasSignificantCoefficent) {
+                bitsDecoded[index0]++;
+                bitsDecoded[index0 + oneRowDown]++;
+                bitsDecoded[index0 + twoRowsDown]++;
+                bitsDecoded[index0 + threeRowsDown]++;
+                continue; // next column
+              }
+              cx = this.uniformContext;
+              i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
+              i = i0 + i1;
+              index += i1 * width;
+
+              var sign = this.decodeSignBit(i, j);
+              coefficentsSign[index] = sign;
+              coefficentsMagnitude[index] = 1;
+              this.setNeighborsSignificance(i, j);
+              processingFlags[index] |= firstMagnitudeBitMask;
+
+              index = index0;
+              for (var i2 = i0; i2 <= i; i2++, index += width)
+                bitsDecoded[index]++;
+
+              i1++;
+            }
+            for (; i1 < 4; i1++, index += width) {
+              i = i0 + i1;
+              if (i >= height)
+                break;
+
+              if (coefficentsMagnitude[index] ||
+                (processingFlags[index] & processedMask) != 0)
+                continue;
+
+              var contextLabel = labels[neighborsSignificance[index]];
+              cx = contexts[contextLabel];
+              var decision = decoder.readBit(cx);
+              if (decision == 1) {
+                var sign = this.decodeSignBit(i, j);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+            }
+          }
+        }
+      }
+    };
+
+    return BitModel;
+  })();
+
+  // Section F, Discrete wavelet transofrmation
+  var Transform = (function TransformClosure() {
+    function Transform() {
+    }
+    Transform.prototype.calculate =
+      function transformCalculate(subbands, u0, v0) {
+      var ll = subbands[0];
+      for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
+        ll = this.iterate(ll, subbands[i], subbands[i + 1],
+                          subbands[i + 2], u0, v0);
+      }
+      return ll;
+    };
+    Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
+                                                            u0, v0) {
+      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
+      var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
+      var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
+      var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
+
+      // Section F.3.3 interleave
+      var width = llWidth + hlWidth;
+      var height = llHeight + lhHeight;
+      var items = new Float32Array(width * height);
+      for (var i = 0, ii = llHeight; i < ii; i++) {
+        var k = i * llWidth, l = i * 2 * width;
+        for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
+          items[l] = llItems[k];
+      }
+      for (var i = 0, ii = hlHeight; i < ii; i++) {
+        var k = i * hlWidth, l = i * 2 * width + 1;
+        for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
+          items[l] = hlItems[k];
+      }
+      for (var i = 0, ii = lhHeight; i < ii; i++) {
+        var k = i * lhWidth, l = (i * 2 + 1) * width;
+        for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
+          items[l] = lhItems[k];
+      }
+      for (var i = 0, ii = hhHeight; i < ii; i++) {
+        var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
+        for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
+          items[l] = hhItems[k];
+      }
+
+      var bufferPadding = 4;
+      var bufferLength = new Float32Array(Math.max(width, height) +
+        2 * bufferPadding);
+      var buffer = new Float32Array(bufferLength);
+      var bufferOut = new Float32Array(bufferLength);
+
+      // Section F.3.4 HOR_SR
+      for (var v = 0; v < height; v++) {
+        if (width == 1) {
+          // if width = 1, when u0 even keep items as is, when odd divide by 2
+          if ((u0 % 1) != 0) {
+            items[v * width] /= 2;
+          }
+          continue;
+        }
+
+        var k = v * width;
+        var l = bufferPadding;
+        for (var u = 0; u < width; u++, k++, l++)
+          buffer[l] = items[k];
+
+        // Section F.3.7 extending... using max extension of 4
+        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
+        var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+
+        this.filter(buffer, bufferPadding, width, u0, bufferOut);
+
+        k = v * width;
+        l = bufferPadding;
+        for (var u = 0; u < width; u++, k++, l++)
+          items[k] = bufferOut[l];
+      }
+
+      // Section F.3.5 VER_SR
+      for (var u = 0; u < width; u++) {
+        if (height == 1) {
+          // if height = 1, when v0 even keep items as is, when odd divide by 2
+          if ((v0 % 1) != 0) {
+            items[u] /= 2;
+          }
+          continue;
+        }
+
+        var k = u;
+        var l = bufferPadding;
+        for (var v = 0; v < height; v++, k += width, l++)
+          buffer[l] = items[k];
+
+        // Section F.3.7 extending... using max extension of 4
+        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
+        var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+        buffer[i1--] = buffer[j1++];
+        buffer[j2++] = buffer[i2--];
+
+        this.filter(buffer, bufferPadding, height, v0, bufferOut);
+
+        k = u;
+        l = bufferPadding;
+        for (var v = 0; v < height; v++, k += width, l++)
+          items[k] = bufferOut[l];
+      }
+      return {
+        width: width,
+        height: height,
+        items: items
+      };
+    };
+    return Transform;
+  })();
+
+  // Section 3.8.2 Irreversible 9-7 filter
+  var IrreversibleTransform = (function IrreversibleTransformClosure() {
+    function IrreversibleTransform() {
+      Transform.call(this);
+    }
+
+    IrreversibleTransform.prototype = Object.create(Transform.prototype);
+    IrreversibleTransform.prototype.filter =
+      function irreversibleTransformFilter(y, offset, length, i0, x) {
+      var i0_ = Math.floor(i0 / 2);
+      var i1_ = Math.floor((i0 + length) / 2);
+      var offset_ = offset - (i0 % 1);
+
+      var alpha = -1.586134342059924;
+      var beta = -0.052980118572961;
+      var gamma = 0.882911075530934;
+      var delta = 0.443506852043971;
+      var K = 1.230174104914001;
+      var K_ = 1 / K;
+
+      // step 1
+      var j = offset_ - 2;
+      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
+        x[j] = K * y[j];
+
+      // step 2
+      var j = offset_ - 3;
+      for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
+        x[j] = K_ * y[j];
+
+      // step 3
+      var j = offset_ - 2;
+      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
+        x[j] -= delta * (x[j - 1] + x[j + 1]);
+
+      // step 4
+      var j = offset_ - 1;
+      for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
+        x[j] -= gamma * (x[j - 1] + x[j + 1]);
+
+      // step 5
+      var j = offset_;
+      for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
+        x[j] -= beta * (x[j - 1] + x[j + 1]);
+
+      // step 6
+      var j = offset_ + 1;
+      for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
+        x[j] -= alpha * (x[j - 1] + x[j + 1]);
+    };
+
+    return IrreversibleTransform;
+  })();
+
+  // Section 3.8.1 Reversible 5-3 filter
+  var ReversibleTransform = (function ReversibleTransformClosure() {
+    function ReversibleTransform() {
+      Transform.call(this);
+    }
+
+    ReversibleTransform.prototype = Object.create(Transform.prototype);
+    ReversibleTransform.prototype.filter =
+      function reversibleTransformFilter(y, offset, length, i0, x) {
+      var i0_ = Math.floor(i0 / 2);
+      var i1_ = Math.floor((i0 + length) / 2);
+      var offset_ = offset - (i0 % 1);
+
+      for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
+        x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
+
+      for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
+        x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
+    };
+
+    return ReversibleTransform;
+  })();
+
+  return JpxImage;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var bidi = PDFJS.bidi = (function bidiClosure() {
+  // Character types for symbols from 0000 to 00FF.
+  var baseTypes = [
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
+    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
+    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
+    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
+    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
+    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
+  ];
+
+  // Character types for symbols from 0600 to 06FF
+  var arabicTypes = [
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
+    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
+    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
+  ];
+
+  function isOdd(i) {
+    return (i & 1) != 0;
+  }
+
+  function isEven(i) {
+    return (i & 1) == 0;
+  }
+
+  function findUnequal(arr, start, value) {
+    var j;
+    for (var j = start, jj = arr.length; j < jj; ++j) {
+      if (arr[j] != value)
+        return j;
+    }
+    return j;
+  }
+
+  function setValues(arr, start, end, value) {
+    for (var j = start; j < end; ++j) {
+      arr[j] = value;
+    }
+  }
+
+  function reverseValues(arr, start, end) {
+    for (var i = start, j = end - 1; i < j; ++i, --j) {
+      var temp = arr[i];
+      arr[i] = arr[j];
+      arr[j] = temp;
+    }
+  }
+
+  function mirrorGlyphs(c) {
+    /*
+     # BidiMirroring-1.txt
+     0028; 0029 # LEFT PARENTHESIS
+     0029; 0028 # RIGHT PARENTHESIS
+     003C; 003E # LESS-THAN SIGN
+     003E; 003C # GREATER-THAN SIGN
+     005B; 005D # LEFT SQUARE BRACKET
+     005D; 005B # RIGHT SQUARE BRACKET
+     007B; 007D # LEFT CURLY BRACKET
+     007D; 007B # RIGHT CURLY BRACKET
+     00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+     00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+     */
+    switch (c) {
+      case '(':
+        return ')';
+      case ')':
+        return '(';
+      case '<':
+        return '>';
+      case '>':
+        return '<';
+      case ']':
+        return '[';
+      case '[':
+        return ']';
+      case '}':
+        return '{';
+      case '{':
+        return '}';
+      case '\u00AB':
+        return '\u00BB';
+      case '\u00BB':
+        return '\u00AB';
+      default:
+        return c;
+    }
+  }
+
+  function bidi(text, startLevel) {
+    var str = text.str;
+    var strLength = str.length;
+    if (strLength == 0)
+      return str;
+
+    // get types, fill arrays
+
+    var chars = [];
+    var types = [];
+    var oldtypes = [];
+    var numBidi = 0;
+
+    for (var i = 0; i < strLength; ++i) {
+      chars[i] = str.charAt(i);
+
+      var charCode = str.charCodeAt(i);
+      var charType = 'L';
+      if (charCode <= 0x00ff)
+        charType = baseTypes[charCode];
+      else if (0x0590 <= charCode && charCode <= 0x05f4)
+        charType = 'R';
+      else if (0x0600 <= charCode && charCode <= 0x06ff)
+        charType = arabicTypes[charCode & 0xff];
+      else if (0x0700 <= charCode && charCode <= 0x08AC)
+        charType = 'AL';
+
+      if (charType == 'R' || charType == 'AL' || charType == 'AN')
+        numBidi++;
+
+      oldtypes[i] = types[i] = charType;
+    }
+
+    // detect the bidi method
+    //  if there are no rtl characters then no bidi needed
+    //  if less than 30% chars are rtl then string is primarily ltr
+    //  if more than 30% chars are rtl then string is primarily rtl
+    if (numBidi == 0) {
+      text.direction = 'ltr';
+      return str;
+    }
+
+    if (startLevel == -1) {
+      if ((strLength / numBidi) < 0.3) {
+        text.direction = 'ltr';
+        startLevel = 0;
+      } else {
+        text.direction = 'rtl';
+        startLevel = 1;
+      }
+    }
+
+    var levels = [];
+
+    for (var i = 0; i < strLength; ++i) {
+      levels[i] = startLevel;
+    }
+
+    /*
+     X1-X10: skip most of this, since we are NOT doing the embeddings.
+     */
+
+    var e = isOdd(startLevel) ? 'R' : 'L';
+    var sor = e;
+    var eor = sor;
+
+    /*
+     W1. Examine each non-spacing mark (NSM) in the level run, and change the
+     type of the NSM to the type of the previous character. If the NSM is at the
+     start of the level run, it will get the type of sor.
+     */
+
+    var lastType = sor;
+    for (var i = 0; i < strLength; ++i) {
+      if (types[i] == 'NSM')
+        types[i] = lastType;
+      else
+        lastType = types[i];
+    }
+
+    /*
+     W2. Search backwards from each instance of a European number until the
+     first strong type (R, L, AL, or sor) is found.  If an AL is found, change
+     the type of the European number to Arabic number.
+     */
+
+    var lastType = sor;
+    for (var i = 0; i < strLength; ++i) {
+      var t = types[i];
+      if (t == 'EN')
+        types[i] = (lastType == 'AL') ? 'AN' : 'EN';
+      else if (t == 'R' || t == 'L' || t == 'AL')
+        lastType = t;
+    }
+
+    /*
+     W3. Change all ALs to R.
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      var t = types[i];
+      if (t == 'AL')
+        types[i] = 'R';
+    }
+
+    /*
+     W4. A single European separator between two European numbers changes to a
+     European number. A single common separator between two numbers of the same
+     type changes to that type:
+     */
+
+    for (var i = 1; i < strLength - 1; ++i) {
+      if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
+        types[i] = 'EN';
+      if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
+          types[i + 1] == types[i - 1])
+        types[i] = types[i - 1];
+    }
+
+    /*
+     W5. A sequence of European terminators adjacent to European numbers changes
+     to all European numbers:
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      if (types[i] == 'EN') {
+        // do before
+        for (var j = i - 1; j >= 0; --j) {
+          if (types[j] != 'ET')
+            break;
+          types[j] = 'EN';
+        }
+        // do after
+        for (var j = i + 1; j < strLength; --j) {
+          if (types[j] != 'ET')
+            break;
+          types[j] = 'EN';
+        }
+      }
+    }
+
+    /*
+     W6. Otherwise, separators and terminators change to Other Neutral:
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      var t = types[i];
+      if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
+        types[i] = 'ON';
+    }
+
+    /*
+     W7. Search backwards from each instance of a European number until the
+     first strong type (R, L, or sor) is found. If an L is found,  then change
+     the type of the European number to L.
+     */
+
+    var lastType = sor;
+    for (var i = 0; i < strLength; ++i) {
+      var t = types[i];
+      if (t == 'EN')
+        types[i] = (lastType == 'L') ? 'L' : 'EN';
+      else if (t == 'R' || t == 'L')
+        lastType = t;
+    }
+
+    /*
+     N1. A sequence of neutrals takes the direction of the surrounding strong
+     text if the text on both sides has the same direction. European and Arabic
+     numbers are treated as though they were R. Start-of-level-run (sor) and
+     end-of-level-run (eor) are used at level run boundaries.
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      if (types[i] == 'ON') {
+        var end = findUnequal(types, i + 1, 'ON');
+        var before = sor;
+        if (i > 0)
+          before = types[i - 1];
+        var after = eor;
+        if (end + 1 < strLength)
+          after = types[end + 1];
+        if (before != 'L')
+          before = 'R';
+        if (after != 'L')
+          after = 'R';
+        if (before == after)
+          setValues(types, i, end, before);
+        i = end - 1; // reset to end (-1 so next iteration is ok)
+      }
+    }
+
+    /*
+     N2. Any remaining neutrals take the embedding direction.
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      if (types[i] == 'ON')
+        types[i] = e;
+    }
+
+    /*
+     I1. For all characters with an even (left-to-right) embedding direction,
+     those of type R go up one level and those of type AN or EN go up two
+     levels.
+     I2. For all characters with an odd (right-to-left) embedding direction,
+     those of type L, EN or AN go up one level.
+     */
+
+    for (var i = 0; i < strLength; ++i) {
+      var t = types[i];
+      if (isEven(levels[i])) {
+        if (t == 'R') {
+          levels[i] += 1;
+        } else if (t == 'AN' || t == 'EN') {
+          levels[i] += 2;
+        }
+      } else { // isOdd, so
+        if (t == 'L' || t == 'AN' || t == 'EN') {
+          levels[i] += 1;
+        }
+      }
+    }
+
+    /*
+     L1. On each line, reset the embedding level of the following characters to
+     the paragraph embedding level:
+
+     segment separators,
+     paragraph separators,
+     any sequence of whitespace characters preceding a segment separator or
+     paragraph separator, and any sequence of white space characters at the end
+     of the line.
+     */
+
+    // don't bother as text is only single line
+
+    /*
+     L2. From the highest level found in the text to the lowest odd level on
+     each line, reverse any contiguous sequence of characters that are at that
+     level or higher.
+     */
+
+    // find highest level & lowest odd level
+
+    var highestLevel = -1;
+    var lowestOddLevel = 99;
+    for (var i = 0, ii = levels.length; i < ii; ++i) {
+      var level = levels[i];
+      if (highestLevel < level)
+        highestLevel = level;
+      if (lowestOddLevel > level && isOdd(level))
+        lowestOddLevel = level;
+    }
+
+    // now reverse between those limits
+
+    for (var level = highestLevel; level >= lowestOddLevel; --level) {
+      // find segments to reverse
+      var start = -1;
+      for (var i = 0, ii = levels.length; i < ii; ++i) {
+        if (levels[i] < level) {
+          if (start >= 0) {
+            reverseValues(chars, start, i);
+            start = -1;
+          }
+        } else if (start < 0) {
+          start = i;
+        }
+      }
+      if (start >= 0) {
+        reverseValues(chars, start, levels.length);
+      }
+    }
+
+    /*
+     L3. Combining marks applied to a right-to-left base character will at this
+     point precede their base character. If the rendering engine expects them to
+     follow the base characters in the final display process, then the ordering
+     of the marks and the base character must be reversed.
+     */
+
+    // don't bother for now
+
+    /*
+     L4. A character that possesses the mirrored property as specified by
+     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
+     directionality of that character is R.
+     */
+
+    // don't mirror as characters are already mirrored in the pdf
+
+    // Finally, return string
+
+    var result = '';
+    for (var i = 0, ii = chars.length; i < ii; ++i) {
+      var ch = chars[i];
+      if (ch != '<' && ch != '>')
+        result += ch;
+    }
+    return result;
+  }
+
+  return bidi;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+'use strict';
+
+var Metadata = PDFJS.Metadata = (function MetadataClosure() {
+  function fixMetadata(meta) {
+    return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
+      var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
+                                function(code, d1, d2, d3) {
+        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+      });
+      var chars = '';
+      for (var i = 0; i < bytes.length; i += 2) {
+        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+        chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
+          code != 38 && false ? String.fromCharCode(code) :
+          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
+      }
+      return '>' + chars;
+    });
+  }
+
+  function Metadata(meta) {
+    if (typeof meta === 'string') {
+      // Ghostscript produces invalid metadata
+      meta = fixMetadata(meta);
+
+      var parser = new DOMParser();
+      meta = parser.parseFromString(meta, 'application/xml');
+    } else if (!(meta instanceof Document)) {
+      error('Metadata: Invalid metadata object');
+    }
+
+    this.metaDocument = meta;
+    this.metadata = {};
+    this.parse();
+  }
+
+  Metadata.prototype = {
+    parse: function Metadata_parse() {
+      var doc = this.metaDocument;
+      var rdf = doc.documentElement;
+
+      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
+        rdf = rdf.firstChild;
+        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
+          rdf = rdf.nextSibling;
+      }
+
+      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
+      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
+        return;
+
+      var childNodes = rdf.childNodes, desc, namespace, entries, entry;
+
+      for (var i = 0, length = childNodes.length; i < length; i++) {
+        desc = childNodes[i];
+        if (desc.nodeName.toLowerCase() !== 'rdf:description')
+          continue;
+
+        entries = [];
+        for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
+          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text')
+            entries.push(desc.childNodes[ii]);
+        }
+
+        for (ii = 0, iLength = entries.length; ii < iLength; ii++) {
+          var entry = entries[ii];
+          var name = entry.nodeName.toLowerCase();
+          this.metadata[name] = entry.textContent.trim();
+        }
+      }
+    },
+
+    get: function Metadata_get(name) {
+      return this.metadata[name] || null;
+    },
+
+    has: function Metadata_has(name) {
+      return typeof this.metadata[name] !== 'undefined';
+    }
+  };
+
+  return Metadata;
+})();
+
+}).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window);
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/raytrace.js b/suite/cts/deviceTests/browserbench/assets/octane/raytrace.js
new file mode 100644
index 0000000..971ef72
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/raytrace.js
@@ -0,0 +1,904 @@
+// The ray tracer code in this file is written by Adam Burmister. It
+// is available in its original form from:
+//
+//   http://labs.flog.nz.co/raytracer/
+//
+// It has been modified slightly by Google to work as a standalone
+// benchmark, but the all the computational code remains
+// untouched. This file also contains a copy of parts of the Prototype
+// JavaScript framework which is used by the ray tracer.
+
+var RayTrace = new BenchmarkSuite('RayTrace', 739989, [
+  new Benchmark('RayTrace', renderScene)
+]);
+
+
+// Variable used to hold a number that can be used to verify that
+// the scene was ray traced correctly.
+var checkNumber;
+
+
+// ------------------------------------------------------------------------
+// ------------------------------------------------------------------------
+
+// The following is a copy of parts of the Prototype JavaScript library:
+
+// Prototype JavaScript framework, version 1.5.0
+// (c) 2005-2007 Sam Stephenson
+//
+// Prototype is freely distributable under the terms of an MIT-style license.
+// For details, see the Prototype web site: http://prototype.conio.net/
+
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+};
+
+
+Object.extend = function(destination, source) {
+  for (var property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+};
+
+
+// ------------------------------------------------------------------------
+// ------------------------------------------------------------------------
+
+// The rest of this file is the actual ray tracer written by Adam
+// Burmister. It's a concatenation of the following files:
+//
+//   flog/color.js
+//   flog/light.js
+//   flog/vector.js
+//   flog/ray.js
+//   flog/scene.js
+//   flog/material/basematerial.js
+//   flog/material/solid.js
+//   flog/material/chessboard.js
+//   flog/shape/baseshape.js
+//   flog/shape/sphere.js
+//   flog/shape/plane.js
+//   flog/intersectioninfo.js
+//   flog/camera.js
+//   flog/background.js
+//   flog/engine.js
+
+
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Color = Class.create();
+
+Flog.RayTracer.Color.prototype = {
+    red : 0.0,
+    green : 0.0,
+    blue : 0.0,
+
+    initialize : function(r, g, b) {
+        if(!r) r = 0.0;
+        if(!g) g = 0.0;
+        if(!b) b = 0.0;
+
+        this.red = r;
+        this.green = g;
+        this.blue = b;
+    },
+
+    add : function(c1, c2){
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red + c2.red;
+        result.green = c1.green + c2.green;
+        result.blue = c1.blue + c2.blue;
+
+        return result;
+    },
+
+    addScalar: function(c1, s){
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red + s;
+        result.green = c1.green + s;
+        result.blue = c1.blue + s;
+
+        result.limit();
+
+        return result;
+    },
+
+    subtract: function(c1, c2){
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red - c2.red;
+        result.green = c1.green - c2.green;
+        result.blue = c1.blue - c2.blue;
+
+        return result;
+    },
+
+    multiply : function(c1, c2) {
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red * c2.red;
+        result.green = c1.green * c2.green;
+        result.blue = c1.blue * c2.blue;
+
+        return result;
+    },
+
+    multiplyScalar : function(c1, f) {
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red * f;
+        result.green = c1.green * f;
+        result.blue = c1.blue * f;
+
+        return result;
+    },
+
+    divideFactor : function(c1, f) {
+        var result = new Flog.RayTracer.Color(0,0,0);
+
+        result.red = c1.red / f;
+        result.green = c1.green / f;
+        result.blue = c1.blue / f;
+
+        return result;
+    },
+
+    limit: function(){
+        this.red = (this.red > 0.0) ? ( (this.red > 1.0) ? 1.0 : this.red ) : 0.0;
+        this.green = (this.green > 0.0) ? ( (this.green > 1.0) ? 1.0 : this.green ) : 0.0;
+        this.blue = (this.blue > 0.0) ? ( (this.blue > 1.0) ? 1.0 : this.blue ) : 0.0;
+    },
+
+    distance : function(color) {
+        var d = Math.abs(this.red - color.red) + Math.abs(this.green - color.green) + Math.abs(this.blue - color.blue);
+        return d;
+    },
+
+    blend: function(c1, c2, w){
+        var result = new Flog.RayTracer.Color(0,0,0);
+        result = Flog.RayTracer.Color.prototype.add(
+                    Flog.RayTracer.Color.prototype.multiplyScalar(c1, 1 - w),
+                    Flog.RayTracer.Color.prototype.multiplyScalar(c2, w)
+                  );
+        return result;
+    },
+
+    brightness : function() {
+        var r = Math.floor(this.red*255);
+        var g = Math.floor(this.green*255);
+        var b = Math.floor(this.blue*255);
+        return (r * 77 + g * 150 + b * 29) >> 8;
+    },
+
+    toString : function () {
+        var r = Math.floor(this.red*255);
+        var g = Math.floor(this.green*255);
+        var b = Math.floor(this.blue*255);
+
+        return "rgb("+ r +","+ g +","+ b +")";
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Light = Class.create();
+
+Flog.RayTracer.Light.prototype = {
+    position: null,
+    color: null,
+    intensity: 10.0,
+
+    initialize : function(pos, color, intensity) {
+        this.position = pos;
+        this.color = color;
+        this.intensity = (intensity ? intensity : 10.0);
+    },
+
+    toString : function () {
+        return 'Light [' + this.position.x + ',' + this.position.y + ',' + this.position.z + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Vector = Class.create();
+
+Flog.RayTracer.Vector.prototype = {
+    x : 0.0,
+    y : 0.0,
+    z : 0.0,
+
+    initialize : function(x, y, z) {
+        this.x = (x ? x : 0);
+        this.y = (y ? y : 0);
+        this.z = (z ? z : 0);
+    },
+
+    copy: function(vector){
+        this.x = vector.x;
+        this.y = vector.y;
+        this.z = vector.z;
+    },
+
+    normalize : function() {
+        var m = this.magnitude();
+        return new Flog.RayTracer.Vector(this.x / m, this.y / m, this.z / m);
+    },
+
+    magnitude : function() {
+        return Math.sqrt((this.x * this.x) + (this.y * this.y) + (this.z * this.z));
+    },
+
+    cross : function(w) {
+        return new Flog.RayTracer.Vector(
+                                            -this.z * w.y + this.y * w.z,
+                                           this.z * w.x - this.x * w.z,
+                                          -this.y * w.x + this.x * w.y);
+    },
+
+    dot : function(w) {
+        return this.x * w.x + this.y * w.y + this.z * w.z;
+    },
+
+    add : function(v, w) {
+        return new Flog.RayTracer.Vector(w.x + v.x, w.y + v.y, w.z + v.z);
+    },
+
+    subtract : function(v, w) {
+        if(!w || !v) throw 'Vectors must be defined [' + v + ',' + w + ']';
+        return new Flog.RayTracer.Vector(v.x - w.x, v.y - w.y, v.z - w.z);
+    },
+
+    multiplyVector : function(v, w) {
+        return new Flog.RayTracer.Vector(v.x * w.x, v.y * w.y, v.z * w.z);
+    },
+
+    multiplyScalar : function(v, w) {
+        return new Flog.RayTracer.Vector(v.x * w, v.y * w, v.z * w);
+    },
+
+    toString : function () {
+        return 'Vector [' + this.x + ',' + this.y + ',' + this.z + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Ray = Class.create();
+
+Flog.RayTracer.Ray.prototype = {
+    position : null,
+    direction : null,
+    initialize : function(pos, dir) {
+        this.position = pos;
+        this.direction = dir;
+    },
+
+    toString : function () {
+        return 'Ray [' + this.position + ',' + this.direction + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Scene = Class.create();
+
+Flog.RayTracer.Scene.prototype = {
+    camera : null,
+    shapes : [],
+    lights : [],
+    background : null,
+
+    initialize : function() {
+        this.camera = new Flog.RayTracer.Camera(
+            new Flog.RayTracer.Vector(0,0,-5),
+            new Flog.RayTracer.Vector(0,0,1),
+            new Flog.RayTracer.Vector(0,1,0)
+        );
+        this.shapes = new Array();
+        this.lights = new Array();
+        this.background = new Flog.RayTracer.Background(new Flog.RayTracer.Color(0,0,0.5), 0.2);
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+if(typeof(Flog.RayTracer.Material) == 'undefined') Flog.RayTracer.Material = {};
+
+Flog.RayTracer.Material.BaseMaterial = Class.create();
+
+Flog.RayTracer.Material.BaseMaterial.prototype = {
+
+    gloss: 2.0,             // [0...infinity] 0 = matt
+    transparency: 0.0,      // 0=opaque
+    reflection: 0.0,        // [0...infinity] 0 = no reflection
+    refraction: 0.50,
+    hasTexture: false,
+
+    initialize : function() {
+
+    },
+
+    getColor: function(u, v){
+
+    },
+
+    wrapUp: function(t){
+        t = t % 2.0;
+        if(t < -1) t += 2.0;
+        if(t >= 1) t -= 2.0;
+        return t;
+    },
+
+    toString : function () {
+        return 'Material [gloss=' + this.gloss + ', transparency=' + this.transparency + ', hasTexture=' + this.hasTexture +']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Material.Solid = Class.create();
+
+Flog.RayTracer.Material.Solid.prototype = Object.extend(
+    new Flog.RayTracer.Material.BaseMaterial(), {
+        initialize : function(color, reflection, refraction, transparency, gloss) {
+            this.color = color;
+            this.reflection = reflection;
+            this.transparency = transparency;
+            this.gloss = gloss;
+            this.hasTexture = false;
+        },
+
+        getColor: function(u, v){
+            return this.color;
+        },
+
+        toString : function () {
+            return 'SolidMaterial [gloss=' + this.gloss + ', transparency=' + this.transparency + ', hasTexture=' + this.hasTexture +']';
+        }
+    }
+);
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Material.Chessboard = Class.create();
+
+Flog.RayTracer.Material.Chessboard.prototype = Object.extend(
+    new Flog.RayTracer.Material.BaseMaterial(), {
+        colorEven: null,
+        colorOdd: null,
+        density: 0.5,
+
+        initialize : function(colorEven, colorOdd, reflection, transparency, gloss, density) {
+            this.colorEven = colorEven;
+            this.colorOdd = colorOdd;
+            this.reflection = reflection;
+            this.transparency = transparency;
+            this.gloss = gloss;
+            this.density = density;
+            this.hasTexture = true;
+        },
+
+        getColor: function(u, v){
+            var t = this.wrapUp(u * this.density) * this.wrapUp(v * this.density);
+
+            if(t < 0.0)
+                return this.colorEven;
+            else
+                return this.colorOdd;
+        },
+
+        toString : function () {
+            return 'ChessMaterial [gloss=' + this.gloss + ', transparency=' + this.transparency + ', hasTexture=' + this.hasTexture +']';
+        }
+    }
+);
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+if(typeof(Flog.RayTracer.Shape) == 'undefined') Flog.RayTracer.Shape = {};
+
+Flog.RayTracer.Shape.Sphere = Class.create();
+
+Flog.RayTracer.Shape.Sphere.prototype = {
+    initialize : function(pos, radius, material) {
+        this.radius = radius;
+        this.position = pos;
+        this.material = material;
+    },
+
+    intersect: function(ray){
+        var info = new Flog.RayTracer.IntersectionInfo();
+        info.shape = this;
+
+        var dst = Flog.RayTracer.Vector.prototype.subtract(ray.position, this.position);
+
+        var B = dst.dot(ray.direction);
+        var C = dst.dot(dst) - (this.radius * this.radius);
+        var D = (B * B) - C;
+
+        if(D > 0){ // intersection!
+            info.isHit = true;
+            info.distance = (-B) - Math.sqrt(D);
+            info.position = Flog.RayTracer.Vector.prototype.add(
+                                                ray.position,
+                                                Flog.RayTracer.Vector.prototype.multiplyScalar(
+                                                    ray.direction,
+                                                    info.distance
+                                                )
+                                            );
+            info.normal = Flog.RayTracer.Vector.prototype.subtract(
+                                            info.position,
+                                            this.position
+                                        ).normalize();
+
+            info.color = this.material.getColor(0,0);
+        } else {
+            info.isHit = false;
+        }
+        return info;
+    },
+
+    toString : function () {
+        return 'Sphere [position=' + this.position + ', radius=' + this.radius + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+if(typeof(Flog.RayTracer.Shape) == 'undefined') Flog.RayTracer.Shape = {};
+
+Flog.RayTracer.Shape.Plane = Class.create();
+
+Flog.RayTracer.Shape.Plane.prototype = {
+    d: 0.0,
+
+    initialize : function(pos, d, material) {
+        this.position = pos;
+        this.d = d;
+        this.material = material;
+    },
+
+    intersect: function(ray){
+        var info = new Flog.RayTracer.IntersectionInfo();
+
+        var Vd = this.position.dot(ray.direction);
+        if(Vd == 0) return info; // no intersection
+
+        var t = -(this.position.dot(ray.position) + this.d) / Vd;
+        if(t <= 0) return info;
+
+        info.shape = this;
+        info.isHit = true;
+        info.position = Flog.RayTracer.Vector.prototype.add(
+                                            ray.position,
+                                            Flog.RayTracer.Vector.prototype.multiplyScalar(
+                                                ray.direction,
+                                                t
+                                            )
+                                        );
+        info.normal = this.position;
+        info.distance = t;
+
+        if(this.material.hasTexture){
+            var vU = new Flog.RayTracer.Vector(this.position.y, this.position.z, -this.position.x);
+            var vV = vU.cross(this.position);
+            var u = info.position.dot(vU);
+            var v = info.position.dot(vV);
+            info.color = this.material.getColor(u,v);
+        } else {
+            info.color = this.material.getColor(0,0);
+        }
+
+        return info;
+    },
+
+    toString : function () {
+        return 'Plane [' + this.position + ', d=' + this.d + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.IntersectionInfo = Class.create();
+
+Flog.RayTracer.IntersectionInfo.prototype = {
+    isHit: false,
+    hitCount: 0,
+    shape: null,
+    position: null,
+    normal: null,
+    color: null,
+    distance: null,
+
+    initialize : function() {
+        this.color = new Flog.RayTracer.Color(0,0,0);
+    },
+
+    toString : function () {
+        return 'Intersection [' + this.position + ']';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Camera = Class.create();
+
+Flog.RayTracer.Camera.prototype = {
+    position: null,
+    lookAt: null,
+    equator: null,
+    up: null,
+    screen: null,
+
+    initialize : function(pos, lookAt, up) {
+        this.position = pos;
+        this.lookAt = lookAt;
+        this.up = up;
+        this.equator = lookAt.normalize().cross(this.up);
+        this.screen = Flog.RayTracer.Vector.prototype.add(this.position, this.lookAt);
+    },
+
+    getRay: function(vx, vy){
+        var pos = Flog.RayTracer.Vector.prototype.subtract(
+            this.screen,
+            Flog.RayTracer.Vector.prototype.subtract(
+                Flog.RayTracer.Vector.prototype.multiplyScalar(this.equator, vx),
+                Flog.RayTracer.Vector.prototype.multiplyScalar(this.up, vy)
+            )
+        );
+        pos.y = pos.y * -1;
+        var dir = Flog.RayTracer.Vector.prototype.subtract(
+            pos,
+            this.position
+        );
+
+        var ray = new Flog.RayTracer.Ray(pos, dir.normalize());
+
+        return ray;
+    },
+
+    toString : function () {
+        return 'Ray []';
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Background = Class.create();
+
+Flog.RayTracer.Background.prototype = {
+    color : null,
+    ambience : 0.0,
+
+    initialize : function(color, ambience) {
+        this.color = color;
+        this.ambience = ambience;
+    }
+}
+/* Fake a Flog.* namespace */
+if(typeof(Flog) == 'undefined') var Flog = {};
+if(typeof(Flog.RayTracer) == 'undefined') Flog.RayTracer = {};
+
+Flog.RayTracer.Engine = Class.create();
+
+Flog.RayTracer.Engine.prototype = {
+    canvas: null, /* 2d context we can render to */
+
+    initialize: function(options){
+        this.options = Object.extend({
+                canvasHeight: 100,
+                canvasWidth: 100,
+                pixelWidth: 2,
+                pixelHeight: 2,
+                renderDiffuse: false,
+                renderShadows: false,
+                renderHighlights: false,
+                renderReflections: false,
+                rayDepth: 2
+            }, options || {});
+
+        this.options.canvasHeight /= this.options.pixelHeight;
+        this.options.canvasWidth /= this.options.pixelWidth;
+
+        /* TODO: dynamically include other scripts */
+    },
+
+    setPixel: function(x, y, color){
+        var pxW, pxH;
+        pxW = this.options.pixelWidth;
+        pxH = this.options.pixelHeight;
+
+        if (this.canvas) {
+          this.canvas.fillStyle = color.toString();
+          this.canvas.fillRect (x * pxW, y * pxH, pxW, pxH);
+        } else {
+          if (x ===  y) {
+            checkNumber += color.brightness();
+          }
+          // print(x * pxW, y * pxH, pxW, pxH);
+        }
+    },
+
+    renderScene: function(scene, canvas){
+        checkNumber = 0;
+        /* Get canvas */
+        if (canvas) {
+          this.canvas = canvas.getContext("2d");
+        } else {
+          this.canvas = null;
+        }
+
+        var canvasHeight = this.options.canvasHeight;
+        var canvasWidth = this.options.canvasWidth;
+
+        for(var y=0; y < canvasHeight; y++){
+            for(var x=0; x < canvasWidth; x++){
+                var yp = y * 1.0 / canvasHeight * 2 - 1;
+          		var xp = x * 1.0 / canvasWidth * 2 - 1;
+
+          		var ray = scene.camera.getRay(xp, yp);
+
+          		var color = this.getPixelColor(ray, scene);
+
+            	this.setPixel(x, y, color);
+            }
+        }
+        if (checkNumber !== 2321) {
+          throw new Error("Scene rendered incorrectly");
+        }
+    },
+
+    getPixelColor: function(ray, scene){
+        var info = this.testIntersection(ray, scene, null);
+        if(info.isHit){
+            var color = this.rayTrace(info, ray, scene, 0);
+            return color;
+        }
+        return scene.background.color;
+    },
+
+    testIntersection: function(ray, scene, exclude){
+        var hits = 0;
+        var best = new Flog.RayTracer.IntersectionInfo();
+        best.distance = 2000;
+
+        for(var i=0; i<scene.shapes.length; i++){
+            var shape = scene.shapes[i];
+
+            if(shape != exclude){
+                var info = shape.intersect(ray);
+                if(info.isHit && info.distance >= 0 && info.distance < best.distance){
+                    best = info;
+                    hits++;
+                }
+            }
+        }
+        best.hitCount = hits;
+        return best;
+    },
+
+    getReflectionRay: function(P,N,V){
+        var c1 = -N.dot(V);
+        var R1 = Flog.RayTracer.Vector.prototype.add(
+            Flog.RayTracer.Vector.prototype.multiplyScalar(N, 2*c1),
+            V
+        );
+        return new Flog.RayTracer.Ray(P, R1);
+    },
+
+    rayTrace: function(info, ray, scene, depth){
+        // Calc ambient
+        var color = Flog.RayTracer.Color.prototype.multiplyScalar(info.color, scene.background.ambience);
+        var oldColor = color;
+        var shininess = Math.pow(10, info.shape.material.gloss + 1);
+
+        for(var i=0; i<scene.lights.length; i++){
+            var light = scene.lights[i];
+
+            // Calc diffuse lighting
+            var v = Flog.RayTracer.Vector.prototype.subtract(
+                                light.position,
+                                info.position
+                            ).normalize();
+
+            if(this.options.renderDiffuse){
+                var L = v.dot(info.normal);
+                if(L > 0.0){
+                    color = Flog.RayTracer.Color.prototype.add(
+                                        color,
+                                        Flog.RayTracer.Color.prototype.multiply(
+                                            info.color,
+                                            Flog.RayTracer.Color.prototype.multiplyScalar(
+                                                light.color,
+                                                L
+                                            )
+                                        )
+                                    );
+                }
+            }
+
+            // The greater the depth the more accurate the colours, but
+            // this is exponentially (!) expensive
+            if(depth <= this.options.rayDepth){
+          // calculate reflection ray
+          if(this.options.renderReflections && info.shape.material.reflection > 0)
+          {
+              var reflectionRay = this.getReflectionRay(info.position, info.normal, ray.direction);
+              var refl = this.testIntersection(reflectionRay, scene, info.shape);
+
+              if (refl.isHit && refl.distance > 0){
+                  refl.color = this.rayTrace(refl, reflectionRay, scene, depth + 1);
+              } else {
+                  refl.color = scene.background.color;
+                        }
+
+                  color = Flog.RayTracer.Color.prototype.blend(
+                    color,
+                    refl.color,
+                    info.shape.material.reflection
+                  );
+          }
+
+                // Refraction
+                /* TODO */
+            }
+
+            /* Render shadows and highlights */
+
+            var shadowInfo = new Flog.RayTracer.IntersectionInfo();
+
+            if(this.options.renderShadows){
+                var shadowRay = new Flog.RayTracer.Ray(info.position, v);
+
+                shadowInfo = this.testIntersection(shadowRay, scene, info.shape);
+                if(shadowInfo.isHit && shadowInfo.shape != info.shape /*&& shadowInfo.shape.type != 'PLANE'*/){
+                    var vA = Flog.RayTracer.Color.prototype.multiplyScalar(color, 0.5);
+                    var dB = (0.5 * Math.pow(shadowInfo.shape.material.transparency, 0.5));
+                    color = Flog.RayTracer.Color.prototype.addScalar(vA,dB);
+                }
+            }
+
+      // Phong specular highlights
+      if(this.options.renderHighlights && !shadowInfo.isHit && info.shape.material.gloss > 0){
+        var Lv = Flog.RayTracer.Vector.prototype.subtract(
+                            info.shape.position,
+                            light.position
+                        ).normalize();
+
+        var E = Flog.RayTracer.Vector.prototype.subtract(
+                            scene.camera.position,
+                            info.shape.position
+                        ).normalize();
+
+        var H = Flog.RayTracer.Vector.prototype.subtract(
+                            E,
+                            Lv
+                        ).normalize();
+
+        var glossWeight = Math.pow(Math.max(info.normal.dot(H), 0), shininess);
+        color = Flog.RayTracer.Color.prototype.add(
+                            Flog.RayTracer.Color.prototype.multiplyScalar(light.color, glossWeight),
+                            color
+                        );
+      }
+        }
+        color.limit();
+        return color;
+    }
+};
+
+
+function renderScene(){
+    var scene = new Flog.RayTracer.Scene();
+
+    scene.camera = new Flog.RayTracer.Camera(
+                        new Flog.RayTracer.Vector(0, 0, -15),
+                        new Flog.RayTracer.Vector(-0.2, 0, 5),
+                        new Flog.RayTracer.Vector(0, 1, 0)
+                    );
+
+    scene.background = new Flog.RayTracer.Background(
+                                new Flog.RayTracer.Color(0.5, 0.5, 0.5),
+                                0.4
+                            );
+
+    var sphere = new Flog.RayTracer.Shape.Sphere(
+        new Flog.RayTracer.Vector(-1.5, 1.5, 2),
+        1.5,
+        new Flog.RayTracer.Material.Solid(
+            new Flog.RayTracer.Color(0,0.5,0.5),
+            0.3,
+            0.0,
+            0.0,
+            2.0
+        )
+    );
+
+    var sphere1 = new Flog.RayTracer.Shape.Sphere(
+        new Flog.RayTracer.Vector(1, 0.25, 1),
+        0.5,
+        new Flog.RayTracer.Material.Solid(
+            new Flog.RayTracer.Color(0.9,0.9,0.9),
+            0.1,
+            0.0,
+            0.0,
+            1.5
+        )
+    );
+
+    var plane = new Flog.RayTracer.Shape.Plane(
+                                new Flog.RayTracer.Vector(0.1, 0.9, -0.5).normalize(),
+                                1.2,
+                                new Flog.RayTracer.Material.Chessboard(
+                                    new Flog.RayTracer.Color(1,1,1),
+                                    new Flog.RayTracer.Color(0,0,0),
+                                    0.2,
+                                    0.0,
+                                    1.0,
+                                    0.7
+                                )
+                            );
+
+    scene.shapes.push(plane);
+    scene.shapes.push(sphere);
+    scene.shapes.push(sphere1);
+
+    var light = new Flog.RayTracer.Light(
+        new Flog.RayTracer.Vector(5, 10, -1),
+        new Flog.RayTracer.Color(0.8, 0.8, 0.8)
+    );
+
+    var light1 = new Flog.RayTracer.Light(
+        new Flog.RayTracer.Vector(-3, 5, -15),
+        new Flog.RayTracer.Color(0.8, 0.8, 0.8),
+        100
+    );
+
+    scene.lights.push(light);
+    scene.lights.push(light1);
+
+    var imageWidth = 100; // $F('imageWidth');
+    var imageHeight = 100; // $F('imageHeight');
+    var pixelSize = "5,5".split(','); //  $F('pixelSize').split(',');
+    var renderDiffuse = true; // $F('renderDiffuse');
+    var renderShadows = true; // $F('renderShadows');
+    var renderHighlights = true; // $F('renderHighlights');
+    var renderReflections = true; // $F('renderReflections');
+    var rayDepth = 2;//$F('rayDepth');
+
+    var raytracer = new Flog.RayTracer.Engine(
+        {
+            canvasWidth: imageWidth,
+            canvasHeight: imageHeight,
+            pixelWidth: pixelSize[0],
+            pixelHeight: pixelSize[1],
+            "renderDiffuse": renderDiffuse,
+            "renderHighlights": renderHighlights,
+            "renderShadows": renderShadows,
+            "renderReflections": renderReflections,
+            "rayDepth": rayDepth
+        }
+    );
+
+    raytracer.renderScene(scene, null, 0);
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/regexp.js b/suite/cts/deviceTests/browserbench/assets/octane/regexp.js
new file mode 100644
index 0000000..f1474bf
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/regexp.js
@@ -0,0 +1,1764 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Automatically generated on 2009-01-30. Manually updated on 2010-09-17.
+
+// This benchmark is generated by loading 50 of the most popular pages
+// on the web and logging all regexp operations performed.  Each
+// operation is given a weight that is calculated from an estimate of
+// the popularity of the pages where it occurs and the number of times
+// it is executed while loading each page.  Furthermore the literal
+// letters in the data are encoded using ROT13 in a way that does not
+// affect how the regexps match their input.  Finally the strings are
+// scrambled to exercise the regexp engine on different input strings.
+
+
+var RegExpSuite = new BenchmarkSuite('RegExp', 910985, [
+  new Benchmark("RegExp", RegExpRun, RegExpSetup, RegExpTearDown, 16)
+]);
+
+var regExpBenchmark = null;
+
+function RegExpSetup() {
+  regExpBenchmark = new RegExpBenchmark();
+  RegExpRun(); // run once to get system initialized
+}
+
+function RegExpRun() {
+  regExpBenchmark.run();
+}
+
+function RegExpTearDown() {
+  regExpBenchmark = null;
+}
+
+// Returns an array of n different variants of the input string str.
+// The variants are computed by randomly rotating one random
+// character.
+function computeInputVariants(str, n) {
+  var variants = [ str ];
+  for (var i = 1; i < n; i++) {
+    var pos = Math.floor(Math.random() * str.length);
+    var chr = String.fromCharCode((str.charCodeAt(pos) + Math.floor(Math.random() * 128)) % 128);
+    variants[i] = str.substring(0, pos) + chr + str.substring(pos + 1, str.length);
+  }
+  return variants;
+}
+
+function RegExpBenchmark() {
+  var re0 = /^ba/;
+  var re1 = /(((\w+):\/\/)([^\/:]*)(:(\d+))?)?([^#?]*)(\?([^#]*))?(#(.*))?/;
+  var re2 = /^\s*|\s*$/g;
+  var re3 = /\bQBZPbageby_cynprubyqre\b/;
+  var re4 = /,/;
+  var re5 = /\bQBZPbageby_cynprubyqre\b/g;
+  var re6 = /^[\s\xa0]+|[\s\xa0]+$/g;
+  var re7 = /(\d*)(\D*)/g;
+  var re8 = /=/;
+  var re9 = /(^|\s)lhv\-h(\s|$)/;
+  var str0 = 'Zbmvyyn/5.0 (Jvaqbjf; H; Jvaqbjf AG 5.1; ra-HF) NccyrJroXvg/528.9 (XUGZY, yvxr Trpxb) Puebzr/2.0.157.0 Fnsnev/528.9';
+  var re10 = /\#/g;
+  var re11 = /\./g;
+  var re12 = /'/g;
+  var re13 = /\?[\w\W]*(sevraqvq|punaaryvq|tebhcvq)=([^\&\?#]*)/i;
+  var str1 = 'Fubpxjnir Synfu 9.0  e115';
+  var re14 = /\s+/g;
+  var re15 = /^\s*(\S*(\s+\S+)*)\s*$/;
+  var re16 = /(-[a-z])/i;
+
+  var s0 = computeInputVariants('pyvpx', 6511);
+  var s1 = computeInputVariants('uggc://jjj.snprobbx.pbz/ybtva.cuc', 1844);
+  var s2 = computeInputVariants('QBZPbageby_cynprubyqre', 739);
+  var s3 = computeInputVariants('uggc://jjj.snprobbx.pbz/', 598);
+  var s4 = computeInputVariants('uggc://jjj.snprobbx.pbz/fepu.cuc', 454);
+  var s5 = computeInputVariants('qqqq, ZZZ q, llll', 352);
+  var s6 = computeInputVariants('vachggrkg QBZPbageby_cynprubyqre', 312);
+  var s7 = computeInputVariants('/ZlFcnprUbzrcntr/Vaqrk-FvgrUbzr,10000000', 282);
+  var s8 = computeInputVariants('vachggrkg', 177);
+  var s9 = computeInputVariants('528.9', 170);
+  var s10 = computeInputVariants('528', 170);
+  var s11 = computeInputVariants('VCPhygher=ra-HF', 156);
+  var s12 = computeInputVariants('CersreerqPhygher=ra-HF', 156);
+  var s13 = computeInputVariants('xrlcerff', 144);
+  var s14 = computeInputVariants('521', 139);
+  var s15 = computeInputVariants(str0, 139);
+  var s16 = computeInputVariants('qvi .so_zrah', 137);
+  var s17 = computeInputVariants('qvi.so_zrah', 137);
+  var s18 = computeInputVariants('uvqqra_ryrz', 117);
+  var s19 = computeInputVariants('sevraqfgre_naba=nvq%3Qn6ss9p85n868ro9s059pn854735956o3%26ers%3Q%26df%3Q%26vpgl%3QHF', 95);
+  var s20 = computeInputVariants('uggc://ubzr.zlfcnpr.pbz/vaqrk.psz', 93);
+  var s21 = computeInputVariants(str1, 92);
+  var s22 = computeInputVariants('svefg', 85);
+  var s23 = computeInputVariants('uggc://cebsvyr.zlfcnpr.pbz/vaqrk.psz', 85);
+  var s24 = computeInputVariants('ynfg', 85);
+  var s25 = computeInputVariants('qvfcynl', 85);
+
+  function runBlock0() {
+    for (var i = 0; i < 6511; i++) {
+      re0.exec(s0[i]);
+    }
+    for (var i = 0; i < 1844; i++) {
+      re1.exec(s1[i]);
+    }
+    for (var i = 0; i < 739; i++) {
+      s2[i].replace(re2, '');
+    }
+    for (var i = 0; i < 598; i++) {
+      re1.exec(s3[i]);
+    }
+    for (var i = 0; i < 454; i++) {
+      re1.exec(s4[i]);
+    }
+    for (var i = 0; i < 352; i++) {
+      /qqqq|qqq|qq|q|ZZZZ|ZZZ|ZZ|Z|llll|ll|l|uu|u|UU|U|zz|z|ff|f|gg|g|sss|ss|s|mmm|mm|m/g.exec(s5[i]);
+    }
+    for (var i = 0; i < 312; i++) {
+      re3.exec(s6[i]);
+    }
+    for (var i = 0; i < 282; i++) {
+      re4.exec(s7[i]);
+    }
+    for (var i = 0; i < 177; i++) {
+      s8[i].replace(re5, '');
+    }
+    for (var i = 0; i < 170; i++) {
+      s9[i].replace(re6, '');
+      re7.exec(s10[i]);
+    }
+    for (var i = 0; i < 156; i++) {
+      re8.exec(s11[i]);
+      re8.exec(s12[i]);
+    }
+    for (var i = 0; i < 144; i++) {
+      re0.exec(s13[i]);
+    }
+    for (var i = 0; i < 139; i++) {
+      s14[i].replace(re6, '');
+      re7.exec(s14[i]);
+      re9.exec('');
+      /JroXvg\/(\S+)/.exec(s15[i]);
+    }
+    for (var i = 0; i < 137; i++) {
+      s16[i].replace(re10, '');
+      s16[i].replace(/\[/g, '');
+      s17[i].replace(re11, '');
+    }
+    for (var i = 0; i < 117; i++) {
+      s18[i].replace(re2, '');
+    }
+    for (var i = 0; i < 95; i++) {
+      /(?:^|;)\s*sevraqfgre_ynat=([^;]*)/.exec(s19[i]);
+    }
+    for (var i = 0; i < 93; i++) {
+      s20[i].replace(re12, '');
+      re13.exec(s20[i]);
+    }
+    for (var i = 0; i < 92; i++) {
+      s21[i].replace(/([a-zA-Z]|\s)+/, '');
+    }
+    for (var i = 0; i < 85; i++) {
+      s22[i].replace(re14, '');
+      s22[i].replace(re15, '');
+      s23[i].replace(re12, '');
+      s24[i].replace(re14, '');
+      s24[i].replace(re15, '');
+      re16.exec(s25[i]);
+      re13.exec(s23[i]);
+    }
+  }
+  var re17 = /(^|[^\\])\"\\\/Qngr\((-?[0-9]+)\)\\\/\"/g;
+  var str2 = '{"anzr":"","ahzoreSbezng":{"PheeraplQrpvznyQvtvgf":2,"PheeraplQrpvznyFrcnengbe":".","VfErnqBayl":gehr,"PheeraplTebhcFvmrf":[3],"AhzoreTebhcFvmrf":[3],"CrepragTebhcFvmrf":[3],"PheeraplTebhcFrcnengbe":",","PheeraplFlzoby":"\xa4","AnAFlzoby":"AnA","PheeraplArtngvirCnggrea":0,"AhzoreArtngvirCnggrea":1,"CrepragCbfvgvirCnggrea":0,"CrepragArtngvirCnggrea":0,"ArtngvirVasvavglFlzoby":"-Vasvavgl","ArtngvirFvta":"-","AhzoreQrpvznyQvtvgf":2,"AhzoreQrpvznyFrcnengbe":".","AhzoreTebhcFrcnengbe":",","PheeraplCbfvgvirCnggrea":0,"CbfvgvirVasvavglFlzoby":"Vasvavgl","CbfvgvirFvta":"+","CrepragQrpvznyQvtvgf":2,"CrepragQrpvznyFrcnengbe":".","CrepragTebhcFrcnengbe":",","CrepragFlzoby":"%","CreZvyyrFlzoby":"\u2030","AngvirQvtvgf":["0","1","2","3","4","5","6","7","8","9"],"QvtvgFhofgvghgvba":1},"qngrGvzrSbezng":{"NZQrfvtangbe":"NZ","Pnyraqne":{"ZvaFhccbegrqQngrGvzr":"@-62135568000000@","ZnkFhccbegrqQngrGvzr":"@253402300799999@","NytbevguzGlcr":1,"PnyraqneGlcr":1,"Renf":[1],"GjbQvtvgLrneZnk":2029,"VfErnqBayl":gehr},"QngrFrcnengbe":"/","SvefgQnlBsJrrx":0,"PnyraqneJrrxEhyr":0,"ShyyQngrGvzrCnggrea":"qqqq, qq ZZZZ llll UU:zz:ff","YbatQngrCnggrea":"qqqq, qq ZZZZ llll","YbatGvzrCnggrea":"UU:zz:ff","ZbaguQnlCnggrea":"ZZZZ qq","CZQrfvtangbe":"CZ","ESP1123Cnggrea":"qqq, qq ZZZ llll UU\':\'zz\':\'ff \'TZG\'","FubegQngrCnggrea":"ZZ/qq/llll","FubegGvzrCnggrea":"UU:zz","FbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq\'G\'UU\':\'zz\':\'ff","GvzrFrcnengbe":":","HavirefnyFbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq UU\':\'zz\':\'ff\'M\'","LrneZbaguCnggrea":"llll ZZZZ","NooerivngrqQnlAnzrf":["Fha","Zba","Ghr","Jrq","Guh","Sev","Fng"],"FubegrfgQnlAnzrf":["Fh","Zb","Gh","Jr","Gu","Se","Fn"],"QnlAnzrf":["Fhaqnl","Zbaqnl","Ghrfqnl","Jrqarfqnl","Guhefqnl","Sevqnl","Fngheqnl"],"NooerivngrqZbaguAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""],"VfErnqBayl":gehr,"AngvirPnyraqneAnzr":"Tertbevna Pnyraqne","NooerivngrqZbaguTravgvirAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguTravgvirAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""]}}';
+  var str3 = '{"anzr":"ra-HF","ahzoreSbezng":{"PheeraplQrpvznyQvtvgf":2,"PheeraplQrpvznyFrcnengbe":".","VfErnqBayl":snyfr,"PheeraplTebhcFvmrf":[3],"AhzoreTebhcFvmrf":[3],"CrepragTebhcFvmrf":[3],"PheeraplTebhcFrcnengbe":",","PheeraplFlzoby":"$","AnAFlzoby":"AnA","PheeraplArtngvirCnggrea":0,"AhzoreArtngvirCnggrea":1,"CrepragCbfvgvirCnggrea":0,"CrepragArtngvirCnggrea":0,"ArtngvirVasvavglFlzoby":"-Vasvavgl","ArtngvirFvta":"-","AhzoreQrpvznyQvtvgf":2,"AhzoreQrpvznyFrcnengbe":".","AhzoreTebhcFrcnengbe":",","PheeraplCbfvgvirCnggrea":0,"CbfvgvirVasvavglFlzoby":"Vasvavgl","CbfvgvirFvta":"+","CrepragQrpvznyQvtvgf":2,"CrepragQrpvznyFrcnengbe":".","CrepragTebhcFrcnengbe":",","CrepragFlzoby":"%","CreZvyyrFlzoby":"\u2030","AngvirQvtvgf":["0","1","2","3","4","5","6","7","8","9"],"QvtvgFhofgvghgvba":1},"qngrGvzrSbezng":{"NZQrfvtangbe":"NZ","Pnyraqne":{"ZvaFhccbegrqQngrGvzr":"@-62135568000000@","ZnkFhccbegrqQngrGvzr":"@253402300799999@","NytbevguzGlcr":1,"PnyraqneGlcr":1,"Renf":[1],"GjbQvtvgLrneZnk":2029,"VfErnqBayl":snyfr},"QngrFrcnengbe":"/","SvefgQnlBsJrrx":0,"PnyraqneJrrxEhyr":0,"ShyyQngrGvzrCnggrea":"qqqq, ZZZZ qq, llll u:zz:ff gg","YbatQngrCnggrea":"qqqq, ZZZZ qq, llll","YbatGvzrCnggrea":"u:zz:ff gg","ZbaguQnlCnggrea":"ZZZZ qq","CZQrfvtangbe":"CZ","ESP1123Cnggrea":"qqq, qq ZZZ llll UU\':\'zz\':\'ff \'TZG\'","FubegQngrCnggrea":"Z/q/llll","FubegGvzrCnggrea":"u:zz gg","FbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq\'G\'UU\':\'zz\':\'ff","GvzrFrcnengbe":":","HavirefnyFbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq UU\':\'zz\':\'ff\'M\'","LrneZbaguCnggrea":"ZZZZ, llll","NooerivngrqQnlAnzrf":["Fha","Zba","Ghr","Jrq","Guh","Sev","Fng"],"FubegrfgQnlAnzrf":["Fh","Zb","Gh","Jr","Gu","Se","Fn"],"QnlAnzrf":["Fhaqnl","Zbaqnl","Ghrfqnl","Jrqarfqnl","Guhefqnl","Sevqnl","Fngheqnl"],"NooerivngrqZbaguAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""],"VfErnqBayl":snyfr,"AngvirPnyraqneAnzr":"Tertbevna Pnyraqne","NooerivngrqZbaguTravgvirAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguTravgvirAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""]}}';
+  var str4 = 'HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str5 = 'HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var re18 = /^\s+|\s+$/g;
+  var str6 = 'uggc://jjj.snprobbx.pbz/vaqrk.cuc';
+  var re19 = /(?:^|\s+)ba(?:\s+|$)/;
+  var re20 = /[+, ]/;
+  var re21 = /ybnqrq|pbzcyrgr/;
+  var str7 = ';;jvaqbj.IjPurpxZbhfrCbfvgvbaNQ_VQ=shapgvba(r){vs(!r)ine r=jvaqbj.rirag;ine c=-1;vs(d1)c=d1.EbyybssCnary;ine bo=IjTrgBow("IjCnayNQ_VQ_"+c);vs(bo&&bo.fglyr.ivfvovyvgl=="ivfvoyr"){ine fns=IjFns?8:0;ine pheK=r.pyvragK+IjBOFpe("U")+fns,pheL=r.pyvragL+IjBOFpe("I")+fns;ine y=IjBOEC(NQ_VQ,bo,"Y"),g=IjBOEC(NQ_VQ,bo,"G");ine e=y+d1.Cnaryf[c].Jvqgu,o=g+d1.Cnaryf[c].Urvtug;vs((pheK<y)||(pheK>e)||(pheL<g)||(pheL>o)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(d1&&d1.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(d1)d1.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(d1)d1.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;d1.IjTc=d2(n,c){ine nq=d1;vs(vfAnA(c)){sbe(ine v=0;v<nq.Cnaryf.yratgu;v++)vs(nq.Cnaryf[v].Anzr==c)erghea v;erghea 0;}erghea c;};;d1.IjTpy=d2(n,c,p){ine cn=d1.Cnaryf[IjTc(n,c)];vs(!cn)erghea 0;vs(vfAnA(p)){sbe(ine v=0;v<cn.Pyvpxguehf.yratgu;v++)vs(cn.Pyvpxguehf[v].Anzr==p)erghea v;erghea 0;}erghea p;};;d1.IjGenpr=d2(n,f){gel{vs(jvaqbj["Ij"+"QtQ"])jvaqbj["Ij"+"QtQ"](n,1,f);}pngpu(r){}};;d1.IjYvzvg1=d2(n,f){ine nq=d1,vh=f.fcyvg("/");sbe(ine v=0,p=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;d1.IjYvzvg0=d2(n,f){ine nq=d1,vh=f.fcyvg("/");sbe(ine v=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;d1.IjRVST=d2(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",d1.rvsg);};;d1.IjNavzSHC=d2(n,c){ine nq=d1;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ <nq.NshG)frgGvzrbhg(("IjNavzSHC(NQ_VQ,"+c+")"),nq.NshC);ryfr{k=-1000;l=k;}cna.YrsgBssfrg=k;cna.GbcBssfrg=l;IjNhErcb(n,c);};;d1.IjTrgErnyCbfvgvba=d2(n,b,j){erghea IjBOEC.nccyl(guvf,nethzragf);};;d1.IjPnapryGvzrbhg=d2(n,c){c=IjTc(n,c);ine cay=d1.Cnaryf[c];vs(cay&&cay.UgU!=""){pyrneGvzrbhg(cay.UgU);}};;d1.IjPnapryNyyGvzrbhgf=d2(n){vs(d1.YbpxGvzrbhgPunatrf)erghea;sbe(ine c=0;c<d1.bac;c++)IjPnapryGvzrbhg(n,c);};;d1.IjFgnegGvzrbhg=d2(n,c,bG){c=IjTc(n,c);ine cay=d1.Cnaryf[c];vs(cay&&((cay.UvqrGvzrbhgInyhr>0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;d1.IjErfrgGvzrbhg=d2(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;d1.IjErfrgNyyGvzrbhgf=d2(n){sbe(ine c=0;c<d1.bac;c++)IjErfrgGvzrbhg(n,c);};;d1.IjQrgnpure=d2(n,rig,sap){gel{vs(IjQVR5)riny("jvaqbj.qrgnpuRirag(\'ba"+rig+"\',"+sap+"NQ_VQ)");ryfr vs(!IjQVRZnp)riny("jvaqbj.erzbirRiragYvfgrare(\'"+rig+"\',"+sap+"NQ_VQ,snyfr)");}pngpu(r){}};;d1.IjPyrnaHc=d2(n){IjCvat(n,"G");ine nq=d1;sbe(ine v=0;v<nq.Cnaryf.yratgu;v++){IjUvqrCnary(n,v,gehr);}gel{IjTrgBow(nq.gya).vaareUGZY="";}pngpu(r){}vs(nq.gya!=nq.gya2)gel{IjTrgBow(nq.gya2).vaareUGZY="";}pngpu(r){}gel{d1=ahyy;}pngpu(r){}gel{IjQrgnpure(n,"haybnq","IjHayNQ_VQ");}pngpu(r){}gel{jvaqbj.IjHayNQ_VQ=ahyy;}pngpu(r){}gel{IjQrgnpure(n,"fpebyy","IjFeNQ_VQ");}pngpu(r){}gel{jvaqbj.IjFeNQ_VQ=ahyy;}pngpu(r){}gel{IjQrgnpure(n,"erfvmr","IjEmNQ_VQ");}pngpu(r){}gel{jvaqbj.IjEmNQ_VQ=ahyy;}pngpu(r){}gel{IjQrgnpure(n';
+  var str8 = ';;jvaqbj.IjPurpxZbhfrCbfvgvbaNQ_VQ=shapgvba(r){vs(!r)ine r=jvaqbj.rirag;ine c=-1;vs(jvaqbj.IjNqNQ_VQ)c=jvaqbj.IjNqNQ_VQ.EbyybssCnary;ine bo=IjTrgBow("IjCnayNQ_VQ_"+c);vs(bo&&bo.fglyr.ivfvovyvgl=="ivfvoyr"){ine fns=IjFns?8:0;ine pheK=r.pyvragK+IjBOFpe("U")+fns,pheL=r.pyvragL+IjBOFpe("I")+fns;ine y=IjBOEC(NQ_VQ,bo,"Y"),g=IjBOEC(NQ_VQ,bo,"G");ine e=y+jvaqbj.IjNqNQ_VQ.Cnaryf[c].Jvqgu,o=g+jvaqbj.IjNqNQ_VQ.Cnaryf[c].Urvtug;vs((pheK<y)||(pheK>e)||(pheL<g)||(pheL>o)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(jvaqbj.IjNqNQ_VQ&&jvaqbj.IjNqNQ_VQ.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjTc=shapgvba(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(vfAnA(c)){sbe(ine v=0;v<nq.Cnaryf.yratgu;v++)vs(nq.Cnaryf[v].Anzr==c)erghea v;erghea 0;}erghea c;};;jvaqbj.IjNqNQ_VQ.IjTpy=shapgvba(n,c,p){ine cn=jvaqbj.IjNqNQ_VQ.Cnaryf[IjTc(n,c)];vs(!cn)erghea 0;vs(vfAnA(p)){sbe(ine v=0;v<cn.Pyvpxguehf.yratgu;v++)vs(cn.Pyvpxguehf[v].Anzr==p)erghea v;erghea 0;}erghea p;};;jvaqbj.IjNqNQ_VQ.IjGenpr=shapgvba(n,f){gel{vs(jvaqbj["Ij"+"QtQ"])jvaqbj["Ij"+"QtQ"](n,1,f);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjYvzvg1=shapgvba(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0,p=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;jvaqbj.IjNqNQ_VQ.IjYvzvg0=shapgvba(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;jvaqbj.IjNqNQ_VQ.IjRVST=shapgvba(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",jvaqbj.IjNqNQ_VQ.rvsg);};;jvaqbj.IjNqNQ_VQ.IjNavzSHC=shapgvba(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ <nq.NshG)frgGvzrbhg(("IjNavzSHC(NQ_VQ,"+c+")"),nq.NshC);ryfr{k=-1000;l=k;}cna.YrsgBssfrg=k;cna.GbcBssfrg=l;IjNhErcb(n,c);};;jvaqbj.IjNqNQ_VQ.IjTrgErnyCbfvgvba=shapgvba(n,b,j){erghea IjBOEC.nccyl(guvf,nethzragf);};;jvaqbj.IjNqNQ_VQ.IjPnapryGvzrbhg=shapgvba(n,c){c=IjTc(n,c);ine cay=jvaqbj.IjNqNQ_VQ.Cnaryf[c];vs(cay&&cay.UgU!=""){pyrneGvzrbhg(cay.UgU);}};;jvaqbj.IjNqNQ_VQ.IjPnapryNyyGvzrbhgf=shapgvba(n){vs(jvaqbj.IjNqNQ_VQ.YbpxGvzrbhgPunatrf)erghea;sbe(ine c=0;c<jvaqbj.IjNqNQ_VQ.bac;c++)IjPnapryGvzrbhg(n,c);};;jvaqbj.IjNqNQ_VQ.IjFgnegGvzrbhg=shapgvba(n,c,bG){c=IjTc(n,c);ine cay=jvaqbj.IjNqNQ_VQ.Cnaryf[c];vs(cay&&((cay.UvqrGvzrbhgInyhr>0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;jvaqbj.IjNqNQ_VQ.IjErfrgGvzrbhg=shapgvba(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;jvaqbj.IjNqNQ_VQ.IjErfrgNyyGvzrbhgf=shapgvba(n){sbe(ine c=0;c<jvaqbj.IjNqNQ_VQ.bac;c++)IjErfrgGvzrbhg(n,c);};;jvaqbj.IjNqNQ_VQ.IjQrgnpure=shapgvba(n,rig,sap){gel{vs(IjQVR5)riny("jvaqbj.qrgnpuRirag(\'ba"+rig+"\',"+sap+"NQ_VQ)");ryfr vs(!IjQVRZnp)riny("jvaqbj.erzbir';
+  var str9 = ';;jvaqbj.IjPurpxZbhfrCbfvgvbaNQ_VQ=shapgvba(r){vs(!r)ine r=jvaqbj.rirag;ine c=-1;vs(jvaqbj.IjNqNQ_VQ)c=jvaqbj.IjNqNQ_VQ.EbyybssCnary;ine bo=IjTrgBow("IjCnayNQ_VQ_"+c);vs(bo&&bo.fglyr.ivfvovyvgl=="ivfvoyr"){ine fns=IjFns?8:0;ine pheK=r.pyvragK+IjBOFpe("U")+fns,pheL=r.pyvragL+IjBOFpe("I")+fns;ine y=IjBOEC(NQ_VQ,bo,"Y"),g=IjBOEC(NQ_VQ,bo,"G");ine e=y+jvaqbj.IjNqNQ_VQ.Cnaryf[c].Jvqgu,o=g+jvaqbj.IjNqNQ_VQ.Cnaryf[c].Urvtug;vs((pheK<y)||(pheK>e)||(pheL<g)||(pheL>o)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(jvaqbj.IjNqNQ_VQ&&jvaqbj.IjNqNQ_VQ.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjTc=d2(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(vfAnA(c)){sbe(ine v=0;v<nq.Cnaryf.yratgu;v++)vs(nq.Cnaryf[v].Anzr==c)erghea v;erghea 0;}erghea c;};;jvaqbj.IjNqNQ_VQ.IjTpy=d2(n,c,p){ine cn=jvaqbj.IjNqNQ_VQ.Cnaryf[IjTc(n,c)];vs(!cn)erghea 0;vs(vfAnA(p)){sbe(ine v=0;v<cn.Pyvpxguehf.yratgu;v++)vs(cn.Pyvpxguehf[v].Anzr==p)erghea v;erghea 0;}erghea p;};;jvaqbj.IjNqNQ_VQ.IjGenpr=d2(n,f){gel{vs(jvaqbj["Ij"+"QtQ"])jvaqbj["Ij"+"QtQ"](n,1,f);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjYvzvg1=d2(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0,p=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;jvaqbj.IjNqNQ_VQ.IjYvzvg0=d2(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0;v<vh.yratgu;v++){vs(vh[v].yratgu>0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;jvaqbj.IjNqNQ_VQ.IjRVST=d2(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",jvaqbj.IjNqNQ_VQ.rvsg);};;jvaqbj.IjNqNQ_VQ.IjNavzSHC=d2(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ <nq.NshG)frgGvzrbhg(("IjNavzSHC(NQ_VQ,"+c+")"),nq.NshC);ryfr{k=-1000;l=k;}cna.YrsgBssfrg=k;cna.GbcBssfrg=l;IjNhErcb(n,c);};;jvaqbj.IjNqNQ_VQ.IjTrgErnyCbfvgvba=d2(n,b,j){erghea IjBOEC.nccyl(guvf,nethzragf);};;jvaqbj.IjNqNQ_VQ.IjPnapryGvzrbhg=d2(n,c){c=IjTc(n,c);ine cay=jvaqbj.IjNqNQ_VQ.Cnaryf[c];vs(cay&&cay.UgU!=""){pyrneGvzrbhg(cay.UgU);}};;jvaqbj.IjNqNQ_VQ.IjPnapryNyyGvzrbhgf=d2(n){vs(jvaqbj.IjNqNQ_VQ.YbpxGvzrbhgPunatrf)erghea;sbe(ine c=0;c<jvaqbj.IjNqNQ_VQ.bac;c++)IjPnapryGvzrbhg(n,c);};;jvaqbj.IjNqNQ_VQ.IjFgnegGvzrbhg=d2(n,c,bG){c=IjTc(n,c);ine cay=jvaqbj.IjNqNQ_VQ.Cnaryf[c];vs(cay&&((cay.UvqrGvzrbhgInyhr>0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;jvaqbj.IjNqNQ_VQ.IjErfrgGvzrbhg=d2(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;jvaqbj.IjNqNQ_VQ.IjErfrgNyyGvzrbhgf=d2(n){sbe(ine c=0;c<jvaqbj.IjNqNQ_VQ.bac;c++)IjErfrgGvzrbhg(n,c);};;jvaqbj.IjNqNQ_VQ.IjQrgnpure=d2(n,rig,sap){gel{vs(IjQVR5)riny("jvaqbj.qrgnpuRirag(\'ba"+rig+"\',"+sap+"NQ_VQ)");ryfr vs(!IjQVRZnp)riny("jvaqbj.erzbirRiragYvfgrare(\'"+rig+"\',"+sap+"NQ_VQ,snyfr)");}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjPyrna';
+
+  var s26 = computeInputVariants('VC=74.125.75.1', 81);
+  var s27 = computeInputVariants('9.0  e115', 78);
+  var s28 = computeInputVariants('k',78);
+  var s29 = computeInputVariants(str2, 81);
+  var s30 = computeInputVariants(str3, 81);
+  var s31 = computeInputVariants('144631658', 78);
+  var s32 = computeInputVariants('Pbhagel=IIZ%3Q', 78);
+  var s33 = computeInputVariants('Pbhagel=IIZ=', 78);
+  var s34 = computeInputVariants('CersreerqPhygherCraqvat=', 78);
+  var s35 = computeInputVariants(str4, 78);
+  var s36 = computeInputVariants(str5, 78);
+  var s37 = computeInputVariants('__hgzp=144631658', 78);
+  var s38 = computeInputVariants('gvzrMbar=-8', 78);
+  var s39 = computeInputVariants('gvzrMbar=0', 78);
+  // var s40 = computeInputVariants(s15[i], 78);
+  var s41 = computeInputVariants('vachggrkg  QBZPbageby_cynprubyqre', 78);
+  var s42 = computeInputVariants('xrlqbja', 78);
+  var s43 = computeInputVariants('xrlhc', 78);
+  var s44 = computeInputVariants('uggc://zrffntvat.zlfcnpr.pbz/vaqrk.psz', 77);
+  var s45 = computeInputVariants('FrffvbaFgbentr=%7O%22GnoThvq%22%3N%7O%22thvq%22%3N1231367125017%7Q%7Q', 73);
+  var s46 = computeInputVariants(str6, 72);
+  var s47 = computeInputVariants('3.5.0.0', 70);
+  var s48 = computeInputVariants(str7, 70);
+  var s49 = computeInputVariants(str8, 70);
+  var s50 = computeInputVariants(str9, 70);
+  var s51 = computeInputVariants('NI%3Q1_CI%3Q1_PI%3Q1_EI%3Q1_HI%3Q1_HP%3Q1_IC%3Q0.0.0.0_IH%3Q0', 70);
+  var s52 = computeInputVariants('svz_zlfcnpr_ubzrcntr_abgybttrqva,svz_zlfcnpr_aba_HTP,svz_zlfcnpr_havgrq-fgngrf', 70);
+  var s53 = computeInputVariants('ybnqvat', 70);
+  var s54 = computeInputVariants('#', 68);
+  var s55 = computeInputVariants('ybnqrq', 68);
+  var s56 = computeInputVariants('pbybe', 49);
+  var s57 = computeInputVariants('uggc://sevraqf.zlfcnpr.pbz/vaqrk.psz', 44);
+
+  function runBlock1() {
+    for (var i = 0; i < 81; i++) {
+      re8.exec(s26[i]);
+    }
+    for (var i = 0; i < 78; i++) {
+      s27[i].replace(/(\s)+e/, '');
+      s28[i].replace(/./, '');
+      s29[i].replace(re17, '');
+      s30[i].replace(re17, '');
+      re8.exec(s31[i]);
+      re8.exec(s32[i]);
+      re8.exec(s33[i]);
+      re8.exec(s34[i]);
+      re8.exec(s35[i]);
+      re8.exec(s36[i]);
+      re8.exec(s37[i]);
+      re8.exec(s38[i]);
+      re8.exec(s39[i]);
+      /Fnsnev\/(\d+\.\d+)/.exec(s15[i]);
+      re3.exec(s41[i]);
+      re0.exec(s42[i]);
+      re0.exec(s43[i]);
+    }
+    for (var i = 0; i < 77; i++) {
+      s44[i].replace(re12, '');
+      re13.exec(s44[i]);
+    }
+    for (var i = 0; i < 73; i++) {
+      s45[i].replace(re18, '');
+    }
+    for (var i = 0; i < 72; i++) {
+      re1.exec(s46[i]);
+    }
+    for (var i = 0; i < 71; i++) {
+      re19.exec('');
+    }
+    for (var i = 0; i < 70; i++) {
+      s47[i].replace(re11, '');
+      s48[i].replace(/d1/g, '');
+      s49[i].replace(/NQ_VQ/g, '');
+      s50[i].replace(/d2/g, '');
+      s51[i].replace(/_/g, '');
+      s52[i].split(re20);
+      re21.exec(s53[i]);
+    }
+    for (var i = 0; i < 68; i++) {
+      re1.exec(s54[i]);
+      /(?:ZFVR.(\d+\.\d+))|(?:(?:Sversbk|TenaCnenqvfb|Vprjrnfry).(\d+\.\d+))|(?:Bcren.(\d+\.\d+))|(?:NccyrJroXvg.(\d+(?:\.\d+)?))/.exec(s15[i]);
+      /(Znp BF K)|(Jvaqbjf;)/.exec(s15[i]);
+      /Trpxb\/([0-9]+)/.exec(s15[i]);
+      re21.exec(s55[i]);
+    }
+    for (var i = 0; i < 49; i++) {
+      re16.exec(s56[i]);
+    }
+    for (var i = 0; i < 44; i++) {
+      s57[i].replace(re12, '');
+      re13.exec(s57[i]);
+    }
+  }
+  var re22 = /\bso_zrah\b/;
+  var re23 = /^(?:(?:[^:\/?#]+):)?(?:\/\/(?:[^\/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/;
+  var re24 = /uggcf?:\/\/([^\/]+\.)?snprobbx\.pbz\//;
+  var re25 = /"/g;
+  var re26 = /^([^?#]+)(?:\?([^#]*))?(#.*)?/;
+  var s57a = computeInputVariants('fryrpgrq', 40);
+  var s58 = computeInputVariants('vachggrkg uvqqra_ryrz', 40);
+  var s59 = computeInputVariants('vachggrkg ', 40);
+  var s60 = computeInputVariants('vachggrkg', 40);
+  var s61 = computeInputVariants('uggc://jjj.snprobbx.pbz/', 40);
+  var s62 = computeInputVariants('uggc://jjj.snprobbx.pbz/ybtva.cuc', 40);
+  var s63 = computeInputVariants('Funer guvf tnqtrg', 40);
+  var s64 = computeInputVariants('uggc://jjj.tbbtyr.pbz/vt/qverpgbel', 40);
+  var s65 = computeInputVariants('419', 40);
+  var s66 = computeInputVariants('gvzrfgnzc', 40);
+
+  function runBlock2() {
+    for (var i = 0; i < 40; i++) {
+      s57a[i].replace(re14, '');
+      s57a[i].replace(re15, '');
+    }
+    for (var i = 0; i < 39; i++) {
+      s58[i].replace(/\buvqqra_ryrz\b/g, '');
+      re3.exec(s59[i]);
+      re3.exec(s60[i]);
+      re22.exec('HVYvaxOhggba');
+      re22.exec('HVYvaxOhggba_E');
+      re22.exec('HVYvaxOhggba_EJ');
+      re22.exec('zrah_ybtva_pbagnvare');
+      /\buvqqra_ryrz\b/.exec('vachgcnffjbeq');
+    }
+    for (var i = 0; i < 37; i++) {
+      re8.exec('111soqs57qo8o8480qo18sor2011r3n591q7s6s37r120904');
+      re8.exec('SbeprqRkcvengvba=633669315660164980');
+      re8.exec('FrffvbaQQS2=111soqs57qo8o8480qo18sor2011r3n591q7s6s37r120904');
+    }
+    for (var i = 0; i < 35; i++) {
+      'puvyq p1 svefg'.replace(re14, '');
+      'puvyq p1 svefg'.replace(re15, '');
+      'sylbhg pybfrq'.replace(re14, '');
+      'sylbhg pybfrq'.replace(re15, '');
+    }
+    for (var i = 0; i < 34; i++) {
+      re19.exec('gno2');
+      re19.exec('gno3');
+      re8.exec('44132r503660');
+      re8.exec('SbeprqRkcvengvba=633669316860113296');
+      re8.exec('AFP_zp_dfctwzs-aowb_80=44132r503660');
+      re8.exec('FrffvbaQQS2=s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696');
+      re8.exec('s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696');
+    }
+    for (var i = 0; i < 32; i++) {
+      /puebzr/i.exec(s15[i]);
+    }
+    for (var i = 0; i < 31; i++) {
+      s61[i].replace(re23, '');
+      re8.exec('SbeprqRkcvengvba=633669358527244818');
+      re8.exec('VC=66.249.85.130');
+      re8.exec('FrffvbaQQS2=s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58');
+      re8.exec('s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58');
+      re24.exec(s61[i]);
+    }
+    for (var i = 0; i < 30; i++) {
+      s65[i].replace(re6, '');
+      /(?:^|\s+)gvzrfgnzc(?:\s+|$)/.exec(s66[i]);
+      re7.exec(s65[i]);
+    }
+    for (var i = 0; i < 29; i++) {
+      s62[i].replace(re23, '');
+    }
+    for (var i = 0; i < 28; i++) {
+      s63[i].replace(re25, '');
+      s63[i].replace(re12, '');
+      re26.exec(s64[i]);
+    }
+  }
+  var re27 = /-\D/g;
+  var re28 = /\bnpgvingr\b/;
+  var re29 = /%2R/gi;
+  var re30 = /%2S/gi;
+  var re31 = /^(mu-(PA|GJ)|wn|xb)$/;
+  var re32 = /\s?;\s?/;
+  var re33 = /%\w?$/;
+  var re34 = /TNQP=([^;]*)/i;
+  var str10 = 'FrffvbaQQS2=111soqs57qo8o8480qo18sor2011r3n591q7s6s37r120904; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669315660164980&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str11 = 'FrffvbaQQS2=111soqs57qo8o8480qo18sor2011r3n591q7s6s37r120904; __hgzm=144631658.1231363570.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.3426875219718084000.1231363570.1231363570.1231363570.1; __hgzo=144631658.0.10.1231363570; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669315660164980&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str12 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231363514065&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231363514065&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Subzr.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1326469221.1231363557&tn_fvq=1231363557&tn_uvq=1114636509&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str13 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669315660164980&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str14 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669315660164980&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var re35 = /[<>]/g;
+  var str15 = 'FrffvbaQQS2=s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669316860113296&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzs-aowb_80=44132r503660';
+  var str16 = 'FrffvbaQQS2=s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696; AFP_zp_dfctwzs-aowb_80=44132r503660; __hgzm=144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.965867047679498800.1231363638.1231363638.1231363638.1; __hgzo=144631658.0.10.1231363638; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669316860113296&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str17 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231363621014&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231363621014&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyr.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=348699119.1231363624&tn_fvq=1231363624&tn_uvq=895511034&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str18 = 'uggc://jjj.yrobapbva.se/yv';
+  var str19 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669316860113296&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str20 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669316860113296&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+
+  var s67 = computeInputVariants('e115', 27);
+  var s68 = computeInputVariants('qvfcynl', 27);
+  var s69 = computeInputVariants('cbfvgvba', 27);
+  var s70 = computeInputVariants('uggc://jjj.zlfcnpr.pbz/', 27);
+  var s71 = computeInputVariants('cntrivrj', 27);
+  var s72 = computeInputVariants('VC=74.125.75.3', 27);
+  var s73 = computeInputVariants('ra', 27);
+  var s74 = computeInputVariants(str10, 27);
+  var s75 = computeInputVariants(str11, 27);
+  var s76 = computeInputVariants(str12, 27);
+  var s77 = computeInputVariants(str17, 27);
+  var s78 = computeInputVariants(str18, 27);
+
+  function runBlock3() {
+    for (var i = 0; i < 27; i++) {
+      s67[i].replace(/[A-Za-z]/g, '');
+    }
+    for (var i = 0; i < 23; i++) {
+      s68[i].replace(re27, '');
+      s69[i].replace(re27, '');
+    }
+    for (var i = 0; i < 22; i++) {
+      'unaqyr'.replace(re14, '');
+      'unaqyr'.replace(re15, '');
+      'yvar'.replace(re14, '');
+      'yvar'.replace(re15, '');
+      'cnerag puebzr6 fvatyr1 gno'.replace(re14, '');
+      'cnerag puebzr6 fvatyr1 gno'.replace(re15, '');
+      'fyvqre'.replace(re14, '');
+      'fyvqre'.replace(re15, '');
+      re28.exec('');
+    }
+    for (var i = 0; i < 21; i++) {
+      s70[i].replace(re12, '');
+      re13.exec(s70[i]);
+    }
+    for (var i = 0; i < 20; i++) {
+      s71[i].replace(re29, '');
+      s71[i].replace(re30, '');
+      re19.exec('ynfg');
+      re19.exec('ba svefg');
+      re8.exec(s72[i]);
+    }
+    for (var i = 0; i < 19; i++) {
+      re31.exec(s73[i]);
+    }
+    for (var i = 0; i < 18; i++) {
+      s74[i].split(re32);
+      s75[i].split(re32);
+      s76[i].replace(re33, '');
+      re8.exec('144631658.0.10.1231363570');
+      re8.exec('144631658.1231363570.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.3426875219718084000.1231363570.1231363570.1231363570.1');
+      re8.exec(str13);
+      re8.exec(str14);
+      re8.exec('__hgzn=144631658.3426875219718084000.1231363570.1231363570.1231363570.1');
+      re8.exec('__hgzo=144631658.0.10.1231363570');
+      re8.exec('__hgzm=144631658.1231363570.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(s74[i]);
+      re34.exec(s75[i]);
+    }
+    for (var i = 0; i < 17; i++) {
+      s15[i].match(/zfvr/gi);
+      s15[i].match(/bcren/gi);
+      str15.split(re32);
+      str16.split(re32);
+      'ohggba'.replace(re14, '');
+      'ohggba'.replace(re15, '');
+      'puvyq p1 svefg sylbhg pybfrq'.replace(re14, '');
+      'puvyq p1 svefg sylbhg pybfrq'.replace(re15, '');
+      'pvgvrf'.replace(re14, '');
+      'pvgvrf'.replace(re15, '');
+      'pybfrq'.replace(re14, '');
+      'pybfrq'.replace(re15, '');
+      'qry'.replace(re14, '');
+      'qry'.replace(re15, '');
+      'uqy_zba'.replace(re14, '');
+      'uqy_zba'.replace(re15, '');
+      s77[i].replace(re33, '');
+      s78[i].replace(/%3P/g, '');
+      s78[i].replace(/%3R/g, '');
+      s78[i].replace(/%3q/g, '');
+      s78[i].replace(re35, '');
+      'yvaxyvfg16'.replace(re14, '');
+      'yvaxyvfg16'.replace(re15, '');
+      'zvahf'.replace(re14, '');
+      'zvahf'.replace(re15, '');
+      'bcra'.replace(re14, '');
+      'bcra'.replace(re15, '');
+      'cnerag puebzr5 fvatyr1 ps NU'.replace(re14, '');
+      'cnerag puebzr5 fvatyr1 ps NU'.replace(re15, '');
+      'cynlre'.replace(re14, '');
+      'cynlre'.replace(re15, '');
+      'cyhf'.replace(re14, '');
+      'cyhf'.replace(re15, '');
+      'cb_uqy'.replace(re14, '');
+      'cb_uqy'.replace(re15, '');
+      'hyJVzt'.replace(re14, '');
+      'hyJVzt'.replace(re15, '');
+      re8.exec('144631658.0.10.1231363638');
+      re8.exec('144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.965867047679498800.1231363638.1231363638.1231363638.1');
+      re8.exec('4413268q3660');
+      re8.exec('4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n');
+      re8.exec('SbeprqRkcvengvba=633669321699093060');
+      re8.exec('VC=74.125.75.20');
+      re8.exec(str19);
+      re8.exec(str20);
+      re8.exec('AFP_zp_tfwsbrg-aowb_80=4413268q3660');
+      re8.exec('FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n');
+      re8.exec('__hgzn=144631658.965867047679498800.1231363638.1231363638.1231363638.1');
+      re8.exec('__hgzo=144631658.0.10.1231363638');
+      re8.exec('__hgzm=144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(str15);
+      re34.exec(str16);
+    }
+  }
+  var re36 = /uers|fep|fryrpgrq/;
+  var re37 = /\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g;
+  var re38 = /^(\w+|\*)$/;
+  var str21 = 'FrffvbaQQS2=s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58; ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669358527244818&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str22 = 'FrffvbaQQS2=s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58; __hgzm=144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.4127520630321984500.1231367822.1231367822.1231367822.1; __hgzo=144631658.0.10.1231367822; __hgzp=144631658; ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669358527244818&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str23 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231367803797&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367803797&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Szrffntvat.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1192552091.1231367807&tn_fvq=1231367807&tn_uvq=1155446857&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str24 = 'ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669358527244818&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str25 = 'ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669358527244818&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str26 = 'hy.ynat-fryrpgbe';
+  var re39 = /\\/g;
+  var re40 = / /g;
+  var re41 = /\/\xc4\/t/;
+  var re42 = /\/\xd6\/t/;
+  var re43 = /\/\xdc\/t/;
+  var re44 = /\/\xdf\/t/;
+  var re45 = /\/\xe4\/t/;
+  var re46 = /\/\xf6\/t/;
+  var re47 = /\/\xfc\/t/;
+  var re48 = /\W/g;
+  var re49 = /uers|fep|fglyr/;
+  var s79 = computeInputVariants(str21, 16);
+  var s80 = computeInputVariants(str22, 16);
+  var s81 = computeInputVariants(str23, 16);
+  var s82 = computeInputVariants(str26, 16);
+
+  function runBlock4() {
+    for (var i = 0; i < 16; i++) {
+      ''.replace(/\*/g, '');
+      /\bnpgvir\b/.exec('npgvir');
+      /sversbk/i.exec(s15[i]);
+      re36.exec('glcr');
+      /zfvr/i.exec(s15[i]);
+      /bcren/i.exec(s15[i]);
+    }
+    for (var i = 0; i < 15; i++) {
+      s79[i].split(re32);
+      s80[i].split(re32);
+      'uggc://ohyyrgvaf.zlfcnpr.pbz/vaqrk.psz'.replace(re12, '');
+      s81[i].replace(re33, '');
+      'yv'.replace(re37, '');
+      'yv'.replace(re18, '');
+      re8.exec('144631658.0.10.1231367822');
+      re8.exec('144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.4127520630321984500.1231367822.1231367822.1231367822.1');
+      re8.exec(str24);
+      re8.exec(str25);
+      re8.exec('__hgzn=144631658.4127520630321984500.1231367822.1231367822.1231367822.1');
+      re8.exec('__hgzo=144631658.0.10.1231367822');
+      re8.exec('__hgzm=144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(s79[i]);
+      re34.exec(s80[i]);
+      /\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g.exec(s82[i]);
+      re13.exec('uggc://ohyyrgvaf.zlfcnpr.pbz/vaqrk.psz');
+      re38.exec('yv');
+    }
+    for (var i = 0; i < 14; i++) {
+      ''.replace(re18, '');
+      '9.0  e115'.replace(/(\s+e|\s+o[0-9]+)/, '');
+      'Funer guvf tnqtrg'.replace(/</g, '');
+      'Funer guvf tnqtrg'.replace(/>/g, '');
+      'Funer guvf tnqtrg'.replace(re39, '');
+      'uggc://cebsvyrrqvg.zlfcnpr.pbz/vaqrk.psz'.replace(re12, '');
+      'grnfre'.replace(re40, '');
+      'grnfre'.replace(re41, '');
+      'grnfre'.replace(re42, '');
+      'grnfre'.replace(re43, '');
+      'grnfre'.replace(re44, '');
+      'grnfre'.replace(re45, '');
+      'grnfre'.replace(re46, '');
+      'grnfre'.replace(re47, '');
+      'grnfre'.replace(re48, '');
+      re16.exec('znetva-gbc');
+      re16.exec('cbfvgvba');
+      re19.exec('gno1');
+      re9.exec('qz');
+      re9.exec('qg');
+      re9.exec('zbqobk');
+      re9.exec('zbqobkva');
+      re9.exec('zbqgvgyr');
+      re13.exec('uggc://cebsvyrrqvg.zlfcnpr.pbz/vaqrk.psz');
+      re26.exec('/vt/znvytnqtrg');
+      re49.exec('glcr');
+    }
+  }
+  var re50 = /(?:^|\s+)fryrpgrq(?:\s+|$)/;
+  var re51 = /\&/g;
+  var re52 = /\+/g;
+  var re53 = /\?/g;
+  var re54 = /\t/g;
+  var re55 = /(\$\{nqiHey\})|(\$nqiHey\b)/g;
+  var re56 = /(\$\{cngu\})|(\$cngu\b)/g;
+  function runBlock5() {
+    for (var i = 0; i < 13; i++) {
+      'purpx'.replace(re14, '');
+      'purpx'.replace(re15, '');
+      'pvgl'.replace(re14, '');
+      'pvgl'.replace(re15, '');
+      'qrpe fyvqrgrkg'.replace(re14, '');
+      'qrpe fyvqrgrkg'.replace(re15, '');
+      'svefg fryrpgrq'.replace(re14, '');
+      'svefg fryrpgrq'.replace(re15, '');
+      'uqy_rag'.replace(re14, '');
+      'uqy_rag'.replace(re15, '');
+      'vape fyvqrgrkg'.replace(re14, '');
+      'vape fyvqrgrkg'.replace(re15, '');
+      'vachggrkg QBZPbageby_cynprubyqre'.replace(re5, '');
+      'cnerag puebzr6 fvatyr1 gno fryrpgrq'.replace(re14, '');
+      'cnerag puebzr6 fvatyr1 gno fryrpgrq'.replace(re15, '');
+      'cb_guz'.replace(re14, '');
+      'cb_guz'.replace(re15, '');
+      'fhozvg'.replace(re14, '');
+      'fhozvg'.replace(re15, '');
+      re50.exec('');
+      /NccyrJroXvg\/([^\s]*)/.exec(s15[i]);
+      /XUGZY/.exec(s15[i]);
+    }
+    for (var i = 0; i < 12; i++) {
+      '${cebg}://${ubfg}${cngu}/${dz}'.replace(/(\$\{cebg\})|(\$cebg\b)/g, '');
+      '1'.replace(re40, '');
+      '1'.replace(re10, '');
+      '1'.replace(re51, '');
+      '1'.replace(re52, '');
+      '1'.replace(re53, '');
+      '1'.replace(re39, '');
+      '1'.replace(re54, '');
+      '9.0  e115'.replace(/^(.*)\..*$/, '');
+      '9.0  e115'.replace(/^.*e(.*)$/, '');
+      '<!-- ${nqiHey} -->'.replace(re55, '');
+      '<fpevcg glcr="grkg/wninfpevcg" fep="${nqiHey}"></fpevcg>'.replace(re55, '');
+      s21[i].replace(/^.*\s+(\S+\s+\S+$)/, '');
+      'tzk%2Subzrcntr%2Sfgneg%2Sqr%2S'.replace(re30, '');
+      'tzk'.replace(re30, '');
+      'uggc://${ubfg}${cngu}/${dz}'.replace(/(\$\{ubfg\})|(\$ubfg\b)/g, '');
+      'uggc://nqpyvrag.hvzfrei.arg${cngu}/${dz}'.replace(re56, '');
+      'uggc://nqpyvrag.hvzfrei.arg/wf.at/${dz}'.replace(/(\$\{dz\})|(\$dz\b)/g, '');
+      'frpgvba'.replace(re29, '');
+      'frpgvba'.replace(re30, '');
+      'fvgr'.replace(re29, '');
+      'fvgr'.replace(re30, '');
+      'fcrpvny'.replace(re29, '');
+      'fcrpvny'.replace(re30, '');
+      re36.exec('anzr');
+      /e/.exec('9.0  e115');
+    }
+  }
+  var re57 = /##yv4##/gi;
+  var re58 = /##yv16##/gi;
+  var re59 = /##yv19##/gi;
+  var str27 = '<hy pynff="nqi">##yv4##Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.##yv16##Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##</hy>';
+  var str28 = '<hy pynff="nqi"><yv vq="YvOYG4" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg4.cat)">Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.##yv16##Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##</hy>';
+  var str29 = '<hy pynff="nqi"><yv vq="YvOYG4" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg4.cat)">Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.<yv vq="YvOYG16" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg16.cat)">Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##</hy>';
+  var str30 = '<hy pynff="nqi"><yv vq="YvOYG4" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg4.cat)">Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.<yv vq="YvOYG19" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg19.cat)">Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.<yv vq="YvOYG16" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg16.cat)">Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##</hy>';
+  var str31 = '<hy pynff="nqi"><yv vq="YvOYG4" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg4.cat)">Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.<yv vq="YvOYG19" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg19.cat)">Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.<yv vq="YvOYG16" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg16.cat)">Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.<oe> <oe> ##N##Yrnea zber##/N##</hy>';
+  var str32 = '<hy pynff="nqi"><yv vq="YvOYG4" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg4.cat)">Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.<yv vq="YvOYG19" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg19.cat)">Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.<yv vq="YvOYG16" fglyr="onpxtebhaq-vzntr:hey(uggc://vzt.jykef.pbz/~Yvir.FvgrPbagrag.VQ/~14.2.1230/~/~/~/oyg16.cat)">Ybgf bs fgbentr &#40;5 TO&#41; - zber pbby fghss ba gur jnl.<oe> <oe> <n uers="uggc://znvy.yvir.pbz/znvy/nobhg.nfck" gnetrg="_oynax">Yrnea zber##/N##</hy>';
+  var str33 = 'Bar Jvaqbjf Yvir VQ trgf lbh vagb <o>Ubgznvy</o>, <o>Zrffratre</o>, <o>Kobk YVIR</o> \u2014 naq bgure cynprf lbh frr #~#argjbexybtb#~#';
+  var re60 = /(?:^|\s+)bss(?:\s+|$)/;
+  var re61 = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/;
+  var re62 = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+  var str34 = '${1}://${2}${3}${4}${5}';
+  var str35 = ' O=6gnyg0g4znrrn&o=3&f=gc; Q=_lyu=K3bQZGSxnT4lZzD3OS9GNmV3ZGLkAQxRpTyxNmRlZmRmAmNkAQLRqTImqNZjOUEgpTjQnJ5xMKtgoN--; SCF=qy';
+  var s83 = computeInputVariants(str27, 11);
+  var s84 = computeInputVariants(str28, 11);
+  var s85 = computeInputVariants(str29, 11);
+  var s86 = computeInputVariants(str30, 11);
+  var s87 = computeInputVariants(str31, 11);
+  var s88 = computeInputVariants(str32, 11);
+  var s89 = computeInputVariants(str33, 11);
+  var s90 = computeInputVariants(str34, 11);
+
+  function runBlock6() {
+    for (var i = 0; i < 11; i++) {
+      s83[i].replace(/##yv0##/gi, '');
+      s83[i].replace(re57, '');
+      s84[i].replace(re58, '');
+      s85[i].replace(re59, '');
+      s86[i].replace(/##\/o##/gi, '');
+      s86[i].replace(/##\/v##/gi, '');
+      s86[i].replace(/##\/h##/gi, '');
+      s86[i].replace(/##o##/gi, '');
+      s86[i].replace(/##oe##/gi, '');
+      s86[i].replace(/##v##/gi, '');
+      s86[i].replace(/##h##/gi, '');
+      s87[i].replace(/##n##/gi, '');
+      s88[i].replace(/##\/n##/gi, '');
+      s89[i].replace(/#~#argjbexybtb#~#/g, '');
+      / Zbovyr\//.exec(s15[i]);
+      /##yv1##/gi.exec(s83[i]);
+      /##yv10##/gi.exec(s84[i]);
+      /##yv11##/gi.exec(s84[i]);
+      /##yv12##/gi.exec(s84[i]);
+      /##yv13##/gi.exec(s84[i]);
+      /##yv14##/gi.exec(s84[i]);
+      /##yv15##/gi.exec(s84[i]);
+      re58.exec(s84[i]);
+      /##yv17##/gi.exec(s85[i]);
+      /##yv18##/gi.exec(s85[i]);
+      re59.exec(s85[i]);
+      /##yv2##/gi.exec(s83[i]);
+      /##yv20##/gi.exec(s86[i]);
+      /##yv21##/gi.exec(s86[i]);
+      /##yv22##/gi.exec(s86[i]);
+      /##yv23##/gi.exec(s86[i]);
+      /##yv3##/gi.exec(s83[i]);
+      re57.exec(s83[i]);
+      /##yv5##/gi.exec(s84[i]);
+      /##yv6##/gi.exec(s84[i]);
+      /##yv7##/gi.exec(s84[i]);
+      /##yv8##/gi.exec(s84[i]);
+      /##yv9##/gi.exec(s84[i]);
+      re8.exec('473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29');
+      re8.exec('SbeprqRkcvengvba=633669325184628362');
+      re8.exec('FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29');
+      /AbxvnA[^\/]*/.exec(s15[i]);
+    }
+    for (var i = 0; i < 10; i++) {
+      ' bss'.replace(/(?:^|\s+)bss(?:\s+|$)/g, '');
+      s90[i].replace(/(\$\{0\})|(\$0\b)/g, '');
+      s90[i].replace(/(\$\{1\})|(\$1\b)/g, '');
+      s90[i].replace(/(\$\{pbzcyrgr\})|(\$pbzcyrgr\b)/g, '');
+      s90[i].replace(/(\$\{sentzrag\})|(\$sentzrag\b)/g, '');
+      s90[i].replace(/(\$\{ubfgcbeg\})|(\$ubfgcbeg\b)/g, '');
+      s90[i].replace(re56, '');
+      s90[i].replace(/(\$\{cebgbpby\})|(\$cebgbpby\b)/g, '');
+      s90[i].replace(/(\$\{dhrel\})|(\$dhrel\b)/g, '');
+      'nqfvmr'.replace(re29, '');
+      'nqfvmr'.replace(re30, '');
+      'uggc://${2}${3}${4}${5}'.replace(/(\$\{2\})|(\$2\b)/g, '');
+      'uggc://wf.hv-cbegny.qr${3}${4}${5}'.replace(/(\$\{3\})|(\$3\b)/g, '');
+      'arjf'.replace(re40, '');
+      'arjf'.replace(re41, '');
+      'arjf'.replace(re42, '');
+      'arjf'.replace(re43, '');
+      'arjf'.replace(re44, '');
+      'arjf'.replace(re45, '');
+      'arjf'.replace(re46, '');
+      'arjf'.replace(re47, '');
+      'arjf'.replace(re48, '');
+      / PC=i=(\d+)&oe=(.)/.exec(str35);
+      re60.exec(' ');
+      re60.exec(' bss');
+      re60.exec('');
+      re19.exec(' ');
+      re19.exec('svefg ba');
+      re19.exec('ynfg vtaber');
+      re19.exec('ba');
+      re9.exec('scnq so ');
+      re9.exec('zrqvgobk');
+      re9.exec('hsgy');
+      re9.exec('lhv-h');
+      /Fnsnev|Xbadhrebe|XUGZY/gi.exec(s15[i]);
+      re61.exec('uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf');
+      re62.exec('#Ybtva_rznvy');
+    }
+  }
+  var re63 = /\{0\}/g;
+  var str36 = 'FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n; ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669321699093060&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_tfwsbrg-aowb_80=4413268q3660';
+  var str37 = 'FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n; AFP_zp_tfwsbrg-aowb_80=4413268q3660; __hgzm=144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.2294274870215848400.1231364074.1231364074.1231364074.1; __hgzo=144631658.0.10.1231364074; __hgzp=144631658; ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669321699093060&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str38 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231364057761&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231364057761&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Ssevraqf.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1667363813.1231364061&tn_fvq=1231364061&tn_uvq=1917563877&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str39 = 'ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669321699093060&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str40 = 'ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669321699093060&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var s91 = computeInputVariants(str36, 9);
+  var s92 = computeInputVariants(str37, 9);
+  var s93 = computeInputVariants(str38, 9);
+  function runBlock7() {
+    for (var i = 0; i < 9; i++) {
+      '0'.replace(re40, '');
+      '0'.replace(re10, '');
+      '0'.replace(re51, '');
+      '0'.replace(re52, '');
+      '0'.replace(re53, '');
+      '0'.replace(re39, '');
+      '0'.replace(re54, '');
+      'Lrf'.replace(re40, '');
+      'Lrf'.replace(re10, '');
+      'Lrf'.replace(re51, '');
+      'Lrf'.replace(re52, '');
+      'Lrf'.replace(re53, '');
+      'Lrf'.replace(re39, '');
+      'Lrf'.replace(re54, '');
+    }
+    for (var i = 0; i < 8; i++) {
+      'Pybfr {0}'.replace(re63, '');
+      'Bcra {0}'.replace(re63, '');
+      s91[i].split(re32);
+      s92[i].split(re32);
+      'puvyq p1 svefg gnournqref'.replace(re14, '');
+      'puvyq p1 svefg gnournqref'.replace(re15, '');
+      'uqy_fcb'.replace(re14, '');
+      'uqy_fcb'.replace(re15, '');
+      'uvag'.replace(re14, '');
+      'uvag'.replace(re15, '');
+      s93[i].replace(re33, '');
+      'yvfg'.replace(re14, '');
+      'yvfg'.replace(re15, '');
+      'at_bhgre'.replace(re30, '');
+      'cnerag puebzr5 qbhoyr2 NU'.replace(re14, '');
+      'cnerag puebzr5 qbhoyr2 NU'.replace(re15, '');
+      'cnerag puebzr5 dhnq5 ps NU osyvax zbarl'.replace(re14, '');
+      'cnerag puebzr5 dhnq5 ps NU osyvax zbarl'.replace(re15, '');
+      'cnerag puebzr6 fvatyr1'.replace(re14, '');
+      'cnerag puebzr6 fvatyr1'.replace(re15, '');
+      'cb_qrs'.replace(re14, '');
+      'cb_qrs'.replace(re15, '');
+      'gnopbagrag'.replace(re14, '');
+      'gnopbagrag'.replace(re15, '');
+      'iv_svefg_gvzr'.replace(re30, '');
+      /(^|.)(ronl|qri-ehf3.wbg)(|fgberf|zbgbef|yvirnhpgvbaf|jvxv|rkcerff|punggre).(pbz(|.nh|.pa|.ux|.zl|.ft|.oe|.zk)|pb(.hx|.xe|.am)|pn|qr|se|vg|ay|or|ng|pu|vr|va|rf|cy|cu|fr)$/i.exec('cntrf.ronl.pbz');
+      re8.exec('144631658.0.10.1231364074');
+      re8.exec('144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.2294274870215848400.1231364074.1231364074.1231364074.1');
+      re8.exec('4413241q3660');
+      re8.exec('SbeprqRkcvengvba=633669357391353591');
+      re8.exec(str39);
+      re8.exec(str40);
+      re8.exec('AFP_zp_kkk-gdzogv_80=4413241q3660');
+      re8.exec('FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7');
+      re8.exec('__hgzn=144631658.2294274870215848400.1231364074.1231364074.1231364074.1');
+      re8.exec('__hgzo=144631658.0.10.1231364074');
+      re8.exec('__hgzm=144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7');
+      re34.exec(s91[i]);
+      re34.exec(s92[i]);
+    }
+  }
+  var re64 = /\b[a-z]/g;
+  var re65 = /^uggc:\/\//;
+  var re66 = /(?:^|\s+)qvfnoyrq(?:\s+|$)/;
+  var str41 = 'uggc://cebsvyr.zlfcnpr.pbz/Zbqhyrf/Nccyvpngvbaf/Cntrf/Pnainf.nfck';
+  function runBlock8() {
+    for (var i = 0; i < 7; i++) {
+      s21[i].match(/\d+/g);
+      'nsgre'.replace(re64, '');
+      'orsber'.replace(re64, '');
+      'obggbz'.replace(re64, '');
+      'ohvygva_jrngure.kzy'.replace(re65, '');
+      'ohggba'.replace(re37, '');
+      'ohggba'.replace(re18, '');
+      'qngrgvzr.kzy'.replace(re65, '');
+      'uggc://eff.paa.pbz/eff/paa_gbcfgbevrf.eff'.replace(re65, '');
+      'vachg'.replace(re37, '');
+      'vachg'.replace(re18, '');
+      'vafvqr'.replace(re64, '');
+      'cbvagre'.replace(re27, '');
+      'cbfvgvba'.replace(/[A-Z]/g, '');
+      'gbc'.replace(re27, '');
+      'gbc'.replace(re64, '');
+      'hy'.replace(re37, '');
+      'hy'.replace(re18, '');
+      str26.replace(re37, '');
+      str26.replace(re18, '');
+      'lbhghor_vtbbtyr/i2/lbhghor.kzy'.replace(re65, '');
+      'm-vaqrk'.replace(re27, '');
+      /#([\w-]+)/.exec(str26);
+      re16.exec('urvtug');
+      re16.exec('znetvaGbc');
+      re16.exec('jvqgu');
+      re19.exec('gno0 svefg ba');
+      re19.exec('gno0 ba');
+      re19.exec('gno4 ynfg');
+      re19.exec('gno4');
+      re19.exec('gno5');
+      re19.exec('gno6');
+      re19.exec('gno7');
+      re19.exec('gno8');
+      /NqborNVE\/([^\s]*)/.exec(s15[i]);
+      /NccyrJroXvg\/([^ ]*)/.exec(s15[i]);
+      /XUGZY/gi.exec(s15[i]);
+      /^(?:obql|ugzy)$/i.exec('YV');
+      re38.exec('ohggba');
+      re38.exec('vachg');
+      re38.exec('hy');
+      re38.exec(str26);
+      /^(\w+|\*)/.exec(str26);
+      /znp|jva|yvahk/i.exec('Jva32');
+      /eton?\([\d\s,]+\)/.exec('fgngvp');
+    }
+    for (var i = 0; i < 6; i++) {
+      ''.replace(/\r/g, '');
+      '/'.replace(re40, '');
+      '/'.replace(re10, '');
+      '/'.replace(re51, '');
+      '/'.replace(re52, '');
+      '/'.replace(re53, '');
+      '/'.replace(re39, '');
+      '/'.replace(re54, '');
+      'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/{0}?[NDO]&{1}&{2}&[NDR]'.replace(re63, '');
+      str41.replace(re12, '');
+      'uggc://jjj.snprobbx.pbz/fepu.cuc'.replace(re23, '');
+      'freivpr'.replace(re40, '');
+      'freivpr'.replace(re41, '');
+      'freivpr'.replace(re42, '');
+      'freivpr'.replace(re43, '');
+      'freivpr'.replace(re44, '');
+      'freivpr'.replace(re45, '');
+      'freivpr'.replace(re46, '');
+      'freivpr'.replace(re47, '');
+      'freivpr'.replace(re48, '');
+      /((ZFVR\s+([6-9]|\d\d)\.))/.exec(s15[i]);
+      re66.exec('');
+      re50.exec('fryrpgrq');
+      re8.exec('8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn');
+      re8.exec('SbeprqRkcvengvba=633669340386893867');
+      re8.exec('VC=74.125.75.17');
+      re8.exec('FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn');
+      /Xbadhrebe|Fnsnev|XUGZY/.exec(s15[i]);
+      re13.exec(str41);
+      re49.exec('unfsbphf');
+    }
+  }
+  var re67 = /zrah_byq/g;
+  var str42 = 'FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669325184628362&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str43 = 'FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29; __hgzm=144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.3931862196947939300.1231364380.1231364380.1231364380.1; __hgzo=144631658.0.10.1231364380; __hgzp=144631658; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669325184628362&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str44 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_vzntrf_wf&qg=1231364373088&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231364373088&punaary=svz_zlfcnpr_hfre-ivrj-pbzzragf%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Spbzzrag.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1158737789.1231364375&tn_fvq=1231364375&tn_uvq=415520832&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str45 = 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669325184628362&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str46 = 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669325184628362&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var re68 = /^([#.]?)((?:[\w\u0128-\uffff*_-]|\\.)*)/;
+  var re69 = /\{1\}/g;
+  var re70 = /\s+/;
+  var re71 = /(\$\{4\})|(\$4\b)/g;
+  var re72 = /(\$\{5\})|(\$5\b)/g;
+  var re73 = /\{2\}/g;
+  var re74 = /[^+>] [^+>]/;
+  var re75 = /\bucpyv\s*=\s*([^;]*)/i;
+  var re76 = /\bucuvqr\s*=\s*([^;]*)/i;
+  var re77 = /\bucfie\s*=\s*([^;]*)/i;
+  var re78 = /\bhfucjrn\s*=\s*([^;]*)/i;
+  var re79 = /\bmvc\s*=\s*([^;]*)/i;
+  var re80 = /^((?:[\w\u0128-\uffff*_-]|\\.)+)(#)((?:[\w\u0128-\uffff*_-]|\\.)+)/;
+  var re81 = /^([>+~])\s*(\w*)/i;
+  var re82 = /^>\s*((?:[\w\u0128-\uffff*_-]|\\.)+)/;
+  var re83 = /^[\s[]?shapgvba/;
+  var re84 = /v\/g.tvs#(.*)/i;
+  var str47 = '#Zbq-Vasb-Vasb-WninFpevcgUvag';
+  var str48 = ',n.svryqOgaPnapry';
+  var str49 = 'FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669357391353591&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_kkk-gdzogv_80=4413241q3660';
+  var str50 = 'FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7; AFP_zp_kkk-gdzogv_80=4413241q3660; AFP_zp_kkk-aowb_80=4413235p3660; __hgzm=144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.2770915348920628700.1231367708.1231367708.1231367708.1; __hgzo=144631658.0.10.1231367708; __hgzp=144631658; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669357391353591&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str51 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231367691141&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367691141&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Sjjj.zlfcnpr.pbz%2S&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=320757904.1231367694&tn_fvq=1231367694&tn_uvq=1758792003&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str52 = 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55332979829981?[NDO]&aqu=1&g=7%2S0%2S2009%2014%3N38%3N42%203%20480&af=zfacbegny&cntrAnzr=HF%20UCZFSGJ&t=uggc%3N%2S%2Sjjj.zfa.pbz%2S&f=1024k768&p=24&x=L&oj=994&ou=634&uc=A&{2}&[NDR]';
+  var str53 = 'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq qbhoyr2 ps';
+  var str54 = 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669357391353591&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str55 = 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669357391353591&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str56 = 'ne;ng;nh;or;oe;pn;pu;py;pa;qr;qx;rf;sv;se;to;ux;vq;vr;va;vg;wc;xe;zk;zl;ay;ab;am;cu;cy;cg;eh;fr;ft;gu;ge;gj;mn;';
+  var str57 = 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886&GHVQ=1';
+  var str58 = 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886';
+  var str59 = 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886; mvc=m:94043|yn:37.4154|yb:-122.0585|p:HF|ue:1';
+  var str60 = 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886; mvc=m:94043|yn:37.4154|yb:-122.0585|p:HF';
+  var str61 = 'uggc://gx2.fgp.f-zfa.pbz/oe/uc/11/ra-hf/pff/v/g.tvs#uggc://gx2.fgo.f-zfa.pbz/v/29/4RQP4969777N048NPS4RRR3PO2S7S.wct';
+  var str62 = 'uggc://gx2.fgp.f-zfa.pbz/oe/uc/11/ra-hf/pff/v/g.tvs#uggc://gx2.fgo.f-zfa.pbz/v/OQ/63NP9O94NS5OQP1249Q9S1ROP7NS3.wct';
+  var str63 = 'zbmvyyn/5.0 (jvaqbjf; h; jvaqbjf ag 5.1; ra-hf) nccyrjroxvg/528.9 (xugzy, yvxr trpxb) puebzr/2.0.157.0 fnsnev/528.9';
+  var s94 = computeInputVariants(str42, 5);
+  var s95 = computeInputVariants(str43, 5);
+  var s96 = computeInputVariants(str44, 5);
+  var s97 = computeInputVariants(str47, 5);
+  var s98 = computeInputVariants(str48, 5);
+  var s99 = computeInputVariants(str49, 5);
+  var s100 = computeInputVariants(str50, 5);
+  var s101 = computeInputVariants(str51, 5);
+  var s102 = computeInputVariants(str52, 5);
+  var s103 = computeInputVariants(str53, 5);
+
+  function runBlock9() {
+    for (var i = 0; i < 5; i++) {
+      s94[i].split(re32);
+      s95[i].split(re32);
+      'svz_zlfcnpr_hfre-ivrj-pbzzragf,svz_zlfcnpr_havgrq-fgngrf'.split(re20);
+      s96[i].replace(re33, '');
+      'zrah_arj zrah_arj_gbttyr zrah_gbttyr'.replace(re67, '');
+      'zrah_byq zrah_byq_gbttyr zrah_gbttyr'.replace(re67, '');
+      re8.exec('102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98');
+      re8.exec('144631658.0.10.1231364380');
+      re8.exec('144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.3931862196947939300.1231364380.1231364380.1231364380.1');
+      re8.exec('441326q33660');
+      re8.exec('SbeprqRkcvengvba=633669341278771470');
+      re8.exec(str45);
+      re8.exec(str46);
+      re8.exec('AFP_zp_dfctwzssrwh-aowb_80=441326q33660');
+      re8.exec('FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98');
+      re8.exec('__hgzn=144631658.3931862196947939300.1231364380.1231364380.1231364380.1');
+      re8.exec('__hgzo=144631658.0.10.1231364380');
+      re8.exec('__hgzm=144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+    }
+    for (var i = 0; i < 4; i++) {
+      ' yvfg1'.replace(re14, '');
+      ' yvfg1'.replace(re15, '');
+      ' yvfg2'.replace(re14, '');
+      ' yvfg2'.replace(re15, '');
+      ' frneputebhc1'.replace(re14, '');
+      ' frneputebhc1'.replace(re15, '');
+      s97[i].replace(re68, '');
+      s97[i].replace(re18, '');
+      ''.replace(/&/g, '');
+      ''.replace(re35, '');
+      '(..-{0})(\|(\d+)|)'.replace(re63, '');
+      s98[i].replace(re18, '');
+      '//vzt.jro.qr/vij/FC/${cngu}/${anzr}/${inyhr}?gf=${abj}'.replace(re56, '');
+      '//vzt.jro.qr/vij/FC/tzk_uc/${anzr}/${inyhr}?gf=${abj}'.replace(/(\$\{anzr\})|(\$anzr\b)/g, '');
+      '<fcna pynff="urnq"><o>Jvaqbjf Yvir Ubgznvy</o></fcna><fcna pynff="zft">{1}</fcna>'.replace(re69, '');
+      '<fcna pynff="urnq"><o>{0}</o></fcna><fcna pynff="zft">{1}</fcna>'.replace(re63, '');
+      '<fcna pynff="fvtahc"><n uers=uggc://jjj.ubgznvy.pbz><o>{1}</o></n></fcna>'.replace(re69, '');
+      '<fcna pynff="fvtahc"><n uers={0}><o>{1}</o></n></fcna>'.replace(re63, '');
+      'Vzntrf'.replace(re15, '');
+      'ZFA'.replace(re15, '');
+      'Zncf'.replace(re15, '');
+      'Zbq-Vasb-Vasb-WninFpevcgUvag'.replace(re39, '');
+      'Arjf'.replace(re15, '');
+      s99[i].split(re32);
+      s100[i].split(re32);
+      'Ivqrb'.replace(re15, '');
+      'Jro'.replace(re15, '');
+      'n'.replace(re39, '');
+      'nwnkFgneg'.split(re70);
+      'nwnkFgbc'.split(re70);
+      'ovaq'.replace(re14, '');
+      'ovaq'.replace(re15, '');
+      'oevatf lbh zber. Zber fcnpr (5TO), zber frphevgl, fgvyy serr.'.replace(re63, '');
+      'puvyq p1 svefg qrpx'.replace(re14, '');
+      'puvyq p1 svefg qrpx'.replace(re15, '');
+      'puvyq p1 svefg qbhoyr2'.replace(re14, '');
+      'puvyq p1 svefg qbhoyr2'.replace(re15, '');
+      'puvyq p2 ynfg'.replace(re14, '');
+      'puvyq p2 ynfg'.replace(re15, '');
+      'puvyq p2'.replace(re14, '');
+      'puvyq p2'.replace(re15, '');
+      'puvyq p3'.replace(re14, '');
+      'puvyq p3'.replace(re15, '');
+      'puvyq p4 ynfg'.replace(re14, '');
+      'puvyq p4 ynfg'.replace(re15, '');
+      'pbclevtug'.replace(re14, '');
+      'pbclevtug'.replace(re15, '');
+      'qZFAZR_1'.replace(re14, '');
+      'qZFAZR_1'.replace(re15, '');
+      'qbhoyr2 ps'.replace(re14, '');
+      'qbhoyr2 ps'.replace(re15, '');
+      'qbhoyr2'.replace(re14, '');
+      'qbhoyr2'.replace(re15, '');
+      'uqy_arj'.replace(re14, '');
+      'uqy_arj'.replace(re15, '');
+      'uc_fubccvatobk'.replace(re30, '');
+      'ugzy%2Rvq'.replace(re29, '');
+      'ugzy%2Rvq'.replace(re30, '');
+      s101[i].replace(re33, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/cebgbglcr.wf${4}${5}'.replace(re71, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/cebgbglcr.wf${5}'.replace(re72, '');
+      s102[i].replace(re73, '');
+      'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55332979829981?[NDO]&{1}&{2}&[NDR]'.replace(re69, '');
+      'vztZFSG'.replace(re14, '');
+      'vztZFSG'.replace(re15, '');
+      'zfasbbg1 ps'.replace(re14, '');
+      'zfasbbg1 ps'.replace(re15, '');
+      s103[i].replace(re14, '');
+      s103[i].replace(re15, '');
+      'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq'.replace(re14, '');
+      'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq'.replace(re15, '');
+      'cevznel'.replace(re14, '');
+      'cevznel'.replace(re15, '');
+      'erpgnatyr'.replace(re30, '');
+      'frpbaqnel'.replace(re14, '');
+      'frpbaqnel'.replace(re15, '');
+      'haybnq'.split(re70);
+      '{0}{1}1'.replace(re63, '');
+      '|{1}1'.replace(re69, '');
+      /(..-HF)(\|(\d+)|)/i.exec('xb-xe,ra-va,gu-gu');
+      re4.exec('/ZlFcnprNccf/NccPnainf,45000012');
+      re8.exec('144631658.0.10.1231367708');
+      re8.exec('144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.2770915348920628700.1231367708.1231367708.1231367708.1');
+      re8.exec('4413235p3660');
+      re8.exec('441327q73660');
+      re8.exec('9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473');
+      re8.exec('SbeprqRkcvengvba=633669350559478880');
+      re8.exec(str54);
+      re8.exec(str55);
+      re8.exec('AFP_zp_dfctwzs-aowb_80=441327q73660');
+      re8.exec('AFP_zp_kkk-aowb_80=4413235p3660');
+      re8.exec('FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473');
+      re8.exec('__hgzn=144631658.2770915348920628700.1231367708.1231367708.1231367708.1');
+      re8.exec('__hgzo=144631658.0.10.1231367708');
+      re8.exec('__hgzm=144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(s99[i]);
+      re34.exec(s100[i]);
+      /ZFVR\s+5[.]01/.exec(s15[i]);
+      /HF(?=;)/i.exec(str56);
+      re74.exec(s97[i]);
+      re28.exec('svefg npgvir svefgNpgvir');
+      re28.exec('ynfg');
+      /\bp:(..)/i.exec('m:94043|yn:37.4154|yb:-122.0585|p:HF');
+      re75.exec(str57);
+      re75.exec(str58);
+      re76.exec(str57);
+      re76.exec(str58);
+      re77.exec(str57);
+      re77.exec(str58);
+      /\bhfucce\s*=\s*([^;]*)/i.exec(str59);
+      re78.exec(str57);
+      re78.exec(str58);
+      /\bjci\s*=\s*([^;]*)/i.exec(str59);
+      re79.exec(str58);
+      re79.exec(str60);
+      re79.exec(str59);
+      /\|p:([a-z]{2})/i.exec('m:94043|yn:37.4154|yb:-122.0585|p:HF|ue:1');
+      re80.exec(s97[i]);
+      re61.exec('cebgbglcr.wf');
+      re68.exec(s97[i]);
+      re81.exec(s97[i]);
+      re82.exec(s97[i]);
+      /^Fubpxjnir Synfu (\d)/.exec(s21[i]);
+      /^Fubpxjnir Synfu (\d+)/.exec(s21[i]);
+      re83.exec('[bowrpg tybony]');
+      re62.exec(s97[i]);
+      re84.exec(str61);
+      re84.exec(str62);
+      /jroxvg/.exec(str63);
+    }
+  }
+  var re85 = /eaq_zbqobkva/;
+  var str64 = '1231365729213';
+  var str65 = '74.125.75.3-1057165600.29978900';
+  var str66 = '74.125.75.3-1057165600.29978900.1231365730214';
+  var str67 = 'Frnepu%20Zvpebfbsg.pbz';
+  var str68 = 'FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn; ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669340386893867&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str69 = 'FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn; __hgzm=144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1877536177953918500.1231365779.1231365779.1231365779.1; __hgzo=144631658.0.10.1231365779; __hgzp=144631658; ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669340386893867&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str70 = 'I=3%26THVQ=757q3ss871q44o7o805n8113n5p72q52';
+  var str71 = 'I=3&THVQ=757q3ss871q44o7o805n8113n5p72q52';
+  var str72 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231365765292&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231365765292&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Sohyyrgvaf.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1579793869.1231365768&tn_fvq=1231365768&tn_uvq=2056210897&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str73 = 'frnepu.zvpebfbsg.pbz';
+  var str74 = 'frnepu.zvpebfbsg.pbz/';
+  var str75 = 'ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669340386893867&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str76 = 'ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669340386893867&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  function runBlock10() {
+    for (var i = 0; i < 3; i++) {
+      '%3Szxg=ra-HF'.replace(re39, '');
+      '-8'.replace(re40, '');
+      '-8'.replace(re10, '');
+      '-8'.replace(re51, '');
+      '-8'.replace(re52, '');
+      '-8'.replace(re53, '');
+      '-8'.replace(re39, '');
+      '-8'.replace(re54, '');
+      '1.5'.replace(re40, '');
+      '1.5'.replace(re10, '');
+      '1.5'.replace(re51, '');
+      '1.5'.replace(re52, '');
+      '1.5'.replace(re53, '');
+      '1.5'.replace(re39, '');
+      '1.5'.replace(re54, '');
+      '1024k768'.replace(re40, '');
+      '1024k768'.replace(re10, '');
+      '1024k768'.replace(re51, '');
+      '1024k768'.replace(re52, '');
+      '1024k768'.replace(re53, '');
+      '1024k768'.replace(re39, '');
+      '1024k768'.replace(re54, '');
+      str64.replace(re40, '');
+      str64.replace(re10, '');
+      str64.replace(re51, '');
+      str64.replace(re52, '');
+      str64.replace(re53, '');
+      str64.replace(re39, '');
+      str64.replace(re54, '');
+      '14'.replace(re40, '');
+      '14'.replace(re10, '');
+      '14'.replace(re51, '');
+      '14'.replace(re52, '');
+      '14'.replace(re53, '');
+      '14'.replace(re39, '');
+      '14'.replace(re54, '');
+      '24'.replace(re40, '');
+      '24'.replace(re10, '');
+      '24'.replace(re51, '');
+      '24'.replace(re52, '');
+      '24'.replace(re53, '');
+      '24'.replace(re39, '');
+      '24'.replace(re54, '');
+      str65.replace(re40, '');
+      str65.replace(re10, '');
+      str65.replace(re51, '');
+      str65.replace(re52, '');
+      str65.replace(re53, '');
+      str65.replace(re39, '');
+      str65.replace(re54, '');
+      str66.replace(re40, '');
+      str66.replace(re10, '');
+      str66.replace(re51, '');
+      str66.replace(re52, '');
+      str66.replace(re53, '');
+      str66.replace(re39, '');
+      str66.replace(re54, '');
+      '9.0'.replace(re40, '');
+      '9.0'.replace(re10, '');
+      '9.0'.replace(re51, '');
+      '9.0'.replace(re52, '');
+      '9.0'.replace(re53, '');
+      '9.0'.replace(re39, '');
+      '9.0'.replace(re54, '');
+      '994k634'.replace(re40, '');
+      '994k634'.replace(re10, '');
+      '994k634'.replace(re51, '');
+      '994k634'.replace(re52, '');
+      '994k634'.replace(re53, '');
+      '994k634'.replace(re39, '');
+      '994k634'.replace(re54, '');
+      '?zxg=ra-HF'.replace(re40, '');
+      '?zxg=ra-HF'.replace(re10, '');
+      '?zxg=ra-HF'.replace(re51, '');
+      '?zxg=ra-HF'.replace(re52, '');
+      '?zxg=ra-HF'.replace(re53, '');
+      '?zxg=ra-HF'.replace(re54, '');
+      'PAA.pbz'.replace(re25, '');
+      'PAA.pbz'.replace(re12, '');
+      'PAA.pbz'.replace(re39, '');
+      'Qngr & Gvzr'.replace(re25, '');
+      'Qngr & Gvzr'.replace(re12, '');
+      'Qngr & Gvzr'.replace(re39, '');
+      'Frnepu Zvpebfbsg.pbz'.replace(re40, '');
+      'Frnepu Zvpebfbsg.pbz'.replace(re54, '');
+      str67.replace(re10, '');
+      str67.replace(re51, '');
+      str67.replace(re52, '');
+      str67.replace(re53, '');
+      str67.replace(re39, '');
+      str68.split(re32);
+      str69.split(re32);
+      str70.replace(re52, '');
+      str70.replace(re53, '');
+      str70.replace(re39, '');
+      str71.replace(re40, '');
+      str71.replace(re10, '');
+      str71.replace(re51, '');
+      str71.replace(re54, '');
+      'Jrngure'.replace(re25, '');
+      'Jrngure'.replace(re12, '');
+      'Jrngure'.replace(re39, '');
+      'LbhGhor'.replace(re25, '');
+      'LbhGhor'.replace(re12, '');
+      'LbhGhor'.replace(re39, '');
+      str72.replace(re33, '');
+      'erzbgr_vsenzr_1'.replace(/^erzbgr_vsenzr_/, '');
+      str73.replace(re40, '');
+      str73.replace(re10, '');
+      str73.replace(re51, '');
+      str73.replace(re52, '');
+      str73.replace(re53, '');
+      str73.replace(re39, '');
+      str73.replace(re54, '');
+      str74.replace(re40, '');
+      str74.replace(re10, '');
+      str74.replace(re51, '');
+      str74.replace(re52, '');
+      str74.replace(re53, '');
+      str74.replace(re39, '');
+      str74.replace(re54, '');
+      'lhv-h'.replace(/\-/g, '');
+      re9.exec('p');
+      re9.exec('qz p');
+      re9.exec('zbqynory');
+      re9.exec('lhv-h svefg');
+      re8.exec('144631658.0.10.1231365779');
+      re8.exec('144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.1877536177953918500.1231365779.1231365779.1231365779.1');
+      re8.exec(str75);
+      re8.exec(str76);
+      re8.exec('__hgzn=144631658.1877536177953918500.1231365779.1231365779.1231365779.1');
+      re8.exec('__hgzo=144631658.0.10.1231365779');
+      re8.exec('__hgzm=144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(str68);
+      re34.exec(str69);
+      /^$/.exec('');
+      re31.exec('qr');
+      /^znk\d+$/.exec('');
+      /^zva\d+$/.exec('');
+      /^erfgber$/.exec('');
+      re85.exec('zbqobkva zbqobk_abcnqqvat ');
+      re85.exec('zbqgvgyr');
+      re85.exec('eaq_zbqobkva ');
+      re85.exec('eaq_zbqgvgyr ');
+      /frpgvba\d+_pbagragf/.exec('obggbz_ani');
+    }
+  }
+  var re86 = /;\s*/;
+  var re87 = /(\$\{inyhr\})|(\$inyhr\b)/g;
+  var re88 = /(\$\{abj\})|(\$abj\b)/g;
+  var re89 = /\s+$/;
+  var re90 = /^\s+/;
+  var re91 = /(\\\"|\x00-|\x1f|\x7f-|\x9f|\u00ad|\u0600-|\u0604|\u070f|\u17b4|\u17b5|\u200c-|\u200f|\u2028-|\u202f|\u2060-|\u206f|\ufeff|\ufff0-|\uffff)/g;
+  var re92 = /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/;
+  var re93 = /^([:.#]*)((?:[\w\u0128-\uffff*_-]|\\.)+)/;
+  var re94 = /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/;
+  var str77 = '#fubhgobk .pybfr';
+  var str78 = 'FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669341278771470&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzssrwh-aowb_80=441326q33660';
+  var str79 = 'FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98; AFP_zp_dfctwzssrwh-aowb_80=441326q33660; __hgzm=144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1670816052019209000.1231365869.1231365869.1231365869.1; __hgzo=144631658.0.10.1231365869; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669341278771470&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str80 = 'FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669350559478880&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzs-aowb_80=441327q73660';
+  var str81 = 'FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473; AFP_zp_dfctwzs-aowb_80=441327q73660; __hgzm=144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1796080716621419500.1231367054.1231367054.1231367054.1; __hgzo=144631658.0.10.1231367054; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669350559478880&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str82 = '[glcr=fhozvg]';
+  var str83 = 'n.svryqOga,n.svryqOgaPnapry';
+  var str84 = 'n.svryqOgaPnapry';
+  var str85 = 'oyvpxchaxg';
+  var str86 = 'qvi.bow-nppbeqvba qg';
+  var str87 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_nccf_wf&qg=1231367052227&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367052227&punaary=svz_zlfcnpr_nccf-pnainf%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyr.zlfcnpr.pbz%2SZbqhyrf%2SNccyvpngvbaf%2SCntrf%2SPnainf.nfck&nq_glcr=grkg&rvq=6083027&rn=0&sez=1&tn_ivq=716357910.1231367056&tn_fvq=1231367056&tn_uvq=1387206491&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str88 = 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231365851658&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231365851658&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyrrqvg.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1979828129.1231365855&tn_fvq=1231365855&tn_uvq=2085229649&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22';
+  var str89 = 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55023338617756?[NDO]&aqu=1&g=7%2S0%2S2009%2014%3N12%3N47%203%20480&af=zfacbegny&cntrAnzr=HF%20UCZFSGJ&t=uggc%3N%2S%2Sjjj.zfa.pbz%2S&f=0k0&p=43835816&x=A&oj=994&ou=634&uc=A&{2}&[NDR]';
+  var str90 = 'zrgn[anzr=nwnkHey]';
+  var str91 = 'anpuevpugra';
+  var str92 = 'b oS={\'oT\':1.1};x $8n(B){z(B!=o9)};x $S(B){O(!$8n(B))z A;O(B.4L)z\'T\';b S=7t B;O(S==\'2P\'&&B.p4){23(B.7f){12 1:z\'T\';12 3:z/\S/.2g(B.8M)?\'ox\':\'oh\'}}O(S==\'2P\'||S==\'x\'){23(B.nE){12 2V:z\'1O\';12 7I:z\'5a\';12 18:z\'4B\'}O(7t B.I==\'4F\'){O(B.3u)z\'pG\';O(B.8e)z\'1p\'}}z S};x $2p(){b 4E={};Z(b v=0;v<1p.I;v++){Z(b X 1o 1p[v]){b nc=1p[v][X];b 6E=4E[X];O(6E&&$S(nc)==\'2P\'&&$S(6E)==\'2P\')4E[X]=$2p(6E,nc);17 4E[X]=nc}}z 4E};b $E=7p.E=x(){b 1d=1p;O(!1d[1])1d=[p,1d[0]];Z(b X 1o 1d[1])1d[0][X]=1d[1][X];z 1d[0]};b $4D=7p.pJ=x(){Z(b v=0,y=1p.I;v<y;v++){1p[v].E=x(1J){Z(b 1I 1o 1J){O(!p.1Y[1I])p.1Y[1I]=1J[1I];O(!p[1I])p[1I]=$4D.6C(1I)}}}};$4D.6C=x(1I){z x(L){z p.1Y[1I].3H(L,2V.1Y.nV.1F(1p,1))}};$4D(7F,2V,6J,nb);b 3l=x(B){B=B||{};B.E=$E;z B};b pK=Y 3l(H);b pZ=Y 3l(C);C.6f=C.35(\'6f\')[0];x $2O(B){z!!(B||B===0)};x $5S(B,n8){z $8n(B)?B:n8};x $7K(3c,1m){z 1q.na(1q.7K()*(1m-3c+1)+3c)};x $3N(){z Y 97().os()};x $4M(1U){pv(1U);pa(1U);z 1S};H.43=!!(C.5Z);O(H.nB)H.31=H[H.7q?\'py\':\'nL\']=1r;17 O(C.9N&&!C.om&&!oy.oZ)H.pF=H.4Z=H[H.43?\'pt\':\'65\']=1r;17 O(C.po!=1S)H.7J=1r;O(7t 5B==\'o9\'){b 5B=x(){};O(H.4Z)C.nd("pW");5B.1Y=(H.4Z)?H["[[oN.1Y]]"]:{}}5B.1Y.4L=1r;O(H.nL)5s{C.oX("pp",A,1r)}4K(r){};b 18=x(1X){b 63=x(){z(1p[0]!==1S&&p.1w&&$S(p.1w)==\'x\')?p.1w.3H(p,1p):p};$E(63,p);63.1Y=1X;63.nE=18;z 63};18.1z=x(){};18.1Y={E:x(1X){b 7x=Y p(1S);Z(b X 1o 1X){b nC=7x[X];7x[X]=18.nY(nC,1X[X])}z Y 18(7x)},3d:x(){Z(b v=0,y=1p.I;v<y;v++)$E(p.1Y,1p[v])}};18.nY=x(2b,2n){O(2b&&2b!=2n){b S=$S(2n);O(S!=$S(2b))z 2n;23(S){12\'x\':b 7R=x(){p.1e=1p.8e.1e;z 2n.3H(p,1p)};7R.1e=2b;z 7R;12\'2P\':z $2p(2b,2n)}}z 2n};b 8o=Y 18({oQ:x(J){p.4w=p.4w||[];p.4w.1x(J);z p},7g:x(){O(p.4w&&p.4w.I)p.4w.9J().2x(10,p)},oP:x(){p.4w=[]}});b 2d=Y 18({1V:x(S,J){O(J!=18.1z){p.$19=p.$19||{};p.$19[S]=p.$19[S]||[];p.$19[S].5j(J)}z p},1v:x(S,1d,2x){O(p.$19&&p.$19[S]){p.$19[S].1b(x(J){J.3n({\'L\':p,\'2x\':2x,\'1p\':1d})()},p)}z p},3M:x(S,J){O(p.$19&&p.$19[S])p.$19[S].2U(J);z p}});b 4v=Y 18({2H:x(){p.P=$2p.3H(1S,[p.P].E(1p));O(!p.1V)z p;Z(b 3O 1o p.P){O($S(p.P[3O]==\'x\')&&3O.2g(/^5P[N-M]/))p.1V(3O,p.P[3O])}z p}});2V.E({7y:x(J,L){Z(b v=0,w=p.I;v<w;v++)J.1F(L,p[v],v,p)},3s:x(J,L){b 54=[];Z(b v=0,w=p.I;v<w;v++){O(J.1F(L,p[v],v,p))54.1x(p[v])}z 54},2X:x(J,L){b 54=[];Z(b v=0,w=p.I;v<w;v++)54[v]=J.1F(L,p[v],v,p);z 54},4i:x(J,L){Z(b v=0,w=p.I;v<w;v++){O(!J.1F(L,p[v],v,p))z A}z 1r},ob:x(J,L){Z(b v=0,w=p.I;v<w;v++){O(J.1F(L,p[v],v,p))z 1r}z A},3F:x(3u,15){b 3A=p.I;Z(b v=(15<0)?1q.1m(0,3A+15):15||0;v<3A;v++){O(p[v]===3u)z v}z-1},8z:x(1u,I){1u=1u||0;O(1u<0)1u=p.I+1u;I=I||(p.I-1u);b 89=[];Z(b v=0;v<I;v++)89[v]=p[1u++];z 89},2U:x(3u){b v=0;b 3A=p.I;6L(v<3A){O(p[v]===3u){p.6l(v,1);3A--}17{v++}}z p},1y:x(3u,15){z p.3F(3u,15)!=-1},oz:x(1C){b B={},I=1q.3c(p.I,1C.I);Z(b v=0;v<I;v++)B[1C[v]]=p[v];z B},E:x(1O){Z(b v=0,w=1O.I;v<w;v++)p.1x(1O[v]);z p},2p:x(1O){Z(b v=0,y=1O.I;v<y;v++)p.5j(1O[v]);z p},5j:x(3u){O(!p.1y(3u))p.1x(3u);z p},oc:x(){z p[$7K(0,p.I-1)]||A},7L:x(){z p[p.I-1]||A}});2V.1Y.1b=2V.1Y.7y;2V.1Y.2g=2V.1Y.1y;x $N(1O){z 2V.8z(1O)};x $1b(3J,J,L){O(3J&&7t 3J.I==\'4F\'&&$S(3J)!=\'2P\')2V.7y(3J,J,L);17 Z(b 1j 1o 3J)J.1F(L||3J,3J[1j],1j)};6J.E({2g:x(6b,2F){z(($S(6b)==\'2R\')?Y 7I(6b,2F):6b).2g(p)},3p:x(){z 5K(p,10)},o4:x(){z 69(p)},7A:x(){z p.3y(/-\D/t,x(2G){z 2G.7G(1).nW()})},9b:x(){z p.3y(/\w[N-M]/t,x(2G){z(2G.7G(0)+\'-\'+2G.7G(1).5O())})},8V:x(){z p.3y(/\b[n-m]/t,x(2G){z 2G.nW()})},5L:x(){z p.3y(/^\s+|\s+$/t,\'\')},7j:x(){z p.3y(/\s{2,}/t,\' \').5L()},5V:x(1O){b 1i=p.2G(/\d{1,3}/t);z(1i)?1i.5V(1O):A},5U:x(1O){b 3P=p.2G(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);z(3P)?3P.nV(1).5U(1O):A},1y:x(2R,f){z(f)?(f+p+f).3F(f+2R+f)>-1:p.3F(2R)>-1},nX:x(){z p.3y(/([.*+?^${}()|[\]\/\\])/t,\'\\$1\')}});2V.E({5V:x(1O){O(p.I<3)z A;O(p.I==4&&p[3]==0&&!1O)z\'p5\';b 3P=[];Z(b v=0;v<3;v++){b 52=(p[v]-0).4h(16);3P.1x((52.I==1)?\'0\'+52:52)}z 1O?3P:\'#\'+3P.2u(\'\')},5U:x(1O){O(p.I!=3)z A;b 1i=[];Z(b v=0;v<3;v++){1i.1x(5K((p[v].I==1)?p[v]+p[v]:p[v],16))}z 1O?1i:\'1i(\'+1i.2u(\',\')+\')\'}});7F.E({3n:x(P){b J=p;P=$2p({\'L\':J,\'V\':A,\'1p\':1S,\'2x\':A,\'4s\':A,\'6W\':A},P);O($2O(P.1p)&&$S(P.1p)!=\'1O\')P.1p=[P.1p];z x(V){b 1d;O(P.V){V=V||H.V;1d=[(P.V===1r)?V:Y P.V(V)];O(P.1p)1d.E(P.1p)}17 1d=P.1p||1p;b 3C=x(){z J.3H($5S(P';
+  var str93 = 'hagreunyghat';
+  var str94 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669341278771470&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str95 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669350559478880&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q';
+  var str96 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669341278771470&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str97 = 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669350559478880&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=';
+  var str98 = 'shapgvba (){Cuk.Nccyvpngvba.Frghc.Pber();Cuk.Nccyvpngvba.Frghc.Nwnk();Cuk.Nccyvpngvba.Frghc.Synfu();Cuk.Nccyvpngvba.Frghc.Zbqhyrf()}';
+  function runBlock11() {
+    for (var i = 0; i < 2; i++) {
+      ' .pybfr'.replace(re18, '');
+      ' n.svryqOgaPnapry'.replace(re18, '');
+      ' qg'.replace(re18, '');
+      str77.replace(re68, '');
+      str77.replace(re18, '');
+      ''.replace(re39, '');
+      ''.replace(/^/, '');
+      ''.split(re86);
+      '*'.replace(re39, '');
+      '*'.replace(re68, '');
+      '*'.replace(re18, '');
+      '.pybfr'.replace(re68, '');
+      '.pybfr'.replace(re18, '');
+      '//vzt.jro.qr/vij/FC/tzk_uc/fperra/${inyhr}?gf=${abj}'.replace(re87, '');
+      '//vzt.jro.qr/vij/FC/tzk_uc/fperra/1024?gf=${abj}'.replace(re88, '');
+      '//vzt.jro.qr/vij/FC/tzk_uc/jvafvmr/${inyhr}?gf=${abj}'.replace(re87, '');
+      '//vzt.jro.qr/vij/FC/tzk_uc/jvafvmr/992/608?gf=${abj}'.replace(re88, '');
+      '300k120'.replace(re30, '');
+      '300k250'.replace(re30, '');
+      '310k120'.replace(re30, '');
+      '310k170'.replace(re30, '');
+      '310k250'.replace(re30, '');
+      '9.0  e115'.replace(/^.*\.(.*)\s.*$/, '');
+      'Nppbeqvba'.replace(re2, '');
+      'Nxghryy\x0a'.replace(re89, '');
+      'Nxghryy\x0a'.replace(re90, '');
+      'Nccyvpngvba'.replace(re2, '');
+      'Oyvpxchaxg\x0a'.replace(re89, '');
+      'Oyvpxchaxg\x0a'.replace(re90, '');
+      'Svanamra\x0a'.replace(re89, '');
+      'Svanamra\x0a'.replace(re90, '');
+      'Tnzrf\x0a'.replace(re89, '');
+      'Tnzrf\x0a'.replace(re90, '');
+      'Ubebfxbc\x0a'.replace(re89, '');
+      'Ubebfxbc\x0a'.replace(re90, '');
+      'Xvab\x0a'.replace(re89, '');
+      'Xvab\x0a'.replace(re90, '');
+      'Zbqhyrf'.replace(re2, '');
+      'Zhfvx\x0a'.replace(re89, '');
+      'Zhfvx\x0a'.replace(re90, '');
+      'Anpuevpugra\x0a'.replace(re89, '');
+      'Anpuevpugra\x0a'.replace(re90, '');
+      'Cuk'.replace(re2, '');
+      'ErdhrfgSvavfu'.split(re70);
+      'ErdhrfgSvavfu.NWNK.Cuk'.split(re70);
+      'Ebhgr\x0a'.replace(re89, '');
+      'Ebhgr\x0a'.replace(re90, '');
+      str78.split(re32);
+      str79.split(re32);
+      str80.split(re32);
+      str81.split(re32);
+      'Fcbeg\x0a'.replace(re89, '');
+      'Fcbeg\x0a'.replace(re90, '');
+      'GI-Fcbg\x0a'.replace(re89, '');
+      'GI-Fcbg\x0a'.replace(re90, '');
+      'Gbhe\x0a'.replace(re89, '');
+      'Gbhe\x0a'.replace(re90, '');
+      'Hagreunyghat\x0a'.replace(re89, '');
+      'Hagreunyghat\x0a'.replace(re90, '');
+      'Ivqrb\x0a'.replace(re89, '');
+      'Ivqrb\x0a'.replace(re90, '');
+      'Jrggre\x0a'.replace(re89, '');
+      'Jrggre\x0a'.replace(re90, '');
+      str82.replace(re68, '');
+      str82.replace(re18, '');
+      str83.replace(re68, '');
+      str83.replace(re18, '');
+      str84.replace(re68, '');
+      str84.replace(re18, '');
+      'nqiFreivprObk'.replace(re30, '');
+      'nqiFubccvatObk'.replace(re30, '');
+      'nwnk'.replace(re39, '');
+      'nxghryy'.replace(re40, '');
+      'nxghryy'.replace(re41, '');
+      'nxghryy'.replace(re42, '');
+      'nxghryy'.replace(re43, '');
+      'nxghryy'.replace(re44, '');
+      'nxghryy'.replace(re45, '');
+      'nxghryy'.replace(re46, '');
+      'nxghryy'.replace(re47, '');
+      'nxghryy'.replace(re48, '');
+      str85.replace(re40, '');
+      str85.replace(re41, '');
+      str85.replace(re42, '');
+      str85.replace(re43, '');
+      str85.replace(re44, '');
+      str85.replace(re45, '');
+      str85.replace(re46, '');
+      str85.replace(re47, '');
+      str85.replace(re48, '');
+      'pngrtbel'.replace(re29, '');
+      'pngrtbel'.replace(re30, '');
+      'pybfr'.replace(re39, '');
+      'qvi'.replace(re39, '');
+      str86.replace(re68, '');
+      str86.replace(re18, '');
+      'qg'.replace(re39, '');
+      'qg'.replace(re68, '');
+      'qg'.replace(re18, '');
+      'rzorq'.replace(re39, '');
+      'rzorq'.replace(re68, '');
+      'rzorq'.replace(re18, '');
+      'svryqOga'.replace(re39, '');
+      'svryqOgaPnapry'.replace(re39, '');
+      'svz_zlfcnpr_nccf-pnainf,svz_zlfcnpr_havgrq-fgngrf'.split(re20);
+      'svanamra'.replace(re40, '');
+      'svanamra'.replace(re41, '');
+      'svanamra'.replace(re42, '');
+      'svanamra'.replace(re43, '');
+      'svanamra'.replace(re44, '');
+      'svanamra'.replace(re45, '');
+      'svanamra'.replace(re46, '');
+      'svanamra'.replace(re47, '');
+      'svanamra'.replace(re48, '');
+      'sbphf'.split(re70);
+      'sbphf.gno sbphfva.gno'.split(re70);
+      'sbphfva'.split(re70);
+      'sbez'.replace(re39, '');
+      'sbez.nwnk'.replace(re68, '');
+      'sbez.nwnk'.replace(re18, '');
+      'tnzrf'.replace(re40, '');
+      'tnzrf'.replace(re41, '');
+      'tnzrf'.replace(re42, '');
+      'tnzrf'.replace(re43, '');
+      'tnzrf'.replace(re44, '');
+      'tnzrf'.replace(re45, '');
+      'tnzrf'.replace(re46, '');
+      'tnzrf'.replace(re47, '');
+      'tnzrf'.replace(re48, '');
+      'ubzrcntr'.replace(re30, '');
+      'ubebfxbc'.replace(re40, '');
+      'ubebfxbc'.replace(re41, '');
+      'ubebfxbc'.replace(re42, '');
+      'ubebfxbc'.replace(re43, '');
+      'ubebfxbc'.replace(re44, '');
+      'ubebfxbc'.replace(re45, '');
+      'ubebfxbc'.replace(re46, '');
+      'ubebfxbc'.replace(re47, '');
+      'ubebfxbc'.replace(re48, '');
+      'uc_cebzbobk_ugzy%2Puc_cebzbobk_vzt'.replace(re30, '');
+      'uc_erpgnatyr'.replace(re30, '');
+      str87.replace(re33, '');
+      str88.replace(re33, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf${4}${5}'.replace(re71, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf${5}'.replace(re72, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/qlaYvo.wf${4}${5}'.replace(re71, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/qlaYvo.wf${5}'.replace(re72, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/rssrpgYvo.wf${4}${5}'.replace(re71, '');
+      'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/rssrpgYvo.wf${5}'.replace(re72, '');
+      str89.replace(re73, '');
+      'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55023338617756?[NDO]&{1}&{2}&[NDR]'.replace(re69, '');
+      str6.replace(re23, '');
+      'xvab'.replace(re40, '');
+      'xvab'.replace(re41, '');
+      'xvab'.replace(re42, '');
+      'xvab'.replace(re43, '');
+      'xvab'.replace(re44, '');
+      'xvab'.replace(re45, '');
+      'xvab'.replace(re46, '');
+      'xvab'.replace(re47, '');
+      'xvab'.replace(re48, '');
+      'ybnq'.split(re70);
+      'zrqvnzbqgno lhv-anifrg lhv-anifrg-gbc'.replace(re18, '');
+      'zrgn'.replace(re39, '');
+      str90.replace(re68, '');
+      str90.replace(re18, '');
+      'zbhfrzbir'.split(re70);
+      'zbhfrzbir.gno'.split(re70);
+      str63.replace(/^.*jroxvg\/(\d+(\.\d+)?).*$/, '');
+      'zhfvx'.replace(re40, '');
+      'zhfvx'.replace(re41, '');
+      'zhfvx'.replace(re42, '');
+      'zhfvx'.replace(re43, '');
+      'zhfvx'.replace(re44, '');
+      'zhfvx'.replace(re45, '');
+      'zhfvx'.replace(re46, '');
+      'zhfvx'.replace(re47, '');
+      'zhfvx'.replace(re48, '');
+      'zlfcnpr_nccf_pnainf'.replace(re52, '');
+      str91.replace(re40, '');
+      str91.replace(re41, '');
+      str91.replace(re42, '');
+      str91.replace(re43, '');
+      str91.replace(re44, '');
+      str91.replace(re45, '');
+      str91.replace(re46, '');
+      str91.replace(re47, '');
+      str91.replace(re48, '');
+      'anzr'.replace(re39, '');
+      str92.replace(/\b\w+\b/g, '');
+      'bow-nppbeqvba'.replace(re39, '');
+      'bowrpg'.replace(re39, '');
+      'bowrpg'.replace(re68, '');
+      'bowrpg'.replace(re18, '');
+      'cnenzf%2Rfglyrf'.replace(re29, '');
+      'cnenzf%2Rfglyrf'.replace(re30, '');
+      'cbchc'.replace(re30, '');
+      'ebhgr'.replace(re40, '');
+      'ebhgr'.replace(re41, '');
+      'ebhgr'.replace(re42, '');
+      'ebhgr'.replace(re43, '');
+      'ebhgr'.replace(re44, '');
+      'ebhgr'.replace(re45, '');
+      'ebhgr'.replace(re46, '');
+      'ebhgr'.replace(re47, '');
+      'ebhgr'.replace(re48, '');
+      'freivprobk_uc'.replace(re30, '');
+      'fubccvatobk_uc'.replace(re30, '');
+      'fubhgobk'.replace(re39, '');
+      'fcbeg'.replace(re40, '');
+      'fcbeg'.replace(re41, '');
+      'fcbeg'.replace(re42, '');
+      'fcbeg'.replace(re43, '');
+      'fcbeg'.replace(re44, '');
+      'fcbeg'.replace(re45, '');
+      'fcbeg'.replace(re46, '');
+      'fcbeg'.replace(re47, '');
+      'fcbeg'.replace(re48, '');
+      'gbhe'.replace(re40, '');
+      'gbhe'.replace(re41, '');
+      'gbhe'.replace(re42, '');
+      'gbhe'.replace(re43, '');
+      'gbhe'.replace(re44, '');
+      'gbhe'.replace(re45, '');
+      'gbhe'.replace(re46, '');
+      'gbhe'.replace(re47, '');
+      'gbhe'.replace(re48, '');
+      'gi-fcbg'.replace(re40, '');
+      'gi-fcbg'.replace(re41, '');
+      'gi-fcbg'.replace(re42, '');
+      'gi-fcbg'.replace(re43, '');
+      'gi-fcbg'.replace(re44, '');
+      'gi-fcbg'.replace(re45, '');
+      'gi-fcbg'.replace(re46, '');
+      'gi-fcbg'.replace(re47, '');
+      'gi-fcbg'.replace(re48, '');
+      'glcr'.replace(re39, '');
+      'haqrsvarq'.replace(/\//g, '');
+      str93.replace(re40, '');
+      str93.replace(re41, '');
+      str93.replace(re42, '');
+      str93.replace(re43, '');
+      str93.replace(re44, '');
+      str93.replace(re45, '');
+      str93.replace(re46, '');
+      str93.replace(re47, '');
+      str93.replace(re48, '');
+      'ivqrb'.replace(re40, '');
+      'ivqrb'.replace(re41, '');
+      'ivqrb'.replace(re42, '');
+      'ivqrb'.replace(re43, '');
+      'ivqrb'.replace(re44, '');
+      'ivqrb'.replace(re45, '');
+      'ivqrb'.replace(re46, '');
+      'ivqrb'.replace(re47, '');
+      'ivqrb'.replace(re48, '');
+      'ivfvgf=1'.split(re86);
+      'jrggre'.replace(re40, '');
+      'jrggre'.replace(re41, '');
+      'jrggre'.replace(re42, '');
+      'jrggre'.replace(re43, '');
+      'jrggre'.replace(re44, '');
+      'jrggre'.replace(re45, '');
+      'jrggre'.replace(re46, '');
+      'jrggre'.replace(re47, '');
+      'jrggre'.replace(re48, '');
+      /#[a-z0-9]+$/i.exec('uggc://jjj.fpuhryreim.arg/Qrsnhyg');
+      re66.exec('fryrpgrq');
+      /(?:^|\s+)lhv-ani(?:\s+|$)/.exec('sff lhv-ani');
+      /(?:^|\s+)lhv-anifrg(?:\s+|$)/.exec('zrqvnzbqgno lhv-anifrg');
+      /(?:^|\s+)lhv-anifrg-gbc(?:\s+|$)/.exec('zrqvnzbqgno lhv-anifrg');
+      re91.exec('GnoThvq');
+      re91.exec('thvq');
+      /(pbzcngvoyr|jroxvg)/.exec(str63);
+      /.+(?:ei|vg|en|vr)[\/: ]([\d.]+)/.exec(str63);
+      re8.exec('144631658.0.10.1231365869');
+      re8.exec('144631658.0.10.1231367054');
+      re8.exec('144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('144631658.1670816052019209000.1231365869.1231365869.1231365869.1');
+      re8.exec('144631658.1796080716621419500.1231367054.1231367054.1231367054.1');
+      re8.exec(str94);
+      re8.exec(str95);
+      re8.exec(str96);
+      re8.exec(str97);
+      re8.exec('__hgzn=144631658.1670816052019209000.1231365869.1231365869.1231365869.1');
+      re8.exec('__hgzn=144631658.1796080716621419500.1231367054.1231367054.1231367054.1');
+      re8.exec('__hgzo=144631658.0.10.1231365869');
+      re8.exec('__hgzo=144631658.0.10.1231367054');
+      re8.exec('__hgzm=144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re8.exec('__hgzm=144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)');
+      re34.exec(str78);
+      re34.exec(str79);
+      re34.exec(str81);
+      re74.exec(str77);
+      re74.exec('*');
+      re74.exec(str82);
+      re74.exec(str83);
+      re74.exec(str86);
+      re74.exec('rzorq');
+      re74.exec('sbez.nwnk');
+      re74.exec(str90);
+      re74.exec('bowrpg');
+      /\/onfr.wf(\?.+)?$/.exec('/uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf');
+      re28.exec('uvag ynfgUvag ynfg');
+      re75.exec('');
+      re76.exec('');
+      re77.exec('');
+      re78.exec('');
+      re80.exec(str77);
+      re80.exec('*');
+      re80.exec('.pybfr');
+      re80.exec(str82);
+      re80.exec(str83);
+      re80.exec(str84);
+      re80.exec(str86);
+      re80.exec('qg');
+      re80.exec('rzorq');
+      re80.exec('sbez.nwnk');
+      re80.exec(str90);
+      re80.exec('bowrpg');
+      re61.exec('qlaYvo.wf');
+      re61.exec('rssrpgYvo.wf');
+      re61.exec('uggc://jjj.tzk.arg/qr/?fgnghf=uvajrvf');
+      re92.exec(' .pybfr');
+      re92.exec(' n.svryqOgaPnapry');
+      re92.exec(' qg');
+      re92.exec(str48);
+      re92.exec('.nwnk');
+      re92.exec('.svryqOga,n.svryqOgaPnapry');
+      re92.exec('.svryqOgaPnapry');
+      re92.exec('.bow-nppbeqvba qg');
+      re68.exec(str77);
+      re68.exec('*');
+      re68.exec('.pybfr');
+      re68.exec(str82);
+      re68.exec(str83);
+      re68.exec(str84);
+      re68.exec(str86);
+      re68.exec('qg');
+      re68.exec('rzorq');
+      re68.exec('sbez.nwnk');
+      re68.exec(str90);
+      re68.exec('bowrpg');
+      re93.exec(' .pybfr');
+      re93.exec(' n.svryqOgaPnapry');
+      re93.exec(' qg');
+      re93.exec(str48);
+      re93.exec('.nwnk');
+      re93.exec('.svryqOga,n.svryqOgaPnapry');
+      re93.exec('.svryqOgaPnapry');
+      re93.exec('.bow-nppbeqvba qg');
+      re81.exec(str77);
+      re81.exec('*');
+      re81.exec(str48);
+      re81.exec('.pybfr');
+      re81.exec(str82);
+      re81.exec(str83);
+      re81.exec(str84);
+      re81.exec(str86);
+      re81.exec('qg');
+      re81.exec('rzorq');
+      re81.exec('sbez.nwnk');
+      re81.exec(str90);
+      re81.exec('bowrpg');
+      re94.exec(' .pybfr');
+      re94.exec(' n.svryqOgaPnapry');
+      re94.exec(' qg');
+      re94.exec(str48);
+      re94.exec('.nwnk');
+      re94.exec('.svryqOga,n.svryqOgaPnapry');
+      re94.exec('.svryqOgaPnapry');
+      re94.exec('.bow-nppbeqvba qg');
+      re94.exec('[anzr=nwnkHey]');
+      re94.exec(str82);
+      re31.exec('rf');
+      re31.exec('wn');
+      re82.exec(str77);
+      re82.exec('*');
+      re82.exec(str48);
+      re82.exec('.pybfr');
+      re82.exec(str82);
+      re82.exec(str83);
+      re82.exec(str84);
+      re82.exec(str86);
+      re82.exec('qg');
+      re82.exec('rzorq');
+      re82.exec('sbez.nwnk');
+      re82.exec(str90);
+      re82.exec('bowrpg');
+      re83.exec(str98);
+      re83.exec('shapgvba sbphf() { [angvir pbqr] }');
+      re62.exec('#Ybtva');
+      re62.exec('#Ybtva_cnffjbeq');
+      re62.exec(str77);
+      re62.exec('#fubhgobkWf');
+      re62.exec('#fubhgobkWfReebe');
+      re62.exec('#fubhgobkWfFhpprff');
+      re62.exec('*');
+      re62.exec(str82);
+      re62.exec(str83);
+      re62.exec(str86);
+      re62.exec('rzorq');
+      re62.exec('sbez.nwnk');
+      re62.exec(str90);
+      re62.exec('bowrpg');
+      re49.exec('pbagrag');
+      re24.exec(str6);
+      /xbadhrebe/.exec(str63);
+      /znp/.exec('jva32');
+      /zbmvyyn/.exec(str63);
+      /zfvr/.exec(str63);
+      /ag\s5\.1/.exec(str63);
+      /bcren/.exec(str63);
+      /fnsnev/.exec(str63);
+      /jva/.exec('jva32');
+      /jvaqbjf/.exec(str63);
+    }
+  }
+
+  function run() {
+    for (var i = 0; i < 5; i++) {
+      runBlock0();
+      runBlock1();
+      runBlock2();
+      runBlock3();
+      runBlock4();
+      runBlock5();
+      runBlock6();
+      runBlock7();
+      runBlock8();
+      runBlock9();
+      runBlock10();
+      runBlock11();
+    }
+  }
+
+  this.run = run;
+}
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/richards.js b/suite/cts/deviceTests/browserbench/assets/octane/richards.js
new file mode 100644
index 0000000..054928d
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/richards.js
@@ -0,0 +1,539 @@
+// Copyright 2006-2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// This is a JavaScript implementation of the Richards
+// benchmark from:
+//
+//    http://www.cl.cam.ac.uk/~mr10/Bench.html
+//
+// The benchmark was originally implemented in BCPL by
+// Martin Richards.
+
+
+var Richards = new BenchmarkSuite('Richards', 35302, [
+  new Benchmark("Richards", runRichards)
+]);
+
+
+/**
+ * The Richards benchmark simulates the task dispatcher of an
+ * operating system.
+ **/
+function runRichards() {
+  var scheduler = new Scheduler();
+  scheduler.addIdleTask(ID_IDLE, 0, null, COUNT);
+
+  var queue = new Packet(null, ID_WORKER, KIND_WORK);
+  queue = new Packet(queue,  ID_WORKER, KIND_WORK);
+  scheduler.addWorkerTask(ID_WORKER, 1000, queue);
+
+  queue = new Packet(null, ID_DEVICE_A, KIND_DEVICE);
+  queue = new Packet(queue,  ID_DEVICE_A, KIND_DEVICE);
+  queue = new Packet(queue,  ID_DEVICE_A, KIND_DEVICE);
+  scheduler.addHandlerTask(ID_HANDLER_A, 2000, queue);
+
+  queue = new Packet(null, ID_DEVICE_B, KIND_DEVICE);
+  queue = new Packet(queue,  ID_DEVICE_B, KIND_DEVICE);
+  queue = new Packet(queue,  ID_DEVICE_B, KIND_DEVICE);
+  scheduler.addHandlerTask(ID_HANDLER_B, 3000, queue);
+
+  scheduler.addDeviceTask(ID_DEVICE_A, 4000, null);
+
+  scheduler.addDeviceTask(ID_DEVICE_B, 5000, null);
+
+  scheduler.schedule();
+
+  if (scheduler.queueCount != EXPECTED_QUEUE_COUNT ||
+      scheduler.holdCount != EXPECTED_HOLD_COUNT) {
+    var msg =
+        "Error during execution: queueCount = " + scheduler.queueCount +
+        ", holdCount = " + scheduler.holdCount + ".";
+    throw new Error(msg);
+  }
+}
+
+var COUNT = 1000;
+
+/**
+ * These two constants specify how many times a packet is queued and
+ * how many times a task is put on hold in a correct run of richards.
+ * They don't have any meaning a such but are characteristic of a
+ * correct run so if the actual queue or hold count is different from
+ * the expected there must be a bug in the implementation.
+ **/
+var EXPECTED_QUEUE_COUNT = 2322;
+var EXPECTED_HOLD_COUNT = 928;
+
+
+/**
+ * A scheduler can be used to schedule a set of tasks based on their relative
+ * priorities.  Scheduling is done by maintaining a list of task control blocks
+ * which holds tasks and the data queue they are processing.
+ * @constructor
+ */
+function Scheduler() {
+  this.queueCount = 0;
+  this.holdCount = 0;
+  this.blocks = new Array(NUMBER_OF_IDS);
+  this.list = null;
+  this.currentTcb = null;
+  this.currentId = null;
+}
+
+var ID_IDLE       = 0;
+var ID_WORKER     = 1;
+var ID_HANDLER_A  = 2;
+var ID_HANDLER_B  = 3;
+var ID_DEVICE_A   = 4;
+var ID_DEVICE_B   = 5;
+var NUMBER_OF_IDS = 6;
+
+var KIND_DEVICE   = 0;
+var KIND_WORK     = 1;
+
+/**
+ * Add an idle task to this scheduler.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ * @param {int} count the number of times to schedule the task
+ */
+Scheduler.prototype.addIdleTask = function (id, priority, queue, count) {
+  this.addRunningTask(id, priority, queue, new IdleTask(this, 1, count));
+};
+
+/**
+ * Add a work task to this scheduler.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ */
+Scheduler.prototype.addWorkerTask = function (id, priority, queue) {
+  this.addTask(id, priority, queue, new WorkerTask(this, ID_HANDLER_A, 0));
+};
+
+/**
+ * Add a handler task to this scheduler.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ */
+Scheduler.prototype.addHandlerTask = function (id, priority, queue) {
+  this.addTask(id, priority, queue, new HandlerTask(this));
+};
+
+/**
+ * Add a handler task to this scheduler.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ */
+Scheduler.prototype.addDeviceTask = function (id, priority, queue) {
+  this.addTask(id, priority, queue, new DeviceTask(this))
+};
+
+/**
+ * Add the specified task and mark it as running.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ * @param {Task} task the task to add
+ */
+Scheduler.prototype.addRunningTask = function (id, priority, queue, task) {
+  this.addTask(id, priority, queue, task);
+  this.currentTcb.setRunning();
+};
+
+/**
+ * Add the specified task to this scheduler.
+ * @param {int} id the identity of the task
+ * @param {int} priority the task's priority
+ * @param {Packet} queue the queue of work to be processed by the task
+ * @param {Task} task the task to add
+ */
+Scheduler.prototype.addTask = function (id, priority, queue, task) {
+  this.currentTcb = new TaskControlBlock(this.list, id, priority, queue, task);
+  this.list = this.currentTcb;
+  this.blocks[id] = this.currentTcb;
+};
+
+/**
+ * Execute the tasks managed by this scheduler.
+ */
+Scheduler.prototype.schedule = function () {
+  this.currentTcb = this.list;
+  while (this.currentTcb != null) {
+    if (this.currentTcb.isHeldOrSuspended()) {
+      this.currentTcb = this.currentTcb.link;
+    } else {
+      this.currentId = this.currentTcb.id;
+      this.currentTcb = this.currentTcb.run();
+    }
+  }
+};
+
+/**
+ * Release a task that is currently blocked and return the next block to run.
+ * @param {int} id the id of the task to suspend
+ */
+Scheduler.prototype.release = function (id) {
+  var tcb = this.blocks[id];
+  if (tcb == null) return tcb;
+  tcb.markAsNotHeld();
+  if (tcb.priority > this.currentTcb.priority) {
+    return tcb;
+  } else {
+    return this.currentTcb;
+  }
+};
+
+/**
+ * Block the currently executing task and return the next task control block
+ * to run.  The blocked task will not be made runnable until it is explicitly
+ * released, even if new work is added to it.
+ */
+Scheduler.prototype.holdCurrent = function () {
+  this.holdCount++;
+  this.currentTcb.markAsHeld();
+  return this.currentTcb.link;
+};
+
+/**
+ * Suspend the currently executing task and return the next task control block
+ * to run.  If new work is added to the suspended task it will be made runnable.
+ */
+Scheduler.prototype.suspendCurrent = function () {
+  this.currentTcb.markAsSuspended();
+  return this.currentTcb;
+};
+
+/**
+ * Add the specified packet to the end of the worklist used by the task
+ * associated with the packet and make the task runnable if it is currently
+ * suspended.
+ * @param {Packet} packet the packet to add
+ */
+Scheduler.prototype.queue = function (packet) {
+  var t = this.blocks[packet.id];
+  if (t == null) return t;
+  this.queueCount++;
+  packet.link = null;
+  packet.id = this.currentId;
+  return t.checkPriorityAdd(this.currentTcb, packet);
+};
+
+/**
+ * A task control block manages a task and the queue of work packages associated
+ * with it.
+ * @param {TaskControlBlock} link the preceding block in the linked block list
+ * @param {int} id the id of this block
+ * @param {int} priority the priority of this block
+ * @param {Packet} queue the queue of packages to be processed by the task
+ * @param {Task} task the task
+ * @constructor
+ */
+function TaskControlBlock(link, id, priority, queue, task) {
+  this.link = link;
+  this.id = id;
+  this.priority = priority;
+  this.queue = queue;
+  this.task = task;
+  if (queue == null) {
+    this.state = STATE_SUSPENDED;
+  } else {
+    this.state = STATE_SUSPENDED_RUNNABLE;
+  }
+}
+
+/**
+ * The task is running and is currently scheduled.
+ */
+var STATE_RUNNING = 0;
+
+/**
+ * The task has packets left to process.
+ */
+var STATE_RUNNABLE = 1;
+
+/**
+ * The task is not currently running.  The task is not blocked as such and may
+* be started by the scheduler.
+ */
+var STATE_SUSPENDED = 2;
+
+/**
+ * The task is blocked and cannot be run until it is explicitly released.
+ */
+var STATE_HELD = 4;
+
+var STATE_SUSPENDED_RUNNABLE = STATE_SUSPENDED | STATE_RUNNABLE;
+var STATE_NOT_HELD = ~STATE_HELD;
+
+TaskControlBlock.prototype.setRunning = function () {
+  this.state = STATE_RUNNING;
+};
+
+TaskControlBlock.prototype.markAsNotHeld = function () {
+  this.state = this.state & STATE_NOT_HELD;
+};
+
+TaskControlBlock.prototype.markAsHeld = function () {
+  this.state = this.state | STATE_HELD;
+};
+
+TaskControlBlock.prototype.isHeldOrSuspended = function () {
+  return (this.state & STATE_HELD) != 0 || (this.state == STATE_SUSPENDED);
+};
+
+TaskControlBlock.prototype.markAsSuspended = function () {
+  this.state = this.state | STATE_SUSPENDED;
+};
+
+TaskControlBlock.prototype.markAsRunnable = function () {
+  this.state = this.state | STATE_RUNNABLE;
+};
+
+/**
+ * Runs this task, if it is ready to be run, and returns the next task to run.
+ */
+TaskControlBlock.prototype.run = function () {
+  var packet;
+  if (this.state == STATE_SUSPENDED_RUNNABLE) {
+    packet = this.queue;
+    this.queue = packet.link;
+    if (this.queue == null) {
+      this.state = STATE_RUNNING;
+    } else {
+      this.state = STATE_RUNNABLE;
+    }
+  } else {
+    packet = null;
+  }
+  return this.task.run(packet);
+};
+
+/**
+ * Adds a packet to the worklist of this block's task, marks this as runnable if
+ * necessary, and returns the next runnable object to run (the one
+ * with the highest priority).
+ */
+TaskControlBlock.prototype.checkPriorityAdd = function (task, packet) {
+  if (this.queue == null) {
+    this.queue = packet;
+    this.markAsRunnable();
+    if (this.priority > task.priority) return this;
+  } else {
+    this.queue = packet.addTo(this.queue);
+  }
+  return task;
+};
+
+TaskControlBlock.prototype.toString = function () {
+  return "tcb { " + this.task + "@" + this.state + " }";
+};
+
+/**
+ * An idle task doesn't do any work itself but cycles control between the two
+ * device tasks.
+ * @param {Scheduler} scheduler the scheduler that manages this task
+ * @param {int} v1 a seed value that controls how the device tasks are scheduled
+ * @param {int} count the number of times this task should be scheduled
+ * @constructor
+ */
+function IdleTask(scheduler, v1, count) {
+  this.scheduler = scheduler;
+  this.v1 = v1;
+  this.count = count;
+}
+
+IdleTask.prototype.run = function (packet) {
+  this.count--;
+  if (this.count == 0) return this.scheduler.holdCurrent();
+  if ((this.v1 & 1) == 0) {
+    this.v1 = this.v1 >> 1;
+    return this.scheduler.release(ID_DEVICE_A);
+  } else {
+    this.v1 = (this.v1 >> 1) ^ 0xD008;
+    return this.scheduler.release(ID_DEVICE_B);
+  }
+};
+
+IdleTask.prototype.toString = function () {
+  return "IdleTask"
+};
+
+/**
+ * A task that suspends itself after each time it has been run to simulate
+ * waiting for data from an external device.
+ * @param {Scheduler} scheduler the scheduler that manages this task
+ * @constructor
+ */
+function DeviceTask(scheduler) {
+  this.scheduler = scheduler;
+  this.v1 = null;
+}
+
+DeviceTask.prototype.run = function (packet) {
+  if (packet == null) {
+    if (this.v1 == null) return this.scheduler.suspendCurrent();
+    var v = this.v1;
+    this.v1 = null;
+    return this.scheduler.queue(v);
+  } else {
+    this.v1 = packet;
+    return this.scheduler.holdCurrent();
+  }
+};
+
+DeviceTask.prototype.toString = function () {
+  return "DeviceTask";
+};
+
+/**
+ * A task that manipulates work packets.
+ * @param {Scheduler} scheduler the scheduler that manages this task
+ * @param {int} v1 a seed used to specify how work packets are manipulated
+ * @param {int} v2 another seed used to specify how work packets are manipulated
+ * @constructor
+ */
+function WorkerTask(scheduler, v1, v2) {
+  this.scheduler = scheduler;
+  this.v1 = v1;
+  this.v2 = v2;
+}
+
+WorkerTask.prototype.run = function (packet) {
+  if (packet == null) {
+    return this.scheduler.suspendCurrent();
+  } else {
+    if (this.v1 == ID_HANDLER_A) {
+      this.v1 = ID_HANDLER_B;
+    } else {
+      this.v1 = ID_HANDLER_A;
+    }
+    packet.id = this.v1;
+    packet.a1 = 0;
+    for (var i = 0; i < DATA_SIZE; i++) {
+      this.v2++;
+      if (this.v2 > 26) this.v2 = 1;
+      packet.a2[i] = this.v2;
+    }
+    return this.scheduler.queue(packet);
+  }
+};
+
+WorkerTask.prototype.toString = function () {
+  return "WorkerTask";
+};
+
+/**
+ * A task that manipulates work packets and then suspends itself.
+ * @param {Scheduler} scheduler the scheduler that manages this task
+ * @constructor
+ */
+function HandlerTask(scheduler) {
+  this.scheduler = scheduler;
+  this.v1 = null;
+  this.v2 = null;
+}
+
+HandlerTask.prototype.run = function (packet) {
+  if (packet != null) {
+    if (packet.kind == KIND_WORK) {
+      this.v1 = packet.addTo(this.v1);
+    } else {
+      this.v2 = packet.addTo(this.v2);
+    }
+  }
+  if (this.v1 != null) {
+    var count = this.v1.a1;
+    var v;
+    if (count < DATA_SIZE) {
+      if (this.v2 != null) {
+        v = this.v2;
+        this.v2 = this.v2.link;
+        v.a1 = this.v1.a2[count];
+        this.v1.a1 = count + 1;
+        return this.scheduler.queue(v);
+      }
+    } else {
+      v = this.v1;
+      this.v1 = this.v1.link;
+      return this.scheduler.queue(v);
+    }
+  }
+  return this.scheduler.suspendCurrent();
+};
+
+HandlerTask.prototype.toString = function () {
+  return "HandlerTask";
+};
+
+/* --- *
+ * P a c k e t
+ * --- */
+
+var DATA_SIZE = 4;
+
+/**
+ * A simple package of data that is manipulated by the tasks.  The exact layout
+ * of the payload data carried by a packet is not importaint, and neither is the
+ * nature of the work performed on packets by the tasks.
+ *
+ * Besides carrying data, packets form linked lists and are hence used both as
+ * data and worklists.
+ * @param {Packet} link the tail of the linked list of packets
+ * @param {int} id an ID for this packet
+ * @param {int} kind the type of this packet
+ * @constructor
+ */
+function Packet(link, id, kind) {
+  this.link = link;
+  this.id = id;
+  this.kind = kind;
+  this.a1 = 0;
+  this.a2 = new Array(DATA_SIZE);
+}
+
+/**
+ * Add this packet to the end of a worklist, and return the worklist.
+ * @param {Packet} queue the worklist to add this packet to
+ */
+Packet.prototype.addTo = function (queue) {
+  this.link = null;
+  if (queue == null) return this;
+  var peek, next = queue;
+  while ((peek = next.link) != null)
+    next = peek;
+  next.link = this;
+  return queue;
+};
+
+Packet.prototype.toString = function () {
+  return "Packet";
+};
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/run.js b/suite/cts/deviceTests/browserbench/assets/octane/run.js
new file mode 100644
index 0000000..e778130
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/run.js
@@ -0,0 +1,67 @@
+// Copyright 2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+load('base.js');
+load('richards.js');
+load('deltablue.js');
+load('crypto.js');
+load('raytrace.js');
+load('earley-boyer.js');
+load('regexp.js');
+load('splay.js');
+load('navier-stokes.js');
+load('pdfjs.js');
+load('mandreel.js');
+load('gbemu.js');
+load('code-load.js');
+load('box2d.js');
+
+var success = true;
+
+function PrintResult(name, result) {
+  print(name + ': ' + result);
+}
+
+
+function PrintError(name, error) {
+  PrintResult(name, error);
+  success = false;
+}
+
+
+function PrintScore(score) {
+  if (success) {
+    print('----');
+    print('Score (version ' + BenchmarkSuite.version + '): ' + score);
+  }
+}
+
+
+BenchmarkSuite.RunSuites({ NotifyResult: PrintResult,
+                           NotifyError: PrintError,
+                           NotifyScore: PrintScore });
diff --git a/suite/cts/deviceTests/browserbench/assets/octane/splay.js b/suite/cts/deviceTests/browserbench/assets/octane/splay.js
new file mode 100644
index 0000000..6b4f56d
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/assets/octane/splay.js
@@ -0,0 +1,394 @@
+// Copyright 2009 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This benchmark is based on a JavaScript log processing module used
+// by the V8 profiler to generate execution time profiles for runs of
+// JavaScript applications, and it effectively measures how fast the
+// JavaScript engine is at allocating nodes and reclaiming the memory
+// used for old nodes. Because of the way splay trees work, the engine
+// also has to deal with a lot of changes to the large tree object
+// graph.
+
+var Splay = new BenchmarkSuite('Splay', 81491, [
+  new Benchmark("Splay", SplayRun, SplaySetup, SplayTearDown)
+]);
+
+
+// Configuration.
+var kSplayTreeSize = 8000;
+var kSplayTreeModifications = 80;
+var kSplayTreePayloadDepth = 5;
+
+var splayTree = null;
+
+
+function GeneratePayloadTree(depth, tag) {
+  if (depth == 0) {
+    return {
+      array  : [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
+      string : 'String for key ' + tag + ' in leaf node'
+    };
+  } else {
+    return {
+      left:  GeneratePayloadTree(depth - 1, tag),
+      right: GeneratePayloadTree(depth - 1, tag)
+    };
+  }
+}
+
+
+function GenerateKey() {
+  // The benchmark framework guarantees that Math.random is
+  // deterministic; see base.js.
+  return Math.random();
+}
+
+
+function InsertNewNode() {
+  // Insert new node with a unique key.
+  var key;
+  do {
+    key = GenerateKey();
+  } while (splayTree.find(key) != null);
+  var payload = GeneratePayloadTree(kSplayTreePayloadDepth, String(key));
+  splayTree.insert(key, payload);
+  return key;
+}
+
+
+
+function SplaySetup() {
+  splayTree = new SplayTree();
+  for (var i = 0; i < kSplayTreeSize; i++) InsertNewNode();
+}
+
+
+function SplayTearDown() {
+  // Allow the garbage collector to reclaim the memory
+  // used by the splay tree no matter how we exit the
+  // tear down function.
+  var keys = splayTree.exportKeys();
+  splayTree = null;
+
+  // Verify that the splay tree has the right size.
+  var length = keys.length;
+  if (length != kSplayTreeSize) {
+    throw new Error("Splay tree has wrong size");
+  }
+
+  // Verify that the splay tree has sorted, unique keys.
+  for (var i = 0; i < length - 1; i++) {
+    if (keys[i] >= keys[i + 1]) {
+      throw new Error("Splay tree not sorted");
+    }
+  }
+}
+
+
+function SplayRun() {
+  // Replace a few nodes in the splay tree.
+  for (var i = 0; i < kSplayTreeModifications; i++) {
+    var key = InsertNewNode();
+    var greatest = splayTree.findGreatestLessThan(key);
+    if (greatest == null) splayTree.remove(key);
+    else splayTree.remove(greatest.key);
+  }
+}
+
+
+/**
+ * Constructs a Splay tree.  A splay tree is a self-balancing binary
+ * search tree with the additional property that recently accessed
+ * elements are quick to access again. It performs basic operations
+ * such as insertion, look-up and removal in O(log(n)) amortized time.
+ *
+ * @constructor
+ */
+function SplayTree() {
+};
+
+
+/**
+ * Pointer to the root node of the tree.
+ *
+ * @type {SplayTree.Node}
+ * @private
+ */
+SplayTree.prototype.root_ = null;
+
+
+/**
+ * @return {boolean} Whether the tree is empty.
+ */
+SplayTree.prototype.isEmpty = function() {
+  return !this.root_;
+};
+
+
+/**
+ * Inserts a node into the tree with the specified key and value if
+ * the tree does not already contain a node with the specified key. If
+ * the value is inserted, it becomes the root of the tree.
+ *
+ * @param {number} key Key to insert into the tree.
+ * @param {*} value Value to insert into the tree.
+ */
+SplayTree.prototype.insert = function(key, value) {
+  if (this.isEmpty()) {
+    this.root_ = new SplayTree.Node(key, value);
+    return;
+  }
+  // Splay on the key to move the last node on the search path for
+  // the key to the root of the tree.
+  this.splay_(key);
+  if (this.root_.key == key) {
+    return;
+  }
+  var node = new SplayTree.Node(key, value);
+  if (key > this.root_.key) {
+    node.left = this.root_;
+    node.right = this.root_.right;
+    this.root_.right = null;
+  } else {
+    node.right = this.root_;
+    node.left = this.root_.left;
+    this.root_.left = null;
+  }
+  this.root_ = node;
+};
+
+
+/**
+ * Removes a node with the specified key from the tree if the tree
+ * contains a node with this key. The removed node is returned. If the
+ * key is not found, an exception is thrown.
+ *
+ * @param {number} key Key to find and remove from the tree.
+ * @return {SplayTree.Node} The removed node.
+ */
+SplayTree.prototype.remove = function(key) {
+  if (this.isEmpty()) {
+    throw Error('Key not found: ' + key);
+  }
+  this.splay_(key);
+  if (this.root_.key != key) {
+    throw Error('Key not found: ' + key);
+  }
+  var removed = this.root_;
+  if (!this.root_.left) {
+    this.root_ = this.root_.right;
+  } else {
+    var right = this.root_.right;
+    this.root_ = this.root_.left;
+    // Splay to make sure that the new root has an empty right child.
+    this.splay_(key);
+    // Insert the original right child as the right child of the new
+    // root.
+    this.root_.right = right;
+  }
+  return removed;
+};
+
+
+/**
+ * Returns the node having the specified key or null if the tree doesn't contain
+ * a node with the specified key.
+ *
+ * @param {number} key Key to find in the tree.
+ * @return {SplayTree.Node} Node having the specified key.
+ */
+SplayTree.prototype.find = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  this.splay_(key);
+  return this.root_.key == key ? this.root_ : null;
+};
+
+
+/**
+ * @return {SplayTree.Node} Node having the maximum key value.
+ */
+SplayTree.prototype.findMax = function(opt_startNode) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  var current = opt_startNode || this.root_;
+  while (current.right) {
+    current = current.right;
+  }
+  return current;
+};
+
+
+/**
+ * @return {SplayTree.Node} Node having the maximum key value that
+ *     is less than the specified key value.
+ */
+SplayTree.prototype.findGreatestLessThan = function(key) {
+  if (this.isEmpty()) {
+    return null;
+  }
+  // Splay on the key to move the node with the given key or the last
+  // node on the search path to the top of the tree.
+  this.splay_(key);
+  // Now the result is either the root node or the greatest node in
+  // the left subtree.
+  if (this.root_.key < key) {
+    return this.root_;
+  } else if (this.root_.left) {
+    return this.findMax(this.root_.left);
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @return {Array<*>} An array containing all the keys of tree's nodes.
+ */
+SplayTree.prototype.exportKeys = function() {
+  var result = [];
+  if (!this.isEmpty()) {
+    this.root_.traverse_(function(node) { result.push(node.key); });
+  }
+  return result;
+};
+
+
+/**
+ * Perform the splay operation for the given key. Moves the node with
+ * the given key to the top of the tree.  If no node has the given
+ * key, the last node on the search path is moved to the top of the
+ * tree. This is the simplified top-down splaying algorithm from:
+ * "Self-adjusting Binary Search Trees" by Sleator and Tarjan
+ *
+ * @param {number} key Key to splay the tree on.
+ * @private
+ */
+SplayTree.prototype.splay_ = function(key) {
+  if (this.isEmpty()) {
+    return;
+  }
+  // Create a dummy node.  The use of the dummy node is a bit
+  // counter-intuitive: The right child of the dummy node will hold
+  // the L tree of the algorithm.  The left child of the dummy node
+  // will hold the R tree of the algorithm.  Using a dummy node, left
+  // and right will always be nodes and we avoid special cases.
+  var dummy, left, right;
+  dummy = left = right = new SplayTree.Node(null, null);
+  var current = this.root_;
+  while (true) {
+    if (key < current.key) {
+      if (!current.left) {
+        break;
+      }
+      if (key < current.left.key) {
+        // Rotate right.
+        var tmp = current.left;
+        current.left = tmp.right;
+        tmp.right = current;
+        current = tmp;
+        if (!current.left) {
+          break;
+        }
+      }
+      // Link right.
+      right.left = current;
+      right = current;
+      current = current.left;
+    } else if (key > current.key) {
+      if (!current.right) {
+        break;
+      }
+      if (key > current.right.key) {
+        // Rotate left.
+        var tmp = current.right;
+        current.right = tmp.left;
+        tmp.left = current;
+        current = tmp;
+        if (!current.right) {
+          break;
+        }
+      }
+      // Link left.
+      left.right = current;
+      left = current;
+      current = current.right;
+    } else {
+      break;
+    }
+  }
+  // Assemble.
+  left.right = current.left;
+  right.left = current.right;
+  current.left = dummy.right;
+  current.right = dummy.left;
+  this.root_ = current;
+};
+
+
+/**
+ * Constructs a Splay tree node.
+ *
+ * @param {number} key Key.
+ * @param {*} value Value.
+ */
+SplayTree.Node = function(key, value) {
+  this.key = key;
+  this.value = value;
+};
+
+
+/**
+ * @type {SplayTree.Node}
+ */
+SplayTree.Node.prototype.left = null;
+
+
+/**
+ * @type {SplayTree.Node}
+ */
+SplayTree.Node.prototype.right = null;
+
+
+/**
+ * Performs an ordered traversal of the subtree starting at
+ * this SplayTree.Node.
+ *
+ * @param {function(SplayTree.Node)} f Visitor function.
+ * @private
+ */
+SplayTree.Node.prototype.traverse_ = function(f) {
+  var current = this;
+  while (current) {
+    var left = current.left;
+    if (left) left.traverse_(f);
+    f(current);
+    current = current.right;
+  }
+};
diff --git a/suite/cts/deviceTests/browserbench/src/com/android/cts/browser/BrowserBenchTest.java b/suite/cts/deviceTests/browserbench/src/com/android/cts/browser/BrowserBenchTest.java
new file mode 100644
index 0000000..997f730
--- /dev/null
+++ b/suite/cts/deviceTests/browserbench/src/com/android/cts/browser/BrowserBenchTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.browser;
+
+import android.content.Intent;
+import android.cts.util.WatchDog;
+import android.net.Uri;
+import android.provider.Browser;
+import android.util.Log;
+import android.webkit.cts.CtsTestServer;
+
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.Stat;
+import com.android.cts.util.TimeoutReq;
+
+import java.net.URLDecoder;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.RequestLine;
+/**
+ * Browser benchmarking.
+ * It launches an activity with URL and wait for POST from the client.
+ */
+public class BrowserBenchTest extends CtsAndroidTestCase {
+    private static final String TAG = BrowserBenchTest.class.getSimpleName();
+    private static final boolean DEBUG = false;
+    private static final String OCTANE_START_FILE = "octane/index.html";
+    private static final String ROBOHORNET_START_FILE = "robohornet/robohornet.html";
+    private static final String HOST_COMPLETION_BROADCAST = "com.android.cts.browser.completion";
+    // time-out for watch-dog. POST should happen within this time.
+    private static long BROWSER_POST_TIMEOUT_IN_MS = 10 * 60 * 1000L;
+    // watch-dog will time-out first. So make it long enough.
+    private static long BROWSER_COMPLETION_TIMEOUT_IN_MS = 60 * 60 * 1000L;
+    private static final String HTTP_USER_AGENT = "User-Agent";
+    private CtsTestServer mWebServer;
+    // used for final score
+    private ResultType mTypeNonFinal = ResultType.NEUTRAL;
+    private ResultUnit mUnitNonFinal = ResultUnit.NONE;
+    // used for all other scores
+    private ResultType mTypeFinal = ResultType.NEUTRAL;
+    private ResultUnit mUnitFinal = ResultUnit.SCORE;
+    private WatchDog mWatchDog;
+    private CountDownLatch mLatch;
+    // can be changed by each test before starting
+    private volatile int mNumberRepeat;
+    /** tells how many tests have run up to now */
+    private volatile int mRunIndex;
+    /** stores results for each runs. last entry will be the final score. */
+    private LinkedHashMap<String, double[]> mResultsMap;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mWebServer = new CtsTestServer(getContext()) {
+            @Override
+            protected HttpResponse onPost(HttpRequest request) throws Exception {
+                // post uri will look like "cts_report.html?final=1&score=10.1&message=hello"
+                RequestLine requestLine = request.getRequestLine();
+                String uriString = URLDecoder.decode(requestLine.getUri(), "UTF-8");
+                if (DEBUG) {
+                    Log.i(TAG, "uri:" + uriString);
+                }
+                String resultRe =
+                        ".*cts_report.html\\?final=([\\d])&score=([\\d]+\\.?[\\d]*)&message=([\\w][\\w ]*)";
+                Pattern resultPattern = Pattern.compile(resultRe);
+                Matcher matchResult = resultPattern.matcher(uriString);
+                if (matchResult.find()) {
+                    int isFinal = Integer.parseInt(matchResult.group(1));
+                    double score = Double.parseDouble(matchResult.group(2));
+                    String message = matchResult.group(3);
+                    Log.i(TAG, message + ":" + score);
+                    if (!mResultsMap.containsKey(message)) {
+                        mResultsMap.put(message, new double[mNumberRepeat]);
+                    }
+                    double[] scores = mResultsMap.get(message);
+                    scores[mRunIndex] = score;
+                    if (isFinal == 1) {
+                        String userAgent = request.getFirstHeader(HTTP_USER_AGENT).getValue();
+                        getReportLog().printValue(HTTP_USER_AGENT + "=" + userAgent, 0,
+                                ResultType.NEUTRAL, ResultUnit.NONE);
+                        mLatch.countDown();
+                    }
+                    mWatchDog.reset();
+                }
+                return null; // default response is OK as it will be ignored by client anyway.
+            }
+        };
+        mResultsMap = new LinkedHashMap<String, double[]>();
+        mWatchDog = new WatchDog(BROWSER_POST_TIMEOUT_IN_MS);
+        mWatchDog.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mWatchDog.stop();
+        mWebServer.shutdown();
+        mWebServer = null;
+        mResultsMap = null;
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 60)
+    public void testOctane() throws InterruptedException {
+        String url = mWebServer.getAssetUrl(OCTANE_START_FILE) + "?auto=1";
+        final int kRepeat = 5;
+        doTest(url, ResultType.LOWER_BETTER, ResultUnit.MS,
+                ResultType.HIGHER_BETTER, ResultUnit.SCORE, kRepeat);
+    }
+
+    private void doTest(String url, ResultType typeNonFinal, ResultUnit unitNonFinal,
+            ResultType typeFinal, ResultUnit unitFinal, int numberRepeat)
+                    throws InterruptedException {
+        mTypeNonFinal = typeNonFinal;
+        mUnitNonFinal = unitNonFinal;
+        mTypeFinal = typeFinal;
+        mUnitFinal = unitFinal;
+        mNumberRepeat = numberRepeat;
+        Uri uri = Uri.parse(url);
+        for (mRunIndex = 0; mRunIndex < numberRepeat; mRunIndex++) {
+            Log.i(TAG, mRunIndex + "-th round");
+            mLatch = new CountDownLatch(1);
+            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            // force using only one window or tab
+            intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
+            getContext().startActivity(intent);
+            boolean ok = mLatch.await(BROWSER_COMPLETION_TIMEOUT_IN_MS, TimeUnit.MILLISECONDS);
+            assertTrue("timed-out", ok);
+        }
+        // it is somewhat awkward to handle the last one specially with Map
+        int numberEntries = mResultsMap.size();
+        int numberToProcess = 1;
+        for (Map.Entry<String, double[]> entry : mResultsMap.entrySet()) {
+            String message = entry.getKey();
+            double[] scores = entry.getValue();
+            if (numberToProcess == numberEntries) { // final score
+                // store the whole results first
+                getReportLog().printArray(message, scores, mTypeFinal, mUnitFinal);
+                getReportLog().printSummary(message, Stat.getAverage(scores), mTypeFinal,
+                        mUnitFinal);
+            } else { // interim results
+                getReportLog().printArray(message, scores, mTypeNonFinal, mUnitNonFinal);
+            }
+            numberToProcess++;
+        }
+    }
+}
diff --git a/suite/cts/deviceTests/dram/Android.mk b/suite/cts/deviceTests/dram/Android.mk
new file mode 100644
index 0000000..1935483
--- /dev/null
+++ b/suite/cts/deviceTests/dram/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_JNI_SHARED_LIBRARIES := libctsdram_jni
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceDram
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/suite/cts/deviceTests/dram/AndroidManifest.xml b/suite/cts/deviceTests/dram/AndroidManifest.xml
new file mode 100644
index 0000000..70f6b11
--- /dev/null
+++ b/suite/cts/deviceTests/dram/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.dram">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+            android:targetPackage="com.android.cts.dram"
+            android:label="DRAM bandwidth measurement" />
+</manifest>
diff --git a/suite/cts/deviceTests/dram/jni/Android.mk b/suite/cts/deviceTests/dram/jni/Android.mk
new file mode 100644
index 0000000..a86d4da
--- /dev/null
+++ b/suite/cts/deviceTests/dram/jni/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2012 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    := libctsdram_jni
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := MemoryNativeJni.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+LOCAL_SHARED_LIBRARIES := libnativehelper
+
+LOCAL_SDK_VERSION := 14
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/suite/cts/deviceTests/dram/jni/MemoryNativeJni.cpp b/suite/cts/deviceTests/dram/jni/MemoryNativeJni.cpp
new file mode 100644
index 0000000..7d9a5fc
--- /dev/null
+++ b/suite/cts/deviceTests/dram/jni/MemoryNativeJni.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+#include <jni.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+
+double currentTimeMillis()
+{
+    struct timeval tv;
+    gettimeofday(&tv, (struct timezone *) NULL);
+    return tv.tv_sec * 1000.0 + tv.tv_usec / 1000.0;
+}
+
+extern "C" JNIEXPORT jdouble JNICALL Java_com_android_cts_dram_MemoryNative_runMemcpy(JNIEnv* env,
+        jclass clazz, jint bufferSize, jint repetition)
+{
+    char* src = new char[bufferSize];
+    char* dst = new char[bufferSize];
+    if ((src == NULL) || (dst == NULL)) {
+        delete[] src;
+        delete[] dst;
+        env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), "No memory");
+        return -1;
+    }
+    memset(src, 0, bufferSize);
+    memset(dst, 0, bufferSize);
+    double start = currentTimeMillis();
+    for (int i = 0; i < repetition; i++) {
+        memcpy(dst, src, bufferSize);
+        src[bufferSize - 1] = i & 0xff;
+    }
+    double end = currentTimeMillis();
+    delete[] src;
+    delete[] dst;
+    return end - start;
+}
+
+extern "C" JNIEXPORT jdouble JNICALL Java_com_android_cts_dram_MemoryNative_runMemset(JNIEnv* env,
+        jclass clazz, jint bufferSize, jint repetition, jint c)
+{
+    char* dst = new char[bufferSize];
+    if (dst == NULL) {
+        delete[] dst;
+        env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), "No memory");
+        return -1;
+    }
+    memset(dst, 0, bufferSize);
+    double start = currentTimeMillis();
+    for (int i = 0; i < repetition; i++) {
+        memset(dst, (c + i) & 0xff, bufferSize);
+    }
+    double end = currentTimeMillis();
+    delete[] dst;
+    return end - start;
+}
+
diff --git a/suite/cts/deviceTests/dram/src/com/android/cts/dram/BandwidthTest.java b/suite/cts/deviceTests/dram/src/com/android/cts/dram/BandwidthTest.java
new file mode 100644
index 0000000..eeb7f9b
--- /dev/null
+++ b/suite/cts/deviceTests/dram/src/com/android/cts/dram/BandwidthTest.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.dram;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.util.Log;
+import android.view.WindowManager;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.Stat;
+
+/**
+ * check how many screens the memcpy function can copy in a sec.
+ * Note that this does not represent the total memory bandwidth available in the system
+ * as typically CPU cannot use the whole bandwidth.
+ * Smaller buffers can fit into L1 or L2 cache, which can show big boost.
+ */
+public class BandwidthTest extends CtsAndroidTestCase {
+    private static final String TAG = BandwidthTest.class.getSimpleName();
+    private static final int MEMCPY_REPETITION = 10;
+    private static final int MEMSET_REPETITION = 30;
+    private static final int REPEAT_IN_EACH_CALL = 100;
+    private static final int KB = 1024;
+    private static final int MB = 1024 * 1024;
+    private static final int MEMSET_CHAR = 0xa5;
+    // reject data outside +/- this value * median
+    private static final double OUTLIER_THRESHOLD = 0.1;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // warm-up
+        MemoryNative.runMemcpy(2 * MB, 100);
+    }
+
+    public void testMemcpyK004() {
+        doRunMemcpy(4 * KB);
+    }
+
+    public void testMemcpyK008() {
+        doRunMemcpy(8 * KB);
+    }
+
+    public void testMemcpyK016() {
+        doRunMemcpy(16 * KB);
+    }
+
+    public void testMemcpyK032() {
+        doRunMemcpy(32 * KB);
+    }
+
+    public void testMemcpyK064() {
+        doRunMemcpy(64 * KB);
+    }
+
+    public void testMemcpyK128() {
+        doRunMemcpy(128 * KB);
+    }
+
+    public void testMemcpyK256() {
+        doRunMemcpy(256 * KB);
+    }
+
+    public void testMemcpyK512() {
+        doRunMemcpy(512 * KB);
+    }
+
+    public void testMemcpyM001() {
+        doRunMemcpy(1 * MB);
+    }
+
+    public void testMemcpyM002() {
+        doRunMemcpy(2 * MB);
+    }
+
+    public void testMemcpyM004() {
+        doRunMemcpy(4 * MB);
+    }
+
+    public void testMemcpyM008() {
+        doRunMemcpy(8 * MB);
+    }
+
+    public void testMemcpyM016() {
+        doRunMemcpy(16 * MB);
+    }
+
+    public void testMemsetK004() {
+        doRunMemset(4 * KB);
+    }
+
+    public void testMemsetK008() {
+        doRunMemset(8 * KB);
+    }
+
+    public void testMemsetK016() {
+        doRunMemset(16 * KB);
+    }
+
+    public void testMemsetK032() {
+        doRunMemset(32 * KB);
+    }
+
+    public void testMemsetK064() {
+        doRunMemset(64 * KB);
+    }
+
+    public void testMemsetK128() {
+        doRunMemset(128 * KB);
+    }
+
+    public void testMemsetK256() {
+        doRunMemset(256 * KB);
+    }
+
+    public void testMemsetK512() {
+        doRunMemset(512 * KB);
+    }
+
+    public void testMemsetM001() {
+        doRunMemset(1 * MB);
+    }
+
+    public void testMemsetM002() {
+        doRunMemset(2 * MB);
+    }
+
+    public void testMemsetM004() {
+        doRunMemset(4 * MB);
+    }
+
+    public void testMemsetM008() {
+        doRunMemset(8 * MB);
+    }
+
+    public void testMemsetM016() {
+        doRunMemset(16 * MB);
+    }
+
+    private void doRunMemcpy(int bufferSize) {
+        double[] result = new double[MEMCPY_REPETITION];
+        int repeatInEachCall = REPEAT_IN_EACH_CALL;
+        if (bufferSize < (1 * MB)) {
+            // too small buffer size finishes too early to give accurate result.
+            repeatInEachCall *= (1 * MB / bufferSize);
+        }
+        for (int i = 0; i < MEMCPY_REPETITION; i++) {
+            result[i] = MemoryNative.runMemcpy(bufferSize, repeatInEachCall);
+        }
+        getReportLog().printArray("memcpy time", result, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        double[] mbps = ReportLog.calcRatePerSecArray(
+                (double)bufferSize * repeatInEachCall / 1024.0 / 1024.0, result);
+        getReportLog().printArray("memcpy throughput", mbps, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+        Stat.StatResult stat = Stat.getStatWithOutlierRejection(mbps, OUTLIER_THRESHOLD);
+        if (stat.mDataCount != result.length) {
+            Log.w(TAG, "rejecting " + (result.length - stat.mDataCount) + " outliers");
+        }
+        WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+        Point size = new Point();
+        wm.getDefaultDisplay().getSize(size);
+        Log.i(TAG, " x " + size.x + " y " + size.y);
+        double pixels = size.x * size.y;
+        // now this represents how many times the whole screen can be copied in a sec.
+        double screensPerSecAverage = stat.mAverage / pixels * 1024.0 * 1024.0 / 4.0;
+        getReportLog().printValue("memcpy in fps", screensPerSecAverage,
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        getReportLog().printSummary("memcpy throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+
+    private void doRunMemset(int bufferSize) {
+        double[] result = new double[MEMSET_REPETITION];
+        int repeatInEachCall = REPEAT_IN_EACH_CALL;
+        if (bufferSize < (1 * MB)) {
+            // too small buffer size finishes too early to give accurate result.
+            repeatInEachCall *= (1 * MB / bufferSize);
+        }
+        for (int i = 0; i < MEMSET_REPETITION; i++) {
+            result[i] = MemoryNative.runMemset(bufferSize, repeatInEachCall, MEMSET_CHAR);
+        }
+        getReportLog().printArray("memset time", result, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        double[] mbps = ReportLog.calcRatePerSecArray(
+                (double)bufferSize * repeatInEachCall / 1024.0 / 1024.0, result);
+        getReportLog().printArray("memset throughput", mbps, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+        Stat.StatResult stat = Stat.getStatWithOutlierRejection(mbps, OUTLIER_THRESHOLD);
+        if (stat.mDataCount != result.length) {
+            Log.w(TAG, "rejecting " + (result.length - stat.mDataCount) + " outliers");
+        }
+        WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+        Point size = new Point();
+        wm.getDefaultDisplay().getSize(size);
+        Log.i(TAG, " x " + size.x + " y " + size.y);
+        double pixels = size.x * size.y;
+        // now this represents how many times the whole screen can be copied in a sec.
+        double screensPerSecAverage = stat.mAverage / pixels * 1024.0 * 1024.0 / 4.0;
+        getReportLog().printValue("memset in fps", screensPerSecAverage,
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        getReportLog().printSummary("memset throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+}
diff --git a/suite/cts/deviceTests/dram/src/com/android/cts/dram/MemoryNative.java b/suite/cts/deviceTests/dram/src/com/android/cts/dram/MemoryNative.java
new file mode 100644
index 0000000..e55127d
--- /dev/null
+++ b/suite/cts/deviceTests/dram/src/com/android/cts/dram/MemoryNative.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.dram;
+
+public class MemoryNative {
+    static {
+        System.loadLibrary("ctsdram_jni");
+    }
+    /**
+     * run memcpy for given number of repetition from a source to a destination buffers
+     * with each having the size of bufferSize.
+     * @param bufferSize
+     * @param repeatition
+     * @return time spent in copying in ms.
+     */
+    public static native double runMemcpy(int bufferSize, int repetition);
+
+    /**
+     * run memset for given number of repetition from a source to a destination buffers
+     * with each having the size of bufferSize.
+     * @param bufferSize
+     * @param repetition
+     * @param c char to set. Only LSBs will be used to get char value.
+     * @return time spent in memset in ms.
+     */
+    public static native double runMemset(int bufferSize, int repetition, int c);
+}
diff --git a/suite/cts/deviceTests/filesystemperf/Android.mk b/suite/cts/deviceTests/filesystemperf/Android.mk
new file mode 100644
index 0000000..5f0606e
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceFilePerf
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
diff --git a/suite/cts/deviceTests/filesystemperf/AndroidManifest.xml b/suite/cts/deviceTests/filesystemperf/AndroidManifest.xml
new file mode 100644
index 0000000..dc90a94
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.filesystemperf">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+            android:targetPackage="com.android.cts.filesystemperf"
+            android:label="UI Latency measurement" />
+</manifest>
diff --git a/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/AlmostFullTest.java b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/AlmostFullTest.java
new file mode 100644
index 0000000..ab81f16
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/AlmostFullTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.filesystemperf;
+
+import android.util.Log;
+
+import android.cts.util.CtsAndroidTestCase;
+import android.cts.util.SystemUtil;
+
+import com.android.cts.util.TimeoutReq;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class AlmostFullTest extends CtsAndroidTestCase {
+
+    private static final String DIR_INITIAL_FILL = "INITIAL_FILL";
+    private static final String DIR_SEQ_UPDATE = "SEQ_UPDATE";
+    private static final String DIR_RANDOM_WR = "RANDOM_WR";
+    private static final String DIR_RANDOM_RD = "RANDOM_RD";
+    private static final String TAG = "AlmostFullTest";
+
+    private static final long FREE_SPACE_FINAL = 1000L * 1024 * 1024L;
+
+    // test runner creates multiple instances at the begging.
+    // use that to fill disk only once.
+    // set as final to initialize it only once
+    private static final AtomicInteger mRefCounter = new AtomicInteger(0);
+    private static final AtomicBoolean mDiskFilled = new AtomicBoolean(false);
+
+    public AlmostFullTest() {
+        int currentCounter = mRefCounter.incrementAndGet();
+        Log.i(TAG, "++currentCounter: " + currentCounter);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (mDiskFilled.compareAndSet(false, true)) {
+            Log.i(TAG, "Filling disk");
+            // initial fill done in two stage as disk can be filled by other
+            // components
+            long freeDisk = SystemUtil.getFreeDiskSize(getContext());
+            long diskToFill = freeDisk - FREE_SPACE_FINAL;
+            if (diskToFill >= 0) {
+                Log.i(TAG, "free disk " + freeDisk + ", to fill " + diskToFill);
+            } else {
+                Log.i(TAG, "free disk " + freeDisk + " too small, needs " + FREE_SPACE_FINAL);
+                return;
+            }
+            final long MAX_FILE_SIZE_TO_FILL = 1024L * 1024L * 1024L;
+            long filled = 0;
+            while (filled < diskToFill) {
+                long toFill = diskToFill - filled;
+                if (toFill > MAX_FILE_SIZE_TO_FILL) {
+                    toFill = MAX_FILE_SIZE_TO_FILL;
+                }
+                Log.i(TAG, "Generating file " + toFill);
+                FileUtil.createNewFilledFile(getContext(),
+                        DIR_INITIAL_FILL, toFill);
+                filled += toFill;
+            }
+        }
+        Log.i(TAG, "free disk " + SystemUtil.getFreeDiskSize(getContext()));
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        Log.i(TAG, "tearDown free disk " + SystemUtil.getFreeDiskSize(getContext()));
+        int currentCounter = mRefCounter.decrementAndGet();
+        Log.i(TAG, "--currentCounter: " + currentCounter);
+        if (currentCounter == 0) {
+            FileUtil.removeFileOrDir(getContext(), DIR_INITIAL_FILL);
+        }
+        FileUtil.removeFileOrDir(getContext(), DIR_SEQ_UPDATE);
+        FileUtil.removeFileOrDir(getContext(), DIR_RANDOM_WR);
+        FileUtil.removeFileOrDir(getContext(), DIR_RANDOM_RD);
+        Log.i(TAG, "tearDown free disk " + SystemUtil.getFreeDiskSize(getContext()));
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 30)
+    public void testSequentialUpdate() throws Exception {
+        // now about freeSpaceToLeave should be left
+        // and try updating exceeding the free space size
+        final long FILE_SIZE = 400L * 1024L * 1024L;
+        long freeDisk = SystemUtil.getFreeDiskSize(getContext());
+        Log.i(TAG, "Now free space is " + freeDisk);
+        if (freeDisk < FILE_SIZE) {
+            Log.w(TAG, "too little space: " + freeDisk);
+            return;
+        }
+        final int BUFFER_SIZE = 10 * 1024 * 1024;
+        final int NUMBER_REPETITION = 10;
+        FileUtil.doSequentialUpdateTest(getContext(), DIR_SEQ_UPDATE, getReportLog(), FILE_SIZE,
+                BUFFER_SIZE, NUMBER_REPETITION);
+    }
+
+    // TODO: file size too small and caching will give wrong better result.
+    // needs to flush cache by reading big files per each read.
+    @TimeoutReq(minutes = 60)
+    public void testRandomRead() throws Exception {
+        final int BUFFER_SIZE = 4 * 1024;
+        final long fileSize = 400L * 1024L * 1024L;
+        long freeDisk = SystemUtil.getFreeDiskSize(getContext());
+        if (freeDisk < fileSize) {
+            Log.w(TAG, "too little space: " + freeDisk);
+            return;
+        }
+        FileUtil.doRandomReadTest(getContext(), DIR_RANDOM_RD, getReportLog(), fileSize,
+                BUFFER_SIZE);
+    }
+
+    @TimeoutReq(minutes = 60)
+    public void testRandomUpdate() throws Exception {
+        final int BUFFER_SIZE = 4 * 1024;
+        final long fileSize = 256L * 1024L * 1024L;
+        long freeDisk = SystemUtil.getFreeDiskSize(getContext());
+        if (freeDisk < fileSize) {
+            Log.w(TAG, "too little space: " + freeDisk);
+            return;
+        }
+        FileUtil.doRandomWriteTest(getContext(), DIR_RANDOM_WR, getReportLog(), fileSize,
+                BUFFER_SIZE);
+    }
+}
diff --git a/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/FileUtil.java b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/FileUtil.java
new file mode 100644
index 0000000..b342b61
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/FileUtil.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.filesystemperf;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.RandomAccessFile;
+import java.util.Random;
+
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.Stat;
+import android.cts.util.SystemUtil;
+
+import android.content.Context;
+import android.util.Log;
+
+public class FileUtil {
+    private static final String TAG = "FileUtil";
+    private static final Random mRandom = new Random(0);
+    private static long mFileId = 0;
+    /**
+     * create array with different data per each call
+     *
+     * @param length
+     * @param randomSeed
+     * @return
+     */
+    public static byte[] generateRandomData(int length) {
+        byte[] buffer = new byte[length];
+        int val = mRandom.nextInt();
+        for (int i = 0; i < length / 4; i++) {
+            // in little-endian
+            buffer[i * 4] = (byte)(val & 0x000000ff);
+            buffer[i * 4 + 1] = (byte)((val & 0x0000ff00) >> 8);
+            buffer[i * 4 + 2] = (byte)((val & 0x00ff0000) >> 16);
+            buffer[i * 4 + 3] = (byte)((val & 0xff000000) >> 24);
+            val++;
+        }
+        for (int i = (length / 4) * 4; i < length; i++) {
+            buffer[i] = 0;
+        }
+        return buffer;
+    }
+
+    /**
+     * create a new file under the given dirName.
+     * Existing files will not be affected.
+     * @param context
+     * @param dirName
+     * @return
+     */
+    public static File createNewFile(Context context, String dirName) {
+        File topDir = new File(context.getFilesDir(), dirName);
+        topDir.mkdir();
+        String[] list = topDir.list();
+
+        String newFileName;
+        while (true) {
+            newFileName = Long.toString(mFileId);
+            boolean fileExist = false;
+            for (String child : list) {
+                if (child.equals(newFileName)) {
+                    fileExist = true;
+                    break;
+                }
+            }
+            if (!fileExist) {
+                break;
+            }
+            mFileId++;
+        }
+        mFileId++;
+        //Log.i(TAG, "filename" + Long.toString(mFileId));
+        return new File(topDir, newFileName);
+    }
+
+    /**
+     * create multiple new files
+     * @param context
+     * @param dirName
+     * @param count number of files to create
+     * @return
+     */
+    public static File[] createNewFiles(Context context, String dirName, int count) {
+        File[] files = new File[count];
+        for (int i = 0; i < count; i++) {
+            files[i] = createNewFile(context, dirName);
+        }
+        return files;
+    }
+
+    /**
+     * write file with given byte array
+     * @param file
+     * @param data
+     * @param append will append if set true. Otherwise, write from beginning
+     * @throws IOException
+     */
+    public static void writeFile(File file, byte[] data, boolean append) throws IOException {
+        final RandomAccessFile randomFile = new RandomAccessFile(file, "rwd"); // force O_SYNC
+        if (append) {
+            randomFile.seek(randomFile.length());
+        } else {
+            randomFile.seek(0L);
+        }
+        randomFile.write(data);
+        randomFile.close();
+    }
+
+    /**
+     * create a new file with given length.
+     * @param context
+     * @param dirName
+     * @param length
+     * @return
+     * @throws IOException
+     */
+    public static File createNewFilledFile(Context context, String dirName, long length)
+            throws IOException {
+        final int BUFFER_SIZE = 10 * 1024 * 1024;
+        File file = createNewFile(context, dirName);
+        FileOutputStream out = new FileOutputStream(file);
+        byte[] data = generateRandomData(BUFFER_SIZE);
+        long written = 0;
+        while (written < length) {
+            out.write(data);
+            written += BUFFER_SIZE;
+        }
+        out.flush();
+        out.close();
+        return file;
+    }
+
+    /**
+     * remove given file or directory under the current app's files dir.
+     * @param context
+     * @param name
+     */
+    public static void removeFileOrDir(Context context, String name) {
+        File entry = new File(context.getFilesDir(), name);
+        if (entry.exists()) {
+            removeEntry(entry);
+        }
+    }
+
+    private static void removeEntry(File entry) {
+        if (entry.isDirectory()) {
+            String[] children = entry.list();
+            for (String child : children) {
+                removeEntry(new File(entry, child));
+            }
+        }
+        Log.i(TAG, "delete file " + entry.getAbsolutePath());
+        entry.delete();
+    }
+
+    /**
+     * measure time taken for each IO run with amount R/W
+     * @param count
+     * @param run
+     * @param readAmount returns amount of read in bytes for each interval.
+     *        Value will not be written if /proc/self/io does not exist.
+     * @param writeAmount returns amount of write in bytes for each interval.
+     * @return time per each interval
+     * @throws IOException
+     */
+    public static double[] measureIO(int count, double[] readAmount, double[] writeAmount,
+            MeasureRun run)  throws Exception {
+        double[] result = new double[count];
+        File procIo = new File("/proc/self/io");
+        boolean measureIo = procIo.exists() && procIo.canRead();
+        long prev = System.currentTimeMillis();
+        RWAmount prevAmount = new RWAmount();
+        if (measureIo) {
+            prevAmount = getRWAmount(procIo);
+        }
+        for (int i = 0; i < count; i++) {
+            run.run(i);
+            long current =  System.currentTimeMillis();
+            result[i] = current - prev;
+            prev = current;
+            if (measureIo) {
+                RWAmount currentAmount = getRWAmount(procIo);
+                readAmount[i] = currentAmount.mRd - prevAmount.mRd;
+                writeAmount[i] = currentAmount.mWr - prevAmount.mWr;
+                prevAmount = currentAmount;
+            }
+        }
+        return result;
+    }
+
+    private static class RWAmount {
+        public double mRd = 0.0;
+        public double mWr = 0.0;
+    };
+
+    private static RWAmount getRWAmount(File file) throws IOException {
+        RWAmount amount = new RWAmount();
+
+        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+        String line;
+        while((line = br.readLine())!= null) {
+            if (line.startsWith("read_bytes")) {
+                amount.mRd = Double.parseDouble(line.split(" ")[1]);
+            } else if (line.startsWith("write_bytes")) {
+                amount.mWr = Double.parseDouble(line.split(" ")[1]);
+            }
+        }
+        br.close();
+        return amount;
+    }
+
+    /**
+     * get file size exceeding total memory size ( 2x total memory).
+     * The size is rounded in bufferSize. And the size will be bigger than 400MB.
+     * @param context
+     * @param bufferSize
+     * @return file size or 0 if there is not enough space.
+     */
+    public static long getFileSizeExceedingMemory(Context context, int bufferSize) {
+        long freeDisk = SystemUtil.getFreeDiskSize(context);
+        long memSize = SystemUtil.getTotalMemory(context);
+        long diskSizeTarget = (2 * memSize / bufferSize) * bufferSize;
+        final long minimumDiskSize = (512L * 1024L * 1024L / bufferSize) * bufferSize;
+        if ( diskSizeTarget < minimumDiskSize ) {
+            diskSizeTarget = minimumDiskSize;
+        }
+        if (diskSizeTarget > freeDisk) {
+            Log.i(TAG, "Free disk size " + freeDisk + " too small");
+            return 0;
+        }
+        return diskSizeTarget;
+    }
+
+    /**
+     *
+     * @param context
+     * @param dirName
+     * @param report
+     * @param fileSize
+     * @param bufferSize should be power of two
+     * @throws IOException
+     */
+    public static void doRandomReadTest(Context context, String dirName, ReportLog report,
+            long fileSize, int bufferSize) throws Exception {
+        File file = FileUtil.createNewFilledFile(context,
+                dirName, fileSize);
+
+        final byte[] data = FileUtil.generateRandomData(bufferSize);
+        Random random = new Random(0);
+        final int totalReadCount = (int)(fileSize / bufferSize);
+        final int[] readOffsets = new int[totalReadCount];
+        for (int i = 0; i < totalReadCount; i++) {
+            // align in buffer size
+            readOffsets[i] = (int)(random.nextFloat() * (fileSize - bufferSize)) &
+                    ~(bufferSize - 1);
+        }
+        final int runsInOneGo = 16;
+        final int readsInOneMeasure = totalReadCount / runsInOneGo;
+
+        final RandomAccessFile randomFile = new RandomAccessFile(file, "rw"); // do not need O_SYNC
+        double[] rdAmount = new double[runsInOneGo];
+        double[] wrAmount = new double[runsInOneGo];
+        double[] times = FileUtil.measureIO(runsInOneGo, rdAmount, wrAmount, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws IOException {
+                Log.i(TAG, "starting " + i + " -th round");
+                int start = i * readsInOneMeasure;
+                int end = (i + 1) * readsInOneMeasure;
+                for (int j = start; j < end; j++) {
+                    randomFile.seek(readOffsets[j]);
+                    randomFile.read(data);
+                }
+            }
+        });
+        randomFile.close();
+        double[] mbps = ReportLog.calcRatePerSecArray((double)fileSize / runsInOneGo / 1024 / 1024,
+                times);
+        report.printArray("read throughput",
+                mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+        // This is just the amount of IO returned from kernel. So this is performance neutral.
+        report.printArray("read amount", rdAmount, ResultType.NEUTRAL, ResultUnit.BYTE);
+        Stat.StatResult stat = Stat.getStat(mbps);
+
+        report.printSummary("read throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+
+    /**
+     *
+     * @param context
+     * @param dirName
+     * @param report
+     * @param fileSize
+     * @param bufferSize should be power of two
+     * @throws IOException
+     */
+    public static void doRandomWriteTest(Context context, String dirName, ReportLog report,
+            long fileSize, int bufferSize) throws Exception {
+        File file = FileUtil.createNewFilledFile(context,
+                dirName, fileSize);
+        final byte[] data = FileUtil.generateRandomData(bufferSize);
+        Random random = new Random(0);
+        final int totalWriteCount = (int)(fileSize / bufferSize);
+        final int[] writeOffsets = new int[totalWriteCount];
+        for (int i = 0; i < totalWriteCount; i++) {
+            writeOffsets[i] = (int)(random.nextFloat() * (fileSize - bufferSize)) &
+                    ~(bufferSize - 1);
+        }
+        final int runsInOneGo = 16;
+        final int writesInOneMeasure = totalWriteCount / runsInOneGo;
+
+        final RandomAccessFile randomFile = new RandomAccessFile(file, "rwd"); // force O_SYNC
+        double[] rdAmount = new double[runsInOneGo];
+        double[] wrAmount = new double[runsInOneGo];
+        double[] times = FileUtil.measureIO(runsInOneGo, rdAmount, wrAmount, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws IOException {
+                Log.i(TAG, "starting " + i + " -th round");
+                int start = i * writesInOneMeasure;
+                int end = (i + 1) * writesInOneMeasure;
+                for (int j = start; j < end; j++) {
+                    randomFile.seek(writeOffsets[j]);
+                    randomFile.write(data);
+                }
+            }
+        });
+        randomFile.close();
+        double[] mbps = ReportLog.calcRatePerSecArray((double)fileSize / runsInOneGo / 1024 / 1024,
+                times);
+        report.printArray("write throughput",
+                mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+        report.printArray("write amount", wrAmount, ResultType.NEUTRAL,
+                ResultUnit.BYTE);
+        Stat.StatResult stat = Stat.getStat(mbps);
+
+        report.printSummary("write throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+
+    /**
+     *
+     * @param context
+     * @param dirName
+     * @param report
+     * @param fileSize fileSize should be multiple of bufferSize.
+     * @param bufferSize
+     * @param numberRepetition
+     * @throws IOException
+     */
+    public static void doSequentialUpdateTest(Context context, String dirName, ReportLog report,
+            long fileSize, int bufferSize, int numberRepetition) throws Exception {
+        File file = FileUtil.createNewFilledFile(context,
+                dirName, fileSize);
+        final byte[] data = FileUtil.generateRandomData(bufferSize);
+        int numberRepeatInOneRun = (int)(fileSize / bufferSize);
+        double[] mbpsAll = new double[numberRepetition * numberRepeatInOneRun];
+        for (int i = 0; i < numberRepetition; i++) {
+            Log.i(TAG, "starting " + i + " -th round");
+            final RandomAccessFile randomFile = new RandomAccessFile(file, "rwd");  // force O_SYNC
+            randomFile.seek(0L);
+            double[] times = MeasureTime.measure(numberRepeatInOneRun, new MeasureRun() {
+
+                @Override
+                public void run(int i) throws IOException {
+                    randomFile.write(data);
+                }
+            });
+            randomFile.close();
+            double[] mbps = ReportLog.calcRatePerSecArray((double)bufferSize / 1024 / 1024,
+                    times);
+            report.printArray(i + "-th round throughput",
+                    mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+            ReportLog.copyArray(mbps, mbpsAll, i * numberRepeatInOneRun);
+        }
+        Stat.StatResult stat = Stat.getStat(mbpsAll);
+        report.printSummary("update throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+}
diff --git a/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/RandomRWTest.java b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/RandomRWTest.java
new file mode 100644
index 0000000..6ad927b
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/RandomRWTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.filesystemperf;
+
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.TimeoutReq;
+
+public class RandomRWTest extends CtsAndroidTestCase {
+    private static final String DIR_RANDOM_WR = "RANDOM_WR";
+    private static final String DIR_RANDOM_RD = "RANDOM_RD";
+
+    @Override
+    protected void tearDown() throws Exception {
+        FileUtil.removeFileOrDir(getContext(), DIR_RANDOM_WR);
+        FileUtil.removeFileOrDir(getContext(), DIR_RANDOM_RD);
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 60)
+    public void testRandomRead() throws Exception {
+        final int READ_BUFFER_SIZE = 4 * 1024;
+        final long fileSize = FileUtil.getFileSizeExceedingMemory(getContext(), READ_BUFFER_SIZE);
+        if (fileSize == 0) { // not enough space, give up
+            return;
+        }
+        FileUtil.doRandomReadTest(getContext(), DIR_RANDOM_RD, getReportLog(), fileSize,
+                READ_BUFFER_SIZE);
+    }
+
+    // It is taking too long in some device, and thus cannot run multiple times
+    @TimeoutReq(minutes = 60)
+    public void testRandomUpdate() throws Exception {
+        final int WRITE_BUFFER_SIZE = 4 * 1024;
+        final long fileSize = 256 * 1024 * 1024;
+        FileUtil.doRandomWriteTest(getContext(), DIR_RANDOM_WR, getReportLog(), fileSize,
+                WRITE_BUFFER_SIZE);
+    }
+}
diff --git a/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/SequentialRWTest.java b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/SequentialRWTest.java
new file mode 100644
index 0000000..d369ce8
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/SequentialRWTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.filesystemperf;
+
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.Stat;
+import com.android.cts.util.TimeoutReq;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public class SequentialRWTest extends CtsAndroidTestCase {
+    private static final String DIR_SEQ_WR = "SEQ_WR";
+    private static final String DIR_SEQ_UPDATE = "SEQ_UPDATE";
+    private static final String DIR_SEQ_RD = "SEQ_RD";
+    private static final int BUFFER_SIZE = 10 * 1024 * 1024;
+
+    @Override
+    protected void tearDown() throws Exception {
+        FileUtil.removeFileOrDir(getContext(), DIR_SEQ_WR);
+        FileUtil.removeFileOrDir(getContext(), DIR_SEQ_UPDATE);
+        FileUtil.removeFileOrDir(getContext(), DIR_SEQ_RD);
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 30)
+    public void testSingleSequentialWrite() throws Exception {
+        final long fileSize = FileUtil.getFileSizeExceedingMemory(getContext(), BUFFER_SIZE);
+        if (fileSize == 0) { // not enough space, give up
+            return;
+        }
+        final int numberOfFiles =(int)(fileSize / BUFFER_SIZE);
+        getReportLog().printValue("files", numberOfFiles, ResultType.NEUTRAL,
+                ResultUnit.COUNT);
+        final byte[] data = FileUtil.generateRandomData(BUFFER_SIZE);
+        final File[] files = FileUtil.createNewFiles(getContext(), DIR_SEQ_WR,
+                numberOfFiles);
+        double[] rdAmount = new double[numberOfFiles];
+        double[] wrAmount = new double[numberOfFiles];
+        double[] times = FileUtil.measureIO(numberOfFiles, rdAmount, wrAmount, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws IOException {
+                FileUtil.writeFile(files[i], data, false);
+            }
+        });
+        double[] mbps = ReportLog.calcRatePerSecArray((double)BUFFER_SIZE / 1024 / 1024, times);
+        getReportLog().printArray("write throughput",
+                mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+        getReportLog().printArray("write amount", wrAmount, ResultType.NEUTRAL,
+                ResultUnit.BYTE);
+        Stat.StatResult stat = Stat.getStat(mbps);
+        getReportLog().printSummary("write throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+
+    @TimeoutReq(minutes = 60)
+    public void testSingleSequentialUpdate() throws Exception {
+        final long fileSize = FileUtil.getFileSizeExceedingMemory(getContext(), BUFFER_SIZE);
+        if (fileSize == 0) { // not enough space, give up
+            return;
+        }
+        final int NUMBER_REPETITION = 6;
+        FileUtil.doSequentialUpdateTest(getContext(), DIR_SEQ_UPDATE, getReportLog(), fileSize,
+                BUFFER_SIZE, NUMBER_REPETITION);
+    }
+
+    @TimeoutReq(minutes = 30)
+    public void testSingleSequentialRead() throws Exception {
+        final long fileSize = FileUtil.getFileSizeExceedingMemory(getContext(), BUFFER_SIZE);
+        if (fileSize == 0) { // not enough space, give up
+            return;
+        }
+        long start = System.currentTimeMillis();
+        final File file = FileUtil.createNewFilledFile(getContext(),
+                DIR_SEQ_RD, fileSize);
+        long finish = System.currentTimeMillis();
+        getReportLog().printValue("write throughput for test file of length " + fileSize,
+                ReportLog.calcRatePerSec((double)fileSize / 1024 / 1024, finish - start),
+                ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+
+        final int NUMBER_READ = 10;
+
+        final byte[] data = new byte[BUFFER_SIZE];
+        double[] times = MeasureTime.measure(NUMBER_READ, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws IOException {
+                final FileInputStream in = new FileInputStream(file);
+                long read = 0;
+                while (read < fileSize) {
+                    in.read(data);
+                    read += BUFFER_SIZE;
+                }
+                in.close();
+            }
+        });
+        double[] mbps = ReportLog.calcRatePerSecArray((double)fileSize / 1024 / 1024, times);
+        getReportLog().printArray("read throughput",
+                mbps, ResultType.HIGHER_BETTER, ResultUnit.MBPS);
+        Stat.StatResult stat = Stat.getStat(mbps);
+        getReportLog().printSummary("read throughput", stat.mAverage, ResultType.HIGHER_BETTER,
+                ResultUnit.MBPS);
+    }
+}
diff --git a/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/TestTest.java b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/TestTest.java
new file mode 100644
index 0000000..052c054
--- /dev/null
+++ b/suite/cts/deviceTests/filesystemperf/src/com/android/cts/filesystemperf/TestTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+
+// code for testing, will be removed / moved before release
+
+package com.android.cts.filesystemperf;
+
+import android.cts.util.CtsAndroidTestCase;
+
+/**
+ * This class is for testing CTS logging. Will be disabled in release.
+ *
+ */
+public class TestTest extends CtsAndroidTestCase {
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+/* code for testing CTS logging. Disabled.
+    @TimeoutReq(minutes = 15)
+    public void testPass() {
+        double[] array = new double[] {1.0, 2.0, 3.0};
+        getReportLog().printArray(" ", array, true);
+        getReportLog().printArray(" ", array, false);
+        getReportLog().printValue(" ", 1.0);
+        getReportLog().printValue(" ", 2.0);
+        getReportLog().printSummary("This should be shown", 0, 0);
+    }
+
+    @TimeoutReq(minutes = 10)
+    public void testFail() throws Exception {
+        getReportLog().printValue(" ", 1.0);
+        getReportLog().printValue(" ", 2.0);
+        getReportLog().printSummary("This should not be shown", 0, 0);
+        throw new Exception("failed");
+    }
+*/
+}
diff --git a/suite/cts/deviceTests/opengl/Android.mk b/suite/cts/deviceTests/opengl/Android.mk
new file mode 100644
index 0000000..1b7d42b
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2013 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_JNI_SHARED_LIBRARIES := libctsopengl_jni
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceOpenGl
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/AndroidManifest.xml b/suite/cts/deviceTests/opengl/AndroidManifest.xml
new file mode 100644
index 0000000..a0273ec
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/AndroidManifest.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.opengl"
+    android:versionCode="1"
+    android:versionName="1.0" >
+
+    <uses-sdk
+        android:minSdkVersion="16"
+        android:targetSdkVersion="17" />
+
+    <uses-feature
+        android:glEsVersion="0x00020000"
+        android:required="true" />
+
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application android:allowBackup="false" >
+        <uses-library android:name="android.test.runner" />
+
+        <activity
+            android:name=".primitive.GLPrimitiveActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".reference.GLReferenceActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".reference.GLGameActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
+            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+        </activity>
+    </application>
+
+    <instrumentation
+        android:name="android.test.InstrumentationCtsTestRunner"
+        android:label="OpenGL ES 2.0 Benchmark"
+        android:targetPackage="com.android.cts.opengl" />
+
+</manifest>
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/README b/suite/cts/deviceTests/opengl/README
new file mode 100644
index 0000000..ce5e8e8
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/README
@@ -0,0 +1,13 @@
+Copyright (C) 2013 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.
+
+All the assets in this project are under the above license and were made using Gimp and/or Blender.
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/fragment/basic b/suite/cts/deviceTests/opengl/assets/fragment/basic
new file mode 100644
index 0000000..69d98b0
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/fragment/basic
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform sampler2D u_Texture;
+varying vec2 v_TexCoordinate;
+void main() {
+  gl_FragColor = texture2D(u_Texture, v_TexCoordinate);
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/fragment/blur b/suite/cts/deviceTests/opengl/assets/fragment/blur
new file mode 100644
index 0000000..1290798
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/fragment/blur
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform sampler2D u_Texture;
+uniform vec2 u_Scale;
+varying vec2 v_TexCoordinate;
+void main() {
+  float weights[11];
+  weights[0] = 0.047748641153356156;
+  weights[1] = 0.05979670798364139;
+  weights[2] = 0.07123260215138659;
+  weights[3] = 0.08071711293576822;
+  weights[4] = 0.08700369673862933;
+  weights[5] = 0.08920620580763855;
+  weights[6] = 0.08700369673862933;
+  weights[7] = 0.08071711293576822;
+  weights[8] = 0.07123260215138659;
+  weights[9] = 0.05979670798364139;
+  weights[10] = 0.047748641153356156;
+  vec4 color = vec4(0.0, 0.0, 0.0, 0.0);
+  for (int i = 0; i < 11; i++) {
+    vec2 coords = v_TexCoordinate.xy + ((float(i) - 5.0) * u_Scale);
+    color += texture2D(u_Texture, coords) * weights[i];
+  }
+  gl_FragColor = color;
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/fragment/perspective b/suite/cts/deviceTests/opengl/assets/fragment/perspective
new file mode 100644
index 0000000..8546938
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/fragment/perspective
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform vec3 u_LightPos;
+uniform sampler2D u_Texture;
+varying vec3 v_Position;
+varying vec3 v_Normal;
+varying vec2 v_TexCoordinate;
+void main() {
+  // Get a lighting direction vector from the light to the vertex.
+  vec3 lightVector = normalize(u_LightPos - v_Position);
+  // Calculate the dot product of the light vector and vertex normal.
+  float diffuse = max(dot(lightVector, v_Normal), 0.0);
+  // Add ambient lighting
+  diffuse = diffuse + 0.25;
+  // Multiply the diffuse illumination and texture to get final output color.
+  gl_FragColor = (diffuse * texture2D(u_Texture, v_TexCoordinate));
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/fragment/water b/suite/cts/deviceTests/opengl/assets/fragment/water
new file mode 100644
index 0000000..26d0954
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/fragment/water
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform vec3 u_LightPos;
+uniform sampler2D u_Texture1;
+uniform sampler2D u_Texture2;
+uniform int u_Time;
+varying vec3 v_Position;
+varying vec2 v_TexCoordinate;
+void main() {
+  float weight = abs(mod(float(u_Time), 101.0) - 50.0) / 50.0;// loop between 0.0 and 1.0
+  float offset = abs(float(u_Time) / 1000.0);
+  // Get normal from bump map.
+  vec3 map1 = texture2D(u_Texture1, v_TexCoordinate + offset).xyz * 2.0 - 1.0;
+  vec3 map2 = texture2D(u_Texture2, v_TexCoordinate + offset).xyz * 2.0 - 1.0;
+  vec3 normal = normalize((map1 * weight) + (map2 * (1.0 - weight)));
+  // Get a lighting direction vector from the light to the vertex.
+  vec3 lightVector = normalize(u_LightPos - v_Position);
+  // Calculate the dot product of the light vector and vertex normal.
+  float diffuse = max(dot(lightVector, normal), 0.0);
+  // Add ambient lighting
+  diffuse = diffuse + 0.025;
+  // Use the diffuse illumination to get final output color.
+  gl_FragColor = vec4(1.0 - diffuse, 1.0 - diffuse, 1.0, 1.0 - (diffuse * 0.9));// Semi transparent blue.
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/mesh/arc.cob b/suite/cts/deviceTests/opengl/assets/mesh/arc.cob
new file mode 100644
index 0000000..1defaf2
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/mesh/arc.cob
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/mesh/fish.cob b/suite/cts/deviceTests/opengl/assets/mesh/fish.cob
new file mode 100644
index 0000000..16de76c
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/mesh/fish.cob
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/mesh/plane.cob b/suite/cts/deviceTests/opengl/assets/mesh/plane.cob
new file mode 100644
index 0000000..b6c62d9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/mesh/plane.cob
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/arc.png b/suite/cts/deviceTests/opengl/assets/texture/arc.png
new file mode 100644
index 0000000..f95e7a0
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/arc.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/background.png b/suite/cts/deviceTests/opengl/assets/texture/background.png
new file mode 100644
index 0000000..db0d472
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/background.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/fish.png b/suite/cts/deviceTests/opengl/assets/texture/fish.png
new file mode 100644
index 0000000..fdf1e2c
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/fish.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/fish_dark.png b/suite/cts/deviceTests/opengl/assets/texture/fish_dark.png
new file mode 100644
index 0000000..54453a2
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/fish_dark.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/water1.png b/suite/cts/deviceTests/opengl/assets/texture/water1.png
new file mode 100644
index 0000000..96f4e62
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/water1.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/texture/water2.png b/suite/cts/deviceTests/opengl/assets/texture/water2.png
new file mode 100644
index 0000000..92eebf9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/texture/water2.png
Binary files differ
diff --git a/suite/cts/deviceTests/opengl/assets/vertex/basic b/suite/cts/deviceTests/opengl/assets/vertex/basic
new file mode 100644
index 0000000..88ba2ba
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/vertex/basic
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+attribute vec4 a_Position;
+attribute vec2 a_TexCoordinate;
+varying vec2 v_TexCoordinate;
+void main() {
+  // Pass through the texture coordinate.
+  v_TexCoordinate = a_TexCoordinate;
+  // Set the position on screen.
+  gl_Position = a_Position;
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/vertex/blur b/suite/cts/deviceTests/opengl/assets/vertex/blur
new file mode 100644
index 0000000..ffd6a86
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/vertex/blur
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+attribute vec4 a_Position;
+attribute vec2 a_TexCoordinate;
+varying vec2 v_TexCoordinate;
+void main() {
+  // Set the position.
+  gl_Position = a_Position;
+  // Pass through the texture coordinate.
+  v_TexCoordinate = a_TexCoordinate;
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/vertex/perspective b/suite/cts/deviceTests/opengl/assets/vertex/perspective
new file mode 100644
index 0000000..14c8c30
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/vertex/perspective
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform mat4 u_MVPMatrix;
+uniform mat4 u_MVMatrix;
+attribute vec4 a_Position;
+attribute vec3 a_Normal;
+attribute vec2 a_TexCoordinate;
+varying vec3 v_Position;
+varying vec3 v_Normal;
+varying vec2 v_TexCoordinate;
+void main() {
+  // Transform the vertex into eye space.
+  v_Position = vec3(u_MVMatrix * a_Position);
+  // Pass through the texture coordinate.
+  v_TexCoordinate = a_TexCoordinate;
+  // Transform the normal\'s orientation into eye space.
+  v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));
+  // Multiply to get the final point in normalized screen coordinates.
+  gl_Position = u_MVPMatrix * a_Position;
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/assets/vertex/water b/suite/cts/deviceTests/opengl/assets/vertex/water
new file mode 100644
index 0000000..dc09a99
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/assets/vertex/water
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+precision mediump float;
+uniform mat4 u_MVPMatrix;
+uniform mat4 u_MVMatrix;
+attribute vec4 a_Position;
+attribute vec2 a_TexCoordinate;
+varying vec3 v_Position;
+varying vec2 v_TexCoordinate;
+void main() {
+  // Transform the vertex into eye space.
+  v_Position = vec3(u_MVMatrix * a_Position);
+  // Pass through the texture coordinate.
+  v_TexCoordinate = a_TexCoordinate;
+  // Multiply to get the final point in normalized screen coordinates.
+  gl_Position = u_MVPMatrix * a_Position;
+}
\ No newline at end of file
diff --git a/suite/cts/deviceTests/opengl/cob_exporter.py b/suite/cts/deviceTests/opengl/cob_exporter.py
new file mode 100644
index 0000000..0a210c9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/cob_exporter.py
@@ -0,0 +1,75 @@
+import os, bpy, struct
+from bpy_extras.io_utils import ExportHelper
+from bpy.props import StringProperty, BoolProperty, EnumProperty
+
+# This is a custom Blender export script to output an object to a format that's easy to use in
+# android. While open gl allows the use of an index buffer for vertices, the same cannot be done
+# for texture coordinates, which is why this script duplicates the vertices and normals. This
+# gives a larger but faster loading file, hence the tongue-in-cheek name "Compressed" object file.
+# The format is number of vertices + list of vertices (3 coord, 3 normal, 2 texcoord)
+bl_info = {
+        "name": "COB Exporter",
+        "description": "Exports the active scene into a Compressed Object file.",
+        "author": "Stuart Scott",
+        "version": (1, 0, 0),
+        "blender": (2, 6, 2),
+        "api": 36339,
+        "location": "File > Export > COB Exporter (.cob)",
+        "warning": "", # used for warning icon and text in addons panel
+        "wiki_url": "",
+        "tracker_url": "",
+        "category": "Import-Export"
+        }
+
+class COBExporter(bpy.types.Operator, ExportHelper):
+    '''Exports the current scene into a Compressed Object format.'''
+    bl_idname = "export.cob_exporter"  # this is important since its how bpy.ops.export.cob_exporter is constructed
+    bl_label = "COB Exporter"
+
+    filename_ext = ".cob"
+
+    filter_glob = StringProperty(default="*.cob", options={'HIDDEN'})
+
+    def execute(self, context):
+        mesh = context.active_object
+        if mesh.type != 'MESH':
+            print("Active object is not a mesh")
+            return {'FINISHED'}
+        if mesh.mode != 'OBJECT':
+            bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+        print("Writing "+mesh.name+" to "+self.filepath)
+        uvtex = mesh.data.uv_textures.active # points to active texture
+        f = open(self.filepath, 'wb')
+        f.write(struct.pack(">i", len(uvtex.data) * 3))# write length
+        for uv_index, uv_itself in enumerate(uvtex.data):
+            # get uv for this face
+            uvs = uv_itself.uv1, uv_itself.uv2, uv_itself.uv3
+            for vertex_index, vertex_itself in enumerate(mesh.data.faces[uv_index].vertices):
+                # for each vertex in the face
+                vertex = mesh.data.vertices[vertex_itself]
+                v = vertex.co.xyz
+                n = vertex.normal.xyz
+                t = uvs[vertex_index]
+                f.write(struct.pack(">ffffffff", v[0], v[1], v[2], n[0], n[1], n[2], t[0], 1 - t[1]))
+        f.close()
+        return {'FINISHED'}
+
+    @classmethod
+    def poll(cls, context):
+        return context.active_object != None
+
+# Only needed if you want to add into a dynamic menu
+def menu_func(self, context):
+    default_path = os.path.splitext(bpy.data.filepath)[0] + ".cob"
+    self.layout.operator(COBExporter.bl_idname, text="Compressed Object (.cob)").filepath = default_path
+
+def register():
+    bpy.utils.register_module(__name__)
+    bpy.types.INFO_MT_file_export.append(menu_func)
+
+def unregister():
+    bpy.utils.unregister_module(__name__)
+    bpy.types.INFO_MT_file_export.remove(menu_func)
+
+if __name__ == "__main__":
+    register()
diff --git a/suite/cts/deviceTests/opengl/jni/Android.mk b/suite/cts/deviceTests/opengl/jni/Android.mk
new file mode 100644
index 0000000..7b58170
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2013 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 := libctsopengl_jni
+
+LOCAL_MODULE_TAGS := optional
+
+# Needed in order to use fences for synchronization
+LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -funsigned-char
+
+# Get all cpp files but not hidden files
+LOCAL_SRC_FILES := $(patsubst ./%,%, $(shell cd $(LOCAL_PATH); \
+		  find . -name "*.cpp" -and -not -name ".*"))
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+LOCAL_SHARED_LIBRARIES := libEGL libGLESv2 libandroid libutils libcutils liblog
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/suite/cts/deviceTests/opengl/jni/Trace.h b/suite/cts/deviceTests/opengl/jni/Trace.h
new file mode 100644
index 0000000..713d3a0
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/Trace.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef TRACE_H
+#define TRACE_H
+
+// #define TRACE
+
+#ifdef TRACE
+#define ATRACE_TAG ATRACE_TAG_GRAPHICS
+#include <utils/Trace.h>
+#define SCOPED_TRACE() android::ScopedTrace st(ATRACE_TAG, __func__)
+#else
+#define SCOPED_TRACE()
+#endif
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.cpp b/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.cpp
new file mode 100644
index 0000000..9076f39
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.cpp
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "GLUtils.h"
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include <android/asset_manager_jni.h>
+
+#define LOG_TAG "CTS_OPENGL"
+#define LOG_NDEBUG 0
+#include <utils/Log.h>
+
+static JNIEnv* sEnv = NULL;
+static jobject sAssetManager = NULL;
+
+void GLUtils::setEnvAndAssetManager(JNIEnv* env, jobject assetManager) {
+    sEnv = env;
+    sAssetManager = assetManager;
+}
+
+static AAsset* loadAsset(const char* path) {
+    AAssetManager* nativeManager = AAssetManager_fromJava(sEnv, sAssetManager);
+    if (nativeManager == NULL) {
+        return NULL;
+    }
+    return AAssetManager_open(nativeManager, path, AASSET_MODE_UNKNOWN);;
+}
+
+char* GLUtils::openTextFile(const char* path) {
+    AAsset* asset = loadAsset(path);
+    if (asset == NULL) {
+        ALOGE("Couldn't load %s", path);
+        return NULL;
+    }
+    off_t length = AAsset_getLength(asset);
+    char* buffer = new char[length + 1];
+    int num = AAsset_read(asset, buffer, length);
+    AAsset_close(asset);
+    if (num != length) {
+        ALOGE("Couldn't read %s", path);
+        delete[] buffer;
+        return NULL;
+    }
+    buffer[length] = '\0';
+    return buffer;
+}
+
+GLuint GLUtils::loadTexture(const char* path) {
+    GLuint textureId = 0;
+    jclass activityClass = sEnv->FindClass("com/android/cts/opengl/reference/GLGameActivity");
+    if (activityClass == NULL) {
+        ALOGE("Couldn't find activity class");
+        return -1;
+    }
+    jmethodID loadTexture = sEnv->GetStaticMethodID(activityClass, "loadTexture",
+            "(Landroid/content/res/AssetManager;Ljava/lang/String;)I");
+    if (loadTexture == NULL) {
+        ALOGE("Couldn't find loadTexture method");
+        return -1;
+    }
+    jstring pathStr = sEnv->NewStringUTF(path);
+    textureId = sEnv->CallStaticIntMethod(activityClass, loadTexture, sAssetManager, pathStr);
+    sEnv->DeleteLocalRef(pathStr);
+    return textureId;
+}
+
+static int readInt(char* b) {
+    return (((int) b[0]) << 24) | (((int) b[1]) << 16) | (((int) b[2]) << 8) | ((int) b[3]);
+}
+
+static float readFloat(char* b) {
+    union {
+        int input;
+        float output;
+    } data;
+    data.input = readInt(b);
+    return data.output;
+}
+
+Mesh* GLUtils::loadMesh(const char* path) {
+    char* buffer = openTextFile(path);
+    if (buffer == NULL) {
+        return NULL;
+    }
+    int index = 0;
+    int numVertices = readInt(buffer + index);
+    index += 4;
+    float* vertices = new float[numVertices * 3];
+    float* normals = new float[numVertices * 3];
+    float* texCoords = new float[numVertices * 2];
+    for (int i = 0; i < numVertices; i++) {
+        // Vertices
+        int vIndex = i * 3;
+        vertices[vIndex + 0] = readFloat(buffer + index);
+        index += 4;
+        vertices[vIndex + 1] = readFloat(buffer + index);
+        index += 4;
+        vertices[vIndex + 2] = readFloat(buffer + index);
+        index += 4;
+        // Normals
+        normals[vIndex + 0] = readFloat(buffer + index);
+        index += 4;
+        normals[vIndex + 1] = readFloat(buffer + index);
+        index += 4;
+        normals[vIndex + 2] = readFloat(buffer + index);
+        index += 4;
+        // Texture Coordinates
+        int tIndex = i * 2;
+        texCoords[tIndex + 0] = readFloat(buffer + index);
+        index += 4;
+        texCoords[tIndex + 1] = readFloat(buffer + index);
+        index += 4;
+    }
+    return new Mesh(vertices, normals, texCoords, numVertices);
+}
+
+// Loads the given source code as a shader of the given type.
+static GLuint loadShader(GLenum shaderType, const char** source) {
+    GLuint shader = glCreateShader(shaderType);
+    if (shader) {
+        glShaderSource(shader, 1, source, NULL);
+        glCompileShader(shader);
+        GLint compiled = 0;
+        glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
+        if (!compiled) {
+            GLint infoLen = 0;
+            glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
+            if (infoLen > 0) {
+                char* infoLog = (char*) malloc(sizeof(char) * infoLen);
+                glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
+                ALOGE("Error compiling shader:\n%s\n", infoLog);
+                free(infoLog);
+            }
+            glDeleteShader(shader);
+            shader = 0;
+        }
+    }
+    return shader;
+}
+
+GLuint GLUtils::createProgram(const char** vertexSource, const char** fragmentSource) {
+    GLuint vertexShader = loadShader(GL_VERTEX_SHADER, vertexSource);
+    if (!vertexShader) {
+        return 0;
+    }
+
+    GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, fragmentSource);
+    if (!fragmentShader) {
+        return 0;
+    }
+
+    GLuint program = glCreateProgram();
+    if (program) {
+        glAttachShader(program, vertexShader);
+        glAttachShader(program, fragmentShader);
+
+        GLint linkStatus;
+        glLinkProgram(program);
+        glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
+
+        if (!linkStatus) {
+            GLint infoLen = 0;
+            glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
+            if (infoLen > 0) {
+                char* infoLog = (char*) malloc(sizeof(char) * infoLen);
+                glGetProgramInfoLog(program, infoLen, NULL, infoLog);
+                ALOGE("Error linking program:\n%s\n", infoLog);
+                free(infoLog);
+            }
+            glDeleteProgram(program);
+            program = 0;
+        }
+    }
+    return program;
+}
+
+double GLUtils::currentTimeMillis() {
+    struct timeval tv;
+    gettimeofday(&tv, (struct timezone *) NULL);
+    return tv.tv_sec * 1000.0 + tv.tv_usec / 1000.0;
+}
+
+// Rounds a number up to the smallest power of 2 that is greater than or equal to x.
+int GLUtils::roundUpToSmallestPowerOf2(int x) {
+    if (x < 0) {
+        return 0;
+    }
+    --x;
+    x |= x >> 1;
+    x |= x >> 2;
+    x |= x >> 4;
+    x |= x >> 8;
+    x |= x >> 16;
+    return x + 1;
+}
+
+GLuint GLUtils::genTexture(int texWidth, int texHeight, int fill) {
+    GLuint textureId = 0;
+    int w = roundUpToSmallestPowerOf2(texWidth);
+    int h = roundUpToSmallestPowerOf2(texHeight);
+    uint32_t* m = new uint32_t[w * h];
+    if (m != NULL) {
+        uint32_t* d = m;
+        for (int y = 0; y < h; y++) {
+            for (int x = 0; x < w; x++) {
+                if (fill == RANDOM_FILL) {
+                    *d = 0xff000000 | ((y & 0xff) << 16) | ((x & 0xff) << 8) | ((x + y) & 0xff);
+                } else {
+                    *d = 0xff000000 | fill;
+                }
+                d++;
+            }
+        }
+        glGenTextures(1, &textureId);
+        glBindTexture(GL_TEXTURE_2D, textureId);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+    }
+    delete[] m;
+    return textureId;
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.h b/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.h
new file mode 100644
index 0000000..6aef87c
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/GLUtils.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef GLUTILS_H
+#define GLUTILS_H
+
+#include <jni.h>
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include "Mesh.h"
+
+class GLUtils {
+public:
+    static void setEnvAndAssetManager(JNIEnv* env, jobject assetManager);
+    // Loads a file from assets/path into a char array.
+    static char* openTextFile(const char* path);
+    // Loads a texture from assets/texture/<name>
+    static GLuint loadTexture(const char* name);
+    // Loads a mesh from assets/mesh/<name>
+    static Mesh* loadMesh(const char* name);
+    // Creates a program with the given vertex and fragment shader source code.
+    static GLuint createProgram(const char** vertexSource, const char** fragmentSource);
+    static double currentTimeMillis();
+    // Rounds a number up to the smallest power of 2 that is greater than the original number.
+    static int roundUpToSmallestPowerOf2(int x);
+    static const int RANDOM_FILL = -1;
+    // Generates a texture of the given dimensions. The texture can either be filled with the
+    // specified fill color, else if RANDOM_FILL is passed in the texture will be filled with
+    // random values.
+    static GLuint genTexture(int texWidth, int texHeight, int fill);
+    static bool createFBO(GLuint& fboId, GLuint& rboId, GLuint& cboId, int width, int height);
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Matrix.cpp b/suite/cts/deviceTests/opengl/jni/graphics/Matrix.cpp
new file mode 100644
index 0000000..0097a5d
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Matrix.cpp
@@ -0,0 +1,328 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "Matrix.h"
+#include <string.h>
+#include <cmath>
+
+#define LOG_TAG "CTS_OPENGL"
+#define LOG_NDEBUG 0
+#include "utils/Log.h"
+
+Matrix::Matrix() {
+    identity();
+}
+
+Matrix::Matrix(const Matrix& src) {
+    loadWith(src);
+}
+
+void Matrix::print(const char* label) {
+    ALOGI("%c", *label);
+    for (int i = 0; i < 4; i++) {
+        const float* d = &(mData[i * 4]);
+        ALOGI("%f %f %f %f\n", d[0], d[1], d[2], d[3]);
+    }
+}
+
+bool Matrix::equals(const Matrix& src) {
+    bool equals = true;
+    const float* d = src.mData;
+    for (int i = 0; i < MATRIX_SIZE && equals; i++) {
+        if (mData[i] != d[i]) {
+            equals = false;
+        }
+    }
+    return equals;
+}
+
+void Matrix::loadWith(const Matrix& src) {
+    memcpy(mData, src.mData, MATRIX_SIZE * sizeof(float));
+}
+
+void Matrix::identity() {
+    mData[0] = 1.0f;
+    mData[1] = 0.0f;
+    mData[2] = 0.0f;
+    mData[3] = 0.0f;
+
+    mData[4] = 0.0f;
+    mData[5] = 1.0f;
+    mData[6] = 0.0f;
+    mData[7] = 0.0f;
+
+    mData[8] = 0.0f;
+    mData[9] = 0.0f;
+    mData[10] = 1.0f;
+    mData[11] = 0.0f;
+
+    mData[12] = 0.0f;
+    mData[13] = 0.0f;
+    mData[14] = 0.0f;
+    mData[15] = 1.0f;
+}
+
+void Matrix::translate(float x, float y, float z) {
+    Matrix* m = newTranslate(x, y, z);
+    Matrix* temp = new Matrix(*this);
+    if (m != NULL && temp != NULL) {
+        multiply(*temp, *m);
+    }
+    delete m;
+    delete temp;
+}
+
+void Matrix::scale(float x, float y, float z) {
+    Matrix* m = newScale(x, y, z);
+    Matrix* temp = new Matrix(*this);
+    if (m != NULL && temp != NULL) {
+        multiply(*temp, *m);
+    }
+    delete m;
+    delete temp;
+}
+
+void Matrix::rotate(float radians, float x, float y, float z) {
+    Matrix* m = newRotate(radians, x, y, z);
+    Matrix* temp = new Matrix(*this);
+    if (m != NULL && temp != NULL) {
+        multiply(*temp, *m);
+    }
+    delete m;
+    delete temp;
+}
+
+void Matrix::multiply(const Matrix& l, const Matrix& r) {
+    float const* const lhs = l.mData;
+    float const* const rhs = r.mData;
+    for (int i = 0; i < 4; i++) {
+        const int i4 = i * 4;
+        float x = 0;
+        float y = 0;
+        float z = 0;
+        float w = 0;
+
+        for (int j = 0; j < 4; j++) {
+            const int j4 = j * 4;
+            const float e = rhs[i4 + j];
+            x += lhs[j4 + 0] * e;
+            y += lhs[j4 + 1] * e;
+            z += lhs[j4 + 2] * e;
+            w += lhs[j4 + 3] * e;
+        }
+
+        mData[i4 + 0] = x;
+        mData[i4 + 1] = y;
+        mData[i4 + 2] = z;
+        mData[i4 + 3] = w;
+    }
+}
+
+Matrix* Matrix::newLookAt(float eyeX, float eyeY, float eyeZ, float centerX,
+        float centerY, float centerZ, float upX, float upY, float upZ) {
+    Matrix* m = new Matrix();
+    if (m != NULL) {
+        // See the OpenGL GLUT documentation for gluLookAt for a description
+        // of the algorithm. We implement it in a straightforward way:
+
+        float fx = centerX - eyeX;
+        float fy = centerY - eyeY;
+        float fz = centerZ - eyeZ;
+
+        // Normalize f
+        float rlf = 1.0f / (float) sqrt(fx * fx + fy * fy + fz * fz);
+        fx *= rlf;
+        fy *= rlf;
+        fz *= rlf;
+
+        // compute s = f x up (x means "cross product")
+        float sx = fy * upZ - fz * upY;
+        float sy = fz * upX - fx * upZ;
+        float sz = fx * upY - fy * upX;
+
+        // and normalize s
+        float rls = 1.0f / (float) sqrt(sx * sx + sy * sy + sz * sz);
+        sx *= rls;
+        sy *= rls;
+        sz *= rls;
+
+        // compute u = s x f
+        float ux = sy * fz - sz * fy;
+        float uy = sz * fx - sx * fz;
+        float uz = sx * fy - sy * fx;
+
+        float* d = m->mData;
+        d[0] = sx;
+        d[1] = ux;
+        d[2] = -fx;
+        d[3] = 0.0f;
+
+        d[4] = sy;
+        d[5] = uy;
+        d[6] = -fy;
+        d[7] = 0.0f;
+
+        d[8] = sz;
+        d[9] = uz;
+        d[10] = -fz;
+        d[11] = 0.0f;
+
+        d[12] = 0.0f;
+        d[13] = 0.0f;
+        d[14] = 0.0f;
+        d[15] = 1.0f;
+
+        m->translate(-eyeX, -eyeY, -eyeZ);
+    }
+    return m;
+}
+
+Matrix* Matrix::newFrustum(float left, float right, float bottom, float top,
+        float near, float far) {
+    const float r_width = 1.0f / (right - left);
+    const float r_height = 1.0f / (top - bottom);
+    const float r_depth = 1.0f / (near - far);
+    const float x = 2.0f * (near * r_width);
+    const float y = 2.0f * (near * r_height);
+    const float A = (right + left) * r_width;
+    const float B = (top + bottom) * r_height;
+    const float C = (far + near) * r_depth;
+    const float D = 2.0f * (far * near * r_depth);
+    Matrix* m = new Matrix();
+    if (m != NULL) {
+        float* d = m->mData;
+        d[0] = x;
+        d[5] = y;
+        d[8] = A;
+        d[9] = B;
+        d[10] = C;
+        d[14] = D;
+        d[11] = -1.0f;
+        d[1] = 0.0f;
+        d[2] = 0.0f;
+        d[3] = 0.0f;
+        d[4] = 0.0f;
+        d[6] = 0.0f;
+        d[7] = 0.0f;
+        d[12] = 0.0f;
+        d[13] = 0.0f;
+        d[15] = 0.0f;
+    }
+    return m;
+}
+
+Matrix* Matrix::newTranslate(float x, float y, float z) {
+    Matrix* m = new Matrix();
+    if (m != NULL) {
+        float* d = m->mData;
+        d[12] = x;
+        d[13] = y;
+        d[14] = z;
+    }
+    return m;
+}
+Matrix* Matrix::newScale(float x, float y, float z) {
+    Matrix* m = new Matrix();
+    if (m != NULL) {
+        float* d = m->mData;
+        d[0] = x;
+        d[5] = y;
+        d[10] = z;
+    }
+    return m;
+}
+Matrix* Matrix::newRotate(float radians, float x, float y, float z) {
+    Matrix* m = new Matrix();
+    if (m != NULL) {
+        float* d = m->mData;
+        d[3] = 0;
+        d[7] = 0;
+        d[11] = 0;
+        d[12] = 0;
+        d[13] = 0;
+        d[14] = 0;
+        d[15] = 1;
+        float s = (float) sinf(radians);
+        float c = (float) cosf(radians);
+        if (1.0f == x && 0.0f == y && 0.0f == z) {
+            d[5] = c;
+            d[10] = c;
+            d[6] = s;
+            d[9] = -s;
+            d[1] = 0;
+            d[2] = 0;
+            d[4] = 0;
+            d[8] = 0;
+            d[0] = 1;
+        } else if (0.0f == x && 1.0f == y && 0.0f == z) {
+            d[0] = c;
+            d[10] = c;
+            d[8] = s;
+            d[2] = -s;
+            d[1] = 0;
+            d[4] = 0;
+            d[6] = 0;
+            d[9] = 0;
+            d[5] = 1;
+        } else if (0.0f == x && 0.0f == y && 1.0f == z) {
+            d[0] = c;
+            d[5] = c;
+            d[1] = s;
+            d[4] = -s;
+            d[2] = 0;
+            d[6] = 0;
+            d[8] = 0;
+            d[9] = 0;
+            d[10] = 1;
+        } else {
+            float len = sqrt((x * x) + (y * y) + (z * z));
+            if (1.0f != len) {
+                float recipLen = 1.0f / len;
+                x *= recipLen;
+                y *= recipLen;
+                z *= recipLen;
+            }
+            float nc = 1.0f - c;
+            float xy = x * y;
+            float yz = y * z;
+            float zx = z * x;
+            float xs = x * s;
+            float ys = y * s;
+            float zs = z * s;
+            d[0] = x * x * nc + c;
+            d[4] = xy * nc - zs;
+            d[8] = zx * nc + ys;
+            d[1] = xy * nc + zs;
+            d[5] = y * y * nc + c;
+            d[9] = yz * nc - xs;
+            d[2] = zx * nc - ys;
+            d[6] = yz * nc + xs;
+            d[10] = z * z * nc + c;
+        }
+    }
+    return m;
+}
+
+void Matrix::multiplyVector(float* result, const Matrix& lhs,
+        const float* rhs) {
+    const float* d = lhs.mData;
+    const float x = rhs[0];
+    const float y = rhs[1];
+    const float z = rhs[2];
+    const float w = rhs[3];
+    for (int i = 0; i < 4; i++) {
+        const int j = i * 4;
+        result[i] = d[j + 0] * x + d[j + 1] * y + d[j + 2] * z + d[j + 3] * w;
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Matrix.h b/suite/cts/deviceTests/opengl/jni/graphics/Matrix.h
new file mode 100644
index 0000000..11fc23c
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Matrix.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef MATRIX_H
+#define MATRIX_H
+
+class Matrix {
+public:
+    static const int MATRIX_SIZE = 16;
+    float mData[MATRIX_SIZE];
+    Matrix();
+    Matrix(const Matrix& src);
+    // Returns true if the two matrices have the same values.
+    bool equals(const Matrix& src);
+    // Loads this matrix with the identity matrix.
+    void identity();
+    // Loads this matrix with the data from src.
+    void loadWith(const Matrix& src);
+    // Translates this matrix by the given amounts.
+    void translate(float x, float y, float z);
+    // Scales this matrix by the given amounts.
+    void scale(float x, float y, float z);
+    // Rotates this matrix the given angle.
+    void rotate(float radians, float x, float y, float z);
+    // Sets this matrix to be the result of multiplying the given matrices.
+    void multiply(const Matrix& l, const Matrix& r);
+
+    void print(const char* label);
+
+    // Returns a new matrix representing the camera.
+    static Matrix* newLookAt(float eyeX, float eyeY, float eyeZ, float centerX,
+            float centerY, float centerZ, float upX, float upY, float upZ);
+    // Returns a new matrix representing the perspective matrix.
+    static Matrix* newFrustum(float left, float right, float bottom, float top,
+            float near, float far);
+    // Returns a new matrix representing the translation.
+    static Matrix* newTranslate(float x, float y, float z);
+    // Returns a new matrix representing the scaling.
+    static Matrix* newScale(float x, float y, float z);
+    // Returns a new matrix representing the rotation.
+    static Matrix* newRotate(float radians, float x, float y, float z);
+
+    // Sets the given matrix to be the result of multiplying the given matrix by the given vector.
+    static void multiplyVector(float* result, const Matrix& lhs,
+            const float* rhs);
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Mesh.cpp b/suite/cts/deviceTests/opengl/jni/graphics/Mesh.cpp
new file mode 100644
index 0000000..858ec6b
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Mesh.cpp
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "Mesh.h"
+
+Mesh::Mesh(const float* vertices, const float* normals, const float* texCoords,
+           const int numVertices)
+    : mVertices(vertices),
+      mNormals(normals),
+      mTexCoords(texCoords),
+      mNumVertices(numVertices) {
+
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Mesh.h b/suite/cts/deviceTests/opengl/jni/graphics/Mesh.h
new file mode 100644
index 0000000..9ff4103
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Mesh.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef MESH_H
+#define MESH_H
+
+#include <GLES2/gl2.h>
+
+// Meshes act as holders for geometry data etc. This is accessed by the MeshNodes to render them.
+// This allows a mesh to appear multiple times in a SceneGraph without duplication.
+class Mesh {
+public:
+    Mesh(const float* vertices, const float* normals, const float* texCoords,
+            const int numVertices);
+    virtual ~Mesh() {};
+    const float* mVertices;
+    const float* mNormals;
+    const float* mTexCoords;
+    const int mNumVertices;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.cpp
new file mode 100644
index 0000000..8ea5f76
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.cpp
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "MeshNode.h"
+
+MeshNode::MeshNode(const Mesh* mesh) :
+        mMesh(mesh) {
+
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.h b/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.h
new file mode 100644
index 0000000..a02b6bd
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/MeshNode.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef MESHNODE_H
+#define MESHNODE_H
+
+#include "Matrix.h"
+#include "Mesh.h"
+#include "Program.h"
+#include "SceneGraphNode.h"
+
+class MeshNode: public SceneGraphNode {
+public:
+    MeshNode(const Mesh* mesh);
+    virtual ~MeshNode() {};
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection) = 0;
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection) = 0;
+    const Mesh* mMesh;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.cpp
new file mode 100644
index 0000000..db6b05d
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "PerspectiveMeshNode.h"
+
+#include "PerspectiveProgram.h"
+
+PerspectiveMeshNode::PerspectiveMeshNode(const Mesh* mesh, const GLuint textureId) :
+        TexturedMeshNode(mesh, textureId) {
+}
+
+void PerspectiveMeshNode::before(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    PerspectiveProgram& prog = (PerspectiveProgram&) program;
+
+    int textureUniformHandle = glGetUniformLocation(prog.mProgramId, "u_Texture");
+    int positionHandle = glGetAttribLocation(prog.mProgramId, "a_Position");
+    int normalHandle = glGetAttribLocation(prog.mProgramId, "a_Normal");
+    int texCoordHandle = glGetAttribLocation(prog.mProgramId, "a_TexCoordinate");
+
+    // Set the texture.
+    glActiveTexture (GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mTextureId);
+    glUniform1i(textureUniformHandle, 0);
+
+    glEnableVertexAttribArray(positionHandle);
+    glVertexAttribPointer(positionHandle, 3, GL_FLOAT, false, 0, mMesh->mVertices);
+    glEnableVertexAttribArray(normalHandle);
+    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, false, 0, mMesh->mNormals);
+    glEnableVertexAttribArray(texCoordHandle);
+    glVertexAttribPointer(texCoordHandle, 2, GL_FLOAT, false, 0, mMesh->mTexCoords);
+
+    // This multiplies the view matrix by the model matrix, and stores the result in the MVP
+    // matrix (which currently contains model * view).
+    prog.mMVMatrix.multiply(view, model);
+
+    // Pass in the modelview matrix.
+    glUniformMatrix4fv(prog.mMVMatrixHandle, 1, false, prog.mMVMatrix.mData);
+
+    // This multiplies the modelview matrix by the projection matrix, and stores the result in
+    // the MVP matrix (which now contains model * view * projection).
+    prog.mMVPMatrix.multiply(projection, prog.mMVMatrix);
+
+    // Pass in the combined matrix.
+    glUniformMatrix4fv(prog.mMVPMatrixHandle, 1, false, prog.mMVPMatrix.mData);
+
+    // Pass in the light position in eye space.
+    glUniform3f(prog.mLightPosHandle, prog.mLightPosInEyeSpace[0], prog.mLightPosInEyeSpace[1],
+            prog.mLightPosInEyeSpace[2]);
+
+    glDrawArrays(GL_TRIANGLES, 0, mMesh->mNumVertices);
+}
+
+void PerspectiveMeshNode::after(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.h b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.h
new file mode 100644
index 0000000..bc89248
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveMeshNode.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef PERSPECTIVEMESHNODE_H
+#define PERSPECTIVEMESHNODE_H
+
+#include "Matrix.h"
+#include "Mesh.h"
+#include "Program.h"
+#include "TexturedMeshNode.h"
+
+class PerspectiveMeshNode: public TexturedMeshNode {
+public:
+    PerspectiveMeshNode(const Mesh* mesh, const GLuint textureId);
+    virtual ~PerspectiveMeshNode() {};
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.cpp b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.cpp
new file mode 100644
index 0000000..7665e5a
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "PerspectiveProgram.h"
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+PerspectiveProgram::PerspectiveProgram(GLuint programId) :
+        Program(programId) {
+    mLightPosInModelSpace[0] = 0.0f;
+    mLightPosInModelSpace[1] = 0.0f;
+    mLightPosInModelSpace[2] = 1.0f;
+    mLightPosInModelSpace[3] = 2.0f;
+    mMVMatrixHandle = glGetUniformLocation(programId, "u_MVMatrix");
+    mMVPMatrixHandle = glGetUniformLocation(programId, "u_MVPMatrix");
+    mLightPosHandle = glGetUniformLocation(programId, "u_LightPos");
+}
+
+void PerspectiveProgram::before(Matrix& model, Matrix& view, Matrix& projection) {
+    Program::before(model, view, projection);
+    mLightModelMatrix.identity();
+
+    Matrix::multiplyVector(mLightPosInWorldSpace, mLightModelMatrix, mLightPosInModelSpace);
+    Matrix::multiplyVector(mLightPosInEyeSpace, view, mLightPosInWorldSpace);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.h b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.h
new file mode 100644
index 0000000..7792a3d
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/PerspectiveProgram.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef PERSPECTIVEPROGRAM_H
+#define PERSPECTIVEPROGRAM_H
+
+#include "Matrix.h"
+#include "Program.h"
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+class PerspectiveProgram: public Program {
+public:
+    PerspectiveProgram(GLuint programId);
+    virtual ~PerspectiveProgram() {};
+    virtual void before(Matrix& model, Matrix& view, Matrix& projection);
+
+    Matrix mMVMatrix;
+    Matrix mMVPMatrix;
+    Matrix mLightModelMatrix;
+    float mLightPosInModelSpace[4];
+    float mLightPosInWorldSpace[4];
+    float mLightPosInEyeSpace[4];
+
+    int mMVMatrixHandle;
+    int mMVPMatrixHandle;
+    int mLightPosHandle;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Program.cpp b/suite/cts/deviceTests/opengl/jni/graphics/Program.cpp
new file mode 100644
index 0000000..b951a4b
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Program.cpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "ProgramNode.h"
+
+Program::Program(GLuint programId) :
+        mProgramId(programId) {
+}
+
+void Program::before(Matrix& model, Matrix& view, Matrix& projection) {
+    glUseProgram(mProgramId);
+}
+
+void Program::after(Matrix& model, Matrix& view, Matrix& projection) {
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Program.h b/suite/cts/deviceTests/opengl/jni/graphics/Program.h
new file mode 100644
index 0000000..6161baf
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Program.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef PROGRAM_H
+#define PROGRAM_H
+
+#include "Matrix.h"
+
+#include <GLES2/gl2.h>
+
+class Program {
+public:
+    Program(GLuint programId);
+    virtual ~Program() {};
+    virtual void before(Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Matrix& model, Matrix& view, Matrix& projection);
+    GLuint mProgramId;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.cpp
new file mode 100644
index 0000000..f367268
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "ProgramNode.h"
+
+ProgramNode::ProgramNode(Program& program) :
+        mProgram(program) {
+}
+
+void ProgramNode::before(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    program.before(model, view, projection);
+}
+
+void ProgramNode::after(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    program.after(model, view, projection);
+}
+
+void ProgramNode::drawProgram(Matrix& model, Matrix& view, Matrix& projection) {
+    SceneGraphNode::draw(mProgram, model, view, projection);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.h b/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.h
new file mode 100644
index 0000000..fe69958
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/ProgramNode.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef PROGRAMNODE_H
+#define PROGRAMNODE_H
+
+#include "Matrix.h"
+#include "Program.h"
+#include "SceneGraphNode.h"
+
+class ProgramNode: public SceneGraphNode {
+public:
+    ProgramNode(Program& program);
+    virtual ~ProgramNode() {};
+    void drawProgram(Matrix& model, Matrix& view, Matrix& projection);
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    Program& mProgram;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Renderer.cpp b/suite/cts/deviceTests/opengl/jni/graphics/Renderer.cpp
new file mode 100644
index 0000000..b8e2acf
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Renderer.cpp
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "Renderer.h"
+#include <graphics/GLUtils.h>
+
+#define LOG_TAG "CTS_OPENGL"
+#define LOG_NDEBUG 0
+#include <utils/Log.h>
+
+#include <Trace.h>
+
+// Used to center the grid on the screen.
+#define CENTER_GRID(x) ((((x) * 2.0 + 1) - OFFSCREEN_GRID_SIZE) / OFFSCREEN_GRID_SIZE)
+
+static const int FBO_NUM_VERTICES = 6;
+
+static const float FBO_VERTICES[FBO_NUM_VERTICES * 3] = {
+        0.1f, 0.1f, -0.1f,
+        -0.1f, 0.1f, -0.1f,
+        -0.1f, -0.1f, -0.1f,
+        -0.1f, -0.1f, -0.1f,
+        0.1f, -0.1f, -0.1f,
+        0.1f, 0.1f, -0.1f };
+static const float FBO_TEX_COORDS[FBO_NUM_VERTICES * 2] = {
+        1.0f, 1.0f,
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        0.0f, 0.0f,
+        1.0f, 0.0f,
+        1.0f, 1.0f };
+
+static const char* FBO_VERTEX =
+        "attribute vec4 a_Position;"
+        "attribute vec2 a_TexCoord;"
+        "uniform float u_XOffset;"
+        "uniform float u_YOffset;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  v_TexCoord = a_TexCoord;"
+        "  gl_Position.x = a_Position.x + u_XOffset;"
+        "  gl_Position.y = a_Position.y + u_YOffset;"
+        "  gl_Position.zw = a_Position.zw;"
+        "}";
+
+static const char* FBO_FRAGMENT =
+        "precision mediump float;"
+        "uniform sampler2D u_Texture;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  gl_FragColor = texture2D(u_Texture, v_TexCoord);"
+        "}";
+
+static const EGLint contextAttribs[] = {
+        EGL_CONTEXT_CLIENT_VERSION, 2,
+        EGL_NONE };
+
+static const EGLint configAttribs[] = {
+        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
+        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+        EGL_RED_SIZE, 8,
+        EGL_GREEN_SIZE, 8,
+        EGL_BLUE_SIZE, 8,
+        EGL_ALPHA_SIZE, 8,
+        EGL_DEPTH_SIZE, 16,
+        EGL_STENCIL_SIZE, 8,
+        EGL_NONE };
+
+static const int FBO_SIZE = 128;
+
+Renderer::Renderer(ANativeWindow* window, bool offscreen, int workload) :
+        mOffscreen(offscreen), mWindow(window), mEglDisplay(EGL_NO_DISPLAY),
+        mEglSurface(EGL_NO_SURFACE), mEglContext(EGL_NO_CONTEXT), mWorkload(workload) {
+}
+
+bool Renderer::setUp() {
+    SCOPED_TRACE();
+    mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+    if (EGL_NO_DISPLAY == mEglDisplay || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    EGLint major;
+    EGLint minor;
+    if (!eglInitialize(mEglDisplay, &major, &minor) || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    EGLint numConfigs = 0;
+    if (!eglChooseConfig(mEglDisplay, configAttribs, &mGlConfig, 1, &numConfigs)
+            || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig, mWindow, NULL);
+    if (EGL_NO_SURFACE == mEglSurface || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    mEglContext = eglCreateContext(mEglDisplay, mGlConfig, EGL_NO_CONTEXT, contextAttribs);
+    if (EGL_NO_CONTEXT == mEglContext || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)
+            || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    if (!eglQuerySurface(mEglDisplay, mEglSurface, EGL_WIDTH, &mWidth)
+            || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+    if (!eglQuerySurface(mEglDisplay, mEglSurface, EGL_HEIGHT, &mHeight)
+            || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    if (mOffscreen) {
+        mFboWidth = FBO_SIZE;
+        mFboHeight = FBO_SIZE;
+
+        glGenFramebuffers(1, &mFboId);
+        glBindFramebuffer(GL_FRAMEBUFFER, mFboId);
+
+        glGenRenderbuffers(1, &mFboDepthId);
+        glBindRenderbuffer(GL_RENDERBUFFER, mFboDepthId);
+        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, mFboWidth, mFboHeight);
+        glBindRenderbuffer(GL_RENDERBUFFER, 0);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                  GL_RENDERBUFFER, mFboDepthId);
+
+        mFboTexId = GLUtils::genTexture(mFboWidth, mFboHeight, 0);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mFboTexId, 0);
+
+        GLuint err = glGetError();
+        if (err != GL_NO_ERROR) {
+            ALOGE("GLError %d", err);
+            return false;
+        }
+
+        GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+        if (status != GL_FRAMEBUFFER_COMPLETE) {
+            ALOGE("Framebuffer not complete: %d", status);
+            return false;
+        }
+        // Create fbo program.
+        mFboProgId = GLUtils::createProgram(&FBO_VERTEX, &FBO_FRAGMENT);
+        if (mFboProgId == 0) {
+            return false;
+        }
+        // Bind attributes.
+        mFboTexUniformHandle = glGetUniformLocation(mFboProgId, "u_Texture");
+        mFboXOffsetUniformHandle = glGetUniformLocation(mFboProgId, "u_XOffset");
+        mFboYOffsetUniformHandle = glGetUniformLocation(mFboProgId, "u_YOffset");
+        mFboPositionHandle = glGetAttribLocation(mFboProgId, "a_Position");
+        mFboTexCoordHandle = glGetAttribLocation(mFboProgId, "a_TexCoord");
+    } else {
+        mFboWidth = 0;
+        mFboHeight = 0;
+        mFboId = 0;
+        mFboDepthId = 0;
+        mFboTexId = 0;
+    }
+
+    GLuint err = glGetError();
+    if (err != GL_NO_ERROR) {
+        ALOGE("GLError %d in setUp", err);
+        return false;
+    }
+    return true;
+}
+
+bool Renderer::tearDown() {
+    SCOPED_TRACE();
+    if (mOffscreen) {
+        if (mFboId != 0) {
+            glDeleteFramebuffers(1, &mFboId);
+            mFboId = 0;
+        }
+        if (mFboDepthId != 0) {
+            glDeleteRenderbuffers(1, &mFboDepthId);
+            mFboDepthId = 0;
+        }
+        if (mFboTexId != 0) {
+            glDeleteTextures(1, &mFboTexId);
+            mFboTexId = 0;
+        }
+    }
+    GLuint err = glGetError();
+    if (err != GL_NO_ERROR) {
+        ALOGE("GLError %d in tearDown", err);
+        return false;
+    }
+    if (mEglContext != EGL_NO_CONTEXT) {
+        eglDestroyContext(mEglDisplay, mEglContext);
+        mEglContext = EGL_NO_CONTEXT;
+    }
+    if (mEglSurface != EGL_NO_SURFACE) {
+        eglDestroySurface(mEglDisplay, mEglSurface);
+        mEglSurface = EGL_NO_SURFACE;
+    }
+    if (mEglDisplay != EGL_NO_DISPLAY) {
+        eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+        eglTerminate(mEglDisplay);
+        mEglDisplay = EGL_NO_DISPLAY;
+    }
+
+    return EGL_SUCCESS == eglGetError();
+}
+
+bool Renderer::draw() {
+    SCOPED_TRACE();
+    if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)
+            || EGL_SUCCESS != eglGetError()) {
+        return false;
+    }
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    glViewport(0, 0, mWidth, mHeight);
+
+    if (mOffscreen) {
+        // Set the background clear color to black.
+        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+        for (int i = 0; i < OFFSCREEN_INNER_FRAMES; i++) {
+            // Switch to FBO and re-attach.
+            glBindFramebuffer(GL_FRAMEBUFFER, mFboId);
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                    GL_RENDERBUFFER, mFboDepthId);
+            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                 GL_TEXTURE_2D, mFboTexId, 0);
+            glViewport(0, 0, mFboWidth, mFboHeight);
+
+            // Render workload.
+            drawWorkload();
+            glFlush();
+
+            // Switch back to display.
+            glBindFramebuffer(GL_FRAMEBUFFER, 0);
+            glViewport(0, 0, mWidth, mHeight);
+
+            // No culling of back faces
+            glDisable (GL_CULL_FACE);
+            // No depth testing
+            glDisable (GL_DEPTH_TEST);
+            // No blending
+            glDisable (GL_BLEND);
+
+            glUseProgram(mFboProgId);
+
+            // Set the texture.
+            glActiveTexture (GL_TEXTURE0);
+            glBindTexture(GL_TEXTURE_2D, mFboTexId);
+            glUniform1i(mFboTexUniformHandle, 0);
+
+            // Set the offsets
+            glUniform1f(mFboXOffsetUniformHandle, CENTER_GRID(i / OFFSCREEN_GRID_SIZE));
+            glUniform1f(mFboYOffsetUniformHandle, CENTER_GRID(i % OFFSCREEN_GRID_SIZE));
+
+            glEnableVertexAttribArray(mFboPositionHandle);
+            glEnableVertexAttribArray(mFboTexCoordHandle);
+            glVertexAttribPointer(mFboPositionHandle, 3, GL_FLOAT, false, 0, FBO_VERTICES);
+            glVertexAttribPointer(mFboTexCoordHandle, 2, GL_FLOAT, false, 0, FBO_TEX_COORDS);
+
+            // Render FBO to display.
+            glDrawArrays(GL_TRIANGLES, 0, FBO_NUM_VERTICES);
+        }
+    } else {
+        // Render workload.
+        drawWorkload();
+    }
+
+    GLuint err = glGetError();
+    if (err != GL_NO_ERROR) {
+        ALOGE("GLError %d in draw", err);
+        return false;
+    }
+
+    return eglSwapBuffers(mEglDisplay, mEglSurface);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Renderer.h b/suite/cts/deviceTests/opengl/jni/graphics/Renderer.h
new file mode 100644
index 0000000..caa1634
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Renderer.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef RENDERER_H
+#define RENDERER_H
+
+#include <android/native_window.h>
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+class Renderer {
+public:
+    Renderer(ANativeWindow* window, bool offscreen, int workload);
+    virtual bool setUp();
+    virtual bool tearDown();
+    bool draw();
+    virtual void drawWorkload() = 0;
+    virtual ~Renderer() {};
+    static const int OFFSCREEN_INNER_FRAMES = 100;
+    static const int OFFSCREEN_GRID_SIZE = 10;
+    bool mOffscreen;
+protected:
+    ANativeWindow* mWindow;
+    EGLDisplay mEglDisplay;
+    EGLSurface mEglSurface;
+    EGLContext mEglContext;
+    EGLConfig mGlConfig;
+    GLuint mProgramId;
+    EGLint mWidth;
+    EGLint mHeight;
+    int mWorkload;
+    int mFboWidth;// Frame buffer width
+    int mFboHeight;// Frame buffer height
+    GLuint mFboId;// Frame buffer id
+    GLuint mFboDepthId;// Depth buffer id
+    GLuint mFboTexId;// Frame buffer texture id
+    GLuint mFboProgId;// Frame buffer program id
+    GLuint mFboTexUniformHandle;// Frame buffer texture uniform handle
+    GLuint mFboXOffsetUniformHandle;// Frame buffer x offset uniform handle
+    GLuint mFboYOffsetUniformHandle;// Frame buffer y offset uniform handle
+    GLuint mFboPositionHandle;// Frame buffer position handle
+    GLuint mFboTexCoordHandle;// Frame buffer texture coordinate handle
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.cpp
new file mode 100644
index 0000000..455ccd6
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.cpp
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "SceneGraphNode.h"
+
+SceneGraphNode::~SceneGraphNode() {
+    for (size_t i = 0; i < mChildren.size(); i++) {
+        delete mChildren[i];
+    }
+}
+
+void SceneGraphNode::addChild(SceneGraphNode* child) {
+    mChildren.add(child);
+}
+
+void SceneGraphNode::draw(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    before(program, model, view, projection);
+    for (size_t i = 0; i < mChildren.size(); i++) {
+        mChildren[i]->draw(program, model, view, projection);
+    }
+    after(program, model, view, projection);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.h b/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.h
new file mode 100644
index 0000000..dce8fde
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/SceneGraphNode.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef SCENEGRAPHNODE_H
+#define SCENEGRAPHNODE_H
+
+#include <utils/Vector.h>
+#include "Matrix.h"
+#include "Program.h"
+
+class SceneGraphNode {
+public:
+    SceneGraphNode() {};
+    virtual ~SceneGraphNode();
+    void addChild(SceneGraphNode* child);
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection) = 0;
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection) = 0;
+    void draw(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+private:
+    android::Vector<SceneGraphNode*> mChildren;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.cpp
new file mode 100644
index 0000000..7da18af
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "TexturedMeshNode.h"
+
+TexturedMeshNode::TexturedMeshNode(const Mesh* mesh, const GLuint textureId) :
+        MeshNode(mesh), mTextureId(textureId) {
+}
+
+void TexturedMeshNode::before(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    int textureUniformHandle = glGetUniformLocation(program.mProgramId, "u_Texture");
+    int positionHandle = glGetAttribLocation(program.mProgramId, "a_Position");
+    int texCoordHandle = glGetAttribLocation(program.mProgramId, "a_TexCoordinate");
+
+    // Set the texture.
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mTextureId);
+    glUniform1i(textureUniformHandle, 0);
+
+    glEnableVertexAttribArray(positionHandle);
+    glVertexAttribPointer(positionHandle, 3, GL_FLOAT, false, 0, mMesh->mVertices);
+    glEnableVertexAttribArray(texCoordHandle);
+    glVertexAttribPointer(texCoordHandle, 2, GL_FLOAT, false, 0, mMesh->mTexCoords);
+
+    glDrawArrays(GL_TRIANGLES, 0, mMesh->mNumVertices);
+}
+
+void TexturedMeshNode::after(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.h b/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.h
new file mode 100644
index 0000000..fff95aa
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/TexturedMeshNode.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef TEXTUREDMESHNODE_H
+#define TEXTUREDMESHNODE_H
+
+#include "Matrix.h"
+#include "Mesh.h"
+#include "MeshNode.h"
+#include "Program.h"
+
+class TexturedMeshNode: public MeshNode {
+public:
+    TexturedMeshNode(const Mesh* mesh, const GLuint textureId);
+    virtual ~TexturedMeshNode() {};
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    const GLuint mTextureId;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.cpp b/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.cpp
new file mode 100644
index 0000000..3cfa55b
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "TransformationNode.h"
+
+TransformationNode::TransformationNode(Matrix* matrix) :
+        mMatrix(matrix) {
+}
+
+TransformationNode::~TransformationNode() {
+    delete mMatrix;
+}
+
+void TransformationNode::before(Program& program, Matrix& model, Matrix& view,
+        Matrix& projection) {
+    // Save the current Matrix.
+    mSavedModelMatrix.loadWith(model);
+    // Apply transformation.
+    model.multiply(*mMatrix, mSavedModelMatrix);
+}
+
+void TransformationNode::after(Program& program, Matrix& model, Matrix& view,
+        Matrix& projection) {
+    // Restore original Matrix.
+    model.loadWith(mSavedModelMatrix);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.h b/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.h
new file mode 100644
index 0000000..04ba5c2
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/TransformationNode.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef TRANSFORMATIONNODE_H
+#define TRANSFORMATIONNODE_H
+
+#include "Matrix.h"
+#include "Program.h"
+#include "SceneGraphNode.h"
+
+class TransformationNode: public SceneGraphNode {
+public:
+    TransformationNode(Matrix* matrix);
+    virtual ~TransformationNode();
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view,
+            Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view,
+            Matrix& projection);
+private:
+    Matrix mSavedModelMatrix;
+    Matrix* mMatrix;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.cpp b/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.cpp
new file mode 100644
index 0000000..d4a8c18
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "Vector2D.h"
+
+#include <math.h>
+
+Vector2D::Vector2D() :
+        mX(0), mY(0) {
+}
+
+Vector2D::Vector2D(float x, float y) :
+        mX(x), mY(y) {
+}
+
+Vector2D Vector2D::copy() {
+    Vector2D v(mX, mY);
+    return v;
+}
+
+void Vector2D::add(const Vector2D& v) {
+    mX += v.mX;
+    mY += v.mY;
+}
+
+void Vector2D::sub(const Vector2D& v) {
+    mX -= v.mX;
+    mY -= v.mY;
+}
+
+void Vector2D::scale(float s) {
+    mX *= s;
+    mY *= s;
+}
+
+float Vector2D::distance(const Vector2D& v) {
+    float dx = mX - v.mX;
+    float dy = mY - v.mY;
+    return (float) sqrt(dx * dx + dy * dy);
+}
+
+void Vector2D::normalize() {
+    float m = magnitude();
+    if (m > 0) {
+        scale(1 / m);
+    }
+}
+
+void Vector2D::limit(float max) {
+    if (magnitude() > max) {
+        normalize();
+        scale(max);
+    }
+}
+
+float Vector2D::magnitude() {
+    return (float) sqrt(mX * mX + mY * mY);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.h b/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.h
new file mode 100644
index 0000000..5110975
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/graphics/Vector2D.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef VECTOR2D_H
+#define VECTOR2D_H
+
+class Vector2D {
+public:
+    Vector2D();
+    Vector2D(float x, float y);
+    Vector2D copy();
+    void normalize();
+    void add(const Vector2D& v);
+    void sub(const Vector2D& v);
+    void scale(float s);
+    void limit(float max);
+    void limit(float maxX, float maxY);
+    float magnitude();
+    float distance(const Vector2D& v);
+    float mX;
+    float mY;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/GLPrimitive.cpp b/suite/cts/deviceTests/opengl/jni/primitive/GLPrimitive.cpp
new file mode 100644
index 0000000..9d39af9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/GLPrimitive.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include <jni.h>
+
+#include <stdlib.h>
+
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+
+#include <graphics/GLUtils.h>
+#include <graphics/Renderer.h>
+
+#include "fullpipeline/FullPipelineRenderer.h"
+#include "pixeloutput/PixelOutputRenderer.h"
+#include "shaderperf/ShaderPerfRenderer.h"
+#include "contextswitch/ContextSwitchRenderer.h"
+
+// Holds the current benchmark's renderer.
+Renderer* gRenderer = NULL;
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_startBenchmark(
+        JNIEnv* env, jclass clazz, jint numFrames, jdoubleArray frameTimes) {
+    if (gRenderer == NULL) {
+        return false;
+    }
+
+    // Sets up the renderer.
+    bool success = gRenderer->setUp();
+
+    // Records the start time.
+    double start = GLUtils::currentTimeMillis();
+
+    // Offscreen renders 100 tiles per frame so reduce the number of frames to render.
+    if (gRenderer->mOffscreen) {
+        numFrames /= Renderer::OFFSCREEN_INNER_FRAMES;
+    }
+
+    // Draw off the screen.
+    for (int i = 0; i < numFrames && success; i++) {
+        // Draw a frame.
+        success = gRenderer->draw();
+    }
+
+    // Records the end time.
+    double end = GLUtils::currentTimeMillis();
+
+    // Sets the times in the Java array.
+    double times[] = {start, end};
+    env->SetDoubleArrayRegion(frameTimes, 0, 2, times);
+
+    // Tears down and deletes the renderer.
+    success = gRenderer->tearDown() && success;
+    delete gRenderer;
+    gRenderer = NULL;
+    return success;
+}
+
+// The following functions create the renderers for the various benchmarks.
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_setupFullPipelineBenchmark(
+        JNIEnv* env, jclass clazz, jobject surface, jboolean offscreen, jint workload) {
+    gRenderer = new FullPipelineRenderer(
+            ANativeWindow_fromSurface(env, surface), offscreen, workload);
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_setupPixelOutputBenchmark(
+        JNIEnv* env, jclass clazz, jobject surface, jboolean offscreen, jint workload) {
+    gRenderer = new PixelOutputRenderer(
+            ANativeWindow_fromSurface(env, surface), offscreen, workload);
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_setupShaderPerfBenchmark(
+        JNIEnv* env, jclass clazz, jobject surface, jboolean offscreen, jint workload) {
+    gRenderer = new ShaderPerfRenderer(
+            ANativeWindow_fromSurface(env, surface), offscreen, workload);
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_android_cts_opengl_primitive_GLPrimitiveActivity_setupContextSwitchBenchmark(
+        JNIEnv* env, jclass clazz, jobject surface, jboolean offscreen, jint workload) {
+    if (workload <= 8) {
+        // This test uses 8 iterations, so workload can't be more than 8.
+        gRenderer = new ContextSwitchRenderer(
+                ANativeWindow_fromSurface(env, surface), offscreen, workload);
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.cpp b/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.cpp
new file mode 100644
index 0000000..7fd4093
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.cpp
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include <android/native_window.h>
+
+#include <stdlib.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include "ContextSwitchRenderer.h"
+#include <graphics/GLUtils.h>
+
+#define LOG_TAG "CTS_OPENGL"
+#define LOG_NDEBUG 0
+#include <utils/Log.h>
+#include <Trace.h>
+
+static const EGLint contextAttribs[] = {
+        EGL_CONTEXT_CLIENT_VERSION, 2,
+        EGL_NONE };
+
+static const int NUM_WORKER_CONTEXTS = 7;
+
+static const int CS_TEXTURE_SIZE = 64;
+
+static const int CS_NUM_VERTICES = 6;
+
+static const float CS_VERTICES[CS_NUM_VERTICES * 3] = {
+        0.1f, 0.1f, -0.1f,
+        -0.1f, 0.1f, -0.1f,
+        -0.1f, -0.1f, -0.1f,
+        -0.1f, -0.1f, -0.1f,
+        0.1f, -0.1f, -0.1f,
+        0.1f, 0.1f, -0.1f };
+
+static const float CS_TEX_COORDS[CS_NUM_VERTICES * 2] = {
+        1.0f, 1.0f,
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        0.0f, 0.0f,
+        1.0f, 0.0f,
+        1.0f, 1.0f };
+
+static const char* CS_VERTEX =
+        "attribute vec4 a_Position;"
+        "attribute vec2 a_TexCoord;"
+        "uniform float u_Translate;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  v_TexCoord = a_TexCoord;"
+        "  gl_Position.x = a_Position.x + u_Translate;"
+        "  gl_Position.yzw = a_Position.yzw;"
+        "}";
+
+static const char* CS_FRAGMENT =
+        "precision mediump float;"
+        "uniform sampler2D u_Texture;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  gl_FragColor = texture2D(u_Texture, v_TexCoord);"
+        "}";
+
+ContextSwitchRenderer::ContextSwitchRenderer(ANativeWindow* window, bool offscreen, int workload) :
+        Renderer(window, offscreen, workload), mContexts(NULL) {
+}
+
+bool ContextSwitchRenderer::setUp() {
+    SCOPED_TRACE();
+    if (!Renderer::setUp()) {
+        return false;
+    }
+
+    // Setup texture.
+    mTextureId = GLUtils::genTexture(CS_TEXTURE_SIZE, CS_TEXTURE_SIZE, GLUtils::RANDOM_FILL);
+    if (mTextureId == 0) {
+        return false;
+    }
+
+    // Create program.
+    mProgramId = GLUtils::createProgram(&CS_VERTEX, &CS_FRAGMENT);
+    if (mProgramId == 0) {
+        return false;
+    }
+    // Bind attributes.
+    mTextureUniformHandle = glGetUniformLocation(mProgramId, "u_Texture");
+    mTranslateUniformHandle = glGetUniformLocation(mProgramId, "u_Translate");
+    mPositionHandle = glGetAttribLocation(mProgramId, "a_Position");
+    mTexCoordHandle = glGetAttribLocation(mProgramId, "a_TexCoord");
+
+    mContexts = new EGLContext[NUM_WORKER_CONTEXTS];
+    mFboIds = new GLuint[NUM_WORKER_CONTEXTS];
+    for (int i = 0; i < NUM_WORKER_CONTEXTS; i++) {
+        // Create the contexts, they share data with the main one.
+        mContexts[i] = eglCreateContext(mEglDisplay, mGlConfig, mEglContext, contextAttribs);
+        if (EGL_NO_CONTEXT == mContexts[i] || EGL_SUCCESS != eglGetError()) {
+            return false;
+        }
+
+        if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mContexts[i])
+                || EGL_SUCCESS != eglGetError()) {
+            return false;
+        }
+        if (mOffscreen) {
+            // FBOs are not shared across contexts, textures and renderbuffers are though.
+            glGenFramebuffers(1, &mFboIds[i]);
+            glBindFramebuffer(GL_FRAMEBUFFER, mFboIds[i]);
+
+            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                      GL_RENDERBUFFER, mFboDepthId);
+
+            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                   GL_TEXTURE_2D, mFboTexId, 0);
+            GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+            if (status != GL_FRAMEBUFFER_COMPLETE) {
+                ALOGE("Framebuffer not complete: %d", status);
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+bool ContextSwitchRenderer::tearDown() {
+    SCOPED_TRACE();
+    if (mContexts) {
+        // Destroy the contexts, the main one will be handled by Renderer::tearDown().
+        for (int i = 0; i < NUM_WORKER_CONTEXTS; i++) {
+            if (mOffscreen) {
+                if (mFboIds[i] != 0) {
+                    eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mContexts[i]);
+                    glDeleteFramebuffers(1, &mFboIds[i]);
+                    mFboIds[i] = 0;
+                }
+            }
+            eglDestroyContext(mEglDisplay, mContexts[i]);
+        }
+        delete[] mContexts;
+    }
+    eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
+    if (mTextureId != 0) {
+        glDeleteTextures(1, &mTextureId);
+        mTextureId = 0;
+    }
+    if (!Renderer::tearDown()) {
+        return false;
+    }
+    return true;
+}
+
+void ContextSwitchRenderer::drawWorkload() {
+    SCOPED_TRACE();
+    // Set the background clear color to black.
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+    // No culling of back faces
+    glDisable(GL_CULL_FACE);
+    // No depth testing
+    glDisable(GL_DEPTH_TEST);
+
+    EGLSyncKHR fence = eglCreateSyncKHR(mEglDisplay, EGL_SYNC_FENCE_KHR, NULL);
+
+    const int TOTAL_NUM_CONTEXTS = NUM_WORKER_CONTEXTS + 1;
+    const float TRANSLATION = 0.9f - (TOTAL_NUM_CONTEXTS * 0.2f);
+    for (int i = 0; i < TOTAL_NUM_CONTEXTS; i++) {
+        eglWaitSyncKHR(mEglDisplay, fence, 0);
+        eglDestroySyncKHR(mEglDisplay, fence);
+        glUseProgram(mProgramId);
+
+        // Set the texture.
+        glActiveTexture (GL_TEXTURE0);
+        glBindTexture(GL_TEXTURE_2D, mTextureId);
+        glUniform1i(mTextureUniformHandle, 0);
+
+        // Set the x translate.
+        glUniform1f(mTranslateUniformHandle, (i * 0.2f) + TRANSLATION);
+
+        glEnableVertexAttribArray(mPositionHandle);
+        glEnableVertexAttribArray(mTexCoordHandle);
+        glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, CS_VERTICES);
+        glVertexAttribPointer(mTexCoordHandle, 2, GL_FLOAT, false, 0, CS_TEX_COORDS);
+
+        glDrawArrays(GL_TRIANGLES, 0, CS_NUM_VERTICES);
+        fence = eglCreateSyncKHR(mEglDisplay, EGL_SYNC_FENCE_KHR, NULL);
+
+        // Switch to next context.
+        if (i < (mWorkload - 1)) {
+            eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mContexts[i]);
+            // Switch to FBO and re-attach.
+            if (mOffscreen) {
+                glBindFramebuffer(GL_FRAMEBUFFER, mFboIds[i]);
+                glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                        GL_RENDERBUFFER, mFboDepthId);
+                glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                     GL_TEXTURE_2D, mFboTexId, 0);
+                glViewport(0, 0, mFboWidth, mFboHeight);
+            }
+        }
+        GLuint err = glGetError();
+        if (err != GL_NO_ERROR) {
+            ALOGE("GLError %d in drawWorkload", err);
+            break;
+        }
+    }
+
+    eglDestroySyncKHR(mEglDisplay, fence);
+
+    // Switch back to the main context.
+    eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext);
+    if (mOffscreen) {
+        glBindFramebuffer(GL_FRAMEBUFFER, mFboId);
+        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
+                                GL_RENDERBUFFER, mFboDepthId);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                             GL_TEXTURE_2D, mFboTexId, 0);
+        glViewport(0, 0, mFboWidth, mFboHeight);
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.h b/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.h
new file mode 100644
index 0000000..51a4376
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/contextswitch/ContextSwitchRenderer.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef CONTEXTSWITCHRENDERER_H
+#define CONTEXTSWITCHRENDERER_H
+
+#include <graphics/Renderer.h>
+
+class ContextSwitchRenderer: public Renderer {
+public:
+    ContextSwitchRenderer(ANativeWindow* window, bool offscreen, int workload);
+    virtual ~ContextSwitchRenderer() {};
+    bool setUp();
+    bool tearDown();
+    void drawWorkload();
+private:
+    EGLContext* mContexts;
+    GLuint* mFboIds;
+    GLuint mTextureId;
+    GLuint mTextureUniformHandle;
+    GLuint mTranslateUniformHandle;
+    GLuint mPositionHandle;
+    GLuint mTexCoordHandle;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.cpp b/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.cpp
new file mode 100644
index 0000000..97462b5
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.cpp
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include "FullPipelineRenderer.h"
+
+#include <graphics/PerspectiveMeshNode.h>
+#include <graphics/GLUtils.h>
+#include <graphics/TransformationNode.h>
+
+#include <Trace.h>
+
+static const int FP_NUM_VERTICES = 6;
+
+static const float FP_VERTICES[FP_NUM_VERTICES * 3] = {
+        1.0f, 1.0f, 0.0f,
+        0.0f, 1.0f, 0.0f,
+        0.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 0.0f,
+        1.0f, 0.0f, 0.0f,
+        1.0f, 1.0f, 0.0f };
+
+static const float FP_NORMALS[FP_NUM_VERTICES * 3] = {
+        0.0f, 0.0f, 1.0f,
+        0.0f, 0.0f, 1.0f,
+        0.0f, 0.0f, 1.0f,
+        0.0f, 0.0f, 1.0f,
+        0.0f, 0.0f, 1.0f,
+        0.0f, 0.0f, 1.0f };
+
+static const float FP_TEX_COORDS[FP_NUM_VERTICES * 2] = {
+        1.0f, 1.0f,
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        0.0f, 0.0f,
+        1.0f, 0.0f,
+        1.0f, 1.0f };
+
+static const char* FP_VERTEX =
+        "uniform mat4 u_MVPMatrix;"
+        "uniform mat4 u_MVMatrix;"
+        "attribute vec4 a_Position;"
+        "attribute vec3 a_Normal;"
+        "attribute vec2 a_TexCoordinate;"
+        "varying vec3 v_Position;"
+        "varying vec3 v_Normal;"
+        "varying vec2 v_TexCoordinate;"
+        "void main() {\n"
+        "  // Transform the vertex into eye space.\n"
+        "  v_Position = vec3(u_MVMatrix * a_Position);\n"
+        "  // Pass through the texture coordinate.\n"
+        "  v_TexCoordinate = a_TexCoordinate;\n"
+        "  // Transform the normal\'s orientation into eye space.\n"
+        "  v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));\n"
+        "  // Multiply to get the final point in normalized screen coordinates.\n"
+        "  gl_Position = u_MVPMatrix * a_Position;\n"
+        "}";
+
+static const char* FP_FRAGMENT =
+        "precision mediump float;"
+        "uniform vec3 u_LightPos;"
+        "uniform sampler2D u_Texture;"
+        "varying vec3 v_Position;"
+        "varying vec3 v_Normal;"
+        "varying vec2 v_TexCoordinate;"
+        "void main() {\n"
+        "  // Will be used for attenuation.\n"
+        "  float distance = length(u_LightPos - v_Position);\n"
+        "  // Get a lighting direction vector from the light to the vertex.\n"
+        "  vec3 lightVector = normalize(u_LightPos - v_Position);\n"
+        "  // Calculate the dot product of the light vector and vertex normal.\n"
+        "  float diffuse = max(dot(v_Normal, lightVector), 0.0);\n"
+        "  // Add attenuation.\n"
+        "  diffuse = diffuse * (1.0 / (1.0 + (0.01 * distance)));\n"
+        "  // Add ambient lighting\n"
+        "  diffuse = diffuse + 0.25;\n"
+        "  // Multiply the diffuse illumination and texture to get final output color.\n"
+        "  gl_FragColor = (diffuse * texture2D(u_Texture, v_TexCoordinate));\n"
+        "}";
+
+FullPipelineRenderer::FullPipelineRenderer(ANativeWindow* window, bool offscreen, int workload) :
+        Renderer(window, offscreen, workload), mProgram(NULL), mSceneGraph(NULL),
+        mModelMatrix(NULL), mViewMatrix(NULL), mProjectionMatrix(NULL), mMesh(NULL),
+        mTextureId(0) {
+}
+
+bool FullPipelineRenderer::setUp() {
+    SCOPED_TRACE();
+    if (!Renderer::setUp()) {
+        return false;
+    }
+
+    mProgramId = GLUtils::createProgram(&FP_VERTEX, &FP_FRAGMENT);
+    if (mProgramId == 0) {
+        return false;
+    }
+    mProgram = new PerspectiveProgram(mProgramId);
+
+    mModelMatrix = new Matrix();
+
+    // Position the eye in front of the origin.
+    float eyeX = 0.0f;
+    float eyeY = 0.0f;
+    float eyeZ = 1.5f;
+
+    // We are looking at the origin
+    float centerX = 0.0f;
+    float centerY = 0.0f;
+    float centerZ = 0.0f;
+
+    // Set our up vector.
+    float upX = 0.0f;
+    float upY = 1.0f;
+    float upZ = 0.0f;
+
+    // Set the view matrix.
+    mViewMatrix = Matrix::newLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
+
+    // Create a new perspective projection matrix. The height will stay the same
+    // while the width will vary as per aspect ratio.
+    float ratio = (float) mWidth / mHeight;
+    float left = -ratio;
+    float right = ratio;
+    float bottom = -1.0f;
+    float top = 1.0f;
+    float near = 1.0f;
+    float far = 2.0f;
+
+    mProjectionMatrix = Matrix::newFrustum(left, right, bottom, top, near, far);
+
+    // Setup texture.
+    mTextureId = GLUtils::genTexture(mWidth, mHeight, GLUtils::RANDOM_FILL);
+    if (mTextureId == 0) {
+        return false;
+    }
+
+    float count = mWorkload * mWorkload;
+    float middle = count / 2.0f;
+    float scale = 2.0f / count;
+
+    mMesh = new Mesh(FP_VERTICES, FP_NORMALS, FP_TEX_COORDS, FP_NUM_VERTICES);
+    mSceneGraph = new ProgramNode(*mProgram);
+
+    for (int i = 0; i < count; i++) {
+        for (int j = 0; j < count; j++) {
+            Matrix* transformMatrix = Matrix::newScale(scale, scale, scale);
+            transformMatrix->translate(i - middle, j - middle, 0.0f);
+            TransformationNode* transformNode = new TransformationNode(transformMatrix);
+            mSceneGraph->addChild(transformNode);
+            PerspectiveMeshNode* meshNode = new PerspectiveMeshNode(mMesh, mTextureId);
+            transformNode->addChild(meshNode);
+        }
+    }
+    return true;
+}
+
+bool FullPipelineRenderer::tearDown() {
+    SCOPED_TRACE();
+    if (mTextureId != 0) {
+        glDeleteTextures(1, &mTextureId);
+        mTextureId = 0;
+    }
+    if (!Renderer::tearDown()) {
+        return false;
+    }
+    delete mModelMatrix;
+    mModelMatrix = NULL;
+    delete mViewMatrix;
+    mViewMatrix = NULL;
+    delete mProjectionMatrix;
+    mProjectionMatrix = NULL;
+    delete mProgram;
+    mProgram = NULL;
+    delete mSceneGraph;
+    mSceneGraph = NULL;
+    delete mMesh;
+    mMesh = NULL;
+    return true;
+}
+
+void FullPipelineRenderer::drawWorkload() {
+    SCOPED_TRACE();
+    // Set the background clear color to black.
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    // Use culling to remove back faces.
+    glEnable(GL_CULL_FACE);
+    // Use depth testing.
+    glEnable(GL_DEPTH_TEST);
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+    mModelMatrix->identity();
+    mSceneGraph->drawProgram(*mModelMatrix, *mViewMatrix, *mProjectionMatrix);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.h b/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.h
new file mode 100644
index 0000000..84616b4
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/fullpipeline/FullPipelineRenderer.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef FULLPIPELINERENDERER_H
+#define FULLPIPELINERENDERER_H
+
+#include <graphics/PerspectiveProgram.h>
+#include <graphics/Matrix.h>
+#include <graphics/Mesh.h>
+#include <graphics/Renderer.h>
+#include <graphics/ProgramNode.h>
+
+class FullPipelineRenderer: public Renderer {
+public:
+    FullPipelineRenderer(ANativeWindow* window, bool offscreen, int workload);
+    virtual ~FullPipelineRenderer() {};
+    bool setUp();
+    bool tearDown();
+    void drawWorkload();
+private:
+    Program* mProgram;
+    ProgramNode* mSceneGraph;
+    Matrix* mModelMatrix;
+    Matrix* mViewMatrix;
+    Matrix* mProjectionMatrix;
+    Mesh* mMesh;
+    GLuint mTextureId;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.cpp b/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.cpp
new file mode 100644
index 0000000..287ebfb
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "PixelOutputRenderer.h"
+#include <graphics/GLUtils.h>
+
+#include <Trace.h>
+
+static const int PO_NUM_VERTICES = 6;
+
+static const float PO_VERTICES[PO_NUM_VERTICES * 3] = {
+        1.0f, 1.0f, -1.0f,
+        -1.0f, 1.0f, -1.0f,
+        -1.0f, -1.0f, -1.0f,
+        -1.0f, -1.0f, -1.0f,
+        1.0f, -1.0f, -1.0f,
+        1.0f, 1.0f, -1.0f };
+static const float PO_TEX_COORDS[PO_NUM_VERTICES * 2] = {
+        1.0f, 1.0f,
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        0.0f, 0.0f,
+        1.0f, 0.0f,
+        1.0f, 1.0f };
+
+static const char* PO_VERTEX =
+        "attribute vec4 a_Position;"
+        "attribute vec2 a_TexCoord;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  v_TexCoord = a_TexCoord;"
+        "  gl_Position = a_Position;"
+        "}";
+
+static const char* PO_FRAGMENT =
+        "precision mediump float;"
+        "uniform sampler2D u_Texture;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  gl_FragColor = texture2D(u_Texture, v_TexCoord);"
+        "}";
+
+PixelOutputRenderer::PixelOutputRenderer(ANativeWindow* window, bool offscreen, int workload) :
+        Renderer(window, offscreen, workload) {
+}
+
+bool PixelOutputRenderer::setUp() {
+    SCOPED_TRACE();
+    if (!Renderer::setUp()) {
+        return false;
+    }
+
+    // Create program.
+    mProgramId = GLUtils::createProgram(&PO_VERTEX, &PO_FRAGMENT);
+    if (mProgramId == 0) {
+        return false;
+    }
+    // Bind attributes.
+    mTextureUniformHandle = glGetUniformLocation(mProgramId, "u_Texture");
+    mPositionHandle = glGetAttribLocation(mProgramId, "a_Position");
+    mTexCoordHandle = glGetAttribLocation(mProgramId, "a_TexCoord");
+
+    // Setup texture.
+    mTextureId = GLUtils::genTexture(mWidth, mHeight, GLUtils::RANDOM_FILL);
+    if (mTextureId == 0) {
+        return false;
+    }
+    return true;
+}
+
+bool PixelOutputRenderer::tearDown() {
+    SCOPED_TRACE();
+    if (mTextureId != 0) {
+        glDeleteTextures(1, &mTextureId);
+        mTextureId = 0;
+    }
+    if (!Renderer::tearDown()) {
+        return false;
+    }
+    return true;
+}
+
+void PixelOutputRenderer::drawWorkload() {
+    SCOPED_TRACE();
+    glUseProgram(mProgramId);
+    // Set the background clear color to black.
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+
+    // No culling of back faces
+    glDisable(GL_CULL_FACE);
+
+    // No depth testing
+    glDisable(GL_DEPTH_TEST);
+
+    // Enable blending
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_ONE, GL_ONE);
+
+    glActiveTexture(GL_TEXTURE0);
+    // Bind the texture to this unit.
+    glBindTexture(GL_TEXTURE_2D, mTextureId);
+    // Tell the texture uniform sampler to use this texture in the shader by binding to texture
+    // unit 0.
+    glUniform1i(mTextureUniformHandle, 0);
+
+    glEnableVertexAttribArray(mPositionHandle);
+    glEnableVertexAttribArray(mTexCoordHandle);
+    glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, PO_VERTICES);
+    glVertexAttribPointer(mTexCoordHandle, 2, GL_FLOAT, false, 0, PO_TEX_COORDS);
+
+    for (int i = 0; i < mWorkload; i++) {
+        glDrawArrays(GL_TRIANGLES, 0, PO_NUM_VERTICES);
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.h b/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.h
new file mode 100644
index 0000000..e6b5692
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/pixeloutput/PixelOutputRenderer.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef PIXELOUTPUTRENDERER_H
+#define PIXELOUTPUTRENDERER_H
+
+#include <graphics/Renderer.h>
+
+class PixelOutputRenderer: public Renderer {
+public:
+    PixelOutputRenderer(ANativeWindow* window, bool offscreen, int workload);
+    virtual ~PixelOutputRenderer() {};
+    bool setUp();
+    bool tearDown();
+    void drawWorkload();
+private:
+    GLuint mTextureId;
+    GLuint mTextureUniformHandle;
+    GLuint mPositionHandle;
+    GLuint mTexCoordHandle;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.cpp b/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.cpp
new file mode 100644
index 0000000..1cbc839
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.cpp
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "ShaderPerfRenderer.h"
+#include <graphics/GLUtils.h>
+
+#include <math.h>
+
+#include <Trace.h>
+
+static const float GOLDEN_RATIO = (1.0f + sqrt(5.0f)) / 2.0f;
+
+static const int SP_NUM_VERTICES = 6;
+
+static const float SP_VERTICES[SP_NUM_VERTICES * 3] = {
+        1.0f, 1.0f, -1.0f,
+        -1.0f, 1.0f, -1.0f,
+        -1.0f, -1.0f, -1.0f,
+        -1.0f, -1.0f, -1.0f,
+        1.0f, -1.0f, -1.0f,
+        1.0f, 1.0f, -1.0f };
+
+static const float SP_TEX_COORDS[SP_NUM_VERTICES * 2] = {
+        1.0f, 1.0f,
+        0.0f, 1.0f,
+        0.0f, 0.0f,
+        0.0f, 0.0f,
+        1.0f, 0.0f,
+        1.0f, 1.0f };
+
+static const char* SP_VERTEX =
+        "attribute vec4 a_Position;"
+        "attribute vec2 a_TexCoord;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  v_TexCoord = a_TexCoord;"
+        "  gl_Position = a_Position;"
+        "}";
+
+static const char* SP_FRAGMENT_1 =
+        "precision mediump float;"
+        "uniform vec2 u_Seed;"
+        "uniform sampler2D u_Texture;"
+        "varying vec2 v_TexCoord;"
+        "void main() {"
+        "  int count = ";
+
+//Add workload here
+
+static const char* SP_FRAGMENT_2 =
+        " * 4;"//workload * 4 (4 is a tweaking number, bigger = more work)
+        "  vec2 z;"
+        "  z.x = 3.0 * (v_TexCoord.x - 0.5);"
+        "  z.y = 2.0 * (v_TexCoord.y - 0.5);"
+        "  float u = 0.0;"
+        "  for (int i = 0; i < count; i++) {"
+        "    float x = (z.x * z.x - z.y * z.y) + u_Seed.x;"
+        "    float y = (z.y * z.x + z.x * z.y) + u_Seed.y;"
+        "    if (((x * x + y * y) > 4.0) && (u == 0.0)) {"
+        "      u = float(i) / float(count);"
+        "    }"
+        "    z.x = x;"
+        "    z.y = y;"
+        "  }"
+        "  gl_FragColor = texture2D(u_Texture, vec2(u, 0.0));"
+        "}";
+
+// Copies the source array from 0 up to and including the '\0' character to the
+// destination array starting from the given start position. Unlike strcpy, this
+// returns the number of characters which were copied.
+static int charCopy(const char* source, char* dest, int destStart) {
+    int srcAddr = 0;
+    int destAddr = destStart;
+    char current;
+    do {
+        current = source[srcAddr];
+        dest[destAddr] = current;
+        srcAddr++;
+        destAddr++;
+    } while (current != '\0');
+    return destAddr - destStart;
+}
+
+ShaderPerfRenderer::ShaderPerfRenderer(ANativeWindow* window, bool offscreen, int workload) :
+        Renderer(window, offscreen, workload) {
+}
+
+bool ShaderPerfRenderer::setUp() {
+    SCOPED_TRACE();
+    if (!Renderer::setUp()) {
+        return false;
+    }
+
+    const int MAX_FRAGMENT_SHADER_SIZE = 1000;
+    char* spFragment = new char[MAX_FRAGMENT_SHADER_SIZE];
+    // Add the first part.
+    int index = charCopy(SP_FRAGMENT_1, spFragment, 0);
+    // Add the count, overwriting the '\0' added by charCopy.
+    spFragment[index - 1] = (char) (((int) '0') + mWorkload);
+    // Add the second part.
+    index += charCopy(SP_FRAGMENT_2, spFragment, index);
+    // Create program.
+    mProgramId = GLUtils::createProgram(&SP_VERTEX, const_cast<const char**>(&spFragment));
+    delete[] spFragment;
+    if (mProgramId == 0) {
+        return false;
+    }
+    // Bind attributes.
+    mTextureUniformHandle = glGetUniformLocation(mProgramId, "u_Texture");
+    mSeedUniformHandle = glGetUniformLocation(mProgramId, "u_Seed");
+    mPositionHandle = glGetAttribLocation(mProgramId, "a_Position");
+    mTexCoordHandle = glGetAttribLocation(mProgramId, "a_TexCoord");
+
+    const int SIZE = 256;
+    uint32_t* m = new uint32_t[SIZE];
+    if (m != NULL) {
+        uint32_t* d = m;
+        for (int i = 0; i < SIZE; i++) {
+            *d = 0xff000000 | ((i & 0xff) << 16);
+            d++;
+        }
+        glGenTextures(1, &mTextureId);
+        glBindTexture(GL_TEXTURE_2D, mTextureId);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SIZE, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, m);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+    }
+    delete[] m;
+
+    return true;
+}
+
+void ShaderPerfRenderer::drawWorkload() {
+    SCOPED_TRACE();
+    glUseProgram(mProgramId);
+    // Set the background clear color.
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+
+    // No culling of back faces
+    glDisable(GL_CULL_FACE);
+
+    // Bind the texture.
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mTextureId);
+    glUniform1i(mTextureUniformHandle, 0);
+
+    // Bind the seed.
+    glUniform2f(mSeedUniformHandle, GOLDEN_RATIO - 2.0f, GOLDEN_RATIO - 1.0f);
+
+    // Bind the vertices.
+    glEnableVertexAttribArray(mPositionHandle);
+    glEnableVertexAttribArray(mTexCoordHandle);
+    glVertexAttribPointer(mPositionHandle, 3, GL_FLOAT, false, 0, SP_VERTICES);
+    glVertexAttribPointer(mTexCoordHandle, 2, GL_FLOAT, false, 0, SP_TEX_COORDS);
+
+    glDrawArrays(GL_TRIANGLES, 0, SP_NUM_VERTICES);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.h b/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.h
new file mode 100644
index 0000000..52fac43
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/primitive/shaderperf/ShaderPerfRenderer.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef SHADERPERFRENDERER_H
+#define SHADERPERFRENDERER_H
+
+#include <graphics/Renderer.h>
+
+class ShaderPerfRenderer: public Renderer {
+public:
+    ShaderPerfRenderer(ANativeWindow* window, bool offscreen, int workload);
+    virtual ~ShaderPerfRenderer() {};
+    bool setUp();
+    void drawWorkload();
+private:
+    GLuint mTextureId;
+    GLuint mTextureUniformHandle;
+    GLuint mPositionHandle;
+    GLuint mTexCoordHandle;
+    GLuint mSeedUniformHandle;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/GLReference.cpp b/suite/cts/deviceTests/opengl/jni/reference/GLReference.cpp
new file mode 100644
index 0000000..1857848
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/GLReference.cpp
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include <jni.h>
+
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+
+#include <graphics/GLUtils.h>
+#include <graphics/Renderer.h>
+
+#include "ReferenceRenderer.h"
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_com_android_cts_opengl_reference_GLGameActivity_startBenchmark(
+        JNIEnv* env, jclass clazz, jobject assetManager, jobject surface, jint numFrames,
+        jdoubleArray setUpTimes, jdoubleArray updateTimes, jdoubleArray renderTimes) {
+
+    GLUtils::setEnvAndAssetManager(env, assetManager);
+
+    if (numFrames > (ReferenceRenderer::FRAMES_PER_SCENE * ReferenceRenderer::NUM_SCENES)) {
+        return false;
+    }
+
+    ReferenceRenderer* renderer = new ReferenceRenderer(ANativeWindow_fromSurface(env, surface));
+
+    bool success = renderer->setUp();
+    env->SetDoubleArrayRegion(
+            setUpTimes, 0, ReferenceRenderer::NUM_SETUP_TIMES, renderer->mSetUpTimes);
+
+    double updates[numFrames];
+    double renders[numFrames];
+    for (int i = 0; i < numFrames && success; i++) {
+        double t0 = GLUtils::currentTimeMillis();
+        success = renderer->update(i);
+        double t1 = GLUtils::currentTimeMillis();
+        success = success && renderer->draw();
+        double t2 = GLUtils::currentTimeMillis();
+        updates[i] = t1 - t0;
+        renders[i] = t2 - t1;
+    }
+
+    env->SetDoubleArrayRegion(updateTimes, 0, numFrames, updates);
+    env->SetDoubleArrayRegion(renderTimes, 0, numFrames, renders);
+
+    success = renderer->tearDown() && success;
+    delete renderer;
+    renderer = NULL;
+    return success;
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.cpp b/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.cpp
new file mode 100644
index 0000000..8f7703e
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "ReferenceRenderer.h"
+
+#include "scene/flocking/FlockingScene.h"
+#include "scene/glowing/GlowingScene.h"
+
+#include <graphics/GLUtils.h>
+#include <graphics/ProgramNode.h>
+
+#include <Trace.h>
+
+ReferenceRenderer::ReferenceRenderer(ANativeWindow* window) :
+        Renderer(window, false, 0) {
+}
+
+bool ReferenceRenderer::setUp() {
+    SCOPED_TRACE();
+    // Reset the times.
+    for (int i = 0; i < NUM_SETUP_TIMES; i++) {
+        mSetUpTimes[i] = 0;
+    }
+    // Set up OpenGLES.
+    double start = GLUtils::currentTimeMillis();
+    if (!Renderer::setUp()) {
+        return false;
+    }
+    mSetUpTimes[0] = GLUtils::currentTimeMillis() - start;
+
+    // Create the scenes.
+    mScenes[0] = new FlockingScene(mWidth, mHeight);
+    mScenes[1] = new GlowingScene(mWidth, mHeight);
+    // TODO add more scenes to do a comprehensive test.
+
+    // Set up the scenes.
+    double times[NUM_SETUP_TIMES];
+    for (int i = 0; i < NUM_SCENES; i++) {
+        times[0] = GLUtils::currentTimeMillis();
+        mScenes[i]->setUpContext();
+        times[1] = GLUtils::currentTimeMillis();
+        mScenes[i]->setUpTextures();
+        times[2] = GLUtils::currentTimeMillis();
+        mScenes[i]->setUpMeshes();
+        times[3] = GLUtils::currentTimeMillis();
+
+        for (int i = 1; i < NUM_SETUP_TIMES; i++) {
+            // Add on the set up times.
+            mSetUpTimes[i] += times[i] - times[i - 1];
+        }
+    }
+    return true;
+}
+
+bool ReferenceRenderer::tearDown() {
+    SCOPED_TRACE();
+    for (int i = 0; i < NUM_SCENES; i++) {
+        mScenes[i]->tearDown();
+        delete mScenes[i];
+    }
+    mCurrentScene = NULL;
+    if (!Renderer::tearDown()) {
+        return false;
+    }
+    return true;
+}
+
+bool ReferenceRenderer::update(int frame) {
+    SCOPED_TRACE();
+    int sceneId = frame / ReferenceRenderer::FRAMES_PER_SCENE;
+    int localFrame = frame % ReferenceRenderer::FRAMES_PER_SCENE;
+    mCurrentScene = mScenes[sceneId];
+    mCurrentScene->update(localFrame);
+    return true;
+}
+
+void ReferenceRenderer::drawWorkload() {
+    SCOPED_TRACE();
+    // Set the background clear color to black.
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    // Use culling to remove back faces.
+    glEnable (GL_CULL_FACE);
+    // Use depth testing.
+    glEnable (GL_DEPTH_TEST);
+
+    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
+    if (!mCurrentScene->draw()) {
+        ALOGE("Error when rendering scene");
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.h b/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.h
new file mode 100644
index 0000000..d10297a
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/ReferenceRenderer.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef REFERENCERENDERER_H
+#define REFERENCERENDERER_H
+
+#include "scene/Scene.h"
+
+#include <graphics/Mesh.h>
+#include <graphics/Renderer.h>
+
+class ReferenceRenderer: public Renderer {
+public:
+    ReferenceRenderer(ANativeWindow* window);
+    virtual ~ReferenceRenderer() {};
+    bool setUp();
+    bool tearDown();
+    bool update(int frame);
+    void drawWorkload();
+    double mSetUpTimes[4];
+    static const int FRAMES_PER_SCENE = 500;
+    static const int NUM_SCENES = 2;
+    static const int NUM_SETUP_TIMES = 4;
+private:
+    Scene* mScenes[NUM_SCENES];
+    Scene* mCurrentScene;
+
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.cpp
new file mode 100644
index 0000000..abf3a4e
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "Scene.h"
+
+#include <graphics/GLUtils.h>
+#include <graphics/ProgramNode.h>
+
+#include <Trace.h>
+
+Scene::Scene(int width, int height) :
+        mWidth(width), mHeight(height) {
+}
+
+bool Scene::setUpContext() {
+    SCOPED_TRACE();
+    if (!setUpPrograms()) {
+        return false;
+    }
+    mModelMatrix = setUpModelMatrix();
+    if (mModelMatrix == NULL) {
+        return false;
+    }
+    mViewMatrix = setUpViewMatrix();
+    if (mViewMatrix == NULL) {
+        return false;
+    }
+    mProjectionMatrix = setUpProjectionMatrix(mWidth, mHeight);
+    if (mProjectionMatrix == NULL) {
+        return false;
+    }
+    return true;
+}
+
+bool Scene::tearDown() {
+    SCOPED_TRACE();
+    for (size_t i = 0; i < mTextureIds.size(); i++) {
+        glDeleteTextures(1, &(mTextureIds[i]));
+    }
+    for (size_t i = 0; i < mMeshes.size(); i++) {
+        delete mMeshes[i];
+    }
+    for (size_t i = 0; i < mSceneGraphs.size(); i++) {
+        delete mSceneGraphs[i];
+    }
+    delete mModelMatrix;
+    mModelMatrix = NULL;
+    delete mViewMatrix;
+    mViewMatrix = NULL;
+    delete mProjectionMatrix;
+    mProjectionMatrix = NULL;
+    return true;
+}
+
+bool Scene::update(int frame) {
+    SCOPED_TRACE();
+    // Delete the old scene graphs.
+    for (size_t i = 0; i < mSceneGraphs.size(); i++) {
+        delete mSceneGraphs[i];
+    }
+    mSceneGraphs.clear();
+    return updateSceneGraphs(frame);
+}
+
+void Scene::drawSceneGraph(int index) {
+    mModelMatrix->identity();
+    mSceneGraphs[index]->drawProgram(*mModelMatrix, *mViewMatrix, *mProjectionMatrix);
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.h b/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.h
new file mode 100644
index 0000000..06178b9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/Scene.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef SCENE_H
+#define SCENE_H
+
+#include <graphics/Matrix.h>
+#include <graphics/Mesh.h>
+#include <graphics/Program.h>
+#include <graphics/ProgramNode.h>
+
+#include <utils/Vector.h>
+
+class Scene {
+public:
+    Scene(int width, int height);
+    virtual ~Scene() {};
+    virtual bool setUpContext();
+    virtual bool setUpTextures() = 0;
+    virtual bool setUpMeshes() = 0;
+    virtual bool tearDown();
+    virtual bool update(int frame);
+    virtual bool draw() = 0;
+    void drawSceneGraph(int index);
+protected:
+    virtual bool setUpPrograms() = 0;
+    virtual Matrix* setUpModelMatrix() = 0;
+    virtual Matrix* setUpViewMatrix() = 0;
+    virtual Matrix* setUpProjectionMatrix(float width, float height) = 0;
+    virtual bool updateSceneGraphs(int frame) = 0;
+    int mWidth;
+    int mHeight;
+    android::Vector<Mesh*> mMeshes;
+    android::Vector<GLuint> mTextureIds;
+    android::Vector<ProgramNode*> mSceneGraphs;
+private:
+    Matrix* mModelMatrix;
+    Matrix* mViewMatrix;
+    Matrix* mProjectionMatrix;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.cpp
new file mode 100644
index 0000000..74eef81
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.cpp
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "Boid.h"
+
+Boid::Boid(float x, float y) :
+        mPosition(x, y) {
+}
+
+void Boid::flock(const Boid* boids[], int numBoids, int index, float limitX, float limitY) {
+    // Reset the acceleration.
+    mAcceleration.mX = 0;
+    mAcceleration.mY = 0;
+    Vector2D separation;
+    int separationCount = 0;
+    Vector2D alignment;
+    int alignmentCount = 0;
+    Vector2D cohesion;
+    int cohesionCount = 0;
+    for (int i = 0; i < numBoids; i++) {
+        if (i != index) {
+            const Boid* b = boids[i];
+            float dist = mPosition.distance(b->mPosition);
+            if (dist != 0) {
+                // Separation.
+                if (dist < DESIRED_BOID_DIST) {
+                    Vector2D tmp = mPosition.copy();
+                    tmp.sub(b->mPosition);
+                    tmp.normalize();
+                    tmp.scale(1.0f / dist);
+                    separation.add(tmp);
+                    separationCount++;
+                }
+                if (dist < NEIGHBOUR_RADIUS) {
+                    // Alignment.
+                    alignment.add(b->mVelocity);
+                    alignmentCount++;
+                    // Cohesion.
+                    cohesion.add(b->mPosition);
+                    cohesionCount++;
+                }
+            }
+        }
+    }
+
+    if (separationCount > 0) {
+        separation.scale(1.0f / separationCount);
+        separation.scale(SEPARATION_WEIGHT);
+        mAcceleration.add(separation);
+    }
+    if (alignmentCount > 0) {
+        alignment.scale(1.0f / alignmentCount);
+        alignment.limit(MAX_FORCE);
+        alignment.scale(ALIGNMENT_WEIGHT);
+        mAcceleration.add(alignment);
+    }
+    if (cohesionCount > 0) {
+        cohesion.scale(1.0f / cohesionCount);
+        cohesion.scale(COHESION_WEIGHT);
+        Vector2D desired = cohesion.copy();
+        desired.sub(mPosition);
+        float d = desired.magnitude();
+        if (d > 0) {
+            desired.normalize();
+            desired.scale(MAX_SPEED * ((d < 100.0f) ? d / 100.0f : 1));
+            desired.sub(mVelocity);
+            desired.limit(MAX_FORCE);
+            mAcceleration.add(desired);
+        }
+    }
+
+    mVelocity.add(mAcceleration);
+    mVelocity.limit(MAX_SPEED);
+    mPosition.add(mVelocity);
+    // Wrap around.
+    if (mPosition.mX < -limitX) {
+        mPosition.mX = limitX;
+    } else if (mPosition.mX > limitX) {
+        mPosition.mX = -limitX;
+    }
+    if (mPosition.mY < -limitY) {
+        mPosition.mY = limitY;
+    } else if (mPosition.mY > limitY) {
+        mPosition.mY = -limitY;
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h
new file mode 100644
index 0000000..e50acd0
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/Boid.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+// An implementation of Craig Reynold's Boid Simulation.
+#ifndef BOID_H
+#define BOID_H
+
+#include <graphics/Vector2D.h>
+
+class Boid {
+public:
+    Boid(float x, float y);
+    void resetAcceleration();
+    void flock(const Boid* boids[], int numBoids, int index, float limitX, float limitY);
+    // The following floats are the parameters for the flocking algorithm, changing these
+    // modifies the boid's behaviour.
+    static const float MAX_SPEED = 2.0f;// Upper limit of boid velocity.
+    static const float MAX_FORCE = 0.05f;// Upper limit of the force used to push a boid.
+    static const float NEIGHBOUR_RADIUS = 70.0f;// Radius used to find neighbours, was 50.
+    static const float DESIRED_BOID_DIST = 35.0f;// Distance boids want to be from others, was 25.
+    // The weightings of the components.
+    static const float SEPARATION_WEIGHT = 2.0f;
+    static const float ALIGNMENT_WEIGHT = 1.0f;
+    static const float COHESION_WEIGHT = 1.0f;
+    Vector2D mPosition;
+    Vector2D mVelocity;
+    Vector2D mAcceleration;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.cpp
new file mode 100644
index 0000000..71e5dac
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.cpp
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "FlockingScene.h"
+
+#include "WaterMeshNode.h"
+
+#include <cstdlib>
+#include <cmath>
+
+#include <Trace.h>
+
+#include <graphics/PerspectiveMeshNode.h>
+#include <graphics/PerspectiveProgram.h>
+#include <graphics/GLUtils.h>
+#include <graphics/Matrix.h>
+#include <graphics/Mesh.h>
+#include <graphics/ProgramNode.h>
+#include <graphics/TransformationNode.h>
+
+FlockingScene::FlockingScene(int width, int height) :
+        Scene(width, height), mMainProgram(NULL), mWaterProgram(NULL) {
+    for (int i = 0; i < NUM_BOIDS; i++) {
+        // Generate a boid with a random position. (-50, 50)
+        float x = (rand() % 101) - 50.0f;
+        float y = (rand() % 101) - 50.0f;
+        mBoids[i] = new Boid(x, y);
+    }
+}
+
+bool FlockingScene::setUpPrograms() {
+    // Main Program
+    const char* vertex = GLUtils::openTextFile("vertex/perspective");
+    const char* fragment = GLUtils::openTextFile("fragment/perspective");
+    if (vertex == NULL || fragment == NULL) {
+        return false;
+    }
+    GLuint programId = GLUtils::createProgram(&vertex, &fragment);
+    delete[] vertex;
+    delete[] fragment;
+    if (programId == 0) {
+        return false;
+    }
+    mMainProgram = new PerspectiveProgram(programId);
+    // Water Program
+    vertex = GLUtils::openTextFile("vertex/water");
+    fragment = GLUtils::openTextFile("fragment/water");
+    if (vertex == NULL || fragment == NULL) {
+        return false;
+    }
+    programId = GLUtils::createProgram(&vertex, &fragment);
+    delete[] vertex;
+    delete[] fragment;
+    if (programId == 0) {
+        return false;
+    }
+    mWaterProgram = new PerspectiveProgram(programId);
+    return true;
+}
+
+Matrix* FlockingScene::setUpModelMatrix() {
+    return new Matrix();
+}
+
+Matrix* FlockingScene::setUpViewMatrix() {
+    // Position the eye in front of the origin.
+    float eyeX = 0.0f;
+    float eyeY = 0.0f;
+    float eyeZ = 10.0f;
+
+    // We are looking at the origin
+    float centerX = 0.0f;
+    float centerY = 0.0f;
+    float centerZ = 0.0f;
+
+    // Set our up vector.
+    float upX = 0.0f;
+    float upY = 1.0f;
+    float upZ = 0.0f;
+
+    // Set the view matrix.
+    return Matrix::newLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
+}
+
+Matrix* FlockingScene::setUpProjectionMatrix(float width, float height) {
+    // Create a new perspective projection matrix. The height will stay the same
+    // while the width will vary as per aspect ratio.
+    mDisplayRatio = width / height;
+    // Set board dimensions
+    mBoardHeight = 1000.0f;
+    mBoardWidth = mDisplayRatio * mBoardHeight;
+    float left = -mDisplayRatio;
+    float right = mDisplayRatio;
+    float bottom = -1.0f;
+    float top = 1.0f;
+    float near = 8.0f;
+    float far = 12.0f;
+
+    return Matrix::newFrustum(left, right, bottom, top, near, far);
+}
+
+bool FlockingScene::setUpTextures() {
+    SCOPED_TRACE();
+    mTextureIds.add(GLUtils::loadTexture("texture/fish_dark.png"));
+    mTextureIds.add(GLUtils::loadTexture("texture/background.png"));
+    mTextureIds.add(GLUtils::loadTexture("texture/water1.png"));
+    mTextureIds.add(GLUtils::loadTexture("texture/water2.png"));
+    return true;
+}
+
+bool FlockingScene::setUpMeshes() {
+    SCOPED_TRACE();
+    mMeshes.add(GLUtils::loadMesh("mesh/fish.cob"));
+    mMeshes.add(GLUtils::loadMesh("mesh/plane.cob"));
+    return true;
+}
+
+bool FlockingScene::tearDown() {
+    SCOPED_TRACE();
+    for (int i = 0; i < NUM_BOIDS; i++) {
+        delete mBoids[i];
+    }
+    delete mMainProgram;
+    delete mWaterProgram;
+    return Scene::tearDown();
+}
+
+bool FlockingScene::updateSceneGraphs(int frame) {
+    const float MAIN_SCALE = 1.25f; // Scale up as the camera is far away.
+    const float LIMIT_X = mBoardWidth / 2.0f;
+    const float LIMIT_Y = mBoardHeight / 2.0f;
+
+    ProgramNode* mainSceneGraph = new ProgramNode(*mMainProgram);
+    mSceneGraphs.add(mainSceneGraph);
+    // Bottom
+    Matrix* transformMatrix = Matrix::newScale(MAIN_SCALE * mDisplayRatio, MAIN_SCALE, 0.0f);
+    TransformationNode* transformNode = new TransformationNode(transformMatrix);
+    mainSceneGraph->addChild(transformNode);
+    MeshNode* meshNode = new PerspectiveMeshNode(mMeshes[1], mTextureIds[1]);
+    transformNode->addChild(meshNode);
+    // Boids
+    const float MARGIN = 30.0f; // So the fish dont disappear and appear at the edges.
+    for (int i = 0; i < NUM_BOIDS; i++) {
+        Boid* b = mBoids[i];
+        b->flock((const Boid**) &mBoids, NUM_BOIDS, i, LIMIT_X + MARGIN, LIMIT_Y + MARGIN);
+        Vector2D* pos = &(b->mPosition);
+        Vector2D* vel = &(b->mVelocity);
+
+        // Normalize to (-1,1)
+        float x = pos->mX / (LIMIT_X * BOID_SCALE) * mDisplayRatio;
+        float y = pos->mY / (LIMIT_Y * BOID_SCALE);
+
+        const float SCALE = BOID_SCALE * MAIN_SCALE;
+        transformMatrix = Matrix::newScale(SCALE, SCALE, SCALE);
+        transformMatrix->translate(x, y, 1.0f);
+        transformMatrix->rotate(atan2(vel->mY, vel->mX) + M_PI, 0, 0, 1);
+        transformNode = new TransformationNode(transformMatrix);
+        mainSceneGraph->addChild(transformNode);
+        meshNode = new PerspectiveMeshNode(mMeshes[0], mTextureIds[0]);
+        transformNode->addChild(meshNode);
+    }
+    ProgramNode* waterSceneGraph = new ProgramNode(*mWaterProgram);
+    mSceneGraphs.add(waterSceneGraph);
+    // Top
+    transformMatrix = Matrix::newScale(MAIN_SCALE * mDisplayRatio, MAIN_SCALE, 1.0f);
+    transformMatrix->translate(0, 0, 0.1f);
+    transformNode = new TransformationNode(transformMatrix);
+    waterSceneGraph->addChild(transformNode);
+    meshNode = new WaterMeshNode(mMeshes[1], frame, mTextureIds[2], mTextureIds[3]);
+    transformNode->addChild(meshNode);
+    return true;
+}
+
+bool FlockingScene::draw() {
+    SCOPED_TRACE();
+    drawSceneGraph(0); // Draw fish and pond bottom
+    // Use blending.
+    glEnable (GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    drawSceneGraph(1); // Draw water
+    glDisable(GL_BLEND);
+    return true;
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h
new file mode 100644
index 0000000..97bd4cc
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/FlockingScene.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef FLOCKINGSCENE_H
+#define FLOCKINGSCENE_H
+
+#include <graphics/Program.h>
+
+#include "../Scene.h"
+#include "Boid.h"
+
+class FlockingScene : public Scene {
+public:
+    FlockingScene(int width, int height);
+    virtual ~FlockingScene() {};
+    bool setUpTextures();
+    bool setUpMeshes();
+    bool tearDown();
+    bool draw();
+    static const int NUM_BOIDS = 100;
+protected:
+    bool setUpPrograms();
+    Matrix* setUpModelMatrix();
+    Matrix* setUpViewMatrix();
+    Matrix* setUpProjectionMatrix(float width, float height);
+    bool updateSceneGraphs(int frame);
+private:
+    Boid* mBoids[NUM_BOIDS];
+    float mDisplayRatio;
+    float mBoardWidth;
+    float mBoardHeight;
+    Program* mMainProgram;
+    Program* mWaterProgram;
+    static const float BOID_SCALE = 1.0f / 50.0f;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.cpp
new file mode 100644
index 0000000..f000d58
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "WaterMeshNode.h"
+
+#include <graphics/PerspectiveProgram.h>
+
+WaterMeshNode::WaterMeshNode(const Mesh* mesh, int time, GLuint textureId1, GLuint textureId2) :
+        MeshNode(mesh), mTime(time), mTextureId1(textureId1), mTextureId2(textureId2) {
+}
+
+void WaterMeshNode::before(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    PerspectiveProgram& prog = (PerspectiveProgram&) program;
+
+    int textureUniformHandle1 = glGetUniformLocation(prog.mProgramId, "u_Texture1");
+    int textureUniformHandle2 = glGetUniformLocation(prog.mProgramId, "u_Texture2");
+    int timeUniformHandle = glGetUniformLocation(prog.mProgramId, "u_Time");
+    int positionHandle = glGetAttribLocation(prog.mProgramId, "a_Position");
+    int texCoordHandle = glGetAttribLocation(prog.mProgramId, "a_TexCoordinate");
+
+    glActiveTexture (GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mTextureId1);
+    glUniform1i(textureUniformHandle1, 0);
+
+    glActiveTexture (GL_TEXTURE1);
+    glBindTexture(GL_TEXTURE_2D, mTextureId2);
+    glUniform1i(textureUniformHandle2, 1);
+
+    glUniform1i(timeUniformHandle, mTime);
+
+    glEnableVertexAttribArray(positionHandle);
+    glVertexAttribPointer(positionHandle, 3, GL_FLOAT, false, 0, mMesh->mVertices);
+    glEnableVertexAttribArray(texCoordHandle);
+    glVertexAttribPointer(texCoordHandle, 2, GL_FLOAT, false, 0, mMesh->mTexCoords);
+
+    // This multiplies the view matrix by the model matrix, and stores the result in the MVP
+    // matrix (which currently contains model * view).
+    prog.mMVMatrix.multiply(view, model);
+
+    // Pass in the modelview matrix.
+    glUniformMatrix4fv(prog.mMVMatrixHandle, 1, false, prog.mMVMatrix.mData);
+
+    // This multiplies the modelview matrix by the projection matrix, and stores the result in
+    // the MVP matrix (which now contains model * view * projection).
+    prog.mMVPMatrix.multiply(projection, prog.mMVMatrix);
+
+    // Pass in the combined matrix.
+    glUniformMatrix4fv(prog.mMVPMatrixHandle, 1, false, prog.mMVPMatrix.mData);
+
+    // Pass in the light position in eye space.
+    glUniform3f(prog.mLightPosHandle, prog.mLightPosInEyeSpace[0], prog.mLightPosInEyeSpace[1],
+            prog.mLightPosInEyeSpace[2]);
+
+    glDrawArrays(GL_TRIANGLES, 0, mMesh->mNumVertices);
+}
+
+void WaterMeshNode::after(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.h b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.h
new file mode 100644
index 0000000..81bfe8f
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/flocking/WaterMeshNode.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef WATERMESHNODE_H
+#define WATERMESHNODE_H
+
+#include <graphics/Matrix.h>
+#include <graphics/Mesh.h>
+#include <graphics/MeshNode.h>
+#include <graphics/Program.h>
+
+class WaterMeshNode: public MeshNode {
+public:
+    WaterMeshNode(const Mesh* mesh, int time, GLuint textureId1, GLuint textureId2);
+    virtual ~WaterMeshNode() {};
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    const int mTime;
+    const GLuint mTextureId1;
+    const GLuint mTextureId2;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.cpp
new file mode 100644
index 0000000..6c2ad64
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "BlurMeshNode.h"
+
+BlurMeshNode::BlurMeshNode(const Mesh* mesh, GLuint fboTexId, GLuint tmpTexId1, GLuint tmpTexId2,
+        float width, float height) :
+        MeshNode(mesh), mFboTexId(fboTexId), mTmpTexId1(tmpTexId1), mTmpTexId2(tmpTexId2),
+        mWidth(width), mHeight(height) {
+}
+
+void BlurMeshNode::before(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+    int textureUniformHandle = glGetUniformLocation(program.mProgramId, "u_Texture");
+    int scaleUniformHandle = glGetUniformLocation(program.mProgramId, "u_Scale");
+    int positionHandle = glGetAttribLocation(program.mProgramId, "a_Position");
+    int texCoordHandle = glGetAttribLocation(program.mProgramId, "a_TexCoordinate");
+
+    glEnableVertexAttribArray(positionHandle);
+    glVertexAttribPointer(positionHandle, 3, GL_FLOAT, false, 0, mMesh->mVertices);
+    glEnableVertexAttribArray(texCoordHandle);
+    glVertexAttribPointer(texCoordHandle, 2, GL_FLOAT, false, 0, mMesh->mTexCoords);
+
+    // Blur X
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTmpTexId1, 0);
+    glActiveTexture (GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mFboTexId);
+    glUniform1i(textureUniformHandle, 0);
+
+    glUniform2f(scaleUniformHandle, 1.0f / mWidth, 0);
+
+    glDrawArrays(GL_TRIANGLES, 0, mMesh->mNumVertices);
+
+    // Blur Y
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTmpTexId2, 0);
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, mTmpTexId1);
+    glUniform1i(textureUniformHandle, 0);
+
+    glUniform2f(scaleUniformHandle, 0, 1.0f / mHeight);
+
+    glDrawArrays(GL_TRIANGLES, 0, mMesh->mNumVertices);
+}
+
+void BlurMeshNode::after(Program& program, Matrix& model, Matrix& view, Matrix& projection) {
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.h b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.h
new file mode 100644
index 0000000..8cb9617
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/BlurMeshNode.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#ifndef BLURMESHNODE_H
+#define BLURMESHNODE_H
+
+#include <graphics/Matrix.h>
+#include <graphics/Mesh.h>
+#include <graphics/MeshNode.h>
+#include <graphics/Program.h>
+
+class BlurMeshNode: public MeshNode {
+public:
+    BlurMeshNode(const Mesh* mesh, GLuint fboTexId, GLuint tmpTexId1, GLuint tmpTexId2, float width, float height);
+    virtual ~BlurMeshNode() {};
+protected:
+    virtual void before(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    virtual void after(Program& program, Matrix& model, Matrix& view, Matrix& projection);
+    const GLuint mFboTexId;
+    const GLuint mTmpTexId1;
+    const GLuint mTmpTexId2;
+    const float mWidth;
+    const float mHeight;
+};
+
+#endif
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.cpp b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.cpp
new file mode 100644
index 0000000..0d22b96
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.cpp
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#include "GlowingScene.h"
+#include "BlurMeshNode.h"
+
+#include <Trace.h>
+
+#include <graphics/PerspectiveMeshNode.h>
+#include <graphics/PerspectiveProgram.h>
+#include <graphics/Program.h>
+#include <graphics/GLUtils.h>
+#include <graphics/Mesh.h>
+#include <graphics/ProgramNode.h>
+#include <graphics/TransformationNode.h>
+
+GlowingScene::GlowingScene(int width, int height) :
+        Scene(width, height), mFboId(0), mMainProgram(NULL), mBlurProgram(NULL) {
+    mFboWidth = GLUtils::roundUpToSmallestPowerOf2(width);
+    mFboHeight = GLUtils::roundUpToSmallestPowerOf2(height);
+    mFboRatio = mFboWidth / mFboHeight;
+    mFboModelMatrix = setUpModelMatrix();
+    mFboViewMatrix = setUpViewMatrix();
+    mFboProjectionMatrix = setUpProjectionMatrix(mFboWidth, mFboHeight);
+}
+
+bool GlowingScene::setUpContext() {
+    if (!Scene::setUpContext()) {
+        return false;
+    }
+    // Create a fbo
+    glGenFramebuffers(1, &mFboId);
+    return true;
+}
+
+bool GlowingScene::setUpPrograms() {
+    // Main Program
+    const char* vertex = GLUtils::openTextFile("vertex/perspective");
+    const char* fragment = GLUtils::openTextFile("fragment/perspective");
+    if (vertex == NULL || fragment == NULL) {
+        return false;
+    }
+    GLuint programId = GLUtils::createProgram(&vertex, &fragment);
+    delete[] vertex;
+    delete[] fragment;
+    if (programId == 0) {
+        return false;
+    }
+    mMainProgram = new PerspectiveProgram(programId);
+    // Blur Program
+    vertex = GLUtils::openTextFile("vertex/blur");
+    fragment = GLUtils::openTextFile("fragment/blur");
+    if (vertex == NULL || fragment == NULL) {
+        return false;
+    }
+    programId = GLUtils::createProgram(&vertex, &fragment);
+    delete[] vertex;
+    delete[] fragment;
+    if (programId == 0) {
+        return false;
+    }
+    mBlurProgram = new Program(programId);
+    return true;
+}
+
+Matrix* GlowingScene::setUpModelMatrix() {
+    return new Matrix();
+}
+
+Matrix* GlowingScene::setUpViewMatrix() {
+    // Position the eye in front of the origin.
+    float eyeX = 0.0f;
+    float eyeY = 0.0f;
+    float eyeZ = 10.0f;
+
+    // Look at the origin
+    float centerX = 0.0f;
+    float centerY = 0.0f;
+    float centerZ = 0.0f;
+
+    // Set up vector.
+    float upX = 0.0f;
+    float upY = 1.0f;
+    float upZ = 0.0f;
+
+    // Set the view matrix.
+    return Matrix::newLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
+}
+
+Matrix* GlowingScene::setUpProjectionMatrix(float width, float height) {
+    // Create a new perspective projection matrix. The height will stay the same
+    // while the width will vary as per aspect ratio.
+    float ratio = width / height;
+    float left = -ratio;
+    float right = ratio;
+    float bottom = -1.0f;
+    float top = 1.0f;
+    float near = 8.0f;
+    float far = 12.0f;
+
+    return Matrix::newFrustum(left, right, bottom, top, near, far);
+}
+
+bool GlowingScene::setUpTextures() {
+    SCOPED_TRACE();
+    mTextureIds.add(GLUtils::genTexture(mWidth, mHeight, 0)); // fbo
+    mTextureIds.add(GLUtils::genTexture(mWidth, mHeight, 0)); // tmp1
+    mTextureIds.add(GLUtils::genTexture(mWidth, mHeight, 0)); // tmp2
+    mTextureIds.add(GLUtils::loadTexture("texture/arc.png"));
+    return true;
+}
+
+bool GlowingScene::setUpMeshes() {
+    SCOPED_TRACE();
+    mMeshes.add(GLUtils::loadMesh("mesh/plane.cob"));
+    mMeshes.add(GLUtils::loadMesh("mesh/arc.cob"));
+    return true;
+}
+
+bool GlowingScene::tearDown() {
+    SCOPED_TRACE();
+    if (mMainProgram != NULL) {
+        delete mMainProgram;
+        mMainProgram = NULL;
+    }
+    if (mBlurProgram != NULL) {
+        delete mBlurProgram;
+        mBlurProgram = NULL;
+    }
+    if (mFboId != 0) {
+        glDeleteFramebuffers(1, &mFboId);
+        mFboId = 0;
+    }
+    delete mFboModelMatrix;
+    mFboModelMatrix = NULL;
+    delete mFboViewMatrix;
+    mFboViewMatrix = NULL;
+    delete mFboProjectionMatrix;
+    mFboProjectionMatrix = NULL;
+    return Scene::tearDown();
+}
+
+bool GlowingScene::updateSceneGraphs(int frame) {
+    // To render the mesh to the FBO
+    ProgramNode* lightSceneGraph = new ProgramNode(*mMainProgram);
+    mSceneGraphs.add(lightSceneGraph);
+    MeshNode* meshNode = new PerspectiveMeshNode(mMeshes[1], mTextureIds[3]);
+    lightSceneGraph->addChild(meshNode);
+
+    // To blur the image
+    ProgramNode* blurSceneGraph = new ProgramNode(*mBlurProgram);
+    mSceneGraphs.add(blurSceneGraph);
+    meshNode = new BlurMeshNode(mMeshes[0], mTextureIds[0], mTextureIds[1], mTextureIds[2],
+            mFboWidth, mFboHeight);
+    blurSceneGraph->addChild(meshNode);
+
+    // Blur To screen
+    ProgramNode* glowSceneGraph = new ProgramNode(*mMainProgram);
+    mSceneGraphs.add(glowSceneGraph);
+    Matrix* transformMatrix = Matrix::newScale(mFboRatio, 1.0f, 1.0f);
+    TransformationNode* transformNode = new TransformationNode(transformMatrix);
+    glowSceneGraph->addChild(transformNode);
+    meshNode = new PerspectiveMeshNode(mMeshes[0], mTextureIds[2]);
+    transformNode->addChild(meshNode);
+    return true;
+}
+
+bool GlowingScene::draw() {
+    SCOPED_TRACE();
+    glBindFramebuffer(GL_FRAMEBUFFER, mFboId); // Use FBO
+    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextureIds[0], 0);
+    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
+        return false;
+    }
+    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+    glClear (GL_COLOR_BUFFER_BIT);
+    glViewport(0, 0, mFboWidth, mFboHeight);
+    mFboModelMatrix->identity();
+    mSceneGraphs[0]->drawProgram(*mFboModelMatrix, *mFboViewMatrix, *mFboProjectionMatrix); // Mesh
+    mFboModelMatrix->identity();
+    mSceneGraphs[1]->drawProgram(*mFboModelMatrix, *mFboViewMatrix, *mFboProjectionMatrix); // Blur
+
+    glBindFramebuffer(GL_FRAMEBUFFER, 0); // Use Screen
+    glViewport(0, 0, mWidth, mHeight);
+    Scene::drawSceneGraph(2); // Blur to Screen
+    return true;
+}
diff --git a/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.h b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.h
new file mode 100644
index 0000000..3bc734c
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/jni/reference/scene/glowing/GlowingScene.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+#ifndef GLOWINGSCENE_H
+#define GLOWINGSCENE_H
+
+#include <graphics/Program.h>
+
+#include "../Scene.h"
+
+class GlowingScene: public Scene {
+public:
+    GlowingScene(int width, int height);
+    virtual ~GlowingScene() {};
+    bool setUpContext();
+    bool setUpTextures();
+    bool setUpMeshes();
+    bool tearDown();
+    bool draw();
+protected:
+    bool setUpPrograms();
+    Matrix* setUpModelMatrix();
+    Matrix* setUpViewMatrix();
+    Matrix* setUpProjectionMatrix(float width, float height);
+    bool updateSceneGraphs(int frame);
+private:
+    GLuint mFboId;
+    Program* mMainProgram;
+    Program* mBlurProgram;
+    float mFboWidth;
+    float mFboHeight;
+    float mFboRatio;
+    Matrix* mFboModelMatrix;
+    Matrix* mFboViewMatrix;
+    Matrix* mFboProjectionMatrix;
+};
+#endif
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/GLActivityIntentKeys.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/GLActivityIntentKeys.java
new file mode 100644
index 0000000..9a29caf
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/GLActivityIntentKeys.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl;
+
+public class GLActivityIntentKeys {
+    /**
+     * Holds the name of the benchmark to run.
+     */
+    public final static String INTENT_EXTRA_BENCHMARK_NAME = "benchmark_name";
+    /**
+     * Holds whether or not the benchmark is to be run offscreen.
+     */
+    public final static String INTENT_EXTRA_OFFSCREEN = "offscreen";
+    /**
+     * The number of frames to render for each workload.
+     */
+    public final static String INTENT_EXTRA_NUM_FRAMES = "num_frames";
+    /**
+     * The number of iterations to run, the workload increases with each iteration.
+     */
+    public final static String INTENT_EXTRA_NUM_ITERATIONS = "num_iterations";
+    /**
+     * The number of milliseconds to wait before timing out.
+     */
+    public final static String INTENT_EXTRA_TIMEOUT = "timeout";
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/BenchmarkName.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/BenchmarkName.java
new file mode 100644
index 0000000..a6bd6db
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/BenchmarkName.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.primitive;
+
+/**
+ * Represents the different primitive benchmarks.
+ */
+public enum BenchmarkName {
+    FullPipeline,
+    PixelOutput,
+    ShaderPerf,
+    ContextSwitch;
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveActivity.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveActivity.java
new file mode 100644
index 0000000..5dc9b88
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveActivity.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.primitive;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.cts.util.WatchDog;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.Surface;
+
+import com.android.cts.opengl.GLActivityIntentKeys;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
+
+public class GLPrimitiveActivity extends Activity {
+
+    public final static String TAG = "GLPrimitiveActivity";
+
+    private volatile Exception mException;
+    private volatile Surface mSurface = null;
+    private CountDownLatch mStartSignal = new CountDownLatch(1);
+    private Semaphore mSemaphore = new Semaphore(0);
+
+    private BenchmarkName mBenchmark;
+    private boolean mOffscreen;
+    private int mNumFrames;
+    private int mNumIterations;
+    private int mTimeout;
+    public double[] mFpsValues;
+
+    @Override
+    public void onCreate(Bundle data) {
+        super.onCreate(data);
+        System.loadLibrary("ctsopengl_jni");
+        Intent intent = getIntent();
+        mBenchmark = BenchmarkName.valueOf(
+                intent.getStringExtra(GLActivityIntentKeys.INTENT_EXTRA_BENCHMARK_NAME));
+        mOffscreen = intent.getBooleanExtra(GLActivityIntentKeys.INTENT_EXTRA_OFFSCREEN, false);
+        mNumFrames = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, 0);
+        mNumIterations = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_ITERATIONS, 0);
+        mTimeout = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, 0);
+        mFpsValues = new double[mNumIterations];
+
+        Log.i(TAG, "Benchmark: " + mBenchmark);
+        Log.i(TAG, "Offscreen: " + mOffscreen);
+        Log.i(TAG, "Num Frames: " + mNumFrames);
+        Log.i(TAG, "Num Iterations: " + mNumIterations);
+        Log.i(TAG, "Time Out: " + mTimeout);
+
+        SurfaceView surfaceView = new SurfaceView(this);
+        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+                mSurface = holder.getSurface();
+                mStartSignal.countDown();
+            }
+
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {}
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {}
+        });
+        setContentView(surfaceView);
+        // Spawns a worker to run the benchmark.
+        Worker worker = new Worker();
+        worker.start();
+    }
+
+    public void waitForCompletion() throws Exception {
+        // Wait for semiphore.
+        mSemaphore.acquire();
+        if (mException != null) {
+            throw mException;
+        }
+    }
+
+    private void complete() {
+        // Release semiphore.
+        mSemaphore.release();
+        finish();
+    }
+
+    private synchronized void setException(Exception e) {
+        if (mException == null) {
+            mException = e;
+        }
+    }
+
+    private static native void setupFullPipelineBenchmark(
+            Surface surface, boolean offscreen, int workload);
+
+    private static native void setupPixelOutputBenchmark(
+            Surface surface, boolean offscreen, int workload);
+
+    private static native void setupShaderPerfBenchmark(
+            Surface surface, boolean offscreen, int workload);
+
+    private static native void setupContextSwitchBenchmark(
+            Surface surface, boolean offscreen, int workload);
+
+    private static native boolean startBenchmark(int numFrames, double[] frameTimes);
+
+    /**
+     * This thread runs the benchmarks, freeing the UI thread.
+     */
+    private class Worker extends Thread implements WatchDog.TimeoutCallback {
+
+        private WatchDog watchDog;
+        private volatile boolean success = true;
+
+        @Override
+        public void run() {
+            try {
+                mStartSignal.await();
+            } catch (InterruptedException e) {
+                setException(e);
+                complete();
+                return;
+            }
+            Log.i(TAG, mBenchmark + " Benchmark Started");
+            // Creates a watchdog to ensure a iteration doesn't exceed the timeout.
+            watchDog = new WatchDog(mTimeout, this);
+            // Used to record the start and end time of the iteration.
+            double[] times = new double[2];
+            for (int i = 0; i < mNumIterations && success; i++) {
+                // The workload to use for this iteration.
+                int workload = i + 1;
+                // Setup the benchmark.
+                switch (mBenchmark) {
+                    case FullPipeline:
+                        setupFullPipelineBenchmark(mSurface, mOffscreen, workload);
+                        break;
+                    case PixelOutput:
+                        setupPixelOutputBenchmark(mSurface, mOffscreen, workload);
+                        break;
+                    case ShaderPerf:
+                        setupShaderPerfBenchmark(mSurface, mOffscreen, workload);
+                        break;
+                    case ContextSwitch:
+                        setupContextSwitchBenchmark(mSurface, mOffscreen, workload);
+                        break;
+                }
+                watchDog.start();
+                // Start benchmark.
+                success = startBenchmark(mNumFrames, times);
+                watchDog.stop();
+
+                if (!success) {
+                    setException(new Exception("Benchmark failed to run"));
+                } else {
+                    // Calculate FPS.
+                    mFpsValues[i] = mNumFrames * 1000.0f / (times[1] - times[0]);
+                }
+            }
+            complete();
+            Log.i(TAG, mBenchmark + " Benchmark Completed");
+        }
+
+        public void onTimeout() {
+            setException(new Exception("Benchmark timed out"));
+            complete();
+        }
+
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveBenchmark.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveBenchmark.java
new file mode 100644
index 0000000..6c2c87d
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/primitive/GLPrimitiveBenchmark.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.primitive;
+
+import com.android.cts.opengl.GLActivityIntentKeys;
+import android.cts.util.CtsActivityInstrumentationTestCase2;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+
+import android.content.Intent;
+import com.android.cts.util.TimeoutReq;
+
+/**
+ * Runs the Primitive OpenGL ES 2.0 Benchmarks.
+ */
+public class GLPrimitiveBenchmark extends CtsActivityInstrumentationTestCase2<GLPrimitiveActivity> {
+
+    private static final int NUM_FRAMES = 100;
+    private static final int NUM_ITERATIONS = 8;
+    private static final int TIMEOUT = 1000000;
+
+    public GLPrimitiveBenchmark() {
+        super(GLPrimitiveActivity.class);
+    }
+
+    /**
+     * Runs the full OpenGL ES 2.0 pipeline test offscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testFullPipelineOffscreen() throws Exception {
+        runBenchmark(BenchmarkName.FullPipeline, true, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the full OpenGL ES 2.0 pipeline test onscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testFullPipelineOnscreen() throws Exception {
+        runBenchmark(BenchmarkName.FullPipeline, false, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the pixel output test offscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testPixelOutputOffscreen() throws Exception {
+        runBenchmark(BenchmarkName.PixelOutput, true, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the pixel output test onscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testPixelOutputOnscreen() throws Exception {
+        runBenchmark(BenchmarkName.PixelOutput, false, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the shader performance test offscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testShaderPerfOffscreen() throws Exception {
+        runBenchmark(BenchmarkName.ShaderPerf, true, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the shader performance test onscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testShaderPerfOnscreen() throws Exception {
+        runBenchmark(BenchmarkName.ShaderPerf, false, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the context switch overhead test offscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testContextSwitchOffscreen() throws Exception {
+        runBenchmark(BenchmarkName.ContextSwitch, true, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the context switch overhead test onscreen.
+     */
+    @TimeoutReq(minutes = 100)
+    public void testContextSwitchOnscreen() throws Exception {
+        runBenchmark(BenchmarkName.ContextSwitch, false, NUM_FRAMES, NUM_ITERATIONS, TIMEOUT);
+    }
+
+    /**
+     * Runs the specified test.
+     *
+     * @param benchmark An enum representing the benchmark to run.
+     * @param offscreen Whether to render to an offscreen framebuffer rather than the screen.
+     * @param numFrames The number of frames to render.
+     * @param numIterations The number of iterations to run, each iteration has a bigger workload.
+     * @param timeout The milliseconds to wait for an iteration of the benchmark before timing out.
+     * @throws Exception If the benchmark could not be run.
+     */
+    private void runBenchmark(BenchmarkName benchmark, boolean offscreen, int numFrames,
+            int numIterations, int timeout) throws Exception {
+        String benchmarkName = benchmark.toString();
+        Intent intent = new Intent();
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_BENCHMARK_NAME, benchmarkName);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_OFFSCREEN, offscreen);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, numFrames);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_ITERATIONS, numIterations);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, timeout);
+
+        GLPrimitiveActivity activity = null;
+        setActivityIntent(intent);
+        activity = getActivity();
+        if (activity != null) {
+            activity.waitForCompletion();
+            double[] fpsValues = activity.mFpsValues;
+            double score = 0;
+            for (double d : fpsValues) {
+                score += d;
+            }
+            score /= numIterations;// Average.
+
+            // TODO: maybe standard deviation / RMSE will be useful?
+
+            getReportLog().printArray(
+                    "Fps Values", fpsValues, ResultType.HIGHER_BETTER, ResultUnit.FPS);
+            getReportLog().printSummary(
+                    "Average Frames Per Second", score, ResultType.HIGHER_BETTER,
+                    ResultUnit.SCORE);
+        }
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLGameActivity.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLGameActivity.java
new file mode 100644
index 0000000..3b310f9
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLGameActivity.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.reference;
+
+import com.android.cts.opengl.GLActivityIntentKeys;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.AssetManager;
+import android.cts.util.WatchDog;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.opengl.GLES20;
+import android.opengl.GLUtils;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.CountDownLatch;
+
+public class GLGameActivity extends Activity {
+
+    public final static String SET_UP_TIME = "set_up_time";
+    public final static String UPDATE_TIMES = "update_times";
+    public final static String RENDER_TIMES = "render_times";
+
+    private int mNumFrames;
+    private int mTimeout;
+    private double[] mSetUpTimes;
+    private double[] mUpdateTimes;
+    private double[] mRenderTimes;
+    private volatile Surface mSurface = null;
+    private CountDownLatch mStartSignal = new CountDownLatch(1);
+
+    @Override
+    public void onCreate(Bundle data) {
+        super.onCreate(data);
+        System.loadLibrary("ctsopengl_jni");
+
+        Intent intent = getIntent();
+        mNumFrames = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, 1000);
+        mTimeout = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, 1000000);
+
+        SurfaceView surfaceView = new SurfaceView(this);
+        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+                mSurface = holder.getSurface();
+                mStartSignal.countDown();
+            }
+
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {}
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {}
+        });
+        setContentView(surfaceView);
+
+        // Spawns a worker.
+        Worker worker = new Worker(new Handler() {
+            public void handleMessage(Message msg) {
+                Intent intent = new Intent();
+                intent.putExtra(SET_UP_TIME, mSetUpTimes);
+                intent.putExtra(UPDATE_TIMES, mUpdateTimes);
+                intent.putExtra(RENDER_TIMES, mRenderTimes);
+                setResult((msg.what == 1) ? RESULT_OK : RESULT_CANCELED, intent);
+                finish();
+            }
+        });
+        worker.start();
+    }
+
+    private static native boolean startBenchmark(AssetManager manager,
+            Surface surface,
+            int numFrames,
+            double[] setUpTimes,
+            double[] updateTimes,
+            double[] renderTimes);
+
+    /**
+     * This thread renderers the benchmarks, freeing the UI thread.
+     */
+    private class Worker extends Thread implements WatchDog.TimeoutCallback {
+
+        private WatchDog watchDog;
+        private Handler mHandler;
+
+        public Worker(Handler handler) {
+            mHandler = handler;
+        }
+
+        @Override
+        public void run() {
+            try {
+                mStartSignal.await();
+            } catch (InterruptedException e) {
+                mHandler.sendEmptyMessage(0);
+                return;
+            }
+            // Creates a watchdog to ensure a iteration doesn't exceed the timeout.
+            watchDog = new WatchDog(mTimeout, this);
+            watchDog.start();
+
+            // Used to record the time taken to setup (GL, context, textures, meshes).
+            mSetUpTimes = new double[4];
+            // Used to record the times taken to update.
+            mUpdateTimes = new double[mNumFrames];
+            // Used to record the times taken to render.
+            mRenderTimes = new double[mNumFrames];
+            boolean success = startBenchmark(getAssets(),
+                    mSurface,
+                    mNumFrames,
+                    mSetUpTimes,
+                    mUpdateTimes,
+                    mRenderTimes);
+
+            watchDog.stop();
+            mHandler.sendEmptyMessage((success) ? 1 : 0);
+        }
+
+        public void onTimeout() {
+            mHandler.sendEmptyMessage(0);
+        }
+
+    }
+
+    public static int loadTexture(AssetManager manager, String path) {
+        InputStream in = null;
+        try {
+            in = manager.open(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+            return -1;
+        }
+        BitmapFactory.Options op = new BitmapFactory.Options();
+        op.inPreferredConfig = Bitmap.Config.ARGB_8888;
+        Bitmap bmp = BitmapFactory.decodeStream(in, null, op);
+        // generate textureID
+        int[] textures = new int[1];
+        GLES20.glGenTextures(1, textures, 0);
+        int textureID = textures[0];
+
+        // create texture
+        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
+        GLES20.glTexParameteri(
+                GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
+        GLES20.glTexParameteri(
+                GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
+        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
+        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
+        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
+
+        // clean up
+        try {
+            in.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            bmp.recycle();
+        }
+        return textureID;
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceActivity.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceActivity.java
new file mode 100644
index 0000000..8d34535
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceActivity.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.reference;
+
+import com.android.cts.opengl.GLActivityIntentKeys;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+
+import java.util.concurrent.Semaphore;
+
+public class GLReferenceActivity extends Activity {
+
+    private final static int GAME_ACTIVITY_CODE = 1;
+
+    private volatile Exception mException;
+    private int mNumFrames;
+    private int mTimeout;
+
+    public double[] mSetUpTimes;
+    public double[] mUpdateTimes;
+    public double[] mRenderTimes;
+
+    private Semaphore mSemaphore = new Semaphore(0);
+
+    @Override
+    public void onCreate(Bundle data) {
+        super.onCreate(data);
+        Intent intent = getIntent();
+        mNumFrames = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, 0);
+        mTimeout = intent.getIntExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, 0);
+
+        // Start benchmark
+        intent = new Intent(this, GLGameActivity.class);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, mNumFrames);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, mTimeout);
+        startActivityForResult(intent, GAME_ACTIVITY_CODE);
+    }
+
+    public void waitForCompletion() throws Exception {
+        // Wait for semiphore.
+        mSemaphore.acquire();
+        if (mException != null) {
+            throw mException;
+        }
+    }
+
+    private synchronized void setException(Exception e) {
+        if (mException == null) {
+            mException = e;
+        }
+    }
+
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == GAME_ACTIVITY_CODE) {
+            if (resultCode == RESULT_OK) {
+                // Benchmark passed
+                mSetUpTimes = data.getDoubleArrayExtra(GLGameActivity.SET_UP_TIME);
+                mUpdateTimes = data.getDoubleArrayExtra(GLGameActivity.UPDATE_TIMES);
+                mRenderTimes = data.getDoubleArrayExtra(GLGameActivity.RENDER_TIMES);
+            } else {
+                setException(new Exception("Benchmark failed to run"));
+            }
+            // Release semiphore.
+            mSemaphore.release();
+            finish();
+        }
+    }
+
+}
diff --git a/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceBenchmark.java b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceBenchmark.java
new file mode 100644
index 0000000..fdea916
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/src/com/android/cts/opengl/reference/GLReferenceBenchmark.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.opengl.reference;
+
+import com.android.cts.opengl.GLActivityIntentKeys;
+
+import android.cts.util.CtsActivityInstrumentationTestCase2;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.TimeoutReq;
+
+import android.content.Intent;
+
+/**
+ * Runs the Reference OpenGL ES 2.0 Benchmark.
+ */
+public class GLReferenceBenchmark extends CtsActivityInstrumentationTestCase2<GLReferenceActivity> {
+
+    private static final int NUM_FRAMES_PER_SCENE = 500;
+    private static final int NUM_SCENES = 2;
+    private static final int NUM_FRAMES = NUM_FRAMES_PER_SCENE * NUM_SCENES;
+    private static final int TIMEOUT = 1000000;
+
+    public GLReferenceBenchmark() {
+        super(GLReferenceActivity.class);
+    }
+
+    /**
+     * Runs the reference benchmark.
+     */
+    @TimeoutReq(minutes = 30)
+    public void testReferenceBenchmark() throws Exception {
+        Intent intent = new Intent();
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_NUM_FRAMES, NUM_FRAMES);
+        intent.putExtra(GLActivityIntentKeys.INTENT_EXTRA_TIMEOUT, TIMEOUT);
+
+        GLReferenceActivity activity = null;
+        setActivityIntent(intent);
+        activity = getActivity();
+        if (activity != null) {
+            activity.waitForCompletion();
+            double totalTime = 0;
+            double[] setUpTimes = activity.mSetUpTimes;
+            double[] updateTimes = activity.mUpdateTimes;
+            double[] renderTimes = activity.mRenderTimes;
+
+            // Calculate update and render average.
+            double updateSum = updateTimes[0];
+            double renderSum = renderTimes[0];
+            for (int i = 0; i < NUM_FRAMES - 1; i++) {
+                updateSum += updateTimes[i + 1];
+                renderSum += renderTimes[i + 1];
+            }
+            double updateAverage = updateSum / NUM_FRAMES;
+            double renderAverage = renderSum / NUM_FRAMES;
+
+            getReportLog().printArray(
+                    "Set Up Times", setUpTimes, ResultType.LOWER_BETTER, ResultUnit.MS);
+            getReportLog().printArray(
+                    "Update Times", updateTimes, ResultType.LOWER_BETTER, ResultUnit.MS);
+            getReportLog().printValue(
+                    "Update Time Average", updateAverage, ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+            getReportLog().printArray(
+                    "Render Times", renderTimes, ResultType.LOWER_BETTER, ResultUnit.MS);
+            getReportLog().printValue(
+                    "Render Time Average", renderAverage, ResultType.LOWER_BETTER,
+                    ResultUnit.MS);
+            totalTime = setUpTimes[0] + setUpTimes[1] + setUpTimes[2] +
+                    setUpTimes[3] + updateAverage + renderAverage;
+            getReportLog().printSummary(
+                    "Total Time", totalTime, ResultType.LOWER_BETTER, ResultUnit.MS);
+        }
+    }
+}
diff --git a/suite/cts/deviceTests/opengl/test/Android.mk b/suite/cts/deviceTests/opengl/test/Android.mk
new file mode 100644
index 0000000..b571dbf
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/test/Android.mk
@@ -0,0 +1,34 @@
+#
+# Copyright (C) 2013 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.
+
+# build only for linux
+ifeq ($(HOST_OS),linux)
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := $(patsubst ./%,%, $(shell cd $(LOCAL_PATH); \
+  find . -name "*.cpp" -and -not -name ".*"))
+LOCAL_SRC_FILES += ../jni/graphics/Matrix.cpp
+
+#$(info $(LOCAL_SRC_FILES))
+LOCAL_C_INCLUDES += external/gtest/include $(LOCAL_PATH)/../jni/graphics/
+LOCAL_STATIC_LIBRARIES := libutils libcutils libgtest_host libgtest_main_host liblog
+LOCAL_LDFLAGS:= -g -lrt -ldl -lstdc++ -lm -fno-exceptions
+LOCAL_MODULE:= cts_device_opengl_test
+include $(BUILD_HOST_EXECUTABLE)
+
+endif # linux
diff --git a/suite/cts/deviceTests/opengl/test/MatrixTest.cpp b/suite/cts/deviceTests/opengl/test/MatrixTest.cpp
new file mode 100644
index 0000000..d78dfc4
--- /dev/null
+++ b/suite/cts/deviceTests/opengl/test/MatrixTest.cpp
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include <gtest/gtest.h>
+#include <math.h>
+
+#include "Matrix.h"
+
+class MatrixTest: public testing::Test {
+public:
+
+};
+
+void checkValues(const float* arr1, const float* arr2, const int size) {
+    for (int i = 0; i < size; i++) {
+        ASSERT_FLOAT_EQ(arr1[i], arr2[i]);
+    }
+}
+
+TEST(MatrixTest, matrixEqualityTest) {
+    // Create two identity matrixes.
+    Matrix m1;
+    Matrix m2;
+    // Change some random values.
+    m1.mData[4] = 9;
+    m2.mData[4] = 9;
+    // Check they are the same.
+    ASSERT_TRUE(m1.equals(m2));
+    Matrix* clone = new Matrix(m1);
+    ASSERT_TRUE(clone != NULL);
+    ASSERT_TRUE(m1.equals(*clone));
+    delete clone;
+}
+
+TEST(MatrixTest, matrixIdentityTest) {
+    // Create an identity matrix.
+    Matrix m;
+    float expected[] = {
+        1.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 1.0f, 0.0f,
+        0.0f, 0.0f, 0.0f, 1.0f};
+    // Check values
+    checkValues(m.mData, expected, Matrix::MATRIX_SIZE);
+}
+
+TEST(MatrixTest, matrixLoadWithTest) {
+    // Create a matrix.
+    Matrix m1;
+    float* d1 = m1.mData;
+    float data[Matrix::MATRIX_SIZE];
+
+    // Fill with rubbish
+    for (int i = 0; i < Matrix::MATRIX_SIZE; i++) {
+        d1[i] = i;
+        data[i] = i;
+    }
+
+    // Create another matrix
+    Matrix m2;
+
+    // Load second matrix with first
+    m2.loadWith(m1);
+
+    // Check values
+    checkValues(m2.mData, data, Matrix::MATRIX_SIZE);
+}
+
+TEST(MatrixTest, matrixTranslateTest) {
+    Matrix m1;
+    m1.translate(10, 5, 6);
+    Matrix* m2 = Matrix::newTranslate(10, 5, 6);
+    ASSERT_TRUE(m2 != NULL);
+    ASSERT_TRUE(m1.equals(*m2));
+    delete m2;
+}
+
+TEST(MatrixTest, matrixScaleTest) {
+    Matrix m1;
+    m1.scale(10, 5, 6);
+    Matrix* m2 = Matrix::newScale(10, 5, 6);
+    ASSERT_TRUE(m2 != NULL);
+    ASSERT_TRUE(m1.equals(*m2));
+    delete m2;
+}
+
+TEST(MatrixTest, matrixRotateTest) {
+    Matrix m1;
+    m1.rotate(180, 1, 0, 1);
+    Matrix* m2 = Matrix::newRotate(180, 1, 0, 1);
+    ASSERT_TRUE(m2 != NULL);
+    ASSERT_TRUE(m1.equals(*m2));
+    delete m2;
+}
+
+TEST(MatrixTest, matrixMultiplyTest) {
+    // Create three identity matrixes.
+    Matrix m1;
+    Matrix m2;
+    Matrix m3;
+    float* d1 = m1.mData;
+    float* d2 = m2.mData;
+
+    m3.multiply(m1, m2);
+    // Multiplication of identity matrixes should give identity
+    ASSERT_TRUE(m3.equals(m1));
+
+    // Fill with ascending numbers
+    for (int i = 0; i < Matrix::MATRIX_SIZE; i++) {
+        d1[i] = i;
+        d2[i] = i;
+    }
+    m3.multiply(m1, m2);
+
+    // Check against expected
+    float expected[] = {
+        56, 62, 68, 74,
+        152, 174, 196, 218,
+        248, 286, 324, 362,
+        344, 398, 452, 506};
+    checkValues(m3.mData, expected, Matrix::MATRIX_SIZE);
+}
+
+TEST(MatrixTest, matrixNewLookAtTest) {
+    // Position the eye in front of the origin.
+    float eyeX = 0.0f;
+    float eyeY = 0.0f;
+    float eyeZ = 6.0f;
+
+    // We are looking at the origin
+    float centerX = 0.0f;
+    float centerY = 0.0f;
+    float centerZ = 0.0f;
+
+    // Set our up vector. This is where our head would be pointing were we holding the camera.
+    float upX = 0.0f;
+    float upY = 1.0f;
+    float upZ = 0.0f;
+
+    // Set the view matrix. This matrix can be said to represent the camera position.
+    Matrix* m = Matrix::newLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ,
+            upX, upY, upZ);
+    ASSERT_TRUE(m != NULL);
+    float expected[] = {
+        1.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 1.0f, 0.0f,
+        0.0f, 0.0f, -6.0f, 1.0f};
+    // Check values
+    checkValues(m->mData, expected, Matrix::MATRIX_SIZE);
+    delete m;
+}
+
+TEST(MatrixTest, matrixNewFrustumTest) {
+    float ratio = (float) 800 / 600;
+    float left = -ratio;
+    float right = ratio;
+    float bottom = -1.0f;
+    float top = 1.0f;
+    float near = 1.0f;
+    float far = 8.0f;
+
+    Matrix* m = Matrix::newFrustum(left, right, bottom, top, near, far);
+    ASSERT_TRUE(m != NULL);
+    float expected[] = {
+        0.75f, 0.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 9.0f / -7.0f, -1.0f,
+        0.0f, 0.0f, 16.0f / -7.0f, 0.0f};
+    // Check values
+    checkValues(m->mData, expected, Matrix::MATRIX_SIZE);
+    delete m;
+}
+
+TEST(MatrixTest, matrixNewTranslateTest) {
+    Matrix* m = Matrix::newTranslate(5, 6, 8);
+    ASSERT_TRUE(m != NULL);
+    float expected[] = {
+        1.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 1.0f, 0.0f,
+        5.0f, 6.0f, 8.0f, 1.0f};
+    // Check values
+    checkValues(m->mData, expected, Matrix::MATRIX_SIZE);
+    delete m;
+}
+
+TEST(MatrixTest, matrixNewScaleTest) {
+    Matrix* m = Matrix::newScale(3, 7, 2);
+    ASSERT_TRUE(m != NULL);
+    float expected[] = {
+        3.0f, 0.0f, 0.0f, 0.0f,
+        0.0f, 7.0f, 0.0f, 0.0f,
+        0.0f, 0.0f, 2.0f, 0.0f,
+        0.0f, 0.0f, 0.0f, 1.0f};
+    // Check values
+    checkValues(m->mData, expected, Matrix::MATRIX_SIZE);
+    delete m;
+}
+
+TEST(MatrixTest, matrixNewRotateTest) {
+    Matrix* m = Matrix::newRotate(45.0f, 0.0f, 1.0f, 0.0f);
+    ASSERT_TRUE(m != NULL);
+    float radians = 45.0f * (M_PI / 180.0f);
+    float sin = sinf(radians);
+    float cos = cosf(radians);
+    float expected[] = {
+        cos, 0.0f, -sin, 0.0f,
+        0.0f, 1.0f, 0.0f, 0.0f,
+        sin, 0.0f, cos, 0.0f,
+        0.0f, 0.0f, 0.0f, 1.0f};
+    // Check values
+    checkValues(m->mData, expected, Matrix::MATRIX_SIZE);
+    delete m;
+}
+
+TEST(MatrixTest, matrixMultiplyVectorTest) {
+    float in[] = {2, 4, 6, 8};
+    float out[4];
+    Matrix m;
+    float* d = m.mData;
+    // Fill with rubbish
+    for (int i = 0; i < Matrix::MATRIX_SIZE; i++) {
+        d[i] = i;
+    }
+    float expected[] = {40, 120, 200, 280};
+    Matrix::multiplyVector(out, m, in);
+    checkValues(out, expected, 4);
+}
diff --git a/suite/cts/deviceTests/simplecpu/Android.mk b/suite/cts/deviceTests/simplecpu/Android.mk
new file mode 100644
index 0000000..003b0f2
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_JNI_SHARED_LIBRARIES := libctscpu_jni
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceSimpleCpu
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/suite/cts/deviceTests/simplecpu/AndroidManifest.xml b/suite/cts/deviceTests/simplecpu/AndroidManifest.xml
new file mode 100644
index 0000000..69e4ad2
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.simplecpu">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+            android:targetPackage="com.android.cts.simplecpu"
+            android:label="Very simple CPU benchmarking" />
+</manifest>
diff --git a/suite/cts/deviceTests/simplecpu/jni/Android.mk b/suite/cts/deviceTests/simplecpu/jni/Android.mk
new file mode 100644
index 0000000..946aa37
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/jni/Android.mk
@@ -0,0 +1,31 @@
+# Copyright (C) 2012 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    := libctscpu_jni
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := CpuNativeJni.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+
+LOCAL_SHARED_LIBRARIES := libnativehelper
+
+LOCAL_SDK_VERSION := 14
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/suite/cts/deviceTests/simplecpu/jni/CpuNativeJni.cpp b/suite/cts/deviceTests/simplecpu/jni/CpuNativeJni.cpp
new file mode 100644
index 0000000..e0be7f3
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/jni/CpuNativeJni.cpp
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+#include <jni.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+
+/* Code from now to qsort_local all copied from bionic source.
+ * The code is duplicated here to remove dependency on optimized bionic
+ */
+static __inline char    *med3(char *, char *, char *, int (*)(const void *, const void *));
+static __inline void     swapfunc(char *, char *, int, int);
+
+#define min(a, b)   (a) < (b) ? a : b
+
+/*
+ * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
+ */
+#define swapcode(TYPE, parmi, parmj, n) {       \
+    long i = (n) / sizeof (TYPE);           \
+    TYPE *pi = (TYPE *) (parmi);            \
+    TYPE *pj = (TYPE *) (parmj);            \
+    do {                        \
+        TYPE    t = *pi;            \
+        *pi++ = *pj;                \
+        *pj++ = t;              \
+        } while (--i > 0);              \
+}
+
+#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
+    es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
+
+static __inline void
+swapfunc(char *a, char *b, int n, int swaptype)
+{
+    if (swaptype <= 1)
+        swapcode(long, a, b, n)
+    else
+        swapcode(char, a, b, n)
+}
+
+#define swap(a, b)                  \
+    if (swaptype == 0) {                \
+        long t = *(long *)(a);          \
+        *(long *)(a) = *(long *)(b);        \
+        *(long *)(b) = t;           \
+    } else                      \
+        swapfunc(a, b, es, swaptype)
+
+#define vecswap(a, b, n)    if ((n) > 0) swapfunc(a, b, n, swaptype)
+
+static __inline char *
+med3(char *a, char *b, char *c, int (*cmp)(const void *, const void *))
+{
+    return cmp(a, b) < 0 ?
+           (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))
+              :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));
+}
+
+void
+qsort_local(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *))
+{
+    char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+    int d, r, swaptype, swap_cnt;
+    char *a = (char*)aa;
+
+loop:   SWAPINIT(a, es);
+    swap_cnt = 0;
+    if (n < 7) {
+        for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
+            for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
+                 pl -= es)
+                swap(pl, pl - es);
+        return;
+    }
+    pm = (char *)a + (n / 2) * es;
+    if (n > 7) {
+        pl = (char *)a;
+        pn = (char *)a + (n - 1) * es;
+        if (n > 40) {
+            d = (n / 8) * es;
+            pl = med3(pl, pl + d, pl + 2 * d, cmp);
+            pm = med3(pm - d, pm, pm + d, cmp);
+            pn = med3(pn - 2 * d, pn - d, pn, cmp);
+        }
+        pm = med3(pl, pm, pn, cmp);
+    }
+    swap(a, pm);
+    pa = pb = (char *)a + es;
+
+    pc = pd = (char *)a + (n - 1) * es;
+    for (;;) {
+        while (pb <= pc && (r = cmp(pb, a)) <= 0) {
+            if (r == 0) {
+                swap_cnt = 1;
+                swap(pa, pb);
+                pa += es;
+            }
+            pb += es;
+        }
+        while (pb <= pc && (r = cmp(pc, a)) >= 0) {
+            if (r == 0) {
+                swap_cnt = 1;
+                swap(pc, pd);
+                pd -= es;
+            }
+            pc -= es;
+        }
+        if (pb > pc)
+            break;
+        swap(pb, pc);
+        swap_cnt = 1;
+        pb += es;
+        pc -= es;
+    }
+    if (swap_cnt == 0) {  /* Switch to insertion sort */
+        for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
+            for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
+                 pl -= es)
+                swap(pl, pl - es);
+        return;
+    }
+
+    pn = (char *)a + n * es;
+    r = min(pa - (char *)a, pb - pa);
+    vecswap(a, pb - r, r);
+    r = min(pd - pc, pn - pd - (int)es);
+    vecswap(pb, pn - r, r);
+    if ((r = pb - pa) > (int)es)
+        qsort_local(a, r / es, es, cmp);
+    if ((r = pd - pc) > (int)es) {
+        /* Iterate rather than recurse to save stack space */
+        a = pn - r;
+        n = r / es;
+        goto loop;
+    }
+    /* qsort(pn - r, r / es, es, cmp); */
+}
+
+/* code duplication ends here */
+
+/**
+ * Util for getting time stamp
+ */
+double currentTimeMillis()
+{
+    struct timeval tv;
+    gettimeofday(&tv, (struct timezone *) NULL);
+    return tv.tv_sec * 1000.0 + tv.tv_usec / 1000.0;
+}
+
+/**
+ * Initialize given array randomly for the given seed
+ */
+template <typename T> void randomInitArray(T* array, int len, unsigned int seed)
+{
+    srand(seed);
+    for (int i = 0; i < len; i++) {
+        array[i] = (T) rand();
+    }
+}
+
+/**
+ * comparison function for int, for qsort
+ */
+int cmpint(const void* p1, const void* p2)
+{
+    return *(int*)p1 - *(int*)p2;
+}
+
+extern "C" JNIEXPORT jdouble JNICALL Java_com_android_cts_simplecpu_CpuNative_runSort(JNIEnv* env,
+        jclass clazz, jint numberElements, jint repetition)
+{
+    int* data = new int[numberElements];
+    if (data == NULL) {
+        env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), "No memory");
+        return -1;
+    }
+    double totalTime = 0;
+    for (int i = 0; i < repetition; i++) {
+        randomInitArray<int>(data, numberElements, 0);
+        double start = currentTimeMillis();
+        qsort_local(data, numberElements, sizeof(int), cmpint);
+        double end = currentTimeMillis();
+        totalTime += (end - start);
+    }
+    delete[] data;
+    return totalTime;
+}
+
+
+/**
+ * Do matrix multiplication, C = A x B with all matrices having dimension of n x n
+ * The implementation is not in the most efficient, but it is good enough for benchmarking purpose.
+ * @param n should be multiple of 8
+ */
+void doMatrixMultiplication(float* A, float* B, float* C, int n)
+{
+    // batch size
+    const int M = 8;
+    for (int i = 0; i < n; i++) {
+        for (int j = 0; j < n; j += M) {
+            float sum[M];
+            for (int k = 0; k < M; k++) {
+                sum[k] = 0;
+            }
+            // re-use the whole cache line for accessing B.
+            // otherwise, the whole line will be read and only one value will be used.
+
+            for (int k = 0; k < n; k++) {
+                float a = A[i * n + k];
+                sum[0] += a * B[k * n + j];
+                sum[1] += a * B[k * n + j + 1];
+                sum[2] += a * B[k * n + j + 2];
+                sum[3] += a * B[k * n + j + 3];
+                sum[4] += a * B[k * n + j + 4];
+                sum[5] += a * B[k * n + j + 5];
+                sum[6] += a * B[k * n + j + 6];
+                sum[7] += a * B[k * n + j + 7];
+            }
+            for (int k = 0; k < M; k++) {
+                C[i * n + j + k] = sum[k];
+            }
+        }
+    }
+}
+
+extern "C" JNIEXPORT jdouble JNICALL Java_com_android_cts_simplecpu_CpuNative_runMatrixMultiplication(
+        JNIEnv* env, jclass clazz, jint n, jint repetition)
+{
+    // C = A x B
+    float* A = new float[n * n];
+    float* B = new float[n * n];
+    float* C = new float[n * n];
+    if ((A == NULL) || (B == NULL) || (C == NULL)) {
+        delete[] A;
+        delete[] B;
+        delete[] C;
+        env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), "No memory");
+        return -1;
+    }
+    double totalTime = 0;
+    for (int i = 0; i < repetition; i++) {
+        randomInitArray<float>(A, n * n, 0);
+        randomInitArray<float>(B, n * n, 1);
+        double start = currentTimeMillis();
+        doMatrixMultiplication(A, B, C, n);
+        double end = currentTimeMillis();
+        totalTime += (end - start);
+    }
+    delete[] A;
+    delete[] B;
+    delete[] C;
+    return totalTime;
+}
+
diff --git a/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/CpuNative.java b/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/CpuNative.java
new file mode 100644
index 0000000..8b48623
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/CpuNative.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.simplecpu;
+
+public class CpuNative {
+    static {
+        System.loadLibrary("ctscpu_jni");
+    }
+    /**
+     * run qsort for given number of repetition
+     * with each having the size of bufferSize.
+     * @param numberElements
+     * @param repeatition
+     * @return time taken for computation, added for all repetition in ms
+     */
+    public static native double runSort(int numberElements, int repetition);
+
+    /**
+     * run matrix multiplication of (n x n) x (n x n)
+     *
+     * @param n dimension, should be multiple of 8
+     * @param repetition
+     * @return time taken for computation, added for all repetition in ms
+     */
+    public static native double runMatrixMultiplication(int n, int repetition);
+}
diff --git a/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/SimpleCpuTest.java b/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/SimpleCpuTest.java
new file mode 100644
index 0000000..7485abe
--- /dev/null
+++ b/suite/cts/deviceTests/simplecpu/src/com/android/cts/simplecpu/SimpleCpuTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.simplecpu;
+
+import android.util.Log;
+
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.Stat;
+import com.android.cts.util.TimeoutReq;
+
+/**
+ * Very simple CPU benchmarking to check the basic capability of CPU.
+ * Cases include
+ *   qsort
+ *   matrix multiplication (for floating point performance)
+ */
+public class SimpleCpuTest extends CtsAndroidTestCase {
+    private static final String TAG = "BandwidthTest";
+    private static final int KB = 1024;
+    private static final int MB = 1024 * 1024;
+    private static final int NUMBER_REPEAT = 20;
+    // reject data outside +/- this value * median
+    private static final double OUTLIER_THRESHOLD = 0.1;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        warmUpCpu();
+    }
+
+    public void testSort004KB() {
+        doTestSort(NUMBER_REPEAT, 4 * KB);
+    }
+
+    public void testSort128KB() {
+        doTestSort(NUMBER_REPEAT, 128 * KB);
+    }
+
+    public void testSort001MB() {
+        doTestSort(NUMBER_REPEAT, 1 * MB);
+    }
+
+    // will fit into L1
+    public void testMatrixMultiplication032() {
+        doMatrixMultiplication(NUMBER_REPEAT, 32);
+    }
+
+    // mostly fit into L2
+    public void testMatrixMultiplication128() {
+        doMatrixMultiplication(NUMBER_REPEAT, 128);
+    }
+
+    // may fit into L2
+    public void testMatrixMultiplication200() {
+        doMatrixMultiplication(NUMBER_REPEAT, 200);
+    }
+
+    public void testMatrixMultiplication400() {
+        doMatrixMultiplication(NUMBER_REPEAT, 400);
+    }
+
+    // will exceed L2
+    @TimeoutReq(minutes = 20)
+    public void testMatrixMultiplication600() {
+        doMatrixMultiplication(NUMBER_REPEAT, 600);
+    }
+
+    /**
+     * run some code to force full CPU freq.
+     */
+    private void warmUpCpu() {
+        CpuNative.runSort(1 * MB, 10);
+    }
+
+    /**
+     * qsort test
+     * @param numberRepeat
+     * @param arrayLength
+     */
+    private void doTestSort(int numberRepeat, int arrayLength) {
+        final int numberRepeatInEachCall = 10;
+        double[] result = new double[numberRepeat];
+        for (int i = 0; i < numberRepeat; i++) {
+            result[i] = CpuNative.runSort(arrayLength, numberRepeatInEachCall);
+        }
+        getReportLog().printArray("sorting time", result, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        Stat.StatResult stat = Stat.getStatWithOutlierRejection(result, OUTLIER_THRESHOLD);
+        if (stat.mDataCount != result.length) {
+            Log.w(TAG, "rejecting " + (result.length - stat.mDataCount) + " outliers");
+        }
+        getReportLog().printSummary("sorting time", stat.mAverage, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+    }
+
+    /**
+     * Matrix multiplication test, nxn matrix multiplication
+     * @param numberRepeat
+     * @param n should be multiple of 8
+     */
+    private void doMatrixMultiplication(int numberRepeat, int n) {
+        assertTrue(n % 8 == 0);
+        final int numberRepeatInEachCall = 10;
+        double[] result = new double[numberRepeat];
+        for (int i = 0; i < numberRepeat; i++) {
+            result[i] = CpuNative.runMatrixMultiplication(n, numberRepeatInEachCall);
+        }
+        getReportLog().printArray("matrix mutiplication time", result, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        Stat.StatResult stat = Stat.getStatWithOutlierRejection(result, OUTLIER_THRESHOLD);
+        if (stat.mDataCount != result.length) {
+            Log.w(TAG, "rejecting " + (result.length - stat.mDataCount) + " outliers");
+        }
+        getReportLog().printSummary("matrix mutiplication time", stat.mAverage,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+    }
+
+}
diff --git a/suite/cts/deviceTests/ui/Android.mk b/suite/cts/deviceTests/ui/Android.mk
new file mode 100644
index 0000000..17287b2
--- /dev/null
+++ b/suite/cts/deviceTests/ui/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceUi
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+
diff --git a/suite/cts/deviceTests/ui/AndroidManifest.xml b/suite/cts/deviceTests/ui/AndroidManifest.xml
new file mode 100644
index 0000000..1be3eed
--- /dev/null
+++ b/suite/cts/deviceTests/ui/AndroidManifest.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.ui" >
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+
+        <activity
+            android:name=".ScrollingActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <instrumentation
+        android:name="android.test.InstrumentationCtsTestRunner"
+        android:label="UI Latency measurement"
+        android:targetPackage="com.android.cts.ui" />
+
+</manifest>
\ No newline at end of file
diff --git a/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingActivity.java b/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingActivity.java
new file mode 100644
index 0000000..2229e97
--- /dev/null
+++ b/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingActivity.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.ui;
+
+import android.app.ListActivity;
+import android.os.Bundle;
+import android.widget.AbsListView;
+import android.widget.AbsListView.OnScrollListener;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Activity for measuring scrolling time of long list.
+ */
+public class ScrollingActivity extends ListActivity implements OnScrollListener {
+    static final String TAG = "ScrollingActivity";
+    private static final String NUM_ELEMENTS_EXTRA = "num_elements";
+    private static final int NUM_ELEMENTS_DEFAULT = 10000;
+    private static final int SCROLL_TIME_IN_MS = 1;
+    private static final int WAIT_TIMEOUT_IN_SECS = 5 * 60;
+    private String[] mItems;
+    private CountDownLatch mLatchStop = null;
+    private int mTargetLoc;
+    private int mNumElements;
+
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        mNumElements = getIntent().getIntExtra(NUM_ELEMENTS_EXTRA, NUM_ELEMENTS_DEFAULT);
+        mItems = new String[mNumElements];
+        for (int i = 0; i < mNumElements; i++) {
+            mItems[i] = Integer.toString(i);
+        }
+        setListAdapter(new ArrayAdapter<String>(this,
+                android.R.layout.simple_list_item_1, mItems));
+        ListView view = getListView();
+        view.setOnScrollListener(this);
+    }
+
+    public boolean scrollToTop() {
+        return doScroll(0);
+    }
+    public boolean scrollToBottom() {
+        return doScroll(mNumElements - 1);
+    }
+
+    private boolean doScroll(final int loc) {
+        mLatchStop = new CountDownLatch(1);
+        mTargetLoc = loc;
+        final ListView view = getListView();
+        runOnUiThread( new Runnable() {
+            @Override
+            public void run() {
+                view.smoothScrollToPositionFromTop(loc, 0, SCROLL_TIME_IN_MS);
+            }
+        });
+        boolean result = false;
+        try {
+            result = mLatchStop.await(WAIT_TIMEOUT_IN_SECS, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+        mLatchStop = null;
+        return result;
+    }
+
+    @Override
+    public void onScrollStateChanged(AbsListView view, int scrollState) {
+
+    }
+
+    @Override
+    public void onScroll(AbsListView view, int firstVisibleItem,
+            int visibleItemCount, int totalItemCount) {
+        //Log.i(TAG, "onScroll " + firstVisibleItem + " " + visibleItemCount);
+        if ((mTargetLoc >= firstVisibleItem) &&
+                (mTargetLoc <= (firstVisibleItem + visibleItemCount))) {
+            if (mLatchStop != null) {
+                mLatchStop.countDown();
+            }
+        }
+    }
+}
diff --git a/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingTest.java b/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingTest.java
new file mode 100644
index 0000000..b5b40e4
--- /dev/null
+++ b/suite/cts/deviceTests/ui/src/com/android/cts/ui/ScrollingTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.ui;
+
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import android.cts.util.CtsActivityInstrumentationTestCase2;
+import com.android.cts.util.Stat;
+import com.android.cts.util.TimeoutReq;
+
+import java.io.IOException;
+
+public class ScrollingTest extends CtsActivityInstrumentationTestCase2<ScrollingActivity> {
+    private ScrollingActivity mActivity;
+
+    public ScrollingTest() {
+        super(ScrollingActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+        getInstrumentation().waitForIdleSync();
+        try {
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                }
+            });
+        } catch (Throwable e) {
+            e.printStackTrace();
+            fail();
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mActivity = null;
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 30)
+    public void testFullScrolling() throws Exception {
+        final int NUMBER_REPEAT = 10;
+        final ScrollingActivity activity = mActivity;
+        double[] results = MeasureTime.measure(NUMBER_REPEAT, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws IOException {
+                assertTrue(activity.scrollToBottom());
+                assertTrue(activity.scrollToTop());
+            }
+        });
+        getReportLog().printArray("scrolling time", results, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        Stat.StatResult stat = Stat.getStat(results);
+        getReportLog().printSummary("scrolling time", stat.mAverage, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+    }
+}
diff --git a/suite/cts/deviceTests/videoperf/Android.mk b/suite/cts/deviceTests/videoperf/Android.mk
new file mode 100644
index 0000000..6ace48f
--- /dev/null
+++ b/suite/cts/deviceTests/videoperf/Android.mk
@@ -0,0 +1,32 @@
+# Copyright (C) 2013 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceVideoPerf
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
diff --git a/suite/cts/deviceTests/videoperf/AndroidManifest.xml b/suite/cts/deviceTests/videoperf/AndroidManifest.xml
new file mode 100644
index 0000000..631141d
--- /dev/null
+++ b/suite/cts/deviceTests/videoperf/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.videoperf">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+            android:targetPackage="com.android.cts.videoperf"
+            android:label="UI Latency measurement" />
+</manifest>
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
new file mode 100644
index 0000000..b9edfa4
--- /dev/null
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/CodecInfo.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.videoperf;
+
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.CodecProfileLevel;
+import android.media.MediaCodecList;
+import android.util.Log;
+
+
+/**
+ * Utility class for getting codec information like bit rate, fps, and etc.
+ * Uses public member variables instead of methods as this code is only for video benchmarking.
+ */
+public class CodecInfo {
+    /** bit rate in bps */
+    public int mBitRate = 0;
+    /** Frame rate */
+    public int mFps = 0;
+    /** if codec is supporting YUV semiplanar format */
+    public boolean mSupportSemiPlanar = false;
+    /** if codec is supporting YUV planar format */
+    public boolean mSupportPlanar = false;
+
+    private static final String TAG = "CodecInfo";
+    private static final String VIDEO_AVC = "video/avc";
+    /**
+     * Check if given codec with given (w,h) is supported.
+     * @param mimeType codec type in mime format like "video/avc"
+     * @param w video width
+     * @param h video height
+     * @param isEncoder whether the codec is encoder or decoder
+     * @return null if the configuration is not supported.
+     */
+    public static CodecInfo getSupportedFormatInfo(String mimeType, int w, int h,
+            boolean isEncoder) {
+        CodecCapabilities cap = getCodecCapability(mimeType, isEncoder);
+        if (cap == null) { // not supported
+            return null;
+        }
+        CodecInfo info = new CodecInfo();
+        for (int color : cap.colorFormats) {
+            if (color == CodecCapabilities.COLOR_FormatYUV420SemiPlanar) {
+                info.mSupportSemiPlanar = true;
+            }
+            if (color == CodecCapabilities.COLOR_FormatYUV420Planar) {
+                info.mSupportPlanar = true;
+            }
+        }
+        printIntArray("supported colors", cap.colorFormats);
+        //  either YUV420 planar or semiplanar should be supported
+        if (!info.mSupportPlanar && !info.mSupportSemiPlanar) {
+            Log.i(TAG, "no supported color format");
+            return null;
+        }
+
+        if (mimeType.equals(VIDEO_AVC)) {
+            int highestLevel = 0;
+            for (CodecProfileLevel lvl : cap.profileLevels) {
+                if (lvl.level > highestLevel) {
+                    highestLevel = lvl.level;
+                }
+            }
+            Log.i(TAG, "Avc highest level " + Integer.toHexString(highestLevel));
+            int maxW = 0;
+            int maxH = 0;
+            int bitRate = 0;
+            int mbW = (w + 15) / 16; // size in macroblocks
+            int mbH = (h + 15) / 16;
+            int maxMacroblocksPerSecond = 0; // max decoding speed
+            switch(highestLevel) {
+            // Do not support Level 1 to 2.
+            case CodecProfileLevel.AVCLevel1:
+            case CodecProfileLevel.AVCLevel11:
+            case CodecProfileLevel.AVCLevel12:
+            case CodecProfileLevel.AVCLevel13:
+            case CodecProfileLevel.AVCLevel1b:
+            case CodecProfileLevel.AVCLevel2:
+                return null;
+            case CodecProfileLevel.AVCLevel21:
+                maxW = 352;
+                maxH = 576;
+                bitRate = 4000000;
+                maxMacroblocksPerSecond = 19800;
+                break;
+            case CodecProfileLevel.AVCLevel22:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 4000000;
+                maxMacroblocksPerSecond = 20250;
+                break;
+            case CodecProfileLevel.AVCLevel3:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 10000000;
+                maxMacroblocksPerSecond = 40500;
+                break;
+            case CodecProfileLevel.AVCLevel31:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 14000000;
+                maxMacroblocksPerSecond = 108000;
+                break;
+            case CodecProfileLevel.AVCLevel32:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 20000000;
+                maxMacroblocksPerSecond = 216000;
+                break;
+            case CodecProfileLevel.AVCLevel4:
+                maxW = 1920;
+                maxH = 1080;
+                bitRate = 20000000;
+                maxMacroblocksPerSecond = 245760;
+                break;
+            case CodecProfileLevel.AVCLevel41:
+                maxW = 1920;
+                maxH = 1080;
+                bitRate = 50000000;
+                maxMacroblocksPerSecond = 245760;
+                break;
+            case CodecProfileLevel.AVCLevel42:
+                maxW = 2048;
+                maxH = 1080;
+                bitRate = 50000000;
+                maxMacroblocksPerSecond = 522240;
+                break;
+            case CodecProfileLevel.AVCLevel5:
+                maxW = 3672;
+                maxH = 1536;
+                bitRate = 135000000;
+                maxMacroblocksPerSecond = 589824;
+                break;
+            case CodecProfileLevel.AVCLevel51:
+            default:
+                maxW = 4096;
+                maxH = 2304;
+                bitRate = 240000000;
+                maxMacroblocksPerSecond = 983040;
+                break;
+            }
+            if ((w > maxW) || (h > maxH)) {
+                Log.i(TAG, "Requested resolution (" + w + "," + h + ") exceeds (" +
+                        maxW + "," + maxH + ")");
+                return null;
+            }
+            info.mFps = maxMacroblocksPerSecond / mbH / mbW;
+            info.mBitRate = bitRate;
+            Log.i(TAG, "AVC Level " + Integer.toHexString(highestLevel) + " bit rate " + bitRate +
+                    " fps " + info.mFps);
+        }
+        return info;
+    }
+
+    /**
+     * Search for given codecName and returns CodecCapabilities if found
+     * @param codecName
+     * @param isEncoder true for encoder, false for decoder
+     * @return null if the codec is not supported
+     */
+    private static CodecCapabilities getCodecCapability(
+            String codecName, boolean isEncoder) {
+        int codecCount = MediaCodecList.getCodecCount();
+        for (int i = 0; i < codecCount; ++i) {
+            MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i);
+            String[] types = info.getSupportedTypes();
+            if (isEncoder != info.isEncoder()) {
+                continue;
+            }
+            for (int j = 0; j < types.length; ++j) {
+                if (types[j].compareTo(codecName) == 0) {
+                    CodecCapabilities cap = info.getCapabilitiesForType(types[j]);
+                    Log.i(TAG, "Use codec " + info.getName());
+                    return cap;
+                }
+            }
+        }
+        return null;
+    }
+
+    // for debugging
+    private static void printIntArray(String msg, int[] data) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(msg);
+        builder.append(":");
+        for (int e : data) {
+            builder.append(Integer.toHexString(e));
+            builder.append(",");
+        }
+        builder.deleteCharAt(builder.length() - 1);
+        Log.i(TAG, builder.toString());
+    }
+}
diff --git a/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
new file mode 100644
index 0000000..fe28a96
--- /dev/null
+++ b/suite/cts/deviceTests/videoperf/src/com/android/cts/videoperf/VideoEncoderDecoderTest.java
@@ -0,0 +1,615 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.videoperf;
+
+import android.graphics.Point;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaFormat;
+import android.util.Log;
+
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.Stat;
+
+import java.nio.ByteBuffer;
+import java.lang.System;
+import java.util.Random;
+import java.util.Vector;
+
+/**
+ * This tries to test video encoder / decoder performance by running encoding / decoding
+ * without displaying the raw data. To make things simpler, encoder is used to encode synthetic
+ * data and decoder is used to decode the encoded video. This approach does not work where
+ * there is only decoder. Performance index is total time taken for encoding and decoding
+ * the whole frames.
+ * To prevent sacrificing quality for faster encoding / decoding, randomly selected pixels are
+ * compared with the original image. As the pixel comparison can slow down the decoding process,
+ * only some randomly selected pixels are compared. As there can be only one performance index,
+ * error above certain threshold in pixel value will be treated as an error.
+ */
+public class VideoEncoderDecoderTest extends CtsAndroidTestCase {
+    private static final String TAG = "VideoEncoderDecoderTest";
+    // this wait time affects fps as too big value will work as a blocker if device fps
+    // is not very high.
+    private static final long VIDEO_CODEC_WAIT_TIME_US = 5000;
+    private static final boolean VERBOSE = false;
+    private static final String VIDEO_AVC = "video/avc";
+    private static final int TOTAL_FRAMES = 300;
+    private static final int NUMBER_OF_REPEAT = 10;
+    // i frame interval for encoder
+    private static final int KEY_I_FRAME_INTERVAL = 5;
+
+    private static final int Y_CLAMP_MIN = 16;
+    private static final int Y_CLAMP_MAX = 235;
+    private static final int YUV_PLANE_ADDITIONAL_LENGTH = 200;
+    private ByteBuffer mYBuffer;
+    private ByteBuffer mUVBuffer;
+    // if input raw data is semi-planar
+    private boolean mSrcSemiPlanar;
+    // if output raw data is semi-planar
+    private boolean mDstSemiPlanar;
+    private int mBufferWidth;
+    private int mBufferHeight;
+    private int mVideoWidth;
+    private int mVideoHeight;
+    private int mFrameRate;
+
+    private Vector<ByteBuffer> mEncodedOutputBuffer;
+    // check this many pixels per each decoded frame
+    // checking too many points decreases decoder frame rates a lot.
+    private static final int PIXEL_CHECK_PER_FRAME = 1000;
+    // RMS error in pixel values above this will be treated as error.
+    private static final double PIXEL_RMS_ERROR_MARGAIN = 20.0;
+    private Random mRandom;
+
+    @Override
+    protected void setUp() throws Exception {
+        mEncodedOutputBuffer = new Vector<ByteBuffer>(TOTAL_FRAMES * 2);
+        // Use time as a seed, hoping to prevent checking pixels in the same pattern
+        long now = System.currentTimeMillis();
+        mRandom = new Random(now);
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mEncodedOutputBuffer.clear();
+        mEncodedOutputBuffer = null;
+        mYBuffer = null;
+        mUVBuffer = null;
+        mRandom = null;
+        super.tearDown();
+    }
+
+    public void testAvc0176x0144() throws Exception {
+        doTest(VIDEO_AVC, 176, 144, NUMBER_OF_REPEAT);
+    }
+
+    public void testAvc0352x0288() throws Exception {
+        doTest(VIDEO_AVC, 352, 288, NUMBER_OF_REPEAT);
+    }
+
+    public void testAvc0720x0480() throws Exception {
+        doTest(VIDEO_AVC, 720, 480, NUMBER_OF_REPEAT);
+    }
+
+    public void testAvc1280x0720() throws Exception {
+        doTest(VIDEO_AVC, 1280, 720, NUMBER_OF_REPEAT);
+    }
+
+    /**
+     * resolution intentionally set to 1072 not 1080
+     * as 1080 is not multiple of 16, and it requires additional setting like stride
+     * which is not specified in API documentation.
+     */
+    public void testAvc1920x1072() throws Exception {
+        doTest(VIDEO_AVC, 1920, 1072, NUMBER_OF_REPEAT);
+    }
+
+    /**
+     * Run encoding / decoding test for given mimeType of codec
+     * @param mimeType like video/avc
+     * @param w video width
+     * @param h video height
+     * @param numberRepeat how many times to repeat the encoding / decoding process
+     */
+    private void doTest(String mimeType, int w, int h, int numberRepeat) throws Exception {
+        CodecInfo infoEnc = CodecInfo.getSupportedFormatInfo(mimeType, w, h, true);
+        if (infoEnc == null) {
+            Log.i(TAG, "Codec " + mimeType + "with " + w + "," + h + " not supported");
+            return;
+        }
+        CodecInfo infoDec = CodecInfo.getSupportedFormatInfo(mimeType, w, h, false);
+        assertNotNull(infoDec);
+        mVideoWidth = w;
+        mVideoHeight = h;
+        initYUVPlane(w + YUV_PLANE_ADDITIONAL_LENGTH, h + YUV_PLANE_ADDITIONAL_LENGTH,
+                infoEnc.mSupportSemiPlanar, infoDec.mSupportSemiPlanar);
+        double[] encoderFpsResults = new double[numberRepeat];
+        double[] decoderFpsResults = new double[numberRepeat];
+        double[] totalFpsResults = new double[numberRepeat];
+        double[] decoderRmsErrorResults = new double[numberRepeat];
+        boolean success = true;
+        for (int i = 0; i < numberRepeat && success; i++) {
+            MediaFormat format = new MediaFormat();
+            format.setString(MediaFormat.KEY_MIME, mimeType);
+            format.setInteger(MediaFormat.KEY_BIT_RATE, infoEnc.mBitRate);
+            format.setInteger(MediaFormat.KEY_WIDTH, w);
+            format.setInteger(MediaFormat.KEY_HEIGHT, h);
+            format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                    infoEnc.mSupportSemiPlanar ? CodecCapabilities.COLOR_FormatYUV420SemiPlanar :
+                        CodecCapabilities.COLOR_FormatYUV420Planar);
+            format.setInteger(MediaFormat.KEY_FRAME_RATE, infoEnc.mFps);
+            mFrameRate = infoEnc.mFps;
+            format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, KEY_I_FRAME_INTERVAL);
+            double encodingTime = runEncoder(VIDEO_AVC, format, TOTAL_FRAMES);
+            // re-initialize format for decoder
+            format = new MediaFormat();
+            format.setString(MediaFormat.KEY_MIME, mimeType);
+            format.setInteger(MediaFormat.KEY_WIDTH, w);
+            format.setInteger(MediaFormat.KEY_HEIGHT, h);
+            format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                    infoDec.mSupportSemiPlanar ? CodecCapabilities.COLOR_FormatYUV420SemiPlanar :
+                        CodecCapabilities.COLOR_FormatYUV420Planar);
+            double[] decoderResult = runDecoder(VIDEO_AVC, format);
+            if (decoderResult == null) {
+                success = false;
+            } else {
+                double decodingTime = decoderResult[0];
+                decoderRmsErrorResults[i] = decoderResult[1];
+                encoderFpsResults[i] = (double)TOTAL_FRAMES / encodingTime * 1000.0;
+                decoderFpsResults[i] = (double)TOTAL_FRAMES / decodingTime * 1000.0;
+                totalFpsResults[i] = (double)TOTAL_FRAMES / (encodingTime + decodingTime) * 1000.0;
+            }
+
+            // clear things for re-start
+            mEncodedOutputBuffer.clear();
+            // it will be good to clean everything to make every run the same.
+            System.gc();
+        }
+        getReportLog().printArray("encoder", encoderFpsResults, ResultType.HIGHER_BETTER,
+                ResultUnit.FPS);
+        getReportLog().printArray("rms error", decoderRmsErrorResults, ResultType.LOWER_BETTER,
+                ResultUnit.NONE);
+        getReportLog().printArray("decoder", decoderFpsResults, ResultType.HIGHER_BETTER,
+                ResultUnit.FPS);
+        getReportLog().printArray("encoder decoder", totalFpsResults, ResultType.HIGHER_BETTER,
+                ResultUnit.FPS);
+        getReportLog().printSummary("encoder decoder", Stat.getAverage(totalFpsResults),
+                ResultType.HIGHER_BETTER, ResultUnit.FPS);
+        // make sure that rms error is not too big.
+        for (int i = 0; i < numberRepeat; i++) {
+            assertTrue(decoderRmsErrorResults[i] < PIXEL_RMS_ERROR_MARGAIN);
+        }
+    }
+
+    /**
+     * run encoder benchmarking
+     * @param mimeType encoder type like video/avc
+     * @param format format of media to encode
+     * @param totalFrames total number of frames to encode
+     * @return time taken in ms to encode the frames. This does not include initialization time.
+     */
+    private double runEncoder(String mimeType, MediaFormat format, int totalFrames) {
+        MediaCodec codec = MediaCodec.createEncoderByType(mimeType);
+        try {
+            codec.configure(
+                    format,
+                    null /* surface */,
+                    null /* crypto */,
+                    MediaCodec.CONFIGURE_FLAG_ENCODE);
+        } catch (IllegalStateException e) {
+            Log.e(TAG, "codec '" + mimeType + "' failed configuration.");
+            assertTrue("codec '" + mimeType + "' failed configuration.", false);
+        }
+        codec.start();
+        ByteBuffer[] codecInputBuffers = codec.getInputBuffers();
+        ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers();
+
+        int numBytesSubmitted = 0;
+        int numBytesDequeued = 0;
+        int inFramesCount = 0;
+        long start = System.currentTimeMillis();
+        while (true) {
+            int index;
+
+            if (inFramesCount < totalFrames) {
+                index = codec.dequeueInputBuffer(VIDEO_CODEC_WAIT_TIME_US /* timeoutUs */);
+                if (index != MediaCodec.INFO_TRY_AGAIN_LATER) {
+                    int size = queueInputBufferEncoder(
+                            codec, codecInputBuffers, index, inFramesCount,
+                            (inFramesCount == (totalFrames - 1)) ?
+                                    MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                    inFramesCount++;
+                    numBytesSubmitted += size;
+                    if (VERBOSE) {
+                        Log.d(TAG, "queued " + size + " bytes of input data, frame " +
+                                (inFramesCount - 1));
+                    }
+
+                }
+            }
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+            index = codec.dequeueOutputBuffer(info, VIDEO_CODEC_WAIT_TIME_US /* timeoutUs */);
+            if (index == MediaCodec.INFO_TRY_AGAIN_LATER) {
+            } else if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+            } else if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                codecOutputBuffers = codec.getOutputBuffers();
+            } else if (index >= 0) {
+                dequeueOutputBufferEncoder(codec, codecOutputBuffers, index, info);
+                numBytesDequeued += info.size;
+                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                    if (VERBOSE) {
+                        Log.d(TAG, "dequeued output EOS.");
+                    }
+                    break;
+                }
+                if (VERBOSE) {
+                    Log.d(TAG, "dequeued " + info.size + " bytes of output data.");
+                }
+            }
+        }
+        long finish = System.currentTimeMillis();
+        if (VERBOSE) {
+            Log.d(TAG, "queued a total of " + numBytesSubmitted + "bytes, "
+                    + "dequeued " + numBytesDequeued + " bytes.");
+        }
+        codec.stop();
+        codec.release();
+        codec = null;
+        return (double)(finish - start);
+    }
+
+    /**
+     * Fills input buffer for encoder from YUV buffers.
+     * @return size of enqueued data.
+     */
+    private int queueInputBufferEncoder(
+            MediaCodec codec, ByteBuffer[] inputBuffers, int index, int frameCount, int flags) {
+        ByteBuffer buffer = inputBuffers[index];
+        buffer.clear();
+
+        Point origin = getOrigin(frameCount);
+        // Y color first
+        int srcOffsetY = origin.x + origin.y * mBufferWidth;
+        final byte[] yBuffer = mYBuffer.array();
+        for (int i = 0; i < mVideoHeight; i++) {
+            buffer.put(yBuffer, srcOffsetY, mVideoWidth);
+            srcOffsetY += mBufferWidth;
+        }
+        if (mSrcSemiPlanar) {
+            int srcOffsetU = origin.y / 2 * mBufferWidth + origin.x / 2 * 2;
+            final byte[] uvBuffer = mUVBuffer.array();
+            for (int i = 0; i < mVideoHeight / 2; i++) {
+                buffer.put(uvBuffer, srcOffsetU, mVideoWidth);
+                srcOffsetU += mBufferWidth;
+            }
+        } else {
+            int srcOffsetU = origin.y / 2 * mBufferWidth / 2 + origin.x / 2;
+            int srcOffsetV = srcOffsetU + mBufferWidth / 2 * mBufferHeight / 2;
+            final byte[] uvBuffer = mUVBuffer.array();
+            for (int i = 0; i < mVideoHeight /2; i++) { //U only
+                buffer.put(uvBuffer, srcOffsetU, mVideoWidth / 2);
+                srcOffsetU += mBufferWidth / 2;
+            }
+            for (int i = 0; i < mVideoHeight /2; i++) { //V only
+                buffer.put(uvBuffer, srcOffsetV, mVideoWidth / 2);
+                srcOffsetV += mBufferWidth / 2;
+            }
+        }
+        int size = mVideoHeight * mVideoWidth * 3 /2;
+        long ptsUsec = computePresentationTime(frameCount);
+
+        codec.queueInputBuffer(index, 0 /* offset */, size, ptsUsec /* timeUs */, flags);
+        if (VERBOSE && (frameCount == 0)) {
+            printByteArray("Y ", mYBuffer.array(), 0, 20);
+            printByteArray("UV ", mUVBuffer.array(), 0, 20);
+            printByteArray("UV ", mUVBuffer.array(), mBufferWidth * 60, 20);
+        }
+        return size;
+    }
+
+    /**
+     * Dequeue encoded data from output buffer and store for later usage.
+     */
+    private void dequeueOutputBufferEncoder(
+            MediaCodec codec, ByteBuffer[] outputBuffers,
+            int index, MediaCodec.BufferInfo info) {
+        ByteBuffer output = outputBuffers[index];
+        output.clear();
+        int l = info.size;
+        ByteBuffer copied = ByteBuffer.allocate(l);
+        output.get(copied.array(), 0, l);
+        mEncodedOutputBuffer.add(copied);
+        codec.releaseOutputBuffer(index, false /* render */);
+    }
+
+    /**
+     * run encoder benchmarking with encoded stream stored from encoding phase
+     * @param mimeType encoder type like video/avc
+     * @param format format of media to decode
+     * @return returns length-2 array with 0: time for decoding, 1 : rms error of pixels
+     */
+    private double[] runDecoder(String mimeType, MediaFormat format) {
+        MediaCodec codec = MediaCodec.createDecoderByType(mimeType);
+        codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
+        codec.start();
+        ByteBuffer[] codecInputBuffers = codec.getInputBuffers();
+        ByteBuffer[] codecOutputBuffers = codec.getOutputBuffers();
+
+        double totalErrorSquared = 0;
+
+        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+        boolean sawOutputEOS = false;
+        int inputLeft = mEncodedOutputBuffer.size();
+        int inputBufferCount = 0;
+        int outFrameCount = 0;
+        YUVValue expected = new YUVValue();
+        YUVValue decoded = new YUVValue();
+        long start = System.currentTimeMillis();
+        while (!sawOutputEOS) {
+            if (inputLeft > 0) {
+                int inputBufIndex = codec.dequeueInputBuffer(VIDEO_CODEC_WAIT_TIME_US);
+
+                if (inputBufIndex >= 0) {
+                    ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];
+                    dstBuf.clear();
+                    ByteBuffer src = mEncodedOutputBuffer.get(inputBufferCount);
+                    int writeSize = src.capacity();
+                    dstBuf.put(src.array(), 0, writeSize);
+                    codec.queueInputBuffer(
+                            inputBufIndex,
+                            0 /* offset */,
+                            writeSize,
+                            0,
+                            (inputLeft == 1) ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                    inputLeft --;
+                    inputBufferCount ++;
+                }
+            }
+
+            int res = codec.dequeueOutputBuffer(info, VIDEO_CODEC_WAIT_TIME_US);
+            if (res >= 0) {
+                int outputBufIndex = res;
+                ByteBuffer buf = codecOutputBuffers[outputBufIndex];
+                if (VERBOSE && (outFrameCount == 0)) {
+                    printByteBuffer("Y ", buf, 0, 20);
+                    printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight, 20);
+                    printByteBuffer("UV ", buf, mVideoWidth * mVideoHeight + mVideoWidth * 60, 20);
+                }
+                Point origin = getOrigin(outFrameCount);
+                for (int i = 0; i < PIXEL_CHECK_PER_FRAME; i++) {
+                    int w = mRandom.nextInt(mVideoWidth);
+                    int h = mRandom.nextInt(mVideoHeight);
+                    getPixelValuesFromYUVBuffers(origin.x, origin.y, w, h, expected);
+                    getPixelValuesFromOutputBuffer(buf, w, h, decoded);
+                    if (VERBOSE) {
+                        Log.i(TAG, outFrameCount + "-" + i + "- th round expcted " + expected.mY +
+                                "," + expected.mU + "," + expected.mV + "  decoded " + decoded.mY +
+                                "," + decoded.mU + "," + decoded.mV);
+                    }
+                    totalErrorSquared += expected.calcErrorSquared(decoded);
+                }
+                codec.releaseOutputBuffer(outputBufIndex, false /* render */);
+                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                    Log.d(TAG, "saw output EOS.");
+                    sawOutputEOS = true;
+                }
+                outFrameCount++;
+            } else if (res == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                codecOutputBuffers = codec.getOutputBuffers();
+                Log.d(TAG, "output buffers have changed.");
+            } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                MediaFormat oformat = codec.getOutputFormat();
+                Log.d(TAG, "output format has changed to " + oformat);
+                int colorFormat = oformat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
+                if (colorFormat == CodecCapabilities.COLOR_FormatYUV420SemiPlanar ) {
+                    mDstSemiPlanar = true;
+                } else if (colorFormat == CodecCapabilities.COLOR_FormatYUV420Planar ) {
+                    mDstSemiPlanar = false;
+                } else {
+                    Log.w(TAG, "output format changed to unsupported one " +
+                            Integer.toHexString(colorFormat));
+                    // give up and return as nothing can be done
+                    codec.release();
+                    return null;
+                }
+            }
+        }
+        long finish = System.currentTimeMillis();
+        codec.stop();
+        codec.release();
+        codec = null;
+        assertTrue(outFrameCount >= TOTAL_FRAMES);
+        // divide by 3 as sum is done for Y, U, V.
+        double errorRms = Math.sqrt(totalErrorSquared / PIXEL_CHECK_PER_FRAME / outFrameCount / 3);
+        double[] result = { (double) finish - start, errorRms };
+        return result;
+    }
+
+    /**
+     *  returns origin in the absolute frame for given frame count.
+     *  The video scene is moving by moving origin per each frame.
+     */
+    private Point getOrigin(int frameCount) {
+        if (frameCount < 100) {
+            return new Point(2 * frameCount, 0);
+        } else if (frameCount < 200) {
+            return new Point(200, (frameCount - 100) * 2);
+        } else {
+            if (frameCount > 300) { // for safety
+                frameCount = 300;
+            }
+            return new Point(600 - frameCount * 2, 600 - frameCount * 2);
+        }
+    }
+
+    /**
+     * initialize reference YUV plane
+     * @param w This should be YUV_PLANE_ADDITIONAL_LENGTH pixels bigger than video resolution
+     *          to allow movements
+     * @param h This should be YUV_PLANE_ADDITIONAL_LENGTH pixels bigger than video resolution
+     *          to allow movements
+     * @param semiPlanarEnc
+     * @param semiPlanarDec
+     */
+    private void initYUVPlane(int w, int h, boolean semiPlanarEnc, boolean semiPlanarDec) {
+        int bufferSizeY = w * h;
+        mYBuffer = ByteBuffer.allocate(bufferSizeY);
+        mUVBuffer = ByteBuffer.allocate(bufferSizeY / 2);
+        mSrcSemiPlanar = semiPlanarEnc;
+        mDstSemiPlanar = semiPlanarDec;
+        mBufferWidth = w;
+        mBufferHeight = h;
+        final byte[] yArray = mYBuffer.array();
+        final byte[] uvArray = mUVBuffer.array();
+        for (int i = 0; i < h; i++) {
+            for (int j = 0; j < w; j++) {
+                yArray[i * w + j]  = clampY((i + j) & 0xff);
+            }
+        }
+        if (semiPlanarEnc) {
+            for (int i = 0; i < h/2; i++) {
+                for (int j = 0; j < w/2; j++) {
+                    uvArray[i * w + 2 * j]  = (byte) (i & 0xff);
+                    uvArray[i * w + 2 * j + 1]  = (byte) (j & 0xff);
+                }
+            }
+        } else { // planar, U first, then V
+            int vOffset = bufferSizeY / 4;
+            for (int i = 0; i < h/2; i++) {
+                for (int j = 0; j < w/2; j++) {
+                    uvArray[i * w/2 + j]  = (byte) (i & 0xff);
+                    uvArray[i * w/2 + vOffset + j]  = (byte) (j & 0xff);
+                }
+            }
+        }
+    }
+
+    /**
+     * class to store pixel values in YUV
+     *
+     */
+    public class YUVValue {
+        public byte mY;
+        public byte mU;
+        public byte mV;
+        public YUVValue() {
+        }
+
+        public boolean equalTo(YUVValue other) {
+            return (mY == other.mY) && (mU == other.mU) && (mV == other.mV);
+        }
+
+        public double calcErrorSquared(YUVValue other) {
+            double yDelta = mY - other.mY;
+            double uDelta = mU - other.mU;
+            double vDelta = mV - other.mV;
+            return yDelta * yDelta + uDelta * uDelta + vDelta * vDelta;
+        }
+    }
+
+    /**
+     * Read YUV values from given position (x,y) for given origin (originX, originY)
+     * The whole data is already available from YBuffer and UVBuffer.
+     * @param result pass the result via this. This is for avoiding creating / destroying too many
+     *               instances
+     */
+    private void getPixelValuesFromYUVBuffers(int originX, int originY, int x, int y,
+            YUVValue result) {
+        result.mY = mYBuffer.get((originY + y) * mBufferWidth + (originX + x));
+        if (mSrcSemiPlanar) {
+            int index = (originY + y) / 2 * mBufferWidth + (originX + x) / 2 * 2;
+            //Log.d(TAG, "YUV " + originX + "," + originY + "," + x + "," + y + "," + index);
+            result.mU = mUVBuffer.get(index);
+            result.mV = mUVBuffer.get(index + 1);
+        } else {
+            int vOffset = mBufferWidth * mBufferHeight / 4;
+            int index = (originY + y) / 2 * mBufferWidth / 2 + (originX + x) / 2;
+            result.mU = mUVBuffer.get(index);
+            result.mV = mUVBuffer.get(vOffset + index);
+        }
+    }
+
+    /**
+     * Read YUV pixels from decoded output buffer for give (x, y) position
+     * Output buffer is composed of Y parts followed by U/V
+     * @param result pass the result via this. This is for avoiding creating / destroying too many
+     *               instances
+     */
+    private void getPixelValuesFromOutputBuffer(ByteBuffer buffer, int x, int y, YUVValue result) {
+        result.mY = buffer.get(y * mVideoWidth + x);
+        if (mDstSemiPlanar) {
+            int index = mVideoWidth * mVideoHeight + y / 2 * mVideoWidth + x / 2 * 2;
+            //Log.d(TAG, "Decoded " + x + "," + y + "," + index);
+            result.mU = buffer.get(index);
+            result.mV = buffer.get(index + 1);
+        } else {
+            int vOffset = mVideoWidth * mVideoHeight / 4;
+            int index = mVideoWidth * mVideoHeight + y / 2 * mVideoWidth / 2 + x / 2;
+            result.mU = buffer.get(index);
+            result.mV = buffer.get(index + vOffset);
+        }
+    }
+
+    /**
+     * Y cannot have full range. clamp it to prevent invalid value.
+     */
+    private byte clampY(int y) {
+        if (y < Y_CLAMP_MIN) {
+            y = Y_CLAMP_MIN;
+        } else if (y > Y_CLAMP_MAX) {
+            y = Y_CLAMP_MAX;
+        }
+        return (byte) (y & 0xff);
+    }
+
+    // for debugging
+    private void printByteArray(String msg, byte[] data, int offset, int len) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(msg);
+        builder.append(":");
+        for (int i = offset; i < offset + len; i++) {
+            builder.append(Integer.toHexString(data[i]));
+            builder.append(",");
+        }
+        builder.deleteCharAt(builder.length() - 1);
+        Log.i(TAG, builder.toString());
+    }
+
+    // for debugging
+    private void printByteBuffer(String msg, ByteBuffer data, int offset, int len) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(msg);
+        builder.append(":");
+        for (int i = offset; i < offset + len; i++) {
+            builder.append(Integer.toHexString(data.get(i)));
+            builder.append(",");
+        }
+        builder.deleteCharAt(builder.length() - 1);
+        Log.i(TAG, builder.toString());
+    }
+
+    /**
+     * Generates the presentation time for frame N, in microseconds.
+     */
+    private long computePresentationTime(int frameIndex) {
+        return 132 + frameIndex * 1000000L / mFrameRate;
+    }
+}
diff --git a/suite/cts/hostTests/Android.mk b/suite/cts/hostTests/Android.mk
new file mode 100644
index 0000000..c141484
--- /dev/null
+++ b/suite/cts/hostTests/Android.mk
@@ -0,0 +1,17 @@
+#
+# Copyright (C) 2012 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.
+#
+
+include $(call all-subdir-makefiles)
diff --git a/suite/cts/hostTests/jank/Android.mk b/suite/cts/hostTests/jank/Android.mk
new file mode 100644
index 0000000..a7d85de
--- /dev/null
+++ b/suite/cts/hostTests/jank/Android.mk
@@ -0,0 +1,43 @@
+# Copyright (C) 2013 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_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE := CtsHostJank
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+
+LOCAL_CTS_TEST_PACKAGE := com.android.cts.jank
+
+LOCAL_DEVICE_JAR_ := CtsDeviceJank
+cts_library_jar_ := $(CTS_TESTCASES_OUT)/$(LOCAL_DEVICE_JAR_).jar
+
+$(cts_library_jar_): $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_DEVICE_JAR_))/javalib.jar | $(ACP)
+	$(hide) mkdir -p $(CTS_TESTCASES_OUT)
+	$(hide) $(ACP) -fp $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_DEVICE_JAR_))/javalib.jar $@
+
+$(CTS_TESTCASES_OUT)/CtsHostJank.xml: $(cts_library_jar_)
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+# Build the library using its own makefile
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/suite/cts/hostTests/jank/app/Android.mk b/suite/cts/hostTests/jank/app/Android.mk
new file mode 100644
index 0000000..8f4fce6
--- /dev/null
+++ b/suite/cts/hostTests/jank/app/Android.mk
@@ -0,0 +1,28 @@
+# Copyright (C) 2013 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_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := CtsDeviceJank
+LOCAL_DEX_PREOPT := false
+
+LOCAL_JAVA_LIBRARIES := uiautomator.core
+
+LOCAL_STATIC_JAVA_LIBRARIES := com.android.uiautomator.platform.common
+
+include $(BUILD_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/CtsJankTestBase.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/CtsJankTestBase.java
new file mode 100644
index 0000000..6d5162b
--- /dev/null
+++ b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/CtsJankTestBase.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import com.android.uiautomator.platform.JankTestBase;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Scanner;
+
+public class CtsJankTestBase extends JankTestBase {
+    private final static String TAG = CtsJankTestBase.class.getName();
+    protected final static String START_CMD = "am start -W -a android.intent.action.MAIN -n %s";
+    protected final static String STOP_CMD = "am force-stop %s";
+    protected final static String INTENT_STRING_EXTRA = " --es %s %s";
+    protected final static String INTENT_BOOLEAN_EXTRA = " --ez %s %b";
+    protected final static String INTENT_INTEGER_EXTRA = " --ei %s %d";
+    protected static long SLEEP_TIME = 2000; // 2 seconds
+    protected static int NUM_ITERATIONS = 5;
+    protected static int TRACE_TIME = 5;
+
+    @Override
+    protected String getPropertyString(Bundle params, String key)
+            throws FileNotFoundException, IOException {
+        if (key.equals("iteration")) {
+            return NUM_ITERATIONS + "";
+        }
+        if (key.equals("tracetime")) {
+            return TRACE_TIME + "";
+        }
+        return super.getPropertyString(params, key);
+    }
+
+    protected void runShellCommand(String command) throws Exception {
+        Process p = null;
+        Scanner out = null;
+        Scanner err = null;
+        try {
+            p = Runtime.getRuntime().exec(command);
+
+            StringBuilder outStr = new StringBuilder();
+            StringBuilder errStr = new StringBuilder();
+            out = new Scanner(p.getInputStream());
+            err = new Scanner(p.getErrorStream());
+            boolean read = true;
+            while (read) {
+                if (out.hasNextLine()) {
+                    outStr.append(out.nextLine());
+                    outStr.append("\n");
+                } else if (err.hasNextLine()) {
+                    errStr.append(err.nextLine());
+                    errStr.append("\n");
+                } else {
+                    read = false;
+                }
+            }
+            Log.i(TAG, command);
+            if (outStr.length() > 0) {
+                Log.i(TAG, outStr.toString());
+            }
+            if (errStr.length() > 0) {
+                Log.e(TAG, errStr.toString());
+            }
+        } finally {
+            if (p != null) {
+                int status = p.waitFor();
+                if (status != 0) {
+                    throw new RuntimeException(
+                            String.format("Run shell command: %s, status: %s", command, status));
+                }
+                p.destroy();
+                p = null;
+            }
+            if (out != null) {
+                out.close();
+            }
+            if (err != null) {
+                err.close();
+            }
+        }
+    }
+}
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/opengl/CtsDeviceJankOpenGl.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/opengl/CtsDeviceJankOpenGl.java
new file mode 100755
index 0000000..5ba0613
--- /dev/null
+++ b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/opengl/CtsDeviceJankOpenGl.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank.opengl;
+
+import android.util.Log;
+
+import com.android.cts.jank.CtsJankTestBase;
+import com.android.uiautomator.platform.SurfaceFlingerHelper;
+
+public class CtsDeviceJankOpenGl extends CtsJankTestBase {
+    private final static String TAG = CtsDeviceJankOpenGl.class.getName();
+    private final static String PACKAGE = "com.android.cts.opengl";
+    private final static String COMPONENT =
+            PACKAGE + "/" + PACKAGE + ".primitive.GLPrimitiveActivity";
+    private static String APP_WINDOW_NAME = "SurfaceView";
+
+    /**
+     * Runs the full OpenGL ES 2.0 pipeline test.
+     */
+    public void testFullPipeline() throws Exception {
+        runBenchmark("FullPipeline");
+    }
+
+    /**
+     * Runs the pixel output test.
+     */
+    public void testPixelOutput() throws Exception {
+        runBenchmark("PixelOutput");
+    }
+
+    /**
+     * Runs the shader performance test.
+     */
+    public void testShaderPerf() throws Exception {
+        runBenchmark("ShaderPerf");
+    }
+
+    /**
+     * Runs the context switch overhead test.
+     */
+    public void testContextSwitch() throws Exception {
+        runBenchmark("ContextSwitch");
+    }
+
+    /**
+     * Runs the benchhmark for jank test.
+     */
+    public void runBenchmark(String benchmark) throws Exception {
+        // Start activity command
+        final StringBuilder sb = new StringBuilder();
+        sb.append(String.format(START_CMD, COMPONENT));
+        sb.append(String.format(INTENT_STRING_EXTRA, "benchmark_name", benchmark));
+        sb.append(String.format(INTENT_BOOLEAN_EXTRA, "offscreen", false));
+        sb.append(String.format(INTENT_INTEGER_EXTRA, "num_frames", 1000));
+        sb.append(String.format(INTENT_INTEGER_EXTRA, "num_iterations", 1));
+        sb.append(String.format(INTENT_INTEGER_EXTRA, "timeout", 10000));
+        final String startCommand = sb.toString();
+        final String stopCommand = String.format(STOP_CMD, PACKAGE);
+
+        Log.i(TAG, "Start command: " + startCommand);
+        Log.i(TAG, "Stop command: " + stopCommand);
+
+        setIteration(NUM_ITERATIONS);
+        for (int i = 0; i < NUM_ITERATIONS; i++) {
+            // Stop any existing instances
+            runShellCommand(stopCommand);
+            // Start activity
+            runShellCommand(startCommand);
+
+            // Wait for the activity to start
+            sleep(SLEEP_TIME / 2);
+
+            // Start systrace
+            startTrace(mTestCaseName, i);
+
+            // Clear SurfaceFlinger buffer
+            Log.i(TAG, "Clearing SurfaceFlinger buffer");
+            SurfaceFlingerHelper.clearBuffer(APP_WINDOW_NAME);
+
+            // This is where user interactions would go, in this case just sleep
+            sleep(SLEEP_TIME);
+
+            // Dump SurfaceFlinger buffer
+            Log.i(TAG, "Dumping SurfaceFlinger buffer");
+            boolean result = SurfaceFlingerHelper.dumpFrameLatency(APP_WINDOW_NAME, true);
+            assertTrue("SurfaceFlingerHelper could not get timestamps", result);
+
+            // Stop systrace
+            endTrace();
+
+            // Record results
+            recordResults(mTestCaseName, i);
+        }
+        // Save aggregated results
+        saveResults(mTestCaseName);
+        // Stop any remaining instances
+        runShellCommand(stopCommand);
+    }
+}
diff --git a/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
new file mode 100644
index 0000000..ea1f685
--- /dev/null
+++ b/suite/cts/hostTests/jank/app/src/com/android/cts/jank/ui/CtsDeviceJankUi.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank.ui;
+
+import android.util.Log;
+import android.widget.ListView;
+
+import com.android.cts.jank.CtsJankTestBase;
+import com.android.uiautomator.core.UiScrollable;
+import com.android.uiautomator.core.UiSelector;
+import com.android.uiautomator.platform.SurfaceFlingerHelper;
+
+public class CtsDeviceJankUi extends CtsJankTestBase {
+    private final static String TAG = CtsDeviceJankUi.class.getName();
+    private final static String PACKAGE = "com.android.cts.ui";
+    private final static String COMPONENT =
+            PACKAGE + "/" + PACKAGE + ".ScrollingActivity";
+    private final static int NUM_ELEMENTS = 1000;
+    private static String APP_WINDOW_NAME = COMPONENT;
+
+    // TODO(stuartscott): expand deviceTests/ui app to have a more complex UI
+    /**
+     * Runs the ScrollingActivity and measures jank during a scroll.
+     */
+    public void testScrolling() throws Exception {
+        // Start activity command
+        final StringBuilder sb = new StringBuilder();
+        sb.append(String.format(START_CMD, COMPONENT));
+        sb.append(String.format(INTENT_INTEGER_EXTRA, "num_elements", NUM_ELEMENTS));
+        final String startCommand = sb.toString();
+        final String stopCommand = String.format(STOP_CMD, PACKAGE);
+
+        Log.i(TAG, "Start command: " + startCommand);
+        Log.i(TAG, "Stop command: " + stopCommand);
+
+        setIteration(NUM_ITERATIONS);
+        for (int i = 0; i < NUM_ITERATIONS; i++) {
+            // Stop any existing instances
+            runShellCommand(stopCommand);
+            // Start activity
+            runShellCommand(startCommand);
+
+            // Wait for the activity to start
+            sleep(SLEEP_TIME / 2);
+
+            UiScrollable list = new UiScrollable(
+                    new UiSelector().className(ListView.class.getName()));
+
+            // Start systrace
+            startTrace(mTestCaseName, i);
+
+            // Clear SurfaceFlinger buffer
+            Log.i(TAG, "Clearing SurfaceFlinger buffer");
+            SurfaceFlingerHelper.clearBuffer(APP_WINDOW_NAME);
+
+            list.flingToEnd(2);
+
+            // Dump SurfaceFlinger buffer
+            Log.i(TAG, "Dumping SurfaceFlinger buffer");
+            boolean result = SurfaceFlingerHelper.dumpFrameLatency(APP_WINDOW_NAME, true);
+            assertTrue("SurfaceFlingerHelper could not get timestamps", result);
+
+            // Stop systrace
+            endTrace();
+
+            // Record results
+            recordResults(mTestCaseName, i);
+        }
+        // Save aggregated results
+        saveResults(mTestCaseName);
+        // Stop any remaining instances
+        runShellCommand(stopCommand);
+    }
+}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
new file mode 100644
index 0000000..f8c7ec1
--- /dev/null
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/CtsHostJankTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.ddmlib.IShellOutputReceiver;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Scanner;
+
+public class CtsHostJankTest extends DeviceTestCase implements IBuildReceiver {
+
+    private static final String TAG = CtsHostJankTest.class.getSimpleName();
+    private static final String DEVICE_LOCATION = "/data/local/tmp/";
+    private static final String RUN_UI_AUTOMATOR_CMD = "uiautomator runtest %s -c %s";
+    private final String mHostTestClass;
+    private final String mDeviceTestClass;
+    private final String mJarName;
+    private final String mJarPath;
+    protected ITestDevice mDevice;
+    protected CtsBuildHelper mBuild;
+
+    public CtsHostJankTest(String jarName, String deviceTestClass, String hostTestClass) {
+        this.mHostTestClass = hostTestClass;
+        this.mDeviceTestClass = deviceTestClass;
+        this.mJarName = jarName;
+        this.mJarPath = DEVICE_LOCATION + jarName;
+    }
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+        // Push jar to device.
+        File jarFile = mBuild.getTestApp(mJarName);
+        boolean result = mDevice.pushFile(jarFile, mJarPath);
+        assertTrue("Failed to push file to " + mJarPath, result);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Delete jar from device.
+        mDevice.executeShellCommand("rm " + mJarPath);
+        super.tearDown();
+    }
+
+    public void runUiAutomatorTest(String testName) throws Exception {
+        // Delete any existing result files
+        mDevice.executeShellCommand("rm -r " + DEVICE_LOCATION + "*.txt");
+
+        // Run ui automator test.
+        mDevice.executeShellCommand(
+                String.format(RUN_UI_AUTOMATOR_CMD, mJarName, mDeviceTestClass + "#" + testName),
+                new IShellOutputReceiver() {
+                    private StringBuilder sb = new StringBuilder();
+
+                    public void addOutput(byte[] data, int offset, int length) {
+                        byte[] raw = new byte[length];
+                        for (int i = 0; i < length; i++) {
+                            raw[i] = data[i + offset];
+                        }
+                        sb.append(new String(raw));
+                    }
+
+                    public void flush() {
+                        Log.logAndDisplay(LogLevel.INFO, TAG, sb.toString());
+                    }
+
+                    public boolean isCancelled() {
+                        return false;
+                    }
+                });
+
+        // Pull result file across
+        File result = mDevice.pullFile(DEVICE_LOCATION + "UiJankinessTestsOutput.txt");
+        assertNotNull("Couldn't get result file", result);
+        // Parse result file
+        Scanner in = new Scanner(result);
+        HashMap<String, Double> results = new HashMap<String, Double>(4);
+        while (in.hasNextLine()) {
+            String[] parts = in.nextLine().split(":");
+            if (parts.length == 2) {
+                results.put(parts[0], Double.parseDouble(parts[1]));
+            }
+        }
+        Log.logAndDisplay(LogLevel.INFO, TAG, "Results: " + results);
+        assertEquals("Could not parse the results file: ", 4, results.size());
+
+        double avgNumJanks = results.get("average number of jankiness");
+        double maxNumJanks = results.get("max number of jankiness");
+        double avgFrameRate = results.get("average frame rate");
+        double avgMaxAccFrames = results.get("average of max accumulated frames");
+
+        // Create and deliver the report.
+        HostReportLog report =
+                new HostReportLog(mDevice.getSerialNumber(), mHostTestClass + "#" + testName);
+        report.printValue(
+                "Average Frame Rate", avgFrameRate, ResultType.HIGHER_BETTER, ResultUnit.COUNT);
+        report.printValue("Average of Maximum Accumulated Frames", avgMaxAccFrames,
+                ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        report.printValue(
+                "Maximum Number of Janks", maxNumJanks, ResultType.LOWER_BETTER, ResultUnit.COUNT);
+        report.printSummary(
+                "Average Number of Janks", avgNumJanks, ResultType.LOWER_BETTER, ResultUnit.SCORE);
+        report.deliverReportToHost();
+    }
+
+}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
new file mode 100644
index 0000000..ebd5bfa
--- /dev/null
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/opengl/CtsHostJankOpenGl.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank.opengl;
+
+import com.android.cts.jank.CtsHostJankTest;
+
+import java.io.File;
+
+public class CtsHostJankOpenGl extends CtsHostJankTest {
+
+    private static final String APK_PACKAGE = "com.android.cts";
+    private static final String APK = "CtsDeviceOpenGl.apk";
+    private static final String PACKAGE = "com.android.cts.jank.opengl";
+    private static final String HOST_CLASS = CtsHostJankOpenGl.class.getName();
+    private static final String DEVICE_CLASS = PACKAGE + ".CtsDeviceJankOpenGl";
+    private static final String JAR_NAME = "CtsDeviceJank.jar";
+
+    public CtsHostJankOpenGl() {
+        super(JAR_NAME, DEVICE_CLASS, HOST_CLASS);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Install the app.
+        mDevice.uninstallPackage(APK_PACKAGE);
+        File app = mBuild.getTestApp(APK);
+        mDevice.installPackage(app, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Uninstall the app.
+        mDevice.uninstallPackage(APK_PACKAGE);
+        super.tearDown();
+    }
+
+    public void testFullPipeline() throws Exception {
+        runUiAutomatorTest("testFullPipeline");
+    }
+
+    public void testPixelOutput() throws Exception {
+        runUiAutomatorTest("testPixelOutput");
+    }
+
+    public void testShaderPerf() throws Exception {
+        runUiAutomatorTest("testShaderPerf");
+    }
+
+    public void testContextSwitch() throws Exception {
+        runUiAutomatorTest("testContextSwitch");
+    }
+}
diff --git a/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
new file mode 100644
index 0000000..3027899
--- /dev/null
+++ b/suite/cts/hostTests/jank/src/com/android/cts/jank/ui/CtsHostJankUi.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.jank.ui;
+
+import com.android.cts.jank.CtsHostJankTest;
+
+import java.io.File;
+
+public class CtsHostJankUi extends CtsHostJankTest {
+
+    private static final String APK_PACKAGE = "com.android.cts";
+    private static final String APK = "CtsDeviceUi.apk";
+    private static final String PACKAGE = "com.android.cts.jank.ui";
+    private static final String HOST_CLASS = CtsHostJankUi.class.getName();
+    private static final String DEVICE_CLASS = PACKAGE + ".CtsDeviceJankUi";
+    private static final String JAR_NAME = "CtsDeviceJank.jar";
+
+    public CtsHostJankUi() {
+        super(JAR_NAME, DEVICE_CLASS, HOST_CLASS);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Install the app.
+        mDevice.uninstallPackage(APK_PACKAGE);
+        File app = mBuild.getTestApp(APK);
+        mDevice.installPackage(app, false);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Uninstall the app.
+        mDevice.uninstallPackage(APK_PACKAGE);
+        super.tearDown();
+    }
+
+    public void testScrolling() throws Exception {
+        runUiAutomatorTest("testScrolling");
+    }
+}
diff --git a/suite/cts/hostTests/uihost/Android.mk b/suite/cts/hostTests/uihost/Android.mk
new file mode 100644
index 0000000..dd51b6b
--- /dev/null
+++ b/suite/cts/hostTests/uihost/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2012 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_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := CtsHostUi
+
+LOCAL_JAVA_LIBRARIES := cts-tradefed tradefed-prebuilt ddmlib-prebuilt junit
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+
+LOCAL_CTS_TEST_PACKAGE := com.android.cts.uihost
+
+include $(BUILD_CTS_HOST_JAVA_LIBRARY)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/suite/cts/hostTests/uihost/appA/Android.mk b/suite/cts/hostTests/uihost/appA/Android.mk
new file mode 100644
index 0000000..48d9009
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appA/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppA
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+
diff --git a/suite/cts/hostTests/uihost/appA/AndroidManifest.xml b/suite/cts/hostTests/uihost/appA/AndroidManifest.xml
new file mode 100644
index 0000000..b97325c
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appA/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.taskswitching.appa" >
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application>
+        <activity
+            android:name=".AppAActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
+            android:screenOrientation="portrait" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/suite/cts/hostTests/uihost/appA/src/com/android/cts/taskswitching/appa/AppAActivity.java b/suite/cts/hostTests/uihost/appA/src/com/android/cts/taskswitching/appa/AppAActivity.java
new file mode 100644
index 0000000..a4207a0
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appA/src/com/android/cts/taskswitching/appa/AppAActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.taskswitching.appa;
+
+
+import android.app.ListActivity;
+import android.content.Intent;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.WindowManager;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+/**
+ * Simple activity to notify completion via broadcast after onResume.
+ * This is for measuring taskswitching time between two apps.
+ */
+public class AppAActivity extends ListActivity {
+    static final String TAG = "AppAActivity";
+    private static final int NUMBER_ELEMENTS = 1000;
+    private static final String TASKSWITCHING_INTENT = "com.android.cts.taskswitching.appa";
+    private Handler mHandler;
+
+    private String[] mItems = new String[NUMBER_ELEMENTS];
+
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+        for (int i = 0; i < NUMBER_ELEMENTS; i++) {
+            mItems[i] = "A" + Integer.toString(i);
+        }
+        setListAdapter(new ArrayAdapter<String>(this,
+                android.R.layout.simple_list_item_1, mItems));
+        ListView view = getListView();
+        mHandler = new Handler();
+    }
+
+    public void onResume() {
+        super.onResume();
+        mHandler.post(new Runnable() {
+
+            @Override
+            public void run() {
+                Intent intent = new Intent(TASKSWITCHING_INTENT);
+                sendBroadcast(intent);
+            }
+        });
+    }
+}
diff --git a/suite/cts/hostTests/uihost/appB/Android.mk b/suite/cts/hostTests/uihost/appB/Android.mk
new file mode 100644
index 0000000..812637e
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appB/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingAppB
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
+
+
diff --git a/suite/cts/hostTests/uihost/appB/AndroidManifest.xml b/suite/cts/hostTests/uihost/appB/AndroidManifest.xml
new file mode 100644
index 0000000..b96afe5
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appB/AndroidManifest.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.taskswitching.appb">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application>
+        <activity
+            android:name=".AppBActivity"
+            android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
+            android:screenOrientation="portrait" >
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/suite/cts/hostTests/uihost/appB/src/com/android/cts/taskswitching/appb/AppBActivity.java b/suite/cts/hostTests/uihost/appB/src/com/android/cts/taskswitching/appb/AppBActivity.java
new file mode 100644
index 0000000..4df5e98
--- /dev/null
+++ b/suite/cts/hostTests/uihost/appB/src/com/android/cts/taskswitching/appb/AppBActivity.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.taskswitching.appb;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.WindowManager;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+/**
+ * Simple activity to notify completion via broadcast after onResume.
+ * This is for measuring taskswitching time between two apps.
+ */
+public class AppBActivity extends ListActivity {
+    static final String TAG = "AppBActivity";
+    private static final int NUMBER_ELEMENTS = 1000;
+    private static final String TASKSWITCHING_INTENT = "com.android.cts.taskswitching.appb";
+    private Handler mHandler;
+
+    private String[] mItems = new String[NUMBER_ELEMENTS];
+
+    public void onCreate(Bundle icicle)
+    {
+        super.onCreate(icicle);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+        for (int i = 0; i < NUMBER_ELEMENTS; i++) {
+            mItems[i] = "B" + Integer.toString(i);
+        }
+        setListAdapter(new ArrayAdapter<String>(this,
+                android.R.layout.simple_list_item_1, mItems));
+        ListView view = getListView();
+        mHandler = new Handler();
+    }
+
+    public void onResume()
+    {
+        super.onResume();
+        mHandler.post(new Runnable() {
+
+            @Override
+            public void run() {
+                Intent intent = new Intent(TASKSWITCHING_INTENT);
+                sendBroadcast(intent);
+            }
+        });
+    }
+}
diff --git a/suite/cts/hostTests/uihost/control/Android.mk b/suite/cts/hostTests/uihost/control/Android.mk
new file mode 100644
index 0000000..565e2c0
--- /dev/null
+++ b/suite/cts/hostTests/uihost/control/Android.mk
@@ -0,0 +1,33 @@
+# Copyright (C) 2012 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsDeviceTaskswitchingControl
+
+LOCAL_SDK_VERSION := 16
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/suite/cts/hostTests/uihost/control/AndroidManifest.xml b/suite/cts/hostTests/uihost/control/AndroidManifest.xml
new file mode 100644
index 0000000..9901d50
--- /dev/null
+++ b/suite/cts/hostTests/uihost/control/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.cts.taskswitching.control">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+    <instrumentation
+        android:targetPackage="com.android.cts.taskswitching.control"
+        android:name="android.test.InstrumentationCtsTestRunner" />
+</manifest>
diff --git a/suite/cts/hostTests/uihost/control/src/com/android/cts/taskswitching/control/TaskswitchingDeviceTest.java b/suite/cts/hostTests/uihost/control/src/com/android/cts/taskswitching/control/TaskswitchingDeviceTest.java
new file mode 100644
index 0000000..bdb3132
--- /dev/null
+++ b/suite/cts/hostTests/uihost/control/src/com/android/cts/taskswitching/control/TaskswitchingDeviceTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.taskswitching.control;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import android.cts.util.CtsAndroidTestCase;
+import com.android.cts.util.Stat;
+
+
+/**
+ * Device test which actually launches two apps sequentially and
+ * measure time for switching.
+ * Completion of launch is notified via broadcast.
+ */
+public class TaskswitchingDeviceTest extends CtsAndroidTestCase {
+    private static final String PKG_A = "com.android.cts.taskswitching.appa";
+    private static final String PKG_B = "com.android.cts.taskswitching.appb";
+    private static final String ACTIVITY_A = "AppAActivity";
+    private static final String ACTIVITY_B = "AppBActivity";
+    private static final long TASK_SWITCHING_WAIT_TIME = 5;
+    private final AppBroadcastReceiver mReceiverA = new AppBroadcastReceiver();
+    private final AppBroadcastReceiver mReceiverB = new AppBroadcastReceiver();
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        startActivity(PKG_A, ACTIVITY_A);
+        startActivity(PKG_B, ACTIVITY_B);
+        IntentFilter filterA = new IntentFilter();
+        filterA.addAction(PKG_A);
+        IntentFilter filterB = new IntentFilter();
+        filterB.addAction(PKG_B);
+        getContext().registerReceiver(mReceiverA, filterA);
+        getContext().registerReceiver(mReceiverB, filterB);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        getContext().unregisterReceiver(mReceiverA);
+        getContext().unregisterReceiver(mReceiverB);
+        super.tearDown();
+    }
+
+    public void testMeasureTaskSwitching() throws Exception {
+        final int NUMBER_REPEAT = 10;
+        final int SWITCHING_PER_ONE_TRY = 10;
+
+        double[] results = MeasureTime.measure(NUMBER_REPEAT, new MeasureRun() {
+
+            @Override
+            public void run(int i) throws Exception {
+                for (int j = 0; j < SWITCHING_PER_ONE_TRY; j++) {
+                    startActivity(PKG_A, ACTIVITY_A);
+                    assertTrue(mReceiverA.waitForBroadcast(TASK_SWITCHING_WAIT_TIME));
+                    startActivity(PKG_B, ACTIVITY_B);
+                    assertTrue(mReceiverB.waitForBroadcast(TASK_SWITCHING_WAIT_TIME));
+                }
+            }
+        });
+        getReportLog().printArray("taskswitching time", results, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        Stat.StatResult stat = Stat.getStat(results);
+        getReportLog().printSummary("taskswitching time", stat.mAverage,
+                ResultType.LOWER_BETTER, ResultUnit.MS);
+    }
+
+    private void startActivity(String packageName, String activityName) {
+        Context context = getContext();
+        Intent intent = new Intent();
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        intent.setComponent(new ComponentName(packageName, packageName + "." + activityName));
+        context.startActivity(intent);
+    }
+
+    class AppBroadcastReceiver extends BroadcastReceiver {
+        private final Semaphore mSemaphore = new Semaphore(0);
+
+        public boolean waitForBroadcast(long timeoutInSec) throws InterruptedException {
+            return mSemaphore.tryAcquire(timeoutInSec, TimeUnit.SECONDS);
+        }
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            mSemaphore.release();
+        }
+    }
+}
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
new file mode 100644
index 0000000..63c2d84
--- /dev/null
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/InstallTimeTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.uihost;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.Stat;
+import com.android.ddmlib.Log;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+
+
+/**
+ * Test to measure installation time of a APK.
+ */
+public class InstallTimeTest extends DeviceTestCase implements IBuildReceiver {
+    private CtsBuildHelper mBuild;
+    private ITestDevice mDevice;
+
+    private static final String TAG = "InstallTimeTest";
+    static final String PACKAGE = "com.replica.replicaisland";
+    static final String APK = "com.replica.replicaisland.apk";
+    private static final double OUTLIER_THRESHOLD = 0.1;
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+    }
+
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDevice.uninstallPackage(PACKAGE);
+        super.tearDown();
+    }
+
+    public void testInstallTime() throws Exception {
+        HostReportLog report =
+                new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+        final int NUMBER_REPEAT = 10;
+        final CtsBuildHelper build = mBuild;
+        final ITestDevice device = mDevice;
+        double[] result = MeasureTime.measure(NUMBER_REPEAT, new MeasureRun() {
+            @Override
+            public void prepare(int i) throws Exception {
+                device.uninstallPackage(PACKAGE);
+            }
+            @Override
+            public void run(int i) throws Exception {
+                File app = build.getTestApp(APK);
+                device.installPackage(app, false);
+            }
+        });
+        report.printArray("install time", result, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        Stat.StatResult stat = Stat.getStatWithOutlierRejection(result, OUTLIER_THRESHOLD);
+        if (stat.mDataCount != result.length) {
+            Log.w(TAG, "rejecting " + (result.length - stat.mDataCount) + " outliers");
+        }
+        report.printSummary("install time", stat.mAverage, ResultType.LOWER_BETTER,
+                ResultUnit.MS);
+        report.deliverReportToHost();
+    }
+
+}
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
new file mode 100644
index 0000000..0bfecdc
--- /dev/null
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.uihost;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.cts.tradefed.result.CtsReportUtil;
+import com.android.cts.tradefed.util.CtsHostStore;
+import com.android.cts.tradefed.util.HostReportLog;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.TimeoutReq;
+import com.android.ddmlib.Log;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.testrunner.RemoteAndroidTestRunner;
+import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.device.TestDeviceOptions;
+import com.android.tradefed.result.CollectingTestListener;
+import com.android.tradefed.result.TestResult;
+import com.android.tradefed.result.TestRunResult;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+
+import java.io.File;
+import java.util.Map;
+
+
+/**
+ * Measure time to taskswitching between two Apps: A & B
+ * Actual test is done in device, but this host side code installs all necessary APKs
+ * and starts device test which is in CtsDeviceTaskswitchingControl.
+ */
+public class TaskSwitchingTest extends DeviceTestCase implements IBuildReceiver {
+    private static final String TAG = "TaskSwitchingTest";
+    private final static String CTS_RUNNER = "android.test.InstrumentationCtsTestRunner";
+    private CtsBuildHelper mBuild;
+    private ITestDevice mDevice;
+    private String mCtsReport = null;
+
+    static final String[] PACKAGES = {
+        "com.android.cts.taskswitching.control",
+        "com.android.cts.taskswitching.appa",
+        "com.android.cts.taskswitching.appb"
+    };
+    static final String[] APKS = {
+        "CtsDeviceTaskswitchingControl.apk",
+        "CtsDeviceTaskswitchingAppA.apk",
+        "CtsDeviceTaskswitchingAppB.apk"
+    };
+
+    @Override
+    public void setBuild(IBuildInfo buildInfo) {
+        mBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mDevice = getDevice();
+        for (int i = 0; i < PACKAGES.length; i++) {
+            mDevice.uninstallPackage(PACKAGES[i]);
+            File app = mBuild.getTestApp(APKS[i]);
+            mDevice.installPackage(app, false);
+        }
+    }
+
+
+    @Override
+    protected void tearDown() throws Exception {
+        for (int i = 0; i < PACKAGES.length; i++) {
+            mDevice.uninstallPackage(PACKAGES[i]);
+        }
+        super.tearDown();
+    }
+
+    @TimeoutReq(minutes = 30)
+    public void testTaskswitching() throws Exception {
+        HostReportLog report =
+                new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
+        RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], CTS_RUNNER,
+                mDevice.getIDevice());
+        LocalListener listener = new LocalListener();
+        mDevice.runInstrumentationTests(testRunner, listener);
+        TestRunResult result = listener.getCurrentRunResults();
+        if (result.isRunFailure()) {
+            fail(result.getRunFailureMessage());
+        }
+        assertNotNull("no performance data", mCtsReport);
+        CtsHostStore.storeCtsResult(mDevice.getSerialNumber(),
+                ReportLog.getClassMethodNames(), mCtsReport);
+
+    }
+
+    public class LocalListener extends CollectingTestListener {
+        @Override
+        public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
+            // necessary as testMetrics passed from CollectingTestListerner is empty
+            mCtsReport = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
+            super.testEnded(test, testMetrics);
+        }
+    }
+}
diff --git a/suite/cts/utils/get_csv_report.py b/suite/cts/utils/get_csv_report.py
new file mode 100755
index 0000000..a1f5dd0
--- /dev/null
+++ b/suite/cts/utils/get_csv_report.py
@@ -0,0 +1,219 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013 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.
+
+import os
+import re
+import subprocess
+import sys
+from xml.dom import Node
+from xml.dom import minidom
+
+def getChildrenWithTag(parent, tagName):
+  children = []
+  for child in  parent.childNodes:
+    if (child.nodeType == Node.ELEMENT_NODE) and (child.tagName == tagName):
+      #print "parent " + parent.getAttribute("name") + " " + tagName +\
+      #  " " + child.getAttribute("name")
+      children.append(child)
+  return children
+
+def getText(tag):
+  return str(tag.firstChild.nodeValue)
+
+class TestCase(object):
+  def __init__(self, name, summary, details, result):
+    self.name = name
+    self.summary = summary
+    self.details = details
+    self.result = result
+
+  def getName(self):
+    return self.name
+
+  def getSummary(self):
+    return self.summary
+
+  def getDetails(self):
+    return self.details
+
+  def getResult(self):
+    return self.result
+
+def parseSuite(suite, parentName):
+  if parentName != "":
+    parentName += '.'
+  cases = {}
+  childSuites = getChildrenWithTag(suite, "TestSuite")
+  for child in childSuites:
+    cases.update(parseSuite(child, parentName + child.getAttribute("name")))
+  childTestCases = getChildrenWithTag(suite, "TestCase")
+  for child in childTestCases:
+    className = parentName + child.getAttribute("name")
+    for test in getChildrenWithTag(child, "Test"):
+      methodName = test.getAttribute("name")
+      # do not include this
+      if methodName == "testAndroidTestCaseSetupProperly":
+        continue
+      caseName = str(className + "#" + methodName)
+      result = str(test.getAttribute("result"))
+      summary = {}
+      details = {}
+      if result == "pass":
+        sts = getChildrenWithTag(test, "Summary")
+        dts = getChildrenWithTag(test, "Details")
+        if len(sts) == len(dts) == 1:
+          summary[sts[0].getAttribute("message")] = getText(sts[0])
+          for d in getChildrenWithTag(dts[0], "ValueArray"):
+            values = []
+            for c in getChildrenWithTag(d, "Value"):
+              values.append(getText(c))
+            details[d.getAttribute("message")] = values
+        else:
+          result = "no results"
+      testCase = TestCase(caseName, summary, details, result)
+      cases[caseName] = testCase
+  return cases
+
+
+class Result(object):
+  def __init__(self, reportXml):
+    self.results = {}
+    self.infoKeys = []
+    self.infoValues = []
+    doc = minidom.parse(reportXml)
+    testResult = doc.getElementsByTagName("TestResult")[0]
+    buildInfos = testResult.getElementsByTagName("BuildInfo")
+    if buildInfos != None and len(buildInfos) > 0:
+      buildInfo = buildInfos[0]
+      buildId = buildInfo.getAttribute("buildID")
+      deviceId = buildInfo.getAttribute("deviceID")
+      deviceName = buildInfo.getAttribute("build_device")
+      boardName = buildInfo.getAttribute("build_board")
+      partitions = buildInfo.getAttribute("partitions")
+      m = re.search(r'.*;/data\s+([\w\.]+)\s+([\w\.]+)\s+([\w\.]+)\s+([\w\.]+);', partitions)
+      dataPartitionSize = m.group(1)
+      self.addKV("device", deviceName)
+      self.addKV("board", boardName)
+      self.addKV("serial", deviceId)
+      self.addKV("build", buildId)
+      self.addKV("data size", dataPartitionSize)
+    packages = getChildrenWithTag(testResult, "TestPackage")
+    for package in packages:
+      casesFromChild = parseSuite(package, "")
+      self.results.update(casesFromChild)
+    #print self.results.keys()
+
+  def addKV(self, key, value):
+    self.infoKeys.append(key)
+    self.infoValues.append(value)
+
+  def getResults(self):
+    return self.results
+
+  def getKeys(self):
+    return self.infoKeys
+
+  def getValues(self):
+    return self.infoValues
+
+  def getDeviceName(self):
+    return self.getInfoV("device")
+
+  def getInfoV(self, key):
+    if key in self.infoKeys:
+      return self.infoValues[self.infoKeys.index(key)]
+    else:
+      return "unknown"
+
+def executeWithResult(command):
+  p = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+  out, err = p.communicate()
+  return out
+
+def parseReports(path):
+  deviceResults = []
+  xmls = executeWithResult("find " + path + " -name testResult.xml -print")
+  print "xml files found :"
+  print xmls
+  for xml in xmls.splitlines():
+    result = Result(xml)
+    deviceResults.append(result)
+  reportInfo = {}
+  keys = ["device", "board", "serial", "build", "data size"]
+  numDevices = len(deviceResults)
+  for i in xrange(len(keys)):
+    values = []
+    for j in xrange(numDevices):
+      values.append(str(deviceResults[j].getInfoV(keys[i])))
+    reportInfo[keys[i]] = values
+  #print reportInfo
+
+  tests = []
+  for deviceResult in deviceResults:
+    for key in deviceResult.getResults().keys():
+      if not key in tests:
+        tests.append(key)
+  #print tests
+
+  reportTests = {}
+  for i in xrange(len(tests)):
+    test = tests[i]
+    reportTests[test] = []
+    for j in xrange(numDevices):
+      values = {}
+      if deviceResults[j].getResults().has_key(test):
+        result = deviceResults[j].getResults()[test]
+        values["result"] = result.getResult()
+        values["summary"] = result.getSummary()
+        values["details"] = result.getDetails()
+        values["device"] = deviceResults[j].getDeviceName()
+      # even if report does not have test, put empty dict
+      # otherwise, there is no way to distinguish results from the same device
+      reportTests[test].append(values)
+  #print reportTests
+  return (reportInfo, reportTests)
+
+def main(argv):
+  if len(argv) < 3:
+    print "get_csv_report.py cts_report_dir output_file"
+    sys.exit(1)
+  reportPath = os.path.abspath(argv[1])
+  outputCsv = os.path.abspath(argv[2])
+
+  (reportInfo, reportTests) = parseReports(reportPath)
+
+  with open(outputCsv, 'w') as f:
+    for key in reportInfo:
+      f.write(key)
+      for value in reportInfo[key]:
+        f.write(',')
+        f.write(value)
+      f.write('\n')
+    sortedTest = sorted(reportTests)
+    for test in sortedTest:
+      f.write(test)
+      for report in reportTests[test]:
+        f.write(',')
+        if 'summary' in report:
+          summaryValues = report['summary'].values()
+          if len(summaryValues) > 0:
+            f.write(summaryValues[0])
+        # else: no data printed but just empty cell
+      # close a test with line
+      f.write('\n')
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/suite/cts/utils/grapher.py b/suite/cts/utils/grapher.py
new file mode 100755
index 0000000..d7de86e
--- /dev/null
+++ b/suite/cts/utils/grapher.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013 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.
+
+import os, sys
+import get_csv_report as psr
+import matplotlib.pyplot as plt
+import matplotlib.mlab as mlab
+import matplotlib.cbook as cbook
+import matplotlib.ticker as ticker
+"""
+A simple script to render the data from the benchmark as a graph.
+This uses MatPlotLib (http://matplotlib.org/) to plot which can be installed on linux with;
+  sudo apt-get install python-matplotlib
+"""
+
+colors = {
+  'maguro':'#FF0000',
+  'mako':'#00FF00',
+  'manta':'#0000FF',
+  'tilapia':'#00FFFF'
+}
+
+def main(argv):
+  if len(argv) != 2:
+    print "grapher.py cts_report_dir"
+    sys.exit(1)
+
+  (_, tests) = psr.parseReports(os.path.abspath(argv[1]))
+
+  # For each of the benchmarks
+  for benchmark in tests:
+    if benchmark.startswith('com.android.cts.opengl.primitive'):
+      results = tests[benchmark]
+      legend = []
+      # Create a new figure
+      fig = plt.figure()
+      # Set the title of the graph
+      plt.title(benchmark[benchmark.index('#') + 1:])
+      # For each result in the data set
+      for r in results:
+        score = r.get('result', 'no results')
+        x = []
+        y = []
+        if score == 'pass':
+          y = r['details']['Fps Values']
+          x = range(1, len(y) + 1)
+          # Get the score, then trim it to 2 decimal places
+          score = r['summary']['Average Frames Per Second']
+          score = score[0:score.index('.') + 3]
+        if score != 'no results':
+          # Create a plot
+          ax = fig.add_subplot(111)
+          name = r['device']
+          lbl = name + ' (%s)'%score
+          clr = colors.get(name, "#%06X" % (hash(name) % 0xFFFFFF))
+          # Plot the workload vs the values
+          ax.plot(x, y, 'o-', label=lbl, color=clr)
+          # Add a legend
+          ax.legend(loc='upper right').get_frame().set_fill(False)
+      (ymin, ymax) = plt.ylim()
+      if ymax < 90:# So that on screen tests are easier to compare
+        plt.ylim(0, 90)
+      plt.xlabel('Iteration')
+      plt.ylabel('FPS')
+      fig.autofmt_xdate()
+  # Show the plots
+  plt.show()
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/tests/Android.mk b/tests/Android.mk
index 4a87b07..a4cc38f 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -35,7 +35,7 @@
 
 LOCAL_PACKAGE_NAME := CtsTestStubs
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsutil ctstestserver ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestserver ctstestrunner
 
 LOCAL_DEX_PREOPT := false
 
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 6851d94..b65ded0 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -114,6 +114,9 @@
     <!-- Used for ClonedSecureRandomTest -->
     <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
 
+    <!-- Used for Transmit IR Test -->
+    <uses-permission android:name="android.permission.TRANSMIT_IR" />
+
     <!-- Used for PackageManager test, don't delete this permission-tree -->
     <permission-tree android:name="com.android.cts.stub.permission.TEST_DYNAMIC"
                     android:label="Test Tree"/>
@@ -684,6 +687,15 @@
             </intent-filter>
         </activity>
 
+        <activity android:name="android.webkit.cts.WebViewStartupStubActivity"
+            android:label="WebViewStartupStubActivity"
+            android:screenOrientation="nosensor">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+            </intent-filter>
+        </activity>
+
         <activity android:name="android.app.cts.ChildActivity"
                         android:label="ChildActivity" />
 
diff --git a/tests/ProcessTest/Android.mk b/tests/ProcessTest/Android.mk
index 4f23fac..a2958fe 100644
--- a/tests/ProcessTest/Android.mk
+++ b/tests/ProcessTest/Android.mk
@@ -29,6 +29,7 @@
 LOCAL_PACKAGE_NAME := ProcessTests
 
 LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
 
 include $(BUILD_PACKAGE)
 
diff --git a/tests/SignatureTest/Android.mk b/tests/SignatureTest/Android.mk
index 0b51f25..209e78a 100644
--- a/tests/SignatureTest/Android.mk
+++ b/tests/SignatureTest/Android.mk
@@ -17,10 +17,6 @@
 
 # don't include this package in any target
 LOCAL_MODULE_TAGS := optional
-# and when built explicitly put it in the data partition
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-# and because it is in data, do not strip classes.dex
-LOCAL_DEX_PREOPT := false
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
@@ -32,7 +28,6 @@
 
 # To be passed in on command line
 CTS_API_VERSION ?= current
-
 ifeq (current,$(CTS_API_VERSION))
 android_api_description := frameworks/base/api/$(CTS_API_VERSION).txt
 else
@@ -40,20 +35,22 @@
 endif
 
 # Can't call local-intermediates-dir directly here because we have to
-# include BUILD_PACAKGE first.  Can't include BUILD_PACKAGE first
+# include BUILD_CTS_PACKAGE first.  Can't include BUILD_CTS_PACKAGE first
 # because we have to override LOCAL_RESOURCE_DIR first.  Hence this
 # hack.
 intermediates.COMMON := $(call intermediates-dir-for,APPS,$(LOCAL_PACKAGE_NAME),,COMMON)
 signature_res_dir := $(intermediates.COMMON)/genres
 LOCAL_RESOURCE_DIR := $(signature_res_dir) $(LOCAL_PATH)/res
 
-include $(BUILD_PACKAGE)
+include $(BUILD_CTS_PACKAGE)
+
+$(info $(call local-intermediates-dir))
 
 generated_res_stamp := $(intermediates.COMMON)/genres.stamp
 api_ver_file := $(intermediates.COMMON)/api_ver_is_$(CTS_API_VERSION)
 
 # The api_ver_file keeps track of which api version was last built.
-# By only ever having one of these magic files in existance and making
+# By only ever having one of these magic files in existence and making
 # sure the generated resources rule depend on it, we can ensure that
 # the proper version of the api resource gets generated.
 $(api_ver_file):
@@ -89,6 +86,5 @@
 android_api_description :=
 CTS_API_VERSION :=
 
-
-# Use the folloing include to make our test apk.
+# Use the following include to make our test apk.
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/SignatureTest/AndroidManifest.xml b/tests/SignatureTest/AndroidManifest.xml
index 762dfae..b4813e6 100644
--- a/tests/SignatureTest/AndroidManifest.xml
+++ b/tests/SignatureTest/AndroidManifest.xml
@@ -16,30 +16,15 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.tests.sigtest">
-    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+          package="android.tests.sigtest">
+    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
 
     <application>
-        <uses-library android:name="android.test.runner" />
-
-        <activity android:name=".SignatureTestActivity"
-                android:stateNotNeeded="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
-        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="android.test.runner"/>
     </application>
 
-    <instrumentation android:name=".InstrumentationRunner"
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
                      android:targetPackage="android.tests.sigtest"
                      android:label="API Signature Test"/>
 
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="android.tests.sigtest"
-        android:label="Simple API Signature Test">
-    </instrumentation>
-
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/tests/SignatureTest/src/android/tests/sigtest/InstrumentationRunner.java b/tests/SignatureTest/src/android/tests/sigtest/InstrumentationRunner.java
deleted file mode 100644
index b196ade..0000000
--- a/tests/SignatureTest/src/android/tests/sigtest/InstrumentationRunner.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.tests.sigtest;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.os.Bundle;
-
-public class InstrumentationRunner extends Instrumentation {
-    @Override
-    public void onCreate(Bundle arguments) {
-        start();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void onStart() {
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setClassName(getTargetContext(),
-                "android.tests.sigtest.SignatureTestActivity");
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
-        SignatureTestActivity activity = (SignatureTestActivity) startActivitySync(intent);
-        waitForIdleSync();
-
-        finish(Activity.RESULT_OK, activity.mBundle);
-    }
-
-}
diff --git a/tests/SignatureTest/src/android/tests/sigtest/JDiffClassDescription.java b/tests/SignatureTest/src/android/tests/sigtest/JDiffClassDescription.java
index 9d95bb4..c51c6c3 100644
--- a/tests/SignatureTest/src/android/tests/sigtest/JDiffClassDescription.java
+++ b/tests/SignatureTest/src/android/tests/sigtest/JDiffClassDescription.java
@@ -16,6 +16,8 @@
 
 package android.tests.sigtest;
 
+import android.tests.sigtest.SignatureTest.FAILURE_TYPE;
+
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
@@ -81,7 +83,7 @@
      */
     public JDiffClassDescription(String pkg, String className) {
         this(pkg, className, new ResultObserver() {
-            public void notifyFailure(SignatureTestActivity.FAILURE_TYPE type,
+            public void notifyFailure(FAILURE_TYPE type,
                     String name,
                     String errorMessage) {
                 // This is a null result observer that doesn't do anything.
@@ -498,7 +500,7 @@
 
                 Method m = findMatchingMethod(method);
                 if (m == null) {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_METHOD,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISSING_METHOD,
                             method.toReadableString(mAbsoluteClassName),
                             "No method with correct signature found:" +
                             method.toSignatureString());
@@ -519,7 +521,7 @@
                     }
 
                     if (!areMethodModifiedCompatibile(method, m)) {
-                        mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_METHOD,
+                        mResultObserver.notifyFailure(FAILURE_TYPE.MISMATCH_METHOD,
                                 method.toReadableString(mAbsoluteClassName),
                                 "Non-compatible method found when looking for " +
                                 method.toSignatureString());
@@ -527,7 +529,7 @@
                 }
             } catch (Exception e) {
                 SignatureTestLog.e("Got exception when checking method compliance", e);
-                mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.CAUGHT_EXCEPTION,
+                mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION,
                         method.toReadableString(mAbsoluteClassName),
                 "Exception!");
             }
@@ -635,7 +637,7 @@
             try {
                 Constructor<?> c = findMatchingConstructor(con);
                 if (c == null) {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_METHOD,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISSING_METHOD,
                             con.toReadableString(mAbsoluteClassName),
                             "No method with correct signature found:" +
                             con.toSignatureString());
@@ -645,7 +647,7 @@
                     }
                     if (c.getModifiers() != con.mModifier) {
                         mResultObserver.notifyFailure(
-                                SignatureTestActivity.FAILURE_TYPE.MISMATCH_METHOD,
+                                FAILURE_TYPE.MISMATCH_METHOD,
                                 con.toReadableString(mAbsoluteClassName),
                                 "Non-compatible method found when looking for " +
                                 con.toSignatureString());
@@ -653,7 +655,7 @@
                 }
             } catch (Exception e) {
                 SignatureTestLog.e("Got exception when checking constructor compliance", e);
-                mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.CAUGHT_EXCEPTION,
+                mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION,
                         con.toReadableString(mAbsoluteClassName),
                 "Exception!");
             }
@@ -714,12 +716,12 @@
             try {
                 Field f = findMatchingField(field);
                 if (f == null) {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_FIELD,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISSING_FIELD,
                             field.toReadableString(mAbsoluteClassName),
                             "No field with correct signature found:" +
                             field.toSignatureString());
                 } else if (f.getModifiers() != field.mModifier) {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_FIELD,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISMATCH_FIELD,
                             field.toReadableString(mAbsoluteClassName),
                             "Non-compatible field modifiers found when looking for " +
                             field.toSignatureString());
@@ -733,7 +735,7 @@
                     }
                     if (genericTypeName == null || !genericTypeName.equals(field.mFieldType)) {
                         mResultObserver.notifyFailure(
-                                SignatureTestActivity.FAILURE_TYPE.MISMATCH_FIELD,
+                                FAILURE_TYPE.MISMATCH_FIELD,
                                 field.toReadableString(mAbsoluteClassName),
                                 "Non-compatible field type found when looking for " +
                                 field.toSignatureString());
@@ -742,7 +744,7 @@
 
             } catch (Exception e) {
                 SignatureTestLog.e("Got exception when checking field compliance", e);
-                mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.CAUGHT_EXCEPTION,
+                mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION,
                         field.toReadableString(mAbsoluteClassName),
                 "Exception!");
             }
@@ -883,11 +885,11 @@
             if (mClass == null) {
                 // No class found, notify the observer according to the class type
                 if (JDiffType.INTERFACE.equals(mClassType)) {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_INTERFACE,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISSING_INTERFACE,
                             mAbsoluteClassName,
                             "Classloader is unable to find " + mAbsoluteClassName);
                 } else {
-                    mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_CLASS,
+                    mResultObserver.notifyFailure(FAILURE_TYPE.MISSING_CLASS,
                             mAbsoluteClassName,
                             "Classloader is unable to find " + mAbsoluteClassName);
                 }
@@ -924,7 +926,7 @@
             }
         } catch (Exception e) {
             SignatureTestLog.e("Got exception when checking field compliance", e);
-            mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.CAUGHT_EXCEPTION,
+            mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION,
                     mAbsoluteClassName,
             "Exception!");
         }
@@ -977,11 +979,11 @@
 
     private void logMismatchInterfaceSignature(String classFullName, String errorMessage) {
         if (JDiffType.INTERFACE.equals(mClassType)) {
-            mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_INTERFACE,
+            mResultObserver.notifyFailure(FAILURE_TYPE.MISMATCH_INTERFACE,
                     classFullName,
                     errorMessage);
         } else {
-            mResultObserver.notifyFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_CLASS,
+            mResultObserver.notifyFailure(FAILURE_TYPE.MISMATCH_CLASS,
                     classFullName,
                     errorMessage);
         }
diff --git a/tests/SignatureTest/src/android/tests/sigtest/ResultObserver.java b/tests/SignatureTest/src/android/tests/sigtest/ResultObserver.java
index 72f1a97..e9d2260 100644
--- a/tests/SignatureTest/src/android/tests/sigtest/ResultObserver.java
+++ b/tests/SignatureTest/src/android/tests/sigtest/ResultObserver.java
@@ -16,6 +16,7 @@
 
 package android.tests.sigtest;
 
+import android.tests.sigtest.SignatureTest.FAILURE_TYPE;
 /**
  * Interface for saving signature test result.
  */
@@ -26,7 +27,7 @@
      * @param name Name of the failed element (interface/class/method/field)
      * @param errorMessage a descriptive message indicating why it failed.
      */
-    void notifyFailure(SignatureTestActivity.FAILURE_TYPE type,
+    void notifyFailure(FAILURE_TYPE type,
                        String name,
                        String errorMessage);
 
diff --git a/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java b/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
index 8001130..8ae02ac 100644
--- a/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
+++ b/tests/SignatureTest/src/android/tests/sigtest/SignatureTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2011 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.
@@ -16,6 +16,8 @@
 
 package android.tests.sigtest;
 
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
 import android.tests.sigtest.JDiffClassDescription.JDiffConstructor;
 import android.tests.sigtest.JDiffClassDescription.JDiffField;
 import android.tests.sigtest.JDiffClassDescription.JDiffMethod;
@@ -24,15 +26,17 @@
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 
 /**
- * Entry class for signature test.
+ * Performs the signature check via a JUnit test.
  */
-public class SignatureTest {
+public class SignatureTest extends AndroidTestCase {
+
     private static final String TAG_ROOT = "api";
     private static final String TAG_PACKAGE = "package";
     private static final String TAG_CLASS = "class";
@@ -64,22 +68,70 @@
     private static ArrayList<String> mDebugArray = new ArrayList<String>();
 
     private HashSet<String> mKeyTagSet;
+    private TestResultObserver mResultObserver;
 
-    private ArrayList<ResultObserver> mReportObserverList;
+    /**
+     * Define the type of the signature check failures.
+     */
+    public static enum FAILURE_TYPE {
+        MISSING_CLASS,
+        MISSING_INTERFACE,
+        MISSING_METHOD,
+        MISSING_FIELD,
+        MISMATCH_CLASS,
+        MISMATCH_INTERFACE,
+        MISMATCH_METHOD,
+        MISMATCH_FIELD,
+        CAUGHT_EXCEPTION,
+    }
 
-    private ResultObserver resultObserver;
+    private class TestResultObserver implements ResultObserver {
+        boolean mDidFail = false;
+        StringBuilder mErrorString = new StringBuilder();
 
-    public SignatureTest(ResultObserver resultObserver) {
-        this.resultObserver = resultObserver;
-        mReportObserverList = new ArrayList<ResultObserver>();
+        public void notifyFailure(FAILURE_TYPE type, String name, String errorMessage) {
+            mDidFail = true;
+            mErrorString.append("\n");
+            mErrorString.append(type.toString().toLowerCase());
+            mErrorString.append(":\t");
+            mErrorString.append(name);
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
         mKeyTagSet = new HashSet<String>();
         mKeyTagSet.addAll(Arrays.asList(new String[] {
                 TAG_PACKAGE, TAG_CLASS, TAG_INTERFACE, TAG_IMPLEMENTS, TAG_CONSTRUCTOR,
                 TAG_METHOD, TAG_PARAM, TAG_EXCEPTION, TAG_FIELD }));
+        mResultObserver = new TestResultObserver();
     }
 
-    public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException
-    {
+    /**
+     * Tests that the device's API matches the expected set defined in xml.
+     * <p/>
+     * Will check the entire API, and then report the complete list of failures
+     */
+    public void testSignature() {
+        Resources r = getContext().getResources();
+        Class rClass = R.xml.class;
+        Field[] fs = rClass.getFields();
+        for (Field f : fs) {
+            try {
+                start(r.getXml(f.getInt(rClass)));
+            } catch (Exception e) {
+                mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION, e.getMessage(),
+                        e.getMessage());
+            }
+        }
+        if (mResultObserver.mDidFail) {
+            fail(mResultObserver.mErrorString.toString());
+        }
+    }
+
+    private  void beginDocument(XmlPullParser parser, String firstElementName)
+            throws XmlPullParserException, IOException {
         int type;
         while ((type=parser.next()) != XmlPullParser.START_TAG
                    && type != XmlPullParser.END_DOCUMENT) { }
@@ -97,12 +149,12 @@
     /**
      * Signature test entry point.
      */
-    public void start(XmlPullParser parser) throws XmlPullParserException, IOException {
+    private void start(XmlPullParser parser) throws XmlPullParserException, IOException {
         JDiffClassDescription currentClass = null;
         String currentPackage = "";
         JDiffMethod currentMethod = null;
 
-        SignatureTest.beginDocument(parser, TAG_ROOT);
+        beginDocument(parser, TAG_ROOT);
         int type;
         while (true) {
             type = XmlPullParser.START_DOCUMENT;
@@ -160,22 +212,6 @@
         }
     }
 
-    public static void log(final String msg) {
-        mDebugArray.add(msg);
-    }
-
-    public void addReportObserver(ResultObserver observer) {
-        mReportObserverList.add(observer);
-    }
-
-    public void removeReportObserver(ResultObserver observer) {
-        mReportObserverList.remove(observer);
-    }
-
-    public void clearReportObserverList() {
-        mReportObserverList.clear();
-    }
-
     /**
      * Load field information from xml to memory.
      *
@@ -232,7 +268,7 @@
         String className = parser.getAttributeValue(null, ATTRIBUTE_NAME);
         JDiffClassDescription currentClass = new JDiffClassDescription(pkg,
                                                                        className,
-                                                                       resultObserver);
+                                                                       mResultObserver);
         currentClass.setModifier(jdiffModifierToReflectionFormat(className, parser));
         currentClass.setType(isInterface ? JDiffClassDescription.JDiffType.INTERFACE :
                              JDiffClassDescription.JDiffType.CLASS);
diff --git a/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java b/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java
deleted file mode 100644
index 9c81cef..0000000
--- a/tests/SignatureTest/src/android/tests/sigtest/SignatureTestActivity.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2008 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 android.tests.sigtest;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
-import android.os.Bundle;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-
-/**
- * This class is used for Signature Test. It will started by the Instrumentation class,
- * and send back the test result via IBinder.
- */
-public class SignatureTestActivity extends Activity {
-    static final String BUNDLE_EXTRA_SIG_TEST = "sigtest";
-
-    static final String BUNDLE_KEY_RESULT = "result";
-    static final String BUNDLE_KEY_MISSING_CLASS = "missing_class";
-    static final String BUNDLE_KEY_MISSING_INTERFACE = "missing_interface";
-    static final String BUNDLE_KEY_MISSING_METHOD = "missing_method";
-    static final String BUNDLE_KEY_MISSING_FIELD = "missing_field";
-    static final String BUNDLE_KEY_MISMATCH_CLASS = "mismatch_class_signature";
-    static final String BUNDLE_KEY_MISMATCH_INTERFACE = "mismatch_interface_signature";
-    static final String BUNDLE_KEY_MISMATCH_METHOD = "mismatch_method_signature";
-    static final String BUNDLE_KEY_MISMATCH_FIELD = "mismatch_field_signature";
-    static final String BUNDLE_KEY_CAUGHT_EXCEPTION = "caught_exception";
-
-
-    static final int GET_SIG_TEST_RESULT_TRANSACTION = 101;
-
-    private DeviceResultObserver mResultObserver;
-
-    /**
-     * Define the type of the signature check failures.
-     */
-    public static enum FAILURE_TYPE {
-        MISSING_CLASS,
-        MISSING_INTERFACE,
-        MISSING_METHOD,
-        MISSING_FIELD,
-        MISMATCH_CLASS,
-        MISMATCH_INTERFACE,
-        MISMATCH_METHOD,
-        MISMATCH_FIELD,
-        CAUGHT_EXCEPTION,
-    }
-
-    static final HashMap<FAILURE_TYPE, String> FAILURE_TYPE_TO_KEY =
-            new HashMap<FAILURE_TYPE, String>();
-    static {
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISSING_CLASS, BUNDLE_KEY_MISSING_CLASS);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISSING_INTERFACE, BUNDLE_KEY_MISSING_INTERFACE);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISSING_METHOD, BUNDLE_KEY_MISSING_METHOD);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISSING_FIELD, BUNDLE_KEY_MISSING_FIELD);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISMATCH_CLASS, BUNDLE_KEY_MISMATCH_CLASS);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISMATCH_INTERFACE, BUNDLE_KEY_MISMATCH_INTERFACE);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISMATCH_METHOD, BUNDLE_KEY_MISMATCH_METHOD);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.MISMATCH_FIELD, BUNDLE_KEY_MISMATCH_FIELD);
-        FAILURE_TYPE_TO_KEY.put(FAILURE_TYPE.CAUGHT_EXCEPTION, BUNDLE_KEY_CAUGHT_EXCEPTION);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mResultObserver = new DeviceResultObserver();
-        start();
-        mResultObserver.sendResult(getIntent());
-    }
-
-    /**
-     * Start the signature test.
-     */
-    @SuppressWarnings("unchecked")
-    private void start() {
-        SignatureTest sigTest = new SignatureTest(mResultObserver);
-
-        HashSet<String> excludeSet = getExcludedSet();
-
-        Resources r = getResources();
-
-        Class rClass = R.xml.class;
-        Field[]fs = rClass.getFields();
-        for (Field f : fs) {
-            if (!excludeSet.contains(f.getName())) {
-                try {
-                    sigTest.start(r.getXml(f.getInt(rClass)));
-                } catch (Exception e) {
-                    mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION, e.getMessage(),
-                            e.getMessage());
-                }
-            }
-        }
-    }
-
-    /**
-     * Get the excluded package set, which is defined by res/raw/excludepackages.txt.
-     *
-     * @return The excluded package set.
-     */
-    private HashSet<String> getExcludedSet() {
-        HashSet<String> excludeSet = new HashSet<String>();
-
-        Resources r = getResources();
-        InputStream excludepackage = r.openRawResource(R.raw.excludepackages);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(excludepackage));
-        try {
-            String p = null;
-            while (true) {
-                p = reader.readLine();
-                if (p == null || p.equals("")) {
-                    break;
-                }
-                excludeSet.add(p);
-            }
-            reader.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        return excludeSet;
-    }
-
-    Bundle mBundle;
-
-    /**
-     * This class is an implementation of the ResultObserver. And it aims to
-     * record the result in the Bundle, and send back to the Instrumentation class
-     * after all results has been recorded.
-     */
-    final class DeviceResultObserver implements ResultObserver {
-        DeviceResultObserver() {
-            mBundle = new Bundle();
-            mBundle.putStringArrayList(BUNDLE_KEY_MISSING_FIELD, new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISSING_METHOD, new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISMATCH_CLASS,
-                    new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISMATCH_FIELD,
-                    new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISMATCH_METHOD,
-                    new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISSING_CLASS, new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISSING_INTERFACE,
-                    new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_MISMATCH_INTERFACE,
-                    new ArrayList<String>());
-            mBundle.putStringArrayList(BUNDLE_KEY_CAUGHT_EXCEPTION,
-                    new ArrayList<String>());
-        }
-
-        /**
-         * This method is called when all the results has been recorded. And this method
-         * will save the results in IBinder and send back to the Instrumentation class.
-         *
-         * @param i The intent to carry the result.
-         */
-        @SuppressWarnings("deprecation")
-        public void sendResult(Intent i) {
-            SignatureTestLog.d("Send result");
-            if ((mBundle.getStringArrayList(BUNDLE_KEY_MISSING_FIELD).size() == 0)
-                    && (mBundle.getStringArrayList(BUNDLE_KEY_MISSING_CLASS).size() == 0)
-                    && (mBundle.getStringArrayList(BUNDLE_KEY_MISSING_METHOD).size() == 0)
-                    && (mBundle.getStringArrayList(BUNDLE_KEY_MISSING_INTERFACE).size() == 0)
-                    && (mBundle.getStringArrayList(
-                            BUNDLE_KEY_MISMATCH_CLASS).size() == 0)
-                    && (mBundle.getStringArrayList(
-                            BUNDLE_KEY_MISMATCH_FIELD).size() == 0)
-                    && (mBundle.getStringArrayList(
-                            BUNDLE_KEY_MISMATCH_INTERFACE).size() == 0)
-                    && (mBundle.getStringArrayList(
-                            BUNDLE_KEY_MISMATCH_METHOD).size() == 0)
-                    && (mBundle.getStringArrayList(
-                            BUNDLE_KEY_CAUGHT_EXCEPTION).size() == 0)) {
-                SignatureTestLog.d("PASS");
-                mBundle.putBoolean(BUNDLE_KEY_RESULT, true);
-            } else {
-                SignatureTestLog.d("FAIL: " + mBundle.size());
-                mBundle.putBoolean(BUNDLE_KEY_RESULT, false);
-            }
-        }
-
-        public void notifyFailure(FAILURE_TYPE type,
-                                  String name,
-                                  String errorMessage) {
-            SignatureTestLog.d("Failure: ");
-            SignatureTestLog.d("   Type: " + type);
-            SignatureTestLog.d("   Name: " + name);
-            SignatureTestLog.d("   Why : " + errorMessage);
-            mBundle.getStringArrayList(SignatureTestActivity.FAILURE_TYPE_TO_KEY.get(type))
-                    .add(name);
-        }
-    }
-}
diff --git a/tests/SignatureTest/src/android/tests/sigtest/SimpleSignatureTest.java b/tests/SignatureTest/src/android/tests/sigtest/SimpleSignatureTest.java
deleted file mode 100644
index c206c9a..0000000
--- a/tests/SignatureTest/src/android/tests/sigtest/SimpleSignatureTest.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2011 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 android.tests.sigtest;
-
-import android.content.res.Resources;
-import android.test.AndroidTestCase;
-import android.tests.sigtest.JDiffClassDescription.JDiffConstructor;
-import android.tests.sigtest.JDiffClassDescription.JDiffField;
-import android.tests.sigtest.JDiffClassDescription.JDiffMethod;
-import android.tests.sigtest.SignatureTestActivity.FAILURE_TYPE;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-
-/**
- * A simpler version of {@link SignatureTest} that performs the signature check via a JUnit test.
- * <p/>
- * Eventually the existing  {@link SignatureTest} and {@link SignatureActivity} will be deleted
- * once the move to a tradefederation based CTS harness is complete.
- */
-public class SimpleSignatureTest extends AndroidTestCase {
-
-    private static final String TAG_ROOT = "api";
-    private static final String TAG_PACKAGE = "package";
-    private static final String TAG_CLASS = "class";
-    private static final String TAG_INTERFACE = "interface";
-    private static final String TAG_IMPLEMENTS = "implements";
-    private static final String TAG_CONSTRUCTOR = "constructor";
-    private static final String TAG_METHOD = "method";
-    private static final String TAG_PARAM = "parameter";
-    private static final String TAG_EXCEPTION = "exception";
-    private static final String TAG_FIELD = "field";
-
-    private static final String MODIFIER_ABSTRACT = "abstract";
-    private static final String MODIFIER_FINAL = "final";
-    private static final String MODIFIER_NATIVE = "native";
-    private static final String MODIFIER_PRIVATE = "private";
-    private static final String MODIFIER_PROTECTED = "protected";
-    private static final String MODIFIER_PUBLIC = "public";
-    private static final String MODIFIER_STATIC = "static";
-    private static final String MODIFIER_SYNCHRONIZED = "synchronized";
-    private static final String MODIFIER_TRANSIENT = "transient";
-    private static final String MODIFIER_VOLATILE = "volatile";
-    private static final String MODIFIER_VISIBILITY = "visibility";
-
-    private static final String ATTRIBUTE_NAME = "name";
-    private static final String ATTRIBUTE_EXTENDS = "extends";
-    private static final String ATTRIBUTE_TYPE = "type";
-    private static final String ATTRIBUTE_RETURN = "return";
-
-    private static ArrayList<String> mDebugArray = new ArrayList<String>();
-
-    private HashSet<String> mKeyTagSet;
-    private TestResultObserver mResultObserver;
-
-    private class TestResultObserver implements ResultObserver {
-        boolean mDidFail = false;
-        StringBuilder mErrorString = new StringBuilder();
-
-        public void notifyFailure(FAILURE_TYPE type, String name, String errorMessage) {
-            mDidFail = true;
-            mErrorString.append("\n");
-            mErrorString.append(type.toString().toLowerCase());
-            mErrorString.append(":\t");
-            mErrorString.append(name);
-        }
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mKeyTagSet = new HashSet<String>();
-        mKeyTagSet.addAll(Arrays.asList(new String[] {
-                TAG_PACKAGE, TAG_CLASS, TAG_INTERFACE, TAG_IMPLEMENTS, TAG_CONSTRUCTOR,
-                TAG_METHOD, TAG_PARAM, TAG_EXCEPTION, TAG_FIELD }));
-        mResultObserver = new TestResultObserver();
-    }
-
-    /**
-     * Tests that the device's API matches the expected set defined in xml.
-     * <p/>
-     * Will check the entire API, and then report the complete list of failures
-     */
-    public void testSignature() {
-        Resources r = getContext().getResources();
-        Class rClass = R.xml.class;
-        Field[] fs = rClass.getFields();
-        for (Field f : fs) {
-            try {
-                start(r.getXml(f.getInt(rClass)));
-            } catch (Exception e) {
-                mResultObserver.notifyFailure(FAILURE_TYPE.CAUGHT_EXCEPTION, e.getMessage(),
-                        e.getMessage());
-            }
-        }
-        if (mResultObserver.mDidFail) {
-            fail(mResultObserver.mErrorString.toString());
-        }
-    }
-
-    private  void beginDocument(XmlPullParser parser, String firstElementName)
-            throws XmlPullParserException, IOException {
-        int type;
-        while ((type=parser.next()) != XmlPullParser.START_TAG
-                   && type != XmlPullParser.END_DOCUMENT) { }
-
-        if (type != XmlPullParser.START_TAG) {
-            throw new XmlPullParserException("No start tag found");
-        }
-
-        if (!parser.getName().equals(firstElementName)) {
-            throw new XmlPullParserException("Unexpected start tag: found " + parser.getName() +
-                    ", expected " + firstElementName);
-        }
-    }
-
-    /**
-     * Signature test entry point.
-     */
-    private void start(XmlPullParser parser) throws XmlPullParserException, IOException {
-        JDiffClassDescription currentClass = null;
-        String currentPackage = "";
-        JDiffMethod currentMethod = null;
-
-        beginDocument(parser, TAG_ROOT);
-        int type;
-        while (true) {
-            type = XmlPullParser.START_DOCUMENT;
-            while ((type=parser.next()) != XmlPullParser.START_TAG
-                       && type != XmlPullParser.END_DOCUMENT
-                       && type != XmlPullParser.END_TAG) {
-
-            }
-
-            if (type == XmlPullParser.END_TAG) {
-                if (TAG_CLASS.equals(parser.getName())
-                        || TAG_INTERFACE.equals(parser.getName())) {
-                    currentClass.checkSignatureCompliance();
-                } else if (TAG_PACKAGE.equals(parser.getName())) {
-                    currentPackage = "";
-                }
-                continue;
-            }
-
-            if (type == XmlPullParser.END_DOCUMENT) {
-                break;
-            }
-
-            String tagname = parser.getName();
-            if (!mKeyTagSet.contains(tagname)) {
-                continue;
-            }
-
-            if (type == XmlPullParser.START_TAG && tagname.equals(TAG_PACKAGE)) {
-                currentPackage = parser.getAttributeValue(null, ATTRIBUTE_NAME);
-            } else if (tagname.equals(TAG_CLASS)) {
-                currentClass = loadClassInfo(parser, false, currentPackage);
-            } else if (tagname.equals(TAG_INTERFACE)) {
-                currentClass = loadClassInfo(parser, true, currentPackage);
-            } else if (tagname.equals(TAG_IMPLEMENTS)) {
-                currentClass.addImplInterface(parser.getAttributeValue(null, ATTRIBUTE_NAME));
-            } else if (tagname.equals(TAG_CONSTRUCTOR)) {
-                JDiffConstructor constructor = loadConstructorInfo(parser, currentClass);
-                currentClass.addConstructor(constructor);
-                currentMethod = constructor;
-            } else if (tagname.equals(TAG_METHOD)) {
-                currentMethod = loadMethodInfo(currentClass.getClassName(), parser);
-                currentClass.addMethod(currentMethod);
-            } else if (tagname.equals(TAG_PARAM)) {
-                currentMethod.addParam(parser.getAttributeValue(null, ATTRIBUTE_TYPE));
-            } else if (tagname.equals(TAG_EXCEPTION)) {
-                currentMethod.addException(parser.getAttributeValue(null, ATTRIBUTE_TYPE));
-            } else if (tagname.equals(TAG_FIELD)) {
-                JDiffField field = loadFieldInfo(currentClass.getClassName(), parser);
-                currentClass.addField(field);
-            } else {
-                throw new RuntimeException(
-                        "unknow tag exception:" + tagname);
-            }
-        }
-    }
-
-    /**
-     * Load field information from xml to memory.
-     *
-     * @param className of the class being examined which will be shown in error messages
-     * @param parser The XmlPullParser which carries the xml information.
-     * @return the new field
-     */
-    private JDiffField loadFieldInfo(String className, XmlPullParser parser) {
-        String fieldName = parser.getAttributeValue(null, ATTRIBUTE_NAME);
-        String fieldType = parser.getAttributeValue(null, ATTRIBUTE_TYPE);
-        int modifier = jdiffModifierToReflectionFormat(className, parser);
-        return new JDiffField(fieldName, fieldType, modifier);
-    }
-
-    /**
-     * Load method information from xml to memory.
-     *
-     * @param className of the class being examined which will be shown in error messages
-     * @param parser The XmlPullParser which carries the xml information.
-     * @return the newly loaded method.
-     */
-    private JDiffMethod loadMethodInfo(String className, XmlPullParser parser) {
-        String methodName = parser.getAttributeValue(null, ATTRIBUTE_NAME);
-        String returnType = parser.getAttributeValue(null, ATTRIBUTE_RETURN);
-        int modifier = jdiffModifierToReflectionFormat(className, parser);
-        return new JDiffMethod(methodName, modifier, returnType);
-    }
-
-    /**
-     * Load constructor information from xml to memory.
-     *
-     * @param parser The XmlPullParser which carries the xml information.
-     * @param currentClass the current class being loaded.
-     * @return the new constructor
-     */
-    private JDiffConstructor loadConstructorInfo(XmlPullParser parser,
-                                                 JDiffClassDescription currentClass) {
-        String name = currentClass.getClassName();
-        int modifier = jdiffModifierToReflectionFormat(name, parser);
-        return new JDiffConstructor(name, modifier);
-    }
-
-    /**
-     * Load class or interface information to memory.
-     *
-     * @param parser The XmlPullParser which carries the xml information.
-     * @param isInterface true if the current class is an interface, otherwise is false.
-     * @param pkg the name of the java package this class can be found in.
-     * @return the new class description.
-     */
-    private JDiffClassDescription loadClassInfo(XmlPullParser parser,
-                                                boolean isInterface,
-                                                String pkg) {
-        String className = parser.getAttributeValue(null, ATTRIBUTE_NAME);
-        JDiffClassDescription currentClass = new JDiffClassDescription(pkg,
-                                                                       className,
-                                                                       mResultObserver);
-        currentClass.setModifier(jdiffModifierToReflectionFormat(className, parser));
-        currentClass.setType(isInterface ? JDiffClassDescription.JDiffType.INTERFACE :
-                             JDiffClassDescription.JDiffType.CLASS);
-        currentClass.setExtendsClass(parser.getAttributeValue(null, ATTRIBUTE_EXTENDS));
-        return currentClass;
-    }
-
-    /**
-     * Convert string modifier to int modifier.
-     *
-     * @param name of the class/method/field being examined which will be shown in error messages
-     * @param key modifier name
-     * @param value modifier value
-     * @return converted modifier value
-     */
-    private static int modifierDescriptionToReflectedType(String name, String key, String value) {
-        if (key.equals(MODIFIER_ABSTRACT)) {
-            return value.equals("true") ? Modifier.ABSTRACT : 0;
-        } else if (key.equals(MODIFIER_FINAL)) {
-            return value.equals("true") ? Modifier.FINAL : 0;
-        } else if (key.equals(MODIFIER_NATIVE)) {
-            return value.equals("true") ? Modifier.NATIVE : 0;
-        } else if (key.equals(MODIFIER_STATIC)) {
-            return value.equals("true") ? Modifier.STATIC : 0;
-        } else if (key.equals(MODIFIER_SYNCHRONIZED)) {
-            return value.equals("true") ? Modifier.SYNCHRONIZED : 0;
-        } else if (key.equals(MODIFIER_TRANSIENT)) {
-            return value.equals("true") ? Modifier.TRANSIENT : 0;
-        } else if (key.equals(MODIFIER_VOLATILE)) {
-            return value.equals("true") ? Modifier.VOLATILE : 0;
-        } else if (key.equals(MODIFIER_VISIBILITY)) {
-            if (value.equals(MODIFIER_PRIVATE)) {
-                throw new RuntimeException("Private visibility found in API spec: " + name);
-            } else if (value.equals(MODIFIER_PROTECTED)) {
-                return Modifier.PROTECTED;
-            } else if (value.equals(MODIFIER_PUBLIC)) {
-                return Modifier.PUBLIC;
-            } else if ("".equals(value)) {
-                // If the visibility is "", it means it has no modifier.
-                // which is package private. We should return 0 for this modifier.
-                return 0;
-            } else {
-                throw new RuntimeException("Unknown modifier found in API spec: " + value);
-            }
-        }
-        return 0;
-    }
-
-    /**
-     * Transfer string modifier to int one.
-     *
-     * @param name of the class/method/field being examined which will be shown in error messages
-     * @param parser XML resource parser
-     * @return converted modifier
-     */
-    private static int jdiffModifierToReflectionFormat(String name, XmlPullParser parser){
-        int modifier = 0;
-        for (int i = 0;i < parser.getAttributeCount();i++) {
-            modifier |= modifierDescriptionToReflectedType(name, parser.getAttributeName(i),
-                    parser.getAttributeValue(i));
-        }
-        return modifier;
-    }
-}
diff --git a/tests/SignatureTest/tests/AndroidManifest.xml b/tests/SignatureTest/tests/AndroidManifest.xml
index b1161f9..ab8a6d6 100644
--- a/tests/SignatureTest/tests/AndroidManifest.xml
+++ b/tests/SignatureTest/tests/AndroidManifest.xml
@@ -14,15 +14,14 @@
      limitations under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.tests.sigtest.tests">
+          package="android.tests.sigtest.tests">
 
     <application>
-        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="android.test.runner"/>
     </application>
 
     <instrumentation android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="android.tests.sigtest"
-        android:label="SignatureTest Functional Testset">
-    </instrumentation>
+                     android:targetPackage="android.tests.sigtest"
+                     android:label="SignatureTest Functional Testset"/>
 
 </manifest>
diff --git a/tests/SignatureTest/tests/src/android/tests/sigtest/tests/JDiffClassDescriptionTest.java b/tests/SignatureTest/tests/src/android/tests/sigtest/tests/JDiffClassDescriptionTest.java
index f8798d0..b5bf49e 100644
--- a/tests/SignatureTest/tests/src/android/tests/sigtest/tests/JDiffClassDescriptionTest.java
+++ b/tests/SignatureTest/tests/src/android/tests/sigtest/tests/JDiffClassDescriptionTest.java
@@ -19,7 +19,7 @@
 import android.test.InstrumentationTestCase;
 import android.tests.sigtest.JDiffClassDescription;
 import android.tests.sigtest.ResultObserver;
-import android.tests.sigtest.SignatureTestActivity;
+import android.tests.sigtest.SignatureTest.FAILURE_TYPE;
 
 import java.lang.reflect.Modifier;
 
@@ -28,20 +28,20 @@
  */
 public class JDiffClassDescriptionTest extends InstrumentationTestCase {
     private class NoFailures implements ResultObserver {
-        public void notifyFailure(SignatureTestActivity.FAILURE_TYPE type, String name, String errmsg) {
+        public void notifyFailure(FAILURE_TYPE type, String name, String errmsg) {
             JDiffClassDescriptionTest.this.fail("Saw unexpected test failure: " + name + " failure type: " + type);
         }
     }
 
     private class ExpectFailure implements ResultObserver {
-        private SignatureTestActivity.FAILURE_TYPE expectedType;
+        private FAILURE_TYPE expectedType;
         private boolean failureSeen;
 
-        public ExpectFailure(SignatureTestActivity.FAILURE_TYPE expectedType) {
+        public ExpectFailure(FAILURE_TYPE expectedType) {
             this.expectedType = expectedType;
         }
 
-        public void notifyFailure(SignatureTestActivity.FAILURE_TYPE type, String name, String errMsg) {
+        public void notifyFailure(FAILURE_TYPE type, String name, String errMsg) {
             if (type == expectedType) {
                 if (failureSeen) {
                     JDiffClassDescriptionTest.this.fail("Saw second test failure: " + name + " failure type: " + type);
@@ -88,7 +88,7 @@
     }
 
     public void testMissingClass() {
-        ExpectFailure observer = new ExpectFailure(SignatureTestActivity.FAILURE_TYPE.MISSING_CLASS);
+        ExpectFailure observer = new ExpectFailure(FAILURE_TYPE.MISSING_CLASS);
         JDiffClassDescription clz = new JDiffClassDescription("android.tests.sigtest.tests.data",
                 "NoSuchClass",
                 observer);
@@ -280,7 +280,7 @@
     /** Test the case where the API declares the method not
      *  synchronized, but it actually is. */
     public void testAddingSync() {
-        ExpectFailure observer = new ExpectFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_METHOD);      
+        ExpectFailure observer = new ExpectFailure(FAILURE_TYPE.MISMATCH_METHOD);
         JDiffClassDescription clz = createNormalClass(observer);
         JDiffClassDescription.JDiffMethod method = new JDiffClassDescription.JDiffMethod("syncMethod", Modifier.PUBLIC, "void");
         clz.addMethod(method);
@@ -333,7 +333,7 @@
      * http://b/1839622
      */
     public void testAddingAbstractToAClass() {
-        ExpectFailure observer = new ExpectFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_CLASS);
+        ExpectFailure observer = new ExpectFailure(FAILURE_TYPE.MISMATCH_CLASS);
         JDiffClassDescription clz = new JDiffClassDescription("android.tests.sigtest.tests.data",
                 "AbstractClass", 
                 observer);
@@ -380,7 +380,7 @@
      * http://b/1839589
      */  
     public void testAddingFinalToAMethodInANonFinalClass() {
-        ExpectFailure observer = new ExpectFailure(SignatureTestActivity.FAILURE_TYPE.MISMATCH_METHOD);
+        ExpectFailure observer = new ExpectFailure(FAILURE_TYPE.MISMATCH_METHOD);
         JDiffClassDescription clz = new JDiffClassDescription("android.tests.sigtest.tests.data", 
                 "NormalClass", 
                 observer);
diff --git a/tests/acceleration/Android.mk b/tests/acceleration/Android.mk
index bb6b89f..ef96a24 100644
--- a/tests/acceleration/Android.mk
+++ b/tests/acceleration/Android.mk
@@ -22,6 +22,8 @@
 
 LOCAL_DEX_PREOPT := false
 
+LOCAL_PROGUARD_ENABLED := disabled
+
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
diff --git a/tests/assets/webkit/blank_tag.html b/tests/assets/webkit/blank_tag.html
new file mode 100644
index 0000000..628ff28
--- /dev/null
+++ b/tests/assets/webkit/blank_tag.html
@@ -0,0 +1,24 @@
+<!-- Copyright (C) 2013 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.
+-->
+
+<html>
+  <body>
+    <div>
+      <a href="test_hello_world.html" target="_blank" id="link">_blank anchor tag</a><br>
+    </div>
+    <iframe src="iframe_blank_tag.html"></iframe>
+  </body>
+</html>
+
diff --git a/tests/assets/webkit/iframe_blank_tag.html b/tests/assets/webkit/iframe_blank_tag.html
new file mode 100644
index 0000000..55ff410
--- /dev/null
+++ b/tests/assets/webkit/iframe_blank_tag.html
@@ -0,0 +1,22 @@
+<!-- Copyright (C) 2013 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.
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+  <script type='text/javascript'> window.open('test_hello_world.html'); </script>
+</head>
+</html>
+
diff --git a/tests/core/libcore/conscrypt/Android.mk b/tests/core/libcore/conscrypt/Android.mk
new file mode 100644
index 0000000..bcfd3a4
--- /dev/null
+++ b/tests/core/libcore/conscrypt/Android.mk
@@ -0,0 +1,24 @@
+# Copyright (C) 2009 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)
+
+ifeq ($(BUILD_CTSCORE_PACKAGE),)
+    $(error BUILD_CTSCORE_PACKAGE must be defined)
+endif
+
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := android.core.tests.libcore.package.conscrypt
+LOCAL_STATIC_JAVA_LIBRARIES := core-tests conscrypt-tests
+include $(BUILD_CTSCORE_PACKAGE)
diff --git a/tests/core/libcore/conscrypt/AndroidManifest.xml b/tests/core/libcore/conscrypt/AndroidManifest.xml
new file mode 100644
index 0000000..6517a0b
--- /dev/null
+++ b/tests/core/libcore/conscrypt/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2007 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.core.tests.libcore.package.conscrypt">
+    <uses-permission android:name="android.permission.INTERNET" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="android.core.tests.runner"
+                     android:label="cts framework tests"/>
+
+</manifest>
diff --git a/tests/deviceadmin/Android.mk b/tests/deviceadmin/Android.mk
index c354599..bcc23fc 100644
--- a/tests/deviceadmin/Android.mk
+++ b/tests/deviceadmin/Android.mk
@@ -20,7 +20,7 @@
 
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner guava
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/deviceadmin/src/android/deviceadmin/cts/CtsDeviceAdminActivationTestActivity.java b/tests/deviceadmin/src/android/deviceadmin/cts/CtsDeviceAdminActivationTestActivity.java
index a8c5051..1779ec8 100644
--- a/tests/deviceadmin/src/android/deviceadmin/cts/CtsDeviceAdminActivationTestActivity.java
+++ b/tests/deviceadmin/src/android/deviceadmin/cts/CtsDeviceAdminActivationTestActivity.java
@@ -21,6 +21,8 @@
 import android.os.Bundle;
 import android.view.WindowManager;
 
+import com.google.common.annotations.VisibleForTesting;
+
 /**
  * Helper {@link Activity} for CTS tests of Device Admin activation. The {@code Activity}
  * enables tests to capture the invocations of its {@link #onActivityResult(int, int, Intent)} by
@@ -45,6 +47,7 @@
                 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     }
 
+    @VisibleForTesting
     public void setOnActivityResultListener(OnActivityResultListener listener) {
         mOnActivityResultListener = listener;
     }
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 1992b11..cd7f2d1 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -2,5 +2,36 @@
 {
   name: "android.openglperf.cts.GlVboPerfTest#testVboWithVaryingIndexBufferNumbers",
   bug: 6950385
+},
+{
+  name: "android.holo.cts.HoloTest",
+  bug: 8148617
+},
+{
+  name: "android.holo.cts.HoloHostTest",
+  bug: 15343612
+},
+{
+  name: "android.nativeopengl.EGLCleanupTest#TestCorrect",
+  name: "android.nativeopengl.EGLCreateContextTest#BadAttributeFails",
+  bug: 11652564
+},
+{
+  name: "android.hardware.camera2.cts.ImageReaderTest",
+  name: "android.hardware.camera2.cts.CameraCharacteristicsTest",
+  name: "android.hardware.camera2.cts.CameraCaptureResultTest",
+  name: "android.hardware.camera2.cts.CameraDeviceTest",
+  name: "android.hardware.camera2.cts.CameraManagerTest",
+  bug: 11141002
+},
+{
+  name: "com.android.cts.opengl.primitive.GLPrimitiveBenchmark#testFullPipelineOffscreen",
+  name: "com.android.cts.opengl.primitive.GLPrimitiveBenchmark#testPixelOutputOffscreen",
+  bug: 11238219
+},
+{
+  name: "android.hardware.cts.SensorIntegrationTests#testSensorsWithSeveralClients",
+  name: "android.hardware.cts.SensorIntegrationTests#testSensorsMovingRates",
+  bug: 11352697
 }
 ]
diff --git a/tests/plans/CTS-flaky.xml b/tests/plans/CTS-flaky.xml
index 1c2c30d..c0d74ce 100644
--- a/tests/plans/CTS-flaky.xml
+++ b/tests/plans/CTS-flaky.xml
@@ -1,8 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <TestPlan version="1.0">
-  <Entry uri="android.app" exclude="android.app.backup.cts.BackupAgentHelperTest#testAndroidtestCaseSetupProperly;android.app.backup.cts.BackupAgentHelperTest#testBackupAGentHelper;android.app.backup.cts.BackupAgentTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentTest#testBackupAgent;android.app.backup.cts.BackupManagerTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupManagerTest#testBackupManager;android.app.backup"/>
-  <Entry uri="android.hardware"/>
-  <Entry uri="android.media"/>
-  <Entry uri="android.net"/>
-  <Entry uri="android.provider"/>
+  <Entry uri="android.app" exclude="android.app.cts.SystemFeaturesTest#testTelephonyFeatures;android.app.cts.InstrumentationTest#testCallActivityOnResume;android.app.cts.ActivityManagerRecentTaskInfoTest#testWriteToParcel;android.app.cts.InstrumentationTest#testMisc;android.app.cts.DialogTest#testSetContentView;android.app.cts.ServiceTest#testLocalBindAutoClassPermissionGranted;android.app.cts.ActivityManager_RunningAppProcessInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamInt;android.app.cts.LocalActivityManagerTest#testConstructor;android.app.cts.ActivityManager_RunningServiceInfoTest#testDescribeContents;android.app.cts.DialogTest#testTakeKeyEvents;android.app.cts.LifecycleTest#testBasic;android.app.cts.NotificationTest#testConstructor;android.app.cts.ActivityManagerMemoryInfoTest#testWriteToParcel;android.app.cts.DialogTest#testConstructor_protectedCancellable;android.app.cts.ProgressDialogTest#testIncrementProgressBy;android.app.cts.ApplicationTest#testApplication;android.app.cts.InstrumentationTest#testSendKeySync;android.app.cts.LocalActivityManagerTest#testDispatchCreate;android.app.cts.AlertDialogTest#testAlertDialogDeprecatedAPI;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamCursor;android.app.cts.InstrumentationTest#testCallActivityOnRestart;android.app.backup.cts.BackupAgentTest#testBackupAgent;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItemsWithParamCharSequence;android.app.cts.ActivityManager_RunningServiceInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.ServiceTest#testLocalBindAutoAction;android.app.cts.DialogTest#testSetFeatureDrawableUri;android.app.cts.KeyguardManagerKeyguardLockTest#testDisableKeyguard;android.app.cts.LaunchTest#testClearTopWhilResumed;android.app.cts.WallpaperManagerTest#testSuggestDesiredDimensions;android.app.cts.SystemFeaturesTest#testLiveWallpaperFeature;android.app.cts.InstrumentationTest#testCallActivityOnUserLeaving;android.app.cts.AlertDialog_BuilderTest#testSetCancelable;android.app.cts.AlertDialogTest#testAlertDialogTheme;android.app.cts.PendingIntentTest#testGetBroadcast;android.app.cts.ActivityManager_RunningServiceInfoTest#testWriteToParcel;android.app.cts.InstrumentationTest#testGetComponentName;android.app.backup.cts.FileBackupHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.SystemFeaturesTest#testTouchScreenFeatures;android.app.cts.AlarmManagerTest#testAlarmTriggersImmediatelyIfSetTimeIsNegative;android.app.cts.ActivityManagerMemoryInfoTest#testReadFromParcel;android.app.cts.NotificationTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetOnCancelListener;android.app.cts.ServiceTest#testLocalBindClass;android.app.cts.ServiceTest#testLocalStartClass;android.app.cts.LauncherActivity_ListItemTest#testConstructor;android.app.cts.InstrumentationTest#testCallActivityOnCreate;android.app.cts.PendingIntentTest#testSendWithParamContextIntIntent;android.app.cts.InstrumentationTest#testSendPointerSync;android.app.cts.DialogTest#testRequestWindowFeature;android.app.cts.LocalActivityManagerTest#testDispatchPauseFalse;android.app.cts.Instrumentation_ActivityResultTest#testActivityResultOp;android.app.cts.ProgressDialogTest#testOnStartCreateStop;android.app.cts.AlertDialog_BuilderTest#testSetNegativeButtonWithParamInt;android.app.cts.KeyguardManagerKeyguardLockTest#testReenableKeyguard;android.app.cts.DialogTest#testShow;android.app.cts.ActivityManagerMemoryInfoTest#testDescribeContents;android.app.cts.SystemFeaturesTest#testFeatureNamespaces;android.app.cts.PendingIntent_CanceledExceptionTest#testConstructor;android.app.cts.AlertDialog_BuilderTest#testSetPositiveButtonWithParamInt;android.app.cts.PendingIntentTest#testSendWithParamInt;android.app.cts.PendingIntentTest#testGetActivity;android.app.cts.AlertDialog_BuilderTest#testSetCursor;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testWriteToParcel;android.app.cts.AlertDialog_BuilderTest#testConstructor;android.app.cts.LocalActivityManagerTest#testDispatchDestroy;android.app.cts.DownloadManagerTest#testDownloadManager;android.app.cts.ServiceTest#testLocalBindAction;android.app.cts.LocalActivityManagerTest#testSaveInstanceState;android.app.cts.LifecycleTest#testTabDialog;android.app.cts.LaunchTest#testLocalActivity;android.app.cts.AlertDialog_BuilderTest#testSetInverseBackgroundForced;android.app.cts.SystemFeaturesTest#testLocationFeatures;android.app.cts.DialogTest#testOnStartCreateStop;android.app.cts.ActivityManagerRecentTaskInfoTest#testReadFromParcel;android.app.cts.ServiceTest#testLocalStartClassPermissions;android.app.cts.ServiceTest#testLocalUnbindTwice;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testConstructor;android.app.cts.DialogTest#testSetFeatureDrawableResource;android.app.cts.ProgressDialogTest#testAccessProgress;android.app.cts.DialogTest#testTrackballEvent;android.app.cts.AlertDialog_BuilderTest#testSetSingleChoiceItems;android.app.cts.LaunchTest#testColdActivity;android.app.cts.ActivityManagerTest#testGetMemoryInfo;android.app.cts.PendingIntentTest#testAndroidTestCaseSetupProperly;android.app.cts.DialogTest#testOnContentChanged;android.app.cts.SearchManagerTest#testSetOnDismissListener;android.app.cts.InstrumentationTest#testContext;android.app.cts.LauncherActivity_IconResizerTest#testIconResizer;android.app.cts.DialogTest#testCancel_listener;android.app.cts.ActivityManagerTest#testIsUserAMonkey;android.app.cts.NotificationManagerTest#testCancelAll;android.app.cts.ActivityGroupTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testCreate;android.app.cts.SystemFeaturesTest#testUsbAccessory;android.app.cts.ActivityManagerRecentTaskInfoTest#testDescribeContents;android.app.cts.ActivityManagerRunningTaskInfoTest#testDescribeContents;android.app.cts.AlertDialog_BuilderTest#testDisableCancelable;android.app.cts.InstrumentationTest#testSendKeyDownUpSync;android.app.cts.ActivityManagerRunningTaskInfoTest#testConstructor;android.app.cts.TimePickerDialogTest#testUpdateTime;android.app.cts.ActivityManagerRunningTaskInfoTest#testReadFromParcel;android.app.cts.ProgressDialogTest#testSetProgressStyle;android.app.cts.InstrumentationTest#testMonitor;android.app.cts.AliasActivityTest#testAliasActivity;android.app.cts.InstrumentationTest#testSendTrackballEventSync;android.app.cts.LifecycleTest#testScreen;android.app.cts.AlarmManagerTest#testCancel;android.app.cts.ActivityGroupTest#testTabDialog;android.app.cts.PendingIntentTest#testDescribeContents;android.app.cts.DialogTest#testOnSearchRequested;android.app.cts.SearchManagerTest#testSetOnCancelListener;android.app.cts.ProgressDialogTest#testAccessMax;android.app.cts.PendingIntentTest#testGetTargetPackage;android.app.cts.SystemFeaturesTest#testWifiFeature;android.app.cts.ActivityManagerRecentTaskInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.DialogTest#testSetFeatureDrawableAlpha;android.app.cts.DialogTest#testSetTitle;android.app.cts.FragmentTest#testInstantiateNonFragment;android.app.cts.DialogTest#testSetDismissMessage;android.app.cts.PendingIntentTest#testWriteToParcel;android.app.cts.ActivityManagerMemoryInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetNeutralButtonWithParamCharSequence;android.app.cts.NotificationTest#testToString;android.app.cts.LaunchTest#testColdScreen;android.app.cts.AlertDialogTest#testAlertDialog;android.app.cts.SystemFeaturesTest#testSensorFeatures;android.app.cts.ProgressDialogTest#testShow1;android.app.cts.AlertDialog_BuilderTest#testSetNeutralButtonWithParamInt;android.app.cts.ActivityManagerRunningTaskInfoTest#testWriteToParcel;android.app.cts.ProgressDialogTest#testShow2;android.app.cts.ProgressDialogTest#testShow3;android.app.cts.ProgressDialogTest#testShow4;android.app.cts.InstrumentationTest#testCallActivityOnStart;android.app.cts.PendingIntentTest#testCancel;android.app.cts.InstrumentationTest#testConstructor;android.app.cts.ProgressDialogTest#testSetIndeterminate;android.app.cts.AlertDialog_BuilderTest#testShow;android.app.cts.AlertDialog_BuilderTest#testSetIconWithParamDrawable;android.app.cts.AlarmManagerTest#testSetTypes;android.app.cts.AlarmManagerTest#testSetInexactRepeating;android.app.cts.PendingIntentTest#testSendWithParamIntOnFinishedHandler;android.app.backup.cts.FileBackupHelperTest#testConstructor;android.app.cts.Instrumentation_ActivityResultTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testDownloadManagerDestinationExtension;android.app.cts.LaunchTest#testClearTopInCreate;android.app.cts.InstrumentationTest#testRunOnMainSync;android.app.cts.DialogTest#testOnKeyDownKeyUp;android.app.cts.ServiceTest#testLocalStartActionPermissions;android.app.cts.KeyguardManagerTest#testInKeyguardRestrictedInputMode;android.app.cts.DialogTest#testConstructor;android.app.cts.AlertDialogTest#testCallback;android.app.cts.ActivityManagerTest#testGetRunningTasks;android.app.cts.ProgressDialogTest#testIncrementSecondaryProgressBy;android.app.cts.DialogTest#testAccessOwnerActivity;android.app.cts.LifecycleTest#testTabScreen;android.app.cts.TimePickerDialogTest#testOnRestoreInstanceState;android.app.cts.ActivityGroupTest#testTabBasic;android.app.cts.ServiceTest#testAndroidTestCaseSetupProperly;android.app.cts.PendingIntentTest#testSendWithParamContextIntIntentOnFinishedHandler;android.app.backup.cts.BackupManagerTest#testBackupManager;android.app.cts.ActivityManagerRecentTaskInfoTest#testConstructor;android.app.cts.DialogTest#testOnWindowFocusChanged;android.app.cts.DialogTest#testGetCurrentFocus;android.app.cts.TabActivityTest#testChildTitleCallback;android.app.cts.DialogTest#testSetOnDismissListener_listener;android.app.cts.ServiceTest#testLocalStartAction;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamInt;android.app.cts.DialogTest#testGetLayoutInflater;android.app.cts.InstrumentationTest#testInvokeContextMenuAction;android.app.cts.InstrumentationTest#testProfiling;android.app.cts.IntentServiceTest#testIntentServiceLifeCycle;android.app.cts.ProgressDialogTest#testAccessSecondaryProgress;android.app.cts.NotificationManagerTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentTest#testAndroidTestCaseSetupProperly;android.app.cts.ActivityManagerTest#testGetProcessInErrorState;android.app.cts.SearchManagerTest#testStopSearch;android.app.cts.NotificationTest#testSetLatestEventInfo;android.app.cts.DialogTest#testSetCancellable_false;android.app.cts.PendingIntentTest#testSend;android.app.cts.LocalActivityManagerTest#testDispatchResume;android.app.cts.AlertDialog_BuilderTest#testSetViewCustom;android.app.cts.InstrumentationTest#testInvokeMenuActionSync;android.app.cts.DialogTest#testOnSaveInstanceState;android.app.cts.DialogTest#testOnKeyMultiple;android.app.cts.ActivityGroupTest#testTabScreen;android.app.cts.InstrumentationTest#testCallActivityOnSaveInstanceState;android.app.cts.ActivityManagerTest#testGetDeviceConfigurationInfo;android.app.cts.NotificationTest#testWriteToParcel;android.app.cts.InstrumentationTest#testWaitForIdle;android.app.cts.InstrumentationTest#testCallActivityOnStop;android.app.cts.InstrumentationTest#testSendCharacterSync;android.app.cts.TimePickerDialogTest#testOnTimeChanged;android.app.cts.PendingIntentTest#testEquals;android.app.cts.AlertDialog_BuilderTest#testSetIconWithParamInt;android.app.cts.DialogTest#testContextMenu;android.app.cts.SystemFeaturesTest#testBluetoothFeature;android.app.cts.ExpandableListActivityTest#testView;android.app.cts.AlarmManagerTest#testSetRepeating;android.app.cts.ActivityManager_RunningServiceInfoTest#testReadFromParcel;android.app.cts.ServiceTest#testLocalBindActionPermissions;android.app.cts.LocalActivityManagerTest#testDispatchStop;android.app.cts.LauncherActivity_ListItemTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testNewApplication;android.app.cts.LaunchTest#testForwardResult;android.app.cts.ProgressDialogTest#testSetMessage;android.app.cts.ActivityManagerTest#testGetRunningServices;android.app.cts.AlertDialogTest#testCustomAlertDialogView;android.app.backup.cts.SharedPreferencesBackupHelperTest#testConstructor;android.app.cts.LifecycleTest#testTabBasic;android.app.cts.FragmentTest#testInstantiateFragment;android.app.cts.ActivityManager_RunningAppProcessInfoTest#testRunningAppProcessInfo;android.app.cts.AlertDialogTest#testAlertDialogNotCancelable;android.app.cts.AlertDialog_BuilderTest#testSetItemsWithParamCharSequence;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testDescribeContents;android.app.cts.DialogTest#testConstructor_protectedNotCancellable;android.app.cts.ExpandableListActivityTest#testSelect;android.app.cts.SystemFeaturesTest#testScreenFeatures;android.app.cts.LauncherActivityTest#testLaunchActivity;android.app.cts.LaunchTest#testAndroidTestCaseSetupProperly;android.app.cts.LifecycleTest#testAndroidTestCaseSetupProperly;android.app.cts.NotificationTest#testDescribeContents;android.app.cts.DialogTest#testOnWindowAttributesChanged;android.app.cts.ServiceTest#testLocalBindAutoActionPermissionGranted;android.app.cts.InstrumentationTest#testCallActivityOnPostCreate;android.app.cts.AlertDialogTest#testAlertDialogDeprecatedAPIWithMessage;android.app.cts.AlertDialog_BuilderTest#testSetPositiveButtonWithParamCharSequence;android.app.cts.AlarmManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.AlertDialog_BuilderTest#testSetView;android.app.cts.ActivityManager_RunningServiceInfoTest#testConstructor;android.app.cts.InstrumentationTest#testPerformanceSnapshot;android.app.cts.InstrumentationTest#testCallApplicationOnCreate;android.app.cts.DialogTest#testSetFeatureDrawable;android.app.cts.AliasActivityTest#testAndroidTestCaseSetupProperly;android.app.cts.PendingIntentTest#testGetService;android.app.cts.IntentServiceTest#testIntents;android.app.cts.AlertDialog_BuilderTest#testSetOnItemSelectedListener;android.app.cts.LifecycleTest#testDialog;android.app.cts.DownloadManagerTest#testDownloadManagerDestination;android.app.cts.WallpaperManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.ExpandableListActivityTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testNewActivity;android.app.cts.ProgressDialogTest#testSetProgressDrawable;android.app.backup.cts.BackupManagerTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testAllocCounting;android.app.cts.LocalActivityManagerTest#testRemoveAllActivities;android.app.cts.ServiceTest#testLocalBindAutoClass;android.app.backup.cts.BackupAgentHelperTest#testBackupAgentHelper;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testReadFromParcel;android.app.cts.PendingIntent_CanceledExceptionTest#testAndroidTestCaseSetupProperly;android.app.cts.TimePickerDialogTest#testOnClick;android.app.cts.AlertDialog_BuilderTest#testSetOnKeyListener;android.app.cts.DialogTest#testTouchEvent;android.app.cts.ProgressDialogTest#testProgressDialog1;android.app.cts.InstrumentationTest#testCallActivityOnRestoreInstanceState;android.app.cts.ProgressDialogTest#testProgressDialog2;android.app.cts.InstrumentationTest#testCallActivityOnPause;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamCharSequence;android.app.cts.SystemFeaturesTest#testCameraFeatures;android.app.cts.ServiceTest#testLocalBindClassPermissions;android.app.cts.ActivityManagerTest#testGetRecentTasks;android.app.cts.SystemFeaturesTest#testNfcFeatures;android.app.cts.AlertDialogTest#testCustomAlertDialog;android.app.cts.SystemFeaturesTest#testSipFeatures;android.app.cts.InstrumentationTest#testSendStringSync;android.app.cts.ActivityManagerRunningTaskInfoTest#testAndroidTestCaseSetupProperly;android.app.cts.TabActivityTest#testTabActivity;android.app.cts.KeyguardManagerTest#testNewKeyguardLock;android.app.cts.NotificationManagerTest#testCancel;android.app.cts.AlertDialog_BuilderTest#testSetMultiChoiceItemsWithParamCursor;android.app.cts.ActivityManagerMemoryClassTest#testGetMemoryClass;android.app.cts.ActivityManagerTest#testGetRunningAppProcesses;android.app.cts.AlertDialog_BuilderTest#testSetAdapter;android.app.cts.AlertDialog_BuilderTest#testSetItemsWithParamInt;android.app.cts.DialogTest#testCancel_noListener;android.app.cts.DialogTest#testDispatchKeyEvent;android.app.cts.LaunchTest#testLocalScreen;android.app.cts.ActivityManagerTest#testRestartPackage;android.app.cts.FragmentTest#testAndroidTestCaseSetupProperly;android.app.cts.InstrumentationTest#testCallActivityOnNewIntent;android.app.cts.NotificationManagerTest#testNotify;android.app.cts.LocalActivityManagerTest#testDispatchPauseTrue;android.app.cts.ActivityManagerProcessErrorStateInfoTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.ProgressDialogTest#testSetIndeterminateDrawable;android.app.backup.cts.SharedPreferencesBackupHelperTest#testAndroidTestCaseSetupProperly;android.app.cts.DownloadManagerTest#testMinimumDownload;android.app.cts.PendingIntentTest#testReadAndWritePendingIntentOrNullToParcel;android.app.cts.DialogTest#testSetOnDismissListener_noListener;android.app.cts.KeyguardManagerTest#testExitKeyguardSecurely;android.app.cts.AlertDialog_BuilderTest#testSetNegativeButtonWithParamCharSequence;android.app.cts.DialogTest#testSetCancelable_true;android.app.cts.Instrumentation_ActivityMonitorTest#testActivityMonitor;android.app.cts.LocalActivityManagerTest#testStartActivity;android.app.cts.IntentServiceTest#testAndroidTestCaseSetupProperly;android.app.cts.ActionBarTest#testAddTab;android.app.cts.DialogTest#testSetCancelMessage;android.app.cts.TimePickerDialogTest#testSaveInstanceState" />
+  <Entry uri="android.hardware" exclude="android.hardware.consumerir.cts.ConsumerIrTest#test_hasIrEmitter;android.hardware.consumerir.cts.ConsumerIrTest#test_getCarrierFrequencies;android.hardware.consumerir.cts.ConsumerIrTest#test_transmit;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCaptureBurst;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingBurst;android.hardware.cts.CameraGLTest#testSetPreviewTextureTextureCallback;android.hardware.cts.CameraTest#test3ALockInteraction;android.hardware.cts.CameraTest#testAutoExposureLock;android.hardware.cts.CameraTest#testAutoWhiteBalanceLock;android.hardware.cts.CameraTest#testCancelAutofocus;android.hardware.cts.CameraTest#testDisplayOrientation;android.hardware.cts.CameraTest#testEnableShutterSound;android.hardware.cts.CameraTest#testFaceDetection;android.hardware.cts.CameraTest#testFocusAreas;android.hardware.cts.CameraTest#testFocusDistances;android.hardware.cts.CameraTest#testGetParameterDuringFocus;android.hardware.cts.CameraTest#testInvalidParameters;android.hardware.cts.CameraTest#testJpegCallbackStartPreview;android.hardware.cts.CameraTest#testJpegExif;android.hardware.cts.CameraTest#testJpegThumbnailSize;android.hardware.cts.CameraTest#testLockUnlock;android.hardware.cts.CameraTest#testMeteringAreas;android.hardware.cts.CameraTest#testMultiCameraRelease;android.hardware.cts.CameraTest#testMultipleCameras;android.hardware.cts.CameraTest#testParameters;android.hardware.cts.CameraTest#testPreviewCallbackWithBuffer;android.hardware.cts.CameraTest#testPreviewCallbackWithPicture;android.hardware.cts.CameraTest#testPreviewFormats;android.hardware.cts.CameraTest#testPreviewFpsRange;android.hardware.cts.CameraTest#testPreviewPictureSizesCombination;android.hardware.cts.CameraTest#testRecordingHint;android.hardware.cts.CameraTest#testSceneMode;android.hardware.cts.CameraTest#testSetOneShotPreviewCallback;android.hardware.cts.CameraTest#testSetPreviewDisplay;android.hardware.cts.CameraTest#testTakePicture;android.hardware.camera2.cts.ImageReaderTest#testImageReaderInvalidAccessTest;android.hardware.cts.SensorAccelerometerTest#testEventJittering;android.hardware.cts.SensorGyroscopeTest#testEventsArriveInOrder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableJpegSizes;android.hardware.cts.SensorAccelerometerTest#testCanReceiveBatchEvents;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorOrientation;android.hardware.camera2.cts.CameraCharacteristicsTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testUpdateRate;android.hardware.cts.SensorAccelerometerTest#testNotTriggerSensor;android.hardware.cts.SensorAccelerometerTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testCanReceiveEvents;android.hardware.cts.SensorMagneticFieldTest#testVarianceWhileStatic;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoHyperfocalDistance;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenCamerasSerially;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCreateCaptureBuilder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableProcessedMinDurations;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidFlashInfoAvailable;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoShadingMapSize;android.hardware.cts.LowRamDeviceTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorTest#testSensorOperations;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAwbAvailableModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorBaseGainFactor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoPhysicalSize;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidInfoSupportedHardwareLevel;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidJpegAvailableThumbnailSizes;android.hardware.cts.SensorGyroscopeTest#testNotTriggerSensor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensFacing;android.hardware.cts.Camera_ParametersTest#testAccessMethods;android.hardware.cts.SensorMagneticFieldTest#testCanRegisterListener;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableFormats;android.hardware.cts.SensorTest#testBatchAndFlush;android.hardware.cts.SensorGyroscopeTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testCanReceiveEvents;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableEffects;android.hardware.camera2.cts.CameraManagerTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorGyroscopeTest#testSeveralClientsBatching;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeAvailableAntibandingModes;android.hardware.cts.GeomagneticFieldTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testStartStopRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAfAvailableModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorMaxAnalogSensitivity;android.hardware.cts.SensorTest#testRequestTriggerWithNonTriggerSensor;android.hardware.cts.SensorMagneticFieldTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoMinimumFocusDistance;android.hardware.cts.SensorTest#testValuesForAllSensors;android.hardware.cts.SensorMagneticFieldTest#testCanReceiveBatchEvents;android.hardware.cts.SensorAccelerometerTest#testUpdateRate;android.hardware.cts.SensorMagneticFieldTest#testStartStopRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlMaxRegions;android.hardware.cts.SensorMagneticFieldTest#testAndroidTestCaseSetupProperly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeCompensationRange;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidRequestMaxNumOutputStreams;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoSensitivityRange;android.hardware.cts.SensorMagneticFieldTest#testNotTriggerSensor;android.hardware.cts.SensorGyroscopeTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerInvalidDevice;android.hardware.cts.LowRamDeviceTest#testLowRamProductProperty;android.hardware.cts.SensorTest#testCancelTriggerWithNonTriggerSensor;android.hardware.cts.SensorMagneticFieldTest#testEventsArriveInOrder;android.hardware.cts.SensorMagneticFieldTest#testMaxFrequency;android.hardware.cts.SensorAccelerometerTest#testSeveralClientsBatching;android.hardware.cts.SensorMagneticFieldTest#testEventJittering;android.hardware.cts.SensorGyroscopeTest#testEventValidity;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraRaw;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeCompensationStep;android.hardware.cts.SensorMagneticFieldTest#testSeveralClientsBatching;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerGetCameraCharacteristics;android.hardware.cts.SensorAccelerometerTest#testCanRegisterListener;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraFlexibleYuv;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableVideoStabilizationModes;android.hardware.cts.SensorGyroscopeTest#testStartStopRepeatedly;android.hardware.cts.SensorAccelerometerTest#testEventsArriveInOrder;android.hardware.cts.SensorMagneticFieldTest#testRegisterForBatchingZeroReport;android.hardware.cts.SensorGyroscopeTest#testCanRegisterListener;android.hardware.cts.SensorGyroscopeTest#testMaxFrequency;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableProcessedSizes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAeAvailableTargetFpsRanges;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidTonemapMaxCurvePoints;android.hardware.cts.SensorGyroscopeTest#testCanReceiveEvents;android.hardware.cts.SensorTest#testRegisterTwiceWithSameSensor;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableOpticalStabilization;android.hardware.camera2.cts.ImageReaderTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorMagneticFieldTest#testSeveralClients;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenCameraTwice;android.hardware.cts.SensorMagneticFieldTest#testStartStopBatchingRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableMaxDigitalZoom;android.hardware.cts.SensorAccelerometerTest#testBatchEventsArriveInOrder;android.hardware.camera2.cts.CameraDeviceTest#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorAccelerometerTest#testRegisterForBatchingZeroReport;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidStatisticsInfoMaxFaceCount;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidControlAvailableSceneModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoActiveArraySize;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoMaxFrameDuration;android.hardware.cts.SensorAccelerometerTest#testStartStopBatchingRepeatedly;android.hardware.cts.SensorGyroscopeTest#testEventJittering;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCapture;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidSensorInfoExposureTimeRange;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableFocalLengths;android.hardware.cts.SensorGyroscopeTest#testCanReceiveBatchEvents;android.hardware.cts.SensorTest#testLegacySensorOperations;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerListener;android.hardware.cts.GeomagneticFieldTest#testGeomagneticField;android.hardware.cts.SensorGyroscopeTest#testSeveralClients;android.hardware.cts.SensorGyroscopeTest#testStartStopBatchingRepeatedly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableFilterDensities;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceSetErrorListener;android.hardware.cts.SensorGyroscopeTest#testRegisterForBatchingZeroReport;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerGetDeviceIdList;android.hardware.cts.SensorAccelerometerTest#testMaxFrequency;android.hardware.camera2.cts.CameraManagerTest#testCameraManagerOpenAllCameras;android.hardware.cts.SensorAccelerometerTest#testSeveralClients;android.hardware.cts.SensorGyroscopeTest#testVarianceWhileStatic;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidScalerAvailableJpegMinDurations;android.hardware.cts.SensorTest#testAndroidTestCaseSetupProperly;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidStatisticsInfoAvailableFaceDetectModes;android.hardware.camera2.cts.CameraCharacteristicsTest#testCameraCharacteristicsAndroidLensInfoAvailableApertures;android.hardware.cts.SensorAccelerometerTest#testEventValidity;android.hardware.cts.SensorAccelerometerTest#testUpdateBatchRate;android.hardware.cts.SensorAccelerometerTest#testVarianceWhileStatic;android.hardware.cts.SensorGyroscopeTest#testUpdateBatchRate;android.hardware.cts.SensorGyroscopeTest#testUpdateRate;android.hardware.cts.SensorMagneticFieldTest#testEventValidity;android.hardware.cts.SensorMagneticFieldTest#testUpdateBatchRate;android.hardware.cts.SensorTest#testRegisterWithTriggerSensor;android.hardware.cts.Camera_SizeTest#testConstructor" />
+  <Entry uri="android.media" exclude="android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_24kbps_22050Hz;android.media.cts.AudioPreProcessingTest#test2_1AecCreateAndRelease;android.media.cts.MediaCodecTest#testConcurrentAudioVideoEncodings;android.media.cts.EnvReverbTest#test2_0SetEnabledGetEnabled;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToBufferQVGA;android.media.cts.AudioTrackTest#testSetLoopPointsStartTooFar;android.media.cts.RingtoneManagerTest#testStopPreviousRingtone;android.media.cts.EnvReverbTest#test1_3Reflections;android.media.cts.MediaPlayerTest#testGapless3;android.media.cts.MediaPlayerTest#testGapless2;android.media.cts.MediaPlayerTest#testGapless1;android.media.cts.BassBoostTest#testAndroidTestCaseSetupProperly;android.media.cts.EnvReverbTest#test3_1EnableStatusListener;android.media.cts.ExtractDecodeEditEncodeMuxTest#testExtractDecodeEditEncodeMuxQVGA;android.media.cts.MediaRecorderTest#testRecorderCamera;android.media.cts.MediaPlayerTest#testGetTrackInfo;android.media.cts.MediaDrmMockTest#testIsCryptoSchemeNotSupported;android.media.cts.AudioPreProcessingTest#testAndroidTestCaseSetupProperly;android.media.cts.DecodeEditEncodeTest#testVideoEditQCIF;android.media.cts.MediaPlayerTest#testDeselectTrack;android.media.cts.AudioEffectTest#test3_7SetParameterAfterRelease;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Mono_24kbps_22050Hz;android.media.cts.AudioEffectTest#test4_2ControlStatusListener;android.media.cts.StreamingMediaPlayerTest#testHTTP_MPEG4SP_AAC_Video1;android.media.cts.StreamingMediaPlayerTest#testHTTP_MPEG4SP_AAC_Video2;android.media.cts.JetPlayerTest#testLoadJetFromFd;android.media.cts.MediaDrmMockTest#testProvideProvisionResponse;android.media.cts.JetPlayerTest#testQueueJetSegmentMuteArray;android.media.cts.StreamingMediaPlayerTest#testPlayOggStream;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_1350kbps_25fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.SoundPoolAacTest#testAndroidTestCaseSetupProperly;android.media.cts.PresetReverbTest#test3_2ParameterChangedListener;android.media.cts.MediaDrmMockTest#testNullPropertyString;android.media.cts.AudioEffectTest#test3_2SetParameterIntShort;android.media.cts.AudioRecord_BufferSizeTest#testGetMinBufferSize;android.media.cts.AudioEffectTest#test3_0SetParameterByteArrayByteArray;android.media.cts.MediaScannerConnectionTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_1000kbps_30fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.AudioTrackTest#testWriteShortSizeTooBig;android.media.cts.AudioTrackTest#testGetMinBufferSizeTooLowSR;android.media.cts.AudioEffectTest#test1_1ConstructorFromUuid;android.media.cts.ToneGeneratorTest#testSyncGenerate;android.media.cts.AudioEffectTest#test1_3GetEnabledAfterRelease;android.media.cts.BassBoostTest#test1_1Properties;android.media.cts.SoundPoolOggTest#testLoadMore;android.media.cts.AudioEffectTest#test1_7AuxiliaryOnAudioTrack;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_128kbps_11025Hz;android.media.cts.MediaCodecListTest#testMediaCodecXmlFileExist;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_1000kbps_25fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.VisualizerTest#test2_1ListenerCapture;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_24kbps_11025Hz;android.media.cts.StreamingMediaPlayerTest#testPlayMp3Stream2;android.media.cts.StreamingMediaPlayerTest#testPlayMp3Stream1;android.media.cts.MediaPlayerTest#testPlayNullSource;android.media.cts.VirtualizerTest#testAndroidTestCaseSetupProperly;android.media.cts.EncodeVirtualDisplayWithCompositionTest#testSingleVirtualDisplay;android.media.cts.DecoderTest#testDecodeOgg;android.media.cts.MediaRecorderTest#testOnErrorListener;android.media.cts.EnvReverbTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioTrackTest#testSetPlaybackRate;android.media.cts.AudioManagerTest#testVibrateNotification;android.media.cts.AudioManagerTest#testAccessMode;android.media.cts.EqualizerTest#test1_4SetBandLevelAfterRelease;android.media.cts.MediaPlayerTest#testPlayVideo;android.media.cts.MediaCodecTest#testSignalSurfaceEOS;android.media.cts.VisualizerTest#test0_0ConstructorAndRelease;android.media.cts.DecoderTest#testDecodeFlac;android.media.cts.MediaDrmMockTest#testEventWithSessionAndData;android.media.cts.MediaScannerConnectionTest#testMediaScannerConnection;android.media.cts.AudioTrackTest#testConstructorMono8MusicStatic;android.media.cts.AudioManagerTest#testMicrophoneMute;android.media.cts.MediaDrmMockTest#testMissingPropertyString;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_128kbps_22050Hz;android.media.cts.AudioTrackTest#testConstructorStereo16MusicStream;android.media.cts.Vp8EncoderTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaDrmMockTest#testQueryKeyStatus;android.media.cts.BassBoostTest#test3_2ParameterChangedListener;android.media.cts.AudioManagerTest#testVibrateRinger;android.media.cts.AudioManagerTest#testMusicActive;android.media.cts.DecoderTest#testCodecResetsVP8WithoutSurface;android.media.cts.MediaPlayerTest#testRecordedVideoPlayback90;android.media.cts.MediaPlayerFlakyNetworkTest#test_S3P00001;android.media.cts.AudioTrackTest#testGetMinBufferSizeTooHighSR;android.media.cts.CamcorderProfileTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_128kbps_11025Hz;android.media.cts.AudioManagerTest#testVolume;android.media.cts.MediaMuxerTest#testAudioOnly;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_128kbps_22050Hz;android.media.cts.AudioEffectTest#test1_6AuxiliaryOnMediaPlayerFailure;android.media.cts.DecoderTest#testCodecResetsMpeg4WithSurface;android.media.cts.AudioEffectTest#test4_1setParameterLowerPriority;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_500kbps_30fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.DecoderTest#testCodecResetsVP8WithSurface;android.media.cts.CamcorderProfileTest#testGet;android.media.cts.DecoderTest#testDecodeMonoM4a;android.media.cts.MediaRecorderTest#testSetCamera;android.media.cts.AudioTrackTest#testSetGetPlaybackRate;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromSurfaceToSurfaceQVGA;android.media.cts.EnvReverbTest#testAndroidTestCaseSetupProperly;android.media.cts.DecoderTest#testFlush;android.media.cts.AudioEffectTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Mono_24kbps_11025Hz;android.media.cts.DecoderTest#testDecodeMp3Lame;android.media.cts.EncoderTest#testAMRNBEncoders;android.media.cts.MediaScannerTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaCodecListTest#testRequiredMediaCodecList;android.media.cts.DecoderTest#testCodecResetsMpeg4WithoutSurface;android.media.cts.MediaRecorderTest#testGetAudioSourceMax;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_500kbps_25fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.AudioTrackTest#testSetLoopPointsLoopTooLong;android.media.cts.EqualizerTest#test1_1BandFrequency;android.media.cts.EncoderTest#testAMRWBEncoders;android.media.cts.AudioTrackTest#testWriteShortNegativeSize;android.media.cts.AudioTrackTest#testConstructorStreamType;android.media.cts.MediaPlayerTest#testCallback;android.media.cts.BassBoostTest#test2_0SetEnabledGetEnabled;android.media.cts.MediaPlayerFlakyNetworkTest#test_S2P00001;android.media.cts.EncodeVirtualDisplayTest#testEncodeVirtualDisplay;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromSurfaceToSurfaceQCIF;android.media.cts.DecoderTest#testCodecEarlyEOSVP9;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_1350kbps_30fps_AAC_Stereo_192kbps_44110Hz;android.media.cts.DecoderTest#testCodecEarlyEOSVP8;android.media.cts.MediaPlayerFlakyNetworkTest#test_S5P00001;android.media.cts.MediaRandomTest#testRecorderRandomAction;android.media.cts.MediaDrmMockTest#testBadSession;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_128kbps_11025Hz;android.media.cts.CameraProfileTest#testGetWithId;android.media.cts.EnvReverbTest#test1_0Room;android.media.cts.StreamingMediaPlayerTest#testPlayMp3StreamNoLength;android.media.cts.SoundPoolAacTest#testMultiSound;android.media.cts.AudioTrackTest#testReloadStaticData;android.media.cts.MediaDrmMockTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testPlayAudio;android.media.cts.MediaDrmMockTest#testGetKeyRequestNoOptionalParameters;android.media.cts.MediaRecorderTest#testSetMaxDuration;android.media.cts.AudioPreProcessingTest#test2_2AecSetEnabledGetEnabled;android.media.cts.AsyncPlayerTest#testAsyncPlayer;android.media.cts.DecoderTest#testCodecBasicVP8;android.media.cts.DecoderTest#testCodecBasicVP9;android.media.cts.AudioTrackTest#testSetLoopPointsStream;android.media.cts.AudioTrackTest#testConstructorStereo8MusicStatic;android.media.cts.MediaCodecTest#testDequeueSurface;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToBuffer720p;android.media.cts.MediaRecorderTest#testRecorderTimelapsedVideo;android.media.cts.MediaCodecTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioTrackTest#testSetPlaybackHeadPositionStopped;android.media.cts.AudioTrackTest#testWriteByteSizeTooBig;android.media.cts.MediaMuxerTest#testAndroidTestCaseSetupProperly;android.media.cts.EnvReverbTest#test1_1Decay;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_128kbps_22050Hz;android.media.cts.DecoderTest#testDecodeWav;android.media.cts.DecoderTest#testCodecEarlyEOSH263;android.media.cts.SoundPoolOggTest#testSoundPoolOp;android.media.cts.DecoderTest#testCodecEarlyEOSH264;android.media.cts.MediaPlayerFlakyNetworkTest#test_S6P00002;android.media.cts.EnvReverbTest#test1_2Reverb;android.media.cts.AudioManagerTest#testSoundEffects;android.media.cts.ToneGeneratorTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaCodecTest#testReconfigureWithoutSurface;android.media.cts.RingtoneManagerTest#testConstructors;android.media.cts.MediaCodecListTest#testGetCapabilities;android.media.cts.MediaDrmMockTest#testIsMimeTypeSupported;android.media.cts.DecoderTest#testDecodeMonoMp3;android.media.cts.DecoderTest#testCodecResetsH263WithoutSurface;android.media.cts.MediaScannerNotificationTest#testMediaScannerNotification;android.media.cts.VisualizerTest#testAndroidTestCaseSetupProperly;android.media.cts.VirtualizerTest#test0_0ConstructorAndRelease;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Mono_24kbps_22050Hz;android.media.cts.AudioTrackTest#testWriteShort;android.media.cts.AudioRecordTest#testAndroidTestCaseSetupProperly;android.media.cts.ExtractDecodeEditEncodeMuxTest#testExtractDecodeEditEncodeMux720p;android.media.cts.EqualizerTest#test3_0ControlStatusListener;android.media.cts.MediaDrmMockTest#testRestoreKeys;android.media.cts.MediaMuxerTest#testVideoAudio;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Mono_24kbps_11025Hz;android.media.cts.AudioTrackTest#testConstructorStereo8MusicStream;android.media.cts.MediaPlayerTest#testSetNextMediaPlayerWithRelease;android.media.cts.VisualizerTest#test1_0CaptureRates;android.media.cts.CameraProfileTest#testAndroidTestCaseSetupProperly;android.media.cts.EncodeVirtualDisplayWithCompositionTest#testAndroidTestCaseSetupProperly;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToSurfaceQVGA;android.media.cts.VirtualizerTest#test1_1Properties;android.media.cts.AudioManagerTest#testRouting;android.media.cts.EqualizerTest#test3_1EnableStatusListener;android.media.cts.PresetReverbTest#test3_1EnableStatusListener;android.media.cts.EnvReverbTest#test0_0ConstructorAndRelease;android.media.cts.MediaPlayerTest#testChangeSubtitleTrack;android.media.cts.JetPlayerTest#testClone;android.media.cts.AudioEffectTest#test1_5AuxiliaryOnMediaPlayer;android.media.cts.MediaPlayerTest#testSetNextMediaPlayerWithReset;android.media.cts.AudioEffectTest#test2_0SetEnabledGetEnabled;android.media.cts.VisualizerTest#test1_1CaptureSize;android.media.cts.AudioTrackTest#testPlaybackHeadPositionAfterInit;android.media.cts.EqualizerTest#test1_3Properties;android.media.cts.AudioTrackTest#testWriteByte;android.media.cts.VirtualizerTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioTrackTest#testSetStereoVolumeMin;android.media.cts.MediaRecorderTest#testRecorderVideo;android.media.cts.ExtractDecodeEditEncodeMuxTest#testExtractDecodeEditEncodeMuxAudioVideo;android.media.cts.EqualizerTest#test2_0SetEnabledGetEnabled;android.media.cts.MediaPlayerTest#testSetNextMediaPlayer;android.media.cts.AudioTrackTest#testSetStereoVolumeMid;android.media.cts.VirtualizerTest#test1_0Strength;android.media.cts.EncodeDecodeTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioTrackTest#testAudioTrackProperties;android.media.cts.AudioTrackTest#testSetPlaybackHeadPositionPaused;android.media.cts.SoundPoolAacTest#testLoadMore;android.media.cts.ExtractDecodeEditEncodeMuxTest#testExtractDecodeEditEncodeMuxQCIF;android.media.cts.EncodeVirtualDisplayTest#testAndroidTestCaseSetupProperly;android.media.cts.RingtoneManagerTest#testSetType;android.media.cts.MediaDrmMockTest#testMultipleSessions;android.media.cts.MediaPlayerFlakyNetworkTest#test_S0P0;android.media.cts.SoundPoolOggTest#testLoad;android.media.cts.PresetReverbTest#test0_0ConstructorAndRelease;android.media.cts.RingtoneManagerTest#testAccessMethods;android.media.cts.EnvReverbTest#test1_4DiffusionAndDensity;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_24kbps_22050Hz;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_24kbps_22050Hz;android.media.cts.MediaDrmMockTest#testGetProvisionRequest;android.media.cts.CamcorderProfileTest#testGetWithId;android.media.cts.AudioEffectTest#test1_2ConstructorUnknownType;android.media.cts.SoundPoolOggTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioTrackTest#testWriteByte8bit;android.media.cts.PresetReverbTest#testAndroidTestCaseSetupProperly;android.media.cts.EncoderTest#testAACEncoders;android.media.cts.ExtractDecodeEditEncodeMuxTest#testExtractDecodeEditEncodeMuxAudio;android.media.cts.DecoderTest#testCodecBasicH263;android.media.cts.DecoderTest#testCodecBasicH264;android.media.cts.AudioTrackTest#testSetLoopPointsSuccess;android.media.cts.MediaDrmMockTest#testRemoveKeys;android.media.cts.FaceDetectorTest#testFindFaces;android.media.cts.MediaDrmMockTest#testGetKeyRequest;android.media.cts.MediaCodecListTest#testIsAVCBaselineProfileSupported;android.media.cts.AudioEffectTest#test3_4SetParameterIntArrayIntArray;android.media.cts.MediaCodecListTest#testIsH263BaselineProfileSupported;android.media.cts.EqualizerTest#test0_0ConstructorAndRelease;android.media.cts.EqualizerTest#test3_2ParameterChangedListener;android.media.cts.AudioTrackTest#testSetPlaybackRateZero;android.media.cts.MediaDrmMockTest#testGetSecureStops;android.media.cts.EnvReverbTest#test3_2ParameterChangedListener;android.media.cts.StreamingMediaPlayerTest#testHTTP_H263_AMR_Video2;android.media.cts.MediaDrmMockTest#testGetKeyRequestRelease;android.media.cts.StreamingMediaPlayerTest#testHTTP_H263_AMR_Video1;android.media.cts.EqualizerTest#testAndroidTestCaseSetupProperly;android.media.cts.ExtractDecodeEditEncodeMuxTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaDrmMockTest#testNullSession;android.media.cts.PresetReverbTest#test1_1Properties;android.media.cts.BassBoostTest#test3_1EnableStatusListener;android.media.cts.AudioTrack_ListenerTest#testAudioTrackCallbackWithHandler;android.media.cts.VirtualizerTest#test3_2ParameterChangedListener;android.media.cts.MediaPlayerTest#testLocalVideo_MP4_H264_480x360_1350kbps_30fps_AAC_Stereo_128kbps_44110Hz;android.media.cts.BassBoostTest#test1_0Strength;android.media.cts.AudioTrackTest#testPlaybackHeadPositionAfterFlushAndPlay;android.media.cts.PresetReverbTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioTrackTest#testWriteShortNegativeOffset;android.media.cts.DecoderTest#testCodecResetsMp3;android.media.cts.AudioTrackTest#testPlaybackHeadPositionAfterFlush;android.media.cts.MediaScannerTest#testCanonicalize;android.media.cts.MediaDrmMockTest#testMediaDrmConstructorFails;android.media.cts.PresetReverbTest#test2_0SetEnabledGetEnabled;android.media.cts.MediaDrmMockTest#testCryptoSession;android.media.cts.DecoderTest#testCodecResetsH263WithSurface;android.media.cts.AudioPreProcessingTest#test1_1NsCreateAndRelease;android.media.cts.DecodeEditEncodeTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioEffectTest#test3_6SetParameterIntArrayByteArray;android.media.cts.AudioTrackTest#testPlaybackHeadPositionAfterStop;android.media.cts.AsyncPlayerTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioPreProcessingTest#test3_2AgcSetEnabledGetEnabled;android.media.cts.MediaDrmMockTest#testGetKeyRequestOffline;android.media.cts.MediaDrmMockTest#testReleaseSecureStops;android.media.cts.MediaPlayerFlakyNetworkTest#test_S4P00001;android.media.cts.MediaDrmMockTest#testNullPropertyByteArray;android.media.cts.EqualizerTest#test1_2Presets;android.media.cts.EnvReverbTest#test1_5Properties;android.media.cts.CameraProfileTest#testGetImageEncodingQualityParameter;android.media.cts.VirtualizerTest#test3_0ControlStatusListener;android.media.cts.AudioTrackTest#testWriteByteNegativeOffset;android.media.cts.StreamingMediaPlayerTest#testPlayMp3StreamRedirect;android.media.cts.DecoderTest#testCodecEarlyEOSMpeg4;android.media.cts.EnvReverbTest#test3_0ControlStatusListener;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToSurfaceQCIF;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToSurface720p;android.media.cts.MediaDrmMockTest#testCryptoSessionEncrypt;android.media.cts.EqualizerTest#test1_0BandLevel;android.media.cts.EncodeVirtualDisplayWithCompositionTest#testMultipleVirtualDisplays;android.media.cts.AudioTrack_ListenerTest#testAudioTrackCallback;android.media.cts.DecoderTest#testCodecResetsVP9WithoutSurface;android.media.cts.DecodeEditEncodeTest#testVideoEdit720p;android.media.cts.AudioEffectTest#test1_0ConstructorFromType;android.media.cts.AudioTrackTest#testPlayStreamData;android.media.cts.MediaDrmMockTest#testCryptoSessionSign;android.media.cts.MediaDrmMockTest#testMediaDrmConstructor;android.media.cts.AudioTrackTest#testSetStereoVolumeMax;android.media.cts.MediaMuxerTest#testIllegalStateExceptions;android.media.cts.MediaCodecTest#testCreateInputSurfaceErrors;android.media.cts.AudioTrackTest#testConstructorMono16MusicStatic;android.media.cts.MediaDrmMockTest#testOpenCloseSession;android.media.cts.AudioManagerTest#testAndroidTestCaseSetupProperly;android.media.cts.DecoderTest#testEOSBehaviorMpeg4;android.media.cts.SoundPoolOggTest#testMultiSound;android.media.cts.AudioTrackTest#testConstructorMono8MusicStream;android.media.cts.MediaCodecListTest#testIsM4VSimpleProfileSupported;android.media.cts.VirtualizerTest#test1_2SetStrengthAfterRelease;android.media.cts.MediaDrmMockTest#testCryptoSessionVerify;android.media.cts.MediaMuxerTest#testVideoOnly;android.media.cts.AudioTrackTest#testWriteShortOffsetTooBig;android.media.cts.AudioManagerTest#testSetInvalidRingerMode;android.media.cts.MediaDrmMockTest#testIsMimeTypeNotSupported;android.media.cts.StreamingMediaPlayerTest#testPlayOggStreamNoLength;android.media.cts.MediaPlayerFlakyNetworkTest#test_S1P000005;android.media.cts.MediaRandomTest#testPlayerRandomAction;android.media.cts.EncoderTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testRecordedVideoPlayback0;android.media.cts.AudioRecordTest#testAudioRecordProperties;android.media.cts.AudioTrackTest#testWriteByteOffsetTooBig;android.media.cts.PresetReverbTest#test3_0ControlStatusListener;android.media.cts.DecodeEditEncodeTest#testVideoEditQVGA;android.media.cts.MediaDrmMockTest#testMissingPropertyByteArray;android.media.cts.MediaPlayerTest#testRecordAndPlay;android.media.cts.PresentationSyncTest#testThroughput;android.media.cts.MediaPlayerTest#testVideoSurfaceResetting;android.media.cts.AudioTrack_ListenerTest#testAndroidTestCaseSetupProperly;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromBufferToBufferQCIF;android.media.cts.MediaPlayerTest#testRecordedVideoPlayback180;android.media.cts.MediaRecorderTest#testRecorderAudio;android.media.cts.EqualizerTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioTrackTest#testPlaybackHeadPositionAfterPause;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_128kbps_11025Hz;android.media.cts.MediaRecorderTest#testSetMaxFileSize;android.media.cts.Vp8EncoderTest#testBasic;android.media.cts.AudioTrackTest#testPlaybackHeadPositionIncrease;android.media.cts.AudioTrackTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaDrmMockTest#testEventNoSessionNoData;android.media.cts.MediaDrmMockTest#testByteArrayProperties;android.media.cts.DecoderTest#testCodecResetsM4a;android.media.cts.RingtoneTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioPreProcessingTest#test3_1AgcCreateAndRelease;android.media.cts.AudioTrackTest#testSetPlaybackRateTwiceOutputSR;android.media.cts.PresetReverbTest#test1_0Presets;android.media.cts.StreamingMediaPlayerTest#testPlayOggStreamRedirect;android.media.cts.MediaCodecListTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioTrackTest#testSetLoopPointsStartAfterEnd;android.media.cts.MediaRecorderTest#testOnInfoListener;android.media.cts.VirtualizerTest#test3_1EnableStatusListener;android.media.cts.DecoderTest#testCodecResetsH264WithoutSurface;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Stereo_24kbps_11025Hz;android.media.cts.MediaPlayerTest#testRecordedVideoPlayback270;android.media.cts.BassBoostTest#test3_0ControlStatusListener;android.media.cts.EncodeDecodeTest#testEncodeDecodeVideoFromSurfaceToSurface720p;android.media.cts.AudioTrackTest#testSetPlaybackRateUninit;android.media.cts.BassBoostTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioEffectTest#test0_0QueryEffects;android.media.cts.VisualizerTest#test2_0PollingCapture;android.media.cts.MediaDrmMockTest#testStringProperties;android.media.cts.BassBoostTest#test0_0ConstructorAndRelease;android.media.cts.MediaScannerNotificationTest#testAndroidTestCaseSetupProperly;android.media.cts.AudioTrackTest#testConstructorMono16MusicStream;android.media.cts.MediaRecorderTest#testRecordingAudioInRawFormats;android.media.cts.AudioEffectTest#test3_1SetParameterIntInt;android.media.cts.DecoderTest#testEOSBehaviorVP8;android.media.cts.StreamingMediaPlayerTest#testHTTP_H264Base_AAC_Video2;android.media.cts.AudioEffectTest#test1_4InsertOnMediaPlayer;android.media.cts.StreamingMediaPlayerTest#testHTTP_H264Base_AAC_Video1;android.media.cts.DecoderTest#testCodecResetsVP9WithSurface;android.media.cts.JetPlayerTest#testLoadJetFromPath;android.media.cts.DecoderTest#testEOSBehaviorVP9;android.media.cts.MediaDrmMockTest#testProvideKeyResponse;android.media.cts.DecoderTest#testDecodeM4a;android.media.cts.AudioTrackTest#testWriteByteNegativeSize;android.media.cts.AudioEffectTest#test4_0setEnabledLowerPriority;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_12fps_AAC_Mono_24kbps_22050Hz;android.media.cts.DecoderTest#testEOSBehaviorH264;android.media.cts.DecoderTest#testEOSBehaviorH263;android.media.cts.DecoderTest#testDecodeMonoOgg;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Stereo_24kbps_11025Hz;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_24kbps_22050Hz;android.media.cts.AudioTrackTest#testSetPlaybackHeadPositionTooFar;android.media.cts.AudioRecord_BufferSizeTest#testAndroidTestCaseSetupProperly;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_12fps_AAC_Mono_24kbps_11025Hz;android.media.cts.MediaCodecListTest#testComponentInstantiation;android.media.cts.BassBoostTest#test1_2SetStrengthAfterRelease;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Stereo_24kbps_11025Hz;android.media.cts.AudioTrackTest#testSetLoopPointsEndTooFar;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Mono_24kbps_11025Hz;android.media.cts.MediaScannerTest#testMediaScanner;android.media.cts.RingtoneTest#testRingtone;android.media.cts.AudioEffectTest#test5_0Command;android.media.cts.DecoderTest#testDecodeMp3Smpb;android.media.cts.AudioTrackTest#testWriteShort8bit;android.media.cts.AudioEffectTest#test3_3SetParameterIntByteArray;android.media.cts.AudioEffectTest#test4_3EnableStatusListener;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_300kbps_25fps_AAC_Mono_24kbps_22050Hz;android.media.cts.JetPlayerTest#testAndroidTestCaseSetupProperly;android.media.cts.Vp8EncoderTest#testSyncFrame;android.media.cts.VirtualizerTest#test2_0SetEnabledGetEnabled;android.media.cts.MediaPlayerSurfaceTest#testSetSurface;android.media.cts.SoundPoolAacTest#testLoad;android.media.cts.AudioEffectTest#test3_5SetParameterIntArrayShortArray;android.media.cts.MediaDrmMockTest#testBadCryptoSession;android.media.cts.AudioTrackTest#testConstructorStereo16MusicStatic;android.media.cts.AudioPreProcessingTest#test1_2NsSetEnabledGetEnabled;android.media.cts.AudioEffectTest#test2_1SetEnabledAfterRelease;android.media.cts.AudioManagerTest#testAccessRingMode;android.media.cts.SoundPoolAacTest#testSoundPoolOp;android.media.cts.AudioEffectTest#test4_4ParameterChangedListener;android.media.cts.DecoderTest#testCodecBasicMpeg4;android.media.cts.AudioTrackTest#testSetPlaybackHeadPositionPlaying;android.media.cts.AudioRecordTest#testAudioRecordOP;android.media.cts.MediaScannerTest#testWildcardPaths;android.media.cts.AudioEffectTest#test3_8GetParameterAfterRelease;android.media.cts.FaceDetector_FaceTest#testFaceProperties;android.media.cts.MediaPlayerTest#testLocalVideo_3gp_H263_176x144_56kbps_25fps_AAC_Stereo_128kbps_22050Hz;android.media.cts.MediaDrmMockTest#testCryptoSessionDecrypt" />
+  <Entry uri="android.mediastress" exclude="android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay00;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay10;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay11;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay07;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay08;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay10;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay05;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay11;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay06;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay03;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay04;android.mediastress.cts.MediaRecorderStressTest#testStressRecorder;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay01;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay02;android.mediastress.cts.H263QcifShortPlayerTest#testPlay07;android.mediastress.cts.MediaRecorderStressTest#testStressCamera;android.mediastress.cts.H263QcifShortPlayerTest#testPlay08;android.mediastress.cts.H263QcifShortPlayerTest#testPlay05;android.mediastress.cts.H263QcifShortPlayerTest#testPlay06;android.mediastress.cts.H263QcifShortPlayerTest#testPlay03;android.mediastress.cts.H263QcifShortPlayerTest#testPlay04;android.mediastress.cts.H263QcifShortPlayerTest#testPlay01;android.mediastress.cts.H263QcifShortPlayerTest#testPlay02;android.mediastress.cts.H264R720pAacLongPlayerTest#testPlay01;android.mediastress.cts.H264R720pAacLongPlayerTest#testPlay00;android.mediastress.cts.MediaRecorderStressTest#testStressCameraSwitchRecorder;android.mediastress.cts.H263QcifShortPlayerTest#testPlay09;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay06;android.mediastress.cts.NativeMediaTest#test1080pPlay;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay05;android.mediastress.cts.NativeMediaTest#testDefaultPlay;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay08;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay07;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay02;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay03;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay09;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay00;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay01;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay06;android.mediastress.cts.H263QcifShortPlayerTest#testPlay00;android.mediastress.cts.H264R1080pAacShortPlayerTest#testPlay00;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay07;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay04;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay00;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay05;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay02;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay01;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay08;android.mediastress.cts.H264R1080pAacShortPlayerTest#testPlay02;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay04;android.mediastress.cts.Vp8R480x360ShortPlayerTest#testPlay09;android.mediastress.cts.H264R1080pAacShortPlayerTest#testPlay01;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay03;android.mediastress.cts.H264R1080pAacRepeatedPlayerTest#testPlay00;android.mediastress.cts.H263QcifShortPlayerTest#testPlay13;android.mediastress.cts.H263QcifShortPlayerTest#testPlay12;android.mediastress.cts.H263QcifShortPlayerTest#testPlay15;android.mediastress.cts.H263QcifShortPlayerTest#testPlay14;android.mediastress.cts.H263QcifLongPlayerTest#testPlay00;android.mediastress.cts.H263QcifShortPlayerTest#testPlay17;android.mediastress.cts.H264R480pAacLongPlayerTest#testPlay00;android.mediastress.cts.H263QcifShortPlayerTest#testPlay16;android.mediastress.cts.H263QcifShortPlayerTest#testPlay19;android.mediastress.cts.H263QcifShortPlayerTest#testPlay18;android.mediastress.cts.H263QcifShortPlayerTest#testPlay10;android.mediastress.cts.H263QcifShortPlayerTest#testPlay11;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay11;android.mediastress.cts.H264R480x360AacShortPlayerTest#testPlay10;android.mediastress.cts.NativeMediaTest#test720pPlay;android.mediastress.cts.H264R1080pAacLongPlayerTest#testPlay00;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay12;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay01;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay00;android.mediastress.cts.H263QcifShortPlayerTest#testPlay23;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay11;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay10;android.mediastress.cts.H263QcifShortPlayerTest#testPlay21;android.mediastress.cts.H263QcifShortPlayerTest#testPlay22;android.mediastress.cts.H263QcifShortPlayerTest#testPlay20;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay02;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay03;android.mediastress.cts.MediaRecorderStressTest#testStressRecordVideoAndPlayback;android.mediastress.cts.H264R720pAacShortPlayerTest#testPlay09;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay04;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay05;android.mediastress.cts.Vp8R480x360LongPlayerTest#testPlay00;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay06;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay07;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay08;android.mediastress.cts.H264R480pAacShortPlayerTest#testPlay09" />
+  <Entry uri="android.net" exclude="android.net.wifi.cts.ScanResultTest#testScanResultProperties;android.net.wifi.cts.WifiManagerTest#testWifiManagerActions;android.net.cts.UriTest#testStringUri;android.net.cts.UrlQuerySanitizer_IllegalCharacterValueSanitizerTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioGroupTest#testAdd;android.net.rtp.cts.AudioGroupTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioGroupTest#testRemove;android.net.cts.LocalSocketTest#testAccessors;android.net.http.cts.SslErrorTest#testConstructorIgnoresInvalidValues;android.net.cts.UriTest#testCompareTo;android.net.http.cts.SslErrorTest#testAddErrorIgnoresInvalidValues;android.net.cts.VpnServiceTest#testProtect_DatagramSocket;android.net.wifi.cts.WifiConfigurationTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testGetCodecs;android.net.http.cts.ApacheHttpClientTest#testExecute_withWifi;android.net.cts.DnsTest#testAndroidTestCaseSetupProperly;android.net.cts.VpnServiceTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.SupplicantStateTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfo_StateTest#testValues;android.net.cts.UriTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketTest#testLocalConnections;android.net.wifi.cts.WifiManager_WifiLockTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiManagerTest#testWifiManagerNetWork;android.net.cts.ConnectivityManagerTest#testGetAllNetworkInfo;android.net.rtp.cts.AudioGroupTest#testTraffic;android.net.cts.Uri_BuilderTest#testBuilderOperations;android.net.cts.UriTest#testBuildUpon;android.net.cts.TrafficStatsTest#testAndroidTestCaseSetupProperly;android.net.cts.ProxyTest#testConstructor;android.net.rtp.cts.AudioCodecTest#testGetCodec;android.net.cts.DhcpInfoTest#testConstructor;android.net.cts.LocalSocketAddress_NamespaceTest#testValues;android.net.cts.ConnectivityManagerTest#testRequestRouteToHost;android.net.cts.ConnectivityManagerTest#testSetNetworkPreference;android.net.http.cts.SslCertificateTest#testState;android.net.cts.NetworkInfo_DetailedStateTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testConstants;android.net.http.cts.SslCertificateTest#testSslCertificate;android.net.cts.ProxyTest#testAccessProperties;android.net.cts.CredentialsTest#testCredentials;android.net.rtp.cts.AudioStreamTest#testDoubleRelease;android.net.cts.TrafficStatsTest#testValidMobileStats;android.net.http.cts.SslErrorTest#testGetUrlWithDeprecatedConstructor;android.net.cts.VpnServiceTest#testProtect_int;android.net.cts.ConnectivityManagerTest#testGetNetworkInfo;android.net.cts.MailToTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalSocketAddress_NamespaceTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfo_DetailedStateTest#testValueOf;android.net.cts.DhcpInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.UriTest#testPathOperations;android.net.rtp.cts.AudioStreamTest#testAndroidTestCaseSetupProperly;android.net.http.cts.SslCertificate_DNameTest#testDName;android.net.wifi.cts.WifiManagerTest#testSignal;android.net.cts.UrlQuerySanitizerTest#testUrlQuerySanitizer;android.net.wifi.cts.WifiManager_WifiLockTest#testWifiLock;android.net.rtp.cts.AudioStreamTest#testSetCodec;android.net.cts.MailToTest#testParseMailToURI;android.net.cts.UriTest#testParcelling;android.net.cts.UrlQuerySanitizerTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiConfigurationTest#testWifiConfiguration;android.net.cts.NetworkInfoTest#testAccessNetworkInfoProperties;android.net.cts.ConnectivityManagerTest#testTest;android.net.http.cts.SslErrorTest#testGetPrimaryError;android.net.cts.NetworkInfo_StateTest#testValueOf;android.net.cts.UriTest#testFromFile;android.net.cts.VpnServiceTest#testTunDevice;android.net.rtp.cts.AudioStreamTest#testSetDtmfType;android.net.cts.SSLCertificateSocketFactoryTest#testAndroidTestCaseSetupProperly;android.net.http.cts.SslCertificateTest#testConstructor;android.net.http.cts.SslErrorTest#testAddError;android.net.cts.UriTest#testNormalizeScheme;android.net.wifi.cts.WifiInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature;android.net.cts.UriTest#testHierarchicalUris;android.net.cts.DhcpInfoTest#testToString;android.net.rtp.cts.AudioStreamTest#testV6Stream;android.net.cts.LocalSocketAddressTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_IllegalCharacterValueSanitizerTest#testSanitize;android.net.rtp.cts.AudioStreamTest#testV4Stream;android.net.wifi.cts.ConcurrencyTest#testConcurrency;android.net.cts.LocalSocketAddress_NamespaceTest#testValueOf;android.net.wifi.cts.WifiManagerTest#testWifiWatchdog;android.net.cts.UriTest#testEqualsAndHashCode;android.net.cts.VpnServiceTest#testPrepare;android.net.cts.UriTest#testOpaqueUri;android.net.cts.UriTest#testQueryParameters;android.net.cts.TrafficStatsTest#testThreadStatsTag;android.net.wifi.cts.SupplicantStateTest#testIsValidState;android.net.http.cts.SslErrorTest#testHasError;android.net.cts.SSLCertificateSocketFactoryTest#testAccessProperties;android.net.cts.VpnServiceTest#testEstablish;android.net.ipv6.cts.PingTest#testAndroidTestCaseSetupProperly;android.net.cts.NetworkInfoTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.UriTest#testEncodeAndDecode;android.net.rtp.cts.AudioGroupTest#testClear;android.net.cts.NetworkInfo_StateTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_ParameterValuePairTest#testAndroidTestCaseSetupProperly;android.net.cts.ProxyTest#testAndroidTestCaseSetupProperly;android.net.cts.LocalServerSocketTest#testLocalServerSocket;android.net.cts.CredentialsTest#testAndroidTestCaseSetupProperly;android.net.rtp.cts.AudioCodecTest#testAndroidTestCaseSetupProperly;android.net.cts.UrlQuerySanitizer_ParameterValuePairTest#testConstructor;android.net.cts.NetworkInfo_DetailedStateTest#testValues;android.net.http.cts.SslErrorTest#testGetPrimaryErrorWithEmptySet;android.net.rtp.cts.AudioGroupTest#testSetMode;android.net.wifi.cts.WifiInfoTest#testWifiInfoProperties;android.net.wifi.cts.ConcurrencyTest#testAndroidTestCaseSetupProperly;android.net.http.cts.ApacheHttpClientTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiManagerTest#testWifiManagerProperties;android.net.rtp.cts.AudioGroupTest#testDoubleClear;android.net.wifi.cts.WifiManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testGetActiveNetworkInfo;android.net.cts.LocalSocketAddressTest#testNewLocalSocketAddressWithDefaultNamespace;android.net.http.cts.SslErrorTest#testGetUrl;android.net.ipv6.cts.PingTest#testLoopbackPing;android.net.cts.TrafficStatsTest#testValidTotalStats;android.net.wifi.cts.WifiEnterpriseConfigTest#testAddEapNetwork;android.net.cts.VpnServiceTest#testProtect_Socket;android.net.wifi.cts.WifiEnterpriseConfigTest#testAndroidTestCaseSetupProperly;android.net.cts.ConnectivityManagerTest#testIsNetworkTypeValid;android.net.cts.ConnectivityManagerTest#testIsNetworkSupported;android.net.cts.LocalServerSocketTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.WifiEnterpriseConfigTest#testSettersAndGetters;android.net.http.cts.ApacheHttpClientTest#testExecute_withMobile" />
+  <Entry uri="android.provider" exclude="android.provider.cts.ContactsContract_CommonDataKinds_EventTest#testGetTypeLabel;android.provider.cts.MediaStore_Audio_Genres_MembersTest#testStoreAudioGenresMembersInternal;android.provider.cts.ContactsContract_DataTest#testDataInsert_updatesContactLastUpdatedTimestamp;android.provider.cts.ContactsContract_CommonDataKinds_EmailTest#testGetTypeLabel;android.provider.cts.Settings_NameValueTableTest#testPutString;android.provider.cts.CalendarTest#testCalendarEntityQuery;android.provider.cts.ContactsContract_DataUsageTest#testSingleDataUsageFeedback_incrementsCorrectDataItems;android.provider.cts.BrowserTest#testSendString;android.provider.cts.MediaStore_Video_MediaTest#testStoreVideoMediaInternal;android.provider.cts.UserDictionary_WordsTest#testAddWord_deprecated;android.provider.cts.MediaStoreIntentsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_DeletedContacts#testQuerySinceTimestamp;android.provider.cts.BrowserTest#testRequestAllIcons;android.provider.cts.ContactsContract_CommonDataKinds_EmailTest#testAndroidTestCaseSetupProperly;android.provider.cts.CalendarTest#testReminders;android.provider.cts.MediaStore_Audio_ArtistsTest#testStoreAudioArtistsExternal;android.provider.cts.ContactsContractIntentsTest#testViewContactDir;android.provider.cts.CalendarTest#testBulkUpdate;android.provider.cts.ContactsContract_PhotoTest#testAddPhoto;android.provider.cts.Settings_NameValueTableTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAccountRemovalWithMergedContact_hasDeleteLogsForContacts;android.provider.cts.ContactsContract_PhotoTest#testAddEmptyPhoto;android.provider.cts.Settings_SecureTest#testGetPutFloat;android.provider.cts.MediaStore_Images_MediaTest#testGetContentUri;android.provider.cts.ContactsContract_DeletedContacts#testDelete_isUnsupported;android.provider.cts.CalendarTest#testCalendarCreationAndDeletion;android.provider.cts.BrowserTest#testBookmarksTable;android.provider.cts.Settings_SecureTest#testGetUriFor;android.provider.cts.ContactsContract_StatusUpdatesTest#testGetPresenceIconresourceId;android.provider.cts.MediaStore_Audio_Playlists_MembersTest#testStoreAudioPlaylistsMembersInternal;android.provider.cts.ContactsContract_CommonDataKinds_EventTest#testAndroidTestCaseSetupProperly;android.provider.cts.Contacts_PhonesTest#testGetDisplayLabel;android.provider.cts.ContactsContract_DeletedContacts#testInsert_isUnsupported;android.provider.cts.MediaStore_Audio_AlbumsTest#testStoreAudioAlbumsExternal;android.provider.cts.ContactsContract_DeletedContacts#testAndroidTestCaseSetupProperly;android.provider.cts.BrowserTest#testGetAllVisitedUrls;android.provider.cts.Contacts_ContactMethodsTest#testEncodeAndDecodeProtocol;android.provider.cts.ContactsContract_DeletedContacts#testQueryAll;android.provider.cts.MediaStore_Audio_MediaTest#testStoreAudioMediaInternal;android.provider.cts.ContactsContract_RawContactsTest#testRawContactPsuedoDelete_hasDeleteLogForContact;android.provider.cts.MediaStore_FilesTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Images_MediaTest#testStoreImagesMediaInternal;android.provider.cts.MediaStore_Audio_AlbumsTest#testAlbumArt;android.provider.cts.ContactsContract_ContactsTest#testLookupUri;android.provider.cts.MediaStoreIntentsTest#testPickVideoDir;android.provider.cts.MediaStore_Images_MediaTest#testInsertImageWithBitmap;android.provider.cts.MediaStoreIntentsTest#testViewAudioFile;android.provider.cts.MediaStore_Audio_Genres_MembersTest#testStoreAudioGenresMembersExternal;android.provider.cts.ContactsContract_CommonDataKinds_StructuredPostalTest#testAndroidTestCaseSetupProperly;android.provider.cts.CalendarTest#testInstanceSearch;android.provider.cts.VoicemailContractTest#testStatusTablePermissions;android.provider.cts.ContactsContract_CommonDataKinds_OrganizationTest#testAndroidTestCaseSetupProperly;android.provider.cts.SettingsTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Audio_PlaylistsTest#testStoreAudioPlaylistsInternal;android.provider.cts.ContactsContract_DumpFileProviderTest#testQuery_worksWithValidFileName;android.provider.cts.Settings_SecureTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Video_MediaTest#testAndroidTestCaseSetupProperly;android.provider.cts.BrowserTest#testAccessHistory;android.provider.cts.ContactsContract_DataTest#testContactablesFilterByPhonePrefix_returnsCorrectDataRows;android.provider.cts.MediaStore_Images_ThumbnailsTest#testStoreImagesMediaInternal;android.provider.cts.ContactsTest#testCallsTable;android.provider.cts.CalendarTest#testEventCreationAndDeletion;android.provider.cts.VoicemailContractTest#testVoicemailTablePermissions;android.provider.cts.CalendarTest#testEventsUid2445;android.provider.cts.MediaStore_VideoTest#testQuery;android.provider.cts.CalendarTest#testDefaultProjections;android.provider.cts.MediaStoreIntentsTest#testViewVideoDir;android.provider.cts.MediaStore_FilesTest#testGetContentUri;android.provider.cts.ContactsContract_ContactsTest#testInsert_isUnsupported;android.provider.cts.ContactsContract_CommonDataKinds_PhoneTest#testGetTypeLabel;android.provider.cts.VoicemailContractTest#testVoicemailsTable;android.provider.cts.ContactsContract_CommonDataKinds_RelationTest#testGetTypeLabel;android.provider.cts.Settings_SystemTest#testGetDefaultValues;android.provider.cts.ContactsContract_RawContactsTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStoreTest#testGetMediaScannerUri;android.provider.cts.ContactsContract_RawContactsTest#testRawContactDelete_removesRecord;android.provider.cts.Settings_SecureTest#testGetPutString;android.provider.cts.ContactsTest#testGroupMembershipTable;android.provider.cts.MediaStore_Audio_MediaTest#testGetContentUri;android.provider.cts.CalendarTest#testFullRecurrenceUpdate;android.provider.cts.MediaStore_FilesTest#testCaseSensitivity;android.provider.cts.MediaStore_Audio_AlbumsTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Audio_ArtistsTest#testStoreAudioArtistsInternal;android.provider.cts.ContactsContract_ContactsTest#testContactDelete_hasDeleteLog;android.provider.cts.ContactsContract_DataUsageTest#testMultiIdDataUsageFeedback_incrementsCorrectDataItems;android.provider.cts.CalendarTest#testSyncOnlyInsertEnforcement;android.provider.cts.VoicemailContractTest#testDataColumnUpdate_throwsIllegalArgumentException;android.provider.cts.CalendarTest#testColorWriteRequirements;android.provider.cts.CalendarTest#testWhenByDayQuery;android.provider.cts.ContactsContract_StreamItemsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_CommonDataKinds_ImTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_AudioTest#testKeyFor;android.provider.cts.ContactsContract_ContactsTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Images_ThumbnailsTest#testQueryInternalThumbnails;android.provider.cts.ContactsContract_DumpFileProviderTest#testOpenFileDescriptor_throwsErrorWithIllegalFileName;android.provider.cts.CalendarTest#testEventColors;android.provider.cts.SettingsTest#testBluetoothDevicesTable;android.provider.cts.ContactsContract_RawContactsTest#testRawContactUpdate_updatesContactUpdatedTimestamp;android.provider.cts.ContactsContract_CommonDataKinds_RelationTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStoreTest#testGetVersion;android.provider.cts.MediaStore_Audio_GenresTest#testGetContentUri;android.provider.cts.ContactsContract_DataTest#testDataDelete_updatesContactLastUpdatedTimestamp;android.provider.cts.ContactsContract_CommonDataKinds_SipAddressTest#testGetTypeLabel;android.provider.cts.BrowserTest#testSaveBookmark;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Video_MediaTest#testGetContentUri;android.provider.cts.CalendarTest#testExtendedProperties;android.provider.cts.Settings_SystemTest#testAndroidTestCaseSetupProperly;android.provider.cts.CalendarTest#testNonAdapterRecurrenceExceptions;android.provider.cts.CalendarTest#testOutOfOrderRecurrenceExceptions;android.provider.cts.CalendarTest#testConversionToRecurring;android.provider.cts.MediaStore_Audio_Playlists_MembersTest#testStoreAudioPlaylistsMembersExternal;android.provider.cts.CalendarTest#testMultiRuleRecurrence;android.provider.cts.MediaStoreIntentsTest#testPickAudioDir;android.provider.cts.MediaStore_Audio_GenresTest#testStoreAudioGenresExternal;android.provider.cts.MediaStoreIntentsTest#testViewVideoFile;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAccountRemoval_deletesContacts;android.provider.cts.Contacts_ContactMethodsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_GroupMembershipTest#testAddGroupMembershipWithGroupRowId;android.provider.cts.TelephonyProviderTest#testOpeningAnyFile;android.provider.cts.MediaStore_Audio_GenresTest#testGetContentUriForAudioId;android.provider.cts.ContactsContract_CommonDataKinds_PhoneTest#testAndroidTestCaseSetupProperly;android.provider.cts.Contacts_PeopleTest#testMarkAsContacted;android.provider.cts.MediaStore_FilesTest#testAccess;android.provider.cts.ContactsContract_CommonDataKinds_ImTest#testGetTypeLabel;android.provider.cts.SearchRecentSuggestionsTest#testSuggestionsTable;android.provider.cts.CalendarTest#testAttendees;android.provider.cts.SettingsTest#testAccessNonTable;android.provider.cts.MediaStoreIntentsTest#testPickImageDir;android.provider.cts.BrowserTest#testSearchesTable;android.provider.cts.Contacts_SettingsTest#testAccessSetting;android.provider.cts.ContactsContract_StreamItemPhotosTest#testContentPhotoUri;android.provider.cts.ContactsContract_DataTest#testGetLookupUriByDisplayName;android.provider.cts.ContactsContract_StatusUpdatesTest#testInsertStatus;android.provider.cts.MediaStore_Video_ThumbnailsTest#testGetContentUri;android.provider.cts.MediaStore_Audio_GenresTest#testStoreAudioGenresInternal;android.provider.cts.MediaStore_Images_MediaTest#testInsertImageWithImagePath;android.provider.cts.CalendarTest#testForwardRecurrenceExceptions;android.provider.cts.Settings_SecureTest#testUnknownSourcesOffByDefault;android.provider.cts.CalendarTest#testBadRequests;android.provider.cts.ContactsTest#testSettingsTable;android.provider.cts.VoicemailContractTest#testInsert_doesNotUpdateDataColumn;android.provider.cts.ContactsContract_RawContactsTest#testRawContactCreate_updatesContactUpdatedTimestamp;android.provider.cts.MediaStoreIntentsTest#testViewImageDir;android.provider.cts.ContactsContract_ContactsTest#testContactDelete_removesContactRecord;android.provider.cts.MediaStore_Images_ThumbnailsTest#testQueryExternalMiniThumbnails;android.provider.cts.ContactsContract_ContactsTest#testContactUpdate_updatesContactUpdatedTimestamp;android.provider.cts.Settings_SettingNotFoundExceptionTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_RawContactsTest#testGetLookupUriByDisplayName;android.provider.cts.BrowserTest#testAccessSearches;android.provider.cts.ContactsContract_CommonDataKinds_SipAddressTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_GroupMembershipTest#testAddGroupMembershipWithUnknownGroupSourceId;android.provider.cts.MediaStore_Audio_MediaTest#testStoreAudioMediaExternal;android.provider.cts.MediaStore_Audio_PlaylistsTest#testGetContentUri;android.provider.cts.ContactsTest#testGroupsTable;android.provider.cts.MediaStore_Audio_AlbumsTest#testGetContentUri;android.provider.cts.Settings_SystemTest#testGetUriFor;android.provider.cts.ContactsContract_StreamItemPhotosTest#testContentDirectoryUri;android.provider.cts.SearchRecentSuggestionsTest#testSearchRecentSuggestions;android.provider.cts.Contacts_ContactMethodsTest#testAddPostalLocation;android.provider.cts.MediaStore_Audio_Artists_AlbumsTest#testGetContentUri;android.provider.cts.SearchRecentSuggestionsTest#testConstructor;android.provider.cts.ContactsContract_ContactsTest#testMarkAsContacted;android.provider.cts.ContactsTest#testPeopleTable;android.provider.cts.CalendarTest#testCalendarColors;android.provider.cts.CalendarTest#testCalendarIsPrimary;android.provider.cts.ContactsContract_RawContactsTest#testRawContactDelete_hasDeleteLogForContact;android.provider.cts.Settings_SystemTest#testSystemSettings;android.provider.cts.CalendarTest#testRecurrence;android.provider.cts.ContactsContract_GroupMembershipTest#testAddGroupMembershipWithGroupSourceId;android.provider.cts.MediaStore_Audio_Genres_MembersTest#testGetContentUri;android.provider.cts.VoicemailContractTest#testStatusTable;android.provider.cts.ContactsContract_DataTest#testContactablesFilterByFirstName_returnsCorrectDataRows;android.provider.cts.Settings_NameValueTableTest#testGetUriFor;android.provider.cts.ContactsContract_DumpFileProviderTest#testQuery_throwsErrorWithIllegalFileName;android.provider.cts.ContactsTest#testContactMethodsTable;android.provider.cts.ContactsContractIntentsTest#testPickContactDir;android.provider.cts.MediaStore_Audio_AlbumsTest#testStoreAudioAlbumsInternal;android.provider.cts.Contacts_PeopleTest#testAddToGroup;android.provider.cts.ContactsContract_DataTest#testContactablesFilterByEmailPrefix_returnsCorrectDataRows;android.provider.cts.ContactsContract_StatusUpdatesTest#testGetPresencePrecedence;android.provider.cts.BrowserTest#testUpdateVisitedHistory;android.provider.cts.SettingsTest#testSecureTable;android.provider.cts.ContactsContract_StreamItemsTest#testContentUri;android.provider.cts.MediaStore_Audio_Artists_AlbumsTest#testStoreAudioArtistsAlbumsInternal;android.provider.cts.MediaStore_Video_ThumbnailsTest#testGetThumbnail;android.provider.cts.ContactsContractIntentsTest#testGetContentContactDir;android.provider.cts.SettingsTest#testSystemTable;android.provider.cts.CalendarTest#testEventUpdateAsApp;android.provider.cts.MediaStore_Images_MediaTest#testStoreImagesMediaExternal;android.provider.cts.CalendarTest#testEventsEntityQuery;android.provider.cts.ContactsContractIntentsTest#testAndroidTestCaseSetupProperly;android.provider.cts.CalendarTest#testSyncState;android.provider.cts.MediaStore_Video_ThumbnailsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_DataTest#testGetLookupUriBySourceId;android.provider.cts.UserDictionary_WordsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsTest#testExtensionsTable;android.provider.cts.ContactsContract_DataTest#testContactablesUri;android.provider.cts.ContactsContract_CommonDataKinds_ImTest#testGetProtocolLabel;android.provider.cts.Settings_SettingNotFoundExceptionTest#testConstructor;android.provider.cts.CalendarTest#testEventsIsOrganizer;android.provider.cts.ContactsContract_StreamItemsTest#testContentDirectoryUri;android.provider.cts.Contacts_PeopleTest#testAccessPhotoData;android.provider.cts.UserDictionary_WordsTest#testAddWord;android.provider.cts.CalendarTest#testSingleRecurrenceExceptions;android.provider.cts.BrowserTest#testGetAllBookmarks;android.provider.cts.ContactsContract_RawContactsTest#testRawContactDelete_setsDeleteFlag;android.provider.cts.MediaStoreIntentsTest#testViewImageFile;android.provider.cts.Settings_SecureTest#testGetPutLong;android.provider.cts.ContactsContract_DataTest#testContactablesFilterByLastName_returnsCorrectDataRows;android.provider.cts.SearchRecentSuggestionsTest#testAndroidTestCaseSetupProperly;android.provider.cts.Contacts_PhonesTest#testGetDisplayLabelCharSequenceArray;android.provider.cts.SettingsTest#testUserDictionarySettingsExists;android.provider.cts.Contacts_OrganizationsTest#testGetDisplayLabel;android.provider.cts.Settings_SecureTest#testGetDefaultValues;android.provider.cts.ContactsContract_ContactsTest#testContactDelete_marksRawContactsForDeletion;android.provider.cts.ContactsTest#testPhotosTable;android.provider.cts.ContactsContract_ContactsTest#testContentUri;android.provider.cts.MediaStore_Audio_Artists_AlbumsTest#testStoreAudioArtistsAlbumsExternal;android.provider.cts.Contacts_PhonesTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAccountRemovalWithMergedContact_doesNotDeleteContactAndTimestampUpdated;android.provider.cts.ContactsTest#testOrganizationsTable;android.provider.cts.MediaStore_Audio_Playlists_MembersTest#testGetContentUri;android.provider.cts.MediaStore_Audio_PlaylistsTest#testStoreAudioPlaylistsExternal;android.provider.cts.Contacts_OrganizationsTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsTest#testPhonesTable;android.provider.cts.Settings_SecureTest#testGetPutInt;android.provider.cts.ContactsContract_StatusUpdatesTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Audio_MediaTest#testGetContentUriForPath;android.provider.cts.CalendarTest#testCalendarUpdateAsApp;android.provider.cts.ContactsContract_DeletedContacts#testQueryByContactId;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAccountRemoval_hasDeleteLogsForContacts;android.provider.cts.ContactsContract_StreamItemPhotosTest#testAndroidTestCaseSetupProperly;android.provider.cts.MediaStore_Audio_ArtistsTest#testGetContentUri;android.provider.cts.ContactsContract_DumpFileProviderTest#testAndroidTestCaseSetupProperly;android.provider.cts.ContactsContract_DataTest#testDataUpdate_updatesContactLastUpdatedTimestamp;android.provider.cts.ContactsProvider2_AccountRemovalTest#testAccountRemovalWithMergedContact_deletesContacts;android.provider.cts.ContactsContract_RawContactsTest#testGetLookupUriBySourceId;android.provider.cts.MediaStore_Images_ThumbnailsTest#testGetContentUri;android.provider.cts.ContactsContract_DumpFileProviderTest#testOpenFileDescriptor_worksWithValidFileName;android.provider.cts.ContactsContract_CommonDataKinds_StructuredPostalTest#testGetTypeLabel;android.provider.cts.ContactsContract_DataUsageTest#testAndroidTestCaseSetupProperly;android.provider.cts.Contacts_ContactMethodsTest#test;android.provider.cts.MediaStore_Video_MediaTest#testStoreVideoMediaExternal;android.provider.cts.ContactsContract_CommonDataKinds_OrganizationTest#testGetTypeLabel;android.provider.cts.MediaStore_Images_ThumbnailsTest#testStoreImagesMediaExternal;android.provider.cts.ContactsContract_DataTest#testContactablesFilter_doesNotExist_returnsCorrectDataRows;android.provider.cts.ContactsContract_DeletedContacts#testQuery_returnsProperColumns" />
+  <Entry uri="android.security" exclude="android.security.cts.KeystoreExploitTest#testAndroidTestCaseSetupProperly;android.security.cts.CharDeviceTest#testExynosKernelMemoryRead;android.security.cts.VoldExploitTest#testAndroidTestCaseSetupProperly;android.security.cts.LoadEffectLibraryTest#testLoadLibrary;android.security.cts.BrowserTest#testAndroidTestCaseSetupProperly;android.security.cts.LinuxRngTest#testDevUrandomMajorMinor;android.security.cts.ServicePermissionsTest#testDumpProtected;android.security.cts.BannedFilesTest#testNoSetuidTcpdump;android.security.cts.SqliteJournalLeakTest#testShm;android.security.cts.LinuxRngTest#testDevRandomMajorMinor;android.security.cts.ClonedSecureRandomTest#testCheckForDuplicateOutput;android.security.cts.BrowserTest#testBrowserPrivateDataAccess;android.security.cts.BrowserTest#testTabExhaustion;android.security.cts.KeystoreExploitTest#testKeystoreCrash;android.security.cts.SqliteJournalLeakTest#testJournal;android.security.cts.BannedFilesTest#testNoCmdClient;android.security.cts.BannedFilesTest#testNoSetuidIp;android.security.cts.BannedFilesTest#testNoSyncAgent;android.security.cts.ListeningPortsTest#testNoListeningLoopbackTcp6Ports;android.security.cts.KernelSettingsTest#testKptrRestrict;android.security.cts.AslrTest#testVaRandomize;android.security.cts.KernelSettingsTest#testMmapMinAddr;android.security.cts.CertificateTest#testBlockCertificates;android.security.cts.BrowserTest#testTabReuse;android.security.cts.KernelSettingsTest#testSELinuxEnforcing;android.security.cts.ListeningPortsTest#testNoListeningLoopbackUdp6Ports;android.security.cts.NativeCodeTest#testPerfEvent;android.security.cts.KernelSettingsTest#testSetuidDumpable;android.security.cts.PackageSignatureTest#testAndroidTestCaseSetupProperly;android.security.cts.ServicePermissionsTest#testAndroidTestCaseSetupProperly;android.security.cts.CertificateTest#testCertificates;android.security.cts.KernelSettingsTest#testNoConfigGz;android.security.cts.KernelSettingsTest#testDmesgRestrict;android.security.cts.ListeningPortsTest#testAndroidTestCaseSetupProperly;android.security.cts.SqliteJournalLeakTest#testAndroidTestCaseSetupProperly;android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningTcp6Ports;android.security.cts.ListeningPortsTest#testNoListeningLoopbackTcpPorts;android.security.cts.ClonedSecureRandomTest#testAndroidTestCaseSetupProperly;android.security.cts.VoldExploitTest#testTryCommandInjection;android.security.cts.VoldExploitTest#testZergRushCrash;android.security.cts.AslrTest#testOneExecutableIsPie;android.security.cts.VoldExploitTest#testTryToCrashVold;android.security.cts.ListeningPortsTest#testNoListeningLoopbackUdpPorts;android.security.cts.CertificateTest#testAndroidTestCaseSetupProperly;android.security.cts.SqliteJournalLeakTest#testWal;android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningTcpPorts;android.security.cts.CharDeviceTest#testExynosRootingVuln" />
+  <Entry uri="android.webkit" exclude="android.webkit.cts.WebViewTest#testDocumentHasImages;android.webkit.cts.WebViewTest#testScrollBarOverlay;android.webkit.cts.WebViewTest#testGoBackAndForward;android.webkit.cts.WebViewTest#testGetContentHeight;android.webkit.cts.WebChromeClientTest#testOnJsConfirm;android.webkit.cts.WebChromeClientTest#testOnProgressChanged;android.webkit.cts.WebViewTest#testAddJavascriptInterfaceNullObject;android.webkit.cts.WebViewTest#testConstructor;android.webkit.cts.WebViewTest#testInvokeZoomPicker;android.webkit.cts.WebSettingsTest#testAccessMinimumLogicalFontSize;android.webkit.cts.WebViewStartupTest#testCookieManagerBlockingUiThread;android.webkit.cts.WebViewTest#testInternals;android.webkit.cts.WebViewClientTest#testShouldOverrideUrlLoading;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptOnce;android.webkit.cts.WebSettingsTest#testDatabaseDisabled;android.webkit.cts.WebView_WebViewTransportTest#testAccessWebView;android.webkit.cts.WebSettingsTest#testAccessJavaScriptCanOpenWindowsAutomatically;android.webkit.cts.WebSettingsTest#testAppCacheEnabled;android.webkit.cts.WebSettingsTest#testAccessUserAgentString;android.webkit.cts.WebViewTest#testClearHistory;android.webkit.cts.WebSettingsTest#testAccessSerifFontFamily;android.webkit.cts.WebSettingsTest#testAccessLayoutAlgorithm;android.webkit.cts.WebSettingsTest#testAccessFantasyFontFamily;android.webkit.cts.WebViewTest#testAddJavascriptInterface;android.webkit.cts.WebSettingsTest#testAccessCacheMode;android.webkit.cts.WebViewTest#testDebugDump;android.webkit.cts.WebViewTest#testSslErrorProceedResponseNotReusedForDifferentHost;android.webkit.cts.WebSettingsTest#testLocalImageLoads;android.webkit.cts.WebViewTest#testSslErrorProceedResponseReusedForSameHost;android.webkit.cts.HttpAuthHandlerTest#testUseHttpAuthUsernamePassword;android.webkit.cts.WebViewTest#testSetLayoutParams;android.webkit.cts.WebViewTest#testAppInjectedXRequestedWithHeaderIsNotOverwritten;android.webkit.cts.WebSettingsTest#testAccessUseDoubleTree;android.webkit.cts.WebViewTest#testOnReceivedSslErrorCancel;android.webkit.cts.URLUtilTest#testIsHttpUrl;android.webkit.cts.DateSorterTest#testConstants;android.webkit.cts.WebSettingsTest#testAccessFixedFontFamily;android.webkit.cts.WebSettingsTest#testSetRenderPriority;android.webkit.cts.WebViewTest#testRemoveJavascriptInterface;android.webkit.cts.WebViewTest#testAndroidAssetAnchor;android.webkit.cts.WebViewTest#testOnReceivedSslError;android.webkit.cts.CookieTest#testEmptyValue;android.webkit.cts.WebViewTest#testPauseResumeTimers;android.webkit.cts.URLUtilTest#testIsContentUrl;android.webkit.cts.WebChromeClientTest#testBlockWindowsAsync;android.webkit.cts.WebViewTest#testGetVisibleTitleHeight;android.webkit.cts.WebBackForwardListTest#testClone;android.webkit.cts.WebSettingsTest#testAccessDefaultTextEncodingName;android.webkit.cts.URLUtilTest#testGuessUrl;android.webkit.cts.MimeTypeMapTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebChromeClientTest#testOnReceivedIcon;android.webkit.cts.CookieTest#testAndroidTestCaseSetupProperly;android.webkit.cts.CookieManagerTest#testRemoveCookies;android.webkit.cts.WebSettingsTest#testAccessPluginsPath;android.webkit.cts.WebSettingsTest#testAccessAllowFileAccess;android.webkit.cts.WebSettingsTest#testAccessSupportMultipleWindows;android.webkit.cts.WebViewTest#testAppCanInjectHeadersViaImmutableMap;android.webkit.cts.WebViewTest#testSecureSiteSetsCertificate;android.webkit.cts.WebViewTest#testSetWebViewClient;android.webkit.cts.WebViewTest#testSetScrollBarStyle;android.webkit.cts.CookieTest#testDomain;android.webkit.cts.WebViewTest#testZoom;android.webkit.cts.URLUtilTest#testIsDataUrl;android.webkit.cts.CookieManagerTest#testAcceptCookie;android.webkit.cts.WebChromeClientTest#testOnReceivedTitle;android.webkit.cts.URLUtilTest#testIsFileUrl;android.webkit.cts.WebSettingsTest#testAccessJavaScriptEnabled;android.webkit.cts.URLUtilTest#testIsNetworkUrl;android.webkit.cts.WebViewTest#testFindAddress;android.webkit.cts.WebViewTest#testSetNetworkAvailable;android.webkit.cts.WebViewTest#testClearSslPreferences;android.webkit.cts.URLUtilTest#testIsHttpsUrl;android.webkit.cts.MimeTypeMapTest#testGetFileExtensionFromUrl;android.webkit.cts.WebViewTest#testGetOriginalUrl;android.webkit.cts.WebChromeClientTest#testBlockWindowsSync;android.webkit.cts.WebViewTest#testLoadData;android.webkit.cts.WebViewTest#testInsecureSiteClearsCertificate;android.webkit.cts.WebBackForwardListTest#testGetCurrentItem;android.webkit.cts.URLUtilTest#testStripAnchor;android.webkit.cts.URLUtilTest#testGuessFileName;android.webkit.cts.URLUtilTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebViewTest#testEvaluateJavascript;android.webkit.cts.DateSorterTest#testConstructor;android.webkit.cts.WebViewTest#testPageScroll;android.webkit.cts.WebSettingsTest#testIframesWhenAccessFromFileURLsEnabled;android.webkit.cts.WebViewTest#testFlingScroll;android.webkit.cts.WebSettingsTest#testXHRWhenAccessFromFileURLsEnabled;android.webkit.cts.WebChromeClientTest#testOnJsPrompt;android.webkit.cts.WebSettingsTest#testAccessSupportZoom;android.webkit.cts.WebSettingsTest#testLoadsImagesAutomatically;android.webkit.cts.URLUtilTest#testIsValidUrl;android.webkit.cts.WebViewTest#testRequestFocusNodeHref;android.webkit.cts.WebViewTest#testLoadDataWithBaseUrl;android.webkit.cts.WebChromeClientTest#testOnJsAlert;android.webkit.cts.WebSettingsTest#testAccessSansSerifFontFamily;android.webkit.cts.CookieManagerTest#testCookieManager;android.webkit.cts.WebViewTest#testSetMapTrackballToArrowKeys;android.webkit.cts.WebViewTest#testCreatingWebViewCreatesCookieSyncManager;android.webkit.cts.DateSorterTest#testGetIndex;android.webkit.cts.GeolocationTest#testGeolocationPermissions;android.webkit.cts.WebChromeClientTest#testOnJsBeforeUnload;android.webkit.cts.CookieManagerTest#testClone;android.webkit.cts.CookieManagerTest#testGetInstance;android.webkit.cts.WebViewTest#testGetZoomControls;android.webkit.cts.CookieTest#testSubDomain;android.webkit.cts.WebSettingsTest#testUserAgentString_default;android.webkit.cts.MimeTypeMapTest#testGetMimeTypeFromExtension;android.webkit.cts.WebSettingsTest#testBlockNetworkImage;android.webkit.cts.WebViewTest#testPlatformNotifications;android.webkit.cts.URLUtilTest#testIsAboutUrl;android.webkit.cts.WebViewTest#testSetPictureListener;android.webkit.cts.MimeTypeMapTest#testHasMimeType;android.webkit.cts.WebViewTest#testOnReceivedSslErrorProceed;android.webkit.cts.DateSorterTest#testGetLabel;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestAcceptAlways;android.webkit.cts.URLUtilTest#testDecode;android.webkit.cts.HttpAuthHandlerTest#testProceed;android.webkit.cts.WebSettingsTest#testSetNeedInitialFocus;android.webkit.cts.WebSettingsTest#testIframesWhenAccessFromFileURLsDisabled;android.webkit.cts.WebSettingsTest#testAccessCursiveFontFamily;android.webkit.cts.WebViewTest#testFindAll;android.webkit.cts.WebViewTest#testStopLoading;android.webkit.cts.DateSorterTest#testAndroidTestCaseSetupProperly;android.webkit.cts.WebSettingsTest#testAccessDefaultFixedFontSize;android.webkit.cts.CookieManagerTest#testb3167208;android.webkit.cts.WebSettingsTest#testAccessMinimumFontSize;android.webkit.cts.WebSettingsTest#testAccessUseWideViewPort;android.webkit.cts.WebSettingsTest#testAccessSaveFormData;android.webkit.cts.WebViewTest#testRequestChildRectangleOnScreen;android.webkit.cts.URLUtilTest#testIsJavaScriptUrl;android.webkit.cts.WebViewTest#testFindNext;android.webkit.cts.MimeTypeMapTest#testHasExtension;android.webkit.cts.WebViewTest#testSetDownloadListener;android.webkit.cts.WebSettingsTest#testXHRWhenAccessFromFileURLsDisabled;android.webkit.cts.WebViewTest#testDestroy;android.webkit.cts.MimeTypeMapTest#testGetSingleton;android.webkit.cts.WebViewTest#testAndroidAssetQueryParam;android.webkit.cts.WebViewTest#testAccessPluginList;android.webkit.cts.CookieTest#testPath;android.webkit.cts.WebViewTest#testAccessHttpAuthUsernamePassword;android.webkit.cts.WebViewTest#testUseRemovedJavascriptInterface;android.webkit.cts.WebSettingsTest#testAccessTextSize;android.webkit.cts.URLUtilTest#testIsAssetUrl;android.webkit.cts.CookieTest#testInvalidDomain;android.webkit.cts.CookieSyncManagerTest#testCookieSyncManager;android.webkit.cts.URLUtilTest#testComposeSearchUrl;android.webkit.cts.WebChromeClientTest#testWindows;android.webkit.cts.WebViewTest#testRequestImageRef;android.webkit.cts.WebSettingsTest#testAccessDefaultFontSize;android.webkit.cts.WebViewClientTest#testShouldOverrideKeyEvent;android.webkit.cts.WebHistoryItemTest#testWebHistoryItem;android.webkit.cts.WebSettingsTest#testAccessBuiltInZoomControls;android.webkit.cts.WebSettingsTest#testAppCacheDisabled;android.webkit.cts.WebViewTest#testSetWebChromeClient;android.webkit.cts.WebViewTest#testGetHitTestResult;android.webkit.cts.WebSettingsTest#testAccessStandardFontFamily;android.webkit.cts.GeolocationTest#testSimpleGeolocationRequestReject;android.webkit.cts.WebSettingsTest#testBlockNetworkLoads;android.webkit.cts.DateSorterTest#testGetBoundary;android.webkit.cts.WebViewTest#testCapturePicture;android.webkit.cts.WebSettingsTest#testAccessPluginsEnabled;android.webkit.cts.WebViewTest#testSaveAndRestoreState;android.webkit.cts.WebViewTest#testLoadUrl;android.webkit.cts.HttpAuthHandlerTest#testCancel;android.webkit.cts.URLUtilTest#testIsCookielessProxyUrl;android.webkit.cts.WebViewTest#testGetFavicon;android.webkit.cts.MimeTypeMapTest#testGetExtensionFromMimeType" />
+  <Entry uri="android.widget" exclude="android.widget.cts.ImageSwitcherTest#testSetImageDrawable;android.widget.cts.ExpandableListViewTest#testOnSaveInstanceState;android.widget.cts.RemoteViewsTest#testSetFloat;android.widget.cts.ToggleButtonTest#testConstructor;android.widget.cts.CursorTreeAdapterTest#testOnGroupCollapsed;android.widget.cts.ListViewTest#testDispatchDraw;android.widget.cts.HorizontalScrollViewTest#testRequestLayout;android.widget.cts.TextViewTest#testDrawableResolution;android.widget.cts.CursorTreeAdapterTest#testGetGroup;android.widget.cts.RemoteViewsTest#testSetBoolean;android.widget.cts.SimpleExpandableListAdapterTest#testGetChildrenCount;android.widget.cts.TimePickerTest#testSetEnabled;android.widget.cts.RemoteViewsTest#testSetChronometer;android.widget.cts.BaseExpandableListAdapterTest#testNotifyDataSetChanged;android.widget.cts.TextViewTest#testConstructor;android.widget.cts.FrameLayoutTest#testGenerateLayoutParams2;android.widget.cts.FrameLayoutTest#testGenerateLayoutParams1;android.widget.cts.DialerFilterTest#testClearText;android.widget.cts.ListViewTest#testFindViewWithTagTraversal;android.widget.cts.TextViewTest#testGetResolvedTextAlignmentWithInheritance;android.widget.cts.SimpleAdapterTest#testSetDropDownViewResource;android.widget.cts.GalleryTest#testShowContextMenu;android.widget.cts.ExpandableListViewTest#testSetChildIndicator;android.widget.cts.GalleryTest#testConstructor;android.widget.cts.CursorTreeAdapterTest#testGetGroupCount;android.widget.cts.TextViewTest#testDebug;android.widget.cts.ExpandableListViewTest#testSetIndicatorBounds;android.widget.cts.AutoCompleteTextViewTest#testOnKeyPreIme;android.widget.cts.TextViewTest#testOnTrackballEvent;android.widget.cts.ExpandableListViewTest#testAndroidTestCaseSetupProperly;android.widget.cts.PopupWindowTest#testAccessBackground;android.widget.cts.PopupWindowTest#testGetMaxAvailableHeight;android.widget.cts.TextViewTest#testGetTotalPaddingLeft;android.widget.cts.AutoCompleteTextViewTest#testAccessAdapter;android.widget.cts.AutoCompleteTextViewTest#testPerformCompletion;android.widget.cts.ZoomButtonTest#testDispatchUnhandledMove;android.widget.cts.AbsSpinnerTest#testOnMeasure;android.widget.cts.TextViewTest#testOnWindowFocusChanged;android.widget.cts.PopupWindowTest#testUpdateDimensionAndAlignAnchorViewWithOffsets;android.widget.cts.GridLayoutTest#testCheckLayoutParams;android.widget.cts.TabHostTest#testNewTabSpec;android.widget.cts.ViewAnimatorTest#testGetCurrentView;android.widget.cts.ListViewTest#testDispatchKeyEvent;android.widget.cts.TextViewTest#testSetMinEms;android.widget.cts.FrameLayoutTest#testGatherTransparentRegion;android.widget.cts.AbsListViewTest#testDraw;android.widget.cts.ZoomControlsTest#testHasFocus;android.widget.cts.RemoteViews_ActionExceptionTest#testConstructor;android.widget.cts.ViewFlipperTest#testActivityTestCaseSetUpProperly;android.widget.cts.RemoteViewsTest#testSetString;android.widget.cts.SimpleExpandableListAdapterTest#testConstructor;android.widget.cts.GalleryTest#testComputeHorizontalScrollExtent;android.widget.cts.DialerFilterTest#testGetFilterText;android.widget.cts.RadioGroupTest#testGenerateDefaultLayoutParams;android.widget.cts.DialerFilterTest#testSetFilterWatcher;android.widget.cts.CheckBoxTest#testConstructor;android.widget.cts.ProgressBarTest#testDrawableStateChanged;android.widget.cts.MultiAutoCompleteTextViewTest#testPerformFiltering;android.widget.cts.TextViewTest#testOnKeyMultiple;android.widget.cts.ProgressBarTest#testPostInvalidate;android.widget.cts.SlidingDrawerTest#testOpenAndClose;android.widget.cts.AutoCompleteTextViewTest#testConstructor;android.widget.cts.TextViewTest#testSetLineSpacing;android.widget.cts.ListViewTest#testFindViewTraversal;android.widget.cts.RadioGroupTest#testGetCheckedRadioButtonId;android.widget.cts.TabHostTest#testSetup2;android.widget.cts.TableLayout_LayoutParamsTest#testConstructor;android.widget.cts.HorizontalScrollViewTest#testRequestChildFocus;android.widget.cts.TabWidgetTest#testDispatchDraw;android.widget.cts.PopupWindowTest#testUpdate;android.widget.cts.BaseAdapterTest#testNotifyDataSetInvalidated;android.widget.cts.ProgressBarTest#testOnSaveAndRestoreInstanceState;android.widget.cts.TabHostTest#testSetup1;android.widget.cts.TextViewTest#testOnMeasure;android.widget.cts.CompoundButtonTest#testAccessInstanceState;android.widget.cts.TabWidgetTest#testOnFocusChange;android.widget.cts.DialerFilterTest#testOnFinishInflate;android.widget.cts.ImageViewTest#testSetSelected;android.widget.cts.TextViewTest#testDrawableResolution2;android.widget.cts.ExpandableListViewWithHeadersTest#testPreconditions;android.widget.cts.AbsListViewTest#testSetFilterText;android.widget.cts.ExpandableListViewTest#testGetAdapter;android.widget.cts.TextViewTest#testSingleLine;android.widget.cts.HorizontalScrollViewTest#testComputeScroll;android.widget.cts.CursorAdapterTest#testRunQueryOnBackgroundThread;android.widget.cts.ToastTest#testMakeText2;android.widget.cts.CursorAdapterTest#testGetView;android.widget.cts.ViewSwitcherTest#testSetFactory;android.widget.cts.ToastTest#testMakeText1;android.widget.cts.GridViewTest#testAccessStretchMode;android.widget.cts.AutoCompleteTextViewTest#testGetThreshold;android.widget.cts.RemoteViewsTest#testConstructor;android.widget.cts.AbsListViewTest#testCheckLayoutParams;android.widget.cts.ViewAnimatorTest#testSetAnimateFirstView;android.widget.cts.DigitalClockTest#testActivityTestCaseSetUpProperly;android.widget.cts.SlidingDrawerTest#testAnimateOpenAndClose;android.widget.cts.PopupWindowTest#testAccessFocusable;android.widget.cts.TimePickerTest#testSetOnTimeChangedListener;android.widget.cts.ScrollViewTest#testGetMaxScrollAmount;android.widget.cts.CursorAdapterTest#testOnContentChanged;android.widget.cts.TextViewTest#testGetTotalPaddingBottom;android.widget.cts.AnalogClockTest#testOnMeasure;android.widget.cts.RadioGroupTest#testCheck;android.widget.cts.CursorTreeAdapterTest#testNotifyDataSetChanged;android.widget.cts.TwoLineListItemTest#testActivityTestCaseSetUpProperly;android.widget.cts.AbsListViewTest#testGetContextMenuInfo;android.widget.cts.ViewAnimatorTest#testAccessOutAnimation;android.widget.cts.SlidingDrawerTest#testConstructor;android.widget.cts.TimePickerTest#testOnSaveInstanceStateAndOnRestoreInstanceState;android.widget.cts.AbsListViewTest#testAccessFastScrollEnabled;android.widget.cts.BaseAdapterTest#testGetItemViewType;android.widget.cts.AbsListViewTest#testSetOnScrollListener;android.widget.cts.ImageViewTest#testSetImageURI;android.widget.cts.RadioGroupTest#testOnFinishInflate;android.widget.cts.TableRowTest#testGenerateLayoutParams;android.widget.cts.DialerFilterTest#testGetLetters;android.widget.cts.HorizontalScrollViewTest#testComputeHorizontalScrollRange;android.widget.cts.TextViewTest#testSetPadding;android.widget.cts.VideoViewTest#testPlayVideo1;android.widget.cts.ArrayAdapterTest#testRemove;android.widget.cts.GridViewTest#testGetNumColumns;android.widget.cts.AbsSpinnerTest#testSetSelectionIntBoolean;android.widget.cts.LayoutDirectionTest#testDirectionForAllLayoutsWithCode;android.widget.cts.SimpleCursorAdapterTest#testAccessStringConversionColumn;android.widget.cts.ViewAnimatorTest#testGetBaseline;android.widget.cts.ChronometerTest#testConstructor;android.widget.cts.ResourceCursorTreeAdapterTest#testConstructor;android.widget.cts.AdapterViewTest#testGetPositionForView;android.widget.cts.GridViewTest#testSetVerticalSpacing;android.widget.cts.ButtonTest#testAndroidTestCaseSetupProperly;android.widget.cts.ToggleButtonTest#testToggleText;android.widget.cts.RatingBarTest#testSetMax;android.widget.cts.RemoteViewsTest#testSetViewVisibility;android.widget.cts.ScrollViewTest#testOnTouchEvent;android.widget.cts.BaseAdapterTest#testIsEnabled;android.widget.cts.ExpandableListViewTest#testSetOnChildClickListener;android.widget.cts.EditTextTest#testAndroidTestCaseSetupProperly;android.widget.cts.TextViewTest#testMarquee;android.widget.cts.ImageViewTest#testActivityTestCaseSetUpProperly;android.widget.cts.RadioGroupTest#testConstructors;android.widget.cts.DialerFilterTest#testAccessMode;android.widget.cts.DatePickerTest#testInit;android.widget.cts.TextViewTest#testGetTextColors;android.widget.cts.ProgressBarTest#testAccessProgress;android.widget.cts.TextViewTest#testGetPaint;android.widget.cts.SimpleExpandableListAdapterTest#testNewGroupView;android.widget.cts.AdapterView_AdapterContextMenuInfoTest#testConstructor;android.widget.cts.CompoundButtonTest#testConstructor;android.widget.cts.ImageViewTest#testSetImageLevel;android.widget.cts.SimpleCursorTreeAdapterTest#testBindGroupView;android.widget.cts.SimpleExpandableListAdapterTest#testGetGroup;android.widget.cts.TabWidgetTest#testFocusCurrentTab;android.widget.cts.RelativeLayoutTest#testOnLayout;android.widget.cts.ScrollViewTest#testComputeScroll;android.widget.cts.TextViewTest#testAccessHintTextColor;android.widget.cts.TableLayoutTest#testAccessShrinkAllColumns;android.widget.cts.RemoteViewsTest#testGetPackage;android.widget.cts.GridViewTest#testAttachLayoutAnimationParameters;android.widget.cts.LinearLayout_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.CompoundButtonTest#testAndroidTestCaseSetupProperly;android.widget.cts.ImageViewTest#testSetImageDrawable;android.widget.cts.AdapterViewTest#testAccessVisiblePosition;android.widget.cts.ListViewTest#testSaveAndRestoreInstanceState;android.widget.cts.CompoundButtonTest#testToggle;android.widget.cts.TextViewTest#testMoveCursorToVisibleOffset;android.widget.cts.AutoCompleteTextViewTest#testAccessDropDownWidth;android.widget.cts.RadioGroupTest#testGenerateLayoutParams;android.widget.cts.AdapterViewTest#testCanAnimate;android.widget.cts.ScrollViewTest#testOnLayout;android.widget.cts.AutoCompleteTextViewTest#testEnoughToFilter;android.widget.cts.CheckedTextViewTest#testOnCreateDrawableState;android.widget.cts.RelativeLayout_LayoutParamsTest#testDebug;android.widget.cts.ToastTest#testAccessDuration;android.widget.cts.ToggleButtonTest#testSetChecked;android.widget.cts.HeaderViewListAdapterTest#testGetFootersCount;android.widget.cts.GridLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.AbsListViewTest#testAccessSmoothScrollbarEnabled;android.widget.cts.SlidingDrawerTest#testSetOnDrawerOpenListener;android.widget.cts.HeaderViewListAdapterTest#testGetHeadersCount;android.widget.cts.RemoteViewsTest#testSetLong;android.widget.cts.SlidingDrawerTest#testSetOnDrawerCloseListener;android.widget.cts.TextViewTest#testGetResolvedTextDirectionLtrWithInheritance;android.widget.cts.ScrollViewTest#testFullScroll;android.widget.cts.RelativeLayout_LayoutParamsTest#testAccessRule1;android.widget.cts.BaseExpandableListAdapterTest#testAreAllItemsEnabled;android.widget.cts.RelativeLayout_LayoutParamsTest#testAccessRule2;android.widget.cts.RemoteViewsActivityTest#testDerivedClass;android.widget.cts.ToastTest#testShowFailure;android.widget.cts.SimpleAdapterTest#testSetViewImage;android.widget.cts.TextViewTest#testAccessPrivateImeOptions;android.widget.cts.AdapterView_AdapterContextMenuInfoTest#testAndroidTestCaseSetupProperly;android.widget.cts.TwoLineListItemTest#testOnFinishInflate;android.widget.cts.ExpandableListViewTest#testGetExpandableListPosition;android.widget.cts.AbsListViewTest#testAccessListPadding;android.widget.cts.ExpandableListViewTest#testExpandGroup;android.widget.cts.TextViewTest#testGetUrls;android.widget.cts.LinearLayoutTest#testAccessBaselineAlignedChildIndex;android.widget.cts.CheckBoxTest#testAndroidTestCaseSetupProperly;android.widget.cts.ZoomControlsTest#testSetOnZoomInClickListener;android.widget.cts.AbsSpinnerTest#testGetCount;android.widget.cts.SimpleExpandableListAdapterTest#testNewChildView;android.widget.cts.ViewSwitcherTest#testConstructor;android.widget.cts.AutoCompleteTextViewTest#testReplaceText;android.widget.cts.ScrollViewTest#testAccessFillViewport;android.widget.cts.ToastTest#testShow;android.widget.cts.TextViewTest#testDrawableStateChanged;android.widget.cts.TimePickerTest#testGetBaseline;android.widget.cts.TextViewTest#testOnTouchEvent;android.widget.cts.ListViewTest#testOnFocusChanged;android.widget.cts.ImageViewTest#testDrawableStateChanged;android.widget.cts.FrameLayoutTest#testOnLayout;android.widget.cts.ListViewTest#testAccessItemsCanFocus;android.widget.cts.AutoCompleteTextViewTest#testOnCommitCompletion;android.widget.cts.ScrollViewTest#testAccessSmoothScrollingEnabled;android.widget.cts.TextViewTest#testSelection;android.widget.cts.CheckedTextViewTest#testOnDraw;android.widget.cts.ViewAnimatorTest#testConstructor;android.widget.cts.RadioGroupTest#testInternalPassThroughHierarchyChangeListener;android.widget.cts.SimpleCursorAdapterTest#testSetViewImage;android.widget.cts.AdapterViewTest#testGetSelected;android.widget.cts.ExpandableListViewWithHeadersTest#testSelectedPosition;android.widget.cts.ProgressBarTest#testAccessIndeterminateDrawable;android.widget.cts.TableLayoutTest#testSetOnHierarchyChangeListener;android.widget.cts.ExpandableListViewTest#testSetOnItemClickListener;android.widget.cts.ProgressBarTest#testSetVisibility;android.widget.cts.AutoCompleteTextViewTest#testConvertSelectionToString;android.widget.cts.ImageViewTest#testSetImageResource;android.widget.cts.ScrollViewTest#testGetVerticalFadingEdgeStrengths;android.widget.cts.FilterTest#testFilter2;android.widget.cts.CursorTreeAdapterTest#testAndroidTestCaseSetupProperly;android.widget.cts.FilterTest#testFilter1;android.widget.cts.ZoomControlsTest#testSetIsZoomOutEnabled;android.widget.cts.ScrollViewTest#testMeasureChildWithMargins;android.widget.cts.CompoundButtonTest#testSetOnCheckedChangeListener;android.widget.cts.TextViewTest#testGetEditableText;android.widget.cts.HorizontalScrollViewTest#testOnRequestFocusInDescendants;android.widget.cts.AbsSpinnerTest#testAccessAdapter;android.widget.cts.ChronometerTest#testAccessOnChronometerTickListener;android.widget.cts.HeaderViewListAdapterTest#testConstructor;android.widget.cts.FrameLayoutTest#testSetForegroundGravity;android.widget.cts.AbsSpinnerTest#testGetSelectedView;android.widget.cts.TextViewTest#testSetGetTextAlignment;android.widget.cts.TextViewTest#testGetLayout;android.widget.cts.ImageViewTest#testConstructor;android.widget.cts.ImageViewTest#testInvalidateDrawable;android.widget.cts.PopupWindowTest#testShowAsDropDownWithOffsets;android.widget.cts.PopupWindowTest#testIsAboveAnchor;android.widget.cts.AutoCompleteTextViewTest#testPerformFiltering;android.widget.cts.ViewFlipperTest#testConstructor;android.widget.cts.DatePickerTest#testUpdateDate;android.widget.cts.MultiAutoCompleteTextViewTest#testMultiAutoCompleteTextView;android.widget.cts.MultiAutoCompleteTextView_CommaTokenizerTest#testConstructor;android.widget.cts.RemoteViewsTest#testSetOnClickPendingIntent;android.widget.cts.HorizontalScrollViewTest#testScrollTo;android.widget.cts.HorizontalScrollViewTest#testOnTouchEvent;android.widget.cts.ListViewTest#testOnMeasure;android.widget.cts.TextViewTest#testSetHighlightColor;android.widget.cts.BaseExpandableListAdapterTest#testNotifyDataSetInvalidated;android.widget.cts.ExpandableListViewWithHeadersTest#testConvertionBetweenFlatAndPacked;android.widget.cts.HeaderViewListAdapterTest#testRemoveFooter;android.widget.cts.ListViewTest#testTransientStateStableIds;android.widget.cts.ScrollViewTest#testSmoothScrollBy;android.widget.cts.ViewSwitcherTest#testAndroidTestCaseSetupProperly;android.widget.cts.TextViewTest#testAccessAutoLinkMask;android.widget.cts.ScrollerTest#testScrollModeWithDefaultDuration;android.widget.cts.GalleryTest#testComputeHorizontalScrollRange;android.widget.cts.CheckedTextViewTest#testSetPadding;android.widget.cts.CursorTreeAdapterTest#testGetGroupId;android.widget.cts.RemoteViewsTest#testApply;android.widget.cts.DialerFilterTest#testIsQwertyKeyboard;android.widget.cts.GalleryTest#testShowContextMenuForChild;android.widget.cts.ScrollViewTest#testPageScroll;android.widget.cts.SimpleCursorTreeAdapterTest#testSetViewImage;android.widget.cts.TableLayoutTest#testOnLayout;android.widget.cts.ArrayAdapterTest#testGetPosition;android.widget.cts.TabWidgetTest#testOnSizeChanged;android.widget.cts.SimpleCursorAdapterTest#testNewDropDownView;android.widget.cts.AutoCompleteTextViewTest#testAccessListSelection;android.widget.cts.TextViewTest#testSetText1;android.widget.cts.TextViewTest#testSetText2;android.widget.cts.RemoteViewsActivityTest#testWebView;android.widget.cts.TextViewTest#testSetText3;android.widget.cts.ToastTest#testAccessGravity;android.widget.cts.HorizontalScrollViewTest#testAddViewWithIndex;android.widget.cts.ResourceCursorTreeAdapterTest#testNewChildView;android.widget.cts.HeaderViewListAdapterTest#testAndroidTestCaseSetupProperly;android.widget.cts.ExpandableListViewTest#testGetPackedPositionForGroup;android.widget.cts.ZoomControlsTest#testShowAndHide;android.widget.cts.CompoundButtonTest#testAccessChecked;android.widget.cts.SimpleAdapterTest#testGetView;android.widget.cts.DialerFilterTest#testGetDigits;android.widget.cts.ArrayAdapterTest#testDataChangeEvent;android.widget.cts.ImageSwitcherTest#testAndroidTestCaseSetupProperly;android.widget.cts.SimpleExpandableListAdapterTest#testGetChildView;android.widget.cts.ZoomControlsTest#testConstructor;android.widget.cts.CompoundButtonTest#testVerifyDrawable;android.widget.cts.TextViewTest#testSetEms;android.widget.cts.AbsSpinnerTest#testGenerateDefaultLayoutParams;android.widget.cts.TextViewTest#testAccessError;android.widget.cts.ZoomButtonTest#testOnTouchEvent;android.widget.cts.TextViewTest#testSetMaxLinesException;android.widget.cts.CompoundButtonTest#testSetButtonDrawableById;android.widget.cts.FrameLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.HorizontalScrollViewTest#testComputeScrollDeltaToGetChildRectOnScreen;android.widget.cts.ExpandableListViewTest#testSetSelectedChild;android.widget.cts.MediaControllerTest#testShow;android.widget.cts.CursorAdapterTest#testGetDropDownView;android.widget.cts.ListViewTest#testNoSelectableItems;android.widget.cts.TextViewTest#testGetBaseLine;android.widget.cts.AbsSpinnerTest#testConstructor;android.widget.cts.ListViewTest#testAccessDividerHeight;android.widget.cts.TabWidgetTest#testChildDrawableStateChanged;android.widget.cts.AbsListViewTest#testAccessSelectedItem;android.widget.cts.ScrollerTest#testTimePassed;android.widget.cts.ArrayAdapterTest#testGetItem;android.widget.cts.ImageViewTest#testVerifyDrawable;android.widget.cts.ProgressBarTest#testConstructor;android.widget.cts.ProgressBarTest#testIncrementSecondaryProgressBy;android.widget.cts.CursorTreeAdapterTest#testSetChildrenCursor;android.widget.cts.FrameLayoutTest#testCheckLayoutParams;android.widget.cts.AbsoluteLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.ZoomButtonTest#testOnKeyUp;android.widget.cts.BaseExpandableListAdapterTest#testGetCombinedId;android.widget.cts.ListViewTest#testSetSelection;android.widget.cts.SimpleCursorAdapterTest#testNewView;android.widget.cts.AutoCompleteTextViewTest#testPopupWindow;android.widget.cts.TextView_SaveStateTest#testWriteToParcel;android.widget.cts.TabHost_TabSpecTest#testSetContent2;android.widget.cts.SeekBarTest#testConstructor;android.widget.cts.TabHost_TabSpecTest#testSetContent1;android.widget.cts.TextViewTest#testSetExtractedText;android.widget.cts.TabHost_TabSpecTest#testSetContent3;android.widget.cts.SimpleExpandableListAdapterTest#testGetGroupCount;android.widget.cts.TextViewTest#testComputeVerticalScrollRange;android.widget.cts.GridLayoutTest#testAlignment;android.widget.cts.ExpandableListViewTest#testGetPackedPositionForChild;android.widget.cts.FrameLayoutTest#testConstructor;android.widget.cts.CursorAdapterTest#testAndroidTestCaseSetupProperly;android.widget.cts.RelativeLayoutTest#testSetHorizontalGravity;android.widget.cts.GalleryTest#testDispatchKeyEvent;android.widget.cts.ToastTest#testSetText1;android.widget.cts.HorizontalScrollViewTest#testFullScroll;android.widget.cts.RemoteViewsTest#testSetCharSequence;android.widget.cts.ToastTest#testSetText2;android.widget.cts.HeaderViewListAdapterTest#testRemoveHeader;android.widget.cts.TextSwitcherTest#testSetCurrentText;android.widget.cts.TwoLineListItemTest#testConstructor;android.widget.cts.MediaControllerTest#testMediaController;android.widget.cts.ListViewTest#testConstructor;android.widget.cts.AbsListViewTest#testAccessSelector;android.widget.cts.BaseExpandableListAdapterTest#testDataSetObserver;android.widget.cts.BaseAdapterTest#testHasStableIds;android.widget.cts.TextViewTest#testAccessImeActionLabel;android.widget.cts.CompoundButtonTest#testSetButtonDrawableByDrawable;android.widget.cts.AbsListViewTest#testLayoutChildren;android.widget.cts.ImageViewTest#testClearColorFilter;android.widget.cts.TextViewTest#testGetResolvedTextDirectionRtl;android.widget.cts.CheckedTextViewTest#testChecked;android.widget.cts.MultiAutoCompleteTextViewTest#testReplaceText;android.widget.cts.DigitalClockTest#testOnDetachedFromWindow;android.widget.cts.CursorTreeAdapterTest#testGetChildView;android.widget.cts.FrameLayout_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.ImageViewTest#testSetMaxWidth;android.widget.cts.TabHostTest#testDispatchWindowFocusChanged;android.widget.cts.DigitalClockTest#testConstructor;android.widget.cts.DialerFilterTest#testOnKeyUpDown;android.widget.cts.TextViewTest#testSetHorizontallyScrolling;android.widget.cts.HeaderViewListAdapterTest#testGetViewTypeCount;android.widget.cts.AbsSeekBarTest#testAccessKeyProgressIncrement;android.widget.cts.AbsSeekBarTest#testSetThumb;android.widget.cts.ProgressBarTest#testOnDraw;android.widget.cts.TextViewTest#testSetText;android.widget.cts.PopupWindowTest#testAccessContentView;android.widget.cts.GridLayoutTest#testConstructor;android.widget.cts.PopupWindowTest#testAccessHeight;android.widget.cts.ToggleButtonTest#testAndroidTestCaseSetupProperly;android.widget.cts.ProgressBarTest#testVerifyDrawable;android.widget.cts.TableRowTest#testOnLayout;android.widget.cts.RadioGroupTest#testInternalCheckedStateTracker;android.widget.cts.HorizontalScrollViewTest#testOnSizeChanged;android.widget.cts.ResourceCursorAdapterTest#testNewView;android.widget.cts.MultiAutoCompleteTextView_CommaTokenizerTest#testFindTokenEnd;android.widget.cts.ZoomButtonTest#testOnLongClick;android.widget.cts.AnalogClockTest#testOnDetachedFromWindow;android.widget.cts.TextViewTest#testSetMaxLines;android.widget.cts.ExpandableListViewTest#testPerformItemClick;android.widget.cts.TextViewTest#testResetTextDirection;android.widget.cts.ScrollViewTest#testScrollTo;android.widget.cts.TableLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.ImageViewTest#testSetAdjustViewBounds;android.widget.cts.TableRowTest#testCheckLayoutParams;android.widget.cts.CheckedTextViewTest#testToggle;android.widget.cts.RemoteViewsTest#testSetProgressBar;android.widget.cts.VideoViewTest#testSetOnErrorListener;android.widget.cts.GalleryTest#testDispatchSetPressed;android.widget.cts.HorizontalScrollViewTest#testSmoothScrollTo;android.widget.cts.ZoomControlsTest#testSetZoomSpeed;android.widget.cts.ExpandableListViewTest#testSetAdapter;android.widget.cts.AutoCompleteTextViewTest#testOnFilterComplete;android.widget.cts.ImageViewTest#testGetDrawable;android.widget.cts.CursorTreeAdapterTest#testRunQueryOnBackgroundThread;android.widget.cts.SlidingDrawerTest#testGetHandle;android.widget.cts.BaseAdapterTest#testAndroidTestCaseSetupProperly;android.widget.cts.MediaControllerTest#testOnTrackballEvent;android.widget.cts.GalleryTest#testGenerateLayoutParams;android.widget.cts.PopupWindowTest#testConstructor;android.widget.cts.GalleryTest#testFoo;android.widget.cts.PopupWindowTest#testAccessAnimationStyle;android.widget.cts.ToggleButtonTest#testAccessTextOn;android.widget.cts.AbsoluteLayoutTest#testGenerateLayoutParams1;android.widget.cts.TextViewTest#testGetDefaultEditable;android.widget.cts.AbsoluteLayoutTest#testGenerateLayoutParams2;android.widget.cts.ArrayAdapterTest#testGetFilter;android.widget.cts.CheckedTextViewTest#testSetCheckMarkDrawableById;android.widget.cts.ScrollerTest#testAbortAnimation;android.widget.cts.LinearLayout_LayoutParamsTest#testConstructor;android.widget.cts.TextViewTest#testComputeVerticalScrollExtent;android.widget.cts.AbsSpinnerTest#testSetSelectionInt;android.widget.cts.TabHostTest#testGetTabContentView;android.widget.cts.TextViewTest#testGetDefaultMovementMethod;android.widget.cts.ScrollViewTest#testRequestChildRectangleOnScreen;android.widget.cts.TabHostTest#testGetCurrentView;android.widget.cts.TextViewTest#testAccessFilters;android.widget.cts.GalleryTest#testCheckLayoutParams;android.widget.cts.RadioGroup_LayoutParamsTest#testConstructor;android.widget.cts.BaseExpandableListAdapterTest#testOnGroupExpanded;android.widget.cts.MultiAutoCompleteTextView_CommaTokenizerTest#testTerminateToken;android.widget.cts.ScrollViewTest#testConstructor;android.widget.cts.ListViewTest#testLayoutChildren;android.widget.cts.RemoteViewsTest#testSetImageViewUri;android.widget.cts.ViewAnimatorTest#testAccessDisplayedChild;android.widget.cts.ExpandableListViewTest#testCollapseGroup;android.widget.cts.AnalogClockTest#testConstructor;android.widget.cts.CursorAdapterTest#testConvertToString;android.widget.cts.BaseAdapterTest#testIsEmpty;android.widget.cts.ResourceCursorTreeAdapterTest#testNewGroupView;android.widget.cts.ScrollViewTest#testFling;android.widget.cts.SlidingDrawerTest#testOnMeasure;android.widget.cts.TextViewTest#testSetMaxEms;android.widget.cts.LinearLayoutTest#testGenerateLayoutParams;android.widget.cts.PopupWindowTest#testAccessInputMethodMode;android.widget.cts.ListViewTest#testPerformItemClick;android.widget.cts.TextViewTest#testOnTextChanged;android.widget.cts.GridViewTest#testSetSelection;android.widget.cts.CursorAdapterTest#testHasStableIds;android.widget.cts.ProgressBarTest#testSetIndeterminate;android.widget.cts.TableRowTest#testGetVirtualChildCount;android.widget.cts.AutoCompleteTextViewTest#testOnTextChanged;android.widget.cts.TextViewTest#testSetLinesException;android.widget.cts.TextViewTest#testLength;android.widget.cts.RelativeLayoutTest#testSetGravity;android.widget.cts.RelativeLayoutTest#testConstructor;android.widget.cts.TextViewTest#testGetLineHeight;android.widget.cts.GalleryTest#testSetAnimationDuration;android.widget.cts.PopupWindowTest#testAccessTouchable;android.widget.cts.RelativeLayoutTest#testSetVerticalGravity;android.widget.cts.CursorTreeAdapterTest#testConstructor;android.widget.cts.AbsSpinnerTest#testRequestLayout;android.widget.cts.TextViewTest#testOnKeyShortcut;android.widget.cts.TableRowTest#testGetVirtualChildAt;android.widget.cts.SpinnerTest#testConstructor;android.widget.cts.SimpleAdapterTest#testGetDropDownView;android.widget.cts.ScrollViewTest#testAddViewWithLayoutParams;android.widget.cts.HeaderViewListAdapterTest#testGetItemViewType;android.widget.cts.RadioGroupTest#testSetOnCheckedChangeListener;android.widget.cts.ToggleButtonTest#testOnFinishInflate;android.widget.cts.DialerFilterTest#testAppend;android.widget.cts.HorizontalScrollViewTest#testRequestChildRectangleOnScreen;android.widget.cts.RadioButtonTest#testConstructor;android.widget.cts.PopupWindowTest#testDismiss;android.widget.cts.TableLayoutTest#testAddView2;android.widget.cts.TableLayoutTest#testAddView3;android.widget.cts.TabHostTest#testOnTouchModeChanged;android.widget.cts.TableLayoutTest#testAddView4;android.widget.cts.HeaderViewListAdapterTest#testGetWrappedAdapter;android.widget.cts.TableLayoutTest#testAddView1;android.widget.cts.ImageSwitcherTest#testSetImageResource;android.widget.cts.ToggleButtonTest#testDrawableStateChanged;android.widget.cts.EditTextTest#testSetSelectionIndex;android.widget.cts.EditTextTest#testExtendSelection;android.widget.cts.AbsSeekBarTest#testSetMax;android.widget.cts.CursorTreeAdapterTest#testChangeCursor;android.widget.cts.AdapterViewTest#testItemOrItemIdAtPosition;android.widget.cts.HorizontalScrollViewTest#testDispatchKeyEvent;android.widget.cts.TableRowTest#testGenerateDefaultLayoutParams;android.widget.cts.AbsListViewTest#testSetRecyclerListener;android.widget.cts.GalleryTest#testGetContextMenuInfo;android.widget.cts.AbsListViewTest#testAccessStackFromBottom;android.widget.cts.TextViewTest#testAccessText;android.widget.cts.SpinnerTest#testGetBaseline;android.widget.cts.ScrollViewTest#testRequestChildFocus;android.widget.cts.LinearLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.ButtonTest#testConstructor;android.widget.cts.ResourceCursorAdapterTest#testSetViewResource;android.widget.cts.ExpandableListViewBasicTest#testContextMenus;android.widget.cts.FrameLayoutTest#testVerifyDrawable;android.widget.cts.ExpandableListViewTest#testGetPackedPositionType;android.widget.cts.LinearLayoutTest#testLayoutHorizontal;android.widget.cts.ScrollViewTest#testComputeVerticalScrollRange;android.widget.cts.GridViewTest#testOnFocusChanged;android.widget.cts.ZoomControlsTest#testOnTouchEvent;android.widget.cts.GridViewTest#testActivityTestCaseSetUpProperly;android.widget.cts.ListViewTest#testAccessItemChecked;android.widget.cts.AbsoluteLayoutTest#testConstructor;android.widget.cts.TextViewTest#testComputeHorizontalScrollRange;android.widget.cts.HorizontalScrollViewTest#testAddViewWithLayoutParams;android.widget.cts.RemoteViewsTest#testGetLayoutId;android.widget.cts.CursorTreeAdapterTest#testNotifyDataSetChangedBoolean;android.widget.cts.TableRow_LayoutParamsTest#testSetBaseAttributes;android.widget.cts.HorizontalScrollViewTest#testMeasureChildWithMargins;android.widget.cts.TextViewTest#testSetIncludeFontPadding;android.widget.cts.HorizontalScrollViewTest#testAddView;android.widget.cts.TimePickerTest#testAccessCurrentMinute;android.widget.cts.TextViewTest#testGetExtendedPaddingBottom;android.widget.cts.BaseExpandableListAdapterTest#testIsEmpty;android.widget.cts.SimpleAdapterTest#testAccessViewBinder;android.widget.cts.SpinnerTest#testOnLayout;android.widget.cts.AutoCompleteTextViewTest#testAccessValidater;android.widget.cts.ScrollViewTest#testAddViewWithIndex;android.widget.cts.FrameLayoutTest#testDrawableStateChanged;android.widget.cts.PopupWindowTest#testSetTouchInterceptor;android.widget.cts.SimpleAdapterTest#testGetItem;android.widget.cts.ImageViewTest#testSetColorFilter1;android.widget.cts.ImageViewTest#testSetColorFilter2;android.widget.cts.SlidingDrawerTest#testDispatchDraw;android.widget.cts.TextViewTest#testSetOnEditorActionListener;android.widget.cts.DatePickerTest#testSetEnabled;android.widget.cts.RemoteViewsTest#testReapply;android.widget.cts.TextViewTest#testCompound;android.widget.cts.AdapterViewTest#testAccessEmptyView;android.widget.cts.Gallery_LayoutParamsTest#testConstructor;android.widget.cts.TextViewTest#testGetResolvedTextDirectionRtlWithInheritance;android.widget.cts.PopupWindowTest#testShowAtLocation;android.widget.cts.TextViewTest#testPerformLongClick;android.widget.cts.ExpandableListViewTest#testSetChildDivider;android.widget.cts.PopupWindowTest#testAccessClippingEnabled;android.widget.cts.RemoteViewsTest#testSetTextViewText;android.widget.cts.ScrollViewTest#testMeasureChild;android.widget.cts.TableLayoutTest#testAccessColumnShrinkable;android.widget.cts.TableRow_LayoutParamsTest#testConstructor;android.widget.cts.GalleryTest#testComputeHorizontalScrollOffset;android.widget.cts.ProgressBarTest#testOnMeasure;android.widget.cts.ProgressBarTest#testAccessProgressDrawable;android.widget.cts.SimpleAdapterTest#testGetFilter;android.widget.cts.RadioGroupTest#testSetOnHierarchyChangeListener;android.widget.cts.AbsListViewTest#testHandleDataChanged;android.widget.cts.AbsListViewTest#testShowContextMenuForChild;android.widget.cts.ExpandableListViewTest#testConstructor;android.widget.cts.HeaderViewListAdapterTest#testIsEmpty;android.widget.cts.AlphabetIndexerTest#testAlphabetIndexer;android.widget.cts.ChronometerTest#testAccessBase;android.widget.cts.TextViewTest#testAccessRawContentType;android.widget.cts.ScrollViewTest#testExecuteKeyEvent;android.widget.cts.SpinnerTest#testAccessPrompt;android.widget.cts.AnalogClockTest#testOnDraw;android.widget.cts.ChronometerTest#testStartAndStop;android.widget.cts.TabWidgetTest#testSetCurrentTab;android.widget.cts.CursorTreeAdapterTest#testGetFilter;android.widget.cts.ImageSwitcherTest#testSetImageURI;android.widget.cts.TabHostTest#testSetOnTabChangedListener;android.widget.cts.ScrollViewTest#testSmoothScrollTo;android.widget.cts.SimpleExpandableListAdapterTest#testGetGroupId;android.widget.cts.AbsListViewTest#testAccessCacheColorHint;android.widget.cts.TabHostTest#testSetCurrentTabByTag;android.widget.cts.HeaderViewListAdapterTest#testIsEnabled;android.widget.cts.ImageViewTest#testSetImageState;android.widget.cts.ExpandableListViewTest#testSetSelectedGroup;android.widget.cts.DialerFilterTest#testRemoveFilterWatcher;android.widget.cts.ToggleButtonTest#testAccessTextOff;android.widget.cts.TextViewTest#testSetSelectAllOnFocus;android.widget.cts.TextViewTest#testAccessKeyListener;android.widget.cts.ArrayAdapterTest#testInsert;android.widget.cts.MediaControllerTest#testSetPrevNextListeners;android.widget.cts.PopupWindowTest#testUpdatePositionAndDimension;android.widget.cts.TextViewTest#testOnDraw;android.widget.cts.TextViewTest#testSetFrame;android.widget.cts.ScrollerTest#testAccessFinalX;android.widget.cts.ScrollerTest#testAccessFinalY;android.widget.cts.AdapterViewTest#testOnLayout;android.widget.cts.ScrollViewTest#testOnRequestFocusInDescendants;android.widget.cts.TextViewTest#testCancelLongPress;android.widget.cts.GridViewTest#testAccessAdapter;android.widget.cts.ZoomButtonTest#testSetZoomSpeed;android.widget.cts.ExpandableListViewTest#testGetPackedPositionGroup;android.widget.cts.ExpandableListViewTest#testSetGroupIndicator;android.widget.cts.TextViewTest#testGetResolvedTextDirectionLtr;android.widget.cts.BaseAdapterTest#testGetDropDownView;android.widget.cts.ViewAnimatorTest#testShowPrevious;android.widget.cts.TextViewTest#testOnCreateContextMenu;android.widget.cts.TextViewTest#testAppend;android.widget.cts.DialerFilterTest#testOnFocusChanged;android.widget.cts.SlidingDrawerTest#testOnLayout;android.widget.cts.TextViewTest#testGetFocusedRect;android.widget.cts.TextSwitcherTest#testAddView;android.widget.cts.ExpandableListViewTest#testSetChildIndicatorBounds;android.widget.cts.RemoteViewsTest#testSetImageViewBitmap;android.widget.cts.CursorTreeAdapterTest#testHasStableIds;android.widget.cts.ToastTest#testConstructor;android.widget.cts.CursorTreeAdapterTest#testConvertToString;android.widget.cts.AbsListViewTest#testGetTopBottomFadingEdgeStrength;android.widget.cts.EditTextTest#testGetDefaultMovementMethod;android.widget.cts.AbsListViewTest#testAddTouchables;android.widget.cts.SeekBarTest#testSetOnSeekBarChangeListener;android.widget.cts.TextViewTest#testAccessLinkTextColor;android.widget.cts.TextViewTest#testAccessEllipsize;android.widget.cts.RatingBarTest#testAccessNumStars;android.widget.cts.ImageViewTest#testGetBaseline;android.widget.cts.AnalogClockTest#testOnAttachedToWindow;android.widget.cts.LayoutDirectionTest#testDirectionInheritanceForAllLayoutsWithCode;android.widget.cts.AutoCompleteTextViewTest#testAccessItemSelectedListener;android.widget.cts.TextSwitcherTest#testConstructor;android.widget.cts.TextViewTest#testGetResolvedTextAlignment;android.widget.cts.ExpandableListView_ExpandableListContextMenuInfoTest#testConstructor;android.widget.cts.HeaderViewListAdapterTest#testGetFilter;android.widget.cts.AbsSeekBarTest#testConstructor;android.widget.cts.ZoomControlsTest#testSetOnZoomOutClickListener;android.widget.cts.ArrayAdapterTest#testSort;android.widget.cts.HorizontalScrollViewTest#testFling;android.widget.cts.GridViewTest#testConstructor;android.widget.cts.RemoteViewsTest#testNotFeasibleSetters;android.widget.cts.RemoteViewsTest#testWriteToParcel;android.widget.cts.ScrollViewTest#testAddView;android.widget.cts.FilterTest#testConstructor;android.widget.cts.SimpleExpandableListAdapterTest#testGetChildId;android.widget.cts.AutoCompleteTextViewTest#testOnDetachedFromWindow;android.widget.cts.ScrollViewTest#testRequestLayout;android.widget.cts.ImageButtonTest#testConstructor;android.widget.cts.EditTextTest#testSelectAll;android.widget.cts.PopupWindowTest#testSetOnDismissListener;android.widget.cts.TimePickerTest#testAccessCurrentHour;android.widget.cts.ArrayAdapterTest#testCreateFromResource;android.widget.cts.TextViewTest#testSetShadowLayer;android.widget.cts.CompoundButtonTest#testOnCreateDrawableState;android.widget.cts.SimpleCursorAdapterTest#testChangeCursorAndColumns;android.widget.cts.ImageViewTest#testSetFrame;android.widget.cts.ArrayAdapterTest#testSetDropDownViewResouce;android.widget.cts.ResourceCursorAdapterTest#testNewDropDownView;android.widget.cts.ToastTest#testCancel;android.widget.cts.RatingBarTest#testAccessStepSize;android.widget.cts.CheckedTextViewTest#testSetCheckMarkDrawableByDrawable;android.widget.cts.TextViewTest#testInstanceState;android.widget.cts.AbsListViewTest#testGetFocusedRect;android.widget.cts.ViewAnimatorTest#testAddView;android.widget.cts.AdapterViewTest#testUnsupportedMethods;android.widget.cts.TextViewTest#testOnPrivateIMECommand;android.widget.cts.CursorAdapterTest#testAccessCursor;android.widget.cts.TextViewTest#testBringPointIntoView;android.widget.cts.SpinnerTest#testOnClick;android.widget.cts.TextViewTest#testSetEditableFactory;android.widget.cts.ViewSwitcherTest#testGetNextView;android.widget.cts.AbsSeekBarTest#testAccessThumbOffset;android.widget.cts.AbsoluteLayout_LayoutParamsTest#testDebug;android.widget.cts.DatePickerTest#testAccessDate;android.widget.cts.CursorAdapterTest#testConstructor;android.widget.cts.HorizontalScrollViewTest#testPageScroll;android.widget.cts.AutoCompleteTextViewTest#testPerformValidation;android.widget.cts.TextViewTest#testAccessLinksClickable;android.widget.cts.SlidingDrawerTest#testGetContent;android.widget.cts.ViewAnimatorTest#testShowNext;android.widget.cts.TextViewTest#testResetTextAlignment;android.widget.cts.ScrollerTest#testFlingMode;android.widget.cts.SlidingDrawerTest#testOnInterceptTouchEvent;android.widget.cts.DatePickerTest#testConstructor;android.widget.cts.TableLayoutTest#testAccessColumnCollapsed;android.widget.cts.AbsSeekBarTest#testVerifyDrawable;android.widget.cts.ScrollViewTest#testOnSizeChanged;android.widget.cts.TimePickerTest#testConstructors;android.widget.cts.TextViewTest#testAccessTransformationMethod;android.widget.cts.SimpleCursorTreeAdapterTest#testBindChildView;android.widget.cts.ScrollerTest#testExtendDuration;android.widget.cts.RatingBarTest#testAccessRating;android.widget.cts.RelativeLayoutTest#testCheckLayoutParams;android.widget.cts.GalleryTest#testGenerateDefaultLayoutParams;android.widget.cts.AbsoluteLayoutTest#testCheckLayoutParams;android.widget.cts.SlidingDrawerTest#testOnFinishInflate;android.widget.cts.EditTextTest#testSetSelectionStartstop;android.widget.cts.ToggleButtonTest#testSetBackgroundDrawable;android.widget.cts.HeaderViewListAdapterTest#testRegisterDataSetObserver;android.widget.cts.TextViewTest#testAccessFreezesText;android.widget.cts.ArrayAdapterTest#testAndroidTestCaseSetupProperly;android.widget.cts.ExpandableListViewTest#testGetSelectedPosition;android.widget.cts.TabHostTest#testGetCurrentTabTag;android.widget.cts.GridViewTest#testOnMeasure;android.widget.cts.HeaderViewListAdapterTest#testGetItemId;android.widget.cts.RadioButtonTest#testToggle;android.widget.cts.TextViewTest#testOnFocusChanged;android.widget.cts.AbsoluteLayout_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.ViewAnimatorTest#testAccessInAnimation;android.widget.cts.AdapterViewTest#testDispatchSaveInstanceState;android.widget.cts.HeaderViewListAdapterTest#testHasStableIds;android.widget.cts.RelativeLayoutTest#testOnMeasure;android.widget.cts.HorizontalScrollViewTest#testSmoothScrollBy;android.widget.cts.ListViewTest#testTransientStateUnstableIds;android.widget.cts.TableRowTest#testConstructor;android.widget.cts.TabHost_TabSpecTest#testSetIndicator2;android.widget.cts.ArrayAdapterTest#testAccessView;android.widget.cts.TabHost_TabSpecTest#testSetIndicator1;android.widget.cts.HorizontalScrollViewTest#testAccessSmoothScrollingEnabled;android.widget.cts.TextViewTest#testSetCursorVisible;android.widget.cts.FrameLayout_LayoutParamsTest#testConstructor;android.widget.cts.AutoCompleteTextViewTest#testOnAttachedToWindow;android.widget.cts.CursorAdapterTest#testInit;android.widget.cts.SimpleAdapterTest#testGetItemId;android.widget.cts.TableLayout_LayoutParamsTest#testSetBaseAttributes;android.widget.cts.ExpandableListViewBasicTest#testExpandedGroupMovement;android.widget.cts.TextViewTest#testAccessPaintFlags;android.widget.cts.CursorAdapterTest#testGetItemId;android.widget.cts.GalleryTest#testSetSpacing;android.widget.cts.TextViewTest#testSetLines;android.widget.cts.ScrollerTest#testConstructor;android.widget.cts.CompoundButtonTest#testOnDraw;android.widget.cts.ListViewTest#testGetMaxScrollAmount;android.widget.cts.TwoLineListItemTest#testGetTexts;android.widget.cts.AbsListViewTest#testBeforeAndAfterTextChanged;android.widget.cts.AdapterViewTest#testConstructor;android.widget.cts.SimpleAdapterTest#testSetViewText;android.widget.cts.ExpandableListViewTest#testGetSelectedId;android.widget.cts.TableLayoutTest#testOnMeasure;android.widget.cts.DialerFilterTest#testSetDigitsWatcher;android.widget.cts.AbsListViewTest#testPointToPosition;android.widget.cts.ExpandableListViewTest#testGetPackedPositionChild;android.widget.cts.ExpandableListViewBasicTest#testSelectedPosition;android.widget.cts.RemoteViewsTest#testSetBitmap;android.widget.cts.TextViewTest#testFoo;android.widget.cts.EditTextTest#testAccessText;android.widget.cts.AbsListViewTest#testComputeVerticalScrollValues;android.widget.cts.VideoViewTest#testConstructor;android.widget.cts.EditTextTest#testGetDefaultEditable;android.widget.cts.EditTextTest#testConstructor;android.widget.cts.ExpandableListViewWithHeadersTest#testExpandOnFirstGroup;android.widget.cts.RelativeLayout_LayoutParamsTest#testStartEnd;android.widget.cts.ScrollViewTest#testAddViewWithIndexAndLayoutParams;android.widget.cts.ViewFlipperTest#testSetFlipInterval;android.widget.cts.ZoomButtonTest#testConstructor;android.widget.cts.TableRowTest#testOnMeasure;android.widget.cts.TableLayoutTest#testAccessStretchAllColumns;android.widget.cts.GridViewTest#testSetHorizontalSpacing;android.widget.cts.ExpandableListViewWithHeadersTest#testContextMenus;android.widget.cts.ListViewTest#testRequestChildRectangleOnScreen;android.widget.cts.VideoViewTest#testSetMediaController;android.widget.cts.AdapterViewTest#testAccessOnItemClickAndLongClickListener;android.widget.cts.RemoteViewsTest#testSetImageViewResource;android.widget.cts.TextViewTest#testScroll;android.widget.cts.VideoViewTest#testResolveAdjustedSize;android.widget.cts.ScrollViewTest#testOnInterceptTouchEvent;android.widget.cts.ViewAnimatorTest#testRemoveViews;android.widget.cts.AlphabetIndexerTest#testAndroidTestCaseSetupProperly;android.widget.cts.ImageViewTest#testSetMaxHeight;android.widget.cts.ImageViewTest#testOnMeasure;android.widget.cts.RadioGroup_LayoutParamsTest#testSetBaseAttributes;android.widget.cts.AbsoluteLayoutTest#testOnMeasure;android.widget.cts.CompoundButtonTest#testPerformClick;android.widget.cts.ExpandableListViewTest#testAccessExpandableListAdapter;android.widget.cts.TextView_SaveStateTest#testToString;android.widget.cts.CursorTreeAdapterTest#testGetGroupView;android.widget.cts.TextViewTest#testPressKey;android.widget.cts.ProgressBarTest#testAccessMax;android.widget.cts.TextViewTest#testBeginEndBatchEdit;android.widget.cts.HeaderViewListAdapterTest#testGetItem;android.widget.cts.LinearLayoutTest#testActivityTestCaseSetUpProperly;android.widget.cts.TextViewTest#testSetGetTextDirection;android.widget.cts.HeaderViewListAdapterTest#testGetView;android.widget.cts.ScrollerTest#testScrollMode;android.widget.cts.ProgressBarTest#testAccessInterpolator;android.widget.cts.TextViewTest#testTextAttr;android.widget.cts.AbsListViewTest#testAccessScrollingCacheEnabled;android.widget.cts.MediaControllerTest#testSetEnabled;android.widget.cts.SimpleCursorAdapterTest#testConvertToString;android.widget.cts.ExpandableListViewTest#testDispatchDraw;android.widget.cts.DigitalClockTest#testOnAttachedToWindow;android.widget.cts.BaseAdapterTest#testGetViewTypeCount;android.widget.cts.CursorAdapterTest#testGetCount;android.widget.cts.ToastTest#testAccessView;android.widget.cts.FrameLayoutTest#testOnMeasure;android.widget.cts.HorizontalScrollViewTest#testGetMaxScrollAmount;android.widget.cts.AbsListViewTest#testSetScrollIndicators;android.widget.cts.TabHostTest#testOnAttachedToAndDetachedFromWindow;android.widget.cts.CursorAdapterTest#testGetFilter;android.widget.cts.CursorTreeAdapterTest#testGetChild;android.widget.cts.SlidingDrawerTest#testSetOnDrawerScrollListener;android.widget.cts.ProgressBarTest#testOnSizeChange;android.widget.cts.TextViewTest#testGetTotalPaddingRight;android.widget.cts.GridViewTest#testPressKey;android.widget.cts.CheckedTextViewTest#testDrawableStateChanged;android.widget.cts.ScrollerTest#testGetDuration;android.widget.cts.TableLayoutTest#testRequestLayout;android.widget.cts.ImageViewTest#testAccessImageMatrix;android.widget.cts.PopupWindowTest#testAccessWidth;android.widget.cts.BaseAdapterTest#testDataSetObserver;android.widget.cts.SpinnerTest#testPerformClick;android.widget.cts.MediaControllerTest#testConstructor;android.widget.cts.SimpleCursorTreeAdapterTest#testConstructor;android.widget.cts.TextViewTest#testGetTextColor;android.widget.cts.DialerFilterTest#testOnModechange;android.widget.cts.AdapterViewTest#testDispatchRestoreInstanceState;android.widget.cts.ImageViewTest#testOnCreateDrawableState;android.widget.cts.CursorTreeAdapterTest#testNotifyDataSetInvalidated;android.widget.cts.SimpleExpandableListAdapterTest#testGetGroupView;android.widget.cts.ListViewTest#testRequestLayout;android.widget.cts.Gallery_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.SimpleExpandableListAdapterTest#testGetChild;android.widget.cts.TableRowTest#testSetOnHierarchyChangeListener;android.widget.cts.TextViewTest#testGetExtendedPaddingTop;android.widget.cts.ResourceCursorAdapterTest#testSetDropDownViewResource;android.widget.cts.LinearLayoutTest#testAccessBaselineAligned;android.widget.cts.CursorTreeAdapterTest#testGetChildId;android.widget.cts.GridViewTest#testSetColumnWidth;android.widget.cts.AbsListViewTest#testAccessTranscriptMode;android.widget.cts.VideoViewTest#testGetBufferPercentage;android.widget.cts.LinearLayoutTest#testConstructor;android.widget.cts.TextViewTest#testAccessContentType;android.widget.cts.SimpleCursorAdapterTest#testBindView;android.widget.cts.SlidingDrawerTest#testOnTouchEvent;android.widget.cts.ListViewTest#testOnKeyUpDown;android.widget.cts.SimpleCursorAdapterTest#testAccessCursorToStringConverter;android.widget.cts.TabWidgetTest#testAddView;android.widget.cts.TextViewTest#testIsInputMethodTarget;android.widget.cts.AbsoluteLayout_LayoutParamsTest#testConstructor;android.widget.cts.RelativeLayoutTest#testGetBaseline;android.widget.cts.TextViewTest#testGetLineCount;android.widget.cts.GridLayoutTest#testActivityTestCaseSetUpProperly;android.widget.cts.ProgressBarTest#testInvalidateDrawable;android.widget.cts.AbsSpinnerTest#testOnSaveAndRestoreInstanceState;android.widget.cts.MultiAutoCompleteTextViewTest#testConstructor;android.widget.cts.ExpandableListViewTest#testGetFlatListPosition;android.widget.cts.ArrayAdapterTest#testAddAllParams;android.widget.cts.CursorTreeAdapterTest#testSetGroupCursor;android.widget.cts.TextViewTest#testDidTouchFocusSelect;android.widget.cts.SimpleCursorAdapterTest#testConstructor;android.widget.cts.TextViewTest#testAccessImeOptions;android.widget.cts.TabHostTest#testClearAllTabs;android.widget.cts.TextViewTest#testGetFadingEdgeStrength;android.widget.cts.TextViewTest#testSetMinLines;android.widget.cts.DialerFilterTest#testConstructor;android.widget.cts.AbsListViewTest#testConstructor;android.widget.cts.HorizontalScrollViewTest#testAddViewWithIndexAndLayoutParams;android.widget.cts.TextViewTest#testTextDirectionDefault;android.widget.cts.TextViewTest#testGetLineBounds;android.widget.cts.HorizontalScrollViewTest#testConstructor;android.widget.cts.AutoCompleteTextViewTest#testSetFrame;android.widget.cts.RelativeLayoutTest#testGenerateLayoutParams2;android.widget.cts.RelativeLayoutTest#testGenerateLayoutParams1;android.widget.cts.ArrayAdapterTest#testAdd;android.widget.cts.PopupWindowTest#testUpdateDimensionAndAlignAnchorView;android.widget.cts.ToastTest#testAccessMargin;android.widget.cts.RemoteViewsActivityTest#testGood;android.widget.cts.TextViewTest#testAccessTextSize;android.widget.cts.TableLayoutTest#testColumnStretchableEffect;android.widget.cts.CompoundButtonTest#testDrawableStateChanged;android.widget.cts.CursorAdapterTest#testAccessFilterQueryProvider;android.widget.cts.HorizontalScrollViewTest#testArrowScroll;android.widget.cts.ScrollViewTest#testOnMeasure;android.widget.cts.TextViewTest#testTextChangedListener;android.widget.cts.AutoCompleteTextViewTest#testSetCompletionHint;android.widget.cts.TextViewTest#testAccessTextColor;android.widget.cts.FrameLayoutTest#testAccessMeasureAllChildren;android.widget.cts.LinearLayoutTest#testAccessWeightSum;android.widget.cts.HorizontalScrollViewTest#testOnMeasure;android.widget.cts.ResourceCursorAdapterTest#testConstructor;android.widget.cts.FrameLayoutTest#testOnSizeChanged;android.widget.cts.LinearLayoutTest#testCheckLayoutParams;android.widget.cts.PopupWindowTest#testSetWindowLayoutMode;android.widget.cts.ExpandableListView_ExpandableListContextMenuInfoTest#testAndroidTestCaseSetupProperly;android.widget.cts.ListViewTest#testAccessHeaderView;android.widget.cts.RatingBarTest#testAccessOnRatingBarChangeListener;android.widget.cts.GridViewTest#testSetGravity;android.widget.cts.TextViewTest#testAccessHint;android.widget.cts.HorizontalScrollViewTest#testOnLayout;android.widget.cts.ListViewTest#testAccessAdapter;android.widget.cts.ArrayAdapterTest#testGetItemId;android.widget.cts.ImageButtonTest#testAndroidTestCaseSetupProperly;android.widget.cts.TextViewTest#testOnDetachedFromWindow;android.widget.cts.ProgressBarTest#testAccessSecondaryProgress;android.widget.cts.SimpleExpandableListAdapterTest#testIsChildSelectable;android.widget.cts.TextViewTest#testTextAlignmentDefault;android.widget.cts.TableLayoutTest#testCheckLayoutParams;android.widget.cts.AnalogClockTest#testOnSizeChanged;android.widget.cts.DialerFilterTest#testSetLettersWatcher;android.widget.cts.ViewAnimatorTest#testAccessDisplayedChildBoundary;android.widget.cts.TextViewTest#testSetSpannableFactory;android.widget.cts.ImageSwitcherTest#testConstructor;android.widget.cts.TextViewTest#testAccessMovementMethod;android.widget.cts.AbsSeekBarTest#testDrawableStateChanged;android.widget.cts.RadioGroupTest#testAddView;android.widget.cts.HorizontalScrollViewTest#testOnInterceptTouchEvent;android.widget.cts.TabHostTest#testConstructor;android.widget.cts.CursorTreeAdapterTest#testGetChildrenCount;android.widget.cts.SimpleCursorAdapterTest#testChangeCursor;android.widget.cts.HorizontalScrollViewTest#testAccessFillViewport;android.widget.cts.AbsSeekBarTest#testFoo;android.widget.cts.TableLayoutTest#testConstructor;android.widget.cts.GalleryTest#testSetUnselectedAlpha;android.widget.cts.AbsListViewTest#testInvalidateViews;android.widget.cts.HeaderViewListAdapterTest#testGetCount;android.widget.cts.RatingBarTest#testAccessIndicator;android.widget.cts.RelativeLayout_LayoutParamsTest#testConstructor;android.widget.cts.CursorAdapterTest#testNewDropDownView;android.widget.cts.ChronometerTest#testAccessFormat;android.widget.cts.ExpandableListViewBasicTest#testPreconditions;android.widget.cts.AbsListViewTest#testFoo;android.widget.cts.ListViewTest#testOnTouchEvent;android.widget.cts.TabHostTest#testAddTab;android.widget.cts.AdapterViewTest#testChangeFocusable;android.widget.cts.ListViewTest#testAccessDivider;android.widget.cts.ListViewTest#testAccessFooterView;android.widget.cts.SimpleCursorAdapterTest#testAccessViewBinder;android.widget.cts.ZoomButtonTest#testSetEnabled;android.widget.cts.CheckedTextViewTest#testConstructor;android.widget.cts.GridViewTest#testLayoutChildren;android.widget.cts.ImageViewTest#testSetAlpha;android.widget.cts.TextViewTest#testClearComposingText;android.widget.cts.ZoomControlsTest#testSetIsZoomInEnabled;android.widget.cts.TabWidgetTest#testConstructor;android.widget.cts.TableRowTest#testGenerateLayoutParams2;android.widget.cts.TextViewTest#testSetTextAppearance;android.widget.cts.FilterTest#testConvertResultToString;android.widget.cts.MultiAutoCompleteTextViewTest#testPerformValidation;android.widget.cts.TextViewTest#testHeightAndWidth;android.widget.cts.CursorTreeAdapterTest#testIsChildSelectable;android.widget.cts.ArrayAdapterTest#testAddAllCollection;android.widget.cts.AbsListView_LayoutParamsTest#testConstructors;android.widget.cts.ScrollViewTest#testDispatchKeyEvent;android.widget.cts.TabHostTest#testAccessCurrentTab;android.widget.cts.ViewSwitcherTest#testReset;android.widget.cts.TimePickerTest#testAccessIs24HourView;android.widget.cts.TextViewTest#testGetTotalPaddingTop;android.widget.cts.HorizontalScrollViewTest#testExecuteKeyEvent;android.widget.cts.AbsoluteLayoutTest#testOnLayout;android.widget.cts.ImageViewTest#testAccessScaleType;android.widget.cts.TabHostTest#testGetTabWidget;android.widget.cts.SlidingDrawerTest#testAnimateToggle;android.widget.cts.SlidingDrawerTest#testLockAndUnlock;android.widget.cts.GalleryTest#testSetGravity;android.widget.cts.ListViewTest#testOnFinishInflate;android.widget.cts.ScrollViewTest#testArrowScroll;android.widget.cts.ScrollViewTest#testComputeScrollDeltaToGetChildRectOnScreen;android.widget.cts.TabHostTest#testGetCurrentTabView;android.widget.cts.ExpandableListViewBasicTest#testExpandGroup;android.widget.cts.TextViewTest#testExtractText;android.widget.cts.RemoteViewsTest#testOnLoadClass;android.widget.cts.RadioGroupTest#testCheckLayoutParams;android.widget.cts.TextSwitcherTest#testSetText;android.widget.cts.AbsListViewTest#testGenerateLayoutParams;android.widget.cts.TabWidgetTest#testSetEnabled;android.widget.cts.AutoCompleteTextViewTest#testAccessItemClickListener;android.widget.cts.ChronometerTest#testFoo;android.widget.cts.ExpandableListViewBasicTest#testConvertionBetweenFlatAndPacked;android.widget.cts.DatePickerTest#testOnSaveInstanceState;android.widget.cts.DatePickerTest#testAndroidTestCaseSetupProperly;android.widget.cts.ImageButtonTest#testOnSetAlpha;android.widget.cts.AdapterViewTest#testAccessOnItemSelectedListener;android.widget.cts.BaseExpandableListAdapterTest#testOnGroupCollapsed;android.widget.cts.TableLayoutTest#testGenerateLayoutParams1;android.widget.cts.TableLayoutTest#testGenerateLayoutParams2;android.widget.cts.LinearLayoutTest#testLayoutVertical;android.widget.cts.CursorTreeAdapterTest#testAccessQueryProvider;android.widget.cts.TextViewTest#testSetTextKeepState1;android.widget.cts.ArrayAdapterTest#testConstructor;android.widget.cts.RemoteViewsTest#testDescribeContents;android.widget.cts.RelativeLayoutTest#testGenerateDefaultLayoutParams;android.widget.cts.SimpleExpandableListAdapterTest#testHasStableIds;android.widget.cts.TextViewTest#testOnPreDraw;android.widget.cts.ExpandableListViewBasicTest#testCollapseGroup;android.widget.cts.ExpandableListViewWithHeadersTest#testExpandOnFirstPosition;android.widget.cts.SimpleCursorAdapterTest#testSetViewText;android.widget.cts.RelativeLayoutTest#testSetIgnoreGravity;android.widget.cts.RadioGroup_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.BaseAdapterTest#testAreAllItemsEnabled;android.widget.cts.RemoteViewsTest#testSetInt;android.widget.cts.AutoCompleteTextViewTest#testAccessDropDownAnchor;android.widget.cts.ScrollerTest#testIsFinished;android.widget.cts.TextViewTest#testAccessGravity;android.widget.cts.TableLayoutTest#testAccessColumnStretchable;android.widget.cts.ExpandableListViewTest#testSetOnGroupClickListener;android.widget.cts.AlphabetIndexerTest#testCompare;android.widget.cts.AbsListView_LayoutParamsTest#testAndroidTestCaseSetupProperly;android.widget.cts.LayoutDirectionTest#testLayoutDirectionDefaults;android.widget.cts.HeaderViewListAdapterTest#testAreAllItemsEnabled;android.widget.cts.LinearLayout_LayoutParamsTest#testDebug;android.widget.cts.CursorTreeAdapterTest#testGetCursor;android.widget.cts.ImageViewTest#testOnDraw;android.widget.cts.GalleryTest#testGetChildDrawingOrder;android.widget.cts.TextViewTest#testAccessInputExtras;android.widget.cts.LinearLayoutTest#testGetBaseline;android.widget.cts.RatingBarTest#testConstructor;android.widget.cts.RemoteViewsTest#testSetUri;android.widget.cts.SpinnerTest#testsetPromptId;android.widget.cts.RemoteViewsTest#testSetTextColor;android.widget.cts.VideoViewTest#testGetDuration;android.widget.cts.AdapterViewTest#testGetCount;android.widget.cts.MultiAutoCompleteTextView_CommaTokenizerTest#testFindTokenStart;android.widget.cts.ImageViewTest#testSetImageBitmap;android.widget.cts.HeaderViewListAdapterTest#testUnregisterDataSetObserver;android.widget.cts.PopupWindowTest#testAccessOutsideTouchable;android.widget.cts.EditTextTest#testSetEllipsize;android.widget.cts.SimpleAdapterTest#testGetCount;android.widget.cts.SpinnerTest#testSetOnItemClickListener;android.widget.cts.SlidingDrawerTest#testToggle;android.widget.cts.AbsSpinnerTest#testPointToPosition;android.widget.cts.ViewFlipperTest#testViewFlipper;android.widget.cts.TabHostTest#testDispatchKeyEvent;android.widget.cts.ExpandableListViewTest#testIsGroupExpanded;android.widget.cts.LayoutDirectionTest#testDirectionFromXml;android.widget.cts.TextViewTest#testVerifyDrawable;android.widget.cts.ProgressBarTest#testIncrementProgressBy;android.widget.cts.PopupWindowTest#testShowAsDropDown;android.widget.cts.ListViewTest#testCanAnimate;android.widget.cts.HorizontalScrollViewTest#testMeasureChild;android.widget.cts.RadioGroupTest#testClearCheck;android.widget.cts.SimpleAdapterTest#testConstructor;android.widget.cts.HorizontalScrollViewTest#testGetHorizontalFadingEdgeStrengths;android.widget.cts.CursorAdapterTest#testGetItem" />
 </TestPlan>
diff --git a/tests/plans/CTS-stable.xml b/tests/plans/CTS-stable.xml
index 984d709..b9e7321 100644
--- a/tests/plans/CTS-stable.xml
+++ b/tests/plans/CTS-stable.xml
@@ -7,11 +7,13 @@
   <Entry uri="android.accounts"/>
   <Entry uri="android.admin"/>
   <Entry uri="android.animation"/>
-  <Entry uri="android.app" exclude="android.app.cts.AlertDialogTest#testAlertDialogCancelable;android.app.cts.AlertDialogTest#testCallback"/>
+  <Entry uri="android.app" exclude="android.app.cts.ActivityManagerTest#testIsRunningInTestHarness;android.app.cts.AlertDialogTest#testAlertDialogCancelable;android.app.cts.ExpandableListActivityTest#testCallback" />
+  <Entry uri="android.bionic"/>
   <Entry uri="android.bluetooth"/>
   <Entry uri="android.calendarcommon"/>
   <Entry uri="android.content"/>
   <Entry uri="android.core.tests.libcore.package.com"/>
+  <Entry uri="android.core.tests.libcore.package.conscrypt"/>
   <Entry uri="android.core.tests.libcore.package.dalvik"/>
   <Entry uri="android.core.tests.libcore.package.libcore"/>
   <Entry uri="android.core.tests.libcore.package.org"/>
@@ -29,18 +31,18 @@
   <Entry uri="android.gesture"/>
   <Entry uri="android.graphics"/>
   <Entry uri="android.graphics2"/>
-  <Entry uri="android.hardware" exclude="android.hardware.cts.CameraTest#testCancelAutofocus"/>
+  <Entry uri="android.hardware" exclude="android.hardware.cts.SensorIntegrationTests#testAccelerometerDoesNotStopGyroscope;android.hardware.cts.SensorIntegrationTests#testsAccelerometerDoesnNotStopMagnetometer;android.hardware.cts.SensorIntegrationTests#testAndroidTestCaseSetupProperly;android.hardware.cts.SensorIntegrationTests#testBatchAndFlush;android.hardware.cts.SensorIntegrationTests#testGyroscopeDoesNotStopAccelerometer;android.hardware.cts.SensorIntegrationTests#testGyroscopeDoesNotStopMagnetometer;android.hardware.cts.SensorIntegrationTests#testMagnetometerDoesNotStopAccelerometer;android.hardware.cts.SensorIntegrationTests#testMagnetometerDoesNotStopGyroscope;android.hardware.cts.SensorMagneticFieldTest#testBatchingStoppingOtherClients;android.hardware.cts.SensorMagneticFieldTest#testBatchingStoppingOtherClientsBatching;android.hardware.cts.SensorMagneticFieldTest#testFrequencyAccuracy;android.hardware.cts.SensorMagneticFieldTest#testOneClientSeveralThreads;android.hardware.cts.SensorMagneticFieldTest#testOneClientSeveralThreadsBatching;android.hardware.cts.SensorMagneticFieldTest#testStandardDeviationWhileStatic;android.hardware.cts.SensorMagneticFieldTest#testStoppingOtherClients;android.hardware.cts.SensorMagneticFieldTest#testStoppingOtherClientsBatching;android.hardware.cts.SensorAccelerometerTest#testBatchingStoppingOtherClients;android.hardware.cts.SensorAccelerometerTest#testBatchingStoppingOtherClientsBatching;android.hardware.cts.SensorAccelerometerTest#testFrequencyAccuracy;android.hardware.cts.SensorAccelerometerTest#testOneClientSeveralThreads;android.hardware.cts.SensorAccelerometerTest#testOneClientSeveralThreadsBatching;android.hardware.cts.SensorGyroscopeTest#testBatchingStoppingOtherClients;android.hardware.cts.SensorGyroscopeTest#testBatchingStoppingOtherClientsBatching;android.hardware.cts.SensorGyroscopeTest#testFrequencyAccuracy;android.hardware.cts.SensorGyroscopeTest#testOneClientSeveralThreads;android.hardware.cts.SensorGyroscopeTest#testOneClientSeveralThreadsBatching;android.hardware.cts.SensorGyroscopeTest#testStandardDeviationWhilStatic;android.hardware.cts.SensorGyroscopeTest#testStoppingOtherClients;android.hardware.cts.SensorGyroscopeTest#testStoppingOtherClientsBatching;android.hardware.cts.SensorAccelerometerTest#testStandardDeviationWhileStatic;android.hardware.cts.SensorAccelerometerTest#testStoppingOtherClients;android.hardware.cts.SensorAccelerometerTest#testStoppingOtherClientsBatching;android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingRequest;android.hardware.camera2.cts.ImageReaderTest#testImageReaderFromCameraJpeg;android.hardware.cts.CameraGLTest#testCameraToSurfaceTextureMetadata;android.hardware.cts.CameraTest#testImmediateZoom;android.hardware.cts.CameraTest#testPreviewCallback;android.hardware.cts.CameraTest#testSmoothZoom;android.hardware.cts.CameraTest#testVideoSnapshot;android.hardware.cts.CameraGLTest#testSetPreviewTextureBothCallbacks;android.hardware.cts.CameraGLTest#testSetPreviewTexturePreviewCallback" />
   <Entry uri="android.holo"/>
   <Entry uri="android.jni"/>
   <Entry uri="android.keystore"/>
   <Entry uri="android.location"/>
-  <Entry uri="android.media" exclude="android.media.cts.DecodeEditEncodeTest#testVideoEditQCIF"/>
-  <Entry uri="android.mediastress"/>
+  <Entry uri="android.media" exclude="android.media.cts.StreamingMediaPlayerTest#testHLS;android.media.cts.DecoderTest#testCodecResetsH264WithSurface" />
+  <Entry uri="android.mediastress" exclude="android.mediastress.cts.NativeMediaTest#test480pPlay" />
   <Entry uri="android.nativemedia.sl"/>
   <Entry uri="android.nativemedia.xa"/>
   <Entry uri="android.nativeopengl"/>
   <Entry uri="android.ndef"/>
-  <Entry uri="android.net" exclude="android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket;android.net.cts.trafficStatsTest#testTrafficStatsForLocalhost;android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp"/>
+  <Entry uri="android.net" exclude="android.net.cts.ConnectivityManagerTest#testStartUsingNetworkFeature_enableHipri;android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp;android.net.cts.DnsTest#testDnsWorks;android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost;android.net.wifi.cts.ScanResultTest#testAndroidTestCaseSetupProperly;android.net.wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly;android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple;android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping" />
   <Entry uri="android.opengl"/>
   <Entry uri="android.openglperf"/>
   <Entry uri="android.os"/>
@@ -48,21 +50,36 @@
   <Entry uri="android.permission2"/>
   <Entry uri="android.preference"/>
   <Entry uri="android.preference2"/>
-  <Entry uri="android.provider" exclude="android.provider.cts.MediaStore_Images_MediaTest#testInsertImageWithBitmap;android.provider.cts.MediaStore_Images_MediaTes#testInsertImageWithImagePath;android.provider.cts.MediaStore_Images_ThumbnailsTest#testQueryExternalMiniThumbnails"/>
+  <Entry uri="android.provider" exclude="android.provider.cts.CalendarTest#testRemindersAlarm" />
   <Entry uri="android.renderscript"/>
+  <Entry uri="android.rscpp"/>
+  <Entry uri="android.rsg"/>
   <Entry uri="android.sax"/>
-  <Entry uri="android.security"/>
+  <Entry uri="android.security" exclude="android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdp6Ports;android.security.cts.ListeningPortsTest#testNoRemotelyAccessibleListeningUdpPorts;android.security.cts.BannedFilesTest#testNoSu;android.security.cts.BannedFilesTest#testNoSuInPath;android.security.cts.PackageSignatureTest#testPackageSignatures" />
   <Entry uri="android.speech"/>
   <Entry uri="android.telephony"/>
   <Entry uri="android.tests.appsecurity"/>
+  <Entry uri="android.tests.location"/>    
   <Entry uri="android.tests.sigtest"/>
   <Entry uri="android.text"/>
   <Entry uri="android.textureview"/>
   <Entry uri="android.theme"/>
   <Entry uri="android.uiautomator"/>
+  <Entry uri="android.usb"/>
   <Entry uri="android.util"/>
   <Entry uri="android.view"/>
-  <Entry uri="android.webkit"/>
-  <Entry uri="android.widget"/>
+  <Entry uri="android.webkit" exclude="android.webkit.cts.WebViewClientTest#testDoUpdateVisitedHistory;android.webkit.cts.WebViewClientTest#testLoadPage;android.webkit.cts.WebViewClientTest#testOnFormResubmission;android.webkit.cts.WebViewClientTest#testOnReceivedError;android.webkit.cts.WebViewClientTest#testOnReceivedHttpAuthRequest;android.webkit.cts.WebViewClientTest#testOnScaleChanged;android.webkit.cts.WebViewClientTest#testOnUnhandledKeyEvent;android.webkit.cts.WebViewTest#testSetInitialScale" />
+  <Entry uri="android.widget" exclude="android.widget.cts.GridViewTest#testSetNumColumns" />
+  <Entry uri="com.android.cts.bootup"/>
+  <Entry uri="com.android.cts.browserbench"/>
+  <Entry uri="com.android.cts.dram"/>
+  <Entry uri="com.android.cts.filesystemperf"/>
+  <Entry uri="com.android.cts.jank.opengl"/>
+  <Entry uri="com.android.cts.jank.ui"/>
+  <Entry uri="com.android.cts.opengl"/>
+  <Entry uri="com.android.cts.simplecpu"/>
+  <Entry uri="com.android.cts.ui"/>
+  <Entry uri="com.android.cts.uihost"/>
+  <Entry uri="com.android.cts.videoperf"/>
   <Entry uri="zzz.android.monkey"/>
 </TestPlan>
diff --git a/tests/res/drawable/no_padding.png b/tests/res/drawable/no_padding.png
new file mode 100644
index 0000000..7d4c27c
--- /dev/null
+++ b/tests/res/drawable/no_padding.png
Binary files differ
diff --git a/tests/res/drawable/padding_0.9.png b/tests/res/drawable/padding_0.9.png
new file mode 100644
index 0000000..0127bf4
--- /dev/null
+++ b/tests/res/drawable/padding_0.9.png
Binary files differ
diff --git a/tests/res/drawable/premul_data.png b/tests/res/drawable/premul_data.png
new file mode 100644
index 0000000..92d7e37
--- /dev/null
+++ b/tests/res/drawable/premul_data.png
Binary files differ
diff --git a/tests/res/layout/view_layout.xml b/tests/res/layout/view_layout.xml
index 4443ba8..40974f0 100644
--- a/tests/res/layout/view_layout.xml
+++ b/tests/res/layout/view_layout.xml
@@ -50,4 +50,47 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
 
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_full"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:padding="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_left"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingLeft="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_right"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingRight="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_top"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingTop="0px"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_bottom"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingBottom="0dp"
+            android:background="@drawable/padding_0" />
+
+    <android.view.cts.MockView
+            android:id="@+id/mock_view_padding_runtime_updated"
+            android:layout_width="200px"
+            android:layout_height="200px"
+            android:paddingStart="8px"
+            android:paddingEnd="8px"
+            android:background="@drawable/no_padding" />
+
 </LinearLayout>
diff --git a/tests/res/layout/windowstub_presentation.xml b/tests/res/layout/windowstub_presentation.xml
new file mode 100644
index 0000000..80490c4
--- /dev/null
+++ b/tests/res/layout/windowstub_presentation.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2013 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.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent">
+    <Button
+        android:id="@+id/presentation_button1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_1" />
+    <Button
+        android:id="@+id/presentation_button2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_2" />
+    <Button
+        android:id="@+id/presentation_button3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_weight="1"
+        android:text="@string/vertical_text_3" />
+</LinearLayout>
diff --git a/tests/res/raw/leak.bc b/tests/res/raw/leak.bc
new file mode 100644
index 0000000..327f25c
--- /dev/null
+++ b/tests/res/raw/leak.bc
Binary files differ
diff --git a/tests/sample/Android.mk b/tests/sample/Android.mk
new file mode 100755
index 0000000..e1a9408
--- /dev/null
+++ b/tests/sample/Android.mk
@@ -0,0 +1,37 @@
+# Copyright (C) 2014 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)
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+# All tests should include android.test.runner.
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+# Must match the package name in CtsTestCaseList.mk
+LOCAL_PACKAGE_NAME := CtsSampleDeviceTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
diff --git a/tests/sample/AndroidManifest.xml b/tests/sample/AndroidManifest.xml
new file mode 100755
index 0000000..ae58f0a
--- /dev/null
+++ b/tests/sample/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2014 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="android.sample.cts">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name="android.sample.SampleDeviceActivity" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
+    <!--  self-instrumenting test package. -->
+    <instrumentation
+        android:name="android.test.InstrumentationCtsTestRunner"
+        android:label="CTS sample tests"
+        android:targetPackage="android.sample.cts" />
+
+</manifest>
+
diff --git a/tests/sample/src/android/sample/SampleDeviceActivity.java b/tests/sample/src/android/sample/SampleDeviceActivity.java
new file mode 100644
index 0000000..8fd8fde
--- /dev/null
+++ b/tests/sample/src/android/sample/SampleDeviceActivity.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2014 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 android.sample;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.os.Bundle;
+
+import java.lang.Override;
+
+/**
+ * A simple activity for using the SharedPreferences API.
+ */
+public class SampleDeviceActivity extends Activity {
+
+    private SharedPreferences mPreferences;
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        // Get a reference to this context's shared preference.
+        mPreferences = getPreferences(Context.MODE_PRIVATE);
+    }
+
+    /**
+     * Saves the given key value pair to the shared preferences.
+     *
+     * @param key
+     * @param value
+     */
+    public void savePreference(String key, String value) {
+        // Get an editor to modify the preferences.
+        Editor editor = mPreferences.edit();
+        // Insert the key value pair.
+        editor.putString(key, value);
+        // Commit the changes - important.
+        editor.commit();
+    }
+
+    /**
+     * Looks up the given key in the shared preferences.
+     *
+     * @param key
+     * @return
+     */
+    public String getPreference(String key) {
+        return mPreferences.getString(key, null);
+    }
+
+    /**
+     * Deletes all entries in the shared preferences.
+     */
+    public void clearPreferences() {
+        // Get an editor to modify the preferences.
+        Editor editor = mPreferences.edit();
+        // Delete all entries.
+        editor.clear();
+        // Commit the changes - important.
+        editor.commit();
+    }
+
+}
diff --git a/tests/sample/src/android/sample/cts/SampleDeviceResultTest.java b/tests/sample/src/android/sample/cts/SampleDeviceResultTest.java
new file mode 100644
index 0000000..6bf883f
--- /dev/null
+++ b/tests/sample/src/android/sample/cts/SampleDeviceResultTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2014 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 android.sample.cts;
+
+import com.android.cts.util.MeasureRun;
+import com.android.cts.util.MeasureTime;
+import com.android.cts.util.ReportLog;
+import com.android.cts.util.ResultType;
+import com.android.cts.util.ResultUnit;
+import com.android.cts.util.Stat;
+
+import android.cts.util.CtsAndroidTestCase;
+
+/**
+ * A simple compatibility test which includes results in the report.
+ *
+ * This test measures the time taken to run a workload and adds in the report.
+ */
+public class SampleDeviceResultTest extends CtsAndroidTestCase {
+
+    /**
+     * The number of times to repeat the test.
+     */
+    private static final int REPEAT = 5;
+
+    /**
+     * The input number for the factorial.
+     */
+    private static final int IN = 15;
+
+    /**
+     * The expected output number for the factorial.
+     */
+    private static final long OUT = 1307674368000L;
+
+    /**
+     * Measures the time taken to compute the factorial of 15 with a recursive method.
+     *
+     * @throws Exception
+     */
+    public void testFactorialRecursive() throws Exception {
+        runTest(new MeasureRun() {
+            @Override
+            public void run(int i) throws Exception {
+                // Compute the factorial and assert it is correct.
+                assertEquals("Incorrect result", OUT, factorialRecursive(IN));
+            }
+        });
+    }
+
+    /**
+     * Measures the time taken to compute the factorial of 15 with a iterative method.
+     *
+     * @throws Exception
+     */
+    public void testFactorialIterative() throws Exception {
+        runTest(new MeasureRun() {
+            @Override
+            public void run(int i) throws Exception {
+                // Compute the factorial and assert it is correct.
+                assertEquals("Incorrect result", OUT, factorialIterative(IN));
+            }
+        });
+    }
+
+    /**
+     * Computes the factorial of a number with a recursive method.
+     *
+     * @param num The number to compute the factorial of.
+     */
+    private static long factorialRecursive(int num) {
+        if (num <= 0) {
+            return 1;
+        }
+        return num * factorialRecursive(num - 1);
+    }
+
+    /**
+     * Computes the factorial of a number with a iterative method.
+     *
+     * @param num The number to compute the factorial of.
+     */
+    private static long factorialIterative(int num) {
+        long result = 1;
+        for (int i = 2; i <= num; i++) {
+            result *= i;
+        }
+        return result;
+    }
+
+    /**
+     * Runs the workload and records the result to the report log.
+     *
+     * @param workload
+     */
+    private void runTest(MeasureRun workload) throws Exception {
+        // MeasureTime runs the workload N times and records the time taken by each run.
+        double[] result = MeasureTime.measure(REPEAT, workload);
+        // Compute the stats.
+        Stat.StatResult stat = Stat.getStat(result);
+        // Get the report for this test and add the results to record.
+        ReportLog log = getReportLog();
+        log.printArray("Times", result, ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue("Min", stat.mMin, ResultType.LOWER_BETTER, ResultUnit.MS);
+        log.printValue("Max", stat.mMax, ResultType.LOWER_BETTER, ResultUnit.MS);
+        // Every report must have a summary,
+        log.printSummary("Average", stat.mAverage, ResultType.LOWER_BETTER, ResultUnit.MS);
+    }
+}
diff --git a/tests/sample/src/android/sample/cts/SampleDeviceTest.java b/tests/sample/src/android/sample/cts/SampleDeviceTest.java
new file mode 100644
index 0000000..13b7ea6
--- /dev/null
+++ b/tests/sample/src/android/sample/cts/SampleDeviceTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2014 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 android.sample.cts;
+
+import android.sample.SampleDeviceActivity;
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * A simple compatibility test which tests the SharedPreferences API.
+ *
+ * This test uses {@link android.test.ActivityInstrumentationTestCase2} to instrument the
+ * {@link android.sample.SampleDeviceActivity}.
+ */
+public class SampleDeviceTest extends ActivityInstrumentationTestCase2<SampleDeviceActivity> {
+
+    private static final String KEY = "foo";
+
+    private static final String VALUE = "bar";
+
+    /**
+     * A reference to the activity whose shared preferences are being tested.
+     */
+    private SampleDeviceActivity mActivity;
+
+    public SampleDeviceTest() {
+        super(SampleDeviceActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        // Start the activity and get a reference to it.
+        mActivity = getActivity();
+        // Wait for the UI Thread to become idle.
+        getInstrumentation().waitForIdleSync();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        // Scrub the activity so it can be freed. The next time the setUp will create a new activity
+        // rather than reusing the old one.
+        mActivity = null;
+        super.tearDown();
+    }
+
+    /**
+     * Tests the SharedPreferences API.
+     *
+     * This inserts the key value pair and assert they can be retrieved. Then it clears the
+     * preferences and asserts they can no longer be retrieved.
+     *
+     * @throws Exception
+     */
+    public void testSharedPreferences() throws Exception {
+        // Save the key value pair to the preferences and assert they were saved.
+        mActivity.savePreference(KEY, VALUE);
+        assertEquals("Preferences were not saved", VALUE, mActivity.getPreference(KEY));
+
+        // Clear the shared preferences and assert the data was removed.
+        mActivity.clearPreferences();
+        assertNull("Preferences were not cleared", mActivity.getPreference(KEY));
+    }
+}
diff --git a/tests/src/android/app/cts/ActivityManagerRecentOneActivity.java b/tests/src/android/app/cts/ActivityManagerRecentOneActivity.java
old mode 100755
new mode 100644
diff --git a/tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java b/tests/src/android/app/cts/ActivityManagerRecentTwoActivity.java
old mode 100755
new mode 100644
diff --git a/tests/src/android/os/cts/ReadElf.java b/tests/src/android/os/cts/ReadElf.java
index b4041d2..b0d5e74 100644
--- a/tests/src/android/os/cts/ReadElf.java
+++ b/tests/src/android/os/cts/ReadElf.java
@@ -26,7 +26,7 @@
  * A poor man's implementation of the readelf command. This program is
  * designed to parse ELF (Executable and Linkable Format) files.
  */
-public class ReadElf {
+public class ReadElf implements AutoCloseable {
     /** The magic values for the ELF identification. */
     private static final byte[] ELF_IDENT = {
             (byte) 0x7F, (byte) 'E', (byte) 'L', (byte) 'F',
@@ -260,11 +260,16 @@
         readHeader();
     }
 
-    protected void finalize() throws Throwable {
+    public void close() {
         try {
             mFile.close();
-        } catch (IOException e) {
-            // nothing
+        } catch (IOException ignored) {
+        }
+    }
+
+    protected void finalize() throws Throwable {
+        try {
+            close();
         } finally {
             super.finalize();
         }
diff --git a/tests/src/android/renderscript/cts/acos_f32_relaxed.rs b/tests/src/android/renderscript/cts/acos_f32_relaxed.rs
new file mode 100644
index 0000000..b553719
--- /dev/null
+++ b/tests/src/android/renderscript/cts/acos_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "acos_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/acosh_f32_relaxed.rs b/tests/src/android/renderscript/cts/acosh_f32_relaxed.rs
new file mode 100644
index 0000000..b7995c1
--- /dev/null
+++ b/tests/src/android/renderscript/cts/acosh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "acosh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/acospi_f32_relaxed.rs b/tests/src/android/renderscript/cts/acospi_f32_relaxed.rs
new file mode 100644
index 0000000..0d76365
--- /dev/null
+++ b/tests/src/android/renderscript/cts/acospi_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "acospi_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/asin_f32_relaxed.rs b/tests/src/android/renderscript/cts/asin_f32_relaxed.rs
new file mode 100644
index 0000000..b5b3926
--- /dev/null
+++ b/tests/src/android/renderscript/cts/asin_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "asin_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/asinh_f32_relaxed.rs b/tests/src/android/renderscript/cts/asinh_f32_relaxed.rs
new file mode 100644
index 0000000..02a7082
--- /dev/null
+++ b/tests/src/android/renderscript/cts/asinh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "asinh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/asinpi_f32_relaxed.rs b/tests/src/android/renderscript/cts/asinpi_f32_relaxed.rs
new file mode 100644
index 0000000..924a534
--- /dev/null
+++ b/tests/src/android/renderscript/cts/asinpi_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "asinpi_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/atan2_f32_relaxed.rs b/tests/src/android/renderscript/cts/atan2_f32_relaxed.rs
new file mode 100644
index 0000000..dd749fa
--- /dev/null
+++ b/tests/src/android/renderscript/cts/atan2_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "atan2_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/atan2pi_f32_relaxed.rs b/tests/src/android/renderscript/cts/atan2pi_f32_relaxed.rs
new file mode 100644
index 0000000..0d4e8fb
--- /dev/null
+++ b/tests/src/android/renderscript/cts/atan2pi_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "atan2pi_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/atan_f32_relaxed.rs b/tests/src/android/renderscript/cts/atan_f32_relaxed.rs
new file mode 100644
index 0000000..e015aa8
--- /dev/null
+++ b/tests/src/android/renderscript/cts/atan_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "atan_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/atanh_f32_relaxed.rs b/tests/src/android/renderscript/cts/atanh_f32_relaxed.rs
new file mode 100644
index 0000000..2083e4d
--- /dev/null
+++ b/tests/src/android/renderscript/cts/atanh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "atanh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/atanpi_f32_relaxed.rs b/tests/src/android/renderscript/cts/atanpi_f32_relaxed.rs
new file mode 100644
index 0000000..fefe784
--- /dev/null
+++ b/tests/src/android/renderscript/cts/atanpi_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "atanpi_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/cbrt_f32_relaxed.rs b/tests/src/android/renderscript/cts/cbrt_f32_relaxed.rs
new file mode 100644
index 0000000..9b9e5a5
--- /dev/null
+++ b/tests/src/android/renderscript/cts/cbrt_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "cbrt_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/ceil_f32_relaxed.rs b/tests/src/android/renderscript/cts/ceil_f32_relaxed.rs
new file mode 100644
index 0000000..332ca6c
--- /dev/null
+++ b/tests/src/android/renderscript/cts/ceil_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "ceil_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/copysign_f32_relaxed.rs b/tests/src/android/renderscript/cts/copysign_f32_relaxed.rs
new file mode 100644
index 0000000..e7fe701
--- /dev/null
+++ b/tests/src/android/renderscript/cts/copysign_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "copysign_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/cos_f32_relaxed.rs b/tests/src/android/renderscript/cts/cos_f32_relaxed.rs
new file mode 100644
index 0000000..ceb51d2
--- /dev/null
+++ b/tests/src/android/renderscript/cts/cos_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "cos_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/cosh_f32_relaxed.rs b/tests/src/android/renderscript/cts/cosh_f32_relaxed.rs
new file mode 100644
index 0000000..7f6a79b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/cosh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "cosh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/cross_f32_relaxed.rs b/tests/src/android/renderscript/cts/cross_f32_relaxed.rs
new file mode 100644
index 0000000..d9fbfed
--- /dev/null
+++ b/tests/src/android/renderscript/cts/cross_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "cross_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/degrees_f32_relaxed.rs b/tests/src/android/renderscript/cts/degrees_f32_relaxed.rs
new file mode 100644
index 0000000..bc603a5
--- /dev/null
+++ b/tests/src/android/renderscript/cts/degrees_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "degrees_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/exp10_f32_relaxed.rs b/tests/src/android/renderscript/cts/exp10_f32_relaxed.rs
new file mode 100644
index 0000000..6e4e007
--- /dev/null
+++ b/tests/src/android/renderscript/cts/exp10_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "exp10_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/exp2_f32_relaxed.rs b/tests/src/android/renderscript/cts/exp2_f32_relaxed.rs
new file mode 100644
index 0000000..676b30a
--- /dev/null
+++ b/tests/src/android/renderscript/cts/exp2_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "exp2_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/exp_f32_relaxed.rs b/tests/src/android/renderscript/cts/exp_f32_relaxed.rs
new file mode 100644
index 0000000..dc4b3d0
--- /dev/null
+++ b/tests/src/android/renderscript/cts/exp_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "exp_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/expm1_f32_relaxed.rs b/tests/src/android/renderscript/cts/expm1_f32_relaxed.rs
new file mode 100644
index 0000000..5a3c40e
--- /dev/null
+++ b/tests/src/android/renderscript/cts/expm1_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "expm1_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fabs_f32_relaxed.rs b/tests/src/android/renderscript/cts/fabs_f32_relaxed.rs
new file mode 100644
index 0000000..e0add35
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fabs_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fabs_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fdim_f32_relaxed.rs b/tests/src/android/renderscript/cts/fdim_f32_relaxed.rs
new file mode 100644
index 0000000..18c8cf0
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fdim_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fdim_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/floor_f32_relaxed.rs b/tests/src/android/renderscript/cts/floor_f32_relaxed.rs
new file mode 100644
index 0000000..d6bef83
--- /dev/null
+++ b/tests/src/android/renderscript/cts/floor_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "floor_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fma_f32_relaxed.rs b/tests/src/android/renderscript/cts/fma_f32_relaxed.rs
new file mode 100644
index 0000000..77f92df
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fma_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fma_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fmax_f32_relaxed.rs b/tests/src/android/renderscript/cts/fmax_f32_relaxed.rs
new file mode 100644
index 0000000..23beccf
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fmax_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fmax_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fmin_f32_relaxed.rs b/tests/src/android/renderscript/cts/fmin_f32_relaxed.rs
new file mode 100644
index 0000000..8be4f13
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fmin_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fmin_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/fmod_f32_relaxed.rs b/tests/src/android/renderscript/cts/fmod_f32_relaxed.rs
new file mode 100644
index 0000000..7a02136
--- /dev/null
+++ b/tests/src/android/renderscript/cts/fmod_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "fmod_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/group1.rs b/tests/src/android/renderscript/cts/group1.rs
new file mode 100644
index 0000000..f1172dc
--- /dev/null
+++ b/tests/src/android/renderscript/cts/group1.rs
@@ -0,0 +1,13 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+#include "shared.rsh"
+
+rs_allocation aSharedInt;
+
+uint32_t  __attribute__((kernel)) setSharedInt(uint32_t x) {
+    if (x == 1) {
+        rsSetElementAt_int(aSharedInt, -5, 0);
+    }
+    return x;
+}
diff --git a/tests/src/android/renderscript/cts/group2.rs b/tests/src/android/renderscript/cts/group2.rs
new file mode 100644
index 0000000..f7b62dd
--- /dev/null
+++ b/tests/src/android/renderscript/cts/group2.rs
@@ -0,0 +1,32 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+#include "shared.rsh"
+
+rs_allocation aSharedInt;
+rs_allocation aFailed;
+
+static bool failed[2] = { false, false };
+
+void __attribute__((kernel)) getSharedInt(uint32_t in, uint32_t x) {
+    int v = rsGetElementAt_int(aSharedInt, 0);
+    if (in != x) {
+        rsDebug("Failed to read in on iteration: ", x);
+        rsDebug("Read: ", in);
+        failed[x] = true;
+    }
+    if (v != -5) {
+        rsDebug("Failed to read -5 on iteration: ", x);
+        rsDebug("Read: ", v);
+        failed[x] = true;
+    }
+}
+
+// Write out aFailed if either of our kernel instances read old data.
+void verify() {
+    for (int i = 0; i < 2; i++) {
+        if (failed[i]) {
+            rsSetElementAt_int(aFailed, 1, 0);
+        }
+    }
+}
diff --git a/tests/src/android/renderscript/cts/hypot_f32_relaxed.rs b/tests/src/android/renderscript/cts/hypot_f32_relaxed.rs
new file mode 100644
index 0000000..7414788
--- /dev/null
+++ b/tests/src/android/renderscript/cts/hypot_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "hypot_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs b/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs
new file mode 100644
index 0000000..30b40c4
--- /dev/null
+++ b/tests/src/android/renderscript/cts/intrinsic_colormatrix.rs
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "shared.rsh"
+
+
+void reference(rs_matrix4x4 m, float4 add, rs_allocation in, rs_allocation out) {
+    uint32_t w = rsAllocationGetDimX(in);
+    uint32_t h = rsAllocationGetDimY(in);
+
+    rs_element ein = rsAllocationGetElement(in);
+    rs_element eout = rsAllocationGetElement(out);
+    rs_data_type dtin = rsElementGetDataType(ein);
+    rs_data_type dtout = rsElementGetDataType(eout);
+    uint32_t vsin = rsElementGetVectorSize(ein);
+    uint32_t vsout = rsElementGetVectorSize(eout);
+
+    for (uint32_t y = 0; y < h; y++) {
+        for (uint32_t x = 0; x < w; x++) {
+            float4 pin = 0.f;
+
+            if (dtin == RS_TYPE_FLOAT_32) {
+                switch(vsin) {
+                case 4:
+                    pin.xyzw = rsGetElementAt_float4(in, x, y);
+                    break;
+                case 3:
+                    pin.xyz = rsGetElementAt_float3(in, x, y);
+                    break;
+                case 2:
+                    pin.xy = rsGetElementAt_float2(in, x, y);
+                    break;
+                case 1:
+                    pin.x = rsGetElementAt_float(in, x, y);
+                    break;
+                }
+            }
+
+            if (dtin == RS_TYPE_UNSIGNED_8) {
+                uchar4 u = 0;
+                switch(vsin) {
+                case 4:
+                    u.xyzw = rsGetElementAt_uchar4(in, x, y);
+                    break;
+                case 3:
+                    u.xyz = rsGetElementAt_uchar3(in, x, y);
+                    break;
+                case 2:
+                    u.xy = rsGetElementAt_uchar2(in, x, y);
+                    break;
+                case 1:
+                    u.x = rsGetElementAt_uchar(in, x, y);
+                    break;
+                }
+                pin = rsUnpackColor8888(u);
+            }
+
+            pin = rsMatrixMultiply(&m, pin);
+            pin += add;
+
+            if (dtout == RS_TYPE_FLOAT_32) {
+                switch(vsout) {
+                case 4:
+                    rsSetElementAt_float4(out, pin, x, y);
+                    break;
+                case 3:
+                    rsSetElementAt_float3(out, pin.xyz, x, y);
+                    break;
+                case 2:
+                    rsSetElementAt_float2(out, pin.xy, x, y);
+                    break;
+                case 1:
+                    rsSetElementAt_float(out, pin.x, x, y);
+                    break;
+                }
+            }
+
+            if (dtout == RS_TYPE_UNSIGNED_8) {
+                uchar4 u = rsPackColorTo8888(pin);
+                switch(vsout) {
+                case 4:
+                    rsSetElementAt_uchar4(out, u, x, y);
+                    break;
+                case 3:
+                    rsSetElementAt_uchar3(out, u.xyz, x, y);
+                    break;
+                case 2:
+                    rsSetElementAt_uchar2(out, u.xy, x, y);
+                    break;
+                case 1:
+                    rsSetElementAt_uchar(out, u.x, x, y);
+                    break;
+                }
+            }
+
+        }
+    }
+}
+
+
diff --git a/tests/src/android/renderscript/cts/intrinsic_convolve3x3.rs b/tests/src/android/renderscript/cts/intrinsic_convolve3x3.rs
new file mode 100644
index 0000000..77da230
--- /dev/null
+++ b/tests/src/android/renderscript/cts/intrinsic_convolve3x3.rs
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "shared.rsh"
+
+int32_t gWidth;
+int32_t gHeight;
+rs_allocation gIn;
+
+float gCoeffs[9];
+
+uchar4 __attribute__((kernel)) convolve_U4(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float4 p00 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y1));
+    float4 p01 = convert_float4(rsGetElementAt_uchar4(gIn, x, y1));
+    float4 p02 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y1));
+    float4 p10 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y));
+    float4 p11 = convert_float4(rsGetElementAt_uchar4(gIn, x, y));
+    float4 p12 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y));
+    float4 p20 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y2));
+    float4 p21 = convert_float4(rsGetElementAt_uchar4(gIn, x, y2));
+    float4 p22 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y2));
+    p00 *= gCoeffs[0];
+    p01 *= gCoeffs[1];
+    p02 *= gCoeffs[2];
+    p10 *= gCoeffs[3];
+    p11 *= gCoeffs[4];
+    p12 *= gCoeffs[5];
+    p20 *= gCoeffs[6];
+    p21 *= gCoeffs[7];
+    p22 *= gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    p20 += 0.5f;
+
+    p20 = clamp(p20, 0.f, 255.f);
+    return convert_uchar4(p20);
+}
+
+uchar3 __attribute__((kernel)) convolve_U3(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float3 p00 = convert_float3(rsGetElementAt_uchar3(gIn, x1, y1));
+    float3 p01 = convert_float3(rsGetElementAt_uchar3(gIn, x, y1));
+    float3 p02 = convert_float3(rsGetElementAt_uchar3(gIn, x2, y1));
+    float3 p10 = convert_float3(rsGetElementAt_uchar3(gIn, x1, y));
+    float3 p11 = convert_float3(rsGetElementAt_uchar3(gIn, x, y));
+    float3 p12 = convert_float3(rsGetElementAt_uchar3(gIn, x2, y));
+    float3 p20 = convert_float3(rsGetElementAt_uchar3(gIn, x1, y2));
+    float3 p21 = convert_float3(rsGetElementAt_uchar3(gIn, x, y2));
+    float3 p22 = convert_float3(rsGetElementAt_uchar3(gIn, x2, y2));
+    p00 *= gCoeffs[0];
+    p01 *= gCoeffs[1];
+    p02 *= gCoeffs[2];
+    p10 *= gCoeffs[3];
+    p11 *= gCoeffs[4];
+    p12 *= gCoeffs[5];
+    p20 *= gCoeffs[6];
+    p21 *= gCoeffs[7];
+    p22 *= gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    p20 += 0.5f;
+
+    p20 = clamp(p20, 0.f, 255.f);
+    return convert_uchar3(p20);
+}
+
+uchar2 __attribute__((kernel)) convolve_U2(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float2 p00 = convert_float2(rsGetElementAt_uchar2(gIn, x1, y1));
+    float2 p01 = convert_float2(rsGetElementAt_uchar2(gIn, x, y1));
+    float2 p02 = convert_float2(rsGetElementAt_uchar2(gIn, x2, y1));
+    float2 p10 = convert_float2(rsGetElementAt_uchar2(gIn, x1, y));
+    float2 p11 = convert_float2(rsGetElementAt_uchar2(gIn, x, y));
+    float2 p12 = convert_float2(rsGetElementAt_uchar2(gIn, x2, y));
+    float2 p20 = convert_float2(rsGetElementAt_uchar2(gIn, x1, y2));
+    float2 p21 = convert_float2(rsGetElementAt_uchar2(gIn, x, y2));
+    float2 p22 = convert_float2(rsGetElementAt_uchar2(gIn, x2, y2));
+    p00 *= gCoeffs[0];
+    p01 *= gCoeffs[1];
+    p02 *= gCoeffs[2];
+    p10 *= gCoeffs[3];
+    p11 *= gCoeffs[4];
+    p12 *= gCoeffs[5];
+    p20 *= gCoeffs[6];
+    p21 *= gCoeffs[7];
+    p22 *= gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    p20 += 0.5f;
+
+    p20 = clamp(p20, 0.f, 255.f);
+    return convert_uchar2(p20);
+}
+
+uchar __attribute__((kernel)) convolve_U1(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float p00 = rsGetElementAt_uchar(gIn, x1, y1);
+    float p01 = rsGetElementAt_uchar(gIn, x, y1);
+    float p02 = rsGetElementAt_uchar(gIn, x2, y1);
+    float p10 = rsGetElementAt_uchar(gIn, x1, y);
+    float p11 = rsGetElementAt_uchar(gIn, x, y);
+    float p12 = rsGetElementAt_uchar(gIn, x2, y);
+    float p20 = rsGetElementAt_uchar(gIn, x1, y2);
+    float p21 = rsGetElementAt_uchar(gIn, x, y2);
+    float p22 = rsGetElementAt_uchar(gIn, x2, y2);
+    p00 *= gCoeffs[0];
+    p01 *= gCoeffs[1];
+    p02 *= gCoeffs[2];
+    p10 *= gCoeffs[3];
+    p11 *= gCoeffs[4];
+    p12 *= gCoeffs[5];
+    p20 *= gCoeffs[6];
+    p21 *= gCoeffs[7];
+    p22 *= gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    p20 += 0.5f;
+
+    p20 = clamp(p20, 0.f, 255.f);
+    return (uchar)p20;
+}
+
+float4 __attribute__((kernel)) convolve_F4(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float4 p00 = rsGetElementAt_float4(gIn, x1, y1) * gCoeffs[0];
+    float4 p01 = rsGetElementAt_float4(gIn, x, y1) * gCoeffs[1];
+    float4 p02 = rsGetElementAt_float4(gIn, x2, y1) * gCoeffs[2];
+    float4 p10 = rsGetElementAt_float4(gIn, x1, y) * gCoeffs[3];
+    float4 p11 = rsGetElementAt_float4(gIn, x, y) * gCoeffs[4];
+    float4 p12 = rsGetElementAt_float4(gIn, x2, y) * gCoeffs[5];
+    float4 p20 = rsGetElementAt_float4(gIn, x1, y2) * gCoeffs[6];
+    float4 p21 = rsGetElementAt_float4(gIn, x, y2) * gCoeffs[7];
+    float4 p22 = rsGetElementAt_float4(gIn, x2, y2) * gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    return p20;
+}
+
+float3 __attribute__((kernel)) convolve_F3(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float3 p00 = rsGetElementAt_float3(gIn, x1, y1) * gCoeffs[0];
+    float3 p01 = rsGetElementAt_float3(gIn, x, y1) * gCoeffs[1];
+    float3 p02 = rsGetElementAt_float3(gIn, x2, y1) * gCoeffs[2];
+    float3 p10 = rsGetElementAt_float3(gIn, x1, y) * gCoeffs[3];
+    float3 p11 = rsGetElementAt_float3(gIn, x, y) * gCoeffs[4];
+    float3 p12 = rsGetElementAt_float3(gIn, x2, y) * gCoeffs[5];
+    float3 p20 = rsGetElementAt_float3(gIn, x1, y2) * gCoeffs[6];
+    float3 p21 = rsGetElementAt_float3(gIn, x, y2) * gCoeffs[7];
+    float3 p22 = rsGetElementAt_float3(gIn, x2, y2) * gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    return p20;
+}
+
+float2 __attribute__((kernel)) convolve_F2(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float2 p00 = rsGetElementAt_float2(gIn, x1, y1) * gCoeffs[0];
+    float2 p01 = rsGetElementAt_float2(gIn, x, y1) * gCoeffs[1];
+    float2 p02 = rsGetElementAt_float2(gIn, x2, y1) * gCoeffs[2];
+    float2 p10 = rsGetElementAt_float2(gIn, x1, y) * gCoeffs[3];
+    float2 p11 = rsGetElementAt_float2(gIn, x, y) * gCoeffs[4];
+    float2 p12 = rsGetElementAt_float2(gIn, x2, y) * gCoeffs[5];
+    float2 p20 = rsGetElementAt_float2(gIn, x1, y2) * gCoeffs[6];
+    float2 p21 = rsGetElementAt_float2(gIn, x, y2) * gCoeffs[7];
+    float2 p22 = rsGetElementAt_float2(gIn, x2, y2) * gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    return p20;
+}
+
+float __attribute__((kernel)) convolve_F1(uint32_t x, uint32_t y) {
+    uint32_t x1 = min((int32_t)x+1, gWidth-1);
+    uint32_t x2 = max((int32_t)x-1, 0);
+    uint32_t y1 = min((int32_t)y+1, gHeight-1);
+    uint32_t y2 = max((int32_t)y-1, 0);
+
+    float p00 = rsGetElementAt_float(gIn, x1, y1) * gCoeffs[0];
+    float p01 = rsGetElementAt_float(gIn, x, y1) * gCoeffs[1];
+    float p02 = rsGetElementAt_float(gIn, x2, y1) * gCoeffs[2];
+    float p10 = rsGetElementAt_float(gIn, x1, y) * gCoeffs[3];
+    float p11 = rsGetElementAt_float(gIn, x, y) * gCoeffs[4];
+    float p12 = rsGetElementAt_float(gIn, x2, y) * gCoeffs[5];
+    float p20 = rsGetElementAt_float(gIn, x1, y2) * gCoeffs[6];
+    float p21 = rsGetElementAt_float(gIn, x, y2) * gCoeffs[7];
+    float p22 = rsGetElementAt_float(gIn, x2, y2) * gCoeffs[8];
+
+    p00 += p01;
+    p02 += p10;
+    p11 += p12;
+    p20 += p21;
+
+    p22 += p00;
+    p02 += p11;
+
+    p20 += p22;
+    p20 += p02;
+    return p20;
+}
+
+
diff --git a/tests/src/android/renderscript/cts/intrinsic_convolve5x5.rs b/tests/src/android/renderscript/cts/intrinsic_convolve5x5.rs
new file mode 100644
index 0000000..9f9aa2b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/intrinsic_convolve5x5.rs
@@ -0,0 +1,398 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "shared.rsh"
+
+
+int32_t gWidth;
+int32_t gHeight;
+rs_allocation gIn;
+
+float gCoeffs[25];
+
+uchar4 __attribute__((kernel)) convolve_U4(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float4 p0 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y0)) * gCoeffs[0]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x1, y0)) * gCoeffs[1]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x2, y0)) * gCoeffs[2]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x3, y0)) * gCoeffs[3]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x4, y0)) * gCoeffs[4];
+
+    float4 p1 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y1)) * gCoeffs[5]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x1, y1)) * gCoeffs[6]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x2, y1)) * gCoeffs[7]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x3, y1)) * gCoeffs[8]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x4, y1)) * gCoeffs[9];
+
+    float4 p2 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y2)) * gCoeffs[10]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x1, y2)) * gCoeffs[11]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x2, y2)) * gCoeffs[12]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x3, y2)) * gCoeffs[13]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x4, y2)) * gCoeffs[14];
+
+    float4 p3 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y3)) * gCoeffs[15]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x1, y3)) * gCoeffs[16]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x2, y3)) * gCoeffs[17]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x3, y3)) * gCoeffs[18]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x4, y3)) * gCoeffs[19];
+
+    float4 p4 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y4)) * gCoeffs[20]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x1, y4)) * gCoeffs[21]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x2, y4)) * gCoeffs[22]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x3, y4)) * gCoeffs[23]
+              + convert_float4(rsGetElementAt_uchar4(gIn, x4, y4)) * gCoeffs[24];
+
+    p0 = clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f);
+    return convert_uchar4(p0);
+}
+
+uchar3 __attribute__((kernel)) convolve_U3(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float3 p0 = convert_float3(rsGetElementAt_uchar3(gIn, x0, y0)) * gCoeffs[0]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x1, y0)) * gCoeffs[1]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x2, y0)) * gCoeffs[2]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x3, y0)) * gCoeffs[3]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x4, y0)) * gCoeffs[4];
+
+    float3 p1 = convert_float3(rsGetElementAt_uchar3(gIn, x0, y1)) * gCoeffs[5]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x1, y1)) * gCoeffs[6]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x2, y1)) * gCoeffs[7]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x3, y1)) * gCoeffs[8]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x4, y1)) * gCoeffs[9];
+
+    float3 p2 = convert_float3(rsGetElementAt_uchar3(gIn, x0, y2)) * gCoeffs[10]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x1, y2)) * gCoeffs[11]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x2, y2)) * gCoeffs[12]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x3, y2)) * gCoeffs[13]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x4, y2)) * gCoeffs[14];
+
+    float3 p3 = convert_float3(rsGetElementAt_uchar3(gIn, x0, y3)) * gCoeffs[15]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x1, y3)) * gCoeffs[16]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x2, y3)) * gCoeffs[17]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x3, y3)) * gCoeffs[18]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x4, y3)) * gCoeffs[19];
+
+    float3 p4 = convert_float3(rsGetElementAt_uchar3(gIn, x0, y4)) * gCoeffs[20]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x1, y4)) * gCoeffs[21]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x2, y4)) * gCoeffs[22]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x3, y4)) * gCoeffs[23]
+              + convert_float3(rsGetElementAt_uchar3(gIn, x4, y4)) * gCoeffs[24];
+
+    p0 = clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f);
+    return convert_uchar3(p0);
+}
+
+uchar2 __attribute__((kernel)) convolve_U2(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float2 p0 = convert_float2(rsGetElementAt_uchar2(gIn, x0, y0)) * gCoeffs[0]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x1, y0)) * gCoeffs[1]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x2, y0)) * gCoeffs[2]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x3, y0)) * gCoeffs[3]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x4, y0)) * gCoeffs[4];
+
+    float2 p1 = convert_float2(rsGetElementAt_uchar2(gIn, x0, y1)) * gCoeffs[5]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x1, y1)) * gCoeffs[6]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x2, y1)) * gCoeffs[7]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x3, y1)) * gCoeffs[8]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x4, y1)) * gCoeffs[9];
+
+    float2 p2 = convert_float2(rsGetElementAt_uchar2(gIn, x0, y2)) * gCoeffs[10]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x1, y2)) * gCoeffs[11]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x2, y2)) * gCoeffs[12]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x3, y2)) * gCoeffs[13]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x4, y2)) * gCoeffs[14];
+
+    float2 p3 = convert_float2(rsGetElementAt_uchar2(gIn, x0, y3)) * gCoeffs[15]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x1, y3)) * gCoeffs[16]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x2, y3)) * gCoeffs[17]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x3, y3)) * gCoeffs[18]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x4, y3)) * gCoeffs[19];
+
+    float2 p4 = convert_float2(rsGetElementAt_uchar2(gIn, x0, y4)) * gCoeffs[20]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x1, y4)) * gCoeffs[21]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x2, y4)) * gCoeffs[22]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x3, y4)) * gCoeffs[23]
+              + convert_float2(rsGetElementAt_uchar2(gIn, x4, y4)) * gCoeffs[24];
+
+    p0 = clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f);
+    return convert_uchar2(p0);
+}
+
+uchar __attribute__((kernel)) convolve_U1(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float p0 = (float)(rsGetElementAt_uchar(gIn, x0, y0)) * gCoeffs[0]
+             + (float)(rsGetElementAt_uchar(gIn, x1, y0)) * gCoeffs[1]
+             + (float)(rsGetElementAt_uchar(gIn, x2, y0)) * gCoeffs[2]
+             + (float)(rsGetElementAt_uchar(gIn, x3, y0)) * gCoeffs[3]
+             + (float)(rsGetElementAt_uchar(gIn, x4, y0)) * gCoeffs[4];
+
+    float p1 = (float)(rsGetElementAt_uchar(gIn, x0, y1)) * gCoeffs[5]
+             + (float)(rsGetElementAt_uchar(gIn, x1, y1)) * gCoeffs[6]
+             + (float)(rsGetElementAt_uchar(gIn, x2, y1)) * gCoeffs[7]
+             + (float)(rsGetElementAt_uchar(gIn, x3, y1)) * gCoeffs[8]
+             + (float)(rsGetElementAt_uchar(gIn, x4, y1)) * gCoeffs[9];
+
+    float p2 = (float)(rsGetElementAt_uchar(gIn, x0, y2)) * gCoeffs[10]
+             + (float)(rsGetElementAt_uchar(gIn, x1, y2)) * gCoeffs[11]
+             + (float)(rsGetElementAt_uchar(gIn, x2, y2)) * gCoeffs[12]
+             + (float)(rsGetElementAt_uchar(gIn, x3, y2)) * gCoeffs[13]
+             + (float)(rsGetElementAt_uchar(gIn, x4, y2)) * gCoeffs[14];
+
+    float p3 = (float)(rsGetElementAt_uchar(gIn, x0, y3)) * gCoeffs[15]
+             + (float)(rsGetElementAt_uchar(gIn, x1, y3)) * gCoeffs[16]
+             + (float)(rsGetElementAt_uchar(gIn, x2, y3)) * gCoeffs[17]
+             + (float)(rsGetElementAt_uchar(gIn, x3, y3)) * gCoeffs[18]
+             + (float)(rsGetElementAt_uchar(gIn, x4, y3)) * gCoeffs[19];
+
+    float p4 = (float)(rsGetElementAt_uchar(gIn, x0, y4)) * gCoeffs[20]
+             + (float)(rsGetElementAt_uchar(gIn, x1, y4)) * gCoeffs[21]
+             + (float)(rsGetElementAt_uchar(gIn, x2, y4)) * gCoeffs[22]
+             + (float)(rsGetElementAt_uchar(gIn, x3, y4)) * gCoeffs[23]
+             + (float)(rsGetElementAt_uchar(gIn, x4, y4)) * gCoeffs[24];
+
+    return clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f);
+}
+
+float4 __attribute__((kernel)) convolve_F4(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float4 p0 = rsGetElementAt_float4(gIn, x0, y0) * gCoeffs[0]
+              + rsGetElementAt_float4(gIn, x1, y0) * gCoeffs[1]
+              + rsGetElementAt_float4(gIn, x2, y0) * gCoeffs[2]
+              + rsGetElementAt_float4(gIn, x3, y0) * gCoeffs[3]
+              + rsGetElementAt_float4(gIn, x4, y0) * gCoeffs[4];
+
+    float4 p1 = rsGetElementAt_float4(gIn, x0, y1) * gCoeffs[5]
+              + rsGetElementAt_float4(gIn, x1, y1) * gCoeffs[6]
+              + rsGetElementAt_float4(gIn, x2, y1) * gCoeffs[7]
+              + rsGetElementAt_float4(gIn, x3, y1) * gCoeffs[8]
+              + rsGetElementAt_float4(gIn, x4, y1) * gCoeffs[9];
+
+    float4 p2 = rsGetElementAt_float4(gIn, x0, y2) * gCoeffs[10]
+              + rsGetElementAt_float4(gIn, x1, y2) * gCoeffs[11]
+              + rsGetElementAt_float4(gIn, x2, y2) * gCoeffs[12]
+              + rsGetElementAt_float4(gIn, x3, y2) * gCoeffs[13]
+              + rsGetElementAt_float4(gIn, x4, y2) * gCoeffs[14];
+
+    float4 p3 = rsGetElementAt_float4(gIn, x0, y3) * gCoeffs[15]
+              + rsGetElementAt_float4(gIn, x1, y3) * gCoeffs[16]
+              + rsGetElementAt_float4(gIn, x2, y3) * gCoeffs[17]
+              + rsGetElementAt_float4(gIn, x3, y3) * gCoeffs[18]
+              + rsGetElementAt_float4(gIn, x4, y3) * gCoeffs[19];
+
+    float4 p4 = rsGetElementAt_float4(gIn, x0, y4) * gCoeffs[20]
+              + rsGetElementAt_float4(gIn, x1, y4) * gCoeffs[21]
+              + rsGetElementAt_float4(gIn, x2, y4) * gCoeffs[22]
+              + rsGetElementAt_float4(gIn, x3, y4) * gCoeffs[23]
+              + rsGetElementAt_float4(gIn, x4, y4) * gCoeffs[24];
+
+    return p0 + p1 + p2 + p3 + p4;
+}
+
+float3 __attribute__((kernel)) convolve_F3(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float3 p0 = rsGetElementAt_float3(gIn, x0, y0) * gCoeffs[0]
+              + rsGetElementAt_float3(gIn, x1, y0) * gCoeffs[1]
+              + rsGetElementAt_float3(gIn, x2, y0) * gCoeffs[2]
+              + rsGetElementAt_float3(gIn, x3, y0) * gCoeffs[3]
+              + rsGetElementAt_float3(gIn, x4, y0) * gCoeffs[4];
+
+    float3 p1 = rsGetElementAt_float3(gIn, x0, y1) * gCoeffs[5]
+              + rsGetElementAt_float3(gIn, x1, y1) * gCoeffs[6]
+              + rsGetElementAt_float3(gIn, x2, y1) * gCoeffs[7]
+              + rsGetElementAt_float3(gIn, x3, y1) * gCoeffs[8]
+              + rsGetElementAt_float3(gIn, x4, y1) * gCoeffs[9];
+
+    float3 p2 = rsGetElementAt_float3(gIn, x0, y2) * gCoeffs[10]
+              + rsGetElementAt_float3(gIn, x1, y2) * gCoeffs[11]
+              + rsGetElementAt_float3(gIn, x2, y2) * gCoeffs[12]
+              + rsGetElementAt_float3(gIn, x3, y2) * gCoeffs[13]
+              + rsGetElementAt_float3(gIn, x4, y2) * gCoeffs[14];
+
+    float3 p3 = rsGetElementAt_float3(gIn, x0, y3) * gCoeffs[15]
+              + rsGetElementAt_float3(gIn, x1, y3) * gCoeffs[16]
+              + rsGetElementAt_float3(gIn, x2, y3) * gCoeffs[17]
+              + rsGetElementAt_float3(gIn, x3, y3) * gCoeffs[18]
+              + rsGetElementAt_float3(gIn, x4, y3) * gCoeffs[19];
+
+    float3 p4 = rsGetElementAt_float3(gIn, x0, y4) * gCoeffs[20]
+              + rsGetElementAt_float3(gIn, x1, y4) * gCoeffs[21]
+              + rsGetElementAt_float3(gIn, x2, y4) * gCoeffs[22]
+              + rsGetElementAt_float3(gIn, x3, y4) * gCoeffs[23]
+              + rsGetElementAt_float3(gIn, x4, y4) * gCoeffs[24];
+
+    return p0 + p1 + p2 + p3 + p4;
+}
+
+float2 __attribute__((kernel)) convolve_F2(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float2 p0 = rsGetElementAt_float2(gIn, x0, y0) * gCoeffs[0]
+              + rsGetElementAt_float2(gIn, x1, y0) * gCoeffs[1]
+              + rsGetElementAt_float2(gIn, x2, y0) * gCoeffs[2]
+              + rsGetElementAt_float2(gIn, x3, y0) * gCoeffs[3]
+              + rsGetElementAt_float2(gIn, x4, y0) * gCoeffs[4];
+
+    float2 p1 = rsGetElementAt_float2(gIn, x0, y1) * gCoeffs[5]
+              + rsGetElementAt_float2(gIn, x1, y1) * gCoeffs[6]
+              + rsGetElementAt_float2(gIn, x2, y1) * gCoeffs[7]
+              + rsGetElementAt_float2(gIn, x3, y1) * gCoeffs[8]
+              + rsGetElementAt_float2(gIn, x4, y1) * gCoeffs[9];
+
+    float2 p2 = rsGetElementAt_float2(gIn, x0, y2) * gCoeffs[10]
+              + rsGetElementAt_float2(gIn, x1, y2) * gCoeffs[11]
+              + rsGetElementAt_float2(gIn, x2, y2) * gCoeffs[12]
+              + rsGetElementAt_float2(gIn, x3, y2) * gCoeffs[13]
+              + rsGetElementAt_float2(gIn, x4, y2) * gCoeffs[14];
+
+    float2 p3 = rsGetElementAt_float2(gIn, x0, y3) * gCoeffs[15]
+              + rsGetElementAt_float2(gIn, x1, y3) * gCoeffs[16]
+              + rsGetElementAt_float2(gIn, x2, y3) * gCoeffs[17]
+              + rsGetElementAt_float2(gIn, x3, y3) * gCoeffs[18]
+              + rsGetElementAt_float2(gIn, x4, y3) * gCoeffs[19];
+
+    float2 p4 = rsGetElementAt_float2(gIn, x0, y4) * gCoeffs[20]
+              + rsGetElementAt_float2(gIn, x1, y4) * gCoeffs[21]
+              + rsGetElementAt_float2(gIn, x2, y4) * gCoeffs[22]
+              + rsGetElementAt_float2(gIn, x3, y4) * gCoeffs[23]
+              + rsGetElementAt_float2(gIn, x4, y4) * gCoeffs[24];
+
+    return p0 + p1 + p2 + p3 + p4;
+}
+
+float __attribute__((kernel)) convolve_F1(uint32_t x, uint32_t y) {
+    uint32_t x0 = max((int32_t)x-2, 0);
+    uint32_t x1 = max((int32_t)x-1, 0);
+    uint32_t x2 = x;
+    uint32_t x3 = min((int32_t)x+1, gWidth-1);
+    uint32_t x4 = min((int32_t)x+2, gWidth-1);
+
+    uint32_t y0 = max((int32_t)y-2, 0);
+    uint32_t y1 = max((int32_t)y-1, 0);
+    uint32_t y2 = y;
+    uint32_t y3 = min((int32_t)y+1, gHeight-1);
+    uint32_t y4 = min((int32_t)y+2, gHeight-1);
+
+    float p0 = rsGetElementAt_float(gIn, x0, y0) * gCoeffs[0]
+             + rsGetElementAt_float(gIn, x1, y0) * gCoeffs[1]
+             + rsGetElementAt_float(gIn, x2, y0) * gCoeffs[2]
+             + rsGetElementAt_float(gIn, x3, y0) * gCoeffs[3]
+             + rsGetElementAt_float(gIn, x4, y0) * gCoeffs[4];
+
+    float p1 = rsGetElementAt_float(gIn, x0, y1) * gCoeffs[5]
+             + rsGetElementAt_float(gIn, x1, y1) * gCoeffs[6]
+             + rsGetElementAt_float(gIn, x2, y1) * gCoeffs[7]
+             + rsGetElementAt_float(gIn, x3, y1) * gCoeffs[8]
+             + rsGetElementAt_float(gIn, x4, y1) * gCoeffs[9];
+
+    float p2 = rsGetElementAt_float(gIn, x0, y2) * gCoeffs[10]
+             + rsGetElementAt_float(gIn, x1, y2) * gCoeffs[11]
+             + rsGetElementAt_float(gIn, x2, y2) * gCoeffs[12]
+             + rsGetElementAt_float(gIn, x3, y2) * gCoeffs[13]
+             + rsGetElementAt_float(gIn, x4, y2) * gCoeffs[14];
+
+    float p3 = rsGetElementAt_float(gIn, x0, y3) * gCoeffs[15]
+             + rsGetElementAt_float(gIn, x1, y3) * gCoeffs[16]
+             + rsGetElementAt_float(gIn, x2, y3) * gCoeffs[17]
+             + rsGetElementAt_float(gIn, x3, y3) * gCoeffs[18]
+             + rsGetElementAt_float(gIn, x4, y3) * gCoeffs[19];
+
+    float p4 = rsGetElementAt_float(gIn, x0, y4) * gCoeffs[20]
+             + rsGetElementAt_float(gIn, x1, y4) * gCoeffs[21]
+             + rsGetElementAt_float(gIn, x2, y4) * gCoeffs[22]
+             + rsGetElementAt_float(gIn, x3, y4) * gCoeffs[23]
+             + rsGetElementAt_float(gIn, x4, y4) * gCoeffs[24];
+
+    return p0 + p1 + p2 + p3 + p4;
+}
+
+
+
diff --git a/tests/src/android/renderscript/cts/log10_f32_relaxed.rs b/tests/src/android/renderscript/cts/log10_f32_relaxed.rs
new file mode 100644
index 0000000..bedfa6d
--- /dev/null
+++ b/tests/src/android/renderscript/cts/log10_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "log10_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/log1p_f32_relaxed.rs b/tests/src/android/renderscript/cts/log1p_f32_relaxed.rs
new file mode 100644
index 0000000..c3aed11
--- /dev/null
+++ b/tests/src/android/renderscript/cts/log1p_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "log1p_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/log2_f32_relaxed.rs b/tests/src/android/renderscript/cts/log2_f32_relaxed.rs
new file mode 100644
index 0000000..7e0883a
--- /dev/null
+++ b/tests/src/android/renderscript/cts/log2_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "log2_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/log_f32_relaxed.rs b/tests/src/android/renderscript/cts/log_f32_relaxed.rs
new file mode 100644
index 0000000..d66d3c9
--- /dev/null
+++ b/tests/src/android/renderscript/cts/log_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "log_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/logb_f32_relaxed.rs b/tests/src/android/renderscript/cts/logb_f32_relaxed.rs
new file mode 100644
index 0000000..9b906dc
--- /dev/null
+++ b/tests/src/android/renderscript/cts/logb_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "logb_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/mad_f32_relaxed.rs b/tests/src/android/renderscript/cts/mad_f32_relaxed.rs
new file mode 100644
index 0000000..36d8306
--- /dev/null
+++ b/tests/src/android/renderscript/cts/mad_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "mad_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/nextafter_f32_relaxed.rs b/tests/src/android/renderscript/cts/nextafter_f32_relaxed.rs
new file mode 100644
index 0000000..5c6edd5
--- /dev/null
+++ b/tests/src/android/renderscript/cts/nextafter_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "nextafter_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/pow_f32_relaxed.rs b/tests/src/android/renderscript/cts/pow_f32_relaxed.rs
new file mode 100644
index 0000000..5da7048
--- /dev/null
+++ b/tests/src/android/renderscript/cts/pow_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "pow_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/pown_f32_relaxed.rs b/tests/src/android/renderscript/cts/pown_f32_relaxed.rs
new file mode 100644
index 0000000..bdc4b47
--- /dev/null
+++ b/tests/src/android/renderscript/cts/pown_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "pown_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/powr_f32_relaxed.rs b/tests/src/android/renderscript/cts/powr_f32_relaxed.rs
new file mode 100644
index 0000000..b8690af
--- /dev/null
+++ b/tests/src/android/renderscript/cts/powr_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "powr_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/radians_f32_relaxed.rs b/tests/src/android/renderscript/cts/radians_f32_relaxed.rs
new file mode 100644
index 0000000..4ab3070
--- /dev/null
+++ b/tests/src/android/renderscript/cts/radians_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "radians_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/remainder_f32_relaxed.rs b/tests/src/android/renderscript/cts/remainder_f32_relaxed.rs
new file mode 100644
index 0000000..d546e50
--- /dev/null
+++ b/tests/src/android/renderscript/cts/remainder_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "remainder_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/rint_f32_relaxed.rs b/tests/src/android/renderscript/cts/rint_f32_relaxed.rs
new file mode 100644
index 0000000..e9b4950
--- /dev/null
+++ b/tests/src/android/renderscript/cts/rint_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "rint_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/rootn_f32_relaxed.rs b/tests/src/android/renderscript/cts/rootn_f32_relaxed.rs
new file mode 100644
index 0000000..f6509ae
--- /dev/null
+++ b/tests/src/android/renderscript/cts/rootn_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "rootn_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/round_f32_relaxed.rs b/tests/src/android/renderscript/cts/round_f32_relaxed.rs
new file mode 100644
index 0000000..026515e
--- /dev/null
+++ b/tests/src/android/renderscript/cts/round_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "round_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/rs_frac_f32_relaxed.rs b/tests/src/android/renderscript/cts/rs_frac_f32_relaxed.rs
new file mode 100644
index 0000000..d93b8e2
--- /dev/null
+++ b/tests/src/android/renderscript/cts/rs_frac_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "rs_frac_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/rsqrt_f32_relaxed.rs b/tests/src/android/renderscript/cts/rsqrt_f32_relaxed.rs
new file mode 100644
index 0000000..1d7c08b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/rsqrt_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "rsqrt_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/sign_f32_relaxed.rs b/tests/src/android/renderscript/cts/sign_f32_relaxed.rs
new file mode 100644
index 0000000..2ea41e2
--- /dev/null
+++ b/tests/src/android/renderscript/cts/sign_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "sign_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/sin_f32_relaxed.rs b/tests/src/android/renderscript/cts/sin_f32_relaxed.rs
new file mode 100644
index 0000000..1ebf69e
--- /dev/null
+++ b/tests/src/android/renderscript/cts/sin_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "sin_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/sinh_f32_relaxed.rs b/tests/src/android/renderscript/cts/sinh_f32_relaxed.rs
new file mode 100644
index 0000000..ba1d5c7
--- /dev/null
+++ b/tests/src/android/renderscript/cts/sinh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "sinh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/sqrt_f32_relaxed.rs b/tests/src/android/renderscript/cts/sqrt_f32_relaxed.rs
new file mode 100644
index 0000000..460ea63
--- /dev/null
+++ b/tests/src/android/renderscript/cts/sqrt_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "sqrt_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/step_f32_relaxed.rs b/tests/src/android/renderscript/cts/step_f32_relaxed.rs
new file mode 100644
index 0000000..c59b548
--- /dev/null
+++ b/tests/src/android/renderscript/cts/step_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "step_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/tan_f32_relaxed.rs b/tests/src/android/renderscript/cts/tan_f32_relaxed.rs
new file mode 100644
index 0000000..adf98f0
--- /dev/null
+++ b/tests/src/android/renderscript/cts/tan_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "tan_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/tanh_f32_relaxed.rs b/tests/src/android/renderscript/cts/tanh_f32_relaxed.rs
new file mode 100644
index 0000000..2d7463b
--- /dev/null
+++ b/tests/src/android/renderscript/cts/tanh_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "tanh_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/trunc_f32_relaxed.rs b/tests/src/android/renderscript/cts/trunc_f32_relaxed.rs
new file mode 100644
index 0000000..f55c8b3
--- /dev/null
+++ b/tests/src/android/renderscript/cts/trunc_f32_relaxed.rs
@@ -0,0 +1,2 @@
+#include "trunc_f32.rs"
+#pragma rs_fp_relaxed
diff --git a/tests/src/android/renderscript/cts/verify.rs b/tests/src/android/renderscript/cts/verify.rs
new file mode 100644
index 0000000..3563fee
--- /dev/null
+++ b/tests/src/android/renderscript/cts/verify.rs
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "shared.rsh"
+
+int gAllowedIntError = 0;
+static bool hadError = false;
+static int2 errorLoc = {0,0};
+
+
+static bool compare_float(float f1, float f2) {
+    if (fabs(f1-f2) > 0.0001f) {
+        hadError = true;
+        return false;
+    }
+    return true;
+}
+
+static bool verify_float4(rs_allocation in1, rs_allocation in2)
+{
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            float4 pref = rsGetElementAt_float4(in1, x, y);
+            float4 ptst = rsGetElementAt_float4(in2, x, y);
+            bool e = !compare_float(pref.x, ptst.x);
+            e |= !compare_float(pref.y, ptst.y);
+            e |= !compare_float(pref.z, ptst.z);
+            e |= !compare_float(pref.w, ptst.w);
+            if (e) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_float3(rs_allocation in1, rs_allocation in2)
+{
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            float3 pref = rsGetElementAt_float3(in1, x, y);
+            float3 ptst = rsGetElementAt_float3(in2, x, y);
+            bool e = !compare_float(pref.x, ptst.x);
+            e |= !compare_float(pref.y, ptst.y);
+            e |= !compare_float(pref.z, ptst.z);
+            if (e) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_float2(rs_allocation in1, rs_allocation in2)
+{
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            float2 pref = rsGetElementAt_float2(in1, x, y);
+            float2 ptst = rsGetElementAt_float2(in2, x, y);
+            bool e = !compare_float(pref.x, ptst.x);
+            e |= !compare_float(pref.y, ptst.y);
+            if (e) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_float(rs_allocation in1, rs_allocation in2)
+{
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            float pref = rsGetElementAt_float(in1, x, y);
+            float ptst = rsGetElementAt_float(in2, x, y);
+            bool e = !compare_float(pref, ptst);
+            if (e) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+static bool verify_uchar4(rs_allocation in1, rs_allocation in2)
+{
+    int merr = 0;
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            int4 pref = convert_int4(rsGetElementAt_uchar4(in1, x, y));
+            int4 ptst = convert_int4(rsGetElementAt_uchar4(in2, x, y));
+            int4 d = convert_int4(abs(pref - ptst));
+            int e = 0;
+            e = max(e, d.x);
+            e = max(e, d.y);
+            e = max(e, d.z);
+            e = max(e, d.w);
+            if (e > gAllowedIntError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+            merr = max(e, merr);
+        }
+    }
+    return true;
+}
+
+static bool verify_uchar3(rs_allocation in1, rs_allocation in2)
+{
+    int merr = 0;
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            int3 pref = convert_int3(rsGetElementAt_uchar3(in1, x, y));
+            int3 ptst = convert_int3(rsGetElementAt_uchar3(in2, x, y));
+            int3 d = convert_int3(abs(pref - ptst));
+            int e = 0;
+            e = max(e, d.x);
+            e = max(e, d.y);
+            e = max(e, d.z);
+            if (e > gAllowedIntError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+            merr = max(e, merr);
+        }
+    }
+    return true;
+}
+
+static bool verify_uchar2(rs_allocation in1, rs_allocation in2)
+{
+    int merr = 0;
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            int2 pref = convert_int2(rsGetElementAt_uchar2(in1, x, y));
+            int2 ptst = convert_int2(rsGetElementAt_uchar2(in2, x, y));
+            int2 d = convert_int2(abs(pref - ptst));
+            int e = 0;
+            e = max(e, d.x);
+            e = max(e, d.y);
+            if (e > gAllowedIntError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+            merr = max(e, merr);
+        }
+    }
+    return true;
+}
+
+static bool verify_uchar(rs_allocation in1, rs_allocation in2)
+{
+    int merr = 0;
+    uint32_t w = rsAllocationGetDimX(in1);
+    uint32_t h = rsAllocationGetDimY(in1);
+    for (uint32_t y=0; y < h; y++) {
+        for (uint32_t x=0; x < w; x++) {
+            int pref = rsGetElementAt_uchar(in1, x, y);
+            int ptst = rsGetElementAt_uchar(in2, x, y);
+            int e = abs(pref - ptst);
+            if (e > gAllowedIntError) {
+                errorLoc.x = x;
+                errorLoc.y = y;
+                hadError = true;
+                return false;
+            }
+            merr = max(e, merr);
+        }
+    }
+    return true;
+}
+
+#define printCell(txt, a, xy) \
+{                       \
+    rs_element e = rsAllocationGetElement(a); \
+    rs_data_type dt = rsElementGetDataType(e); \
+    uint32_t vs = rsElementGetVectorSize(e); \
+ \
+    if (dt == RS_TYPE_UNSIGNED_8) { \
+        switch(vs) { \
+        case 4: \
+            rsDebug(txt, rsGetElementAt_uchar4(a, xy.x, xy.y)); \
+            break; \
+        case 3: \
+            rsDebug(txt, rsGetElementAt_uchar3(a, xy.x, xy.y)); \
+            break; \
+        case 2: \
+            rsDebug(txt, rsGetElementAt_uchar2(a, xy.x, xy.y)); \
+            break; \
+        case 1: \
+            rsDebug(txt, rsGetElementAt_uchar(a, xy.x, xy.y)); \
+            break; \
+        } \
+    } else { \
+        switch(vs) { \
+        case 4: \
+            rsDebug(txt, rsGetElementAt_float4(a, xy.x, xy.y)); \
+            break; \
+        case 3: \
+            rsDebug(txt, rsGetElementAt_float3(a, xy.x, xy.y)); \
+            break; \
+        case 2: \
+            rsDebug(txt, rsGetElementAt_float2(a, xy.x, xy.y)); \
+            break; \
+        case 1: \
+            rsDebug(txt, rsGetElementAt_float(a, xy.x, xy.y)); \
+            break; \
+        } \
+    } \
+}
+
+void verify(rs_allocation ref_in, rs_allocation tst_in, rs_allocation src_in)
+{
+    rs_element e = rsAllocationGetElement(ref_in);
+    rs_data_type dt = rsElementGetDataType(e);
+    uint32_t vs = rsElementGetVectorSize(e);
+    bool valid = false;
+
+    if (dt == RS_TYPE_UNSIGNED_8) {
+        switch(vs) {
+        case 4:
+            valid = verify_uchar4(ref_in, tst_in);
+            break;
+        case 3:
+            valid = verify_uchar3(ref_in, tst_in);
+            break;
+        case 2:
+            valid = verify_uchar2(ref_in, tst_in);
+            break;
+        case 1:
+            valid = verify_uchar(ref_in, tst_in);
+            break;
+        }
+    } else {
+        switch(vs) {
+        case 4:
+            valid = verify_float4(ref_in, tst_in);
+            break;
+        case 3:
+            valid = verify_float3(ref_in, tst_in);
+            break;
+        case 2:
+            valid = verify_float2(ref_in, tst_in);
+            break;
+        case 1:
+            valid = verify_float(ref_in, tst_in);
+            break;
+        }
+    }
+    if (!valid) {
+        rsDebug("verify failure at xy", errorLoc);
+        printCell("start value     ", src_in, errorLoc);
+        printCell("reference value ", ref_in, errorLoc);
+        printCell("test value      ", tst_in, errorLoc);
+    }
+}
+
+void checkError()
+{
+    if (hadError) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    } else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/src/android/renderscript/cts/void_ptr.rs b/tests/src/android/renderscript/cts/void_ptr.rs
new file mode 100644
index 0000000..895f0c7
--- /dev/null
+++ b/tests/src/android/renderscript/cts/void_ptr.rs
@@ -0,0 +1,49 @@
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_allocation aFailed;
+rs_allocation aOutput;
+
+void set_output_void_int(void *out, uint32_t x, uint32_t y) {
+    int *out_int = (int *)out;
+    *out_int = x + y;
+}
+
+void __attribute__((kernel))check_output_int(const int in, uint32_t x, uint32_t y)
+{
+    if (in != x + y) {
+        rsSetElementAt_int(aFailed, 1, 0);
+    }
+}
+
+void set_output_void_char(void *out, uint32_t x, uint32_t y) {
+    uchar *out_int = (uchar *)out;
+    *out_int = x + y;
+}
+
+void __attribute__((kernel))check_output_char(const uchar in, uint32_t x, uint32_t y)
+{
+    if (in != x + y) {
+        rsSetElementAt_int(aFailed, 1, 0);
+    }
+}
+
+int __attribute__((kernel)) set_output_int(uint32_t x, uint32_t y) {
+    return x + y;
+}
+
+void copy_void_int(const void *in, uint32_t x, uint32_t y)
+{
+    int *in_int = (int*) in;
+    rsSetElementAt_int(aOutput, *in_int, x, y);
+}
+
+uchar __attribute__((kernel)) set_output_char(uint32_t x, uint32_t y) {
+    return x + y;
+}
+
+void copy_void_char(const void *in, uint32_t x, uint32_t y)
+{
+    uchar *in_uchar = (uchar*) in;
+    rsSetElementAt_uchar(aOutput, *in_uchar, x, y);
+}
diff --git a/tests/src/android/renderscript/cts/yuv.rs b/tests/src/android/renderscript/cts/yuv.rs
new file mode 100644
index 0000000..6d45331
--- /dev/null
+++ b/tests/src/android/renderscript/cts/yuv.rs
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include "shared.rsh"
+
+#pragma rs_fp_relaxed
+
+rs_allocation mInput;
+
+rs_allocation mInY;
+rs_allocation mInU;
+rs_allocation mInV;
+
+static uchar4 yuvToRGBA4(uchar y, uchar u, uchar v) {
+    short Y = ((short)y) - 16;
+    short U = ((short)u) - 128;
+    short V = ((short)v) - 128;
+
+    short4 p;
+    p.x = (Y * 298 + V * 409 + 128) >> 8;
+    p.y = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
+    p.z = (Y * 298 + U * 516 + 128) >> 8;
+    p.w = 255;
+    if(p.x < 0) {
+        p.x = 0;
+    }
+    if(p.x > 255) {
+        p.x = 255;
+    }
+    if(p.y < 0) {
+        p.y = 0;
+    }
+    if(p.y > 255) {
+        p.y = 255;
+    }
+    if(p.z < 0) {
+        p.z = 0;
+    }
+    if(p.z > 255) {
+        p.z = 255;
+    }
+
+    return (uchar4){p.x, p.y, p.z, p.w};
+}
+
+void makeRef(rs_allocation ay, rs_allocation au, rs_allocation av, rs_allocation aout) {
+    uint32_t w = rsAllocationGetDimX(ay);
+    uint32_t h = rsAllocationGetDimY(ay);
+
+    for (int y = 0; y < h; y++) {
+        //rsDebug("y", y);
+        for (int x = 0; x < w; x++) {
+
+            int py = rsGetElementAt_uchar(ay, x, y);
+            int pu = rsGetElementAt_uchar(au, x >> 1, y >> 1);
+            int pv = rsGetElementAt_uchar(av, x >> 1, y >> 1);
+
+            //rsDebug("py", py);
+            //rsDebug(" u", pu);
+            //rsDebug(" v", pv);
+
+            uchar4 rgb = yuvToRGBA4(py, pu, pv);
+            //rsDebug("  ", rgb);
+
+            rsSetElementAt_uchar4(aout, rgb, x, y);
+        }
+    }
+}
+
+
+uchar4 __attribute__((kernel)) cvt(uint32_t x, uint32_t y) {
+
+    uchar py = rsGetElementAtYuv_uchar_Y(mInput, x, y);
+    uchar pu = rsGetElementAtYuv_uchar_U(mInput, x, y);
+    uchar pv = rsGetElementAtYuv_uchar_V(mInput, x, y);
+
+    //rsDebug("py2", py);
+    //rsDebug(" u2", pu);
+    //rsDebug(" v2", pv);
+
+    return yuvToRGBA4(py, pu, pv);
+}
+
+
diff --git a/tests/src/android/text/EmojiStubActivity.java b/tests/src/android/text/EmojiStubActivity.java
old mode 100755
new mode 100644
diff --git a/tests/src/android/text/method/cts/KeyListenerStubActivity.java b/tests/src/android/text/method/cts/KeyListenerStubActivity.java
index f831af9..149ad87 100644
--- a/tests/src/android/text/method/cts/KeyListenerStubActivity.java
+++ b/tests/src/android/text/method/cts/KeyListenerStubActivity.java
@@ -20,6 +20,7 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.os.SystemClock;
 import android.text.method.BaseKeyListener;
 import android.text.method.DateKeyListener;
 import android.text.method.DateTimeKeyListener;
@@ -29,6 +30,7 @@
 import android.text.method.QwertyKeyListener;
 import android.text.method.TextKeyListener;
 import android.text.method.TimeKeyListener;
+import android.util.Log;
 
 /**
  * This Activity is used for testing:
@@ -54,9 +56,47 @@
  */
 
 public class KeyListenerStubActivity extends Activity {
+    private boolean mHasWindowFocus = false;
+    private Object mHasWindowFocusLock = new Object();
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.keylistener_layout);
     }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        if (!hasFocus) {
+            Log.w("KeyListenerStubActivity", "KeyListenerStubActivity lost window focus");
+        }
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasFocus;
+            mHasWindowFocusLock.notify();
+        }
+    }
+
+    /**
+     * Blocks the calling thread until the {@link KeyListenerStubActivity} has window focus or the
+     * specified duration (in milliseconds) has passed.
+     */
+    public boolean waitForWindowFocus(long durationMillis) {
+        long elapsedMillis = SystemClock.elapsedRealtime();
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasWindowFocus();
+            while (!mHasWindowFocus && durationMillis > 0) {
+                long newElapsedMillis = SystemClock.elapsedRealtime();
+                durationMillis -= (newElapsedMillis - elapsedMillis);
+                elapsedMillis = newElapsedMillis;
+                if (durationMillis > 0) {
+                    try {
+                        mHasWindowFocusLock.wait(durationMillis);
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+            return mHasWindowFocus;
+        }
+    }
 }
diff --git a/tests/src/android/view/cts/ViewTestStubActivity.java b/tests/src/android/view/cts/ViewTestStubActivity.java
index 9809962..69676cb 100644
--- a/tests/src/android/view/cts/ViewTestStubActivity.java
+++ b/tests/src/android/view/cts/ViewTestStubActivity.java
@@ -18,12 +18,52 @@
 
 import android.app.Activity;
 import android.os.Bundle;
+import android.os.SystemClock;
+import android.util.Log;
 import com.android.cts.stub.R;
 
 public class ViewTestStubActivity extends Activity {
+    private boolean mHasWindowFocus = false;
+    private Object mHasWindowFocusLock = new Object();
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setContentView(R.layout.view_layout);
     }
+
+    @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        super.onWindowFocusChanged(hasFocus);
+        if (!hasFocus) {
+            Log.w("ViewTestStubActivity", "ViewTestStubActivity lost window focus");
+        }
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasFocus;
+            mHasWindowFocusLock.notify();
+        }
+    }
+
+    /**
+     * Blocks the calling thread until the {@link ViewTestStubActivity} has window focus or the
+     * specified duration (in milliseconds) has passed.
+     */
+    public boolean waitForWindowFocus(long durationMillis) {
+        long elapsedMillis = SystemClock.elapsedRealtime();
+        synchronized(mHasWindowFocusLock) {
+            mHasWindowFocus = hasWindowFocus();
+            while (!mHasWindowFocus && durationMillis > 0) {
+                long newElapsedMillis = SystemClock.elapsedRealtime();
+                durationMillis -= (newElapsedMillis - elapsedMillis);
+                elapsedMillis = newElapsedMillis;
+                if (durationMillis > 0) {
+                    try {
+                        mHasWindowFocusLock.wait(durationMillis);
+                    } catch (InterruptedException e) {
+                    }
+                }
+            }
+            return mHasWindowFocus;
+        }
+    }
 }
diff --git a/tests/src/android/view/cts/WindowStubActivity.java b/tests/src/android/view/cts/WindowStubActivity.java
old mode 100755
new mode 100644
diff --git a/tests/src/android/webkit/cts/WebViewOnUiThread.java b/tests/src/android/webkit/cts/WebViewOnUiThread.java
index 5133653..f638ba8 100644
--- a/tests/src/android/webkit/cts/WebViewOnUiThread.java
+++ b/tests/src/android/webkit/cts/WebViewOnUiThread.java
@@ -24,22 +24,27 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.SystemClock;
+import android.print.PrintDocumentAdapter;
 import android.test.InstrumentationTestCase;
 import android.util.DisplayMetrics;
 import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
 import android.webkit.DownloadListener;
+import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
-import android.webkit.WebView;
 import android.webkit.WebView.HitTestResult;
 import android.webkit.WebView.PictureListener;
+import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
 import junit.framework.Assert;
 
 import java.io.File;
-
+import java.util.concurrent.Callable;
+import java.util.Map;
 
 /**
  * Many tests need to run WebView code in the UI thread. This class
@@ -236,11 +241,38 @@
         });
     }
 
-    public void zoomIn() {
+    public boolean canZoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.canZoomIn();
+            }
+        });
+    }
+
+    public boolean zoomIn() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomIn();
+            }
+        });
+    }
+
+    public boolean zoomOut() {
+        return getValue(new ValueGetter<Boolean>() {
+            @Override
+            public Boolean capture() {
+                return mWebView.zoomOut();
+            }
+        });
+    }
+
+    public void setFindListener(final WebView.FindListener listener) {
         runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                mWebView.zoomIn();
+                mWebView.setFindListener(listener);
             }
         });
     }
@@ -350,6 +382,22 @@
         });
     }
 
+    /**
+     * Calls loadUrl on the WebView and then waits onPageFinished,
+     * onNewPicture and onProgressChange to reach 100.
+     * Test fails if the load timeout elapses.
+     * @param url The URL to load.
+     */
+    public void loadUrlAndWaitForCompletion(final String url,
+            final Map<String, String> extraHeaders) {
+        callAndWait(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.loadUrl(url, extraHeaders);
+            }
+        });
+    }
+
     public void loadUrl(final String url) {
         runOnUiThread(new Runnable() {
             @Override
@@ -424,14 +472,24 @@
      * similar functions.
      */
     public void waitForLoadCompletion() {
-        if (isUiThread()) {
-            waitOnUiThread();
-        } else {
-            waitOnTestThread();
-        }
+        waitForCriteria(LOAD_TIMEOUT,
+                new Callable<Boolean>() {
+                    @Override
+                    public Boolean call() {
+                        return isLoaded();
+                    }
+                });
         clearLoad();
     }
 
+    private void waitForCriteria(long timeout, Callable<Boolean> doneCriteria) {
+        if (isUiThread()) {
+            waitOnUiThread(timeout, doneCriteria);
+        } else {
+            waitOnTestThread(timeout, doneCriteria);
+        }
+    }
+
     public String getTitle() {
         return getValue(new ValueGetter<String>() {
             @Override
@@ -627,6 +685,39 @@
         });
     }
 
+    public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.evaluateJavascript(script, result);
+            }
+        });
+    }
+
+    public PrintDocumentAdapter createPrintDocumentAdapter() {
+        return getValue(new ValueGetter<PrintDocumentAdapter>() {
+            @Override
+            public PrintDocumentAdapter capture() {
+                return mWebView.createPrintDocumentAdapter();
+            }
+        });
+    }
+
+    public void setLayoutHeightToMatchParent() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                ViewParent parent = mWebView.getParent();
+                if (parent instanceof ViewGroup) {
+                    ((ViewGroup) parent).getLayoutParams().height =
+                        ViewGroup.LayoutParams.MATCH_PARENT;
+                }
+                mWebView.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
+                mWebView.requestLayout();
+            }
+        });
+    }
+
     /**
      * Helper for running code on the UI thread where an exception is
      * a test failure. If this is already the UI thread then it runs
@@ -718,33 +809,42 @@
 
     /**
      * Uses a polling mechanism, while pumping messages to check when the
-     * load completes.
+     * criteria is met.
      */
-    private void waitOnUiThread() {
-        new PollingCheck(LOAD_TIMEOUT) {
+    private void waitOnUiThread(long timeout, final Callable<Boolean> doneCriteria) {
+        new PollingCheck(timeout) {
             @Override
             protected boolean check() {
                 pumpMessages();
-                return isLoaded();
+                try {
+                    return doneCriteria.call();
+                } catch (Exception e) {
+                    Assert.fail("Unexpected error while checking the criteria: "
+                            + e.getMessage());
+                    return true;
+                }
             }
         }.run();
     }
 
     /**
-     * Uses a wait/notify to check when the load completes.
+     * Uses a wait/notify to check when the criteria is met.
      */
-    private synchronized void waitOnTestThread() {
+    private synchronized void waitOnTestThread(long timeout, Callable<Boolean> doneCriteria) {
         try {
-            long waitEnd = SystemClock.uptimeMillis() + LOAD_TIMEOUT;
-            long timeRemaining = LOAD_TIMEOUT;
-            while (!isLoaded() && timeRemaining > 0) {
+            long waitEnd = SystemClock.uptimeMillis() + timeout;
+            long timeRemaining = timeout;
+            while (!doneCriteria.call() && timeRemaining > 0) {
                 this.wait(timeRemaining);
                 timeRemaining = waitEnd - SystemClock.uptimeMillis();
             }
+            Assert.assertTrue("Action failed to complete before timeout", doneCriteria.call());
         } catch (InterruptedException e) {
             // We'll just drop out of the loop and fail
+        } catch (Exception e) {
+            Assert.fail("Unexpected error while checking the criteria: "
+                    + e.getMessage());
         }
-        Assert.assertTrue("Load failed to complete before timeout", isLoaded());
     }
 
     /**
diff --git a/tests/src/android/webkit/cts/WebViewStartupStubActivity.java b/tests/src/android/webkit/cts/WebViewStartupStubActivity.java
new file mode 100644
index 0000000..f902a48
--- /dev/null
+++ b/tests/src/android/webkit/cts/WebViewStartupStubActivity.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013 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 android.webkit.cts;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewGroup;
+import android.webkit.WebView;
+
+public class WebViewStartupStubActivity extends Activity {
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    public WebView createAndAttachWebView() {
+        mWebView = new WebView(this);
+        setContentView(mWebView);
+        return mWebView;
+    }
+
+    public WebView getWebView() {
+        return mWebView;
+    }
+
+    public void detachAndDestroyWebView() {
+        if (mWebView != null) {
+            ViewGroup vg = (ViewGroup)mWebView.getParent();
+            vg.removeView(mWebView);
+            mWebView.destroy();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        detachAndDestroyWebView();
+        super.onDestroy();
+    }
+}
diff --git a/tests/systemAppTest/prebuilts/readme.txt b/tests/systemAppTest/prebuilts/readme.txt
new file mode 100644
index 0000000..f9ba205
--- /dev/null
+++ b/tests/systemAppTest/prebuilts/readme.txt
@@ -0,0 +1 @@
+This directory will contain signed CtsSystemAppTestCases.apk.
diff --git a/tests/systemAppTest/test/Android.mk b/tests/systemAppTest/test/Android.mk
new file mode 100644
index 0000000..3354886
--- /dev/null
+++ b/tests/systemAppTest/test/Android.mk
@@ -0,0 +1,37 @@
+# Copyright (C) 2013 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.
+
+# This module will not be built in normal CTS build
+# TODO: add xml generation for test build
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_PRIVILEGED_MODULE := true
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_APPS_PRIVILEGED)
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsdeviceutil
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsSystemAppTestCases
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tests/systemAppTest/test/AndroidManifest.xml b/tests/systemAppTest/test/AndroidManifest.xml
new file mode 100644
index 0000000..dbcaf9e
--- /dev/null
+++ b/tests/systemAppTest/test/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.systemapptest"
+    android:versionCode="1"
+    android:versionName="1.0" >
+</manifest>
diff --git a/tests/tests/accessibility/Android.mk b/tests/tests/accessibility/Android.mk
index ee50eef..abd6f4b 100644
--- a/tests/tests/accessibility/Android.mk
+++ b/tests/tests/accessibility/Android.mk
@@ -26,7 +26,7 @@
 
 LOCAL_PACKAGE_NAME := CtsAccessibilityTestCases
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctsutil ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestrunner
 
 # This test runner sets up/cleans up the device before/after running the tests.
 LOCAL_CTS_TEST_RUNNER := com.android.cts.tradefed.testtype.AccessibilityTestRunner
diff --git a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
index 58b32d6..8be2b99 100644
--- a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
+++ b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityEventTest.java
@@ -31,7 +31,7 @@
 public class AccessibilityEventTest extends TestCase {
 
     /** The number of properties of the {@link AccessibilityEvent} class. */
-    private static final int NON_STATIC_FIELD_COUNT = 28;
+    private static final int NON_STATIC_FIELD_COUNT = 29;
 
     /**
      * Test that no new fields have been added without updating the
diff --git a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
index 70a25b2..ae7cc9b 100644
--- a/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
+++ b/tests/tests/accessibility/src/android/view/accessibility/cts/AccessibilityNodeInfoTest.java
@@ -30,7 +30,7 @@
 public class AccessibilityNodeInfoTest extends AndroidTestCase {
 
     /** The number of properties of the {@link AccessibilityNodeInfo} class. */
-    private static final int NON_STATIC_FIELD_COUNT = 20;
+    private static final int NON_STATIC_FIELD_COUNT = 26;
 
     @SmallTest
     public void testMarshaling() throws Exception {
diff --git a/tests/tests/accessibilityservice/AndroidManifest.xml b/tests/tests/accessibilityservice/AndroidManifest.xml
index ac75553..c000460 100644
--- a/tests/tests/accessibilityservice/AndroidManifest.xml
+++ b/tests/tests/accessibilityservice/AndroidManifest.xml
@@ -19,9 +19,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.android.cts.accessibilityservice">
 
-  <uses-sdk android:minSdkVersion="18"
-          android:targetSdkVersion="18" />
-
   <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
 
   <application android:theme="@android:style/Theme.Holo.NoActionBar" >
diff --git a/tests/tests/accessibilityservice/res/layout/accessibility_text_traversal_test.xml b/tests/tests/accessibilityservice/res/layout/accessibility_text_traversal_test.xml
index f86f00f..9906227 100644
--- a/tests/tests/accessibilityservice/res/layout/accessibility_text_traversal_test.xml
+++ b/tests/tests/accessibilityservice/res/layout/accessibility_text_traversal_test.xml
@@ -26,29 +26,32 @@
        android:id="@+id/view"
        android:layout_width="50dip"
        android:layout_height="50dip"
+       android:visibility="gone"
        />
 
    <TextView
        android:id="@+id/text"
-       android:layout_width="200dip"
-       android:layout_height="200dip"
+       android:layout_width="80dip"
+       android:layout_height="80dip"
        android:includeFontPadding="false"
-       android:textSize="14dip"
+       android:textSize="10dip"
        android:textStyle="normal"
        android:fontFamily="sans-serif"
+       android:visibility="gone"
        />
 
    <EditText
        android:id="@+id/edit"
-       android:layout_width="200dip"
-       android:layout_height="200dip"
+       android:layout_width="80dip"
+       android:layout_height="80dip"
        android:maxLines="1000"
        android:scrollbars="vertical"
        android:focusable="false"
        android:includeFontPadding="false"
-       android:textSize="18dip"
+       android:textSize="10dip"
        android:textStyle="normal"
        android:fontFamily="sans-serif"
+       android:visibility="gone"
        />
 
 </LinearLayout>
diff --git a/tests/tests/accessibilityservice/res/layout/accessibility_view_tree_reporting_test.xml b/tests/tests/accessibilityservice/res/layout/accessibility_view_tree_reporting_test.xml
index fe420bc..0dbd62a 100644
--- a/tests/tests/accessibilityservice/res/layout/accessibility_view_tree_reporting_test.xml
+++ b/tests/tests/accessibilityservice/res/layout/accessibility_view_tree_reporting_test.xml
@@ -29,19 +29,22 @@
               android:id="@+id/firstTextView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
-              android:text="@string/firstTextView" />
+              android:text="@string/firstTextView"
+              android:textSize="10dip" />
 
           <EditText
               android:id="@+id/firstEditText"
-              android:layout_width="200dip"
+              android:layout_width="20dip"
               android:layout_height="wrap_content"
-              android:contentDescription="@string/firstEditText" />
+              android:contentDescription="@string/firstEditText"
+              android:textSize="10dip" />
 
           <Button
               android:id="@+id/firstButton"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
-              android:text="@string/firstButton" />
+              android:text="@string/firstButton"
+              android:textSize="10dip" />
 
       </LinearLayout>
 
@@ -68,19 +71,22 @@
               android:id="@+id/secondTextView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
-              android:text="@string/secondTextView" />
+              android:text="@string/secondTextView"
+              android:textSize="10dip" />
 
           <EditText
               android:id="@+id/secondEditText"
-              android:layout_width="200dip"
+              android:layout_width="20dip"
               android:layout_height="wrap_content"
-              android:contentDescription="@string/secondEditText" />
+              android:contentDescription="@string/secondEditText"
+              android:textSize="10dip" />
 
           <Button
               android:id="@+id/secondButton"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
-              android:text="@string/secondButton" />
+              android:text="@string/secondButton"
+              android:textSize="10dip" />
 
       </LinearLayout>
 
diff --git a/tests/tests/accessibilityservice/res/layout/query_window_test.xml b/tests/tests/accessibilityservice/res/layout/query_window_test.xml
index 37c0ef0..88d4cc9 100644
--- a/tests/tests/accessibilityservice/res/layout/query_window_test.xml
+++ b/tests/tests/accessibilityservice/res/layout/query_window_test.xml
@@ -29,21 +29,24 @@
         >
         <Button
             android:id="@+id/button1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button1"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button2"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button3"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button3"
+            android:textSize="10dip"
         />
     </LinearLayout>
 
@@ -54,21 +57,24 @@
         >
         <Button
             android:id="@+id/button4"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button4"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button5"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button5"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button6"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button6"
+            android:textSize="10dip"
             android:contentDescription="@string/contentDescription"
         />
     </LinearLayout>
@@ -80,21 +86,24 @@
         >
         <Button
             android:id="@+id/button7"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button7"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button8"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button8"
+            android:textSize="10dip"
         />
         <Button
             android:id="@+id/button9"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
+            android:layout_width="20dip"
+            android:layout_height="20dip"
             android:text="@string/button9"
+            android:textSize="10dip"
         />
     </LinearLayout>
 
diff --git a/tests/tests/accessibilityservice/res/values/strings.xml b/tests/tests/accessibilityservice/res/values/strings.xml
index 97ddb7c..f60df17 100644
--- a/tests/tests/accessibilityservice/res/values/strings.xml
+++ b/tests/tests/accessibilityservice/res/values/strings.xml
@@ -52,34 +52,34 @@
     <string name="accessibility_query_window_test_activity">Query window test</string>
 
     <!-- String Button1 text -->
-    <string name="button1">Button1</string>
+    <string name="button1">B1</string>
 
     <!-- String Button2 text -->
-    <string name="button2">Button2</string>
+    <string name="button2">B2</string>
 
     <!-- String Button3 text -->
-    <string name="button3">Button3</string>
+    <string name="button3">B3</string>
 
     <!-- String Button4 text -->
-    <string name="button4">Button4</string>
+    <string name="button4">B4</string>
 
     <!-- String Button5 text -->
-    <string name="button5">Button5</string>
+    <string name="button5">B5</string>
 
     <!-- String Button6 text -->
-    <string name="button6">Button6</string>
+    <string name="button6">B6</string>
 
     <!-- String with content description for Button6 -->
     <string name="contentDescription">contentDescription</string>
 
     <!-- String Button7 text -->
-    <string name="button7">Button7</string>
+    <string name="button7">B7</string>
 
     <!-- String Button8 text -->
-    <string name="button8">Button8</string>
+    <string name="button8">B8</string>
 
     <!-- String Button9 text -->
-    <string name="button9">Button9</string>
+    <string name="button9">B9</string>
 
     <!-- AccessibilityFocusTest -->
 
@@ -87,37 +87,37 @@
     <string name="accessibility_view_tree_reporting_test_activity">Accessibility view three reporting test</string>
 
     <!-- String root LinearLayout text -->
-    <string name="rootLinearLayout">rootLinearLayout</string>
+    <string name="rootLinearLayout">rLL</string>
 
     <!-- String first FrameLayout text -->
-    <string name="firstFrameLayout">firstFrameLayout</string>
+    <string name="firstFrameLayout">fFL</string>
 
     <!-- String first LinearLayout text -->
-    <string name="firstLinearLayout">firstLinearLayout</string>
+    <string name="firstLinearLayout">fLL</string>
 
     <!-- String first TextView text -->
-    <string name="firstTextView">firstTextView</string>
+    <string name="firstTextView">fTV</string>
 
     <!-- String first EditText text -->
-    <string name="firstEditText">firstEditText</string>
+    <string name="firstEditText">fET</string>
 
     <!-- String first Button text -->
-    <string name="firstButton">firstButton</string>
+    <string name="firstButton">fB</string>
 
     <!-- String second FrameLayout text -->
-    <string name="secondFrameLayout">secondFrameLayout</string>
+    <string name="secondFrameLayout">sFL</string>
 
     <!-- String second LinearLayout text -->
-    <string name="secondLinearLayout">secondLinearLayout</string>
+    <string name="secondLinearLayout">sLL</string>
 
     <!-- String second TextView text -->
-    <string name="secondTextView">secondTextView</string>
+    <string name="secondTextView">sTV</string>
 
     <!-- String second EditText text -->
-    <string name="secondEditText">secondEditText</string>
+    <string name="secondEditText">sET</string>
 
     <!-- String second Button text -->
-    <string name="secondButton">secondButton</string>
+    <string name="secondButton">sB</string>
 
     <!-- String title of the accessibility focus and input focus sync test activity -->
     <string name="accessibility_focus_and_input_focus_sync_test_activity">Accessibility focus and input focus sync test</string>
@@ -126,14 +126,11 @@
     <string name="accessibility_text_traversal_test_activity">Accessibility text traversal test</string>
 
     <string name="android_wiki_short">
-        Android is a Linux-based operating system for mobile devices</string>
+        Android is a Linux-based operating</string>
 
     <string name="android_wiki">
         Android is a Linux-based operating system for mobile devices such as smartphones and tablet
-        computers. It is developed by the Open Handset Alliance, led by Google, and other companies.
-        Google purchased the initial developer of the software, Android Inc., in 2005. The
-        unveiling of the Android distribution in 2007 was announced with the founding of the Open
-        Handset Alliance, a consortium of 86 hardware, software, and telecommunication </string>
+        computers. It is developed by the Open Handset Alliance, more</string>
 
     <string name="a_b">A B</string>
 
@@ -142,12 +139,7 @@
     <string name="foo_bar_baz">Foo bar baz.</string>
 
     <string name="android_wiki_paragraphs">
-        \n\nAndroid is a Linux-based operating system for mobile devices such as smartphones and tablet
-        computers.\n\n It is developed by the Open Handset Alliance, led by Google, and other companies.
-        Google purchased the initial developer of the software, Android Inc., in 2005.\n The
-        unveiling of the Android distribution in 2007 was announced with the founding of the Open
-        Handset Alliance, a consortium of 86 hardware, software, and telecommunication companies
-        devoted to advancing open standards for mobile devices. Google releases the
-        Android code as open-source, under the Apache License.\n\n</string>
+        \n\nAndroid is a\n\n It is developed\n The
+        unveiling\n\n</string>
 
 </resources>
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
index c7e4f4c..53f68b5 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityActivityTestCase.java
@@ -37,7 +37,7 @@
     /**
      * The timeout since the last accessibility event to consider the device idle.
      */
-    public static final long TIMEOUT_ACCESSIBILITY_STATE_IDLE = 200;
+    public static final long TIMEOUT_ACCESSIBILITY_STATE_IDLE = 500;
 
     /**
      * @param activityClass
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
index cbaf5d2..a53fdea 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityTextTraversalTest.java
@@ -46,6 +46,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                view.setVisibility(View.VISIBLE);
                 view.setContentDescription(getString(R.string.a_b));
             }
         });
@@ -260,6 +261,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                view.setVisibility(View.VISIBLE);
                 view.setContentDescription(getString(R.string.foo_bar_baz));
             }
         });
@@ -474,6 +476,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                textView.setVisibility(View.VISIBLE);
                 textView.setText(getString(R.string.a_b));
             }
         });
@@ -722,6 +725,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.a_b));
                 Selection.removeSelection(editText.getText());
             }
@@ -1220,6 +1224,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                textView.setVisibility(View.VISIBLE);
                 textView.setText(getString(R.string.foo_bar_baz));
             }
         });
@@ -1463,12 +1468,12 @@
     @MediumTest
     public void testActionNextAndPreviousAtGranularityWordOverEditTextWithContentDescription()
             throws Exception {
-
         final EditText editText = (EditText) getActivity().findViewById(R.id.edit);
 
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.foo_bar_baz));
                 editText.setContentDescription(getString(R.string.android_wiki));
             }
@@ -1723,6 +1728,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.foo_bar_baz));
                 Selection.removeSelection(editText.getText());
             }
@@ -2217,6 +2223,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                textView.setVisibility(View.VISIBLE);
                 textView.setText(getString(R.string.android_wiki_short));
             }
         });
@@ -2258,7 +2265,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 25
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2268,8 +2275,8 @@
         assertNotNull(firstExpected);
 
         // Verify the selection position.
-        assertEquals(25, Selection.getSelectionStart(textView.getText()));
-        assertEquals(25, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(13, Selection.getSelectionStart(textView.getText()));
+        assertEquals(13, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -2292,8 +2299,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 25
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                  AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2303,8 +2310,8 @@
         assertNotNull(secondExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(textView.getText()));
-        assertEquals(53, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(25, Selection.getSelectionStart(textView.getText()));
+        assertEquals(25, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -2327,8 +2334,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 53
-                        && event.getToIndex() == 60
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2338,16 +2345,16 @@
         assertNotNull(thirdExpected);
 
         // Verify the selection position.
-        assertEquals(60, Selection.getSelectionStart(textView.getText()));
-        assertEquals(60, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(34, Selection.getSelectionStart(textView.getText()));
+        assertEquals(34, Selection.getSelectionEnd(textView.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
                 AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(60, Selection.getSelectionStart(textView.getText()));
-        assertEquals(60, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(34, Selection.getSelectionStart(textView.getText()));
+        assertEquals(34, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent fourthExpected = getInstrumentation().getUiAutomation()
@@ -2370,8 +2377,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 53
-                        && event.getToIndex() == 60
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2381,8 +2388,8 @@
         assertNotNull(fourthExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(textView.getText()));
-        assertEquals(53, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(25, Selection.getSelectionStart(textView.getText()));
+        assertEquals(25, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -2405,8 +2412,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 25
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2416,8 +2423,8 @@
         assertNotNull(fifthExpected);
 
         // Verify the selection position.
-        assertEquals(25, Selection.getSelectionStart(textView.getText()));
-        assertEquals(25, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(13, Selection.getSelectionStart(textView.getText()));
+        assertEquals(13, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -2441,7 +2448,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 25
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2470,6 +2477,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.android_wiki_short));
                 Selection.removeSelection(editText.getText());
             }
@@ -2513,7 +2521,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 19
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2524,7 +2532,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(19, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(13, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -2547,8 +2555,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 19
-                        && event.getToIndex() == 35
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2559,7 +2567,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(35, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(25, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -2582,8 +2590,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 35
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                  AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2594,7 +2602,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent fourthExpected = getInstrumentation().getUiAutomation()
@@ -2617,8 +2625,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 35
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2629,7 +2637,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(35, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(25, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -2652,8 +2660,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 19
-                        && event.getToIndex() == 35
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2664,7 +2672,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(19, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(13, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -2688,7 +2696,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 19
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2720,14 +2728,14 @@
 
         // Put selection at the end of the text.
         Bundle setSelectionArgs = new Bundle();
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 53);
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 53);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 34);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 34);
         assertTrue(text.performAction(
                 AccessibilityNodeInfo.ACTION_SET_SELECTION, setSelectionArgs));
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(34, Selection.getSelectionEnd(editText.getText()));
 
         // Unocus the view so we can hide the keyboard.
         getInstrumentation().runOnMainSync(new Runnable() {
@@ -2759,8 +2767,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 35
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2770,8 +2778,8 @@
         assertNotNull(seventhExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(35, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(25, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent eightExpected = getInstrumentation().getUiAutomation()
@@ -2794,8 +2802,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 19
-                        && event.getToIndex() == 35
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2805,8 +2813,8 @@
         assertNotNull(eightExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(19, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(13, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous line and wait for an event.
         AccessibilityEvent ninethExpected = getInstrumentation().getUiAutomation()
@@ -2830,7 +2838,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 19
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2840,7 +2848,7 @@
         assertNotNull(ninethExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
         assertEquals(0, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no previous.
@@ -2848,7 +2856,7 @@
                 AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
         assertEquals(0, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next line and wait for an event.
@@ -2873,7 +2881,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 19
+                        && event.getToIndex() == 13
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2883,8 +2891,8 @@
         assertNotNull(tenthExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(19, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(13, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent eleventhExpected = getInstrumentation().getUiAutomation()
@@ -2907,8 +2915,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 19
-                        && event.getToIndex() == 35
+                        && event.getFromIndex() == 13
+                        && event.getToIndex() == 25
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2918,8 +2926,8 @@
         assertNotNull(eleventhExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(35, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(25, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next line and wait for an event.
         AccessibilityEvent twelvethExpected = getInstrumentation().getUiAutomation()
@@ -2942,8 +2950,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_short))
-                        && event.getFromIndex() == 35
-                        && event.getToIndex() == 53
+                        && event.getFromIndex() == 25
+                        && event.getToIndex() == 34
                         && event.getMovementGranularity() ==
                                  AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE);
             }
@@ -2953,8 +2961,8 @@
         assertNotNull(twelvethExpected);
 
         // Verify the selection position.
-        assertEquals(53, Selection.getSelectionStart(editText.getText()));
-        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(34, Selection.getSelectionStart(editText.getText()));
+        assertEquals(34, Selection.getSelectionEnd(editText.getText()));
     }
 
     @MediumTest
@@ -2964,6 +2972,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.android_wiki));
                 Selection.removeSelection(editText.getText());
             }
@@ -3006,7 +3015,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3016,8 +3025,8 @@
         assertNotNull(firstExpected);
 
         // Verify the selection position.
-        assertEquals(139, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(53, Selection.getSelectionStart(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -3040,8 +3049,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3051,8 +3060,8 @@
         assertNotNull(secondExpected);
 
         // Verify the selection position.
-        assertEquals(285, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(103, Selection.getSelectionStart(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -3075,8 +3084,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3086,16 +3095,16 @@
         assertNotNull(thirdExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(436, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
                 AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(436, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent fourthExpected = getInstrumentation().getUiAutomation()
@@ -3118,8 +3127,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3129,8 +3138,8 @@
         assertNotNull(fourthExpected);
 
         // Verify the selection position.
-        assertEquals(285, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(103, Selection.getSelectionStart(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -3153,8 +3162,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3164,8 +3173,8 @@
         assertNotNull(fifthExpected);
 
         // Verify the selection position.
-        assertEquals(139, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(53, Selection.getSelectionStart(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -3189,7 +3198,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3218,6 +3227,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.android_wiki));
                 Selection.removeSelection(editText.getText());
             }
@@ -3261,7 +3271,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3272,7 +3282,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -3295,8 +3305,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3307,7 +3317,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -3330,8 +3340,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3342,7 +3352,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(436, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
@@ -3369,8 +3379,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3381,7 +3391,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -3404,8 +3414,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3416,7 +3426,7 @@
 
         // Verify the selection position.
         assertEquals(0, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -3440,7 +3450,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3472,14 +3482,14 @@
 
         // Put selection at the end of the text.
         Bundle setSelectionArgs = new Bundle();
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 436);
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 436);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 153);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 153);
         assertTrue(text.performAction(
                 AccessibilityNodeInfo.ACTION_SET_SELECTION, setSelectionArgs));
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(436, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionEnd(editText.getText()));
 
         // Unfocus the view so we can hide the soft-keyboard.
         getInstrumentation().runOnMainSync(new Runnable() {
@@ -3511,8 +3521,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3522,8 +3532,8 @@
         assertNotNull(seventhExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent eightExpected = getInstrumentation().getUiAutomation()
@@ -3546,8 +3556,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3557,8 +3567,8 @@
         assertNotNull(eightExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous page and wait for an event.
         AccessibilityEvent ninethExpected = getInstrumentation().getUiAutomation()
@@ -3582,7 +3592,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3592,7 +3602,7 @@
         assertNotNull(ninethExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
         assertEquals(0, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no previous.
@@ -3600,7 +3610,7 @@
                 AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
         assertEquals(0, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
@@ -3625,7 +3635,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
                         && event.getFromIndex() == 0
-                        && event.getToIndex() == 139
+                        && event.getToIndex() == 53
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3635,8 +3645,8 @@
         assertNotNull(tenthExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(139, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(53, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent eleventhExpected = getInstrumentation().getUiAutomation()
@@ -3659,8 +3669,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 139
-                        && event.getToIndex() == 285
+                        && event.getFromIndex() == 53
+                        && event.getToIndex() == 103
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3670,8 +3680,8 @@
         assertNotNull(eleventhExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(285, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(103, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next page and wait for an event.
         AccessibilityEvent twelvethExpected = getInstrumentation().getUiAutomation()
@@ -3694,8 +3704,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki))
-                        && event.getFromIndex() == 285
-                        && event.getToIndex() == 436
+                        && event.getFromIndex() == 103
+                        && event.getToIndex() == 153
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
             }
@@ -3705,8 +3715,8 @@
         assertNotNull(twelvethExpected);
 
         // Verify the selection position.
-        assertEquals(436, Selection.getSelectionStart(editText.getText()));
-        assertEquals(436, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(153, Selection.getSelectionStart(editText.getText()));
+        assertEquals(153, Selection.getSelectionEnd(editText.getText()));
     }
 
     @MediumTest
@@ -3716,13 +3726,14 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                textView.setVisibility(View.VISIBLE);
                 textView.setText(getString(R.string.android_wiki_paragraphs));
             }
         });
 
         final AccessibilityNodeInfo text = getInstrumentation().getUiAutomation()
                .getRootInActiveWindow().findAccessibilityNodeInfosByText(getString(
-                       R.string.android_wiki_short)).get(0);
+                       R.string.android_wiki_paragraphs)).get(0);
 
         final int granularities = text.getMovementGranularities();
         assertEquals(granularities, AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER
@@ -3757,7 +3768,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                  AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3767,8 +3778,8 @@
         assertNotNull(firstExpected);
 
         // Verify the selection position.
-        assertEquals(104, Selection.getSelectionStart(textView.getText()));
-        assertEquals(104, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(14, Selection.getSelectionStart(textView.getText()));
+        assertEquals(14, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -3791,8 +3802,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3802,8 +3813,8 @@
         assertNotNull(secondExpected);
 
         // Verify the selection position.
-        assertEquals(267, Selection.getSelectionStart(textView.getText()));
-        assertEquals(267, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(32, Selection.getSelectionStart(textView.getText()));
+        assertEquals(32, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -3826,8 +3837,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3837,16 +3848,16 @@
         assertNotNull(thirdExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(textView.getText()));
-        assertEquals(582, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(47, Selection.getSelectionStart(textView.getText()));
+        assertEquals(47, Selection.getSelectionEnd(textView.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
                 AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(textView.getText()));
-        assertEquals(582, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(47, Selection.getSelectionStart(textView.getText()));
+        assertEquals(47, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent fourthExpected = getInstrumentation().getUiAutomation()
@@ -3869,8 +3880,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                  AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3880,8 +3891,8 @@
         assertNotNull(fourthExpected);
 
         // Verify the selection position.
-        assertEquals(268, Selection.getSelectionStart(textView.getText()));
-        assertEquals(268, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(33, Selection.getSelectionStart(textView.getText()));
+        assertEquals(33, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -3904,8 +3915,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3915,8 +3926,8 @@
         assertNotNull(fifthExpected);
 
         // Verify the selection position.
-        assertEquals(106, Selection.getSelectionStart(textView.getText()));
-        assertEquals(106, Selection.getSelectionEnd(textView.getText()));
+        assertEquals(16, Selection.getSelectionStart(textView.getText()));
+        assertEquals(16, Selection.getSelectionEnd(textView.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -3940,7 +3951,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -3969,6 +3980,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setText(getString(R.string.android_wiki_paragraphs));
                 Selection.removeSelection(editText.getText());
             }
@@ -3976,7 +3988,7 @@
 
         final AccessibilityNodeInfo text = getInstrumentation().getUiAutomation()
                .getRootInActiveWindow().findAccessibilityNodeInfosByText(getString(
-                       R.string.android_wiki_short)).get(0);
+                       R.string.android_wiki_paragraphs)).get(0);
 
         final int granularities = text.getMovementGranularities();
         assertEquals(granularities, AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER
@@ -4012,7 +4024,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4023,7 +4035,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(104, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(14, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent secondExpected = getInstrumentation().getUiAutomation()
@@ -4046,8 +4058,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4058,7 +4070,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(267, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(32, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent thirdExpected = getInstrumentation().getUiAutomation()
@@ -4081,8 +4093,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4093,7 +4105,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(582, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
@@ -4101,7 +4113,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(582, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent fourthExpected = getInstrumentation().getUiAutomation()
@@ -4124,8 +4136,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4136,7 +4148,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(268, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(33, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent fifthExpected = getInstrumentation().getUiAutomation()
@@ -4159,8 +4171,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4171,7 +4183,7 @@
 
         // Verify the selection position.
         assertEquals(2, Selection.getSelectionStart(editText.getText()));
-        assertEquals(106, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(16, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent sixthExpected = getInstrumentation().getUiAutomation()
@@ -4195,7 +4207,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4227,14 +4239,14 @@
 
         // Put selection at the end of the text.
         Bundle setSelectionArgs = new Bundle();
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 582);
-        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 582);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 47);
+        setSelectionArgs.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 47);
         assertTrue(text.performAction(
                 AccessibilityNodeInfo.ACTION_SET_SELECTION, setSelectionArgs));
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(582, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(47, Selection.getSelectionEnd(editText.getText()));
 
         // Unfocus the view so we can get rid of the soft-keyboard.
         getInstrumentation().runOnMainSync(new Runnable() {
@@ -4266,8 +4278,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4277,8 +4289,8 @@
         assertNotNull(seventhExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(268, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(33, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent eightExpected = getInstrumentation().getUiAutomation()
@@ -4301,8 +4313,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4312,8 +4324,8 @@
         assertNotNull(eightExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(106, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(16, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the previous paragraph and wait for an event.
         AccessibilityEvent ninethExpected = getInstrumentation().getUiAutomation()
@@ -4337,7 +4349,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4347,7 +4359,7 @@
         assertNotNull(ninethExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
         assertEquals(2, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no previous.
@@ -4355,7 +4367,7 @@
                 AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
         assertEquals(2, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next paragraph and wait for an event.
@@ -4380,7 +4392,7 @@
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
                         && event.getFromIndex() == 2
-                        && event.getToIndex() == 104
+                        && event.getToIndex() == 14
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4390,8 +4402,8 @@
         assertNotNull(tenthExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(104, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(14, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent eleventhExpected = getInstrumentation().getUiAutomation()
@@ -4414,8 +4426,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 106
-                        && event.getToIndex() == 267
+                        && event.getFromIndex() == 16
+                        && event.getToIndex() == 32
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4425,8 +4437,8 @@
         assertNotNull(eleventhExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(267, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(32, Selection.getSelectionEnd(editText.getText()));
 
         // Move to the next paragraph and wait for an event.
         AccessibilityEvent twlevethExpected = getInstrumentation().getUiAutomation()
@@ -4449,8 +4461,8 @@
                         && event.getText().size() > 0
                         && event.getText().get(0).toString().equals(getString(
                                 R.string.android_wiki_paragraphs))
-                        && event.getFromIndex() == 268
-                        && event.getToIndex() == 582
+                        && event.getFromIndex() == 33
+                        && event.getToIndex() == 47
                         && event.getMovementGranularity() ==
                                 AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH);
             }
@@ -4460,16 +4472,16 @@
         assertNotNull(twlevethExpected);
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(582, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(47, Selection.getSelectionEnd(editText.getText()));
 
         // Make sure there is no next.
         assertFalse(text.performAction(
                 AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments));
 
         // Verify the selection position.
-        assertEquals(582, Selection.getSelectionStart(editText.getText()));
-        assertEquals(582, Selection.getSelectionEnd(editText.getText()));
+        assertEquals(47, Selection.getSelectionStart(editText.getText()));
+        assertEquals(47, Selection.getSelectionEnd(editText.getText()));
     }
 
     @MediumTest
@@ -4480,6 +4492,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                editText.setVisibility(View.VISIBLE);
                 editText.setFocusable(true);
                 editText.requestFocus();
                 editText.setText(getString(R.string.foo_bar_baz));
@@ -4536,6 +4549,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                view.setVisibility(View.VISIBLE);
                 view.setContentDescription(getString(R.string.foo_bar_baz));
             }
         });
@@ -4564,6 +4578,7 @@
         getInstrumentation().runOnMainSync(new Runnable() {
             @Override
             public void run() {
+                view.setVisibility(View.VISIBLE);
                 view.setContentDescription(getString(R.string.foo_bar_baz));
             }
         });
diff --git a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
index 0ea9a7f..1632489 100644
--- a/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
+++ b/tests/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityWindowQueryTest.java
@@ -55,7 +55,7 @@
     public void testFindByText() throws Exception {
         // find a view by text
         List<AccessibilityNodeInfo> buttons = getInstrumentation().getUiAutomation()
-                .getRootInActiveWindow().findAccessibilityNodeInfosByText("butto");
+                .getRootInActiveWindow().findAccessibilityNodeInfosByText("b");
         assertEquals(9, buttons.size());
     }
 
@@ -84,15 +84,15 @@
             classNameAndTextList.add("android.widget.LinearLayout");
             classNameAndTextList.add("android.widget.LinearLayout");
             classNameAndTextList.add("android.widget.LinearLayout");
-            classNameAndTextList.add("android.widget.ButtonButton1");
-            classNameAndTextList.add("android.widget.ButtonButton2");
-            classNameAndTextList.add("android.widget.ButtonButton3");
-            classNameAndTextList.add("android.widget.ButtonButton4");
-            classNameAndTextList.add("android.widget.ButtonButton5");
-            classNameAndTextList.add("android.widget.ButtonButton6");
-            classNameAndTextList.add("android.widget.ButtonButton7");
-            classNameAndTextList.add("android.widget.ButtonButton8");
-            classNameAndTextList.add("android.widget.ButtonButton9");
+            classNameAndTextList.add("android.widget.ButtonB1");
+            classNameAndTextList.add("android.widget.ButtonB2");
+            classNameAndTextList.add("android.widget.ButtonB3");
+            classNameAndTextList.add("android.widget.ButtonB4");
+            classNameAndTextList.add("android.widget.ButtonB5");
+            classNameAndTextList.add("android.widget.ButtonB6");
+            classNameAndTextList.add("android.widget.ButtonB7");
+            classNameAndTextList.add("android.widget.ButtonB8");
+            classNameAndTextList.add("android.widget.ButtonB9");
 
             Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>();
             fringe.add(getInstrumentation().getUiAutomation().getRootInActiveWindow());
@@ -420,6 +420,61 @@
         }
     }
 
+    private void verifyNodesInAppWindow(AccessibilityNodeInfo root) throws Exception {
+        try {
+            AccessibilityServiceInfo info = getInstrumentation().getUiAutomation().getServiceInfo();
+            info.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+            getInstrumentation().getUiAutomation().setServiceInfo(info);
+
+            root.refresh();
+
+            // make list of expected nodes
+            List<String> classNameAndTextList = new ArrayList<String>();
+            classNameAndTextList.add("android.widget.FrameLayout");
+            classNameAndTextList.add("android.widget.LinearLayout");
+            classNameAndTextList.add("android.widget.FrameLayout");
+            classNameAndTextList.add("android.widget.LinearLayout");
+            classNameAndTextList.add("android.widget.LinearLayout");
+            classNameAndTextList.add("android.widget.LinearLayout");
+            classNameAndTextList.add("android.widget.LinearLayout");
+            classNameAndTextList.add("android.widget.ButtonB1");
+            classNameAndTextList.add("android.widget.ButtonB2");
+            classNameAndTextList.add("android.widget.ButtonB3");
+            classNameAndTextList.add("android.widget.ButtonB4");
+            classNameAndTextList.add("android.widget.ButtonB5");
+            classNameAndTextList.add("android.widget.ButtonB6");
+            classNameAndTextList.add("android.widget.ButtonB7");
+            classNameAndTextList.add("android.widget.ButtonB8");
+            classNameAndTextList.add("android.widget.ButtonB9");
+
+            Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>();
+            fringe.add(root);
+
+            // do a BFS traversal and check nodes
+            while (!fringe.isEmpty()) {
+                AccessibilityNodeInfo current = fringe.poll();
+
+                CharSequence text = current.getText();
+                String receivedClassNameAndText = current.getClassName().toString()
+                    + ((text != null) ? text.toString() : "");
+                String expectedClassNameAndText = classNameAndTextList.remove(0);
+
+                assertEquals("Did not get the expected node info",
+                        expectedClassNameAndText, receivedClassNameAndText);
+
+                final int childCount = current.getChildCount();
+                for (int i = 0; i < childCount; i++) {
+                    AccessibilityNodeInfo child = current.getChild(i);
+                    fringe.add(child);
+                }
+            }
+        } finally {
+            AccessibilityServiceInfo info = getInstrumentation().getUiAutomation().getServiceInfo();
+            info.flags &= ~AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
+            getInstrumentation().getUiAutomation().setServiceInfo(info);
+        }
+    }
+
     @Override
     protected void scrubClass(Class<?> testCaseClass) {
         /* intentionally do not scrub */
diff --git a/tests/tests/admin/Android.mk b/tests/tests/admin/Android.mk
index 1affed6..c3645cc 100644
--- a/tests/tests/admin/Android.mk
+++ b/tests/tests/admin/Android.mk
@@ -22,7 +22,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner mockito-target
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/admin/src/android/admin/cts/DeviceAdminActivationTest.java b/tests/tests/admin/src/android/admin/cts/DeviceAdminActivationTest.java
index cb0425a..6fcd0de 100644
--- a/tests/tests/admin/src/android/admin/cts/DeviceAdminActivationTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DeviceAdminActivationTest.java
@@ -21,6 +21,7 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.deviceadmin.cts.CtsDeviceAdminBrokenReceiver;
 import android.deviceadmin.cts.CtsDeviceAdminBrokenReceiver2;
 import android.deviceadmin.cts.CtsDeviceAdminBrokenReceiver3;
@@ -31,6 +32,12 @@
 import android.deviceadmin.cts.CtsDeviceAdminActivationTestActivity.OnActivityResultListener;
 import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
 
 /**
  * Tests for the standard way of activating a Device Admin: by starting system UI via an
@@ -40,6 +47,8 @@
 public class DeviceAdminActivationTest
     extends ActivityInstrumentationTestCase2<CtsDeviceAdminActivationTestActivity> {
 
+    private static final String TAG = DeviceAdminActivationTest.class.getSimpleName();
+
     // IMPLEMENTATION NOTE: Because Device Admin activation requires the use of
     // Activity.startActivityForResult, this test creates an empty Activity which then invokes
     // startActivityForResult.
@@ -52,21 +61,8 @@
      */
     private static final int UI_EFFECT_TIMEOUT_MILLIS = 5000;
 
-    /**
-     * Monitor guarding access to {@link #mLastOnActivityResultResultCode} and which is notified
-     * every time {@code onActivityResult} of the {@code CtsDeviceAdminActivationTestActivity} is
-     * invoked.
-     */
-    private final Object mOnActivityResultListenerLock = new Object();
-
-    /**
-     * Result code of the most recent invocation of
-     * {@code CtsDeviceAdminActivationTestActivity.onActivityResult} or {@code null} if no
-     * invocations have occured yet.
-     *
-     * @GuardedBy {@link #mOnActivityResultListenerLock}
-     */
-    private Integer mLastOnActivityResultResultCode;
+    private boolean mDeviceAdmin;
+    @Mock private OnActivityResultListener mMockOnActivityResultListener;
 
     public DeviceAdminActivationTest() {
         super(CtsDeviceAdminActivationTestActivity.class);
@@ -75,18 +71,10 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        getActivity().setOnActivityResultListener(new OnActivityResultListener() {
-            @Override
-            public void onActivityResult(int requestCode, int resultCode, Intent data) {
-                if (requestCode != REQUEST_CODE_ACTIVATE_ADMIN) {
-                    return;
-                }
-                synchronized (mOnActivityResultListenerLock) {
-                    mLastOnActivityResultResultCode = resultCode;
-                    mOnActivityResultListenerLock.notifyAll();
-                }
-            }
-        });
+        MockitoAnnotations.initMocks(this);
+        getActivity().setOnActivityResultListener(mMockOnActivityResultListener);
+        mDeviceAdmin = getInstrumentation().getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_DEVICE_ADMIN);
     }
 
     @Override
@@ -99,6 +87,10 @@
     }
 
     public void testActivateGoodReceiverDisplaysActivationUi() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateGoodReceiverDisplaysActivationUi");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminDeactivatedReceiver.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminDeactivatedReceiver.class);
         assertWithTimeoutOnActivityResultNotInvoked();
@@ -110,6 +102,10 @@
     }
 
     public void testActivateBrokenReceiverFails() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateBrokenReceiverFails");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminBrokenReceiver.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminBrokenReceiver.class);
         assertWithTimeoutOnActivityResultInvokedWithResultCode(Activity.RESULT_CANCELED);
@@ -117,6 +113,10 @@
     }
 
     public void testActivateBrokenReceiver2Fails() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateBrokenReceiver2Fails");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminBrokenReceiver2.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminBrokenReceiver2.class);
         assertWithTimeoutOnActivityResultInvokedWithResultCode(Activity.RESULT_CANCELED);
@@ -124,6 +124,10 @@
     }
 
     public void testActivateBrokenReceiver3Fails() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateBrokenReceiver3Fails");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminBrokenReceiver3.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminBrokenReceiver3.class);
         assertWithTimeoutOnActivityResultInvokedWithResultCode(Activity.RESULT_CANCELED);
@@ -131,6 +135,10 @@
     }
 
     public void testActivateBrokenReceiver4Fails() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateBrokenReceiver4Fails");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminBrokenReceiver4.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminBrokenReceiver4.class);
         assertWithTimeoutOnActivityResultInvokedWithResultCode(Activity.RESULT_CANCELED);
@@ -138,6 +146,10 @@
     }
 
     public void testActivateBrokenReceiver5Fails() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testActivateBrokenReceiver5Fails");
+            return;
+        }
         assertDeviceAdminDeactivated(CtsDeviceAdminBrokenReceiver5.class);
         startAddDeviceAdminActivityForResult(CtsDeviceAdminBrokenReceiver5.class);
         assertWithTimeoutOnActivityResultInvokedWithResultCode(Activity.RESULT_CANCELED);
@@ -161,32 +173,21 @@
 
     private void assertWithTimeoutOnActivityResultNotInvoked() {
         SystemClock.sleep(UI_EFFECT_TIMEOUT_MILLIS);
-        synchronized (mOnActivityResultListenerLock) {
-            assertNull(mLastOnActivityResultResultCode);
-        }
+        Mockito.verify(mMockOnActivityResultListener, Mockito.never())
+                .onActivityResult(
+                        Mockito.eq(REQUEST_CODE_ACTIVATE_ADMIN),
+                        Mockito.anyInt(),
+                        Mockito.any(Intent.class));
     }
 
-    private void assertWithTimeoutOnActivityResultInvokedWithResultCode(int expectedResultCode)
-            throws Exception {
-        long deadlineMillis = SystemClock.elapsedRealtime() + UI_EFFECT_TIMEOUT_MILLIS;
-        synchronized (mOnActivityResultListenerLock) {
-            while (true) {
-                if (mLastOnActivityResultResultCode != null) {
-                    // onActivityResult has been invoked -- check the arguments
-                    assertEquals(expectedResultCode, (int) mLastOnActivityResultResultCode);
-                    break;
-                }
-
-                // onActivityResult has not yet been invoked -- wait until it is
-                long millisTillDeadline = deadlineMillis - SystemClock.elapsedRealtime();
-                if (millisTillDeadline <= 0) {
-                    fail("onActivityResult not invoked within " + UI_EFFECT_TIMEOUT_MILLIS + " ms");
-                    break;
-                }
-
-                mOnActivityResultListenerLock.wait(millisTillDeadline);
-            }
-        }
+    private void assertWithTimeoutOnActivityResultInvokedWithResultCode(int expectedResultCode) {
+        ArgumentCaptor<Integer> resultCodeCaptor = ArgumentCaptor.forClass(int.class);
+        Mockito.verify(mMockOnActivityResultListener, Mockito.timeout(UI_EFFECT_TIMEOUT_MILLIS))
+                .onActivityResult(
+                        Mockito.eq(REQUEST_CODE_ACTIVATE_ADMIN),
+                        resultCodeCaptor.capture(),
+                        Mockito.any(Intent.class));
+        assertEquals(expectedResultCode, (int) resultCodeCaptor.getValue());
     }
 
     private void finishActivateDeviceAdminActivity() {
diff --git a/tests/tests/admin/src/android/admin/cts/DeviceAdminInfoTest.java b/tests/tests/admin/src/android/admin/cts/DeviceAdminInfoTest.java
index b38ef4c..fe68073 100644
--- a/tests/tests/admin/src/android/admin/cts/DeviceAdminInfoTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DeviceAdminInfoTest.java
@@ -21,14 +21,16 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 public class DeviceAdminInfoTest extends AndroidTestCase {
 
+    private static final String TAG = DeviceAdminInfoTest.class.getSimpleName();
+
     private PackageManager mPackageManager;
-
     private ComponentName mComponent;
-
     private ComponentName mSecondComponent;
+    private boolean mDeviceAdmin;
 
     @Override
     protected void setUp() throws Exception {
@@ -36,6 +38,8 @@
         mPackageManager = mContext.getPackageManager();
         mComponent = getReceiverComponent();
         mSecondComponent = getSecondReceiverComponent();
+        mDeviceAdmin =
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
     }
 
     static ComponentName getReceiverComponent() {
@@ -49,6 +53,10 @@
     }
 
     public void testDeviceAdminInfo() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testDeviceAdminInfo");
+            return;
+        }
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.activityInfo = mPackageManager.getReceiverInfo(mComponent,
                 PackageManager.GET_META_DATA);
@@ -77,6 +85,10 @@
     }
 
     public void testDeviceAdminInfo2() throws Exception {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testDeviceAdminInfo2");
+            return;
+        }
         ResolveInfo resolveInfo = new ResolveInfo();
         resolveInfo.activityInfo = mPackageManager.getReceiverInfo(mSecondComponent,
                 PackageManager.GET_META_DATA);
diff --git a/tests/tests/admin/src/android/admin/cts/DeviceAdminReceiverTest.java b/tests/tests/admin/src/android/admin/cts/DeviceAdminReceiverTest.java
index b9f842d..b804625 100644
--- a/tests/tests/admin/src/android/admin/cts/DeviceAdminReceiverTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DeviceAdminReceiverTest.java
@@ -19,10 +19,13 @@
 import android.app.admin.DeviceAdminReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 public class DeviceAdminReceiverTest extends AndroidTestCase {
 
+    private static final String TAG = DeviceAdminReceiverTest.class.getSimpleName();
     private static final String DISABLE_WARNING = "Disable Warning";
 
     private static final int PASSWORD_CHANGED = 0x1;
@@ -33,14 +36,21 @@
     private static final int DEVICE_ADMIN_DISABLED = 0x20;
 
     private TestReceiver mReceiver;
+    private boolean mDeviceAdmin;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mReceiver = new TestReceiver();
+        mDeviceAdmin =
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
     }
 
     public void testOnReceive() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testOnReceive");
+            return;
+        }
         mReceiver.reset();
         mReceiver.onReceive(mContext, new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED));
         assertTrue(mReceiver.hasFlags(PASSWORD_CHANGED));
diff --git a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
index 62f3daa..e953305 100644
--- a/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
+++ b/tests/tests/admin/src/android/admin/cts/DevicePolicyManagerTest.java
@@ -19,7 +19,9 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 import java.util.List;
 
@@ -30,9 +32,11 @@
  */
 public class DevicePolicyManagerTest extends AndroidTestCase {
 
-    private DevicePolicyManager mDevicePolicyManager;
+    private static final String TAG = DevicePolicyManagerTest.class.getSimpleName();
 
+    private DevicePolicyManager mDevicePolicyManager;
     private ComponentName mComponent;
+    private boolean mDeviceAdmin;
 
     @Override
     protected void setUp() throws Exception {
@@ -40,6 +44,8 @@
         mDevicePolicyManager = (DevicePolicyManager)
                 mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
         mComponent = DeviceAdminInfoTest.getReceiverComponent();
+        mDeviceAdmin =
+                mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
         setBlankPassword();
     }
 
@@ -50,6 +56,9 @@
     }
 
     private void setBlankPassword() {
+        if (!mDeviceAdmin) {
+            return;
+        }
         // Reset the password to nothing for future tests...
         mDevicePolicyManager.setPasswordQuality(mComponent,
                 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED);
@@ -58,6 +67,10 @@
     }
 
     public void testGetActiveAdmins() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetActiveAdmins");
+            return;
+        }
         List<ComponentName> activeAdmins = mDevicePolicyManager.getActiveAdmins();
         assertFalse(activeAdmins.isEmpty());
         assertTrue(activeAdmins.contains(mComponent));
@@ -65,6 +78,10 @@
     }
 
     public void testGetMaximumFailedPasswordsForWipe() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testGetMaximumFailedPasswordsForWipe");
+            return;
+        }
         mDevicePolicyManager.setMaximumFailedPasswordsForWipe(mComponent, 3);
         assertEquals(3, mDevicePolicyManager.getMaximumFailedPasswordsForWipe(mComponent));
 
@@ -73,6 +90,10 @@
     }
 
     public void testPasswordQuality_something() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testPasswordQuality_something");
+            return;
+        }
         mDevicePolicyManager.setPasswordQuality(mComponent,
                 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING,
@@ -102,6 +123,10 @@
     }
 
     public void testPasswordQuality_numeric() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testPasswordQuality_numeric");
+            return;
+        }
         mDevicePolicyManager.setPasswordQuality(mComponent,
                 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC,
@@ -131,6 +156,10 @@
     }
 
     public void testPasswordQuality_alphabetic() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testPasswordQuality_alphabetic");
+            return;
+        }
         mDevicePolicyManager.setPasswordQuality(mComponent,
                 DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC,
@@ -160,6 +189,10 @@
     }
 
     public void testPasswordQuality_alphanumeric() {
+        if (!mDeviceAdmin) {
+            Log.w(TAG, "Skipping testPasswordQuality_alphanumeric");
+            return;
+        }
         mDevicePolicyManager.setPasswordQuality(mComponent,
                 DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC);
         assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC,
diff --git a/tests/tests/app/AndroidManifest.xml b/tests/tests/app/AndroidManifest.xml
index af7d997..acfc3c8 100644
--- a/tests/tests/app/AndroidManifest.xml
+++ b/tests/tests/app/AndroidManifest.xml
@@ -16,7 +16,7 @@
  -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.cts.app">
+    package="com.android.app.cts">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <application>
diff --git a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
index 622055c..408efe7 100644
--- a/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
+++ b/tests/tests/app/src/android/app/cts/ActivityManagerMemoryClassTest.java
@@ -90,10 +90,18 @@
                 expectedMinimumMemory = isXLarge ? 128 : 64;
                 break;
 
+            case DisplayMetrics.DENSITY_400:
+                expectedMinimumMemory = isXLarge ? 192 : 128;
+                break;
+
             case DisplayMetrics.DENSITY_XXHIGH:
                 expectedMinimumMemory = isXLarge ? 256 : 128;
                 break;
 
+            case DisplayMetrics.DENSITY_XXXHIGH:
+                expectedMinimumMemory = isXLarge ? 512 : 256;
+                break;
+
             default:
                 throw new IllegalArgumentException("No memory requirement specified "
                         + " for screen density " + screenDensity);
diff --git a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
index 74f85bb..5f826eb 100644
--- a/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
+++ b/tests/tests/app/src/android/app/cts/AlertDialog_BuilderTest.java
@@ -249,7 +249,7 @@
         assertTrue(mResult);
     }
 
-    private void setCancelable(final boolean cancelable) throws Throwable {
+    private void testCancelable(final boolean cancelable) throws Throwable {
         runTestOnUiThread(new Runnable() {
             public void run() {
                 mBuilder = new AlertDialog.Builder(mContext);
@@ -258,18 +258,37 @@
             }
         });
         mInstrumentation.waitForIdleSync();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mDialog.isShowing();
+            }
+        }.run();
+        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+        mInstrumentation.waitForIdleSync();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                boolean showing = mDialog.isShowing();
+                if (cancelable) {
+                    // if the dialog is cancelable, then pressing back
+                    // should cancel it. Thus it should not be showing
+                    return !showing;
+                } else {
+                    // if the dialog is not cancelable, pressing back
+                    // should so nothing and it should still be showing
+                    return showing;
+                }
+            }
+        }.run();
     }
 
     public void testSetCancelable() throws Throwable {
-        setCancelable(true);
-        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
-        assertFalse(mDialog.isShowing());
+        testCancelable(true);
     }
 
     public void testDisableCancelable() throws Throwable {
-        setCancelable(false);
-        mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
-        assertTrue(mDialog.isShowing());
+        testCancelable(false);
     }
 
     public void testSetOnCancelListener() throws Throwable {
diff --git a/tests/tests/app/src/android/app/cts/DialogTest.java b/tests/tests/app/src/android/app/cts/DialogTest.java
index 1f6e2ab..fa90494 100644
--- a/tests/tests/app/src/android/app/cts/DialogTest.java
+++ b/tests/tests/app/src/android/app/cts/DialogTest.java
@@ -17,7 +17,6 @@
 
 import com.android.cts.stub.R;
 
-
 import android.app.Dialog;
 import android.app.Instrumentation;
 import android.content.Context;
@@ -371,10 +370,15 @@
 
         long now = SystemClock.uptimeMillis();
         MotionEvent touchMotionEvent = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN,
-                -20.0f, -20.0f, 0);
+                1, 100, 0);
         mInstrumentation.sendPointerSync(touchMotionEvent);
 
-        assertFalse(d.dispatchTouchEventResult);
+        new PollingCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return !d.dispatchTouchEventResult;
+            }
+        }.run();
+
         assertMotionEventEquals(touchMotionEvent, d.touchEvent);
 
         assertTrue(d.isOnTouchEventCalled);
@@ -386,11 +390,16 @@
         // because closeOnTouchOutside is true.
         d.setCanceledOnTouchOutside(true);
 
-        touchMotionEvent = MotionEvent.obtain(now + 1, now, MotionEvent.ACTION_DOWN,
-                -20.0f, -20.0f, 0);
+        touchMotionEvent = MotionEvent.obtain(now, now + 1, MotionEvent.ACTION_DOWN,
+                1, 100, 0);
         mInstrumentation.sendPointerSync(touchMotionEvent);
 
-        assertTrue(d.dispatchTouchEventResult);
+        new PollingCheck(TEST_TIMEOUT) {
+            protected boolean check() {
+                return d.dispatchTouchEventResult;
+            }
+        }.run();
+
         assertMotionEventEquals(touchMotionEvent, d.touchEvent);
 
         assertTrue(d.isOnTouchEventCalled);
@@ -403,7 +412,7 @@
         final TestDialog d = (TestDialog) mActivity.getDialog();
         long eventTime = SystemClock.uptimeMillis();
         final MotionEvent trackBallEvent = MotionEvent.obtain(eventTime, eventTime,
-                MotionEvent.ACTION_DOWN, -20.0f, -20.0f, 0);
+                MotionEvent.ACTION_DOWN, 0.0f, 0.0f, 0);
 
         assertNull(d.trackballEvent);
         assertNull(d.onTrackballEvent);
diff --git a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
index 6c73f7d..5c80fd1 100644
--- a/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
+++ b/tests/tests/app/src/android/app/cts/SystemFeaturesTest.java
@@ -200,6 +200,7 @@
     public void testNfcFeatures() {
         if (NfcAdapter.getDefaultAdapter(mContext) != null) {
             assertAvailable(PackageManager.FEATURE_NFC);
+            assertAvailable(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION);
         } else {
             assertNotAvailable(PackageManager.FEATURE_NFC);
         }
@@ -229,6 +230,10 @@
                 Sensor.TYPE_LIGHT);
         assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_PROXIMITY,
                 Sensor.TYPE_PROXIMITY);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_STEP_COUNTER,
+                Sensor.TYPE_STEP_COUNTER);
+        assertFeatureForSensor(featuresLeft, PackageManager.FEATURE_SENSOR_STEP_DETECTOR,
+                Sensor.TYPE_STEP_DETECTOR);
 
         assertTrue("Assertions need to be added to this test for " + featuresLeft,
                 featuresLeft.isEmpty());
diff --git a/tests/tests/app/src/android/app/cts/WallpaperManagerTest.java b/tests/tests/app/src/android/app/cts/WallpaperManagerTest.java
index 62e00e9..fdf3cac 100644
--- a/tests/tests/app/src/android/app/cts/WallpaperManagerTest.java
+++ b/tests/tests/app/src/android/app/cts/WallpaperManagerTest.java
@@ -17,7 +17,11 @@
 package android.app.cts;
 
 import android.app.WallpaperManager;
+import android.content.Context;
+import android.graphics.Point;
 import android.test.AndroidTestCase;
+import android.view.Display;
+import android.view.WindowManager;
 
 public class WallpaperManagerTest extends AndroidTestCase {
 
@@ -30,10 +34,32 @@
     }
 
     public void testSuggestDesiredDimensions() {
-        mWallpaperManager.suggestDesiredDimensions(320, 480);
-        int desiredMinimumWidth = mWallpaperManager.getDesiredMinimumWidth();
-        int desiredMinimumHeight = mWallpaperManager.getDesiredMinimumHeight();
-        assertEquals(320, desiredMinimumWidth);
-        assertEquals(480, desiredMinimumHeight);
+        Point min = getScreenSize();
+        int w = min.x * 3;
+        int h = min.y * 2;
+
+        mWallpaperManager.suggestDesiredDimensions(min.x / 2, min.y / 2);
+        assertEquals(min.x, mWallpaperManager.getDesiredMinimumWidth());
+        assertEquals(min.y, mWallpaperManager.getDesiredMinimumHeight());
+
+        mWallpaperManager.suggestDesiredDimensions(w, h);
+        assertEquals(w, mWallpaperManager.getDesiredMinimumWidth());
+        assertEquals(h, mWallpaperManager.getDesiredMinimumHeight());
+
+        mWallpaperManager.suggestDesiredDimensions(min.x / 2, h);
+        assertEquals(min.x, mWallpaperManager.getDesiredMinimumWidth());
+        assertEquals(h, mWallpaperManager.getDesiredMinimumHeight());
+
+        mWallpaperManager.suggestDesiredDimensions(w, min.y / 2);
+        assertEquals(w, mWallpaperManager.getDesiredMinimumWidth());
+        assertEquals(min.y, mWallpaperManager.getDesiredMinimumHeight());
+    }
+
+    private Point getScreenSize() {
+        WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
+        Display d = wm.getDefaultDisplay();
+        Point p = new Point();
+        d.getRealSize(p);
+        return p;
     }
 }
diff --git a/tests/tests/bionic/Android.mk b/tests/tests/bionic/Android.mk
new file mode 100644
index 0000000..326fd56
--- /dev/null
+++ b/tests/tests/bionic/Android.mk
@@ -0,0 +1,26 @@
+LOCAL_PATH := $(call my-dir)
+
+test_executable := bionic-unit-tests-cts
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := $(test_executable)
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
+
+LOCAL_ADDITION_DEPENDENCIES := \
+    $(LOCAL_PATH)/Android.mk \
+
+LOCAL_SHARED_LIBRARIES += \
+    libstlport \
+    libdl \
+
+LOCAL_WHOLE_STATIC_LIBRARIES += \
+    libBionicTests \
+
+LOCAL_STATIC_LIBRARIES += \
+    libgtest \
+    libgtest_main \
+
+LOCAL_CTS_TEST_PACKAGE := android.bionic
+include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/bionic/bionic-unit-tests-cts_list.txt b/tests/tests/bionic/bionic-unit-tests-cts_list.txt
new file mode 100644
index 0000000..55daff5
--- /dev/null
+++ b/tests/tests/bionic/bionic-unit-tests-cts_list.txt
@@ -0,0 +1,576 @@
+Fortify1_Gcc_DeathTest.
+  strcpy_fortified
+  strcpy2_fortified
+  strcpy3_fortified
+  strcpy4_fortified
+  strlen_fortified
+  strchr_fortified
+  strrchr_fortified
+  strlcpy_fortified
+  strlcat_fortified
+  sprintf_fortified
+  sprintf2_fortified
+  vsprintf_fortified
+  vsprintf2_fortified
+  vsnprintf_fortified
+  vsnprintf2_fortified
+  strncat_fortified
+  strncat2_fortified
+  strcat_fortified
+  memmove_fortified
+  memcpy_fortified
+  strncpy_fortified
+  snprintf_fortified
+  bzero_fortified
+  umask_fortified
+Fortify2_Gcc_DeathTest.
+  strncpy_fortified2
+  sprintf_fortified2
+  sprintf2_fortified2
+  vsprintf_fortified2
+  vsprintf2_fortified2
+  vsnprintf_fortified2
+  vsnprintf2_fortified2
+  strcpy_fortified2
+  strcpy2_fortified2
+  strcpy3_fortified2
+  strchr_fortified2
+  strrchr_fortified2
+  strlcpy_fortified2
+  strlcat_fortified2
+  strncat_fortified2
+  strncat2_fortified2
+  strncat3_fortified2
+  strcat_fortified2
+  strcat2_fortified2
+  snprintf_fortified2
+  bzero_fortified2
+  strcpy_fortified
+  strcpy2_fortified
+  strcpy3_fortified
+  strcpy4_fortified
+  strlen_fortified
+  strchr_fortified
+  strrchr_fortified
+  strlcpy_fortified
+  strlcat_fortified
+  sprintf_fortified
+  sprintf2_fortified
+  vsprintf_fortified
+  vsprintf2_fortified
+  vsnprintf_fortified
+  vsnprintf2_fortified
+  strncat_fortified
+  strncat2_fortified
+  strcat_fortified
+  memmove_fortified
+  memcpy_fortified
+  strncpy_fortified
+  snprintf_fortified
+  bzero_fortified
+  umask_fortified
+Fortify1_Clang_DeathTest.
+  strcpy_fortified
+  strcpy2_fortified
+  strcpy3_fortified
+  strcpy4_fortified
+  strlen_fortified
+  strchr_fortified
+  strrchr_fortified
+  strlcpy_fortified
+  strlcat_fortified
+  sprintf_fortified
+  sprintf2_fortified
+  vsprintf_fortified
+  vsprintf2_fortified
+  vsnprintf_fortified
+  vsnprintf2_fortified
+  strncat_fortified
+  strncat2_fortified
+  strcat_fortified
+  memmove_fortified
+  memcpy_fortified
+  strncpy_fortified
+  snprintf_fortified
+  bzero_fortified
+  umask_fortified
+Fortify2_Clang_DeathTest.
+  strncat3_fortified2
+  strcat2_fortified2
+  snprintf_fortified2
+  bzero_fortified2
+  strcpy_fortified
+  strcpy2_fortified
+  strcpy3_fortified
+  strcpy4_fortified
+  strlen_fortified
+  strchr_fortified
+  strrchr_fortified
+  strlcpy_fortified
+  strlcat_fortified
+  sprintf_fortified
+  sprintf2_fortified
+  vsprintf_fortified
+  vsprintf2_fortified
+  vsnprintf_fortified
+  vsnprintf2_fortified
+  strncat_fortified
+  strncat2_fortified
+  strcat_fortified
+  memmove_fortified
+  memcpy_fortified
+  strncpy_fortified
+  snprintf_fortified
+  bzero_fortified
+  umask_fortified
+pthread_DeathTest.
+  pthread_bug_37410
+stack_protector_DeathTest.
+  modify_stack_protector
+properties_DeathTest.
+  read_only
+Fortify1_Gcc.
+  strncat
+  strncat2
+  strncat3
+  strncat4
+  strncat5
+  strncat6
+  strcat
+  strcat2
+  strcat_chk_max_int_size
+  strcpy_chk_max_int_size
+  memcpy_chk_max_int_size
+Fortify2_Gcc.
+  strncat
+  strncat2
+  strncat3
+  strncat4
+  strncat5
+  strncat6
+  strcat
+  strcat2
+  strcat_chk_max_int_size
+  strcpy_chk_max_int_size
+  memcpy_chk_max_int_size
+Fortify1_Clang.
+  strncat
+  strncat2
+  strncat3
+  strncat4
+  strncat5
+  strncat6
+  strcat
+  strcat2
+  strcat_chk_max_int_size
+  strcpy_chk_max_int_size
+  memcpy_chk_max_int_size
+Fortify2_Clang.
+  strncat
+  strncat2
+  strncat3
+  strncat4
+  strncat5
+  strncat6
+  strcat
+  strcat2
+  strcat_chk_max_int_size
+  strcpy_chk_max_int_size
+  memcpy_chk_max_int_size
+dirent.
+  scandir
+  fdopendir_invalid
+  fdopendir
+  opendir_invalid
+  opendir
+  closedir_invalid
+  closedir
+  readdir
+  readdir_r
+  rewinddir
+eventfd.
+  smoke
+fenv.
+  fesetround_fegetround_FE_TONEAREST
+  fesetround_fegetround_FE_TOWARDZERO
+  fesetround_fegetround_FE_UPWARD
+  fesetround_fegetround_FE_DOWNWARD
+  feclearexcept_fetestexcept
+  FE_DFL_ENV_macro
+getauxval.
+  expected_values
+  unexpected_values
+getcwd.
+  auto_full
+  auto_reasonable
+  auto_too_small
+  auto_too_large
+  manual_too_small
+  manual_zero
+  manual_path_max
+inttypes.
+  misc
+libc_logging.
+  smoke
+  d_INT_MAX
+  d_INT_MIN
+  ld_LONG_MAX
+  ld_LONG_MIN
+  lld_LLONG_MAX
+  lld_LLONG_MIN
+libgen.
+  basename
+  dirname
+  basename_r
+  dirname_r
+malloc.
+  malloc_std
+  calloc_std
+  memalign_multiple
+  memalign_realloc
+  malloc_realloc_larger
+  malloc_realloc_smaller
+  malloc_multiple_realloc
+  calloc_realloc_larger
+  calloc_realloc_smaller
+  calloc_multiple_realloc
+math.
+  fpclassify
+  isinf
+  isnan
+  isnormal
+  __fpclassifyd
+  __fpclassifyf
+  __fpclassifyl
+  finitef
+  __isfinite
+  __isfinitef
+  __isfinitel
+  finite
+  __isinff
+  __isinfl
+  __isnanf
+  __isnanl
+  isnanf
+  __isnormal
+  __isnormalf
+  __isnormall
+  __signbit
+  __signbitf
+  __signbitl
+  acos
+  acosf
+  acosl
+  asin
+  asinf
+  asinl
+  atan
+  atanf
+  atanl
+  atan2
+  atan2f
+  atan2l
+  cos
+  cosf
+  cosl
+  sin
+  sinf
+  sinl
+  tan
+  tanf
+  tanl
+  acosh
+  acoshf
+  acoshl
+  asinh
+  asinhf
+  asinhl
+  atanh
+  atanhf
+  atanhl
+  cosh
+  coshf
+  coshl
+  sinh
+  sinhf
+  sinhl
+  tanh
+  tanhf
+  tanhl
+  log
+  logf
+  logl
+  log2
+  log2f
+  log2l
+  log10
+  log10f
+  log10l
+  cbrt
+  cbrtf
+  cbrtl
+  sqrt
+  sqrtf
+  sqrtl
+  exp
+  expf
+  expl
+  exp2
+  exp2f
+  exp2l
+  expm1
+  expm1f
+  expm1l
+  pow
+  powf
+  powl
+  ceil
+  ceilf
+  ceill
+  floor
+  floorf
+  floorl
+  fabs
+  fabsf
+  fabsl
+  ldexp
+  ldexpf
+  ldexpl
+  fmod
+  fmodf
+  fmodl
+  remainder
+  remainderf
+  remainderl
+  drem
+  dremf
+  fmax
+  fmaxf
+  fmaxl
+  fmin
+  fminf
+  fminl
+  fma
+  fmaf
+  fmal
+  hypot
+  hypotf
+  hypotl
+  erf
+  erff
+  erfl
+  erfc
+  erfcf
+  erfcl
+  lrint
+  rint
+  nearbyint
+  lround
+  llround
+  ilogb
+  ilogbf
+  ilogbl
+  logb
+  logbf
+  logbl
+  log1p
+  log1pf
+  log1pl
+  fdim
+  fdimf
+  fdiml
+  round
+  roundf
+  roundl
+  trunc
+  truncf
+  truncl
+  nextafter
+  nextafterf
+  nextafterl
+  copysign
+  copysignf
+  copysignl
+  significand
+  significandf
+  significandl
+  scalb
+  scalbf
+  scalbln
+  scalblnf
+  scalblnl
+  scalbn
+  scalbnf
+  scalbnl
+  gamma
+  gammaf
+  gamma_r
+  gammaf_r
+  lgamma
+  lgammaf
+  lgammal
+  lgamma_r
+  lgammaf_r
+  tgamma
+  tgammaf
+  tgammal
+  j0
+  j0f
+  j1
+  j1f
+  jn
+  jnf
+  y0
+  y0f
+  y1
+  y1f
+  yn
+  ynf
+  frexp
+  frexpf
+  frexpl
+  modf
+  modff
+  modfl
+  remquo
+  remquof
+  remquol
+  frexpf_public_bug_6697
+netdb.
+  getaddrinfo_NULL_hints
+  getnameinfo_salen
+pthread.
+  pthread_key_create
+  pthread_key_create_lots
+  pthread_create
+  pthread_create_EAGAIN
+  pthread_no_join_after_detach
+  pthread_no_op_detach_after_join
+  pthread_join_self
+  pthread_sigmask
+  __pthread_clone
+  pthread_setname_np__too_long
+  pthread_setname_np__self
+  pthread_setname_np__other
+  pthread_setname_np__no_such_thread
+  pthread_kill__0
+  pthread_kill__invalid_signal
+  pthread_kill__in_signal_handler
+  pthread_detach__no_such_thread
+  pthread_getcpuclockid__clock_gettime
+  pthread_getcpuclockid__no_such_thread
+  pthread_getschedparam__no_such_thread
+  pthread_setschedparam__no_such_thread
+  pthread_join__no_such_thread
+  pthread_kill__no_such_thread
+  pthread_join__multijoin
+  pthread_attr_setguardsize
+  pthread_attr_setstacksize
+regex.
+  smoke
+signal.
+  sigismember_invalid
+  sigaddset_invalid
+  sigdelset_invalid
+  sigemptyset_invalid
+  sigfillset_invalid
+  raise_invalid
+  raise_in_signal_handler
+  sigwait
+stack_protector.
+  global_guard
+statvfs.
+  statvfs
+  fstatvfs
+stdio.
+  tmpfile_fileno_fprintf_rewind_fgets
+  getdelim
+  getdelim_invalid
+  getline
+  getline_invalid
+  printf_ssize_t
+  popen
+  getc
+  putc
+stdlib.
+  drand48
+  lrand48_random_rand
+  mrand48
+  posix_memalign
+  realpath__NULL_filename
+  realpath__empty_filename
+  realpath__ENOENT
+  realpath
+  qsort
+string.
+  strerror
+  strerror_concurrent
+  strerror_r
+  strsignal
+  strsignal_concurrent
+  strcat
+  strcpy2
+  strcpy3
+  strcpy4
+  strcat2
+  strcat3
+  strncat2
+  strncat3
+  strncat4
+  strncat5
+  strchr_with_0
+  strchr
+  strcmp
+  strcpy
+  strlcat
+  strlcpy
+  strncat
+  strncmp
+  strncpy
+  strrchr
+  memchr
+  memrchr
+  memcmp
+  __memcmp16
+  wmemcmp
+  memcpy
+  memset
+  memmove
+  bcopy
+  bzero
+strings.
+  ffs
+getpwnam.
+  system_id_root
+  system_id_system
+  app_id_radio
+  app_id_nobody
+  app_id_all_a0
+  app_id_u1_a40000
+  app_id_u0_a0
+  app_id_u0_a1234
+  app_id_u0_a9999
+  app_id_u1_root
+  app_id_u1_radio
+  app_id_u1_a0
+  app_id_u1_i0
+sys_stat.
+  futimens
+  futimens_EBADF
+properties.
+  add
+  update
+  fill
+  foreach
+  find_nth
+  fill_hierarchical
+  errors
+  serial
+  wait
+time.
+  mktime_tz
+  gmtime
+  mktime_10310929
+unistd.
+  sysconf_SC_MONOTONIC_CLOCK
+  sbrk
diff --git a/tests/tests/content/AndroidManifest.xml b/tests/tests/content/AndroidManifest.xml
index 0d702f4..5af05eb 100644
--- a/tests/tests/content/AndroidManifest.xml
+++ b/tests/tests/content/AndroidManifest.xml
@@ -18,9 +18,25 @@
     package="com.android.cts.content">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <application>
-        <uses-library android:name="android.test.runner" />
 
+    <application>
+        <activity android:name="android.app.cts.MockActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.content.action.TEST_ACTION" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="com.android.cts.content.category.TEST_CATEGORY" />
+            </intent-filter>
+        </activity>
+
+        <activity-alias android:name="android.app.cts.MockActivity2"
+                android:targetActivity="android.app.cts.MockActivity">
+            <intent-filter>
+                <action android:name="com.android.cts.content.action.TEST_ACTION" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity-alias>
+
+        <uses-library android:name="android.test.runner" />
     </application>
 
     <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
old mode 100755
new mode 100644
index a06b603..a2dddb5
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -16,11 +16,13 @@
 
 package android.content.cts;
 
+import android.app.DownloadManager;
 import android.app.SearchManager;
 import android.content.ContentUris;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.provider.AlarmClock;
 import android.provider.MediaStore;
@@ -197,4 +199,47 @@
         intent.putExtra(AlarmClock.EXTRA_MINUTES, 0);
         assertCanBeHandled(intent);
     }
+
+    public void testOpenDocumentAny() {
+        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("*/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testOpenDocumentImage() {
+        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("image/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testCreateDocument() {
+        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("text/plain");
+        assertCanBeHandled(intent);
+    }
+
+    public void testGetContentAny() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("*/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testGetContentImage() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.addCategory(Intent.CATEGORY_OPENABLE);
+        intent.setType("image/*");
+        assertCanBeHandled(intent);
+    }
+
+    public void testRingtonePicker() {
+        assertCanBeHandled(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER));
+    }
+
+    public void testViewDownloads() {
+        assertCanBeHandled(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));
+    }
 }
diff --git a/tests/tests/content/src/android/content/cts/ContentProviderTest.java b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
index 34b1e8c..5ced37c 100644
--- a/tests/tests/content/src/android/content/cts/ContentProviderTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentProviderTest.java
@@ -16,33 +16,22 @@
 
 package android.content.cts;
 
-import com.android.cts.stub.R;
-
-
 import android.content.ContentProvider;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
-import android.content.IContentProvider;
-import android.content.ContentProviderResult;
-import android.content.ContentProviderOperation;
-import android.content.OperationApplicationException;
 import android.content.pm.ProviderInfo;
-import android.content.res.AssetFileDescriptor;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ICancellationSignal;
 import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
 import android.test.AndroidTestCase;
 
+import com.android.cts.stub.R;
+
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.util.ArrayList;
 
 /**
  * Test {@link ContentProvider}.
@@ -212,8 +201,8 @@
         try {
             uri = Uri.parse("content://test");
             cp.openFile(uri, "wrong");
-            fail("Should throw FileNotFoundException!");
-        } catch (FileNotFoundException e) {
+            fail("Should throw IllegalArgumentException for bad mode!");
+        } catch (IllegalArgumentException e) {
         }
 
         // delete the temporary file
@@ -241,93 +230,6 @@
         // cannot trigger this callback reliably
     }
 
-    public void testCoerceToLocalContentProvider() {
-        MockContentProvider mockContentProvider = new MockContentProvider();
-
-        IContentProvider transport = mockContentProvider.getIContentProvider();
-        assertSame(mockContentProvider, ContentProvider.coerceToLocalContentProvider(transport));
-
-        IContentProvider iContentProvider = new IContentProvider() {
-            @Override
-            public int bulkInsert(String callingPkg, Uri url, ContentValues[] initialValues) {
-                return 0;
-            }
-
-            @Override
-            public int delete(String callingPkg, Uri url, String selection, String[] selectionArgs) {
-                return 0;
-            }
-
-            @Override
-            public String getType(Uri url) {
-                return null;
-            }
-
-            @Override
-            public Uri insert(String callingPkg, Uri url, ContentValues initialValues) {
-                return null;
-            }
-
-            @Override
-            public ParcelFileDescriptor openFile(String callingPkg, Uri url, String mode) {
-                return null;
-            }
-
-            @Override
-            public AssetFileDescriptor openAssetFile(String callingPkg, Uri url, String mode) {
-                return null;
-            }
-
-            @Override
-            public ContentProviderResult[] applyBatch(String callingPkg,
-                    ArrayList<ContentProviderOperation> operations)
-                    throws RemoteException, OperationApplicationException {
-                return null;
-            }
-
-            @Override
-            public Cursor query(String callingPkg, Uri url, String[] projection, String selection,
-                    String[] selectionArgs, String sortOrder,
-                    ICancellationSignal cancellationSignal) {
-                return null;
-            }
-
-            @Override
-            public int update(String callingPkg, Uri url, ContentValues values, String selection,
-                    String[] selectionArgs) {
-                return 0;
-            }
-
-            @Override
-            public IBinder asBinder() {
-                return null;
-            }
-
-            @Override
-            public Bundle call(String callingPkg, String method, String request, Bundle args) {
-                return null;
-            }
-
-            @Override
-            public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException {
-                return null;
-            }
-
-            @Override
-            public AssetFileDescriptor openTypedAssetFile(String callingPkg, Uri url,
-                    String mimeType, Bundle opts)
-                    throws RemoteException, FileNotFoundException {
-                return null;
-            }
-
-            @Override
-            public ICancellationSignal createCancellationSignal() throws RemoteException {
-                return null;
-            }
-        };
-        assertNull(ContentProvider.coerceToLocalContentProvider(iContentProvider));
-    }
-
     public void testGetIContentProvider() {
         MockContentProvider mockContentProvider = new MockContentProvider();
 
diff --git a/tests/tests/content/src/android/content/cts/ContentResolverTest.java b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
index 22c2faa..47371cc 100644
--- a/tests/tests/content/src/android/content/cts/ContentResolverTest.java
+++ b/tests/tests/content/src/android/content/cts/ContentResolverTest.java
@@ -642,8 +642,8 @@
 
         try {
             mContentResolver.openFileDescriptor(uri, "d");
-            fail("did not throw FileNotFoundException when mode is unknown.");
-        } catch (FileNotFoundException e) {
+            fail("did not throw IllegalArgumentException when mode is unknown.");
+        } catch (IllegalArgumentException e) {
             //expected.
         }
 
diff --git a/tests/tests/content/src/android/content/cts/IntentFilterTest.java b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
index 87a1834..d067b9e 100644
--- a/tests/tests/content/src/android/content/cts/IntentFilterTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentFilterTest.java
@@ -61,6 +61,7 @@
     private static final String CATEGORY = "testCategory";
     private static final String DATA_TYPE = "vnd.android.cursor.dir/person";
     private static final String DATA_SCHEME = "testDataSchemes.";
+    private static final String SSP = "testSsp";
     private static final String HOST = "testHost";
     private static final int PORT = 80;
     private static final String DATA_PATH = "testDataPath";
@@ -260,6 +261,173 @@
         verifyContent(filter, ACTION, DATA_TYPE);
     }
 
+
+    public void testSchemeSpecificParts() throws Exception {
+        IntentFilter filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"ssp1", "2ssp"},
+                new int[]{PATTERN_LITERAL, PATTERN_LITERAL});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp1"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:2ssp"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ssp"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ssp12"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"ssp1", "2ssp"},
+                new int[]{PATTERN_PREFIX, PATTERN_PREFIX});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp1"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:2ssp"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ssp"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp12"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"ssp.*"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp1"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ss"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{".*"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp1"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ssp"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a1*b"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a1b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a11b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a2b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a1bc"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a1*"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a1"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a11"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a1b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a11"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a2"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a\\.*b"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a..b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a2b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a.bc"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a.*b"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.1b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a2b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a.bc"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a.*"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.1b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a2b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.bc"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a.\\*b"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.*b"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a1*b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a2b"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a.bc"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:"), });
+        filter = new Match(null, null, null, new String[]{"scheme"},
+                null, null, null, null, new String[]{"a.\\*"},
+                new int[]{PATTERN_SIMPLE_GLOB});
+        checkMatches(filter, new MatchCondition[] {
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null, null),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:ab"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a.*"),
+                new MatchCondition(IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART, null, null, null,
+                        "scheme:a1*"),
+                new MatchCondition(IntentFilter.NO_MATCH_DATA, null, null, null,
+                        "scheme:a1b"), });
+    }
+
     public void testAuthorities() {
         for (int i = 0; i < 10; i++) {
             mIntentFilter.addDataAuthority(HOST + i, String.valueOf(PORT + i));
@@ -770,6 +938,17 @@
                 }
             }
         }
+
+        Match(String[] actions, String[] categories, String[] mimeTypes, String[] schemes,
+                String[] authorities, String[] ports, String[] paths, int[] pathTypes,
+                String[] ssps, int[] sspTypes) {
+            this(actions, categories, mimeTypes, schemes, authorities, ports, paths, pathTypes);
+            if (ssps != null) {
+                for (int i = 0; i < ssps.length; i++) {
+                    addDataSchemeSpecificPart(ssps[i], sspTypes[i]);
+                }
+            }
+        }
     }
 
     private static class MatchCondition {
diff --git a/tests/tests/content/src/android/content/cts/IntentTest.java b/tests/tests/content/src/android/content/cts/IntentTest.java
index a88fdf2..562c915 100644
--- a/tests/tests/content/src/android/content/cts/IntentTest.java
+++ b/tests/tests/content/src/android/content/cts/IntentTest.java
@@ -17,6 +17,7 @@
 package android.content.cts;
 
 import com.android.internal.app.ResolverActivity;
+import com.android.internal.util.Objects;
 import com.android.internal.util.XmlUtils;
 
 
@@ -41,6 +42,7 @@
 import android.provider.Contacts.People;
 import android.test.AndroidTestCase;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.util.Xml;
 
 import java.io.IOException;
@@ -57,6 +59,7 @@
     private static final Uri ANOTHER_TEST_URI = People.CONTENT_FILTER_URI;
     private static final String TEST_EXTRA_NAME = "testExtraName";
     private Context mContext;
+    private PackageManager mPm;
     private ComponentName mComponentName;
     private ComponentName mAnotherComponentName;
     private static final String TEST_TYPE = "testType";
@@ -71,6 +74,7 @@
         super.setUp();
         mIntent = new Intent();
         mContext = getContext();
+        mPm = mContext.getPackageManager();
         mComponentName = new ComponentName(mContext, MockActivity.class);
         mAnotherComponentName = new ComponentName(mContext, "tmp");
     }
@@ -713,26 +717,51 @@
         assertEquals(expected, mIntent.getParcelableArrayExtra(TEST_EXTRA_NAME));
     }
 
-    public void testResolveActivity() {
-        final PackageManager pm = mContext.getPackageManager();
+    public void testResolveActivityEmpty() {
+        final Intent emptyIntent = new Intent();
 
-        ComponentName target = mIntent.resolveActivity(pm);
+        // Empty intent shouldn't resolve to anything
+        final ComponentName target = emptyIntent.resolveActivity(mPm);
         assertNull(target);
+    }
 
-        mIntent.setComponent(mComponentName);
-        target = mIntent.resolveActivity(pm);
-        assertEquals(mComponentName, target);
+    public void testResolveActivitySingleMatch() {
+        final Intent intent = new Intent("com.android.cts.content.action.TEST_ACTION");
+        intent.addCategory("com.android.cts.content.category.TEST_CATEGORY");
 
-        mIntent.setComponent(null);
-        mIntent.setData(TEST_URI);
-        target = mIntent.resolveActivity(pm);
-        assertEquals(ResolverActivity.class.getName(), target.getClassName());
-        assertEquals("android", target.getPackageName());
+        // Should only have one activity responding to narrow category
+        final ComponentName target = intent.resolveActivity(mPm);
+        assertEquals("com.android.cts.content", target.getPackageName());
+        assertEquals("android.app.cts.MockActivity", target.getClassName());
+    }
 
-        mIntent.setComponent(null);
-        mIntent.setAction(TEST_TYPE);
-        target = mIntent.resolveActivity(pm);
-        assertNull(target);
+    public void testResolveActivityShortcutMatch() {
+        final Intent intent = new Intent("com.android.cts.content.action.TEST_ACTION");
+        intent.setComponent(
+                new ComponentName("com.android.cts.content", "android.app.cts.MockActivity2"));
+
+        // Multiple activities match, but we asked for explicit component
+        final ComponentName target = intent.resolveActivity(mPm);
+        assertEquals("com.android.cts.content", target.getPackageName());
+        assertEquals("android.app.cts.MockActivity2", target.getClassName());
+    }
+
+    public void testResolveActivityMultipleMatch() {
+        final Intent intent = new Intent("com.android.cts.content.action.TEST_ACTION");
+
+        // Should have multiple activities, resulting in resolver dialog
+        final ComponentName target = intent.resolveActivity(mPm);
+        final String pkgName = target.getPackageName();
+        assertFalse("com.android.cts.content".equals(pkgName));
+
+        // Whoever they are must be able to set preferred activities
+        if (!"android".equals(pkgName)) {
+            if (mPm.checkPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS, pkgName)
+                    != PackageManager.PERMISSION_GRANTED) {
+                fail("Resolved target " + target
+                        + " doesn't have SET_PREFERRED_APPLICATIONS permission");
+            }
+        }
     }
 
     public void testGetCharExtra() {
diff --git a/tests/tests/content/src/android/content/res/cts/ArrayTest.java b/tests/tests/content/src/android/content/res/cts/ArrayTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
index 7891aec..e4a9500 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetFileDescriptorTest.java
@@ -83,8 +83,8 @@
         mOutputStream = null;
         try {
             mOutputStream = mAssetFileDes.createOutputStream();
-            fail("Should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
+            fail("Should throw IOException");
+        } catch (IOException e) {
             // expect
         }
         try {
@@ -120,8 +120,8 @@
         }
         try {
             mOutputStream = mAssetFileDes.createOutputStream();
-            fail("Should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
+            fail("Should throw IOException");
+        } catch (IOException e) {
             // expect
         }
         mAssetFileDes.close();
diff --git a/tests/tests/content/src/android/content/res/cts/ConfigTest.java b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
old mode 100755
new mode 100644
index b49f156..bcfabe1
--- a/tests/tests/content/src/android/content/res/cts/ConfigTest.java
+++ b/tests/tests/content/src/android/content/res/cts/ConfigTest.java
@@ -116,13 +116,16 @@
                     break;
                 case WIDTH:
                     mMetrics.widthPixels = value;
+                    mMetrics.noncompatWidthPixels = value;
                     break;
                 case HEIGHT:
                     mMetrics.heightPixels = value;
+                    mMetrics.noncompatHeightPixels = value;
                     break;
                 case DENSITY:
                     // this is the ratio from the standard
                     mMetrics.density = (((float)value)/((float)DisplayMetrics.DENSITY_DEFAULT));
+                    mMetrics.noncompatDensity = mMetrics.density;
                     mConfig.densityDpi = value;
                     break;
                 case SCREENLAYOUT:
@@ -172,21 +175,21 @@
 
     public TotalConfig makeClassicConfig() {
         TotalConfig config = new TotalConfig();
-        config.mConfig.locale = new Locale("en", "US");
-        config.mConfig.mcc = 310;
-        config.mConfig.mnc = 001; // unused
-        config.mConfig.touchscreen = Configuration.TOUCHSCREEN_FINGER;
-        config.mConfig.keyboard = Configuration.KEYBOARD_QWERTY;
-        config.mConfig.keyboardHidden = Configuration.KEYBOARDHIDDEN_YES;
-        config.mConfig.navigation = Configuration.NAVIGATION_TRACKBALL;
-        config.mConfig.orientation = Configuration.ORIENTATION_PORTRAIT;
-        config.mConfig.smallestScreenWidthDp = 320;
-        config.mConfig.screenWidthDp = 320;
-        config.mConfig.screenHeightDp = 480;
-        config.mConfig.densityDpi = 160;
-        config.mMetrics.widthPixels = 200;
-        config.mMetrics.heightPixels = 320;
-        config.mMetrics.density = 1;
+        config.setProperty(Properties.LANGUAGE, "en");
+        config.setProperty(Properties.COUNTRY, "US");
+        config.setProperty(Properties.MCC, 310);
+        config.setProperty(Properties.MNC, 001); // unused
+        config.setProperty(Properties.TOUCHSCREEN, Configuration.TOUCHSCREEN_FINGER);
+        config.setProperty(Properties.KEYBOARD, Configuration.KEYBOARD_QWERTY);
+        config.setProperty(Properties.KEYBOARDHIDDEN, Configuration.KEYBOARDHIDDEN_YES);
+        config.setProperty(Properties.NAVIGATION, Configuration.NAVIGATION_TRACKBALL);
+        config.setProperty(Properties.ORIENTATION, Configuration.ORIENTATION_PORTRAIT);
+        config.setProperty(Properties.SWIDTH_DP, 320);
+        config.setProperty(Properties.WIDTH_DP, 320);
+        config.setProperty(Properties.HEIGHT_DP, 480);
+        config.setProperty(Properties.DENSITY, 160);
+        config.setProperty(Properties.WIDTH, 200);
+        config.setProperty(Properties.HEIGHT, 320);
         return config;
     }
 
diff --git a/tests/tests/content/src/android/content/res/cts/FractionTest.java b/tests/tests/content/src/android/content/res/cts/FractionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java b/tests/tests/content/src/android/content/res/cts/PluralResourcesTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java b/tests/tests/content/src/android/content/res/cts/PrimitiveTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/content/src/android/content/res/cts/RawResourceTest.java b/tests/tests/content/src/android/content/res/cts/RawResourceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java b/tests/tests/content/src/android/content/res/cts/ResourceNameTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/display/AndroidManifest.xml b/tests/tests/display/AndroidManifest.xml
index 1ddce5a..d1386d1 100644
--- a/tests/tests/display/AndroidManifest.xml
+++ b/tests/tests/display/AndroidManifest.xml
@@ -19,6 +19,7 @@
     package="com.android.cts.display">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
     <application>
         <uses-library android:name="android.test.runner" />
     </application>
diff --git a/tests/tests/display/src/android/display/cts/DisplayTest.java b/tests/tests/display/src/android/display/cts/DisplayTest.java
index 595f7148..4c7116d 100644
--- a/tests/tests/display/src/android/display/cts/DisplayTest.java
+++ b/tests/tests/display/src/android/display/cts/DisplayTest.java
@@ -174,6 +174,6 @@
     public void testFlags() {
         Display display = getSecondaryDisplay(mDisplayManager.getDisplays());
 
-        assertEquals(0, display.getFlags());
+        assertEquals(Display.FLAG_PRESENTATION, display.getFlags());
     }
 }
diff --git a/tests/tests/display/src/android/display/cts/VirtualDisplayTest.java b/tests/tests/display/src/android/display/cts/VirtualDisplayTest.java
new file mode 100644
index 0000000..11bc15c
--- /dev/null
+++ b/tests/tests/display/src/android/display/cts/VirtualDisplayTest.java
@@ -0,0 +1,412 @@
+/*
+ * Copyright (C) 2013 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 android.display.cts;
+
+import android.app.Presentation;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.PixelFormat;
+import android.graphics.Point;
+import android.graphics.drawable.ColorDrawable;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.media.Image;
+import android.media.ImageReader;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.HandlerThread;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
+import android.view.Surface;
+import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * Tests that applications can create virtual displays and present content on them.
+ *
+ * This CTS test is unable to test public virtual displays since special permissions
+ * are required.  See also framework VirtualDisplayTest unit tests.
+ */
+public class VirtualDisplayTest extends AndroidTestCase {
+    private static final String TAG = "VirtualDisplayTest";
+
+    private static final String NAME = TAG;
+    private static final int WIDTH = 720;
+    private static final int HEIGHT = 480;
+    private static final int DENSITY = DisplayMetrics.DENSITY_MEDIUM;
+    private static final int TIMEOUT = 10000;
+
+    // Colors that we use as a signal to determine whether some desired content was
+    // drawn.  The colors themselves doesn't matter but we choose them to have with distinct
+    // values for each color channel so as to detect possible RGBA vs. BGRA buffer format issues.
+    // We should only observe RGBA buffers but some graphics drivers might incorrectly
+    // deliver BGRA buffers to virtual displays instead.
+    private static final int BLUEISH = 0xff1122ee;
+    private static final int GREENISH = 0xff33dd44;
+
+    private DisplayManager mDisplayManager;
+    private Handler mHandler;
+    private final Lock mImageReaderLock = new ReentrantLock(true /*fair*/);
+    private ImageReader mImageReader;
+    private Surface mSurface;
+    private ImageListener mImageListener;
+    private HandlerThread mCheckThread;
+    private Handler mCheckHandler;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mDisplayManager = (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
+        mHandler = new Handler(Looper.getMainLooper());
+        mImageListener = new ImageListener();
+        // thread for image checking
+        mCheckThread = new HandlerThread("TestHandler");
+        mCheckThread.start();
+        mCheckHandler = new Handler(mCheckThread.getLooper());
+
+        mImageReaderLock.lock();
+        try {
+            mImageReader = ImageReader.newInstance(WIDTH, HEIGHT, PixelFormat.RGBA_8888, 2);
+            mImageReader.setOnImageAvailableListener(mImageListener, mCheckHandler);
+            mSurface = mImageReader.getSurface();
+        } finally {
+            mImageReaderLock.unlock();
+        }
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        mImageReaderLock.lock();
+        try {
+            mImageReader.close();
+            mImageReader = null;
+            mSurface = null;
+        } finally {
+            mImageReaderLock.unlock();
+        }
+        mCheckThread.quit();
+    }
+
+    /**
+     * Ensures that an application can create a private virtual display and show
+     * its own windows on it.
+     */
+    public void testPrivateVirtualDisplay() throws Exception {
+        VirtualDisplay virtualDisplay = mDisplayManager.createVirtualDisplay(NAME,
+                WIDTH, HEIGHT, DENSITY, mSurface, 0);
+        assertNotNull("virtual display must not be null", virtualDisplay);
+
+        Display display = virtualDisplay.getDisplay();
+        try {
+            assertDisplayRegistered(display, Display.FLAG_PRIVATE);
+
+            // Show a private presentation on the display.
+            assertDisplayCanShowPresentation("private presentation window",
+                    display, BLUEISH,
+                    WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION, 0);
+        } finally {
+            virtualDisplay.release();
+        }
+        assertDisplayUnregistered(display);
+    }
+
+    /**
+     * Ensures that an application can create a private presentation virtual display and show
+     * its own windows on it.
+     */
+    public void testPrivatePresentationVirtualDisplay() throws Exception {
+        VirtualDisplay virtualDisplay = mDisplayManager.createVirtualDisplay(NAME,
+                WIDTH, HEIGHT, DENSITY, mSurface,
+                DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION);
+        assertNotNull("virtual display must not be null", virtualDisplay);
+
+        Display display = virtualDisplay.getDisplay();
+        try {
+            assertDisplayRegistered(display, Display.FLAG_PRIVATE | Display.FLAG_PRESENTATION);
+
+            // Show a private presentation on the display.
+            assertDisplayCanShowPresentation("private presentation window",
+                    display, BLUEISH,
+                    WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION, 0);
+        } finally {
+            virtualDisplay.release();
+        }
+        assertDisplayUnregistered(display);
+    }
+
+    private void assertDisplayRegistered(Display display, int flags) {
+        assertNotNull("display object must not be null", display);
+        assertTrue("display must be valid", display.isValid());
+        assertTrue("display id must be unique",
+                display.getDisplayId() != Display.DEFAULT_DISPLAY);
+        assertEquals("display must have correct flags", flags, display.getFlags());
+        assertEquals("display name must match supplied name", NAME, display.getName());
+        Point size = new Point();
+        display.getSize(size);
+        assertEquals("display width must match supplied width", WIDTH, size.x);
+        assertEquals("display height must match supplied height", HEIGHT, size.y);
+        assertEquals("display rotation must be 0",
+                Surface.ROTATION_0, display.getRotation());
+        assertNotNull("display must be registered",
+                findDisplay(mDisplayManager.getDisplays(), NAME));
+
+        if ((flags & Display.FLAG_PRESENTATION) != 0) {
+            assertNotNull("display must be registered as a presentation display",
+                    findDisplay(mDisplayManager.getDisplays(
+                            DisplayManager.DISPLAY_CATEGORY_PRESENTATION), NAME));
+        } else {
+            assertNull("display must not be registered as a presentation display",
+                    findDisplay(mDisplayManager.getDisplays(
+                            DisplayManager.DISPLAY_CATEGORY_PRESENTATION), NAME));
+        }
+    }
+
+    private void assertDisplayUnregistered(Display display) {
+        assertNull("display must no longer be registered after being removed",
+                findDisplay(mDisplayManager.getDisplays(), NAME));
+        assertFalse("display must no longer be valid", display.isValid());
+    }
+
+    private void assertDisplayCanShowPresentation(String message, final Display display,
+            final int color, final int windowType, final int windowFlags) {
+        // At this point, we should not have seen any blue.
+        assertTrue(message + ": display should not show content before window is shown",
+                mImageListener.getColor() != color);
+
+        final TestPresentation[] presentation = new TestPresentation[1];
+        try {
+            // Show the presentation.
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    presentation[0] = new TestPresentation(getContext(), display,
+                            color, windowType, windowFlags);
+                    presentation[0].show();
+                }
+            });
+
+            // Wait for the blue to be seen.
+            assertTrue(message + ": display should show content after window is shown",
+                    mImageListener.waitForColor(color, TIMEOUT));
+        } finally {
+            if (presentation[0] != null) {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        presentation[0].dismiss();
+                    }
+                });
+            }
+        }
+    }
+
+    private void runOnUiThread(Runnable runnable) {
+        Runnable waiter = new Runnable() {
+            @Override
+            public void run() {
+                synchronized (this) {
+                    notifyAll();
+                }
+            }
+        };
+        synchronized (waiter) {
+            mHandler.post(runnable);
+            mHandler.post(waiter);
+            try {
+                waiter.wait(TIMEOUT);
+            } catch (InterruptedException ex) {
+            }
+        }
+    }
+
+    private Display findDisplay(Display[] displays, String name) {
+        for (int i = 0; i < displays.length; i++) {
+            if (displays[i].getName().equals(name)) {
+                return displays[i];
+            }
+        }
+        return null;
+    }
+
+    private final class TestPresentation extends Presentation {
+        private final int mColor;
+        private final int mWindowType;
+        private final int mWindowFlags;
+
+        public TestPresentation(Context context, Display display,
+                int color, int windowType, int windowFlags) {
+            super(context, display);
+            mColor = color;
+            mWindowType = windowType;
+            mWindowFlags = windowFlags;
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            setTitle(TAG);
+            getWindow().setType(mWindowType);
+            getWindow().addFlags(mWindowFlags);
+
+            // Create a solid color image to use as the content of the presentation.
+            ImageView view = new ImageView(getContext());
+            view.setImageDrawable(new ColorDrawable(mColor));
+            view.setLayoutParams(new LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+            setContentView(view);
+        }
+    }
+
+    /**
+     * Watches for an image with a large amount of some particular solid color to be shown.
+     */
+    private final class ImageListener
+            implements ImageReader.OnImageAvailableListener {
+        private int mColor = -1;
+
+        public int getColor() {
+            synchronized (this) {
+                return mColor;
+            }
+        }
+
+        public boolean waitForColor(int color, long timeoutMillis) {
+            long timeoutTime = SystemClock.uptimeMillis() + timeoutMillis;
+            synchronized (this) {
+                while (mColor != color) {
+                    long now = SystemClock.uptimeMillis();
+                    if (now >= timeoutTime) {
+                        return false;
+                    }
+                    try {
+                        wait(timeoutTime - now);
+                    } catch (InterruptedException ex) {
+                    }
+                }
+                return true;
+            }
+        }
+
+        @Override
+        public void onImageAvailable(ImageReader reader) {
+            mImageReaderLock.lock();
+            try {
+                if (reader != mImageReader) {
+                    return;
+                }
+
+                Log.d(TAG, "New image available from virtual display.");
+                // Get the latest buffer
+                Image image = reader.acquireLatestImage();
+                if (image != null) {
+                    try {
+                        // Scan for colors.
+                        int color = scanImage(image);
+                        synchronized (this) {
+                            if (mColor != color) {
+                                mColor = color;
+                                notifyAll();
+                            }
+                        }
+                    } finally {
+                        image.close();
+                    }
+                }
+            } finally {
+                mImageReaderLock.unlock();
+            }
+        }
+
+        private int scanImage(Image image) {
+            final Image.Plane plane = image.getPlanes()[0];
+            final ByteBuffer buffer = plane.getBuffer();
+            final int width = image.getWidth();
+            final int height = image.getHeight();
+            final int pixelStride = plane.getPixelStride();
+            final int rowStride = plane.getRowStride();
+            final int rowPadding = rowStride - pixelStride * width;
+
+            Log.d(TAG, "- Scanning image: width=" + width + ", height=" + height
+                    + ", pixelStride=" + pixelStride + ", rowStride=" + rowStride);
+
+            int offset = 0;
+            int blackPixels = 0;
+            int bluePixels = 0;
+            int greenPixels = 0;
+            int otherPixels = 0;
+            for (int y = 0; y < height; y++) {
+                for (int x = 0; x < width; x++) {
+                    int pixel = 0;
+                    pixel |= (buffer.get(offset) & 0xff) << 16;     // R
+                    pixel |= (buffer.get(offset + 1) & 0xff) << 8;  // G
+                    pixel |= (buffer.get(offset + 2) & 0xff);       // B
+                    pixel |= (buffer.get(offset + 3) & 0xff) << 24; // A
+                    if (pixel == Color.BLACK || pixel == 0) {
+                        blackPixels += 1;
+                    } else if (pixel == BLUEISH) {
+                        bluePixels += 1;
+                    } else if (pixel == GREENISH) {
+                        greenPixels += 1;
+                    } else {
+                        otherPixels += 1;
+                        if (otherPixels < 10) {
+                            Log.d(TAG, "- Found unexpected color: " + Integer.toHexString(pixel));
+                        }
+                    }
+                    offset += pixelStride;
+                }
+                offset += rowPadding;
+            }
+
+            // Return a color if it represents more than one quarter of the pixels.
+            // We use this threshold in case the display is being letterboxed when
+            // mirroring so there might be large black bars on the sides, which is normal.
+            Log.d(TAG, "- Pixels: " + blackPixels + " black, "
+                    + bluePixels + " blue, "
+                    + greenPixels + " green, "
+                    + otherPixels + " other");
+            final int threshold = width * height / 4;
+            if (bluePixels > threshold) {
+                Log.d(TAG, "- Reporting blue.");
+                return BLUEISH;
+            }
+            if (greenPixels > threshold) {
+                Log.d(TAG, "- Reporting green.");
+                return GREENISH;
+            }
+            if (blackPixels > threshold) {
+                Log.d(TAG, "- Reporting black.");
+                return Color.BLACK;
+            }
+            Log.d(TAG, "- Reporting other.");
+            return -1;
+        }
+    }
+}
+
diff --git a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
index 6f26b6e..4ecabc5 100644
--- a/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
+++ b/tests/tests/dpi/src/android/dpi/cts/ConfigurationTest.java
@@ -52,7 +52,9 @@
         allowedDensities.add(DisplayMetrics.DENSITY_TV);
         allowedDensities.add(DisplayMetrics.DENSITY_HIGH);
         allowedDensities.add(DisplayMetrics.DENSITY_XHIGH);
+        allowedDensities.add(DisplayMetrics.DENSITY_400);
         allowedDensities.add(DisplayMetrics.DENSITY_XXHIGH);
+        allowedDensities.add(DisplayMetrics.DENSITY_XXXHIGH);
         assertTrue("DisplayMetrics#densityDpi must be one of the DisplayMetrics.DENSITY_* values: "
                 + allowedDensities, allowedDensities.contains(metrics.densityDpi));
 
diff --git a/tests/tests/example/Android.mk b/tests/tests/example/Android.mk
deleted file mode 100644
index c6ef67b..0000000
--- a/tests/tests/example/Android.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (C) 2009 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)
-
-# Replace "Example" with your name.
-LOCAL_PACKAGE_NAME := CtsExampleTestCases
-
-# Don't include this package in any target.
-LOCAL_MODULE_TAGS := optional
-
-# When built, explicitly put it in the data partition.
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
-
-# All tests should include android.test.runner.
-LOCAL_JAVA_LIBRARIES := android.test.runner
-
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/example/AndroidManifest.xml b/tests/tests/example/AndroidManifest.xml
deleted file mode 100644
index ba41cce..0000000
--- a/tests/tests/example/AndroidManifest.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 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.
--->
-
-<!-- Replace all the "example" stuff below with your package name, and
-     remove this comment.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.cts.example">
-
-    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!-- This is a self-instrumenting test package. -->
-    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
-                     android:targetPackage="com.android.cts.example"
-                     android:label="CTS tests of example component"/>
-
-</manifest>
-
diff --git a/tests/tests/example/src/android/example/Example.java b/tests/tests/example/src/android/example/Example.java
deleted file mode 100644
index bc22d9a..0000000
--- a/tests/tests/example/src/android/example/Example.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.example;
-
-/**
- * Example class being tested. In a real test, the classes to test would
- * live somewhere other than in the test package, but for the sake of
- * brevity, we include this one here instead.
- */
-public class Example {
-    /**
-     * Return the standard string indication of a successfuly blorting.
-     *
-     * @returns {@code "blort"}, always
-     */
-    public static String blort() {
-        return "blort";
-    }
-
-    /**
-     * Return the standard string indication of a successfuly zorching.
-     *
-     * @returns {@code "zorch"}, always
-     */
-    public static String zorch() {
-        return "zorch";
-    }
-}
diff --git a/tests/tests/example/src/android/example/cts/ExampleSecondaryTest.java b/tests/tests/example/src/android/example/cts/ExampleSecondaryTest.java
deleted file mode 100644
index d2b78dc..0000000
--- a/tests/tests/example/src/android/example/cts/ExampleSecondaryTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.example.cts;
-
-import android.example.Example;
-
-import junit.framework.TestCase;
-
-/**
- * Example test to demonstrate how tests work as well as to serve as a
- * smoke test for the CTS. This secondary test exists to demonstrate
- * that you may have more than one test class. Typically you will
- * separate your test classes by what class or major piece of
- * functionality is being tested.
- */
-public class ExampleSecondaryTest extends TestCase {
-    /*
-     * You can define standard JUnit setUp() and tearDown() methods here,
-     * if needed.
-     *
-     * @Override protected void setUp() throws Exception { ... }
-     * @Override protected void tearDown() throws Exception { ... }
-     */
-
-    /**
-     * Test {@link Example#zorch}.
-     */
-    public void testZorch() {
-        assertEquals("zorch", Example.zorch());
-    }
-
-    // Add more tests here.
-}
diff --git a/tests/tests/example/src/android/example/cts/ExampleTest.java b/tests/tests/example/src/android/example/cts/ExampleTest.java
deleted file mode 100644
index db907cc..0000000
--- a/tests/tests/example/src/android/example/cts/ExampleTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.example.cts;
-
-import android.example.Example;
-
-import junit.framework.TestCase;
-
-/**
- * Example test to demonstrate how tests work as well as to serve as
- * a smoke test for the CTS. (If the example test is "broken," then it
- * probably means that there's something fundamentally wrong with your
- * setup.)
- */
-public class ExampleTest extends TestCase {
-    /*
-     * You can define standard JUnit setUp() and tearDown() methods here,
-     * if needed.
-     *
-     * @Override protected void setUp() throws Exception { ... }
-     * @Override protected void tearDown() throws Exception { ... }
-     */
-
-    /**
-     * Test {@link Example#blort}.
-     */
-    public void testBlort() {
-        assertEquals("blort", Example.blort());
-    }
-
-    // Add more tests here.
-}
diff --git a/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java b/tests/tests/gesture/src/android/gesture/cts/GesturePointTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java b/tests/tests/gesture/src/android/gesture/cts/GestureStrokeTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/gesture/src/android/gesture/cts/GestureTest.java b/tests/tests/gesture/src/android/gesture/cts/GestureTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/gesture/src/android/gesture/cts/LineGestureStrokeHelper.java b/tests/tests/gesture/src/android/gesture/cts/LineGestureStrokeHelper.java
old mode 100755
new mode 100644
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
old mode 100755
new mode 100644
index d6b4fde..6c63783
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapFactoryTest.java
@@ -39,7 +39,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.RandomAccessFile;
 
 public class BitmapFactoryTest extends InstrumentationTestCase {
     private Resources mRes;
@@ -58,10 +58,6 @@
             R.drawable.baseline_jpeg, R.drawable.png_test, R.drawable.gif_test,
             R.drawable.bmp_test, R.drawable.webp_test
     };
-    private static String[] NAMES_TEMP_FILES = new String[] {
-        "baseline_temp.jpg", "png_temp.png", "gif_temp.gif",
-        "bmp_temp.bmp", "webp_temp.webp"
-    };
 
     // The width and height of the above image.
     private static int WIDTHS[] = new int[] { 1280, 640, 320, 320, 640 };
@@ -72,6 +68,22 @@
         Config.ARGB_4444};
     private static int[] COLOR_TOLS = new int[] {16, 49, 576};
 
+    private static int[] RAW_COLORS = new int[] {
+        // raw data from R.drawable.premul_data
+        Color.argb(255, 0, 0, 0),
+        Color.argb(128, 255, 0, 0),
+        Color.argb(128, 25, 26, 27),
+        Color.argb(2, 255, 254, 253),
+    };
+
+    private static int[] DEPREMUL_COLORS = new int[] {
+        // data from R.drawable.premul_data, after premultiplied store + un-premultiplied load
+        Color.argb(255, 0, 0, 0),
+        Color.argb(128, 255, 0, 0),
+        Color.argb(128, 26, 26, 28),
+        Color.argb(2, 255, 255, 255),
+    };
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -224,6 +236,50 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
+    public void testDecodeFileDescriptor3() throws IOException {
+        // Arbitrary offsets to use. If the offset of the FD matches the offset of the image,
+        // decoding should succeed, but if they do not match, decoding should fail.
+        long ACTUAL_OFFSETS[] = new long[] { 0, 17 };
+        for (int RES_ID : RES_IDS) {
+            for (int j = 0; j < ACTUAL_OFFSETS.length; ++j) {
+                // FIXME: The purgeable test should attempt to purge the memory
+                // to force a re-decode.
+                for (boolean TEST_PURGEABLE : new boolean[] { false, true }) {
+                    BitmapFactory.Options opts = new BitmapFactory.Options();
+                    opts.inPurgeable = TEST_PURGEABLE;
+                    opts.inInputShareable = TEST_PURGEABLE;
+
+                    long actualOffset = ACTUAL_OFFSETS[j];
+                    String path = obtainPath(RES_ID, actualOffset);
+                    RandomAccessFile file = new RandomAccessFile(path, "r");
+                    FileDescriptor fd = file.getFD();
+                    assertTrue(fd.valid());
+
+                    // Set the offset to ACTUAL_OFFSET
+                    file.seek(actualOffset);
+                    assertEquals(file.getFilePointer(), actualOffset);
+
+                    // Now decode. This should be successful and leave the offset
+                    // unchanged.
+                    Bitmap b = BitmapFactory.decodeFileDescriptor(fd, null, opts);
+                    assertNotNull(b);
+                    assertEquals(file.getFilePointer(), actualOffset);
+
+                    // Now use the other offset. It should fail to decode, and
+                    // the offset should remain unchanged.
+                    long otherOffset = ACTUAL_OFFSETS[(j + 1) % ACTUAL_OFFSETS.length];
+                    assertFalse(otherOffset == actualOffset);
+                    file.seek(otherOffset);
+                    assertEquals(file.getFilePointer(), otherOffset);
+
+                    b = BitmapFactory.decodeFileDescriptor(fd, null, opts);
+                    assertNull(b);
+                    assertEquals(file.getFilePointer(), otherOffset);
+                }
+            }
+        }
+    }
+
     public void testDecodeFile1() throws IOException {
         Bitmap b = BitmapFactory.decodeFile(obtainPath(), mOpt1);
         assertNotNull(b);
@@ -242,6 +298,190 @@
         assertEquals(START_WIDTH, b.getWidth());
     }
 
+    public void testDecodeReuseBasic() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inMutable = true;
+        options.inSampleSize = 0; // treated as 1
+        options.inScaled = false;
+        Bitmap start = BitmapFactory.decodeResource(mRes, R.drawable.start, options);
+        int originalSize = start.getByteCount();
+        assertEquals(originalSize, start.getAllocationByteCount());
+
+        options.inBitmap = start;
+        options.inMutable = false; // will be overridden by non-null inBitmap
+        options.inSampleSize = -42; // treated as 1
+        Bitmap pass = BitmapFactory.decodeResource(mRes, R.drawable.pass, options);
+
+        assertEquals(originalSize, pass.getByteCount());
+        assertEquals(originalSize, pass.getAllocationByteCount());
+        assertSame(start, pass);
+        assertTrue(pass.isMutable());
+    }
+
+    public void testDecodeReuseFormats() throws IOException {
+        // reuse should support all image formats
+        for (int i = 0; i < RES_IDS.length; ++i) {
+            Bitmap reuseBuffer = Bitmap.createBitmap(1000000, 1, Bitmap.Config.ALPHA_8);
+
+            BitmapFactory.Options options = new BitmapFactory.Options();
+            options.inBitmap = reuseBuffer;
+            options.inSampleSize = 4;
+            options.inScaled = false;
+            Bitmap decoded = BitmapFactory.decodeResource(mRes, RES_IDS[i], options);
+            assertSame(reuseBuffer, decoded);
+        }
+    }
+
+    public void testDecodeReuseFailure() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inMutable = true;
+        options.inScaled = false;
+        options.inSampleSize = 4;
+        Bitmap reduced = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+
+        options.inBitmap = reduced;
+        options.inSampleSize = 1;
+        try {
+            Bitmap original = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+            fail("should throw exception due to lack of space");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    public void testDecodeReuseScaling() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inMutable = true;
+        options.inScaled = false;
+        Bitmap original = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+        int originalSize = original.getByteCount();
+        assertEquals(originalSize, original.getAllocationByteCount());
+
+        options.inBitmap = original;
+        options.inSampleSize = 4;
+        Bitmap reduced = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+
+        assertSame(original, reduced);
+        assertEquals(originalSize, reduced.getAllocationByteCount());
+        assertEquals(originalSize, reduced.getByteCount() * 16);
+    }
+
+    public void testDecodeReuseDoubleScaling() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inMutable = true;
+        options.inScaled = false;
+        options.inSampleSize = 1;
+        Bitmap original = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+        int originalSize = original.getByteCount();
+
+        // Verify that inSampleSize and density scaling both work with reuse concurrently
+        options.inBitmap = original;
+        options.inScaled = true;
+        options.inSampleSize = 2;
+        options.inDensity = 2;
+        options.inTargetDensity = 4;
+        Bitmap doubleScaled = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+
+        assertSame(original, doubleScaled);
+        assertEquals(4, doubleScaled.getDensity());
+        assertEquals(originalSize, doubleScaled.getByteCount());
+    }
+
+    public void testDecodeReuseEquivalentScaling() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inMutable = true;
+        options.inScaled = true;
+        options.inDensity = 4;
+        options.inTargetDensity = 2;
+        Bitmap densityReduced = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+        assertEquals(2, densityReduced.getDensity());
+        options.inBitmap = densityReduced;
+        options.inDensity = 0;
+        options.inScaled = false;
+        options.inSampleSize = 2;
+        Bitmap scaleReduced = BitmapFactory.decodeResource(mRes, R.drawable.robot, options);
+        // verify that density isn't incorrectly carried over during bitmap reuse
+        assertFalse(densityReduced.getDensity() == 2);
+        assertFalse(densityReduced.getDensity() == 0);
+        assertSame(densityReduced, scaleReduced);
+    }
+
+    public void testDecodePremultipliedDefault() throws IOException {
+        Bitmap simplePremul = BitmapFactory.decodeResource(mRes, R.drawable.premul_data);
+        assertTrue(simplePremul.isPremultiplied());
+    }
+
+    public void testDecodePremultipliedData() throws IOException {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inScaled = false;
+        Bitmap premul = BitmapFactory.decodeResource(mRes, R.drawable.premul_data, options);
+        options.inPremultiplied = false;
+        Bitmap unpremul = BitmapFactory.decodeResource(mRes, R.drawable.premul_data, options);
+        assertEquals(premul.getConfig(), Bitmap.Config.ARGB_8888);
+        assertEquals(unpremul.getConfig(), Bitmap.Config.ARGB_8888);
+        assertTrue(premul.getHeight() == 1 && unpremul.getHeight() == 1);
+        assertTrue(premul.getWidth() == unpremul.getWidth() &&
+                   DEPREMUL_COLORS.length == RAW_COLORS.length &&
+                   premul.getWidth() == DEPREMUL_COLORS.length);
+
+        // verify pixel data - unpremul should have raw values, premul will have rounding errors
+        for (int i = 0; i < premul.getWidth(); i++) {
+            assertEquals(premul.getPixel(i, 0), DEPREMUL_COLORS[i]);
+            assertEquals(unpremul.getPixel(i, 0), RAW_COLORS[i]);
+        }
+    }
+
+    public void testDecodeInPurgeableAllocationCount() {
+        BitmapFactory.Options options = new BitmapFactory.Options();
+        options.inSampleSize = 1;
+        options.inJustDecodeBounds = false;
+        options.inPurgeable = true;
+        options.inInputShareable = false;
+        byte[] array = obtainArray();
+        Bitmap purgeableBitmap = BitmapFactory.decodeByteArray(array, 0, array.length, options);
+        assertFalse(purgeableBitmap.getAllocationByteCount() == 0);
+    }
+
+    private int mDefaultCreationDensity;
+    private void verifyScaled(Bitmap b) {
+        assertEquals(b.getWidth(), START_WIDTH * 2);
+        assertEquals(b.getDensity(), 2);
+    }
+
+    private void verifyUnscaled(Bitmap b) {
+        assertEquals(b.getWidth(), START_WIDTH);
+        assertEquals(b.getDensity(), mDefaultCreationDensity);
+    }
+
+    public void testDecodeScaling() {
+        BitmapFactory.Options defaultOpt = new BitmapFactory.Options();
+
+        BitmapFactory.Options unscaledOpt = new BitmapFactory.Options();
+        unscaledOpt.inScaled = false;
+
+        BitmapFactory.Options scaledOpt = new BitmapFactory.Options();
+        scaledOpt.inScaled = true;
+        scaledOpt.inDensity = 1;
+        scaledOpt.inTargetDensity = 2;
+
+        mDefaultCreationDensity = Bitmap.createBitmap(1, 1, Config.ARGB_8888).getDensity();
+
+        byte[] bytes = obtainArray();
+
+        verifyUnscaled(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
+        verifyUnscaled(BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null));
+        verifyUnscaled(BitmapFactory.decodeByteArray(bytes, 0, bytes.length, unscaledOpt));
+        verifyUnscaled(BitmapFactory.decodeByteArray(bytes, 0, bytes.length, defaultOpt));
+
+        verifyUnscaled(BitmapFactory.decodeStream(obtainInputStream()));
+        verifyUnscaled(BitmapFactory.decodeStream(obtainInputStream(), null, null));
+        verifyUnscaled(BitmapFactory.decodeStream(obtainInputStream(), null, unscaledOpt));
+        verifyUnscaled(BitmapFactory.decodeStream(obtainInputStream(), null, defaultOpt));
+
+        // scaling should only occur if Options are passed with inScaled=true
+        verifyScaled(BitmapFactory.decodeByteArray(bytes, 0, bytes.length, scaledOpt));
+        verifyScaled(BitmapFactory.decodeStream(obtainInputStream(), null, scaledOpt));
+    }
+
     private byte[] obtainArray() {
         ByteArrayOutputStream stm = new ByteArrayOutputStream();
         Options opt = new BitmapFactory.Options();
@@ -267,17 +507,32 @@
     }
 
     private String obtainPath() throws IOException {
+        return obtainPath(R.drawable.start, 0);
+    }
+
+    /*
+     * Create a new file and return a path to it.
+     * @param resId Original file. It will be copied into the new file.
+     * @param offset Number of zeroes to write to the new file before the
+     *               copied file. This allows testing decodeFileDescriptor
+     *               with an offset. Must be less than or equal to 1024
+     */
+    private String obtainPath(int resId, long offset) throws IOException {
         File dir = getInstrumentation().getTargetContext().getFilesDir();
         dir.mkdirs();
+        // The suffix does not necessarily represent theactual file type.
         File file = new File(dir, "test.jpg");
         if (!file.createNewFile()) {
             if (!file.exists()) {
                 fail("Failed to create new File!");
             }
         }
-        InputStream is = obtainInputStream();
+        InputStream is = obtainInputStream(resId);
         FileOutputStream fOutput = new FileOutputStream(file);
         byte[] dataBuffer = new byte[1024];
+        // Write a bunch of zeroes before the image.
+        assertTrue(offset <= 1024);
+        fOutput.write(dataBuffer, 0, (int) offset);
         int readLength = 0;
         while ((readLength = is.read(dataBuffer)) != -1) {
             fOutput.write(dataBuffer, 0, readLength);
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
old mode 100755
new mode 100644
index d51fc72..c981db3
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapRegionDecoderTest.java
@@ -186,6 +186,36 @@
         }
     }
 
+    public void testDecodeRegionInputStreamInBitmap() throws IOException {
+        Options opts = new BitmapFactory.Options();
+        for (int i = 0; i < NUM_TEST_IMAGES; ++i) {
+            for (int j = 0; j < SAMPLESIZES.length; ++j) {
+                for (int k = 0; k < COLOR_CONFIGS.length; ++k) {
+                    opts.inSampleSize = SAMPLESIZES[j];
+                    opts.inPreferredConfig = COLOR_CONFIGS[k];
+                    opts.inBitmap = null;
+
+                    InputStream is1 = obtainInputStream(RES_IDS[i]);
+                    BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(is1, false);
+                    InputStream is2 = obtainInputStream(RES_IDS[i]);
+                    Bitmap wholeImage = BitmapFactory.decodeStream(is2, null, opts);
+
+                    // setting inBitmap enables several checks within compareRegionByRegion
+                    opts.inBitmap = Bitmap.createBitmap(
+                            wholeImage.getWidth(), wholeImage.getHeight(), opts.inPreferredConfig);
+
+                    if (RES_IDS[i] == R.drawable.webp_test && COLOR_CONFIGS[k] == Config.RGB_565) {
+                        compareRegionByRegion(decoder, opts, mMseMarginWebPConfigRgb565,
+                                              wholeImage);
+                    } else {
+                        compareRegionByRegion(decoder, opts, mMseMargin, wholeImage);
+                    }
+                    wholeImage.recycle();
+                }
+            }
+        }
+    }
+
     public void testDecodeRegionByteArray() throws IOException {
         Options opts = new BitmapFactory.Options();
         for (int i = 0; i < NUM_TEST_IMAGES; ++i) {
@@ -292,9 +322,18 @@
                 actual = decoder.decodeRegion(rect1, opts);
                 int left = rect1.left / opts.inSampleSize;
                 int top = rect1.top / opts.inSampleSize;
-                Rect rect2 = new Rect(left, top, left + actual.getWidth(),
+                if (opts.inBitmap != null) {
+                    // bitmap reuse path - ensure reuse worked
+                    assertSame(opts.inBitmap, actual);
+                    int currentWidth = rect1.width() / opts.inSampleSize;
+                    int currentHeight = rect1.height() / opts.inSampleSize;
+                    Rect actualRect = new Rect(0, 0, currentWidth, currentHeight);
+                    // crop 'actual' to the size to be tested (and avoid recycling inBitmap)
+                    actual = cropBitmap(actual, actualRect);
+                }
+                Rect expectedRect = new Rect(left, top, left + actual.getWidth(),
                         top + actual.getHeight());
-                expected = cropBitmap(wholeImage, rect2);
+                expected = cropBitmap(wholeImage, expectedRect);
                 compareBitmaps(expected, actual, mseMargin, true);
                 actual.recycle();
                 expected.recycle();
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
index cf211b6..997560d 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapTest.java
@@ -43,6 +43,11 @@
     private Bitmap mBitmap;
     private BitmapFactory.Options mOptions;
 
+    // small alpha values cause color values to be pre-multiplied down, losing accuracy
+    private final int PREMUL_COLOR = Color.argb(2, 255, 254, 253);
+    private final int PREMUL_ROUNDED_COLOR = Color.argb(2, 255, 255, 255);
+    private final int PREMUL_STORED_COLOR = Color.argb(2, 2, 2, 2);
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -376,6 +381,22 @@
         assertEquals(0x00, Color.alpha(color));
     }
 
+    public void testGetAllocationByteCount() {
+        mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8);
+        int alloc = mBitmap.getAllocationByteCount();
+        assertEquals(mBitmap.getByteCount(), alloc);
+
+        // reconfigure same size
+        mBitmap.reconfigure(50, 100, Bitmap.Config.ARGB_8888);
+        assertEquals(mBitmap.getByteCount(), alloc);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+
+        // reconfigure different size
+        mBitmap.reconfigure(10, 10, Bitmap.Config.ALPHA_8);
+        assertEquals(mBitmap.getByteCount(), 100);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+    }
+
     public void testGetConfig(){
         Bitmap bm0 = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8);
         Bitmap bm1 = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
@@ -385,7 +406,8 @@
         assertEquals(Bitmap.Config.ALPHA_8, bm0.getConfig());
         assertEquals(Bitmap.Config.ARGB_8888, bm1.getConfig());
         assertEquals(Bitmap.Config.RGB_565, bm2.getConfig());
-        assertEquals(Bitmap.Config.ARGB_4444, bm3.getConfig());
+        // Attempting to create a 4444 bitmap actually creates an 8888 bitmap.
+        assertEquals(Bitmap.Config.ARGB_8888, bm3.getConfig());
     }
 
     public void testGetHeight(){
@@ -438,7 +460,8 @@
         assertEquals(100, bm0.getRowBytes());
         assertEquals(400, bm1.getRowBytes());
         assertEquals(200, bm2.getRowBytes());
-        assertEquals(200, bm3.getRowBytes());
+        // Attempting to create a 4444 bitmap actually creates an 8888 bitmap.
+        assertEquals(400, bm3.getRowBytes());
     }
 
     public void testGetWidth(){
@@ -465,6 +488,81 @@
         assertTrue(mBitmap.isRecycled());
     }
 
+    public void testReconfigure() {
+        mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565);
+        int alloc = mBitmap.getAllocationByteCount();
+
+        // test shrinking
+        mBitmap.reconfigure(50, 100, Bitmap.Config.ALPHA_8);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+        assertEquals(mBitmap.getByteCount() * 8, alloc);
+
+        // test expanding
+        try {
+            mBitmap.reconfigure(101, 201, Bitmap.Config.ARGB_8888);
+            fail("shouldn't come to here");
+        } catch (IllegalArgumentException e) {
+        }
+
+        // test mutable
+        mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
+        try {
+            mBitmap.reconfigure(1, 1, Bitmap.Config.ALPHA_8);
+            fail("shouldn't come to here");
+        } catch (IllegalStateException e) {
+        }
+    }
+
+    public void testSetConfig() {
+        mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565);
+        int alloc = mBitmap.getAllocationByteCount();
+
+        // test shrinking
+        mBitmap.setConfig(Bitmap.Config.ALPHA_8);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+        assertEquals(mBitmap.getByteCount() * 2, alloc);
+
+        // test expanding
+        try {
+            mBitmap.setConfig(Bitmap.Config.ARGB_8888);
+            fail("shouldn't come to here");
+        } catch (IllegalArgumentException e) {
+        }
+
+        // test mutable
+        mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
+        try {
+            mBitmap.setConfig(Bitmap.Config.ALPHA_8);
+            fail("shouldn't come to here");
+        } catch (IllegalStateException e) {
+        }
+    }
+
+    public void testSetHeight() {
+        mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
+        int alloc = mBitmap.getAllocationByteCount();
+
+        // test shrinking
+        mBitmap.setHeight(100);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+        assertEquals(mBitmap.getByteCount() * 2, alloc);
+
+        // test expanding
+        try {
+            mBitmap.setHeight(201);
+            fail("shouldn't come to here");
+        } catch (IllegalArgumentException e) {
+        }
+
+        // test mutable
+        mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
+        try {
+            mBitmap.setHeight(1);
+            fail("shouldn't come to here");
+        } catch (IllegalStateException e) {
+        }
+    }
+
     public void testSetPixel(){
         int color = 0xff << 24;
 
@@ -604,6 +702,119 @@
         }
     }
 
+    private void checkPremultipliedBitmapConfig(Config config, boolean expectedPremul) {
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, config);
+        bitmap.setPremultiplied(true);
+        bitmap.setPixel(0, 0, Color.TRANSPARENT);
+        assertTrue(bitmap.isPremultiplied() == expectedPremul);
+
+        bitmap.setHasAlpha(false);
+        assertFalse(bitmap.isPremultiplied());
+    }
+
+    public void testSetPremultipliedSimple() {
+        checkPremultipliedBitmapConfig(Bitmap.Config.ALPHA_8, true);
+        checkPremultipliedBitmapConfig(Bitmap.Config.RGB_565, false);
+        checkPremultipliedBitmapConfig(Bitmap.Config.ARGB_4444, true);
+        checkPremultipliedBitmapConfig(Bitmap.Config.ARGB_8888, true);
+    }
+
+    public void testSetPremultipliedData() {
+        // with premul, will store 2,2,2,2, so it doesn't get value correct
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setPixel(0, 0, PREMUL_COLOR);
+        assertEquals(bitmap.getPixel(0, 0), PREMUL_ROUNDED_COLOR);
+
+        // read premultiplied value directly
+        bitmap.setPremultiplied(false);
+        assertEquals(bitmap.getPixel(0, 0), PREMUL_STORED_COLOR);
+
+        // value can now be stored/read correctly
+        bitmap.setPixel(0, 0, PREMUL_COLOR);
+        assertEquals(bitmap.getPixel(0, 0), PREMUL_COLOR);
+
+        // verify with array methods
+        int testArray[] = new int[] { PREMUL_COLOR };
+        bitmap.setPixels(testArray, 0, 1, 0, 0, 1, 1);
+        bitmap.getPixels(testArray, 0, 1, 0, 0, 1, 1);
+        assertEquals(bitmap.getPixel(0, 0), PREMUL_COLOR);
+    }
+
+    public void testPremultipliedCanvas() {
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setHasAlpha(true);
+        bitmap.setPremultiplied(false);
+        assertFalse(bitmap.isPremultiplied());
+
+        Canvas c = new Canvas();
+        try {
+            c.drawBitmap(bitmap, 0, 0, null);
+            fail("canvas should fail with exception");
+        } catch (RuntimeException e) {
+        }
+    }
+
+    private int getBitmapRawInt(Bitmap bitmap) {
+        IntBuffer buffer = IntBuffer.allocate(1);
+        bitmap.copyPixelsToBuffer(buffer);
+        return buffer.get(0);
+    }
+
+    private void bitmapStoreRawInt(Bitmap bitmap, int value) {
+        IntBuffer buffer = IntBuffer.allocate(1);
+        buffer.put(0, value);
+        bitmap.copyPixelsFromBuffer(buffer);
+    }
+
+    public void testSetPremultipliedToBuffer() {
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setPixel(0, 0, PREMUL_COLOR);
+        int storedPremul = getBitmapRawInt(bitmap);
+
+        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setPremultiplied(false);
+        bitmap.setPixel(0, 0, PREMUL_STORED_COLOR);
+
+        assertEquals(getBitmapRawInt(bitmap), storedPremul);
+    }
+
+    public void testSetPremultipliedFromBuffer() {
+        Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setPremultiplied(false);
+        bitmap.setPixel(0, 0, PREMUL_COLOR);
+        int rawTestColor = getBitmapRawInt(bitmap);
+
+        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+        bitmap.setPremultiplied(false);
+        bitmapStoreRawInt(bitmap, rawTestColor);
+        assertEquals(bitmap.getPixel(0, 0), PREMUL_COLOR);
+    }
+
+    public void testSetWidth() {
+        mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
+        int alloc = mBitmap.getAllocationByteCount();
+
+        // test shrinking
+        mBitmap.setWidth(50);
+        assertEquals(mBitmap.getAllocationByteCount(), alloc);
+        assertEquals(mBitmap.getByteCount() * 2, alloc);
+
+        // test expanding
+        try {
+            mBitmap.setWidth(101);
+            fail("shouldn't come to here");
+        } catch (IllegalArgumentException e) {
+        }
+
+        // test mutable
+        mBitmap = BitmapFactory.decodeResource(mRes, R.drawable.start, mOptions);
+        try {
+            mBitmap.setWidth(1);
+            fail("shouldn't come to here");
+        } catch (IllegalStateException e) {
+        }
+    }
+
     public void testWriteToParcel(){
         mBitmap.recycle();
 
diff --git a/tests/tests/graphics/src/android/graphics/cts/CameraTest.java b/tests/tests/graphics/src/android/graphics/cts/CameraTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintFlagsDrawFilterTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
index 32d8e4d..f4904fc 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PaintTest.java
@@ -166,7 +166,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertEquals(s, p2.getShader());
+        assertNotSame(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -175,7 +175,7 @@
         assertEquals(m, p2.getMaskFilter());
         assertEquals(e, p2.getPathEffect());
         assertEquals(r, p2.getRasterizer());
-        assertEquals(s, p2.getShader());
+        assertNotSame(s, p2.getShader());
         assertEquals(t, p2.getTypeface());
         assertEquals(x, p2.getXfermode());
 
@@ -780,7 +780,7 @@
         assertEquals(Paint.ANTI_ALIAS_FLAG, p.getFlags());
 
         p.reset();
-        assertEquals(Paint.DEV_KERN_TEXT_FLAG, p.getFlags());
+        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG, p.getFlags());
         assertEquals(null, p.getColorFilter());
         assertEquals(null, p.getMaskFilter());
         assertEquals(null, p.getPathEffect());
diff --git a/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java b/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
index dcbb084..4809755 100644
--- a/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/PixelFormatTest.java
@@ -46,7 +46,7 @@
 
         PixelFormat.getPixelFormatInfo(PixelFormat.RGBX_8888, mPixelFormat);
         assertEquals(4, mPixelFormat.bytesPerPixel);
-        assertEquals(24, mPixelFormat.bitsPerPixel);
+        assertEquals(32, mPixelFormat.bitsPerPixel);
 
         PixelFormat.getPixelFormatInfo(PixelFormat.RGB_888, mPixelFormat);
         assertEquals(3, mPixelFormat.bytesPerPixel);
diff --git a/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java b/tests/tests/graphics/src/android/graphics/cts/TypefaceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java b/tests/tests/graphics/src/android/graphics/cts/YuvImageTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
index 4d1c4cf..c84510d 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/BitmapDrawableTest.java
@@ -57,7 +57,7 @@
     public void testConstructor() {
         // TODO: should default paint flags be left as an untested implementation detail?
         final int defaultPaintFlags = Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG |
-            Paint.DEV_KERN_TEXT_FLAG;
+            Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG;
         BitmapDrawable bitmapDrawable = new BitmapDrawable();
         assertNotNull(bitmapDrawable.getPaint());
         assertEquals(defaultPaintFlags,
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
index bff80ec..b23c7fa 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/NinePatchDrawableTest.java
@@ -181,8 +181,6 @@
     }
 
     public void testSetDither() {
-        assertTrue(mNinePatchDrawable.getPaint().isDither());
-
         mNinePatchDrawable.setDither(false);
         assertFalse(mNinePatchDrawable.getPaint().isDither());
 
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
index 0ce1728..d92b8cb 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/ShapeDrawableTest.java
@@ -177,8 +177,8 @@
     public void testGetPaint() {
         ShapeDrawable shapeDrawable = new ShapeDrawable();
         assertNotNull(shapeDrawable.getPaint());
-        assertEquals(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG,
-                shapeDrawable.getPaint().getFlags());
+        assertEquals(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG
+                | Paint.EMBEDDED_BITMAP_TEXT_FLAG, shapeDrawable.getPaint().getFlags());
     }
 
     public void testAccessShaderFactory() {
diff --git a/tests/tests/graphics/src/android/opengl/cts/EglContextTest.java b/tests/tests/graphics/src/android/opengl/cts/EglContextTest.java
new file mode 100644
index 0000000..8f5ced7
--- /dev/null
+++ b/tests/tests/graphics/src/android/opengl/cts/EglContextTest.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2013 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 android.opengl.cts;
+
+import android.app.Activity;
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.GLES20;
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Tests using EGL contexts.
+ */
+public class EglContextTest extends ActivityInstrumentationTestCase2<Activity> {
+
+    public EglContextTest() {
+        super(Activity.class);
+    }
+
+    /**
+     * Tests creating then releasing an EGL context.
+     */
+    public void testCreateAndReleaseContext() {
+        EGLDisplay eglDisplay = null;
+        EGLContext eglContext = null;
+        try {
+            eglDisplay = createEglDisplay();
+            eglContext = createEglContext(eglDisplay);
+            destroyEglContext(eglDisplay, eglContext);
+            eglDisplay = null;
+            eglContext = null;
+        } finally {
+            if (eglDisplay != null) {
+                if (eglContext != null) {
+                    EGL14.eglDestroyContext(eglDisplay, eglContext);
+                }
+
+                EGL14.eglTerminate(eglDisplay);
+            }
+        }
+    }
+
+    /**
+     * Returns an initialized default display.
+     */
+    private static EGLDisplay createEglDisplay() {
+        EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (eglDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new IllegalStateException("no EGL display");
+        }
+
+        int[] major = new int[1];
+        int[] minor = new int[1];
+        if (!EGL14.eglInitialize(eglDisplay, major, 0, minor, 0)) {
+            throw new IllegalStateException("error in eglInitialize");
+        }
+        checkGlError();
+
+        return eglDisplay;
+    }
+
+    /**
+     * Returns a new GL context for the specified {@code eglDisplay}.
+     */
+    private static EGLContext createEglContext(EGLDisplay eglDisplay) {
+        int[] contextAttributes = { EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE };
+        EGLContext eglContext = EGL14.eglCreateContext(eglDisplay,
+                getEglConfig(eglDisplay), EGL14.EGL_NO_CONTEXT, contextAttributes, 0);
+        checkGlError();
+
+        return eglContext;
+    }
+
+    /**
+     * Destroys the GL context identifier by {@code eglDisplay} and {@code eglContext}.
+     */
+    private static void destroyEglContext(EGLDisplay eglDisplay, EGLContext eglContext) {
+        EGL14.eglMakeCurrent(eglDisplay,
+                EGL14.EGL_NO_SURFACE,
+                EGL14.EGL_NO_SURFACE,
+                EGL14.EGL_NO_CONTEXT);
+        int error = EGL14.eglGetError();
+        if (error != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException("error releasing context: " + error);
+        }
+
+        EGL14.eglDestroyContext(eglDisplay, eglContext);
+        error = EGL14.eglGetError();
+        if (error != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException("error destroying context: " + error);
+        }
+
+        EGL14.eglReleaseThread();
+        error = EGL14.eglGetError();
+        if (error != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException("error releasing thread: " + error);
+        }
+
+        EGL14.eglTerminate(eglDisplay);
+        error = EGL14.eglGetError();
+        if (error != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException("error terminating display: " + error);
+        }
+    }
+
+    private static EGLConfig getEglConfig(EGLDisplay eglDisplay) {
+        // Get an EGLConfig.
+        final int EGL_OPENGL_ES2_BIT = 4;
+        final int RED_SIZE = 8;
+        final int GREEN_SIZE = 8;
+        final int BLUE_SIZE = 8;
+        final int ALPHA_SIZE = 8;
+        final int DEPTH_SIZE = 0;
+        final int STENCIL_SIZE = 0;
+        final int[] DEFAULT_CONFIGURATION = new int[] {
+                EGL14.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+                EGL14.EGL_RED_SIZE, RED_SIZE,
+                EGL14.EGL_GREEN_SIZE, GREEN_SIZE,
+                EGL14.EGL_BLUE_SIZE, BLUE_SIZE,
+                EGL14.EGL_ALPHA_SIZE, ALPHA_SIZE,
+                EGL14.EGL_DEPTH_SIZE, DEPTH_SIZE,
+                EGL14.EGL_STENCIL_SIZE, STENCIL_SIZE,
+                EGL14.EGL_NONE};
+
+        int[] configsCount = new int[1];
+        EGLConfig[] eglConfigs = new EGLConfig[1];
+        if (!EGL14.eglChooseConfig(
+                eglDisplay, DEFAULT_CONFIGURATION, 0, eglConfigs, 0, 1, configsCount, 0)) {
+            throw new RuntimeException("eglChooseConfig failed");
+        }
+        return eglConfigs[0];
+    }
+
+    /**
+     * Checks for a GL error using {@link GLES20#glGetError()}.
+     *
+     * @throws RuntimeException if there is a GL error
+     */
+    private static void checkGlError() {
+        int errorCode;
+        if ((errorCode = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            throw new RuntimeException("gl error: " + Integer.toHexString(errorCode));
+        }
+    }
+
+}
diff --git a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
index 30a1f67..85159a8 100644
--- a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -68,9 +68,12 @@
                 reportedVersion, getVersionFromPackageManager(mActivity));
 
         assertGlVersionString(1);
-        if (detectedVersion >= 2) {
+        if (detectedVersion == 2) {
             restartActivityWithClientVersion(2);
             assertGlVersionString(2);
+        } else if (detectedVersion == 3) {
+            restartActivityWithClientVersion(3);
+            assertGlVersionString(3);
         }
     }
 
@@ -190,9 +193,6 @@
         String versionString = "" + majorVersion;
         String message = "OpenGL version string '" + mActivity.getVersionString()
                 + "' is not " + majorVersion + ".0+.";
-        if (majorVersion == 2) {
-             versionString = "(2|3)";
-        }
         assertTrue(message, Pattern.matches(".*OpenGL.*ES.*" + versionString + "\\.\\d.*",
                 mActivity.getVersionString()));
     }
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 76088a0..e0ad6e5 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -14,13 +14,27 @@
 
 LOCAL_PATH:= $(call my-dir)
 
+# Reusable Sensor test classes and helpers
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := cts-sensors-tests
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src/android/hardware/cts/helpers)
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
+# CtsHardwareTestCases package
+
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := tests
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner mockito-target android-ex-camera2
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java
new file mode 100644
index 0000000..6a708e3
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCaptureResultTest.java
@@ -0,0 +1,336 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.Size;
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import android.media.ImageReader;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.test.AndroidTestCase;
+import android.util.Log;
+import android.view.Surface;
+
+import com.android.ex.camera2.blocking.BlockingStateListener;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+public class CameraCaptureResultTest extends AndroidTestCase {
+    private static final String TAG = "CameraCaptureResultTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+
+    private CameraManager mCameraManager;
+    private HandlerThread mHandlerThread;
+    private Handler mHandler;
+    private ImageReader mImageReader;
+    private Surface mSurface;
+    private BlockingStateListener mCameraListener;
+
+    private static final int MAX_NUM_IMAGES = 5;
+    private static final int NUM_FRAMES_VERIFIED = 300;
+    private static final long WAIT_FOR_RESULT_TIMEOUT_MS = 3000;
+
+    // List that includes all public keys from CaptureResult
+    List<CameraMetadata.Key<?>> mAllKeys;
+
+    // List tracking the failed test keys.
+    List<CameraMetadata.Key<?>> mFailedKeys = new ArrayList<CameraMetadata.Key<?>>();
+
+    @Override
+    public void setContext(Context context) {
+        mAllKeys = getAllCaptureResultKeys();
+        super.setContext(context);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager", mCameraManager);
+        mHandlerThread = new HandlerThread(TAG);
+        mHandlerThread.start();
+        mHandler = new Handler(mHandlerThread.getLooper());
+        mCameraListener = new BlockingStateListener();
+        mFailedKeys.clear();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mHandlerThread.quitSafely();
+        super.tearDown();
+    }
+
+    public void testCameraCaptureResultAllKeys() throws Exception {
+        /**
+         * Hardcode a key waiver list for the keys we want to skip the sanity check.
+         * FIXME: We need get ride of this list, see bug 11116270.
+         */
+        List<CameraMetadata.Key<?>> waiverkeys = new ArrayList<CameraMetadata.Key<?>>();
+        waiverkeys.add(CaptureResult.EDGE_MODE);
+        waiverkeys.add(CaptureResult.JPEG_GPS_COORDINATES);
+        waiverkeys.add(CaptureResult.JPEG_GPS_PROCESSING_METHOD);
+        waiverkeys.add(CaptureResult.JPEG_GPS_TIMESTAMP);
+        waiverkeys.add(CaptureResult.JPEG_ORIENTATION);
+        waiverkeys.add(CaptureResult.JPEG_QUALITY);
+        waiverkeys.add(CaptureResult.JPEG_THUMBNAIL_QUALITY);
+        waiverkeys.add(CaptureResult.JPEG_THUMBNAIL_SIZE);
+        waiverkeys.add(CaptureResult.SENSOR_TEMPERATURE);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_BLUE);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_GREEN);
+        waiverkeys.add(CaptureResult.TONEMAP_CURVE_RED);
+        waiverkeys.add(CaptureResult.TONEMAP_MODE);
+        waiverkeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_GAINS);
+        waiverkeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_TRANSFORM);
+        waiverkeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
+
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull("CameraCharacteristics shouldn't be null", props);
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            if (hwLevel != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL) {
+                continue;
+            }
+            // TODO: check for LIMITED keys
+
+            CameraDevice camera = null;
+            try {
+                Size[] sizes = CameraTestUtils.getSupportedSizeForFormat(
+                        ImageFormat.YUV_420_888, ids[i], mCameraManager);
+                CameraTestUtils.assertArrayNotEmpty(sizes, "Available sizes shouldn't be empty");
+                createDefaultSurface(sizes[0]);
+
+                if (VERBOSE) {
+                    Log.v(TAG, "Testing camera " + ids[i] + "for size " + sizes[0].toString());
+                }
+
+                camera = CameraTestUtils.openCamera(
+                        mCameraManager, ids[i], mCameraListener, mHandler);
+                assertNotNull(
+                        String.format("Failed to open camera device %s", ids[i]), camera);
+                mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
+
+                List<Surface> outputSurfaces = new ArrayList<Surface>(1);
+                outputSurfaces.add(mSurface);
+                camera.configureOutputs(outputSurfaces);
+                mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+                mCameraListener.waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
+
+                CaptureRequest.Builder requestBuilder =
+                        camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+                assertNotNull("Failed to create capture request", requestBuilder);
+                requestBuilder.addTarget(mSurface);
+
+                // Enable face detection if supported
+                byte[] faceModes = props.get(
+                        CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
+                assertNotNull("Available face detection modes shouldn't be null", faceModes);
+                for (int m = 0; m < faceModes.length; m++) {
+                    if (faceModes[m] == CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL) {
+                        if (VERBOSE) {
+                            Log.v(TAG, "testCameraCaptureResultAllKeys - " +
+                                    "setting facedetection mode to full");
+                        }
+                        requestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
+                                (int)faceModes[m]);
+                    }
+                }
+
+                // Enable lensShading mode, it should be supported by full mode device.
+                requestBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
+                        CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_ON);
+
+                SimpleCaptureListener captureListener = new SimpleCaptureListener();
+                camera.setRepeatingRequest(requestBuilder.build(), captureListener, mHandler);
+
+                for (int m = 0; m < NUM_FRAMES_VERIFIED; m++) {
+                    if(VERBOSE) {
+                        Log.v(TAG, "Testing frame " + m);
+                    }
+                    validateCaptureResult(
+                            captureListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS),
+                            waiverkeys);
+                }
+
+                // Stop repeat, wait for captures to complete, and disconnect from surfaces
+                camera.configureOutputs(/*outputs*/ null);
+                mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+                mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_IDLE_TIMEOUT_MS);
+                // Camera has disconnected, clear out the reader
+                mSurface.release();
+                mImageReader.close();
+            } finally {
+                if (camera != null) {
+                    camera.close();
+                }
+            }
+
+        }
+    }
+
+    private void validateCaptureResult(CaptureResult result,
+            List<CameraMetadata.Key<?>> skippedKeys) throws Exception {
+        for (CameraMetadata.Key<?> key : mAllKeys) {
+            if (!skippedKeys.contains(key) && result.get(key) == null) {
+                mFailedKeys.add(key);
+            }
+        }
+
+        StringBuffer failedKeyNames = new StringBuffer("Below Keys have null values:\n");
+        for (CameraMetadata.Key<?> key : mFailedKeys) {
+            failedKeyNames.append(key.getName() + "\n");
+        }
+
+        assertTrue("Some keys have null values, " + failedKeyNames.toString(),
+                mFailedKeys.isEmpty());
+    }
+
+    private static class SimpleCaptureListener extends CameraDevice.CaptureListener {
+        LinkedBlockingQueue<CaptureResult> mQueue = new LinkedBlockingQueue<CaptureResult>();
+
+        @Override
+        public void onCaptureStarted(CameraDevice camera, CaptureRequest request, long timestamp)
+        {
+        }
+
+        @Override
+        public void onCaptureCompleted(CameraDevice camera, CaptureRequest request,
+                CaptureResult result) {
+            try {
+                mQueue.put(result);
+            } catch (InterruptedException e) {
+                throw new UnsupportedOperationException(
+                        "Can't handle InterruptedException in onCaptureCompleted");
+            }
+        }
+
+        @Override
+        public void onCaptureFailed(CameraDevice camera, CaptureRequest request,
+                CaptureFailure failure) {
+        }
+
+        @Override
+        public void onCaptureSequenceCompleted(CameraDevice camera, int sequenceId,
+                int frameNumber) {
+        }
+
+        public CaptureResult getCaptureResult(long timeout) throws InterruptedException {
+            CaptureResult result = mQueue.poll(timeout, TimeUnit.MILLISECONDS);
+            assertNotNull("Wait for a capture result timed out in " + timeout + "ms", result);
+            return result;
+        }
+    }
+
+    private void createDefaultSurface(Size sz) {
+        mImageReader =
+                ImageReader.newInstance(sz.getWidth(),
+                        sz.getHeight(),
+                        ImageFormat.YUV_420_888,
+                        MAX_NUM_IMAGES);
+        mImageReader.setOnImageAvailableListener(new ImageDropperListener(), mHandler);
+        mSurface = mImageReader.getSurface();
+    }
+
+    /**
+     * TODO: Use CameraCharacteristics.getAvailableCaptureResultKeys() once we can filter out
+     * @hide keys.
+     *
+     */
+
+    /*@O~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
+     * The key entries below this point are generated from metadata
+     * definitions in /system/media/camera/docs. Do not modify by hand or
+     * modify the comment blocks at the start or end.
+     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~*/
+
+    private static List<CameraMetadata.Key<?>> getAllCaptureResultKeys() {
+        ArrayList<CameraMetadata.Key<?>> resultKeys = new ArrayList<CameraMetadata.Key<?>>();
+        resultKeys.add(CaptureResult.COLOR_CORRECTION_TRANSFORM);
+        resultKeys.add(CaptureResult.COLOR_CORRECTION_GAINS);
+        resultKeys.add(CaptureResult.CONTROL_AE_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_AF_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AF_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_AWB_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AWB_REGIONS);
+        resultKeys.add(CaptureResult.CONTROL_MODE);
+        resultKeys.add(CaptureResult.CONTROL_AE_STATE);
+        resultKeys.add(CaptureResult.CONTROL_AF_STATE);
+        resultKeys.add(CaptureResult.CONTROL_AWB_STATE);
+        resultKeys.add(CaptureResult.EDGE_MODE);
+        resultKeys.add(CaptureResult.FLASH_MODE);
+        resultKeys.add(CaptureResult.FLASH_STATE);
+        resultKeys.add(CaptureResult.JPEG_GPS_COORDINATES);
+        resultKeys.add(CaptureResult.JPEG_GPS_PROCESSING_METHOD);
+        resultKeys.add(CaptureResult.JPEG_GPS_TIMESTAMP);
+        resultKeys.add(CaptureResult.JPEG_ORIENTATION);
+        resultKeys.add(CaptureResult.JPEG_QUALITY);
+        resultKeys.add(CaptureResult.JPEG_THUMBNAIL_QUALITY);
+        resultKeys.add(CaptureResult.JPEG_THUMBNAIL_SIZE);
+        resultKeys.add(CaptureResult.LENS_APERTURE);
+        resultKeys.add(CaptureResult.LENS_FILTER_DENSITY);
+        resultKeys.add(CaptureResult.LENS_FOCAL_LENGTH);
+        resultKeys.add(CaptureResult.LENS_FOCUS_DISTANCE);
+        resultKeys.add(CaptureResult.LENS_OPTICAL_STABILIZATION_MODE);
+        resultKeys.add(CaptureResult.LENS_FOCUS_RANGE);
+        resultKeys.add(CaptureResult.LENS_STATE);
+        resultKeys.add(CaptureResult.NOISE_REDUCTION_MODE);
+        resultKeys.add(CaptureResult.REQUEST_FRAME_COUNT);
+        resultKeys.add(CaptureResult.SCALER_CROP_REGION);
+        resultKeys.add(CaptureResult.SENSOR_EXPOSURE_TIME);
+        resultKeys.add(CaptureResult.SENSOR_FRAME_DURATION);
+        resultKeys.add(CaptureResult.SENSOR_SENSITIVITY);
+        resultKeys.add(CaptureResult.SENSOR_TIMESTAMP);
+        resultKeys.add(CaptureResult.SENSOR_TEMPERATURE);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_DETECT_MODE);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_IDS);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_LANDMARKS);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_RECTANGLES);
+        resultKeys.add(CaptureResult.STATISTICS_FACE_SCORES);
+        resultKeys.add(CaptureResult.STATISTICS_LENS_SHADING_MAP);
+        resultKeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_GAINS);
+        resultKeys.add(CaptureResult.STATISTICS_PREDICTED_COLOR_TRANSFORM);
+        resultKeys.add(CaptureResult.STATISTICS_SCENE_FLICKER);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_BLUE);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_GREEN);
+        resultKeys.add(CaptureResult.TONEMAP_CURVE_RED);
+        resultKeys.add(CaptureResult.TONEMAP_MODE);
+        resultKeys.add(CaptureResult.BLACK_LEVEL_LOCK);
+
+        // Add STATISTICS_FACES key separately here because it is not
+        // defined in metadata xml file.
+        resultKeys.add(CaptureResult.STATISTICS_FACES);
+
+        return resultKeys;
+    }
+
+    /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~
+     * End generated code
+     *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
new file mode 100644
index 0000000..1b892ba
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
@@ -0,0 +1,965 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+/**
+ * ! Do not edit this file directly !
+ *
+ * Generated automatically from system/media/camera/docs/CameraCharacteristicsTest.mako.
+ * This file contains only the auto-generated CameraCharacteristics CTS tests; it does
+ * not contain any additional manual tests, which would be in a separate file.
+ */
+
+package android.hardware.camera2.cts;
+
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata.Key;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Auto-generated CTS test for CameraCharacteristics fields.
+ */
+public class CameraCharacteristicsTest extends AndroidTestCase {
+    private CameraManager mCameraManager;
+    private static final String TAG = "CameraCharacteristicsTest";
+
+    @Override
+    public void setContext(Context context) {
+        super.setContext(context);
+        mCameraManager = (CameraManager)context.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager", mCameraManager);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testCameraCharacteristicsAndroidControlAeAvailableAntibandingModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.aeAvailableAntibandingModes",
+                        props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.aeAvailableAntibandingModes", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAeAvailableTargetFpsRanges() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.aeAvailableTargetFpsRanges",
+                        props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.aeAvailableTargetFpsRanges", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAeCompensationRange() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.aeCompensationRange",
+                        props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.aeCompensationRange", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAeCompensationStep() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.aeCompensationStep",
+                        props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.aeCompensationStep", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAfAvailableModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.afAvailableModes",
+                        props.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.afAvailableModes", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAvailableEffects() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.availableEffects",
+                        props.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.availableEffects", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAvailableSceneModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.availableSceneModes",
+                        props.get(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.availableSceneModes", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAvailableVideoStabilizationModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.availableVideoStabilizationModes",
+                        props.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.availableVideoStabilizationModes", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlAwbAvailableModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.awbAvailableModes",
+                        props.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.awbAvailableModes", allKeys.contains(
+                        CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidControlMaxRegions() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.control.maxRegions",
+                        props.get(CameraCharacteristics.CONTROL_MAX_REGIONS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.control.maxRegions", allKeys.contains(
+                        CameraCharacteristics.CONTROL_MAX_REGIONS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidFlashInfoAvailable() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.flash.info.available",
+                        props.get(CameraCharacteristics.FLASH_INFO_AVAILABLE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.flash.info.available", allKeys.contains(
+                        CameraCharacteristics.FLASH_INFO_AVAILABLE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidJpegAvailableThumbnailSizes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.jpeg.availableThumbnailSizes",
+                        props.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.jpeg.availableThumbnailSizes", allKeys.contains(
+                        CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensFacing() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.facing",
+                        props.get(CameraCharacteristics.LENS_FACING));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.facing", allKeys.contains(
+                        CameraCharacteristics.LENS_FACING));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoAvailableApertures() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.availableApertures",
+                        props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.availableApertures", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoAvailableFilterDensities() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.availableFilterDensities",
+                        props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.availableFilterDensities", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoAvailableFocalLengths() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.availableFocalLengths",
+                        props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.availableFocalLengths", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoAvailableOpticalStabilization() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.availableOpticalStabilization",
+                        props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.availableOpticalStabilization", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoHyperfocalDistance() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.hyperfocalDistance",
+                        props.get(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.hyperfocalDistance", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoMinimumFocusDistance() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.minimumFocusDistance",
+                        props.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.minimumFocusDistance", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidLensInfoShadingMapSize() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.lens.info.shadingMapSize",
+                        props.get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.lens.info.shadingMapSize", allKeys.contains(
+                        CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidRequestMaxNumOutputStreams() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.request.maxNumOutputStreams",
+                        props.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.request.maxNumOutputStreams", allKeys.contains(
+                        CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableFormats() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableFormats",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableFormats", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableJpegMinDurations() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableJpegMinDurations",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableJpegMinDurations", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableJpegSizes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableJpegSizes",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableJpegSizes", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableMaxDigitalZoom() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableMaxDigitalZoom",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableMaxDigitalZoom", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableProcessedMinDurations() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableProcessedMinDurations",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableProcessedMinDurations", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidScalerAvailableProcessedSizes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.scaler.availableProcessedSizes",
+                        props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.scaler.availableProcessedSizes", allKeys.contains(
+                        CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorBaseGainFactor() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            assertNotNull("No hardware level reported! android.info.supportedHardwareLevel",
+                    hwLevel);
+            if (hwLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
+            {
+
+                assertNotNull("Invalid property: android.sensor.baseGainFactor",
+                        props.get(CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.baseGainFactor", allKeys.contains(
+                        CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorMaxAnalogSensitivity() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            Integer hwLevel = props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
+            assertNotNull("No hardware level reported! android.info.supportedHardwareLevel",
+                    hwLevel);
+            if (hwLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL)
+            {
+
+                assertNotNull("Invalid property: android.sensor.maxAnalogSensitivity",
+                        props.get(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.maxAnalogSensitivity", allKeys.contains(
+                        CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorOrientation() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.orientation",
+                        props.get(CameraCharacteristics.SENSOR_ORIENTATION));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.orientation", allKeys.contains(
+                        CameraCharacteristics.SENSOR_ORIENTATION));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorInfoActiveArraySize() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.info.activeArraySize",
+                        props.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.info.activeArraySize", allKeys.contains(
+                        CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorInfoSensitivityRange() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.info.sensitivityRange",
+                        props.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.info.sensitivityRange", allKeys.contains(
+                        CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorInfoExposureTimeRange() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.info.exposureTimeRange",
+                        props.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.info.exposureTimeRange", allKeys.contains(
+                        CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorInfoMaxFrameDuration() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.info.maxFrameDuration",
+                        props.get(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.info.maxFrameDuration", allKeys.contains(
+                        CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidSensorInfoPhysicalSize() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.sensor.info.physicalSize",
+                        props.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.sensor.info.physicalSize", allKeys.contains(
+                        CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidStatisticsInfoAvailableFaceDetectModes() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.statistics.info.availableFaceDetectModes",
+                        props.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.statistics.info.availableFaceDetectModes", allKeys.contains(
+                        CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidStatisticsInfoMaxFaceCount() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.statistics.info.maxFaceCount",
+                        props.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.statistics.info.maxFaceCount", allKeys.contains(
+                        CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidTonemapMaxCurvePoints() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.tonemap.maxCurvePoints",
+                        props.get(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.tonemap.maxCurvePoints", allKeys.contains(
+                        CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
+
+            }
+
+        }
+    }
+
+    public void testCameraCharacteristicsAndroidInfoSupportedHardwareLevel() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(String.format("Can't get camera characteristics from: ID %s", ids[i]),
+                                        props);
+
+            {
+
+                assertNotNull("Invalid property: android.info.supportedHardwareLevel",
+                        props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
+
+                List<Key<?>> allKeys = props.getKeys();
+                assertNotNull(String.format("Can't get camera characteristics keys from: ID %s",
+                        ids[i], props));
+                assertTrue("Key not in keys list: android.info.supportedHardwareLevel", allKeys.contains(
+                        CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
+
+            }
+
+        }
+    }
+}
+
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
new file mode 100644
index 0000000..f68b10a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -0,0 +1,440 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CaptureFailure;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
+import android.media.Image;
+import android.media.ImageReader;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.util.Log;
+import android.view.Surface;
+
+import com.android.ex.camera2.blocking.BlockingStateListener;
+import org.mockito.ArgumentMatcher;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>Basic test for CameraDevice APIs.</p>
+ */
+public class CameraDeviceTest extends AndroidTestCase {
+    private static final String TAG = "CameraDeviceTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+
+    private CameraManager mCameraManager;
+    private BlockingStateListener mCameraListener;
+    private CameraTestThread mLooperThread;
+    private Handler mCallbackHandler;
+    private int mLatestState = STATE_UNINITIALIZED;
+
+    /**
+     * The error triggered flag starts out as false, and it will flip to true if any errors
+     * are ever caught; it won't be reset to false after that happens. This is due to the
+     * fact that when multiple tests are run back to back (as they are here), it's hard
+     * to associate the asynchronous error with the test that caused it (so we won't even try).
+     */
+    private boolean mErrorTriggered = false;
+    private ImageReader mReader;
+    private CameraTestThread mDummyThread;
+    private Surface mSurface;
+
+    private static final int CAMERA_CONFIGURE_TIMEOUT_MS = 2000;
+    private static final int CAPTURE_WAIT_TIMEOUT_MS = 2000;
+    private static final int ERROR_LISTENER_WAIT_TIMEOUT_MS = 1000;
+    private static final int REPEATING_CAPTURE_EXPECTED_RESULT_COUNT = 5;
+    // VGA size capture is required by CDD.
+    private static final int DEFAULT_CAPTURE_WIDTH = 640;
+    private static final int DEFAULT_CAPTURE_HEIGHT = 480;
+    private static final int MAX_NUM_IMAGES = 5;
+
+    private static int[] mTemplates = new int[] {
+            CameraDevice.TEMPLATE_PREVIEW,
+            CameraDevice.TEMPLATE_RECORD,
+            CameraDevice.TEMPLATE_STILL_CAPTURE,
+            CameraDevice.TEMPLATE_VIDEO_SNAPSHOT
+    };
+
+    @Override
+    public void setContext(Context context) {
+        super.setContext(context);
+        /**
+         * Workaround for mockito and JB-MR2 incompatibility
+         *
+         * Avoid java.lang.IllegalArgumentException: dexcache == null
+         * https://code.google.com/p/dexmaker/issues/detail?id=2
+         */
+        System.setProperty("dexmaker.dexcache", mContext.getCacheDir().toString());
+        /**
+         * Create errorlistener in context scope, to catch asynchronous device error.
+         * Use spy object here since we want to use the SimpleDeviceListener callback
+         * implementation (spy doesn't stub the functions unless we ask it to do so).
+         */
+        mCameraListener = spy(new BlockingStateListener());
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        /**
+         * Due to the asynchronous nature of camera device error callback, we
+         * have to make sure device doesn't run into error state before. If so,
+         * fail the rest of the tests. This is especially needed when error
+         * callback is fired too late.
+         */
+        verify(mCameraListener, never())
+                .onError(
+                    any(CameraDevice.class),
+                    anyInt());
+        verify(mCameraListener, never())
+                .onDisconnected(
+                    any(CameraDevice.class));
+
+        mCameraManager = (CameraManager)mContext.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager", mCameraManager);
+        createDefaultSurface();
+        mLooperThread = new CameraTestThread();
+        mCallbackHandler = mLooperThread.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mDummyThread.close();
+        mReader.close();
+        super.tearDown();
+    }
+
+    public void testCameraDeviceCreateCaptureBuilder() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraDevice camera = null;
+            try {
+                camera = CameraTestUtils.openCamera(mCameraManager, ids[i], mCallbackHandler);
+                assertNotNull(
+                        String.format("Failed to open camera device ID: %s", ids[i]), camera);
+
+                /**
+                 * Test: that each template type is supported, and that its required fields are
+                 * present.
+                 */
+                for (int j = 0; j < mTemplates.length; j++) {
+                    CaptureRequest.Builder capReq = camera.createCaptureRequest(mTemplates[j]);
+                    assertNotNull("Failed to create capture request", capReq);
+                    assertNotNull("Missing field: SENSOR_EXPOSURE_TIME",
+                            capReq.get(CaptureRequest.SENSOR_EXPOSURE_TIME));
+                    assertNotNull("Missing field: SENSOR_SENSITIVITY",
+                            capReq.get(CaptureRequest.SENSOR_SENSITIVITY));
+
+                    // TODO: Add more tests to check more fields.
+                }
+            }
+            finally {
+                if (camera != null) {
+                    camera.close();
+                }
+            }
+        }
+    }
+
+    public void testCameraDeviceSetErrorListener() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraDevice camera = null;
+            try {
+                camera = CameraTestUtils.openCamera(mCameraManager, ids[i],
+                        mCameraListener, mCallbackHandler);
+                assertNotNull(
+                        String.format("Failed to open camera device %s", ids[i]), camera);
+
+                /**
+                 * Test: that the error listener can be set without problems.
+                 * Also, wait some time to check if device doesn't run into error.
+                 */
+                SystemClock.sleep(ERROR_LISTENER_WAIT_TIMEOUT_MS);
+                verify(mCameraListener, never())
+                        .onError(
+                                any(CameraDevice.class),
+                                anyInt());
+            }
+            finally {
+                if (camera != null) {
+                    camera.close();
+                }
+            }
+        }
+    }
+
+    public void testCameraDeviceCapture() throws Exception {
+        runCaptureTest(false, false);
+    }
+
+    public void testCameraDeviceCaptureBurst() throws Exception {
+        runCaptureTest(true, false);
+    }
+
+    public void testCameraDeviceRepeatingRequest() throws Exception {
+        runCaptureTest(false, true);
+    }
+
+    public void testCameraDeviceRepeatingBurst() throws Exception {
+        runCaptureTest(true, true);
+    }
+
+    private class IsCameraMetadataNotEmpty<T extends CameraMetadata>
+            extends ArgumentMatcher<T> {
+        @Override
+        public boolean matches(Object obj) {
+            /**
+             * Do the simple verification here. Only verify the timestamp for now.
+             * TODO: verify more required capture result metadata fields.
+             */
+            CameraMetadata result = (CameraMetadata) obj;
+            Long timeStamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
+            if (timeStamp != null && timeStamp.longValue() > 0L) {
+                return true;
+            }
+            return false;
+        }
+    }
+
+    private void runCaptureTest(boolean burst, boolean repeating) throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraDevice camera = null;
+            try {
+                camera = CameraTestUtils.openCamera(mCameraManager, ids[i],
+                        mCameraListener, mCallbackHandler);
+                assertNotNull(
+                        String.format("Failed to open camera device %s", ids[i]), camera);
+                waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
+
+                prepareCapture(camera);
+
+                if (!burst) {
+                    // Test: that a single capture of each template type succeeds.
+                    for (int j = 0; j < mTemplates.length; j++) {
+                        captureSingleShot(camera, ids[i], mTemplates[j], repeating);
+                    }
+                }
+                else {
+                    // Test: burst of zero shots
+                    captureBurstShot(camera, ids[i], mTemplates, 0, repeating);
+
+                    // Test: burst of one shot
+                    captureBurstShot(camera, ids[i], mTemplates, 1, repeating);
+
+                    int[] templates = new int[] {
+                            CameraDevice.TEMPLATE_STILL_CAPTURE,
+                            CameraDevice.TEMPLATE_STILL_CAPTURE,
+                            CameraDevice.TEMPLATE_STILL_CAPTURE,
+                            CameraDevice.TEMPLATE_STILL_CAPTURE,
+                            CameraDevice.TEMPLATE_STILL_CAPTURE
+                            };
+
+                    // Test: burst of 5 shots of the same template type
+                    captureBurstShot(camera, ids[i], templates, templates.length, repeating);
+
+                    // Test: burst of 5 shots of different template types
+                    captureBurstShot(camera, ids[i], mTemplates, mTemplates.length, repeating);
+                }
+                verify(mCameraListener, never())
+                        .onError(
+                                any(CameraDevice.class),
+                                anyInt());
+            }
+            finally {
+                if (camera != null) {
+                    camera.close();
+                }
+            }
+        }
+    }
+
+    private void captureSingleShot(
+            CameraDevice camera,
+            String id,
+            int template,
+            boolean repeating) throws Exception {
+
+        assertEquals("Bad initial state for preparing to capture",
+                mLatestState, STATE_IDLE);
+
+        CaptureRequest.Builder requestBuilder = camera.createCaptureRequest(template);
+        assertNotNull("Failed to create capture request", requestBuilder);
+        requestBuilder.addTarget(mSurface);
+        CameraDevice.CaptureListener mockCaptureListener =
+                mock(CameraDevice.CaptureListener.class);
+
+        if (VERBOSE) {
+            Log.v(TAG, String.format("Capturing shot for device %s, template %d",
+                    id, template));
+        }
+        if (!repeating) {
+            camera.capture(requestBuilder.build(), mockCaptureListener, mCallbackHandler);
+        }
+        else {
+            camera.setRepeatingRequest(requestBuilder.build(), mockCaptureListener,
+                    mCallbackHandler);
+        }
+        waitForState(STATE_ACTIVE, CAMERA_CONFIGURE_TIMEOUT_MS);
+
+        int expectedCaptureResultCount = repeating ? REPEATING_CAPTURE_EXPECTED_RESULT_COUNT : 1;
+        verifyCaptureResults(camera, mockCaptureListener, expectedCaptureResultCount);
+
+        if (repeating) {
+            camera.stopRepeating();
+        }
+        waitForState(STATE_IDLE, CAMERA_CONFIGURE_TIMEOUT_MS);
+    }
+
+    private void captureBurstShot(
+            CameraDevice camera,
+            String id,
+            int[] templates,
+            int len,
+            boolean repeating) throws Exception {
+
+        assertEquals("Bad initial state for preparing to capture",
+                mLatestState, STATE_IDLE);
+
+        assertTrue("Invalid args to capture function", len <= templates.length);
+        List<CaptureRequest> requests = new ArrayList<CaptureRequest>();
+        for (int i = 0; i < len; i++) {
+            CaptureRequest.Builder requestBuilder = camera.createCaptureRequest(templates[i]);
+            assertNotNull("Failed to create capture request", requestBuilder);
+            requestBuilder.addTarget(mSurface);
+            requests.add(requestBuilder.build());
+        }
+        CameraDevice.CaptureListener mockCaptureListener =
+                mock(CameraDevice.CaptureListener.class);
+
+        if (VERBOSE) {
+            Log.v(TAG, String.format("Capturing burst shot for device %s", id));
+        }
+
+        if (!repeating) {
+            camera.captureBurst(requests, mockCaptureListener, mCallbackHandler);
+        }
+        else {
+            camera.setRepeatingBurst(requests, mockCaptureListener, mCallbackHandler);
+        }
+        waitForState(STATE_ACTIVE, CAMERA_CONFIGURE_TIMEOUT_MS);
+
+        int expectedResultCount = len;
+        if (repeating) {
+            expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
+        }
+
+        verifyCaptureResults(camera, mockCaptureListener, expectedResultCount);
+
+        if (repeating) {
+            camera.stopRepeating();
+        }
+        waitForState(STATE_IDLE, CAMERA_CONFIGURE_TIMEOUT_MS);
+    }
+
+    // Precondition: Device must be in known IDLE/UNCONFIGURED state (has been waited for)
+    private void prepareCapture(CameraDevice camera) throws Exception {
+        assertTrue("Bad initial state for preparing to capture",
+                mLatestState == STATE_IDLE || mLatestState == STATE_UNCONFIGURED);
+
+        List<Surface> outputSurfaces = new ArrayList<Surface>(1);
+        outputSurfaces.add(mSurface);
+        camera.configureOutputs(outputSurfaces);
+        waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
+    }
+
+    /**
+     * Dummy listener that release the image immediately once it is available.
+     * It can be used for the case where we don't care the image data at all.
+     * TODO: move it to the CameraTestUtil class.
+     */
+    private class ImageDropperListener implements ImageReader.OnImageAvailableListener {
+        @Override
+        public void onImageAvailable(ImageReader reader) {
+            Image image = null;
+            try {
+                image = reader.acquireNextImage();
+            } finally {
+                if (image != null) {
+                    image.close();
+                }
+            }
+        }
+    }
+
+    private void createDefaultSurface() throws Exception {
+        mReader =
+                ImageReader.newInstance(DEFAULT_CAPTURE_WIDTH,
+                        DEFAULT_CAPTURE_HEIGHT,
+                        ImageFormat.YUV_420_888,
+                        MAX_NUM_IMAGES);
+        mSurface = mReader.getSurface();
+        // Create dummy image listener since we don't care the image data in this test.
+        ImageReader.OnImageAvailableListener listener = new ImageDropperListener();
+        mDummyThread = new CameraTestThread();
+        mReader.setOnImageAvailableListener(listener, mDummyThread.start());
+    }
+
+    private void waitForState(int state, long timeout) {
+        mCameraListener.waitForState(state, timeout);
+        mLatestState = state;
+    }
+
+    private void verifyCaptureResults(
+            CameraDevice camera,
+            CameraDevice.CaptureListener mockListener,
+            int expectResultCount) {
+        // Should receive expected number of capture results.
+        verify(mockListener,
+                timeout(CAPTURE_WAIT_TIMEOUT_MS).atLeast(expectResultCount))
+                        .onCaptureCompleted(
+                                eq(camera),
+                                isA(CaptureRequest.class),
+                                argThat(new IsCameraMetadataNotEmpty<CaptureResult>()));
+        // Should not receive any capture failed callbacks.
+        verify(mockListener, never())
+                        .onCaptureFailed(
+                                eq(camera),
+                                argThat(new IsCameraMetadataNotEmpty<CaptureRequest>()),
+                                isA(CaptureFailure.class));
+        // Should receive expected number of capture shutter calls
+        verify(mockListener,
+                atLeast(expectResultCount))
+                        .onCaptureStarted(
+                               eq(camera),
+                               isA(CaptureRequest.class),
+                               anyLong());
+
+    }
+
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
new file mode 100644
index 0000000..7091cac
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.os.Handler;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.Arrays;
+
+/**
+ * <p>Basic test for CameraManager class.</p>
+ */
+public class CameraManagerTest extends AndroidTestCase {
+    private static final String TAG = "CameraManagerTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+
+    private static final int NUM_CAMERA_REOPENS = 10;
+
+    private PackageManager mPackageManager;
+    private CameraManager mCameraManager;
+    private NoopCameraListener mListener;
+    private CameraTestThread mLooperThread;
+    private Handler mHandler;
+
+    @Override
+    public void setContext(Context context) {
+        super.setContext(context);
+        mCameraManager = (CameraManager)context.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager", mCameraManager);
+        mPackageManager = context.getPackageManager();
+        assertNotNull("Can't get package manager", mPackageManager);
+        mListener = new NoopCameraListener();
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mLooperThread = new CameraTestThread();
+        mHandler = mLooperThread.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        mLooperThread.close();
+        mHandler = null;
+
+        super.tearDown();
+    }
+
+    public void testCameraManagerGetDeviceIdList() throws Exception {
+
+        // Test: that the getCameraIdList method runs without exceptions.
+        String[] ids = mCameraManager.getCameraIdList();
+        if (VERBOSE) Log.v(TAG, "CameraManager ids: " + Arrays.toString(ids));
+
+        /**
+         * Test: that if there is at least one reported id, then the system must have
+         * the FEATURE_CAMERA_ANY feature.
+         */
+        assertTrue("System camera feature and camera id list don't match",
+                ids.length == 0 ||
+                mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY));
+
+        /**
+         * Test: that if the device has front or rear facing cameras, then there
+         * must be matched system features.
+         */
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull("Can't get camera characteristics for camera " + ids[i], props);
+            Integer lensFacing = props.get(CameraCharacteristics.LENS_FACING);
+            assertNotNull("Can't get lens facing info", lensFacing);
+            if (lensFacing == CameraCharacteristics.LENS_FACING_FRONT) {
+                assertTrue("System doesn't have front camera feature",
+                        mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT));
+            } else if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
+                assertTrue("System doesn't have back camera feature",
+                        mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA));
+            } else {
+                fail("Unknown camera lens facing " + lensFacing.toString());
+            }
+        }
+
+        /**
+         * Test: that if there is one camera device, then the system must have some
+         * specific features.
+         */
+        assertTrue("Missing system feature: FEATURE_CAMERA_ANY",
+               ids.length == 0
+            || mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY));
+        assertTrue("Missing system feature: FEATURE_CAMERA or FEATURE_CAMERA_FRONT",
+               ids.length == 0
+            || mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
+            || mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT));
+    }
+
+    // Test: that properties can be queried from each device, without exceptions.
+    public void testCameraManagerGetCameraCharacteristics() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+            assertNotNull(
+                    String.format("Can't get camera characteristics from: ID %s", ids[i]), props);
+        }
+    }
+
+    // Test: that an exception is thrown if an invalid device id is passed down.
+    public void testCameraManagerInvalidDevice() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        // Create an invalid id by concatenating all the valid ids together.
+        StringBuilder invalidId = new StringBuilder();
+        invalidId.append("INVALID");
+        for (int i = 0; i < ids.length; i++) {
+            invalidId.append(ids[i]);
+        }
+        try {
+            CameraCharacteristics props = mCameraManager.getCameraCharacteristics(
+                invalidId.toString());
+            fail(String.format("Accepted invalid camera ID: %s", invalidId.toString()));
+        }
+        catch (IllegalArgumentException e) {
+            // This is the exception that should be thrown in this case.
+        }
+    }
+
+    // Test: that each camera device can be opened one at a time, several times.
+    public void testCameraManagerOpenCamerasSerially() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        for (int i = 0; i < ids.length; i++) {
+            for (int j = 0; j < NUM_CAMERA_REOPENS; j++) {
+                CameraDevice camera = CameraTestUtils.openCamera(mCameraManager, ids[i], mHandler);
+                assertNotNull(
+                    String.format("Failed to open camera device ID: %s", ids[i]), camera);
+                camera.close();
+            }
+        }
+    }
+
+    /**
+     * Test: that all camera devices can be open at the same time, or the appropriate
+     * exception is thrown if this can't be done.
+     */
+    public void testCameraManagerOpenAllCameras() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        CameraDevice[] cameras = new CameraDevice[ids.length];
+        try {
+            for (int i = 0; i < ids.length; i++) {
+                try {
+                    cameras[i] = CameraTestUtils.openCamera(mCameraManager, ids[i], mHandler);
+
+                    /**
+                     * If the camera can't be opened, should throw an exception, rather than
+                     * returning null.
+                     */
+                    assertNotNull(
+                        String.format("Failed to open camera device ID: %s", ids[i]),
+                        cameras[i]);
+                }
+                catch (CameraAccessException e) {
+                    /**
+                     * This is the expected behavior if the camera can't be opened due to
+                     * limitations on how many devices can be open simultaneously.
+                     */
+                    assertEquals(
+                        String.format("Invalid exception reason: %s", e.getReason()),
+                        CameraAccessException.MAX_CAMERAS_IN_USE, e.getReason());
+                }
+            }
+        }
+        finally {
+            for (int i = 0; i < ids.length; i++) {
+                if (cameras[i] != null) {
+                    cameras[i].close();
+                }
+            }
+        }
+    }
+
+    // Test: that opening the same device multiple times throws the right exception.
+    public void testCameraManagerOpenCameraTwice() throws Exception {
+        String[] ids = mCameraManager.getCameraIdList();
+        CameraDevice[] cameras = new CameraDevice[2];
+        if (ids.length > 0) {
+            try {
+                cameras[0] = CameraTestUtils.openCamera(mCameraManager, ids[0], mHandler);
+                assertNotNull(
+                    String.format("Failed to open camera device ID: %s", ids[0]),
+                    cameras[0]);
+                try {
+                    cameras[1] = CameraTestUtils.openCamera(mCameraManager, ids[0], mHandler);
+                    fail(String.format("Opened the same camera device twice ID: %s",
+                        ids[0]));
+                }
+                catch (CameraAccessException e) {
+                    /**
+                     * This is the expected behavior if the camera device is attempted to
+                     * be opened more than once.
+                     */
+                    assertEquals(
+                        String.format("Invalid exception reason: %s", e.getReason()),
+                        CameraAccessException.CAMERA_IN_USE, e.getReason());
+                }
+            }
+            finally {
+                for (int i = 0; i < 2; i++) {
+                    if (cameras[i] != null) {
+                        cameras[i].close();
+                    }
+                }
+            }
+        }
+    }
+
+    private class NoopCameraListener extends CameraManager.AvailabilityListener {
+        @Override
+        public void onCameraAvailable(String cameraId) {
+            // No-op
+        }
+
+        @Override
+        public void onCameraUnavailable(String cameraId) {
+            // No-op
+        }
+    }
+
+    /**
+     * Test: that the APIs to register and unregister a listener run successfully;
+     * doesn't test that the listener actually gets invoked at the right time.
+     * Registering a listener multiple times should have no effect, and unregistering
+     * a listener that isn't registered should have no effect.
+     */
+    public void testCameraManagerListener() throws Exception {
+        CameraTestThread callbackThread = new CameraTestThread();
+        Handler callbackHandler = callbackThread.start();
+
+        mCameraManager.removeAvailabilityListener(mListener);
+        mCameraManager.addAvailabilityListener(mListener, callbackHandler);
+        mCameraManager.addAvailabilityListener(mListener, callbackHandler);
+        mCameraManager.removeAvailabilityListener(mListener);
+        mCameraManager.removeAvailabilityListener(mListener);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestThread.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestThread.java
new file mode 100644
index 0000000..9516ead
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestThread.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import android.os.ConditionVariable;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Camera test thread wrapper for handling camera callbacks
+ */
+public class CameraTestThread implements AutoCloseable {
+    private static final String TAG = "CameraTestThread";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    // Timeout for initializing looper and opening camera in Milliseconds.
+    private static final long WAIT_FOR_COMMAND_TO_COMPLETE = 5000;
+    private Looper mLooper = null;
+    private Handler mHandler = null;
+
+    /**
+     * Create and start a looper thread, return the Handler
+     */
+    public synchronized Handler start() throws Exception {
+        final ConditionVariable startDone = new ConditionVariable();
+        if (mLooper != null || mHandler !=null) {
+            Log.w(TAG, "Looper thread already started");
+            return mHandler;
+        }
+
+        new Thread() {
+            @Override
+            public void run() {
+                if (VERBOSE) Log.v(TAG, "start loopRun");
+                Looper.prepare();
+                // Save the looper so that we can terminate this thread
+                // after we are done with it.
+                mLooper = Looper.myLooper();
+                mHandler = new Handler();
+                startDone.open();
+                Looper.loop();
+                if (VERBOSE) Log.v(TAG, "createLooperThread: finished");
+            }
+        }.start();
+
+        if (VERBOSE) Log.v(TAG, "start waiting for looper");
+        if (!startDone.block(WAIT_FOR_COMMAND_TO_COMPLETE)) {
+            throw new TimeoutException("createLooperThread: start timeout");
+        }
+        return mHandler;
+    }
+
+    /**
+     * Terminate the looper thread
+     */
+    public synchronized void close() throws Exception {
+        if (mLooper == null || mHandler == null) {
+            Log.w(TAG, "Looper thread doesn't start yet");
+            return;
+        }
+
+        if (VERBOSE) Log.v(TAG, "Terminate looper thread");
+        mLooper.quit();
+        mLooper.getThread().join();
+        mLooper = null;
+        mHandler = null;
+    }
+
+    @Override
+    protected void finalize() throws Throwable {
+        try {
+            close();
+        } finally {
+            super.finalize();
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
new file mode 100644
index 0000000..7f10cb8
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.Size;
+import android.media.Image;
+import android.media.ImageReader;
+import android.media.Image.Plane;
+import android.os.Handler;
+import android.util.Log;
+
+import com.android.ex.camera2.blocking.BlockingCameraManager;
+import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
+
+import junit.framework.Assert;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+/**
+ * A package private utility class for wrapping up the camera2 cts test common utility functions
+ */
+class CameraTestUtils extends Assert {
+    private static final String TAG = "CameraTestUtils";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+
+    // Default timeouts for reaching various states
+    public static final int CAMERA_OPEN_TIMEOUT_MS = 500;
+    public static final int CAMERA_IDLE_TIMEOUT_MS = 2000;
+    public static final int CAMERA_ACTIVE_TIMEOUT_MS = 500;
+    public static final int CAMERA_BUSY_TIMEOUT_MS = 500;
+
+    public static class ImageDropperListener implements ImageReader.OnImageAvailableListener {
+        @Override
+        public void onImageAvailable(ImageReader reader) {
+            Image image = null;
+            try {
+                image = reader.acquireNextImage();
+            } finally {
+                if (image != null) {
+                    image.close();
+                }
+            }
+        }
+    }
+
+    /**
+     * Block until the camera is opened.
+     *
+     * <p>Don't use this to test #onDisconnected/#onError since this will throw
+     * an AssertionError if it fails to open the camera device.</p>
+     *
+     * @return CameraDevice opened camera device
+     * @throws BlockingOpenException
+     *
+     * @throws AssertionError if the camera fails to open (or times out)
+     */
+    public static CameraDevice openCamera(CameraManager manager, String cameraId,
+            CameraDevice.StateListener listener, Handler handler) throws CameraAccessException,
+            BlockingOpenException {
+
+        /**
+         * Although camera2 API allows 'null' Handler (it will just use the current
+         * thread's Looper), this is not what we want for CTS.
+         *
+         * In CTS the default looper is used only to process events in between test runs,
+         * so anything sent there would not be executed inside a test and the test would fail.
+         *
+         * In this case, BlockingCameraManager#openCamera performs the check for us.
+         */
+        return (new BlockingCameraManager(manager)).openCamera(cameraId, listener, handler);
+    }
+
+
+    /**
+     * Block until the camera is opened.
+     *
+     * <p>Don't use this to test #onDisconnected/#onError since this will throw
+     * an AssertionError if it fails to open the camera device.</p>
+     *
+     * @return CameraDevice opened camera device
+     *
+     * @throws AssertionError if the camera fails to open (or times out)
+     */
+    public static CameraDevice openCamera(CameraManager manager, String cameraId, Handler handler)
+            throws CameraAccessException,
+            BlockingOpenException {
+        return openCamera(manager, cameraId, /*listener*/null, handler);
+    }
+
+    public static <T> void assertArrayNotEmpty(T arr, String message) {
+        assertTrue(message, arr != null && Array.getLength(arr) > 0);
+    }
+
+    /**
+     * Check if the format is a legal YUV format camera supported.
+     */
+    public static void checkYuvFormat(int format) {
+        if ((format != ImageFormat.YUV_420_888) &&
+                (format != ImageFormat.NV21) &&
+                (format != ImageFormat.YV12) &&
+                (format != ImageFormat.Y8) &&
+                (format != ImageFormat.Y16)) {
+            fail("Wrong formats: " + format);
+        }
+    }
+
+    /**
+     * Check if image size and format match given size and format.
+     */
+    public static void checkImage(Image image, int width, int height, int format) {
+        assertNotNull("Input image is invalid", image);
+        assertEquals("Format doesn't match", format, image.getFormat());
+        assertEquals("Width doesn't match", width, image.getWidth());
+        assertEquals("Height doesn't match", height, image.getHeight());
+    }
+
+    /**
+     * <p>Read data from all planes of an Image into a contiguous unpadded, unpacked
+     * 1-D linear byte array, such that it can be write into disk, or accessed by
+     * software conveniently. It supports YUV_420_888/NV21/YV12 and JPEG input
+     * Image format.</p>
+     *
+     * <p>For YUV_420_888/NV21/YV12/Y8/Y16, it returns a byte array that contains
+     * the Y plane data first, followed by U(Cb), V(Cr) planes if there is any
+     * (xstride = width, ystride = height for chroma and luma components).</p>
+     *
+     * <p>For JPEG, it returns a 1-D byte array contains a complete JPEG image.</p>
+     */
+    public static byte[] getDataFromImage(Image image) {
+        assertNotNull("Invalid image:", image);
+        int format = image.getFormat();
+        int width = image.getWidth();
+        int height = image.getHeight();
+        int rowStride, pixelStride;
+        byte[] data = null;
+
+        // Read image data
+        Plane[] planes = image.getPlanes();
+        assertTrue("Fail to get image planes", planes != null && planes.length > 0);
+
+        // Check image validity
+        checkAndroidImageFormat(image);
+
+        ByteBuffer buffer = null;
+        // JPEG doesn't have pixelstride and rowstride, treat it as 1D buffer.
+        if (format == ImageFormat.JPEG) {
+            buffer = planes[0].getBuffer();
+            assertNotNull("Fail to get jpeg ByteBuffer", buffer);
+            data = new byte[buffer.capacity()];
+            buffer.get(data);
+            return data;
+        }
+
+        int offset = 0;
+        data = new byte[width * height * ImageFormat.getBitsPerPixel(format) / 8];
+        byte[] rowData = new byte[planes[0].getRowStride()];
+        if(VERBOSE) Log.v(TAG, "get data from " + planes.length + " planes");
+        for (int i = 0; i < planes.length; i++) {
+            buffer = planes[i].getBuffer();
+            assertNotNull("Fail to get bytebuffer from plane", buffer);
+            rowStride = planes[i].getRowStride();
+            assertTrue("rowStride should be no less than width", rowStride >= width);
+            pixelStride = planes[i].getPixelStride();
+            assertTrue("pixel stride " + pixelStride + " is invalid", pixelStride > 0);
+            if (VERBOSE) {
+                Log.v(TAG, "pixelStride " + pixelStride);
+                Log.v(TAG, "rowStride " + rowStride);
+                Log.v(TAG, "width " + width);
+                Log.v(TAG, "height " + height);
+            }
+            // For multi-planar yuv images, assuming yuv420 with 2x2 chroma subsampling.
+            int w = (i == 0) ? width : width / 2;
+            int h = (i == 0) ? height : height / 2;
+            assertTrue("rowStride " + rowStride + " should be >= width " + w , rowStride >= w);
+            for (int row = 0; row < h; row++) {
+                int bytesPerPixel = ImageFormat.getBitsPerPixel(format) / 8;
+                if (pixelStride == bytesPerPixel) {
+                    // Special case: optimized read of the entire row
+                    int length = w * bytesPerPixel;
+                    buffer.get(data, offset, length);
+                    // Advance buffer the remainder of the row stride
+                    buffer.position(buffer.position() + rowStride - length);
+                    offset += length;
+                } else {
+                    // Generic case: should work for any pixelStride but slower.
+                    // Use intermediate buffer to avoid read byte-by-byte from
+                    // DirectByteBuffer, which is very bad for performance
+                    buffer.get(rowData, 0, rowStride);
+                    for (int col = 0; col < w; col++) {
+                        data[offset++] = rowData[col * pixelStride];
+                    }
+                }
+            }
+            if (VERBOSE) Log.v(TAG, "Finished reading data from plane " + i);
+        }
+        return data;
+    }
+
+    /**
+     * <p>Check android image format validity for an image, only support below formats:</p>
+     *
+     * <p>YUV_420_888/NV21/YV12/Y8/Y16, can add more for future</p>
+     */
+    public static void checkAndroidImageFormat(Image image) {
+        int format = image.getFormat();
+        Plane[] planes = image.getPlanes();
+        switch (format) {
+            case ImageFormat.YUV_420_888:
+            case ImageFormat.NV21:
+            case ImageFormat.YV12:
+                assertEquals("YUV420 format Images should have 3 planes", 3, planes.length);
+                break;
+            case ImageFormat.Y8:
+            case ImageFormat.Y16:
+                assertEquals("Y8/Y16 Image should have 1 plane", 1, planes.length);
+                break;
+            case ImageFormat.JPEG:
+                assertEquals("Jpeg Image should have one plane", 1, planes.length);
+                break;
+            default:
+                fail("Unsupported Image Format: " + format);
+        }
+    }
+
+    public static void dumpFile(String fileName, byte[] data) {
+        FileOutputStream outStream;
+        try {
+            Log.v(TAG, "output will be saved as " + fileName);
+            outStream = new FileOutputStream(fileName);
+        } catch (IOException ioe) {
+            throw new RuntimeException("Unable to create debug output file " + fileName, ioe);
+        }
+
+        try {
+            outStream.write(data);
+            outStream.close();
+        } catch (IOException ioe) {
+            throw new RuntimeException("failed writing data to file " + fileName, ioe);
+        }
+    }
+
+    public static Size[] getSupportedSizeForFormat(int format, String cameraId,
+            CameraManager cameraManager) throws Exception {
+        CameraMetadata.Key<Size[]> key = null;
+        CameraCharacteristics properties = cameraManager.getCameraCharacteristics(cameraId);
+        assertNotNull("Can't get camera characteristics!", properties);
+        if (VERBOSE) {
+            Log.v(TAG, "get camera characteristics for camera: " + cameraId);
+        }
+        switch (format) {
+            case ImageFormat.JPEG:
+                key = CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES;
+                break;
+            case ImageFormat.YUV_420_888:
+            case ImageFormat.YV12:
+            case ImageFormat.NV21:
+            case ImageFormat.Y8:
+            case ImageFormat.Y16:
+                key = CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES;
+                break;
+            default:
+                throw new UnsupportedOperationException(
+                        String.format("Invalid format specified 0x%x", format));
+        }
+        Size[] availableSizes = properties.get(key);
+        if (VERBOSE) Log.v(TAG, "Supported sizes are: " + Arrays.deepToString(availableSizes));
+        return availableSizes;
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
new file mode 100644
index 0000000..28cb13e
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2013 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 android.hardware.camera2.cts;
+
+import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+
+import android.content.Context;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.Size;
+import android.media.Image;
+import android.media.ImageReader;
+import android.os.Environment;
+import android.os.Handler;
+import android.test.AndroidTestCase;
+import android.util.Log;
+import android.view.Surface;
+
+import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
+import com.android.ex.camera2.blocking.BlockingStateListener;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * <p>Basic test for ImageReader APIs. It uses CameraDevice as producer, camera
+ * sends the data to the surface provided by imageReader. Below image formats
+ * are tested:</p>
+ *
+ * <p>YUV_420_888: flexible YUV420, it is mandatory format for camera. </p>
+ * <p>JPEG: used for JPEG still capture, also mandatory format. </p>
+ * <p>Some invalid access test. </p>
+ * <p>TODO: Add more format tests? </p>
+ */
+public class ImageReaderTest extends AndroidTestCase {
+    private static final String TAG = "ImageReaderTest";
+    private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE);
+    private static final boolean DUMP_FILE = false;
+    private static final String DEBUG_FILE_NAME_BASE =
+            Environment.getExternalStorageDirectory().getPath();
+    // number of frame (for streaming requests) to be verified.
+    // TODO: Need extend it to bigger number
+    private static final int NUM_FRAME_VERIFIED = 1;
+    // Max number of images can be accessed simultaneously from ImageReader.
+    private static final int MAX_NUM_IMAGES = 5;
+
+    private CameraManager mCameraManager;
+    private CameraDevice mCamera;
+    private BlockingStateListener mCameraListener;
+    private String[] mCameraIds;
+    private ImageReader mReader = null;
+    private Handler mHandler = null;
+    private SimpleImageListener mListener = null;
+    private CameraTestThread mLooperThread = null;
+
+    @Override
+    public void setContext(Context context) {
+        super.setContext(context);
+        mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
+        assertNotNull("Can't connect to camera manager!", mCameraManager);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCameraIds = mCameraManager.getCameraIdList();
+        mLooperThread = new CameraTestThread();
+        mHandler = mLooperThread.start();
+        mCameraListener = new BlockingStateListener();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mCamera != null) {
+            mCamera.close();
+            mCamera = null;
+        }
+        if (mReader != null) {
+            mReader.close();
+            mReader = null;
+        }
+        mLooperThread.close();
+        mHandler = null;
+        super.tearDown();
+    }
+
+    public void testImageReaderFromCameraFlexibleYuv() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            Log.i(TAG, "Testing Camera " + mCameraIds[i]);
+            openDevice(mCameraIds[i]);
+            bufferFormatTestByCamera(ImageFormat.YUV_420_888, mCameraIds[i]);
+            closeDevice(mCameraIds[i]);
+        }
+    }
+
+    public void testImageReaderFromCameraJpeg() throws Exception {
+        for (int i = 0; i < mCameraIds.length; i++) {
+            Log.v(TAG, "Testing Camera " + mCameraIds[i]);
+            openDevice(mCameraIds[i]);
+            bufferFormatTestByCamera(ImageFormat.JPEG, mCameraIds[i]);
+            closeDevice(mCameraIds[i]);
+        }
+    }
+
+    public void testImageReaderFromCameraRaw() {
+        // TODO: can test this once raw is supported
+    }
+
+    public void testImageReaderInvalidAccessTest() {
+        // TODO: test invalid access case, see if we can receive expected
+        // exceptions
+    }
+
+    private void bufferFormatTestByCamera(int format, String cameraId) throws Exception {
+        CameraCharacteristics properties = mCameraManager.getCameraCharacteristics(cameraId);
+        assertNotNull("Can't get camera properties!", properties);
+
+        /**
+         * TODO: cleanup the color format mess, we probably need define formats
+         * in Image class instead of using ImageFormat for camera. also,
+         * probably make sense to change the available format type from Enum[]
+         * to int[]. It'll also be nice to put this into a helper function and
+         * move to util class.
+         */
+        int[] availableFormats = properties.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS);
+        assertArrayNotEmpty(availableFormats,
+                "availableFormats should not be empty");
+        Arrays.sort(availableFormats);
+        assertTrue("Can't find the format " + format + " in supported formats " +
+                Arrays.toString(availableFormats),
+                Arrays.binarySearch(availableFormats, format) >= 0);
+
+        Size[] availableSizes = getSupportedSizeForFormat(format, mCamera.getId(), mCameraManager);
+        assertArrayNotEmpty(availableSizes, "availableSizes should not be empty");
+
+        // for each resolution, test imageReader:
+        for (Size sz : availableSizes) {
+            if (VERBOSE) Log.v(TAG, "Testing size " + sz.toString() + " for camera " + cameraId);
+
+            prepareImageReader(sz, format);
+
+            CaptureRequest request = prepareCaptureRequest(format);
+
+            captureAndValidateImage(request, sz, format);
+
+            stopCapture();
+        }
+    }
+
+    private class SimpleImageListener implements ImageReader.OnImageAvailableListener {
+        private int mPendingImages = 0;
+        private final Object mImageSyncObject = new Object();
+
+        @Override
+        public void onImageAvailable(ImageReader reader) {
+            if (VERBOSE) Log.v(TAG, "new image available");
+            synchronized (mImageSyncObject) {
+                mPendingImages++;
+                mImageSyncObject.notifyAll();
+            }
+        }
+
+        public boolean isImagePending() {
+            synchronized (mImageSyncObject) {
+                return (mPendingImages > 0);
+            }
+        }
+
+        public void waitForImage() {
+            final int TIMEOUT_MS = 5000;
+            synchronized (mImageSyncObject) {
+                while (mPendingImages == 0) {
+                    try {
+                        if (VERBOSE)
+                            Log.d(TAG, "waiting for next image");
+                        mImageSyncObject.wait(TIMEOUT_MS);
+                        if (mPendingImages == 0) {
+                            fail("wait for next image timed out");
+                        }
+                    } catch (InterruptedException ie) {
+                        throw new RuntimeException(ie);
+                    }
+                }
+                mPendingImages--;
+            }
+        }
+    }
+
+    private void prepareImageReader(Size sz, int format) throws Exception {
+        int width = sz.getWidth();
+        int height = sz.getHeight();
+        mReader = ImageReader.newInstance(width, height, format, MAX_NUM_IMAGES);
+        mListener  = new SimpleImageListener();
+        mReader.setOnImageAvailableListener(mListener, mHandler);
+        if (VERBOSE) Log.v(TAG, "Preparing ImageReader size " + sz.toString());
+    }
+
+    private CaptureRequest prepareCaptureRequest(int format) throws Exception {
+        List<Surface> outputSurfaces = new ArrayList<Surface>(1);
+        Surface surface = mReader.getSurface();
+        assertNotNull("Fail to get surface from ImageReader", surface);
+        outputSurfaces.add(surface);
+        mCamera.configureOutputs(outputSurfaces);
+        mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        mCameraListener.waitForState(STATE_IDLE, CAMERA_IDLE_TIMEOUT_MS);
+
+        CaptureRequest.Builder captureBuilder =
+                mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+        assertNotNull("Fail to get captureRequest", captureBuilder);
+        captureBuilder.addTarget(mReader.getSurface());
+
+        return captureBuilder.build();
+    }
+
+    private void captureAndValidateImage(CaptureRequest request,
+            Size sz, int format) throws Exception {
+        // TODO: Add more format here, and wrap each one as a function.
+        Image img;
+        int captureCount = NUM_FRAME_VERIFIED;
+
+        // Only verify single image for still capture
+        if (format == ImageFormat.JPEG) {
+            captureCount = 1;
+            mCamera.capture(request, null, null);
+        } else {
+            mCamera.setRepeatingRequest(request, null, null);
+        }
+
+        for (int i = 0; i < captureCount; i++) {
+            assertNotNull("Image listener is null", mListener);
+            if (VERBOSE) Log.v(TAG, "Waiting for an Image");
+            mListener.waitForImage();
+            img = mReader.acquireNextImage();
+            if (VERBOSE) Log.v(TAG, "Got next image");
+            validateImage(img, sz.getWidth(), sz.getHeight(), format);
+            img.close();
+            // Return the pending images to producer in case the validation is slower
+            // than the image producing rate. Otherwise, it could cause the producer
+            // starvation.
+            while (mListener.isImagePending()) {
+                mListener.waitForImage();
+                img = mReader.acquireNextImage();
+                img.close();
+            }
+        }
+    }
+
+    private void stopCapture() throws CameraAccessException {
+        if (VERBOSE) Log.v(TAG, "Stopping capture and waiting for idle");
+        // Stop repeat, wait for captures to complete, and disconnect from surfaces
+        mCamera.configureOutputs(/*outputs*/ null);
+        mCameraListener.waitForState(STATE_BUSY, CAMERA_BUSY_TIMEOUT_MS);
+        mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_IDLE_TIMEOUT_MS);
+        // Camera has disconnected, clear out the reader
+        mReader.close();
+        mReader = null;
+        mListener = null;
+    }
+
+    private void openDevice(String cameraId) {
+        if (mCamera != null) {
+            throw new IllegalStateException("Already have open camera device");
+        }
+        try {
+            mCamera = CameraTestUtils.openCamera(
+                mCameraManager, cameraId, mCameraListener, mHandler);
+        } catch (CameraAccessException e) {
+            mCamera = null;
+            fail("Fail to open camera, " + Log.getStackTraceString(e));
+        } catch (BlockingOpenException e) {
+            mCamera = null;
+            fail("Fail to open camera, " + Log.getStackTraceString(e));
+        }
+        mCameraListener.waitForState(STATE_UNCONFIGURED, CAMERA_OPEN_TIMEOUT_MS);
+    }
+
+    private void closeDevice(String cameraId) {
+        mCamera.close();
+        mCamera = null;
+    }
+
+    private void validateImage(Image image, int width, int height, int format) {
+        checkImage(image, width, height, format);
+
+        /**
+         * TODO: validate timestamp:
+         * 1. capture result timestamp against the image timestamp (need
+         * consider frame drops)
+         * 2. timestamps should be monotonically increasing for different requests
+         */
+        if(VERBOSE) Log.v(TAG, "validating Image");
+        byte[] data = getDataFromImage(image);
+        assertTrue("Invalid image data", data != null && data.length > 0);
+
+        if (format == ImageFormat.JPEG) {
+            validateJpegData(data, width, height);
+        } else {
+            validateYuvData(data, width, height, format, image.getTimestamp());
+        }
+    }
+
+    private void validateJpegData(byte[] jpegData, int width, int height) {
+        BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
+        // DecodeBound mode: only parse the frame header to get width/height.
+        // it doesn't decode the pixel.
+        bmpOptions.inJustDecodeBounds = true;
+        BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length, bmpOptions);
+        assertEquals(width, bmpOptions.outWidth);
+        assertEquals(height, bmpOptions.outHeight);
+
+        // Pixel decoding mode: decode whole image. check if the image data
+        // is decodable here.
+        assertNotNull("Decoding jpeg failed",
+                BitmapFactory.decodeByteArray(jpegData, 0, jpegData.length));
+        if (DUMP_FILE) {
+            String fileName =
+                    DEBUG_FILE_NAME_BASE + width + "x" + height + ".yuv";
+            dumpFile(fileName, jpegData);
+        }
+    }
+
+    private void validateYuvData(byte[] yuvData, int width, int height, int format, long ts) {
+        checkYuvFormat(format);
+        if (VERBOSE) Log.v(TAG, "Validating YUV data");
+        int expectedSize = width * height * ImageFormat.getBitsPerPixel(format) / 8;
+        assertEquals("Yuv data doesn't match", expectedSize, yuvData.length);
+
+        // TODO: Can add data validation if we have test pattern(tracked by b/9625427)
+
+        if (DUMP_FILE) {
+            String fileName =
+                    DEBUG_FILE_NAME_BASE + "/" + width + "x" + height + "_" + ts / 1e6 + ".yuv";
+            dumpFile(fileName, yuvData);
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java b/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java
new file mode 100644
index 0000000..e06adac
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/consumerir/cts/ConsumerIrTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.consumerir.cts;
+
+import android.content.Context;
+import android.hardware.ConsumerIrManager;
+import android.util.Log;
+import android.content.pm.PackageManager;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import java.io.IOException;
+
+/**
+ * Very basic test, just of the static methods of {@link
+ * android.hardware.ConsumerIrManager}.
+ */
+public class ConsumerIrTest extends AndroidTestCase {
+    private boolean mHasConsumerIr;
+    private ConsumerIrManager mCIR;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mHasConsumerIr = getContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_CONSUMER_IR);
+        if (mHasConsumerIr) {
+            mCIR = (ConsumerIrManager)getContext().getSystemService(
+                    Context.CONSUMER_IR_SERVICE);
+        }
+    }
+
+    public void test_hasIrEmitter() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+        assertTrue(mCIR.hasIrEmitter());
+    }
+
+    public void test_getCarrierFrequencies() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+
+        ConsumerIrManager.CarrierFrequencyRange[] freqs = mCIR.getCarrierFrequencies();
+
+        assertTrue(freqs.length > 0);
+        for (ConsumerIrManager.CarrierFrequencyRange range : freqs) {
+            // Each range must be valid
+            assertTrue(range.getMinFrequency() > 0);
+            assertTrue(range.getMaxFrequency() > 0);
+            assertTrue(range.getMinFrequency() <= range.getMaxFrequency());
+        }
+    }
+
+    public void test_timing() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+
+        ConsumerIrManager.CarrierFrequencyRange[] freqs = mCIR.getCarrierFrequencies();
+        // Transmit two seconds for min and max for each frequency range
+        int[] pattern = {11111, 22222, 33333, 44444, 55555, 66666, 77777, 88888, 99999};
+        long totalXmitTimeNanos = 0; // get the length of the pattern
+        for (int slice : pattern) {
+            totalXmitTimeNanos += slice * 1000; // add the time in nanoseconds
+        }
+        double margin = 0.5; // max fraction xmit is allowed to be off timing
+
+        for (ConsumerIrManager.CarrierFrequencyRange range : freqs) {
+            // test min freq
+            long currentTime = SystemClock.elapsedRealtimeNanos();
+            mCIR.transmit(range.getMinFrequency(), pattern);
+            long newTime = SystemClock.elapsedRealtimeNanos();
+            String msg = String.format("Pattern length pattern:%d, actual:%d",
+                    totalXmitTimeNanos, newTime - currentTime);
+            assertTrue(msg, newTime - currentTime >= totalXmitTimeNanos * (1.0 - margin));
+            assertTrue(msg, newTime - currentTime <= totalXmitTimeNanos * (1.0 + margin));
+
+            // test max freq
+            currentTime = SystemClock.elapsedRealtimeNanos();
+            mCIR.transmit(range.getMaxFrequency(), pattern);
+            newTime = SystemClock.elapsedRealtimeNanos();
+            msg = String.format("Pattern length pattern:%d, actual:%d",
+                    totalXmitTimeNanos, newTime - currentTime);
+            assertTrue(msg, newTime - currentTime >= totalXmitTimeNanos * (1.0 - margin));
+            assertTrue(msg, newTime - currentTime <= totalXmitTimeNanos * (1.0 + margin));
+        }
+    }
+
+    public void test_transmit() {
+        if (!mHasConsumerIr) {
+            // Skip the test if consumer IR is not present.
+            return;
+        }
+
+        ConsumerIrManager.CarrierFrequencyRange[] freqs = mCIR.getCarrierFrequencies();
+
+        int[] pattern = {1901, 4453, 625, 1614, 625, 1588, 625, 1614, 625, 442, 625, 442, 625,
+            468, 625, 442, 625, 494, 572, 1614, 625, 1588, 625, 1614, 625, 494, 572, 442, 651,
+            442, 625, 442, 625, 442, 625, 1614, 625, 1588, 651, 1588, 625, 442, 625, 494, 598,
+            442, 625, 442, 625, 520, 572, 442, 625, 442, 625, 442, 651, 1588, 625, 1614, 625,
+            1588, 625, 1614, 625, 1588, 625, 48958};
+
+        // just use the first frequency in the range
+        mCIR.transmit(freqs[0].getMinFrequency(), pattern);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
index 9d7dacb..c1809b8 100644
--- a/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraGLTest.java
@@ -17,7 +17,6 @@
 package android.hardware.cts;
 
 import android.content.Context;
-import android.cts.util.TimeoutReq;
 import android.graphics.SurfaceTexture;
 import android.hardware.Camera;
 import android.hardware.Camera.Parameters;
@@ -40,6 +39,7 @@
 import android.test.suitebuilder.annotation.LargeTest;
 import android.util.Log;
 
+import com.android.cts.util.TimeoutReq;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -70,8 +70,8 @@
 
     private boolean mSurfaceTextureCallbackResult = false;
 
-    private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 1500;  // Milliseconds.
-    private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 3000;
+    private static final int WAIT_FOR_COMMAND_TO_COMPLETE = 5000;  // Milliseconds.
+    private static final int WAIT_FOR_FOCUS_TO_COMPLETE = 5000;
     private static final int WAIT_FOR_SNAPSHOT_TO_COMPLETE = 5000;
 
     private SurfaceTextureCallback mSurfaceTextureCallback = new SurfaceTextureCallback();
diff --git a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
old mode 100755
new mode 100644
index 31a72cf..f877d8b
--- a/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/CameraTest.java
@@ -774,6 +774,7 @@
         assertTrue(sizes.size() >= 2);
         assertTrue(sizes.contains(size));
         assertTrue(sizes.contains(mCamera.new Size(0, 0)));
+        Size pictureSize = p.getPictureSize();
 
         // Test if the thumbnail size matches the setting.
         if (!recording) mCamera.startPreview();
diff --git a/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java b/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java
new file mode 100644
index 0000000..7c711a2
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.test.AndroidTestCase;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Scanner;
+import java.util.StringTokenizer;
+
+/**
+ * Tests that devices with low RAM specify themselves as Low RAM devices
+ */
+public class LowRamDeviceTest extends AndroidTestCase {
+
+    private static final int LOW_RAM_DEVICE_MEMORY_THRESHOLD_KB = 512 * 1024;
+
+    public void testLowRamProductProperty() throws Exception {
+        ActivityManager am =
+                (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
+
+        if (totalAvailableSystemMemory() <= LOW_RAM_DEVICE_MEMORY_THRESHOLD_KB) {
+            assertTrue("Device must specify low RAM property: ro.config.low_ram=true",
+                    am.isLowRamDevice());
+        }
+    }
+
+    /**
+     * Returns the total amount of memory in kilobytes available to the system.
+     */
+    private int totalAvailableSystemMemory() throws IOException {
+        final String property = "MemTotal";
+        InputStream is = new FileInputStream("/proc/meminfo");
+        try {
+            Scanner scanner = new Scanner(is);
+            while (scanner.hasNextLine()) {
+                String line = scanner.nextLine();
+                if (line.startsWith(property)) {
+                    StringTokenizer tokenizer = new StringTokenizer(line);
+                    if (tokenizer.countTokens() != 3) {
+                        throw new IOException("Malformed " + property + " line");
+                    }
+
+                    // Skips over "MemTotal:"
+                    tokenizer.nextToken();
+
+                    return Integer.parseInt(tokenizer.nextToken());
+                }
+            }
+            throw new IOException(property + " could not be found");
+
+        } finally {
+            is.close();
+        }
+    }
+
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorEventOrderingTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorEventOrderingTests.java
new file mode 100644
index 0000000..116ac80
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorEventOrderingTests.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+
+import android.hardware.cts.helpers.SensorTestCase;
+
+import android.hardware.cts.helpers.sensorTestOperations.VerifyEventOrderingOperation;
+
+/**
+ * Verifies the proper ordering in time of sensor events.
+ */
+public class SensorEventOrderingTests extends SensorTestCase {
+    /**
+     * Builder for the test suite.
+     * This is the method that will build dynamically the set of test cases to execute.
+     * Each 'base' test case is composed by three parts:
+     * - the matrix definition
+     * - the test method that will execute the test case
+     * - a static method that will combine both and add test case instances to the test suite
+     */
+    public static Test suite() {
+        TestSuite testSuite = new TestSuite();
+
+        // add test generation routines
+        createEventOrderingTestCases(testSuite);
+
+        return testSuite;
+    }
+
+    /**
+     * Event ordering test cases.
+     */
+    private int mSensorType;
+    private int mSamplingRateInUs;
+    private int mReportLatencyInUs;
+
+    private static void createEventOrderingTestCases(TestSuite testSuite) {
+        int testDefinitionMatrix[][] = {
+                // { SensorType, SamplingRateInUs, ReportLatencyInUs },
+                { Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_MAGNETIC_FIELD, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_PRESSURE, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_GRAVITY, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_LINEAR_ACCELERATION, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_RELATIVE_HUMIDITY, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_AMBIENT_TEMPERATURE, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_GAME_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_GYROSCOPE_UNCALIBRATED, SensorManager.SENSOR_DELAY_FASTEST, 0 },
+                { Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR, SensorManager.SENSOR_DELAY_FASTEST,0 },
+        };
+
+        for(int definition[] : testDefinitionMatrix) {
+            SensorEventOrderingTests test = new SensorEventOrderingTests();
+            test.mSensorType = definition[0];
+            test.mSamplingRateInUs = definition[1];
+            test.mReportLatencyInUs = definition[2];
+            test.setName("testEventOrdering");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies the ordering of the sampled data reported by the Sensor under test.
+     * This test is used to guarantee that sensor data is reported in the order it occurs, and that
+     * events are always reported in order.
+     *
+     * The test takes a set of samples from the Sensor under test, and then it verifies that each
+     * event's timestamp is in the future compared with the previous event. At the end of the
+     * validation, the full set of events is verified to be ordered by timestamp as they are
+     * generated.
+     *
+     * The test can be susceptible to errors if the sensor sampled data is not timestamped at the
+     * Hardware level. Or events sampled at high rates are added to the FIFO without controlling the
+     * appropriate ordering of the events.
+     *
+     * The assertion associated with the test provides the information of the two consecutive events
+     * that cause the test to fail.
+     */
+    public void testEventOrdering() throws Throwable {
+        VerifyEventOrderingOperation operation = new VerifyEventOrderingOperation(
+                this.getContext(),
+                mSensorType,
+                mSamplingRateInUs,
+                mReportLatencyInUs);
+        operation.execute();
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorFrequencyTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorFrequencyTests.java
new file mode 100644
index 0000000..b35f515
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorFrequencyTests.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import android.hardware.Sensor;
+
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorTestCase;
+
+import android.hardware.cts.helpers.sensorTestOperations.VerifyJitteringOperation;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyMaximumFrequencyOperation;
+
+/**
+ * Verifies several properties of the sampling rate of the different sensors in the platform.
+ */
+public class SensorFrequencyTests extends SensorTestCase {
+    private int mSensorType;
+    private int mReportLatencyInUs;
+    private int mThresholdPercentageOfNs;
+
+    /**
+     * Builder for the test suite.
+     * This is the method that will build dynamically the set of test cases to execute.
+     * Each 'base' test case is composed by three parts:
+     * - the matrix definition
+     * - the test method that will execute the test case
+     * - a static method that will combine both and add test case instances to the test suite
+     */
+    public static Test suite() {
+        TestSuite testSuite = new TestSuite();
+
+        // add test generation routines
+        createMaxFrequencyExpectedTestCases(testSuite);
+        // TODO: tests are a unreliable in the lab
+        //createMaxFrequencyTestCases(testSuite);
+        //createJitteringTestCases(testSuite);
+
+        return testSuite;
+    }
+
+    /**
+     * Max frequency test cases.
+     */
+    private static void createMaxFrequencyTestCases(TestSuite testSuite) {
+        int testDefinitionMatrix[][] = {
+                // { SensorType, ReportLatencyInUs, ThresholdPercentageOfNs },
+                { Sensor.TYPE_ACCELEROMETER, 0, 10 },
+                { Sensor.TYPE_GYROSCOPE, 0, 10 },
+                { Sensor.TYPE_MAGNETIC_FIELD, 0, 10 },
+        };
+
+        for(int definition[] : testDefinitionMatrix) {
+            SensorFrequencyTests test = new SensorFrequencyTests();
+            test.mSensorType = definition[0];
+            test.mReportLatencyInUs = definition[1];
+            test.mThresholdPercentageOfNs = definition[2];
+            test.setName("testMaxFrequency");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies that the Sensor under test can sample and report data at the Maximum
+     * frequency (sampling rate) it advertises.
+     *
+     * The test takes a set of samples from the sensor under test, and calculates the mean of the
+     * frequency at which the events are reported. The frequency between events is calculated by
+     * looking at the delta between the timestamps associated with each event.
+     *
+     * The test is susceptible to errors if the Sensor is not capable to sample data at the maximum
+     * rate it supports, or the sensor events are not timestamped at the Hardware level.
+     *
+     * The assertion associated with the test provides the required data to identify:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the expected frequency
+     * - the observed frequency
+     * In addition to that, the device's debug output (adb logcat) dumps the set of timestamp deltas
+     * associated with the set of data gathered from the Sensor under test.
+     */
+    public void testMaxFrequency() throws Throwable {
+        VerifyMaximumFrequencyOperation operation = new VerifyMaximumFrequencyOperation(
+                this.getContext(),
+                mSensorType,
+                mReportLatencyInUs,
+                mThresholdPercentageOfNs);
+        operation.execute();
+    }
+
+    /**
+     * Jittering test cases.
+     */
+    private static void createJitteringTestCases(TestSuite testSuite) {
+        int testDefinitionMatrix[][] = {
+                // { SensorType, ReportLatencyInUs, ThresholdPercentageOfNs },
+                { Sensor.TYPE_ACCELEROMETER, 0, 10 },
+                { Sensor.TYPE_GYROSCOPE, 0, 10 },
+                { Sensor.TYPE_MAGNETIC_FIELD, 0, 10 },
+        };
+
+        for(int definition[] : testDefinitionMatrix) {
+            SensorFrequencyTests test = new SensorFrequencyTests();
+            test.mSensorType = definition[0];
+            test.mReportLatencyInUs = definition[1];
+            test.mThresholdPercentageOfNs = definition[2];
+            test.setName("testJittering");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies that the event jittering associated with the sampled data reported by the
+     * Sensor under test, aligns with the requirements imposed in the CDD.
+     * This test characterizes how the sensor behaves while sampling data at a specific rate.
+     *
+     * The test takes a set of samples from the sensor under test, using the maximum sampling rate
+     * advertised by the Sensor under test. It then compares the 95%ile associated with the
+     * jittering of the timestamps, with an expected value.
+     *
+     * The test is susceptible to errors if the sensor events are not timestamped at the Hardware
+     * level.
+     *
+     * The assertion associated with the failure provides the following information:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the expectation of the test with respect of the 95%ile
+     * - the calculated 95%ile jittering
+     * Additionally, the device's debug output (adb logcat) dumps the set of jitter values
+     * calculated.
+     */
+    public void testJittering() throws Throwable {
+        VerifyJitteringOperation operation = new VerifyJitteringOperation(
+                this.getContext(),
+                mSensorType,
+                mReportLatencyInUs,
+                mThresholdPercentageOfNs);
+        operation.execute();
+    }
+
+    /**
+     * Max Frequency expected Test Cases.
+     */
+    private int mExpectedSamplingRateInUs;
+
+    private static void createMaxFrequencyExpectedTestCases(TestSuite testSuite) {
+        int testDefinitionMatrix[][] = {
+                // { SensorType, ExpectedSamplingRateInUs },
+                { Sensor.TYPE_ACCELEROMETER, 10000 /* 100 Hz */ },
+                { Sensor.TYPE_GYROSCOPE, 10000 /* 100 Hz */ },
+                { Sensor.TYPE_MAGNETIC_FIELD, 100000 /* 10 Hz */ },
+        };
+
+        for(int definition[] : testDefinitionMatrix) {
+            SensorFrequencyTests test = new SensorFrequencyTests();
+            test.mSensorType = definition[0];
+            test.mExpectedSamplingRateInUs = definition[1];
+            test.setName("testMaxFrequencyExpected");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies that the sensor's maximum advertised frequency (sampling rate) complies
+     * with the required frequency set in the CDD.
+     * This characterizes that the sensor is able to provide data at the rate the platform requires
+     * it.
+     *
+     * The test simply compares the sampling rate specified in the CDD with the maximum sampling
+     * rate advertised by the Sensor under test.
+     *
+     * The test can fail if the Sensor Hardware does not support the sampling rate required by the
+     * platform.
+     *
+     * The assertion associated with the test failure contains:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the expected maximum sampling rate
+     * - the observed maximum sampling rate
+     */
+    public void testMaxFrequencyExpected() {
+        Sensor sensor = SensorCtsHelper.getSensor(this.getContext(), mSensorType);
+        int samplingRateInUs = sensor.getMinDelay();
+        String message = String.format(
+                "samplingRateInUs| expected:%d, actual:%d",
+                mExpectedSamplingRateInUs,
+                samplingRateInUs);
+        assertTrue(message, mExpectedSamplingRateInUs >= samplingRateInUs);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
new file mode 100644
index 0000000..a1aa760
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorIntegrationTests.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import android.content.Context;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorTestCase;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+
+import android.hardware.cts.helpers.sensorTestOperations.ParallelCompositeSensorTestOperation;
+import android.hardware.cts.helpers.sensorTestOperations.RepeatingSensorTestOperation;
+import android.hardware.cts.helpers.sensorTestOperations.SequentialCompositeSensorTestOperation;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyEventOrderingOperation;
+
+import java.util.Random;
+
+/**
+ * Set of tests that verifies proper interaction of the sensors in the platform.
+ *
+ * To execute these test cases, the following command can be used:
+ *      $ adb shell am instrument -e class android.hardware.cts.SensorIntegrationTests \
+ *          -w com.android.cts.hardware/android.test.InstrumentationCtsTestRunner
+ */
+public class SensorIntegrationTests extends SensorTestCase {
+    /**
+     * Builder for the test suite.
+     * This is the method that will build dynamically the set of test cases to execute.
+     * Each 'base' test case is composed by three parts:
+     * - the matrix definition
+     * - the test method that will execute the test case
+     * - a static method that will combine both and add test case instances to the test suite
+     */
+    public static Test suite() {
+        TestSuite testSuite = new TestSuite();
+
+        // add test generation routines
+        addTestToSuite(testSuite, "testSensorsWithSeveralClients");
+        addTestToSuite(testSuite, "testSensorsMovingRates");
+        createStoppingTestCases(testSuite);
+
+        return testSuite;
+    }
+
+    /**
+     * This test focuses in the interaction of continuous and batching clients for the same Sensor
+     * under test. The verification ensures that sensor clients can interact with the System and
+     * not affect other clients in the way.
+     *
+     * The test verifies for each client that the a set of sampled data arrives in order. However
+     * each client in the test has different set of parameters that represent different types of
+     * clients in the real world.
+     *
+     * A test failure might indicate that the HAL implementation does not respect the assumption
+     * that the sensors must be independent. Activating one sensor should not cause another sensor
+     * to deactivate or to change behavior.
+     * It is however, acceptable that when a client is activated at a higher sampling rate, it would
+     * cause other clients to receive data at a faster sampling rate. A client causing other clients
+     * to receive data at a lower sampling rate is, however, not acceptable.
+     *
+     * The assertion associated with the test failure provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the event that caused the issue
+     * It is important to look at the internals of the Sensor HAL to identify how the interaction
+     * of several clients can lead to the failing state.
+     */
+    public void testSensorsWithSeveralClients() throws Throwable {
+        final int ITERATIONS = 50;
+        final int BATCHING_RATE_IN_SECONDS = 5;
+        final Context context = this.getContext();
+
+        int sensorTypes[] = {
+                Sensor.TYPE_ACCELEROMETER,
+                Sensor.TYPE_MAGNETIC_FIELD,
+                Sensor.TYPE_GYROSCOPE };
+
+        ParallelCompositeSensorTestOperation operation = new ParallelCompositeSensorTestOperation();
+        for(int sensorType : sensorTypes) {
+            SensorTestOperation continuousOperation = new VerifyEventOrderingOperation(
+                    context,
+                    sensorType,
+                    SensorManager.SENSOR_DELAY_NORMAL,
+                    0 /* reportLatencyInUs */);
+            operation.add(new RepeatingSensorTestOperation(continuousOperation, ITERATIONS));
+
+            SensorTestOperation batchingOperation = new VerifyEventOrderingOperation(
+                    context,
+                    sensorType,
+                    SensorTestInformation.getMaxSamplingRateInUs(context, sensorType),
+                    SensorCtsHelper.getSecondsAsMicroSeconds(BATCHING_RATE_IN_SECONDS));
+            operation.add(new RepeatingSensorTestOperation(batchingOperation, ITERATIONS));
+        }
+        operation.execute();
+    }
+
+    /**
+     * This test focuses in the interaction of several sensor Clients. The test characterizes by
+     * using clients for different Sensors under Test that vary the sampling rates and report
+     * latencies for the requests.
+     * The verification ensures that the sensor clients can vary the parameters of their requests
+     * without affecting other clients.
+     *
+     * The test verifies for each client that a set of sampled data arrives in order. However each
+     * client in the test has different set of parameters that represent different types of clients
+     * in the real world.
+     *
+     * The test can be susceptible to issues when several clients interacting with the system
+     * actually affect the operation of other clients.
+     *
+     * The assertion associated with the test failure provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the event that caused the issue
+     * It is important to look at the internals of the Sensor HAL to identify how the interaction
+     * of several clients can lead to the failing state.
+     */
+    public void testSensorsMovingRates() throws Throwable {
+        // use at least two instances to ensure more than one client of any given sensor is in play
+        final int INSTANCES_TO_USE = 5;
+        final int ITERATIONS_TO_EXECUTE = 100;
+
+        ParallelCompositeSensorTestOperation operation = new ParallelCompositeSensorTestOperation();
+        int sensorTypes[] = {
+                Sensor.TYPE_ACCELEROMETER,
+                Sensor.TYPE_MAGNETIC_FIELD,
+                Sensor.TYPE_GYROSCOPE };
+
+        for(int sensorType : sensorTypes) {
+            for(int instance = 0; instance < INSTANCES_TO_USE; ++instance) {
+                SequentialCompositeSensorTestOperation sequentialOperation =
+                        new SequentialCompositeSensorTestOperation();
+                for(int iteration = 0; iteration < ITERATIONS_TO_EXECUTE; ++iteration) {
+                    VerifyEventOrderingOperation sensorOperation = new VerifyEventOrderingOperation(
+                            this.getContext(),
+                            sensorType,
+                            this.generateSamplingRateInUs(sensorType),
+                            this.generateReportLatencyInUs());
+                    sequentialOperation.add(sensorOperation);
+                }
+                operation.add(sequentialOperation);
+            }
+        }
+
+        operation.execute();
+    }
+
+    /**
+     * Regress:
+     * - b/10641388
+     */
+    private int mSensorTypeTester;
+    private int mSensorTypeTestee;
+
+    private static void createStoppingTestCases(TestSuite testSuite) {
+        int sensorTypes[] = {
+                Sensor.TYPE_ACCELEROMETER,
+                Sensor.TYPE_GYROSCOPE,
+                Sensor.TYPE_MAGNETIC_FIELD};
+
+        for(int sensorTypeTester : sensorTypes) {
+            for(int sensorTypeTestee : sensorTypes) {
+                SensorIntegrationTests test = new SensorIntegrationTests();
+                test.mSensorTypeTester = sensorTypeTester;
+                test.mSensorTypeTestee = sensorTypeTestee;
+                test.setName("testSensorStoppingInteraction");
+                testSuite.addTest(test);
+            }
+        }
+    }
+
+    /**
+     * This test verifies that starting/stopping a particular Sensor client in the System does not
+     * affect other sensor clients.
+     * the test is used to validate that starting/stopping operations are independent on several
+     * sensor clients.
+     *
+     * The test verifies for each client that the a set of sampled data arrives in order. However
+     * each client in the test has different set of parameters that represent different types of
+     * clients in the real world.
+     *
+     * The test can be susceptible to issues when several clients interacting with the system
+     * actually affect the operation of other clients.
+     *
+     * The assertion associated with the test failure provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the event that caused the issue
+     * It is important to look at the internals of the Sensor HAL to identify how the interaction
+     * of several clients can lead to the failing state.
+     */
+    public void testSensorStoppingInteraction() throws Throwable {
+        Context context = this.getContext();
+
+        SensorTestOperation tester = new VerifyEventOrderingOperation(
+                context,
+                mSensorTypeTester,
+                SensorManager.SENSOR_DELAY_NORMAL,
+                0 /*reportLatencyInUs*/);
+        tester.start();
+
+        SensorTestOperation testee = new VerifyEventOrderingOperation(
+                context,
+                mSensorTypeTestee,
+                SensorManager.SENSOR_DELAY_UI,
+                0 /*reportLatencyInUs*/);
+        testee.start();
+
+        testee.waitForCompletion();
+        tester.waitForCompletion();
+
+        testee.execute();
+    }
+
+    /**
+     * Private helpers.
+     */
+    private final Random mGenerator = new Random();
+
+    private int generateSamplingRateInUs(int sensorType) {
+        int rate;
+        switch(mGenerator.nextInt(5)) {
+            case 0:
+                rate = SensorManager.SENSOR_DELAY_FASTEST;
+                break;
+            case 1:
+                rate = SensorManager.SENSOR_DELAY_GAME;
+                break;
+            case 2:
+                rate = SensorManager.SENSOR_DELAY_NORMAL;
+                break;
+            case 3:
+                rate = SensorManager.SENSOR_DELAY_UI;
+                break;
+            case 4:
+            default:
+                int maxSamplingRate = SensorTestInformation.getMaxSamplingRateInUs(
+                        this.getContext(),
+                        sensorType);
+                rate = maxSamplingRate * mGenerator.nextInt(10);
+        }
+        return rate;
+    }
+
+    private int generateReportLatencyInUs() {
+        int reportLatency = SensorCtsHelper.getSecondsAsMicroSeconds(
+                mGenerator.nextInt(5) + 1);
+        return reportLatency;
+    }
+
+    private static void addTestToSuite(TestSuite testSuite, String testName) {
+        SensorIntegrationTests test = new SensorIntegrationTests();
+        test.setName(testName);
+        testSuite.addTest(test);
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorMeasurementTests.java b/tests/tests/hardware/src/android/hardware/cts/SensorMeasurementTests.java
new file mode 100644
index 0000000..859b26d
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorMeasurementTests.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+
+import android.hardware.cts.helpers.SensorTestCase;
+
+import android.hardware.cts.helpers.sensorTestOperations.VerifyMagnitudeOperation;
+import android.hardware.cts.helpers.sensorTestOperations.VerifyStandardDeviationOperation;
+
+/**
+ * Verifies several properties of the sensor measurements.
+ */
+public class SensorMeasurementTests extends SensorTestCase {
+    private int mSensorType;
+    private int mSamplingRateInUs;
+
+    /**
+     * Builder for the test suite.
+     * This is the method that will build dynamically the set of test cases to execute.
+     * Each 'base' test case is composed by three parts:
+     * - the matrix definition
+     * - the test method that will execute the test case
+     * - a static method that will combine both and add test case instances to the test suite
+     */
+    public static Test suite() {
+        TestSuite testSuite = new TestSuite();
+
+        // add test generation routines
+        createEventNormTestCases(testSuite);
+        createStandardDeviationTestCases(testSuite);
+
+        return testSuite;
+    }
+
+    /**
+     * SensorEvent Norm test cases.
+     *
+     * Regress:
+     * - b/9503957
+     * - b/9611609
+     */
+    private float mReferenceValue;
+    private float mThreshold;
+
+    private static void createEventNormTestCases(TestSuite testSuite) {
+        Object testDefinitionMatrix[][] = {
+                // { SensorType, SamplingRateInUs, ReferenceValue, Threshold },
+                { Sensor.TYPE_ACCELEROMETER,
+                        SensorManager.SENSOR_DELAY_FASTEST,
+                        SensorManager.STANDARD_GRAVITY,
+                        1.5f /* m / s^2 */},
+                { Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, 0.0f, 2.5f /* dps */ },
+        };
+
+        for(Object definition[] : testDefinitionMatrix)  {
+            SensorMeasurementTests test = new SensorMeasurementTests();
+            test.mSensorType = (Integer)definition[0];
+            test.mSamplingRateInUs = (Integer)definition[1];
+            test.mReferenceValue = (Float)definition[2];
+            test.mThreshold = (Float)definition[3];
+            test.setName("testEventNorm");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies that the Norm of the sensor data is close to the expected reference value.
+     * The units of the reference value are dependent on the type of sensor.
+     * This test is used to verify that the data reported by the sensor is close to the expected
+     * range and scale.
+     *
+     * The test takes a sample from the sensor under test and calculates the Euclidean Norm of the
+     * vector represented by the sampled data. It then compares it against the test expectations
+     * that are represented by a reference value and a threshold.
+     *
+     * The test is susceptible to errors when the Sensor under test is uncalibrated, or the units in
+     * which the data are reported and the expectations are set are different.
+     *
+     * The assertion associated with the test provides the required data needed to identify any
+     * possible issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the values representing the expectation of the test
+     * - the values sampled from the sensor
+     */
+    public void testEventNorm() throws Throwable {
+        VerifyMagnitudeOperation operation = new VerifyMagnitudeOperation(
+                this.getContext(),
+                mSensorType,
+                mSamplingRateInUs,
+                mReferenceValue,
+                mThreshold);
+        operation.execute();
+    }
+
+    /**
+     * SensorEvent Standard Deviation test cases.
+     */
+    private int mReportLatencyInUs;
+    private float mExpectedStandardDeviation;
+
+    private static void createStandardDeviationTestCases(TestSuite testSuite) {
+        Object testDefinitionMatrix[][] = {
+                // { SensorType, SamplingRateInUs, ReportLatencyInUs, ExpectedStandardDeviation },
+                { Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_FASTEST, 0, 1f /* m/s^2 */ },
+                { Sensor.TYPE_GYROSCOPE, SensorManager.SENSOR_DELAY_FASTEST, 0, 0.5f /* dps */ },
+        };
+
+        for(Object definition[] : testDefinitionMatrix) {
+            SensorMeasurementTests test = new SensorMeasurementTests();
+            test.mSensorType = (Integer)definition[0];
+            test.mSamplingRateInUs = (Integer)definition[1];
+            test.mReportLatencyInUs = (Integer)definition[2];
+            test.mExpectedStandardDeviation = (Float)definition[3];
+            test.setName("testStandardDeviation");
+            testSuite.addTest(test);
+        }
+    }
+
+    /**
+     * This test verifies that the standard deviation of a set of sampled data from a particular
+     * sensor falls into the expectations defined in the CDD. The verification applies to each axis
+     * of the sampled data reported by the Sensor under test.
+     * This test is used to validate the requirement imposed by the CDD to Sensors in Android. And
+     * characterizes how the Sensor behaves while static.
+     *
+     * The test takes a set of samples from the sensor under test, and calculates the Standard
+     * Deviation for each of the axes the Sensor reports data for. The StdDev is compared against
+     * the expected value documented in the CDD.
+     *
+     * The test is susceptible to errors if the device is moving while the test is running, or if
+     * the Sensor's sampled data indeed falls into a large StdDev.
+     *
+     * The assertion associated with the test provides the required data to identify any possible
+     * issue. It provides:
+     * - the thread id on which the failure occurred
+     * - the sensor type and sensor handle that caused the failure
+     * - the expectation of the test
+     * - the std dev calculated and the axis it applies to
+     * Additionally, the device's debug output (adb logcat) dumps the set of values associated with
+     * the failure to help track down the issue.
+     */
+    public void testStandardDeviation() throws Throwable {
+        VerifyStandardDeviationOperation operation = new VerifyStandardDeviationOperation(
+                this.getContext(),
+                mSensorType,
+                mSamplingRateInUs,
+                mReportLatencyInUs,
+                mExpectedStandardDeviation);
+        operation.execute();
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index c865140..24dd368 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -18,22 +18,28 @@
 
 import java.lang.IllegalArgumentException;
 import java.lang.Override;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
+import android.hardware.SensorEventListener2;
 import android.hardware.SensorManager;
 import android.hardware.TriggerEvent;
 import android.hardware.TriggerEventListener;
+import android.os.Handler;
+import android.os.HandlerThread;
 import android.test.AndroidTestCase;
 
 public class SensorTest extends AndroidTestCase {
     private SensorManager mSensorManager;
     private TriggerListener mTriggerListener;
     private SensorListener mSensorListener;
+    private ArrayList<Sensor> mContinuousSensorList;
 
     @Override
     protected void setUp() throws Exception {
@@ -41,6 +47,18 @@
         mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
         mTriggerListener = new TriggerListener();
         mSensorListener = new SensorListener();
+        mContinuousSensorList = new ArrayList<Sensor>();
+        for (int i = Sensor.TYPE_ACCELEROMETER; i <= Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR; ++i) {
+            Sensor sensor = mSensorManager.getDefaultSensor(i);
+            // Skip all non-continuous mode sensors.
+            if (sensor == null || Sensor.TYPE_SIGNIFICANT_MOTION == i ||
+                Sensor.TYPE_STEP_COUNTER == i || Sensor.TYPE_STEP_DETECTOR == i ||
+                Sensor.TYPE_LIGHT == i || Sensor.TYPE_PROXIMITY == i ||
+                Sensor.TYPE_AMBIENT_TEMPERATURE == i) {
+                continue;
+            }
+            mContinuousSensorList.add(sensor);
+        }
     }
 
     public void testSensorOperations() {
@@ -59,6 +77,28 @@
             assertNull(sensor);
         }
 
+        sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
+        boolean hasStepCounter = getContext().getPackageManager().hasSystemFeature(
+                                        PackageManager.FEATURE_SENSOR_STEP_COUNTER);
+        // stepcounter sensor is optional
+        if (hasStepCounter) {
+            assertEquals(Sensor.TYPE_STEP_COUNTER, sensor.getType());
+            assertSensorValues(sensor);
+        } else {
+            assertNull(sensor);
+        }
+
+        sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
+        boolean hasStepDetector = getContext().getPackageManager().hasSystemFeature(
+                                        PackageManager.FEATURE_SENSOR_STEP_DETECTOR);
+        // stepdetector sensor is optional
+        if (hasStepDetector) {
+            assertEquals(Sensor.TYPE_STEP_DETECTOR, sensor.getType());
+            assertSensorValues(sensor);
+        } else {
+            assertNull(sensor);
+        }
+
         sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
         boolean hasCompass = getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_SENSOR_COMPASS);
@@ -85,6 +125,15 @@
         }
     }
 
+    public void testValuesForAllSensors() {
+        for (int i = Sensor.TYPE_ACCELEROMETER; i <= Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR; ++i) {
+            Sensor sensor = mSensorManager.getDefaultSensor(i);
+            if (sensor != null) {
+                assertSensorValues(sensor);
+            }
+        }
+    }
+
     public void testRequestTriggerWithNonTriggerSensor() {
         Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         boolean result;
@@ -126,12 +175,121 @@
         }
     }
 
-        private void assertSensorValues(Sensor sensor) {
+    // Register for updates from each continuous mode sensor, wait for 25 events, call flush and
+    // wait for flushCompleteEvent before unregistering for the sensor.
+    public void testBatchAndFlush() throws Exception {
+        for (Sensor sensor : mContinuousSensorList) {
+            final CountDownLatch eventReceived = new CountDownLatch(25);
+            final CountDownLatch flushReceived = new CountDownLatch(1);
+            SensorEventListener2 listener = new SensorEventListener2() {
+                @Override
+                public void onSensorChanged(SensorEvent event) {
+                    eventReceived.countDown();
+                }
+
+                @Override
+                public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                }
+
+                @Override
+                public void onFlushCompleted(Sensor sensor) {
+                    flushReceived.countDown();
+                }
+            };
+            boolean result = mSensorManager.registerListener(listener, sensor,
+                                            SensorManager.SENSOR_DELAY_NORMAL, 10000000);
+            assertTrue(result);
+            // Wait for 25 events and call flush.
+            eventReceived.await();
+            result = mSensorManager.flush(listener);
+            assertTrue(result);
+            flushReceived.await();
+            mSensorManager.unregisterListener(listener);
+        }
+    }
+
+    // Same as testBatchAndFlush but using Handler version of the API to register for sensors.
+    // onSensorChanged is now called on a background thread.
+    public void testBatchAndFlushWithHandler() throws Exception {
+        for (Sensor sensor : mContinuousSensorList) {
+            final CountDownLatch eventReceived = new CountDownLatch(25);
+            final CountDownLatch flushReceived = new CountDownLatch(1);
+            SensorEventListener2 listener = new SensorEventListener2() {
+                @Override
+                public void onSensorChanged(SensorEvent event) {
+                    eventReceived.countDown();
+                }
+
+                @Override
+                public void onAccuracyChanged(Sensor sensor, int accuracy) {
+                }
+
+                @Override
+                public void onFlushCompleted(Sensor sensor) {
+                    flushReceived.countDown();
+                }
+            };
+            HandlerThread handlerThread = new HandlerThread("sensorThread");
+            handlerThread.start();
+            Handler handler = new Handler(handlerThread.getLooper());
+            boolean result = mSensorManager.registerListener(listener, sensor,
+                                            SensorManager.SENSOR_DELAY_NORMAL, 15000000,
+                                            handler);
+            assertTrue(result);
+            // Wait for 25 events and call flush.
+            eventReceived.await();
+            result = mSensorManager.flush(listener);
+            assertTrue(result);
+            flushReceived.await();
+            mSensorManager.unregisterListener(listener);
+        }
+    }
+
+    // Call registerListener for multiple sensors at a time and call flush.
+    public void testBatchAndFlushWithMutipleSensors() throws Exception {
+        int numSensors = mContinuousSensorList.size() < 3 ? mContinuousSensorList.size() : 3;
+        if (numSensors == 0) {
+            return;
+        }
+        final CountDownLatch eventReceived = new CountDownLatch(numSensors * 50);
+        final CountDownLatch flushReceived = new CountDownLatch(numSensors);
+        SensorEventListener2 listener = new SensorEventListener2() {
+            @Override
+            public void onSensorChanged(SensorEvent event) {
+                eventReceived.countDown();
+            }
+
+            @Override
+            public void onAccuracyChanged(Sensor sensor, int accuracy) {
+            }
+
+            @Override
+            public void onFlushCompleted(Sensor sensor) {
+                flushReceived.countDown();
+            }
+        };
+        for (int i = 0; i < numSensors; ++i) {
+            Sensor sensor = mContinuousSensorList.get(i);
+            boolean result = mSensorManager.registerListener(listener, sensor,
+                                            SensorManager.SENSOR_DELAY_FASTEST);
+            assertTrue(result);
+        }
+        // Wait for N events and call flush.
+        eventReceived.await();
+        boolean result = mSensorManager.flush(listener);
+        assertTrue(result);
+        flushReceived.await();
+        mSensorManager.unregisterListener(listener);
+    }
+
+    private void assertSensorValues(Sensor sensor) {
         assertTrue(sensor.getMaximumRange() >= 0);
         assertTrue(sensor.getPower() >= 0);
         assertTrue(sensor.getResolution() >= 0);
         assertNotNull(sensor.getVendor());
         assertTrue(sensor.getVersion() > 0);
+        assertTrue(sensor.getFifoMaxEventCount() >= 0);
+        assertTrue(sensor.getFifoReservedEventCount() >= 0);
     }
 
     @SuppressWarnings("deprecation")
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
new file mode 100644
index 0000000..9d860cd
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorManager;
+import android.os.Environment;
+import android.util.Log;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Set of static helper methods for CTS tests.
+ */
+public class SensorCtsHelper {
+
+    /**
+     * Private constructor for static class.
+     */
+    private SensorCtsHelper() {}
+
+    /**
+     * Get the value of the 95th percentile using nearest rank algorithm.
+     *
+     * @throws IllegalArgumentException if the collection is null or empty
+     */
+    public static <TValue extends Comparable<? super TValue>> TValue get95PercentileValue(
+            Collection<TValue> collection) {
+        validateCollection(collection);
+
+        List<TValue> arrayCopy = new ArrayList<TValue>(collection);
+        Collections.sort(arrayCopy);
+
+        // zero-based array index
+        int arrayIndex = (int) Math.round(arrayCopy.size() * 0.95 + .5) - 1;
+
+        return arrayCopy.get(arrayIndex);
+    }
+
+    /**
+     * Calculates the mean for each of the values in the set of TestSensorEvents.
+     *
+     * @throws IllegalArgumentException if there are no events
+     */
+    public static double[] getMeans(TestSensorEvent[] events) {
+        if (events.length == 0) {
+            throw new IllegalArgumentException("Events cannot be empty");
+        }
+
+        double[] means = new double[events[0].values.length];
+        for (TestSensorEvent event : events) {
+            for (int i = 0; i < means.length; i++) {
+                means[i] += event.values[i];
+            }
+        }
+        for (int i = 0; i < means.length; i++) {
+            means[i] /= events.length;
+        }
+        return means;
+    }
+
+    /**
+     * Calculates the variance for each of the values in the set of TestSensorEvents.
+     *
+     * @throws IllegalArgumentException if there are no events
+     */
+    public static double[] getVariances(TestSensorEvent[] events) {
+        double[] means = getMeans(events);
+        double[] variances = new double[means.length];
+        for (int i = 0; i < means.length; i++) {
+            Collection<Double> squaredDiffs = new ArrayList<Double>(events.length);
+            for (TestSensorEvent event : events) {
+                double diff = event.values[i] - means[i];
+                squaredDiffs.add(diff * diff);
+            }
+            variances[i] = getMean(squaredDiffs);
+        }
+        return variances;
+    }
+
+    /**
+     * Calculates the standard deviation for each of the values in the set of TestSensorEvents.
+     *
+     * @throws IllegalArgumentException if there are no events
+     */
+    public static double[] getStandardDeviations(TestSensorEvent[] events) {
+        double[] variances = getVariances(events);
+        double[] stdDevs = new double[variances.length];
+        for (int i = 0; i < variances.length; i++) {
+            stdDevs[i] = Math.sqrt(variances[i]);
+        }
+        return stdDevs;
+    }
+
+    /**
+     * Calculate the mean of a collection.
+     *
+     * @throws IllegalArgumentException if the collection is null or empty
+     */
+    public static <TValue extends Number> double getMean(Collection<TValue> collection) {
+        validateCollection(collection);
+
+        double sum = 0.0;
+        for(TValue value : collection) {
+            sum += value.doubleValue();
+        }
+        return sum / collection.size();
+    }
+
+    /**
+     * Calculate the variance of a collection.
+     *
+     * @throws IllegalArgumentException if the collection is null or empty
+     */
+    public static <TValue extends Number> double getVariance(Collection<TValue> collection) {
+        validateCollection(collection);
+
+        double mean = getMean(collection);
+        ArrayList<Double> squaredDifferences = new ArrayList<Double>();
+        for(TValue value : collection) {
+            double difference = mean - value.doubleValue();
+            squaredDifferences.add(Math.pow(difference, 2));
+        }
+
+        return getMean(squaredDifferences);
+    }
+
+    /**
+     * Calculate the standard deviation of a collection.
+     *
+     * @throws IllegalArgumentException if the collection is null or empty
+     */
+    public static <TValue extends Number> double getStandardDeviation(
+            Collection<TValue> collection) {
+        return Math.sqrt(getVariance(collection));
+    }
+
+    /**
+     * Get a list containing the delay between sensor events.
+     *
+     * @param events The array of {@link TestSensorEvent}.
+     * @return A list containing the delay between sensor events in nanoseconds.
+     */
+    public static List<Long> getTimestampDelayValues(TestSensorEvent[] events) {
+        if (events.length < 2) {
+            return new ArrayList<Long>();
+        }
+        List<Long> timestampDelayValues = new ArrayList<Long>(events.length - 1);
+        for (int i = 1; i < events.length; i++) {
+            timestampDelayValues.add(events[i].timestamp - events[i - 1].timestamp);
+        }
+        return timestampDelayValues;
+    }
+
+    /**
+     * Get a list containing the jitter values for a collection of sensor events.
+     *
+     * @param events The array of {@link TestSensorEvent}.
+     * @return A list containing the jitter values between each event.
+     * @throws IllegalArgumentException if the number of events is less that 2.
+     */
+    public static List<Double> getJitterValues(TestSensorEvent[] events) {
+        List<Long> timestampDelayValues = getTimestampDelayValues(events);
+        double averageTimestampDelay = getMean(timestampDelayValues);
+
+        List<Double> jitterValues = new ArrayList<Double>(timestampDelayValues.size());
+        for (long timestampDelay : timestampDelayValues) {
+            jitterValues.add(Math.abs(timestampDelay - averageTimestampDelay));
+        }
+        return jitterValues;
+    }
+
+    /**
+     * NOTE:
+     * - The bug report is usually written to /sdcard/Downloads
+     * - In order for the test Instrumentation to gather useful data the following permissions are
+     *   required:
+     *      . android.permission.READ_LOGS
+     *      . android.permission.DUMP
+     */
+    public static String collectBugreport(String collectorId)
+            throws IOException, InterruptedException {
+        String commands[] = new String[] {
+                "dumpstate",
+                "dumpsys",
+                "logcat -d -v threadtime",
+                "exit"
+        };
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat("M-d-y_H:m:s.S");
+        String outputFile = String.format(
+                "%s/%s_%s",
+                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
+                collectorId,
+                dateFormat.format(new Date()));
+
+        DataOutputStream processOutput = null;
+        try {
+            Process process = Runtime.getRuntime().exec("/system/bin/sh -");
+            processOutput = new DataOutputStream(process.getOutputStream());
+
+            for(String command : commands) {
+                processOutput.writeBytes(String.format("%s >> %s\n", command, outputFile));
+            }
+
+            processOutput.flush();
+            process.waitFor();
+
+            Log.d(collectorId, String.format("Bug-Report collected at: %s", outputFile));
+        } finally {
+            if(processOutput != null) {
+                try {
+                    processOutput.close();
+                } catch(IOException e) {}
+            }
+        }
+
+        return outputFile;
+    }
+
+    /**
+     * Get the default sensor for a given type.
+     */
+    public static Sensor getSensor(Context context, int sensorType) {
+        SensorManager sensorManager = getSensorManager(context);
+        Sensor sensor = sensorManager.getDefaultSensor(sensorType);
+        if(sensor == null) {
+            throw new SensorNotSupportedException(sensorType);
+        }
+        return sensor;
+    }
+
+    /**
+     * Get all the sensors for a given type.
+     */
+    public static List<Sensor> getSensors(Context context, int sensorType) {
+        SensorManager sensorManager = getSensorManager(context);
+        List<Sensor> sensors = sensorManager.getSensorList(sensorType);
+        if (sensors.size() == 0) {
+            throw new SensorNotSupportedException(sensorType);
+        }
+        return sensors;
+    }
+
+    /**
+     * Convert a period to frequency in Hz.
+     */
+    public static <TValue extends Number> double getFrequency(TValue period, TimeUnit unit) {
+        return 1000000000 / (TimeUnit.NANOSECONDS.convert(1, unit) * period.doubleValue());
+    }
+
+    /**
+     * Convert a frequency in Hz into a period.
+     */
+    public static <TValue extends Number> double getPeriod(TValue frequency, TimeUnit unit) {
+        return 1000000000 / (TimeUnit.NANOSECONDS.convert(1, unit) * frequency.doubleValue());
+    }
+
+    /**
+     * Convert number of seconds to number of microseconds.
+     */
+    public static int getSecondsAsMicroSeconds(int seconds) {
+        return (int) TimeUnit.MICROSECONDS.convert(seconds, TimeUnit.SECONDS);
+    }
+
+    /**
+     * Format an assertion message.
+     *
+     * @param verificationName The verification name
+     * @param sensor The sensor under test
+     * @param format The additional format string, use "" if blank
+     * @param params The additional format params
+     * @return The formatted string.
+     */
+    public static String formatAssertionMessage(
+            String verificationName,
+            Sensor sensor,
+            String format,
+            Object ... params) {
+        return formatAssertionMessage(verificationName, null, sensor, format, params);
+    }
+
+    /**
+     * Format an assertion message.
+     *
+     * @param verificationName The verification name
+     * @param test The test, optional
+     * @param sensor The sensor under test
+     * @param format The additional format string, use "" if blank
+     * @param params The additional format params
+     * @return The formatted string.
+     */
+    public static String formatAssertionMessage(
+            String verificationName,
+            SensorTestOperation test,
+            Sensor sensor,
+            String format,
+            Object ... params) {
+        StringBuilder builder = new StringBuilder();
+
+        // identify the verification
+        builder.append(verificationName);
+        builder.append("| ");
+        // add test context information
+        if(test != null) {
+            builder.append(test.toString());
+            builder.append("| ");
+        }
+        // add context information
+        builder.append(SensorTestInformation.getSensorName(sensor.getType()));
+        builder.append(", handle:");
+        builder.append(sensor.getHandle());
+        builder.append("| ");
+        // add the custom formatting
+        builder.append(String.format(format, params));
+
+        return builder.toString();
+    }
+
+    /**
+     * Validate that a collection is not null or empty.
+     *
+     * @throws IllegalStateException if collection is null or empty.
+     */
+    private static <T> void validateCollection(Collection<T> collection) {
+        if(collection == null || collection.size() == 0) {
+            throw new IllegalStateException("Collection cannot be null or empty");
+        }
+    }
+
+    /**
+     * Get the SensorManager.
+     *
+     * @throws IllegalStateException if the SensorManager is not present in the system.
+     */
+    private static SensorManager getSensorManager(Context context) {
+        SensorManager sensorManager = (SensorManager) context.getSystemService(
+                Context.SENSOR_SERVICE);
+        if(sensorManager == null) {
+            throw new IllegalStateException("SensorService is not present in the system.");
+        }
+        return sensorManager;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java
new file mode 100644
index 0000000..ccfaf2a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelperTest.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2014 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 android.hardware.cts.helpers;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Unit tests for the {@link SensorCtsHelper} class.
+ */
+public class SensorCtsHelperTest extends TestCase {
+
+    /**
+     * Test {@link SensorCtsHelper#get95PercentileValue(Collection)}.
+     */
+    public void testGet95PercentileValue() {
+        Collection<Integer> values = new HashSet<Integer>();
+        for (int i = 0; i < 100; i++) {
+            values.add(i);
+        }
+        assertEquals(95, (int) SensorCtsHelper.get95PercentileValue(values));
+
+        values = new HashSet<Integer>();
+        for (int i = 0; i < 1000; i++) {
+            values.add(i);
+        }
+        assertEquals(950, (int) SensorCtsHelper.get95PercentileValue(values));
+
+        values = new HashSet<Integer>();
+        for (int i = 0; i < 100; i++) {
+            values.add(i * i);
+        }
+        assertEquals(95 * 95, (int) SensorCtsHelper.get95PercentileValue(values));
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getMeans(TestSensorEvent[])}.
+     */
+    public void testGetMeans() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+
+        float[] values = {0, 1, 2, 3, 4};  // 2.0
+        double[] means = SensorCtsHelper.getMeans(getSensorEvents(timestamps, values));
+        assertEquals(1, means.length);
+        assertEquals(2.0, means[0], 0.00001);
+
+        float[] values1 = {0, 1, 2, 3, 4};  // 2.0
+        float[] values2 = {1, 2, 3, 4, 5};  // 3.0
+        float[] values3 = {0, 1, 4, 9, 16};  // 6.0
+        means = SensorCtsHelper.getMeans(
+                getSensorEvents(timestamps, values1, values2, values3));
+        assertEquals(3, means.length);
+        assertEquals(2.0, means[0], 0.00001);
+        assertEquals(3.0, means[1], 0.00001);
+        assertEquals(6.0, means[2], 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getVariances(TestSensorEvent[])}.
+     */
+    public void testGetVariences() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+
+        float[] values = {0, 1, 2, 3, 4};  // 2.0
+        double[] variances = SensorCtsHelper.getVariances(getSensorEvents(timestamps, values));
+        assertEquals(1, variances.length);
+        assertEquals(2.0, variances[0], 0.00001);
+
+        float[] values1 = {0, 1, 2, 3, 4};  // 2.0
+        float[] values2 = {1, 2, 3, 4, 5};  // 2.0
+        float[] values3 = {0, 2, 4, 6, 8};  // 8.0
+        variances = SensorCtsHelper.getVariances(
+                getSensorEvents(timestamps, values1, values2, values3));
+        assertEquals(3, variances.length);
+        assertEquals(2.0, variances[0], 0.00001);
+        assertEquals(2.0, variances[1], 0.00001);
+        assertEquals(8.0, variances[2], 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getStandardDeviations(TestSensorEvent[])}.
+     */
+    public void testGetStandardDeviations() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+
+        float[] values = {0, 1, 2, 3, 4};  // sqrt(2.0)
+        double[] stddev = SensorCtsHelper.getStandardDeviations(
+                getSensorEvents(timestamps, values));
+        assertEquals(1, stddev.length);
+        assertEquals(Math.sqrt(2.0), stddev[0], 0.00001);
+
+        float[] values1 = {0, 1, 2, 3, 4};  // sqrt(2.0)
+        float[] values2 = {1, 2, 3, 4, 5};  // sqrt(2.0)
+        float[] values3 = {0, 2, 4, 6, 8};  // sqrt(8.0)
+        stddev = SensorCtsHelper.getStandardDeviations(
+                getSensorEvents(timestamps, values1, values2, values3));
+        assertEquals(3, stddev.length);
+        assertEquals(Math.sqrt(2.0), stddev[0], 0.00001);
+        assertEquals(Math.sqrt(2.0), stddev[1], 0.00001);
+        assertEquals(Math.sqrt(8.0), stddev[2], 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getMean(Collection)}.
+     */
+    public void testGetMean() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double mean = SensorCtsHelper.getMean(values);
+        assertEquals(2.0, mean, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        mean = SensorCtsHelper.getMean(values);
+        assertEquals(3.0, mean, 0.00001);
+
+        values = Arrays.asList(0, 1, 4, 9, 16);
+        mean = SensorCtsHelper.getMean(values);
+        assertEquals(6.0, mean, 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getVariance(Collection)}.
+     */
+    public void testGetVariance() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double variance = SensorCtsHelper.getVariance(values);
+        assertEquals(2.0, variance, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        variance = SensorCtsHelper.getVariance(values);
+        assertEquals(2.0, variance, 0.00001);
+
+        values = Arrays.asList(0, 2, 4, 6, 8);
+        variance = SensorCtsHelper.getVariance(values);
+        assertEquals(8.0, variance, 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getStandardDeviation(Collection)}.
+     */
+    public void testGetStandardDeviation() {
+        List<Integer> values = Arrays.asList(0, 1, 2, 3, 4);
+        double stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(2.0), stddev, 0.00001);
+
+        values = Arrays.asList(1, 2, 3, 4, 5);
+        stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(2.0), stddev, 0.00001);
+
+        values = Arrays.asList(0, 2, 4, 6, 8);
+        stddev = SensorCtsHelper.getStandardDeviation(values);
+        assertEquals(Math.sqrt(8.0), stddev, 0.00001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getTimestampDelayValues(TestSensorEvent[])}.
+     */
+    public void testGetTimestampDelayValues() {
+        float[] values = {0, 1, 2, 3, 4};
+
+        long[] timestamps = {0, 0, 1, 3, 100};
+        List<Long> timestampDelayValues = SensorCtsHelper.getTimestampDelayValues(
+                getSensorEvents(timestamps, values));
+        assertEquals(4, timestampDelayValues.size());
+        assertEquals(0, (long) timestampDelayValues.get(0));
+        assertEquals(1, (long) timestampDelayValues.get(1));
+        assertEquals(2, (long) timestampDelayValues.get(2));
+        assertEquals(97, (long) timestampDelayValues.get(3));
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getFrequency(Number, TimeUnit)}.
+     */
+    public void testGetFrequency() {
+        assertEquals(1.0, SensorCtsHelper.getFrequency(1, TimeUnit.SECONDS), 0.001);
+        assertEquals(10.0, SensorCtsHelper.getFrequency(0.1, TimeUnit.SECONDS), 0.001);
+        assertEquals(10.0, SensorCtsHelper.getFrequency(100, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(1000.0, SensorCtsHelper.getFrequency(1, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(10000.0, SensorCtsHelper.getFrequency(0.1, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(10000.0, SensorCtsHelper.getFrequency(100, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(1000000.0, SensorCtsHelper.getFrequency(1, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(10000000.0, SensorCtsHelper.getFrequency(0.1, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(10000000.0, SensorCtsHelper.getFrequency(100, TimeUnit.NANOSECONDS), 0.001);
+        assertEquals(1000000000.0, SensorCtsHelper.getFrequency(1, TimeUnit.NANOSECONDS), 0.001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getPeriod(Number, TimeUnit)}.
+     */
+    public void testGetPeriod() {
+        assertEquals(1.0, SensorCtsHelper.getPeriod(1, TimeUnit.SECONDS), 0.001);
+        assertEquals(0.1, SensorCtsHelper.getPeriod(10, TimeUnit.SECONDS), 0.001);
+        assertEquals(100, SensorCtsHelper.getPeriod(10, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(1, SensorCtsHelper.getPeriod(1000, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(0.1, SensorCtsHelper.getPeriod(10000, TimeUnit.MILLISECONDS), 0.001);
+        assertEquals(100, SensorCtsHelper.getPeriod(10000, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(1, SensorCtsHelper.getPeriod(1000000, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(0.1, SensorCtsHelper.getPeriod(10000000, TimeUnit.MICROSECONDS), 0.001);
+        assertEquals(100, SensorCtsHelper.getPeriod(10000000, TimeUnit.NANOSECONDS), 0.001);
+        assertEquals(1, SensorCtsHelper.getPeriod(1000000000, TimeUnit.NANOSECONDS), 0.001);
+    }
+
+    /**
+     * Test {@link SensorCtsHelper#getJitterValues(TestSensorEvent[])}.
+     */
+    public void testGetJitterValues() {
+        float[] values = {0, 1, 2, 3, 4};
+
+        long[] timestamps1 = {0, 1, 2, 3, 4};
+        List<Double> jitterValues = SensorCtsHelper.getJitterValues(
+                getSensorEvents(timestamps1, values));
+        assertEquals(4, jitterValues.size());
+        assertEquals(0.0, (double) jitterValues.get(0));
+        assertEquals(0.0, (double) jitterValues.get(1));
+        assertEquals(0.0, (double) jitterValues.get(2));
+        assertEquals(0.0, (double) jitterValues.get(3));
+
+        long[] timestamps2 = {0, 0, 2, 4, 4};
+        jitterValues = SensorCtsHelper.getJitterValues(
+                getSensorEvents(timestamps2, values));
+        assertEquals(4, jitterValues.size());
+        assertEquals(1.0, (double) jitterValues.get(0));
+        assertEquals(1.0, (double) jitterValues.get(1));
+        assertEquals(1.0, (double) jitterValues.get(2));
+        assertEquals(1.0, (double) jitterValues.get(3));
+
+        long[] timestamps3 = {0, 1, 4, 9, 16};
+        jitterValues = SensorCtsHelper.getJitterValues(
+                getSensorEvents(timestamps3, values));
+        assertEquals(4, jitterValues.size());
+        assertEquals(3.0, (double) jitterValues.get(0));
+        assertEquals(1.0, (double) jitterValues.get(1));
+        assertEquals(1.0, (double) jitterValues.get(2));
+        assertEquals(3.0, (double) jitterValues.get(3));
+    }
+
+    private TestSensorEvent[] getSensorEvents(long[] timestamps, float[] ... values) {
+        TestSensorEvent[] events = new TestSensorEvent[timestamps.length];
+        for (int i = 0; i < timestamps.length; i++) {
+            float[] eventValues = new float[values.length];
+            for (int j = 0; j < values.length; j++) {
+                eventValues[j] = values[j][i];
+            }
+            events[i] = new TestSensorEvent(null, timestamps[i], 0, eventValues);
+        }
+        return events;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorManagerTestVerifier.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorManagerTestVerifier.java
new file mode 100644
index 0000000..85f4f0e
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorManagerTestVerifier.java
@@ -0,0 +1,268 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener2;
+import android.hardware.SensorManager;
+
+import junit.framework.Assert;
+
+import java.io.Closeable;
+import java.security.InvalidParameterException;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test class to wrap SensorManager with verifications and test checks.
+ * This class allows to perform operations in the Sensor Manager and performs all the expected test
+ * verification on behalf of the owner.
+ * An object can be used to quickly writing tests that focus on the scenario that needs to be
+ * verified, and not in the implicit verifications that need to take place at any step.
+ */
+public class SensorManagerTestVerifier implements Closeable, SensorEventListener2 {
+    private final int WAIT_TIMEOUT_IN_SECONDS = 30;
+
+    private final SensorManager mSensorManager;
+    private final Sensor mSensorUnderTest;
+    private final int mSamplingRateInUs;
+    private final int mReportLatencyInUs;
+
+    private TestSensorListener mEventListener;
+
+    /**
+     * Construction methods.
+     */
+    public SensorManagerTestVerifier(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            int reportLatencyInUs) {
+        mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
+        mSensorUnderTest = SensorCtsHelper.getSensor(context, sensorType);
+        mSamplingRateInUs = samplingRateInUs;
+        mReportLatencyInUs = reportLatencyInUs;
+
+        mEventListener = new TestSensorListener(mSensorUnderTest, this);
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * Available for subclasses to implement if they need access to the raw eventing model.
+     * </p>
+     */
+    @Override
+    public void onAccuracyChanged(Sensor sensor, int accuracy) {}
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * Available for subclasses to implement if they need access to the raw eventing model.
+     * </p>
+     */
+    @Override
+    public void onSensorChanged(SensorEvent event) {}
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * Available for subclasses to implement if they need access to the raw eventing model.
+     * </p>
+     */
+    @Override
+    public void onFlushCompleted(Sensor sensor) {}
+
+    /**
+     * Closes the {@link SensorManagerTestVerifier} and unregister the listener.
+     */
+    @Override
+    public void close() {
+        this.unregisterListener();
+        mEventListener = null;
+    }
+
+    /**
+     * Get the sensor under test.
+     */
+    public Sensor getUnderlyingSensor() {
+        return mSensorUnderTest;
+    }
+
+    /**
+     * Register the
+     * @param debugInfo
+     */
+    public void registerListener(String debugInfo) {
+        boolean result = mSensorManager.registerListener(
+                mEventListener,
+                mSensorUnderTest,
+                mSamplingRateInUs,
+                mReportLatencyInUs);
+        String message = SensorCtsHelper.formatAssertionMessage(
+                "registerListener",
+                mSensorUnderTest,
+                debugInfo);
+        Assert.assertTrue(message, result);
+    }
+
+    public void registerListener() {
+        this.registerListener("");
+    }
+
+    public void unregisterListener() {
+        mSensorManager.unregisterListener(mEventListener, mSensorUnderTest);
+    }
+
+    public TestSensorEvent[] getEvents(int count, String debugInfo) {
+        mEventListener.waitForEvents(count, debugInfo);
+        TestSensorEvent[] events = mEventListener.getAllEvents();
+        mEventListener.clearEvents();
+
+        return events;
+    }
+
+    public TestSensorEvent[] getEvents(int count) {
+        return this.getEvents(count, "");
+    }
+
+    public TestSensorEvent[] getQueuedEvents() {
+        return mEventListener.getAllEvents();
+    }
+
+    public TestSensorEvent[] collectEvents(int eventCount, String debugInfo) {
+        this.registerListener(debugInfo);
+        TestSensorEvent[] events = this.getEvents(eventCount, debugInfo);
+        this.unregisterListener();
+
+        return events;
+    }
+
+    public TestSensorEvent[] collectEvents(int eventCount) {
+        return this.collectEvents(eventCount, "");
+    }
+
+    public void startFlush() {
+        String message = SensorCtsHelper.formatAssertionMessage(
+                "Flush",
+                mSensorUnderTest,
+                "" /* format */);
+        Assert.assertTrue(message, mSensorManager.flush(mEventListener));
+    }
+
+    public void waitForFlush() throws InterruptedException {
+        mEventListener.waitForFlushComplete();
+    }
+
+    public void flush() throws InterruptedException {
+        this.startFlush();
+        this.waitForFlush();
+    }
+
+    /**
+     * Definition of support test classes.
+     */
+    private class TestSensorListener implements SensorEventListener2 {
+        private final Sensor mSensorUnderTest;
+        private final SensorEventListener2 mListener;
+
+        private final ConcurrentLinkedDeque<TestSensorEvent> mSensorEventsList =
+                new ConcurrentLinkedDeque<TestSensorEvent>();
+
+        private volatile CountDownLatch mEventLatch;
+        private volatile CountDownLatch mFlushLatch = new CountDownLatch(1);
+
+        public TestSensorListener(Sensor sensor, SensorEventListener2 listener) {
+            if(sensor == null) {
+                throw new InvalidParameterException("sensor cannot be null");
+            }
+            if(listener == null) {
+                throw new InvalidParameterException("listener cannot be null");
+            }
+            mSensorUnderTest = sensor;
+            mListener = listener;
+        }
+
+        @Override
+        public void onSensorChanged(SensorEvent event) {
+            // copy the event because there is no better way to do this in the platform
+            mSensorEventsList.addLast(new TestSensorEvent(event));
+            if(mEventLatch != null) {
+                mEventLatch.countDown();
+            }
+            mListener.onSensorChanged(event);
+        }
+
+        @Override
+        public void onAccuracyChanged(Sensor sensor, int accuracy) {
+            mListener.onAccuracyChanged(sensor, accuracy);
+        }
+
+        @Override
+        public void onFlushCompleted(Sensor sensor) {
+            CountDownLatch latch = mFlushLatch;
+            mFlushLatch = new CountDownLatch(1);
+            if(latch != null) {
+                latch.countDown();
+            }
+            mListener.onFlushCompleted(sensor);
+        }
+
+        public void waitForFlushComplete() throws InterruptedException {
+            CountDownLatch latch = mFlushLatch;
+            if(latch != null) {
+                String message = SensorCtsHelper.formatAssertionMessage(
+                        "WaitForFlush",
+                        mSensorUnderTest,
+                        "" /* format */);
+                Assert.assertTrue(message, latch.await(WAIT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS));
+            }
+        }
+
+        public void waitForEvents(int eventCount, String timeoutInfo) {
+            mEventLatch = new CountDownLatch(eventCount);
+            this.clearEvents();
+            try {
+                boolean awaitCompleted = mEventLatch.await(WAIT_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS);
+                // TODO: can we collect bug reports on error based only if needed? env var?
+
+                String message = SensorCtsHelper.formatAssertionMessage(
+                        "WaitForEvents",
+                        mSensorUnderTest,
+                        "count:%d, available:%d, %s",
+                        eventCount,
+                        mSensorEventsList.size(),
+                        timeoutInfo);
+                Assert.assertTrue(message, awaitCompleted);
+            } catch(InterruptedException e) {
+            } finally {
+                mEventLatch = null;
+            }
+        }
+
+        public TestSensorEvent[] getAllEvents() {
+            return mSensorEventsList.toArray(new TestSensorEvent[0]);
+        }
+
+        public void clearEvents() {
+            mSensorEventsList.clear();
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
new file mode 100644
index 0000000..4c413d7
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorNotSupportedException.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+/**
+ * Exception that indicates that a given sensor is not supported in the device.
+ * This exception can be caught in tests to safely ignore test cases that are not necessary in a
+ * given environment.
+ */
+public class SensorNotSupportedException extends RuntimeException {
+    public SensorNotSupportedException(int sensorType) {
+        super(String.format(
+                "Sensor '%s' of type %d is not supported.",
+                SensorTestInformation.getSensorName(sensorType),
+                sensorType));
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java
new file mode 100644
index 0000000..4bd0eed
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestCase.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import android.test.AndroidTestCase;
+
+import android.util.Log;
+
+/**
+ * Test Case class that handles gracefully sensors that are not available in the device.
+ */
+public abstract class SensorTestCase extends AndroidTestCase {
+    protected final String LOG_TAG = "TestRunner";
+
+    protected SensorTestCase() {}
+
+    @Override
+    public void runTest() throws Throwable {
+        try {
+            super.runTest();
+        } catch (SensorNotSupportedException e) {
+            // the sensor is not supported/available in the device, log a warning and skip the test
+            Log.w(LOG_TAG, e.getMessage());
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java
new file mode 100644
index 0000000..90e0706
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestInformation.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import android.content.Context;
+
+import android.hardware.Sensor;
+
+import java.security.InvalidParameterException;
+
+/**
+ * A 'property' bag of sensor information used for testing purposes.
+ */
+public class SensorTestInformation {
+    private SensorTestInformation() {}
+
+    public static int getAxisCount(int sensorType) {
+        switch(sensorType) {
+            case Sensor.TYPE_ACCELEROMETER:
+                return 3;
+            case Sensor.TYPE_MAGNETIC_FIELD:
+                return 3;
+//            case Sensor.TYPE_ORIENTATION:
+//                return "Orientation";
+            case Sensor.TYPE_GYROSCOPE:
+                return 3;
+//            case Sensor.TYPE_LIGHT:
+//                return "Light";
+//            case Sensor.TYPE_PRESSURE:
+//                return "Pressure";
+//            case Sensor.TYPE_TEMPERATURE:
+//                return "Temperature";
+//            case Sensor.TYPE_PROXIMITY:
+//                return "Proximity";
+            case Sensor.TYPE_GRAVITY:
+                return 3;
+            case Sensor.TYPE_LINEAR_ACCELERATION:
+                return 3;
+//            case Sensor.TYPE_ROTATION_VECTOR:
+//                return "Rotation Vector";
+//            case Sensor.TYPE_RELATIVE_HUMIDITY:
+//                return "Relative Humidity";
+//            case Sensor.TYPE_AMBIENT_TEMPERATURE:
+//                return "Ambient Temperature";
+//            case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+//                return "Magnetic Field Uncalibrated";
+//            case Sensor.TYPE_GAME_ROTATION_VECTOR:
+//                return "Game Rotation Vector";
+//            case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
+//                return "Gyroscope Uncalibrated";
+//            case Sensor.TYPE_SIGNIFICANT_MOTION:
+//                return "Significant Motion";
+//            case Sensor.TYPE_STEP_DETECTOR:
+//                return "Step Detector";
+//            case Sensor.TYPE_STEP_COUNTER:
+//                return "Step Counter";
+//            case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR:
+//                return "Geomagnetic Rotation Vector";
+            default:
+                throw new InvalidParameterException(
+                        String.format("Invalid sensorType:%d. Unable to find axis count.", sensorType));
+        }
+    }
+
+    public static String getSensorName(int sensorType) {
+        String name;
+        switch(sensorType) {
+            case Sensor.TYPE_ACCELEROMETER:
+                name = "Accelerometer";
+                break;
+            case Sensor.TYPE_MAGNETIC_FIELD:
+                name = "Magnetic Field";
+                break;
+            case Sensor.TYPE_ORIENTATION:
+                name = "Orientation";
+                break;
+            case Sensor.TYPE_GYROSCOPE:
+                name = "Gyroscope";
+                break;
+            case Sensor.TYPE_LIGHT:
+                name = "Light";
+                break;
+            case Sensor.TYPE_PRESSURE:
+                name = "Pressure";
+                break;
+            case Sensor.TYPE_TEMPERATURE:
+                name = "Temperature";
+                break;
+            case Sensor.TYPE_PROXIMITY:
+                name = "Proximity";
+                break;
+            case Sensor.TYPE_GRAVITY:
+                name = "Gravity";
+                break;
+            case Sensor.TYPE_LINEAR_ACCELERATION:
+                name = "Linear Acceleration";
+                break;
+            case Sensor.TYPE_ROTATION_VECTOR:
+                name = "Rotation Vector";
+                break;
+            case Sensor.TYPE_RELATIVE_HUMIDITY:
+                name = "Relative Humidity";
+                break;
+            case Sensor.TYPE_AMBIENT_TEMPERATURE:
+                name = "Ambient Temperature";
+                break;
+            case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
+                name = "Magnetic Field Uncalibrated";
+                break;
+            case Sensor.TYPE_GAME_ROTATION_VECTOR:
+                name = "Game Rotation Vector";
+                break;
+            case Sensor.TYPE_GYROSCOPE_UNCALIBRATED:
+                name = "Gyroscope Uncalibrated";
+                break;
+            case Sensor.TYPE_SIGNIFICANT_MOTION:
+                name = "Significant Motion";
+                break;
+            case Sensor.TYPE_STEP_DETECTOR:
+                name = "Step Detector";
+                break;
+            case Sensor.TYPE_STEP_COUNTER:
+                name = "Step Counter";
+                break;
+            case Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR:
+                name = "Geomagnetic Rotation Vector";
+                break;
+            default:
+                name = "<Unknown>";
+        }
+        return String.format("%s (%d)", name, sensorType);
+    }
+
+    public static int getMaxSamplingRateInUs(Context context, int sensorType) {
+        Sensor sensor = SensorCtsHelper.getSensor(context, sensorType);
+        return sensor.getMinDelay();
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestOperation.java
new file mode 100644
index 0000000..902c802
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorTestOperation.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import junit.framework.Assert;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Base test class that supports a basic test operation performed in a sensor.
+ * The class follows a command patter as a base for its work.
+ *
+ * Remarks:
+ * - The class wraps verifications and test checks that are needed to verify the operation.
+ * - The operation runs in a background thread where it performs the bulk of its work.
+ */
+public abstract class SensorTestOperation {
+    private final SensorTestExceptionHandler mExceptionHandler = new SensorTestExceptionHandler();
+
+    protected final String LOG_TAG = "TestRunner";
+    protected final long WAIT_TIMEOUT_IN_MILLISECONDS =
+            TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES);
+
+    private Thread mThread;
+
+    protected int mIterationCount;
+
+    /**
+     * Public API definition.
+     */
+    public synchronized void start() throws Throwable {
+        if(mThread != null) {
+            throw new IllegalStateException("The operation has already been started.");
+        }
+
+        mThread = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    doWork();
+                } catch (Throwable e) {
+                    // log the exception so it can be sent back to the appropriate test thread
+                    this.getUncaughtExceptionHandler().uncaughtException(this, e);
+                }
+            }
+        };
+
+        ++mIterationCount;
+        mThread.setUncaughtExceptionHandler(mExceptionHandler);
+        mThread.start();
+    }
+
+    public synchronized void waitForCompletion() throws Throwable {
+        if(mThread == null) {
+            // let a wait on a stopped operation to be no-op
+            return;
+        }
+        mThread.join(WAIT_TIMEOUT_IN_MILLISECONDS);
+        if(mThread.isAlive()) {
+            // the test is hung so collect the state of the system and fail
+            String operationName = this.getClass().getSimpleName();
+            String message = String.format(
+                    "%s hung. %s. BugReport collected at: %s",
+                    operationName,
+                    this.toString(),
+                    SensorCtsHelper.collectBugreport(operationName));
+            Assert.fail(message);
+        }
+        mThread = null;
+        mExceptionHandler.rethrow();
+    }
+
+    public void execute() throws Throwable {
+        this.start();
+        this.waitForCompletion();
+    }
+
+    @Override
+    public String toString() {
+        return String.format("ThreadId:%d, Iteration:%d", mThread.getId(), mIterationCount);
+    }
+
+    /**
+     * Subclasses implement this method to perform the work associated with the operation they
+     * represent.
+     */
+    protected abstract void doWork() throws Throwable;
+
+    /**
+     * Private helpers.
+     */
+    private class SensorTestExceptionHandler implements Thread.UncaughtExceptionHandler {
+        private final Object mLock = new Object();
+
+        private Throwable mThrowable;
+
+        @Override
+        public void uncaughtException(Thread thread, Throwable throwable) {
+            synchronized(mLock) {
+                // the fist exception is in general the one that is more interesting
+                if(mThrowable != null) {
+                    return;
+                }
+                mThrowable = throwable;
+            }
+        }
+
+        public void rethrow() throws Throwable {
+            Throwable throwable;
+            synchronized(mLock) {
+                throwable = mThrowable;
+                mThrowable = null;
+            }
+            if(throwable != null) {
+                throw throwable;
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelper.java
new file mode 100644
index 0000000..d1013e0
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelper.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Set of static helper methods to verify sensor CTS tests.
+ */
+public class SensorVerificationHelper {
+
+    private static final int MESSAGE_LENGTH = 3;
+
+    /**
+     * Class which holds results from the verification.
+     */
+    public static class VerificationResult {
+        private boolean mFailed = false;
+        private String mMessage = null;
+        private Map<String, Object> mValueMap = new HashMap<String, Object>();
+
+        public void fail(String messageFormat, Object ... args) {
+            mFailed = true;
+            mMessage = String.format(messageFormat, args);
+        }
+
+        public boolean isFailed() {
+            return mFailed;
+        }
+
+        public String getFailureMessage() {
+            return mMessage;
+        }
+
+        public void putValue(String key, Object value) {
+            mValueMap.put(key, value);
+        }
+
+        public Object getValue(String key) {
+            return mValueMap.get(key);
+        }
+    }
+
+    /**
+     * Private constructor for static class.
+     */
+    private SensorVerificationHelper() {}
+
+    /**
+     * Verify that the events are in the correct order.
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @return a {@link VerificationResult} containing the verification info including the keys
+     *     "count" which is the number of events out of order and "positions" which contains an
+     *     array of indexes that were out of order.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifyEventOrdering(TestSensorEvent[] events) {
+        VerificationResult result = new VerificationResult();
+        List<Integer> indices = new ArrayList<Integer>();
+        long maxTimestamp = events[0].timestamp;
+        for (int i = 1; i < events.length; i++) {
+            long currentTimestamp = events[i].timestamp;
+            if (currentTimestamp < maxTimestamp) {
+                indices.add(i);
+            } else if (currentTimestamp > maxTimestamp) {
+                maxTimestamp = currentTimestamp;
+            }
+        }
+
+        result.putValue("count", indices.size());
+        result.putValue("positions", indices);
+
+        if (indices.size() > 0) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(indices.size()).append(" events out of order: ");
+            for (int i = 0; i < Math.min(indices.size(), MESSAGE_LENGTH); i++) {
+                int index = indices.get(i);
+                sb.append(String.format("position=%d, previous=%d, timestamp=%d; ", index,
+                        events[index - 1].timestamp, events[index].timestamp));
+            }
+            if (indices.size() > MESSAGE_LENGTH) {
+                sb.append(indices.size() - MESSAGE_LENGTH).append(" more");
+            } else {
+                // Delete the "; "
+                sb.delete(sb.length() - 2, sb.length());
+            }
+
+            result.fail(sb.toString());
+        }
+
+        return result;
+    }
+
+    /**
+     * Verify that the sensor frequency matches the expected frequency.
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @param expected The expected frequency in Hz
+     * @param threshold The acceptable margin of error in Hz
+     * @return a {@link VerificationResult} containing the verification info including the key
+     *     "frequency" which is the computed frequency of the events in Hz.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifyFrequency(TestSensorEvent[] events, double expected,
+            double threshold) {
+        VerificationResult result = new VerificationResult();
+        List<Long> timestampDelayValues = SensorCtsHelper.getTimestampDelayValues(events);
+        double frequency = SensorCtsHelper.getFrequency(
+                SensorCtsHelper.getMean(timestampDelayValues), TimeUnit.NANOSECONDS);
+        result.putValue("frequency", frequency);
+
+        if (Math.abs(frequency - expected) > threshold) {
+            result.fail("Frequency out of range: frequency=%.2fHz, expected=%.2f+/-%.2fHz",
+                    frequency, expected, threshold);
+        }
+        return result;
+    }
+
+    /**
+     * Verify that the jitter is in an acceptable range
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @param threshold The acceptable margin of error in nanoseconds
+     * @return a {@link VerificationResult} containing the verification info including the keys
+     *     "jitter" which is the list of computed jitter values and "jitter95Percentile" which is
+     *     95th percentile of the jitter values.
+     * @throws IllegalStateException if number of events less than 2.
+     */
+    public static VerificationResult verifyJitter(TestSensorEvent[] events, double threshold) {
+        VerificationResult result = new VerificationResult();
+        List<Double> jitterValues = SensorCtsHelper.getJitterValues(events);
+        double jitter95Percentile = SensorCtsHelper.get95PercentileValue(jitterValues);
+        result.putValue("jitter", jitterValues);
+        result.putValue("jitter95Percentile", jitter95Percentile);
+
+        if (jitter95Percentile > threshold) {
+            result.fail("Jitter out of range: jitter at 95th percentile=%.0fns, expected=<%.0fns",
+                    jitter95Percentile, threshold);
+        }
+        return result;
+    }
+
+    /**
+     * Verify that the means matches the expected measurement.
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @param expected The array of expected values
+     * @param threshold The array of thresholds
+     * @return a {@link VerificationResult} containing the verification info including the key
+     *     "mean" which is the computed means for each value of the sensor.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifyMean(TestSensorEvent[] events, double[] expected,
+            double[] threshold) {
+        VerificationResult result = new VerificationResult();
+        double[] means = SensorCtsHelper.getMeans(events);
+        result.putValue("means", means);
+
+        boolean failed = false;
+        StringBuilder meanSb = new StringBuilder();
+        StringBuilder expectedSb = new StringBuilder();
+
+        if (means.length > 1) {
+            meanSb.append("(");
+            expectedSb.append("(");
+        }
+        for (int i = 0; i < means.length && !failed; i++) {
+            if (Math.abs(means[i] - expected[i]) > threshold[i]) {
+                failed = true;
+            }
+            meanSb.append(String.format("%.2f", means[i]));
+            if (i != means.length - 1) meanSb.append(", ");
+            expectedSb.append(String.format("%.2f+/-%.2f", expected[i], threshold[i]));
+            if (i != means.length - 1) expectedSb.append(", ");
+        }
+        if (means.length > 1) {
+            meanSb.append(")");
+            expectedSb.append(")");
+        }
+
+        if (failed) {
+            result.fail("Mean out of range: mean=%s, expected=%s",
+                    meanSb.toString(), expectedSb.toString());
+        }
+        return result;
+    }
+
+    /**
+     * Verify that the mean of the magnitude of the sensors vector is within the expected range.
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @param expected The expected value
+     * @param threshold The threshold
+     * @return a {@link VerificationResult} containing the verification info including the key
+     *     "magnitude" which is the mean of the computed magnitude of the sensor values.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifyMagnitude(TestSensorEvent[] events, double expected,
+            double threshold) {
+        VerificationResult result = new VerificationResult();
+        Collection<Double> magnitudes = new ArrayList<Double>(events.length);
+
+        for (TestSensorEvent event : events) {
+            double norm = 0;
+            for (int i = 0; i < event.values.length; i++) {
+                norm += event.values[i] * event.values[i];
+            }
+            magnitudes.add(Math.sqrt(norm));
+        }
+
+        double mean = SensorCtsHelper.getMean(magnitudes);
+        result.putValue("magnitude", mean);
+
+        if (Math.abs(mean - expected) > threshold) {
+            result.fail(String.format("Magnitude mean out of range: mean=%s, expected=%s+/-%s",
+                    mean, expected, threshold));
+        }
+        return result;
+    }
+
+    /**
+     * Verify that the sign of each of the sensor values is correct.
+     * <p>
+     * If the value of the measurement is in [-threshold, threshold], the sign is considered 0. If
+     * it is less than -threshold, it is considered -1. If it is greater than threshold, it is
+     * considered 1.
+     * </p>
+     *
+     * @param events
+     * @param threshold The threshold that needs to be crossed to consider a measurement nonzero
+     * @return a {@link VerificationResult} containing the verification info including the key
+     *     "mean" which is the computed means for each value of the sensor.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifySignum(TestSensorEvent[] events, int[] expected,
+            double[] threshold) {
+        VerificationResult result = new VerificationResult();
+        for (int i = 0; i < expected.length; i++) {
+            if (!(expected[i] == -1 || expected[i] == 0 || expected[i] == 1)) {
+                throw new IllegalArgumentException("Expected value must be -1, 0, or 1");
+            }
+        }
+        double[] means = SensorCtsHelper.getMeans(events);
+        result.putValue("means", means);
+
+        boolean failed = false;
+        StringBuilder meanSb = new StringBuilder();
+        StringBuilder expectedSb = new StringBuilder();
+
+        if (means.length > 1) {
+            meanSb.append("(");
+            expectedSb.append("(");
+        }
+        for (int i = 0; i < means.length; i++) {
+            meanSb.append(String.format("%.2f", means[i]));
+            if (i != means.length - 1) meanSb.append(", ");
+
+            if (expected[i] == 0) {
+                if (Math.abs(means[i]) > threshold[i]) {
+                    failed = true;
+                }
+                expectedSb.append(String.format("[%.2f, %.2f]", -threshold[i], threshold[i]));
+            } else {
+                if (expected[i] > 0) {
+                    if (means[i] <= threshold[i]) {
+                        failed = true;
+                    }
+                    expectedSb.append(String.format("(%.2f, inf)", threshold[i]));
+                } else {
+                    if (means[i] >= -1 * threshold[i]) {
+                        failed = true;
+                    }
+                    expectedSb.append(String.format("(-inf, %.2f)", -1 * threshold[i]));
+                }
+            }
+            if (i != means.length - 1) expectedSb.append(", ");
+        }
+        if (means.length > 1) {
+            meanSb.append(")");
+            expectedSb.append(")");
+        }
+
+        if (failed) {
+            result.fail("Signum out of range: mean=%s, expected=%s",
+                    meanSb.toString(), expectedSb.toString());
+        }
+        return result;
+    }
+
+    /**
+     * Verify that the standard deviations is within the expected range.
+     *
+     * @param events The array of {@link TestSensorEvent}
+     * @param threshold The array of thresholds
+     * @return a {@link VerificationResult} containing the verification info including the key
+     *     "stddevs" which is the computed standard deviations for each value of the sensor.
+     * @throws IllegalStateException if number of events less than 1.
+     */
+    public static VerificationResult verifyStandardDeviation(TestSensorEvent[] events,
+            double[] threshold) {
+        VerificationResult result = new VerificationResult();
+        double[] standardDeviations = SensorCtsHelper.getStandardDeviations(events);
+        result.putValue("stddevs", standardDeviations);
+
+        boolean failed = false;
+        StringBuilder meanSb = new StringBuilder();
+        StringBuilder expectedSb = new StringBuilder();
+
+        if (standardDeviations.length > 1) {
+            meanSb.append("(");
+            expectedSb.append("(");
+        }
+        for (int i = 0; i < standardDeviations.length && !failed; i++) {
+            if (standardDeviations[i] > threshold[i]) {
+                failed = true;
+            }
+            meanSb.append(String.format("%.2f", standardDeviations[i]));
+            if (i != standardDeviations.length - 1) meanSb.append(", ");
+            expectedSb.append(String.format("0+/-%.2f", threshold[i]));
+            if (i != standardDeviations.length - 1) expectedSb.append(", ");
+        }
+        if (standardDeviations.length > 1) {
+            meanSb.append(")");
+            expectedSb.append(")");
+        }
+
+        if (failed) {
+            result.fail("Standard deviation out of range: mean=%s, expected=%s",
+                    meanSb.toString(), expectedSb.toString());
+        }
+        return result;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelperTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelperTest.java
new file mode 100644
index 0000000..875fa7f
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorVerificationHelperTest.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2014 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 android.hardware.cts.helpers;
+
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+
+import junit.framework.TestCase;
+
+import java.util.List;
+
+/**
+ * Unit tests for the {@link SensorVerificationHelper} class.
+ */
+public class SensorVerificationHelperTest extends TestCase {
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyEventOrdering(TestSensorEvent[])}.
+     */
+    @SuppressWarnings("unchecked")
+    public void testVerifyEventOrdering() {
+        float[] values = {0, 1, 2, 3, 4};
+
+        long[] timestamps1 = {0, 0, 0, 0, 0};
+        TestSensorEvent[] events1 = getSensorEvents(timestamps1, values);
+        VerificationResult result = SensorVerificationHelper.verifyEventOrdering(events1);
+        assertFalse(result.isFailed());
+        assertEquals(0, result.getValue("count"));
+
+        long[] timestamps2 = {0, 1, 2, 3, 4};
+        TestSensorEvent[] events2 = getSensorEvents(timestamps2, values);
+        result = SensorVerificationHelper.verifyEventOrdering(events2);
+        assertFalse(result.isFailed());
+        assertEquals(0, result.getValue("count"));
+
+        long[] timestamps3 = {0, 2, 1, 3, 4};
+        TestSensorEvent[] events3 = getSensorEvents(timestamps3, values);
+        result = SensorVerificationHelper.verifyEventOrdering(events3);
+        assertTrue(result.isFailed());
+        assertEquals(1, result.getValue("count"));
+        List<Integer> indices = (List<Integer>) result.getValue("positions");
+        assertTrue(indices.contains(2));
+
+        long[] timestamps4 = {4, 0, 1, 2, 3};
+        TestSensorEvent[] events4 = getSensorEvents(timestamps4, values);
+        result = SensorVerificationHelper.verifyEventOrdering(events4);
+        assertTrue(result.isFailed());
+        assertEquals(4, result.getValue("count"));
+        indices = (List<Integer>) result.getValue("positions");
+        assertTrue(indices.contains(1));
+        assertTrue(indices.contains(2));
+        assertTrue(indices.contains(3));
+        assertTrue(indices.contains(4));
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyFrequency(TestSensorEvent[], double, double)}.
+     */
+    public void testVerifyFrequency() {
+        float[] values = {0, 1, 2, 3, 4};
+        long[] timestamps = {0, 1000000, 2000000, 3000000, 4000000};  // 1000Hz
+        TestSensorEvent[] events = getSensorEvents(timestamps, values);
+
+        VerificationResult result = SensorVerificationHelper.verifyFrequency(events, 1000.0, 1.0);
+        assertFalse(result.isFailed());
+        assertEquals(1000.0, (Double) result.getValue("frequency"), 0.01);
+
+        result = SensorVerificationHelper.verifyFrequency(events, 950.0, 100.0);
+        assertFalse(result.isFailed());
+        assertEquals(1000.0, (Double) result.getValue("frequency"), 0.01);
+
+        result = SensorVerificationHelper.verifyFrequency(events, 1050.0, 100.0);
+        assertFalse(result.isFailed());
+        assertEquals(1000.0, (Double) result.getValue("frequency"), 0.01);
+
+        result = SensorVerificationHelper.verifyFrequency(events, 950.0, 25.0);
+        assertTrue(result.isFailed());
+        assertEquals(1000.0, (Double) result.getValue("frequency"), 0.01);
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyJitter(TestSensorEvent[], double)}.
+     */
+    public void testVerifyJitter() {
+        final int SAMPLE_SIZE = 100;
+        float[] values = new float[SAMPLE_SIZE];
+        for (int i = 0; i < SAMPLE_SIZE; i++) {
+            values[i] = i;
+        }
+
+        long[] timestamps1 = new long[SAMPLE_SIZE];  // 100 samples at 1000Hz
+        for (int i = 0; i < SAMPLE_SIZE; i++) {
+            timestamps1[i] = i * 100000;
+        }
+        TestSensorEvent[] events1 = getSensorEvents(timestamps1, values);
+        VerificationResult result = SensorVerificationHelper.verifyJitter(events1, 100000);
+        assertFalse(result.isFailed());
+        assertEquals(0.0, (Double) result.getValue("jitter95Percentile"), 0.01);
+
+        long[] timestamps2 = new long[SAMPLE_SIZE];  // 90 samples at 1000Hz, 10 samples at 2000Hz
+        long timestamp = 0;
+        for (int i = 0; i < SAMPLE_SIZE; i++) {
+            timestamps2[i] = timestamp;
+            timestamp += (i % 10 == 0) ? 500000 : 1000000;
+        }
+        TestSensorEvent[] events2 = getSensorEvents(timestamps2, values);
+        result = SensorVerificationHelper.verifyJitter(events2, 100000);
+        assertTrue(result.isFailed());
+        assertNotNull(result.getValue("jitter"));
+        assertNotNull(result.getValue("jitter95Percentile"));
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyMean(TestSensorEvent[], double[], double[])}.
+     */
+    public void testVerifyMean() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+        float[] values1 = {0, 1, 2, 3, 4};
+        float[] values2 = {1, 2, 3, 4, 5};
+        float[] values3 = {0, 1, 4, 9, 16};
+        TestSensorEvent[] events = getSensorEvents(timestamps, values1, values2, values3);
+
+        double[] expected1 = {2.0, 3.0, 6.0};
+        double[] threshold1 = {0.1, 0.1, 0.1};
+        VerificationResult result = SensorVerificationHelper.verifyMean(events, expected1,
+                threshold1);
+        assertFalse(result.isFailed());
+        double[] means = (double[]) result.getValue("means");
+        assertEquals(2.0, means[0], 0.01);
+        assertEquals(3.0, means[1], 0.01);
+        assertEquals(6.0, means[2], 0.01);
+
+        double[] expected2 = {2.5, 2.5, 5.5};
+        double[] threshold2 = {0.6, 0.6, 0.6};
+        result = SensorVerificationHelper.verifyMean(events, expected2, threshold2);
+        assertFalse(result.isFailed());
+
+        double[] expected3 = {2.5, 2.5, 5.5};
+        double[] threshold3 = {0.1, 0.6, 0.6};
+        result = SensorVerificationHelper.verifyMean(events, expected3, threshold3);
+        assertTrue(result.isFailed());
+
+        double[] expected4 = {2.5, 2.5, 5.5};
+        double[] threshold4 = {0.6, 0.1, 0.6};
+        result = SensorVerificationHelper.verifyMean(events, expected4, threshold4);
+        assertTrue(result.isFailed());
+
+        double[] expected5 = {2.5, 2.5, 5.5};
+        double[] threshold5 = {0.6, 0.6, 0.1};
+        result = SensorVerificationHelper.verifyMean(events, expected5, threshold5);
+        assertTrue(result.isFailed());
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyMagnitude(TestSensorEvent[], double, double)}.
+     */
+    public void testVerifyMagnitude() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+        float[] values1 = {0, 4, 3, 0, 6};
+        float[] values2 = {3, 0, 4, 0, 0};
+        float[] values3 = {4, 3, 0, 4, 0};
+        TestSensorEvent[] events = getSensorEvents(timestamps, values1, values2, values3);
+
+        double expected = 5.0;
+        double threshold = 0.1;
+        VerificationResult result = SensorVerificationHelper.verifyMagnitude(events, expected,
+                threshold);
+        assertFalse(result.isFailed());
+        assertEquals(5.0, (Double) result.getValue("magnitude"), 0.01);
+
+        expected = 4.5;
+        threshold = 0.6;
+        result = SensorVerificationHelper.verifyMagnitude(events, expected, threshold);
+        assertFalse(result.isFailed());
+
+        expected = 5.5;
+        threshold = 0.6;
+        result = SensorVerificationHelper.verifyMagnitude(events, expected, threshold);
+        assertFalse(result.isFailed());
+
+        expected = 4.5;
+        threshold = 0.1;
+        result = SensorVerificationHelper.verifyMagnitude(events, expected, threshold);
+        assertTrue(result.isFailed());
+
+        expected = 5.5;
+        threshold = 0.1;
+        result = SensorVerificationHelper.verifyMagnitude(events, expected, threshold);
+        assertTrue(result.isFailed());
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifySignum(TestSensorEvent[], int[], double[])}.
+     */
+    public void testVerifySignum() {
+        long[] timestamps = {0};
+        float[][] values = {{1}, {0.2f}, {0}, {-0.2f}, {-1}};
+        TestSensorEvent[] events = getSensorEvents(timestamps, values);
+
+        int[] expected1 = {1, 1, 0, -1, -1};
+        double[] threshold1 = {0.1, 0.1, 0.1, 0.1, 0.1};
+        VerificationResult result = SensorVerificationHelper.verifySignum(events, expected1,
+                threshold1);
+        assertFalse(result.isFailed());
+        assertNotNull(result.getValue("means"));
+
+        int[] expected2 = {1, 0, 0, 0, -1};
+        double[] threshold2 = {0.5, 0.5, 0.5, 0.5, 0.5};
+        result = SensorVerificationHelper.verifySignum(events, expected2, threshold2);
+        assertFalse(result.isFailed());
+
+        int[] expected3 = {0, 1, 0, -1, 0};
+        double[] threshold3 = {1.5, 0.1, 0.1, 0.1, 1.5};
+        result = SensorVerificationHelper.verifySignum(events, expected3, threshold3);
+        assertFalse(result.isFailed());
+
+        int[] expected4 = {1, 0, 0, 0, 1};
+        double[] threshold4 = {0.5, 0.5, 0.5, 0.5, 0.5};
+        result = SensorVerificationHelper.verifySignum(events, expected4, threshold4);
+        assertTrue(result.isFailed());
+
+        int[] expected5 = {-1, 0, 0, 0, -1};
+        double[] threshold5 = {0.5, 0.5, 0.5, 0.5, 0.5};
+        result = SensorVerificationHelper.verifySignum(events, expected5, threshold5);
+        assertTrue(result.isFailed());
+    }
+
+    /**
+     * Test {@link SensorVerificationHelper#verifyStandardDeviation(TestSensorEvent[], double[])}.
+     */
+    public void testVerifyStandardDeviation() {
+        long[] timestamps = {0, 1, 2, 3, 4};
+        float[] values1 = {0, 1, 2, 3, 4};  // sqrt(2.0)
+        float[] values2 = {1, 2, 3, 4, 5};  // sqrt(2.0)
+        float[] values3 = {0, 2, 4, 6, 8};  // sqrt(8.0)
+        TestSensorEvent[] events = getSensorEvents(timestamps, values1, values2, values3);
+
+        double[] threshold1 = {2, 2, 3};
+        VerificationResult result = SensorVerificationHelper.verifyStandardDeviation(events,
+                threshold1);
+        assertFalse(result.isFailed());
+        double[] means = (double[]) result.getValue("stddevs");
+        assertEquals(Math.sqrt(2.0), means[0], 0.01);
+        assertEquals(Math.sqrt(2.0), means[1], 0.01);
+        assertEquals(Math.sqrt(8.0), means[2], 0.01);
+
+        double[] threshold2 = {1, 2, 3};
+        result = SensorVerificationHelper.verifyStandardDeviation(events, threshold2);
+        assertTrue(result.isFailed());
+
+        double[] threshold3 = {2, 1, 3};
+        result = SensorVerificationHelper.verifyStandardDeviation(events, threshold3);
+        assertTrue(result.isFailed());
+
+        double[] threshold4 = {2, 2, 2};
+        result = SensorVerificationHelper.verifyStandardDeviation(events, threshold4);
+        assertTrue(result.isFailed());
+    }
+
+    private TestSensorEvent[] getSensorEvents(long[] timestamps, float[] ... values) {
+        TestSensorEvent[] events = new TestSensorEvent[timestamps.length];
+        for (int i = 0; i < timestamps.length; i++) {
+            float[] eventValues = new float[values.length];
+            for (int j = 0; j < values.length; j++) {
+                eventValues[j] = values[j][i];
+            }
+            events[i] = new TestSensorEvent(null, timestamps[i], 0, eventValues);
+        }
+        return events;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEvent.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEvent.java
new file mode 100644
index 0000000..48bc1d3
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEvent.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers;
+
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+
+/**
+ * Test class to wrap SensorEvent.
+ * It currently only provides a way to clone SensorEvent data, but in the future it can contain
+ * verifications and test checks.
+ */
+public class TestSensorEvent {
+    public final Sensor sensor;
+    public final long timestamp;
+    public final int accuracy;
+    public final float values[];
+
+    public TestSensorEvent(SensorEvent event) {
+        values = new float[event.values.length];
+        System.arraycopy(event.values, 0, values, 0, event.values.length);
+
+        sensor = event.sensor;
+        timestamp = event.timestamp;
+        accuracy = event.accuracy;
+    }
+
+    /**
+     * Constructor for TestSensorEvent. Exposed for unit testing.
+     */
+    protected TestSensorEvent(Sensor sensor, long timestamp, int accuracy, float[] values) {
+        this.sensor = sensor;
+        this.timestamp = timestamp;
+        this.accuracy = accuracy;
+        this.values = values;
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/ParallelCompositeSensorTestOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/ParallelCompositeSensorTestOperation.java
new file mode 100644
index 0000000..3730f4b
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/ParallelCompositeSensorTestOperation.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.hardware.cts.helpers.SensorTestOperation;
+
+import java.util.ArrayList;
+
+/**
+ * A test operation that groups a set of SensorTestOperations and allows to execute them all in
+ * parallel.
+ * This class can be combined to compose other primitive SensorTestOperations.
+ */
+public class ParallelCompositeSensorTestOperation extends SensorTestOperation {
+    private final ArrayList<SensorTestOperation> mOperations = new ArrayList<SensorTestOperation>();
+
+    /**
+     * There is no synchronization
+     * @param operations
+     */
+    public void add(SensorTestOperation ... operations) {
+        synchronized (mOperations) {
+            for(SensorTestOperation operation : operations) {
+                mOperations.add(operation);
+            }
+        }
+    }
+
+    @Override
+    protected void doWork() throws Throwable {
+        synchronized (mOperations) {
+            for(SensorTestOperation operation : mOperations) {
+                operation.start();
+            }
+            for(SensorTestOperation operation : mOperations) {
+                operation.waitForCompletion();
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/RepeatingSensorTestOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/RepeatingSensorTestOperation.java
new file mode 100644
index 0000000..7a3c450
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/RepeatingSensorTestOperation.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.hardware.cts.helpers.SensorTestOperation;
+
+/**
+ * High level SensorTestOperation that executes the inner operation in a loop.
+ */
+public class RepeatingSensorTestOperation extends SensorTestOperation {
+    private final SensorTestOperation mSensorTestOperation;
+    private final int mRepetitionCount;
+
+    public RepeatingSensorTestOperation(SensorTestOperation operation, int repetitionCount) {
+        mSensorTestOperation = operation;
+        mRepetitionCount = repetitionCount;
+    }
+
+    @Override
+    protected void doWork() throws Throwable {
+        for(int i = 0; i < mRepetitionCount; ++i) {
+            mSensorTestOperation.execute();
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/SequentialCompositeSensorTestOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/SequentialCompositeSensorTestOperation.java
new file mode 100644
index 0000000..4b92168
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/SequentialCompositeSensorTestOperation.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.hardware.cts.helpers.SensorTestOperation;
+
+import java.util.ArrayList;
+
+/**
+ * A test operation that groups a set of SensorTestOperations and allows to execute them in a
+ * sequence, each operation executes in the order they are added to the composite container.
+ * This class can be combined to compose other primitive SensorTestOperations.
+ */
+public class SequentialCompositeSensorTestOperation extends SensorTestOperation {
+    private final ArrayList<SensorTestOperation> mOperations = new ArrayList<SensorTestOperation>();
+
+    /**
+     * There is no synchronization
+     * @param operations
+     */
+    public void add(SensorTestOperation ... operations) {
+        synchronized (mOperations) {
+            for(SensorTestOperation operation : operations) {
+                mOperations.add(operation);
+            }
+        }
+    }
+
+    @Override
+    protected void doWork() throws Throwable {
+        synchronized (mOperations) {
+            for(SensorTestOperation operation : mOperations) {
+                operation.execute();
+            }
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyEventOrderingOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyEventOrderingOperation.java
new file mode 100644
index 0000000..03d0f9a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyEventOrderingOperation.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+/**
+ * Test Operation class that validates the ordering of sensor events.
+ */
+public class VerifyEventOrderingOperation extends SensorTestOperation {
+    private SensorManagerTestVerifier mSensor;
+
+    public VerifyEventOrderingOperation(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            int reportLatencyInUs) {
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                samplingRateInUs,
+                reportLatencyInUs);
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifyEventOrdering(events);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Ordering",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyJitteringOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyJitteringOperation.java
new file mode 100644
index 0000000..303dc9b
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyJitteringOperation.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+import java.security.InvalidParameterException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test Operation class that validates the sampling rate jittering of a given sensor.
+ *
+ * Remarks:
+ * - In order to guarantee proper results in any environment, the maximum sampling rate supported by
+ *   the Sensor is used, this guarantees the frequency reference for the test.
+ */
+public class VerifyJitteringOperation extends SensorTestOperation {
+    protected SensorManagerTestVerifier mSensor;
+    protected long mExpectedtimestampInNs;
+    protected long mThresholdPercentage;
+    protected long mThresholdInNs;
+
+    public VerifyJitteringOperation(
+            Context context,
+            int sensorType,
+            int reportLatencyInUs,
+            int thresholdPercentageOfNs) throws InvalidParameterException {
+        if(thresholdPercentageOfNs < 0) {
+            throw new InvalidParameterException("thresholdPercentageOfNs needs to be >= 0");
+        }
+        // use the max sampling frequency the sensor reports to guarantee the results
+        int maxSamplingRateInUs = SensorTestInformation.getMaxSamplingRateInUs(context, sensorType);
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                maxSamplingRateInUs,
+                reportLatencyInUs);
+        // set expectations
+        mExpectedtimestampInNs = TimeUnit.NANOSECONDS.convert(
+                maxSamplingRateInUs,
+                TimeUnit.MICROSECONDS);
+        mThresholdPercentage = thresholdPercentageOfNs;
+        mThresholdInNs = mExpectedtimestampInNs / mThresholdPercentage;
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifyJitter(events, mThresholdInNs);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Jitter(95%ile)",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMagnitudeOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMagnitudeOperation.java
new file mode 100644
index 0000000..cbcff6a
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMagnitudeOperation.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+/**
+ * Test Operation class that validates the norm of a given sensor.
+ * The operation relies in the number of axes each sensor type reports.
+ */
+public class VerifyMagnitudeOperation extends SensorTestOperation {
+    private SensorManagerTestVerifier mSensor;
+    private int mAxisCount;
+    private double mReferenceValue;
+    private double mThreshold;
+
+    public VerifyMagnitudeOperation(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            float referenceValue,
+            float threshold) {
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                samplingRateInUs,
+                0 /*reportLatencyInUs*/);
+        // set expectations
+        mAxisCount = SensorTestInformation.getAxisCount(mSensor.getUnderlyingSensor().getType());
+        mReferenceValue = referenceValue;
+        mThreshold = threshold;
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(1);
+        VerificationResult result = SensorVerificationHelper.verifyMagnitude(events, mReferenceValue,
+                mThreshold);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Norm",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMaximumFrequencyOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMaximumFrequencyOperation.java
new file mode 100644
index 0000000..0af15a2
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMaximumFrequencyOperation.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+import java.security.InvalidParameterException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test Operation class that validates the max sampling rate of a given sensor.
+ *
+ * Remarks:
+ * - In order to guarantee proper results in any environment, the maximum sampling rate supported by
+ *   the Sensor is used, this guarantees the frequency reference for the test.
+ */
+public class VerifyMaximumFrequencyOperation extends SensorTestOperation {
+    protected SensorManagerTestVerifier mSensor;
+    protected long mExpectedTimestampInNs;
+    protected long mThresholdPercentage;
+    protected long mThresholdInNs;
+
+    public VerifyMaximumFrequencyOperation(
+            Context context,
+            int sensorType,
+            int reportLatencyInUs,
+            int thresholdPercentageOfNs) throws InvalidParameterException {
+        if(thresholdPercentageOfNs < 0) {
+            throw new InvalidParameterException("thresholdPercentageOfNs needs to be >= 0");
+        }
+        // use the max sampling frequency the sensor reports to guarantee the results
+        int maxSamplingRateInUs = SensorTestInformation.getMaxSamplingRateInUs(context, sensorType);
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                maxSamplingRateInUs,
+                reportLatencyInUs);
+        // set expectations
+        mExpectedTimestampInNs = TimeUnit.NANOSECONDS.convert(
+                maxSamplingRateInUs,
+                TimeUnit.MICROSECONDS);
+        mThresholdPercentage = thresholdPercentageOfNs;
+        mThresholdInNs = mExpectedTimestampInNs / mThresholdPercentage;
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifyFrequency(events,
+                mExpectedTimestampInNs, mThresholdInNs);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Frequency",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMeasurementsOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMeasurementsOperation.java
new file mode 100644
index 0000000..2368eb4
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyMeasurementsOperation.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+import java.security.InvalidParameterException;
+
+/**
+ * Test Operation class that validates the measurements of a a given sensor.
+ * The operation relies on the number of axes each sensor type reports.
+ * The verification calculates the mean for each axis on the measurements, and verifies that they
+ * fall into the expected intervals.
+ */
+public class VerifyMeasurementsOperation extends SensorTestOperation {
+    private final SensorManagerTestVerifier mSensor;
+    private final int mAxisCount;
+    private final double[] mReferenceValues;
+    private final double[] mThreshold;
+
+    public VerifyMeasurementsOperation(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            int reportLatencyInUs,
+            double referenceValues[],
+            float threshold) {
+        mAxisCount = SensorTestInformation.getAxisCount(sensorType);
+        if(mAxisCount != referenceValues.length) {
+            throw new InvalidParameterException(
+                    String.format("%d reference values are expected.", mAxisCount));
+        }
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                samplingRateInUs,
+                reportLatencyInUs);
+        // set expectations
+        mReferenceValues = referenceValues;
+        mThreshold = new double[mAxisCount];
+        for (int i = 0; i < mThreshold.length; i++) {
+            mThreshold[i] = threshold;
+        }
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifyMean(events, mReferenceValues,
+                mThreshold);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Measurement",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifySignumOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifySignumOperation.java
new file mode 100644
index 0000000..f58baa1
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifySignumOperation.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+import java.security.InvalidParameterException;
+
+/**
+ * Test Operation class that validates the sign of measurements of a a given sensor.
+ * The operation relies in the number of axes each sensor type reports.
+ */
+public class VerifySignumOperation extends SensorTestOperation {
+    private final SensorManagerTestVerifier mSensor;
+    private final int mAxisCount;
+    private final int mReferenceValues[];
+    private final double mNoiseThresholds[];
+
+    /**
+     * @param noiseThreshold Defines the threshold that needs to be crossed to consider a
+     *                       measurement different from zero
+     */
+    public VerifySignumOperation(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            int referenceValues[],
+            double noiseThreshold) {
+        mAxisCount = SensorTestInformation.getAxisCount(sensorType);
+        if(mAxisCount != referenceValues.length) {
+            throw new InvalidParameterException(
+                    String.format("%d reference values are expected.", mAxisCount));
+        }
+        for(int i = 0; i < referenceValues.length; ++i) {
+            int value = referenceValues[i];
+            if(value != 0 && value != -1 && value != +1) {
+                throw new InvalidParameterException(
+                        "A ReferenceValue can only be one of the following: -1, 0, +1");
+            }
+        }
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                samplingRateInUs,
+                0 /*reportLatencyInUs*/);
+        // set expectations
+        mReferenceValues = referenceValues;
+        mNoiseThresholds = new double[mReferenceValues.length];
+        for (int i = 0; i < mNoiseThresholds.length; i++) {
+            mNoiseThresholds[i] = noiseThreshold;
+        }
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifySignum(events, mReferenceValues,
+                mNoiseThresholds);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "Measurement",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyStandardDeviationOperation.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyStandardDeviationOperation.java
new file mode 100644
index 0000000..05b92e0
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorTestOperations/VerifyStandardDeviationOperation.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 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 android.hardware.cts.helpers.sensorTestOperations;
+
+import android.content.Context;
+import android.hardware.cts.helpers.SensorCtsHelper;
+import android.hardware.cts.helpers.SensorManagerTestVerifier;
+import android.hardware.cts.helpers.SensorTestInformation;
+import android.hardware.cts.helpers.SensorTestOperation;
+import android.hardware.cts.helpers.SensorVerificationHelper;
+import android.hardware.cts.helpers.SensorVerificationHelper.VerificationResult;
+import android.hardware.cts.helpers.TestSensorEvent;
+
+import junit.framework.Assert;
+
+/**
+ * Test Operation class that validates the standard deviation of a given sensor.
+ */
+public class VerifyStandardDeviationOperation extends SensorTestOperation {
+    private SensorManagerTestVerifier mSensor;
+    private int mAxisCount;
+    private double[] mExpectedStandardDeviation;
+
+    public VerifyStandardDeviationOperation(
+            Context context,
+            int sensorType,
+            int samplingRateInUs,
+            int reportLatencyInUs,
+            float expectedStandardDeviation) {
+        mSensor = new SensorManagerTestVerifier(
+                context,
+                sensorType,
+                samplingRateInUs,
+                reportLatencyInUs);
+        // set expectations
+        mAxisCount = SensorTestInformation.getAxisCount(mSensor.getUnderlyingSensor().getType());
+        mExpectedStandardDeviation = new double[mAxisCount];
+        for (int i = 0; i < mExpectedStandardDeviation.length; i++) {
+            mExpectedStandardDeviation[i] = expectedStandardDeviation;
+        }
+    }
+
+    @Override
+    public void doWork() {
+        TestSensorEvent[] events = mSensor.collectEvents(100);
+        VerificationResult result = SensorVerificationHelper.verifyStandardDeviation(events,
+                mExpectedStandardDeviation);
+        if (result.isFailed()) {
+            Assert.fail(SensorCtsHelper.formatAssertionMessage(
+                    "StandardDeviation",
+                    this,
+                    mSensor.getUnderlyingSensor(),
+                    result.getFailureMessage()));
+        }
+    }
+}
diff --git a/tests/tests/keystore/Android.mk b/tests/tests/keystore/Android.mk
index 62c3301..f2dae38 100644
--- a/tests/tests/keystore/Android.mk
+++ b/tests/tests/keystore/Android.mk
@@ -20,7 +20,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner core-tests-support
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/keystore/AndroidManifest.xml b/tests/tests/keystore/AndroidManifest.xml
index a19c983..0ce9f09 100644
--- a/tests/tests/keystore/AndroidManifest.xml
+++ b/tests/tests/keystore/AndroidManifest.xml
@@ -19,6 +19,7 @@
     package="com.android.cts.keystore">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.INTERNET" />
     <application>
         <uses-library android:name="android.test.runner" />
     </application>
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java
index ecc06c6..9127984 100644
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyPairGeneratorTest.java
@@ -20,19 +20,43 @@
 import android.test.AndroidTestCase;
 
 import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.Socket;
 import java.security.KeyPair;
 import java.security.KeyPairGenerator;
 import java.security.KeyStore;
+import java.security.Principal;
 import java.security.PrivateKey;
 import java.security.PublicKey;
 import java.security.SecureRandom;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.RSAKeyGenParameterSpec;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509ExtendedKeyManager;
 import javax.security.auth.x500.X500Principal;
 
+import libcore.java.security.TestKeyStore;
+import libcore.javax.net.ssl.TestKeyManager;
+import libcore.javax.net.ssl.TestSSLContext;
+
 public class AndroidKeyPairGeneratorTest extends AndroidTestCase {
     private KeyPairGenerator mGenerator;
 
@@ -106,7 +130,203 @@
                 new SecureRandom());
     }
 
-    public void testKeyPairGenerator_GenerateKeyPair_Unencrypted_Success() throws Exception {
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 1024, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_2048_Unencrypted_Success()
+            throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_DSA_SpecifiedParams_Unencrypted_Success()
+            throws Exception {
+        /*
+         * generated using: openssl dsaparam -C 2048
+         */
+        BigInteger p = new BigInteger(1, new byte[] {
+                (byte) 0xC0, (byte) 0x3D, (byte) 0x86, (byte) 0x09, (byte) 0xCA, (byte) 0x8C,
+                (byte) 0x37, (byte) 0xCA, (byte) 0xCC, (byte) 0x4A, (byte) 0x81, (byte) 0xBD,
+                (byte) 0xD8, (byte) 0x50, (byte) 0x77, (byte) 0xCD, (byte) 0xDD, (byte) 0x32,
+                (byte) 0x0B, (byte) 0x43, (byte) 0xBF, (byte) 0x42, (byte) 0x06, (byte) 0x5A,
+                (byte) 0x3D, (byte) 0x18, (byte) 0x50, (byte) 0x47, (byte) 0x79, (byte) 0xE1,
+                (byte) 0x5B, (byte) 0x86, (byte) 0x03, (byte) 0xB9, (byte) 0x28, (byte) 0x9C,
+                (byte) 0x18, (byte) 0xA9, (byte) 0xF5, (byte) 0xD6, (byte) 0xF4, (byte) 0x94,
+                (byte) 0x5B, (byte) 0x87, (byte) 0x58, (byte) 0xCA, (byte) 0xB2, (byte) 0x1E,
+                (byte) 0xFC, (byte) 0xED, (byte) 0x37, (byte) 0xC3, (byte) 0x49, (byte) 0xAC,
+                (byte) 0xFA, (byte) 0x46, (byte) 0xDB, (byte) 0x7A, (byte) 0x50, (byte) 0x96,
+                (byte) 0xCF, (byte) 0x52, (byte) 0xD7, (byte) 0x4E, (byte) 0xEB, (byte) 0x26,
+                (byte) 0x41, (byte) 0xA2, (byte) 0x6F, (byte) 0x99, (byte) 0x80, (byte) 0x9F,
+                (byte) 0x0F, (byte) 0x0A, (byte) 0xA8, (byte) 0x0D, (byte) 0xAC, (byte) 0xAB,
+                (byte) 0xEF, (byte) 0x7D, (byte) 0xE7, (byte) 0x4C, (byte) 0xF1, (byte) 0x88,
+                (byte) 0x44, (byte) 0xC9, (byte) 0x17, (byte) 0xD0, (byte) 0xBB, (byte) 0xE2,
+                (byte) 0x01, (byte) 0x8C, (byte) 0xC1, (byte) 0x02, (byte) 0x1D, (byte) 0x3C,
+                (byte) 0x15, (byte) 0xB7, (byte) 0x41, (byte) 0x30, (byte) 0xD8, (byte) 0x11,
+                (byte) 0xBD, (byte) 0x6A, (byte) 0x2A, (byte) 0x0D, (byte) 0x36, (byte) 0x44,
+                (byte) 0x9C, (byte) 0x3F, (byte) 0x32, (byte) 0xE2, (byte) 0x1C, (byte) 0xFB,
+                (byte) 0xE3, (byte) 0xFF, (byte) 0xCC, (byte) 0x1A, (byte) 0x72, (byte) 0x38,
+                (byte) 0x37, (byte) 0x69, (byte) 0x5E, (byte) 0x35, (byte) 0x73, (byte) 0xE1,
+                (byte) 0x1E, (byte) 0x74, (byte) 0x35, (byte) 0x44, (byte) 0x07, (byte) 0xB5,
+                (byte) 0x2F, (byte) 0x0B, (byte) 0x60, (byte) 0xF4, (byte) 0xA9, (byte) 0xE0,
+                (byte) 0x81, (byte) 0xB2, (byte) 0xCD, (byte) 0x8B, (byte) 0x82, (byte) 0x76,
+                (byte) 0x7F, (byte) 0xD4, (byte) 0x17, (byte) 0x32, (byte) 0x86, (byte) 0x98,
+                (byte) 0x7C, (byte) 0x85, (byte) 0x66, (byte) 0xF6, (byte) 0x77, (byte) 0xED,
+                (byte) 0x8B, (byte) 0x1A, (byte) 0x52, (byte) 0x16, (byte) 0xDA, (byte) 0x1C,
+                (byte) 0xA7, (byte) 0x16, (byte) 0x79, (byte) 0x20, (byte) 0x1C, (byte) 0x99,
+                (byte) 0x5F, (byte) 0x12, (byte) 0x66, (byte) 0x15, (byte) 0x9F, (byte) 0xE5,
+                (byte) 0x73, (byte) 0xA9, (byte) 0x61, (byte) 0xBA, (byte) 0xA7, (byte) 0x23,
+                (byte) 0x93, (byte) 0x77, (byte) 0xB5, (byte) 0xF6, (byte) 0xEC, (byte) 0x13,
+                (byte) 0xBF, (byte) 0x95, (byte) 0x60, (byte) 0x78, (byte) 0x84, (byte) 0xE3,
+                (byte) 0x44, (byte) 0xEC, (byte) 0x74, (byte) 0xC2, (byte) 0xCB, (byte) 0xD4,
+                (byte) 0x70, (byte) 0xC5, (byte) 0x7B, (byte) 0xF8, (byte) 0x07, (byte) 0x3B,
+                (byte) 0xEB, (byte) 0x9F, (byte) 0xC9, (byte) 0x7D, (byte) 0xE0, (byte) 0xA5,
+                (byte) 0xBA, (byte) 0x68, (byte) 0x7B, (byte) 0xF4, (byte) 0x70, (byte) 0x40,
+                (byte) 0xAE, (byte) 0xE9, (byte) 0x65, (byte) 0xEE, (byte) 0x5B, (byte) 0x71,
+                (byte) 0x36, (byte) 0x0B, (byte) 0xB0, (byte) 0xA2, (byte) 0x98, (byte) 0x7D,
+                (byte) 0xE3, (byte) 0x24, (byte) 0x95, (byte) 0x2B, (byte) 0xC2, (byte) 0x0A,
+                (byte) 0x78, (byte) 0x3D, (byte) 0xCC, (byte) 0x3A, (byte) 0xEE, (byte) 0xED,
+                (byte) 0x48, (byte) 0xEB, (byte) 0xA3, (byte) 0x78, (byte) 0xA8, (byte) 0x9D,
+                (byte) 0x0A, (byte) 0x8F, (byte) 0x9E, (byte) 0x59, (byte) 0x2C, (byte) 0x44,
+                (byte) 0xB5, (byte) 0xF9, (byte) 0x53, (byte) 0x43,
+        });
+
+        BigInteger q = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x9B, (byte) 0x1D, (byte) 0xC0, (byte) 0xE3, (byte) 0xF6,
+                (byte) 0x4A, (byte) 0x35, (byte) 0xE1, (byte) 0x8A, (byte) 0x43, (byte) 0xC2,
+                (byte) 0x9C, (byte) 0xF9, (byte) 0x52, (byte) 0x8F, (byte) 0x94, (byte) 0xA1,
+                (byte) 0x12, (byte) 0x11, (byte) 0xDB, (byte) 0x9A, (byte) 0xB6, (byte) 0x35,
+                (byte) 0x56, (byte) 0x26, (byte) 0x60, (byte) 0x89, (byte) 0x11, (byte) 0xAC,
+                (byte) 0xA8, (byte) 0xE5,
+        });
+
+        BigInteger g = new BigInteger(1, new byte[] {
+                (byte) 0xA1, (byte) 0x5C, (byte) 0x57, (byte) 0x15, (byte) 0xC3, (byte) 0xD9,
+                (byte) 0xD7, (byte) 0x41, (byte) 0x89, (byte) 0xD6, (byte) 0xB8, (byte) 0x7B,
+                (byte) 0xF3, (byte) 0xE0, (byte) 0xB3, (byte) 0xC5, (byte) 0xD1, (byte) 0xAA,
+                (byte) 0xF9, (byte) 0x55, (byte) 0x48, (byte) 0xF1, (byte) 0xDA, (byte) 0xE8,
+                (byte) 0x6F, (byte) 0x51, (byte) 0x05, (byte) 0xB2, (byte) 0xC9, (byte) 0x64,
+                (byte) 0xDA, (byte) 0x5F, (byte) 0xD4, (byte) 0xAA, (byte) 0xFD, (byte) 0x67,
+                (byte) 0xE0, (byte) 0x10, (byte) 0x2C, (byte) 0x1F, (byte) 0x03, (byte) 0x10,
+                (byte) 0xD4, (byte) 0x4B, (byte) 0x20, (byte) 0x82, (byte) 0x2B, (byte) 0x04,
+                (byte) 0xF9, (byte) 0x09, (byte) 0xAE, (byte) 0x28, (byte) 0x3D, (byte) 0x9B,
+                (byte) 0xFF, (byte) 0x87, (byte) 0x76, (byte) 0xCD, (byte) 0xF0, (byte) 0x11,
+                (byte) 0xB7, (byte) 0xEA, (byte) 0xE6, (byte) 0xCD, (byte) 0x60, (byte) 0xD3,
+                (byte) 0x8C, (byte) 0x74, (byte) 0xD3, (byte) 0x45, (byte) 0x63, (byte) 0x69,
+                (byte) 0x3F, (byte) 0x1D, (byte) 0x31, (byte) 0x25, (byte) 0x49, (byte) 0x97,
+                (byte) 0x4B, (byte) 0x73, (byte) 0x34, (byte) 0x12, (byte) 0x73, (byte) 0x27,
+                (byte) 0x4C, (byte) 0xDA, (byte) 0xF3, (byte) 0x08, (byte) 0xA8, (byte) 0xA9,
+                (byte) 0x27, (byte) 0xE4, (byte) 0xB8, (byte) 0xD6, (byte) 0xB5, (byte) 0xC4,
+                (byte) 0x18, (byte) 0xED, (byte) 0xBD, (byte) 0x6F, (byte) 0xA2, (byte) 0x36,
+                (byte) 0xA2, (byte) 0x9C, (byte) 0x27, (byte) 0x62, (byte) 0x7F, (byte) 0x93,
+                (byte) 0xD7, (byte) 0x52, (byte) 0xA9, (byte) 0x76, (byte) 0x55, (byte) 0x99,
+                (byte) 0x00, (byte) 0x5B, (byte) 0xC2, (byte) 0xB9, (byte) 0x18, (byte) 0xAC,
+                (byte) 0x6B, (byte) 0x83, (byte) 0x0D, (byte) 0xA1, (byte) 0xC5, (byte) 0x01,
+                (byte) 0x1A, (byte) 0xE5, (byte) 0x4D, (byte) 0x2F, (byte) 0xCF, (byte) 0x5D,
+                (byte) 0xB2, (byte) 0xE7, (byte) 0xC7, (byte) 0xCB, (byte) 0x2C, (byte) 0xFF,
+                (byte) 0x51, (byte) 0x1B, (byte) 0x9D, (byte) 0xA4, (byte) 0x05, (byte) 0xEB,
+                (byte) 0x17, (byte) 0xD8, (byte) 0x97, (byte) 0x9D, (byte) 0x0C, (byte) 0x59,
+                (byte) 0x92, (byte) 0x8A, (byte) 0x03, (byte) 0x34, (byte) 0xFD, (byte) 0x16,
+                (byte) 0x0F, (byte) 0x2A, (byte) 0xF9, (byte) 0x7D, (byte) 0xC3, (byte) 0x41,
+                (byte) 0x0D, (byte) 0x06, (byte) 0x5A, (byte) 0x4B, (byte) 0x34, (byte) 0xD5,
+                (byte) 0xF5, (byte) 0x09, (byte) 0x1C, (byte) 0xCE, (byte) 0xA7, (byte) 0x19,
+                (byte) 0x6D, (byte) 0x04, (byte) 0x53, (byte) 0x71, (byte) 0xCC, (byte) 0x84,
+                (byte) 0xA0, (byte) 0xB2, (byte) 0xA0, (byte) 0x68, (byte) 0xA3, (byte) 0x40,
+                (byte) 0xC0, (byte) 0x67, (byte) 0x38, (byte) 0x96, (byte) 0x73, (byte) 0x2E,
+                (byte) 0x8E, (byte) 0x2A, (byte) 0x9D, (byte) 0x56, (byte) 0xE9, (byte) 0xAC,
+                (byte) 0xC7, (byte) 0xEC, (byte) 0x84, (byte) 0x7F, (byte) 0xFC, (byte) 0xE0,
+                (byte) 0x69, (byte) 0x03, (byte) 0x8B, (byte) 0x48, (byte) 0x64, (byte) 0x76,
+                (byte) 0x85, (byte) 0xA5, (byte) 0x10, (byte) 0xD9, (byte) 0x31, (byte) 0xC3,
+                (byte) 0x8B, (byte) 0x07, (byte) 0x48, (byte) 0x62, (byte) 0xF6, (byte) 0x68,
+                (byte) 0xF2, (byte) 0x96, (byte) 0xB2, (byte) 0x18, (byte) 0x5B, (byte) 0xFF,
+                (byte) 0x6D, (byte) 0xD1, (byte) 0x6B, (byte) 0xF5, (byte) 0xFD, (byte) 0x81,
+                (byte) 0xF1, (byte) 0xFD, (byte) 0x04, (byte) 0xF0, (byte) 0x9F, (byte) 0xB7,
+                (byte) 0x08, (byte) 0x95, (byte) 0x57, (byte) 0x48, (byte) 0x07, (byte) 0x00,
+                (byte) 0x52, (byte) 0xEC, (byte) 0x75, (byte) 0x91, (byte) 0x02, (byte) 0x11,
+                (byte) 0xA3, (byte) 0x64, (byte) 0x26, (byte) 0xCA,
+        });
+
+        AlgorithmParameterSpec spec = new DSAParameterSpec(p, q, g);
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("DSA")
+                .setKeySize(2048)
+                .setAlgorithmParameterSpec(spec)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "DSA", 2048, spec, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 256, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_EC_P521_Unencrypted_Success() throws Exception {
+        mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
+                .setAlias(TEST_ALIAS_1)
+                .setKeyType("EC")
+                .setKeySize(521)
+                .setSubject(TEST_DN_1)
+                .setSerialNumber(TEST_SERIAL_1)
+                .setStartDate(NOW)
+                .setEndDate(NOW_PLUS_10_YEARS)
+                .build());
+
+        final KeyPair pair = mGenerator.generateKeyPair();
+        assertNotNull("The KeyPair returned should not be null", pair);
+
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "EC", 521, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
+    }
+
+    public void testKeyPairGenerator_GenerateKeyPair_RSA_Unencrypted_Success() throws Exception {
         mGenerator.initialize(new KeyPairGeneratorSpec.Builder(getContext())
                 .setAlias(TEST_ALIAS_1)
                 .setSubject(TEST_DN_1)
@@ -118,7 +338,8 @@
         final KeyPair pair = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair);
 
-        assertKeyPairCorrect(pair, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW, NOW_PLUS_10_YEARS);
+        assertKeyPairCorrect(pair, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
+                NOW_PLUS_10_YEARS);
     }
 
     public void testKeyPairGenerator_GenerateKeyPair_Replaced_Unencrypted_Success()
@@ -130,8 +351,8 @@
                     .setStartDate(NOW).setEndDate(NOW_PLUS_10_YEARS).build());
             final KeyPair pair1 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair1);
-            assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1,
+                    NOW, NOW_PLUS_10_YEARS);
         }
 
         // Replace the original key
@@ -141,8 +362,8 @@
                     .setStartDate(NOW).setEndDate(NOW_PLUS_10_YEARS).build());
             final KeyPair pair2 = mGenerator.generateKeyPair();
             assertNotNull("The KeyPair returned should not be null", pair2);
-            assertKeyPairCorrect(pair2, TEST_ALIAS_1, TEST_DN_2, TEST_SERIAL_2, NOW,
-                    NOW_PLUS_10_YEARS);
+            assertKeyPairCorrect(pair2, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2,
+                    NOW, NOW_PLUS_10_YEARS);
         }
     }
 
@@ -158,7 +379,7 @@
                 .build());
         final KeyPair pair1 = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair1);
-        assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
+        assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
                 NOW_PLUS_10_YEARS);
 
         // Generate the second key
@@ -171,21 +392,52 @@
                 .build());
         final KeyPair pair2 = mGenerator.generateKeyPair();
         assertNotNull("The KeyPair returned should not be null", pair2);
-        assertKeyPairCorrect(pair2, TEST_ALIAS_2, TEST_DN_2, TEST_SERIAL_2, NOW,
+        assertKeyPairCorrect(pair2, TEST_ALIAS_2, "RSA", 2048, null, TEST_DN_2, TEST_SERIAL_2, NOW,
                 NOW_PLUS_10_YEARS);
 
         // Check the first key again
-        assertKeyPairCorrect(pair1, TEST_ALIAS_1, TEST_DN_1, TEST_SERIAL_1, NOW,
+        assertKeyPairCorrect(pair1, TEST_ALIAS_1, "RSA", 2048, null, TEST_DN_1, TEST_SERIAL_1, NOW,
                 NOW_PLUS_10_YEARS);
     }
 
-    private void assertKeyPairCorrect(KeyPair pair, String alias, X500Principal dn,
-            BigInteger serial, Date start, Date end) throws Exception {
+    private void assertKeyPairCorrect(KeyPair pair, String alias, String keyType, int keySize,
+            AlgorithmParameterSpec spec, X500Principal dn, BigInteger serial, Date start, Date end)
+            throws Exception {
         final PublicKey pubKey = pair.getPublic();
         assertNotNull("The PublicKey for the KeyPair should be not null", pubKey);
+        assertEquals(keyType, pubKey.getAlgorithm());
+        assertEquals("Public keys should be in X.509 format", "X.509", pubKey.getFormat());
+        assertNotNull("Public keys should be encodable", pubKey.getEncoded());
+
+        if ("DSA".equalsIgnoreCase(keyType)) {
+            DSAPublicKey dsaPubKey = (DSAPublicKey) pubKey;
+            DSAParams actualParams = dsaPubKey.getParams();
+            assertEquals(keySize, (actualParams.getP().bitLength() + 7) & ~7);
+            if (spec != null) {
+                DSAParameterSpec expectedParams = (DSAParameterSpec) spec;
+                assertEquals(expectedParams.getP(), actualParams.getP());
+                assertEquals(expectedParams.getQ(), actualParams.getQ());
+                assertEquals(expectedParams.getG(), actualParams.getG());
+            }
+        } else if ("EC".equalsIgnoreCase(keyType)) {
+            assertEquals("Curve should be what was specified during initialization", keySize,
+                    ((ECPublicKey) pubKey).getParams().getCurve().getField().getFieldSize());
+        } else if ("RSA".equalsIgnoreCase(keyType)) {
+            RSAPublicKey rsaPubKey = (RSAPublicKey) pubKey;
+            assertEquals("Modulus size should be what is specified during initialization",
+                    (keySize + 7) & ~7, (rsaPubKey.getModulus().bitLength() + 7) & ~7);
+            if (spec != null) {
+                RSAKeyGenParameterSpec params = (RSAKeyGenParameterSpec) spec;
+                assertEquals((keySize + 7) & ~7, (params.getKeysize() + 7) & ~7);
+                assertEquals(params.getPublicExponent(), rsaPubKey.getPublicExponent());
+            }
+        }
 
         final PrivateKey privKey = pair.getPrivate();
         assertNotNull("The PrivateKey for the KeyPair should be not null", privKey);
+        assertEquals(keyType, privKey.getAlgorithm());
+        assertNull("getFormat() should return null", privKey.getFormat());
+        assertNull("getEncoded() should return null", privKey.getEncoded());
 
         KeyStore.Entry entry = mKeyStore.getEntry(alias, null);
         assertNotNull("Entry should exist", entry);
@@ -221,6 +473,95 @@
         Certificate[] chain = privEntry.getCertificateChain();
         assertEquals("A list of CA certificates should not exist for the generated entry", 1,
                 chain.length);
+
+        assertUsableInSSLConnection(privKey, x509userCert);
+
+        assertEquals("Retrieved key and generated key should be equal", privKey,
+                privEntry.getPrivateKey());
+    }
+
+    private static void assertUsableInSSLConnection(final PrivateKey privKey,
+            final X509Certificate x509userCert) throws Exception {
+        // TODO this should probably be in something like:
+        // TestKeyStore.createForClientSelfSigned(...)
+        String provider = SSLContext.getDefault().getProvider().getName();
+        TrustManager[] clientTrustManagers = TestKeyStore.createTrustManagers(
+                TestKeyStore.getIntermediateCa().keyStore);
+        SSLContext clientContext = TestSSLContext.createSSLContext("TLS", provider,
+                new KeyManager[] {
+                    TestKeyManager.wrap(new MyKeyManager(privKey, x509userCert))
+                }, clientTrustManagers);
+        TestKeyStore serverKeyStore = TestKeyStore.getServer();
+        serverKeyStore.keyStore.setCertificateEntry("client-selfSigned", x509userCert);
+        SSLContext serverContext = TestSSLContext.createSSLContext("TLS", provider,
+                serverKeyStore.keyManagers,
+                TestKeyStore.createTrustManagers(serverKeyStore.keyStore));
+        SSLServerSocket serverSocket = (SSLServerSocket) serverContext.getServerSocketFactory()
+                .createServerSocket(0);
+        InetAddress host = InetAddress.getLocalHost();
+        int port = serverSocket.getLocalPort();
+
+        SSLSocket client = (SSLSocket) clientContext.getSocketFactory().createSocket(host, port);
+        final SSLSocket server = (SSLSocket) serverSocket.accept();
+        ExecutorService executor = Executors.newSingleThreadExecutor();
+        Future<Void> future = executor.submit(new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                server.setNeedClientAuth(true);
+                server.setWantClientAuth(true);
+                server.startHandshake();
+                return null;
+            }
+        });
+        executor.shutdown();
+        client.startHandshake();
+        Certificate[] usedClientCerts = client.getSession().getLocalCertificates();
+        assertNotNull(usedClientCerts);
+        assertEquals(1, usedClientCerts.length);
+        assertEquals(x509userCert, usedClientCerts[0]);
+        future.get();
+        client.close();
+        server.close();
+    }
+
+    private static class MyKeyManager extends X509ExtendedKeyManager {
+        private final PrivateKey key;
+        private final X509Certificate[] chain;
+
+        public MyKeyManager(PrivateKey key, X509Certificate cert) {
+            this.key = key;
+            this.chain = new X509Certificate[] { cert };
+        }
+
+        @Override
+        public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+            return "fake";
+        }
+
+        @Override
+        public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+            throw new UnsupportedOperationException("Not implemented");
+        }
+
+        @Override
+        public X509Certificate[] getCertificateChain(String alias) {
+            return chain;
+        }
+
+        @Override
+        public String[] getClientAliases(String keyType, Principal[] issuers) {
+            return new String[] { "fake" };
+        }
+
+        @Override
+        public String[] getServerAliases(String keyType, Principal[] issuers) {
+            throw new UnsupportedOperationException("Not implemented");
+        }
+
+        @Override
+        public PrivateKey getPrivateKey(String alias) {
+            return key;
+        }
     }
 
     private static void assertDateEquals(String message, Date date1, Date date2) throws Exception {
diff --git a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
index 32f03ff..2c926a8 100644
--- a/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
+++ b/tests/tests/keystore/src/android/keystore/cts/AndroidKeyStoreTest.java
@@ -33,6 +33,10 @@
 import java.security.PublicKey;
 import java.security.cert.Certificate;
 import java.security.cert.CertificateFactory;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.util.ArrayList;
@@ -73,7 +77,7 @@
      *
      * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_CA_1 = {
+    private static final byte[] FAKE_RSA_CA_1 = {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0xce, (byte) 0x30, (byte) 0x82,
             (byte) 0x02, (byte) 0x37, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0x6a,
@@ -202,7 +206,7 @@
      *
      * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_KEY_1 = new byte[] {
+    private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
             (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
             (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
@@ -316,7 +320,7 @@
      *
      * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
      */
-    private static final byte[] FAKE_USER_1 = new byte[] {
+    private static final byte[] FAKE_RSA_USER_1 = new byte[] {
             (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x95, (byte) 0x30, (byte) 0x82,
             (byte) 0x01, (byte) 0xfe, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
             (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
@@ -430,6 +434,628 @@
             (byte) 0x08, (byte) 0x41, (byte) 0x0a, (byte) 0xf3, (byte) 0x72
     };
 
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl ecparam -name prime256v1 -out ecparam.pem
+     * openssl req -newkey ec:ecparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_CA_1 = {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x58, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xc1, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0xe1, (byte) 0xb2,
+            (byte) 0x8c, (byte) 0x04, (byte) 0x95, (byte) 0xeb, (byte) 0x10, (byte) 0xcb,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d,
+            (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37,
+            (byte) 0x31, (byte) 0x36, (byte) 0x32, (byte) 0x38, (byte) 0x32, (byte) 0x38,
+            (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30,
+            (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x32,
+            (byte) 0x38, (byte) 0x32, (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x45,
+            (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,
+            (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a,
+            (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53,
+            (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21,
+            (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74,
+            (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20,
+            (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74,
+            (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20,
+            (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x30, (byte) 0x81, (byte) 0x9f,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x8d,
+            (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb5, (byte) 0xf6, (byte) 0x08, (byte) 0x0f,
+            (byte) 0xc4, (byte) 0x4d, (byte) 0xe4, (byte) 0x0d, (byte) 0x34, (byte) 0x1d,
+            (byte) 0xe2, (byte) 0x23, (byte) 0x18, (byte) 0x63, (byte) 0x03, (byte) 0xf7,
+            (byte) 0x14, (byte) 0x0e, (byte) 0x98, (byte) 0xcd, (byte) 0x45, (byte) 0x1f,
+            (byte) 0xfe, (byte) 0xfb, (byte) 0x09, (byte) 0x3f, (byte) 0x5d, (byte) 0x36,
+            (byte) 0x3b, (byte) 0x0f, (byte) 0xf9, (byte) 0x5e, (byte) 0x86, (byte) 0x56,
+            (byte) 0x64, (byte) 0xd7, (byte) 0x3f, (byte) 0xae, (byte) 0x33, (byte) 0x09,
+            (byte) 0xd3, (byte) 0xdd, (byte) 0x06, (byte) 0x17, (byte) 0x26, (byte) 0xdc,
+            (byte) 0xa2, (byte) 0x8c, (byte) 0x3c, (byte) 0x65, (byte) 0xed, (byte) 0x03,
+            (byte) 0x82, (byte) 0x78, (byte) 0x9b, (byte) 0xee, (byte) 0xe3, (byte) 0x98,
+            (byte) 0x58, (byte) 0xe1, (byte) 0xf1, (byte) 0xa0, (byte) 0x85, (byte) 0xae,
+            (byte) 0x63, (byte) 0x84, (byte) 0x41, (byte) 0x46, (byte) 0xa7, (byte) 0x4f,
+            (byte) 0xdc, (byte) 0xbb, (byte) 0x1c, (byte) 0x6e, (byte) 0xec, (byte) 0x7b,
+            (byte) 0xd5, (byte) 0xab, (byte) 0x3d, (byte) 0x6a, (byte) 0x05, (byte) 0x58,
+            (byte) 0x0f, (byte) 0x9b, (byte) 0x6a, (byte) 0x67, (byte) 0x4b, (byte) 0xe9,
+            (byte) 0x2a, (byte) 0x6d, (byte) 0x96, (byte) 0x11, (byte) 0x53, (byte) 0x95,
+            (byte) 0x78, (byte) 0xaa, (byte) 0xd1, (byte) 0x91, (byte) 0x4a, (byte) 0xf8,
+            (byte) 0x54, (byte) 0x52, (byte) 0x6d, (byte) 0xb9, (byte) 0xca, (byte) 0x74,
+            (byte) 0x81, (byte) 0xf8, (byte) 0x99, (byte) 0x64, (byte) 0xd1, (byte) 0x4f,
+            (byte) 0x01, (byte) 0x38, (byte) 0x4f, (byte) 0x08, (byte) 0x5c, (byte) 0x31,
+            (byte) 0xcb, (byte) 0x7c, (byte) 0x5c, (byte) 0x78, (byte) 0x5d, (byte) 0x47,
+            (byte) 0xd9, (byte) 0xf0, (byte) 0x1a, (byte) 0xeb, (byte) 0x02, (byte) 0x03,
+            (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3, (byte) 0x50, (byte) 0x30,
+            (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0x5f, (byte) 0x5b, (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa,
+            (byte) 0xa1, (byte) 0x9f, (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1,
+            (byte) 0xbc, (byte) 0x20, (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4,
+            (byte) 0xfa, (byte) 0xe3, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b, (byte) 0x5e,
+            (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f, (byte) 0x9e,
+            (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20, (byte) 0x72,
+            (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3, (byte) 0x30,
+            (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03, (byte) 0x01, (byte) 0x01,
+            (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
+            (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xa1, (byte) 0x4a, (byte) 0xe6, (byte) 0xfc,
+            (byte) 0x7f, (byte) 0x17, (byte) 0xaa, (byte) 0x65, (byte) 0x4a, (byte) 0x34,
+            (byte) 0xde, (byte) 0x69, (byte) 0x67, (byte) 0x54, (byte) 0x4d, (byte) 0xa2,
+            (byte) 0xc2, (byte) 0x98, (byte) 0x02, (byte) 0x43, (byte) 0x6a, (byte) 0x0e,
+            (byte) 0x0b, (byte) 0x7f, (byte) 0xa4, (byte) 0x46, (byte) 0xaf, (byte) 0xa4,
+            (byte) 0x65, (byte) 0xa0, (byte) 0xdb, (byte) 0xf1, (byte) 0x5b, (byte) 0xd5,
+            (byte) 0x09, (byte) 0xbc, (byte) 0xee, (byte) 0x37, (byte) 0x51, (byte) 0x19,
+            (byte) 0x36, (byte) 0xc0, (byte) 0x90, (byte) 0xd3, (byte) 0x5f, (byte) 0xf3,
+            (byte) 0x4f, (byte) 0xb9, (byte) 0x08, (byte) 0x45, (byte) 0x0e, (byte) 0x01,
+            (byte) 0x8a, (byte) 0x95, (byte) 0xef, (byte) 0x92, (byte) 0x95, (byte) 0x33,
+            (byte) 0x78, (byte) 0xdd, (byte) 0x90, (byte) 0xbb, (byte) 0xf3, (byte) 0x06,
+            (byte) 0x75, (byte) 0xd0, (byte) 0x66, (byte) 0xe6, (byte) 0xd0, (byte) 0x18,
+            (byte) 0x6e, (byte) 0xeb, (byte) 0x1c, (byte) 0x52, (byte) 0xc3, (byte) 0x2e,
+            (byte) 0x57, (byte) 0x7d, (byte) 0xa9, (byte) 0x03, (byte) 0xdb, (byte) 0xf4,
+            (byte) 0x57, (byte) 0x5f, (byte) 0x6c, (byte) 0x7e, (byte) 0x00, (byte) 0x0d,
+            (byte) 0x8f, (byte) 0xe8, (byte) 0x91, (byte) 0xf7, (byte) 0xae, (byte) 0x24,
+            (byte) 0x35, (byte) 0x07, (byte) 0xb5, (byte) 0x48, (byte) 0x2d, (byte) 0x36,
+            (byte) 0x30, (byte) 0x5d, (byte) 0xe9, (byte) 0x49, (byte) 0x2d, (byte) 0xd1,
+            (byte) 0x5d, (byte) 0xc5, (byte) 0xf4, (byte) 0x33, (byte) 0x77, (byte) 0x3c,
+            (byte) 0x71, (byte) 0xad, (byte) 0x90, (byte) 0x65, (byte) 0xa9, (byte) 0xc1,
+            (byte) 0x0b, (byte) 0x5c, (byte) 0x62, (byte) 0x55, (byte) 0x50, (byte) 0x6f,
+            (byte) 0x9b, (byte) 0xc9, (byte) 0x0d, (byte) 0xee
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl pkcs8 -topk8 -outform d -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x02, (byte) 0x01, (byte) 0x00,
+            (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
+            (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,
+            (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x04, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x6b, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x20,
+            (byte) 0x3a, (byte) 0x8a, (byte) 0x02, (byte) 0xdc, (byte) 0xde, (byte) 0x70,
+            (byte) 0x84, (byte) 0x45, (byte) 0x34, (byte) 0xaf, (byte) 0xbd, (byte) 0xd5,
+            (byte) 0x02, (byte) 0x17, (byte) 0x69, (byte) 0x90, (byte) 0x65, (byte) 0x1e,
+            (byte) 0x87, (byte) 0xf1, (byte) 0x3d, (byte) 0x17, (byte) 0xb6, (byte) 0xf4,
+            (byte) 0x31, (byte) 0x94, (byte) 0x86, (byte) 0x76, (byte) 0x55, (byte) 0xf7,
+            (byte) 0xcc, (byte) 0xba, (byte) 0xa1, (byte) 0x44, (byte) 0x03, (byte) 0x42,
+            (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7, (byte) 0x9b,
+            (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33, (byte) 0x14,
+            (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3, (byte) 0xcd,
+            (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d, (byte) 0xf3,
+            (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f, (byte) 0x79,
+            (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3, (byte) 0xd1,
+            (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf, (byte) 0x50,
+            (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22, (byte) 0xe6,
+            (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68, (byte) 0x3b,
+            (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77, (byte) 0x5e,
+            (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2, (byte) 0x38
+    };
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_EC_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x51, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xba, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x45, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x31, (byte) 0x36,
+            (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x5a, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x35, (byte) 0x31, (byte) 0x36, (byte) 0x33, (byte) 0x30, (byte) 0x30,
+            (byte) 0x38, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31, (byte) 0x0b,
+            (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31,
+            (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c,
+            (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69,
+            (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20,
+            (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74,
+            (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x12,
+            (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65, (byte) 0x72,
+            (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70,
+            (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x30, (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02,
+            (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x07, (byte) 0x03,
+            (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0xd9, (byte) 0xcf, (byte) 0xe7,
+            (byte) 0x9b, (byte) 0x23, (byte) 0xc8, (byte) 0xa3, (byte) 0xb8, (byte) 0x33,
+            (byte) 0x14, (byte) 0xa4, (byte) 0x4d, (byte) 0x75, (byte) 0x90, (byte) 0xf3,
+            (byte) 0xcd, (byte) 0x43, (byte) 0xe5, (byte) 0x1b, (byte) 0x05, (byte) 0x1d,
+            (byte) 0xf3, (byte) 0xd0, (byte) 0xa3, (byte) 0xb7, (byte) 0x32, (byte) 0x5f,
+            (byte) 0x79, (byte) 0xdc, (byte) 0x88, (byte) 0xb8, (byte) 0x4d, (byte) 0xb3,
+            (byte) 0xd1, (byte) 0x6d, (byte) 0xf7, (byte) 0x75, (byte) 0xf3, (byte) 0xbf,
+            (byte) 0x50, (byte) 0xa1, (byte) 0xbc, (byte) 0x03, (byte) 0x64, (byte) 0x22,
+            (byte) 0xe6, (byte) 0x1a, (byte) 0xa1, (byte) 0xe1, (byte) 0x06, (byte) 0x68,
+            (byte) 0x3b, (byte) 0xbc, (byte) 0x9f, (byte) 0xd3, (byte) 0xae, (byte) 0x77,
+            (byte) 0x5e, (byte) 0x88, (byte) 0x0c, (byte) 0x5e, (byte) 0x0c, (byte) 0xb2,
+            (byte) 0x38, (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13,
+            (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c,
+            (byte) 0x06, (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
+            (byte) 0x86, (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04,
+            (byte) 0x1f, (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47,
+            (byte) 0x65, (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72,
+            (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,
+            (byte) 0x74, (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04,
+            (byte) 0x14, (byte) 0xd5, (byte) 0xc4, (byte) 0x72, (byte) 0xbd, (byte) 0xd2,
+            (byte) 0x4e, (byte) 0x90, (byte) 0x1b, (byte) 0x14, (byte) 0x32, (byte) 0xdb,
+            (byte) 0x03, (byte) 0xae, (byte) 0xfa, (byte) 0x27, (byte) 0x7d, (byte) 0x8d,
+            (byte) 0xe4, (byte) 0x80, (byte) 0x58, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18,
+            (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x5f, (byte) 0x5b,
+            (byte) 0x5e, (byte) 0xac, (byte) 0x29, (byte) 0xfa, (byte) 0xa1, (byte) 0x9f,
+            (byte) 0x9e, (byte) 0xad, (byte) 0x46, (byte) 0xe1, (byte) 0xbc, (byte) 0x20,
+            (byte) 0x72, (byte) 0xcf, (byte) 0x4a, (byte) 0xd4, (byte) 0xfa, (byte) 0xe3,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x43, (byte) 0x99, (byte) 0x9f, (byte) 0x67, (byte) 0x08,
+            (byte) 0x43, (byte) 0xd5, (byte) 0x6b, (byte) 0x6f, (byte) 0xd7, (byte) 0x05,
+            (byte) 0xd6, (byte) 0x75, (byte) 0x34, (byte) 0x30, (byte) 0xca, (byte) 0x20,
+            (byte) 0x47, (byte) 0x61, (byte) 0xa1, (byte) 0x89, (byte) 0xb6, (byte) 0xf1,
+            (byte) 0x49, (byte) 0x7b, (byte) 0xd9, (byte) 0xb9, (byte) 0xe8, (byte) 0x1e,
+            (byte) 0x29, (byte) 0x74, (byte) 0x0a, (byte) 0x67, (byte) 0xc0, (byte) 0x7d,
+            (byte) 0xb8, (byte) 0xe6, (byte) 0x39, (byte) 0xa8, (byte) 0x5e, (byte) 0xc3,
+            (byte) 0xb0, (byte) 0xa1, (byte) 0x30, (byte) 0x6a, (byte) 0x1f, (byte) 0x1d,
+            (byte) 0xfc, (byte) 0x11, (byte) 0x59, (byte) 0x0b, (byte) 0xb9, (byte) 0xad,
+            (byte) 0x3a, (byte) 0x4e, (byte) 0x50, (byte) 0x0a, (byte) 0x61, (byte) 0xdb,
+            (byte) 0x75, (byte) 0x6b, (byte) 0xe5, (byte) 0x3f, (byte) 0x8d, (byte) 0xde,
+            (byte) 0x28, (byte) 0x68, (byte) 0xb1, (byte) 0x29, (byte) 0x9a, (byte) 0x18,
+            (byte) 0x8a, (byte) 0xfc, (byte) 0x3f, (byte) 0x13, (byte) 0x93, (byte) 0x29,
+            (byte) 0xed, (byte) 0x22, (byte) 0x7c, (byte) 0xb4, (byte) 0x50, (byte) 0xd5,
+            (byte) 0x4d, (byte) 0x32, (byte) 0x4d, (byte) 0x42, (byte) 0x2b, (byte) 0x29,
+            (byte) 0x97, (byte) 0x86, (byte) 0xc0, (byte) 0x01, (byte) 0x00, (byte) 0x25,
+            (byte) 0xf6, (byte) 0xd3, (byte) 0x2a, (byte) 0xd8, (byte) 0xda, (byte) 0x13,
+            (byte) 0x94, (byte) 0x12, (byte) 0x78, (byte) 0x14, (byte) 0x0b, (byte) 0x51,
+            (byte) 0xc0, (byte) 0x45, (byte) 0xb4, (byte) 0x02, (byte) 0x37, (byte) 0x98,
+            (byte) 0x42, (byte) 0x3c, (byte) 0xcb, (byte) 0x2e, (byte) 0xe4, (byte) 0x38,
+            (byte) 0x69, (byte) 0x1b, (byte) 0x72, (byte) 0xf0, (byte) 0xaa, (byte) 0x89,
+            (byte) 0x7e, (byte) 0xde, (byte) 0xb2
+    };
+
+    /*
+     * The keys and certificates below are generated with:
+     *
+     * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
+     * openssl dsaparam -out dsaparam.pem 1024
+     * openssl req -newkey dsa:dsaparam.pem -keyout userkey.pem -nodes -days 3650 -out userkey.req
+     * mkdir -p demoCA/newcerts
+     * touch demoCA/index.txt
+     * echo "01" > demoCA/serial
+     * openssl ca -out usercert.pem -in userkey.req -cert cacert.pem -keyfile cakey.pem -days 3650
+     */
+
+    /**
+     * Generated from above and converted with:
+     *
+     * openssl x509 -outform d -in cacert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_CA_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x8a, (byte) 0x30, (byte) 0x82,
+            (byte) 0x01, (byte) 0xf3, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x09, (byte) 0x00, (byte) 0x87, (byte) 0xc0,
+            (byte) 0x68, (byte) 0x7f, (byte) 0x42, (byte) 0x92, (byte) 0x0b, (byte) 0x7a,
+            (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,
+            (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01,
+            (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78,
+            (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e,
+            (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17,
+            (byte) 0x0d, (byte) 0x31, (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32,
+            (byte) 0x37, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x31, (byte) 0x32,
+            (byte) 0x39, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33,
+            (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33,
+            (byte) 0x33, (byte) 0x31, (byte) 0x32, (byte) 0x39, (byte) 0x5a, (byte) 0x30,
+            (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02,
+            (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c,
+            (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d,
+            (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31,
+            (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e,
+            (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74,
+            (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69,
+            (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79,
+            (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x17,
+            (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63, (byte) 0x61, (byte) 0x2e,
+            (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d, (byte) 0x70, (byte) 0x6c,
+            (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f, (byte) 0x6d, (byte) 0x30,
+            (byte) 0x81, (byte) 0x9f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09,
+            (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d,
+            (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x03,
+            (byte) 0x81, (byte) 0x8d, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x89,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xa4, (byte) 0xc7,
+            (byte) 0x06, (byte) 0xba, (byte) 0xdf, (byte) 0x2b, (byte) 0xee, (byte) 0xd2,
+            (byte) 0xb9, (byte) 0xe4, (byte) 0x52, (byte) 0x21, (byte) 0x68, (byte) 0x2b,
+            (byte) 0x83, (byte) 0xdf, (byte) 0xe3, (byte) 0x9c, (byte) 0x08, (byte) 0x73,
+            (byte) 0xdd, (byte) 0x90, (byte) 0xea, (byte) 0x97, (byte) 0x0c, (byte) 0x96,
+            (byte) 0x20, (byte) 0xb1, (byte) 0xee, (byte) 0x11, (byte) 0xd5, (byte) 0xd4,
+            (byte) 0x7c, (byte) 0x44, (byte) 0x96, (byte) 0x2e, (byte) 0x6e, (byte) 0xa2,
+            (byte) 0xb2, (byte) 0xa3, (byte) 0x4b, (byte) 0x0f, (byte) 0x32, (byte) 0x90,
+            (byte) 0xaf, (byte) 0x5c, (byte) 0x6f, (byte) 0x00, (byte) 0x88, (byte) 0x45,
+            (byte) 0x4e, (byte) 0x9b, (byte) 0x26, (byte) 0xc1, (byte) 0x94, (byte) 0x3c,
+            (byte) 0xfe, (byte) 0x10, (byte) 0xbd, (byte) 0xda, (byte) 0xf2, (byte) 0x8d,
+            (byte) 0x03, (byte) 0x52, (byte) 0x32, (byte) 0x11, (byte) 0xff, (byte) 0xf6,
+            (byte) 0xf9, (byte) 0x6e, (byte) 0x8f, (byte) 0x0f, (byte) 0xc8, (byte) 0x0a,
+            (byte) 0x48, (byte) 0x39, (byte) 0x33, (byte) 0xb9, (byte) 0x0c, (byte) 0xb3,
+            (byte) 0x2b, (byte) 0xab, (byte) 0x7d, (byte) 0x79, (byte) 0x6f, (byte) 0x57,
+            (byte) 0x5b, (byte) 0xb8, (byte) 0x84, (byte) 0xb6, (byte) 0xcc, (byte) 0xe8,
+            (byte) 0x30, (byte) 0x78, (byte) 0xff, (byte) 0x92, (byte) 0xe5, (byte) 0x43,
+            (byte) 0x2e, (byte) 0xef, (byte) 0x66, (byte) 0x98, (byte) 0xb4, (byte) 0xfe,
+            (byte) 0xa2, (byte) 0x40, (byte) 0xf2, (byte) 0x1f, (byte) 0xd0, (byte) 0x86,
+            (byte) 0x16, (byte) 0xc8, (byte) 0x45, (byte) 0xc4, (byte) 0x52, (byte) 0xcb,
+            (byte) 0x31, (byte) 0x5c, (byte) 0x9f, (byte) 0x32, (byte) 0x3b, (byte) 0xf7,
+            (byte) 0x19, (byte) 0x08, (byte) 0xc7, (byte) 0x00, (byte) 0x21, (byte) 0x7d,
+            (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0xa3,
+            (byte) 0x50, (byte) 0x30, (byte) 0x4e, (byte) 0x30, (byte) 0x1d, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16,
+            (byte) 0x04, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3, (byte) 0xf1,
+            (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f, (byte) 0x30,
+            (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15, (byte) 0x32,
+            (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30, (byte) 0x1f,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,
+            (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47,
+            (byte) 0x82, (byte) 0xa3, (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a,
+            (byte) 0xde, (byte) 0x4f, (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72,
+            (byte) 0x81, (byte) 0x15, (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58,
+            (byte) 0x18, (byte) 0x30, (byte) 0x0c, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x05, (byte) 0x30, (byte) 0x03,
+            (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
+            (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,
+            (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00,
+            (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x7f,
+            (byte) 0x6a, (byte) 0x48, (byte) 0x90, (byte) 0x7b, (byte) 0x9b, (byte) 0x72,
+            (byte) 0x13, (byte) 0xa7, (byte) 0xef, (byte) 0x6b, (byte) 0x0b, (byte) 0x59,
+            (byte) 0xe5, (byte) 0x49, (byte) 0x72, (byte) 0x3a, (byte) 0xc8, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x23, (byte) 0x18, (byte) 0x4c, (byte) 0xec, (byte) 0xc7,
+            (byte) 0xef, (byte) 0xcb, (byte) 0xa7, (byte) 0xbe, (byte) 0xe4, (byte) 0xef,
+            (byte) 0x8f, (byte) 0xc6, (byte) 0x06, (byte) 0x8c, (byte) 0xc0, (byte) 0xe4,
+            (byte) 0x2f, (byte) 0x2a, (byte) 0xc0, (byte) 0x35, (byte) 0x7d, (byte) 0x5e,
+            (byte) 0x19, (byte) 0x29, (byte) 0x8c, (byte) 0xb9, (byte) 0xf1, (byte) 0x1e,
+            (byte) 0xaf, (byte) 0x82, (byte) 0xd8, (byte) 0xe3, (byte) 0x88, (byte) 0xe1,
+            (byte) 0x31, (byte) 0xc8, (byte) 0x82, (byte) 0x1f, (byte) 0x83, (byte) 0xa9,
+            (byte) 0xde, (byte) 0xfe, (byte) 0x4b, (byte) 0xe2, (byte) 0x78, (byte) 0x64,
+            (byte) 0xed, (byte) 0xa4, (byte) 0x7b, (byte) 0xee, (byte) 0x8d, (byte) 0x71,
+            (byte) 0x1b, (byte) 0x44, (byte) 0xe6, (byte) 0xb7, (byte) 0xe8, (byte) 0xc5,
+            (byte) 0x9a, (byte) 0x93, (byte) 0x92, (byte) 0x6f, (byte) 0x6f, (byte) 0xdb,
+            (byte) 0xbd, (byte) 0xd7, (byte) 0x03, (byte) 0x85, (byte) 0xa9, (byte) 0x5f,
+            (byte) 0x53, (byte) 0x5f, (byte) 0x5d, (byte) 0x30, (byte) 0xc6, (byte) 0xd9,
+            (byte) 0xce, (byte) 0x34, (byte) 0xa8, (byte) 0xbe, (byte) 0x31, (byte) 0x47,
+            (byte) 0x1c, (byte) 0xa4, (byte) 0x7f, (byte) 0xc0, (byte) 0x2c, (byte) 0xbc,
+            (byte) 0xfe, (byte) 0x1a, (byte) 0x31, (byte) 0xd8, (byte) 0x77, (byte) 0x4d,
+            (byte) 0xfc, (byte) 0x45, (byte) 0x84, (byte) 0xfc, (byte) 0x45, (byte) 0x12,
+            (byte) 0xab, (byte) 0x50, (byte) 0xe4, (byte) 0x45, (byte) 0xe5, (byte) 0x11
+    };
+
+    /**
+     * Generated from above and converted with: openssl pkcs8 -topk8 -outform d
+     * -in userkey.pem -nocrypt | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_KEY_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x4c, (byte) 0x02, (byte) 0x01,
+            (byte) 0x00, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38,
+            (byte) 0x04, (byte) 0x01, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f,
+            (byte) 0x02, (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23,
+            (byte) 0xf7, (byte) 0x86, (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc,
+            (byte) 0xc3, (byte) 0x91, (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02,
+            (byte) 0x47, (byte) 0x35, (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98,
+            (byte) 0x13, (byte) 0x56, (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20,
+            (byte) 0xa8, (byte) 0x60, (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77,
+            (byte) 0xc1, (byte) 0x69, (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92,
+            (byte) 0xf2, (byte) 0x6a, (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c,
+            (byte) 0x91, (byte) 0x20, (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2,
+            (byte) 0x87, (byte) 0xa6, (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45,
+            (byte) 0x46, (byte) 0xf9, (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38,
+            (byte) 0x8d, (byte) 0xff, (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f,
+            (byte) 0x66, (byte) 0x15, (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb,
+            (byte) 0x57, (byte) 0x39, (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd,
+            (byte) 0xe2, (byte) 0xb4, (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32,
+            (byte) 0x3b, (byte) 0x9d, (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d,
+            (byte) 0x75, (byte) 0xb9, (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba,
+            (byte) 0xb7, (byte) 0xc8, (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71,
+            (byte) 0x91, (byte) 0xd3, (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e,
+            (byte) 0x7c, (byte) 0x15, (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52,
+            (byte) 0x65, (byte) 0x4d, (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35,
+            (byte) 0xce, (byte) 0x0b, (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1,
+            (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f,
+            (byte) 0x7a, (byte) 0x31, (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2,
+            (byte) 0xf7, (byte) 0xaf, (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92,
+            (byte) 0xf3, (byte) 0x6c, (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02,
+            (byte) 0x81, (byte) 0x81, (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36,
+            (byte) 0x48, (byte) 0xdb, (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce,
+            (byte) 0x6d, (byte) 0xbc, (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50,
+            (byte) 0x91, (byte) 0x10, (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50,
+            (byte) 0xda, (byte) 0x4f, (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb,
+            (byte) 0x4d, (byte) 0xb0, (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3,
+            (byte) 0x6c, (byte) 0xc9, (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0,
+            (byte) 0x54, (byte) 0x7e, (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e,
+            (byte) 0x5f, (byte) 0xc0, (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3,
+            (byte) 0xd3, (byte) 0xdf, (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb,
+            (byte) 0xe6, (byte) 0x20, (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca,
+            (byte) 0xdb, (byte) 0xc0, (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16,
+            (byte) 0x1d, (byte) 0xb3, (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89,
+            (byte) 0x17, (byte) 0x73, (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60,
+            (byte) 0xb7, (byte) 0xaa, (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03,
+            (byte) 0x4e, (byte) 0x36, (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa,
+            (byte) 0xf3, (byte) 0xd6, (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4,
+            (byte) 0x41, (byte) 0xd6, (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b,
+            (byte) 0x2d, (byte) 0x23, (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39,
+            (byte) 0xa8, (byte) 0x6a, (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2,
+            (byte) 0x77, (byte) 0x91, (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48,
+            (byte) 0x78, (byte) 0xcd, (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x04,
+            (byte) 0x17, (byte) 0x02, (byte) 0x15, (byte) 0x00, (byte) 0xc7, (byte) 0xe7,
+            (byte) 0xe2, (byte) 0x6b, (byte) 0x14, (byte) 0xe6, (byte) 0x31, (byte) 0x12,
+            (byte) 0xb2, (byte) 0x1e, (byte) 0xd4, (byte) 0xf2, (byte) 0x9b, (byte) 0x2c,
+            (byte) 0xf6, (byte) 0x54, (byte) 0x4c, (byte) 0x12, (byte) 0xe8, (byte) 0x22
+    };
+
+    /**
+     * Generated from above and converted with: openssl x509 -outform d -in
+     * usercert.pem | xxd -i | sed 's/0x/(byte) 0x/g'
+     */
+    private static final byte[] FAKE_DSA_USER_1 = new byte[] {
+            (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xca, (byte) 0x30, (byte) 0x82,
+            (byte) 0x03, (byte) 0x33, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01,
+            (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0d,
+            (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
+            (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,
+            (byte) 0x00, (byte) 0x30, (byte) 0x5e, (byte) 0x31, (byte) 0x0b, (byte) 0x30,
+            (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,
+            (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55, (byte) 0x31, (byte) 0x13,
+            (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,
+            (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53, (byte) 0x6f, (byte) 0x6d,
+            (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30, (byte) 0x1f, (byte) 0x06,
+            (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x18,
+            (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x6e,
+            (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57, (byte) 0x69, (byte) 0x64,
+            (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x20, (byte) 0x50,
+            (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c, (byte) 0x74, (byte) 0x64,
+            (byte) 0x31, (byte) 0x17, (byte) 0x30, (byte) 0x15, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x0e, (byte) 0x63,
+            (byte) 0x61, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x31,
+            (byte) 0x33, (byte) 0x30, (byte) 0x38, (byte) 0x32, (byte) 0x37, (byte) 0x32,
+            (byte) 0x33, (byte) 0x33, (byte) 0x34, (byte) 0x32, (byte) 0x32, (byte) 0x5a,
+            (byte) 0x17, (byte) 0x0d, (byte) 0x32, (byte) 0x33, (byte) 0x30, (byte) 0x38,
+            (byte) 0x32, (byte) 0x35, (byte) 0x32, (byte) 0x33, (byte) 0x33, (byte) 0x34,
+            (byte) 0x32, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x62, (byte) 0x31,
+            (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x55,
+            (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x04, (byte) 0x08, (byte) 0x0c, (byte) 0x0a, (byte) 0x53,
+            (byte) 0x6f, (byte) 0x6d, (byte) 0x65, (byte) 0x2d, (byte) 0x53, (byte) 0x74,
+            (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x31, (byte) 0x21, (byte) 0x30,
+            (byte) 0x1f, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0a,
+            (byte) 0x0c, (byte) 0x18, (byte) 0x49, (byte) 0x6e, (byte) 0x74, (byte) 0x65,
+            (byte) 0x72, (byte) 0x6e, (byte) 0x65, (byte) 0x74, (byte) 0x20, (byte) 0x57,
+            (byte) 0x69, (byte) 0x64, (byte) 0x67, (byte) 0x69, (byte) 0x74, (byte) 0x73,
+            (byte) 0x20, (byte) 0x50, (byte) 0x74, (byte) 0x79, (byte) 0x20, (byte) 0x4c,
+            (byte) 0x74, (byte) 0x64, (byte) 0x31, (byte) 0x1b, (byte) 0x30, (byte) 0x19,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c,
+            (byte) 0x12, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x76, (byte) 0x65,
+            (byte) 0x72, (byte) 0x2e, (byte) 0x65, (byte) 0x78, (byte) 0x61, (byte) 0x6d,
+            (byte) 0x70, (byte) 0x6c, (byte) 0x65, (byte) 0x2e, (byte) 0x63, (byte) 0x6f,
+            (byte) 0x6d, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xb7, (byte) 0x30,
+            (byte) 0x82, (byte) 0x01, (byte) 0x2c, (byte) 0x06, (byte) 0x07, (byte) 0x2a,
+            (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x38, (byte) 0x04, (byte) 0x01,
+            (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0x1f, (byte) 0x02, (byte) 0x81,
+            (byte) 0x81, (byte) 0x00, (byte) 0xb3, (byte) 0x23, (byte) 0xf7, (byte) 0x86,
+            (byte) 0xbd, (byte) 0x3b, (byte) 0x86, (byte) 0xcc, (byte) 0xc3, (byte) 0x91,
+            (byte) 0xc0, (byte) 0x30, (byte) 0x32, (byte) 0x02, (byte) 0x47, (byte) 0x35,
+            (byte) 0x01, (byte) 0xef, (byte) 0xee, (byte) 0x98, (byte) 0x13, (byte) 0x56,
+            (byte) 0x49, (byte) 0x47, (byte) 0xb5, (byte) 0x20, (byte) 0xa8, (byte) 0x60,
+            (byte) 0xcb, (byte) 0xc0, (byte) 0xd5, (byte) 0x77, (byte) 0xc1, (byte) 0x69,
+            (byte) 0xcd, (byte) 0x18, (byte) 0x34, (byte) 0x92, (byte) 0xf2, (byte) 0x6a,
+            (byte) 0x2a, (byte) 0x10, (byte) 0x59, (byte) 0x1c, (byte) 0x91, (byte) 0x20,
+            (byte) 0x51, (byte) 0xca, (byte) 0x37, (byte) 0xb2, (byte) 0x87, (byte) 0xa6,
+            (byte) 0x8a, (byte) 0x02, (byte) 0xfd, (byte) 0x45, (byte) 0x46, (byte) 0xf9,
+            (byte) 0x76, (byte) 0xb1, (byte) 0x35, (byte) 0x38, (byte) 0x8d, (byte) 0xff,
+            (byte) 0x4c, (byte) 0x5d, (byte) 0x75, (byte) 0x8f, (byte) 0x66, (byte) 0x15,
+            (byte) 0x7d, (byte) 0x7b, (byte) 0xda, (byte) 0xdb, (byte) 0x57, (byte) 0x39,
+            (byte) 0xff, (byte) 0x91, (byte) 0x3f, (byte) 0xdd, (byte) 0xe2, (byte) 0xb4,
+            (byte) 0x22, (byte) 0x60, (byte) 0x4c, (byte) 0x32, (byte) 0x3b, (byte) 0x9d,
+            (byte) 0x34, (byte) 0x9f, (byte) 0xb9, (byte) 0x5d, (byte) 0x75, (byte) 0xb9,
+            (byte) 0xd3, (byte) 0x7f, (byte) 0x11, (byte) 0xba, (byte) 0xb7, (byte) 0xc8,
+            (byte) 0x32, (byte) 0xc6, (byte) 0xce, (byte) 0x71, (byte) 0x91, (byte) 0xd3,
+            (byte) 0x32, (byte) 0xaf, (byte) 0x4d, (byte) 0x7e, (byte) 0x7c, (byte) 0x15,
+            (byte) 0xf7, (byte) 0x71, (byte) 0x2c, (byte) 0x52, (byte) 0x65, (byte) 0x4d,
+            (byte) 0xa9, (byte) 0x81, (byte) 0x25, (byte) 0x35, (byte) 0xce, (byte) 0x0b,
+            (byte) 0x5b, (byte) 0x56, (byte) 0xfe, (byte) 0xf1, (byte) 0x02, (byte) 0x15,
+            (byte) 0x00, (byte) 0xeb, (byte) 0x4e, (byte) 0x7f, (byte) 0x7a, (byte) 0x31,
+            (byte) 0xb3, (byte) 0x7d, (byte) 0x8d, (byte) 0xb2, (byte) 0xf7, (byte) 0xaf,
+            (byte) 0xad, (byte) 0xb1, (byte) 0x42, (byte) 0x92, (byte) 0xf3, (byte) 0x6c,
+            (byte) 0xe4, (byte) 0xed, (byte) 0x8b, (byte) 0x02, (byte) 0x81, (byte) 0x81,
+            (byte) 0x00, (byte) 0x81, (byte) 0xc8, (byte) 0x36, (byte) 0x48, (byte) 0xdb,
+            (byte) 0x71, (byte) 0x2b, (byte) 0x91, (byte) 0xce, (byte) 0x6d, (byte) 0xbc,
+            (byte) 0xb8, (byte) 0xf9, (byte) 0xcb, (byte) 0x50, (byte) 0x91, (byte) 0x10,
+            (byte) 0x8a, (byte) 0xf8, (byte) 0x37, (byte) 0x50, (byte) 0xda, (byte) 0x4f,
+            (byte) 0xc8, (byte) 0x4d, (byte) 0x73, (byte) 0xcb, (byte) 0x4d, (byte) 0xb0,
+            (byte) 0x19, (byte) 0x54, (byte) 0x5a, (byte) 0xf3, (byte) 0x6c, (byte) 0xc9,
+            (byte) 0xd8, (byte) 0x96, (byte) 0xd9, (byte) 0xb0, (byte) 0x54, (byte) 0x7e,
+            (byte) 0x7d, (byte) 0xe2, (byte) 0x58, (byte) 0x0e, (byte) 0x5f, (byte) 0xc0,
+            (byte) 0xce, (byte) 0xb9, (byte) 0x5c, (byte) 0xe3, (byte) 0xd3, (byte) 0xdf,
+            (byte) 0xcf, (byte) 0x45, (byte) 0x74, (byte) 0xfb, (byte) 0xe6, (byte) 0x20,
+            (byte) 0xe7, (byte) 0xfc, (byte) 0x0f, (byte) 0xca, (byte) 0xdb, (byte) 0xc0,
+            (byte) 0x0b, (byte) 0xe1, (byte) 0x5a, (byte) 0x16, (byte) 0x1d, (byte) 0xb3,
+            (byte) 0x2e, (byte) 0xe5, (byte) 0x5f, (byte) 0x89, (byte) 0x17, (byte) 0x73,
+            (byte) 0x50, (byte) 0xd1, (byte) 0x4a, (byte) 0x60, (byte) 0xb7, (byte) 0xaa,
+            (byte) 0xf0, (byte) 0xc7, (byte) 0xc5, (byte) 0x03, (byte) 0x4e, (byte) 0x36,
+            (byte) 0x51, (byte) 0x9e, (byte) 0x2f, (byte) 0xfa, (byte) 0xf3, (byte) 0xd6,
+            (byte) 0x58, (byte) 0x14, (byte) 0x02, (byte) 0xb4, (byte) 0x41, (byte) 0xd6,
+            (byte) 0x72, (byte) 0x6f, (byte) 0x58, (byte) 0x5b, (byte) 0x2d, (byte) 0x23,
+            (byte) 0xc0, (byte) 0x75, (byte) 0x4f, (byte) 0x39, (byte) 0xa8, (byte) 0x6a,
+            (byte) 0xdf, (byte) 0x79, (byte) 0x21, (byte) 0xf2, (byte) 0x77, (byte) 0x91,
+            (byte) 0x3f, (byte) 0x1c, (byte) 0x4d, (byte) 0x48, (byte) 0x78, (byte) 0xcd,
+            (byte) 0xed, (byte) 0x79, (byte) 0x23, (byte) 0x03, (byte) 0x81, (byte) 0x84,
+            (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x1a, (byte) 0x50,
+            (byte) 0x9d, (byte) 0x3e, (byte) 0xa1, (byte) 0x6c, (byte) 0x99, (byte) 0x35,
+            (byte) 0x36, (byte) 0x26, (byte) 0x22, (byte) 0x6b, (byte) 0x47, (byte) 0x45,
+            (byte) 0x80, (byte) 0x5b, (byte) 0xd5, (byte) 0xc1, (byte) 0xc5, (byte) 0x70,
+            (byte) 0x75, (byte) 0x55, (byte) 0x66, (byte) 0x33, (byte) 0x1d, (byte) 0xae,
+            (byte) 0xd0, (byte) 0x01, (byte) 0x64, (byte) 0x8b, (byte) 0xae, (byte) 0x9d,
+            (byte) 0x66, (byte) 0x58, (byte) 0xf9, (byte) 0x42, (byte) 0x74, (byte) 0x3a,
+            (byte) 0x32, (byte) 0xc7, (byte) 0x7f, (byte) 0x25, (byte) 0x64, (byte) 0x7d,
+            (byte) 0x08, (byte) 0x26, (byte) 0xbf, (byte) 0x21, (byte) 0x3a, (byte) 0x84,
+            (byte) 0xcc, (byte) 0x2c, (byte) 0x66, (byte) 0x7d, (byte) 0xc7, (byte) 0xd6,
+            (byte) 0xb1, (byte) 0x69, (byte) 0x57, (byte) 0x67, (byte) 0x52, (byte) 0x73,
+            (byte) 0x3f, (byte) 0x79, (byte) 0x60, (byte) 0xaa, (byte) 0xf4, (byte) 0x8a,
+            (byte) 0x48, (byte) 0x42, (byte) 0x46, (byte) 0x41, (byte) 0xd0, (byte) 0x50,
+            (byte) 0x9b, (byte) 0xa2, (byte) 0x4e, (byte) 0xa5, (byte) 0x88, (byte) 0x10,
+            (byte) 0xf7, (byte) 0x61, (byte) 0xa2, (byte) 0xfa, (byte) 0x8d, (byte) 0xa6,
+            (byte) 0x13, (byte) 0x9e, (byte) 0x36, (byte) 0x86, (byte) 0x62, (byte) 0xf0,
+            (byte) 0x97, (byte) 0xef, (byte) 0x11, (byte) 0xc6, (byte) 0x35, (byte) 0xd3,
+            (byte) 0x79, (byte) 0x30, (byte) 0xde, (byte) 0xf2, (byte) 0x7f, (byte) 0x7a,
+            (byte) 0x3c, (byte) 0x03, (byte) 0xa3, (byte) 0xc5, (byte) 0xbc, (byte) 0xb1,
+            (byte) 0xbc, (byte) 0x2f, (byte) 0x10, (byte) 0xf4, (byte) 0x51, (byte) 0x89,
+            (byte) 0xe2, (byte) 0xaf, (byte) 0xf7, (byte) 0x61, (byte) 0x1a, (byte) 0xf0,
+            (byte) 0x87, (byte) 0x5e, (byte) 0xa5, (byte) 0x02, (byte) 0xd2, (byte) 0xe4,
+            (byte) 0xa3, (byte) 0x7b, (byte) 0x30, (byte) 0x79, (byte) 0x30, (byte) 0x09,
+            (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,
+            (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x2c, (byte) 0x06,
+            (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01, (byte) 0x86,
+            (byte) 0xf8, (byte) 0x42, (byte) 0x01, (byte) 0x0d, (byte) 0x04, (byte) 0x1f,
+            (byte) 0x16, (byte) 0x1d, (byte) 0x4f, (byte) 0x70, (byte) 0x65, (byte) 0x6e,
+            (byte) 0x53, (byte) 0x53, (byte) 0x4c, (byte) 0x20, (byte) 0x47, (byte) 0x65,
+            (byte) 0x6e, (byte) 0x65, (byte) 0x72, (byte) 0x61, (byte) 0x74, (byte) 0x65,
+            (byte) 0x64, (byte) 0x20, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,
+            (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,
+            (byte) 0x65, (byte) 0x30, (byte) 0x1d, (byte) 0x06, (byte) 0x03, (byte) 0x55,
+            (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x16, (byte) 0x04, (byte) 0x14,
+            (byte) 0xd1, (byte) 0x6c, (byte) 0x36, (byte) 0x36, (byte) 0x61, (byte) 0x6c,
+            (byte) 0xf6, (byte) 0x90, (byte) 0x82, (byte) 0x82, (byte) 0x87, (byte) 0x93,
+            (byte) 0xbe, (byte) 0x99, (byte) 0x60, (byte) 0x1b, (byte) 0x03, (byte) 0x58,
+            (byte) 0x36, (byte) 0x63, (byte) 0x30, (byte) 0x1f, (byte) 0x06, (byte) 0x03,
+            (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x18, (byte) 0x30,
+            (byte) 0x16, (byte) 0x80, (byte) 0x14, (byte) 0x47, (byte) 0x82, (byte) 0xa3,
+            (byte) 0xf1, (byte) 0xc2, (byte) 0x7e, (byte) 0x3a, (byte) 0xde, (byte) 0x4f,
+            (byte) 0x30, (byte) 0x4c, (byte) 0x7f, (byte) 0x72, (byte) 0x81, (byte) 0x15,
+            (byte) 0x32, (byte) 0xda, (byte) 0x7f, (byte) 0x58, (byte) 0x18, (byte) 0x30,
+            (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48,
+            (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,
+            (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0x81, (byte) 0x00,
+            (byte) 0x81, (byte) 0xde, (byte) 0x20, (byte) 0xa1, (byte) 0xb2, (byte) 0x50,
+            (byte) 0x03, (byte) 0xcd, (byte) 0x90, (byte) 0x4f, (byte) 0x2b, (byte) 0x47,
+            (byte) 0x1d, (byte) 0xac, (byte) 0x6e, (byte) 0xb4, (byte) 0xc7, (byte) 0x14,
+            (byte) 0xc6, (byte) 0x4f, (byte) 0x45, (byte) 0xaf, (byte) 0x81, (byte) 0x5d,
+            (byte) 0x5a, (byte) 0x31, (byte) 0xff, (byte) 0x9c, (byte) 0x4d, (byte) 0xdc,
+            (byte) 0x9e, (byte) 0x36, (byte) 0x9f, (byte) 0x9b, (byte) 0xb1, (byte) 0xc9,
+            (byte) 0x50, (byte) 0xa3, (byte) 0xf6, (byte) 0x9c, (byte) 0x68, (byte) 0x6f,
+            (byte) 0x68, (byte) 0xd9, (byte) 0x56, (byte) 0x1b, (byte) 0xe5, (byte) 0x1b,
+            (byte) 0x41, (byte) 0xd4, (byte) 0xcc, (byte) 0xb6, (byte) 0x37, (byte) 0xd5,
+            (byte) 0x69, (byte) 0x6b, (byte) 0x39, (byte) 0xaf, (byte) 0xc6, (byte) 0xb8,
+            (byte) 0x39, (byte) 0x76, (byte) 0xe3, (byte) 0xf7, (byte) 0x97, (byte) 0x74,
+            (byte) 0x31, (byte) 0xc4, (byte) 0x2d, (byte) 0xb7, (byte) 0x9a, (byte) 0xa4,
+            (byte) 0xfa, (byte) 0x9f, (byte) 0xa8, (byte) 0xe3, (byte) 0x41, (byte) 0xda,
+            (byte) 0x2f, (byte) 0x0c, (byte) 0x9d, (byte) 0x83, (byte) 0xdc, (byte) 0x86,
+            (byte) 0x1f, (byte) 0x5c, (byte) 0x0f, (byte) 0x87, (byte) 0x05, (byte) 0xc9,
+            (byte) 0xb0, (byte) 0x63, (byte) 0xca, (byte) 0x9b, (byte) 0xdb, (byte) 0xe6,
+            (byte) 0x3c, (byte) 0xe9, (byte) 0x23, (byte) 0x9e, (byte) 0x23, (byte) 0x44,
+            (byte) 0x1d, (byte) 0x5b, (byte) 0x60, (byte) 0x66, (byte) 0xb6, (byte) 0x72,
+            (byte) 0x8c, (byte) 0x87, (byte) 0x86, (byte) 0xe8, (byte) 0xdb, (byte) 0x29,
+            (byte) 0x67, (byte) 0x9c, (byte) 0x33, (byte) 0x5c, (byte) 0x39, (byte) 0xf1,
+            (byte) 0xb5, (byte) 0x9b, (byte) 0xb8, (byte) 0xe1, (byte) 0x42, (byte) 0x51,
+            (byte) 0xed, (byte) 0x2c
+    };
+
     /**
      * The amount of time to allow before and after expected time for variance
      * in timing tests.
@@ -451,8 +1077,8 @@
         mKeyStore = KeyStore.getInstance("AndroidKeyStore");
     }
 
-    private PrivateKey generatePrivateKey(byte[] fakeKey1) throws Exception {
-        KeyFactory kf = KeyFactory.getInstance("RSA");
+    private PrivateKey generatePrivateKey(String keyType, byte[] fakeKey1) throws Exception {
+        KeyFactory kf = KeyFactory.getInstance(keyType);
         return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey1));
     }
 
@@ -461,14 +1087,29 @@
         return cf.generateCertificate(new ByteArrayInputStream(fakeUser1));
     }
 
-    private PrivateKeyEntry makeUserKey1() throws Exception {
-        return new KeyStore.PrivateKeyEntry(generatePrivateKey(FAKE_KEY_1), new Certificate[] {
-                generateCertificate(FAKE_USER_1), generateCertificate(FAKE_CA_1)
+    private PrivateKeyEntry makeUserDsaKey1() throws Exception {
+        return new KeyStore.PrivateKeyEntry(generatePrivateKey("DSA", FAKE_DSA_KEY_1),
+                new Certificate[] {
+                generateCertificate(FAKE_DSA_USER_1), generateCertificate(FAKE_DSA_CA_1)
         });
     }
 
+    private PrivateKeyEntry makeUserEcKey1() throws Exception {
+        return new KeyStore.PrivateKeyEntry(generatePrivateKey("EC", FAKE_EC_KEY_1),
+                new Certificate[] {
+                        generateCertificate(FAKE_EC_USER_1), generateCertificate(FAKE_EC_CA_1)
+                });
+    }
+
+    private PrivateKeyEntry makeUserRsaKey1() throws Exception {
+        return new KeyStore.PrivateKeyEntry(generatePrivateKey("RSA", FAKE_RSA_KEY_1),
+                new Certificate[] {
+                        generateCertificate(FAKE_RSA_USER_1), generateCertificate(FAKE_RSA_CA_1)
+                });
+    }
+
     private Entry makeCa1() throws Exception {
-        return new KeyStore.TrustedCertificateEntry(generateCertificate(FAKE_CA_1));
+        return new KeyStore.TrustedCertificateEntry(generateCertificate(FAKE_RSA_CA_1));
     }
 
     private void assertAliases(final String[] expectedAliases) throws KeyStoreException {
@@ -494,7 +1135,7 @@
 
         assertAliases(new String[] {});
 
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
@@ -516,7 +1157,7 @@
 
         assertAliases(new String[] {});
 
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertTrue("Should contain generated private key", mKeyStore.containsAlias(TEST_ALIAS_1));
 
@@ -546,13 +1187,13 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         // TEST_ALIAS_2
-        mKeyStore.setCertificateEntry(TEST_ALIAS_2, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_2, generateCertificate(FAKE_RSA_CA_1));
 
         // TEST_ALIAS_3
-        mKeyStore.setCertificateEntry(TEST_ALIAS_3, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_3, generateCertificate(FAKE_RSA_CA_1));
 
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
 
@@ -580,7 +1221,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         // Should not throw when a non-existent entry is requested for delete.
         mKeyStore.deleteEntry(TEST_ALIAS_2);
@@ -589,7 +1230,7 @@
     public void testKeyStore_GetCertificate_Single_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
@@ -601,7 +1242,7 @@
         assertNotNull("Retrieved certificate should not be null", retrieved);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertEquals("Actual and retrieved certificates should be the same", actual, retrieved);
     }
@@ -616,7 +1257,7 @@
     public void testKeyStore_GetCertificateAlias_CAEntry_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
-        Certificate cert = generateCertificate(FAKE_CA_1);
+        Certificate cert = generateCertificate(FAKE_RSA_CA_1);
         mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
@@ -627,10 +1268,10 @@
             throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_1,
                 mKeyStore.getCertificateAlias(actual));
@@ -640,13 +1281,13 @@
             throws Exception {
         mKeyStore.load(null, null);
 
-        Certificate actual = generateCertificate(FAKE_CA_1);
+        Certificate actual = generateCertificate(FAKE_RSA_CA_1);
 
         // Insert TrustedCertificateEntry with CA name
         mKeyStore.setCertificateEntry(TEST_ALIAS_2, actual);
 
         // Insert PrivateKeyEntry that uses the same CA
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertEquals("Stored certificate alias should be found", TEST_ALIAS_2,
                 mKeyStore.getCertificateAlias(actual));
@@ -657,7 +1298,7 @@
         mKeyStore.load(null, null);
 
         CertificateFactory f = CertificateFactory.getInstance("X.509");
-        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        Certificate actual = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         assertNull("Stored certificate alias should not be found",
                 mKeyStore.getCertificateAlias(actual));
@@ -666,12 +1307,12 @@
     public void testKeyStore_GetCertificateAlias_NonExist_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
-        Certificate ca = generateCertificate(FAKE_CA_1);
+        Certificate ca = generateCertificate(FAKE_RSA_CA_1);
 
         // Insert TrustedCertificateEntry with CA name
         mKeyStore.setCertificateEntry(TEST_ALIAS_1, ca);
 
-        Certificate userCert = generateCertificate(FAKE_USER_1);
+        Certificate userCert = generateCertificate(FAKE_RSA_USER_1);
 
         assertNull("Stored certificate alias should be found",
                 mKeyStore.getCertificateAlias(userCert));
@@ -681,11 +1322,11 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         Certificate[] expected = new Certificate[2];
-        expected[0] = generateCertificate(FAKE_USER_1);
-        expected[1] = generateCertificate(FAKE_CA_1);
+        expected[0] = generateCertificate(FAKE_RSA_USER_1);
+        expected[1] = generateCertificate(FAKE_RSA_CA_1);
 
         Certificate[] actual = mKeyStore.getCertificateChain(TEST_ALIAS_1);
 
@@ -711,7 +1352,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         Date now = new Date();
         Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
@@ -727,7 +1368,7 @@
         mKeyStore.load(null, null);
 
         // Insert TrustedCertificateEntry with CA name
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         Date now = new Date();
         Date actual = mKeyStore.getCreationDate(TEST_ALIAS_1);
@@ -744,7 +1385,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
         assertNotNull("Entry should exist", entry);
@@ -753,13 +1394,62 @@
 
         PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
-        assertPrivateKeyEntryEquals(keyEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_DSA_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        // TEST_ALIAS_1
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserDsaKey1(), null);
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "DSA", FAKE_DSA_KEY_1, FAKE_DSA_USER_1, FAKE_DSA_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_EC_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        // TEST_ALIAS_1
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserEcKey1(), null);
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "EC", FAKE_EC_KEY_1, FAKE_EC_USER_1, FAKE_EC_CA_1);
+    }
+
+    public void testKeyStore_GetEntry_RSA_NullParams_Unencrypted_Success() throws Exception {
+        mKeyStore.load(null, null);
+
+        // TEST_ALIAS_1
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
+
+        Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
+        assertNotNull("Entry should exist", entry);
+
+        assertTrue("Should be a PrivateKeyEntry", entry instanceof PrivateKeyEntry);
+
+        PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
+
+        assertPrivateKeyEntryEquals(keyEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                FAKE_RSA_CA_1);
     }
 
     @SuppressWarnings("unchecked")
-    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, byte[] key, byte[] cert,
-            byte[] ca) throws Exception {
-        KeyFactory keyFact = KeyFactory.getInstance("RSA");
+    private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, String keyType, byte[] key,
+            byte[] cert, byte[] ca) throws Exception {
+        KeyFactory keyFact = KeyFactory.getInstance(keyType);
         PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(key));
 
         CertificateFactory certFact = CertificateFactory.getInstance("X.509");
@@ -778,9 +1468,28 @@
 
     private void assertPrivateKeyEntryEquals(PrivateKeyEntry keyEntry, PrivateKey expectedKey,
             Certificate expectedCert, Collection<Certificate> expectedChain) throws Exception {
-        assertEquals("Returned PrivateKey should be what we inserted",
-                ((RSAPrivateKey) expectedKey).getModulus(),
-                ((RSAPrivateKey) keyEntry.getPrivateKey()).getModulus());
+        final PrivateKey privKey = keyEntry.getPrivateKey();
+        final PublicKey pubKey = keyEntry.getCertificate().getPublicKey();
+
+        if (expectedKey instanceof DSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((DSAPrivateKey) expectedKey).getParams(),
+                    ((DSAPublicKey) pubKey).getParams());
+        } else if (expectedKey instanceof ECPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((ECPrivateKey) expectedKey).getParams().getCurve(),
+                    ((ECPublicKey) pubKey).getParams().getCurve());
+        } else if (expectedKey instanceof RSAPrivateKey) {
+            assertEquals("Returned PrivateKey should be what we inserted",
+                    ((RSAPrivateKey) expectedKey).getModulus(),
+                    ((RSAPrivateKey) privKey).getModulus());
+        }
+
+        assertNull("getFormat() should return null", privKey.getFormat());
+        assertNull("getEncoded() should return null", privKey.getEncoded());
+
+        assertEquals("Public keys should be in X.509 format", "X.509", pubKey.getFormat());
+        assertNotNull("Public keys should be encodable", pubKey.getEncoded());
 
         assertEquals("Returned Certificate should be what we inserted", expectedCert,
                 keyEntry.getCertificate());
@@ -814,7 +1523,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         Key key = mKeyStore.getKey(TEST_ALIAS_1, null);
         assertNotNull("Key should exist", key);
@@ -824,7 +1533,7 @@
         RSAPrivateKey actualKey = (RSAPrivateKey) key;
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         assertEquals("Inserted key should be same as retrieved key",
                 ((RSAPrivateKey) expectedKey).getModulus(), actualKey.getModulus());
@@ -834,7 +1543,7 @@
         mKeyStore.load(null, null);
 
         // Insert TrustedCertificateEntry with CA name
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertNull("Certificate entries should return null", mKeyStore.getKey(TEST_ALIAS_1, null));
     }
@@ -857,7 +1566,7 @@
         mKeyStore.load(null, null);
 
         // Insert TrustedCertificateEntry with CA name
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertTrue("Should return true for CA certificate",
                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
@@ -867,7 +1576,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertFalse("Should return false for PrivateKeyEntry",
                 mKeyStore.isCertificateEntry(TEST_ALIAS_1));
@@ -884,7 +1593,7 @@
         mKeyStore.load(null, null);
 
         // TEST_ALIAS_1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertTrue("Should return true for PrivateKeyEntry", mKeyStore.isKeyEntry(TEST_ALIAS_1));
     }
@@ -892,7 +1601,7 @@
     public void testKeyStore_IsKeyEntry_CA_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertFalse("Should return false for CA certificate", mKeyStore.isKeyEntry(TEST_ALIAS_1));
     }
@@ -905,7 +1614,7 @@
     }
 
     public void testKeyStore_SetCertificate_CA_Unencrypted_Success() throws Exception {
-        final Certificate actual = generateCertificate(FAKE_CA_1);
+        final Certificate actual = generateCertificate(FAKE_RSA_CA_1);
 
         mKeyStore.load(null, null);
 
@@ -922,11 +1631,11 @@
             throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        final Certificate cert = generateCertificate(FAKE_CA_1);
+        final Certificate cert = generateCertificate(FAKE_RSA_CA_1);
 
         // TODO have separate FAKE_CA for second test
         mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -937,11 +1646,11 @@
     public void testKeyStore_SetCertificate_PrivateKeyExists_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        final Certificate cert = generateCertificate(FAKE_CA_1);
+        final Certificate cert = generateCertificate(FAKE_RSA_CA_1);
 
         try {
             mKeyStore.setCertificateEntry(TEST_ALIAS_1, cert);
@@ -954,13 +1663,13 @@
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -974,20 +1683,20 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetEntry_PrivateKeyEntry_Params_Unencrypted_Failure() throws Exception {
         mKeyStore.load(null, null);
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
         final Certificate[] expectedChain = new Certificate[2];
-        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+        expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         PrivateKeyEntry entry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1012,11 +1721,12 @@
 
         // Start with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1030,17 +1740,19 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make entirely new test vector for the overwrite
         // Replace with PrivateKeyEntry
         {
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
 
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expected = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1054,7 +1766,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1066,7 +1779,8 @@
 
         // Start with TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f
+                    .generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1084,10 +1798,11 @@
         // Replace with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
-            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
+            expectedChain[1] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1099,7 +1814,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1109,14 +1825,15 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1129,7 +1846,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with TrustedCertificateEntry
@@ -1154,14 +1872,15 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Start with PrivateKeyEntry
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[2];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             expectedChain[1] = caCert;
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
@@ -1174,15 +1893,17 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // Replace with PrivateKeyEntry that has no chain
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey expectedKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey expectedKey = keyFact
+                    .generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] expectedChain = new Certificate[1];
-            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            expectedChain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
 
             PrivateKeyEntry expectedPrivEntry = new PrivateKeyEntry(expectedKey, expectedChain);
 
@@ -1194,7 +1915,8 @@
                     actualEntry instanceof PrivateKeyEntry);
 
             PrivateKeyEntry actualPrivEntry = (PrivateKeyEntry) actualEntry;
-            assertPrivateKeyEntryEquals(actualPrivEntry, FAKE_KEY_1, FAKE_USER_1, null);
+            assertPrivateKeyEntryEquals(actualPrivEntry, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    null);
         }
     }
 
@@ -1206,7 +1928,8 @@
 
         // Insert TrustedCertificateEntry
         {
-            final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+            final Certificate caCert = f
+                    .generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
             TrustedCertificateEntry expectedCertEntry = new TrustedCertificateEntry(caCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedCertEntry, null);
@@ -1223,8 +1946,8 @@
 
         // Replace with TrustedCertificateEntry of USER
         {
-            final Certificate userCert = f
-                    .generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            final Certificate userCert = f.generateCertificate(new ByteArrayInputStream(
+                    FAKE_RSA_USER_1));
 
             TrustedCertificateEntry expectedUserEntry = new TrustedCertificateEntry(userCert);
             mKeyStore.setEntry(TEST_ALIAS_1, expectedUserEntry, null);
@@ -1245,12 +1968,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         try {
@@ -1265,12 +1988,12 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         KeyFactory keyFact = KeyFactory.getInstance("RSA");
-        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+        PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
         final Certificate[] chain = new Certificate[2];
-        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+        chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
         chain[1] = caCert;
 
         mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1283,7 +2006,7 @@
 
         PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-        assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+        assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1, FAKE_RSA_CA_1);
     }
 
     public void testKeyStore_SetKeyEntry_Replaced_Unencrypted_Success() throws Exception {
@@ -1291,14 +2014,14 @@
 
         final CertificateFactory f = CertificateFactory.getInstance("X.509");
 
-        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_CA_1));
+        final Certificate caCert = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_CA_1));
 
         // Insert initial key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1311,16 +2034,17 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
 
         // TODO make a separate key
         // Replace key
         {
             KeyFactory keyFact = KeyFactory.getInstance("RSA");
-            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_KEY_1));
+            PrivateKey privKey = keyFact.generatePrivate(new PKCS8EncodedKeySpec(FAKE_RSA_KEY_1));
             final Certificate[] chain = new Certificate[2];
-            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_USER_1));
+            chain[0] = f.generateCertificate(new ByteArrayInputStream(FAKE_RSA_USER_1));
             chain[1] = caCert;
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, privKey, null, chain);
@@ -1333,7 +2057,8 @@
 
             PrivateKeyEntry actual = (PrivateKeyEntry) actualEntry;
 
-            assertPrivateKeyEntryEquals(actual, FAKE_KEY_1, FAKE_USER_1, FAKE_CA_1);
+            assertPrivateKeyEntryEquals(actual, "RSA", FAKE_RSA_KEY_1, FAKE_RSA_USER_1,
+                    FAKE_RSA_CA_1);
         }
     }
 
@@ -1342,7 +2067,7 @@
 
         // Create key #1
         {
-            KeyStore.PrivateKeyEntry privEntry = makeUserKey1();
+            KeyStore.PrivateKeyEntry privEntry = makeUserRsaKey1();
             mKeyStore.setEntry(TEST_ALIAS_1, privEntry, null);
 
             Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -1352,7 +2077,7 @@
             PrivateKeyEntry keyEntry = (PrivateKeyEntry) entry;
 
             ArrayList<Certificate> chain = new ArrayList<Certificate>();
-            chain.add(generateCertificate(FAKE_CA_1));
+            chain.add(generateCertificate(FAKE_RSA_CA_1));
             assertPrivateKeyEntryEquals(keyEntry, privEntry.getPrivateKey(),
                     privEntry.getCertificate(), chain);
         }
@@ -1365,7 +2090,7 @@
 
             PrivateKey expectedKey = (PrivateKey) key;
 
-            Certificate expectedCert = generateCertificate(FAKE_USER_1);
+            Certificate expectedCert = generateCertificate(FAKE_RSA_USER_1);
 
             mKeyStore.setKeyEntry(TEST_ALIAS_1, expectedKey, null,
                     new Certificate[] { expectedCert });
@@ -1385,17 +2110,17 @@
         mKeyStore.load(null, null);
 
         // Create key #1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         // Create key #2
-        mKeyStore.setEntry(TEST_ALIAS_2, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_2, makeUserRsaKey1(), null);
 
 
         // Replace key #1 with key #2
         {
             Key key1 = mKeyStore.getKey(TEST_ALIAS_2, null);
 
-            Certificate cert = generateCertificate(FAKE_USER_1);
+            Certificate cert = generateCertificate(FAKE_RSA_USER_1);
 
             try {
                 mKeyStore.setKeyEntry(TEST_ALIAS_1, key1, null, new Certificate[] { cert });
@@ -1410,7 +2135,7 @@
         mKeyStore.load(null, null);
 
         // Create key #1
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         // Replace with same
         Entry entry = mKeyStore.getEntry(TEST_ALIAS_1, null);
@@ -1420,17 +2145,17 @@
     public void testKeyStore_Size_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_1, generateCertificate(FAKE_RSA_CA_1));
 
         assertEquals("The keystore size should match expected", 1, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1 });
 
-        mKeyStore.setCertificateEntry(TEST_ALIAS_2, generateCertificate(FAKE_CA_1));
+        mKeyStore.setCertificateEntry(TEST_ALIAS_2, generateCertificate(FAKE_RSA_CA_1));
 
         assertEquals("The keystore size should match expected", 2, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2 });
 
-        mKeyStore.setEntry(TEST_ALIAS_3, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_3, makeUserRsaKey1(), null);
 
         assertEquals("The keystore size should match expected", 3, mKeyStore.size());
         assertAliases(new String[] { TEST_ALIAS_1, TEST_ALIAS_2, TEST_ALIAS_3 });
@@ -1495,7 +2220,7 @@
     public void testKeyStore_KeyOperations_Wrap_Unencrypted_Success() throws Exception {
         mKeyStore.load(null, null);
 
-        mKeyStore.setEntry(TEST_ALIAS_1, makeUserKey1(), null);
+        mKeyStore.setEntry(TEST_ALIAS_1, makeUserRsaKey1(), null);
 
         // Test key usage
         Entry e = mKeyStore.getEntry(TEST_ALIAS_1, null);
diff --git a/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java b/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java
new file mode 100644
index 0000000..db6d6ba
--- /dev/null
+++ b/tests/tests/keystore/src/android/keystore/cts/KeyChainTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013 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 android.keystore.cts;
+
+import android.security.KeyChain;
+import junit.framework.TestCase;
+
+public class KeyChainTest extends TestCase {
+    public void testIsKeyAlgorithmSupported_RequiredAlgorithmsSupported() throws Exception {
+        assertTrue("DSA must be supported", KeyChain.isKeyAlgorithmSupported("DSA"));
+        assertTrue("EC must be supported", KeyChain.isKeyAlgorithmSupported("EC"));
+        assertTrue("RSA must be supported", KeyChain.isKeyAlgorithmSupported("RSA"));
+    }
+
+    /**
+     * Tests whether the required algorithms are backed by a Keymaster HAL that
+     * binds the key material to the specific device it was created or imported
+     * to. For more information on the Keymaster HAL, look at the header file at
+     * hardware/libhardware/include/hardware/keymaster.h and the associated
+     * tests in hardware/libhardware/tests/keymaster/
+     */
+    public void testIsBoundKeyAlgorithm_RequiredAlgorithmsSupported() throws Exception {
+        assertTrue("RSA must be hardware-backed by a hardware-specific Keymaster HAL",
+                KeyChain.isBoundKeyAlgorithm("RSA"));
+
+        // These are not required, but must not throw an exception
+        KeyChain.isBoundKeyAlgorithm("DSA");
+        KeyChain.isBoundKeyAlgorithm("EC");
+    }
+}
diff --git a/tests/tests/location/README.txt b/tests/tests/location/README.txt
new file mode 100644
index 0000000..4692eab
--- /dev/null
+++ b/tests/tests/location/README.txt
@@ -0,0 +1,2 @@
+Location CTS tests that require "android.permission.ACCESS_FINE_LOCATION".
+Note you must enable "Allow mock locations" at Settings > Developer options.
diff --git a/tests/tests/location/src/android/location/cts/LocationManagerTest.java b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
old mode 100755
new mode 100644
index 2a2274c..8028422
--- a/tests/tests/location/src/android/location/cts/LocationManagerTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationManagerTest.java
@@ -19,17 +19,18 @@
 
 import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.location.Criteria;
 import android.location.GpsStatus;
+import android.location.GpsStatus.Listener;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.location.LocationProvider;
-import android.location.GpsStatus.Listener;
 import android.os.Bundle;
 import android.os.HandlerThread;
 import android.os.Looper;
@@ -38,7 +39,6 @@
 import android.test.InstrumentationTestCase;
 
 import java.util.List;
-import java.lang.Thread;
 
 /**
  * Requires the permissions
@@ -81,7 +81,7 @@
         // remove test provider if left over from an aborted run
         LocationProvider lp = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         if (lp != null) {
-            mManager.removeTestProvider(TEST_MOCK_PROVIDER_NAME);
+            removeTestProvider(TEST_MOCK_PROVIDER_NAME);
         }
 
         addTestProvider(TEST_MOCK_PROVIDER_NAME);
@@ -107,7 +107,7 @@
     protected void tearDown() throws Exception {
         LocationProvider provider = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         if (provider != null) {
-            mManager.removeTestProvider(TEST_MOCK_PROVIDER_NAME);
+            removeTestProvider(TEST_MOCK_PROVIDER_NAME);
         }
         if (mPendingIntent != null) {
             mManager.removeProximityAlert(mPendingIntent);
@@ -138,12 +138,12 @@
             // expected
         }
 
-        mManager.removeTestProvider(TEST_MOCK_PROVIDER_NAME);
+        removeTestProvider(TEST_MOCK_PROVIDER_NAME);
         provider = mManager.getProvider(TEST_MOCK_PROVIDER_NAME);
         assertNull(provider);
 
         try {
-            mManager.removeTestProvider(UNKNOWN_PROVIDER_NAME);
+            removeTestProvider(UNKNOWN_PROVIDER_NAME);
             fail("Should throw IllegalArgumentException when no provider exists!");
         } catch (IllegalArgumentException e) {
             // expected
@@ -177,7 +177,7 @@
         assertEquals(oldSizeAllProviders, providers.size());
         assertTrue(hasTestProvider(providers));
 
-        mManager.removeTestProvider(TEST_MOCK_PROVIDER_NAME);
+        removeTestProvider(TEST_MOCK_PROVIDER_NAME);
         providers = mManager.getAllProviders();
         assertEquals(oldSizeAllProviders - 1, providers.size());
         assertFalse(hasTestProvider(providers));
@@ -257,6 +257,70 @@
         assertNotNull(p);
     }
 
+    /**
+     * Tests that location mode is consistent with which providers are enabled. Sadly we can only
+     * passively test whatever mode happens to be selected--actually changing the mode would require
+     * the test to be system-signed, and CTS tests aren't. Also mode changes that enable NLP require
+     * user consent. Thus we will have a manual CTS verifier test that is similar to this test but
+     * tests every location mode. This test is just a "backup" for that since verifier tests are
+     * less reliable.
+     */
+    public void testModeAndProviderApisConsistent() {
+        ContentResolver cr = mContext.getContentResolver();
+        int mode = Settings.Secure.getInt(
+                cr, Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+        boolean gps = Settings.Secure.isLocationProviderEnabled(cr, LocationManager.GPS_PROVIDER);
+        boolean nlp = Settings.Secure.isLocationProviderEnabled(
+                cr, LocationManager.NETWORK_PROVIDER);
+
+        // Assert that if there are no test providers enabled, LocationManager just returns the
+        // values from Settings.Secure.
+        forceClearTestProvider(LocationManager.GPS_PROVIDER);
+        forceClearTestProvider(LocationManager.NETWORK_PROVIDER);
+        boolean lmGps = mManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
+        boolean lmNlp = mManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+        assertEquals("Inconsistent GPS values", gps, lmGps);
+        assertEquals("Inconsistent NLP values", nlp, lmNlp);
+
+        // Assert that isLocationProviderEnabled() values are consistent with the location mode
+        switch (mode) {
+            case Settings.Secure.LOCATION_MODE_OFF:
+                assertFalse("Bad GPS for mode " + mode, gps);
+                assertFalse("Bad NLP for mode " + mode, nlp);
+                break;
+            case Settings.Secure.LOCATION_MODE_SENSORS_ONLY:
+                assertEquals("Bad GPS for mode " + mode, hasGpsFeature(), gps);
+                assertFalse("Bad NLP for mode " + mode, nlp);
+                break;
+            case Settings.Secure.LOCATION_MODE_BATTERY_SAVING:
+                assertFalse("Bad GPS for mode " + mode, gps);
+                assertTrue("Bad NLP for mode " + mode, nlp);
+                break;
+            case Settings.Secure.LOCATION_MODE_HIGH_ACCURACY:
+                assertEquals("Bad GPS for mode " + mode, hasGpsFeature(), gps);
+                assertTrue("Bad NLP for mode " + mode, nlp);
+                break;
+        }
+    }
+
+    /**
+     * Clears the test provider. Works around b/11446702 by temporarily adding the test provider
+     * so we are allowed to clear it.
+     */
+    private void forceClearTestProvider(String provider) {
+        addTestProvider(provider);
+        mManager.clearTestProviderEnabled(provider);
+        removeTestProvider(provider);
+    }
+
+    /**
+     * Work around b/11446702 by clearing the test provider before removing it
+     */
+    private void removeTestProvider(String provider) {
+        mManager.clearTestProviderEnabled(provider);
+        mManager.removeTestProvider(provider);
+    }
+
     public void testLocationUpdatesWithLocationListener() throws InterruptedException {
         doLocationUpdatesWithLocationListener(TEST_MOCK_PROVIDER_NAME);
 
@@ -349,7 +413,7 @@
                     // run the update location test logic to ensure location updates can be injected
                     doLocationUpdatesWithLocationListener(providerName);
                 } finally {
-                    mManager.removeTestProvider(providerName);
+                    removeTestProvider(providerName);
                 }
             }
         }
@@ -761,7 +825,7 @@
     }
 
     private void unmockFusedLocation() {
-        mManager.removeTestProvider(FUSED_PROVIDER_NAME);
+        removeTestProvider(FUSED_PROVIDER_NAME);
     }
 
     /**
diff --git a/tests/tests/location/src/android/location/cts/LocationProviderTest.java b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
index 60c9fb4..716801d 100644
--- a/tests/tests/location/src/android/location/cts/LocationProviderTest.java
+++ b/tests/tests/location/src/android/location/cts/LocationProviderTest.java
@@ -38,6 +38,8 @@
 
     @Override
     protected void tearDown() throws Exception {
+        // Work around b/11446702 by clearing the test provider before removing it
+        mLocationManager.clearTestProviderLocation(PROVIDER_NAME);
         mLocationManager.removeTestProvider(PROVIDER_NAME);
         super.tearDown();
     }
diff --git a/tests/tests/location2/README.txt b/tests/tests/location2/README.txt
new file mode 100644
index 0000000..92241eb
--- /dev/null
+++ b/tests/tests/location2/README.txt
@@ -0,0 +1,3 @@
+Location CTS tests that require "android.permission.ACCESS_COARSE_LOCATION", but not
+"android.permission.ACCESS_FINE_LOCATION". Note you must enable "Allow mock locations"
+at Settings > Developer options.
diff --git a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
old mode 100755
new mode 100644
index 8b818ba..6bf5c62
--- a/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
+++ b/tests/tests/location2/src/android/location2/cts/LocationManagerTest.java
@@ -91,10 +91,17 @@
         try {
             mManager.getProvider(providerName);
             fail("LocationManager.getProvider() did not throw SecurityException as expected");
-        } catch (SecurityException e) {
-            // expected
+        } catch (SecurityException expected) {
+        } finally {
+            removeTestProvider(providerName);
         }
+    }
 
+    /**
+     * Work around b/11446702 by clearing the test provider before removing it
+     */
+    private void removeTestProvider(String providerName) {
+        mManager.clearTestProviderEnabled(providerName);
         mManager.removeTestProvider(providerName);
     }
 
@@ -107,9 +114,12 @@
     }
 
     public void doTestGetCoarseProvider_allowed(String providerName) {
-        addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
-        assertNotNull(mManager.getProvider(providerName));
-        mManager.removeTestProvider(providerName);
+        try {
+            addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
+            assertNotNull(mManager.getProvider(providerName));
+        } finally {
+            removeTestProvider(providerName);
+        }
     }
 
     public void testGetNetworkProviderLocationUpdates_withIntent() {
@@ -130,45 +140,53 @@
 
 
     private void doTestGetLocationUpdates_withIntent(String providerName) {
-        addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
-        registerIntentReceiver();
+        try {
+            addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
+            registerIntentReceiver();
 
-        mManager.requestLocationUpdates(providerName, 0, 0, mPendingIntent);
-        updateLocation(providerName, LAT, LNG);
-        waitForReceiveBroadcast();
+            mManager.requestLocationUpdates(providerName, 0, 0, mPendingIntent);
+            updateLocation(providerName, LAT, LNG);
+            waitForReceiveBroadcast();
 
-        assertNotNull(mIntentReceiver.getLastReceivedIntent());
-        final Location location = mManager.getLastKnownLocation(providerName);
-        assertEquals(providerName, location.getProvider());
+            assertNotNull(mIntentReceiver.getLastReceivedIntent());
+            final Location location = mManager.getLastKnownLocation(providerName);
+            assertEquals(providerName, location.getProvider());
 
-        assertEquals(3000.0f, location.getAccuracy());
-        assertEquals(LAT, location.getLatitude(), FUDGER_DELTA);
-        assertEquals(LNG, location.getLongitude(), FUDGER_DELTA);
+            assertEquals(3000.0f, location.getAccuracy());
+            assertEquals(LAT, location.getLatitude(), FUDGER_DELTA);
+            assertEquals(LNG, location.getLongitude(), FUDGER_DELTA);
 
-        mManager.removeUpdates(mPendingIntent);
-        mManager.removeTestProvider(providerName);
+            mManager.removeUpdates(mPendingIntent);
+        } finally {
+            removeTestProvider(providerName);
+        }
     }
 
     private void doTestGetLocationUpdates_withListener(String providerName) {
-        addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
+        try {
+            addTestProvider(providerName, Criteria.ACCURACY_COARSE, true, false, true);
 
-        MockLocationListener listener = new MockLocationListener();
-        HandlerThread handlerThread = new HandlerThread("testLocationUpdates for " + providerName);
-        handlerThread.start();
+            MockLocationListener listener = new MockLocationListener();
+            HandlerThread handlerThread = new HandlerThread("testLocationUpdates for "
+                    + providerName);
+            handlerThread.start();
 
-        mManager.requestLocationUpdates(providerName, 0, 0, listener, handlerThread.getLooper());
-        updateLocation(providerName, LAT, LNG);
+            mManager.requestLocationUpdates(
+                    providerName, 0, 0, listener, handlerThread.getLooper());
+            updateLocation(providerName, LAT, LNG);
 
-        assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT_MS));
-        Location location = listener.getLocation();
-        assertEquals(providerName, location.getProvider());
+            assertTrue(listener.hasCalledOnLocationChanged(TEST_TIME_OUT_MS));
+            Location location = listener.getLocation();
+            assertEquals(providerName, location.getProvider());
 
-        assertEquals(3000.0f, location.getAccuracy());
-        assertEquals(LAT, location.getLatitude(), FUDGER_DELTA);
-        assertEquals(LNG, location.getLongitude(), FUDGER_DELTA);
+            assertEquals(3000.0f, location.getAccuracy());
+            assertEquals(LAT, location.getLatitude(), FUDGER_DELTA);
+            assertEquals(LNG, location.getLongitude(), FUDGER_DELTA);
 
-        mManager.removeUpdates(listener);
-        mManager.removeTestProvider(providerName);
+            mManager.removeUpdates(listener);
+        } finally {
+            removeTestProvider(providerName);
+        }
     }
 
     /**
@@ -231,12 +249,11 @@
         try {
             mManager.sendExtraCommand(LocationManager.GPS_PROVIDER, "unknown", new Bundle());
             fail("Should have failed to send a command to the gps provider");
-        } catch (SecurityException e) {
-            // expected
+        } catch (SecurityException expected) {
+        } finally {
+            removeTestProvider(LocationManager.GPS_PROVIDER);
+            removeTestProvider(LocationManager.NETWORK_PROVIDER);
         }
-
-        mManager.removeTestProvider(LocationManager.GPS_PROVIDER);
-        mManager.removeTestProvider(LocationManager.NETWORK_PROVIDER);
     }
 
     private void registerIntentReceiver() {
diff --git a/tests/tests/media/Android.mk b/tests/tests/media/Android.mk
index f7639a4..4474b4a 100644
--- a/tests/tests/media/Android.mk
+++ b/tests/tests/media/Android.mk
@@ -22,7 +22,7 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := ctsutil ctstestserver ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil ctstestserver ctstestrunner
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
diff --git a/tests/tests/media/AndroidManifest.xml b/tests/tests/media/AndroidManifest.xml
index 2eeef08..90024c4 100644
--- a/tests/tests/media/AndroidManifest.xml
+++ b/tests/tests/media/AndroidManifest.xml
@@ -58,6 +58,12 @@
                 <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
             </intent-filter>
         </activity>
+        <service android:name="android.media.cts.RemoteVirtualDisplayService"
+            android:process=":remoteService" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+            </intent-filter>
+        </service>
     </application>
 
     <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
diff --git a/tests/tests/media/assets/hls.m3u8 b/tests/tests/media/assets/hls.m3u8
new file mode 100644
index 0000000..127574a
--- /dev/null
+++ b/tests/tests/media/assets/hls.m3u8
@@ -0,0 +1,8 @@
+#EXTM3U
+#EXT-X-TARGETDURATION:10
+#EXT-X-MEDIA-SEQUENCE:0
+#EXTINF:10, no desc
+segment000000.ts
+#EXTINF:10, no desc
+segment000001.ts
+#EXT-X-ENDLIST
diff --git a/tests/tests/media/assets/segment000000.ts b/tests/tests/media/assets/segment000000.ts
new file mode 100644
index 0000000..8992c7b
--- /dev/null
+++ b/tests/tests/media/assets/segment000000.ts
Binary files differ
diff --git a/tests/tests/media/assets/segment000001.ts b/tests/tests/media/assets/segment000001.ts
new file mode 100644
index 0000000..fb112ec
--- /dev/null
+++ b/tests/tests/media/assets/segment000001.ts
Binary files differ
diff --git a/tests/tests/media/res/layout/composition_layout.xml b/tests/tests/media/res/layout/composition_layout.xml
new file mode 100644
index 0000000..6aa9ea8
--- /dev/null
+++ b/tests/tests/media/res/layout/composition_layout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2014 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.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal" >
+        <FrameLayout
+            android:id="@+id/window0"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:visibility="visible"
+            android:layout_weight="0.33" />
+        <FrameLayout
+            android:id="@+id/window1"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:visibility="gone"
+            android:layout_weight="0.33" />
+        <FrameLayout
+            android:id="@+id/window2"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:visibility="gone"
+            android:layout_weight="0.33" />
+</LinearLayout>
diff --git a/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
new file mode 100644
index 0000000..add873d
--- /dev/null
+++ b/tests/tests/media/res/raw/video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz.mp4
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm b/tests/tests/media/res/raw/video_1280x720_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
new file mode 100644
index 0000000..c8b9512
--- /dev/null
+++ b/tests/tests/media/res/raw/video_1280x720_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
Binary files differ
diff --git a/tests/tests/media/res/raw/video_1280x720_webm_vp9_309kbps_25fps_vorbis_stereo_128kbps_44100hz.webm b/tests/tests/media/res/raw/video_1280x720_webm_vp9_309kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
new file mode 100644
index 0000000..65b436a
--- /dev/null
+++ b/tests/tests/media/res/raw/video_1280x720_webm_vp9_309kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4 b/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4
new file mode 100644
index 0000000..5dbb6db
--- /dev/null
+++ b/tests/tests/media/res/raw/video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz.mp4
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm b/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
new file mode 100644
index 0000000..f64aec3
--- /dev/null
+++ b/tests/tests/media/res/raw/video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
Binary files differ
diff --git a/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm b/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
new file mode 100644
index 0000000..59b0c44
--- /dev/null
+++ b/tests/tests/media/res/raw/video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz.webm
Binary files differ
diff --git a/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
new file mode 100644
index 0000000..1747afa
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/AdaptivePlaybackTest.java
@@ -0,0 +1,1610 @@
+/*
+ * Copyright (C) 2014 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 android.media.cts;
+
+import com.android.cts.media.R;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.CodecProfileLevel;
+import android.media.MediaCodecList;
+import android.media.MediaExtractor;
+import android.media.MediaFormat;
+import android.util.Log;
+import android.view.Surface;
+
+import android.opengl.GLES20;
+import javax.microedition.khronos.opengles.GL10;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.zip.CRC32;
+
+public class AdaptivePlaybackTest extends MediaPlayerTestBase {
+    private static final String TAG = "AdaptivePlaybackTest";
+    private boolean sanity = false;
+    private static final int MIN_FRAMES_BEFORE_DRC = 2;
+
+    public Iterable<Codec> H264(CodecFactory factory) {
+        return factory.createCodecList(
+                mContext,
+                "video/avc",
+                "OMX.google.h264.decoder",
+                R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
+                R.raw.video_1280x720_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz);
+    }
+
+    public Iterable<Codec> H263(CodecFactory factory) {
+        return factory.createCodecList(
+                mContext,
+                "video/3gpp",
+                "OMX.google.h263.decoder",
+                R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz);
+    }
+
+    public Iterable<Codec> Mpeg4(CodecFactory factory) {
+        return factory.createCodecList(
+                mContext,
+                "video/mp4v-es",
+                "OMX.google.mpeg4.decoder",
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz);
+    }
+
+    public Iterable<Codec> VP8(CodecFactory factory) {
+        return factory.createCodecList(
+                mContext,
+                "video/x-vnd.on2.vp8",
+                "OMX.google.vp8.decoder",
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                R.raw.video_1280x720_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz);
+    }
+
+    public Iterable<Codec> VP9(CodecFactory factory) {
+        return factory.createCodecList(
+                mContext,
+                "video/x-vnd.on2.vp9",
+                "OMX.google.vp9.decoder",
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                R.raw.video_1280x720_webm_vp9_309kbps_25fps_vorbis_stereo_128kbps_44100hz);
+    }
+
+    CodecFactory ALL = new CodecFactory();
+    CodecFactory SW  = new SWCodecFactory();
+    CodecFactory HW  = new HWCodecFactory();
+
+    public Iterable<Codec> H264()  { return H264(ALL);  }
+    public Iterable<Codec> VP8()   { return VP8(ALL);   }
+    public Iterable<Codec> VP9()   { return VP9(ALL);   }
+    public Iterable<Codec> Mpeg4() { return Mpeg4(ALL); }
+    public Iterable<Codec> H263()  { return H263(ALL);  }
+
+    public Iterable<Codec> AllCodecs() {
+        return chain(H264(ALL), VP8(ALL), VP9(ALL), Mpeg4(ALL), H263(ALL));
+    }
+
+    public Iterable<Codec> SWCodecs() {
+        return chain(H264(SW), VP8(SW), VP9(SW), Mpeg4(SW), H263(SW));
+    }
+
+    public Iterable<Codec> HWCodecs() {
+        return chain(H264(HW), VP8(HW), VP9(HW), Mpeg4(HW), H263(HW));
+    }
+
+    /* tests for adaptive codecs */
+    Test adaptiveEarlyEos     = new EarlyEosTest().adaptive();
+    Test adaptiveEosFlushSeek = new EosFlushSeekTest().adaptive();
+    Test adaptiveSkipAhead    = new AdaptiveSkipTest(true /* forward */);
+    Test adaptiveSkipBack     = new AdaptiveSkipTest(false /* forward */);
+
+    /* DRC tests for adaptive codecs */
+    Test adaptiveReconfigDrc      = new ReconfigDrcTest().adaptive();
+    Test adaptiveSmallReconfigDrc = new ReconfigDrcTest().adaptiveSmall();
+    Test adaptiveDrc      = new AdaptiveDrcTest(); /* adaptive */
+    Test adaptiveSmallDrc = new AdaptiveDrcTest().adaptiveSmall();
+
+    /* tests for regular codecs */
+    Test earlyEos          = new EarlyEosTest();
+    Test eosFlushSeek      = new EosFlushSeekTest();
+    Test flushConfigureDrc = new ReconfigDrcTest();
+
+    Test[] allTests = {
+        adaptiveEarlyEos,
+        adaptiveEosFlushSeek,
+        adaptiveSkipAhead,
+        adaptiveSkipBack,
+        adaptiveReconfigDrc,
+        adaptiveSmallReconfigDrc,
+        adaptiveDrc,
+        adaptiveSmallDrc,
+        earlyEos,
+        eosFlushSeek,
+        flushConfigureDrc,
+    };
+
+    /* helpers to run sets of tests */
+    public void runEOS() { ex(AllCodecs(), new Test[] {
+        adaptiveEarlyEos,
+        adaptiveEosFlushSeek,
+        adaptiveReconfigDrc,
+        adaptiveSmallReconfigDrc,
+        earlyEos,
+        eosFlushSeek,
+        flushConfigureDrc,
+    }); }
+
+    public void runAll() { ex(AllCodecs(), allTests); }
+    public void runSW()  { ex(SWCodecs(),  allTests); }
+    public void runHW()  { ex(HWCodecs(),  allTests); }
+
+    public void sanityAll() { sanity = true; try { runAll(); } finally { sanity = false; } }
+    public void sanitySW()  { sanity = true; try { runSW();  } finally { sanity = false; } }
+    public void sanityHW()  { sanity = true; try { runHW();  } finally { sanity = false; } }
+
+    public void runH264()  { ex(H264(),  allTests); }
+    public void runVP8()   { ex(VP8(),   allTests); }
+    public void runVP9()   { ex(VP9(),   allTests); }
+    public void runMpeg4() { ex(Mpeg4(), allTests); }
+    public void runH263()  { ex(H263(),  allTests); }
+
+    public void onlyH264HW()  { ex(H264(HW),  allTests); }
+    public void onlyVP8HW()   { ex(VP8(HW),   allTests); }
+    public void onlyVP9HW()   { ex(VP9(HW),   allTests); }
+    public void onlyMpeg4HW() { ex(Mpeg4(HW), allTests); }
+    public void onlyH263HW()  { ex(H263(HW),  allTests); }
+
+    public void onlyH264SW()  { ex(H264(SW),  allTests); }
+    public void onlyVP8SW()   { ex(VP8(SW),   allTests); }
+    public void onlyVP9SW()   { ex(VP9(SW),   allTests); }
+    public void onlyMpeg4SW() { ex(Mpeg4(SW), allTests); }
+    public void onlyH263SW()  { ex(H263(SW),  allTests); }
+
+    public void bytebuffer() { ex(H264(SW), new EarlyEosTest().byteBuffer()); }
+    public void texture() { ex(H264(HW), new EarlyEosTest().texture()); }
+
+    /* inidividual tests */
+    public void testH264_adaptiveEarlyEos()  { ex(H264(),  adaptiveEarlyEos); }
+    public void testVP8_adaptiveEarlyEos()   { ex(VP8(),   adaptiveEarlyEos); }
+    public void testVP9_adaptiveEarlyEos()   { ex(VP9(),   adaptiveEarlyEos); }
+    public void testMpeg4_adaptiveEarlyEos() { ex(Mpeg4(), adaptiveEarlyEos); }
+    public void testH263_adaptiveEarlyEos()  { ex(H263(),  adaptiveEarlyEos); }
+
+    public void testH264_adaptiveEosFlushSeek()  { ex(H264(),  adaptiveEosFlushSeek); }
+    public void testVP8_adaptiveEosFlushSeek()   { ex(VP8(),   adaptiveEosFlushSeek); }
+    public void testVP9_adaptiveEosFlushSeek()   { ex(VP9(),   adaptiveEosFlushSeek); }
+    public void testMpeg4_adaptiveEosFlushSeek() { ex(Mpeg4(), adaptiveEosFlushSeek); }
+    public void testH263_adaptiveEosFlushSeek()  { ex(H263(),  adaptiveEosFlushSeek); }
+
+    public void testH264_adaptiveSkipAhead()  { ex(H264(),  adaptiveSkipAhead); }
+    public void testVP8_adaptiveSkipAhead()   { ex(VP8(),   adaptiveSkipAhead); }
+    public void testVP9_adaptiveSkipAhead()   { ex(VP9(),   adaptiveSkipAhead); }
+    public void testMpeg4_adaptiveSkipAhead() { ex(Mpeg4(), adaptiveSkipAhead); }
+    public void testH263_adaptiveSkipAhead()  { ex(H263(),  adaptiveSkipAhead); }
+
+    public void testH264_adaptiveSkipBack()  { ex(H264(),  adaptiveSkipBack); }
+    public void testVP8_adaptiveSkipBack()   { ex(VP8(),   adaptiveSkipBack); }
+    public void testVP9_adaptiveSkipBack()   { ex(VP9(),   adaptiveSkipBack); }
+    public void testMpeg4_adaptiveSkipBack() { ex(Mpeg4(), adaptiveSkipBack); }
+    public void testH263_adaptiveSkipBack()  { ex(H263(),  adaptiveSkipBack); }
+
+    public void testH264_adaptiveReconfigDrc()  { ex(H264(),  adaptiveReconfigDrc); }
+    public void testVP8_adaptiveReconfigDrc()   { ex(VP8(),   adaptiveReconfigDrc); }
+    public void testVP9_adaptiveReconfigDrc()   { ex(VP9(),   adaptiveReconfigDrc); }
+    public void testMpeg4_adaptiveReconfigDrc() { ex(Mpeg4(), adaptiveReconfigDrc); }
+    public void testH263_adaptiveReconfigDrc()  { ex(H263(),  adaptiveReconfigDrc); }
+
+    public void testH264_adaptiveSmallReconfigDrc()  { ex(H264(),  adaptiveSmallReconfigDrc); }
+    public void testVP8_adaptiveSmallReconfigDrc()   { ex(VP8(),   adaptiveSmallReconfigDrc); }
+    public void testVP9_adaptiveSmallReconfigDrc()   { ex(VP9(),   adaptiveSmallReconfigDrc); }
+    public void testMpeg4_adaptiveSmallReconfigDrc() { ex(Mpeg4(), adaptiveSmallReconfigDrc); }
+    public void testH263_adaptiveSmallReconfigDrc()  { ex(H263(),  adaptiveSmallReconfigDrc); }
+
+    public void testH264_adaptiveDrc() { ex(H264(), adaptiveDrc); }
+    public void testVP8_adaptiveDrc()  { ex(VP8(),  adaptiveDrc); }
+    public void testVP9_adaptiveDrc()  { ex(VP9(),  adaptiveDrc); }
+
+    public void testH264_adaptiveDrcEarlyEos() { ex(H264(), new AdaptiveDrcEarlyEosTest()); }
+    public void testVP8_adaptiveDrcEarlyEos()  { ex(VP8(),  new AdaptiveDrcEarlyEosTest()); }
+    public void testVP9_adaptiveDrcEarlyEos()  { ex(VP9(),  new AdaptiveDrcEarlyEosTest()); }
+
+    public void testH264_adaptiveSmallDrc()  { ex(H264(),  adaptiveSmallDrc); }
+    public void testVP8_adaptiveSmallDrc()   { ex(VP8(),   adaptiveSmallDrc); }
+    public void testVP9_adaptiveSmallDrc()   { ex(VP9(),   adaptiveSmallDrc); }
+
+    public void testH264_earlyEos()  { ex(H264(),  earlyEos); }
+    public void testVP8_earlyEos()   { ex(VP8(),   earlyEos); }
+    public void testVP9_earlyEos()   { ex(VP9(),   earlyEos); }
+    public void testMpeg4_earlyEos() { ex(Mpeg4(), earlyEos); }
+    public void testH263_earlyEos()  { ex(H263(),  earlyEos); }
+
+    public void testH264_eosFlushSeek()  { ex(H264(),  eosFlushSeek); }
+    public void testVP8_eosFlushSeek()   { ex(VP8(),   eosFlushSeek); }
+    public void testVP9_eosFlushSeek()   { ex(VP9(),   eosFlushSeek); }
+    public void testMpeg4_eosFlushSeek() { ex(Mpeg4(), eosFlushSeek); }
+    public void testH263_eosFlushSeek()  { ex(H263(),  eosFlushSeek); }
+
+    public void testH264_flushConfigureDrc()  { ex(H264(),  flushConfigureDrc); }
+    public void testVP8_flushConfigureDrc()   { ex(VP8(),   flushConfigureDrc); }
+    public void testVP9_flushConfigureDrc()   { ex(VP9(),   flushConfigureDrc); }
+    public void testMpeg4_flushConfigureDrc() { ex(Mpeg4(), flushConfigureDrc); }
+    public void testH263_flushConfigureDrc()  { ex(H263(),  flushConfigureDrc); }
+
+    /* only use unchecked exceptions to allow brief test methods */
+    private void ex(Iterable<Codec> codecList, Test test) {
+        ex(codecList, new Test[] { test } );
+    }
+
+    private void ex(Iterable<Codec> codecList, Test[] testList) {
+        TestList tests = new TestList();
+        for (Codec c : codecList) {
+            for (Test test : testList) {
+                if (test.isValid(c)) {
+                    test.addTests(tests, c);
+                }
+            }
+        }
+        try {
+            tests.run();
+        } catch (Throwable t) {
+            throw new RuntimeException(t);
+        }
+    }
+
+    /* need an inner class to have access to the activity */
+    abstract class ActivityTest extends Test {
+        TestSurface mNullSurface = new ActivitySurface(null);
+        protected TestSurface getSurface() {
+            if (mUseSurface) {
+                return new ActivitySurface(getActivity().getSurfaceHolder().getSurface());
+            } else if (mUseSurfaceTexture) {
+                return new DecoderSurface(1280, 720, mCRC);
+            }
+            return mNullSurface;
+        }
+    }
+
+    static final int NUM_FRAMES = 50;
+
+    /**
+     * Queue some frames with an EOS on the last one.  Test that we have decoded as many
+     * frames as we queued.  This tests the EOS handling of the codec to see if all queued
+     * (and out-of-order) frames are actually decoded and returned.
+     */
+    class EarlyEosTest extends ActivityTest {
+        public boolean isValid(Codec c) {
+            return getFormat(c) != null;
+        }
+        public void addTests(TestList tests, final Codec c) {
+            for (int i = NUM_FRAMES / 2; i > 0; i--) {
+                final int queuedFrames = i;
+                tests.add(
+                    new Step("testing early EOS at " + queuedFrames, this, c) {
+                        public void run() {
+                            Decoder decoder = new Decoder(c.name);
+                            try {
+                                decoder.configureAndStart(stepFormat(), stepSurface());
+                                int decodedFrames = -decoder.queueInputBufferRange(
+                                        stepMedia(),
+                                        0 /* startFrame */,
+                                        queuedFrames,
+                                        true /* sendEos */,
+                                        true /* waitForEos */);
+                                if (decodedFrames <= 0) {
+                                    Log.w(TAG, "Did not receive EOS -- negating frame count");
+                                }
+                                decoder.stop();
+                                if (decodedFrames != queuedFrames) {
+                                    warn("decoded " + decodedFrames + " frames out of " +
+                                            queuedFrames + " queued");
+                                }
+                            } finally {
+                                warn(decoder.getWarnings());
+                                decoder.releaseQuietly();
+                            }
+                        }
+                    });
+                if (sanity) {
+                    i >>= 1;
+                }
+            }
+        }
+    };
+
+    /**
+     * Similar to EarlyEosTest, but we keep the component alive and running in between the steps.
+     * This is how seeking should be done if all frames must be outputted.  This also tests that
+     * PTS can be repeated after flush.
+     */
+    class EosFlushSeekTest extends ActivityTest {
+        Decoder mDecoder; // test state
+        public boolean isValid(Codec c) {
+            return getFormat(c) != null;
+        }
+        public void addTests(TestList tests, final Codec c) {
+            tests.add(
+                new Step("testing EOS & flush before seek - init", this, c) {
+                    public void run() {
+                        mDecoder = new Decoder(c.name);
+                        mDecoder.configureAndStart(stepFormat(), stepSurface());
+                    }});
+
+            for (int i = NUM_FRAMES; i > 0; i--) {
+                final int queuedFrames = i;
+                tests.add(
+                    new Step("testing EOS & flush before seeking after " + queuedFrames +
+                            " frames", this, c) {
+                        public void run() {
+                            int decodedFrames = -mDecoder.queueInputBufferRange(
+                                    stepMedia(),
+                                    0 /* startFrame */,
+                                    queuedFrames,
+                                    true /* sendEos */,
+                                    true /* waitForEos */);
+                            if (decodedFrames != queuedFrames) {
+                                warn("decoded " + decodedFrames + " frames out of " +
+                                        queuedFrames + " queued");
+                            }
+                            warn(mDecoder.getWarnings());
+                            mDecoder.clearWarnings();
+                            mDecoder.flush();
+                        }
+                    });
+                if (sanity) {
+                    i >>= 1;
+                }
+            }
+
+            tests.add(
+                new Step("testing EOS & flush before seek - finally", this, c) {
+                    public void run() {
+                        try {
+                            mDecoder.stop();
+                        } finally {
+                            mDecoder.release();
+                        }
+                    }});
+        }
+    };
+
+    /**
+     * Similar to EosFlushSeekTest, but we change the media size between the steps.
+     * This is how dynamic resolution switching can be done on codecs that do not support
+     * adaptive playback.
+     */
+    class ReconfigDrcTest extends ActivityTest {
+        Decoder mDecoder;  // test state
+        public boolean isValid(Codec c) {
+            return getFormat(c) != null && c.mediaList.length > 1;
+        }
+        public void addTests(TestList tests, final Codec c) {
+            tests.add(
+                new Step("testing DRC with reconfigure - init", this, c) {
+                    public void run() {
+                        mDecoder = new Decoder(c.name);
+                    }});
+
+            for (int i = NUM_FRAMES, ix = 0; i > 0; i--, ix++) {
+                final int queuedFrames = i;
+                final int mediaIx = ix % c.mediaList.length;
+                tests.add(
+                    new Step("testing DRC with reconfigure after " + queuedFrames + " frames",
+                            this, c, mediaIx) {
+                        public void run() {
+                            try {
+                                mDecoder.configureAndStart(stepFormat(), stepSurface());
+                                int decodedFrames = -mDecoder.queueInputBufferRange(
+                                        stepMedia(),
+                                        0 /* startFrame */,
+                                        queuedFrames,
+                                        true /* sendEos */,
+                                        true /* waitForEos */);
+                                if (decodedFrames != queuedFrames) {
+                                    warn("decoded " + decodedFrames + " frames out of " +
+                                            queuedFrames + " queued");
+                                }
+                                warn(mDecoder.getWarnings());
+                                mDecoder.clearWarnings();
+                                mDecoder.flush();
+                            } finally {
+                                mDecoder.stop();
+                            }
+                        }
+                    });
+                if (sanity) {
+                    i >>= 1;
+                }
+            }
+            tests.add(
+                new Step("testing DRC with reconfigure - finally", this, c) {
+                    public void run() {
+                        mDecoder.release();
+                    }});
+        }
+    };
+
+    /* ADAPTIVE-ONLY TESTS - only run on codecs that support adaptive playback */
+
+    /**
+     * Test dynamic resolution change support.  Queue various sized media segments
+     * with different resolutions, verify that all queued frames were decoded.  Here
+     * PTS will grow between segments.
+     */
+    class AdaptiveDrcTest extends ActivityTest {
+        Decoder mDecoder;
+        int mAdjustTimeUs;
+        int mDecodedFrames;
+        int mQueuedFrames;
+
+        public AdaptiveDrcTest() {
+            super();
+            adaptive();
+        }
+        public boolean isValid(Codec c) {
+            checkAdaptiveFormat();
+            return c.adaptive && c.mediaList.length > 1;
+        }
+        public void addTests(TestList tests, final Codec c) {
+            tests.add(
+                new Step("testing DRC with no reconfigure - init", this, c) {
+                    public void run() throws Throwable {
+                        // FIXME wait 2 seconds to allow system to free up previous codecs
+                        try {
+                            Thread.sleep(2000);
+                        } catch (InterruptedException e) {}
+                        mDecoder = new Decoder(c.name);
+                        mDecoder.configureAndStart(stepFormat(), stepSurface());
+                        mAdjustTimeUs = 0;
+                        mDecodedFrames = 0;
+                        mQueuedFrames = 0;
+                    }});
+
+            for (int i = NUM_FRAMES, ix = 0; i >= MIN_FRAMES_BEFORE_DRC; i--, ix++) {
+                final int mediaIx = ix % c.mediaList.length;
+                final int segmentSize = i;
+                tests.add(
+                    new Step("testing DRC with no reconfigure after " + i + " frames",
+                            this, c, mediaIx) {
+                        public void run() throws Throwable {
+                            mQueuedFrames += segmentSize;
+                            boolean lastSequence = segmentSize == MIN_FRAMES_BEFORE_DRC;
+                            if (sanity) {
+                                lastSequence = (segmentSize >> 1) <= MIN_FRAMES_BEFORE_DRC;
+                            }
+                            int frames = mDecoder.queueInputBufferRange(
+                                    stepMedia(),
+                                    0 /* startFrame */,
+                                    segmentSize,
+                                    lastSequence /* sendEos */,
+                                    lastSequence /* expectEos */,
+                                    mAdjustTimeUs);
+                            if (lastSequence && frames >= 0) {
+                                warn("did not receive EOS, received " + frames + " frames");
+                            } else if (!lastSequence && frames < 0) {
+                                warn("received EOS, received " + (-frames) + " frames");
+                            }
+                            warn(mDecoder.getWarnings());
+                            mDecoder.clearWarnings();
+
+                            mDecodedFrames += Math.abs(frames);
+                            mAdjustTimeUs += 1 + stepMedia().getTimestampRangeValue(
+                                    0, segmentSize, Media.RANGE_END);
+                        }});
+                if (sanity) {
+                    i >>= 1;
+                }
+            }
+            tests.add(
+                new Step("testing DRC with no reconfigure - init", this, c) {
+                    public void run() throws Throwable {
+                        if (mDecodedFrames != mQueuedFrames) {
+                            warn("decoded " + mDecodedFrames + " frames out of " +
+                                    mQueuedFrames + " queued");
+                        }
+                        try {
+                            mDecoder.stop();
+                        } finally {
+                            mDecoder.release();
+                        }
+                    }
+                });
+        }
+    };
+
+    /**
+     * Queue EOS shortly after a dynamic resolution change.  Test that all frames were
+     * decoded.
+     */
+    class AdaptiveDrcEarlyEosTest extends ActivityTest {
+        public AdaptiveDrcEarlyEosTest() {
+            super();
+            adaptive();
+        }
+        public boolean isValid(Codec c) {
+            checkAdaptiveFormat();
+            return c.adaptive && c.mediaList.length > 1;
+        }
+        public Step testStep(final Codec c, final int framesBeforeDrc,
+                final int framesBeforeEos) {
+            return new Step("testing DRC with no reconfigure after " + framesBeforeDrc +
+                    " frames and subsequent EOS after " + framesBeforeEos + " frames",
+                    this, c) {
+                public void run() throws Throwable {
+                    Decoder decoder = new Decoder(c.name);
+                    int queuedFrames = framesBeforeDrc + framesBeforeEos;
+                    int framesA = 0;
+                    int framesB = 0;
+                    try {
+                        decoder.configureAndStart(stepFormat(), stepSurface());
+                        Media media = c.mediaList[0];
+
+                        framesA = decoder.queueInputBufferRange(
+                                media,
+                                0 /* startFrame */,
+                                framesBeforeDrc,
+                                false /* sendEos */,
+                                false /* expectEos */);
+                        if (framesA < 0) {
+                            warn("received unexpected EOS, received " + (-framesA) + " frames");
+                        }
+                        long adjustTimeUs = 1 + media.getTimestampRangeValue(
+                                0, framesBeforeDrc, Media.RANGE_END);
+
+                        media = c.mediaList[1];
+                        framesB = decoder.queueInputBufferRange(
+                                media,
+                                0 /* startFrame */,
+                                framesBeforeEos,
+                                true /* sendEos */,
+                                true /* expectEos */,
+                                adjustTimeUs);
+                        if (framesB >= 0) {
+                            warn("did not receive EOS, received " + (-framesB) + " frames");
+                        }
+                        decoder.stop();
+                        warn(decoder.getWarnings());
+                    } finally {
+                        int decodedFrames = Math.abs(framesA) + Math.abs(framesB);
+                        if (decodedFrames != queuedFrames) {
+                            warn("decoded " + decodedFrames + " frames out of " + queuedFrames +
+                                    " queued");
+                        }
+                        decoder.release();
+                    }
+                }
+            };
+        }
+        public void addTests(TestList tests, Codec c) {
+            for (int drcFrame = 6; drcFrame >= MIN_FRAMES_BEFORE_DRC; drcFrame--) {
+                for (int eosFrame = 6; eosFrame >= 1; eosFrame--) {
+                    tests.add(testStep(c, drcFrame, eosFrame));
+                }
+            }
+        }
+    };
+
+    /**
+     * Similar to AdaptiveDrcTest, but tests that PTS can change at adaptive boundaries both
+     * forward and backward without the need to flush.
+     */
+    class AdaptiveSkipTest extends ActivityTest {
+        boolean forward;
+        public AdaptiveSkipTest(boolean fwd) {
+            forward = fwd;
+            adaptive();
+        }
+        public boolean isValid(Codec c) {
+            checkAdaptiveFormat();
+            return c.adaptive;
+        }
+        Decoder mDecoder;
+        int mAdjustTimeUs = 0;
+        int mDecodedFrames = 0;
+        int mQueuedFrames = 0;
+        public void addTests(TestList tests, final Codec c) {
+            tests.add(
+                new Step("testing flushless skipping - init", this, c) {
+                    public void run() throws Throwable {
+                        mDecoder = new Decoder(c.name);
+                        mDecoder.configureAndStart(stepFormat(), stepSurface());
+                        mAdjustTimeUs = 0;
+                        mDecodedFrames = 0;
+                        mQueuedFrames = 0;
+                    }});
+
+            for (int i = 2, ix = 0; i <= NUM_FRAMES; i++, ix++) {
+                final int mediaIx = ix % c.mediaList.length;
+                final int segmentSize = i;
+                final boolean lastSequence;
+                if (sanity) {
+                    lastSequence = (segmentSize << 1) + 1 > NUM_FRAMES;
+                } else {
+                    lastSequence = segmentSize >= NUM_FRAMES;
+                }
+                tests.add(
+                    new Step("testing flushless skipping " + (forward ? "forward" : "backward") +
+                            " after " + i + " frames", this, c) {
+                        public void run() throws Throwable {
+                            int frames = mDecoder.queueInputBufferRange(
+                                stepMedia(),
+                                0 /* startFrame */,
+                                segmentSize,
+                                lastSequence /* sendEos */,
+                                lastSequence /* expectEos */,
+                                mAdjustTimeUs);
+                            if (lastSequence && frames >= 0) {
+                                warn("did not receive EOS, received " + frames + " frames");
+                            } else if (!lastSequence && frames < 0) {
+                                warn("received unexpected EOS, received " + (-frames) + " frames");
+                            }
+                            warn(mDecoder.getWarnings());
+                            mDecoder.clearWarnings();
+
+                            mQueuedFrames += segmentSize;
+                            mDecodedFrames += Math.abs(frames);
+                            if (forward) {
+                                mAdjustTimeUs += 10000000 + stepMedia().getTimestampRangeValue(
+                                        0, segmentSize, Media.RANGE_DURATION);
+                            }
+                        }});
+                if (sanity) {
+                    i <<= 1;
+                }
+            }
+
+            tests.add(
+                new Step("testing flushless skipping - finally", this, c) {
+                    public void run() throws Throwable {
+                        if (mDecodedFrames != mQueuedFrames) {
+                            warn("decoded " + mDecodedFrames + " frames out of " + mQueuedFrames +
+                                    " queued");
+                        }
+                        try {
+                            mDecoder.stop();
+                        } finally {
+                            mDecoder.release();
+                        }
+                    }});
+        }
+    };
+
+    // not yet used
+    static long checksum(ByteBuffer buf, int size, CRC32 crc) {
+        assertTrue(size >= 0);
+        assertTrue(size <= buf.capacity());
+        crc.reset();
+        if (buf.hasArray()) {
+            crc.update(buf.array(), buf.arrayOffset(), size);
+        } else {
+           int pos = buf.position();
+           buf.rewind();
+           final int rdsize = Math.min(4096, size);
+           byte bb[] = new byte[rdsize];
+           int chk;
+           for (int i = 0; i < size; i += chk) {
+                chk = Math.min(rdsize, size - i);
+                buf.get(bb, 0, chk);
+                crc.update(bb, 0, chk);
+            }
+            buf.position(pos);
+        }
+        return crc.getValue();
+    }
+
+    CRC32 mCRC;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCRC = new CRC32();
+    }
+
+    /* ====================================================================== */
+    /*                              UTILITY FUNCTIONS                         */
+    /* ====================================================================== */
+    public static String collectionString(Collection<?> c) {
+        StringBuilder res = new StringBuilder("[");
+        boolean subsequent = false;
+        for (Object o: c) {
+            if (subsequent) {
+                res.append(", ");
+            }
+            res.append(o);
+            subsequent = true;
+        }
+        return res.append("]").toString();
+    }
+
+    static String byteBufferToString(ByteBuffer buf, int start, int len) {
+        int oldPosition = buf.position();
+        buf.position(start);
+        int strlen = 2; // {}
+        boolean ellipsis = len < buf.limit();
+        if (ellipsis) {
+            strlen += 3; // ...
+        } else {
+            len = buf.limit();
+        }
+        strlen += 3 * len - (len > 0 ? 1 : 0); // XX,XX
+        char[] res = new char[strlen];
+        res[0] = '{';
+        res[strlen - 1] = '}';
+        if (ellipsis) {
+            res[strlen - 2] = res[strlen - 3] = res[strlen - 4] = '.';
+        }
+        for (int i = 1; i < len; i++) {
+            res[i * 3] = ',';
+        }
+        for (int i = 0; i < len; i++) {
+            byte b = buf.get();
+            int d = (b >> 4) & 15;
+            res[i * 3 + 1] = (char)(d + (d > 9 ? 'a' - 10 : '0'));
+            d = (b & 15);
+            res[i * 3 + 2] = (char)(d + (d > 9 ? 'a' - 10 : '0'));
+        }
+        buf.position(oldPosition);
+        return new String(res);
+    }
+
+    static <E> Iterable<E> chain(Iterable<E> ... iterables) {
+        /* simple chainer using ArrayList */
+        ArrayList<E> items = new ArrayList<E>();
+        for (Iterable<E> it: iterables) {
+            for (E el: it) {
+                items.add(el);
+            }
+        }
+        return items;
+    }
+
+    class Decoder {
+        private final static String TAG = "AdaptiveDecoder";
+        final long kTimeOutUs = 5000;
+        MediaCodec mCodec;
+        ByteBuffer[] mInputBuffers;
+        ByteBuffer[] mOutputBuffers;
+        TestSurface mSurface;
+        boolean mDoChecksum;
+        boolean mQueuedEos;
+        ArrayList<Long> mTimeStamps;
+        ArrayList<String> mWarnings;
+
+        public Decoder(String codecName) {
+            MediaCodec codec = null;
+            try {
+                codec = MediaCodec.createByCodecName(codecName);
+            } catch (Exception e) {
+                throw new RuntimeException("couldn't create codec " + codecName, e);
+            }
+            Log.i(TAG, "using codec: " + codec.getName());
+            mCodec = codec;
+            mDoChecksum = false;
+            mQueuedEos = false;
+            mTimeStamps = new ArrayList<Long>();
+            mWarnings = new ArrayList<String>();
+        }
+
+        public String getName() {
+            return mCodec.getName();
+        }
+
+        public Iterable<String> getWarnings() {
+            return mWarnings;
+        }
+
+        private void warn(String warning) {
+            mWarnings.add(warning);
+            Log.w(TAG, warning);
+        }
+
+        public void clearWarnings() {
+            mWarnings.clear();
+        }
+
+        public void configureAndStart(MediaFormat format, TestSurface surface) {
+            mSurface = surface;
+            Log.i(TAG, "configure(" + format + ", " + mSurface.getSurface() + ")");
+            mCodec.configure(format, mSurface.getSurface(), null /* crypto */, 0 /* flags */);
+            Log.i(TAG, "start");
+            mCodec.start();
+            mInputBuffers = mCodec.getInputBuffers();
+            mOutputBuffers = mCodec.getOutputBuffers();
+            Log.i(TAG, "configured " + mInputBuffers.length + " input[" +
+                  mInputBuffers[0].capacity() + "] and " +
+                  mOutputBuffers.length + "output[" +
+                  (mOutputBuffers[0] == null ? null : mOutputBuffers[0].capacity()) + "]");
+            mQueuedEos = false;
+        }
+
+        public void stop() {
+            Log.i(TAG, "stop");
+            mCodec.stop();
+        }
+
+        public void flush() {
+            Log.i(TAG, "flush");
+            mCodec.flush();
+            mQueuedEos = false;
+            mTimeStamps.clear();
+        }
+
+        public String dequeueAndReleaseOutputBuffer(MediaCodec.BufferInfo info) {
+            int ix = mCodec.dequeueOutputBuffer(info, kTimeOutUs);
+            if (ix == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                mOutputBuffers = mCodec.getOutputBuffers();
+                Log.d(TAG, "output buffers have changed.");
+                return null;
+            } else if (ix == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                MediaFormat format = mCodec.getOutputFormat();
+                Log.d(TAG, "output format has changed to " + format);
+                int colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
+                mDoChecksum = isRecognizedFormat(colorFormat);
+                return null;
+            } else if (ix < 0) {
+                Log.v(TAG, "no output");
+                return null;
+            }
+            /* create checksum */
+            long sum = 0;
+
+
+            Log.v(TAG, "dequeue #" + ix + " => { [" + info.size + "] flags=" + info.flags +
+                    " @" + info.presentationTimeUs + "}");
+
+            // we get a nonzero size for valid decoded frames
+            boolean doRender = (info.size != 0);
+            if (mSurface.getSurface() == null) {
+                if (mDoChecksum) {
+                    sum = checksum(mOutputBuffers[ix], info.size, mCRC);
+                }
+                mCodec.releaseOutputBuffer(ix, doRender);
+            } else if (doRender) {
+                // If using SurfaceTexture, as soon as we call releaseOutputBuffer, the
+                // buffer will be forwarded to SurfaceTexture to convert to a texture.
+                // The API doesn't guarantee that the texture will be available before
+                // the call returns, so we need to wait for the onFrameAvailable callback
+                // to fire.  If we don't wait, we risk dropping frames.
+                mSurface.prepare();
+                mCodec.releaseOutputBuffer(ix, doRender);
+                mSurface.waitForDraw();
+                if (mDoChecksum) {
+                    sum = mSurface.checksum();
+                }
+            } else {
+                mCodec.releaseOutputBuffer(ix, doRender);
+            }
+
+            if (doRender) {
+                if (!mTimeStamps.remove(info.presentationTimeUs)) {
+                    warn("invalid timestamp " + info.presentationTimeUs + ", queued " +
+                            collectionString(mTimeStamps));
+                }
+            }
+
+            return String.format(Locale.US, "{pts=%d, flags=%x, data=0x%x}",
+                                 info.presentationTimeUs, info.flags, sum);
+        }
+
+        /* returns true iff queued a frame */
+        public boolean queueInputBuffer(Media media, int frameIx, boolean EOS) {
+            return queueInputBuffer(media, frameIx, EOS, 0);
+        }
+
+        public boolean queueInputBuffer(Media media, int frameIx, boolean EOS, long adjustTimeUs) {
+            if (mQueuedEos) {
+                return false;
+            }
+
+            int ix = mCodec.dequeueInputBuffer(kTimeOutUs);
+
+            if (ix < 0) {
+                return false;
+            }
+
+            ByteBuffer buf = mInputBuffers[ix];
+            Media.Frame frame = media.getFrame(frameIx);
+            buf.clear();
+
+            long presentationTimeUs = adjustTimeUs;
+            int flags = 0;
+            if (frame != null) {
+                buf.put((ByteBuffer)frame.buf.clear());
+                presentationTimeUs += frame.presentationTimeUs;
+                flags = frame.flags;
+            }
+
+            if (EOS) {
+                flags |= MediaCodec.BUFFER_FLAG_END_OF_STREAM;
+                mQueuedEos = true;
+            }
+
+            mTimeStamps.add(presentationTimeUs);
+            Log.v(TAG, "queue { [" + buf.position() + "]=" + byteBufferToString(buf, 0, 16) +
+                    " flags=" + flags + " @" + presentationTimeUs + "} => #" + ix);
+            mCodec.queueInputBuffer(
+                    ix, 0 /* offset */, buf.position(), presentationTimeUs, flags);
+            return true;
+        }
+
+        /* returns number of frames received multiplied by -1 if received EOS, 1 otherwise */
+        public int queueInputBufferRange(
+                Media media, int frameStartIx, int frameEndIx, boolean sendEosAtEnd,
+                boolean waitForEos) {
+            return queueInputBufferRange(media,frameStartIx,frameEndIx,sendEosAtEnd,waitForEos,0);
+        }
+
+        public int queueInputBufferRange(
+                Media media, int frameStartIx, int frameEndIx, boolean sendEosAtEnd,
+                boolean waitForEos, long adjustTimeUs) {
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+            int frameIx = frameStartIx;
+            int numFramesDecoded = 0;
+            boolean sawOutputEos = false;
+            int deadDecoderCounter = 0;
+            ArrayList<String> frames = new ArrayList<String>();
+            while ((waitForEos && !sawOutputEos) || frameIx < frameEndIx) {
+                if (frameIx < frameEndIx) {
+                    if (queueInputBuffer(
+                            media,
+                            frameIx,
+                            sendEosAtEnd && (frameIx + 1 == frameEndIx),
+                            adjustTimeUs)) {
+                        frameIx++;
+                    }
+                }
+
+                String buf = dequeueAndReleaseOutputBuffer(info);
+                if (buf != null) {
+                    // Some decoders output a 0-sized buffer at the end. Disregard those.
+                    if (info.size > 0) {
+                        deadDecoderCounter = 0;
+                        numFramesDecoded++;
+                    }
+
+                    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        Log.d(TAG, "saw output EOS.");
+                        sawOutputEos = true;
+                    }
+                }
+                if (++deadDecoderCounter >= 100) {
+                    warn("have not received an output frame for a while");
+                    break;
+                }
+            }
+
+            if (numFramesDecoded < frameEndIx - frameStartIx - 16) {
+                fail("Queued " + (frameEndIx - frameStartIx) + " frames but only received " +
+                        numFramesDecoded);
+            }
+            return (sawOutputEos ? -1 : 1) * numFramesDecoded;
+        }
+
+        void release() {
+            Log.i(TAG, "release");
+            mCodec.release();
+            mSurface.release();
+            mInputBuffers = null;
+            mOutputBuffers = null;
+            mCodec = null;
+            mSurface = null;
+        }
+
+        // don't fail on exceptions in release()
+        void releaseQuietly() {
+            try {
+                Log.i(TAG, "release");
+                mCodec.release();
+            } catch (Throwable e) {
+                Log.e(TAG, "Exception while releasing codec", e);
+            }
+            mSurface.release();
+            mInputBuffers = null;
+            mOutputBuffers = null;
+            mCodec = null;
+            mSurface = null;
+        }
+    };
+
+    /* from EncodeDecodeTest */
+    private static boolean isRecognizedFormat(int colorFormat) {
+        switch (colorFormat) {
+            // these are the formats we know how to handle for this test
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private int countFrames(
+            String codecName, MediaCodecInfo codecInfo, Media media, int eosframe, TestSurface s)
+            throws Exception {
+        Decoder codec = new Decoder(codecName);
+        codec.configureAndStart(media.getFormat(), s /* surface */);
+
+        int numframes = codec.queueInputBufferRange(
+                media, 0, eosframe, true /* sendEos */, true /* waitForEos */);
+        if (numframes >= 0) {
+            Log.w(TAG, "Did not receive EOS");
+        } else {
+            numframes *= -1;
+        }
+
+        codec.stop();
+        codec.release();
+        return numframes;
+    }
+}
+
+/* ====================================================================== */
+/*                             Video Media Asset                          */
+/* ====================================================================== */
+class Media {
+    private final static String TAG = "AdaptiveMedia";
+    private MediaFormat mFormat;
+    private MediaFormat mAdaptiveFormat;
+    static class Frame {
+        long presentationTimeUs;
+        int flags;
+        ByteBuffer buf;
+        public Frame(long _pts, int _flags, ByteBuffer _buf) {
+            presentationTimeUs = _pts;
+            flags = _flags;
+            buf = _buf;
+        }
+    };
+    private Frame[] mFrames;
+
+    public Frame getFrame(int ix) {
+        /* this works even on short sample as frame is allocated as null */
+        if (ix >= 0 && ix < mFrames.length) {
+            return mFrames[ix];
+        }
+        return null;
+    }
+    private Media(MediaFormat format, MediaFormat adaptiveFormat, int numFrames) {
+        /* need separate copies of format as once we add adaptive flags to
+           MediaFormat, we cannot remove them */
+        mFormat = format;
+        mAdaptiveFormat = adaptiveFormat;
+        mFrames = new Frame[numFrames];
+    }
+
+    public MediaFormat getFormat() {
+        return mFormat;
+    }
+
+    public MediaFormat getAdaptiveFormat(int width, int height) {
+        mAdaptiveFormat.setInteger(MediaFormat.KEY_MAX_WIDTH, width);
+        mAdaptiveFormat.setInteger(MediaFormat.KEY_MAX_HEIGHT, height);
+        return mAdaptiveFormat;
+    }
+
+    public String getMime() {
+        return mFormat.getString(MediaFormat.KEY_MIME);
+    }
+
+    public int getWidth() {
+        return mFormat.getInteger(MediaFormat.KEY_WIDTH);
+    }
+
+    public int getHeight() {
+        return mFormat.getInteger(MediaFormat.KEY_HEIGHT);
+    }
+
+    public final static int RANGE_START = 0;
+    public final static int RANGE_END = 1;
+    public final static int RANGE_DURATION = 2;
+
+    public long getTimestampRangeValue(int frameStartIx, int frameEndIx, int kind) {
+        long min = Long.MAX_VALUE, max = Long.MIN_VALUE;
+        for (int frameIx = frameStartIx; frameIx < frameEndIx; frameIx++) {
+            Frame frame = getFrame(frameIx);
+            if (frame != null) {
+                if (min > frame.presentationTimeUs) {
+                    min = frame.presentationTimeUs;
+                }
+                if (max < frame.presentationTimeUs) {
+                    max = frame.presentationTimeUs;
+                }
+            }
+        }
+        if (kind == RANGE_START) {
+            return min;
+        } else if (kind == RANGE_END) {
+            return max;
+        } else if (kind == RANGE_DURATION) {
+            return max - min;
+        } else {
+            throw new IllegalArgumentException("kind is not valid: " + kind);
+        }
+    }
+
+    public static Media read(Context context, int video, int numFrames)
+            throws java.io.IOException {
+        MediaExtractor extractor = new MediaExtractor();
+        AssetFileDescriptor testFd = context.getResources().openRawResourceFd(video);
+        extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
+                testFd.getLength());
+
+        Media media = new Media(
+                extractor.getTrackFormat(0), extractor.getTrackFormat(0), numFrames);
+        extractor.selectTrack(0);
+
+        Log.i(TAG, "format=" + media.getFormat());
+        ArrayList<ByteBuffer> csds = new ArrayList<ByteBuffer>();
+        for (String tag: new String[] { "csd-0", "csd-1" }) {
+            if (media.getFormat().containsKey(tag)) {
+                ByteBuffer csd = media.getFormat().getByteBuffer(tag);
+                Log.i(TAG, tag + "=" + AdaptivePlaybackTest.byteBufferToString(csd, 0, 16));
+                csds.add(csd);
+            }
+        }
+
+        ByteBuffer readBuf = ByteBuffer.allocate(200000);
+        for (int ix = 0; ix < numFrames; ix++) {
+            int sampleSize = extractor.readSampleData(readBuf, 0 /* offset */);
+
+            if (sampleSize < 0) {
+                throw new IllegalArgumentException("media is too short at " + ix + " frames");
+            } else {
+                readBuf.position(0).limit(sampleSize);
+                for (ByteBuffer csd: csds) {
+                    sampleSize += csd.capacity();
+                }
+                ByteBuffer buf = ByteBuffer.allocate(sampleSize);
+                for (ByteBuffer csd: csds) {
+                    csd.clear();
+                    buf.put(csd);
+                    csd.clear();
+                    Log.i(TAG, "csd[" + csd.capacity() + "]");
+                }
+                Log.i(TAG, "frame-" + ix + "[" + sampleSize + "]");
+                csds.clear();
+                buf.put(readBuf);
+                media.mFrames[ix] = new Frame(
+                    extractor.getSampleTime(),
+                    extractor.getSampleFlags(),
+                    buf);
+                extractor.advance();
+            }
+        }
+        extractor.release();
+        testFd.close();
+        return media;
+    }
+}
+
+/* ====================================================================== */
+/*                      Codec, CodecList and CodecFactory                 */
+/* ====================================================================== */
+class Codec {
+    private final static String TAG = "AdaptiveCodec";
+
+    public String name;
+    public CodecCapabilities capabilities;
+    public Media[] mediaList;
+    public boolean adaptive;
+    public Codec(String n, CodecCapabilities c, Media[] m) {
+        name = n;
+        capabilities = c;
+        mediaList = m;
+
+        if (capabilities == null) {
+            adaptive = false;
+        } else {
+            Log.w(TAG, "checking capabilities of " + name + " for " + mediaList[0].getMime());
+            adaptive = capabilities.isFeatureSupported(CodecCapabilities.FEATURE_AdaptivePlayback);
+        }
+    }
+}
+
+class CodecList extends ArrayList<Codec> { };
+
+/* all codecs of mime, plus named codec if exists */
+class CodecFamily extends CodecList {
+    private final static String TAG = "AdaptiveCodecFamily";
+    private static final int NUM_FRAMES = AdaptivePlaybackTest.NUM_FRAMES;
+
+    public CodecFamily(Context context, String mime, String explicitCodecName, int ... resources) {
+        try {
+            /* read all media */
+            Media[] mediaList = new Media[resources.length];
+            for (int i = 0; i < resources.length; i++) {
+                Log.v(TAG, "reading media " + resources[i]);
+                Media media = Media.read(context, resources[i], NUM_FRAMES);
+                assert media.getMime().equals(mime):
+                        "test stream " + resources[i] + " has " + media.getMime() +
+                        " mime type instead of " + mime;
+
+                /* assuming the first timestamp is the smallest */
+                long firstPTS = media.getFrame(0).presentationTimeUs;
+                long smallestPTS = media.getTimestampRangeValue(0, NUM_FRAMES, Media.RANGE_START);
+
+                assert firstPTS == smallestPTS:
+                        "first frame timestamp (" + firstPTS + ") is not smallest (" +
+                        smallestPTS + ")";
+
+                mediaList[i] = media;
+            }
+
+            /* enumerate codecs */
+            int codecCount = MediaCodecList.getCodecCount();
+            for (int codecIx = 0; codecIx < codecCount; codecIx++) {
+                MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(codecIx);
+                if (codecInfo.isEncoder()) {
+                    continue;
+                }
+                for (String type : codecInfo.getSupportedTypes()) {
+                    if (type.equals(mime)) {
+                        /* mark the explicitly named codec as included */
+                        if (codecInfo.getName().equals(explicitCodecName)) {
+                            explicitCodecName = null;
+                        }
+                        add(new Codec(
+                                codecInfo.getName(),
+                                codecInfo.getCapabilitiesForType(mime),
+                                mediaList));
+                        break;
+                    }
+                }
+            }
+
+            /* test if the explicitly named codec is present on the system */
+            if (explicitCodecName != null) {
+                MediaCodec codec = MediaCodec.createByCodecName(explicitCodecName);
+                if (codec != null) {
+                    codec.release();
+                    add(new Codec(explicitCodecName, null, mediaList));
+                }
+            }
+        } catch (Throwable t) {
+            Log.wtf("Constructor failed", t);
+            throw new RuntimeException("constructor failed", t);
+        }
+    }
+}
+
+/* named codec if exists */
+class CodecByName extends CodecList {
+    public CodecByName(Context context, String mime, String codecName, int ... resources) {
+        for (Codec c: new CodecFamily(context, mime, codecName, resources)) {
+            if (c.name.equals(codecName)) {
+                add(c);
+            }
+        }
+    }
+}
+
+/* all codecs of mime, except named codec if exists */
+class CodecFamilyExcept extends CodecList {
+    public CodecFamilyExcept(
+            Context context, String mime, String exceptCodecName, int ... resources) {
+        for (Codec c: new CodecFamily(context, mime, null, resources)) {
+            if (!c.name.equals(exceptCodecName)) {
+                add(c);
+            }
+        }
+    }
+}
+
+class CodecFactory {
+    public CodecList createCodecList(
+            Context context, String mime, String googleCodecName, int ...resources) {
+        return new CodecFamily(context, mime, googleCodecName, resources);
+    }
+}
+
+class SWCodecFactory extends CodecFactory {
+    public CodecList createCodecList(
+            Context context, String mime, String googleCodecName, int ...resources) {
+        return new CodecByName(context, mime, googleCodecName, resources);
+    }
+}
+
+class HWCodecFactory extends CodecFactory {
+    public CodecList createCodecList(
+            Context context, String mime, String googleCodecName, int ...resources) {
+        return new CodecFamilyExcept(context, mime, googleCodecName, resources);
+    }
+}
+
+/* ====================================================================== */
+/*                  Test Steps, Test (Case)s, and Test List               */
+/* ====================================================================== */
+class StepRunner implements Runnable {
+    public StepRunner(Step s) {
+        mStep = s;
+        mThrowed = null;
+    }
+    public void run() {
+        try {
+            mStep.run();
+        } catch (Throwable e) {
+            mThrowed = e;
+        }
+    }
+    public void throwThrowed() throws Throwable {
+        if (mThrowed != null) {
+            throw mThrowed;
+        }
+    }
+    private Throwable mThrowed;
+    private Step mStep;
+}
+
+class TestList extends ArrayList<Step> {
+    private final static String TAG = "AdaptiveTestList";
+    public void run() throws Throwable {
+        Throwable res = null;
+        for (Step step: this) {
+            try {
+                Log.i(TAG, step.getDescription());
+                if (step.stepSurface().needsToRunInSeparateThread()) {
+                    StepRunner runner = new StepRunner(step);
+                    Thread th = new Thread(runner, "stepWrapper");
+                    th.start();
+                    th.join();
+                    runner.throwThrowed();
+                } else {
+                    step.run();
+                }
+            } catch (Throwable e) {
+                Log.e(TAG, "while " + step.getDescription(), e);
+                res = e;
+                mFailedSteps++;
+            } finally {
+                mWarnings += step.getWarnings();
+            }
+        }
+        if (res != null) {
+            throw new RuntimeException(
+                mFailedSteps + " failed steps, " + mWarnings + " warnings",
+                res);
+        }
+    }
+    public int getWarnings() {
+        return mWarnings;
+    }
+    public int getFailures() {
+        return mFailedSteps;
+    }
+    private int mFailedSteps;
+    private int mWarnings;
+}
+
+abstract class Test {
+    public static final int FORMAT_ADAPTIVE_LARGEST = 1;
+    public static final int FORMAT_ADAPTIVE_FIRST = 2;
+    public static final int FORMAT_REGULAR = 3;
+
+    protected int mFormatType;
+    protected boolean mUseSurface;
+    protected boolean mUseSurfaceTexture;
+
+    public Test() {
+        mFormatType = FORMAT_REGULAR;
+        mUseSurface = true;
+        mUseSurfaceTexture = false;
+    }
+
+    public Test adaptive() {
+        mFormatType = FORMAT_ADAPTIVE_LARGEST;
+        return this;
+    }
+
+    public Test adaptiveSmall() {
+        mFormatType = FORMAT_ADAPTIVE_FIRST;
+        return this;
+    }
+
+    public Test byteBuffer() {
+        mUseSurface = false;
+        mUseSurfaceTexture = false;
+        return this;
+    }
+
+    public Test texture() {
+        mUseSurface = false;
+        mUseSurfaceTexture = true;
+        return this;
+    }
+
+    public void checkAdaptiveFormat() {
+        assert mFormatType != FORMAT_REGULAR:
+                "must be used with adaptive format";
+    }
+
+    abstract protected TestSurface getSurface();
+
+    /* TRICKY: format is updated in each test run as we are actually reusing the
+       same 2 MediaFormat objects returned from MediaExtractor.  Therefore,
+       format must be explicitly obtained in each test step.
+
+       returns null if codec does not support the format.
+       */
+    protected MediaFormat getFormat(Codec c) {
+        return getFormat(c, 0);
+    }
+
+    protected MediaFormat getFormat(Codec c, int i) {
+        MediaFormat format = null;
+        if (mFormatType == FORMAT_REGULAR) {
+            format = c.mediaList[i].getFormat();
+        } else if (mFormatType == FORMAT_ADAPTIVE_FIRST && c.adaptive) {
+            format = c.mediaList[i].getAdaptiveFormat(
+                c.mediaList[i].getWidth(), c.mediaList[i].getHeight());
+        } else if (mFormatType == FORMAT_ADAPTIVE_LARGEST && c.adaptive) {
+            /* update adaptive format to max size used */
+            format = c.mediaList[i].getAdaptiveFormat(0, 0);
+            for (Media media : c.mediaList) {
+                /* get the largest width, and the largest height independently */
+                if (media.getWidth() > format.getInteger(MediaFormat.KEY_MAX_WIDTH)) {
+                    format.setInteger(MediaFormat.KEY_MAX_WIDTH, media.getWidth());
+                }
+                if (media.getHeight() > format.getInteger(MediaFormat.KEY_MAX_HEIGHT)) {
+                    format.setInteger(MediaFormat.KEY_MAX_HEIGHT, media.getHeight());
+                }
+            }
+        }
+        return format;
+    }
+
+    public boolean isValid(Codec c) { return true; }
+    public abstract void addTests(TestList tests, Codec c);
+}
+
+abstract class Step {
+    private static final String TAG = "AdaptiveStep";
+
+    public Step(String title, Test instance, Codec codec, Media media) {
+        mTest = instance;
+        mCodec = codec;
+        mMedia = media;
+        mDescription = title + " on " + stepSurface().getSurface() + " using " +
+            mCodec.name + " and " + stepFormat();
+    }
+    public Step(String title, Test instance, Codec codec, int mediaIx) {
+        this(title, instance, codec, codec.mediaList[mediaIx]);
+    }
+    public Step(String title, Test instance, Codec codec) {
+        this(title, instance, codec, 0);
+    }
+    public Step(String description) {
+        mDescription = description;
+    }
+    public Step() { }
+
+    public abstract void run() throws Throwable;
+
+    private String mDescription;
+    private Test mTest;
+    private Codec mCodec;
+    private Media mMedia;
+    private int mWarnings;
+
+    /* TRICKY: use non-standard getter names so that we don't conflict with the getters
+       in the Test classes, as most test Steps are defined as anonymous classes inside
+       the test classes. */
+    public MediaFormat stepFormat() {
+        int ix = Arrays.asList(mCodec.mediaList).indexOf(mMedia);
+        return mTest.getFormat(mCodec, ix);
+    }
+
+    public TestSurface stepSurface() {
+        return mTest.getSurface();
+    }
+
+    public Media  stepMedia()       { return mMedia; }
+
+    public String getDescription() { return mDescription; }
+    public int    getWarnings()    { return mWarnings; }
+
+    public void warn(String message) {
+        Log.e(TAG, "WARNING: " + message + " in " + getDescription());
+        mWarnings++;
+    }
+    public void warn(String message, Throwable t) {
+        Log.e(TAG, "WARNING: " + message + " in " + getDescription(), t);
+        mWarnings++;
+    }
+    public void warn(Iterable<String> warnings) {
+        for (String warning: warnings) {
+            warn(warning);
+        }
+    }
+}
+
+interface TestSurface {
+    public Surface getSurface();
+    public long checksum();
+    public void release();
+    public void prepare();         // prepare surface prior to render
+    public void waitForDraw();     // wait for rendering to take place
+    public boolean needsToRunInSeparateThread();
+}
+
+class DecoderSurface extends OutputSurface implements TestSurface {
+    private ByteBuffer mBuf;
+    int mWidth;
+    int mHeight;
+    CRC32 mCRC;
+
+    public DecoderSurface(int width, int height, CRC32 crc) {
+        super(width, height);
+        mWidth = width;
+        mHeight = height;
+        mCRC = crc;
+        mBuf = ByteBuffer.allocateDirect(4 * width * height);
+    }
+
+    public void prepare() {
+        makeCurrent();
+    }
+
+    public void waitForDraw() {
+        awaitNewImage();
+        drawImage();
+    }
+
+    public long checksum() {
+        mBuf.position(0);
+        GLES20.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, mBuf);
+        mBuf.position(0);
+        return AdaptivePlaybackTest.checksum(mBuf, mBuf.capacity(), mCRC);
+    }
+
+    public void release() {
+        super.release();
+        mBuf = null;
+    }
+
+    public boolean needsToRunInSeparateThread() {
+        return true;
+    }
+}
+
+class ActivitySurface implements TestSurface {
+    private Surface mSurface;
+    public ActivitySurface(Surface s) {
+        mSurface = s;
+    }
+    public Surface getSurface() {
+        return mSurface;
+    }
+    public void prepare() { }
+    public void waitForDraw() { }
+    public long checksum() {
+        return 0;
+    }
+    public void release() {
+        // don't release activity surface, as it is reusable
+    }
+    public boolean needsToRunInSeparateThread() {
+        return false;
+    }
+}
+
diff --git a/tests/tests/media/src/android/media/cts/AudioRecordTest.java b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
index 877cb80..7ff631f 100644
--- a/tests/tests/media/src/android/media/cts/AudioRecordTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioRecordTest.java
@@ -99,7 +99,7 @@
         assertEquals(AudioFormat.ENCODING_PCM_16BIT, mAudioRecord.getAudioFormat());
         assertEquals(MediaRecorder.AudioSource.DEFAULT, mAudioRecord.getAudioSource());
         assertEquals(1, mAudioRecord.getChannelCount());
-        assertEquals(AudioFormat.CHANNEL_CONFIGURATION_MONO,
+        assertEquals(AudioFormat.CHANNEL_IN_MONO,
                 mAudioRecord.getChannelConfiguration());
         assertEquals(AudioRecord.STATE_INITIALIZED, mAudioRecord.getState());
         assertEquals(mHz, mAudioRecord.getSampleRate());
diff --git a/tests/tests/media/src/android/media/cts/AudioTrackTest.java b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
index ac8379a..090cde8 100644
--- a/tests/tests/media/src/android/media/cts/AudioTrackTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioTrackTest.java
@@ -18,6 +18,7 @@
 
 import android.media.AudioFormat;
 import android.media.AudioManager;
+import android.media.AudioTimestamp;
 import android.media.AudioTrack;
 import android.test.AndroidTestCase;
 import android.util.Log;
@@ -397,6 +398,51 @@
         track.release();
     }
 
+    // Test case 5: getPlaybackHeadPosition() remains 0 after pause(); flush(); play();
+    public void testPlaybackHeadPositionAfterFlushAndPlay() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testPlaybackHeadPositionAfterFlushAndPlay";
+        final int TEST_CONF = AudioFormat.CHANNEL_OUT_STEREO;
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
+        final int TEST_MODE = AudioTrack.MODE_STREAM;
+        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final int TEST_SR = AudioTrack.getNativeOutputSampleRate(TEST_STREAM_TYPE);
+
+        // -------- initialization --------------
+        int minBuffSize = AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
+                2 * minBuffSize, TEST_MODE);
+        byte data[] = new byte[minBuffSize];
+        // -------- test --------------
+        assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
+        track.write(data, OFFSET_DEFAULT, data.length);
+        track.write(data, OFFSET_DEFAULT, data.length);
+        track.play();
+        Thread.sleep(100);
+        track.pause();
+
+        int pos = track.getPlaybackHeadPosition();
+        log(TEST_NAME, "position after pause =" + pos);
+        assertTrue(TEST_NAME, pos > 0);
+
+        track.flush();
+        pos = track.getPlaybackHeadPosition();
+        log(TEST_NAME, "position after flush =" + pos);
+        assertTrue(TEST_NAME, pos == 0);
+
+        track.play();
+        pos = track.getPlaybackHeadPosition();
+        log(TEST_NAME, "position after play =" + pos);
+        assertTrue(TEST_NAME, pos == 0);
+
+        Thread.sleep(100);
+        pos = track.getPlaybackHeadPosition();
+        log(TEST_NAME, "position after 100 ms sleep =" + pos);
+        assertTrue(TEST_NAME, pos == 0);
+        // -------- tear down --------------
+        track.release();
+    }
+
     // -----------------------------------------------------------------
     // Playback properties
     // ----------------------------------
@@ -1319,6 +1365,76 @@
         track.release();
     }
 
+    public void testGetTimestamp() throws Exception {
+        // constants for test
+        final String TEST_NAME = "testGetTimestamp";
+        final int TEST_SR = 22050;
+        final int TEST_CONF = AudioFormat.CHANNEL_CONFIGURATION_MONO;
+        final int TEST_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
+        final int TEST_MODE = AudioTrack.MODE_STREAM;
+        final int TEST_STREAM_TYPE = AudioManager.STREAM_MUSIC;
+        final int TEST_LOOP_CNT = 10;
+
+        final int MILLIS_PER_SEC = 1000;
+        final int NANOS_PER_MILLI = 1000000;
+
+        // -------- initialization --------------
+        final int BYTES_PER_FRAME = 2;
+        final int FRAMES_PER_100_MILLIS =
+                AudioTrack.getMinBufferSize(TEST_SR, TEST_CONF, TEST_FORMAT);
+        final int FRAMES_PER_SEC = FRAMES_PER_100_MILLIS * 10;
+        byte[] data = new byte[FRAMES_PER_100_MILLIS * BYTES_PER_FRAME];
+        AudioTrack track = new AudioTrack(TEST_STREAM_TYPE, TEST_SR, TEST_CONF, TEST_FORMAT,
+                 FRAMES_PER_SEC * BYTES_PER_FRAME, TEST_MODE);
+        // -------- test --------------
+        assertTrue(TEST_NAME, track.getState() == AudioTrack.STATE_INITIALIZED);
+
+        long framesWritten = 0, framesSeen = 0, framesPresented = 0;
+        long lastFramesPresented = 0, lastFrameTime = 0, lastOutputFrequency = FRAMES_PER_SEC;
+        AudioTimestamp timestamp = new AudioTimestamp();
+
+        for (int i = 0; i < TEST_LOOP_CNT; i++) {
+            for (int j = 0; j < FRAMES_PER_SEC; j += FRAMES_PER_100_MILLIS) {
+                track.write(data, 0, data.length);
+                framesWritten += FRAMES_PER_100_MILLIS;
+            }
+
+            track.play();
+            Thread.sleep(MILLIS_PER_SEC);
+            track.pause();
+
+            framesSeen = track.getPlaybackHeadPosition();
+            assertTrue(TEST_NAME, framesWritten >= framesSeen);
+
+            assertTrue(TEST_NAME, track.getTimestamp(timestamp));
+            framesPresented = timestamp.framePosition;
+            assertTrue(TEST_NAME, framesSeen >= framesPresented);
+
+            // check output frequency
+            long outFrequency = framesPresented - lastFramesPresented;
+            long freqDiff = Math.abs(FRAMES_PER_SEC - outFrequency);
+            assertTrue(TEST_NAME, freqDiff < FRAMES_PER_100_MILLIS);
+
+            // check output frequency jitter
+            freqDiff = Math.abs(outFrequency - lastOutputFrequency);
+            assertTrue(TEST_NAME, freqDiff < FRAMES_PER_100_MILLIS);
+
+            lastFramesPresented = framesPresented;
+            lastOutputFrequency = outFrequency;
+
+            long frameTime = timestamp.nanoTime;
+            assertTrue(TEST_NAME, frameTime >= lastFrameTime);
+            lastFrameTime = frameTime;
+
+            long curTime = System.nanoTime();
+            assertTrue(TEST_NAME, curTime >= frameTime);
+            assertTrue(TEST_NAME, curTime - frameTime < 100 * NANOS_PER_MILLI);
+        }
+        track.stop();
+        // -------- tear down --------------
+        track.release();
+    }
+
 /* Do not run in JB-MR1. will be re-opened in the next platform release.
     public void testResourceLeakage() throws Exception {
         final int BUFFER_SIZE = 600 * 1024;
diff --git a/tests/tests/media/src/android/media/cts/CompositionTextureView.java b/tests/tests/media/src/android/media/cts/CompositionTextureView.java
new file mode 100644
index 0000000..5d84a11
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/CompositionTextureView.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2014 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 android.media.cts;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.Surface;
+import android.view.TextureView;
+
+public class CompositionTextureView extends TextureView
+    implements TextureView.SurfaceTextureListener {
+    private static final String TAG = "CompositionTextureView";
+    private static final boolean DBG = true;
+    private static final boolean DBG_VERBOSE = false;
+
+    private final Semaphore mInitWaitSemaphore = new Semaphore(0);
+    private Surface mSurface;
+
+    public CompositionTextureView(Context context) {
+        super(context);
+        if (DBG) {
+            Log.i(TAG, "CompositionTextureView");
+        }
+    }
+
+    public CompositionTextureView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        if (DBG) {
+            Log.i(TAG, "CompositionTextureView");
+        }
+    }
+
+    public CompositionTextureView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        if (DBG) {
+            Log.i(TAG, "CompositionTextureView");
+        }
+    }
+
+    public void startListening() {
+        if (DBG) {
+            Log.i(TAG, "startListening");
+        }
+        setSurfaceTextureListener(this);
+    }
+
+    @Override
+    public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
+        if (DBG) {
+            Log.i(TAG, "onSurfaceTextureAvailable");
+        }
+        recreateSurface(arg0);
+        mInitWaitSemaphore.release();
+    }
+
+    @Override
+    public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
+        if (DBG) {
+            Log.i(TAG, "onSurfaceTextureDestroyed");
+        }
+        return true;
+    }
+
+    @Override
+    public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1, int arg2) {
+        if (DBG) {
+            Log.i(TAG, "onSurfaceTextureSizeChanged");
+        }
+        recreateSurface(arg0);
+        mInitWaitSemaphore.release();
+    }
+
+    @Override
+    public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
+        if (DBG_VERBOSE) {
+            Log.i(TAG, "onSurfaceTextureUpdated");
+        }
+        //ignore
+    }
+
+    public boolean waitForSurfaceReady(long timeoutMs) throws Exception {
+        if (isSurfaceTextureAvailable()) {
+            return true;
+        }
+        if (mInitWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
+            return true;
+        }
+        return isSurfaceTextureAvailable();
+    }
+
+    private boolean isSurfaceTextureAvailable() {
+        SurfaceTexture surfaceTexture = getSurfaceTexture();
+        if (mSurface == null && surfaceTexture != null) {
+            recreateSurface(surfaceTexture);
+        }
+        return (mSurface != null);
+    }
+
+    private synchronized void recreateSurface(SurfaceTexture surfaceTexture) {
+        if (mSurface != null) {
+            mSurface.release();
+        }
+        mSurface = new Surface(surfaceTexture);
+    }
+
+    public Surface getSurface() {
+        return mSurface;
+    }
+
+}
diff --git a/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
index be2dc54..0d83647 100644
--- a/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
+++ b/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java
@@ -31,8 +31,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 
-import javax.microedition.khronos.opengles.GL10;
-
 
 /**
  * This test has three steps:
@@ -53,7 +51,6 @@
     private static final boolean WORK_AROUND_BUGS = false;  // avoid fatal codec bugs
     private static final boolean VERBOSE = false;           // lots of logging
     private static final boolean DEBUG_SAVE_FILE = false;   // save copy of encoded movie
-    private static final String DEBUG_FILE_NAME_BASE = "/sdcard/test.";
 
     // parameters for the encoder
     private static final String MIME_TYPE = "video/avc";    // H.264 Advanced Video Coding
@@ -91,7 +88,7 @@
 
 
     public void testVideoEditQCIF() throws Throwable {
-        setParameters(176, 144, 1000000);
+        setParameters(176, 144, 1100000);
         VideoEditWrapper.runTest(this);
     }
     public void testVideoEditQVGA() throws Throwable {
@@ -766,7 +763,7 @@
                 y = mHeight / 4;
             }
 
-            GLES20.glReadPixels(x, y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuf);
+            GLES20.glReadPixels(x, y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixelBuf);
             int r = pixelBuf.get(0) & 0xff;
             int g = pixelBuf.get(1) & 0xff;
             int b = pixelBuf.get(2) & 0xff;
diff --git a/tests/tests/media/src/android/media/cts/DecoderTest.java b/tests/tests/media/src/android/media/cts/DecoderTest.java
index 1e91c09..65f16b1 100644
--- a/tests/tests/media/src/android/media/cts/DecoderTest.java
+++ b/tests/tests/media/src/android/media/cts/DecoderTest.java
@@ -21,6 +21,7 @@
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
 import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
 import android.util.Log;
@@ -37,6 +38,10 @@
 public class DecoderTest extends MediaPlayerTestBase {
     private static final String TAG = "DecoderTest";
 
+    private static final int RESET_MODE_NONE = 0;
+    private static final int RESET_MODE_RECONFIGURE = 1;
+    private static final int RESET_MODE_FLUSH = 2;
+
     private Resources mResources;
     short[] mMasterBuffer;
 
@@ -69,22 +74,22 @@
     // This should allow for some variation in decoders, while still detecting
     // phase and delay errors, channel swap, etc.
     public void testDecodeMp3Lame() throws Exception {
-        decode(R.raw.sinesweepmp3lame, 804.f, true);
+        decode(R.raw.sinesweepmp3lame, 804.f);
     }
     public void testDecodeMp3Smpb() throws Exception {
-        decode(R.raw.sinesweepmp3smpb, 413.f, true);
+        decode(R.raw.sinesweepmp3smpb, 413.f);
     }
     public void testDecodeM4a() throws Exception {
-        decode(R.raw.sinesweepm4a, 124.f, true);
+        decode(R.raw.sinesweepm4a, 124.f);
     }
     public void testDecodeOgg() throws Exception {
-        decode(R.raw.sinesweepogg, 168.f, false);
+        decode(R.raw.sinesweepogg, 168.f);
     }
     public void testDecodeWav() throws Exception {
-        decode(R.raw.sinesweepwav, 0.0f, true);
+        decode(R.raw.sinesweepwav, 0.0f);
     }
     public void testDecodeFlac() throws Exception {
-        decode(R.raw.sinesweepflac, 0.0f, true);
+        decode(R.raw.sinesweepflac, 0.0f);
     }
 
     public void testDecodeMonoMp3() throws Exception {
@@ -100,7 +105,7 @@
     }
 
     private void monoTest(int res) throws Exception {
-        short [] mono = decodeToMemory(res, false);
+        short [] mono = decodeToMemory(res, RESET_MODE_NONE);
         if (mono.length == 44100) {
             // expected
         } else if (mono.length == 88200) {
@@ -114,19 +119,23 @@
         }
 
         // we should get the same data when reconfiguring the codec
-        short [] mono2 = decodeToMemory(res, true);
+        short [] mono2 = decodeToMemory(res, RESET_MODE_RECONFIGURE);
         assertTrue(Arrays.equals(mono, mono2));
+
+        // NOTE: coming soon
+        // and when flushing it
+//        short [] mono3 = decodeToMemory(res, RESET_MODE_FLUSH);
+//        assertTrue(Arrays.equals(mono, mono3));
     }
 
     /**
      * @param testinput the file to decode
      * @param maxerror the maximum allowed root mean squared error
-     * @param testReconfigure whether to also test reconfiguring the codec
      * @throws IOException
      */
-    private void decode(int testinput, float maxerror, boolean reconfigure) throws IOException {
+    private void decode(int testinput, float maxerror) throws IOException {
 
-        short [] decoded = decodeToMemory(testinput, false);
+        short [] decoded = decodeToMemory(testinput, RESET_MODE_NONE);
 
         assertEquals("wrong data size", mMasterBuffer.length, decoded.length);
 
@@ -143,16 +152,21 @@
         double rmse = Math.sqrt(avgErrorSquared);
         assertTrue("decoding error too big: " + rmse, rmse <= maxerror);
 
-        if (reconfigure) {
-            short [] decoded2 = decodeToMemory(testinput, true);
-            assertEquals("count different with reconfigure", decoded.length, decoded2.length);
-            for (int i = 0; i < decoded.length; i++) {
-                assertEquals("samples don't match", decoded[i], decoded2[i]);
-            }
+        short [] decoded2 = decodeToMemory(testinput, RESET_MODE_RECONFIGURE);
+        assertEquals("count different with reconfigure", decoded.length, decoded2.length);
+        for (int i = 0; i < decoded.length; i++) {
+            assertEquals("samples don't match", decoded[i], decoded2[i]);
         }
+
+        // NOTE: coming soon
+//        short [] decoded3 = decodeToMemory(testinput, RESET_MODE_FLUSH);
+//        assertEquals("count different with flush", decoded.length, decoded3.length);
+//        for (int i = 0; i < decoded.length; i++) {
+//            assertEquals("samples don't match", decoded[i], decoded3[i]);
+//        }
     }
 
-    private short[] decodeToMemory(int testinput, boolean reconfigure) throws IOException {
+    private short[] decodeToMemory(int testinput, int resetMode) throws IOException {
 
         short [] decoded = new short[0];
         int decodedIdx = 0;
@@ -180,12 +194,14 @@
         codecInputBuffers = codec.getInputBuffers();
         codecOutputBuffers = codec.getOutputBuffers();
 
-        if (reconfigure) {
+        if (resetMode == RESET_MODE_RECONFIGURE) {
             codec.stop();
             codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
             codec.start();
             codecInputBuffers = codec.getInputBuffers();
             codecOutputBuffers = codec.getOutputBuffers();
+        } else if (resetMode == RESET_MODE_FLUSH) {
+            codec.flush();
         }
 
         extractor.selectTrack(0);
@@ -238,16 +254,21 @@
                 if (info.size > 0) {
                     noOutputCounter = 0;
                 }
-                if (info.size > 0 && reconfigure) {
-                    // once we've gotten some data out of the decoder, reconfigure it again
-                    reconfigure = false;
+                if (info.size > 0 && resetMode != RESET_MODE_NONE) {
+                    // once we've gotten some data out of the decoder, reset and start again
+                    if (resetMode == RESET_MODE_RECONFIGURE) {
+                        codec.stop();
+                        codec.configure(format, null /* surface */, null /* crypto */,
+                                0 /* flags */);
+                        codec.start();
+                        codecInputBuffers = codec.getInputBuffers();
+                        codecOutputBuffers = codec.getOutputBuffers();
+                    } else /* resetMode == RESET_MODE_FLUSH */ {
+                        codec.flush();
+                    }
+                    resetMode = RESET_MODE_NONE;
                     extractor.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
                     sawInputEOS = false;
-                    codec.stop();
-                    codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
-                    codec.start();
-                    codecInputBuffers = codec.getInputBuffers();
-                    codecOutputBuffers = codec.getOutputBuffers();
                     continue;
                 }
 
@@ -290,12 +311,12 @@
         Surface s = getActivity().getSurfaceHolder().getSurface();
         int frames1 = countFrames(
                 R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                false, -1, s);
+                RESET_MODE_NONE, -1 /* eosframe */, s);
         assertEquals("wrong number of frames decoded", 240, frames1);
 
         int frames2 = countFrames(
                 R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                false, -1, null);
+                RESET_MODE_NONE, -1 /* eosframe */, null);
         assertEquals("different number of frames when using Surface", frames1, frames2);
     }
 
@@ -303,12 +324,51 @@
         Surface s = getActivity().getSurfaceHolder().getSurface();
         int frames1 = countFrames(
                 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
-                false /* reconfigure */, -1 /* eosframe */, s);
+                RESET_MODE_NONE, -1 /* eosframe */, s);
         assertEquals("wrong number of frames decoded", 122, frames1);
 
         int frames2 = countFrames(
                 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
-                false /* reconfigure */, -1 /* eosframe */, null);
+                RESET_MODE_NONE, -1 /* eosframe */, null);
+        assertEquals("different number of frames when using Surface", frames1, frames2);
+    }
+
+    public void testCodecBasicMpeg4() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 249, frames1);
+
+        int frames2 = countFrames(
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, null);
+        assertEquals("different number of frames when using Surface", frames1, frames2);
+    }
+
+    public void testCodecBasicVP8() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 240, frames1);
+
+        int frames2 = countFrames(
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, null);
+        assertEquals("different number of frames when using Surface", frames1, frames2);
+    }
+
+    public void testCodecBasicVP9() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 240, frames1);
+
+        int frames2 = countFrames(
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, -1 /* eosframe */, null);
         assertEquals("different number of frames when using Surface", frames1, frames2);
     }
 
@@ -316,7 +376,7 @@
         Surface s = getActivity().getSurfaceHolder().getSurface();
         int frames1 = countFrames(
                 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz,
-                false, 64, s);
+                RESET_MODE_NONE, 64 /* eosframe */, s);
         assertEquals("wrong number of frames decoded", 64, frames1);
     }
 
@@ -324,51 +384,139 @@
         Surface s = getActivity().getSurfaceHolder().getSurface();
         int frames1 = countFrames(
                 R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz,
-                false, 120, s);
+                RESET_MODE_NONE, 120 /* eosframe */, s);
         assertEquals("wrong number of frames decoded", 120, frames1);
     }
 
-    public void testCodecReconfigH264WithoutSurface() throws Exception {
-        testCodecReconfig(
+    public void testCodecEarlyEOSMpeg4() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, 120 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 120, frames1);
+    }
+
+    public void testCodecEarlyEOSVP8() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, 120 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 120, frames1);
+    }
+
+    public void testCodecEarlyEOSVP9() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        int frames1 = countFrames(
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz,
+                RESET_MODE_NONE, 120 /* eosframe */, s);
+        assertEquals("wrong number of frames decoded", 120, frames1);
+    }
+
+    public void testCodecResetsH264WithoutSurface() throws Exception {
+        testCodecResets(
                 R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, null);
     }
 
-    public void testCodecReconfigH264WithSurface() throws Exception {
+    public void testCodecResetsH264WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecReconfig(
+        testCodecResets(
                 R.raw.video_480x360_mp4_h264_1000kbps_25fps_aac_stereo_128kbps_44100hz, s);
     }
 
-    public void testCodecReconfigH263WithoutSurface() throws Exception {
-        testCodecReconfig(
+    public void testCodecResetsH263WithoutSurface() throws Exception {
+        testCodecResets(
                 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, null);
     }
 
-    public void testCodecReconfigH263WithSurface() throws Exception {
+    public void testCodecResetsH263WithSurface() throws Exception {
         Surface s = getActivity().getSurfaceHolder().getSurface();
-        testCodecReconfig(
+        testCodecResets(
                 R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, s);
     }
 
-//    public void testCodecReconfigOgg() throws Exception {
-//        testCodecReconfig(R.raw.sinesweepogg, null);
-//    }
-//
-    public void testCodecReconfigMp3() throws Exception {
-        testCodecReconfig(R.raw.sinesweepmp3lame, null);
+    public void testCodecResetsMpeg4WithoutSurface() throws Exception {
+        testCodecResets(
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, null);
     }
 
-    public void testCodecReconfigM4a() throws Exception {
+    public void testCodecResetsMpeg4WithSurface() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        testCodecResets(
+                R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, s);
+    }
+
+    public void testCodecResetsVP8WithoutSurface() throws Exception {
+        testCodecResets(
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, null);
+    }
+
+    public void testCodecResetsVP8WithSurface() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        testCodecResets(
+                R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, s);
+    }
+
+    public void testCodecResetsVP9WithoutSurface() throws Exception {
+        testCodecResets(
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, null);
+    }
+
+    public void testCodecResetsVP9WithSurface() throws Exception {
+        Surface s = getActivity().getSurfaceHolder().getSurface();
+        testCodecResets(
+                R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, s);
+    }
+
+//    public void testCodecResetsOgg() throws Exception {
+//        testCodecResets(R.raw.sinesweepogg, null);
+//    }
+
+    public void testCodecResetsMp3() throws Exception {
+        testCodecReconfig(R.raw.sinesweepmp3lame, null);
+        // NOTE: replacing testCodecReconfig call soon
+//        testCodecResets(R.raw.sinesweepmp3lame, null);
+    }
+
+    public void testCodecResetsM4a() throws Exception {
         testCodecReconfig(R.raw.sinesweepm4a, null);
+        // NOTE: replacing testCodecReconfig call soon
+//        testCodecResets(R.raw.sinesweepm4a, null);
     }
 
     private void testCodecReconfig(int video, Surface s) throws Exception {
-        int frames1 = countFrames(video, false /* reconfigure */, -1 /* eosframe */, s);
-        int frames2 = countFrames(video, true /* reconfigure */, -1 /* eosframe */, s);
-        assertEquals("different number of frames when reusing codec", frames1, frames2);
+        int frames1 = countFrames(video, RESET_MODE_NONE, -1 /* eosframe */, s);
+        int frames2 = countFrames(video, RESET_MODE_RECONFIGURE, -1 /* eosframe */, s);
+        assertEquals("different number of frames when using reconfigured codec", frames1, frames2);
     }
 
-    private int countFrames(int video, boolean reconfigure, int eosframe, Surface s) throws Exception {
+    private void testCodecResets(int video, Surface s) throws Exception {
+        int frames1 = countFrames(video, RESET_MODE_NONE, -1 /* eosframe */, s);
+        int frames2 = countFrames(video, RESET_MODE_RECONFIGURE, -1 /* eosframe */, s);
+        int frames3 = countFrames(video, RESET_MODE_FLUSH, -1 /* eosframe */, s);
+        assertEquals("different number of frames when using reconfigured codec", frames1, frames2);
+        assertEquals("different number of frames when using flushed codec", frames1, frames3);
+    }
+
+    private MediaCodec createDecoder(String mime) {
+        if (false) {
+            // change to force testing software codecs
+            if (mime.contains("avc")) {
+                return MediaCodec.createByCodecName("OMX.google.h264.decoder");
+            } else if (mime.contains("3gpp")) {
+                return MediaCodec.createByCodecName("OMX.google.h263.decoder");
+            } else if (mime.contains("mp4v")) {
+                return MediaCodec.createByCodecName("OMX.google.mpeg4.decoder");
+            } else if (mime.contains("vp8")) {
+                return MediaCodec.createByCodecName("OMX.google.vp8.decoder");
+            } else if (mime.contains("vp9")) {
+                return MediaCodec.createByCodecName("OMX.google.vp9.decoder");
+            }
+        }
+        return MediaCodec.createDecoderByType(mime);
+    }
+
+    private int countFrames(int video, int resetMode, int eosframe, Surface s)
+            throws Exception {
         int numframes = 0;
 
         AssetFileDescriptor testFd = mResources.openRawResourceFd(video);
@@ -386,12 +534,8 @@
         String mime = format.getString(MediaFormat.KEY_MIME);
         boolean isAudio = mime.startsWith("audio/");
 
-        codec = MediaCodec.createDecoderByType(mime);
-//        if (mime.contains("avc")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h264.decoder");
-//        } else if (mime.contains("3gpp")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h263.decoder");
-//        }
+        codec = createDecoder(mime);
+
         assertNotNull("couldn't find codec", codec);
         Log.i("@@@@", "using codec: " + codec.getName());
         codec.configure(format, s /* surface */, null /* crypto */, 0 /* flags */);
@@ -399,13 +543,16 @@
         codecInputBuffers = codec.getInputBuffers();
         codecOutputBuffers = codec.getOutputBuffers();
 
-        if (reconfigure) {
+        if (resetMode == RESET_MODE_RECONFIGURE) {
             codec.stop();
             codec.configure(format, s /* surface */, null /* crypto */, 0 /* flags */);
             codec.start();
             codecInputBuffers = codec.getInputBuffers();
             codecOutputBuffers = codec.getOutputBuffers();
+        } else if (resetMode == RESET_MODE_FLUSH) {
+            codec.flush();
         }
+
         Log.i("@@@@", "format: " + format);
 
         extractor.selectTrack(0);
@@ -468,18 +615,23 @@
                 // Some decoders output a 0-sized buffer at the end. Disregard those.
                 if (info.size > 0) {
                     deadDecoderCounter = 0;
-                    if (reconfigure) {
-                        // once we've gotten some data out of the decoder, reconfigure it again
-                        reconfigure = false;
-                        numframes = 0;
+                    if (resetMode != RESET_MODE_NONE) {
+                        // once we've gotten some data out of the decoder, reset and start again
+                        if (resetMode == RESET_MODE_RECONFIGURE) {
+                            codec.stop();
+                            codec.configure(format, s /* surface */, null /* crypto */,
+                                    0 /* flags */);
+                            codec.start();
+                            codecInputBuffers = codec.getInputBuffers();
+                            codecOutputBuffers = codec.getOutputBuffers();
+                        } else /* resetMode == RESET_MODE_FLUSH */ {
+                            codec.flush();
+                        }
+                        resetMode = RESET_MODE_NONE;
                         extractor.seekTo(0, MediaExtractor.SEEK_TO_NEXT_SYNC);
                         sawInputEOS = false;
+                        numframes = 0;
                         timestamps.clear();
-                        codec.stop();
-                        codec.configure(format, s /* surface */, null /* crypto */, 0 /* flags */);
-                        codec.start();
-                        codecInputBuffers = codec.getInputBuffers();
-                        codecOutputBuffers = codec.getOutputBuffers();
                         continue;
                     }
 
@@ -534,6 +686,31 @@
         testEOSBehavior(R.raw.video_176x144_3gp_h263_300kbps_12fps_aac_stereo_128kbps_22050hz, 50);
     }
 
+    public void testEOSBehaviorMpeg4() throws Exception {
+        // this video has an I frame every 12 frames
+        testEOSBehavior(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 24);
+        testEOSBehavior(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 25);
+        testEOSBehavior(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 48);
+        testEOSBehavior(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 50);
+        testEOSBehavior(R.raw.video_480x360_mp4_mpeg4_860kbps_25fps_aac_stereo_128kbps_44100hz, 2);
+    }
+
+    public void testEOSBehaviorVP8() throws Exception {
+        // this video has an I frame at 46
+        testEOSBehavior(R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 46);
+        testEOSBehavior(R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 47);
+        testEOSBehavior(R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 57);
+        testEOSBehavior(R.raw.video_480x360_webm_vp8_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 45);
+    }
+
+    public void testEOSBehaviorVP9() throws Exception {
+        // this video has an I frame at 44
+        testEOSBehavior(R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 44);
+        testEOSBehavior(R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 45);
+        testEOSBehavior(R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 55);
+        testEOSBehavior(R.raw.video_480x360_webm_vp9_333kbps_25fps_vorbis_stereo_128kbps_44100hz, 43);
+    }
+
     private void testEOSBehavior(int movie, int stopatsample) throws Exception {
 
         int numframes = 0;
@@ -555,12 +732,8 @@
         String mime = format.getString(MediaFormat.KEY_MIME);
         boolean isAudio = mime.startsWith("audio/");
 
-        codec = MediaCodec.createDecoderByType(mime);
-//        if (mime.contains("avc")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h264.decoder");
-//        } else if (mime.contains("3gpp")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h263.decoder");
-//        }
+        codec = createDecoder(mime);
+
         assertNotNull("couldn't find codec", codec);
         Log.i("@@@@", "using codec: " + codec.getName());
         codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
@@ -577,6 +750,7 @@
         boolean sawOutputEOS = false;
         int deadDecoderCounter = 0;
         int samplenum = 0;
+        boolean dochecksum = false;
         while (!sawOutputEOS && deadDecoderCounter < 100) {
             if (!sawInputEOS) {
                 int inputBufIndex = codec.dequeueInputBuffer(kTimeOutUs);
@@ -630,7 +804,7 @@
                         numframes += info.size;
                     } else {
                         // for video, count the number of video frames
-                        long sum = checksum(codecOutputBuffers[res], info.size);
+                        long sum = dochecksum ? checksum(codecOutputBuffers[res], info.size) : 0;
                         if (numframes < checksums.length) {
                             checksums[numframes] = sum;
                         }
@@ -653,7 +827,8 @@
                 Log.d(TAG, "output buffers have changed.");
             } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                 MediaFormat oformat = codec.getOutputFormat();
-
+                int colorFormat = oformat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
+                dochecksum = isRecognizedFormat(colorFormat);
                 Log.d(TAG, "output format has changed to " + oformat);
             } else {
                 Log.d(TAG, "no output");
@@ -673,12 +848,7 @@
         extractor.setDataSource(testFd.getFileDescriptor(), testFd.getStartOffset(),
                 testFd.getLength());
 
-        codec = MediaCodec.createDecoderByType(mime);
-//        if (mime.contains("avc")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h264.decoder");
-//        } else if (mime.contains("3gpp")) {
-//            codec = MediaCodec.createByCodecName("OMX.google.h263.decoder");
-//        }
+        codec = createDecoder(mime);
         codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);
         codec.start();
         codecInputBuffers = codec.getInputBuffers();
@@ -693,6 +863,7 @@
         deadDecoderCounter = 0;
         samplenum = 0;
         numframes = 0;
+        dochecksum = false;
         while (!sawOutputEOS && deadDecoderCounter < 100) {
             if (!sawInputEOS) {
                 int inputBufIndex = codec.dequeueInputBuffer(kTimeOutUs);
@@ -746,7 +917,7 @@
                         numframes += info.size;
                     } else {
                         // for video, count the number of video frames
-                        long sum = checksum(codecOutputBuffers[res], info.size);
+                        long sum = dochecksum ? checksum(codecOutputBuffers[res], info.size) : 0;
                         if (numframes < checksums.length) {
                             assertEquals("frame data mismatch at frame " + numframes,
                                     checksums[numframes], sum);
@@ -770,7 +941,8 @@
                 Log.d(TAG, "output buffers have changed.");
             } else if (res == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
                 MediaFormat oformat = codec.getOutputFormat();
-
+                int colorFormat = oformat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
+                dochecksum = isRecognizedFormat(colorFormat);
                 Log.d(TAG, "output format has changed to " + oformat);
             } else {
                 Log.d(TAG, "no output");
@@ -788,6 +960,21 @@
         testFd.close();
     }
 
+    /* from EncodeDecodeTest */
+    private static boolean isRecognizedFormat(int colorFormat) {
+        switch (colorFormat) {
+            // these are the formats we know how to handle for this test
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar:
+            case MediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     private long checksum(ByteBuffer buf, int size) {
         assertTrue(size != 0);
         assertTrue(size <= buf.capacity());
@@ -852,7 +1039,7 @@
         codec.release();
 
     }
-    
+
     private short getAmplitude(MediaExtractor extractor, MediaCodec codec) {
         short maxvalue = 0;
         int numBytesDecoded = 0;
@@ -903,7 +1090,7 @@
                 MediaFormat oformat = codec.getOutputFormat();
             }
         }
-        return maxvalue; 
+        return maxvalue;
     }
 
 }
diff --git a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
index d788102..445814e 100644
--- a/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java
@@ -332,7 +332,7 @@
             inputSurface = new InputSurface(encoder.createInputSurface());
             encoder.start();
 
-            doEncodeDecodeVideoFromSurfaceToSurface(encoder, inputSurface, colorFormat, decoder, outputSurface);
+            doEncodeDecodeVideoFromSurfaceToSurface(encoder, inputSurface, decoder, outputSurface);
         } finally {
             if (VERBOSE) Log.d(TAG, "releasing codecs");
             if (inputSurface != null) {
@@ -703,7 +703,7 @@
      * Does the actual work for encoding and decoding from Surface to Surface.
      */
     private void doEncodeDecodeVideoFromSurfaceToSurface(MediaCodec encoder,
-            InputSurface inputSurface, int encoderColorFormat, MediaCodec decoder,
+            InputSurface inputSurface, MediaCodec decoder,
             OutputSurface outputSurface) {
         final int TIMEOUT_USEC = 10000;
         ByteBuffer[] encoderOutputBuffers = encoder.getOutputBuffers();
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
new file mode 100644
index 0000000..fce343e
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayTest.java
@@ -0,0 +1,560 @@
+/*
+ * Copyright (C) 2013 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 android.media.cts;
+
+import android.app.Presentation;
+import android.media.MediaCodec;
+import android.media.MediaCodecInfo;
+import android.media.MediaFormat;
+import android.content.Context;
+import android.graphics.drawable.ColorDrawable;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.opengl.GLES20;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.test.AndroidTestCase;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
+import android.view.Surface;
+import android.view.WindowManager;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.ImageView;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+
+/**
+ * Tests connecting a virtual display to the input of a MediaCodec encoder.
+ * <p>
+ * Other test cases exercise these independently in more depth.  The goal here is to make sure
+ * that virtual displays and MediaCodec can be used together.
+ * <p>
+ * We can't control frame-by-frame what appears on the virtual display, because we're
+ * just throwing a Presentation and a View at it.  Further, it's possible that frames
+ * will be dropped if they arrive faster than they are consumed, so any given frame
+ * may not appear at all.  We can't wait for a series of actions to complete by watching
+ * the output, because the frames are going directly to the encoder, and the encoder may
+ * collect a number of frames before producing output.
+ * <p>
+ * The test puts up a series of colored screens, expecting to see all of them, and in order.
+ * Any black screens that appear before or after are ignored.
+ */
+public class EncodeVirtualDisplayTest extends AndroidTestCase {
+    private static final String TAG = "EncodeVirtualTest";
+    private static final boolean VERBOSE = false;           // lots of logging
+    private static final boolean DEBUG_SAVE_FILE = false;   // save copy of encoded movie
+    private static final String DEBUG_FILE_NAME_BASE = "/sdcard/test.";
+
+    // Virtual display characteristics.  Scaled down from full display size because not all
+    // devices can encode at the resolution of their own display.
+    private static final String NAME = TAG;
+    private static final int WIDTH = 1280;
+    private static final int HEIGHT = 720;
+    private static final int DENSITY = DisplayMetrics.DENSITY_HIGH;
+    private static final int UI_TIMEOUT_MS = 2000;
+    private static final int UI_RENDER_PAUSE_MS = 400;
+
+    // Encoder parameters.  We use the same width/height as the virtual display.
+    private static final String MIME_TYPE = "video/avc";
+    private static final int FRAME_RATE = 15;               // 15fps
+    private static final int IFRAME_INTERVAL = 10;          // 10 seconds between I-frames
+    private static final int BIT_RATE = 6000000;            // 6Mbps
+
+    // Colors to test (RGB).  These must convert cleanly to and from BT.601 YUV.
+    private static final int TEST_COLORS[] = {
+        makeColor(10, 100, 200),        // YCbCr 89,186,82
+        makeColor(100, 200, 10),        // YCbCr 144,60,98
+        makeColor(200, 10, 100),        // YCbCr 203,10,103
+        makeColor(10, 200, 100),        // YCbCr 130,113,52
+        makeColor(100, 10, 200),        // YCbCr 67,199,154
+        makeColor(200, 100, 10),        // YCbCr 119,74,179
+    };
+
+    private final ByteBuffer mPixelBuf = ByteBuffer.allocateDirect(4);
+    private Handler mUiHandler;                             // Handler on main Looper
+    private DisplayManager mDisplayManager;
+    volatile boolean mInputDone;
+
+    /* TEST_COLORS static initialization; need ARGB for ColorDrawable */
+    private static int makeColor(int red, int green, int blue) {
+        return 0xff << 24 | (red & 0xff) << 16 | (green & 0xff) << 8 | (blue & 0xff);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mUiHandler = new Handler(Looper.getMainLooper());
+        mDisplayManager = (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
+    }
+
+    /**
+     * Basic test.
+     *
+     * @throws Exception
+     */
+    public void testEncodeVirtualDisplay() throws Throwable {
+        EncodeVirtualWrapper.runTest(this);
+    }
+
+    /**
+     * Wraps encodeVirtualTest, running it in a new thread.  Required because of the way
+     * SurfaceTexture.OnFrameAvailableListener works when the current thread has a Looper
+     * configured.
+     */
+    private static class EncodeVirtualWrapper implements Runnable {
+        private Throwable mThrowable;
+        private EncodeVirtualDisplayTest mTest;
+
+        private EncodeVirtualWrapper(EncodeVirtualDisplayTest test) {
+            mTest = test;
+        }
+
+        @Override
+        public void run() {
+            try {
+                mTest.encodeVirtualDisplayTest();
+            } catch (Throwable th) {
+                mThrowable = th;
+            }
+        }
+
+        /** Entry point. */
+        public static void runTest(EncodeVirtualDisplayTest obj) throws Throwable {
+            EncodeVirtualWrapper wrapper = new EncodeVirtualWrapper(obj);
+            Thread th = new Thread(wrapper, "codec test");
+            th.start();
+            th.join();
+            if (wrapper.mThrowable != null) {
+                throw wrapper.mThrowable;
+            }
+        }
+    }
+
+    /**
+     * Prepares the encoder, decoder, and virtual display.
+     */
+    private void encodeVirtualDisplayTest() {
+        MediaCodec encoder = null;
+        MediaCodec decoder = null;
+        OutputSurface outputSurface = null;
+        VirtualDisplay virtualDisplay = null;
+
+        try {
+            // Encoded video resolution matches virtual display.
+            MediaFormat encoderFormat = MediaFormat.createVideoFormat(MIME_TYPE, WIDTH, HEIGHT);
+            encoderFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                    MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+            encoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
+            encoderFormat.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
+            encoderFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+
+            encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+            encoder.configure(encoderFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            Surface inputSurface = encoder.createInputSurface();
+            encoder.start();
+
+            // Create a virtual display that will output to our encoder.
+            virtualDisplay = mDisplayManager.createVirtualDisplay(NAME,
+                    WIDTH, HEIGHT, DENSITY, inputSurface, 0);
+
+            // We also need a decoder to check the output of the encoder.
+            decoder = MediaCodec.createDecoderByType(MIME_TYPE);
+            MediaFormat decoderFormat = MediaFormat.createVideoFormat(MIME_TYPE, WIDTH, HEIGHT);
+            outputSurface = new OutputSurface(WIDTH, HEIGHT);
+            decoder.configure(decoderFormat, outputSurface.getSurface(), null, 0);
+            decoder.start();
+
+            // Run the color slide show on a separate thread.
+            mInputDone = false;
+            new ColorSlideShow(virtualDisplay.getDisplay()).start();
+
+            // Record everything we can and check the results.
+            doTestEncodeVirtual(encoder, decoder, outputSurface);
+
+        } finally {
+            if (VERBOSE) Log.d(TAG, "releasing codecs, surfaces, and virtual display");
+            if (virtualDisplay != null) {
+                virtualDisplay.release();
+            }
+            if (outputSurface != null) {
+                outputSurface.release();
+            }
+            if (encoder != null) {
+                encoder.stop();
+                encoder.release();
+            }
+            if (decoder != null) {
+                decoder.stop();
+                decoder.release();
+            }
+        }
+    }
+
+    /**
+     * Drives the encoder and decoder.
+     */
+    private void doTestEncodeVirtual(MediaCodec encoder, MediaCodec decoder,
+            OutputSurface outputSurface) {
+        final int TIMEOUT_USEC = 10000;
+        ByteBuffer[] encoderOutputBuffers = encoder.getOutputBuffers();
+        ByteBuffer[] decoderInputBuffers = decoder.getInputBuffers();
+        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+        boolean inputEosSignaled = false;
+        int lastIndex = -1;
+        int goodFrames = 0;
+        int debugFrameCount = 0;
+
+        // Save a copy to disk.  Useful for debugging the test.  Note this is a raw elementary
+        // stream, not a .mp4 file, so not all players will know what to do with it.
+        FileOutputStream outputStream = null;
+        if (DEBUG_SAVE_FILE) {
+            String fileName = DEBUG_FILE_NAME_BASE + WIDTH + "x" + HEIGHT + ".mp4";
+            try {
+                outputStream = new FileOutputStream(fileName);
+                Log.d(TAG, "encoded output will be saved as " + fileName);
+            } catch (IOException ioe) {
+                Log.w(TAG, "Unable to create debug output file " + fileName);
+                throw new RuntimeException(ioe);
+            }
+        }
+
+        // Loop until the output side is done.
+        boolean encoderDone = false;
+        boolean outputDone = false;
+        while (!outputDone) {
+            if (VERBOSE) Log.d(TAG, "loop");
+
+            if (!inputEosSignaled && mInputDone) {
+                if (VERBOSE) Log.d(TAG, "signaling input EOS");
+                encoder.signalEndOfInputStream();
+                inputEosSignaled = true;
+            }
+
+            boolean decoderOutputAvailable = true;
+            boolean encoderOutputAvailable = !encoderDone;
+            while (decoderOutputAvailable || encoderOutputAvailable) {
+                // Start by draining any pending output from the decoder.  It's important to
+                // do this before we try to stuff any more data in.
+                int decoderStatus = decoder.dequeueOutputBuffer(info, TIMEOUT_USEC);
+                if (decoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
+                    // no output available yet
+                    if (VERBOSE) Log.d(TAG, "no output from decoder available");
+                    decoderOutputAvailable = false;
+                } else if (decoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                    if (VERBOSE) Log.d(TAG, "decoder output buffers changed (but we don't care)");
+                } else if (decoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                    // this happens before the first frame is returned
+                    MediaFormat decoderOutputFormat = decoder.getOutputFormat();
+                    if (VERBOSE) Log.d(TAG, "decoder output format changed: " +
+                            decoderOutputFormat);
+                } else if (decoderStatus < 0) {
+                    fail("unexpected result from deocder.dequeueOutputBuffer: " + decoderStatus);
+                } else {  // decoderStatus >= 0
+                    if (VERBOSE) Log.d(TAG, "surface decoder given buffer " + decoderStatus +
+                            " (size=" + info.size + ")");
+                    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        if (VERBOSE) Log.d(TAG, "output EOS");
+                        outputDone = true;
+                    }
+
+                    // The ByteBuffers are null references, but we still get a nonzero size for
+                    // the decoded data.
+                    boolean doRender = (info.size != 0);
+
+                    // As soon as we call releaseOutputBuffer, the buffer will be forwarded
+                    // to SurfaceTexture to convert to a texture.  The API doesn't guarantee
+                    // that the texture will be available before the call returns, so we
+                    // need to wait for the onFrameAvailable callback to fire.  If we don't
+                    // wait, we risk dropping frames.
+                    outputSurface.makeCurrent();
+                    decoder.releaseOutputBuffer(decoderStatus, doRender);
+                    if (doRender) {
+                        if (VERBOSE) Log.d(TAG, "awaiting frame " + (lastIndex+1));
+                        outputSurface.awaitNewImage();
+                        outputSurface.drawImage();
+                        int foundIndex = checkSurfaceFrame();
+                        if (foundIndex == lastIndex + 1) {
+                            // found the next one in the series
+                            lastIndex = foundIndex;
+                            goodFrames++;
+                        } else if (foundIndex == lastIndex) {
+                            // Sometimes we see the same color two frames in a row.
+                            if (VERBOSE) Log.d(TAG, "Got another " + lastIndex);
+                        } else if (foundIndex > 0) {
+                            // Looks like we missed a color frame.  It's possible something
+                            // stalled and we dropped a frame.  Skip forward to see if we
+                            // can catch the rest.
+                            if (foundIndex < lastIndex) {
+                                Log.w(TAG, "Ignoring backward skip from " +
+                                    lastIndex + " to " + foundIndex);
+                            } else {
+                                Log.w(TAG, "Frame skipped, advancing lastIndex from " +
+                                        lastIndex + " to " + foundIndex);
+                                goodFrames++;
+                                lastIndex = foundIndex;
+                            }
+                        }
+                    }
+                }
+                if (decoderStatus != MediaCodec.INFO_TRY_AGAIN_LATER) {
+                    // Continue attempts to drain output.
+                    continue;
+                }
+
+                // Decoder is drained, check to see if we've got a new buffer of output from
+                // the encoder.
+                if (!encoderDone) {
+                    int encoderStatus = encoder.dequeueOutputBuffer(info, TIMEOUT_USEC);
+                    if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
+                        // no output available yet
+                        if (VERBOSE) Log.d(TAG, "no output from encoder available");
+                        encoderOutputAvailable = false;
+                    } else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                        // not expected for an encoder
+                        encoderOutputBuffers = encoder.getOutputBuffers();
+                        if (VERBOSE) Log.d(TAG, "encoder output buffers changed");
+                    } else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
+                        // received before first buffer
+                        MediaFormat newFormat = encoder.getOutputFormat();
+                        if (VERBOSE) Log.d(TAG, "encoder output format changed: " + newFormat);
+                    } else if (encoderStatus < 0) {
+                        fail("unexpected result from encoder.dequeueOutputBuffer: " + encoderStatus);
+                    } else { // encoderStatus >= 0
+                        ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
+                        if (encodedData == null) {
+                            fail("encoderOutputBuffer " + encoderStatus + " was null");
+                        }
+
+                        // It's usually necessary to adjust the ByteBuffer values to match BufferInfo.
+                        encodedData.position(info.offset);
+                        encodedData.limit(info.offset + info.size);
+
+                        if (outputStream != null) {
+                            byte[] data = new byte[info.size];
+                            encodedData.get(data);
+                            encodedData.position(info.offset);
+                            try {
+                                outputStream.write(data);
+                            } catch (IOException ioe) {
+                                Log.w(TAG, "failed writing debug data to file");
+                                throw new RuntimeException(ioe);
+                            }
+                            debugFrameCount++;
+                        }
+
+                        // Get a decoder input buffer, blocking until it's available.  We just
+                        // drained the decoder output, so we expect there to be a free input
+                        // buffer now or in the near future (i.e. this should never deadlock
+                        // if the codec is meeting requirements).
+                        //
+                        // The first buffer of data we get will have the BUFFER_FLAG_CODEC_CONFIG
+                        // flag set; the decoder will see this and finish configuring itself.
+                        int inputBufIndex = decoder.dequeueInputBuffer(-1);
+                        ByteBuffer inputBuf = decoderInputBuffers[inputBufIndex];
+                        inputBuf.clear();
+                        inputBuf.put(encodedData);
+                        decoder.queueInputBuffer(inputBufIndex, 0, info.size,
+                                info.presentationTimeUs, info.flags);
+
+                        // If everything from the encoder has been passed to the decoder, we
+                        // can stop polling the encoder output.  (This just an optimization.)
+                        if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                            encoderDone = true;
+                            encoderOutputAvailable = false;
+                        }
+                        if (VERBOSE) Log.d(TAG, "passed " + info.size + " bytes to decoder"
+                                + (encoderDone ? " (EOS)" : ""));
+
+                        encoder.releaseOutputBuffer(encoderStatus, false);
+                    }
+                }
+            }
+        }
+
+        if (outputStream != null) {
+            try {
+                outputStream.close();
+                if (VERBOSE) Log.d(TAG, "Wrote " + debugFrameCount + " frames");
+            } catch (IOException ioe) {
+                Log.w(TAG, "failed closing debug file");
+                throw new RuntimeException(ioe);
+            }
+        }
+
+        if (goodFrames != TEST_COLORS.length) {
+            fail("Found " + goodFrames + " of " + TEST_COLORS.length + " expected frames");
+        }
+    }
+
+    /**
+     * Checks the contents of the current EGL surface to see if it matches expectations.
+     * <p>
+     * The surface may be black or one of the colors we've drawn.  We have sufficiently little
+     * control over the rendering process that we don't know how many (if any) black frames
+     * will appear between each color frame.
+     * <p>
+     * @return the color index, or -2 for black
+     * @throw RuntimeException if the color isn't recognized (probably because the RGB<->YUV
+     *     conversion introduced too much variance)
+     */
+    private int checkSurfaceFrame() {
+        boolean frameFailed = false;
+
+        // Read a pixel from the center of the surface.  Might want to read from multiple points
+        // and average them together.
+        int x = WIDTH / 2;
+        int y = HEIGHT / 2;
+        GLES20.glReadPixels(x, y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mPixelBuf);
+        int r = mPixelBuf.get(0) & 0xff;
+        int g = mPixelBuf.get(1) & 0xff;
+        int b = mPixelBuf.get(2) & 0xff;
+        if (VERBOSE) Log.d(TAG, "GOT: r=" + r + " g=" + g + " b=" + b);
+
+        if (approxEquals(0, r) && approxEquals(0, g) && approxEquals(0, b)) {
+            return -2;
+        }
+
+        // Walk through the color list and try to find a match.  These may have gone through
+        // RGB<->YCbCr conversions, so don't expect exact matches.
+        for (int i = 0; i < TEST_COLORS.length; i++) {
+            int testRed = (TEST_COLORS[i] >> 16) & 0xff;
+            int testGreen = (TEST_COLORS[i] >> 8) & 0xff;
+            int testBlue = TEST_COLORS[i] & 0xff;
+            if (approxEquals(testRed, r) && approxEquals(testGreen, g) &&
+                    approxEquals(testBlue, b)) {
+                if (VERBOSE) Log.d(TAG, "Matched color " + i + ": r=" + r + " g=" + g + " b=" + b);
+                return i;
+            }
+        }
+
+        throw new RuntimeException("No match for color r=" + r + " g=" + g + " b=" + b);
+    }
+
+    /**
+     * Determines if two color values are approximately equal.
+     */
+    private static boolean approxEquals(int expected, int actual) {
+        final int MAX_DELTA = 4;
+        return Math.abs(expected - actual) <= MAX_DELTA;
+    }
+
+    /**
+     * Creates a series of colorful Presentations on the specified Display.
+     */
+    private class ColorSlideShow extends Thread {
+        private Display mDisplay;
+
+        public ColorSlideShow(Display display) {
+            mDisplay = display;
+        }
+
+        @Override
+        public void run() {
+            for (int i = 0; i < TEST_COLORS.length; i++) {
+                showPresentation(TEST_COLORS[i]);
+            }
+
+            if (VERBOSE) Log.d(TAG, "slide show finished");
+            mInputDone = true;
+        }
+
+        private void showPresentation(final int color) {
+            final TestPresentation[] presentation = new TestPresentation[1];
+            try {
+                runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        // Want to create presentation on UI thread so it finds the right Looper
+                        // when setting up the Dialog.
+                        presentation[0] = new TestPresentation(getContext(), mDisplay, color);
+                        if (VERBOSE) Log.d(TAG, "showing color=0x" + Integer.toHexString(color));
+                        presentation[0].show();
+                    }
+                });
+
+                // Give the presentation an opportunity to render.  We don't have a way to
+                // monitor the output, so we just sleep for a bit.
+                try { Thread.sleep(UI_RENDER_PAUSE_MS); }
+                catch (InterruptedException ignore) {}
+            } finally {
+                if (presentation[0] != null) {
+                    runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            presentation[0].dismiss();
+                        }
+                    });
+                }
+            }
+        }
+    }
+
+    /**
+     * Executes a runnable on the UI thread, and waits for it to complete.
+     */
+    private void runOnUiThread(Runnable runnable) {
+        Runnable waiter = new Runnable() {
+            @Override
+            public void run() {
+                synchronized (this) {
+                    notifyAll();
+                }
+            }
+        };
+        synchronized (waiter) {
+            mUiHandler.post(runnable);
+            mUiHandler.post(waiter);
+            try {
+                waiter.wait(UI_TIMEOUT_MS);
+            } catch (InterruptedException ex) {
+            }
+        }
+    }
+
+    /**
+     * Presentation we can show on a virtual display.  The view is set to a single color value.
+     */
+    private class TestPresentation extends Presentation {
+        private final int mColor;
+
+        public TestPresentation(Context context, Display display, int color) {
+            super(context, display);
+            mColor = color;
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            setTitle("Encode Virtual Test");
+            getWindow().setType(WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
+
+            // Create a solid color image to use as the content of the presentation.
+            ImageView view = new ImageView(getContext());
+            view.setImageDrawable(new ColorDrawable(mColor));
+            view.setLayoutParams(new LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+            setContentView(view);
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
new file mode 100644
index 0000000..8985ddb
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -0,0 +1,1520 @@
+/*
+ * Copyright (C) 2013 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 android.media.cts;
+
+
+import android.app.Presentation;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.graphics.SurfaceTexture;
+import android.graphics.Typeface;
+import android.graphics.drawable.ColorDrawable;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.media.MediaCodec;
+import android.media.MediaCodec.BufferInfo;
+import android.media.MediaCodecInfo;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.CodecProfileLevel;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
+import android.opengl.GLES11Ext;
+import android.opengl.GLES20;
+import android.opengl.Matrix;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.test.AndroidTestCase;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Pair;
+import android.view.Display;
+import android.view.Surface;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.cts.media.R;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Tests to check if MediaCodec encoding works with composition of multiple virtual displays
+ * The test also tries to destroy and create virtual displays repeatedly to
+ * detect any issues. The test itself does not check the output as it is already done in other
+ * tests.
+ */
+public class EncodeVirtualDisplayWithCompositionTest extends AndroidTestCase {
+    private static final String TAG = "EncodeVirtualDisplayWithCompositionTest";
+    private static final boolean DBG = false;
+    private static final String MIME_TYPE = "video/avc";
+
+    private static final long DEFAULT_WAIT_TIMEOUT_MS = 5000;
+    private static final long DEFAULT_WAIT_TIMEOUT_US = 5000000;
+
+    private static final int COLOR_RED =  makeColor(100, 0, 0);
+    private static final int COLOR_BLUE =  makeColor(0, 100, 0);
+    private static final int COLOR_GREEN =  makeColor(0, 0, 100);
+    private static final int COLOR_GREY =  makeColor(100, 100, 100);
+
+    private static final int BITRATE_1080p = 20000000;
+    private static final int BITRATE_720p = 14000000;
+    private static final int BITRATE_800x480 = 14000000;
+    private static final int IFRAME_INTERVAL = 10;
+
+    private static final int MAX_NUM_WINDOWS = 3;
+
+    private static Handler sHandlerForRunOnMain = new Handler(Looper.getMainLooper());
+
+    private Surface mEncodingSurface;
+    private OutputSurface mDecodingSurface;
+    private volatile boolean mCodecConfigReceived = false;
+    private volatile boolean mCodecBufferReceived = false;
+    private EncodingHelper mEncodingHelper;
+    private MediaCodec mDecoder;
+    private final ByteBuffer mPixelBuf = ByteBuffer.allocateDirect(4);
+    private volatile boolean mIsQuitting = false;
+    private Throwable mTestException;
+    private VirtualDisplayPresentation mLocalPresentation;
+    private RemoteVirtualDisplayPresentation mRemotePresentation;
+    private ByteBuffer[] mDecoderInputBuffers;
+
+    /** event listener for test without verifying output */
+    private EncoderEventListener mEncoderEventListener = new EncoderEventListener() {
+        @Override
+        public void onCodecConfig(ByteBuffer data, MediaCodec.BufferInfo info) {
+            mCodecConfigReceived = true;
+        }
+        @Override
+        public void onBufferReady(ByteBuffer data, MediaCodec.BufferInfo info) {
+            mCodecBufferReceived = true;
+        }
+        @Override
+        public void onError(String errorMessage) {
+            fail(errorMessage);
+        }
+    };
+
+    /* TEST_COLORS static initialization; need ARGB for ColorDrawable */
+    private static int makeColor(int red, int green, int blue) {
+        return 0xff << 24 | (red & 0xff) << 16 | (green & 0xff) << 8 | (blue & 0xff);
+    }
+
+    public void testVirtualDisplayRecycles() throws Exception {
+        doTestVirtualDisplayRecycles(3);
+    }
+
+    public void testRendering800x480Locally() throws Throwable {
+        Log.i(TAG, "testRendering800x480Locally");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        if (maxRes.first >= 800 && maxRes.second >= 480) {
+            runTestRenderingInSeparateThread(800, 480, false, false);
+        } else {
+            Log.w(TAG, "This H/W does not support 800x480");
+        }
+    }
+
+    public void testRenderingMaxResolutionLocally() throws Throwable {
+        Log.i(TAG, "testRenderingMaxResolutionLocally");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        Log.w(TAG, "Trying resolution w:" + maxRes.first + " h:" + maxRes.second);
+        runTestRenderingInSeparateThread(maxRes.first, maxRes.second, false, false);
+    }
+
+    public void testRendering800x480Remotely() throws Throwable {
+        Log.i(TAG, "testRendering800x480Remotely");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        if (maxRes.first >= 800 && maxRes.second >= 480) {
+            runTestRenderingInSeparateThread(800, 480, true, false);
+        } else {
+            Log.w(TAG, "This H/W does not support 800x480");
+        }
+    }
+
+    public void testRenderingMaxResolutionRemotely() throws Throwable {
+        Log.i(TAG, "testRenderingMaxResolutionRemotely");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        Log.w(TAG, "Trying resolution w:" + maxRes.first + " h:" + maxRes.second);
+        runTestRenderingInSeparateThread(maxRes.first, maxRes.second, true, false);
+    }
+
+    public void testRendering800x480RemotelyWith3Windows() throws Throwable {
+        Log.i(TAG, "testRendering800x480RemotelyWith3Windows");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        if (maxRes.first >= 800 && maxRes.second >= 480) {
+            runTestRenderingInSeparateThread(800, 480, true, true);
+        } else {
+            Log.w(TAG, "This H/W does not support 800x480");
+        }
+    }
+
+    public void testRendering800x480LocallyWith3Windows() throws Throwable {
+        Log.i(TAG, "testRendering800x480LocallyWith3Windows");
+        Pair<Integer, Integer> maxRes = checkMaxConcurrentEncodingDecodingResolution();
+        if (maxRes.first >= 800 && maxRes.second >= 480) {
+            runTestRenderingInSeparateThread(800, 480, false, true);
+        } else {
+            Log.w(TAG, "This H/W does not support 800x480");
+        }
+    }
+
+    /**
+     * Run rendering test in a separate thread. This is necessary as {@link OutputSurface} requires
+     * constructing it in a non-test thread.
+     * @param w
+     * @param h
+     * @throws Exception
+     */
+    private void runTestRenderingInSeparateThread(final int w, final int h,
+            final boolean runRemotely, final boolean multipleWindows) throws Throwable {
+        mTestException = null;
+        Thread renderingThread = new Thread(new Runnable() {
+            public void run() {
+                try {
+                    doTestRenderingOutput(w, h, runRemotely, multipleWindows);
+                } catch (Throwable t) {
+                    t.printStackTrace();
+                    mTestException = t;
+                }
+            }
+        });
+        renderingThread.start();
+        renderingThread.join(20000);
+        assertTrue(!renderingThread.isAlive());
+        if (mTestException != null) {
+            throw mTestException;
+        }
+    }
+
+    private void doTestRenderingOutput(int w, int h, boolean runRemotely, boolean multipleWindows)
+            throws Throwable {
+        if (DBG) {
+            Log.i(TAG, "doTestRenderingOutput for w:" + w + " h:" + h);
+        }
+        try {
+            mIsQuitting = false;
+            mDecoder = MediaCodec.createDecoderByType(MIME_TYPE);
+            MediaFormat decoderFormat = MediaFormat.createVideoFormat(MIME_TYPE, w, h);
+            mDecodingSurface = new OutputSurface(w, h);
+            mDecoder.configure(decoderFormat, mDecodingSurface.getSurface(), null, 0);
+            mDecoder.start();
+            mDecoderInputBuffers = mDecoder.getInputBuffers();
+
+            mEncodingHelper = new EncodingHelper();
+            mEncodingSurface = mEncodingHelper.startEncoding(w, h,
+                    new EncoderEventListener() {
+                @Override
+                public void onCodecConfig(ByteBuffer data, BufferInfo info) {
+                    if (DBG) {
+                        Log.i(TAG, "onCodecConfig l:" + info.size);
+                    }
+                    handleEncodedData(data, info);
+                }
+
+                @Override
+                public void onBufferReady(ByteBuffer data, BufferInfo info) {
+                    if (DBG) {
+                        Log.i(TAG, "onBufferReady l:" + info.size);
+                    }
+                    handleEncodedData(data, info);
+                }
+
+                @Override
+                public void onError(String errorMessage) {
+                    fail(errorMessage);
+                }
+
+                private void handleEncodedData(ByteBuffer data, BufferInfo info) {
+                    if (mIsQuitting) {
+                        if (DBG) {
+                            Log.i(TAG, "ignore data as test is quitting");
+                        }
+                        return;
+                    }
+                    int inputBufferIndex = mDecoder.dequeueInputBuffer(DEFAULT_WAIT_TIMEOUT_US);
+                    if (inputBufferIndex < 0) {
+                        if (DBG) {
+                            Log.i(TAG, "dequeueInputBuffer returned:" + inputBufferIndex);
+                        }
+                        return;
+                    }
+                    assertTrue(inputBufferIndex >= 0);
+                    ByteBuffer inputBuffer = mDecoderInputBuffers[inputBufferIndex];
+                    inputBuffer.clear();
+                    inputBuffer.put(data);
+                    mDecoder.queueInputBuffer(inputBufferIndex, 0, info.size,
+                            info.presentationTimeUs, info.flags);
+                }
+            });
+            GlCompositor compositor = new GlCompositor();
+            if (DBG) {
+                Log.i(TAG, "start composition");
+            }
+            compositor.startComposition(mEncodingSurface, w, h, multipleWindows ? 3 : 1);
+
+            if (DBG) {
+                Log.i(TAG, "create display");
+            }
+
+            Renderer renderer = null;
+            if (runRemotely) {
+                mRemotePresentation = new RemoteVirtualDisplayPresentation(getContext(),
+                        compositor.getWindowSurface(multipleWindows? 1 : 0), w, h);
+                mRemotePresentation.connect();
+                mRemotePresentation.start();
+                renderer = mRemotePresentation;
+            } else {
+                mLocalPresentation = new VirtualDisplayPresentation(getContext(),
+                        compositor.getWindowSurface(multipleWindows? 1 : 0), w, h);
+                mLocalPresentation.createVirtualDisplay();
+                mLocalPresentation.createPresentation();
+                renderer = mLocalPresentation;
+            }
+
+            if (DBG) {
+                Log.i(TAG, "start rendering and check");
+            }
+            renderColorAndCheckResult(renderer, w, h, COLOR_RED);
+            renderColorAndCheckResult(renderer, w, h, COLOR_BLUE);
+            renderColorAndCheckResult(renderer, w, h, COLOR_GREEN);
+            renderColorAndCheckResult(renderer, w, h, COLOR_GREY);
+
+            mIsQuitting = true;
+            if (runRemotely) {
+                mRemotePresentation.disconnect();
+            } else {
+                mLocalPresentation.dismissPresentation();
+                mLocalPresentation.destroyVirtualDisplay();
+            }
+
+            compositor.stopComposition();
+        } finally {
+            if (mEncodingHelper != null) {
+                mEncodingHelper.stopEncoding();
+                mEncodingHelper = null;
+            }
+            if (mDecoder != null) {
+                mDecoder.stop();
+                mDecoder.release();
+                mDecoder = null;
+            }
+            if (mDecodingSurface != null) {
+                mDecodingSurface.release();
+                mDecodingSurface = null;
+            }
+        }
+    }
+
+    private static final int NUM_MAX_RETRY = 120;
+    private static final int IMAGE_WAIT_TIMEOUT_MS = 1000;
+
+    private void renderColorAndCheckResult(Renderer renderer, int w, int h,
+            int color) throws Exception {
+        BufferInfo info = new BufferInfo();
+        for (int i = 0; i < NUM_MAX_RETRY; i++) {
+            renderer.doRendering(color);
+            int bufferIndex = mDecoder.dequeueOutputBuffer(info,  DEFAULT_WAIT_TIMEOUT_US);
+            if (DBG) {
+                Log.i(TAG, "decoder dequeueOutputBuffer returned " + bufferIndex);
+            }
+            if (bufferIndex < 0) {
+                continue;
+            }
+            mDecoder.releaseOutputBuffer(bufferIndex, true);
+            if (mDecodingSurface.checkForNewImage(IMAGE_WAIT_TIMEOUT_MS)) {
+                mDecodingSurface.drawImage();
+                if (checkSurfaceFrameColor(w, h, color)) {
+                    Log.i(TAG, "color " + Integer.toHexString(color) + " matched");
+                    return;
+                }
+            } else if(DBG) {
+                Log.i(TAG, "no rendering yet");
+            }
+        }
+        fail("Color did not match");
+    }
+
+    private boolean checkSurfaceFrameColor(int w, int h, int color) {
+        // Read a pixel from the center of the surface.  Might want to read from multiple points
+        // and average them together.
+        int x = w / 2;
+        int y = h / 2;
+        GLES20.glReadPixels(x, y, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, mPixelBuf);
+        int r = mPixelBuf.get(0) & 0xff;
+        int g = mPixelBuf.get(1) & 0xff;
+        int b = mPixelBuf.get(2) & 0xff;
+
+        int redExpected = (color >> 16) & 0xff;
+        int greenExpected = (color >> 8) & 0xff;
+        int blueExpected = color & 0xff;
+        if (approxEquals(redExpected, r) && approxEquals(greenExpected, g)
+                && approxEquals(blueExpected, b)) {
+            return true;
+        }
+        Log.i(TAG, "expected 0x" + Integer.toHexString(color) + " got 0x"
+                + Integer.toHexString(makeColor(r, g, b)));
+        return false;
+    }
+
+    /**
+     * Determines if two color values are approximately equal.
+     */
+    private static boolean approxEquals(int expected, int actual) {
+        final int MAX_DELTA = 4;
+        return Math.abs(expected - actual) <= MAX_DELTA;
+    }
+
+    private static final int NUM_CODEC_CREATION = 5;
+    private static final int NUM_DISPLAY_CREATION = 10;
+    private static final int NUM_RENDERING = 10;
+    private void doTestVirtualDisplayRecycles(int numDisplays) throws Exception {
+        CodecInfo codecInfo = getAvcSupportedFormatInfo();
+        VirtualDisplayPresentation[] virtualDisplays = new VirtualDisplayPresentation[numDisplays];
+        for (int i = 0; i < NUM_CODEC_CREATION; i++) {
+            mCodecConfigReceived = false;
+            mCodecBufferReceived = false;
+            if (DBG) {
+                Log.i(TAG, "start encoding");
+            }
+            EncodingHelper encodingHelper = new EncodingHelper();
+            mEncodingSurface = encodingHelper.startEncoding(codecInfo.mMaxW, codecInfo.mMaxH,
+                    mEncoderEventListener);
+            GlCompositor compositor = new GlCompositor();
+            if (DBG) {
+                Log.i(TAG, "start composition");
+            }
+            compositor.startComposition(mEncodingSurface, codecInfo.mMaxW, codecInfo.mMaxH,
+                    numDisplays);
+            for (int j = 0; j < NUM_DISPLAY_CREATION; j++) {
+                if (DBG) {
+                    Log.i(TAG, "create display");
+                }
+                for (int k = 0; k < numDisplays; k++) {
+                    virtualDisplays[k] =
+                        new VirtualDisplayPresentation(getContext(),
+                                compositor.getWindowSurface(k),
+                                codecInfo.mMaxW/numDisplays, codecInfo.mMaxH);
+                    virtualDisplays[k].createVirtualDisplay();
+                    virtualDisplays[k].createPresentation();
+                }
+                if (DBG) {
+                    Log.i(TAG, "start rendering");
+                }
+                for (int k = 0; k < NUM_RENDERING; k++) {
+                    for (int l = 0; l < numDisplays; l++) {
+                        virtualDisplays[l].doRendering(COLOR_RED);
+                    }
+                    // do not care how many frames are actually rendered.
+                    Thread.sleep(1);
+                }
+                for (int k = 0; k < numDisplays; k++) {
+                    virtualDisplays[k].dismissPresentation();
+                    virtualDisplays[k].destroyVirtualDisplay();
+                }
+                compositor.recreateWindows();
+            }
+            if (DBG) {
+                Log.i(TAG, "stop composition");
+            }
+            compositor.stopComposition();
+            if (DBG) {
+                Log.i(TAG, "stop encoding");
+            }
+            encodingHelper.stopEncoding();
+            assertTrue(mCodecConfigReceived);
+            assertTrue(mCodecBufferReceived);
+        }
+    }
+
+    interface EncoderEventListener {
+        public void onCodecConfig(ByteBuffer data, MediaCodec.BufferInfo info);
+        public void onBufferReady(ByteBuffer data, MediaCodec.BufferInfo info);
+        public void onError(String errorMessage);
+    }
+
+    private class EncodingHelper {
+        private MediaCodec mEncoder;
+        private volatile boolean mStopEncoding = false;
+        private EncoderEventListener mEventListener;
+        private int mW;
+        private int mH;
+        private Thread mEncodingThread;
+        private Surface mEncodingSurface;
+        private Semaphore mInitCompleted = new Semaphore(0);
+
+        Surface startEncoding(int w, int h, EncoderEventListener eventListener) {
+            mStopEncoding = false;
+            mW = w;
+            mH = h;
+            mEventListener = eventListener;
+            mEncodingThread = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        doEncoding();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        mEventListener.onError(e.toString());
+                    }
+                }
+            });
+            mEncodingThread.start();
+            try {
+                if (DBG) {
+                    Log.i(TAG, "wait for encoder init");
+                }
+                mInitCompleted.acquire();
+                if (DBG) {
+                    Log.i(TAG, "wait for encoder done");
+                }
+            } catch (InterruptedException e) {
+                fail("should not happen");
+            }
+            return mEncodingSurface;
+        }
+
+        void stopEncoding() {
+            try {
+                mStopEncoding = true;
+                mEncodingThread.join();
+            } catch(InterruptedException e) {
+                // just ignore
+            } finally {
+                mEncodingThread = null;
+            }
+        }
+
+        private void doEncoding() throws Exception {
+            final int TIMEOUT_USEC_NORMAL = 1000000;
+            MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mW, mH);
+            format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                    MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+            int bitRate = 10000000;
+            if (mW == 1920 && mH == 1080) {
+                bitRate = BITRATE_1080p;
+            } else if (mW == 1280 && mH == 720) {
+                bitRate = BITRATE_720p;
+            } else if (mW == 800 && mH == 480) {
+                bitRate = BITRATE_800x480;
+            }
+            format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
+            format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+            format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+            mEncoder = MediaCodec.createEncoderByType(MIME_TYPE);
+            mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            mEncodingSurface = mEncoder.createInputSurface();
+            mEncoder.start();
+            mInitCompleted.release();
+            if (DBG) {
+                Log.i(TAG, "starting encoder");
+            }
+            try {
+                ByteBuffer[] encoderOutputBuffers = mEncoder.getOutputBuffers();
+                MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+                while (!mStopEncoding) {
+                    int index = mEncoder.dequeueOutputBuffer(info, TIMEOUT_USEC_NORMAL);
+                    if (DBG) {
+                        Log.i(TAG, "dequeOutputBuffer returned " + index);
+                    }
+                    if (index >= 0) {
+                        if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
+                            Log.i(TAG, "codec config data");
+                            ByteBuffer encodedData = encoderOutputBuffers[index];
+                            encodedData.position(info.offset);
+                            encodedData.limit(info.offset + info.size);
+                            mEventListener.onCodecConfig(encodedData, info);
+                            mEncoder.releaseOutputBuffer(index, false);
+                        } else if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                            Log.i(TAG, "EOS, stopping encoding");
+                            break;
+                        } else {
+                            ByteBuffer encodedData = encoderOutputBuffers[index];
+                            encodedData.position(info.offset);
+                            encodedData.limit(info.offset + info.size);
+                            mEventListener.onBufferReady(encodedData, info);
+                            mEncoder.releaseOutputBuffer(index, false);
+                        }
+                    } else if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED){
+                        Log.i(TAG, "output buffer changed");
+                        encoderOutputBuffers = mEncoder.getOutputBuffers();
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw e;
+            } finally {
+                mEncoder.stop();
+                mEncoder.release();
+                mEncoder = null;
+                mEncodingSurface.release();
+                mEncodingSurface = null;
+            }
+        }
+    }
+
+    /**
+     * Handles composition of multiple SurfaceTexture into a single Surface
+     */
+    private class GlCompositor implements SurfaceTexture.OnFrameAvailableListener {
+        private Surface mSurface;
+        private int mWidth;
+        private int mHeight;
+        private volatile int mNumWindows;
+        private GlWindow mTopWindow;
+        private Thread mCompositionThread;
+        private Semaphore mStartCompletionSemaphore;
+        private Semaphore mRecreationCompletionSemaphore;
+        private Looper mLooper;
+        private Handler mHandler;
+        private InputSurface mEglHelper;
+        private int mGlProgramId = 0;
+        private int mGluMVPMatrixHandle;
+        private int mGluSTMatrixHandle;
+        private int mGlaPositionHandle;
+        private int mGlaTextureHandle;
+        private float[] mMVPMatrix = new float[16];
+        private TopWindowVirtualDisplayPresentation mTopPresentation;
+
+        private static final String VERTEX_SHADER =
+                "uniform mat4 uMVPMatrix;\n" +
+                "uniform mat4 uSTMatrix;\n" +
+                "attribute vec4 aPosition;\n" +
+                "attribute vec4 aTextureCoord;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "void main() {\n" +
+                "  gl_Position = uMVPMatrix * aPosition;\n" +
+                "  vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
+                "}\n";
+
+        private static final String FRAGMENT_SHADER =
+                "#extension GL_OES_EGL_image_external : require\n" +
+                "precision mediump float;\n" +
+                "varying vec2 vTextureCoord;\n" +
+                "uniform samplerExternalOES sTexture;\n" +
+                "void main() {\n" +
+                "  gl_FragColor = texture2D(sTexture, vTextureCoord);\n" +
+                "}\n";
+
+        void startComposition(Surface surface, int w, int h, int numWindows) throws Exception {
+            mSurface = surface;
+            mWidth = w;
+            mHeight = h;
+            mNumWindows = numWindows;
+            mCompositionThread = new Thread(new CompositionRunnable());
+            mStartCompletionSemaphore = new Semaphore(0);
+            mCompositionThread.start();
+            waitForStartCompletion();
+        }
+
+        void stopComposition() {
+            try {
+                if (mLooper != null) {
+                    mLooper.quit();
+                    mCompositionThread.join();
+                }
+            } catch (InterruptedException e) {
+                // don't care
+            }
+            mCompositionThread = null;
+            mSurface = null;
+            mStartCompletionSemaphore = null;
+        }
+
+        Surface getWindowSurface(int windowIndex) {
+            return mTopPresentation.getSurface(windowIndex);
+        }
+
+        void recreateWindows() throws Exception {
+            mRecreationCompletionSemaphore = new Semaphore(0);
+            Message msg = mHandler.obtainMessage(CompositionHandler.DO_RECREATE_WINDOWS);
+            mHandler.sendMessage(msg);
+            if(!mRecreationCompletionSemaphore.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("recreation timeout");
+            }
+            mTopPresentation.waitForSurfaceReady(DEFAULT_WAIT_TIMEOUT_MS);
+        }
+
+        @Override
+        public void onFrameAvailable(SurfaceTexture surface) {
+            if (DBG) {
+                Log.i(TAG, "onFrameAvailable " + surface);
+            }
+            GlWindow w = mTopWindow;
+            if (w != null) {
+                w.markTextureUpdated();
+                requestUpdate();
+            } else {
+                Log.w(TAG, "top window gone");
+            }
+        }
+
+        private void requestUpdate() {
+            Thread compositionThread = mCompositionThread;
+            if (compositionThread == null || !compositionThread.isAlive()) {
+                return;
+            }
+            Message msg = mHandler.obtainMessage(CompositionHandler.DO_RENDERING);
+            mHandler.sendMessage(msg);
+        }
+
+        private int loadShader(int shaderType, String source) throws GlException {
+            int shader = GLES20.glCreateShader(shaderType);
+            checkGlError("glCreateShader type=" + shaderType);
+            GLES20.glShaderSource(shader, source);
+            GLES20.glCompileShader(shader);
+            int[] compiled = new int[1];
+            GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
+            if (compiled[0] == 0) {
+                Log.e(TAG, "Could not compile shader " + shaderType + ":");
+                Log.e(TAG, " " + GLES20.glGetShaderInfoLog(shader));
+                GLES20.glDeleteShader(shader);
+                shader = 0;
+            }
+            return shader;
+        }
+
+        private int createProgram(String vertexSource, String fragmentSource) throws GlException {
+            int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource);
+            if (vertexShader == 0) {
+                return 0;
+            }
+            int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
+            if (pixelShader == 0) {
+                return 0;
+            }
+
+            int program = GLES20.glCreateProgram();
+            checkGlError("glCreateProgram");
+            if (program == 0) {
+                Log.e(TAG, "Could not create program");
+            }
+            GLES20.glAttachShader(program, vertexShader);
+            checkGlError("glAttachShader");
+            GLES20.glAttachShader(program, pixelShader);
+            checkGlError("glAttachShader");
+            GLES20.glLinkProgram(program);
+            int[] linkStatus = new int[1];
+            GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
+            if (linkStatus[0] != GLES20.GL_TRUE) {
+                Log.e(TAG, "Could not link program: ");
+                Log.e(TAG, GLES20.glGetProgramInfoLog(program));
+                GLES20.glDeleteProgram(program);
+                program = 0;
+            }
+            return program;
+        }
+
+        private void initGl() throws GlException {
+            mEglHelper = new InputSurface(mSurface);
+            mEglHelper.makeCurrent();
+            mGlProgramId = createProgram(VERTEX_SHADER, FRAGMENT_SHADER);
+            mGlaPositionHandle = GLES20.glGetAttribLocation(mGlProgramId, "aPosition");
+            checkGlError("glGetAttribLocation aPosition");
+            if (mGlaPositionHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aPosition");
+            }
+            mGlaTextureHandle = GLES20.glGetAttribLocation(mGlProgramId, "aTextureCoord");
+            checkGlError("glGetAttribLocation aTextureCoord");
+            if (mGlaTextureHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for aTextureCoord");
+            }
+            mGluMVPMatrixHandle = GLES20.glGetUniformLocation(mGlProgramId, "uMVPMatrix");
+            checkGlError("glGetUniformLocation uMVPMatrix");
+            if (mGluMVPMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uMVPMatrix");
+            }
+            mGluSTMatrixHandle = GLES20.glGetUniformLocation(mGlProgramId, "uSTMatrix");
+            checkGlError("glGetUniformLocation uSTMatrix");
+            if (mGluSTMatrixHandle == -1) {
+                throw new RuntimeException("Could not get attrib location for uSTMatrix");
+            }
+            Matrix.setIdentityM(mMVPMatrix, 0);
+            Log.i(TAG, "initGl w:" + mWidth + " h:" + mHeight);
+            GLES20.glViewport(0, 0, mWidth, mHeight);
+            float[] vMatrix = new float[16];
+            float[] projMatrix = new float[16];
+            // max window is from (0,0) to (mWidth - 1, mHeight - 1)
+            float wMid = mWidth / 2f;
+            float hMid = mHeight / 2f;
+            // look from positive z to hide windows in lower z
+            Matrix.setLookAtM(vMatrix, 0, wMid, hMid, 5f, wMid, hMid, 0f, 0f, 1.0f, 0.0f);
+            Matrix.orthoM(projMatrix, 0, -wMid, wMid, -hMid, hMid, 1, 10);
+            Matrix.multiplyMM(mMVPMatrix, 0, projMatrix, 0, vMatrix, 0);
+            createWindows();
+
+        }
+
+        private void createWindows() throws GlException {
+            mTopWindow = new GlWindow(this, 0, 0, mWidth, mHeight);
+            mTopWindow.init();
+            mTopPresentation = new TopWindowVirtualDisplayPresentation(mContext,
+                    mTopWindow.getSurface(), mWidth, mHeight, mNumWindows);
+            mTopPresentation.createVirtualDisplay();
+            mTopPresentation.createPresentation();
+            ((TopWindowPresentation) mTopPresentation.getPresentation()).populateWindows();
+        }
+
+        private void cleanupGl() {
+            if (mTopPresentation != null) {
+                mTopPresentation.dismissPresentation();
+                mTopPresentation.destroyVirtualDisplay();
+            }
+            if (mTopWindow != null) {
+                mTopWindow.cleanup();
+            }
+            if (mEglHelper != null) {
+                mEglHelper.release();
+            }
+        }
+
+        private void doGlRendering() throws GlException {
+            if (DBG) {
+                Log.i(TAG, "doGlRendering");
+            }
+            mTopWindow.updateTexImageIfNecessary();
+            GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
+            GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+
+            GLES20.glUseProgram(mGlProgramId);
+            GLES20.glUniformMatrix4fv(mGluMVPMatrixHandle, 1, false, mMVPMatrix, 0);
+            mTopWindow.onDraw(mGluSTMatrixHandle, mGlaPositionHandle, mGlaTextureHandle);
+            checkGlError("window draw");
+            mEglHelper.swapBuffers();
+        }
+
+        private void doRecreateWindows() throws GlException {
+            mTopPresentation.dismissPresentation();
+            mTopPresentation.destroyVirtualDisplay();
+            mTopWindow.cleanup();
+            createWindows();
+            mRecreationCompletionSemaphore.release();
+        }
+
+        private void waitForStartCompletion() throws Exception {
+            if (!mStartCompletionSemaphore.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS,
+                    TimeUnit.MILLISECONDS)) {
+                fail("start timeout");
+            }
+            mStartCompletionSemaphore = null;
+            mTopPresentation.waitForSurfaceReady(DEFAULT_WAIT_TIMEOUT_MS);
+        }
+
+        private class CompositionRunnable implements Runnable {
+            @Override
+            public void run() {
+                try {
+                    Looper.prepare();
+                    mLooper = Looper.myLooper();
+                    mHandler = new CompositionHandler();
+                    initGl();
+                    // init done
+                    mStartCompletionSemaphore.release();
+                    Looper.loop();
+                } catch (GlException e) {
+                    e.printStackTrace();
+                    fail("got gl exception");
+                } finally {
+                    cleanupGl();
+                    mHandler = null;
+                    mLooper = null;
+                }
+            }
+        }
+
+        private class CompositionHandler extends Handler {
+            private static final int DO_RENDERING = 1;
+            private static final int DO_RECREATE_WINDOWS = 2;
+
+            @Override
+            public void handleMessage(Message msg) {
+                try {
+                    switch(msg.what) {
+                        case DO_RENDERING: {
+                            doGlRendering();
+                        } break;
+                        case DO_RECREATE_WINDOWS: {
+                            doRecreateWindows();
+                        } break;
+                    }
+                } catch (GlException e) {
+                    //ignore as this can happen during tearing down
+                }
+            }
+        }
+
+        private class GlWindow {
+            private static final int FLOAT_SIZE_BYTES = 4;
+            private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES;
+            private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0;
+            private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3;
+            private int mBlX;
+            private int mBlY;
+            private int mWidth;
+            private int mHeight;
+            private int mTextureId = 0; // 0 is invalid
+            private volatile SurfaceTexture mSurfaceTexture;
+            private volatile Surface mSurface;
+            private FloatBuffer mVerticesData;
+            private float[] mSTMatrix = new float[16];
+            private AtomicInteger mNumTextureUpdated = new AtomicInteger(0);
+            private GlCompositor mCompositor;
+
+            /**
+             * @param blX X coordinate of bottom-left point of window
+             * @param blY Y coordinate of bottom-left point of window
+             * @param w window width
+             * @param h window height
+             */
+            public GlWindow(GlCompositor compositor, int blX, int blY, int w, int h) {
+                mCompositor = compositor;
+                mBlX = blX;
+                mBlY = blY;
+                mWidth = w;
+                mHeight = h;
+                int trX = blX + w;
+                int trY = blY + h;
+                float[] vertices = new float[] {
+                        // x, y, z, u, v
+                        mBlX, mBlY, 0, 0, 0,
+                        trX, mBlY, 0, 1, 0,
+                        mBlX, trY, 0, 0, 1,
+                        trX, trY, 0, 1, 1
+                };
+                Log.i(TAG, "create window " + this + " blX:" + mBlX + " blY:" + mBlY + " trX:" +
+                        trX + " trY:" + trY);
+                mVerticesData = ByteBuffer.allocateDirect(
+                        vertices.length * FLOAT_SIZE_BYTES)
+                                .order(ByteOrder.nativeOrder()).asFloatBuffer();
+                mVerticesData.put(vertices).position(0);
+            }
+
+            /**
+             * initialize the window for composition. counter-part is cleanup()
+             * @throws GlException
+             */
+            public void init() throws GlException {
+                int[] textures = new int[1];
+                GLES20.glGenTextures(1, textures, 0);
+
+                mTextureId = textures[0];
+                GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);
+                checkGlError("glBindTexture mTextureID");
+
+                GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
+                        GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
+                GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
+                        GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
+                GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
+                        GLES20.GL_CLAMP_TO_EDGE);
+                GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
+                        GLES20.GL_CLAMP_TO_EDGE);
+                checkGlError("glTexParameter");
+                mSurfaceTexture = new SurfaceTexture(mTextureId);
+                mSurfaceTexture.setDefaultBufferSize(mWidth, mHeight);
+                mSurface = new Surface(mSurfaceTexture);
+                mSurfaceTexture.setOnFrameAvailableListener(mCompositor);
+            }
+
+            public void cleanup() {
+                mNumTextureUpdated.set(0);
+                if (mTextureId != 0) {
+                    int[] textures = new int[] {
+                            mTextureId
+                    };
+                    GLES20.glDeleteTextures(1, textures, 0);
+                }
+                GLES20.glFinish();
+                if (mSurface != null) {
+                    mSurface.release();
+                    mSurface = null;
+                }
+                if (mSurfaceTexture != null) {
+                    mSurfaceTexture.release();
+                    mSurfaceTexture = null;
+                }
+            }
+
+            /**
+             * make texture as updated so that it can be updated in the next rendering.
+             */
+            public void markTextureUpdated() {
+                mNumTextureUpdated.incrementAndGet();
+            }
+
+            /**
+             * update texture for rendering if it is updated.
+             */
+            public void updateTexImageIfNecessary() {
+                int numTextureUpdated = mNumTextureUpdated.getAndDecrement();
+                if (numTextureUpdated > 0) {
+                    if (DBG) {
+                        Log.i(TAG, "updateTexImageIfNecessary " + this);
+                    }
+                    mSurfaceTexture.updateTexImage();
+                    mSurfaceTexture.getTransformMatrix(mSTMatrix);
+                }
+                if (numTextureUpdated < 0) {
+                    fail("should not happen");
+                }
+            }
+
+            /**
+             * draw the window. It will not be drawn at all if the window is not visible.
+             * @param uSTMatrixHandle shader handler for the STMatrix for texture coordinates
+             * mapping
+             * @param aPositionHandle shader handle for vertex position.
+             * @param aTextureHandle shader handle for texture
+             */
+            public void onDraw(int uSTMatrixHandle, int aPositionHandle, int aTextureHandle) {
+                GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
+                GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);
+                mVerticesData.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
+                GLES20.glVertexAttribPointer(aPositionHandle, 3, GLES20.GL_FLOAT, false,
+                    TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mVerticesData);
+                GLES20.glEnableVertexAttribArray(aPositionHandle);
+
+                mVerticesData.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
+                GLES20.glVertexAttribPointer(aTextureHandle, 2, GLES20.GL_FLOAT, false,
+                    TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mVerticesData);
+                GLES20.glEnableVertexAttribArray(aTextureHandle);
+                GLES20.glUniformMatrix4fv(uSTMatrixHandle, 1, false, mSTMatrix, 0);
+                GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
+            }
+
+            public SurfaceTexture getSurfaceTexture() {
+                return mSurfaceTexture;
+            }
+
+            public Surface getSurface() {
+                return mSurface;
+            }
+        }
+    }
+
+    static void checkGlError(String op) throws GlException {
+        int error;
+        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            Log.e(TAG, op + ": glError " + error);
+            throw new GlException(op + ": glError " + error);
+        }
+    }
+
+    public static class GlException extends Exception {
+        public GlException(String msg) {
+            super(msg);
+        }
+    }
+
+    private interface Renderer {
+        void doRendering(final int color) throws Exception;
+    }
+
+    private static class VirtualDisplayPresentation implements Renderer {
+        protected final Context mContext;
+        protected final Surface mSurface;
+        protected final int mWidth;
+        protected final int mHeight;
+        protected VirtualDisplay mVirtualDisplay;
+        protected TestPresentationBase mPresentation;
+        private final DisplayManager mDisplayManager;
+
+        VirtualDisplayPresentation(Context context, Surface surface, int w, int h) {
+            mContext = context;
+            mSurface = surface;
+            mWidth = w;
+            mHeight = h;
+            mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
+        }
+
+        void createVirtualDisplay() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mVirtualDisplay = mDisplayManager.createVirtualDisplay(
+                            TAG, mWidth, mHeight, 200, mSurface, 0);
+                }
+            });
+        }
+
+        void destroyVirtualDisplay() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mVirtualDisplay.release();
+                }
+            });
+        }
+
+        void createPresentation() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mPresentation = doCreatePresentation();
+                    mPresentation.show();
+                }
+            });
+        }
+
+        protected TestPresentationBase doCreatePresentation() {
+            return new TestPresentation(mContext, mVirtualDisplay.getDisplay());
+        }
+
+        TestPresentationBase getPresentation() {
+            return mPresentation;
+        }
+
+        void dismissPresentation() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mPresentation.dismiss();
+                }
+            });
+        }
+
+        @Override
+        public void doRendering(final int color) throws Exception {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mPresentation.doRendering(color);
+                }
+            });
+        }
+    }
+
+    private static class TestPresentationBase extends Presentation {
+
+        public TestPresentationBase(Context outerContext, Display display) {
+            super(outerContext, display);
+            getWindow().setType(WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE);
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+        }
+
+        public void doRendering(int color) {
+            // to be implemented by child
+        }
+    }
+
+    private static class TestPresentation extends TestPresentationBase {
+        private ImageView mImageView;
+
+        public TestPresentation(Context outerContext, Display display) {
+            super(outerContext, display);
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            mImageView = new ImageView(getContext());
+            mImageView.setImageDrawable(new ColorDrawable(COLOR_RED));
+            mImageView.setLayoutParams(new LayoutParams(
+                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+            setContentView(mImageView);
+        }
+
+        public void doRendering(int color) {
+            mImageView.setImageDrawable(new ColorDrawable(color));
+        }
+    }
+
+    private static class TopWindowPresentation extends TestPresentationBase {
+        private FrameLayout[] mWindowsLayout = new FrameLayout[MAX_NUM_WINDOWS];
+        private CompositionTextureView[] mWindows = new CompositionTextureView[MAX_NUM_WINDOWS];
+        private final int mNumWindows;
+        private final Semaphore mWindowWaitSemaphore = new Semaphore(0);
+
+        public TopWindowPresentation(int numWindows, Context outerContext, Display display) {
+            super(outerContext, display);
+            mNumWindows = numWindows;
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (DBG) {
+                Log.i(TAG, "TopWindowPresentation onCreate, numWindows " + mNumWindows);
+            }
+            setContentView(R.layout.composition_layout);
+            mWindowsLayout[0] = (FrameLayout) findViewById(R.id.window0);
+            mWindowsLayout[1] = (FrameLayout) findViewById(R.id.window1);
+            mWindowsLayout[2] = (FrameLayout) findViewById(R.id.window2);
+        }
+
+        public void populateWindows() {
+            runOnMain(new Runnable() {
+                public void run() {
+                    for (int i = 0; i < mNumWindows; i++) {
+                        mWindows[i] = new CompositionTextureView(getContext());
+                        mWindows[i].setLayoutParams(new ViewGroup.LayoutParams(
+                                ViewGroup.LayoutParams.MATCH_PARENT,
+                                ViewGroup.LayoutParams.MATCH_PARENT));
+                        mWindowsLayout[i].setVisibility(View.VISIBLE);
+                        mWindowsLayout[i].addView(mWindows[i]);
+                        mWindows[i].startListening();
+                    }
+                    mWindowWaitSemaphore.release();
+                }
+            });
+        }
+
+        public void waitForSurfaceReady(long timeoutMs) throws Exception {
+            mWindowWaitSemaphore.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            for (int i = 0; i < mNumWindows; i++) {
+                if(!mWindows[i].waitForSurfaceReady(timeoutMs)) {
+                    fail("surface wait timeout");
+                }
+            }
+        }
+
+        public Surface getSurface(int windowIndex) {
+            Surface surface = mWindows[windowIndex].getSurface();
+            assertNotNull(surface);
+            return surface;
+        }
+    }
+
+    private static class TopWindowVirtualDisplayPresentation extends VirtualDisplayPresentation {
+        private final int mNumWindows;
+
+        TopWindowVirtualDisplayPresentation(Context context, Surface surface, int w, int h,
+                int numWindows) {
+            super(context, surface, w, h);
+            assertNotNull(surface);
+            mNumWindows = numWindows;
+        }
+
+        void waitForSurfaceReady(long timeoutMs) throws Exception {
+            ((TopWindowPresentation) mPresentation).waitForSurfaceReady(timeoutMs);
+        }
+
+        Surface getSurface(int windowIndex) {
+            return ((TopWindowPresentation) mPresentation).getSurface(windowIndex);
+        }
+
+        protected TestPresentationBase doCreatePresentation() {
+            return new TopWindowPresentation(mNumWindows, mContext, mVirtualDisplay.getDisplay());
+        }
+    }
+
+    private static class RemoteVirtualDisplayPresentation implements Renderer {
+        /** argument: Surface, int w, int h, return none */
+        private static final int BINDER_CMD_START = IBinder.FIRST_CALL_TRANSACTION;
+        /** argument: int color, return none */
+        private static final int BINDER_CMD_RENDER = IBinder.FIRST_CALL_TRANSACTION + 1;
+
+        private final Context mContext;
+        private final Surface mSurface;
+        private final int mWidth;
+        private final int mHeight;
+
+        private IBinder mService;
+        private final Semaphore mConnectionWait = new Semaphore(0);
+        private final ServiceConnection mConnection = new ServiceConnection() {
+
+            public void onServiceConnected(ComponentName arg0, IBinder arg1) {
+                mService = arg1;
+                mConnectionWait.release();
+            }
+
+            public void onServiceDisconnected(ComponentName arg0) {
+                //ignore
+            }
+
+        };
+
+        RemoteVirtualDisplayPresentation(Context context, Surface surface, int w, int h) {
+            mContext = context;
+            mSurface = surface;
+            mWidth = w;
+            mHeight = h;
+        }
+
+        void connect() throws Exception {
+            Intent intent = new Intent();
+            intent.setClassName("com.android.cts.media",
+                    "android.media.cts.RemoteVirtualDisplayService");
+            mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+            if (!mConnectionWait.tryAcquire(DEFAULT_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+                fail("cannot bind to service");
+            }
+        }
+
+        void disconnect() {
+            mContext.unbindService(mConnection);
+        }
+
+        void start() throws Exception {
+            Parcel parcel = Parcel.obtain();
+            mSurface.writeToParcel(parcel, 0);
+            parcel.writeInt(mWidth);
+            parcel.writeInt(mHeight);
+            mService.transact(BINDER_CMD_START, parcel, null, 0);
+        }
+
+        @Override
+        public void doRendering(int color) throws Exception {
+            Parcel parcel = Parcel.obtain();
+            parcel.writeInt(color);
+            mService.transact(BINDER_CMD_RENDER, parcel, null, 0);
+        }
+    }
+
+    private static class CodecInfo {
+        public int mMaxW;
+        public int mMaxH;
+        public int mFps;
+        public int mBitRate;
+        public String mCodecName;
+    };
+
+    /**
+     * Returns the first codec capable of encoding the specified MIME type, or null if no
+     * match was found.
+     */
+    private static MediaCodecInfo selectCodec(String mimeType) {
+        int numCodecs = MediaCodecList.getCodecCount();
+        for (int i = 0; i < numCodecs; i++) {
+            MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
+
+            if (!codecInfo.isEncoder()) {
+                continue;
+            }
+
+            String[] types = codecInfo.getSupportedTypes();
+            for (int j = 0; j < types.length; j++) {
+                if (types[j].equalsIgnoreCase(mimeType)) {
+                    return codecInfo;
+                }
+            }
+        }
+        return null;
+    }
+
+    private static CodecInfo getAvcSupportedFormatInfo() {
+        MediaCodecInfo mediaCodecInfo = selectCodec(MIME_TYPE);
+        CodecCapabilities cap = mediaCodecInfo.getCapabilitiesForType(MIME_TYPE);
+        if (cap == null) { // not supported
+            return null;
+        }
+        CodecInfo info = new CodecInfo();
+        int highestLevel = 0;
+        for (CodecProfileLevel lvl : cap.profileLevels) {
+            if (lvl.level > highestLevel) {
+                highestLevel = lvl.level;
+            }
+        }
+        int maxW = 0;
+        int maxH = 0;
+        int bitRate = 0;
+        int fps = 0; // frame rate for the max resolution
+        switch(highestLevel) {
+            // Do not support Level 1 to 2.
+            case CodecProfileLevel.AVCLevel1:
+            case CodecProfileLevel.AVCLevel11:
+            case CodecProfileLevel.AVCLevel12:
+            case CodecProfileLevel.AVCLevel13:
+            case CodecProfileLevel.AVCLevel1b:
+            case CodecProfileLevel.AVCLevel2:
+                return null;
+            case CodecProfileLevel.AVCLevel21:
+                maxW = 352;
+                maxH = 576;
+                bitRate = 4000000;
+                fps = 25;
+                break;
+            case CodecProfileLevel.AVCLevel22:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 4000000;
+                fps = 15;
+                break;
+            case CodecProfileLevel.AVCLevel3:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 10000000;
+                fps = 30;
+                break;
+            case CodecProfileLevel.AVCLevel31:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 14000000;
+                fps = 30;
+                break;
+            case CodecProfileLevel.AVCLevel32:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 20000000;
+                fps = 60;
+                break;
+            case CodecProfileLevel.AVCLevel4: // only try up to 1080p
+            default:
+                maxW = 1920;
+                maxH = 1080;
+                bitRate = 20000000;
+                fps = 30;
+                break;
+        }
+        info.mMaxW = maxW;
+        info.mMaxH = maxH;
+        info.mFps = fps;
+        info.mBitRate = bitRate;
+        info.mCodecName = mediaCodecInfo.getName();
+        Log.i(TAG, "AVC Level 0x" + Integer.toHexString(highestLevel) + " bit rate " + bitRate +
+                " fps " + info.mFps + " w " + maxW + " h " + maxH);
+
+        return info;
+    }
+
+    /**
+     * Check maximum concurrent encoding / decoding resolution allowed.
+     * Some H/Ws cannot support maximum resolution reported in encoder if decoder is running
+     * at the same time.
+     * Check is done for 4 different levels: 1080p, 720p, 800x480 and max of encoder if is is
+     * smaller than 800x480.
+     */
+    private Pair<Integer, Integer> checkMaxConcurrentEncodingDecodingResolution() {
+        CodecInfo codecInfo = getAvcSupportedFormatInfo();
+        int maxW = codecInfo.mMaxW;
+        int maxH = codecInfo.mMaxH;
+        if (maxW >= 1920 && maxH >= 1080) {
+            if (isConcurrentEncodingDecodingSupported(1920, 1080, BITRATE_1080p)) {
+                return new Pair<Integer, Integer>(1920, 1080);
+            }
+        }
+        if (maxW >= 1280 && maxH >= 720) {
+            if (isConcurrentEncodingDecodingSupported(1280, 720, BITRATE_720p)) {
+                return new Pair<Integer, Integer>(1280, 720);
+            }
+        }
+        if (maxW >= 800 && maxH >= 480) {
+            if (isConcurrentEncodingDecodingSupported(800, 480, BITRATE_800x480)) {
+                return new Pair<Integer, Integer>(800, 480);
+            }
+        }
+        if (!isConcurrentEncodingDecodingSupported(codecInfo.mMaxW, codecInfo.mMaxH,
+                codecInfo.mBitRate)) {
+            fail("should work with advertised resolution");
+        }
+        return new Pair<Integer, Integer>(maxW, maxH);
+    }
+
+    private boolean isConcurrentEncodingDecodingSupported(int w, int h, int bitRate) {
+        MediaCodec decoder = null;
+        OutputSurface decodingSurface = null;
+        MediaCodec encoder = null;
+        Surface encodingSurface = null;
+        try {
+            decoder = MediaCodec.createDecoderByType(MIME_TYPE);
+            MediaFormat decoderFormat = MediaFormat.createVideoFormat(MIME_TYPE, w, h);
+            decodingSurface = new OutputSurface(w, h);
+            decodingSurface.makeCurrent();
+            decoder.configure(decoderFormat, decodingSurface.getSurface(), null, 0);
+            decoder.start();
+
+            MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, w, h);
+            format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                    MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+            format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
+            format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+            format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+            encoder = MediaCodec.createEncoderByType(MIME_TYPE);;
+            encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            encodingSurface = encoder.createInputSurface();
+            encoder.start();
+
+            encoder.stop();
+            decoder.stop();
+        } catch (Exception e) {
+            e.printStackTrace();
+            Log.i(TAG, "This H/W does not support w:" + w + " h:" + h);
+            return false;
+        } finally {
+            if (encodingSurface != null) {
+                encodingSurface.release();
+            }
+            if (encoder != null) {
+                encoder.release();
+            }
+            if (decoder != null) {
+                decoder.release();
+            }
+            if (decodingSurface != null) {
+                decodingSurface.release();
+            }
+        }
+        return true;
+    }
+
+    private static void runOnMain(Runnable runner) {
+        sHandlerForRunOnMain.post(runner);
+    }
+
+    private static void runOnMainSync(Runnable runner) {
+        SyncRunnable sr = new SyncRunnable(runner);
+        sHandlerForRunOnMain.post(sr);
+        sr.waitForComplete();
+    }
+
+    private static final class SyncRunnable implements Runnable {
+        private final Runnable mTarget;
+        private boolean mComplete;
+
+        public SyncRunnable(Runnable target) {
+            mTarget = target;
+        }
+
+        public void run() {
+            mTarget.run();
+            synchronized (this) {
+                mComplete = true;
+                notifyAll();
+            }
+        }
+
+        public void waitForComplete() {
+            synchronized (this) {
+                while (!mComplete) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        //ignore
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/InputSurface.java b/tests/tests/media/src/android/media/cts/InputSurface.java
index 8d5c133..5d72979 100644
--- a/tests/tests/media/src/android/media/cts/InputSurface.java
+++ b/tests/tests/media/src/android/media/cts/InputSurface.java
@@ -38,11 +38,10 @@
     private static final boolean VERBOSE = false;
 
     private static final int EGL_RECORDABLE_ANDROID = 0x3142;
-    private static final int EGL_OPENGL_ES2_BIT = 4;
 
-    private EGLDisplay mEGLDisplay;
-    private EGLContext mEGLContext;
-    private EGLSurface mEGLSurface;
+    private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+    private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+    private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
 
     private Surface mSurface;
 
@@ -72,13 +71,13 @@
             throw new RuntimeException("unable to initialize EGL14");
         }
 
-        // Configure EGL for pbuffer and OpenGL ES 2.0.  We want enough RGB bits
-        // to be able to tell if the frame is reasonable.
+        // Configure EGL for recordable and OpenGL ES 2.0.  We want enough RGB bits
+        // to minimize artifacts from possible YUV conversion.
         int[] attribList = {
                 EGL14.EGL_RED_SIZE, 8,
                 EGL14.EGL_GREEN_SIZE, 8,
                 EGL14.EGL_BLUE_SIZE, 8,
-                EGL14.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
                 EGL_RECORDABLE_ANDROID, 1,
                 EGL14.EGL_NONE
         };
@@ -118,21 +117,18 @@
      * Surface that was passed to our constructor.
      */
     public void release() {
-        if (EGL14.eglGetCurrentContext().equals(mEGLContext)) {
-            // Clear the current context and surface to ensure they are discarded immediately.
-            EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
-                    EGL14.EGL_NO_CONTEXT);
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+            EGL14.eglReleaseThread();
+            EGL14.eglTerminate(mEGLDisplay);
         }
-        EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
-        EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
-        //EGL14.eglTerminate(mEGLDisplay);
 
         mSurface.release();
 
-        // null everything out so future attempts to use this object will cause an NPE
-        mEGLDisplay = null;
-        mEGLContext = null;
-        mEGLSurface = null;
+        mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+        mEGLContext = EGL14.EGL_NO_CONTEXT;
+        mEGLSurface = EGL14.EGL_NO_SURFACE;
 
         mSurface = null;
     }
@@ -146,6 +142,13 @@
         }
     }
 
+    public void makeUnCurrent() {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE,
+                EGL14.EGL_NO_CONTEXT)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
     /**
      * Calls eglSwapBuffers.  Use this to "publish" the current frame.
      */
@@ -161,6 +164,24 @@
     }
 
     /**
+     * Queries the surface's width.
+     */
+    public int getWidth() {
+        int[] value = new int[1];
+        EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_WIDTH, value, 0);
+        return value[0];
+    }
+
+    /**
+     * Queries the surface's height.
+     */
+    public int getHeight() {
+        int[] value = new int[1];
+        EGL14.eglQuerySurface(mEGLDisplay, mEGLSurface, EGL14.EGL_HEIGHT, value, 0);
+        return value[0];
+    }
+
+    /**
      * Sends the presentation time stamp to EGL.  Time is expressed in nanoseconds.
      */
     public void setPresentationTime(long nsecs) {
@@ -171,14 +192,9 @@
      * Checks for EGL errors.
      */
     private void checkEglError(String msg) {
-        boolean failed = false;
         int error;
-        while ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
-            Log.e(TAG, msg + ": EGL error: 0x" + Integer.toHexString(error));
-            failed = true;
-        }
-        if (failed) {
-            throw new RuntimeException("EGL error encountered (see log)");
+        if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
         }
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
index b75a635..a902497 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecCapabilitiesTest.java
@@ -52,10 +52,10 @@
         playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
                 + "&itag=160&source=youtube&user=android-device-test"
                 + "&sparams=ip,ipbits,expire,id,itag,source,user"
-                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
-                + "&signature=341692D20FACCAE25B90EA2C131EA6ADCD8E2384."
-                + "9EB08C174BE401AAD20FB85EE4DBA51A2882BB60"
-                + "&key=test_key1", 256, 144, PLAY_TIME_MS);
+                + "&ip=0.0.0.0&ipbits=0&expire=19000000000"
+                + "&signature=9EDCA0B395B8A949C511FD5E59B9F805CFF797FD."
+                + "702DE9BA7AF96785FD6930AD2DD693A0486C880E"
+                + "&key=ik0", 256, 144, PLAY_TIME_MS);
     }
 
     public void testAvcBaseline30() throws Exception {
@@ -67,10 +67,10 @@
         playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
                 + "&itag=18&source=youtube&user=android-device-test"
                 + "&sparams=ip,ipbits,expire,id,itag,source,user"
-                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
-                + "&signature=8701A45F6422229D46ABB25A22E2C00C94024606."
-                + "08BCDF16C3F744C49D4C8A8AD1C38B3DC1810918"
-                + "&key=test_key1", 640, 360, PLAY_TIME_MS);
+                + "&ip=0.0.0.0&ipbits=0&expire=19000000000"
+                + "&signature=7DCDE3A6594D0B91A27676A3CDC3A87B149F82EA."
+                + "7A83031734CB1EDCE06766B6228842F954927960"
+                + "&key=ik0", 640, 360, PLAY_TIME_MS);
     }
 
     public void testAvcHigh31() throws Exception {
@@ -82,11 +82,10 @@
         playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
                 + "&itag=22&source=youtube&user=android-device-test"
                 + "&sparams=ip,ipbits,expire,id,itag,source,user"
-                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
-                + "&signature=42969CA8F7FFAE432B7135BC811F96F7C4172C3F."
-                + "1A8A92EA714C1B7C98A05DDF2DE90854CDD7638B"
-                + "&key=test_key1", 1280, 720, PLAY_TIME_MS);
-
+                + "&ip=0.0.0.0&ipbits=0&expire=19000000000"
+                + "&signature=179525311196616BD8E1381759B0E5F81A9E91B5."
+                + "C4A50E44059FEBCC6BBC78E3B3A4E0E0065777"
+                + "&key=ik0", 1280, 720, PLAY_TIME_MS);
     }
 
     public void testAvcHigh40() throws Exception {
@@ -102,10 +101,10 @@
         playVideoWithRetries("http://redirector.c.youtube.com/videoplayback?id=271de9756065677e"
                 + "&itag=137&source=youtube&user=android-device-test"
                 + "&sparams=ip,ipbits,expire,id,itag,source,user"
-                + "&ip=0.0.0.0&ipbits=0&expire=999999999999999999"
-                + "&signature=2C836E04C4DDC98649CD44C8B91813D98342D1D1."
-                + "870A848D54CA08C197E5FDC34ED45E6ED7DB5CDA"
-                + "&key=test_key1", 1920, 1080, PLAY_TIME_MS);
+                + "&ip=0.0.0.0&ipbits=0&expire=19000000000"
+                + "&signature=B0976085596DD42DEA3F08307F76587241CB132B."
+                + "043B719C039E8B92F45391ADC0BE3665E2332930"
+                + "&key=ik0", 1920, 1080, PLAY_TIME_MS);
     }
 
     private boolean supports(String mimeType, int profile, int level) {
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecListTest.java b/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
index 0973c1a..3428e86 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecListTest.java
@@ -241,6 +241,7 @@
         list.add(new CodecType("video/3gpp", true));            // h263 encoder
         list.add(new CodecType("video/mp4v-es", false));        // m4v decoder
         list.add(new CodecType("video/x-vnd.on2.vp8", false));  // vp8 decoder
+        list.add(new CodecType("video/x-vnd.on2.vp9", false));  // vp9 decoder
 
         return list;
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaCodecTest.java b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
index afa34e8..4b8abcd 100644
--- a/tests/tests/media/src/android/media/cts/MediaCodecTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaCodecTest.java
@@ -16,32 +16,59 @@
 
 package android.media.cts;
 
+import com.android.cts.media.R;
+
+import android.content.res.AssetFileDescriptor;
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecList;
+import android.media.MediaExtractor;
 import android.media.MediaFormat;
+import android.media.MediaCodecInfo.CodecCapabilities;
+import android.media.MediaCodecInfo.CodecProfileLevel;
 import android.opengl.GLES20;
 import android.test.AndroidTestCase;
 import android.util.Log;
 import android.view.Surface;
 
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 
 /**
  * General MediaCodec tests.
  *
  * In particular, check various API edge cases.
+ *
+ * <p>The file in res/raw used by testDecodeShortInput are (c) copyright 2008,
+ * Blender Foundation / www.bigbuckbunny.org, and are licensed under the Creative Commons
+ * Attribution 3.0 License at http://creativecommons.org/licenses/by/3.0/us/.
  */
 public class MediaCodecTest extends AndroidTestCase {
     private static final String TAG = "MediaCodecTest";
     private static final boolean VERBOSE = false;           // lots of logging
 
-    // parameters for the encoder
+    // parameters for the video encoder
     private static final String MIME_TYPE = "video/avc";    // H.264 Advanced Video Coding
     private static final int BIT_RATE = 2000000;            // 2Mbps
     private static final int FRAME_RATE = 15;               // 15fps
     private static final int IFRAME_INTERVAL = 10;          // 10 seconds between I-frames
     private static final int WIDTH = 1280;
     private static final int HEIGHT = 720;
+    // parameters for the audio encoder
+    private static final String MIME_TYPE_AUDIO = "audio/mp4a-latm";
+    private static final int AUDIO_SAMPLE_RATE = 44100;
+    private static final int AUDIO_AAC_PROFILE = 2; /* OMX_AUDIO_AACObjectLC */
+    private static final int AUDIO_CHANNEL_COUNT = 2; // mono
+    private static final int AUDIO_BIT_RATE = 128000;
+
+    private static final int TIMEOUT_USEC = 100000;
+    private static final int TIMEOUT_USEC_SHORT = 100;
+
+    private boolean mVideoEncoderHadError = false;
+    private boolean mAudioEncoderHadError = false;
+    private volatile boolean mVideoEncodingOngoing = false;
 
     /**
      * Tests:
@@ -60,7 +87,7 @@
         format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
 
         try {
-            encoder = MediaCodec.createByCodecName(codecInfo.getName());;
+            encoder = MediaCodec.createByCodecName(codecInfo.getName());
             try {
                 surface = encoder.createInputSurface();
                 fail("createInputSurface should not work pre-configure");
@@ -223,6 +250,407 @@
     }
 
     /**
+     * Tests whether decoding a short group-of-pictures succeeds. The test queues a few video frames
+     * then signals end-of-stream. The test fails if the decoder doesn't output the queued frames.
+     */
+    public void testDecodeShortInput() throws InterruptedException {
+        // Input buffers from this input video are queued up to and including the video frame with
+        // timestamp LAST_BUFFER_TIMESTAMP_US.
+        final int INPUT_RESOURCE_ID =
+                R.raw.video_480x360_mp4_h264_1350kbps_30fps_aac_stereo_192kbps_44100hz;
+        final long LAST_BUFFER_TIMESTAMP_US = 166666;
+
+        // The test should fail if the decoder never produces output frames for the truncated input.
+        // Time out decoding, as we have no way to query whether the decoder will produce output.
+        final int DECODING_TIMEOUT_MS = 2000;
+
+        final AtomicBoolean completed = new AtomicBoolean();
+        Thread videoDecodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                completed.set(runDecodeShortInput(INPUT_RESOURCE_ID, LAST_BUFFER_TIMESTAMP_US));
+            }
+        });
+        videoDecodingThread.start();
+        videoDecodingThread.join(DECODING_TIMEOUT_MS);
+        if (!completed.get()) {
+            throw new RuntimeException("timed out decoding to end-of-stream");
+        }
+    }
+
+    private boolean runDecodeShortInput(int inputResourceId, long lastBufferTimestampUs) {
+        final int NO_BUFFER_INDEX = -1;
+
+        OutputSurface outputSurface = null;
+        MediaExtractor mediaExtractor = null;
+        MediaCodec mediaCodec = null;
+        try {
+            outputSurface = new OutputSurface(1, 1);
+            mediaExtractor = getMediaExtractorForMimeType(inputResourceId, "video/");
+            MediaFormat mediaFormat =
+                    mediaExtractor.getTrackFormat(mediaExtractor.getSampleTrackIndex());
+            mediaCodec =
+                    MediaCodec.createDecoderByType(mediaFormat.getString(MediaFormat.KEY_MIME));
+            mediaCodec.configure(mediaFormat, outputSurface.getSurface(), null, 0);
+            mediaCodec.start();
+            boolean eos = false;
+            boolean signaledEos = false;
+            MediaCodec.BufferInfo outputBufferInfo = new MediaCodec.BufferInfo();
+            int outputBufferIndex = NO_BUFFER_INDEX;
+            while (!eos && !Thread.interrupted()) {
+                // Try to feed more data into the codec.
+                if (mediaExtractor.getSampleTrackIndex() != -1 && !signaledEos) {
+                    int bufferIndex = mediaCodec.dequeueInputBuffer(0);
+                    if (bufferIndex != NO_BUFFER_INDEX) {
+                        ByteBuffer buffer = mediaCodec.getInputBuffers()[bufferIndex];
+                        int size = mediaExtractor.readSampleData(buffer, 0);
+                        long timestampUs = mediaExtractor.getSampleTime();
+                        mediaExtractor.advance();
+                        signaledEos = mediaExtractor.getSampleTrackIndex() == -1
+                                || timestampUs == lastBufferTimestampUs;
+                        mediaCodec.queueInputBuffer(bufferIndex,
+                                0,
+                                size,
+                                timestampUs,
+                                signaledEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+                    }
+                }
+
+                // If we don't have an output buffer, try to get one now.
+                if (outputBufferIndex == NO_BUFFER_INDEX) {
+                    outputBufferIndex = mediaCodec.dequeueOutputBuffer(outputBufferInfo, 0);
+                }
+
+                if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED
+                        || outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
+                        || outputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
+                    outputBufferIndex = NO_BUFFER_INDEX;
+                } else if (outputBufferIndex != NO_BUFFER_INDEX) {
+                    eos = (outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0;
+
+                    boolean render = outputBufferInfo.size > 0;
+                    mediaCodec.releaseOutputBuffer(outputBufferIndex, render);
+                    if (render) {
+                        outputSurface.awaitNewImage();
+                    }
+
+                    outputBufferIndex = NO_BUFFER_INDEX;
+                }
+            }
+
+            return eos;
+        } catch (IOException e) {
+            throw new RuntimeException("error reading input resource", e);
+        } finally {
+            if (mediaCodec != null) {
+                mediaCodec.stop();
+                mediaCodec.release();
+            }
+            if (mediaExtractor != null) {
+                mediaExtractor.release();
+            }
+            if (outputSurface != null) {
+                outputSurface.release();
+            }
+        }
+    }
+
+    /**
+     * Tests creating two decoders for {@link #MIME_TYPE_AUDIO} at the same time.
+     */
+    public void testCreateTwoAudioDecoders() {
+        final MediaFormat format = MediaFormat.createAudioFormat(
+                MIME_TYPE_AUDIO, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL_COUNT);
+
+        MediaCodec audioDecoderA = null;
+        MediaCodec audioDecoderB = null;
+        try {
+            audioDecoderA = MediaCodec.createDecoderByType(MIME_TYPE_AUDIO);
+            audioDecoderA.configure(format, null, null, 0);
+            audioDecoderA.start();
+
+            audioDecoderB = MediaCodec.createDecoderByType(MIME_TYPE_AUDIO);
+            audioDecoderB.configure(format, null, null, 0);
+            audioDecoderB.start();
+        } finally {
+            if (audioDecoderB != null) {
+                try {
+                    audioDecoderB.stop();
+                    audioDecoderB.release();
+                } catch (RuntimeException e) {
+                    Log.w(TAG, "exception stopping/releasing codec", e);
+                }
+            }
+
+            if (audioDecoderA != null) {
+                try {
+                    audioDecoderA.stop();
+                    audioDecoderA.release();
+                } catch (RuntimeException e) {
+                    Log.w(TAG, "exception stopping/releasing codec", e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Tests creating an encoder and decoder for {@link #MIME_TYPE_AUDIO} at the same time.
+     */
+    public void testCreateAudioDecoderAndEncoder() {
+        final MediaFormat encoderFormat = MediaFormat.createAudioFormat(
+                MIME_TYPE_AUDIO, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL_COUNT);
+        encoderFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, AUDIO_AAC_PROFILE);
+        encoderFormat.setInteger(MediaFormat.KEY_BIT_RATE, AUDIO_BIT_RATE);
+        final MediaFormat decoderFormat = MediaFormat.createAudioFormat(
+                MIME_TYPE_AUDIO, AUDIO_SAMPLE_RATE, AUDIO_CHANNEL_COUNT);
+
+        MediaCodec audioEncoder = null;
+        MediaCodec audioDecoder = null;
+        try {
+            audioEncoder = MediaCodec.createEncoderByType(MIME_TYPE_AUDIO);
+            audioEncoder.configure(encoderFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            audioEncoder.start();
+
+            audioDecoder = MediaCodec.createDecoderByType(MIME_TYPE_AUDIO);
+            audioDecoder.configure(decoderFormat, null, null, 0);
+            audioDecoder.start();
+        } finally {
+            if (audioDecoder != null) {
+                try {
+                    audioDecoder.stop();
+                    audioDecoder.release();
+                } catch (RuntimeException e) {
+                    Log.w(TAG, "exception stopping/releasing codec", e);
+                }
+            }
+
+            if (audioEncoder != null) {
+                try {
+                    audioEncoder.stop();
+                    audioEncoder.release();
+                } catch (RuntimeException e) {
+                    Log.w(TAG, "exception stopping/releasing codec", e);
+                }
+            }
+        }
+    }
+
+    public void testConcurrentAudioVideoEncodings() throws InterruptedException {
+        final int VIDEO_NUM_SWAPS = 100;
+        // audio only checks this and stop
+        mVideoEncodingOngoing = true;
+        final CodecInfo info = getAvcSupportedFormatInfo();
+        long start = System.currentTimeMillis();
+        Thread videoEncodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                runVideoEncoding(VIDEO_NUM_SWAPS, info);
+            }
+        });
+        Thread audioEncodingThread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                runAudioEncoding();
+            }
+        });
+        videoEncodingThread.start();
+        audioEncodingThread.start();
+        videoEncodingThread.join();
+        mVideoEncodingOngoing = false;
+        audioEncodingThread.join();
+        assertFalse("Video encoding error. Chekc logcat", mVideoEncoderHadError);
+        assertFalse("Audio encoding error. Chekc logcat", mAudioEncoderHadError);
+        long end = System.currentTimeMillis();
+        Log.w(TAG, "Concurrent AV encoding took " + (end - start) + " ms for " + VIDEO_NUM_SWAPS +
+                " video frames");
+    }
+
+    private static class CodecInfo {
+        public int mMaxW;
+        public int mMaxH;
+        public int mFps;
+        public int mBitRate;
+    };
+
+    private static CodecInfo getAvcSupportedFormatInfo() {
+        MediaCodecInfo mediaCodecInfo = selectCodec(MIME_TYPE);
+        CodecCapabilities cap = mediaCodecInfo.getCapabilitiesForType(MIME_TYPE);
+        if (cap == null) { // not supported
+            return null;
+        }
+        CodecInfo info = new CodecInfo();
+        int highestLevel = 0;
+        for (CodecProfileLevel lvl : cap.profileLevels) {
+            if (lvl.level > highestLevel) {
+                highestLevel = lvl.level;
+            }
+        }
+        int maxW = 0;
+        int maxH = 0;
+        int bitRate = 0;
+        int fps = 0; // frame rate for the max resolution
+        switch(highestLevel) {
+            // Do not support Level 1 to 2.
+            case CodecProfileLevel.AVCLevel1:
+            case CodecProfileLevel.AVCLevel11:
+            case CodecProfileLevel.AVCLevel12:
+            case CodecProfileLevel.AVCLevel13:
+            case CodecProfileLevel.AVCLevel1b:
+            case CodecProfileLevel.AVCLevel2:
+                return null;
+            case CodecProfileLevel.AVCLevel21:
+                maxW = 352;
+                maxH = 576;
+                bitRate = 4000000;
+                fps = 25;
+                break;
+            case CodecProfileLevel.AVCLevel22:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 4000000;
+                fps = 15;
+                break;
+            case CodecProfileLevel.AVCLevel3:
+                maxW = 720;
+                maxH = 480;
+                bitRate = 10000000;
+                fps = 30;
+                break;
+            case CodecProfileLevel.AVCLevel31:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 14000000;
+                fps = 30;
+                break;
+            case CodecProfileLevel.AVCLevel32:
+                maxW = 1280;
+                maxH = 720;
+                bitRate = 20000000;
+                fps = 60;
+                break;
+            case CodecProfileLevel.AVCLevel4: // only try up to 1080p
+            default:
+                maxW = 1920;
+                maxH = 1080;
+                bitRate = 20000000;
+                fps = 30;
+                break;
+        }
+        info.mMaxW = maxW;
+        info.mMaxH = maxH;
+        info.mFps = fps;
+        info.mBitRate = bitRate;
+        Log.i(TAG, "AVC Level 0x" + Integer.toHexString(highestLevel) + " bit rate " + bitRate +
+                " fps " + info.mFps + " w " + maxW + " h " + maxH);
+
+        return info;
+    }
+
+    private void runVideoEncoding(int numSwap, CodecInfo info) {
+        MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, info.mMaxW, info.mMaxH);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, info.mBitRate);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, info.mFps);
+        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
+        MediaCodec encoder = null;
+        InputSurface inputSurface = null;
+        mVideoEncoderHadError = false;
+        try {
+            encoder = MediaCodec.createEncoderByType(MIME_TYPE);
+            encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            inputSurface = new InputSurface(encoder.createInputSurface());
+            inputSurface.makeCurrent();
+            MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
+            encoder.start();
+            for (int i = 0; i < numSwap; i++) {
+                GLES20.glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
+                GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+                inputSurface.swapBuffers();
+                // dequeue buffers until not available
+                int index = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC);
+                while (index >= 0) {
+                    encoder.releaseOutputBuffer(index, false);
+                    // just throw away output
+                    // allow shorter wait for 2nd round to move on quickly.
+                    index = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_USEC_SHORT);
+                }
+            }
+            encoder.signalEndOfInputStream();
+        } catch (Throwable e) {
+            Log.w(TAG, "runVideoEncoding got error: " + e);
+            mVideoEncoderHadError = true;
+        } finally {
+            if (encoder != null) {
+                encoder.stop();
+                encoder.release();
+            }
+            if (inputSurface != null) {
+                inputSurface.release();
+            }
+        }
+    }
+
+    private void runAudioEncoding() {
+        MediaFormat format = MediaFormat.createAudioFormat(MIME_TYPE_AUDIO, AUDIO_SAMPLE_RATE,
+                AUDIO_CHANNEL_COUNT);
+        format.setInteger(MediaFormat.KEY_AAC_PROFILE, AUDIO_AAC_PROFILE);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, AUDIO_BIT_RATE);
+        MediaCodec encoder = null;
+        mAudioEncoderHadError = false;
+        try {
+            encoder = MediaCodec.createEncoderByType(MIME_TYPE_AUDIO);
+            encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
+            MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
+            encoder.start();
+            ByteBuffer[] inputBuffers = encoder.getInputBuffers();
+            ByteBuffer source = ByteBuffer.allocate(inputBuffers[0].capacity());
+            for (int i = 0; i < source.capacity()/2; i++) {
+                source.putShort((short)i);
+            }
+            source.rewind();
+            int currentInputBufferIndex = 0;
+            long encodingLatencySum = 0;
+            int totalEncoded = 0;
+            int numRepeat = 0;
+            while (mVideoEncodingOngoing) {
+                numRepeat++;
+                int inputIndex = encoder.dequeueInputBuffer(TIMEOUT_USEC);
+                while (inputIndex == -1) {
+                    inputIndex = encoder.dequeueInputBuffer(TIMEOUT_USEC);
+                }
+                ByteBuffer inputBuffer = inputBuffers[inputIndex];
+                inputBuffer.rewind();
+                inputBuffer.put(source);
+                long start = System.currentTimeMillis();
+                totalEncoded += inputBuffers[inputIndex].limit();
+                encoder.queueInputBuffer(inputIndex, 0, inputBuffer.limit(), 0, 0);
+                source.rewind();
+                int index = encoder.dequeueOutputBuffer(info, TIMEOUT_USEC);
+                long end = System.currentTimeMillis();
+                encodingLatencySum += (end - start);
+                while (index >= 0) {
+                    encoder.releaseOutputBuffer(index, false);
+                    // just throw away output
+                    // allow shorter wait for 2nd round to move on quickly.
+                    index = encoder.dequeueOutputBuffer(info, TIMEOUT_USEC_SHORT);
+                }
+            }
+            Log.w(TAG, "Audio encoding average latency " + encodingLatencySum / numRepeat +
+                    " ms for average write size " + totalEncoded / numRepeat +
+                    " total latency " + encodingLatencySum + " ms for total bytes " + totalEncoded);
+        } catch (Throwable e) {
+            Log.w(TAG, "runAudioEncoding got error: " + e);
+            mAudioEncoderHadError = true;
+        } finally {
+            if (encoder != null) {
+                encoder.stop();
+                encoder.release();
+            }
+        }
+    }
+
+    /**
      * Creates a MediaFormat with the basic set of values.
      */
     private static MediaFormat createMediaFormat() {
@@ -273,4 +701,29 @@
         fail("couldn't find a good color format for " + codecInfo.getName() + " / " + MIME_TYPE);
         return 0;   // not reached
     }
+
+    private MediaExtractor getMediaExtractorForMimeType(int resourceId, String mimeTypePrefix)
+            throws IOException {
+        MediaExtractor mediaExtractor = new MediaExtractor();
+        AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(resourceId);
+        try {
+            mediaExtractor.setDataSource(
+                    afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
+        } finally {
+            afd.close();
+        }
+        int trackIndex;
+        for (trackIndex = 0; trackIndex < mediaExtractor.getTrackCount(); trackIndex++) {
+            MediaFormat trackMediaFormat = mediaExtractor.getTrackFormat(trackIndex);
+            if (trackMediaFormat.getString(MediaFormat.KEY_MIME).startsWith(mimeTypePrefix)) {
+                mediaExtractor.selectTrack(trackIndex);
+                break;
+            }
+        }
+        if (trackIndex == mediaExtractor.getTrackCount()) {
+            throw new IllegalStateException("couldn't get a video track");
+        }
+
+        return mediaExtractor;
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
index a8131bf..a09d368 100644
--- a/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaDrmMockTest.java
@@ -58,6 +58,22 @@
         }
     }
 
+    public void testIsMimeTypeSupported() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+        String mimeType = "video/mp4";
+        assertTrue(MediaDrm.isCryptoSchemeSupported(mockScheme, mimeType));
+    }
+
+    public void testIsMimeTypeNotSupported() throws Exception {
+        if (!isMockPluginInstalled()) {
+            return;
+        }
+        String mimeType = "video/foo";
+        assertFalse(MediaDrm.isCryptoSchemeSupported(mockScheme, mimeType));
+    }
+
     public void testMediaDrmConstructorFails() throws Exception {
         if (!isMockPluginInstalled()) {
             return;
@@ -290,7 +306,7 @@
 
         assertTrue(Arrays.equals(initData, md.getPropertyByteArray("mock-initdata")));
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
-        assertTrue(md.getPropertyString("mock-keytype").equals("2"));
+        assertTrue(md.getPropertyString("mock-keytype").equals("0"));
 
         md.closeSession(sessionId);
     }
@@ -317,7 +333,7 @@
         assertTrue(request.getDefaultUrl().equals(testDefaultUrl));
 
         assertTrue(mimeType.equals(md.getPropertyString("mock-mimetype")));
-        assertTrue(md.getPropertyString("mock-keytype").equals("3"));
+        assertTrue(md.getPropertyString("mock-keytype").equals("2"));
 
         md.closeSession(sessionId);
     }
diff --git a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
index 42ae7a7..9cad011 100644
--- a/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaMuxerTest.java
@@ -38,6 +38,11 @@
     private static final String TAG = "MediaMuxerTest";
     private static final boolean VERBOSE = false;
     private static final int MAX_SAMPLE_SIZE = 256 * 1024;
+    private static final float LATITUDE = 0.0000f;
+    private static final float LONGITUDE  = -180.0f;
+    private static final float BAD_LATITUDE = 91.0f;
+    private static final float BAD_LONGITUDE = -181.0f;
+    private static final float TOLERANCE = 0.0002f;
     private Resources mResources;
 
     @Override
@@ -189,6 +194,25 @@
         if (degrees >= 0) {
             muxer.setOrientationHint(degrees);
         }
+
+        // Test setLocation out of bound cases
+        try {
+            muxer.setLocation(BAD_LATITUDE, LONGITUDE);
+            fail("setLocation succeeded with bad argument: [" + BAD_LATITUDE + "," + LONGITUDE
+                    + "]");
+        } catch (IllegalArgumentException e) {
+            // Expected
+        }
+        try {
+            muxer.setLocation(LATITUDE, BAD_LONGITUDE);
+            fail("setLocation succeeded with bad argument: [" + LATITUDE + "," + BAD_LONGITUDE
+                    + "]");
+        } catch (IllegalArgumentException e) {
+            // Expected
+        }
+
+        muxer.setLocation(LATITUDE, LONGITUDE);
+
         muxer.start();
         while (!sawEOS) {
             bufferInfo.offset = offset;
@@ -235,6 +259,7 @@
         try {
             cloneMediaUsingMuxer(srcMedia, outputMediaFile, expectedTrackCount, degrees);
             verifyAttributesMatch(srcMedia, outputMediaFile, degrees);
+            verifyLocationInFile(outputMediaFile);
             // Check the sample on 1s and 0.5s.
             verifySamplesMatch(srcMedia, outputMediaFile, 1000000);
             verifySamplesMatch(srcMedia, outputMediaFile, 500000);
@@ -337,5 +362,32 @@
             fail("byteBuffer didn't match");
         }
     }
+
+    private void verifyLocationInFile(String fileName) {
+        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+        retriever.setDataSource(fileName);
+        String location = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_LOCATION);
+        assertNotNull("No location information found in file " + fileName, location);
+
+        // parsing String location and recover the location inforamtion in floats
+        // Make sure the tolerance is very small - due to rounding errors.
+
+        // Get the position of the -/+ sign in location String, which indicates
+        // the beginning of the longtitude.
+        int index = location.lastIndexOf('-');
+        if (index == -1) {
+            index = location.lastIndexOf('+');
+        }
+        assertTrue("+ or - is not found", index != -1);
+        assertTrue("+ or - is only found at the beginning", index != 0);
+        float latitude = Float.parseFloat(location.substring(0, index - 1));
+        float longitude = Float.parseFloat(location.substring(index));
+        assertTrue("Incorrect latitude: " + latitude,
+                Math.abs(latitude - LATITUDE) <= TOLERANCE);
+        assertTrue("Incorrect longitude: " + longitude,
+                Math.abs(longitude - LONGITUDE) <= TOLERANCE);
+        retriever.release();
+    }
+
 }
 
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
index 10a563c..8063cbb 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerFlakyNetworkTest.java
@@ -63,7 +63,7 @@
         releaseHttpServer();
         super.tearDown();
     }
-/* disable the whole tests until someone could fix it.
+
     public void test_S0P0() throws Throwable {
         doPlayStreams(0, 0);
     }
@@ -91,7 +91,7 @@
     public void test_S6P00002() throws Throwable {
         doPlayStreams(6, 0.00002f);
     }
-*/
+
    private void doPlayStreams(int seed, float probability) throws Throwable {
         Random random = new Random(seed);
         createHttpServer(seed, probability);
@@ -309,8 +309,7 @@
                     try {
                         float random = mRandom.nextFloat();
                         if (random < probability) {
-                            // TODO restore 1000 to 6000 after fixing 6770717
-                            int sleepTimeMs = 1000 + mRandom.nextInt(500);
+                            int sleepTimeMs = 1000 + mRandom.nextInt(5000);
                             Thread.sleep(sleepTimeMs);
                             flush();
                         } else if (random < probability * 100) {
diff --git a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
index 35d3f3c..8e9bc29 100644
--- a/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaPlayerTest.java
@@ -227,6 +227,38 @@
         }
     }
 
+    public void testSetNextMediaPlayerWithReset() throws Exception {
+
+        initMediaPlayer(mMediaPlayer);
+
+        try {
+            initMediaPlayer(mMediaPlayer2);
+            mMediaPlayer2.reset();
+            mMediaPlayer.setNextMediaPlayer(mMediaPlayer2);
+            fail("setNextMediaPlayer() succeeded with unprepared player");
+        } catch (RuntimeException e) {
+            // expected
+        } finally {
+            mMediaPlayer.reset();
+        }
+    }
+
+    public void testSetNextMediaPlayerWithRelease() throws Exception {
+
+        initMediaPlayer(mMediaPlayer);
+
+        try {
+            initMediaPlayer(mMediaPlayer2);
+            mMediaPlayer2.release();
+            mMediaPlayer.setNextMediaPlayer(mMediaPlayer2);
+            fail("setNextMediaPlayer() succeeded with unprepared player");
+        } catch (RuntimeException e) {
+            // expected
+        } finally {
+            mMediaPlayer.reset();
+        }
+    }
+
     public void testSetNextMediaPlayer() throws Exception {
         initMediaPlayer(mMediaPlayer);
 
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
index c13f041..a20e874 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerNotificationTest.java
@@ -19,6 +19,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.Uri;
+import android.os.Bundle;
 import android.os.Environment;
 import android.test.AndroidTestCase;
 
@@ -47,8 +48,12 @@
         String [] temps = new String[] { "avi", "gif", "jpg", "dat", "mp3", "mp4", "txt" };
         String tmpPath = createTempFiles(temps);
 
-        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
-                + Environment.getExternalStorageDirectory())));
+        Bundle args = new Bundle();
+        args.putString("volume", "external");
+        Intent i = new Intent("android.media.IMediaScannerService").putExtras(args);
+        i.setClassName("com.android.providers.media",
+                "com.android.providers.media.MediaScannerService");
+        mContext.startService(i);
 
         startedReceiver.waitForBroadcast();
         finishedReceiver.waitForBroadcast();
@@ -64,8 +69,7 @@
         }
         startedReceiver.reset();
         finishedReceiver.reset();
-        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
-                + Environment.getExternalStorageDirectory())));
+        mContext.startService(i);
         startedReceiver.waitForBroadcast();
         finishedReceiver.waitForBroadcast();
 
@@ -76,8 +80,7 @@
         // scan one more time just to clean everything up nicely
         startedReceiver.reset();
         finishedReceiver.reset();
-        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
-                + Environment.getExternalStorageDirectory())));
+        mContext.startService(i);
         startedReceiver.waitForBroadcast();
         finishedReceiver.waitForBroadcast();
 
diff --git a/tests/tests/media/src/android/media/cts/MediaScannerTest.java b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
index e121c52..2dafdc5 100644
--- a/tests/tests/media/src/android/media/cts/MediaScannerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaScannerTest.java
@@ -31,6 +31,7 @@
 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
 import android.mtp.MtpConstants;
 import android.net.Uri;
+import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
 import android.os.SystemClock;
@@ -57,6 +58,7 @@
         // prepare the media file.
 
         mFileDir = Environment.getExternalStorageDirectory() + "/" + getClass().getCanonicalName();
+        cleanup();
         String fileName = mFileDir + "/test" + System.currentTimeMillis() + ".mp3";
         writeFile(R.raw.testmp3, fileName);
 
@@ -75,6 +77,9 @@
     @Override
     protected void tearDown() throws Exception {
         super.tearDown();
+    }
+
+    private void cleanup() {
         if (mMediaFile != null) {
             mMediaFile.delete();
         }
@@ -90,6 +95,9 @@
             mMediaScannerConnection.disconnect();
             mMediaScannerConnection = null;
         }
+
+        mContext.getContentResolver().delete(MediaStore.Audio.Media.getContentUri("external"),
+                "_data like ?", new String[] { mFileDir + "%"});
     }
 
     public void testMediaScanner() throws InterruptedException, IOException {
@@ -292,6 +300,72 @@
         checkConnectionState(false);
     }
 
+    public void testCanonicalize() throws Exception {
+        mMediaScannerConnectionClient = new MockMediaScannerConnectionClient();
+        mMediaScannerConnection = new MockMediaScannerConnection(getContext(),
+                                    mMediaScannerConnectionClient);
+
+        assertFalse(mMediaScannerConnection.isConnected());
+
+        // start connection and wait until connected
+        mMediaScannerConnection.connect();
+        checkConnectionState(true);
+
+        // write file and scan to insert into database
+        String fileDir = Environment.getExternalStorageDirectory() + "/"
+                + getClass().getCanonicalName() + "/canonicaltest-" + System.currentTimeMillis();
+        String fileName = fileDir + "/test.mp3";
+        writeFile(R.raw.testmp3, fileName);
+        mMediaScannerConnection.scanFile(fileName, MEDIA_TYPE);
+        checkMediaScannerConnection();
+
+        // check path and uri
+        Uri uri = mMediaScannerConnectionClient.mediaUri;
+        String path = mMediaScannerConnectionClient.mediaPath;
+        assertEquals(fileName, path);
+        assertNotNull(uri);
+
+        // check canonicalization
+        ContentResolver res = mContext.getContentResolver();
+        Uri canonicalUri = res.canonicalize(uri);
+        assertNotNull(canonicalUri);
+        assertFalse(uri.equals(canonicalUri));
+        Uri uncanonicalizedUri = res.uncanonicalize(canonicalUri);
+        assertEquals(uri, uncanonicalizedUri);
+
+        // remove the entry from the database
+        assertEquals(1, res.delete(uri, null, null));
+        assertTrue(new File(path).delete());
+
+        // write same file again and scan to insert into database
+        mMediaScannerConnectionClient.reset();
+        String fileName2 = fileDir + "/test2.mp3";
+        writeFile(R.raw.testmp3, fileName2);
+        mMediaScannerConnection.scanFile(fileName2, MEDIA_TYPE);
+        checkMediaScannerConnection();
+
+        // check path and uri
+        Uri uri2 = mMediaScannerConnectionClient.mediaUri;
+        String path2 = mMediaScannerConnectionClient.mediaPath;
+        assertEquals(fileName2, path2);
+        assertNotNull(uri2);
+
+        // this should be a different entry in the database and not re-use the same database id
+        assertFalse(uri.equals(uri2));
+
+        Uri canonicalUri2 = res.canonicalize(uri2);
+        assertNotNull(canonicalUri2);
+        assertFalse(uri2.equals(canonicalUri2));
+        Uri uncanonicalizedUri2 = res.uncanonicalize(canonicalUri2);
+        assertEquals(uri2, uncanonicalizedUri2);
+
+        // uncanonicalize the original canonicalized uri, it should resolve to the new uri
+        Uri uncanonicalizedUri3 = res.uncanonicalize(canonicalUri);
+        assertEquals(uri2, uncanonicalizedUri3);
+
+        assertEquals(1, res.delete(uri2, null, null));
+        assertTrue(new File(path2).delete());
+    }
 
     private void startMediaScanAndWait() throws InterruptedException {
         ScannerNotificationReceiver finishedReceiver = new ScannerNotificationReceiver(
@@ -299,8 +373,14 @@
         IntentFilter finishedIntentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED);
         finishedIntentFilter.addDataScheme("file");
         mContext.registerReceiver(finishedReceiver, finishedIntentFilter);
-        mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
-                + Environment.getExternalStorageDirectory())));
+
+        Bundle args = new Bundle();
+        args.putString("volume", "external");
+        Intent i = new Intent("android.media.IMediaScannerService").putExtras(args);
+        i.setClassName("com.android.providers.media",
+                "com.android.providers.media.MediaScannerService");
+        mContext.startService(i);
+
         finishedReceiver.waitForBroadcast();
         mContext.unregisterReceiver(finishedReceiver);
     }
diff --git a/tests/tests/media/src/android/media/cts/OutputSurface.java b/tests/tests/media/src/android/media/cts/OutputSurface.java
index 5274627..fc8ad9c 100644
--- a/tests/tests/media/src/android/media/cts/OutputSurface.java
+++ b/tests/tests/media/src/android/media/cts/OutputSurface.java
@@ -18,24 +18,13 @@
 
 import android.graphics.SurfaceTexture;
 import android.opengl.EGL14;
-import android.opengl.GLES20;
-import android.opengl.GLES11Ext;
-import android.opengl.GLSurfaceView;
-import android.opengl.Matrix;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSurface;
 import android.util.Log;
 import android.view.Surface;
 
-import java.nio.ByteBuffer;
-
-import javax.microedition.khronos.egl.EGL10;
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.egl.EGLContext;
-import javax.microedition.khronos.egl.EGLDisplay;
-import javax.microedition.khronos.egl.EGLSurface;
-import javax.microedition.khronos.opengles.GL;
-import javax.microedition.khronos.opengles.GL10;
-
-
 
 /**
  * Holds state associated with a Surface used for MediaCodec decoder output.
@@ -56,12 +45,9 @@
     private static final String TAG = "OutputSurface";
     private static final boolean VERBOSE = false;
 
-    private static final int EGL_OPENGL_ES2_BIT = 4;
-
-    private EGL10 mEGL;
-    private EGLDisplay mEGLDisplay;
-    private EGLContext mEGLContext;
-    private EGLSurface mEGLSurface;
+    private EGLDisplay mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+    private EGLContext mEGLContext = EGL14.EGL_NO_CONTEXT;
+    private EGLSurface mEGLSurface = EGL14.EGL_NO_SURFACE;
 
     private SurfaceTexture mSurfaceTexture;
     private Surface mSurface;
@@ -88,8 +74,8 @@
     }
 
     /**
-     * Creates an OutputSurface using the current EGL context.  Creates a Surface that can be
-     * passed to MediaCodec.configure().
+     * Creates an OutputSurface using the current EGL context (rather than establishing a
+     * new one).  Creates a Surface that can be passed to MediaCodec.configure().
      */
     public OutputSurface() {
         setup();
@@ -130,35 +116,40 @@
      * Prepares EGL.  We want a GLES 2.0 context and a surface that supports pbuffer.
      */
     private void eglSetup(int width, int height) {
-        mEGL = (EGL10)EGLContext.getEGL();
-        mEGLDisplay = mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
-        if (!mEGL.eglInitialize(mEGLDisplay, null)) {
-            throw new RuntimeException("unable to initialize EGL10");
+        mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new RuntimeException("unable to get EGL14 display");
+        }
+        int[] version = new int[2];
+        if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+            mEGLDisplay = null;
+            throw new RuntimeException("unable to initialize EGL14");
         }
 
         // Configure EGL for pbuffer and OpenGL ES 2.0.  We want enough RGB bits
         // to be able to tell if the frame is reasonable.
         int[] attribList = {
-                EGL10.EGL_RED_SIZE, 8,
-                EGL10.EGL_GREEN_SIZE, 8,
-                EGL10.EGL_BLUE_SIZE, 8,
-                EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
-                EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-                EGL10.EGL_NONE
+                EGL14.EGL_RED_SIZE, 8,
+                EGL14.EGL_GREEN_SIZE, 8,
+                EGL14.EGL_BLUE_SIZE, 8,
+                EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT,
+                EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT,
+                EGL14.EGL_NONE
         };
         EGLConfig[] configs = new EGLConfig[1];
         int[] numConfigs = new int[1];
-        if (!mEGL.eglChooseConfig(mEGLDisplay, attribList, configs, 1, numConfigs)) {
-            throw new RuntimeException("unable to find RGB888+pbuffer EGL config");
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+                numConfigs, 0)) {
+            throw new RuntimeException("unable to find RGB888+recordable ES2 EGL config");
         }
 
         // Configure context for OpenGL ES 2.0.
         int[] attrib_list = {
                 EGL14.EGL_CONTEXT_CLIENT_VERSION, 2,
-                EGL10.EGL_NONE
+                EGL14.EGL_NONE
         };
-        mEGLContext = mEGL.eglCreateContext(mEGLDisplay, configs[0], EGL10.EGL_NO_CONTEXT,
-                attrib_list);
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+                attrib_list, 0);
         checkEglError("eglCreateContext");
         if (mEGLContext == null) {
             throw new RuntimeException("null context");
@@ -167,11 +158,11 @@
         // Create a pbuffer surface.  By using this for output, we can use glReadPixels
         // to test values in the output.
         int[] surfaceAttribs = {
-                EGL10.EGL_WIDTH, width,
-                EGL10.EGL_HEIGHT, height,
-                EGL10.EGL_NONE
+                EGL14.EGL_WIDTH, width,
+                EGL14.EGL_HEIGHT, height,
+                EGL14.EGL_NONE
         };
-        mEGLSurface = mEGL.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs);
+        mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs, 0);
         checkEglError("eglCreatePbufferSurface");
         if (mEGLSurface == null) {
             throw new RuntimeException("surface was null");
@@ -182,15 +173,11 @@
      * Discard all resources held by this class, notably the EGL context.
      */
     public void release() {
-        if (mEGL != null) {
-            if (mEGL.eglGetCurrentContext().equals(mEGLContext)) {
-                // Clear the current context and surface to ensure they are discarded immediately.
-                mEGL.eglMakeCurrent(mEGLDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE,
-                        EGL10.EGL_NO_CONTEXT);
-            }
-            mEGL.eglDestroySurface(mEGLDisplay, mEGLSurface);
-            mEGL.eglDestroyContext(mEGLDisplay, mEGLContext);
-            //mEGL.eglTerminate(mEGLDisplay);
+        if (mEGLDisplay != EGL14.EGL_NO_DISPLAY) {
+            EGL14.eglDestroySurface(mEGLDisplay, mEGLSurface);
+            EGL14.eglDestroyContext(mEGLDisplay, mEGLContext);
+            EGL14.eglReleaseThread();
+            EGL14.eglTerminate(mEGLDisplay);
         }
 
         mSurface.release();
@@ -199,11 +186,9 @@
         //  W BufferQueue: [unnamed-3997-2] cancelBuffer: BufferQueue has been abandoned!
         //mSurfaceTexture.release();
 
-        // null everything out so future attempts to use this object will cause an NPE
-        mEGLDisplay = null;
-        mEGLContext = null;
-        mEGLSurface = null;
-        mEGL = null;
+        mEGLDisplay = EGL14.EGL_NO_DISPLAY;
+        mEGLContext = EGL14.EGL_NO_CONTEXT;
+        mEGLSurface = EGL14.EGL_NO_SURFACE;
 
         mTextureRender = null;
         mSurface = null;
@@ -214,11 +199,7 @@
      * Makes our EGL context and surface current.
      */
     public void makeCurrent() {
-        if (mEGL == null) {
-            throw new RuntimeException("not configured for makeCurrent");
-        }
-        checkEglError("before makeCurrent");
-        if (!mEGL.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
             throw new RuntimeException("eglMakeCurrent failed");
         }
     }
@@ -269,6 +250,35 @@
     }
 
     /**
+     * Wait up to given timeout until new image become available.
+     * @param timeoutMs
+     * @return true if new image is available. false for no new image until timeout.
+     */
+    public boolean checkForNewImage(int timeoutMs) {
+        synchronized (mFrameSyncObject) {
+            while (!mFrameAvailable) {
+                try {
+                    // Wait for onFrameAvailable() to signal us.  Use a timeout to avoid
+                    // stalling the test if it doesn't arrive.
+                    mFrameSyncObject.wait(timeoutMs);
+                    if (!mFrameAvailable) {
+                        return false;
+                    }
+                } catch (InterruptedException ie) {
+                    // shouldn't happen
+                    throw new RuntimeException(ie);
+                }
+            }
+            mFrameAvailable = false;
+        }
+
+        // Latch the data.
+        mTextureRender.checkGlError("before updateTexImage");
+        mSurfaceTexture.updateTexImage();
+        return true;
+    }
+
+    /**
      * Draws the data from SurfaceTexture onto the current EGL surface.
      */
     public void drawImage() {
@@ -291,14 +301,9 @@
      * Checks for EGL errors.
      */
     private void checkEglError(String msg) {
-        boolean failed = false;
         int error;
-        while ((error = mEGL.eglGetError()) != EGL10.EGL_SUCCESS) {
-            Log.e(TAG, msg + ": EGL error: 0x" + Integer.toHexString(error));
-            failed = true;
-        }
-        if (failed) {
-            throw new RuntimeException("EGL error encountered (see log)");
+        if ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            throw new RuntimeException(msg + ": EGL error: 0x" + Integer.toHexString(error));
         }
     }
 }
diff --git a/tests/tests/media/src/android/media/cts/PresentationSyncTest.java b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
new file mode 100644
index 0000000..ac86f1e
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
@@ -0,0 +1,467 @@
+/*
+ * Copyright (C) 2013 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 android.media.cts;
+
+import android.opengl.GLES20;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Trace;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.Suppress;
+import android.util.Log;
+import android.view.Choreographer;
+import android.view.SurfaceHolder;
+
+
+/**
+ * Tests synchronized frame presentation.
+ *
+ * SurfaceFlinger allows a "desired presentation time" value to be passed along with buffers of
+ * data.  This exercises that feature.
+ */
+public class PresentationSyncTest extends ActivityInstrumentationTestCase2<MediaStubActivity>
+        implements SurfaceHolder.Callback {
+    private static final String TAG = "PresentationSyncTest";
+    private static final boolean VERBOSE = false;           // lots of logging
+    private static final int FRAME_COUNT = 128;             // ~2 sec @ 60fps
+
+    // message values
+    private static final int START_TEST = 0;
+    private static final int END_TEST = 1;
+
+    // width and height of the Surface we're given to draw on
+    private int mWidth;
+    private int mHeight;
+
+    public PresentationSyncTest() {
+        super(MediaStubActivity.class);
+    }
+
+    /**
+     * Tests whether the output frame rate can be limited by the presentation time.
+     * <p>
+     * Generates and displays the same series of images three times.  The first run uses "now"
+     * as the desired presentation time to establish an estimate of the refresh time.  Later
+     * runs set the presentation time to (start_time + frame_number * refresh_time * multiplier),
+     * with the expectation that a multiplier of 2 will cause the animation to render at
+     * half speed.
+     * <p>
+     * This test does not use Choreographer.  The longer the test runs, the farther out of
+     * phase the test will become with respect to the actual vsync timing.
+     * <p>
+     * Setting the presentation time for a frame is most easily done through an EGL extension,
+     * so we render each frame through GL.
+     *
+     * @throws Exception
+     */
+    public void testThroughput() throws Exception {
+        // Get the Surface from the SurfaceView.
+        // TODO: is it safe to assume that it's ready?
+        SurfaceHolder holder = getActivity().getSurfaceHolder();
+        holder.addCallback(this);
+
+        // We use the width/height to render a simple series of patterns.  If we get this
+        // wrong it shouldn't really matter -- some driver optimizations might make things
+        // faster, but it shouldn't affect how long it takes the frame to be displayed.
+        //
+        // We can get this from the View or from the EGLSurface.  We don't have easy direct
+        // access to any of those things, so just ask our InputSurface to get it from EGL,
+        // since that's where we're drawing.
+        //
+        // Note: InputSurface was intended for a different purpose, but it's 99% right for our
+        // needs.  Maybe rename it to "RecordableSurface"?  Or trivially wrap it with a
+        // subclass that suppresses the EGL_RECORDABLE_ANDROID flag?
+        InputSurface output = new InputSurface(holder.getSurface());
+        mWidth = output.getWidth();
+        mHeight = output.getHeight();
+        Log.d(TAG, "Surface w=" + mWidth + " h=" + mHeight);
+        output.makeCurrent();
+
+        // Run a test with no presentation times specified.  Assuming nothing else is
+        // fighting us for resources, all frames should display as quickly as possible,
+        // and we can estimate the refresh rate of the device.
+        long baseTimeNsec = runThroughputTest(output, 0L, -1.0f);
+        long refreshNsec = baseTimeNsec / FRAME_COUNT;
+        Log.i(TAG, "Using " + refreshNsec + "ns as refresh rate");
+
+        // Run tests with times specified, at 1.3x, 1x, 1/2x, and 1/4x speed.
+        //
+        // One particular device is overly aggressive at reducing clock frequencies, and it
+        // will slow things to the point where we can't push frames quickly enough in the
+        // faster test.  By adding an artificial workload in a second thread we can make the
+        // system run faster.  (This could have a detrimental effect on a single-core CPU,
+        // so it's a no-op there.)
+        CpuWaster cpuWaster = new CpuWaster();
+        try {
+            cpuWaster.start();
+            runThroughputTest(output, refreshNsec, 0.75f);
+            cpuWaster.stop();
+            runThroughputTest(output, refreshNsec, 1.0f);
+            runThroughputTest(output, refreshNsec, 2.0f);
+            runThroughputTest(output, refreshNsec, 4.0f);
+        } finally {
+            cpuWaster.stop();
+        }
+
+        output.release();
+    }
+
+    /**
+     * Runs the throughput test on the provided surface with the specified time values.
+     * <p>
+     * If mult is -1, the test runs in "training" mode, rendering frames as quickly as
+     * possible.  This can be used to establish a baseline.
+     * <p>
+     * @return the test duration, in nanoseconds
+     */
+    private long runThroughputTest(InputSurface output, long frameTimeNsec, float mult) {
+        Log.d(TAG, "runThroughputTest: " + mult);
+
+        // Sleep briefly.  This is strangely necessary on some devices to allow the GPU to
+        // catch up (b/10898363).  It also provides an easily-visible break in the systrace
+        // output.
+        try { Thread.sleep(50); }
+        catch (InterruptedException ignored) {}
+
+        long startNsec = System.nanoTime();
+        long showNsec = 0;
+
+        if (true) {
+            // Output a frame that creates a "marker" in the --latency output
+            drawFrame(0, mult);
+            output.setPresentationTime(startNsec - 16700000L * 100);
+            Trace.beginSection("TEST BEGIN");
+            output.swapBuffers();
+            Trace.endSection();
+            startNsec = System.nanoTime();
+        }
+
+        for (int frameNum = 0; frameNum < FRAME_COUNT; frameNum++) {
+            if (mult != -1.0f) {
+                showNsec = startNsec + (long) (frameNum * frameTimeNsec * mult);
+            }
+            drawFrame(frameNum, mult);
+            output.setPresentationTime(showNsec);
+            Trace.beginSection("swapbuf " + frameNum);
+            output.swapBuffers();
+            Trace.endSection();
+        }
+
+        long endNsec = System.nanoTime();
+        long actualNsec = endNsec - startNsec;
+
+        if (mult != -1) {
+            // Some variation is inevitable, but we should be within a few percent of expected.
+            long expectedNsec = (long) (frameTimeNsec * FRAME_COUNT * mult);
+            long deltaNsec = Math.abs(expectedNsec - actualNsec);
+            double delta = (double) deltaNsec / expectedNsec;
+            final double MAX_DELTA = 0.05;
+            if (delta > MAX_DELTA) {
+                throw new RuntimeException("Time delta exceeds tolerance (" + MAX_DELTA +
+                        "): mult=" + mult + ": expected=" + expectedNsec +
+                        " actual=" + actualNsec + " p=" + delta);
+
+            } else {
+                Log.d(TAG, "mult=" + mult + ": expected=" + expectedNsec +
+                        " actual=" + actualNsec + " p=" + delta);
+            }
+        }
+        return endNsec - startNsec;
+    }
+
+
+    /**
+     * Exercises the test code, driving it off of Choreographer.  The animation is driven at
+     * full speed, but with rendering requested at a future time.  With each run the distance
+     * into the future is increased.
+     * <p>
+     * Loopers can't be reused once they quit, so it's easiest to create a new thread for
+     * each run.
+     * <p>
+     * (This isn't exactly a test -- it's primarily a way to exercise the code.  Evaluate the
+     * results with "dumpsys SurfaceFlinger --latency SurfaceView" for each multiplier.
+     * The idea is to see frames where the desired-present is as close as possible to the
+     * actual-present, while still minimizing frame-ready.  If we go too far into the future
+     * the BufferQueue will start to back up.)
+     * <p>
+     * @throws Exception
+     */
+    public void suppressed_testChoreographed() throws Throwable {
+        // Get the Surface from the SurfaceView.
+        // TODO: is it safe to assume that it's ready?
+        SurfaceHolder holder = getActivity().getSurfaceHolder();
+        holder.addCallback(this);
+
+        InputSurface output = new InputSurface(holder.getSurface());
+        mWidth = output.getWidth();
+        mHeight = output.getHeight();
+        Log.d(TAG, "Surface w=" + mWidth + " h=" + mHeight);
+
+        for (int i = 1; i < 5; i++) {
+            ChoreographedWrapper.runTest(this, output, i);
+        }
+
+        output.release();
+    }
+
+    /**
+     * Shifts the test to a new thread, so we can manage our own Looper.  Any exception
+     * thrown on the new thread is propagated to the caller.
+     */
+    private static class ChoreographedWrapper implements Runnable {
+        private final PresentationSyncTest mTest;
+        private final InputSurface mOutput;
+        private final int mFrameDelay;
+        private Throwable mThrowable;
+
+        private ChoreographedWrapper(PresentationSyncTest test, InputSurface output,
+                int frameDelay) {
+            mTest = test;
+            mOutput = output;
+            mFrameDelay = frameDelay;
+        }
+
+        @Override
+        public void run() {
+            try {
+                mTest.runChoreographedTest(mOutput, mFrameDelay);
+            } catch (Throwable th) {
+                mThrowable = th;
+            }
+        }
+
+        /** Entry point. */
+        public static void runTest(PresentationSyncTest obj, InputSurface output,
+                int frameDelay) throws Throwable {
+            ChoreographedWrapper wrapper = new ChoreographedWrapper(obj, output, frameDelay);
+            Thread th = new Thread(wrapper, "sync test");
+            th.start();
+            th.join();
+            if (wrapper.mThrowable != null) {
+                throw wrapper.mThrowable;
+            }
+        }
+    }
+
+    /**
+     * Runs the test, driven by callbacks from the Looper we define here.
+     */
+    private void runChoreographedTest(InputSurface output, int frameDelay) {
+        Log.d(TAG, "runChoreographedTest");
+
+        output.makeCurrent();
+        final ChoRunner chore = new ChoRunner(output);
+
+        Looper.prepare();
+        Handler handler = new Handler() {
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case START_TEST:
+                        Log.d(TAG, "Starting test");
+                        chore.start(this, msg.arg1 /*frameDelay*/);
+                        break;
+                    case END_TEST:
+                        Log.d(TAG, "Ending test");
+                        Looper.myLooper().quitSafely();
+                        break;
+                    default:
+                        Log.d(TAG, "unknown message " + msg.what);
+                        break;
+                }
+            }
+        };
+
+        handler.sendMessage(Message.obtain(handler, START_TEST, frameDelay, 0));
+
+        Log.d(TAG, "looping (frameDelay=" + frameDelay + ")");
+        long startNanos = System.nanoTime();
+        Trace.beginSection("TEST BEGIN fd=" + frameDelay);
+        Looper.loop();
+        Trace.endSection();
+        long durationNanos = System.nanoTime() - startNanos;
+        Log.d(TAG, "loop exiting after " + durationNanos +
+                " (" + durationNanos / FRAME_COUNT + "ns)");
+
+        output.makeUnCurrent();
+    }
+
+
+    private class ChoRunner implements Choreographer.FrameCallback {
+        private final InputSurface mOutput;
+        private int mFrameDelay;
+        private Handler mHandler;
+        private int mCurFrame;
+        private Choreographer mChocho;
+        private long mPrevFrameTimeNanos;
+        private long mFrameDiff;
+
+        public ChoRunner(InputSurface output) {
+            mOutput = output;
+        }
+
+        public void start(Handler handler, int frameDelay) {
+            mHandler = handler;
+            mFrameDelay = frameDelay;
+
+            mCurFrame = 0;
+            mChocho = Choreographer.getInstance();
+            mChocho.postFrameCallback(this);
+        }
+
+        @Override
+        public void doFrame(long frameTimeNanos) {
+            if (mPrevFrameTimeNanos != 0) {
+                // Update our vsync rate guess every frame so that, if we start with a
+                // stutter, we don't carry it for the whole test.
+                assertTrue(frameTimeNanos > mPrevFrameTimeNanos);
+                long prevDiff = frameTimeNanos - mPrevFrameTimeNanos;
+                if (mFrameDiff == 0 || mFrameDiff > prevDiff) {
+                    mFrameDiff = prevDiff;
+                    Log.d(TAG, "refresh rate approx " + mFrameDiff + "ns");
+                }
+
+                // If the current diff is >= 2x the expected frame time diff, we stuttered
+                // and need to drop a frame.  (We might even need to drop more than one
+                // frame; ignoring that for now.)
+                if (prevDiff > mFrameDiff * 1.9) {
+                    Log.d(TAG, "skip " + mCurFrame + " diff=" + prevDiff);
+                    mCurFrame++;
+                }
+            }
+            mPrevFrameTimeNanos = frameTimeNanos;
+
+            if (mFrameDiff != 0) {
+                // set desired display time to N frames in the future, rather than ASAP.
+                //
+                // Note this is a "don't open until Xmas" feature.  If vsyncs are happening
+                // at times T1, T2, T3, and we want the frame to appear onscreen when the
+                // buffers flip at T2, then we can theoretically request any time value
+                // in [T1, T2).
+                mOutput.setPresentationTime(frameTimeNanos + (mFrameDiff * mFrameDelay));
+            }
+
+            drawFrame(mCurFrame, mFrameDelay);
+            Trace.beginSection("swapbuf " + mCurFrame);
+            mOutput.swapBuffers();
+            Trace.endSection();
+
+            if (++mCurFrame < FRAME_COUNT) {
+                mChocho.postFrameCallback(this);
+            } else {
+                mHandler.sendMessage(Message.obtain(mHandler, END_TEST));
+            }
+        }
+    }
+
+    /**
+     * Draws a frame with GLES in the current context.
+     */
+    private void drawFrame(int num, float mult) {
+        num %= 64;
+        float colorVal;
+
+        if (mult > 0) {
+            colorVal = 1.0f / mult;
+        } else {
+            colorVal = 0.1f;
+        }
+
+        int startX, startY;
+        startX = (num % 16) * (mWidth / 16);
+        startY = (num / 16) * (mHeight / 4);
+        if ((num >= 16 && num < 32) || (num >= 48)) {
+            // reverse direction
+            startX = (mWidth - mWidth/16) - startX;
+        }
+
+        // clear screen
+        GLES20.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+
+        // draw rect
+        GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
+        GLES20.glScissor(startX, startY, mWidth / 16, mHeight / 4);
+        GLES20.glClearColor(colorVal, 1 - colorVal, 0.0f, 1.0f);
+        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
+        GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
+    }
+
+    @Override
+    public void surfaceCreated(SurfaceHolder holder) {
+        Log.d(TAG, "surfaceCreated");
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int width,
+            int height) {
+        // This doesn't seem to happen in practice with current test framework -- Surface is
+        // already created before we start, and the orientation is locked.
+        Log.d(TAG, "surfaceChanged f=" + format + " w=" + width + " h=" + height);
+        mWidth = width;
+        mHeight = height;
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        Log.d(TAG, "surfaceDestroyed");
+    }
+
+
+    /**
+     * Wastes CPU time.
+     * <p>
+     * The start() and stop() methods must be called from the same thread.
+     */
+    private static class CpuWaster {
+        volatile boolean mRunning = false;
+
+        public void start() {
+            if (mRunning) {
+                throw new IllegalStateException("already running");
+            }
+
+            if (Runtime.getRuntime().availableProcessors() < 2) {
+                return;
+            }
+
+            mRunning = true;
+
+            new Thread("Stupid") {
+                @Override
+                public void run() {
+                    while (mRunning) { /* spin! */ }
+                }
+            }.start();
+
+            // sleep briefly while the system re-evaluates its load (might want to spin)
+            try { Thread.sleep(10); }
+            catch (InterruptedException ignored) {}
+        }
+
+        public void stop() {
+            if (mRunning) {
+                mRunning = false;
+
+                // give the system a chance to slow back down
+                try { Thread.sleep(10); }
+                catch (InterruptedException ignored) {}
+            }
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java b/tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java
new file mode 100644
index 0000000..662cd5b
--- /dev/null
+++ b/tests/tests/media/src/android/media/cts/RemoteVirtualDisplayService.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2014 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 android.media.cts;
+
+import android.app.Presentation;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.Display;
+import android.view.Surface;
+import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
+import android.widget.ImageView;
+
+public class RemoteVirtualDisplayService extends Service {
+    private static final String TAG = "RemoteVirtualDisplayService";
+
+    /** argument: Surface, int w, int h, return none */
+    private static final int BINDER_CMD_START = IBinder.FIRST_CALL_TRANSACTION;
+    /** argument: int color, return none */
+    private static final int BINDER_CMD_RENDER = IBinder.FIRST_CALL_TRANSACTION + 1;
+    private final Handler mHandlerForRunOnMain = new Handler(Looper.getMainLooper());;
+    private IBinder mBinder;
+    private VirtualDisplayPresentation mPresentation;
+
+    @Override
+    public void onCreate() {
+        Log.i(TAG, "onCreate");
+        mBinder = new Binder() {
+            @Override
+            protected boolean onTransact(int code, Parcel data, Parcel reply,
+                    int flags) throws RemoteException {
+                switch(code) {
+                    case BINDER_CMD_START: {
+                        Surface surface = Surface.CREATOR.createFromParcel(data);
+                        int w = data.readInt();
+                        int h = data.readInt();
+                        start(surface, w, h);
+                        break;
+                    }
+                    case BINDER_CMD_RENDER: {
+                        int color = data.readInt();
+                        render(color);
+                        break;
+                    }
+                    default:
+                        Log.e(TAG, "unrecognized binder command " + code);
+                        return false;
+                }
+                return true;
+            }
+        };
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        Log.i(TAG, "onBind");
+        return mBinder;
+    }
+
+    @Override
+    public void onDestroy() {
+        Log.i(TAG, "onDestroy");
+        if (mPresentation != null) {
+            mPresentation.dismissPresentation();
+            mPresentation.destroyVirtualDisplay();
+            mPresentation = null;
+        }
+    }
+
+    private void start(Surface surface, int w, int h) {
+        Log.i(TAG, "start");
+        mPresentation = new VirtualDisplayPresentation(this, surface, w, h);
+        mPresentation.createVirtualDisplay();
+        mPresentation.createPresentation();
+    }
+
+    private void render(int color) {
+        Log.i(TAG, "render");
+        mPresentation.doRendering(color);
+    }
+
+    private class VirtualDisplayPresentation {
+        private Context mContext;
+        private Surface mSurface;
+        private int mWidth;
+        private int mHeight;
+        private final DisplayManager mDisplayManager;
+        private VirtualDisplay mVirtualDisplay;
+        private TestPresentation mPresentation;
+
+        VirtualDisplayPresentation(Context context, Surface surface, int w, int h) {
+            mContext = context;
+            mSurface = surface;
+            mWidth = w;
+            mHeight = h;
+            mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
+        }
+
+        void createVirtualDisplay() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mVirtualDisplay = mDisplayManager.createVirtualDisplay(
+                            TAG, mWidth, mHeight, 200, mSurface, 0);
+                }
+            });
+        }
+
+        void destroyVirtualDisplay() {
+            if (mVirtualDisplay != null) {
+                mVirtualDisplay.release();
+            }
+        }
+
+        void createPresentation() {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mPresentation = new TestPresentation(RemoteVirtualDisplayService.this,
+                            mVirtualDisplay.getDisplay());
+                    mPresentation.show();
+                }
+            });
+        }
+
+        void dismissPresentation() {
+            if (mPresentation != null) {
+                mPresentation.dismiss();
+            }
+        }
+
+        public void doRendering(final int color) {
+            runOnMainSync(new Runnable() {
+                @Override
+                public void run() {
+                    mPresentation.doRendering(color);
+                }
+            });
+        }
+
+        private class TestPresentation extends Presentation {
+            private ImageView mImageView;
+
+            public TestPresentation(Context outerContext, Display display) {
+                super(outerContext, display);
+                getWindow().setType(WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
+                getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
+            }
+
+            @Override
+            protected void onCreate(Bundle savedInstanceState) {
+                super.onCreate(savedInstanceState);
+                mImageView = new ImageView(getContext());
+                mImageView.setImageDrawable(new ColorDrawable(0));
+                mImageView.setLayoutParams(new LayoutParams(
+                        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
+                setContentView(mImageView);
+            }
+
+            public void doRendering(int color) {
+                mImageView.setImageDrawable(new ColorDrawable(color));
+            }
+        }
+    }
+
+    private void runOnMainSync(Runnable runner) {
+        SyncRunnable sr = new SyncRunnable(runner);
+        mHandlerForRunOnMain.post(sr);
+        sr.waitForComplete();
+    }
+
+    private static final class SyncRunnable implements Runnable {
+        private final Runnable mTarget;
+        private boolean mComplete;
+
+        public SyncRunnable(Runnable target) {
+            mTarget = target;
+        }
+
+        public void run() {
+            mTarget.run();
+            synchronized (this) {
+                mComplete = true;
+                notifyAll();
+            }
+        }
+
+        public void waitForComplete() {
+            synchronized (this) {
+                while (!mComplete) {
+                    try {
+                        wait();
+                    } catch (InterruptedException e) {
+                        //ignore
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
index ce3a9c4..dfaabb8 100644
--- a/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/RingtoneManagerTest.java
@@ -83,11 +83,6 @@
         Cursor c = mRingtoneManager.getCursor();
         assertTrue("Must have at least one ring tone available", c.getCount() > 0);
 
-        mRingtoneManager.setIncludeDrm(true);
-        assertTrue(mRingtoneManager.getIncludeDrm());
-        mRingtoneManager.setIncludeDrm(false);
-        assertFalse(mRingtoneManager.getIncludeDrm());
-
         assertNotNull(mRingtoneManager.getRingtone(0));
         assertNotNull(RingtoneManager.getRingtone(mContext, Settings.System.DEFAULT_RINGTONE_URI));
         int expectedPosition = 0;
diff --git a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
index c3ea337..4608b24 100644
--- a/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
+++ b/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
@@ -247,4 +247,36 @@
             mServer.shutdown();
         }
     }
+
+    public void testPlayHlsStream() throws Throwable {
+        localHlsTest("hls.m3u8", false, false);
+    }
+
+    public void testPlayHlsStreamWithQueryString() throws Throwable {
+        localHlsTest("hls.m3u8", true, false);
+    }
+
+    public void testPlayHlsStreamWithRedirect() throws Throwable {
+        localHlsTest("hls.m3u8", false, true);
+    }
+
+    private void localHlsTest(final String name, boolean appendQueryString, boolean redirect)
+            throws Throwable {
+        mServer = new CtsTestServer(mContext);
+        try {
+            String stream_url = null;
+            if (redirect) {
+                stream_url = mServer.getQueryRedirectingAssetUrl(name);
+            } else {
+                stream_url = mServer.getAssetUrl(name);
+            }
+            if (appendQueryString) {
+                stream_url += "?foo=bar/baz";
+            }
+
+            playLiveVideoTest(stream_url, 10);
+        } finally {
+            mServer.shutdown();
+        }
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/TextureRender.java b/tests/tests/media/src/android/media/cts/TextureRender.java
index eb4236c..4125dcf 100644
--- a/tests/tests/media/src/android/media/cts/TextureRender.java
+++ b/tests/tests/media/src/android/media/cts/TextureRender.java
@@ -16,17 +16,17 @@
 
 package android.media.cts;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
 
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.opengles.GL10;
-
+import android.graphics.Bitmap;
 import android.graphics.SurfaceTexture;
 import android.opengl.GLES11Ext;
 import android.opengl.GLES20;
-import android.opengl.GLSurfaceView;
 import android.opengl.Matrix;
 import android.util.Log;
 
@@ -44,9 +44,9 @@
     private final float[] mTriangleVerticesData = {
         // X, Y, Z, U, V
         -1.0f, -1.0f, 0, 0.f, 0.f,
-        1.0f, -1.0f, 0, 1.f, 0.f,
+         1.0f, -1.0f, 0, 1.f, 0.f,
         -1.0f,  1.0f, 0, 0.f, 1.f,
-        1.0f,  1.0f, 0, 1.f, 1.f,
+         1.0f,  1.0f, 0, 1.f, 1.f,
     };
 
     private FloatBuffer mTriangleVertices;
@@ -245,4 +245,58 @@
             throw new RuntimeException(op + ": glError " + error);
         }
     }
+
+    /**
+     * Saves the current frame to disk as a PNG image.  Frame starts from (0,0).
+     * <p>
+     * Useful for debugging.
+     */
+    public static void saveFrame(String filename, int width, int height) {
+        // glReadPixels gives us a ByteBuffer filled with what is essentially big-endian RGBA
+        // data (i.e. a byte of red, followed by a byte of green...).  We need an int[] filled
+        // with native-order ARGB data to feed to Bitmap.
+        //
+        // If we implement this as a series of buf.get() calls, we can spend 2.5 seconds just
+        // copying data around for a 720p frame.  It's better to do a bulk get() and then
+        // rearrange the data in memory.  (For comparison, the PNG compress takes about 500ms
+        // for a trivial frame.)
+        //
+        // So... we set the ByteBuffer to little-endian, which should turn the bulk IntBuffer
+        // get() into a straight memcpy on most Android devices.  Our ints will hold ABGR data.
+        // Swapping B and R gives us ARGB.  We need about 30ms for the bulk get(), and another
+        // 270ms for the color swap.
+        //
+        // Making this even more interesting is the upside-down nature of GL, which means we
+        // may want to flip the image vertically here.
+
+        ByteBuffer buf = ByteBuffer.allocateDirect(width * height * 4);
+        buf.order(ByteOrder.LITTLE_ENDIAN);
+        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
+        buf.rewind();
+
+        int pixelCount = width * height;
+        int[] colors = new int[pixelCount];
+        buf.asIntBuffer().get(colors);
+        for (int i = 0; i < pixelCount; i++) {
+            int c = colors[i];
+            colors[i] = (c & 0xff00ff00) | ((c & 0x00ff0000) >> 16) | ((c & 0x000000ff) << 16);
+        }
+
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(filename);
+            Bitmap bmp = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888);
+            bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);
+            bmp.recycle();
+        } catch (IOException ioe) {
+            throw new RuntimeException("Failed to write file " + filename, ioe);
+        } finally {
+            try {
+                if (fos != null) fos.close();
+            } catch (IOException ioe2) {
+                throw new RuntimeException("Failed to close file " + filename, ioe2);
+            }
+        }
+        Log.d(TAG, "Saved " + width + "x" + height + " frame as '" + filename + "'");
+    }
 }
diff --git a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
index 308fb98..14e4055 100644
--- a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
@@ -21,6 +21,7 @@
 import android.media.MediaCodec;
 import android.media.MediaCodecInfo.CodecCapabilities;
 import android.media.MediaFormat;
+import android.os.Bundle;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
@@ -40,8 +41,8 @@
 
     private static final String TAG = "VP8EncoderTest";
     private static final String VP8_MIME = "video/x-vnd.on2.vp8";
-    private static final String VPX_DECODER_NAME = "OMX.google.vpx.decoder";
-    private static final String VPX_ENCODER_NAME = "OMX.google.vpx.encoder";
+    private static final String VPX_DECODER_NAME = "OMX.google.vp8.decoder";
+    private static final String VPX_ENCODER_NAME = "OMX.google.vp8.encoder";
     private static final String BASIC_IVF = "video_176x144_vp8_basic.ivf";
     private static final long DEFAULT_TIMEOUT_US = 5000;
 
@@ -71,6 +72,31 @@
         decode(BASIC_IVF);
     }
 
+    /**
+     * Check if MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME is honored.
+     *
+     * At frame 15, request a sync frame. If one does not occur by EOF the
+     * encoder fails. The test does not verify the output stream.
+     */
+    public void testSyncFrame() throws Exception {
+        encodeSyncFrame(R.raw.video_176x144_yv12,
+                        176, // width
+                        144, // height
+                        30); // framerate
+    }
+
+    /**
+     * Check if MediaCodec.PARAMETER_KEY_VIDEO_BITRATE is honored.
+     *
+     * Run the sample multiple times. Request periodic changes to the
+     * bitrate and ensure the encoder responds.
+     */
+    public void testVariableBitrate() throws Exception {
+        encodeVariableBitrate(R.raw.video_176x144_yv12,
+                              176, // width
+                              144, // height
+                              30); // framerate
+    }
 
     /**
      * A basic check if an encoded stream is decodable.
@@ -191,9 +217,6 @@
      */
     private void encode(String outputFilename, int rawInputFd,
                        int frameWidth, int frameHeight, int frameRate) throws Exception {
-        int frameSize = frameWidth * frameHeight * 3 / 2;
-
-
         // Create a media format signifying desired output
         MediaFormat format = MediaFormat.createVideoFormat(VP8_MIME, frameWidth, frameHeight);
         format.setInteger(MediaFormat.KEY_BIT_RATE, 100000);
@@ -221,7 +244,8 @@
             ivf = new IvfWriter(outputFilename, frameWidth, frameHeight);
             // encode loop
             long presentationTimeUs = 0;
-            int frameIndex = 0;
+            int inputFrameIndex = 0;
+            int outputFrameIndex = 0;
             boolean sawInputEOS = false;
             boolean sawOutputEOS = false;
 
@@ -229,6 +253,10 @@
                 if (!sawInputEOS) {
                     int inputBufIndex = encoder.dequeueInputBuffer(DEFAULT_TIMEOUT_US);
                     if (inputBufIndex >= 0) {
+                        // YUV420 has 3 planes. Y is full size. U and V are each half size (1/4 the
+                        // pixels).
+                        int frameSize = frameWidth * frameHeight * 3 / 2;
+
                         byte[] frame = new byte[frameSize];
                         int bytesRead = rawStream.read(frame);
 
@@ -241,8 +269,8 @@
                         mInputBuffers[inputBufIndex].put(frame);
                         mInputBuffers[inputBufIndex].rewind();
 
-                        presentationTimeUs = (frameIndex * 1000000) / frameRate;
-                        Log.d(TAG, "Encoding frame at index " + frameIndex);
+                        presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+                        Log.d(TAG, "Encoding frame at index " + inputFrameIndex);
                         encoder.queueInputBuffer(
                                 inputBufIndex,
                                 0,  // offset
@@ -250,7 +278,7 @@
                                 presentationTimeUs,
                                 sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
 
-                        frameIndex++;
+                        inputFrameIndex++;
                     }
                 }
 
@@ -261,6 +289,12 @@
                     mOutputBuffers[outputBufIndex].rewind();
                     mOutputBuffers[outputBufIndex].get(buffer, 0, mBufferInfo.size);
 
+                    if ((outputFrameIndex == 0)
+                        && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) == 0)) {
+                      throw new RuntimeException("First frame is not a sync frame.");
+
+                    }
+
                     if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
                         sawOutputEOS = true;
                     } else {
@@ -268,6 +302,8 @@
                     }
                     encoder.releaseOutputBuffer(outputBufIndex,
                                                 false);  // render
+
+                    outputFrameIndex++;
                 } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
                     mOutputBuffers = encoder.getOutputBuffers();
                 }
@@ -285,4 +321,289 @@
             }
         }
     }
+
+
+    /**
+     * Request Sync Frames
+     *
+     * MediaCodec will raise an IllegalStateException
+     * whenever vp8 encoder fails to encode a frame.
+     *
+     * This presumes a file with 28 frames. Under normal circumstances there
+     * would only be one sync frame: the first one. This test will request an
+     * additional sync frame at 15 and ensure that it occurs by EOF.
+     *
+     * Color format of input file should be YUV420, and frameWidth,
+     * frameHeight should be supplied correctly as raw input file doesn't
+     * include any header data.
+     *
+     * @param rawInputFd      File descriptor for the raw input file (YUV420)
+     * @param frameWidth      Frame width of input file
+     * @param frameHeight     Frame height of input file
+     * @param frameRate       Frame rate of input file in frames per second
+     */
+    private void encodeSyncFrame(int rawInputFd, int frameWidth,
+                                 int frameHeight, int frameRate) throws Exception {
+        // Create a media format signifying desired output
+        MediaFormat format = MediaFormat.createVideoFormat(VP8_MIME, frameWidth, frameHeight);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, 100000);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                          CodecCapabilities.COLOR_FormatYUV420Planar);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+
+        Log.d(TAG, "Creating encoder");
+        MediaCodec encoder;
+        encoder = MediaCodec.createByCodecName(VPX_ENCODER_NAME);
+        encoder.configure(format,
+                          null,  // surface
+                          null,  // crypto
+                          MediaCodec.CONFIGURE_FLAG_ENCODE);
+        encoder.start();
+
+        mInputBuffers = encoder.getInputBuffers();
+        mOutputBuffers = encoder.getOutputBuffers();
+
+        InputStream rawStream = null;
+
+        try {
+            rawStream = mResources.openRawResource(rawInputFd);
+            // encode loop
+            long presentationTimeUs = 0;
+            int inputFrameIndex = 0;
+            boolean sawInputEOS = false;
+            boolean sawOutputEOS = false;
+            boolean syncFrameRequested = false;
+            boolean matchedSyncFrame = false;
+
+            while (!sawOutputEOS) {
+                if (!sawInputEOS) {
+                    int inputBufIndex = encoder.dequeueInputBuffer(DEFAULT_TIMEOUT_US);
+                    if (inputBufIndex >= 0) {
+                        int frameSize = frameWidth * frameHeight * 3 / 2;
+
+                        byte[] frame = new byte[frameSize];
+                        int bytesRead = rawStream.read(frame);
+
+                        if (bytesRead == -1) {
+                            sawInputEOS = true;
+                            bytesRead = 0;
+                        }
+
+                        mInputBuffers[inputBufIndex].clear();
+                        mInputBuffers[inputBufIndex].put(frame);
+                        mInputBuffers[inputBufIndex].rewind();
+
+                        if (inputFrameIndex == 15) {
+                            Log.d(TAG, "Requesting sync frame at index " + inputFrameIndex);
+                            Bundle syncFrame = new Bundle();
+                            syncFrame.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
+                            encoder.setParameters(syncFrame);
+                            syncFrameRequested = true;
+                        }
+
+                        presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+                        encoder.queueInputBuffer(
+                                inputBufIndex,
+                                0,  // offset
+                                bytesRead,  // size
+                                presentationTimeUs,
+                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+                        inputFrameIndex++;
+                    }
+                }
+
+                int result = encoder.dequeueOutputBuffer(mBufferInfo, DEFAULT_TIMEOUT_US);
+                if (result >= 0) {
+                    if (syncFrameRequested && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0)) {
+                        Log.d(TAG, "Found sync frame");
+                        matchedSyncFrame = true;
+                    }
+
+                    if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        sawOutputEOS = true;
+                    }
+
+                    encoder.releaseOutputBuffer(result,
+                                                false);  // render
+
+                } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                    mOutputBuffers = encoder.getOutputBuffers();
+                }
+            }
+
+            if (!matchedSyncFrame) {
+                throw new RuntimeException("Requested sync frame did not occur");
+            }
+
+            encoder.stop();
+            encoder.release();
+        } finally {
+            if (rawStream != null) {
+                rawStream.close();
+            }
+        }
+    }
+
+
+    /**
+     * Adjust bitrate
+     *
+     * MediaCodec will raise an IllegalStateException
+     * whenever vp8 encoder fails to encode a frame.
+     *
+     * Encode the file three times: once at the initial bitrate, once at an
+     * increased bitrate, and once at a decreased bitrate. Record the frame
+     * sizes that are returned and verify a strict ordering.
+     *
+     * Color format of input file should be YUV420, and frameWidth,
+     * frameHeight should be supplied correctly as raw input file doesn't
+     * include any header data.
+     *
+     * @param rawInputFd      File descriptor for the raw input file (YUV420)
+     * @param frameWidth      Frame width of input file
+     * @param frameHeight     Frame height of input file
+     * @param frameRate       Frame rate of input file in frames per second
+     */
+    private void encodeVariableBitrate(int rawInputFd, int frameWidth,
+                                       int frameHeight, int frameRate) throws Exception {
+        // Create a media format signifying desired output
+        MediaFormat format = MediaFormat.createVideoFormat(VP8_MIME, frameWidth, frameHeight);
+        format.setInteger(MediaFormat.KEY_BIT_RATE, 75000);
+        format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+                          CodecCapabilities.COLOR_FormatYUV420Planar);
+        format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+
+        Log.d(TAG, "Creating encoder");
+        MediaCodec encoder;
+        encoder = MediaCodec.createByCodecName(VPX_ENCODER_NAME);
+        encoder.configure(format,
+                          null,  // surface
+                          null,  // crypto
+                          MediaCodec.CONFIGURE_FLAG_ENCODE);
+        encoder.start();
+
+        mInputBuffers = encoder.getInputBuffers();
+        mOutputBuffers = encoder.getOutputBuffers();
+
+        InputStream rawStream = null;
+
+        int iteration = 0;
+        int[] bits = new int[100];
+
+        try {
+            rawStream = mResources.openRawResource(rawInputFd);
+            /* Doc says this is not the default:
+             * http://developer.android.com/reference/java/io/InputStream.html#markSupported()
+             * but it returns true so using .reset() instead of close/open
+             */
+            if (rawStream.markSupported()) Log.d(TAG, "Stream marking supported");
+            rawStream.mark(1000000);
+
+            // encode loop
+            long presentationTimeUs = 0;
+            int inputFrameIndex = 0;
+            int outputFrameIndex = 0;
+            boolean sawInputEOS = false;
+            boolean sawOutputEOS = false;
+
+            while (!sawOutputEOS) {
+                if (!sawInputEOS) {
+                    int inputBufIndex = encoder.dequeueInputBuffer(DEFAULT_TIMEOUT_US);
+                    if (inputBufIndex >= 0) {
+                        int frameSize = frameWidth * frameHeight * 3 / 2;
+
+                        byte[] frame = new byte[frameSize];
+                        int bytesRead = rawStream.read(frame);
+
+                        if (bytesRead == -1) {
+                            if (iteration < 2) {
+                                rawStream.reset();
+                                Bundle bitrate = new Bundle();
+                                if (iteration == 0) {
+                                    bitrate.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, 150000);
+                                    Log.d(TAG, "Setting bitrate to 150000");
+                                } else {
+                                    bitrate.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, 25000);
+                                    Log.d(TAG, "Setting bitrate to 25000");
+                                }
+                                encoder.setParameters(bitrate);
+
+                                iteration++;
+                                continue;
+                            } else {
+                                sawInputEOS = true;
+                                bytesRead = 0;
+                            }
+                        }
+
+                        mInputBuffers[inputBufIndex].clear();
+                        mInputBuffers[inputBufIndex].put(frame);
+                        mInputBuffers[inputBufIndex].rewind();
+
+                        presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+                        encoder.queueInputBuffer(
+                                inputBufIndex,
+                                0,  // offset
+                                bytesRead,  // size
+                                presentationTimeUs,
+                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+                        inputFrameIndex++;
+                    }
+                }
+
+                int result = encoder.dequeueOutputBuffer(mBufferInfo, DEFAULT_TIMEOUT_US);
+                if (result >= 0) {
+
+                    bits[outputFrameIndex] = mBufferInfo.size;
+
+                    if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+                        sawOutputEOS = true;
+                    }
+
+                    encoder.releaseOutputBuffer(result,
+                                                false);  // render
+
+                    outputFrameIndex++;
+
+                } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+                    mOutputBuffers = encoder.getOutputBuffers();
+                }
+            }
+
+            // 29 frames per run
+            int i;
+            int sum = 0;
+            int frames = 29;
+            for(i = 0; i < frames; i++)
+              sum += bits[i];
+            int midBitrateAvg = sum / frames;
+
+            sum = 0;
+            for(; i < frames * 2; i++)
+              sum += bits[i];
+            int highBitrateAvg = sum / frames;
+
+            sum = 0;
+            for(; i < frames * 3; i++)
+              sum += bits[i];
+            int lowBitrateAvg = sum / frames;
+
+            // For the given bitrates we expect mid ~= 350, high ~= 575 and low ~= 150
+            // bytes per frame
+            if ((midBitrateAvg + 100) > highBitrateAvg)
+                throw new RuntimeException("Bitrate did not increase when requesting higher bitrate");
+            if ((lowBitrateAvg + 100) > midBitrateAvg)
+                throw new RuntimeException("Bitrate did not decrease when requesting lower bitrate");
+
+
+            encoder.stop();
+            encoder.release();
+        } finally {
+            if (rawStream != null) {
+                rawStream.close();
+            }
+        }
+    }
 }
diff --git a/tests/tests/mediastress/Android.mk b/tests/tests/mediastress/Android.mk
index 7f75501..9f43597 100644
--- a/tests/tests/mediastress/Android.mk
+++ b/tests/tests/mediastress/Android.mk
@@ -22,7 +22,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsutil
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsdeviceutil
 
 LOCAL_JNI_SHARED_LIBRARIES := libctsmediastress_jni
 
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/H263QcifLongPlayerTest.java b/tests/tests/mediastress/src/android/mediastress/cts/H263QcifLongPlayerTest.java
index 865dfe7..482aec9 100644
--- a/tests/tests/mediastress/src/android/mediastress/cts/H263QcifLongPlayerTest.java
+++ b/tests/tests/mediastress/src/android/mediastress/cts/H263QcifLongPlayerTest.java
@@ -16,7 +16,7 @@
 
 package android.mediastress.cts;
 
-import android.cts.util.TimeoutReq;
+import com.android.cts.util.TimeoutReq;
 
 public class H263QcifLongPlayerTest extends MediaPlayerStressTest {
     private final static String VIDEO_PATH_MIDDLE = "bbb_full/176x144/3gp_h263_libfaac/";
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/H264R1080pAacRepeatedPlayerTest.java b/tests/tests/mediastress/src/android/mediastress/cts/H264R1080pAacRepeatedPlayerTest.java
new file mode 100644
index 0000000..db5d732
--- /dev/null
+++ b/tests/tests/mediastress/src/android/mediastress/cts/H264R1080pAacRepeatedPlayerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2012 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 android.mediastress.cts;
+
+import android.media.CamcorderProfile;
+import android.media.MediaRecorder.AudioEncoder;
+import android.media.MediaRecorder.VideoEncoder;
+
+public class H264R1080pAacRepeatedPlayerTest extends MediaPlayerStressTest {
+    private static final String VIDEO_PATH_MIDDLE = "bbb_short/1920x1080/mp4_libx264_libfaac/";
+    private final String[] mMedias = {
+        "bbb_short.ffmpeg.1920x1080.mp4.libx264_10000kbps_30fps.libfaac_stereo_192kbps_48000Hz.mp4",
+    };
+
+    public H264R1080pAacRepeatedPlayerTest() {
+        super(CamcorderProfile.QUALITY_1080P, VideoEncoder.H264, AudioEncoder.AAC);
+    }
+
+    public void testPlay00() throws Exception {
+        doTestVideoPlaybackRepeated(0);
+    }
+
+    @Override
+    protected String getFullVideoClipName(int mediaNumber) {
+        return VIDEO_TOP_DIR + VIDEO_PATH_MIDDLE + mMedias[mediaNumber];
+    }
+}
diff --git a/tests/tests/mediastress/src/android/mediastress/cts/MediaPlayerStressTest.java b/tests/tests/mediastress/src/android/mediastress/cts/MediaPlayerStressTest.java
index 3678811..d980e52 100644
--- a/tests/tests/mediastress/src/android/mediastress/cts/MediaPlayerStressTest.java
+++ b/tests/tests/mediastress/src/android/mediastress/cts/MediaPlayerStressTest.java
@@ -40,6 +40,7 @@
     protected static final String VIDEO_TOP_DIR = WorkDir.getMediaDirString();
     protected static final int REPEAT_NUMBER_FOR_SHORT_CLIPS = 2;
     protected static final int REPEAT_NUMBER_FOR_LONG_CLIPS = 1;
+    protected static final int REPEAT_NUMBER_FOR_REPEATED_PLAYBACK = 20;
     private static final String TAG = "MediaPlayerStressTest";
     // whether a video format is supported or not.
     private final boolean mSupported;
@@ -168,4 +169,8 @@
     protected void doTestVideoPlaybackLong(int mediaNumber) throws Exception {
         doTestVideoPlayback(mediaNumber, REPEAT_NUMBER_FOR_LONG_CLIPS);
     }
+
+    protected void doTestVideoPlaybackRepeated(int mediaNumber) throws Exception {
+        doTestVideoPlayback(mediaNumber, REPEAT_NUMBER_FOR_REPEATED_PLAYBACK);
+    }
 }
diff --git a/tests/tests/nativemedia/sl/Android.mk b/tests/tests/nativemedia/sl/Android.mk
index d999b57..49ccb10 100644
--- a/tests/tests/nativemedia/sl/Android.mk
+++ b/tests/tests/nativemedia/sl/Android.mk
@@ -1,11 +1,16 @@
 # Build the unit tests.
 
 LOCAL_PATH:= $(call my-dir)
+
+test_executable := NativeMediaTest_SL
+
 include $(CLEAR_VARS)
 
+LOCAL_MODULE := $(test_executable)
 LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
 
-LOCAL_C_INCLUDES:= \
+LOCAL_C_INCLUDES := \
     bionic \
     bionic/libstdc++/include \
     external/gtest/include \
@@ -13,22 +18,18 @@
     external/stlport/stlport \
     $(call include-path-for, wilhelm-ut)
 
-LOCAL_SRC_FILES:= \
+LOCAL_SRC_FILES := \
     src/SLObjectCreationTest.cpp
 
 LOCAL_SHARED_LIBRARIES := \
-  libutils \
-  liblog \
-  libOpenSLES \
-  libstlport
+    libutils \
+    liblog \
+    libOpenSLES \
+    libstlport
 
 LOCAL_STATIC_LIBRARIES := \
     libOpenSLESUT \
     libgtest
 
-LOCAL_MODULE:= NativeMediaTest_SL
-
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
-
 LOCAL_CTS_TEST_PACKAGE := android.nativemedia.sl
 include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/nativemedia/sl/NativeMediaTest_SL_list.txt b/tests/tests/nativemedia/sl/NativeMediaTest_SL_list.txt
new file mode 100644
index 0000000..c5d17a3
--- /dev/null
+++ b/tests/tests/nativemedia/sl/NativeMediaTest_SL_list.txt
@@ -0,0 +1,11 @@
+SLObjectCreationTest.
+  testEngineCreation
+  testOutputMixCreation
+  testAudioPlayerFromUriCreation
+  testAudioPlayerFromFdCreation
+  testAudioPlayerFromPcmBqCreation
+  testAudioPlayerFromTsAbqCreation
+  testAudioPlayerFromUriToPcmBqCreation
+  testAudioPlayerFromFdToPcmBqCreation
+  testAudioPlayerFromAdtsAbqToPcmBqCreation
+  testAudioRecorderCreation
diff --git a/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp b/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp
index 804263e..d0b3be0 100644
--- a/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp
+++ b/tests/tests/nativemedia/sl/src/SLObjectCreationTest.cpp
@@ -35,12 +35,16 @@
 #define LOG_NDEBUG 0
 #define LOG_TAG "SLObjectCreationTest"
 
+#include <gtest/gtest.h>
 #include <utils/Log.h>
+
+#if !defined(BUILD_ONLY)
 #include "SLES/OpenSLES.h"
 #include "SLES/OpenSLES_Android.h"
 #include "OpenSLESUT.h"
-#include <gtest/gtest.h>
+#endif
 
+#if !defined(BUILD_ONLY)
 //-----------------------------------------------------------------
 /* Checks for error and displays the error code if any */
 bool IsOk(SLresult res) {
@@ -305,6 +309,20 @@
         (*audioRecorderObj)->Destroy(audioRecorderObj);
     }
 };
+#else
+class SLObjectCreationTest : public ::testing::Test {
+protected:
+    void OutputMixCreation() { }
+    void AudioPlayerFromUriCreation() { }
+    void AudioPlayerFromFdCreation() { }
+    void AudioPlayerFromPcmBqCreation() { }
+    void AudioPlayerFromTsAbqCreation() { }
+    void AudioPlayerFromUriToPcmBqCreation() { }
+    void AudioPlayerFromFdToPcmBqCreation() { }
+    void AudioPlayerFromAdtsAbqToPcmBqCreation() { }
+    void AudioRecorderCreation(bool) { }
+};
+#endif
 
 //-------------------------------------------------------------------------------------------------
 TEST_F(SLObjectCreationTest, testEngineCreation) {
diff --git a/tests/tests/nativemedia/xa/Android.mk b/tests/tests/nativemedia/xa/Android.mk
index dad8acd..f2c0ca0 100644
--- a/tests/tests/nativemedia/xa/Android.mk
+++ b/tests/tests/nativemedia/xa/Android.mk
@@ -1,11 +1,16 @@
 # Build the unit tests.
 
 LOCAL_PATH:= $(call my-dir)
+
+test_executable := NativeMediaTest_XA
+
 include $(CLEAR_VARS)
 
+LOCAL_MODULE:= $(test_executable)
 LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
 
-LOCAL_C_INCLUDES:= \
+LOCAL_C_INCLUDES := \
     bionic \
     bionic/libstdc++/include \
     external/gtest/include \
@@ -13,7 +18,7 @@
     external/stlport/stlport \
     $(call include-path-for, wilhelm-ut)
 
-LOCAL_SRC_FILES:= \
+LOCAL_SRC_FILES := \
     src/XAObjectCreationTest.cpp
 
 LOCAL_SHARED_LIBRARIES := \
@@ -25,9 +30,5 @@
 LOCAL_STATIC_LIBRARIES := \
     libgtest
 
-LOCAL_MODULE:= NativeMediaTest_XA
-
-LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/nativetest
-
 LOCAL_CTS_TEST_PACKAGE := android.nativemedia.xa
 include $(BUILD_CTS_EXECUTABLE)
diff --git a/tests/tests/nativemedia/xa/NativeMediaTest_XA_list.txt b/tests/tests/nativemedia/xa/NativeMediaTest_XA_list.txt
new file mode 100644
index 0000000..af8bfad
--- /dev/null
+++ b/tests/tests/nativemedia/xa/NativeMediaTest_XA_list.txt
@@ -0,0 +1,3 @@
+XAObjectCreationTest.
+  testEngineCreation
+  testOutputMixCreation
diff --git a/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp b/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp
index 3ff84c2..d905451 100644
--- a/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp
+++ b/tests/tests/nativemedia/xa/src/XAObjectCreationTest.cpp
@@ -24,12 +24,15 @@
 #define LOG_NDEBUG 0
 #define LOG_TAG "XAObjectCreationTest"
 
+#include <gtest/gtest.h>
 #include <utils/Log.h>
+
+#if !defined(BUILD_ONLY)
 #include "OMXAL/OpenMAXAL.h"
 #include "OMXAL/OpenMAXAL_Android.h"
-//#include <android/native_window_jni.h>
-#include <gtest/gtest.h>
+#endif
 
+#if !defined(BUILD_ONLY)
 //-----------------------------------------------------------------
 /* Checks for error and displays the error code if any */
 bool IsOk(XAresult res) {
@@ -115,6 +118,12 @@
     }
 
 };
+#else
+class XAObjectCreationTest : public ::testing::Test {
+protected:
+    void OutputMixCreation() { }
+};
+#endif
 
 //-------------------------------------------------------------------------------------------------
 TEST_F(XAObjectCreationTest, testEngineCreation) {
diff --git a/tests/tests/nativeopengl/CtsNativeOpenGLTestCases_list.txt b/tests/tests/nativeopengl/CtsNativeOpenGLTestCases_list.txt
new file mode 100644
index 0000000..8daf3b2
--- /dev/null
+++ b/tests/tests/nativeopengl/CtsNativeOpenGLTestCases_list.txt
@@ -0,0 +1,6 @@
+EGLCleanupTest.
+  TestCorrect
+EGLCreateContextTest.
+  BadAttributeFails
+GLTest.
+  ClearColorTest
diff --git a/tests/tests/nativeopengl/libnativeopengltests/Android.mk b/tests/tests/nativeopengl/libnativeopengltests/Android.mk
index c9e10c4..5d7dd6e 100644
--- a/tests/tests/nativeopengl/libnativeopengltests/Android.mk
+++ b/tests/tests/nativeopengl/libnativeopengltests/Android.mk
@@ -34,7 +34,9 @@
 LOCAL_SRC_FILES := \
         register.cpp \
         GLTestHelper.cpp \
-        tests/GLTest_test.cpp
+        tests/GLTest_test.cpp \
+        tests/EGLCleanup_test.cpp \
+        tests/EGLCreateContext_test.cpp
 
 LOCAL_SHARED_LIBRARIES := libEGL \
                           libGLESv2 \
diff --git a/tests/tests/nativeopengl/standalone/.gitignore b/tests/tests/nativeopengl/standalone/.gitignore
new file mode 100644
index 0000000..1d1cdd2
--- /dev/null
+++ b/tests/tests/nativeopengl/standalone/.gitignore
@@ -0,0 +1,8 @@
+bin/
+build.xml
+gen/
+libs/
+local.properties
+obj/
+proguard-project.txt
+project.properties
diff --git a/tests/tests/nativeopengl/standalone/AndroidManifest.xml b/tests/tests/nativeopengl/standalone/AndroidManifest.xml
index a82e42a..9092f69 100644
--- a/tests/tests/nativeopengl/standalone/AndroidManifest.xml
+++ b/tests/tests/nativeopengl/standalone/AndroidManifest.xml
@@ -20,7 +20,8 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.android.gltest"
     android:versionCode="1"
-    android:versionName="1.0" >
+    android:versionName="1.0"
+    android:debuggable="true" >
 
     <uses-sdk
         android:minSdkVersion="8"
@@ -28,7 +29,7 @@
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
 
-    <application>
+    <application android:label="NativeGLTest">
         <activity android:name=".GLTestActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/tests/tests/nativeopengl/standalone/jni/Android.mk b/tests/tests/nativeopengl/standalone/jni/Android.mk
index c23a1df..53d9bbf 100644
--- a/tests/tests/nativeopengl/standalone/jni/Android.mk
+++ b/tests/tests/nativeopengl/standalone/jni/Android.mk
@@ -27,7 +27,7 @@
 LOCAL_C_INCLUDES := $(MY_GTEST_PATH)/include
 LOCAL_SRC_FILES := src/gtest-all.cc
 
-include $(BUILD_SHARED_LIBRARY)
+include $(BUILD_STATIC_LIBRARY)
 
 # nativetests
 
@@ -37,12 +37,15 @@
 
 LIB_PATH := $(LOCAL_PATH)/../libs/$(TARGET_ARCH_ABI)/
 LOCAL_C_INCLUDES := $(MY_GTEST_PATH)/include
-LOCAL_LDLIBS    := -L$(LIB_PATH) -landroid -lEGL -lGLESv2 -llog -lgtest
+LOCAL_LDLIBS    := -L$(LIB_PATH) -landroid -lEGL -lGLESv2 -llog
+LOCAL_STATIC_LIBRARIES := libgtest
 LOCAL_MODULE    := nativeopengltests
 LOCAL_SRC_FILES := GLTestHelper.cpp \
                    register.cpp \
-                   tests/GLTest_test.cpp
+                   tests/GLTest_test.cpp \
+                   tests/EGLCleanup_test.cpp \
+                   tests/EGLCreateContext_test.cpp
 
-LOCAL_SHARE_LIBRARIES := libgtest
+LOCAL_SHARED_LIBRARIES := libgtest
 
 include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/nativeopengl/standalone/jni/tests/EGLCleanup_test.cpp b/tests/tests/nativeopengl/standalone/jni/tests/EGLCleanup_test.cpp
new file mode 100644
index 0000000..db39798
--- /dev/null
+++ b/tests/tests/nativeopengl/standalone/jni/tests/EGLCleanup_test.cpp
@@ -0,0 +1,346 @@
+/*
+ * Copyright 2013 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.
+ */
+
+#define LOG_TAG "EGLCleanup"
+#include <android/log.h>
+#include <jni.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+
+#include <gtest/gtest.h>
+
+#include <GLTestHelper.h>
+
+#include <pthread.h>
+
+#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
+#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
+#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
+
+namespace android {
+
+/**
+ * Tests EGL cleanup edge cases.
+ */
+class EGLCleanupTest : public ::testing::Test {
+protected:
+    EGLCleanupTest() {}
+
+    virtual void SetUp() {
+        // Termination of a terminated display is defined to be a no-op.
+        // Android uses a refcounted implementation, so terminate it a few
+        // times to make sure it's really dead.  Without this, we might not
+        // get all the way into the driver eglTerminate implementation
+        // when we call eglTerminate.
+        EGLDisplay disp = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        if (disp != EGL_NO_DISPLAY) {
+            ALOGD("speculative terminate");
+            eglTerminate(disp);
+            eglTerminate(disp);
+            eglTerminate(disp);
+        }
+    }
+    virtual void TearDown() {}
+};
+
+/**
+ * Perform an operation and then start a new thread.
+ *
+ * The trick here is that some code may be helpfully releasing storage in
+ * pthread_key destructors.  Those run after the thread returns out of the
+ * initial function, but before the thread fully exits.  We want them to
+ * run concurrently with the next thread's initialization so we can confirm
+ * that the specified behavior of eglTerminate vs. eglInitialize holds.
+ */
+class ChainedThread {
+public:
+    enum TestType {
+        TEST_CORRECT,
+        TEST_NO_RELEASE_CURRENT
+    };
+
+    ChainedThread(TestType testType) : mEglDisplay(EGL_NO_DISPLAY),
+            mEglSurface(EGL_NO_SURFACE), mEglContext(EGL_NO_CONTEXT),
+            mTestType(testType), mIteration(0), mResult(true) {
+        pthread_mutex_init(&mLock, NULL);
+        pthread_cond_init(&mCond, NULL);
+    }
+    ~ChainedThread() {
+        // could get fancy and clean up the mutex
+    }
+
+    /* start here */
+    bool start() {
+        lock();
+        bool result = startThread_l();
+        unlock();
+        return result;
+    }
+
+    /* waits until test is done; when finished, call getResult() */
+    bool waitForEnd() {
+        lock();
+        int err = pthread_cond_wait(&mCond, &mLock);
+        if (err != 0) {
+            ALOGW("pthread_cond_wait failed: %d", err);
+        }
+        unlock();
+        return err == 0;
+    }
+
+    /* returns the result; true means success */
+    bool getResult() {
+        return mResult;
+    }
+
+private:
+    enum { MAX_ITERATIONS = 1000 };
+
+    EGLDisplay mEglDisplay;
+    EGLSurface mEglSurface;
+    EGLContext mEglContext;
+
+    TestType mTestType;
+    int mIteration;
+    bool mResult;
+    pthread_mutex_t mLock;
+    pthread_cond_t mCond;
+
+    // Assertions set a flag in Java and return from the current method (which
+    // must be declared to return void).  They do not throw a C++ exception.
+    //
+    // Because we're running in a separate thread, which is not attached to
+    // the VM, the assert macros don't help us much.  We could attach to the
+    // VM (by linking to libdvm.so and calling a global function), but the
+    // assertions won't cause the test to stop, which makes them less valuable.
+    //
+    // So instead we just return a boolean out of functions that can fail.
+
+    /* call this to start the test */
+    bool startThread_l() {
+        pthread_attr_t attr;
+        pthread_attr_init(&attr);
+        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+        pthread_t newThread;
+        int err = pthread_create(&newThread, &attr, ChainedThread::func,
+                (void*) this);
+        return (err == 0);
+    }
+
+    /* thread entry point */
+    static void* func(void* arg) {
+        ChainedThread* obj = static_cast<ChainedThread*>(arg);
+        obj->doWork();
+        return NULL;
+    }
+
+    bool lock() {
+        int err = pthread_mutex_lock(&mLock);
+        if (err != 0) {
+            ALOGW("pthread_mutex_lock failed: %d", err);
+        }
+        return err == 0;
+    }
+
+    bool unlock() {
+        int err = pthread_mutex_unlock(&mLock);
+        if (err != 0) {
+            ALOGW("pthread_mutex_unlock failed: %d", err);
+        }
+        return err == 0;
+    }
+
+    /* main worker */
+    void doWork() {
+        lock();
+
+        if ((mIteration % 25) == 0) {
+            ALOGD("iteration %d\n", mIteration);
+        }
+
+        mIteration++;
+        bool result = runTest_l();
+        if (!result) {
+            ALOGW("failed at iteration %d, stopping test", mIteration);
+            mResult = false;
+            mIteration = MAX_ITERATIONS;
+        }
+
+        if (mIteration < MAX_ITERATIONS) {
+            // still going, try to start the next one
+            if (!startThread_l()) {
+                ALOGW("Unable to start thread at iter=%d", mIteration);
+                mResult = false;
+                mIteration = MAX_ITERATIONS;
+            }
+        }
+
+        if (mIteration >= MAX_ITERATIONS) {
+            ALOGD("Test ending, signaling main thread");
+            pthread_cond_signal(&mCond);
+        }
+
+        unlock();
+    }
+
+    /* setup, use, release EGL */
+    bool runTest_l() {
+        if (!eglSetup()) {
+            return false;
+        }
+        if (!eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
+                mEglContext))
+        {
+            ALOGW("eglMakeCurrent failed: 0x%x", eglGetError());
+            return false;
+        }
+        if (!eglRelease_l()) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /*
+     * Sets up EGL.  Creates a 1280x720 pbuffer, which is large enough to
+     * cause a rapid and highly visible memory leak if we fail to discard it.
+     */
+    bool eglSetup() {
+        static const EGLint kConfigAttribs[] = {
+                EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
+                EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+                EGL_RED_SIZE, 8,
+                EGL_GREEN_SIZE, 8,
+                EGL_BLUE_SIZE, 8,
+                EGL_NONE
+        };
+        static const EGLint kContextAttribs[] = {
+                EGL_CONTEXT_CLIENT_VERSION, 2,
+                EGL_NONE
+        };
+        static const EGLint kPbufferAttribs[] = {
+                EGL_WIDTH, 1280,
+                EGL_HEIGHT, 720,
+                EGL_NONE
+        };
+
+        //usleep(25000);
+
+        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        if (mEglDisplay == EGL_NO_DISPLAY) {
+            ALOGW("eglGetDisplay failed: 0x%x", eglGetError());
+            return false;
+        }
+
+        EGLint majorVersion, minorVersion;
+        if (!eglInitialize(mEglDisplay, &majorVersion, &minorVersion)) {
+            ALOGW("eglInitialize failed: 0x%x", eglGetError());
+            return false;
+        }
+
+        EGLConfig eglConfig;
+        EGLint numConfigs = 0;
+        if (!eglChooseConfig(mEglDisplay, kConfigAttribs, &eglConfig,
+                1, &numConfigs)) {
+            ALOGW("eglChooseConfig failed: 0x%x", eglGetError());
+            return false;
+        }
+
+        mEglSurface = eglCreatePbufferSurface(mEglDisplay, eglConfig,
+                kPbufferAttribs);
+        if (mEglSurface == EGL_NO_SURFACE) {
+            ALOGW("eglCreatePbufferSurface failed: 0x%x", eglGetError());
+            return false;
+        }
+
+        mEglContext = eglCreateContext(mEglDisplay, eglConfig, EGL_NO_CONTEXT,
+                kContextAttribs);
+        if (mEglContext == EGL_NO_CONTEXT) {
+            ALOGW("eglCreateContext failed: 0x%x", eglGetError());
+            return false;
+        }
+
+        return true;
+    }
+
+    /*
+     * Releases EGL.  How we do that depends on the type of test we're
+     * running.
+     */
+    bool eglRelease_l() {
+        if (mEglDisplay == EGL_NO_DISPLAY) {
+            ALOGW("No display to release");
+            return false;
+        }
+
+        switch (mTestType) {
+        case TEST_CORRECT:
+            eglTerminate(mEglDisplay);
+            eglReleaseThread();
+            break;
+        case TEST_NO_RELEASE_CURRENT:
+            eglDestroyContext(mEglDisplay, mEglContext);
+            eglDestroySurface(mEglDisplay, mEglSurface);
+            eglTerminate(mEglDisplay);
+            break;
+        default:
+            ALOGE("Unknown test type %d", mTestType);
+            break;
+        }
+
+        int err = eglGetError();
+        if (err != EGL_SUCCESS) {
+            ALOGW("eglRelease failed: 0x%x", err);
+            return false;
+        }
+        return true;
+    }
+};
+
+
+/* do things correctly */
+TEST_F(EGLCleanupTest, TestCorrect) {
+    ALOGI("Starting TEST_CORRECT");
+    ChainedThread cht(ChainedThread::TEST_CORRECT);
+
+    // start initial thread
+    ASSERT_TRUE(cht.start());
+
+    // wait for the end
+    cht.waitForEnd();
+    bool result = cht.getResult();
+    ASSERT_TRUE(result);
+}
+
+/* try it without un-currenting the surfaces and context
+TEST _F(EGLCleanupTest, TestNoReleaseCurrent) {
+    ALOGI("Starting TEST_NO_RELEASE_CURRENT");
+    ChainedThread cht(ChainedThread::TEST_NO_RELEASE_CURRENT);
+
+    // start initial thread
+    ASSERT_TRUE(cht.start());
+
+    // wait for the end
+    cht.waitForEnd();
+    bool result = cht.getResult();
+    ASSERT_TRUE(result);
+}
+*/
+
+} // namespace android
diff --git a/tests/tests/nativeopengl/standalone/jni/tests/EGLCreateContext_test.cpp b/tests/tests/nativeopengl/standalone/jni/tests/EGLCreateContext_test.cpp
new file mode 100644
index 0000000..b7e5f7c
--- /dev/null
+++ b/tests/tests/nativeopengl/standalone/jni/tests/EGLCreateContext_test.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2013 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.
+ */
+
+#include <android/native_window.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
+
+#include <gtest/gtest.h>
+
+#include <android/log.h>
+
+#include "GLTestHelper.h"
+
+#define LOG_TAG "EGLCreateContext_test"
+#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+namespace android {
+
+static int getGlVersion() {
+    const char* s = (const char*)glGetString(GL_VERSION);
+    if (!s)
+        return 0;
+    int major, minor;
+    if (sscanf(s, "OpenGL ES %d.%d", &major, &minor) != 2)
+        return 0;
+    return major;
+}
+
+class EGLCreateContextTest : public ::testing::Test {
+
+protected:
+
+    EGLCreateContextTest()
+    :   mEglDisplay(EGL_NO_DISPLAY),
+        mEglConfig(0),
+        mEglWindowSurface(EGL_NO_SURFACE),
+        mEglContext(EGL_NO_CONTEXT)
+    {}
+
+    virtual void SetUp() {
+        // static const EGLint SURFACE_ATTRIBS[] = {
+        //     EGL_NONE
+        // };
+
+        mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+        ASSERT_NE(EGL_NO_DISPLAY, mEglDisplay);
+
+        EGLint major, minor;
+        ASSERT_TRUE(eglInitialize(mEglDisplay, &major, &minor));
+
+        EGLint numConfigs = 0;
+        ASSERT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(),
+                &mEglConfig, 1, &numConfigs));
+        ASSERT_GE(1, numConfigs);
+        ASSERT_NE((EGLConfig)0, mEglConfig);
+
+        mEglWindowSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig,
+                GLTestHelper::getWindow(), getWindowSurfaceAttribs());
+        ASSERT_EQ(EGL_SUCCESS, eglGetError());
+        ASSERT_NE(EGL_NO_SURFACE, mEglWindowSurface);
+    }
+
+    virtual void TearDown() {
+        if (mEglContext != EGL_NO_CONTEXT) {
+            eglDestroyContext(mEglDisplay, mEglContext);
+        }
+        if (mEglWindowSurface != EGL_NO_SURFACE) {
+            eglDestroySurface(mEglDisplay, mEglWindowSurface);
+        }
+        if (mEglDisplay != EGL_NO_DISPLAY) {
+            eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE,
+                    EGL_NO_CONTEXT);
+            eglTerminate(mEglDisplay);
+        }
+        ASSERT_EQ(EGL_SUCCESS, eglGetError());
+    }
+
+    virtual const EGLint* getConfigAttribs() {
+        static const EGLint ATTRIBS[] = {
+            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
+            EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+            EGL_RED_SIZE, 8,
+            EGL_GREEN_SIZE, 8,
+            EGL_BLUE_SIZE, 8,
+            EGL_ALPHA_SIZE, 8,
+            EGL_NONE
+        };
+        return ATTRIBS;
+    }
+
+    virtual const EGLint* getWindowSurfaceAttribs() {
+        return NULL;
+    }
+
+    EGLDisplay mEglDisplay;
+    EGLConfig  mEglConfig;
+    EGLSurface mEglWindowSurface;
+    EGLContext mEglContext;
+};
+
+TEST_F(EGLCreateContextTest, BadAttributeFails) {
+    // First check that we can successfully create a context
+    EGLint attribs[5] = {
+        EGL_CONTEXT_CLIENT_VERSION, 2,
+        EGL_NONE, EGL_NONE, EGL_NONE,
+    };
+    mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT,
+            attribs);
+    ASSERT_NE(mEglContext, EGL_NO_CONTEXT);
+    ASSERT_EQ(eglGetError(), EGL_SUCCESS);
+    ASSERT_EQ(EGL_TRUE, eglDestroyContext(mEglDisplay, mEglContext));
+    mEglContext = EGL_NO_CONTEXT;
+
+    // Now add an invalid attribute and make sure eglCreateContext fails
+    attribs[2] = EGL_BAD_ATTRIBUTE; // error code, not a valid attribute
+    mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT,
+            attribs);
+    ASSERT_EQ(mEglContext, EGL_NO_CONTEXT);
+    ASSERT_EQ(eglGetError(), EGL_BAD_ATTRIBUTE);
+}
+
+} // namespace android
diff --git a/tests/tests/nativeopengl/standalone/src/com/android/gltest/GLTestActivity.java b/tests/tests/nativeopengl/standalone/src/com/android/gltest/GLTestActivity.java
index 3c1e2af..f0c250b 100644
--- a/tests/tests/nativeopengl/standalone/src/com/android/gltest/GLTestActivity.java
+++ b/tests/tests/nativeopengl/standalone/src/com/android/gltest/GLTestActivity.java
@@ -77,7 +77,6 @@
         mSurfaceView.getHolder().addCallback(mHolderCallback);
         setContentView(mSurfaceView);
         System.loadLibrary("stlport_shared");
-        System.loadLibrary("gtest");
         System.loadLibrary("nativeopengltests");
     }
 
diff --git a/tests/tests/net/Android.mk b/tests/tests/net/Android.mk
index a6543b3..7219fc4 100644
--- a/tests/tests/net/Android.mk
+++ b/tests/tests/net/Android.mk
@@ -30,7 +30,7 @@
 
 LOCAL_PACKAGE_NAME := CtsNetTestCases
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctsutil ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctsdeviceutil ctstestrunner
 
 # uncomment when dalvik.annotation.Test* are removed or part of SDK
 #LOCAL_SDK_VERSION := current
diff --git a/tests/tests/net/jni/NativeDnsJni.c b/tests/tests/net/jni/NativeDnsJni.c
index de9bb67..b975594 100644
--- a/tests/tests/net/jni/NativeDnsJni.c
+++ b/tests/tests/net/jni/NativeDnsJni.c
@@ -20,6 +20,11 @@
 #include <stdio.h>
 #include <utils/Log.h>
 
+const char *GoogleDNSIpV4Address="8.8.8.8";
+const char *GoogleDNSIpV4Address2="8.8.4.4";
+const char *GoogleDNSIpV6Address="2001:4860:4860::8888";
+const char *GoogleDNSIpV6Address2="2001:4860:4860::8844";
+
 JNIEXPORT jboolean Java_android_net_cts_DnsTest_testNativeDns(JNIEnv* env, jclass class)
 {
     const char *node = "www.google.com";
@@ -53,8 +58,8 @@
 
         freeaddrinfo(answer);
         answer = NULL;
-        if (foundv4 != 1 || foundv6 != 1) {
-            ALOGD("getaddrinfo(www.google.com) didn't find both v4 and v6");
+        if (foundv4 != 1 && foundv6 != 1) {
+            ALOGD("getaddrinfo(www.google.com) didn't find either v4 or v6 address");
             return JNI_FALSE;
         }
     }
@@ -96,49 +101,50 @@
     struct sockaddr_in sa4;
     sa4.sin_family = AF_INET;
     sa4.sin_port = 0;
-    inet_pton(AF_INET, "173.252.110.27", &(sa4.sin_addr));
+    inet_pton(AF_INET, GoogleDNSIpV4Address, &(sa4.sin_addr));
 
     struct sockaddr_in6 sa6;
     sa6.sin6_family = AF_INET6;
     sa6.sin6_port = 0;
     sa6.sin6_flowinfo = 0;
     sa6.sin6_scope_id = 0;
-    inet_pton(AF_INET6, "2001:4860:4001:802::1008", &(sa6.sin6_addr));
+    inet_pton(AF_INET6, GoogleDNSIpV6Address2, &(sa6.sin6_addr));
 
     char buf[NI_MAXHOST];
     int flags = NI_NAMEREQD;
 
     res = getnameinfo((const struct sockaddr*)&sa4, sizeof(sa4), buf, sizeof(buf), NULL, 0, flags);
     if (res != 0) {
-        ALOGD("getnameinfo(173.252.110.27 (facebook) ) gave error %d (%s)", res, gai_strerror(res));
+        ALOGD("getnameinfo(%s (GoogleDNS) ) gave error %d (%s)", GoogleDNSIpV4Address, res,
+            gai_strerror(res));
         return JNI_FALSE;
     }
-    if (strstr(buf, "facebook.com") == NULL) {
-        ALOGD("getnameinfo(173.252.110.27 (facebook) ) didn't return facebook.com: %s", buf);
+    if (strstr(buf, "google.com") == NULL) {
+        ALOGD("getnameinfo(%s (GoogleDNS) ) didn't return google.com: %s",
+            GoogleDNSIpV4Address, buf);
         return JNI_FALSE;
     }
 
     memset(buf, sizeof(buf), 0);
-    res = getnameinfo((const struct sockaddr*)&sa6, sizeof(sa6), buf, sizeof(buf),
-            NULL, 0, flags);
+    res = getnameinfo((const struct sockaddr*)&sa6, sizeof(sa6), buf, sizeof(buf), NULL, 0, flags);
     if (res != 0) {
-        ALOGD("getnameinfo(2a03:2880:2110:df01:face:b00c::8 (facebook) ) gave error %d (%s)",
-                res, gai_strerror(res));
+        ALOGD("getnameinfo(%s (GoogleDNS) ) gave error %d (%s)", GoogleDNSIpV6Address2,
+            res, gai_strerror(res));
         return JNI_FALSE;
     }
-    if (strstr(buf, "1e100.net") == NULL) {
-        ALOGD("getnameinfo(2a03:2880:2110:df01:face:b00c::8) didn't return facebook.com: %s", buf);
+    if (strstr(buf, "google.com") == NULL) {
+        ALOGD("getnameinfo(%s) didn't return google.com: %s", GoogleDNSIpV6Address2, buf);
         return JNI_FALSE;
     }
 
     // gethostbyname
-    struct hostent *my_hostent = gethostbyname("www.mit.edu");
+    struct hostent *my_hostent = gethostbyname("www.youtube.com");
     if (my_hostent == NULL) {
-        ALOGD("gethostbyname(www.mit.edu) gave null response");
+        ALOGD("gethostbyname(www.youtube.com) gave null response");
         return JNI_FALSE;
     }
     if ((my_hostent->h_addr_list == NULL) || (*my_hostent->h_addr_list == NULL)) {
-        ALOGD("gethostbyname(www.mit.edu) gave 0 addresses");
+        ALOGD("gethostbyname(www.youtube.com) gave 0 addresses");
         return JNI_FALSE;
     }
     {
@@ -146,21 +152,23 @@
         while (*current != NULL) {
             char buf[256];
             inet_ntop(my_hostent->h_addrtype, *current, buf, sizeof(buf));
-            ALOGD("gethostbyname(www.mit.edu) gave %s", buf);
+            ALOGD("gethostbyname(www.youtube.com) gave %s", buf);
             current++;
         }
     }
 
     // gethostbyaddr
     char addr6[16];
-    inet_pton(AF_INET6, "2001:4b10:bbc::2", addr6);
+    inet_pton(AF_INET6, GoogleDNSIpV6Address, addr6);
     my_hostent = gethostbyaddr(addr6, sizeof(addr6), AF_INET6);
     if (my_hostent == NULL) {
-        ALOGD("gethostbyaddr(2001:4b10:bbc::2 (bbc) ) gave null response");
+        ALOGD("gethostbyaddr(%s (GoogleDNS) ) gave null response", GoogleDNSIpV6Address);
         return JNI_FALSE;
     }
-    ALOGD("gethostbyaddr(2001:4b10:bbc::2 (bbc) ) gave %s for name",
-    my_hostent->h_name ? my_hostent->h_name : "null");
+
+    ALOGD("gethostbyaddr(%s (GoogleDNS) ) gave %s for name", GoogleDNSIpV6Address,
+        my_hostent->h_name ? my_hostent->h_name : "null");
+
     if (my_hostent->h_name == NULL) return JNI_FALSE;
     return JNI_TRUE;
 }
diff --git a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
index d4bff12..e769be1 100644
--- a/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -97,6 +97,7 @@
         assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_IMS));
         assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_CBS));
         assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_WIFI_P2P));
+        assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.TYPE_MOBILE_IA));
         assertFalse(mCm.isNetworkTypeValid(-1));
         assertTrue(mCm.isNetworkTypeValid(0));
         assertTrue(mCm.isNetworkTypeValid(ConnectivityManager.MAX_NETWORK_TYPE));
@@ -268,9 +269,13 @@
             return;
         }
 
-        boolean isWifiConnected = mWifiManager.isWifiEnabled()
-                && mWifiManager.getConnectionInfo().getSSID() != null;
+        boolean isWifiEnabled = mWifiManager.isWifiEnabled();
+        boolean isWifiConnected = false;
 
+        NetworkInfo nwInfo = mCm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
+        if (nwInfo != null) {
+            isWifiConnected = nwInfo.isConnected();
+        }
         try {
             // Make sure WiFi is connected to an access point.
             if (!isWifiConnected) {
@@ -304,7 +309,7 @@
             // TODO wait for HIPRI to go
             // TODO check dns selection
             // TODO check routes
-            if (!isWifiConnected) {
+            if (!isWifiEnabled) {
                 mWifiManager.setWifiEnabled(false);
             }
         }
diff --git a/tests/tests/net/src/android/net/cts/DnsTest.java b/tests/tests/net/src/android/net/cts/DnsTest.java
new file mode 100644
index 0000000..879a962
--- /dev/null
+++ b/tests/tests/net/src/android/net/cts/DnsTest.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2013 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 android.net.cts;
+
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+
+public class DnsTest extends AndroidTestCase {
+
+    static {
+        System.loadLibrary("nativedns_jni");
+    }
+
+    private static final boolean DBG = false;
+    private static final String TAG = "DnsTest";
+
+    /**
+     * @return true on success
+     */
+    private static native boolean testNativeDns();
+
+    /**
+     * Verify:
+     * DNS works - forwards and backwards, giving ipv4 and ipv6
+     * Test that DNS work on v4 and v6 networks
+     * Test Native dns calls (4)
+     * Todo:
+     * Cache is flushed when we change networks
+     * have per-network caches
+     * No cache when there's no network
+     * Perf - measure size of first and second tier caches and their effect
+     * Assert requires network permission
+     */
+    public void testDnsWorks() {
+        InetAddress addrs[] = {};
+        try {
+            addrs = InetAddress.getAllByName("www.google.com");
+        } catch (UnknownHostException e) {}
+        assertTrue(addrs.length != 0);
+        boolean foundV4 = false, foundV6 = false;
+        for (InetAddress addr : addrs) {
+            if (addr instanceof Inet4Address) foundV4 = true;
+            else if (addr instanceof Inet6Address) foundV6 = true;
+            if (DBG) Log.e(TAG, "www.google.com gave " + addr.toString());
+        }
+
+        // assertTrue(foundV4);
+        // assertTrue(foundV6);
+
+        // We should have at least one of the addresses to connect!
+        assertTrue(foundV4 || foundV6);
+
+        try {
+            addrs = InetAddress.getAllByName("ipv6.google.com");
+        } catch (UnknownHostException e) {}
+        assertTrue(addrs.length != 0);
+        foundV4 = false;
+        foundV6 = false;
+        for (InetAddress addr : addrs) {
+            if (addr instanceof Inet4Address) foundV4 = true;
+            else if (addr instanceof Inet6Address) foundV6 = true;
+            if (DBG) Log.e(TAG, "ipv6.google.com gave " + addr.toString());
+        }
+
+        assertTrue(foundV4 == false);
+        assertTrue(foundV6 == true);
+
+        assertTrue(testNativeDns());
+    }
+
+    private static final String[] URLS = { "www.google.com", "ipv6.google.com", "www.yahoo.com",
+            "facebook.com", "youtube.com", "blogspot.com", "baidu.com", "wikipedia.org",
+// live.com fails rev lookup.
+            "twitter.com", "qq.com", "msn.com", "yahoo.co.jp", "linkedin.com",
+            "taobao.com", "google.co.in", "sina.com.cn", "amazon.com", "wordpress.com",
+            "google.co.uk", "ebay.com", "yandex.ru", "163.com", "google.co.jp", "google.fr",
+            "microsoft.com", "paypal.com", "google.com.br", "flickr.com",
+            "mail.ru", "craigslist.org", "fc2.com", "google.it",
+// "apple.com", fails rev lookup
+            "google.es",
+            "imdb.com", "google.ru", "soho.com", "bbc.co.uk", "vkontakte.ru", "ask.com",
+            "tumblr.com", "weibo.com", "go.com", "xvideos.com", "livejasmin.com", "cnn.com",
+            "youku.com", "blogspot.com", "soso.com", "google.ca", "aol.com", "tudou.com",
+            "xhamster.com", "megaupload.com", "ifeng.com", "zedo.com", "mediafire.com", "ameblo.jp",
+            "pornhub.com", "google.co.id", "godaddy.com", "adobe.com", "rakuten.co.jp", "about.com",
+            "espn.go.com", "4shared.com", "alibaba.com","ebay.de", "yieldmanager.com",
+            "wordpress.org", "livejournal.com", "google.com.tr", "google.com.mx", "renren.com",
+           "livedoor.com", "google.com.au", "youporn.com", "uol.com.br", "cnet.com", "conduit.com",
+            "google.pl", "myspace.com", "nytimes.com", "ebay.co.uk", "chinaz.com", "hao123.com",
+            "thepiratebay.org", "doubleclick.com", "alipay.com", "netflix.com", "cnzz.com",
+            "huffingtonpost.com", "twitpic.com", "weather.com", "babylon.com", "amazon.de",
+            "dailymotion.com", "orkut.com", "orkut.com.br", "google.com.sa", "odnoklassniki.ru",
+            "amazon.co.jp", "google.nl", "goo.ne.jp", "stumbleupon.com", "tube8.com", "tmall.com",
+            "imgur.com", "globo.com", "secureserver.net", "fileserve.com", "tianya.cn", "badoo.com",
+            "ehow.com", "photobucket.com", "imageshack.us", "xnxx.com", "deviantart.com",
+            "filestube.com", "addthis.com", "douban.com", "vimeo.com", "sogou.com",
+            "stackoverflow.com", "reddit.com", "dailymail.co.uk", "redtube.com", "megavideo.com",
+            "taringa.net", "pengyou.com", "amazon.co.uk", "fbcdn.net", "aweber.com", "spiegel.de",
+            "rapidshare.com", "mixi.jp", "360buy.com", "google.cn", "digg.com", "answers.com",
+            "bit.ly", "indiatimes.com", "skype.com", "yfrog.com", "optmd.com", "google.com.eg",
+            "google.com.pk", "58.com", "hotfile.com", "google.co.th",
+            "bankofamerica.com", "sourceforge.net", "maktoob.com", "warriorforum.com", "rediff.com",
+            "google.co.za", "56.com", "torrentz.eu", "clicksor.com", "avg.com",
+            "download.com", "ku6.com", "statcounter.com", "foxnews.com", "google.com.ar",
+            "nicovideo.jp", "reference.com", "liveinternet.ru", "ucoz.ru", "xinhuanet.com",
+            "xtendmedia.com", "naver.com", "youjizz.com", "domaintools.com", "sparkstudios.com",
+            "rambler.ru", "scribd.com", "kaixin001.com", "mashable.com", "adultfirendfinder.com",
+            "files.wordpress.com", "guardian.co.uk", "bild.de", "yelp.com", "wikimedia.org",
+            "chase.com", "onet.pl", "ameba.jp", "pconline.com.cn", "free.fr", "etsy.com",
+            "typepad.com", "youdao.com", "megaclick.com", "digitalpoint.com", "blogfa.com",
+            "salesforce.com", "adf.ly", "ganji.com", "wikia.com", "archive.org", "terra.com.br",
+            "w3schools.com", "ezinearticles.com", "wjs.com", "google.com.my", "clickbank.com",
+            "squidoo.com", "hulu.com", "repubblica.it", "google.be", "allegro.pl", "comcast.net",
+            "narod.ru", "zol.com.cn", "orange.fr", "soufun.com", "hatena.ne.jp", "google.gr",
+            "in.com", "techcrunch.com", "orkut.co.in", "xunlei.com",
+            "reuters.com", "google.com.vn", "hostgator.com", "kaskus.us", "espncricinfo.com",
+            "hootsuite.com", "qiyi.com", "gmx.net", "xing.com", "php.net", "soku.com", "web.de",
+            "libero.it", "groupon.com", "51.la", "slideshare.net", "booking.com", "seesaa.net",
+            "126.com", "telegraph.co.uk", "wretch.cc", "twimg.com", "rutracker.org", "angege.com",
+            "nba.com", "dell.com", "leboncoin.fr", "people.com", "google.com.tw", "walmart.com",
+            "daum.net", "2ch.net", "constantcontact.com", "nifty.com", "mywebsearch.com",
+            "tripadvisor.com", "google.se", "paipai.com", "google.com.ua", "ning.com", "hp.com",
+            "google.at", "joomla.org", "icio.us", "hudong.com", "csdn.net", "getfirebug.com",
+            "ups.com", "cj.com", "google.ch", "camzap.com", "wordreference.com", "tagged.com",
+            "wp.pl", "mozilla.com", "google.ru", "usps.com", "china.com", "themeforest.net",
+            "search-results.com", "tribalfusion.com", "thefreedictionary.com", "isohunt.com",
+            "linkwithin.com", "cam4.com", "plentyoffish.com", "wellsfargo.com", "metacafe.com",
+            "depositfiles.com", "freelancer.com", "opendns.com", "homeway.com", "engadget.com",
+            "10086.cn", "360.cn", "marca.com", "dropbox.com", "ign.com", "match.com", "google.pt",
+            "facemoods.com", "hardsextube.com", "google.com.ph", "lockerz.com", "istockphoto.com",
+            "partypoker.com", "netlog.com", "outbrain.com", "elpais.com", "fiverr.com",
+            "biglobe.ne.jp", "corriere.it", "love21cn.com", "yesky.com", "spankwire.com",
+            "ig.com.br", "imagevenue.com", "hubpages.com", "google.co.ve"};
+
+// TODO - this works, but is slow and cts doesn't do anything with the result.
+// Maybe require a min performance, a min cache size (detectable) and/or move
+// to perf testing
+    private static final int LOOKUP_COUNT_GOAL = URLS.length;
+    public void skiptestDnsPerf() {
+        ArrayList<String> results = new ArrayList<String>();
+        int failures = 0;
+        try {
+            for (int numberOfUrls = URLS.length; numberOfUrls > 0; numberOfUrls--) {
+                failures = 0;
+                int iterationLimit = LOOKUP_COUNT_GOAL / numberOfUrls;
+                long startTime = SystemClock.elapsedRealtimeNanos();
+                for (int iteration = 0; iteration < iterationLimit; iteration++) {
+                    for (int urlIndex = 0; urlIndex < numberOfUrls; urlIndex++) {
+                        try {
+                            InetAddress addr = InetAddress.getByName(URLS[urlIndex]);
+                        } catch (UnknownHostException e) {
+                            Log.e(TAG, "failed first lookup of " + URLS[urlIndex]);
+                            failures++;
+                            try {
+                                InetAddress addr = InetAddress.getByName(URLS[urlIndex]);
+                            } catch (UnknownHostException ee) {
+                                failures++;
+                                Log.e(TAG, "failed SECOND lookup of " + URLS[urlIndex]);
+                            }
+                        }
+                    }
+                }
+                long endTime = SystemClock.elapsedRealtimeNanos();
+                float nsPer = ((float)(endTime-startTime) / iterationLimit) / numberOfUrls/ 1000;
+                String thisResult = new String("getByName for " + numberOfUrls + " took " +
+                        (endTime - startTime)/1000 + "(" + nsPer + ") with " +
+                        failures + " failures\n");
+                Log.d(TAG, thisResult);
+                results.add(thisResult);
+            }
+            // build up a list of addresses
+            ArrayList<byte[]> addressList = new ArrayList<byte[]>();
+            for (String url : URLS) {
+                try {
+                    InetAddress addr = InetAddress.getByName(url);
+                    addressList.add(addr.getAddress());
+                } catch (UnknownHostException e) {
+                    Log.e(TAG, "Exception making reverseDNS list: " + e.toString());
+                }
+            }
+            for (int numberOfAddrs = addressList.size(); numberOfAddrs > 0; numberOfAddrs--) {
+                int iterationLimit = LOOKUP_COUNT_GOAL / numberOfAddrs;
+                failures = 0;
+                long startTime = SystemClock.elapsedRealtimeNanos();
+                for (int iteration = 0; iteration < iterationLimit; iteration++) {
+                    for (int addrIndex = 0; addrIndex < numberOfAddrs; addrIndex++) {
+                        try {
+                            InetAddress addr = InetAddress.getByAddress(addressList.get(addrIndex));
+                            String hostname = addr.getHostName();
+                        } catch (UnknownHostException e) {
+                            failures++;
+                            Log.e(TAG, "Failure doing reverse DNS lookup: " + e.toString());
+                            try {
+                                InetAddress addr =
+                                        InetAddress.getByAddress(addressList.get(addrIndex));
+                                String hostname = addr.getHostName();
+
+                            } catch (UnknownHostException ee) {
+                                failures++;
+                                Log.e(TAG, "Failure doing SECOND reverse DNS lookup: " +
+                                        ee.toString());
+                            }
+                        }
+                    }
+                }
+                long endTime = SystemClock.elapsedRealtimeNanos();
+                float nsPer = ((endTime-startTime) / iterationLimit) / numberOfAddrs / 1000;
+                String thisResult = new String("getHostName for " + numberOfAddrs + " took " +
+                        (endTime - startTime)/1000 + "(" + nsPer + ") with " +
+                        failures + " failures\n");
+                Log.d(TAG, thisResult);
+                results.add(thisResult);
+            }
+            for (String result : results) Log.d(TAG, result);
+
+            InetAddress exit = InetAddress.getByName("exitrightnow.com");
+            Log.e(TAG, " exit address= "+exit.toString());
+
+        } catch (Exception e) {
+            Log.e(TAG, "bad URL in testDnsPerf: " + e.toString());
+        }
+    }
+}
diff --git a/tests/tests/net/src/android/net/cts/TrafficStatsTest.java b/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
index 180d259..9483bdc 100644
--- a/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
+++ b/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
@@ -19,7 +19,11 @@
 import android.net.TrafficStats;
 import android.os.Process;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -29,6 +33,8 @@
 import java.util.concurrent.TimeUnit;
 
 public class TrafficStatsTest extends AndroidTestCase {
+    private static final String LOG_TAG = "TrafficStatsTest";
+
     public void testValidMobileStats() {
         // We can't assume a mobile network is even present in this test, so
         // we simply assert that a valid value is returned.
@@ -75,19 +81,39 @@
         return packetCount * (20 + 32 + bytes);
     }
 
+    private void accessOwnTrafficStats() throws IOException {
+        final int ownAppUid = getContext().getApplicationInfo().uid;
+        Log.d(LOG_TAG, "accesOwnTrafficStatsWithTags(): about to read qtaguid stats for own uid " + ownAppUid);
+
+        boolean foundOwnDetailedStats = false;
+        try {
+            BufferedReader qtaguidReader = new BufferedReader(new FileReader("/proc/net/xt_qtaguid/stats"));
+            String line;
+            while ((line = qtaguidReader.readLine()) != null) {
+                String tokens[] = line.split(" ");
+                if (tokens.length > 3 && tokens[3].equals(String.valueOf(ownAppUid))) {
+                    Log.d(LOG_TAG, "accessOwnTrafficStatsWithTags(): got own stats: " + line);
+                }
+            }
+            qtaguidReader.close();
+        } catch (FileNotFoundException e) {
+            fail("Was not able to access qtaguid/stats: " + e);
+        }
+    }
+
     public void testTrafficStatsForLocalhost() throws IOException {
-        long mobileTxPacketsBefore = TrafficStats.getMobileTxPackets();
-        long mobileRxPacketsBefore = TrafficStats.getMobileRxPackets();
-        long mobileTxBytesBefore = TrafficStats.getMobileTxBytes();
-        long mobileRxBytesBefore = TrafficStats.getMobileRxBytes();
-        long totalTxPacketsBefore = TrafficStats.getTotalTxPackets();
-        long totalRxPacketsBefore = TrafficStats.getTotalRxPackets();
-        long totalTxBytesBefore = TrafficStats.getTotalTxBytes();
-        long totalRxBytesBefore = TrafficStats.getTotalRxBytes();
-        long uidTxBytesBefore = TrafficStats.getUidTxBytes(Process.myUid());
-        long uidRxBytesBefore = TrafficStats.getUidRxBytes(Process.myUid());
-        long uidTxPacketsBefore = TrafficStats.getUidTxPackets(Process.myUid());
-        long uidRxPacketsBefore = TrafficStats.getUidRxPackets(Process.myUid());
+        final long mobileTxPacketsBefore = TrafficStats.getMobileTxPackets();
+        final long mobileRxPacketsBefore = TrafficStats.getMobileRxPackets();
+        final long mobileTxBytesBefore = TrafficStats.getMobileTxBytes();
+        final long mobileRxBytesBefore = TrafficStats.getMobileRxBytes();
+        final long totalTxPacketsBefore = TrafficStats.getTotalTxPackets();
+        final long totalRxPacketsBefore = TrafficStats.getTotalRxPackets();
+        final long totalTxBytesBefore = TrafficStats.getTotalTxBytes();
+        final long totalRxBytesBefore = TrafficStats.getTotalRxBytes();
+        final long uidTxBytesBefore = TrafficStats.getUidTxBytes(Process.myUid());
+        final long uidRxBytesBefore = TrafficStats.getUidRxBytes(Process.myUid());
+        final long uidTxPacketsBefore = TrafficStats.getUidTxPackets(Process.myUid());
+        final long uidRxPacketsBefore = TrafficStats.getUidRxPackets(Process.myUid());
 
         // Transfer 1MB of data across an explicitly localhost socket.
         final int byteCount = 1024;
@@ -104,22 +130,36 @@
                     socket.setTcpNoDelay(true);
                     OutputStream out = socket.getOutputStream();
                     byte[] buf = new byte[byteCount];
+                    TrafficStats.setThreadStatsTag(0x42);
+                    TrafficStats.tagSocket(socket);
+                    accessOwnTrafficStats();
                     for (int i = 0; i < packetCount; i++) {
                         out.write(buf);
                         out.flush();
+                        try {
+                            // Bug: 10668088, Even with Nagle disabled, and flushing the 1024 bytes
+                            // the kernel still regroups data into a larger packet.
+                            Thread.sleep(5);
+                        } catch (InterruptedException e) {
+                        }
                     }
                     out.close();
                     socket.close();
+                    accessOwnTrafficStats();
                 } catch (IOException e) {
+                    Log.i(LOG_TAG, "Badness during writes to socket: " + e);
                 }
             }
         }.start();
 
+        int read = 0;
         try {
             Socket socket = server.accept();
+            socket.setTcpNoDelay(true);
+            TrafficStats.setThreadStatsTag(0x43);
+            TrafficStats.tagSocket(socket);
             InputStream in = socket.getInputStream();
             byte[] buf = new byte[byteCount];
-            int read = 0;
             while (read < byteCount * packetCount) {
                 int n = in.read(buf);
                 assertTrue("Unexpected EOF", n > 0);
@@ -128,6 +168,7 @@
         } finally {
             server.close();
         }
+        assertTrue("Not all data read back", read >= byteCount * packetCount);
 
         // It's too fast to call getUidTxBytes function.
         try {
@@ -163,18 +204,30 @@
          *   + 7 approx.: syn, syn-ack, ack, fin-ack, ack, fin-ack, ack;
          *   but sometimes the last find-acks just vanish, so we set a lower limit of +5.
          */
-        assertTrue("uidtxp: " + uidTxPacketsBefore + " -> " + uidTxPacketsAfter + " delta=" + uidTxDeltaPackets,
-            uidTxDeltaPackets >= packetCount + 5 &&
-            uidTxDeltaPackets <= packetCount + packetCount + 7);
-        assertTrue("uidrxp: " + uidRxPacketsBefore + " -> " + uidRxPacketsAfter + " delta=" + uidRxDeltaPackets,
-            uidRxDeltaPackets >= packetCount + 5 &&
-            uidRxDeltaPackets <= packetCount + packetCount + 7);
-        assertTrue("uidtxb: " + uidTxBytesBefore + " -> " + uidTxBytesAfter + " delta=" + uidTxDeltaBytes,
-            uidTxDeltaBytes >= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(5, 0) &&
-            uidTxDeltaBytes <= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(packetCount + 7, 0));
-        assertTrue("uidrxb: " + uidRxBytesBefore + " -> " + uidRxBytesAfter + " delta=" + uidRxDeltaBytes,
-            uidRxDeltaBytes >= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(5, 0) &&
-            uidRxDeltaBytes <= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(packetCount + 7, 0));
+        final int maxExpectedExtraPackets = 7;
+        final int minExpectedExtraPackets = 5;
+
+
+        assertTrue("uidtxp: " + uidTxPacketsBefore + " -> " + uidTxPacketsAfter + " delta=" + uidTxDeltaPackets +
+            " Wanted: " + uidTxDeltaPackets + ">=" + packetCount + "+" + minExpectedExtraPackets + " && " +
+            uidTxDeltaPackets + "<=" + packetCount + "+" + packetCount + "+" + maxExpectedExtraPackets,
+            uidTxDeltaPackets >= packetCount + minExpectedExtraPackets &&
+            uidTxDeltaPackets <= packetCount + packetCount + maxExpectedExtraPackets);
+        assertTrue("uidrxp: " + uidRxPacketsBefore + " -> " + uidRxPacketsAfter + " delta=" + uidRxDeltaPackets +
+            " Wanted: " + uidRxDeltaPackets + ">=" + packetCount + "+" + minExpectedExtraPackets + " && " +
+            uidRxDeltaPackets + "<=" + packetCount + "+" + packetCount + "+" + maxExpectedExtraPackets,
+            uidRxDeltaPackets >= packetCount + minExpectedExtraPackets &&
+            uidRxDeltaPackets <= packetCount + packetCount + maxExpectedExtraPackets);
+        assertTrue("uidtxb: " + uidTxBytesBefore + " -> " + uidTxBytesAfter + " delta=" + uidTxDeltaBytes +
+            " Wanted: " + uidTxDeltaBytes + ">=" + tcpPacketToIpBytes(packetCount, byteCount) + "+" + tcpPacketToIpBytes(minExpectedExtraPackets, 0) + " && " +
+            uidTxDeltaBytes + "<=" + tcpPacketToIpBytes(packetCount, byteCount) + "+" + tcpPacketToIpBytes(packetCount + maxExpectedExtraPackets, 0),
+            uidTxDeltaBytes >= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(minExpectedExtraPackets, 0) &&
+            uidTxDeltaBytes <= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(packetCount + maxExpectedExtraPackets, 0));
+        assertTrue("uidrxb: " + uidRxBytesBefore + " -> " + uidRxBytesAfter + " delta=" + uidRxDeltaBytes +
+            " Wanted: " + uidRxDeltaBytes + ">=" + tcpPacketToIpBytes(packetCount, byteCount) + "+" + tcpPacketToIpBytes(minExpectedExtraPackets, 0) + " && " +
+            uidRxDeltaBytes + "<=" + tcpPacketToIpBytes(packetCount, byteCount) + "+" + tcpPacketToIpBytes(packetCount + maxExpectedExtraPackets, 0),
+            uidRxDeltaBytes >= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(minExpectedExtraPackets, 0) &&
+            uidRxDeltaBytes <= tcpPacketToIpBytes(packetCount, byteCount) + tcpPacketToIpBytes(packetCount + maxExpectedExtraPackets, 0));
 
         // Localhost traffic *does* count against total stats.
         // Fudge by 132 packets of 1500 bytes not related to the test.
diff --git a/tests/tests/net/src/android/net/http/cts/SslErrorTest.java b/tests/tests/net/src/android/net/http/cts/SslErrorTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/net/src/android/net/ipv6/cts/PingTest.java b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
new file mode 100644
index 0000000..41eb03d
--- /dev/null
+++ b/tests/tests/net/src/android/net/ipv6/cts/PingTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2013 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 android.net.ipv6.cts;
+
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import libcore.io.ErrnoException;
+import libcore.io.Libcore;
+import libcore.io.StructTimeval;
+import static libcore.io.OsConstants.*;
+
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Inet6Address;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Random;
+
+public class PingTest extends AndroidTestCase {
+    /** Maximum size of the packets we're using to test. */
+    private static final int MAX_SIZE = 4096;
+
+    /** Number of packets to test. */
+    private static final int NUM_PACKETS = 10;
+
+    /** The beginning of an ICMPv6 echo request: type, code, and uninitialized checksum. */
+    private static final byte[] PING_HEADER = new byte[] {
+        (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00
+    };
+
+    /**
+     * Returns a byte array containing an ICMPv6 echo request with the specified payload length.
+     */
+    private byte[] pingPacket(int payloadLength) {
+        byte[] packet = new byte[payloadLength + 8];
+        new Random().nextBytes(packet);
+        System.arraycopy(PING_HEADER, 0, packet, 0, PING_HEADER.length);
+        return packet;
+    }
+
+    /**
+     * Checks that the first length bytes of two byte arrays are equal.
+     */
+    private void assertArrayBytesEqual(byte[] expected, byte[] actual, int length) {
+        for (int i = 0; i < length; i++) {
+            assertEquals("Arrays differ at index " + i + ":", expected[i], actual[i]);
+        }
+    }
+
+    /**
+     * Creates an IPv6 ping socket and sets a receive timeout of 100ms.
+     */
+    private FileDescriptor createPingSocket() throws ErrnoException {
+        FileDescriptor s = Libcore.os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_ICMPV6);
+        Libcore.os.setsockoptTimeval(s, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(100));
+        return s;
+    }
+
+    /**
+     * Sends a ping packet to a random port on the specified address on the specified socket.
+     */
+    private void sendPing(FileDescriptor s,
+            InetAddress address, byte[] packet) throws ErrnoException, IOException {
+        // Pick a random port. Choose a range that gives a reasonable chance of picking a low port.
+        int port = (int) (Math.random() * 2048);
+
+        // Send the packet.
+        int ret = Libcore.os.sendto(s, ByteBuffer.wrap(packet), 0, address, port);
+        assertEquals(packet.length, ret);
+    }
+
+    /**
+     * Checks that a socket has received a response appropriate to the specified packet.
+     */
+    private void checkResponse(FileDescriptor s,
+            InetAddress dest, byte[] sent) throws ErrnoException, IOException {
+        // Receive the response.
+        InetSocketAddress from = new InetSocketAddress();
+        ByteBuffer responseBuffer = ByteBuffer.allocate(MAX_SIZE);
+        int bytesRead = Libcore.os.recvfrom(s, responseBuffer, 0, from);
+
+        // Check the source address and scope ID.
+        assertTrue(from.getAddress() instanceof Inet6Address);
+        Inet6Address fromAddress = (Inet6Address) from.getAddress();
+        assertEquals(0, fromAddress.getScopeId());
+        assertNull(fromAddress.getScopedInterface());
+        assertEquals(dest.getHostAddress(), fromAddress.getHostAddress());
+
+        // Check the packet length.
+        assertEquals(sent.length, bytesRead);
+
+        // Check the response is an echo reply.
+        byte[] response = new byte[bytesRead];
+        responseBuffer.get(response, 0, bytesRead);
+        assertEquals((byte) 0x81, response[0]);
+
+        // Find out what ICMP ID was used in the packet that was sent.
+        int id = ((InetSocketAddress) Libcore.os.getsockname(s)).getPort();
+        sent[4] = (byte) (id / 256);
+        sent[5] = (byte) (id % 256);
+
+        // Ensure the response is the same as the packet, except for the type (which is 0x81)
+        // and the ID and checksum,  which are set by the kernel.
+        response[0] = (byte) 0x80;                 // Type.
+        response[2] = response[3] = (byte) 0x00;   // Checksum.
+        assertArrayBytesEqual(response, sent, bytesRead);
+    }
+
+    /**
+     * Sends NUM_PACKETS random ping packets to ::1 and checks the replies.
+     */
+    public void testLoopbackPing() throws ErrnoException, IOException {
+        // Generate a random ping packet and send it to localhost.
+        InetAddress ipv6Loopback = InetAddress.getByName(null);
+        assertEquals("localhost/::1", ipv6Loopback.toString());
+
+        for (int i = 0; i < NUM_PACKETS; i++) {
+            byte[] packet = pingPacket((int) (Math.random() * MAX_SIZE));
+            FileDescriptor s = createPingSocket();
+            sendPing(s, ipv6Loopback, packet);
+            checkResponse(s, ipv6Loopback, packet);
+            // Check closing the socket doesn't raise an exception.
+            Libcore.os.close(s);
+        }
+    }
+}
diff --git a/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java b/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java
new file mode 100644
index 0000000..d1e4c44
--- /dev/null
+++ b/tests/tests/net/src/android/net/wifi/cts/NsdManagerTest.java
@@ -0,0 +1,459 @@
+/*
+ * Copyright (C) 2012 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 android.net.wifi.cts;
+
+import android.content.Context;
+import android.net.nsd.NsdManager;
+import android.net.nsd.NsdServiceInfo;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.util.Random;
+import java.util.List;
+import java.util.ArrayList;
+
+public class NsdManagerTest extends AndroidTestCase {
+
+    private static final String TAG = "NsdManagerTest";
+    private static final String SERVICE_TYPE = "_nmt._tcp";
+    private static final int TIMEOUT = 2000;
+
+    private static final boolean DBG = false;
+
+    NsdManager mNsdManager;
+
+    NsdManager.RegistrationListener mRegistrationListener;
+    NsdManager.DiscoveryListener mDiscoveryListener;
+    NsdManager.ResolveListener mResolveListener;
+
+    public NsdManagerTest() {
+        initRegistrationListener();
+        initDiscoveryListener();
+        initResolveListener();
+    }
+
+    private void initRegistrationListener() {
+        mRegistrationListener = new NsdManager.RegistrationListener() {
+            @Override
+            public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
+                setEvent("onRegistrationFailed", errorCode);
+            }
+
+            @Override
+            public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
+                setEvent("onUnregistrationFailed", errorCode);
+            }
+
+            @Override
+            public void onServiceRegistered(NsdServiceInfo serviceInfo) {
+                setEvent("onServiceRegistered", serviceInfo);
+            }
+
+            @Override
+            public void onServiceUnregistered(NsdServiceInfo serviceInfo) {
+                setEvent("onServiceUnregistered", serviceInfo);
+            }
+        };
+    }
+
+    private void initDiscoveryListener() {
+        mDiscoveryListener = new NsdManager.DiscoveryListener() {
+            @Override
+            public void onStartDiscoveryFailed(String serviceType, int errorCode) {
+                setEvent("onStartDiscoveryFailed", errorCode);
+            }
+
+            @Override
+            public void onStopDiscoveryFailed(String serviceType, int errorCode) {
+                setEvent("onStopDiscoveryFailed", errorCode);
+            }
+
+            @Override
+            public void onDiscoveryStarted(String serviceType) {
+                NsdServiceInfo info = new NsdServiceInfo();
+                info.setServiceType(serviceType);
+                setEvent("onDiscoveryStarted", info);
+            }
+
+            @Override
+            public void onDiscoveryStopped(String serviceType) {
+                NsdServiceInfo info = new NsdServiceInfo();
+                info.setServiceType(serviceType);
+                setEvent("onDiscoveryStopped", info);
+            }
+
+            @Override
+            public void onServiceFound(NsdServiceInfo serviceInfo) {
+                setEvent("onServiceFound", serviceInfo);
+            }
+
+            @Override
+            public void onServiceLost(NsdServiceInfo serviceInfo) {
+                setEvent("onServiceLost", serviceInfo);
+            }
+        };
+    }
+
+    private void initResolveListener() {
+        mResolveListener = new NsdManager.ResolveListener() {
+            @Override
+            public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
+                setEvent("onResolveFailed", errorCode);
+            }
+
+            @Override
+            public void onServiceResolved(NsdServiceInfo serviceInfo) {
+                setEvent("onServiceResolved", serviceInfo);
+            }
+        };
+    }
+
+
+
+    private final class EventData {
+        EventData(String callbackName, NsdServiceInfo info) {
+            mCallbackName = callbackName;
+            mSucceeded = true;
+            mErrorCode = 0;
+            mInfo = info;
+        }
+        EventData(String callbackName, int errorCode) {
+            mCallbackName = callbackName;
+            mSucceeded = false;
+            mErrorCode = errorCode;
+            mInfo = null;
+        }
+        private final String mCallbackName;
+        private final boolean mSucceeded;
+        private final int mErrorCode;
+        private final NsdServiceInfo mInfo;
+    }
+
+    private final List<EventData> mEventCache = new ArrayList<EventData>();
+
+    private void setEvent(String callbackName, int errorCode) {
+        if (DBG) Log.d(TAG, callbackName + " failed with " + String.valueOf(errorCode));
+        EventData eventData = new EventData(callbackName, errorCode);
+        synchronized (mEventCache) {
+            mEventCache.add(eventData);
+            mEventCache.notify();
+        }
+    }
+
+    private void setEvent(String callbackName, NsdServiceInfo info) {
+        if (DBG) Log.d(TAG, "Received event " + callbackName + " for " + info.getServiceName());
+        EventData eventData = new EventData(callbackName, info);
+        synchronized (mEventCache) {
+            mEventCache.add(eventData);
+            mEventCache.notify();
+        }
+    }
+
+    void clearEventCache() {
+        synchronized(mEventCache) {
+            mEventCache.clear();
+        }
+    }
+
+    int eventCacheSize() {
+        synchronized(mEventCache) {
+            return mEventCache.size();
+        }
+    }
+
+    private int mWaitId = 0;
+    private EventData waitForCallback(String callbackName) {
+
+        synchronized(mEventCache) {
+
+            mWaitId ++;
+            if (DBG) Log.d(TAG, "Waiting for " + callbackName + ", id=" + String.valueOf(mWaitId));
+
+            try {
+                long startTime = android.os.SystemClock.uptimeMillis();
+                long elapsedTime = 0;
+                int index = 0;
+                while (elapsedTime < TIMEOUT ) {
+                    // first check if we've received that event
+                    for (; index < mEventCache.size(); index++) {
+                        EventData e = mEventCache.get(index);
+                        if (e.mCallbackName.equals(callbackName)) {
+                            if (DBG) Log.d(TAG, "exiting wait id=" + String.valueOf(mWaitId));
+                            return e;
+                        }
+                    }
+
+                    // Not yet received, just wait
+                    mEventCache.wait(TIMEOUT - elapsedTime);
+                    elapsedTime = android.os.SystemClock.uptimeMillis() - startTime;
+                }
+                // we exited the loop because of TIMEOUT; fail the call
+                if (DBG) Log.d(TAG, "timed out waiting id=" + String.valueOf(mWaitId));
+                return null;
+            } catch (InterruptedException e) {
+                return null;                       // wait timed out!
+            }
+        }
+    }
+
+    private EventData waitForNewEvents() throws InterruptedException {
+        if (DBG) Log.d(TAG, "Waiting for a bit, id=" + String.valueOf(mWaitId));
+
+        long startTime = android.os.SystemClock.uptimeMillis();
+        long elapsedTime = 0;
+        synchronized (mEventCache) {
+            int index = mEventCache.size();
+            while (elapsedTime < TIMEOUT ) {
+                // first check if we've received that event
+                for (; index < mEventCache.size(); index++) {
+                    EventData e = mEventCache.get(index);
+                    return e;
+                }
+
+                // Not yet received, just wait
+                mEventCache.wait(TIMEOUT - elapsedTime);
+                elapsedTime = android.os.SystemClock.uptimeMillis() - startTime;
+            }
+        }
+
+        return null;
+    }
+
+    private String mServiceName;
+
+    @Override
+    public void setUp() {
+        if (DBG) Log.d(TAG, "Setup test ...");
+        mNsdManager = (NsdManager) getContext().getSystemService(Context.NSD_SERVICE);
+
+        Random rand = new Random();
+        mServiceName = new String("NsdTest");
+        for (int i = 0; i < 4; i++) {
+            mServiceName = mServiceName + String.valueOf(rand.nextInt(10));
+        }
+    }
+
+    @Override
+    public void tearDown() {
+        if (DBG) Log.d(TAG, "Tear down test ...");
+    }
+
+    public void runTest() throws Exception {
+        NsdServiceInfo si = new NsdServiceInfo();
+        si.setServiceType(SERVICE_TYPE);
+        si.setServiceName(mServiceName);
+
+        EventData lastEvent = null;
+
+        if (DBG) Log.d(TAG, "Starting test ...");
+
+        ServerSocket socket;
+        int localPort;
+
+        try {
+            socket = new ServerSocket(0);
+            localPort = socket.getLocalPort();
+            si.setPort(localPort);
+        } catch (IOException e) {
+            if (DBG) Log.d(TAG, "Could not open a local socket");
+            assertTrue(false);
+            return;
+        }
+
+        if (DBG) Log.d(TAG, "Port = " + String.valueOf(localPort));
+
+        clearEventCache();
+
+        mNsdManager.registerService(si, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
+        lastEvent = waitForCallback("onServiceRegistered");                 // id = 1
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+        assertTrue(eventCacheSize() == 1);
+
+        // We may not always get the name that we tried to register;
+        // This events tells us the name that was registered.
+        String registeredName = lastEvent.mInfo.getServiceName();
+        si.setServiceName(registeredName);
+
+        clearEventCache();
+
+        mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD,
+                mDiscoveryListener);
+
+        // Expect discovery started
+        lastEvent = waitForCallback("onDiscoveryStarted");                  // id = 2
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+
+        // Remove this event, so accounting becomes easier later
+        synchronized (mEventCache) {
+            mEventCache.remove(lastEvent);
+        }
+
+        // Expect a service record to be discovered (and filter the ones
+        // that are unrelated to this test)
+        boolean found = false;
+        for (int i = 0; i < 32; i++) {
+
+            lastEvent = waitForCallback("onServiceFound");                  // id = 3
+            if (lastEvent == null) {
+                // no more onServiceFound events are being reported!
+                break;
+            }
+
+            assertTrue(lastEvent.mSucceeded);
+
+            if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": ServiceName = " +
+                    lastEvent.mInfo.getServiceName());
+
+            if (lastEvent.mInfo.getServiceName().equals(registeredName)) {
+                // Save it, as it will get overwritten with new serviceFound events
+                si = lastEvent.mInfo;
+                found = true;
+            }
+
+            // Remove this event from the event cache, so it won't be found by subsequent
+            // calls to waitForCallback
+            synchronized (mEventCache) {
+                mEventCache.remove(lastEvent);
+            }
+        }
+
+        assertTrue(found);
+
+        // We've removed all serviceFound events, and we've removed the discoveryStarted
+        // event as well, so now the event cache should be empty!
+        assertTrue(eventCacheSize() == 0);
+
+        // Resolve the service
+        clearEventCache();
+        mNsdManager.resolveService(si, mResolveListener);
+        lastEvent = waitForCallback("onServiceResolved");                   // id = 4
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+
+        if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": Port = " +
+                String.valueOf(lastEvent.mInfo.getPort()));
+
+        assertTrue(lastEvent.mInfo.getPort() == localPort);
+        assertTrue(eventCacheSize() == 1);
+
+        assertTrue(checkForAdditionalEvents());
+        clearEventCache();
+
+        // Unregister the service
+        mNsdManager.unregisterService(mRegistrationListener);
+        lastEvent = waitForCallback("onServiceUnregistered");               // id = 5
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+
+        // Expect a callback for service lost
+        lastEvent = waitForCallback("onServiceLost");                       // id = 6
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
+
+        assertTrue(eventCacheSize() == 2);
+
+        // Register service again to see if we discover it
+        checkForAdditionalEvents();
+        clearEventCache();
+
+        si = new NsdServiceInfo();
+        si.setServiceType(SERVICE_TYPE);
+        si.setServiceName(mServiceName);
+        si.setPort(localPort);
+
+        // Create a new registration listener and register same service again
+        initRegistrationListener();
+
+        mNsdManager.registerService(si, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
+
+        lastEvent = waitForCallback("onServiceRegistered");                 // id = 7
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+
+        registeredName = lastEvent.mInfo.getServiceName();
+
+        // Expect a record to be discovered
+        lastEvent = waitForCallback("onServiceFound");                      // id = 8
+
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+
+        if (DBG) Log.d(TAG, "id = " + String.valueOf(mWaitId) + ": ServiceName = " +
+                lastEvent.mInfo.getServiceName());
+
+        assertTrue(lastEvent.mInfo.getServiceName().equals(registeredName));
+        assertTrue(checkCacheSize(2));
+
+        checkForAdditionalEvents();
+        clearEventCache();
+
+        mNsdManager.stopServiceDiscovery(mDiscoveryListener);
+        lastEvent = waitForCallback("onDiscoveryStopped");                  // id = 9
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+        assertTrue(checkCacheSize(1));
+
+        checkForAdditionalEvents();
+        clearEventCache();
+
+        mNsdManager.unregisterService(mRegistrationListener);
+
+        lastEvent =  waitForCallback("onServiceUnregistered");              // id = 10
+        assertTrue(lastEvent != null);
+        assertTrue(lastEvent.mSucceeded);
+        assertTrue(checkCacheSize(1));
+    }
+
+    boolean checkCacheSize(int size) {
+        synchronized (mEventCache) {
+            int cacheSize = mEventCache.size();
+            if (cacheSize != size) {
+                Log.d(TAG, "id = " + mWaitId + ": event cache size = " + cacheSize);
+                for (int i = 0; i < cacheSize; i++) {
+                    EventData e = mEventCache.get(i);
+                    String sname = (e.mInfo != null) ? "(" + e.mInfo.getServiceName() + ")" : "";
+                    Log.d(TAG, "eventName is " + e.mCallbackName + sname);
+                }
+            }
+            return (cacheSize == size);
+        }
+    }
+
+    boolean checkForAdditionalEvents() {
+        try {
+            EventData e = waitForNewEvents();
+            if (e != null) {
+                String sname = (e.mInfo != null) ? "(" + e.mInfo.getServiceName() + ")" : "";
+                Log.d(TAG, "ignoring unexpected event " + e.mCallbackName + sname);
+            }
+            return (e == null);
+        }
+        catch (InterruptedException ex) {
+            return false;
+        }
+    }
+}
+
diff --git a/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/GL2JniLibOne.java b/tests/tests/opengl/src/android/opengl/cts/GL2JniLibOne.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
old mode 100755
new mode 100644
index ac4fce5..4602d4f
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright (C) 2012 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 android.opengl.cts;
 
 import android.app.Activity;
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/ProgramTest.java b/tests/tests/opengl/src/android/opengl/cts/ProgramTest.java
index a69c8e5..85009d2 100644
--- a/tests/tests/opengl/src/android/opengl/cts/ProgramTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/ProgramTest.java
@@ -11,7 +11,7 @@
  * 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 android.opengl.cts;
 
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/Vertex.java b/tests/tests/opengl/src/android/opengl/cts/Vertex.java
old mode 100755
new mode 100644
diff --git a/tests/tests/opengl/src/android/opengl/cts/WrapperTest.java b/tests/tests/opengl/src/android/opengl/cts/WrapperTest.java
new file mode 100644
index 0000000..895a02b
--- /dev/null
+++ b/tests/tests/opengl/src/android/opengl/cts/WrapperTest.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2013 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 android.opengl.cts;
+
+import android.opengl.EGL14;
+import android.opengl.EGLConfig;
+import android.opengl.EGLContext;
+import android.opengl.EGLDisplay;
+import android.opengl.EGLSurface;
+import android.opengl.GLES10;
+import android.opengl.GLES20;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+
+/**
+ * Test some aspects of the Java-language wrappers generated for OpenGL.
+ */
+public class WrapperTest extends AndroidTestCase {
+    private static final String TAG = "WrapperTest";
+
+    private EGLDisplay mEGLDisplay;
+    private EGLContext mEGLContext;
+    private EGLSurface mEGLSurface;
+
+
+    /**
+     * Tests range-checking on glGetIntegerv in GLES 1.x.
+     */
+    public void testGetIntegerv1() {
+        eglSetup(1, 1, 1);  // GLES 1.x with 1x1 pbuffer
+
+        checkGlError("start");
+
+        int[] countBuf = new int[1];
+        GLES10.glGetIntegerv(GLES10.GL_NUM_COMPRESSED_TEXTURE_FORMATS, countBuf, 0);
+        checkGlError("glGetIntegerv(count)");
+
+        int formatCount = countBuf[0];
+        Log.d(TAG, "got count=" + formatCount);
+
+        // try with a buffer large enough to hold all results
+        GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, new int[formatCount], 0);
+        checkGlError("glGetIntegerv(full1)");
+
+        // try with an exact-fit IntBuffer
+        ByteBuffer fullByteBuf = ByteBuffer.allocateDirect(4 * formatCount);
+        IntBuffer fullIntBuf = fullByteBuf.asIntBuffer();
+        GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, fullIntBuf);
+        checkGlError("glGetIntegerv(full2)");
+
+        // try with an oversized IntBuffer with an offset
+        final int OFFSET = 5;
+        ByteBuffer oversizeByteBuf = ByteBuffer.allocateDirect(4 * (formatCount+OFFSET));
+        IntBuffer oversizeIntBuf = oversizeByteBuf.asIntBuffer();
+        oversizeIntBuf.position(OFFSET);
+        GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, oversizeIntBuf);
+        checkGlError("glGetIntegerv(full3)");
+        assertEquals(oversizeIntBuf.get(OFFSET), fullIntBuf.get(0));
+
+        // retry with a buffer that's too small -- should throw
+        ByteBuffer partialByteBuf = ByteBuffer.allocateDirect(4 * (formatCount - 1));
+        IntBuffer partialIntBuf = partialByteBuf.asIntBuffer();
+        try {
+            GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, partialIntBuf);
+            checkGlError("glGetIntegerv(partial1)");
+            throw new RuntimeException("buffer has overrun (intbuf)");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            GLES10.glGetIntegerv(GLES10.GL_COMPRESSED_TEXTURE_FORMATS, new int[formatCount-1], 0);
+            checkGlError("glGetIntegerv(partial2)");
+            throw new RuntimeException("buffer has overrun (int[])");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        eglRelease();
+    }
+
+    /**
+     * Tests range-checking on glGetIntegerv in GLES 2.x.
+     */
+    public void testGetIntegerv2() {
+        eglSetup(2, 1, 1);  // GLES 2.x with 1x1 pbuffer
+
+        checkGlError("start");
+
+        int[] countBuf = new int[1];
+        GLES20.glGetIntegerv(GLES20.GL_NUM_COMPRESSED_TEXTURE_FORMATS, countBuf, 0);
+        checkGlError("glGetIntegerv(count)");
+
+        int formatCount = countBuf[0];
+        Log.d(TAG, "got count=" + formatCount);
+
+        // try with a buffer large enough to hold all results
+        GLES20.glGetIntegerv(GLES20.GL_COMPRESSED_TEXTURE_FORMATS, new int[formatCount], 0);
+        checkGlError("glGetIntegerv(full1)");
+
+        // try with an exact-fit IntBuffer
+        ByteBuffer fullByteBuf = ByteBuffer.allocateDirect(4 * formatCount);
+        IntBuffer fullIntBuf = fullByteBuf.asIntBuffer();
+        GLES20.glGetIntegerv(GLES20.GL_COMPRESSED_TEXTURE_FORMATS, fullIntBuf);
+        checkGlError("glGetIntegerv(full2)");
+
+        // try with an oversized IntBuffer with an offset
+        final int OFFSET = 5;
+        ByteBuffer oversizeByteBuf = ByteBuffer.allocateDirect(4 * (formatCount+OFFSET));
+        IntBuffer oversizeIntBuf = oversizeByteBuf.asIntBuffer();
+        oversizeIntBuf.position(OFFSET);
+        GLES20.glGetIntegerv(GLES20.GL_COMPRESSED_TEXTURE_FORMATS, oversizeIntBuf);
+        checkGlError("glGetIntegerv(full3)");
+        assertEquals(oversizeIntBuf.get(OFFSET), fullIntBuf.get(0));
+
+        // retry with a buffer that's too small -- should throw
+        ByteBuffer partialByteBuf = ByteBuffer.allocateDirect(4 * (formatCount - 1));
+        IntBuffer partialIntBuf = partialByteBuf.asIntBuffer();
+        try {
+            GLES20.glGetIntegerv(GLES20.GL_COMPRESSED_TEXTURE_FORMATS, partialIntBuf);
+            checkGlError("glGetIntegerv(partial1)");
+            throw new RuntimeException("buffer has overrun (intbuf)");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        try {
+            GLES20.glGetIntegerv(GLES20.GL_COMPRESSED_TEXTURE_FORMATS, new int[formatCount-1], 0);
+            checkGlError("glGetIntegerv(partial2)");
+            throw new RuntimeException("buffer has overrun (int[])");
+        } catch (IllegalArgumentException iae) {
+            // good
+        }
+
+        eglRelease();
+    }
+
+    /**
+     * Tests whether EGL is releasing resources when the thread exits.  If
+     * it doesn't, we'll consume memory rapidly, and will fail or be
+     * killed within a couple hundred iterations.
+     * <p>
+     * It may be worthwhile to watch the memory growth with procrank or showmap
+     * while the test runs to detect smaller leaks.
+     */
+    public void testThreadCleanup() throws Throwable {
+        class WrappedTest implements Runnable {
+            public Throwable mThrowable;
+
+            private static final int WIDTH = 1280;
+            private static final int HEIGHT = 720;
+
+            @Override
+            public void run() {
+                try {
+                    eglSetup(2, WIDTH, HEIGHT);
+                    if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+                        throw new RuntimeException("eglMakeCurrent failed");
+                    }
+                    eglRelease();
+                } catch (Throwable th) {
+                    mThrowable = th;
+                }
+            }
+        }
+
+        WrappedTest wrappedTest = new WrappedTest();
+
+        // Android has "reference-counted" EGL initialization.  We want our eglTerminate call
+        // to be the "last" termination, since that's the situation we're trying to test, but
+        // it's possible that some previous test failed to balance eglInitialize and
+        // eglTerminate.  So we call eglTerminate several times in a desperate attempt to
+        // zero out the refcount.
+        //
+        // Before we can terminate we need to be sure that the display has been initialized
+        // at least once.
+        eglSetup(2, 1, 1);
+        for (int i = 0; i < 100; i++) {
+            EGL14.eglTerminate(mEGLDisplay);
+        }
+
+        for (int i = 0; i < 1000; i++) {
+            if ((i % 25) == 0) {
+                Log.d(TAG, "iteration " + i);
+            }
+
+            Thread th = new Thread(wrappedTest, "EGL thrash");
+            th.start();
+            th.join();
+            if (wrappedTest.mThrowable != null) {
+                throw wrappedTest.mThrowable;
+            }
+        }
+    }
+
+    /**
+     * Checks for GL errors.
+     */
+    public void checkGlError(String op) {
+        int error;
+        while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
+            Log.e(TAG, op + ": glError " + error);
+            throw new RuntimeException(op + ": glError " + error);
+        }
+    }
+
+    /**
+     * Prepares EGL.  Pass in the desired GLES API version (1 or 2).
+     * <p>
+     * Sets mEGLDisplay, mEGLContext, and mEGLSurface, and makes them current.
+     */
+    private void eglSetup(int api, int width, int height) {
+        mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
+        if (mEGLDisplay == EGL14.EGL_NO_DISPLAY) {
+            throw new RuntimeException("unable to get EGL14 display");
+        }
+        int[] version = new int[2];
+        if (!EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1)) {
+            mEGLDisplay = null;
+            throw new RuntimeException("unable to initialize EGL14");
+        }
+
+        int renderableType;
+        switch (api) {
+            case 1:
+                renderableType = EGL14.EGL_OPENGL_ES_BIT;
+                break;
+            case 2:
+                renderableType = EGL14.EGL_OPENGL_ES2_BIT;
+                break;
+            default:
+                throw new RuntimeException("unsupported API level " + api);
+        }
+
+        // Configure EGL for OpenGL ES 1.0 or 2.0, with a pbuffer
+        int[] attribList = {
+                EGL14.EGL_RED_SIZE, 8,
+                EGL14.EGL_GREEN_SIZE, 8,
+                EGL14.EGL_BLUE_SIZE, 8,
+                EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT,
+                EGL14.EGL_RENDERABLE_TYPE, renderableType,
+                EGL14.EGL_NONE
+        };
+        EGLConfig[] configs = new EGLConfig[1];
+        int[] numConfigs = new int[1];
+        if (!EGL14.eglChooseConfig(mEGLDisplay, attribList, 0, configs, 0, configs.length,
+                numConfigs, 0)) {
+            throw new RuntimeException("unable to find RGB888+pbuffer ES" + api + " EGL config");
+        }
+
+        // Create context
+        int[] attrib_list = {
+                EGL14.EGL_CONTEXT_CLIENT_VERSION, api,
+                EGL14.EGL_NONE
+        };
+        mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT,
+                attrib_list, 0);
+        checkEglError("eglCreateContext");
+        if (mEGLContext == null) {
+            throw new RuntimeException("null context");
+        }
+
+        // Create a 1x1 pbuffer surface
+        int[] surfaceAttribs = {
+                EGL14.EGL_WIDTH, width,
+                EGL14.EGL_HEIGHT, height,
+                EGL14.EGL_NONE
+        };
+        mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], surfaceAttribs, 0);
+        checkEglError("eglCreatePbufferSurface");
+        if (mEGLSurface == null) {
+            throw new RuntimeException("surface was null");
+        }
+
+        // Make it current
+        if (!EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
+            throw new RuntimeException("eglMakeCurrent failed");
+        }
+    }
+
+    /**
+     * Releases EGL goodies.
+     */
+    private void eglRelease() {
+        // Terminating the display will release most objects, but won't discard the current
+        // surfaces and context until we release the thread.  It shouldn't matter what order
+        // we do these in.
+        if (mEGLDisplay != null) {
+            EGL14.eglTerminate(mEGLDisplay);
+            EGL14.eglReleaseThread();
+        }
+
+        // null everything out so future attempts to use this object will cause an NPE
+        mEGLDisplay = null;
+        mEGLContext = null;
+        mEGLSurface = null;
+    }
+
+    /**
+     * Checks for EGL errors.
+     */
+    private void checkEglError(String msg) {
+        boolean failed = false;
+        int error;
+        while ((error = EGL14.eglGetError()) != EGL14.EGL_SUCCESS) {
+            Log.e(TAG, msg + ": EGL error: 0x" + Integer.toHexString(error));
+            failed = true;
+        }
+        if (failed) {
+            throw new RuntimeException("EGL error encountered (see log)");
+        }
+    }
+}
diff --git a/tests/tests/openglperf/Android.mk b/tests/tests/openglperf/Android.mk
index e10d1c7..55c39f2 100644
--- a/tests/tests/openglperf/Android.mk
+++ b/tests/tests/openglperf/Android.mk
@@ -23,7 +23,7 @@
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsutil
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner ctsdeviceutil
 
 LOCAL_JNI_SHARED_LIBRARIES := libctsopenglperf_jni
 
diff --git a/tests/tests/os/Android.mk b/tests/tests/os/Android.mk
index be0ab83..f43043b 100644
--- a/tests/tests/os/Android.mk
+++ b/tests/tests/os/Android.mk
@@ -21,11 +21,14 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
+LOCAL_PROGUARD_ENABLED := disabled
+
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner guava
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+        src/android/os/cts/IParcelFileDescriptorPeer.aidl
 
 LOCAL_PACKAGE_NAME := CtsOsTestCases
 
diff --git a/tests/tests/os/AndroidManifest.xml b/tests/tests/os/AndroidManifest.xml
index 64b45be..2418132 100644
--- a/tests/tests/os/AndroidManifest.xml
+++ b/tests/tests/os/AndroidManifest.xml
@@ -19,7 +19,18 @@
     package="com.android.cts.os">
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
+    <uses-permission android:name="android.permission.INTERNET" />
+
     <application>
+        <service
+            android:name="android.os.cts.ParcelFileDescriptorPeer$Red"
+            android:process=":red"
+            android:exported="true" />
+        <service
+            android:name="android.os.cts.ParcelFileDescriptorPeer$Blue"
+            android:process=":blue"
+            android:exported="true" />
         <uses-library android:name="android.test.runner" />
     </application>
 
@@ -28,4 +39,3 @@
                      android:label="CTS tests of android.os"/>
 
 </manifest>
-
diff --git a/tests/tests/os/src/android/os/cts/AbiTest.java b/tests/tests/os/src/android/os/cts/AbiTest.java
index 69b314d..a342669 100644
--- a/tests/tests/os/src/android/os/cts/AbiTest.java
+++ b/tests/tests/os/src/android/os/cts/AbiTest.java
@@ -49,10 +49,15 @@
             if (f.isDirectory()) {
                 checkElfFilesInDirectory(f);
             } else if (f.getName().endsWith(".so") || f.canExecute()) {
-                try {
-                    ReadElf.read(f);
+                ReadElf elf = null;
+                try { // TODO: switch to try-with-resources.
+                    elf = ReadElf.read(f);
                 } catch (IllegalArgumentException ignored) {
                     // If it's not actually an ELF file, we don't care.
+                } finally {
+                    if (elf != null) {
+                        elf.close();
+                    }
                 }
             }
         }
diff --git a/tests/tests/os/src/android/os/cts/BuildTest.java b/tests/tests/os/src/android/os/cts/BuildTest.java
index a59484a..7176a6d 100644
--- a/tests/tests/os/src/android/os/cts/BuildTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildTest.java
@@ -157,7 +157,7 @@
     private static final Pattern PRODUCT_PATTERN =
         Pattern.compile("^([0-9A-Za-z._-]+)$");
     private static final Pattern SERIAL_NUMBER_PATTERN =
-        Pattern.compile("^([0-9A-Za-z]{0,20})$");
+        Pattern.compile("^([0-9A-Za-z]{6,20})$");
     private static final Pattern TAGS_PATTERN =
         Pattern.compile("^([0-9A-Za-z.,_-]+)$");
     private static final Pattern TYPE_PATTERN =
diff --git a/tests/tests/os/src/android/os/cts/BuildVersionTest.java b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
index d1b88a1..1b078ac 100644
--- a/tests/tests/os/src/android/os/cts/BuildVersionTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
@@ -29,8 +29,8 @@
 
     private static final String LOG_TAG = "BuildVersionTest";
     private static final Set<String> EXPECTED_RELEASES =
-            new HashSet<String>(Arrays.asList("4.3"));
-    private static final int EXPECTED_SDK = 18;
+        new HashSet<String>(Arrays.asList("4.4", "4.4.1", "4.4.2", "4.4.3", "4.4.4"));
+    private static final int EXPECTED_SDK = 19;
 
     @SuppressWarnings("deprecation")
     public void testReleaseVersion() {
diff --git a/tests/tests/os/src/android/os/cts/BundleTest.java b/tests/tests/os/src/android/os/cts/BundleTest.java
index c8582f2..7674b6b 100644
--- a/tests/tests/os/src/android/os/cts/BundleTest.java
+++ b/tests/tests/os/src/android/os/cts/BundleTest.java
@@ -72,6 +72,17 @@
         new Bundle(getClass().getClassLoader());
     }
 
+    public void testEmptyStream() {
+        Parcel p = Parcel.obtain();
+        p.unmarshall(new byte[] {}, 0, 0);
+        Bundle b = p.readBundle();
+        assertTrue(b.isEmpty());
+        mBundle.putBoolean("android", true);
+        p.unmarshall(new byte[] {}, 0, 0);
+        mBundle.readFromParcel(p);
+        assertTrue(mBundle.isEmpty());
+    }
+
     // first put sth into tested Bundle, it shouldn't be empty, then clear it and it should be empty
     public void testClear() {
         mBundle.putBoolean("android", true);
diff --git a/tests/tests/os/src/android/os/cts/FileAccessPermissionTest.java b/tests/tests/os/src/android/os/cts/FileAccessPermissionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/os/src/android/os/cts/IParcelFileDescriptorPeer.aidl b/tests/tests/os/src/android/os/cts/IParcelFileDescriptorPeer.aidl
new file mode 100644
index 0000000..8274a73
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/IParcelFileDescriptorPeer.aidl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 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 android.os.cts;
+
+import android.os.ParcelFileDescriptor;
+
+interface IParcelFileDescriptorPeer {
+
+    void setPeer(in IParcelFileDescriptorPeer peer);
+
+    /* Setup internal local and remote FDs */
+    void setupReadPipe();
+    void setupWritePipe();
+    void setupSocket();
+    void setupFile();
+
+    ParcelFileDescriptor get();
+    void set(in ParcelFileDescriptor pfd);
+
+    /* Ask this peer to get their remote FD from another */
+    void doGet();
+    /* Ask this peer to set their remote FD to another */
+    void doSet();
+
+    int read();
+    void write(int oneByte);
+
+    void close();
+    void closeWithError(String msg);
+    void detachFd();
+    void leak();
+    void crash();
+
+    String checkError();
+    String checkListener();
+
+}
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorPeer.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorPeer.java
new file mode 100644
index 0000000..4417179
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorPeer.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2013 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 android.os.cts;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+import android.os.ParcelFileDescriptor.OnCloseListener;
+import android.os.ParcelFileDescriptor.FileDescriptorDetachedException;
+import android.os.RemoteException;
+import android.os.SystemClock;
+
+import com.google.common.util.concurrent.AbstractFuture;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Sits around in a remote process doing whatever the CTS test says.
+ */
+public class ParcelFileDescriptorPeer extends IParcelFileDescriptorPeer.Stub {
+    private IParcelFileDescriptorPeer mPeer;
+
+    private ParcelFileDescriptor mLocal;
+    private ParcelFileDescriptor mRemote;
+
+    private FutureCloseListener mListener;
+
+    @Override
+    public void setPeer(IParcelFileDescriptorPeer peer) throws RemoteException {
+        mPeer = peer;
+    }
+
+    @Override
+    public void setupReadPipe() throws RemoteException {
+        try {
+            ParcelFileDescriptor[] pfds = ParcelFileDescriptor.createReliablePipe();
+            mLocal = pfds[0];
+            mRemote = pfds[1];
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void setupWritePipe() throws RemoteException {
+        try {
+            ParcelFileDescriptor[] pfds = ParcelFileDescriptor.createReliablePipe();
+            mLocal = pfds[1];
+            mRemote = pfds[0];
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void setupSocket() throws RemoteException {
+        try {
+            ParcelFileDescriptor[] pfds = ParcelFileDescriptor.createReliableSocketPair();
+            mLocal = pfds[0];
+            mRemote = pfds[1];
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void setupFile() throws RemoteException {
+        final Handler handler = new Handler(Looper.getMainLooper());
+        mListener = new FutureCloseListener();
+        try {
+            mLocal = null;
+            mRemote = ParcelFileDescriptor.open(File.createTempFile("pfd", "tmp"),
+                    ParcelFileDescriptor.MODE_READ_WRITE, handler, mListener);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public ParcelFileDescriptor get() throws RemoteException {
+        return mRemote;
+    }
+
+    @Override
+    public void set(ParcelFileDescriptor pfd) throws RemoteException {
+        mLocal = pfd;
+    }
+
+    @Override
+    public void doGet() throws RemoteException {
+        mLocal = mPeer.get();
+    }
+
+    @Override
+    public void doSet() throws RemoteException {
+        mPeer.set(mRemote);
+    }
+
+    @Override
+    public int read() throws RemoteException {
+        try {
+            return new FileInputStream(mLocal.getFileDescriptor()).read();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void write(int oneByte) throws RemoteException {
+        try {
+            new FileOutputStream(mLocal.getFileDescriptor()).write(oneByte);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void close() throws RemoteException {
+        try {
+            mLocal.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void closeWithError(String msg) throws RemoteException {
+        try {
+            mLocal.closeWithError(msg);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void detachFd() throws RemoteException {
+        mLocal.detachFd();
+    }
+
+    @Override
+    public void leak() throws RemoteException {
+        mLocal = null;
+
+        // Try really hard to finalize
+        for (int i = 0; i < 5; i++) {
+            System.gc();
+            System.runFinalization();
+            SystemClock.sleep(100);
+        }
+    }
+
+    @Override
+    public void crash() throws RemoteException {
+        Process.killProcess(Process.myPid());
+        System.exit(42);
+    }
+
+    @Override
+    public String checkError() throws RemoteException {
+        try {
+            mLocal.checkError();
+            return null;
+        } catch (IOException e) {
+            return e.getMessage();
+        }
+    }
+
+    @Override
+    public String checkListener() throws RemoteException {
+        try {
+            return String.valueOf(mListener.get());
+        } catch (InterruptedException e1) {
+            return null;
+        } catch (ExecutionException e1) {
+            return null;
+        }
+    }
+
+    public static class FutureCloseListener extends AbstractFuture<IOException>
+            implements OnCloseListener {
+        @Override
+        public void onClose(IOException e) {
+            if (e instanceof FileDescriptorDetachedException) {
+                set(new IOException("DETACHED"));
+            } else {
+                set(e);
+            }
+        }
+
+        @Override
+        public IOException get() throws InterruptedException, ExecutionException {
+            try {
+                return get(5, TimeUnit.SECONDS);
+            } catch (TimeoutException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public static class Red extends Service {
+        @Override
+        public IBinder onBind(Intent intent) {
+            return new ParcelFileDescriptorPeer();
+        }
+    }
+
+    public static class Blue extends Service {
+        @Override
+        public IBinder onBind(Intent intent) {
+            return new ParcelFileDescriptorPeer();
+        }
+    }
+}
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorProcessTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorProcessTest.java
new file mode 100644
index 0000000..679a35c
--- /dev/null
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorProcessTest.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2013 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 android.os.cts;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.test.AndroidTestCase;
+
+import com.google.common.util.concurrent.AbstractFuture;
+
+import junit.framework.ComparisonFailure;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Test various cross-process {@link ParcelFileDescriptor} interactions.
+ */
+public class ParcelFileDescriptorProcessTest extends AndroidTestCase {
+
+    private Intent redIntent;
+    private Intent blueIntent;
+    private PeerConnection redConn;
+    private PeerConnection blueConn;
+    private IParcelFileDescriptorPeer red;
+    private IParcelFileDescriptorPeer blue;
+
+    public static class PeerConnection extends AbstractFuture<IParcelFileDescriptorPeer>
+            implements ServiceConnection {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            set(IParcelFileDescriptorPeer.Stub.asInterface(service));
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+        }
+
+        @Override
+        public IParcelFileDescriptorPeer get() throws InterruptedException, ExecutionException {
+            try {
+                return get(5, TimeUnit.SECONDS);
+            } catch (TimeoutException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private static void assertContains(String expected, String actual) {
+        if (actual.contains(expected)) return;
+        throw new ComparisonFailure("", expected, actual);
+    }
+
+    private static void crash(IParcelFileDescriptorPeer peer) {
+        try {
+            peer.crash();
+        } catch (RemoteException e) {
+        }
+        SystemClock.sleep(500);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        final Context context = getContext();
+
+        // Bring up both remote processes and wire them to each other
+        redIntent = new Intent();
+        redIntent.setComponent(new ComponentName(
+                "com.android.cts.os", "android.os.cts.ParcelFileDescriptorPeer$Red"));
+        blueIntent = new Intent();
+        blueIntent.setComponent(new ComponentName(
+                "com.android.cts.os", "android.os.cts.ParcelFileDescriptorPeer$Blue"));
+        redConn = new PeerConnection();
+        blueConn = new PeerConnection();
+        context.startService(redIntent);
+        context.startService(blueIntent);
+        getContext().bindService(redIntent, redConn, 0);
+        getContext().bindService(blueIntent, blueConn, 0);
+        red = redConn.get();
+        blue = blueConn.get();
+        red.setPeer(blue);
+        blue.setPeer(red);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+
+        final Context context = getContext();
+        context.unbindService(redConn);
+        context.unbindService(blueConn);
+        context.stopService(redIntent);
+        context.stopService(blueIntent);
+
+        final ActivityManager am = (ActivityManager) mContext.getSystemService(
+                Context.ACTIVITY_SERVICE);
+        am.killBackgroundProcesses(context.getPackageName());
+    }
+
+    public void testPullPipeNormal() throws Exception {
+        // red <-- blue
+        red.setupReadPipe();
+        blue.doGet();
+
+        blue.write(1);
+        assertEquals(1, red.read());
+
+        blue.close();
+        assertEquals(-1, red.read());
+        assertEquals(null, red.checkError());
+    }
+
+    public void testPushPipeNormal() throws Exception {
+        // red --> blue
+        red.setupWritePipe();
+        red.doSet();
+
+        red.write(2);
+        assertEquals(2, blue.read());
+
+        red.close();
+        assertEquals(-1, blue.read());
+        assertEquals(null, blue.checkError());
+    }
+
+    public void testPipeWriterError() throws Exception {
+        // red --> blue
+        red.setupWritePipe();
+        red.doSet();
+
+        red.write(3);
+        red.closeWithError("OMG MUFFINS");
+
+        // even though closed we should still drain pipe
+        assertEquals(3, blue.read());
+        assertEquals(-1, blue.read());
+        assertContains("OMG MUFFINS", blue.checkError());
+    }
+
+    public void testPipeWriterCrash() throws Exception {
+        // red --> blue
+        red.setupWritePipe();
+        blue.doGet();
+
+        red.write(4);
+        crash(red);
+
+        // even though dead we should still drain pipe
+        assertEquals(4, blue.read());
+        assertEquals(-1, blue.read());
+        assertContains("Remote side is dead", blue.checkError());
+    }
+
+    public void testSocketCrash() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        red.write(5);
+        blue.write(6);
+
+        assertEquals(5, blue.read());
+        crash(blue);
+        assertEquals(6, red.read());
+        assertEquals(-1, red.read());
+        assertContains("Remote side is dead", red.checkError());
+    }
+
+    public void testFileNormal() throws Exception {
+        red.setupFile();
+        blue.doGet();
+
+        blue.write(7);
+        blue.close();
+
+        // make sure red heard us finish
+        assertEquals("null", red.checkListener());
+    }
+
+    public void testFileError() throws Exception {
+        red.setupFile();
+        blue.doGet();
+
+        blue.write(8);
+        blue.closeWithError("OMG BANANAS");
+
+        // make sure red heard us error
+        assertContains("OMG BANANAS", red.checkListener());
+    }
+
+    public void testFileCrash() throws Exception {
+        red.setupFile();
+        blue.doGet();
+
+        blue.write(9);
+        crash(blue);
+
+        // make sure red heard us die
+        assertContains("Remote side is dead", red.checkListener());
+    }
+
+    public void testFileDetach() throws Exception {
+        red.setupFile();
+        blue.doGet();
+        blue.detachFd();
+
+        // make sure red heard us detach
+        assertContains("DETACHED", red.checkListener());
+    }
+
+    public void testFileLeak() throws Exception {
+        red.setupFile();
+        blue.doGet();
+        blue.leak();
+
+        // make sure red heard us get leaked
+        assertContains("leaked", red.checkListener());
+    }
+
+    public void testSocketErrorAfterClose() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        // both sides throw their hands in the air
+        blue.closeWithError("BLUE RAWR");
+        red.closeWithError("RED RAWR");
+
+        // red noticed the blue error, but after that the comm pipe was dead so
+        // blue had no way of seeing the red error.
+        assertContains("BLUE RAWR", red.checkError());
+        assertNull(blue.checkError());
+    }
+
+    public void testSocketDeathBeforeClose() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        crash(blue);
+        assertContains("Remote side is dead", red.checkError());
+        red.close();
+    }
+
+    public void testSocketDeathAfterClose() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        crash(blue);
+        red.close();
+        assertContains("Remote side is dead", red.checkError());
+    }
+
+    public void testSocketMultipleCheck() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        // allow checking before closed
+        assertNull(blue.checkError());
+        assertNull(blue.checkError());
+        assertNull(blue.checkError());
+
+        // and verify we actually see it
+        red.closeWithError("RAWR RED");
+        assertContains("RAWR RED", blue.checkError());
+    }
+
+    public void testSocketGiantError() throws Exception {
+        // red <--> blue
+        red.setupSocket();
+        blue.doGet();
+
+        final StringBuilder builder = new StringBuilder();
+        for (int i = 0; i < 1024; i++) {
+            builder.append(i).append(",");
+        }
+        final String msg = builder.toString();
+        red.closeWithError(msg);
+
+        // we should at least see the first 512 chars
+        assertContains(msg.substring(0, 512), blue.checkError());
+    }
+}
diff --git a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
index 1bbbecb..2287660 100644
--- a/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
+++ b/tests/tests/os/src/android/os/cts/ParcelFileDescriptorTest.java
@@ -16,15 +16,21 @@
 
 package android.os.cts;
 
-
 import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.Parcel;
 import android.os.ParcelFileDescriptor;
-import android.os.Parcelable;
 import android.os.ParcelFileDescriptor.AutoCloseInputStream;
+import android.os.Parcelable;
+import android.os.cts.ParcelFileDescriptorPeer.FutureCloseListener;
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 
+import com.google.common.util.concurrent.AbstractFuture;
+
+import junit.framework.ComparisonFailure;
+
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
@@ -35,12 +41,11 @@
 import java.net.InetAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
+import java.util.concurrent.TimeUnit;
 
 public class ParcelFileDescriptorTest extends AndroidTestCase {
     private static final long DURATION = 100l;
 
-    private TestThread mTestThread;
-
     public void testConstructorAndOpen() throws Exception {
         ParcelFileDescriptor tempFile = makeParcelFileDescriptor(getContext());
 
@@ -57,11 +62,25 @@
         }
     }
 
+    private static class DoneSignal extends AbstractFuture<Void> {
+        public boolean set() {
+            return super.set(null);
+        }
+
+        @Override
+        public boolean setException(Throwable t) {
+            return super.setException(t);
+        }
+    }
+
     public void testFromSocket() throws Throwable {
         final int PORT = 12222;
         final int DATA = 1;
 
-        mTestThread = new TestThread(new Runnable() {
+        final DoneSignal done = new DoneSignal();
+
+        final Thread t = new Thread(new Runnable() {
+            @Override
             public void run() {
                 try {
                     ServerSocket ss;
@@ -71,12 +90,13 @@
                     out.write(DATA);
                     Thread.sleep(DURATION);
                     out.close();
+                    done.set();
                 } catch (Exception e) {
-                    mTestThread.setThrowable(e);
+                    done.setException(e);
                 }
             }
         });
-        mTestThread.start();
+        t.start();
 
         Thread.sleep(DURATION);
         Socket socket;
@@ -88,7 +108,7 @@
         socket.close();
         pfd.close();
 
-        mTestThread.joinAndCheck(DURATION * 2);
+        done.get(5, TimeUnit.SECONDS);
     }
 
     public void testFromData() throws IOException {
@@ -210,6 +230,134 @@
         assertTrue((Parcelable.CONTENTS_FILE_DESCRIPTOR & pfd.describeContents()) != 0);
     }
 
+    private static void assertContains(String expected, String actual) {
+        if (actual.contains(expected)) return;
+        throw new ComparisonFailure("", expected, actual);
+    }
+
+    private static void write(ParcelFileDescriptor pfd, int oneByte)  throws IOException{
+        new FileOutputStream(pfd.getFileDescriptor()).write(oneByte);
+    }
+
+    private static int read(ParcelFileDescriptor pfd) throws IOException {
+        return new FileInputStream(pfd.getFileDescriptor()).read();
+    }
+
+    public void testPipeNormal() throws Exception {
+        final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createReliablePipe();
+        final ParcelFileDescriptor red = pipe[0];
+        final ParcelFileDescriptor blue = pipe[1];
+
+        write(blue, 1);
+        assertEquals(1, read(red));
+
+        blue.close();
+        assertEquals(-1, read(red));
+        red.checkError();
+    }
+
+    public void testPipeError() throws Exception {
+        final ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createReliablePipe();
+        final ParcelFileDescriptor red = pipe[0];
+        final ParcelFileDescriptor blue = pipe[1];
+
+        write(blue, 2);
+        blue.closeWithError("OMG MUFFINS");
+
+        // even though closed we should still drain pipe
+        assertEquals(2, read(red));
+        assertEquals(-1, read(red));
+        try {
+            red.checkError();
+            fail("expected throw!");
+        } catch (IOException e) {
+            assertContains("OMG MUFFINS", e.getMessage());
+        }
+    }
+
+    public void testFileNormal() throws Exception {
+        final Handler handler = new Handler(Looper.getMainLooper());
+        final FutureCloseListener listener = new FutureCloseListener();
+        final ParcelFileDescriptor file = ParcelFileDescriptor.open(
+                File.createTempFile("pfd", "bbq"), ParcelFileDescriptor.MODE_READ_WRITE, handler,
+                listener);
+
+        write(file, 7);
+        file.close();
+
+        // make sure we were notified
+        assertEquals(null, listener.get());
+    }
+
+    public void testFileError() throws Exception {
+        final Handler handler = new Handler(Looper.getMainLooper());
+        final FutureCloseListener listener = new FutureCloseListener();
+        final ParcelFileDescriptor file = ParcelFileDescriptor.open(
+                File.createTempFile("pfd", "bbq"), ParcelFileDescriptor.MODE_READ_WRITE, handler,
+                listener);
+
+        write(file, 8);
+        file.closeWithError("OMG BANANAS");
+
+        // make sure error came through
+        assertContains("OMG BANANAS", listener.get().getMessage());
+    }
+
+    public void testFileDetach() throws Exception {
+        final Handler handler = new Handler(Looper.getMainLooper());
+        final FutureCloseListener listener = new FutureCloseListener();
+        final ParcelFileDescriptor file = ParcelFileDescriptor.open(
+                File.createTempFile("pfd", "bbq"), ParcelFileDescriptor.MODE_READ_WRITE, handler,
+                listener);
+
+        file.detachFd();
+
+        // make sure detach came through
+        assertContains("DETACHED", listener.get().getMessage());
+    }
+
+    public void testSocketErrorAfterClose() throws Exception {
+        final ParcelFileDescriptor[] pair = ParcelFileDescriptor.createReliableSocketPair();
+        final ParcelFileDescriptor red = pair[0];
+        final ParcelFileDescriptor blue = pair[1];
+
+        // both sides throw their hands in the air
+        blue.closeWithError("BLUE RAWR");
+        red.closeWithError("RED RAWR");
+
+        // red noticed the blue error, but after that the comm pipe was dead so
+        // blue had no way of seeing the red error.
+        try {
+            red.checkError();
+            fail("expected throw!");
+        } catch (IOException e) {
+            assertContains("BLUE RAWR", e.getMessage());
+        }
+
+        // expected to not throw; no error
+        blue.checkError();
+    }
+
+    public void testSocketMultipleCheck() throws Exception {
+        final ParcelFileDescriptor[] pair = ParcelFileDescriptor.createReliableSocketPair();
+        final ParcelFileDescriptor red = pair[0];
+        final ParcelFileDescriptor blue = pair[1];
+
+        // allow checking before closed; they should all pass
+        blue.checkError();
+        blue.checkError();
+        blue.checkError();
+
+        // and verify we actually see it
+        red.closeWithError("RAWR RED");
+        try {
+            blue.checkError();
+            fail("expected throw!");
+        } catch (IOException e) {
+            assertContains("RAWR RED", e.getMessage());
+        }
+    }
+
     static ParcelFileDescriptor makeParcelFileDescriptor(Context con) throws Exception {
         final String fileName = "testParcelFileDescriptor";
 
diff --git a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
index e23c0b7..45c5e45 100644
--- a/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
+++ b/tests/tests/os/src/android/os/storage/cts/StorageManagerTest.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
+import android.os.Environment;
 import android.os.cts.FileUtils;
 import android.os.storage.OnObbStateChangeListener;
 import android.os.storage.StorageManager;
@@ -30,6 +31,9 @@
 
 import java.io.File;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class StorageManagerTest extends AndroidTestCase {
 
@@ -49,8 +53,14 @@
     }
 
     public void testMountAndUnmountObbNormal() {
-        final File outFile = getFilePath("test1.obb");
+        for (File target : getTargetFiles()) {
+            target = new File(target, "test1.obb");
+            Log.d(TAG, "Testing path " + target);
+            doMountAndUnmountObbNormal(target);
+        }
+    }
 
+    private void doMountAndUnmountObbNormal(File outFile) {
         final String canonPath = mountObb(R.raw.test1, outFile, OnObbStateChangeListener.MOUNTED);
 
         mountObb(R.raw.test1, outFile, OnObbStateChangeListener.ERROR_ALREADY_MOUNTED);
@@ -64,8 +74,14 @@
     }
 
     public void testAttemptMountNonObb() {
-        final File outFile = getFilePath("test1_nosig.obb");
+        for (File target : getTargetFiles()) {
+            target = new File(target, "test1_nosig.obb");
+            Log.d(TAG, "Testing path " + target);
+            doAttemptMountNonObb(target);
+        }
+    }
 
+    private void doAttemptMountNonObb(File outFile) {
         mountObb(R.raw.test1_nosig, outFile, OnObbStateChangeListener.ERROR_INTERNAL);
 
         assertFalse("OBB should not be mounted",
@@ -76,8 +92,14 @@
     }
 
     public void testAttemptMountObbWrongPackage() {
-        final File outFile = getFilePath("test1_wrongpackage.obb");
+        for (File target : getTargetFiles()) {
+            target = new File(target, "test1_wrongpackage.obb");
+            Log.d(TAG, "Testing path " + target);
+            doAttemptMountObbWrongPackage(target);
+        }
+    }
 
+    private void doAttemptMountObbWrongPackage(File outFile) {
         mountObb(R.raw.test1_wrongpackage, outFile,
                 OnObbStateChangeListener.ERROR_PERMISSION_DENIED);
 
@@ -89,9 +111,15 @@
     }
 
     public void testMountAndUnmountTwoObbs() {
-        final File file1 = getFilePath("test1.obb");
-        final File file2 = getFilePath("test2.obb");
+        for (File target : getTargetFiles()) {
+            Log.d(TAG, "Testing target " + target);
+            final File test1 = new File(target, "test1.obb");
+            final File test2 = new File(target, "test2.obb");
+            doMountAndUnmountTwoObbs(test1, test2);
+        }
+    }
 
+    private void doMountAndUnmountTwoObbs(File file1, File file2) {
         ObbObserver oo1 = mountObbWithoutWait(R.raw.test1, file1);
         ObbObserver oo2 = mountObbWithoutWait(R.raw.test1, file2);
 
@@ -166,10 +194,16 @@
         }
     }
 
-    private File getFilePath(String name) {
-        final File filesDir = mContext.getFilesDir();
-        final File outFile = new File(filesDir, name);
-        return outFile;
+    private List<File> getTargetFiles() {
+        final List<File> targets = new ArrayList<File>();
+        targets.add(mContext.getFilesDir());
+        for (File dir : mContext.getObbDirs()) {
+            assertNotNull("Valid media must be inserted during CTS", dir);
+            assertEquals("Valid media must be inserted during CTS", Environment.MEDIA_MOUNTED,
+                    Environment.getStorageState(dir));
+            targets.add(dir);
+        }
+        return targets;
     }
 
     private void copyRawToFile(int rawResId, File outFile) {
diff --git a/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java b/tests/tests/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
index b487693..51e54df 100644
--- a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -19,6 +19,7 @@
 import android.os.RemoteException;
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
+import android.content.ContentValues;
 import android.database.Cursor;
 import android.provider.Contacts;
 import android.provider.ContactsContract;
@@ -29,15 +30,6 @@
  * Verify permissions are enforced.
  */
 public class ContactsProviderTest extends AndroidTestCase {
-    private ContentProviderClient mProvider;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mProvider = getContext()
-                .getContentResolver().acquireContentProviderClient(Contacts.AUTHORITY);
-        assertNotNull(mProvider);
-    }
 
     /**
      * Verifies that query(ContactsContract.Contacts.CONTENT_URI) requires
@@ -48,13 +40,30 @@
     @SmallTest
     public void testQueryContacts() {
         try {
-            mProvider.query(ContactsContract.Contacts.CONTENT_URI,
+            getContext().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
                     null, null, null, null);
-            fail("query(ContactsContract.Contacts.CONTENT_URI) did not throw SecurityException as expected");
+            fail("query(ContactsContract.Contacts.CONTENT_URI) did not throw SecurityException"
+                    + " as expected");
         } catch (SecurityException se) {
             // Expected Exception
-        } catch (RemoteException e) {
-            fail("testQueryContacts throws unexpected exception");
+        }
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Contacts.CONTENT_URI) requires
+     * Permission.
+     * <p>
+     * Requires Permission: {@link android.Manifest.permission#WRITE_CONTACTS}.
+     */
+    @SmallTest
+    public void testInsertContacts() {
+        try {
+            getContext().getContentResolver().insert(ContactsContract.Contacts.CONTENT_URI,
+                    new ContentValues());
+            fail("insert(ContactsContract.Contacts.CONTENT_URI) did not throw SecurityException"
+                    + " as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
         }
     }
 
@@ -67,13 +76,50 @@
     @SmallTest
     public void testQueryProfile() {
         try {
-            Cursor cursor = mProvider.query(ContactsContract.Profile.CONTENT_URI,
+            getContext().getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
                     null, null, null, null);
-            fail("query(ContactsContract.Profile.CONTENT_URI) did not throw SecurityException as expected");
+            fail("query(ContactsContract.Profile.CONTENT_URI) did not throw SecurityException"
+                    + " as expected");
         } catch (SecurityException se) {
             // Expected Exception
-        } catch (RemoteException e) {
-            fail("testQueryProfile throws unexpected exception");
+        }
+    }
+
+    /**
+     * Verifies that insert(ContactsContract.Profile.CONTENT_URI) requires
+     * Permission. The provider doesn't actually let you do this even if you have the
+     * permission, but trying to do it without the permission should throw a
+     * SecurityException anyway.
+     * <p>
+     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     */
+    @SmallTest
+    public void testInsertProfile() {
+        try {
+            getContext().getContentResolver().insert(ContactsContract.Profile.CONTENT_URI,
+                    new ContentValues(0));
+            fail("insert(ContactsContract.Profile.CONTENT_URI) did not throw SecurityException "
+                    + "as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
+        }
+    }
+
+    /**
+     * Verifies that update(ContactsContract.Profile.CONTENT_URI) requires
+     * Permission.
+     * <p>
+     * Requires Permission: {@link android.Manifest.permission#WRITE_PROFILE}.
+     */
+    @SmallTest
+    public void testUpdateProfile() {
+        try {
+            getContext().getContentResolver().update(ContactsContract.Profile.CONTENT_URI,
+                    new ContentValues(0), null, null);
+            fail("update(ContactsContract.Profile.CONTENT_URI) did not throw SecurityException"
+                    + " as expected");
+        } catch (SecurityException se) {
+            // Expected Exception
         }
     }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
index d325b4b..3a5849f 100644
--- a/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/FileSystemPermissionTest.java
@@ -27,9 +27,17 @@
 import java.io.File;
 import java.io.FileFilter;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.TimeUnit;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -532,11 +540,12 @@
 
     @LargeTest
     public void testReadingSysFilesDoesntFail() throws Exception {
-        // TODO: fix b/8148087
-        // tryToReadFromAllIn(new File("/sys"));
+        ExecutorService executor = Executors.newCachedThreadPool();
+        tryToReadFromAllIn(new File("/sys"), executor);
+        executor.shutdownNow();
     }
 
-    private static void tryToReadFromAllIn(File dir) throws IOException {
+    private static void tryToReadFromAllIn(File dir, ExecutorService executor) throws IOException {
         assertTrue(dir.isDirectory());
 
         if (isSymbolicLink(dir)) {
@@ -549,26 +558,63 @@
         if (files != null) {
             for (File f : files) {
                 if (f.isDirectory()) {
-                    tryToReadFromAllIn(f);
+                    tryToReadFromAllIn(f, executor);
                 } else {
-                    tryFileRead(f);
+                    tryFileOpenRead(f, executor);
                 }
             }
         }
     }
 
-    private static void tryFileRead(File f) {
+    private static void tryFileOpenRead(final File f, ExecutorService executor) throws IOException {
+        // Callable requires stack variables to be final.
+        Callable<Boolean> readFile = new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return tryFileRead(f);
+            }
+        };
+
+        Boolean completed = false;
+        String fileName = null;
+        Future<Boolean> future = null;
+        try {
+            fileName = f.getCanonicalPath();
+
+            future = executor.submit(readFile);
+
+            // Block, waiting no more than set seconds.
+            completed = future.get(3, TimeUnit.SECONDS);
+        } catch (TimeoutException e) {
+            System.out.println("TIMEOUT: " + fileName);
+        } catch (InterruptedException e) {
+            System.out.println("INTERRUPTED: " + fileName);
+        } catch (ExecutionException e) {
+            System.out.println("TASK WAS ABORTED BY EXCEPTION: " + fileName);
+        } catch (IOException e) {
+            // File.getCanonicalPath() will throw this.
+        } finally {
+            if (future != null) {
+                future.cancel(true);
+            }
+        }
+    }
+
+    private static Boolean tryFileRead(File f) {
         byte[] b = new byte[1024];
         try {
             System.out.println("looking at " + f.getCanonicalPath());
+
             FileInputStream fis = new FileInputStream(f);
-            while(fis.read(b) != -1) {
+            while((fis.available() != 0) && (fis.read(b) != -1)) {
                 // throw away data
             }
+
             fis.close();
         } catch (IOException e) {
             // ignore
         }
+        return true;
     }
 
     private static final Set<File> SYS_EXCEPTIONS = new HashSet<File>(
diff --git a/tests/tests/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java
new file mode 100644
index 0000000..6ad0483
--- /dev/null
+++ b/tests/tests/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2013 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 android.permission.cts;
+
+import android.content.Context;
+import android.graphics.PixelFormat;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
+import android.media.ImageReader;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.DisplayMetrics;
+
+/**
+ * Verify the capture system video output permission requirements.
+ */
+public class NoCaptureVideoPermissionTest extends AndroidTestCase {
+    private static final String NAME = "VirtualDisplayTest";
+    private static final int WIDTH = 720;
+    private static final int HEIGHT = 480;
+    private static final int DENSITY = DisplayMetrics.DENSITY_MEDIUM;
+
+    /**
+     * Verify that DisplayManager.createVirtualDisplay() requires permissions to
+     * create public displays.
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#CAPTURE_VIDEO_OUTPUT} or
+     *   {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT}.
+     */
+    @SmallTest
+    public void testCreatePublicVirtualDisplay() {
+        DisplayManager displayManager =
+                (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
+        ImageReader reader = ImageReader.newInstance(WIDTH, HEIGHT, PixelFormat.RGBX_8888, 1);
+        try {
+            displayManager.createVirtualDisplay(NAME, WIDTH, HEIGHT, DENSITY,
+                    reader.getSurface(), DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC);
+            fail("DisplayManager.createVirtualDisplay() didn't throw SecurityException "
+                    + "as expected when creating public virtual display.");
+        } catch (SecurityException e) {
+            // expected
+        } finally {
+            reader.close();
+        }
+    }
+
+    /**
+     * Verify that DisplayManager.createVirtualDisplay() requires permissions to
+     * create secure displays.
+     * <p>Requires Permission:
+     *   {@link android.Manifest.permission#CAPTURE_SECURE_VIDEO_OUTPUT}.
+     */
+    @SmallTest
+    public void testCreateSecureVirtualDisplay() {
+        DisplayManager displayManager =
+                (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
+        ImageReader reader = ImageReader.newInstance(WIDTH, HEIGHT, PixelFormat.RGBX_8888, 1);
+        try {
+            displayManager.createVirtualDisplay(NAME, WIDTH, HEIGHT, DENSITY,
+                    reader.getSurface(), DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE);
+            fail("DisplayManager.createVirtualDisplay() didn't throw SecurityException "
+                    + "as expected when creating secure virtual display.");
+        } catch (SecurityException e) {
+            // expected
+        } finally {
+            reader.close();
+        }
+    }
+
+    /**
+     * Verify that DisplayManager.createVirtualDisplay() does not requires permissions to
+     * create private displays.
+     */
+    @SmallTest
+    public void testCreatePrivateVirtualDisplay() {
+        DisplayManager displayManager =
+                (DisplayManager)mContext.getSystemService(Context.DISPLAY_SERVICE);
+        ImageReader reader = ImageReader.newInstance(WIDTH, HEIGHT, PixelFormat.RGBX_8888, 1);
+        try {
+            VirtualDisplay display = displayManager.createVirtualDisplay(
+                    NAME, WIDTH, HEIGHT, DENSITY,
+                    reader.getSurface(), 0);
+            display.release();
+        } catch (SecurityException e) {
+            fail("DisplayManager.createVirtualDisplay() should not throw SecurityException "
+                    + "when creating private virtual display.");
+        } finally {
+            reader.close();
+        }
+    }
+}
diff --git a/tests/tests/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java b/tests/tests/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
index da7680a..2bfef62 100644
--- a/tests/tests/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
+++ b/tests/tests/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
@@ -16,6 +16,8 @@
 
 package android.permission.cts;
 
+import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -61,7 +63,9 @@
      */
     public void testAddPreferredActivity() {
         try {
-            mPackageManager.addPreferredActivity(null, 0, null, null);
+            IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
+            filter.addCategory(Intent.CATEGORY_HOME);
+            mPackageManager.addPreferredActivity(filter, 0, null, null);
             fail("PackageManager.addPreferredActivity did not throw" +
                     " SecurityException as expected");
         } catch (SecurityException e) {
diff --git a/tests/tests/permission2/AndroidManifest.xml b/tests/tests/permission2/AndroidManifest.xml
index 8cc7737..1c1a0d8 100755
--- a/tests/tests/permission2/AndroidManifest.xml
+++ b/tests/tests/permission2/AndroidManifest.xml
@@ -42,6 +42,20 @@
 
     <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
 
+    <!-- need app that has RECORD_AUDIO but not CAPTURE_AUDIO_OUTPUT -->
+    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
+
+    <!-- need a permission that would ordinarily be granted, but has a maxSdkVersion that
+         causes it to be withheld under the current API level -->
+    <uses-permission
+            android:name="android.permission.VIBRATE"
+            android:maxSdkVersion="18" />
+
+    <!-- need a permission that will be granted -->
+    <uses-permission
+            android:name="android.permission.FLASHLIGHT"
+            android:maxSdkVersion="9000" />
+
     <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
                      android:targetPackage="com.android.cts.permission2"
                      android:label="More CTS tests for permissions"/>
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoCaptureAudioOutputPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoCaptureAudioOutputPermissionTest.java
new file mode 100644
index 0000000..b4e2855
--- /dev/null
+++ b/tests/tests/permission2/src/android/permission2/cts/NoCaptureAudioOutputPermissionTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2013 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 android.permission2.cts;
+
+import android.media.AudioFormat;
+import android.media.AudioRecord;
+import android.media.MediaRecorder.AudioSource;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify the capture system video output permission requirements.
+ */
+public class NoCaptureAudioOutputPermissionTest extends AndroidTestCase {
+    /**
+     * Verify that the AudioRecord constructor fails to create a recording object
+     * when the app does not have permission to capture audio output.
+     * For the purposes of this test, the app must already have the normal audio
+     * record permission, just not the capture audio output permission.
+     * <p>Requires permission:
+     *    {@link android.Manifest.permission#RECORD_AUDIO} and
+     *    {@link android.Manifest.permission#CAPTURE_VIDEO_OUTPUT}.
+     */
+    @SmallTest
+    public void testCreateAudioRecord() {
+        final int bufferSize = AudioRecord.getMinBufferSize(44100,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
+
+        // The attempt to create the AudioRecord object succeeds even if the
+        // app does not have permission, but the object is not usable.
+        // The API should probably throw SecurityException but it was not originally
+        // designed to do that and it's not clear we can change it now.
+        AudioRecord record = new AudioRecord(AudioSource.REMOTE_SUBMIX, 44100,
+                AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
+        try {
+            assertTrue("AudioRecord state should not be INITIALIZED because the application"
+                    + "does not have permission to access the remote submix source",
+                    record.getState() != AudioRecord.STATE_INITIALIZED);
+        } finally {
+            record.release();
+        }
+    }
+}
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoProcessOutgoingCallPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoProcessOutgoingCallPermissionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoWriteSecureSettingsPermissionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/permission2/src/android/permission2/cts/PermissionMaxSdkVersionTest.java b/tests/tests/permission2/src/android/permission2/cts/PermissionMaxSdkVersionTest.java
new file mode 100644
index 0000000..e6026e4
--- /dev/null
+++ b/tests/tests/permission2/src/android/permission2/cts/PermissionMaxSdkVersionTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013 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 android.permission.cts;
+
+import android.content.pm.PackageManager;
+import android.os.Process;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Verify permission behaviors with android:maxSdkVersion
+ */
+public class PermissionMaxSdkVersionTest extends AndroidTestCase {
+    // These two permission names must match the corresponding <uses-permission>
+    // declarations in the test app manifest.
+    static final String UNGRANTABLE_PERMISSION = "android.permission.VIBRATE";
+    static final String GRANTABLE_PERMISSION = "android.permission.FLASHLIGHT";
+
+    /**
+     * Verify that with android:maxSdkVersion set to a previous API level,
+     * the permission is not being granted.
+     */
+    @SmallTest
+    public void testMaxSdkInPast() {
+        int result = mContext.checkPermission(UNGRANTABLE_PERMISSION,
+                Process.myPid(), Process.myUid());
+        assertEquals("Permissions with maxSdkVersion in the past should not be granted",
+                result,
+                PackageManager.PERMISSION_DENIED);
+    }
+
+    /**
+     * Verify that with android:maxSdkVersion set to a future API level,
+     * the permission is being granted.
+     */
+    @SmallTest
+    public void testMaxSdkInFuture() {
+        int result = mContext.checkPermission(GRANTABLE_PERMISSION,
+                Process.myPid(), Process.myUid());
+        assertEquals("Permissions with maxSdkVersion in the future should be granted",
+                result,
+                PackageManager.PERMISSION_GRANTED);
+    }
+}
diff --git a/tests/tests/permission2/src/android/permission2/cts/ProtectedBroadcastsTest.java b/tests/tests/permission2/src/android/permission2/cts/ProtectedBroadcastsTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CheckBoxPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CheckBoxPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreference.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomCheckBoxPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreference.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomDialogPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreference.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomEditTextPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreference.java b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreference.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/CustomSwitchPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/DialogPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/DialogPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/EditTextPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/EditTextPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/ListPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/ListPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceCategoryTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceCategoryTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentActivity.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentActivity.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFragmentTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceFromCodeActivity.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceFromCodeActivity.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java
old mode 100755
new mode 100644
index 1059700..1bb5637
--- a/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java
+++ b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeaders.java
@@ -40,6 +40,14 @@
         }
     }
 
+    /*
+     * Validate the fragment loaded into this activity. Required for apps built for API 19 and
+     * above.
+     */
+    protected boolean isValidFragment(String fragment) {
+        return PrefsOneFragment.class.getName().equals(fragment);
+    }
+
     /**
      * Populate the activity with the top-level headers.
      */
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeadersTest.java b/tests/tests/preference2/src/android/preference2/cts/PreferenceWithHeadersTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/PreferencesFromXml.java b/tests/tests/preference2/src/android/preference2/cts/PreferencesFromXml.java
old mode 100755
new mode 100644
diff --git a/tests/tests/preference2/src/android/preference2/cts/SwitchPreferenceTest.java b/tests/tests/preference2/src/android/preference2/cts/SwitchPreferenceTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/provider/Android.mk b/tests/tests/provider/Android.mk
index edc078d..4c5875b 100644
--- a/tests/tests/provider/Android.mk
+++ b/tests/tests/provider/Android.mk
@@ -21,7 +21,7 @@
 # and when built explicitly put it in the data partition
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
 
 LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
 
diff --git a/tests/tests/provider/src/android/provider/cts/ContactsContractIntentsTest.java b/tests/tests/provider/src/android/provider/cts/ContactsContractIntentsTest.java
new file mode 100644
index 0000000..cecd973
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/ContactsContractIntentsTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 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 android.provider.cts;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.provider.ContactsContract;
+import android.test.AndroidTestCase;
+
+import java.util.List;
+
+/**
+ * Tests to verify that common actions on {@link ContactsContract} content are
+ * available.
+ */
+public class ContactsContractIntentsTest extends AndroidTestCase {
+    public void assertCanBeHandled(Intent intent) {
+        List<ResolveInfo> resolveInfoList = getContext()
+                .getPackageManager().queryIntentActivities(intent, 0);
+        assertNotNull("Missing ResolveInfo", resolveInfoList);
+        assertTrue("No ResolveInfo found for " + intent.toInsecureString(),
+                resolveInfoList.size() > 0);
+    }
+
+    public void testViewContactDir() {
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setData(ContactsContract.Contacts.CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testPickContactDir() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(ContactsContract.Contacts.CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testGetContentContactDir() {
+        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+        intent.setData(ContactsContract.Contacts.CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
new file mode 100644
index 0000000..a94e7f4
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2013 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 android.provider.cts;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.test.AndroidTestCase;
+
+import java.util.List;
+
+/**
+ * Tests to verify that common actions on {@link MediaStore} content are
+ * available.
+ */
+public class MediaStoreIntentsTest extends AndroidTestCase {
+    public void assertCanBeHandled(Intent intent) {
+        List<ResolveInfo> resolveInfoList = getContext()
+                .getPackageManager().queryIntentActivities(intent, 0);
+        assertNotNull("Missing ResolveInfo", resolveInfoList);
+        assertTrue("No ResolveInfo found for " + intent.toInsecureString(),
+                resolveInfoList.size() > 0);
+    }
+
+    public void testPickImageDir() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testPickVideoDir() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testPickAudioDir() {
+        Intent intent = new Intent(Intent.ACTION_PICK);
+        intent.setData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testViewImageDir() {
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testViewVideoDir() {
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setData(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
+        assertCanBeHandled(intent);
+    }
+
+    public void testViewImageFile() {
+        final String[] schemes = new String[] {
+                "file", "http", "https", "content" };
+        final String[] mimes = new String[] {
+                "image/bmp", "image/jpeg", "image/png", "image/gif", "image/webp" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("image").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+
+    public void testViewVideoFile() {
+        final String[] schemes = new String[] {
+                "file", "http", "https", "content" };
+        final String[] mimes = new String[] {
+                "video/mpeg4", "video/mp4", "video/3gp", "video/3gpp", "video/3gpp2",
+                "video/webm" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("video").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+
+    public void testViewAudioFile() {
+        final String[] schemes = new String[] {
+                "file", "http", "content" };
+        final String[] mimes = new String[] {
+                "audio/mpeg", "audio/mp4", "audio/ogg", "audio/webm", "application/ogg",
+                "application/x-ogg" };
+
+        for (String scheme : schemes) {
+            for (String mime : mimes) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                final Uri uri = new Uri.Builder().scheme(scheme)
+                        .authority("example.com").path("audio").build();
+                intent.setDataAndType(uri, mime);
+                assertCanBeHandled(intent);
+            }
+        }
+    }
+}
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
index 70d6f58..a362df3 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_FilesTest.java
@@ -162,7 +162,7 @@
         ContentValues values = new ContentValues();
         values.put(MediaStore.Images.Media.DISPLAY_NAME, "My Bitmap");
         values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
-        values.put(MediaStore.Images.Media.DATA, "/mnt/sdcard/dummy.jpg");
+        values.put(MediaStore.Images.Media.DATA, "/foo/bar/dummy.jpg");
         Uri uri = mResolver.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
 
         // point _data at directory and try to get an fd for it
@@ -253,7 +253,8 @@
             try {
                 pfd = mResolver.openFileDescriptor(uri, "r");
 
-                // get the real path from the file descriptor
+                // get the real path from the file descriptor (this relies on the media provider
+                // having opened the path via the real path instead of the emulated path).
                 File real = new File("/proc/self/fd/" + pfd.getFd());
                 values = new ContentValues();
                 values.put("_data", real.getCanonicalPath());
@@ -276,7 +277,7 @@
         // clean up
         assertEquals(1, mResolver.delete(uri, null, null));
         if (sdfile != null) {
-            sdfile.delete();
+            assertEquals(true, sdfile.delete());
         }
     }
 
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
index e68286f..3f28a34 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_MediaTest.java
@@ -78,6 +78,13 @@
 
         mHelper = new FileCopyHelper(mContext);
         mRowsAdded = new ArrayList<Uri>();
+
+        String campath = Environment.getExternalStorageDirectory() + File.separator +
+                Environment.DIRECTORY_DCIM + File.separator + "Camera";
+        File camfile = new File(campath);
+        if (!camfile.exists()) {
+            assertTrue("failed to create " + campath, camfile.mkdir());
+        }
     }
 
     public void testInsertImageWithImagePath() throws Exception {
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
index b76108b..322f5d5 100644
--- a/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/MediaStore_Images_ThumbnailsTest.java
@@ -69,6 +69,13 @@
 
         mHelper = new FileCopyHelper(mContext);
         mRowsAdded = new ArrayList<Uri>();
+
+        String campath = Environment.getExternalStorageDirectory() + File.separator +
+                Environment.DIRECTORY_DCIM + File.separator + "Camera";
+        File camfile = new File(campath);
+        if (!camfile.exists()) {
+            assertTrue("failed to create " + campath, camfile.mkdir());
+        }
     }
 
     public void testQueryInternalThumbnails() throws Exception {
diff --git a/tests/tests/provider/src/android/provider/cts/SettingsTest.java b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
index 3ea47d4..c732305 100644
--- a/tests/tests/provider/src/android/provider/cts/SettingsTest.java
+++ b/tests/tests/provider/src/android/provider/cts/SettingsTest.java
@@ -20,6 +20,9 @@
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteException;
 import android.net.Uri;
@@ -263,4 +266,11 @@
         tryBadTableAccess("secure ", "secure", "install_non_market_apps");
         tryBadTableAccess(" secure ", "secure", "install_non_market_apps");
     }
+
+    public void testUserDictionarySettingsExists() throws RemoteException {
+        final Intent intent = new Intent(Settings.ACTION_USER_DICTIONARY_SETTINGS);
+        final ResolveInfo ri = mContext.getPackageManager().resolveActivity(
+                intent, PackageManager.MATCH_DEFAULT_ONLY);
+        assertTrue(ri != null);
+    }
 }
diff --git a/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java b/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
index e352252..0eba9f2 100644
--- a/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
+++ b/tests/tests/provider/src/android/provider/cts/TelephonyProviderTest.java
@@ -18,6 +18,10 @@
 
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.provider.Telephony.Carriers;
 import android.net.Uri;
 import android.os.ParcelFileDescriptor;
 import android.test.InstrumentationTestCase;
@@ -27,17 +31,23 @@
 import java.io.FileDescriptor;
 
 // To run the tests in this file w/o running all the cts tests:
-// build cts
+// make cts
 // cts-tradefed
 // run cts -c android.provider.cts.TelephonyProviderTest
 
 public class TelephonyProviderTest extends InstrumentationTestCase {
     private ContentResolver mContentResolver;
+    private static final String[] APN_PROJECTION = {
+        Carriers.TYPE,            // 0
+        Carriers.MMSC,            // 1
+        Carriers.MMSPROXY,        // 2
+        Carriers.MMSPORT          // 3
+    };
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mContentResolver = getInstrumentation().getTargetContext().getContentResolver();
+        mContentResolver = getInstrumentation().getContext().getContentResolver();
     }
 
     // Test that the TelephonyProvider doesn't allow clients to update _data column data and
@@ -68,4 +78,18 @@
             e.printStackTrace();
         }
     }
+
+    // In JB MR1 access to the TelephonyProvider's Carriers table was clamped down and would
+    // throw a SecurityException when queried. That was fixed in JB MR2. Verify that 3rd parties
+    // can access the APN info the carriers table, after JB MR1.
+    public void testAccessToApns() {
+        try {
+            String selection = Carriers.CURRENT + " IS NOT NULL";
+            String[] selectionArgs = null;
+            Cursor cursor = mContentResolver.query(Carriers.CONTENT_URI,
+                    APN_PROJECTION, selection, selectionArgs, null);
+        } catch (SecurityException e) {
+            fail("No access to current APN");
+        }
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AcosPiTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AcosPiTest.java
index 859f235..9d0bc7d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AcosPiTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AcosPiTest.java
@@ -22,11 +22,13 @@
 
 public class AcosPiTest extends RSBaseCompute {
     private ScriptC_acospi_f32 script_f32;
+    private ScriptC_acospi_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_acospi_f32(mRS);
+        script_f32_relaxed = new ScriptC_acospi_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_acospi_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_acospi_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_acospi_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_acospi_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_acospi_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xe1, 5);
     }
 
+    public void testAcosPiF32_relaxed() {
+        doF32_relaxed(0xe1, 128);
+    }
+
     public void testAcosPiF32_2() {
         doF32_2(0xa123, 5);
     }
 
+    public void testAcosPiF32_2_relaxed() {
+        doF32_2_relaxed(0xa123, 128);
+    }
+
     public void testAcosPiF32_3() {
         doF32_3(0x123, 5);
     }
 
+    public void testAcosPiF32_3_relaxed() {
+        doF32_3_relaxed(0x123, 128);
+    }
+
     public void testAcosPiF32_4() {
         doF32_4(0x123ef, 5);
+
     }
+    public void testAcosPiF32_4_relaxed() {
+        doF32_4_relaxed(0x123ef, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AcosTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AcosTest.java
index 0553aa5..d540c60 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AcosTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AcosTest.java
@@ -22,11 +22,13 @@
 
 public class AcosTest extends RSBaseCompute {
     private ScriptC_acos_f32 script_f32;
+    private ScriptC_acos_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_acos_f32(mRS);
+        script_f32_relaxed = new ScriptC_acos_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_acos_f32_4(mIn, mOut);
             break;
+        case TEST_RELAXED_F32:
+            script_f32.forEach_acos_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32.forEach_acos_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32.forEach_acos_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32.forEach_acos_f32_4(mIn, mOut);
+            break;
+
         }
     }
 
@@ -75,4 +90,22 @@
     public void testAcosF32_4() {
         doF32_4(0x123, 4);
     }
+
+    public void testAcosF32_relaxed() {
+        doF32_relaxed(0x123e, 128);
+    }
+
+    public void testAcosF32_2_relaxed() {
+        doF32_2_relaxed(0x1e, 128);
+    }
+
+    public void testAcosF32_3_relaxed() {
+        doF32_3_relaxed(0xeaf, 128);
+    }
+
+    public void testAcosF32_4_relaxed() {
+        doF32_4_relaxed(0x123, 128);
+    }
+
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AcoshTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AcoshTest.java
index 86755b0..5947066 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AcoshTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AcoshTest.java
@@ -22,11 +22,13 @@
 
 public class AcoshTest extends RSBaseCompute {
     private ScriptC_acosh_f32 script_f32;
+    private ScriptC_acosh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_acosh_f32(mRS);
+        script_f32_relaxed = new ScriptC_acosh_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_acosh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_acosh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_acosh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_acosh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_acosh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -65,15 +80,32 @@
         doF32(0x12345678, 4);
     }
 
+    public void testAcoshF32_relaxed() {
+        doF32_relaxed(0x12345678, 4);
+    }
+
     public void testAcoshF32_2() {
         doF32_2(0x1234ac, 4);
     }
 
+    public void testAcoshF32_2_relaxed() {
+        doF32_2_relaxed(0x1234ac, 4);
+    }
+
     public void testAcoshF32_3() {
         doF32_3(0x123fc78, 4);
     }
 
+    public void testAcoshF32_3_relaxed() {
+        doF32_3_relaxed(0x123fc78, 4);
+    }
+
     public void testAcoshF32_4() {
         doF32_4(0x12def8, 4);
+
     }
+    public void testAcoshF32_4_relaxed() {
+        doF32_4_relaxed(0x12def8, 4);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AsinPiTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AsinPiTest.java
index d0ce9ea..64a001e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AsinPiTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AsinPiTest.java
@@ -22,11 +22,13 @@
 
 public class AsinPiTest extends RSBaseCompute {
     private ScriptC_asinpi_f32 script_f32;
+    private ScriptC_asinpi_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_asinpi_f32(mRS);
+        script_f32_relaxed = new ScriptC_asinpi_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_asinpi_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_asinpi_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_asinpi_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_asinpi_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_asinpi_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xa, 5);
     }
 
+    public void testAsinPiF32_relaxed() {
+        doF32_relaxed(0xa, 5);
+    }
+
     public void testAsinPiF32_2() {
         doF32_2(0xe, 5);
     }
 
+    public void testAsinPiF32_2_relaxed() {
+        doF32_2_relaxed(0xe, 5);
+    }
+
     public void testAsinPiF32_3() {
         doF32_3(0x1234, 5);
     }
 
+    public void testAsinPiF32_3_relaxed() {
+        doF32_3_relaxed(0x1234, 5);
+    }
+
     public void testAsinPiF32_4() {
         doF32_4(0xaf, 5);
+
     }
+    public void testAsinPiF32_4_relaxed() {
+        doF32_4_relaxed(0xaf, 5);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AsinTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AsinTest.java
index a47e034..7f3c367 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AsinTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AsinTest.java
@@ -22,11 +22,13 @@
 
 public class AsinTest extends RSBaseCompute {
     private ScriptC_asin_f32 script_f32;
+    private ScriptC_asin_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_asin_f32(mRS);
+        script_f32_relaxed = new ScriptC_asin_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_asin_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_asin_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_asin_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_asin_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_asin_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x12efa, 4);
     }
 
+    public void testAsinF32_relaxed() {
+        doF32_relaxed(0x12efa, 128);
+    }
+
     public void testAsinF32_2() {
         doF32_2(0x34ef, 4);
     }
 
+    public void testAsinF32_2_relaxed() {
+        doF32_2_relaxed(0x34ef, 128);
+    }
+
     public void testAsinF32_3() {
         doF32_3(0xae31, 4);
     }
 
+    public void testAsinF32_3_relaxed() {
+        doF32_3_relaxed(0xae31, 128);
+    }
+
     public void testAsinF32_4() {
         doF32_4(0x341, 4);
+
     }
+    public void testAsinF32_4_relaxed() {
+        doF32_4_relaxed(0x341, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AsinhTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AsinhTest.java
index 7292626..e0204d2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AsinhTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AsinhTest.java
@@ -22,11 +22,13 @@
 
 public class AsinhTest extends RSBaseCompute {
     private ScriptC_asinh_f32 script_f32;
+    private ScriptC_asinh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_asinh_f32(mRS);
+        script_f32_relaxed = new ScriptC_asinh_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_asinh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_asinh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_asinh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_asinh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_asinh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -65,15 +80,32 @@
         doF32(0x12, 4);
     }
 
+    public void testAsinhF32_relaxed() {
+        doF32_relaxed(0x12, 128);
+    }
+
     public void testAsinhF32_2() {
         doF32_2(0xead, 4);
     }
 
+    public void testAsinhF32_2_relaxed() {
+        doF32_2_relaxed(0xead, 128);
+    }
+
     public void testAsinhF32_3() {
         doF32_3(0xabc, 4);
     }
 
+    public void testAsinhF32_3_relaxed() {
+        doF32_3_relaxed(0xabc, 128);
+    }
+
     public void testAsinhF32_4() {
         doF32_4(0xfea, 4);
+
     }
+    public void testAsinhF32_4_relaxed() {
+        doF32_4_relaxed(0xfea, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Atan2PiTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Atan2PiTest.java
index ef821c7..f96e7d6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Atan2PiTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Atan2PiTest.java
@@ -23,12 +23,14 @@
 
 public class Atan2PiTest extends RSBaseCompute {
     private ScriptC_atan2pi_f32 script_f32;
+    private ScriptC_atan2pi_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_atan2pi_f32(mRS);
+        script_f32_relaxed = new ScriptC_atan2pi_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_atan2pi_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_atan2pi_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_atan2pi_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_atan2pi_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_atan2pi_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0x12678, 6);
     }
 
+    public void testAtan2PiF32_relaxed() {
+        ScriptField_atan2pi_float_input in = new ScriptField_atan2pi_float_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12678, 128);
+    }
+
     public void testAtan2PiF32_2() {
         ScriptField_atan2pi_float2_input in = new ScriptField_atan2pi_float2_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1af45, 6);
     }
 
+    public void testAtan2PiF32_2_relaxed() {
+        ScriptField_atan2pi_float2_input in = new ScriptField_atan2pi_float2_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1af45, 128);
+    }
+
     public void testAtan2PiF32_3() {
         ScriptField_atan2pi_float3_input in = new ScriptField_atan2pi_float3_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1cd345, 6);
     }
 
+    public void testAtan2PiF32_3_relaxed() {
+        ScriptField_atan2pi_float3_input in = new ScriptField_atan2pi_float3_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1cd345, 128);
+    }
+
     public void testAtan2PiF32_4() {
         ScriptField_atan2pi_float4_input in = new ScriptField_atan2pi_float4_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x1ca45, 6);
     }
+
+    public void testAtan2PiF32_4_relaxed() {
+        ScriptField_atan2pi_float4_input in = new ScriptField_atan2pi_float4_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x1ca45, 128);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Atan2Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Atan2Test.java
index 93f2527..c3eabb7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Atan2Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Atan2Test.java
@@ -23,12 +23,14 @@
 
 public class Atan2Test extends RSBaseCompute {
     private ScriptC_atan2_f32 script_f32;
+    private ScriptC_atan2_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_atan2_f32(mRS);
+        script_f32_relaxed = new ScriptC_atan2_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_atan2_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_atan2_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_atan2_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_atan2_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_atan2_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0x12678, 6);
     }
 
+    public void testAtan2F32_relaxed() {
+        ScriptField_atan2_f32_in in = new ScriptField_atan2_f32_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12678, 128);
+    }
+
     public void testAtan2F32_2() {
         ScriptField_atan2_f32_2_in in = new ScriptField_atan2_f32_2_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1af45, 6);
     }
 
+    public void testAtan2F32_2_relaxed() {
+        ScriptField_atan2_f32_2_in in = new ScriptField_atan2_f32_2_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1af45, 128);
+    }
+
     public void testAtan2F32_3() {
         ScriptField_atan2_f32_3_in in = new ScriptField_atan2_f32_3_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1cd345, 6);
     }
 
+    public void testAtan2F32_3_relaxed() {
+        ScriptField_atan2_f32_3_in in = new ScriptField_atan2_f32_3_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1cd345, 128);
+    }
+
     public void testAtan2F32_4() {
         ScriptField_atan2_f32_4_in in = new ScriptField_atan2_f32_4_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x1ca45, 6);
     }
+
+    public void testAtan2F32_4_relaxed() {
+        ScriptField_atan2_f32_4_in in = new ScriptField_atan2_f32_4_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x1ca45, 128);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AtanPiTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AtanPiTest.java
index de22780..17fe5ad 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AtanPiTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AtanPiTest.java
@@ -22,11 +22,13 @@
 
 public class AtanPiTest extends RSBaseCompute {
     private ScriptC_atanpi_f32 script_f32;
+    private ScriptC_atanpi_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_atanpi_f32(mRS);
+        script_f32_relaxed = new ScriptC_atanpi_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_atanpi_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_atanpi_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_atanpi_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_atanpi_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_atanpi_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x123, 5);
     }
 
+    public void testAtanPiF32_relaxed() {
+        doF32_relaxed(0x123, 128);
+    }
+
     public void testAtanPiF32_2() {
         doF32_2(0x12, 5);
     }
 
+    public void testAtanPiF32_2_relaxed() {
+        doF32_2_relaxed(0x12, 128);
+    }
+
     public void testAtanPiF32_3() {
         doF32_3(0x847, 5);
     }
 
+    public void testAtanPiF32_3_relaxed() {
+        doF32_3_relaxed(0x847, 128);
+    }
+
     public void testAtanPiF32_4() {
         doF32_4(0xfa2, 5);
+
     }
+    public void testAtanPiF32_4_relaxed() {
+        doF32_4_relaxed(0xfa2, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AtanTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AtanTest.java
index d91b6e5..c41be40 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AtanTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AtanTest.java
@@ -22,11 +22,13 @@
 
 public class AtanTest extends RSBaseCompute {
     private ScriptC_atan_f32 script_f32;
+    private ScriptC_atan_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_atan_f32(mRS);
+        script_f32_relaxed = new ScriptC_atan_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_atan_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_atan_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_atan_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_atan_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_atan_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x12a, 5);
     }
 
+    public void testAtanF32_relaxed() {
+        doF32_relaxed(0x12a, 128);
+    }
+
     public void testAtanF32_2() {
         doF32_2(0xad, 5);
     }
 
+    public void testAtanF32_2_relaxed() {
+        doF32_2_relaxed(0xad, 128);
+    }
+
     public void testAtanF32_3() {
         doF32_3(0xafe, 5);
     }
 
+    public void testAtanF32_3_relaxed() {
+        doF32_3_relaxed(0xafe, 128);
+    }
+
     public void testAtanF32_4() {
         doF32_4(0x1238, 5);
+
     }
+    public void testAtanF32_4_relaxed() {
+        doF32_4_relaxed(0x1238, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AtanhTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AtanhTest.java
index 25fa859..7182251 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AtanhTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AtanhTest.java
@@ -22,11 +22,13 @@
 
 public class AtanhTest extends RSBaseCompute {
     private ScriptC_atanh_f32 script_f32;
+    private ScriptC_atanh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_atanh_f32(mRS);
+        script_f32_relaxed = new ScriptC_atanh_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_atanh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_atanh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_atanh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_atanh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_atanh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -65,15 +80,32 @@
         doF32(0xace, 5);
     }
 
+    public void testAtanhF32_relaxed() {
+        doF32_relaxed(0xace, 128);
+    }
+
     public void testAtanhF32_2() {
         doF32_2(0xdae, 5);
     }
 
+    public void testAtanhF32_2_relaxed() {
+        doF32_2_relaxed(0xdae, 128);
+    }
+
     public void testAtanhF32_3() {
         doF32_3(0x123, 5);
     }
 
+    public void testAtanhF32_3_relaxed() {
+        doF32_3_relaxed(0x123, 128);
+    }
+
     public void testAtanhF32_4() {
         doF32_4(0x6480, 5);
+
     }
+    public void testAtanhF32_4_relaxed() {
+        doF32_4_relaxed(0x6480, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CbrtTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CbrtTest.java
index 15a509d..603794a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CbrtTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CbrtTest.java
@@ -22,11 +22,13 @@
 
 public class CbrtTest extends RSBaseCompute {
     private ScriptC_cbrt_f32 script_f32;
+    private ScriptC_cbrt_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_cbrt_f32(mRS);
+        script_f32_relaxed = new ScriptC_cbrt_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_cbrt_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_cbrt_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_cbrt_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_cbrt_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_cbrt_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xabe, 2);
     }
 
+    public void testCbrtF32_relaxed() {
+        doF32_relaxed(0xabe, 128);
+    }
+
     public void testCbrtF32_2() {
         doF32_2(0x78, 2);
     }
 
+    public void testCbrtF32_2_relaxed() {
+        doF32_2_relaxed(0x78, 128);
+    }
+
     public void testCbrtF32_3() {
         doF32_3(0x1e, 2);
     }
 
+    public void testCbrtF32_3_relaxed() {
+        doF32_3_relaxed(0x1e, 128);
+    }
+
     public void testCbrtF32_4() {
         doF32_4(0xfe2, 2);
+
     }
+    public void testCbrtF32_4_relaxed() {
+        doF32_4_relaxed(0xfe2, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CeilTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CeilTest.java
index 4ee2ade..5d64b95 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CeilTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CeilTest.java
@@ -22,11 +22,13 @@
 
 public class CeilTest extends RSBaseCompute {
     private ScriptC_ceil_f32 script_f32;
+    private ScriptC_ceil_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_ceil_f32(mRS);
+        script_f32_relaxed = new ScriptC_ceil_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_ceil_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_ceil_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_ceil_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_ceil_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_ceil_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x12345ace, 0);
     }
 
+    public void testCeilF32_relaxed() {
+        doF32_relaxed(0x12345ace, 1);
+    }
+
     public void testCeilF32_2() {
         doF32_2(0x1ac478, 0);
     }
 
+    public void testCeilF32_2_relaxed() {
+        doF32_2_relaxed(0x1ac478, 1);
+    }
+
     public void testCeilF32_3() {
         doF32_3(0xacef, 0);
     }
 
+    public void testCeilF32_3_relaxed() {
+        doF32_3_relaxed(0xacef, 1);
+    }
+
     public void testCeilF32_4() {
         doF32_4(0xef12, 0);
+
     }
+    public void testCeilF32_4_relaxed() {
+        doF32_4_relaxed(0xef12, 1);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CopysignTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CopysignTest.java
index 5601e46..a28caef 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CopysignTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CopysignTest.java
@@ -23,12 +23,14 @@
 
 public class CopysignTest extends RSBaseCompute {
     private ScriptC_copysign_f32 script_f32;
+    private ScriptC_copysign_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_copysign_f32(mRS);
+        script_f32_relaxed = new ScriptC_copysign_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_copysign_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_copysign_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_copysign_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_copysign_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_copysign_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -81,33 +96,54 @@
         doF32(0x12ac5678, 0);
     }
 
+    public void testCopysignF32_relaxed() {
+        ScriptField_copysign_f32_input in = new ScriptField_copysign_f32_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12ac5678, 0);
+    }
+
     /**
      * Tests copysign(float2, float2).
      */
     public void testCopysignF32_2() {
-        ScriptField_copysign_f32_2_input in =
-                new ScriptField_copysign_f32_2_input(mRS, INPUTSIZE);
+        ScriptField_copysign_f32_2_input in = new ScriptField_copysign_f32_2_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x12fe5678, 0);
     }
 
+    public void testCopysignF32_2_relaxed() {
+        ScriptField_copysign_f32_2_input in = new ScriptField_copysign_f32_2_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x12fe5678, 0);
+    }
+
     /**
      * Tests copysign(float3, float3).
      */
     public void testCopysignF32_3() {
-        ScriptField_copysign_f32_3_input in =
-                new ScriptField_copysign_f32_3_input(mRS, INPUTSIZE);
+        ScriptField_copysign_f32_3_input in = new ScriptField_copysign_f32_3_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1c345678, 0);
     }
 
+    public void testCopysignF32_3_relaxed() {
+        ScriptField_copysign_f32_3_input in = new ScriptField_copysign_f32_3_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1c345678, 0);
+    }
+
     /**
      * Tests copysign(float4, float4).
      */
     public void testCopysignF32_4() {
-        ScriptField_copysign_f32_4_input in =
-                new ScriptField_copysign_f32_4_input(mRS, INPUTSIZE);
+        ScriptField_copysign_f32_4_input in = new ScriptField_copysign_f32_4_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x123a5f7d, 0);
     }
+
+    public void testCopysignF32_4_relaxed() {
+        ScriptField_copysign_f32_4_input in = new ScriptField_copysign_f32_4_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x123a5f7d, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CosTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CosTest.java
index ebf4940..dd5db8a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CosTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CosTest.java
@@ -22,11 +22,13 @@
 
 public class CosTest extends RSBaseCompute {
     private ScriptC_cos_f32 script_f32;
+    private ScriptC_cos_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_cos_f32(mRS);
+        script_f32_relaxed = new ScriptC_cos_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_cos_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_cos_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_cos_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_cos_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_cos_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xe, 4);
     }
 
+    public void testCosF32_relaxed() {
+        doF32_relaxed(0xe, 4);
+    }
+
     public void testCosF32_2() {
         doF32_2(0xb, 4);
     }
 
+    public void testCosF32_2_relaxed() {
+        doF32_2_relaxed(0xb, 4);
+    }
+
     public void testCosF32_3() {
         doF32_3(0x12a, 4);
     }
 
+    public void testCosF32_3_relaxed() {
+        doF32_3_relaxed(0x12a, 4);
+    }
+
     public void testCosF32_4() {
         doF32_4(0x98a, 4);
+
     }
+    public void testCosF32_4_relaxed() {
+        doF32_4_relaxed(0x98a, 4);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CoshTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CoshTest.java
index 7e46b4c..9fa3603 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CoshTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CoshTest.java
@@ -23,11 +23,13 @@
 public class CoshTest extends RSBaseCompute {
 
     private ScriptC_cosh_f32 script_f32;
+    private ScriptC_cosh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_cosh_f32(mRS);
+        script_f32_relaxed = new ScriptC_cosh_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_cosh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_cosh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_cosh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_cosh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_cosh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -65,15 +80,32 @@
         doF32(0xfe, 4);
     }
 
+    public void testCoshF32_relaxed() {
+        doF32_relaxed(0xfe, 128);
+    }
+
     public void testCoshF32_2() {
         doF32_2(0x71, 4);
     }
 
+    public void testCoshF32_2_relaxed() {
+        doF32_2_relaxed(0x71, 128);
+    }
+
     public void testCoshF32_3() {
         doF32_3(0xa, 4);
     }
 
+    public void testCoshF32_3_relaxed() {
+        doF32_3_relaxed(0xa, 128);
+    }
+
     public void testCoshF32_4() {
         doF32_4(0xabe, 4);
+
     }
+    public void testCoshF32_4_relaxed() {
+        doF32_4_relaxed(0xabe, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CrossTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CrossTest.java
index a32eafd..308f5f4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CrossTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CrossTest.java
@@ -23,12 +23,14 @@
 
 public class CrossTest extends RSBaseCompute {
     private ScriptC_cross_f32 script_f32;
+    private ScriptC_cross_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_cross_f32(mRS);
+        script_f32_relaxed = new ScriptC_cross_f32_relaxed(mRS);
     }
 
     @Override
@@ -40,7 +42,14 @@
         case TEST_F32_4:
             script_f32.forEach_cross_f32_4(mIn, mOut);
             break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_cross_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_cross_f32_4(mIn, mOut);
+            break;
         }
+
     }
 
     @Override
@@ -77,6 +86,16 @@
         doF32_3(0x12345678, 0);
     }
 
+    /*
+    Disable until we can add an absolute error metric
+    public void testCrossF32_3_relaxed() {
+        ScriptField__cross_f32_3_struct in = new ScriptField__cross_f32_3_struct(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x12345678, 2);
+    }
+    */
+
+
     /**
      * cross test for float4
      */
@@ -85,4 +104,14 @@
         mIn = in.getAllocation();
         doF32_4(0x12ac5678, 0);
     }
+
+    /*
+    Disable until we can add an absolute error metric
+    public void testCrossF32_4_relaxed() {
+        ScriptField__cross_f32_4_struct in = new ScriptField__cross_f32_4_struct(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x12ac5678, 2);
+    }
+    */
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/DegreesTest.java b/tests/tests/renderscript/src/android/renderscript/cts/DegreesTest.java
index bb6e18d..38c4824 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/DegreesTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/DegreesTest.java
@@ -22,11 +22,13 @@
 
 public class DegreesTest extends RSBaseCompute {
     private ScriptC_degrees_f32 script_f32;
+    private ScriptC_degrees_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_degrees_f32(mRS);
+        script_f32_relaxed = new ScriptC_degrees_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_degrees_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_degrees_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_degrees_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_degrees_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_degrees_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -68,6 +83,10 @@
         doF32(0x12345678, 3);
     }
 
+    public void testDegreesF32_relaxed() {
+        doF32_relaxed(0x12345678, 3);
+    }
+
     /**
      * degrees test for float2
      */
@@ -75,6 +94,10 @@
         doF32_2(0x12353678, 3);
     }
 
+    public void testDegreesF32_2_relaxed() {
+        doF32_2_relaxed(0x12353678, 3);
+    }
+
     /**
      * degrees test for float3
      */
@@ -82,10 +105,19 @@
         doF32_3(0x12312678, 3);
     }
 
+    public void testDegreesF32_3_relaxed() {
+        doF32_3_relaxed(0x12312678, 3);
+    }
+
     /**
      * degrees test for float4
      */
     public void testDegreesF32_4() {
         doF32_4(0x12675678, 3);
+
     }
+    public void testDegreesF32_4_relaxed() {
+        doF32_4_relaxed(0x12675678, 3);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Exp10Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Exp10Test.java
index 6359765..875af18 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Exp10Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Exp10Test.java
@@ -22,11 +22,13 @@
 
 public class Exp10Test extends RSBaseCompute {
     private ScriptC_exp10_f32 script_f32;
+    private ScriptC_exp10_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_exp10_f32(mRS);
+        script_f32_relaxed = new ScriptC_exp10_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_exp10_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_exp10_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_exp10_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_exp10_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_exp10_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x81, 3);
     }
 
+    public void testExp10F32_relaxed() {
+        doF32_relaxed(0x81, 16);
+    }
+
     public void testExp10F32_2() {
         doF32_2(0xa42, 3);
     }
 
+    public void testExp10F32_2_relaxed() {
+        doF32_2_relaxed(0xa42, 16);
+    }
+
     public void testExp10F32_3() {
         doF32_3(0xace2, 3);
     }
 
+    public void testExp10F32_3_relaxed() {
+        doF32_3_relaxed(0xace2, 16);
+    }
+
     public void testExp10F32_4() {
         doF32_4(0x918, 3);
+
     }
+    public void testExp10F32_4_relaxed() {
+        doF32_4_relaxed(0x918, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Exp2Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Exp2Test.java
index 4f9335e..ac99b92 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Exp2Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Exp2Test.java
@@ -22,11 +22,13 @@
 
 public class Exp2Test extends RSBaseCompute {
     private ScriptC_exp2_f32 script_f32;
+    private ScriptC_exp2_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_exp2_f32(mRS);
+        script_f32_relaxed = new ScriptC_exp2_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_exp2_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_exp2_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_exp2_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_exp2_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_exp2_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xa6, 3);
     }
 
+    public void testExp2F32_relaxed() {
+        doF32_relaxed(0xa6, 16);
+    }
+
     public void testExp2F32_2() {
         doF32_2(0xab2, 3);
     }
 
+    public void testExp2F32_2_relaxed() {
+        doF32_2_relaxed(0xab2, 16);
+    }
+
     public void testExp2F32_3() {
         doF32_3(0x617a, 3);
     }
 
+    public void testExp2F32_3_relaxed() {
+        doF32_3_relaxed(0x617a, 16);
+    }
+
     public void testExp2F32_4() {
         doF32_4(0xabc3, 3);
+
     }
+    public void testExp2F32_4_relaxed() {
+        doF32_4_relaxed(0xabc3, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ExpTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ExpTest.java
index 3542f6f..e2f86ca 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ExpTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ExpTest.java
@@ -22,11 +22,13 @@
 
 public class ExpTest extends RSBaseCompute {
     private ScriptC_exp_f32 script_f32;
+    private ScriptC_exp_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_exp_f32(mRS);
+        script_f32_relaxed = new ScriptC_exp_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_exp_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_exp_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_exp_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_exp_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_exp_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xa28, 3);
     }
 
+    public void testExpF32_relaxed() {
+        doF32_relaxed(0xa28, 16);
+    }
+
     public void testExpF32_2() {
         doF32_2(0xfeb4, 3);
     }
 
+    public void testExpF32_2_relaxed() {
+        doF32_2_relaxed(0xfeb4, 16);
+    }
+
     public void testExpF32_3() {
         doF32_3(0xab2, 3);
     }
 
+    public void testExpF32_3_relaxed() {
+        doF32_3_relaxed(0xab2, 16);
+    }
+
     public void testExpF32_4() {
         doF32_4(0x7a6, 3);
+
     }
+    public void testExpF32_4_relaxed() {
+        doF32_4_relaxed(0x7a6, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Expm1Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Expm1Test.java
index f501c39..36b65ff 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Expm1Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Expm1Test.java
@@ -22,11 +22,13 @@
 
 public class Expm1Test extends RSBaseCompute {
     private ScriptC_expm1_f32 script_f32;
+    private ScriptC_expm1_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_expm1_f32(mRS);
+        script_f32_relaxed = new ScriptC_expm1_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_expm1_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_expm1_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_expm1_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_expm1_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_expm1_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xa29, 3);
     }
 
+    public void testExpm1F32_relaxed() {
+        doF32_relaxed(0xa29, 16);
+    }
+
     public void testExpm1F32_2() {
         doF32_2(0x8a2, 3);
     }
 
+    public void testExpm1F32_2_relaxed() {
+        doF32_2_relaxed(0x8a2, 16);
+    }
+
     public void testExpm1F32_3() {
         doF32_3(0xa7c, 3);
     }
 
+    public void testExpm1F32_3_relaxed() {
+        doF32_3_relaxed(0xa7c, 16);
+    }
+
     public void testExpm1F32_4() {
         doF32_4(0x81a, 3);
+
     }
+    public void testExpm1F32_4_relaxed() {
+        doF32_4_relaxed(0x81a, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FabsTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FabsTest.java
index a50162c..e8739d4 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FabsTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FabsTest.java
@@ -21,11 +21,13 @@
 
 public class FabsTest extends RSBaseCompute {
     private ScriptC_fabs_f32 script_f32;
+    private ScriptC_fabs_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fabs_f32(mRS);
+        script_f32_relaxed = new ScriptC_fabs_f32_relaxed(mRS);
     }
 
     @Override
@@ -43,6 +45,19 @@
         case TEST_F32_4:
             script_f32.forEach_fabs_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fabs_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fabs_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fabs_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fabs_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -63,15 +78,32 @@
         doF32(0xa, 0);
     }
 
+    public void testfabsF32_relaxed() {
+        doF32_relaxed(0xa, 0);
+    }
+
     public void testfabsF32_2() {
         doF32_2(0xb, 0);
     }
 
+    public void testfabsF32_2_relaxed() {
+        doF32_2_relaxed(0xb, 0);
+    }
+
     public void testfabsF32_3() {
         doF32_3(0xc, 0);
     }
 
+    public void testfabsF32_3_relaxed() {
+        doF32_3_relaxed(0xc, 0);
+    }
+
     public void testfabsF32_4() {
         doF32_4(0xd, 0);
+
     }
+    public void testfabsF32_4_relaxed() {
+        doF32_4_relaxed(0xd, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FdimTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FdimTest.java
index 099ca3d..144c258 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FdimTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FdimTest.java
@@ -22,12 +22,14 @@
 
 public class FdimTest extends RSBaseCompute {
     private ScriptC_fdim_f32 script_f32;
+    private ScriptC_fdim_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fdim_f32(mRS);
+        script_f32_relaxed = new ScriptC_fdim_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_fdim_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fdim_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fdim_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fdim_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fdim_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -76,21 +91,45 @@
         doF32(0x12678, 0);
     }
 
+    public void testfdimF32_relaxed() {
+        ScriptField_fdim_f32_input floatArray = new ScriptField_fdim_f32_input(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_relaxed(0x12678, 0);
+    }
+
     public void testfdimF32_2() {
         ScriptField_fdim_f32_2_input floatArray = new ScriptField_fdim_f32_2_input(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_2(0x1af45, 0);
     }
 
+    public void testfdimF32_2_relaxed() {
+        ScriptField_fdim_f32_2_input floatArray = new ScriptField_fdim_f32_2_input(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_2_relaxed(0x1af45, 0);
+    }
+
     public void testfdimF32_3() {
         ScriptField_fdim_f32_3_input floatArray = new ScriptField_fdim_f32_3_input(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_3(0x1cd345, 0);
     }
 
+    public void testfdimF32_3_relaxed() {
+        ScriptField_fdim_f32_3_input floatArray = new ScriptField_fdim_f32_3_input(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_3_relaxed(0x1cd345, 0);
+    }
+
     public void testfdimF32_4() {
         ScriptField_fdim_f32_4_input floatArray = new ScriptField_fdim_f32_4_input(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_4(0x1ca45, 0);
     }
+
+    public void testfdimF32_4_relaxed() {
+        ScriptField_fdim_f32_4_input floatArray = new ScriptField_fdim_f32_4_input(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_4_relaxed(0x1ca45, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FloorTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FloorTest.java
index 78b819b..e7494e6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FloorTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FloorTest.java
@@ -21,11 +21,13 @@
 
 public class FloorTest extends RSBaseCompute {
     private ScriptC_floor_f32 script_f32;
+    private ScriptC_floor_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_floor_f32(mRS);
+        script_f32_relaxed = new ScriptC_floor_f32_relaxed(mRS);
     }
 
     @Override
@@ -43,6 +45,19 @@
         case TEST_F32_4:
             script_f32.forEach_floor_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_floor_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_floor_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_floor_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_floor_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -63,15 +78,32 @@
         doF32(0xa, 0);
     }
 
+    public void testfloorF32_relaxed() {
+        doF32_relaxed(0xa, 1);
+    }
+
     public void testfloorF32_2() {
         doF32_2(0xb, 0);
     }
 
+    public void testfloorF32_2_relaxed() {
+        doF32_2_relaxed(0xb, 1);
+    }
+
     public void testfloorF32_3() {
         doF32_3(0xef1, 0);
     }
 
+    public void testfloorF32_3_relaxed() {
+        doF32_3_relaxed(0xef1, 1);
+    }
+
     public void testfloorF32_4() {
         doF32_4(0xefa12, 0);
+
     }
+    public void testfloorF32_4_relaxed() {
+        doF32_4_relaxed(0xefa12, 1);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FmaTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FmaTest.java
index 2fb29b7..40fac7e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FmaTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FmaTest.java
@@ -23,12 +23,14 @@
 
 public class FmaTest extends RSBaseCompute {
     private ScriptC_fma_f32 script_f32;
+    private ScriptC_fma_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fma_f32(mRS);
+        script_f32_relaxed = new ScriptC_fma_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_fma_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fma_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fma_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fma_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fma_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0xea1, 0);
     }
 
+    public void testFmaF32_relaxed() {
+        ScriptField_Floats floatArray = new ScriptField_Floats(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_relaxed(0xea1, 0);
+    }
+
     public void testFmaF32_2() {
         ScriptField_Floats2 floatArray = new ScriptField_Floats2(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_2(0x12a, 0);
     }
 
+    public void testFmaF32_2_relaxed() {
+        ScriptField_Floats2 floatArray = new ScriptField_Floats2(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_2_relaxed(0x12a, 0);
+    }
+
     public void testFmaF32_3() {
         ScriptField_Floats3 floatArray = new ScriptField_Floats3(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_3(0xfae, 0);
     }
 
+    public void testFmaF32_3_relaxed() {
+        ScriptField_Floats3 floatArray = new ScriptField_Floats3(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_3_relaxed(0xfae, 0);
+    }
+
     public void testFmaF32_4() {
         ScriptField_Floats4 floatArray = new ScriptField_Floats4(mRS, INPUTSIZE);
         mIn = floatArray.getAllocation();
         doF32_4(0x87a, 0);
     }
+
+    public void testFmaF32_4_relaxed() {
+        ScriptField_Floats4 floatArray = new ScriptField_Floats4(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_4_relaxed(0x87a, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FmaxTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FmaxTest.java
index eca16a0..99f2b42 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FmaxTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FmaxTest.java
@@ -22,12 +22,14 @@
 
 public class FmaxTest extends RSBaseCompute {
     private ScriptC_fmax_f32 script_f32;
+    private ScriptC_fmax_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fmax_f32(mRS);
+        script_f32_relaxed = new ScriptC_fmax_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_fmax_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fmax_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fmax_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fmax_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fmax_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -76,21 +91,45 @@
         doF32(0x12678, 0);
     }
 
+    public void testfmaxF32_relaxed() {
+        ScriptField_fmax_f32_in in = new ScriptField_fmax_f32_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12678, 0);
+    }
+
     public void testfmaxF32_2() {
         ScriptField_fmax_f32_2_in in = new ScriptField_fmax_f32_2_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x12ace, 0);
     }
 
+    public void testfmaxF32_2_relaxed() {
+        ScriptField_fmax_f32_2_in in = new ScriptField_fmax_f32_2_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x12ace, 0);
+    }
+
     public void testfmaxF32_3() {
         ScriptField_fmax_f32_3_in in = new ScriptField_fmax_f32_3_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x12e8, 0);
     }
 
+    public void testfmaxF32_3_relaxed() {
+        ScriptField_fmax_f32_3_in in = new ScriptField_fmax_f32_3_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x12e8, 0);
+    }
+
     public void testfmaxF32_4() {
         ScriptField_fmax_f32_4_in in = new ScriptField_fmax_f32_4_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0xeac, 0);
     }
+
+    public void testfmaxF32_4_relaxed() {
+        ScriptField_fmax_f32_4_in in = new ScriptField_fmax_f32_4_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0xeac, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FminTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FminTest.java
index da90e14..b43b828 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FminTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FminTest.java
@@ -22,12 +22,14 @@
 
 public class FminTest extends RSBaseCompute {
     private ScriptC_fmin_f32 script_f32;
+    private ScriptC_fmin_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fmin_f32(mRS);
+        script_f32_relaxed = new ScriptC_fmin_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_fmin_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fmin_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fmin_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fmin_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fmin_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -76,21 +91,45 @@
         doF32(0x12678, 0);
     }
 
+    public void testfminF32_relaxed() {
+        ScriptField_fmin_f32_in in = new ScriptField_fmin_f32_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12678, 0);
+    }
+
     public void testfminF32_2() {
         ScriptField_fmin_f32_2_in in = new ScriptField_fmin_f32_2_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x12ace, 0);
     }
 
+    public void testfminF32_2_relaxed() {
+        ScriptField_fmin_f32_2_in in = new ScriptField_fmin_f32_2_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x12ace, 0);
+    }
+
     public void testfminF32_3() {
         ScriptField_fmin_f32_3_in in = new ScriptField_fmin_f32_3_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x12e8, 0);
     }
 
+    public void testfminF32_3_relaxed() {
+        ScriptField_fmin_f32_3_in in = new ScriptField_fmin_f32_3_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x12e8, 0);
+    }
+
     public void testfminF32_4() {
         ScriptField_fmin_f32_4_in in = new ScriptField_fmin_f32_4_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0xeac, 0);
     }
+
+    public void testfminF32_4_relaxed() {
+        ScriptField_fmin_f32_4_in in = new ScriptField_fmin_f32_4_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0xeac, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/FmodTest.java b/tests/tests/renderscript/src/android/renderscript/cts/FmodTest.java
index 47fe202..d0d911d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/FmodTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/FmodTest.java
@@ -23,12 +23,14 @@
 
 public class FmodTest extends RSBaseCompute {
     private ScriptC_fmod_f32 script_f32;
+    private ScriptC_fmod_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_fmod_f32(mRS);
+        script_f32_relaxed = new ScriptC_fmod_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_fmod_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_fmod_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_fmod_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_fmod_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_fmod_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -80,6 +95,12 @@
         doF32(0x12345678, 0);
     }
 
+    public void testfmodF32_relaxed() {
+        ScriptField_fmod_input_f32 floatArray = new ScriptField_fmod_input_f32(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_relaxed(0x12345678, 0);
+    }
+
     /**
      * This method is used for testing the fmod() function with F32_2
      */
@@ -89,6 +110,12 @@
         doF32_2(0x12345, 0);
     }
 
+    public void testfmodF32_2_relaxed() {
+        ScriptField_fmod_input_f32_2 floatArray = new ScriptField_fmod_input_f32_2(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_2_relaxed(0x12345, 0);
+    }
+
     /**
      * This method is used for testing the fmod() function with F32_3
      */
@@ -98,6 +125,12 @@
         doF32_3(0x12345, 0);
     }
 
+    public void testfmodF32_3_relaxed() {
+        ScriptField_fmod_input_f32_3 floatArray = new ScriptField_fmod_input_f32_3(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_3_relaxed(0x12345, 0);
+    }
+
     /**
      * This method is used for testing the fmod() function with F32_4
      */
@@ -106,4 +139,10 @@
         mIn = floatArray.getAllocation();
         doF32_4(0x12345, 0);
     }
+
+    public void testfmodF32_4_relaxed() {
+        ScriptField_fmod_input_f32_4 floatArray = new ScriptField_fmod_input_f32_4(mRS, INPUTSIZE);
+        mIn = floatArray.getAllocation();
+        doF32_4_relaxed(0x12345, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/HypotTest.java b/tests/tests/renderscript/src/android/renderscript/cts/HypotTest.java
index f6a280f..c5ce887 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/HypotTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/HypotTest.java
@@ -23,12 +23,14 @@
 
 public class HypotTest extends RSBaseCompute {
     private ScriptC_hypot_f32 script_f32;
+    private ScriptC_hypot_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_hypot_f32(mRS);
+        script_f32_relaxed = new ScriptC_hypot_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_hypot_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_hypot_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_hypot_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_hypot_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_hypot_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0x123678, 4);
     }
 
+    public void testHypotF32_relaxed() {
+        ScriptField_hypot_f32_in in = new ScriptField_hypot_f32_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x123678, 4);
+    }
+
     public void testHypotF32_2() {
         ScriptField_hypot_f32_2_in in = new ScriptField_hypot_f32_2_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1234a5, 4);
     }
 
+    public void testHypotF32_2_relaxed() {
+        ScriptField_hypot_f32_2_in in = new ScriptField_hypot_f32_2_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1234a5, 4);
+    }
+
     public void testHypotF32_3() {
         ScriptField_hypot_f32_3_in in = new ScriptField_hypot_f32_3_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1af345, 4);
     }
 
+    public void testHypotF32_3_relaxed() {
+        ScriptField_hypot_f32_3_in in = new ScriptField_hypot_f32_3_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1af345, 4);
+    }
+
     public void testHypotF32_4() {
         ScriptField_hypot_f32_4_in in = new ScriptField_hypot_f32_4_in(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x12ce45, 4);
     }
+
+    public void testHypotF32_4_relaxed() {
+        ScriptField_hypot_f32_4_in in = new ScriptField_hypot_f32_4_in(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x12ce45, 4);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java
new file mode 100644
index 0000000..7d952f6
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicBase.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.util.Log;
+import android.renderscript.RenderScript;
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+
+public class IntrinsicBase extends RSBaseCompute {
+    protected final String TAG = "Img";
+
+    protected Allocation mAllocSrc;
+    protected Allocation mAllocRef;
+    protected Allocation mAllocDst;
+    protected ScriptC_verify mVerify;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mVerify = new ScriptC_verify(mRS);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if (mVerify != null) {
+            mVerify.destroy();
+            mVerify = null;
+        }
+        super.tearDown();
+    }
+
+    protected Element makeElement(Element.DataType dt, int vecSize) {
+        Element e;
+        if (vecSize > 1) {
+            e = Element.createVector(mRS, dt, vecSize);
+        } else {
+            if (dt == Element.DataType.UNSIGNED_8) {
+                e = Element.U8(mRS);
+            } else {
+                e = Element.F32(mRS);
+            }
+        }
+        return e;
+    }
+
+    protected Allocation makeAllocation(int w, int h, Element e) {
+        Type.Builder tb = new Type.Builder(mRS, e);
+        tb.setX(w);
+        tb.setY(h);
+        Type t = tb.create();
+        return Allocation.createTyped(mRS, t);
+    }
+
+    protected void makeSource(int w, int h, Element e) {
+        if (mAllocSrc != null) {
+            mAllocSrc.destroy();
+        }
+        mAllocSrc = makeAllocation(w, h, e);
+
+        java.util.Random r = new java.util.Random(100);
+
+        int vs = e.getVectorSize();
+        if (vs == 3) vs = 4;
+        if (e.getDataType() == Element.DataType.FLOAT_32) {
+            float f[] = new float[w * h * vs];
+            for (int y=0; y < h; y++) {
+                for (int x = 0; x < w; x++) {
+                    for (int v = 0; v < vs; v++) {
+                        f[(y * w + x) * vs + v] = r.nextFloat();
+                    }
+                }
+            }
+            mAllocSrc.copyFromUnchecked(f);
+        }
+
+        if (e.getDataType() == Element.DataType.UNSIGNED_8) {
+            byte f[] = new byte[w * h * vs];
+            for (int y=0; y < h; y++) {
+                for (int x = 0; x < w; x++) {
+                    for (int v = 0; v < vs; v++) {
+                        f[(y * w + x) * vs + v] = (byte)r.nextInt(256);
+                    }
+                }
+            }
+            mAllocSrc.copyFromUnchecked(f);
+        }
+    }
+
+    protected void makeBuffers(int w, int h, Element e) {
+        makeSource(w, h, e);
+
+        if (mAllocRef != null) {
+            mAllocRef.destroy();
+        }
+        if (mAllocDst != null) {
+            mAllocDst.destroy();
+        }
+        mAllocRef = Allocation.createTyped(mRS, mAllocSrc.getType());
+        mAllocDst = Allocation.createTyped(mRS, mAllocSrc.getType());
+    }
+
+
+    protected void checkError() {
+        mRS.finish();
+        mVerify.invoke_checkError();
+        waitForMessage();
+        checkForErrors();
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java
new file mode 100644
index 0000000..2ac7d6f
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicColorMatrix.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+
+public class IntrinsicColorMatrix extends IntrinsicBase {
+    protected ScriptIntrinsicColorMatrix mSi;
+    protected ScriptC_intrinsic_colormatrix mSr;
+
+    private void subtest(int w, int h, Matrix4f mat, Float4 add,
+                         Element.DataType dtIn, int vsIn,
+                         Element.DataType dtOut, int vsOut) {
+
+
+        if (mat == null) {
+            mat = new Matrix4f();
+        }
+
+        if (mSi == null) {
+            mSi = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS));
+            mSr = new ScriptC_intrinsic_colormatrix(mRS);
+        }
+
+        Element ein = makeElement(dtIn, vsIn);
+        Element eout = makeElement(dtOut, vsOut);
+
+
+        makeSource(w, h, ein);
+        mAllocRef = makeAllocation(w, h, eout);
+        mAllocDst = makeAllocation(w, h, eout);
+
+        mSi.setColorMatrix(mat);
+        mSi.setAdd(add);
+        mSi.forEach(mAllocSrc, mAllocDst);
+        mSr.invoke_reference(mat, add, mAllocSrc, mAllocRef);
+
+        android.util.Log.e("RSI test", "test ColorMatrix  vsin=" + vsIn + ", vsout=" + vsOut + ",  dim " + w + ", " + h);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+        mRS.finish();
+    }
+
+
+    private void test(Element.DataType dtin, Element.DataType dtout, int subtest) {
+        Float4 add = new Float4();
+        Matrix4f mat = new Matrix4f();
+        java.util.Random r = new java.util.Random(100);
+
+        float f[] = mat.getArray();
+        for (int i=0; i < f.length; i++) {
+            f[i] = 0.f;
+        }
+
+
+        switch (subtest) {
+        case 0:
+            mVerify.set_gAllowedIntError(0);
+            mat.loadIdentity();
+            break;
+        case 1:
+            mVerify.set_gAllowedIntError(1);
+            mat.set(0, 0, 1.f);
+            mat.set(0, 1, 1.f);
+            mat.set(0, 2, 1.f);
+            break;
+        default:
+            mVerify.set_gAllowedIntError(2);
+            for (int i=0; i < f.length; i++) {
+                if (r.nextFloat() > 0.5f) {
+                    f[i] = r.nextFloat() * (subtest - 1);
+                }
+            }
+            for (int i=0; i < f.length; i++) {
+                if (r.nextFloat() > 0.5f) {
+                    add.x = r.nextFloat() * (subtest - 1);
+                }
+                if (r.nextFloat() > 0.5f) {
+                    add.y = r.nextFloat() * (subtest - 1);
+                }
+                if (r.nextFloat() > 0.5f) {
+                    add.z = r.nextFloat() * (subtest - 1);
+                }
+                if (r.nextFloat() > 0.5f) {
+                    add.w = r.nextFloat() * (subtest - 1);
+                }
+            }
+            android.util.Log.v("rs", "Mat [" + f[0] + ", " + f[4] + ", " + f[8] + ", " + f[12] + "]");
+            android.util.Log.v("rs", "    [" + f[1] + ", " + f[5] + ", " + f[9] + ", " + f[13] + "]");
+            android.util.Log.v("rs", "    [" + f[2] + ", " + f[6] + ", " + f[10] + ", " + f[14] + "]");
+            android.util.Log.v("rs", "    [" + f[3] + ", " + f[7] + ", " + f[11] + ", " + f[15] + "]");
+        }
+
+        for (int i=1; i <= 4; i++) {
+            for (int j=1; j <=4; j++) {
+                subtest(101, 101, mat, add,
+                        dtin, i,
+                        dtout, j);
+            }
+        }
+        checkError();
+    }
+
+    public void test_U8_U8_Ident() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 0);
+    }
+
+    public void test_F32_F32_Ident() {
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 0);
+    }
+
+    public void test_U8_F32_Ident() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 0);
+    }
+
+    public void test_F32_U8_Ident() {
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 0);
+    }
+
+    public void test_U8_U8_Rand() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.UNSIGNED_8, 2);
+    }
+
+    public void test_F32_F32_Rand() {
+        test(Element.DataType.FLOAT_32, Element.DataType.FLOAT_32, 10);
+    }
+
+    public void test_U8_F32_Rand() {
+        test(Element.DataType.UNSIGNED_8, Element.DataType.FLOAT_32, 10);
+    }
+
+    public void test_F32_U8_Rand() {
+        test(Element.DataType.FLOAT_32, Element.DataType.UNSIGNED_8, 10);
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
new file mode 100644
index 0000000..12eae9a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve3x3.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+
+public class IntrinsicConvolve3x3 extends IntrinsicBase {
+    private void testConvolve3(int w, int h, Element.DataType dt, int vecSize) {
+        float cf1[] = {0.f, 0.f, 0.f,  0.f, 1.f, 0.f,  0.f, 0.f, 0.f};
+        float cf2[] = {0.f, -1.f, 0.f,  -1.f, 5.f, -1.f,  0.f, -1.f, 0.f};
+
+
+        Element e = makeElement(dt, vecSize);
+
+        System.gc();
+        makeBuffers(w, h, e);
+
+
+        ScriptIntrinsicConvolve3x3 si = ScriptIntrinsicConvolve3x3.create(mRS, e);
+        si.setCoefficients(cf1);
+        si.setInput(mAllocSrc);
+        si.forEach(mAllocRef);
+
+        ScriptC_intrinsic_convolve3x3 sr = new ScriptC_intrinsic_convolve3x3(mRS);
+        sr.set_gCoeffs(cf1);
+        sr.set_gIn(mAllocSrc);
+        sr.set_gWidth(w);
+        sr.set_gHeight(h);
+        if (dt == Element.DataType.UNSIGNED_8) {
+            switch(vecSize) {
+            case 4:
+                sr.forEach_convolve_U4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_U3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_U2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_U1(mAllocDst);
+                break;
+            }
+        } else {
+            switch(vecSize) {
+            case 4:
+                sr.forEach_convolve_F4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_F3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_F2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_F1(mAllocDst);
+                break;
+            }
+        }
+
+        android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 1 " + w + ", " + h);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+
+        si.setCoefficients(cf2);
+        sr.set_gCoeffs(cf2);
+        si.forEach(mAllocRef);
+        if (dt == Element.DataType.UNSIGNED_8) {
+            switch(vecSize) {
+            case 4:
+                sr.forEach_convolve_U4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_U3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_U2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_U1(mAllocDst);
+                break;
+            }
+        } else {
+            switch(vecSize) {
+            case 4:
+                sr.forEach_convolve_F4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_F3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_F2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_F1(mAllocDst);
+                break;
+            }
+        }
+        android.util.Log.e("RSI test", "test convolve U8_" + vecSize + " 2 " + w + ", " + h);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+        mRS.finish();
+    }
+
+
+    public void test_U8_4() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 4);
+        checkError();
+    }
+    public void test_U8_3() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 3);
+        checkError();
+    }
+    public void test_U8_2() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 2);
+        checkError();
+    }
+    public void test_U8_1() {
+        testConvolve3(100, 100, Element.DataType.UNSIGNED_8, 1);
+        checkError();
+    }
+
+    public void test_F32_4() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 4);
+        checkError();
+    }
+
+    public void test_F32_3() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 3);
+        checkError();
+    }
+
+    public void test_F32_2() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 2);
+        checkError();
+    }
+
+    public void test_F32_1() {
+        testConvolve3(100, 100, Element.DataType.FLOAT_32, 1);
+        checkError();
+    }
+
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
new file mode 100644
index 0000000..482db59
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicConvolve5x5.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+
+public class IntrinsicConvolve5x5 extends IntrinsicBase {
+    private void test5(ScriptC_intrinsic_convolve5x5 sr, ScriptIntrinsicConvolve5x5 si,
+                        Element e, float cf[], String name, int num, int w, int h) {
+        si.setCoefficients(cf);
+        si.setInput(mAllocSrc);
+        si.forEach(mAllocRef);
+
+        sr.set_gWidth(w);
+        sr.set_gHeight(h);
+        sr.set_gCoeffs(cf);
+        sr.set_gIn(mAllocSrc);
+        if (e.getDataType() == Element.DataType.UNSIGNED_8) {
+            switch(e.getVectorSize()) {
+            case 4:
+                sr.forEach_convolve_U4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_U3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_U2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_U1(mAllocDst);
+                break;
+            }
+        } else {
+            switch(e.getVectorSize()) {
+            case 4:
+                sr.forEach_convolve_F4(mAllocDst);
+                break;
+            case 3:
+                sr.forEach_convolve_F3(mAllocDst);
+                break;
+            case 2:
+                sr.forEach_convolve_F2(mAllocDst);
+                break;
+            case 1:
+                sr.forEach_convolve_F1(mAllocDst);
+                break;
+            }
+        }
+
+        android.util.Log.e("RSI test", name + "  " + e.getVectorSize() + " " + num + " " + w + ", " + h);
+        mVerify.invoke_verify(mAllocRef, mAllocDst, mAllocSrc);
+        mRS.finish();
+    }
+
+    private void testConvolve5(int w, int h, Element.DataType dt, int vecSize) {
+        float cf1[] = { 0.f,  0.f,  0.f,  0.f,  0.f,
+                        0.f,  0.f,  0.f,  0.f,  0.f,
+                        0.f,  0.f,  1.f,  0.f,  0.f,
+                        0.f,  0.f,  0.f,  0.f,  0.f,
+                        0.f,  0.f,  0.f,  0.f,  0.f};
+        float cf2[] = {-1.f, -1.f, -1.f, -1.f, -1.f,
+                       -1.f,  0.f,  0.f,  0.f, -1.f,
+                       -1.f,  0.f, 16.f,  0.f, -1.f,
+                       -1.f,  0.f,  0.f,  0.f, -1.f,
+                       -1.f, -1.f, -1.f, -1.f, -1.f};
+
+        Element e = makeElement(dt, vecSize);
+        makeBuffers(w, h, e);
+
+        ScriptIntrinsicConvolve5x5 si = ScriptIntrinsicConvolve5x5.create(mRS, e);
+        ScriptC_intrinsic_convolve5x5 sr = new ScriptC_intrinsic_convolve5x5(mRS);
+        test5(sr, si, e, cf1, "test convolve", 1, w, h);
+        test5(sr, si, e, cf2, "test convolve", 2, w, h);
+    }
+
+    public void test_U8_4() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 4);
+        checkError();
+    }
+    public void test_U8_3() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 3);
+        checkError();
+    }
+    public void test_U8_2() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 2);
+        checkError();
+    }
+    public void test_U8_1() {
+        testConvolve5(100, 100, Element.DataType.UNSIGNED_8, 1);
+        checkError();
+    }
+
+    public void test_F32_4() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 4);
+        checkError();
+    }
+    public void test_F32_3() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 3);
+        checkError();
+    }
+    public void test_F32_2() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 2);
+        checkError();
+    }
+    public void test_F32_1() {
+        testConvolve5(100, 100, Element.DataType.FLOAT_32, 1);
+        checkError();
+    }
+
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicHistogram.java b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicHistogram.java
new file mode 100644
index 0000000..e970291
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IntrinsicHistogram.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.*;
+import android.util.Log;
+
+public class IntrinsicHistogram extends IntrinsicBase {
+    private Allocation mAin;
+    private Allocation mAout;
+
+    private void createAllocations(int inVSize, int outVSize, int w, int h) {
+        Element e1;
+        Element e2;
+
+        switch (inVSize) {
+        case 4: e1 = Element.U8_4(mRS); break;
+        case 3: e1 = Element.U8_3(mRS); break;
+        case 2: e1 = Element.U8_2(mRS); break;
+        default: e1 = Element.U8(mRS); break;
+        }
+
+        switch (outVSize) {
+        case 4: e2 = Element.I32_4(mRS); break;
+        case 3: e2 = Element.I32_3(mRS); break;
+        case 2: e2 = Element.I32_2(mRS); break;
+        default: e2 = Element.I32(mRS); break;
+        }
+
+        Type.Builder tb = new Type.Builder(mRS, e1);
+        tb.setX(w).setY(h);
+
+        mAin = Allocation.createTyped(mRS, tb.create());
+        mAout = Allocation.createSized(mRS, e2, 256);
+    }
+
+    private void testNorm(int inVSize, int outVSize, int w, int h) {
+        createAllocations(inVSize, outVSize, w, h);
+
+        int invs2 = (inVSize != 3) ? inVSize : 4;
+        int outvs2 = (outVSize != 3) ? outVSize : 4;
+
+        byte i[] = new byte[w * h * invs2];
+        int res[] = new int[256 * outvs2];
+        int ref[] = new int[256 * outvs2];
+
+        java.util.Random r = new java.util.Random();
+        r.nextBytes(i);
+
+        for (int ct=0; ct < i.length; ct++) {
+            int t = i[ct];
+            if (t < 0) t = 256 + t;
+            if ((ct % invs2) < outVSize) {
+                ref[(t * outvs2) + (ct % invs2)] ++;
+            }
+        }
+
+        mAin.copyFrom(i);
+        ScriptIntrinsicHistogram hist =
+                ScriptIntrinsicHistogram.create(mRS, mAin.getType().getElement());
+        hist.setOutput(mAout);
+        hist.forEach(mAin);
+
+        mAin.copyFrom(i);
+        mAout.copyTo(res);
+        for (int ct=0; ct < res.length; ct++) {
+            assertTrue(res[ct] == ref[ct]);
+        }
+    }
+
+    public void test_norm_4_4() {
+        testNorm(4, 4, 101, 101);
+    }
+    public void test_norm_4_3() {
+        testNorm(4, 3, 101, 101);
+    }
+    public void test_norm_4_2() {
+        testNorm(4, 2, 101, 101);
+    }
+    public void test_norm_4_1() {
+        testNorm(4, 1, 101, 101);
+    }
+
+    public void test_norm_3_3() {
+        testNorm(3, 3, 101, 101);
+    }
+    public void test_norm_3_2() {
+        testNorm(3, 2, 101, 101);
+    }
+    public void test_norm_3_1() {
+        testNorm(3, 1, 101, 101);
+    }
+
+    public void test_norm_2_2() {
+        testNorm(2, 2, 101, 101);
+    }
+    public void test_norm_2_1() {
+        testNorm(2, 1, 101, 101);
+    }
+
+    public void test_norm_1_1() {
+        testNorm(1, 1, 101, 101);
+    }
+
+
+
+    private void testDot(int inVSize, int w, int h) {
+        createAllocations(inVSize, 1, w, h);
+
+        int invs2 = (inVSize != 3) ? inVSize : 4;
+
+        byte i[] = new byte[w * h * invs2];
+        int res[] = new int[256];
+        int ref[] = new int[256];
+
+        java.util.Random r = new java.util.Random();
+        r.nextBytes(i);
+
+        float dotVals[] = {0.2501f, 0.1251f, 0.06251f, 0.1251f};
+        int doti[] = new int[4];
+        for (int ct=0; ct < 4; ct++) {
+            doti[ct] = (int)((dotVals[ct] * 256.f) + 0.5f);
+        }
+
+        for (int ct=0; ct < i.length; ct+=invs2) {
+            int v = 0;
+            for (int c = 0; c < inVSize; c++) {
+                int t = i[ct + c];
+                if (t < 0) t = 256 + t;
+                v += doti[c] * t;
+            }
+            ref[(v + 0x7f) >> 8] ++;
+        }
+
+        mAin.copyFrom(i);
+        ScriptIntrinsicHistogram hist =
+                ScriptIntrinsicHistogram.create(mRS, mAin.getType().getElement());
+        hist.setOutput(mAout);
+        hist.setDotCoefficients(dotVals[0], dotVals[1], dotVals[2], dotVals[3]);
+        hist.forEach_Dot(mAin);
+
+        mAin.copyFrom(i);
+        mAout.copyTo(res);
+        for (int ct=0; ct < res.length; ct++) {
+            assertTrue(res[ct] == ref[ct]);
+        }
+    }
+
+    public void test_dot_1() {
+        testDot(1, 101, 101);
+    }
+    public void test_dot_2() {
+        testDot(2, 101, 101);
+    }
+    public void test_dot_3() {
+        testDot(3, 101, 101);
+    }
+    public void test_dot_4() {
+        testDot(4, 101, 101);
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java b/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java
new file mode 100644
index 0000000..b8c133a
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LeakTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2012 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 android.renderscript.cts;
+
+import android.app.ActivityManager;
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.Type;
+import android.util.Log;
+import android.content.Context;
+
+/*
+// -target-api 11
+
+#pragma version(1)
+#pragma rs java_package_name(android.renderscript.cts)
+
+rs_allocation a;
+
+void print() {
+    rsDebug("unused", rsGetElementAt_int(a, 0, 0));
+}
+*/
+
+/**
+ * Test for memory leaks due to missing object slot information.
+ *
+ * The code to generate leak.bc is in the previous comment block.
+ * Note that you need to modify llvm-rs-cc to skip emitting the
+ * .rs.dtor() function, since it will also do the proper cleanup
+ * (but not trigger the original bug). Old HC code can trigger this
+ * bug, since it may have been compiled without .rs.dtor() support.
+ */
+public class LeakTest extends RSBaseCompute {
+    private static final String TAG = "LeakTest";
+
+    public void testForLeaks() {
+        ActivityManager am = (ActivityManager) getContext().getSystemService("activity");
+        int mc = am.getLargeMemoryClass() / 32;
+        if (mc < 1) {
+            mc = 1;
+        }
+        int x = mc * 1024 * 1024;
+
+        for (int i = 0; i < 100; i++) {
+            Log.w(TAG, "Leak test iteration " + i);
+            ScriptC_leak leak = new ScriptC_leak(mRS);
+            Type t = new Type.Builder(mRS, Element.I32(mRS)).setX(x).create();
+            Allocation A = Allocation.createTyped(mRS, t);
+            leak.set_a(A);
+            A = null;
+            //System.gc();
+            leak.destroy();
+            mRS.finish();
+        }
+        mRS.finish();
+        checkForErrors();
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Log10Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Log10Test.java
index 823366b..bc571a3 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Log10Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Log10Test.java
@@ -22,11 +22,13 @@
 
 public class Log10Test extends RSBaseCompute {
     private ScriptC_log10_f32 script_f32;
+    private ScriptC_log10_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_log10_f32(mRS);
+        script_f32_relaxed = new ScriptC_log10_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_log10_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_log10_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_log10_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_log10_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_log10_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x13, 3);
     }
 
+    public void testLog10F32_relaxed() {
+        doF32_relaxed(0x13, 16);
+    }
+
     public void testLog10F32_2() {
         doF32_2(0xf, 3);
     }
 
+    public void testLog10F32_2_relaxed() {
+        doF32_2_relaxed(0xf, 16);
+    }
+
     public void testLog10F32_3() {
         doF32_3(0xa, 3);
     }
 
+    public void testLog10F32_3_relaxed() {
+        doF32_3_relaxed(0xa, 16);
+    }
+
     public void testLog10F32_4() {
         doF32_4(0xf3, 3);
+
     }
+    public void testLog10F32_4_relaxed() {
+        doF32_4_relaxed(0xf3, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Log1PTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Log1PTest.java
index 55e98de..a4daf61 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Log1PTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Log1PTest.java
@@ -22,11 +22,13 @@
 
 public class Log1PTest extends RSBaseCompute {
     private ScriptC_log1p_f32 script_f32;
+    private ScriptC_log1p_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_log1p_f32(mRS);
+        script_f32_relaxed = new ScriptC_log1p_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_log1p_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_log1p_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_log1p_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_log1p_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_log1p_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xab, 2);
     }
 
+    public void testLog1PF32_relaxed() {
+        doF32_relaxed(0xab, 16);
+    }
+
     public void testLog1PF32_2() {
         doF32_2(0x12, 2);
     }
 
+    public void testLog1PF32_2_relaxed() {
+        doF32_2_relaxed(0x12, 16);
+    }
+
     public void testLog1PF32_3() {
         doF32_3(0xa1, 2);
     }
 
+    public void testLog1PF32_3_relaxed() {
+        doF32_3_relaxed(0xa1, 16);
+    }
+
     public void testLog1PF32_4() {
         doF32_4(0xbae, 2);
+
     }
+    public void testLog1PF32_4_relaxed() {
+        doF32_4_relaxed(0xbae, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Log2Test.java b/tests/tests/renderscript/src/android/renderscript/cts/Log2Test.java
index 9bbd3fb..dd13d8d 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/Log2Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/Log2Test.java
@@ -22,11 +22,13 @@
 
 public class Log2Test extends RSBaseCompute {
     private ScriptC_log2_f32 script_f32;
+    private ScriptC_log2_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_log2_f32(mRS);
+        script_f32_relaxed = new ScriptC_log2_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_log2_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_log2_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_log2_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_log2_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_log2_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x18a, 3);
     }
 
+    public void testLog2F32_relaxed() {
+        doF32_relaxed(0x18a, 128);
+    }
+
     public void testLog2F32_2() {
         doF32_2(0xfa, 3);
     }
 
+    public void testLog2F32_2_relaxed() {
+        doF32_2_relaxed(0xfa, 128);
+    }
+
     public void testLog2F32_3() {
         doF32_3(0xaef, 3);
     }
 
+    public void testLog2F32_3_relaxed() {
+        doF32_3_relaxed(0xaef, 128);
+    }
+
     public void testLog2F32_4() {
         doF32_4(0xae62, 3);
+
     }
+    public void testLog2F32_4_relaxed() {
+        doF32_4_relaxed(0xae62, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LogTest.java b/tests/tests/renderscript/src/android/renderscript/cts/LogTest.java
index 462f682..ee03b4e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/LogTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LogTest.java
@@ -22,11 +22,13 @@
 
 public class LogTest extends RSBaseCompute {
     private ScriptC_log_f32 script_f32;
+    private ScriptC_log_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_log_f32(mRS);
+        script_f32_relaxed = new ScriptC_log_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_log_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_log_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_log_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_log_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_log_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xfae, 3);
     }
 
+    public void testLogF32_relaxed() {
+        doF32_relaxed(0xfae, 16);
+    }
+
     public void testLogF32_2() {
         doF32_2(0x123, 3);
     }
 
+    public void testLogF32_2_relaxed() {
+        doF32_2_relaxed(0x123, 16);
+    }
+
     public void testLogF32_3() {
         doF32_3(0xab4, 3);
     }
 
+    public void testLogF32_3_relaxed() {
+        doF32_3_relaxed(0xab4, 16);
+    }
+
     public void testLogF32_4() {
         doF32_4(0xfa3, 3);
+
     }
+    public void testLogF32_4_relaxed() {
+        doF32_4_relaxed(0xfa3, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/LogbTest.java b/tests/tests/renderscript/src/android/renderscript/cts/LogbTest.java
index 1be03fb..b42d680 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/LogbTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/LogbTest.java
@@ -22,11 +22,13 @@
 
 public class LogbTest extends RSBaseCompute {
     private ScriptC_logb_f32 script_f32;
+    private ScriptC_logb_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_logb_f32(mRS);
+        script_f32_relaxed = new ScriptC_logb_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_logb_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_logb_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_logb_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_logb_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_logb_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xe, 0);
     }
 
+    public void testLogbF32_relaxed() {
+        doF32_relaxed(0xe, 0);
+    }
+
     public void testLogbF32_2() {
         doF32_2(0xa1, 0);
     }
 
+    public void testLogbF32_2_relaxed() {
+        doF32_2_relaxed(0xa1, 0);
+    }
+
     public void testLogbF32_3() {
         doF32_3(0xab2, 0);
     }
 
+    public void testLogbF32_3_relaxed() {
+        doF32_3_relaxed(0xab2, 0);
+    }
+
     public void testLogbF32_4() {
         doF32_4(0xaa2, 0);
+
     }
+    public void testLogbF32_4_relaxed() {
+        doF32_4_relaxed(0xaa2, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/MadTest.java b/tests/tests/renderscript/src/android/renderscript/cts/MadTest.java
index 8ab3db2..3662035 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/MadTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/MadTest.java
@@ -23,12 +23,14 @@
 
 public class MadTest extends RSBaseCompute {
     private ScriptC_mad_f32 script_f32;
+    private ScriptC_mad_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_mad_f32(mRS);
+        script_f32_relaxed = new ScriptC_mad_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_mad_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_mad_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_mad_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_mad_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_mad_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0x123678, 4);
     }
 
+    public void testMadF32_relaxed() {
+        ScriptField_mad_input_f32 in = new ScriptField_mad_input_f32(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x123678, 4);
+    }
+
     public void testMadF32_2() {
         ScriptField_mad_input_f32_2 in = new ScriptField_mad_input_f32_2(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1234a5, 4);
     }
 
+    public void testMadF32_2_relaxed() {
+        ScriptField_mad_input_f32_2 in = new ScriptField_mad_input_f32_2(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1234a5, 4);
+    }
+
     public void testMadF32_3() {
         ScriptField_mad_input_f32_3 in = new ScriptField_mad_input_f32_3(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1af345, 4);
     }
 
+    public void testMadF32_3_relaxed() {
+        ScriptField_mad_input_f32_3 in = new ScriptField_mad_input_f32_3(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1af345, 4);
+    }
+
     public void testMadF32_4() {
         ScriptField_mad_input_f32_4 in = new ScriptField_mad_input_f32_4(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x12ce45, 4);
     }
+
+    public void testMadF32_4_relaxed() {
+        ScriptField_mad_input_f32_4 in = new ScriptField_mad_input_f32_4(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x12ce45, 4);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Matrix2fTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Matrix2fTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Matrix3fTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Matrix3fTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/Matrix4fTest.java b/tests/tests/renderscript/src/android/renderscript/cts/Matrix4fTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/NextafterTest.java b/tests/tests/renderscript/src/android/renderscript/cts/NextafterTest.java
index a36aa0e..468b341 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/NextafterTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/NextafterTest.java
@@ -23,12 +23,14 @@
 
 public class NextafterTest extends RSBaseCompute {
     private ScriptC_nextafter_f32 script_f32;
+    private ScriptC_nextafter_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_nextafter_f32(mRS);
+        script_f32_relaxed = new ScriptC_nextafter_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_nextafter_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_nextafter_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_nextafter_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_nextafter_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_nextafter_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -77,21 +92,45 @@
         doF32(0x12678, 0);
     }
 
+    public void testNextafterF32_relaxed() {
+        ScriptField_InputData inputDataArray = new ScriptField_InputData(mRS, INPUTSIZE);
+        mIn = inputDataArray.getAllocation();
+        doF32_relaxed(0x12678, 0);
+    }
+
     public void testNextafterF32_2() {
         ScriptField_InputData_2 inputDataArray = new ScriptField_InputData_2(mRS, INPUTSIZE);
         mIn = inputDataArray.getAllocation();
         doF32_2(0x1af45, 0);
     }
 
+    public void testNextafterF32_2_relaxed() {
+        ScriptField_InputData_2 inputDataArray = new ScriptField_InputData_2(mRS, INPUTSIZE);
+        mIn = inputDataArray.getAllocation();
+        doF32_2_relaxed(0x1af45, 0);
+    }
+
     public void testNextafterF32_3() {
         ScriptField_InputData_3 inputDataArray = new ScriptField_InputData_3(mRS, INPUTSIZE);
         mIn = inputDataArray.getAllocation();
         doF32_3(0x1cd345, 0);
     }
 
+    public void testNextafterF32_3_relaxed() {
+        ScriptField_InputData_3 inputDataArray = new ScriptField_InputData_3(mRS, INPUTSIZE);
+        mIn = inputDataArray.getAllocation();
+        doF32_3_relaxed(0x1cd345, 0);
+    }
+
     public void testNextafterF32_4() {
         ScriptField_InputData_4 inputDataArray = new ScriptField_InputData_4(mRS, INPUTSIZE);
         mIn = inputDataArray.getAllocation();
         doF32_4(0x1ca45, 0);
     }
+
+    public void testNextafterF32_4_relaxed() {
+        ScriptField_InputData_4 inputDataArray = new ScriptField_InputData_4(mRS, INPUTSIZE);
+        mIn = inputDataArray.getAllocation();
+        doF32_4_relaxed(0x1ca45, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/PowTest.java b/tests/tests/renderscript/src/android/renderscript/cts/PowTest.java
index b5ea9fa..09a2e94 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/PowTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/PowTest.java
@@ -23,12 +23,14 @@
 
 public class PowTest extends RSBaseCompute {
     private ScriptC_pow_f32 script_f32;
+    private ScriptC_pow_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_pow_f32(mRS);
+        script_f32_relaxed = new ScriptC_pow_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_pow_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_pow_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_pow_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_pow_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_pow_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -83,21 +98,45 @@
         doF32(0x12345678, 16);
     }
 
+    public void testPowF32_relaxed() {
+        ScriptField_PowInputData in = new ScriptField_PowInputData(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12345678, 128);
+    }
+
     public void testPowF32_2() {
         ScriptField_PowInputData_2 in = new ScriptField_PowInputData_2(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x12ab78, 16);
     }
 
+    public void testPowF32_2_relaxed() {
+        ScriptField_PowInputData_2 in = new ScriptField_PowInputData_2(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x12ab78, 128);
+    }
+
     public void testPowF32_3() {
         ScriptField_PowInputData_3 in = new ScriptField_PowInputData_3(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1f5678, 16);
     }
 
+    public void testPowF32_3_relaxed() {
+        ScriptField_PowInputData_3 in = new ScriptField_PowInputData_3(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1f5678, 128);
+    }
+
     public void testPowF32_4() {
         ScriptField_PowInputData_4 in = new ScriptField_PowInputData_4(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0xc678, 16);
     }
+
+    public void testPowF32_4_relaxed() {
+        ScriptField_PowInputData_4 in = new ScriptField_PowInputData_4(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0xc678, 128);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/PownTest.java b/tests/tests/renderscript/src/android/renderscript/cts/PownTest.java
index b149347..c95a294 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/PownTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/PownTest.java
@@ -23,12 +23,14 @@
 
 public class PownTest extends RSBaseCompute {
     private ScriptC_pown_f32 script_f32;
+    private ScriptC_pown_f32_relaxed script_f32_relaxed;
     private int[] n;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_pown_f32(mRS);
+        script_f32_relaxed = new ScriptC_pown_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,20 @@
         case TEST_F32_4:
             script_f32.forEach_pown_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_pown_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_pown_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_pown_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_pown_f32_4(mIn, mOut);
+            break;
+
         }
     }
 
@@ -73,6 +89,17 @@
         doF32(0x716acd, 16);
     }
 
+    public void testPownF32_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE];
+        RSUtils.genRandom(0x12345678, 32, 1, -16, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n1(nAlloc);
+
+        doF32_relaxed(0x716acd, 128);
+    }
+
     public void testPownF32_2() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_2(mRS), INPUTSIZE);
 
@@ -84,6 +111,17 @@
         doF32_2(0xacdef1, 16);
     }
 
+    public void testPownF32_2_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_2(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*2];
+        RSUtils.genRandom(0xacdef1, 32, 1, -16, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n2(nAlloc);
+
+        doF32_2_relaxed(0xacdef1, 128);
+    }
+
     public void testPownF32_3() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_3(mRS), INPUTSIZE);
 
@@ -95,6 +133,17 @@
         doF32_3(0xaac3f1, 16);
     }
 
+    public void testPownF32_3_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_3(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*4];
+        RSUtils.genRandom(0xa123f1, 32, 1, -16, n, 4, 1);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n3(nAlloc);
+
+        doF32_3_relaxed(0xaac3f1, 128);
+    }
+
     public void testPownF32_4() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_4(mRS), INPUTSIZE);
 
@@ -105,4 +154,15 @@
 
         doF32_4(0xaa12f1, 16);
     }
+
+    public void testPownF32_4_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_4(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*4];
+        RSUtils.genRandom(0x4323ca, 32, 1, -16, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n4(nAlloc);
+
+        doF32_4_relaxed(0xaa12f1, 128);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/PowrTest.java b/tests/tests/renderscript/src/android/renderscript/cts/PowrTest.java
index 5c75a04..f10995b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/PowrTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/PowrTest.java
@@ -23,12 +23,14 @@
 
 public class PowrTest extends RSBaseCompute {
     private ScriptC_powr_f32 script_f32;
+    private ScriptC_powr_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_powr_f32(mRS);
+        script_f32_relaxed = new ScriptC_powr_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_powr_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_powr_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_powr_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_powr_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_powr_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -83,21 +98,45 @@
         doF32(0x12345678, 16);
     }
 
+    public void testPowrF32_relaxed() {
+        ScriptField_PowInputData in = new ScriptField_PowInputData(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12345678, 128);
+    }
+
     public void testPowrF32_2() {
         ScriptField_PowInputData_2 in = new ScriptField_PowInputData_2(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x12ab78, 16);
     }
 
+    public void testPowrF32_2_relaxed() {
+        ScriptField_PowInputData_2 in = new ScriptField_PowInputData_2(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2(0x12ab78, 128);
+    }
+
     public void testPowrF32_3() {
         ScriptField_PowInputData_3 in = new ScriptField_PowInputData_3(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1f5678, 16);
     }
 
+    public void testPowrF32_3_relaxed() {
+        ScriptField_PowInputData_3 in = new ScriptField_PowInputData_3(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1f5678, 128);
+    }
+
     public void testPowrF32_4() {
         ScriptField_PowInputData_4 in = new ScriptField_PowInputData_4(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0xc678, 16);
     }
+
+    public void testPowrF32_4_relaxed() {
+        ScriptField_PowInputData_4 in = new ScriptField_PowInputData_4(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0xc678, 128);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
index d02e28b..d68e628 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBaseCompute.java
@@ -20,6 +20,7 @@
 import android.renderscript.Allocation;
 import android.renderscript.Element;
 import android.renderscript.RSRuntimeException;
+import android.util.Log;
 
 /**
  * Base RenderScript test class. This class provides a message handler and a
@@ -32,6 +33,10 @@
     static final int TEST_F32_2 = 1;
     static final int TEST_F32_3 = 2;
     static final int TEST_F32_4 = 3;
+    static final int TEST_RELAXED_F32 = 4;
+    static final int TEST_RELAXED_F32_2 = 5;
+    static final int TEST_RELAXED_F32_3 = 6;
+    static final int TEST_RELAXED_F32_4 = 7;
     protected int INPUTSIZE = 512;
 
     @Override
@@ -94,6 +99,8 @@
         try {
             RSUtils.forEach(this, testid, mAllocationIn, mAllocationOut);
         } catch (RSRuntimeException e) {
+            Log.e("RenderscriptCTS", "Caught RSRuntimeException: " +
+                  e.getMessage());
         }
         float[] outArray = makeOutArray(INPUTSIZE * outStride);
         mAllocationOut.copyTo(outArray);
@@ -120,6 +127,23 @@
         baseTestHelper(TEST_F32_4, Element.F32_4(mRS), Element.F32_4(mRS), seed, 1, 0, 1, 0, 4, 4, 4, 0, ulp);
     }
 
+    public void doF32_relaxed(long seed, int ulp) {
+        baseTestHelper(TEST_RELAXED_F32, Element.F32(mRS), Element.F32(mRS), seed, 1, 0, 1, 0, 1, 1, 1, 0, ulp);
+    }
+
+    public void doF32_2_relaxed(long seed, int ulp) {
+        baseTestHelper(TEST_RELAXED_F32_2, Element.F32_2(mRS), Element.F32_2(mRS), seed, 1, 0, 1, 0, 2, 2, 2, 0, ulp);
+    }
+
+    public void doF32_3_relaxed(long seed, int ulp) {
+        baseTestHelper(TEST_RELAXED_F32_3, Element.F32_3(mRS), Element.F32_3(mRS), seed, 1, 0, 4, 1, 3, 4, 4, 1, ulp);
+    }
+
+    public void doF32_4_relaxed(long seed, int ulp) {
+        baseTestHelper(TEST_RELAXED_F32_4, Element.F32_4(mRS), Element.F32_4(mRS), seed, 1, 0, 1, 0, 4, 4, 4, 0, ulp);
+    }
+
+
     public void forEach(int testId, Allocation mIn, Allocation mOut) throws RSRuntimeException {
         // Intentionally empty... subclass will likely define only one, but not both
     }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RadiansTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RadiansTest.java
index f8a6936..a0c7834 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RadiansTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RadiansTest.java
@@ -22,11 +22,13 @@
 
 public class RadiansTest extends RSBaseCompute {
     private ScriptC_radians_f32 script_f32;
+    private ScriptC_radians_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_radians_f32(mRS);
+        script_f32_relaxed = new ScriptC_radians_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_radians_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_radians_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_radians_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_radians_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_radians_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -68,6 +83,10 @@
         doF32(0x1234f678, 3);
     }
 
+    public void testRadiansF32_relaxed() {
+        doF32_relaxed(0x1234f678, 3);
+    }
+
     /**
      * radians test for float2
      */
@@ -75,6 +94,10 @@
         doF32_2(0x12345678, 3);
     }
 
+    public void testRadiansF32_2_relaxed() {
+        doF32_2_relaxed(0x12345678, 3);
+    }
+
     /**
      * radians test for float3
      */
@@ -82,10 +105,19 @@
         doF32_3(0x123d5678, 3);
     }
 
+    public void testRadiansF32_3_relaxed() {
+        doF32_3_relaxed(0x123d5678, 3);
+    }
+
     /**
      * radians test for float4
      */
     public void testRadiansF32_4() {
         doF32_4(0x123a5678, 3);
+
     }
+    public void testRadiansF32_4_relaxed() {
+        doF32_4_relaxed(0x123a5678, 3);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RemainderTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RemainderTest.java
index 8abdafe..edd3320 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RemainderTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RemainderTest.java
@@ -23,12 +23,14 @@
 
 public class RemainderTest extends RSBaseCompute {
     private ScriptC_remainder_f32 script_f32;
+    private ScriptC_remainder_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_remainder_f32(mRS);
+        script_f32_relaxed = new ScriptC_remainder_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,19 @@
         case TEST_F32_4:
             script_f32.forEach_remainder_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_remainder_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_remainder_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_remainder_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_remainder_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -79,21 +94,45 @@
         doF32(0x123678, 0);
     }
 
+    public void testRemainderF32_relaxed() {
+        ScriptField_remainder_f32 in = new ScriptField_remainder_f32(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x123678, 0);
+    }
+
     public void testRemainderF32_2() {
         ScriptField_remainder_f32_2 in = new ScriptField_remainder_f32_2(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1234a5, 0);
     }
 
+    public void testRemainderF32_2_relaxed() {
+        ScriptField_remainder_f32_2 in = new ScriptField_remainder_f32_2(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1234a5, 0);
+    }
+
     public void testRemainderF32_3() {
         ScriptField_remainder_f32_3 in = new ScriptField_remainder_f32_3(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0x1af345, 0);
     }
 
+    public void testRemainderF32_3_relaxed() {
+        ScriptField_remainder_f32_3 in = new ScriptField_remainder_f32_3(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0x1af345, 0);
+    }
+
     public void testRemainderF32_4() {
         ScriptField_remainder_f32_4 in = new ScriptField_remainder_f32_4(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x12ce45, 0);
     }
+
+    public void testRemainderF32_4_relaxed() {
+        ScriptField_remainder_f32_4 in = new ScriptField_remainder_f32_4(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x12ce45, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RintTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RintTest.java
index 2efef44..56c0acf 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RintTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RintTest.java
@@ -22,11 +22,13 @@
 
 public class RintTest extends RSBaseCompute {
     private ScriptC_rint_f32 script_f32;
+    private ScriptC_rint_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_rint_f32(mRS);
+        script_f32_relaxed = new ScriptC_rint_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_rint_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_rint_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_rint_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_rint_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_rint_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -68,6 +83,10 @@
         doF32(0x12345678, 0);
     }
 
+    public void testRintF32_relaxed() {
+        doF32_relaxed(0x12345678, 0);
+    }
+
     /**
      * rint test for float2
      */
@@ -75,6 +94,10 @@
         doF32_2(0x12ab5678, 0);
     }
 
+    public void testRintF32_2_relaxed() {
+        doF32_2_relaxed(0x12ab5678, 0);
+    }
+
     /**
      * rint test for float3
      */
@@ -82,10 +105,19 @@
         doF32_3(0x123ac678, 0);
     }
 
+    public void testRintF32_3_relaxed() {
+        doF32_3_relaxed(0x123ac678, 0);
+    }
+
     /**
      * rint test for float4
      */
     public void testRintF32_4() {
         doF32_4(0x1f345678, 0);
+
     }
+    public void testRintF32_4_relaxed() {
+        doF32_4_relaxed(0x1f345678, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RootnTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RootnTest.java
index 1b2c46b..8301ad5 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RootnTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RootnTest.java
@@ -23,12 +23,14 @@
 
 public class RootnTest extends RSBaseCompute {
     private ScriptC_rootn_f32 script_f32;
+    private ScriptC_rootn_f32_relaxed script_f32_relaxed;
     private int[] n;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_rootn_f32(mRS);
+        script_f32_relaxed = new ScriptC_rootn_f32_relaxed(mRS);
     }
 
     @Override
@@ -46,6 +48,18 @@
         case TEST_F32_4:
             script_f32.forEach_rootn_f32_4(mIn, mOut);
             break;
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_rootn_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_rootn_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_rootn_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_rootn_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -73,6 +87,18 @@
         doF32(0x716acd, 16);
     }
 
+    public void testRootnF32_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE];
+        RSUtils.genRandom(0x12345678, 32, 1, 1, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n1(nAlloc);
+
+        doF32_relaxed(0x716acd, 16);
+    }
+
+
     public void testRootnF32_2() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_2(mRS), INPUTSIZE);
 
@@ -84,6 +110,18 @@
         doF32_2(0xacdef1, 16);
     }
 
+    public void testRootnF32_2_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_2(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*2];
+        RSUtils.genRandom(0xacdef1, 32, 1, 1, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n2(nAlloc);
+
+        doF32_2_relaxed(0xacdef1, 16);
+    }
+
+
     public void testRootnF32_3() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_3(mRS), INPUTSIZE);
 
@@ -95,6 +133,17 @@
         doF32_3(0xaac3f1, 16);
     }
 
+    public void testRootnF32_3_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_3(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*4];
+        RSUtils.genRandom(0xa123f1, 32, 1, 1, n, 4, 1);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n3(nAlloc);
+
+        doF32_3_relaxed(0xaac3f1, 16);
+    }
+
     public void testRootnF32_4() {
         Allocation nAlloc = Allocation.createSized(mRS, Element.I32_4(mRS), INPUTSIZE);
 
@@ -105,4 +154,16 @@
 
         doF32_4(0xaa12f1, 16);
     }
+
+    public void testRootnF32_4_relaxed() {
+        Allocation nAlloc = Allocation.createSized(mRS, Element.I32_4(mRS), INPUTSIZE);
+
+        n = new int[INPUTSIZE*4];
+        RSUtils.genRandom(0x4323ca, 32, 1, 1, n);
+        nAlloc.copyFrom(n);
+        script_f32_relaxed.set_n4(nAlloc);
+
+        doF32_4_relaxed(0xaa12f1, 16);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RoundTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RoundTest.java
index 90f155b..ab85bc1 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RoundTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RoundTest.java
@@ -22,11 +22,13 @@
 
 public class RoundTest extends RSBaseCompute {
     private ScriptC_round_f32 script_f32;
+    private ScriptC_round_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_round_f32(mRS);
+        script_f32_relaxed = new ScriptC_round_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_round_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_round_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_round_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_round_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_round_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -76,6 +91,10 @@
         doF32(0x12345678, 0);
     }
 
+    public void testRoundF32_relaxed() {
+        doF32_relaxed(0x12345678, 0);
+    }
+
     /**
      * round test for float2
      */
@@ -83,6 +102,10 @@
         doF32_2(0x123a5678, 0);
     }
 
+    public void testRoundF32_2_relaxed() {
+        doF32_2_relaxed(0x123a5678, 0);
+    }
+
     /**
      * round test for float3
      */
@@ -90,10 +113,19 @@
         doF32_3(0x1af45678, 0);
     }
 
+    public void testRoundF32_3_relaxed() {
+        doF32_3_relaxed(0x1af45678, 0);
+    }
+
     /**
      * round test for float4
      */
     public void testRoundF32_4() {
         doF32_4(0x1f345678, 0);
+
     }
+    public void testRoundF32_4_relaxed() {
+        doF32_4_relaxed(0x1f345678, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsFracTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RsFracTest.java
index 74c9425..2185ae2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsFracTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsFracTest.java
@@ -21,11 +21,16 @@
 
 public class RsFracTest extends RSBaseCompute {
     private ScriptC_rs_frac_f32 mScript;
+    private ScriptC_rs_frac_f32_relaxed mScript_relaxed;
 
     @Override
     public void forEach(int testId, Allocation mIn, Allocation mOut)
             throws RSRuntimeException {
-        mScript.forEach_root(mIn, mOut);
+        if (testId == TEST_F32) {
+            mScript.forEach_root(mIn, mOut);
+        } else if (testId == TEST_RELAXED_F32) {
+            mScript_relaxed.forEach_root(mIn, mOut);
+        }
     }
 
     @Override
@@ -45,4 +50,9 @@
         mScript = new ScriptC_rs_frac_f32(mRS, mRes, R.raw.rs_frac_f32);
         doF32(0x12, 0);
     }
+    public void testRsFrac_relaxed() {
+        mScript_relaxed = new ScriptC_rs_frac_f32_relaxed(mRS, mRes, R.raw.rs_frac_f32);
+        doF32_relaxed(0x12, 1);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsqrtTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RsqrtTest.java
index 13f4817..1183886 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsqrtTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsqrtTest.java
@@ -22,11 +22,13 @@
 
 public class RsqrtTest extends RSBaseCompute {
     private ScriptC_rsqrt_f32 script_f32;
+    private ScriptC_rsqrt_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_rsqrt_f32(mRS);
+        script_f32_relaxed = new ScriptC_rsqrt_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_Rsqrt_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_Rsqrt_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_Rsqrt_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_Rsqrt_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_Rsqrt_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x12345678, 2);
     }
 
+    public void testRsqrtF32_relaxed() {
+        doF32_relaxed(0x12345678, 2);
+    }
+
     public void testRsqrtF32_2() {
         doF32_2(0x12ae4567, 2);
     }
 
+    public void testRsqrtF32_2_relaxed() {
+        doF32_2_relaxed(0x12ae4567, 2);
+    }
+
     public void testRsqrtF32_3() {
         doF32_3(0x12cf8, 2);
     }
 
+    public void testRsqrtF32_3_relaxed() {
+        doF32_3_relaxed(0x12cf8, 2);
+    }
+
     public void testRsqrtF32_4() {
         doF32_4(0x12abc8, 2);
+
     }
+    public void testRsqrtF32_4_relaxed() {
+        doF32_4_relaxed(0x12abc8, 2);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_leak.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_leak.java
new file mode 100644
index 0000000..c026755
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptC_leak.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011-2012 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.
+ */
+
+/*
+ * This file is auto-generated. DO NOT MODIFY!
+ * The source Renderscript file: leak.rs
+ */
+package android.renderscript.cts;
+
+import android.renderscript.*;
+import android.content.res.Resources;
+
+/**
+ * @hide
+ */
+public class ScriptC_leak extends ScriptC {
+    private static final String __rs_resource_name = "leak";
+    // Constructor
+    public  ScriptC_leak(RenderScript rs) {
+        this(rs,
+             rs.getApplicationContext().getResources(),
+             rs.getApplicationContext().getResources().getIdentifier(
+                 __rs_resource_name, "raw",
+                 rs.getApplicationContext().getPackageName()));
+    }
+
+    public  ScriptC_leak(RenderScript rs, Resources resources, int id) {
+        super(rs, resources, id);
+    }
+
+    private FieldPacker __rs_fp_ALLOCATION;
+    private final static int mExportVarIdx_a = 0;
+    private Allocation mExportVar_a;
+    public synchronized void set_a(Allocation v) {
+        setVar(mExportVarIdx_a, v);
+        mExportVar_a = v;
+    }
+
+    public Allocation get_a() {
+        return mExportVar_a;
+    }
+
+    private final static int mExportFuncIdx_print = 0;
+    public void invoke_print() {
+        invoke(mExportFuncIdx_print);
+    }
+
+}
+
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
index 64496ef..c9a79c8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
@@ -202,13 +202,13 @@
         Type compareType = new Type.Builder(mRS, Element.I32(mRS)).create();
 
         ScriptC_scriptgroup node1, node2, node3, node4, node5, compare;
-        node1 = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
-        node2 = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
-        node3 = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
-        node4 = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
-        node5 = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
+        node1 = new ScriptC_scriptgroup(mRS);
+        node2 = new ScriptC_scriptgroup(mRS);
+        node3 = new ScriptC_scriptgroup(mRS);
+        node4 = new ScriptC_scriptgroup(mRS);
+        node5 = new ScriptC_scriptgroup(mRS);
 
-        compare = new ScriptC_scriptgroup(mRS, mRes, R.raw.scriptgroup);
+        compare = new ScriptC_scriptgroup(mRS);
 
         Allocation in1, in2, out, resultAlloc;
         in1 = Allocation.createTyped(mRS, connect);
@@ -265,4 +265,50 @@
         assertTrue(result[0] == 2);
     }
 
+    /**
+     * Tests a case where a shared global variable is updated by the first kernel in a group,
+     * but then read by a subsequent kernel.
+     *
+     * The test ensures that we don't accidentally apply any fusion optimizations to the kernel
+     * pair, since there is a potential dependency that crosses the kernel cell boundary.
+     */
+    public void testScriptGroupSharedGlobal() {
+        Type i32 = new Type.Builder(mRS, Element.I32(mRS)).setX(1).create();
+        Type u32 = new Type.Builder(mRS, Element.U32(mRS)).setX(2).create();
+
+        Allocation aFailed = Allocation.createTyped(mRS, i32);
+        Allocation aSharedInt = Allocation.createTyped(mRS, i32);
+
+        ScriptC_group1 mG1 = new ScriptC_group1(mRS);
+        ScriptC_group2 mG2 = new ScriptC_group2(mRS);
+
+        mG1.set_aSharedInt(aSharedInt);
+        mG2.set_aSharedInt(aSharedInt);
+        mG2.set_aFailed(aFailed);
+
+        int [] Failed = new int [1];
+        Failed[0] = 0;
+        aFailed.copyFrom(Failed);
+
+        ScriptGroup.Builder b = new ScriptGroup.Builder(mRS);
+
+        // Writes to aSharedInt[x] in the kernel.
+        b.addKernel(mG1.getKernelID_setSharedInt());
+        // Reads aSharedInt[1] to verify it is -5.
+        b.addKernel(mG2.getKernelID_getSharedInt());
+        // If we fuse mG1/mG2, we won't see the update to the aSharedInt[1] during mG2 for x == 0.
+        // The update is only visible if we correctly identify the dependency and execute all of
+        // mG1 before starting on mG2.
+        b.addConnection(u32, mG1.getKernelID_setSharedInt(), mG2.getKernelID_getSharedInt());
+        ScriptGroup group = b.create();
+        group.execute();
+
+        mG2.invoke_verify();
+        aFailed.copyTo(Failed);
+        if (Failed[0] != 0) {
+            FoundError = true;
+        }
+
+        checkForErrors();
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SignTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SignTest.java
index 9329d01..69e2636 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SignTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SignTest.java
@@ -22,11 +22,13 @@
 
 public class SignTest extends RSBaseCompute {
     private ScriptC_sign_f32 script_f32;
+    private ScriptC_sign_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_sign_f32(mRS);
+        script_f32_relaxed = new ScriptC_sign_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_sign_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_sign_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_sign_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_sign_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_sign_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -67,10 +82,18 @@
         doF32(0x12345678, 0);
     }
 
+    public void testSignF32_relaxed() {
+        doF32_relaxed(0x12345678, 0);
+    }
+
     public void testSignF32_2() {
         doF32_2(0x12a45678, 0);
     }
 
+    public void testSignF32_2_relaxed() {
+        doF32_2_relaxed(0x12a45678, 0);
+    }
+
     /**
      * This method is used for sign() function with f32_3
      */
@@ -78,10 +101,19 @@
         doF32_3(0x123c5678, 0);
     }
 
+    public void testSignF32_3_relaxed() {
+        doF32_3_relaxed(0x123c5678, 0);
+    }
+
     /**
      * This method is used for sign() function with f32_4
      */
     public void testSignF32_4() {
         doF32_4(0x123d678, 0);
+
     }
+    public void testSignF32_4_relaxed() {
+        doF32_4_relaxed(0x123d678, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SinTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SinTest.java
index 2d57219..5911632 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SinTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SinTest.java
@@ -22,11 +22,13 @@
 
 public class SinTest extends RSBaseCompute {
     private ScriptC_sin_f32 script_f32;
+    private ScriptC_sin_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_sin_f32(mRS);
+        script_f32_relaxed = new ScriptC_sin_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_sin_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_sin_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_sin_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_sin_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_sin_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xba, 4);
     }
 
+    public void testSinF32_relaxed() {
+        doF32_relaxed(0xba, 128);
+    }
+
     public void testSinF32_2() {
         doF32_2(0xbaa, 4);
     }
 
+    public void testSinF32_2_relaxed() {
+        doF32_2_relaxed(0xbaa, 128);
+    }
+
     public void testSinF32_3() {
         doF32_3(0xca, 4);
     }
 
+    public void testSinF32_3_relaxed() {
+        doF32_3_relaxed(0xca, 128);
+    }
+
     public void testSinF32_4() {
         doF32_4(0xda, 4);
+
     }
+    public void testSinF32_4_relaxed() {
+        doF32_4_relaxed(0xda, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SinhTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SinhTest.java
index c88bd42..a95c574 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SinhTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SinhTest.java
@@ -22,11 +22,13 @@
 
 public class SinhTest extends RSBaseCompute {
     private ScriptC_sinh_f32 script_f32;
+    private ScriptC_sinh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_sinh_f32(mRS);
+        script_f32_relaxed = new ScriptC_sinh_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_sinh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_sinh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_sinh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_sinh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_sinh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0x32a, 4);
     }
 
+    public void testSinhF32_relaxed() {
+        doF32_relaxed(0x32a, 128);
+    }
+
     public void testSinhF32_2() {
         doF32_2(0xba35, 4);
     }
 
+    public void testSinhF32_2_relaxed() {
+        doF32_2_relaxed(0xba35, 128);
+    }
+
     public void testSinhF32_3() {
         doF32_3(0xacc3, 4);
     }
 
+    public void testSinhF32_3_relaxed() {
+        doF32_3_relaxed(0xacc3, 128);
+    }
+
     public void testSinhF32_4() {
         doF32_4(0xaa, 4);
+
     }
+    public void testSinhF32_4_relaxed() {
+        doF32_4_relaxed(0xaa, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SqrtTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SqrtTest.java
index 300a519..02290ca 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SqrtTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SqrtTest.java
@@ -22,11 +22,13 @@
 
 public class SqrtTest extends RSBaseCompute {
     private ScriptC_sqrt_f32 script_f32;
+    private ScriptC_sqrt_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_sqrt_f32(mRS);
+        script_f32_relaxed = new ScriptC_sqrt_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_sqrt_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_sqrt_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_sqrt_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_sqrt_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_sqrt_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xab3, 3);
     }
 
+    public void testSqrtF32_relaxed() {
+        doF32_relaxed(0xab3, 3);
+    }
+
     public void testSqrtF32_2() {
         doF32_2(0xa1, 3);
     }
 
+    public void testSqrtF32_2_relaxed() {
+        doF32_2_relaxed(0xa1, 3);
+    }
+
     public void testSqrtF32_3() {
         doF32_3(0xbae7, 3);
     }
 
+    public void testSqrtF32_3_relaxed() {
+        doF32_3_relaxed(0xbae7, 3);
+    }
+
     public void testSqrtF32_4() {
         doF32_4(0xbac361, 3);
+
     }
+    public void testSqrtF32_4_relaxed() {
+        doF32_4_relaxed(0xbac361, 3);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StepTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StepTest.java
index a1ffda3..39fb443 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StepTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StepTest.java
@@ -22,12 +22,14 @@
 
 public class StepTest extends RSBaseCompute {
     private ScriptC_step_f32 script_f32;
+    private ScriptC_step_f32_relaxed script_f32_relaxed;
     private Allocation mIn;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_step_f32(mRS);
+        script_f32_relaxed = new ScriptC_step_f32_relaxed(mRS);
     }
 
     @Override
@@ -45,6 +47,19 @@
         case TEST_F32_4:
             script_f32.forEach_step_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_step_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_step_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_step_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_step_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -76,21 +91,45 @@
         doF32(0x12678, 0);
     }
 
+    public void testStepF32_relaxed() {
+        ScriptField_step_input in = new ScriptField_step_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_relaxed(0x12678, 0);
+    }
+
     public void testStepF32_2() {
         ScriptField_step_2_input in = new ScriptField_step_2_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_2(0x1ace8, 0);
     }
 
+    public void testStepF32_2_relaxed() {
+        ScriptField_step_2_input in = new ScriptField_step_2_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_2_relaxed(0x1ace8, 0);
+    }
+
     public void testStepF32_3() {
         ScriptField_step_3_input in = new ScriptField_step_3_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_3(0xa2ce8, 0);
     }
 
+    public void testStepF32_3_relaxed() {
+        ScriptField_step_3_input in = new ScriptField_step_3_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_3_relaxed(0xa2ce8, 0);
+    }
+
     public void testStepF32_4() {
         ScriptField_step_4_input in = new ScriptField_step_4_input(mRS, INPUTSIZE);
         mIn = in.getAllocation();
         doF32_4(0x1ee8, 0);
     }
+
+    public void testStepF32_4_relaxed() {
+        ScriptField_step_4_input in = new ScriptField_step_4_input(mRS, INPUTSIZE);
+        mIn = in.getAllocation();
+        doF32_4_relaxed(0x1ee8, 0);
+    }
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TanTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TanTest.java
index f237c40..a4e62e9 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TanTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TanTest.java
@@ -22,11 +22,13 @@
 
 public class TanTest extends RSBaseCompute {
     private ScriptC_tan_f32 script_f32;
+    private ScriptC_tan_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_tan_f32(mRS);
+        script_f32_relaxed = new ScriptC_tan_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_tan_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_tan_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_tan_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_tan_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_tan_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xabe, 5);
     }
 
+    public void testTanF32_relaxed() {
+        doF32_relaxed(0xabe, 128);
+    }
+
     public void testTanF32_2() {
         doF32_2(0x29, 5);
     }
 
+    public void testTanF32_2_relaxed() {
+        doF32_2_relaxed(0x29, 128);
+    }
+
     public void testTanF32_3() {
         doF32_3(0x9a, 5);
     }
 
+    public void testTanF32_3_relaxed() {
+        doF32_3_relaxed(0x9a, 128);
+    }
+
     public void testTanF32_4() {
         doF32_4(0xac3, 5);
+
     }
+    public void testTanF32_4_relaxed() {
+        doF32_4_relaxed(0xac3, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TanhTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TanhTest.java
index 070fa20..4dc7d15 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TanhTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TanhTest.java
@@ -22,11 +22,13 @@
 
 public class TanhTest extends RSBaseCompute {
     private ScriptC_tanh_f32 script_f32;
+    private ScriptC_tanh_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_tanh_f32(mRS);
+        script_f32_relaxed = new ScriptC_tanh_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_tanh_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_tanh_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_tanh_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_tanh_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_tanh_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -64,15 +79,32 @@
         doF32(0xab61, 5);
     }
 
+    public void testTanhF32_relaxed() {
+        doF32_relaxed(0xab61, 128);
+    }
+
     public void testTanhF32_2() {
         doF32_2(0xa301, 5);
     }
 
+    public void testTanhF32_2_relaxed() {
+        doF32_2_relaxed(0xa301, 128);
+    }
+
     public void testTanhF32_3() {
         doF32_3(0x918, 5);
     }
 
+    public void testTanhF32_3_relaxed() {
+        doF32_3_relaxed(0x918, 128);
+    }
+
     public void testTanhF32_4() {
         doF32_4(0x81, 5);
+
     }
+    public void testTanhF32_4_relaxed() {
+        doF32_4_relaxed(0x81, 128);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/TruncTest.java b/tests/tests/renderscript/src/android/renderscript/cts/TruncTest.java
index 15878ba..f2a3e11 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/TruncTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/TruncTest.java
@@ -22,11 +22,13 @@
 
 public class TruncTest extends RSBaseCompute {
     private ScriptC_trunc_f32 script_f32;
+    private ScriptC_trunc_f32_relaxed script_f32_relaxed;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         script_f32 = new ScriptC_trunc_f32(mRS);
+        script_f32_relaxed = new ScriptC_trunc_f32_relaxed(mRS);
     }
 
     @Override
@@ -44,6 +46,19 @@
         case TEST_F32_4:
             script_f32.forEach_trunc_f32_4(mIn, mOut);
             break;
+
+        case TEST_RELAXED_F32:
+            script_f32_relaxed.forEach_trunc_f32_1(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_2:
+            script_f32_relaxed.forEach_trunc_f32_2(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_3:
+            script_f32_relaxed.forEach_trunc_f32_3(mIn, mOut);
+            break;
+        case TEST_RELAXED_F32_4:
+            script_f32_relaxed.forEach_trunc_f32_4(mIn, mOut);
+            break;
         }
     }
 
@@ -72,6 +87,10 @@
         doF32(0x12345678, 0);
     }
 
+    public void testTruncF32_relaxed() {
+        doF32_relaxed(0x12345678, 0);
+    }
+
     /**
      * trunc test for float2
      */
@@ -79,6 +98,10 @@
         doF32_2(0x12345a78, 0);
     }
 
+    public void testTruncF32_2_relaxed() {
+        doF32_2_relaxed(0x12345a78, 0);
+    }
+
     /**
      * trunc test for float3
      */
@@ -86,10 +109,19 @@
         doF32_3(0x12f45678, 0);
     }
 
+    public void testTruncF32_3_relaxed() {
+        doF32_3_relaxed(0x12f45678, 0);
+    }
+
     /**
      * trunc test for float4
      */
     public void testTruncF32_4() {
         doF32_4(0x123c5678, 0);
     }
+
+    public void testTruncF32_4_relaxed() {
+        doF32_4_relaxed(0x123c5678, 0);
+    }
+
 }
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/VoidPtr.java b/tests/tests/renderscript/src/android/renderscript/cts/VoidPtr.java
new file mode 100644
index 0000000..9c18d2d
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/VoidPtr.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.Allocation;
+import android.renderscript.Element;
+import android.renderscript.RenderScript;
+import android.renderscript.Type;
+
+public class VoidPtr extends RSBaseCompute {
+    Allocation AOutput;
+    Allocation AInput;
+    Allocation AFailed;
+    int [] Failed;
+
+
+    protected void setupVoidPtr(RenderScript mRS, ScriptC_void_ptr gs) {
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        Type t = typeBuilder.setX(1).create();
+
+        AFailed = Allocation.createTyped(mRS, t);
+        Failed = new int [1];
+        Failed[0] = 0;
+        AFailed.copyFrom(Failed);
+        gs.set_aFailed(AFailed);
+    }
+
+    /**
+     * Test whether we properly iterate over the elements of an output
+     * allocation, even if the pointer passed to the kernel of the script
+     * is only of type 'void*'
+     *
+     * This test runs for an allocation of type int
+     */
+    public void testVoidOutInt() {
+        ScriptC_void_ptr gs = new ScriptC_void_ptr(mRS);
+        setupVoidPtr(mRS, gs);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        Type t = typeBuilder.setX(10).setY(15).create();
+
+        AOutput = Allocation.createTyped(mRS, t);
+
+        gs.forEach_set_output_void_int(AOutput);
+        gs.forEach_check_output_int(AOutput);
+
+        AFailed.copyTo(Failed);
+        if (Failed[0] != 0) {
+            FoundError = true;
+        }
+
+        gs.destroy();
+        checkForErrors();
+    }
+
+    /**
+     * Test whether we properly iterate over the elements of an output
+     * allocation, even if the pointer passed to the kernel of the script
+     * is only of type 'void*'
+     *
+     * This test runs for an allocation of type uchar.
+     */
+    public void testVoidOutChar() {
+        ScriptC_void_ptr gs = new ScriptC_void_ptr(mRS);
+        setupVoidPtr(mRS, gs);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.U8(mRS));
+        Type t = typeBuilder.setX(10).setY(15).create();
+
+        AOutput = Allocation.createTyped(mRS, t);
+
+        gs.forEach_set_output_void_char(AOutput);
+        gs.forEach_check_output_char(AOutput);
+
+        AFailed.copyTo(Failed);
+        if (Failed[0] != 0) {
+            FoundError = true;
+        }
+
+        gs.destroy();
+        checkForErrors();
+    }
+
+
+    /**
+     * Test whether we properly iterate over the elements of an input
+     * allocation, even if the pointer passed to the kernel of the script
+     * is only of type 'void*'
+     *
+     * This test runs for an allocation of type uchar.
+     */
+    public void testVoidInInt() {
+        ScriptC_void_ptr gs = new ScriptC_void_ptr(mRS);
+        setupVoidPtr(mRS, gs);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.I32(mRS));
+        Type t = typeBuilder.setX(10).setY(15).create();
+
+        AOutput = Allocation.createTyped(mRS, t);
+        AInput = Allocation.createTyped(mRS, t);
+
+        gs.forEach_set_output_int(AInput);
+        gs.set_aOutput(AOutput);
+        gs.forEach_copy_void_int(AInput);
+        gs.forEach_check_output_int(AOutput);
+
+        AFailed.copyTo(Failed);
+        if (Failed[0] != 0) {
+            FoundError = true;
+        }
+
+        gs.destroy();
+        checkForErrors();
+    }
+
+    /**
+     * Test whether we properly iterate over the elements of an input
+     * allocation, even if the pointer passed to the kernel of the script
+     * is only of type 'void*'
+     *
+     * This test runs for an allocation of type uchar
+     */
+    public void testVoidInChar() {
+        ScriptC_void_ptr gs = new ScriptC_void_ptr(mRS);
+        setupVoidPtr(mRS, gs);
+
+        Type.Builder typeBuilder = new Type.Builder(mRS, Element.U8(mRS));
+        Type t = typeBuilder.setX(10).setY(15).create();
+
+        AOutput = Allocation.createTyped(mRS, t);
+        AInput = Allocation.createTyped(mRS, t);
+
+        gs.forEach_set_output_char(AInput);
+        gs.set_aOutput(AOutput);
+        gs.forEach_copy_void_char(AInput);
+        gs.forEach_check_output_char(AOutput);
+
+        AFailed.copyTo(Failed);
+        if (Failed[0] != 0) {
+            FoundError = true;
+        }
+
+        gs.destroy();
+        checkForErrors();
+    }
+
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
new file mode 100644
index 0000000..c2c7275
--- /dev/null
+++ b/tests/tests/renderscript/src/android/renderscript/cts/YuvTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2013 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 android.renderscript.cts;
+
+import android.renderscript.*;
+import java.util.Random;
+
+public class YuvTest extends RSBaseCompute {
+    int width;
+    int height;
+    byte [] by;
+    byte [] bu;
+    byte [] bv;
+    Allocation ay;
+    Allocation au;
+    Allocation av;
+
+    protected ScriptC_verify mVerify;
+
+
+    int getCWidth() {
+        return (width + 1) / 2;
+    }
+    int getCHeight() {
+        return (height + 1) / 2;
+    }
+
+    protected void makeYuvBuffer(int w, int h) {
+        Random r = new Random();
+        width = w;
+        height = h;
+
+        by = new byte[w*h];
+        bu = new byte[getCWidth() * getCHeight()];
+        bv = new byte[getCWidth() * getCHeight()];
+
+        for (int i=0; i < by.length; i++) {
+            by[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bu.length; i++) {
+            bu[i] = (byte)r.nextInt(256);
+        }
+        for (int i=0; i < bv.length; i++) {
+            bv[i] = (byte)r.nextInt(256);
+        }
+
+        Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS));
+        tb.setX(w);
+        tb.setY(h);
+        ay = Allocation.createTyped(mRS, tb.create());
+
+        tb = new Type.Builder(mRS, Element.U8(mRS));
+        tb.setX(w >> 1);
+        tb.setY(h >> 1);
+        au = Allocation.createTyped(mRS, tb.create());
+        av = Allocation.createTyped(mRS, tb.create());
+
+        ay.copyFrom(by);
+        au.copyFrom(bu);
+        av.copyFrom(bv);
+    }
+
+    public Allocation makeOutput() {
+        Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        Type t = tb.create();
+        return Allocation.createTyped(mRS, t);
+    }
+
+    // Test for the API 17 conversion path
+    // This used a uchar buffer assuming nv21
+    public void testV17() {
+        mVerify = new ScriptC_verify(mRS);
+
+        makeYuvBuffer(120, 96);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+
+        Allocation ta = Allocation.createSized(mRS, Element.U8(mRS), tmp.length);
+        ta.copyFrom(tmp);
+
+
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.U8(mRS));
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+
+        ScriptC_yuv script = new ScriptC_yuv(mRS);
+        script.invoke_makeRef(ay, au, av, aref);
+
+        mVerify.invoke_verify(aref, aout, ay);
+
+        mRS.finish();
+        mVerify.invoke_checkError();
+        waitForMessage();
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with nv21
+    public void test_NV21() {
+        mVerify = new ScriptC_verify(mRS);
+        ScriptC_yuv script = new ScriptC_yuv(mRS);
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.NV21);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+            tmp[i++] = bu[j];
+        }
+        ta.copyFrom(tmp);
+        script.invoke_makeRef(ay, au, av, aref);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+        mVerify.invoke_verify(aref, aout, ay);
+
+        script.set_mInput(ta);
+        script.forEach_cvt(aout);
+        mVerify.invoke_verify(aref, aout, ay);
+
+        mRS.finish();
+        mVerify.invoke_checkError();
+        waitForMessage();
+        checkForErrors();
+    }
+
+    // Test for the API 18 conversion path with yv12
+    public void test_YV12() {
+        mVerify = new ScriptC_verify(mRS);
+        ScriptC_yuv script = new ScriptC_yuv(mRS);
+        ScriptIntrinsicYuvToRGB syuv = ScriptIntrinsicYuvToRGB.create(mRS, Element.YUV(mRS));
+
+        makeYuvBuffer(512, 512);
+        Allocation aout = makeOutput();
+        Allocation aref = makeOutput();
+
+
+        Type.Builder tb = new Type.Builder(mRS, Element.YUV(mRS));
+        tb.setX(width);
+        tb.setY(height);
+        tb.setYuvFormat(android.graphics.ImageFormat.YV12);
+        Allocation ta = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT);
+
+        byte tmp[] = new byte[(width * height) + (getCWidth() * getCHeight() * 2)];
+        int i = 0;
+        for (int j = 0; j < (width * height); j++) {
+            tmp[i++] = by[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bu[j];
+        }
+        for (int j = 0; j < (getCWidth() * getCHeight()); j++) {
+            tmp[i++] = bv[j];
+        }
+        ta.copyFrom(tmp);
+        script.invoke_makeRef(ay, au, av, aref);
+
+        syuv.setInput(ta);
+        syuv.forEach(aout);
+        mVerify.invoke_verify(aref, aout, ay);
+
+        script.set_mInput(ta);
+        script.forEach_cvt(aout);
+        mVerify.invoke_verify(aref, aout, ay);
+
+        mRS.finish();
+        mVerify.invoke_checkError();
+        waitForMessage();
+        checkForErrors();
+    }
+
+}
diff --git a/tests/tests/rscpp/Android.mk b/tests/tests/rscpp/Android.mk
new file mode 100644
index 0000000..6f01cab
--- /dev/null
+++ b/tests/tests/rscpp/Android.mk
@@ -0,0 +1,41 @@
+# Copyright (C) 2013 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)
+
+# Replace "Example" with your name.
+LOCAL_PACKAGE_NAME := CtsRsCppTestCases
+
+# Don't include this package in any target.
+LOCAL_MODULE_TAGS := optional
+
+# When built, explicitly put it in the data partition.
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+
+# All tests should include android.test.runner.
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner
+LOCAL_JNI_SHARED_LIBRARIES := librscpptest_jni
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_CTS_PACKAGE)
+include $(LOCAL_PATH)/librscpptest/Android.mk
diff --git a/tests/tests/rscpp/AndroidManifest.xml b/tests/tests/rscpp/AndroidManifest.xml
new file mode 100644
index 0000000..b3ab43a
--- /dev/null
+++ b/tests/tests/rscpp/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.cts.rscpp">
+
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <!-- This is a self-instrumenting test package. -->
+    <instrumentation android:name="android.test.InstrumentationCtsTestRunner"
+                     android:targetPackage="com.android.cts.stub"
+                     android:label="CTS tests of RenderScript C++ component"/>
+
+</manifest>
+
diff --git a/tests/tests/rscpp/librscpptest/Android.mk b/tests/tests/rscpp/librscpptest/Android.mk
new file mode 100644
index 0000000..329ce1e
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2013 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.
+
+#
+# This is the shared library included by the JNI test app.
+#
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_MODULE := librscpptest_jni
+LOCAL_MODULE_TAGS := optional
+LOCAL_SRC_FILES := rs_jni.cpp
+
+LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
+LOCAL_C_INCLUDES += frameworks/rs/cpp
+LOCAL_C_INCLUDES += frameworks/rs
+LOCAL_C_INCLUDES += external/stlport/stlport bionic/ bionic/libstdc++/include
+
+LOCAL_SHARED_LIBRARIES := libdl liblog
+LOCAL_STATIC_LIBRARIES := libRScpp_static libstlport_static libcutils
+include $(BUILD_SHARED_LIBRARY)
+
+
+
diff --git a/tests/tests/rscpp/librscpptest/rs_jni.cpp b/tests/tests/rscpp/librscpptest/rs_jni.cpp
new file mode 100644
index 0000000..16c4176
--- /dev/null
+++ b/tests/tests/rscpp/librscpptest/rs_jni.cpp
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+#include <jni.h>
+#include <android/log.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <RenderScript.h>
+
+#define  LOG_TAG    "rscpptest"
+#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
+#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
+
+using namespace android::RSC;
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSInitTest_initTest(JNIEnv * env,
+                                                                               jclass obj)
+{
+    bool r = true;
+    for (int i = 0; i < 1000; i++) {
+        sp<RS> rs = new RS();
+        r &= rs->init();
+        LOGE("Native iteration %i, returned %i", i, (int)r);
+    }
+    return r;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSBlurTest_blurTest(JNIEnv * env,
+                                                                                 jclass obj,
+                                                                                 jint X,
+                                                                                 jint Y,
+                                                                                 jbyteArray inputByteArray,
+                                                                                 jbyteArray outputByteArray,
+                                                                                 jboolean singleChannel)
+{
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e;
+    if (singleChannel) {
+        e = Element::A_8(rs);
+    } else {
+        e = Element::RGBA_8888(rs);
+    }
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<ScriptIntrinsicBlur> blur = ScriptIntrinsicBlur::create(rs, e);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+
+    blur->setRadius(15);
+    blur->setInput(inputAlloc);
+    blur->forEach(outputAlloc);
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_android_cts_rscpp_RSConvolveTest_convolveTest(JNIEnv * env, jclass obj, jint X,
+                                                   jint Y, jbyteArray inputByteArray,
+                                                   jbyteArray outputByteArray,
+                                                   jfloatArray coeffArray,
+                                                   jboolean is3x3)
+{
+    jfloat * coeffs = env->GetFloatArrayElements(coeffArray, NULL);
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e = Element::A_8(rs);
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+
+
+    if (is3x3) {
+        sp<ScriptIntrinsicConvolve3x3> convolve = ScriptIntrinsicConvolve3x3::create(rs, e);
+        convolve->setInput(inputAlloc);
+        convolve->setCoefficients(coeffs);
+        convolve->forEach(outputAlloc);
+    } else {
+        sp<ScriptIntrinsicConvolve5x5> convolve = ScriptIntrinsicConvolve5x5::create(rs, e);
+        convolve->setInput(inputAlloc);
+        convolve->setCoefficients(coeffs);
+        convolve->forEach(outputAlloc);
+    }
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseFloatArrayElements(coeffArray, coeffs, JNI_ABORT);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RSLUTTest_lutTest(JNIEnv * env,
+                                                                               jclass obj,
+                                                                               jint X,
+                                                                               jint Y,
+                                                                               jbyteArray inputByteArray,
+                                                                               jbyteArray outputByteArray)
+{
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e = Element::RGBA_8888(rs);
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<ScriptIntrinsicLUT> lut = ScriptIntrinsicLUT::create(rs, e);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+    unsigned char lutValues[256];
+    for (int i = 0; i < 256; i++) {
+        lutValues[i] = 255-i;
+    }
+    lut->setRed(0, 256, lutValues);
+    lut->setGreen(0, 256, lutValues);
+    lut->setBlue(0, 256, lutValues);
+
+    lut->forEach(inputAlloc,outputAlloc);
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL Java_android_cts_rscpp_RS3DLUTTest_lutTest(JNIEnv * env,
+                                                                                 jclass obj,
+                                                                                 jint X,
+                                                                                 jint Y,
+                                                                                 jint lutSize,
+                                                                                 jbyteArray inputByteArray,
+                                                                                 jbyteArray inputByteArray2,
+                                                                                 jbyteArray outputByteArray)
+{
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * input2 = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray2, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e = Element::RGBA_8888(rs);
+
+    Type::Builder builder(rs, e);
+
+    builder.setX(lutSize);
+    builder.setY(lutSize);
+    builder.setZ(lutSize);
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> colorCube = Allocation::createTyped(rs, builder.create());
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<ScriptIntrinsic3DLUT> lut = ScriptIntrinsic3DLUT::create(rs, e);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+    colorCube->copy3DRangeFrom(0, 0, 0, lutSize, lutSize, lutSize, input2);
+
+    lut->setLUT(colorCube);
+    lut->forEach(inputAlloc,outputAlloc);
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(inputByteArray2, input2, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_android_cts_rscpp_RSColorMatrixTest_colorMatrixTest(JNIEnv * env, jclass obj, jint X,
+                                                         jint Y, jbyteArray inputByteArray,
+                                                         jbyteArray outputByteArray,
+                                                         jfloatArray coeffArray,
+                                                         jint optionFlag)
+{
+    jfloat * coeffs = env->GetFloatArrayElements(coeffArray, NULL);
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e = Element::RGBA_8888(rs);
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+
+    sp<ScriptIntrinsicColorMatrix> cm = ScriptIntrinsicColorMatrix::create(rs);
+    if (optionFlag == 0) {
+        cm->setColorMatrix3(coeffs);
+    } else if (optionFlag == 1) {
+        cm->setGreyscale();
+    } else if (optionFlag == 2) {
+        cm->setColorMatrix4(coeffs);
+    } else if (optionFlag == 3) {
+        cm->setYUVtoRGB();
+    } else if (optionFlag == 4) {
+        cm->setRGBtoYUV();
+    } else if (optionFlag == 5) {
+        cm->setColorMatrix4(coeffs);
+        float add[4] = {5.3f, 2.1f, 0.3f, 4.4f};
+        cm->setAdd(add);
+    }
+    cm->forEach(inputAlloc, outputAlloc);
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    env->ReleaseFloatArrayElements(coeffArray, coeffs, JNI_ABORT);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_android_cts_rscpp_RSBlendTest_blendTest(JNIEnv * env, jclass obj, jint X,
+                                             jint Y, jbyteArray inputByteArray,
+                                             jbyteArray outputByteArray,
+                                             jint optionFlag)
+{
+    jbyte * input = (jbyte *) env->GetPrimitiveArrayCritical(inputByteArray, 0);
+    jbyte * output = (jbyte *) env->GetPrimitiveArrayCritical(outputByteArray, 0);
+
+    sp<RS> rs = new RS();
+    rs->init();
+
+    sp<const Element> e = Element::RGBA_8888(rs);
+
+    sp<Allocation> inputAlloc = Allocation::createSized2D(rs, e, X, Y);
+    sp<Allocation> outputAlloc = Allocation::createSized2D(rs, e, X, Y);
+
+    inputAlloc->copy2DRangeFrom(0, 0, X, Y, input);
+    outputAlloc->copy2DRangeFrom(0, 0, X, Y, output);
+
+    sp<ScriptIntrinsicBlend> blend = ScriptIntrinsicBlend::create(rs, e);
+    switch(optionFlag) {
+    case 0:
+        blend->forEachAdd(inputAlloc, outputAlloc);
+        break;
+    case 1:
+        blend->forEachClear(inputAlloc, outputAlloc);
+        break;
+    case 2:
+        blend->forEachDst(inputAlloc, outputAlloc);
+        break;
+    case 3:
+        blend->forEachDstAtop(inputAlloc, outputAlloc);
+        break;
+    case 4:
+        blend->forEachDstIn(inputAlloc, outputAlloc);
+        break;
+    case 5:
+        blend->forEachDstOut(inputAlloc, outputAlloc);
+        break;
+    case 6:
+        blend->forEachDstOver(inputAlloc, outputAlloc);
+        break;
+    case 7:
+        blend->forEachMultiply(inputAlloc, outputAlloc);
+        break;
+    case 8:
+        blend->forEachSrc(inputAlloc, outputAlloc);
+        break;
+    case 9:
+        blend->forEachSrcAtop(inputAlloc, outputAlloc);
+        break;
+    case 10:
+        blend->forEachSrcIn(inputAlloc, outputAlloc);
+        break;
+    case 11:
+        blend->forEachSrcOut(inputAlloc, outputAlloc);
+        break;
+    case 12:
+        blend->forEachSrcOver(inputAlloc, outputAlloc);
+        break;
+    case 13:
+        blend->forEachSubtract(inputAlloc, outputAlloc);
+        break;
+    case 14:
+        blend->forEachXor(inputAlloc, outputAlloc);
+        break;
+    default:
+        break;
+    }
+
+    outputAlloc->copy2DRangeTo(0, 0, X, Y, output);
+
+    env->ReleasePrimitiveArrayCritical(inputByteArray, input, 0);
+    env->ReleasePrimitiveArrayCritical(outputByteArray, output, 0);
+    return (rs->getError() == RS_SUCCESS);
+
+}
+
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
new file mode 100644
index 0000000..197a4cd
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RS3DLUTTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int X = 1024;
+    private final int Y = 1024;
+
+    private final int lutSize = 64;
+
+    native boolean lutTest(int X, int Y, int lutSize, byte[] input, byte[] input2, byte[] output);
+    public void testRSLUT() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x419144, 255, 1, -128, baseAlloc);
+        int[] colorCube = new int[lutSize * lutSize * lutSize * 4];
+        RSUtils.genRandom(0x555007, 255, 1, -128, colorCube);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        byte[] byteColorCube = new byte[lutSize * lutSize * lutSize * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+        for (int i = 0; i < lutSize * lutSize * lutSize * 4; i++) {
+            byteColorCube[i] = (byte)colorCube[i];
+        }
+
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        Type.Builder buildCube = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(lutSize);
+        build.setY(lutSize);
+        build.setZ(lutSize);
+        Allocation cube = Allocation.createTyped(mRS, build.create());
+        cube.copyFromUnchecked(byteColorCube);
+        ScriptIntrinsic3DLUT lut = ScriptIntrinsic3DLUT.create(mRS, Element.RGBA_8888(mRS));
+
+        lut.setLUT(cube);
+        lut.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        lutTest(X, Y, lutSize, byteAlloc, byteColorCube, nativeByteAlloc);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
new file mode 100644
index 0000000..b378807
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSBlendTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private static final int X = 256;
+    private static final int Y = 256;
+
+    native boolean blendTest(int X, int Y, byte[] input, byte[] output, int optionFlag);
+    public void testRSBlend() {
+        for (int iter = 0; iter < 15; iter++) {
+            int[] baseAlloc = new int[X * Y * 4];
+            RSUtils.genRandom(0x789321, 255, 1, -128, baseAlloc);
+            RenderScript mRS = RenderScript.create(getContext());
+            byte[] byteAlloc = new byte[X * Y * 4];
+            for (int i = 0; i < X * Y * 4; i++) {
+                byteAlloc[i] = (byte)baseAlloc[i];
+            }
+
+            int[] baseAlloc2 = new int[X * Y * 4];
+            RSUtils.genRandom(0x359201, 255, 1, -128, baseAlloc2);
+            byte[] byteAlloc2 = new byte[X * Y * 4];
+            for (int i = 0; i < X * Y * 4; i++) {
+                byteAlloc2[i] = (byte)baseAlloc2[i];
+            }
+
+            Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+            build.setX(X);
+            build.setY(Y);
+            Allocation rsInput = Allocation.createTyped(mRS, build.create());
+            Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+            rsInput.copyFromUnchecked(byteAlloc);
+            rsOutput.copyFromUnchecked(byteAlloc2);
+
+            ScriptIntrinsicBlend blend = ScriptIntrinsicBlend.create(mRS, Element.RGBA_8888(mRS));
+
+            switch(iter) {
+            case 0:
+                blend.forEachAdd(rsInput, rsOutput);
+                break;
+            case 1:
+                blend.forEachClear(rsInput, rsOutput);
+                break;
+            case 2:
+                blend.forEachDst(rsInput, rsOutput);
+                break;
+            case 3:
+                blend.forEachDstAtop(rsInput, rsOutput);
+                break;
+            case 4:
+                blend.forEachDstIn(rsInput, rsOutput);
+                break;
+            case 5:
+                blend.forEachDstOut(rsInput, rsOutput);
+                break;
+            case 6:
+                blend.forEachDstOver(rsInput, rsOutput);
+                break;
+            case 7:
+                blend.forEachMultiply(rsInput, rsOutput);
+                break;
+            case 8:
+                blend.forEachSrc(rsInput, rsOutput);
+                break;
+            case 9:
+                blend.forEachSrcAtop(rsInput, rsOutput);
+                break;
+            case 10:
+                blend.forEachSrcIn(rsInput, rsOutput);
+                break;
+            case 11:
+                blend.forEachSrcOut(rsInput, rsOutput);
+                break;
+            case 12:
+                blend.forEachSrcOver(rsInput, rsOutput);
+                break;
+            case 13:
+                blend.forEachSubtract(rsInput, rsOutput);
+                break;
+            case 14:
+                blend.forEachXor(rsInput, rsOutput);
+                break;
+            default:
+                break;
+            }
+
+            blendTest(X, Y, byteAlloc, byteAlloc2, iter);
+            rsOutput.copyTo(byteAlloc);
+            for (int i = 0; i < X * Y * 4; i++) {
+                assertTrue(byteAlloc[i] == byteAlloc2[i]);
+            }
+
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
new file mode 100644
index 0000000..4d4530c
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSBlurTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int X = 1024;
+    private final int Y = 1024;
+
+    native boolean blurTest(int X, int Y, byte[] input, byte[] output, boolean singleChannel);
+    public void testRSBlurOneChannel() {
+        int[] baseAlloc = new int[X * Y];
+        RSUtils.genRandom(0x1DEFF, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y];
+        for (int i = 0; i < X * Y; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.A_8(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(mRS, Element.A_8(mRS));
+        blur.setInput(rsInput);
+        blur.setRadius(15);
+        blur.forEach(rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y];
+        blurTest(X, Y, byteAlloc, nativeByteAlloc, true);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+
+    public void testRSBlurFourChannels() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0xFAFADE10, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(mRS, Element.RGBA_8888(mRS));
+        blur.setInput(rsInput);
+        blur.setRadius(15);
+        blur.forEach(rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        blurTest(X, Y, byteAlloc, nativeByteAlloc, false);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
new file mode 100644
index 0000000..e4c0085
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSColorMatrixTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int X = 1024;
+    private final int Y = 1024;
+
+    native boolean colorMatrixTest(int X, int Y, byte[] input, byte[] output, float[] coeffs, int optionFlag);
+    public void testRSColorMatrix0() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x251107, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        float[] coeffs = new float[9];
+        coeffs[0] = 1.f;
+        coeffs[1] = 0.3f;
+        coeffs[2] = 0.7f;
+        coeffs[3] =  0.2f;
+        coeffs[4] =  1.f;
+        coeffs[5] =  -0.1f;
+        coeffs[6] =  -0.5f;
+        coeffs[7] =  0.2f;
+        coeffs[8] =  1.f;
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        ScriptIntrinsicColorMatrix cm = ScriptIntrinsicColorMatrix.create(mRS, Element.RGBA_8888(mRS));
+        Matrix3f mat = new Matrix3f(coeffs);
+        cm.setColorMatrix(mat);
+        cm.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 0);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+    public void testRSColorMatrix1() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x251106, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        float[] coeffs = new float[9];
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        ScriptIntrinsicColorMatrix cm = ScriptIntrinsicColorMatrix.create(mRS, Element.RGBA_8888(mRS));
+        cm.setGreyscale();
+        cm.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 1);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+    public void testRSColorMatrix2() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x251105, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        float[] coeffs = new float[16];
+        for (int i = 0; i < 16; i++) {
+            coeffs[i] = -2.f + .25f*i;
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        ScriptIntrinsicColorMatrix cm = ScriptIntrinsicColorMatrix.create(mRS, Element.RGBA_8888(mRS));
+        Matrix4f mat = new Matrix4f(coeffs);
+        cm.setColorMatrix(mat);
+        cm.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 2);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+    public void testRSColorMatrix3() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x251104, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        float[] coeffs = new float[9];
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        ScriptIntrinsicColorMatrix cm = ScriptIntrinsicColorMatrix.create(mRS, Element.RGBA_8888(mRS));
+        cm.setYUVtoRGB();
+        cm.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 3);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+    public void testRSColorMatrix4() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x251103, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        float[] coeffs = new float[9];
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+
+        ScriptIntrinsicColorMatrix cm = ScriptIntrinsicColorMatrix.create(mRS, Element.RGBA_8888(mRS));
+        cm.setRGBtoYUV();
+        cm.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        colorMatrixTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, 4);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
new file mode 100644
index 0000000..d669d3b
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSConvolveTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int X = 1024;
+    private final int Y = 1024;
+
+    native boolean convolveTest(int X, int Y, byte[] input, byte[] output, float[] coeffs, boolean is3x3);
+    public void testConvolve3x3() {
+        int[] baseAlloc = new int[X * Y];
+        float[] coeffs = new float[9];
+        coeffs[0] = .5f;
+        coeffs[1] = .35f;
+        coeffs[2] =  .1f;
+        coeffs[3] =  1.f;
+        coeffs[4] =  1.f;
+        coeffs[5] =  1.f;
+        coeffs[6] =  .1f;
+        coeffs[7] =  .35f;
+        coeffs[8] =  .5f;
+
+        RSUtils.genRandom(0x1DEFFD0, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y];
+        for (int i = 0; i < X * Y; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.A_8(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+        ScriptIntrinsicConvolve3x3 convolve = ScriptIntrinsicConvolve3x3.create(mRS, Element.A_8(mRS));
+        convolve.setInput(rsInput);
+        convolve.setCoefficients(coeffs);
+        convolve.forEach(rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y];
+        convolveTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, true);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+    public void testConvolve5x5() {
+        int[] baseAlloc = new int[X * Y];
+        float[] coeffs = new float[25];
+        coeffs[0] = .5f;
+        coeffs[1] = .35f;
+        coeffs[2] =  .1f;
+        coeffs[3] =  1.f;
+        coeffs[4] =  1.f;
+        coeffs[5] =  1.f;
+        coeffs[6] =  .1f;
+        coeffs[7] =  .35f;
+        coeffs[8] =  .5f;
+        coeffs[9] = .5f;
+        coeffs[10] = .35f;
+        coeffs[11] =  .1f;
+        coeffs[12] =  1.f;
+        coeffs[13] =  1.f;
+        coeffs[14] =  1.f;
+        coeffs[15] =  .1f;
+        coeffs[16] =  .35f;
+        coeffs[17] =  .5f;
+        coeffs[18] = .5f;
+        coeffs[19] = .35f;
+        coeffs[20] =  .1f;
+        coeffs[21] =  1.f;
+        coeffs[22] =  1.f;
+        coeffs[23] =  1.f;
+        coeffs[24] =  .1f;
+
+
+        RSUtils.genRandom(0x1DEFFD0, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y];
+        for (int i = 0; i < X * Y; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.A_8(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+        ScriptIntrinsicConvolve5x5 convolve = ScriptIntrinsicConvolve5x5.create(mRS, Element.A_8(mRS));
+        convolve.setInput(rsInput);
+        convolve.setCoefficients(coeffs);
+        convolve.forEach(rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y];
+        convolveTest(X, Y, byteAlloc, nativeByteAlloc, coeffs, false);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
new file mode 100644
index 0000000..7ce6688
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+class RSCppTest extends AndroidTestCase {
+
+    Context mCtx;
+    Resources mRes;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mCtx = getContext();
+        mRes = mCtx.getResources();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
new file mode 100644
index 0000000..22804d3
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+
+public class RSInitTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    native boolean initTest();
+    public void testRSInit() {
+        for (int i = 0; i < 1000; i++) {
+            RenderScript mRS = RenderScript.create(getContext());
+            mRS.destroy();
+            Log.d("rscpptest", "Java iteration " + i);
+        }
+        assertTrue(initTest());
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
new file mode 100644
index 0000000..7890d57
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import com.android.cts.stub.R;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.renderscript.*;
+import android.util.Log;
+import java.lang.Integer;
+
+public class RSLUTTest extends RSCppTest {
+    static {
+        System.loadLibrary("rscpptest_jni");
+    }
+
+    private final int X = 1024;
+    private final int Y = 1024;
+
+    native boolean lutTest(int X, int Y, byte[] input, byte[] output);
+    public void testRSLUT() {
+        int[] baseAlloc = new int[X * Y * 4];
+        RSUtils.genRandom(0x72727272, 255, 1, -128, baseAlloc);
+        RenderScript mRS = RenderScript.create(getContext());
+        byte[] byteAlloc = new byte[X * Y * 4];
+        for (int i = 0; i < X * Y * 4; i++) {
+            byteAlloc[i] = (byte)baseAlloc[i];
+        }
+
+        Type.Builder build = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+        build.setX(X);
+        build.setY(Y);
+        Allocation rsInput = Allocation.createTyped(mRS, build.create());
+        Allocation rsOutput = Allocation.createTyped(mRS, build.create());
+        rsInput.copyFromUnchecked(byteAlloc);
+        ScriptIntrinsicLUT lut = ScriptIntrinsicLUT.create(mRS, Element.RGBA_8888(mRS));
+        for (int i = 0; i < 256; i++) {
+            lut.setRed(i, 255-i);
+            lut.setGreen(i, 255-i);
+            lut.setBlue(i, 255-i);
+        }
+
+        lut.forEach(rsInput, rsOutput);
+
+        byte[] nativeByteAlloc = new byte[X * Y * 4];
+        lutTest(X, Y, byteAlloc, nativeByteAlloc);
+        rsOutput.copyTo(byteAlloc);
+
+        for (int i = 0; i < X * Y * 4; i++) {
+            assertTrue(byteAlloc[i] == nativeByteAlloc[i]);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
new file mode 100644
index 0000000..58d665f
--- /dev/null
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2013 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 android.cts.rscpp;
+
+import android.content.res.Resources;
+import java.util.Random;
+import android.renderscript.Allocation;
+import android.renderscript.RSRuntimeException;
+import com.android.cts.stub.R;
+
+/**
+ * This class supplies some utils for renderscript tests
+ */
+public class RSUtils {
+
+    public static void genRandom(long seed, int factor, int offset, float array[]) {
+        Random r = new Random(seed);
+        for (int i = 0; i < array.length; i++) {
+            array[i] = r.nextFloat() * factor + offset;
+        }
+    }
+
+    public static void genRandom(long seed, int factor, int offset, float array[],
+            int stride, int skip) {
+        Random r = new Random(seed);
+        for (int i = 0; i < array.length / stride; i++) {
+            for (int j = 0; j < stride; j++) {
+                if (j >= stride - skip)
+                    array[i * stride + j] = 0;
+                else
+                    array[i * stride + j] = r.nextFloat() * factor + offset;
+            }
+        }
+    }
+
+    public static void genRandom(long seed, int max, int factor, int offset, int array[]) {
+        Random r = new Random(seed);
+        for (int i = 0; i < array.length; i++) {
+            array[i] = (r.nextInt(max) * factor + offset);
+        }
+    }
+
+    public static void genRandom(long seed, int factor, int offset, int array[],
+            int stride, int skip) {
+        Random r = new Random(seed);
+        for (int i = 0; i < array.length / stride; i++) {
+            for (int j = 0; j < stride; j++) {
+                if (j >= stride - skip)
+                    array[i * stride + j] = 0;
+                else
+                    array[i * stride + j] = r.nextInt() * factor + offset;
+            }
+        }
+    }
+
+    public static void genRandom(long seed, int max, int factor, int offset, int array[],
+            int stride, int skip) {
+        Random r = new Random(seed);
+        for (int i = 0; i < array.length / stride; i++) {
+            for (int j = 0; j < stride; j++) {
+                if (j >= stride - skip)
+                    array[i * stride + j] = 0;
+                else
+                    array[i * stride + j] = r.nextInt(max) * factor + offset;
+            }
+        }
+    }
+}
diff --git a/tests/tests/sax/src/android/sax/cts/RootElementTest.java b/tests/tests/sax/src/android/sax/cts/RootElementTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
index 7f566fd..5c2a6b9 100644
--- a/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
+++ b/tests/tests/security/jni/android_security_cts_NativeCodeTest.cpp
@@ -15,16 +15,25 @@
  */
 
 #include <jni.h>
+#include <netlink.h>
+#include <sock_diag.h>
+#include <stdio.h>
+#include <sys/socket.h>
 #include <sys/types.h>
-#include <unistd.h>
 #include <sys/syscall.h>
 #include <sys/prctl.h>
 #include <sys/ptrace.h>
 #include <sys/wait.h>
 #include <signal.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define PASSED 0
+#define UNKNOWN_ERROR -1
 #include <stdlib.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <sys/utsname.h>
 #include <fcntl.h>
 #include <cutils/log.h>
 #include <linux/perf_event.h>
@@ -171,6 +180,88 @@
     return result;
 }
 
+/*
+ * Will hang if vulnerable, return 0 if successful, -1 on unforseen
+ * error.
+ */
+static jint android_security_cts_NativeCodeTest_doSockDiagTest(JNIEnv* env, jobject thiz)
+{
+    int fd, nlmsg_size, err, len;
+    char buf[1024];
+    struct sockaddr_nl nladdr;
+    struct nlmsghdr *nlh;
+    struct msghdr msg;
+    struct iovec iov;
+    struct sock_diag_req* sock_diag_data;
+
+    int major, minor;
+    struct utsname uts;
+    if (uname(&uts) != -1 &&
+        sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
+        ((major > 3) || ((major == 3) && (minor > 8)))) {
+        // Kernels above 3.8 are patched against CVE-2013-1763
+        // This test generates false positives if run on > 3.8.
+        // b/17253473
+        return PASSED;
+    }
+
+    fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_SOCK_DIAG);
+    if (fd == -1) {
+        switch (errno) {
+            /* NETLINK_SOCK_DIAG not accessible, vector dne */
+            case EACCES:
+            case EAFNOSUPPORT:
+            case EPERM:
+            case EPROTONOSUPPORT:
+                return PASSED;
+            default:
+                return UNKNOWN_ERROR;
+        }
+    }
+    /* prepare and send netlink packet */
+    memset(&nladdr, 0, sizeof(nladdr));
+    nladdr.nl_family = AF_NETLINK;
+    nlmsg_size = NLMSG_ALIGN(NLMSG_HDRLEN + sizeof(sock_diag_data));
+    nlh = (nlmsghdr *)malloc(nlmsg_size);
+    nlh->nlmsg_len = nlmsg_size;
+    nlh->nlmsg_pid = 0;      //send packet to kernel
+    nlh->nlmsg_type = SOCK_DIAG_BY_FAMILY;
+    nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
+    iov = { (void *) nlh, nlmsg_size };
+    msg = { (void *) &nladdr, sizeof(nladdr), &iov, 1, NULL, 0, 0 };
+    sock_diag_data = (sock_diag_req *) NLMSG_DATA(nlh);
+
+    // AF_MAX changes in later kernels. Use hardcoded value instead
+    // to make sure we trigger the vulnerability in kernels <= 3.8
+    sock_diag_data->sdiag_family = 39+1; // AF_MAX+1, but don't rely on header file.
+
+    if ((err = sendmsg(fd, &msg, 0)) == -1) {
+        /* SELinux blocked it */
+        if (errno == 22) {
+            return PASSED;
+        } else {
+            return UNKNOWN_ERROR;
+        }
+    }
+    free(nlh);
+
+    memset(&nladdr, 0, sizeof(nladdr));
+    iov = { buf, sizeof(buf) };
+    msg = { (void *) &nladdr, sizeof(nladdr), &iov, 1, NULL, 0, 0 };
+    if ((len = recvmsg(fd, &msg, 0)) == -1) {
+        return UNKNOWN_ERROR;
+    }
+    for (nlh = (struct nlmsghdr *) buf; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT (nlh, len)){
+        if (nlh->nlmsg_type == NLMSG_ERROR) {
+            /* -22 = -EINVAL from kernel */
+            if (*(int *)NLMSG_DATA(nlh) == -22) {
+                return PASSED;
+            }
+        }
+    }
+    return UNKNOWN_ERROR;
+}
+
 /* This isn't defined in linux/futex.h on JB */
 #define FUTEX_CMP_REQUEUE_PI    12
 
@@ -199,12 +290,13 @@
     return (ret == -1 && errno == EINVAL);
 }
 
-
 static JNINativeMethod gMethods[] = {
     {  "doPerfEventTest", "()Z",
             (void *) android_security_cts_NativeCodeTest_doPerfEventTest },
     {  "doPerfEventTest2", "()Z",
             (void *) android_security_cts_NativeCodeTest_doPerfEventTest2 },
+    {  "doSockDiagTest", "()I",
+            (void *) android_security_cts_NativeCodeTest_doSockDiagTest },
     {  "doVrootTest", "()Z",
             (void *) android_security_cts_NativeCodeTest_doVrootTest },
     {  "doCVE20141710Test", "()Z",
diff --git a/tests/tests/security/jni/netlink.h b/tests/tests/security/jni/netlink.h
new file mode 100644
index 0000000..b5567b0
--- /dev/null
+++ b/tests/tests/security/jni/netlink.h
@@ -0,0 +1,170 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__LINUX_NETLINK_H
+#define _UAPI__LINUX_NETLINK_H
+#include <linux/kernel.h>
+#include <linux/socket.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/types.h>
+#define NETLINK_ROUTE 0
+#define NETLINK_UNUSED 1
+#define NETLINK_USERSOCK 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_FIREWALL 3
+#define NETLINK_SOCK_DIAG 4
+#define NETLINK_NFLOG 5
+#define NETLINK_XFRM 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_SELINUX 7
+#define NETLINK_ISCSI 8
+#define NETLINK_AUDIT 9
+#define NETLINK_FIB_LOOKUP 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_CONNECTOR 11
+#define NETLINK_NETFILTER 12
+#define NETLINK_IP6_FW 13
+#define NETLINK_DNRTMSG 14
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_KOBJECT_UEVENT 15
+#define NETLINK_GENERIC 16
+#define NETLINK_SCSITRANSPORT 18
+#define NETLINK_ECRYPTFS 19
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_RDMA 20
+#define NETLINK_CRYPTO 21
+#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG
+#define MAX_LINKS 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct sockaddr_nl {
+ __kernel_sa_family_t nl_family;
+ unsigned short nl_pad;
+ __u32 nl_pid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 nl_groups;
+};
+struct nlmsghdr {
+ __u32 nlmsg_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 nlmsg_type;
+ __u16 nlmsg_flags;
+ __u32 nlmsg_seq;
+ __u32 nlmsg_pid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define NLM_F_REQUEST 1
+#define NLM_F_MULTI 2
+#define NLM_F_ACK 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLM_F_ECHO 8
+#define NLM_F_DUMP_INTR 16
+#define NLM_F_ROOT 0x100
+#define NLM_F_MATCH 0x200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLM_F_ATOMIC 0x400
+#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)
+#define NLM_F_REPLACE 0x100
+#define NLM_F_EXCL 0x200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLM_F_CREATE 0x400
+#define NLM_F_APPEND 0x800
+#define NLMSG_ALIGNTO 4U
+#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) )
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
+#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
+#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
+#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len),   (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
+#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) &&   (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) &&   (nlh)->nlmsg_len <= (len))
+#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
+#define NLMSG_NOOP 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_ERROR 0x2
+#define NLMSG_DONE 0x3
+#define NLMSG_OVERRUN 0x4
+#define NLMSG_MIN_TYPE 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nlmsgerr {
+ int error;
+ struct nlmsghdr msg;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_ADD_MEMBERSHIP 1
+#define NETLINK_DROP_MEMBERSHIP 2
+#define NETLINK_PKTINFO 3
+#define NETLINK_BROADCAST_ERROR 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_NO_ENOBUFS 5
+#define NETLINK_RX_RING 6
+#define NETLINK_TX_RING 7
+struct nl_pktinfo {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 group;
+};
+struct nl_mmap_req {
+ unsigned int nm_block_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int nm_block_nr;
+ unsigned int nm_frame_size;
+ unsigned int nm_frame_nr;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nl_mmap_hdr {
+ unsigned int nm_status;
+ unsigned int nm_len;
+ __u32 nm_group;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 nm_pid;
+ __u32 nm_uid;
+ __u32 nm_gid;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl_mmap_status {
+ NL_MMAP_STATUS_UNUSED,
+ NL_MMAP_STATUS_RESERVED,
+ NL_MMAP_STATUS_VALID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL_MMAP_STATUS_COPY,
+ NL_MMAP_STATUS_SKIP,
+};
+#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT)
+#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr))
+#define NET_MAJOR 36
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NETLINK_UNCONNECTED = 0,
+ NETLINK_CONNECTED,
+};
+struct nlattr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 nla_len;
+ __u16 nla_type;
+};
+#define NLA_F_NESTED (1 << 15)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLA_F_NET_BYTEORDER (1 << 14)
+#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER)
+#define NLA_ALIGNTO 4
+#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr)))
+#endif
diff --git a/tests/tests/security/jni/sock_diag.h b/tests/tests/security/jni/sock_diag.h
new file mode 100644
index 0000000..0dc2902
--- /dev/null
+++ b/tests/tests/security/jni/sock_diag.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ ***   This header was automatically generated from a Linux kernel header
+ ***   of the same name, to make information necessary for userspace to
+ ***   call into the kernel available to libc.  It contains only constants,
+ ***   structures, and macros generated from the original header, and thus,
+ ***   contains no copyrightable information.
+ ***
+ ***   To edit the content of this header, modify the corresponding
+ ***   source file (e.g. under external/kernel-headers/original/) then
+ ***   run bionic/libc/kernel/tools/update_all.py
+ ***
+ ***   Any manual change here will be lost the next time this script will
+ ***   be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__SOCK_DIAG_H__
+#define _UAPI__SOCK_DIAG_H__
+#include <linux/types.h>
+#define SOCK_DIAG_BY_FAMILY 20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct sock_diag_req {
+ __u8 sdiag_family;
+ __u8 sdiag_protocol;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ SK_MEMINFO_RMEM_ALLOC,
+ SK_MEMINFO_RCVBUF,
+ SK_MEMINFO_WMEM_ALLOC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SK_MEMINFO_SNDBUF,
+ SK_MEMINFO_FWD_ALLOC,
+ SK_MEMINFO_WMEM_QUEUED,
+ SK_MEMINFO_OPTMEM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SK_MEMINFO_BACKLOG,
+ SK_MEMINFO_VARS,
+};
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/tests/tests/security/src/android/security/cts/CertificateData.java b/tests/tests/security/src/android/security/cts/CertificateData.java
index f2e2f8c..8a4d603 100644
--- a/tests/tests/security/src/android/security/cts/CertificateData.java
+++ b/tests/tests/security/src/android/security/cts/CertificateData.java
@@ -26,25 +26,25 @@
 class CertificateData {
   static final String[] CERTIFICATE_DATA = {
       "91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81",
-      "A4:34:89:15:9A:52:0F:0D:93:D0:32:CC:AF:37:E7:FE:20:A8:B4:19",
+      "4A:65:D5:F4:1D:EF:39:B8:B8:90:4A:4A:D3:64:81:33:CF:C7:A1:D1",
+      "4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF",
       "E7:B4:F6:9D:61:EC:90:69:DB:7E:90:A7:40:1A:3C:F4:7D:4F:E8:EE",
       "DD:E1:D2:A9:01:80:2E:1D:87:5E:84:B3:80:7E:4B:B1:FD:99:41:34",
       "92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F",
       "75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE",
-      "A9:62:8F:4B:98:A9:1B:48:35:BA:D2:C1:46:32:86:BB:66:64:6A:8C",
       "40:9D:4B:D9:17:B5:5C:27:B6:9B:64:CB:98:22:44:0D:CD:09:B8:89",
-      "87:81:C2:5A:96:BD:C2:FB:4C:65:06:4F:F9:39:0B:26:04:8A:0E:01",
+      "E1:9F:E3:0E:8B:84:60:9E:80:9B:17:0D:72:A8:C5:BA:6E:14:09:BD",
       "DA:C9:02:4F:54:D8:F6:DF:94:93:5F:B1:73:26:38:CA:6A:D7:7C:13",
+      "4F:99:AA:93:FB:2B:D1:37:26:A1:99:4A:CE:7F:F0:05:F2:93:5D:1E",
       "74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB",
-      "3C:71:D7:0E:35:A5:DA:A8:B2:E3:81:2D:C3:67:74:17:F5:99:0D:F3",
       "40:54:DA:6F:1C:3F:40:74:AC:ED:0F:EC:CD:DB:79:D1:53:FB:90:1D",
       "43:F9:B1:10:D5:BA:FD:48:22:52:31:B0:D0:08:2B:37:2F:EF:9A:54",
       "F4:8B:11:BF:DE:AB:BE:94:54:20:71:E6:41:DE:6B:BE:88:2B:40:B9",
       "58:E8:AB:B0:36:15:33:FB:80:F7:9B:1B:6D:29:D3:FF:8D:5F:00:F0",
-      "96:56:CD:7B:57:96:98:95:D0:E1:41:46:68:06:FB:B8:C6:11:06:87",
       "55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1",
       "D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD",
       "78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C",
+      "8E:1C:74:F8:A6:20:B9:E5:8A:F4:61:FA:EC:2B:47:56:51:1A:52:C6",
       "27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4",
       "AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A",
       "8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0",
@@ -54,18 +54,20 @@
       "74:F8:A3:C3:EF:E7:B3:90:06:4B:83:90:3C:21:64:60:20:E5:DF:CE",
       "85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84",
       "3E:2B:F7:F2:03:1B:96:F3:8C:E6:C4:D8:A8:5D:3E:2D:58:47:6A:0F",
+      "A3:F1:33:3F:E2:42:BF:CF:C5:D1:4E:8F:39:42:98:40:68:10:D1:A0",
       "5F:43:E5:B1:BF:F8:78:8C:AC:1C:C7:CA:4A:9A:C6:22:2B:CC:34:C6",
       "A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36",
       "59:22:A1:E1:5A:EA:16:35:21:F8:98:39:6A:46:46:B0:44:1B:0F:A9",
       "D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74",
       "02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68",
       "D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61",
+      "93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17",
       "59:AF:82:79:91:86:C7:B4:75:07:CB:CF:03:57:46:EB:04:DD:B7:16",
       "50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31",
+      "FE:45:65:9B:79:03:5B:98:A1:61:B5:51:2E:AC:DA:58:09:48:22:4D",
       "1B:4B:39:61:26:27:6B:64:91:A2:68:6D:D7:02:43:21:2D:1F:1D:96",
       "77:47:4F:C6:30:E4:0F:4C:47:64:3F:84:BA:B8:C6:95:4A:8A:41:EC",
       "8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4",
-      "56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66",
       "02:72:68:29:3E:5F:5D:17:AA:A4:B3:C3:E6:36:1E:1F:92:57:5E:AA",
       "2F:78:3D:25:52:18:A7:4A:65:39:71:B5:2C:A2:9C:45:15:6F:E9:19",
       "97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74",
@@ -82,8 +84,10 @@
       "87:9F:4B:EE:05:DF:98:58:3B:E3:60:D6:33:E7:0D:3F:FE:98:71:AF",
       "DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9",
       "22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A",
+      "F3:73:B3:87:06:5A:28:84:8A:F2:F3:4A:CE:19:2B:DD:C7:8E:9C:AC",
       "06:08:3F:59:3F:15:A1:04:A0:69:A4:6B:A9:03:D0:06:B7:97:09:91",
       "E3:92:51:2F:0A:CF:F5:05:DF:F6:DE:06:7F:75:37:E1:65:EA:57:4B",
+      "43:13:BB:96:F1:D5:86:9B:C1:4E:6A:92:F6:CF:F6:34:69:87:82:37",
       "F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2",
       "05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43",
       "93:E6:AB:22:03:03:B5:23:28:DC:DA:56:9E:BA:E4:D1:D1:CC:FB:65",
@@ -111,35 +115,41 @@
       "FA:B7:EE:36:97:26:62:FB:2D:B0:2A:F6:BF:03:FD:E8:7C:4B:2F:9B",
       "8B:AF:4C:9B:1D:F0:2A:92:F7:DA:12:8E:B9:1B:AC:F4:98:60:4B:6F",
       "9F:74:4E:9F:2B:4D:BA:EC:0F:31:2C:50:B6:56:3B:8E:2D:93:C3:11",
-      "39:4F:F6:85:0B:06:BE:52:E5:18:56:CC:10:E1:80:E8:82:B3:85:CC",
+      "C9:A8:B9:E7:55:80:5E:58:E3:53:77:A7:25:EB:AF:C3:7B:27:CC:D7",
       "1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85",
+      "B5:61:EB:EA:A4:DE:E4:25:4B:69:1A:98:A5:57:47:C2:34:C7:D9:71",
       "07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E",
       "D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58",
       "32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96",
+      "E7:A1:90:29:D3:D5:52:DC:0D:0F:C6:92:D3:EA:88:0D:15:2E:1A:6B",
       "67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0",
       "FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D",
       "4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C",
       "33:9B:6B:14:50:24:9B:55:7A:01:87:72:84:D9:E0:2F:C3:D2:D8:E9",
-      "AB:48:F3:33:DB:04:AB:B9:C0:72:DA:5B:0C:C1:D0:57:F0:36:9B:46",
+      "2A:B6:28:48:5E:78:FB:F3:AD:9E:79:10:DD:6B:DF:99:72:2C:96:E5",
       "36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7",
       "37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27",
       "AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12",
       "3B:C4:9F:48:F8:F3:73:A0:9C:1E:BD:F8:5B:B1:C3:65:C7:D8:11:B3",
       "AC:ED:5F:65:53:FD:25:CE:01:5F:1F:7A:48:3B:6A:74:9F:61:78:C6",
       "28:90:3A:63:5B:52:80:FA:E6:77:4C:0B:6D:A7:D6:BA:A6:4A:F2:E8",
+      "9C:BB:48:53:F6:A4:F6:D3:52:A4:E8:32:52:55:60:13:F5:AD:AF:65",
       "B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C",
+      "20:D8:06:40:DF:9B:25:F5:12:25:3A:11:EA:F7:59:8A:EB:14:B5:47",
       "CF:9E:87:6D:D3:EB:FC:42:26:97:A3:B5:A3:7A:A0:76:A9:06:23:48",
+      "2B:B1:F5:3E:55:0C:1D:C5:F1:D4:E6:B7:6A:46:4B:55:06:02:AC:21",
       "47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B",
       "31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6",
       "39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A",
       "3A:44:73:5A:E5:81:90:1F:24:86:61:46:1E:3B:9C:C4:5F:F5:3A:1B",
       "B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9",
-      "81:96:8B:3A:EF:1C:DC:70:F5:FA:32:69:C2:92:A3:63:5B:D1:23:D3",
       "E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66",
       "D3:C0:63:F2:19:ED:07:3E:34:AD:5D:75:0B:32:76:29:FF:D5:9A:F2",
+      "3B:C0:38:0B:33:C3:F6:A6:0C:86:15:22:93:D9:DF:F5:4B:81:C0:04",
       "C8:EC:8C:87:92:69:CB:4B:AB:39:E9:8D:7E:57:67:F3:14:95:73:9D",
       "03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD",
       "CB:A1:C5:F8:B0:E3:5E:B8:B9:45:12:D3:F9:34:A2:E9:06:10:D3:36",
+      "51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39",
       "B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB",
       "10:1D:FA:3F:D5:0B:CB:BB:9B:B5:60:0C:19:55:A4:1A:F4:73:3A:04",
       "87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11",
@@ -147,11 +157,11 @@
       "21:FC:BD:8E:7F:6C:AF:05:1B:D1:B3:43:EC:A8:E7:61:47:F2:0F:8A",
       "5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74",
       "2A:C8:D5:8B:57:CE:BF:2F:49:AF:F2:FC:76:8F:51:14:62:90:7A:41",
+      "F1:7F:6F:B6:31:DC:99:E3:A3:C8:7F:FE:1C:F1:81:10:88:D9:60:33",
       "96:C9:1B:0B:95:B4:10:98:42:FA:D0:D8:22:79:FE:60:FA:B9:16:83",
-      "CA:BB:51:67:24:00:58:8E:64:19:F1:D4:08:78:D0:40:3A:A2:02:64",
-      "5D:98:9C:DB:15:96:11:36:51:65:64:1B:56:0F:DB:EA:2A:C2:3E:F1",
       "D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27",
       "9F:AD:91:A6:CE:6A:C6:C5:00:47:C4:4E:C9:D4:A5:0D:92:D8:49:79",
+      "CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D",
       "F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7",
       "5F:3A:FC:0A:8B:64:F6:86:67:34:74:DF:7E:A9:A2:FE:F9:FA:7A:51",
       "E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79",
@@ -159,9 +169,9 @@
       "89:DF:74:FE:5C:F4:0F:4A:80:F9:E3:37:7D:54:DA:91:E1:01:31:8E",
       "E0:B4:32:2E:B2:F6:A5:68:B6:54:53:84:48:18:4A:50:36:87:43:84",
       "61:57:3A:11:DF:0E:D8:7E:D5:92:65:22:EA:D0:56:D7:44:B3:23:71",
-      "0B:77:BE:BB:CB:7A:A2:47:05:DE:CC:0F:BD:6A:02:FC:7A:BD:9B:52",
       "99:A6:9B:E6:1A:FE:88:6B:4D:2B:82:00:7C:B8:54:FC:31:7E:15:39",
       "6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1",
+      "31:F1:FD:68:22:63:20:EE:C6:3B:3F:9D:EA:4A:3E:53:7C:7C:39:17",
       "E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E",
       "F9:CD:0E:2C:DA:76:24:C1:8F:BD:F0:F0:AB:B6:45:B8:F7:FE:D5:7A",
       "23:88:C9:D3:71:CC:9E:96:3D:FF:7D:3C:A7:CE:FC:D6:25:EC:19:0D",
diff --git a/tests/tests/security/src/android/security/cts/CertificateTest.java b/tests/tests/security/src/android/security/cts/CertificateTest.java
index 844621b..3db7aca 100644
--- a/tests/tests/security/src/android/security/cts/CertificateTest.java
+++ b/tests/tests/security/src/android/security/cts/CertificateTest.java
@@ -16,9 +16,10 @@
 
 package android.security.cts;
 
-import android.test.AndroidTestCase;
+import android.content.res.AssetManager;
+import android.test.InstrumentationTestCase;
 
-import java.io.FileInputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.security.KeyStore;
@@ -27,19 +28,78 @@
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.CertificateEncodingException;
 import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-public class CertificateTest extends AndroidTestCase {
+public class CertificateTest extends InstrumentationTestCase {
 
-    public void testCertificates() throws Exception {
-        Set<String> expectedCertificates = getExpectedCertificates();
+    public void testNoRemovedCertificates() throws Exception {
+        Set<String> expectedCertificates = new HashSet<String>(
+                Arrays.asList(CertificateData.CERTIFICATE_DATA));
         Set<String> deviceCertificates = getDeviceCertificates();
         expectedCertificates.removeAll(deviceCertificates);
-        assertTrue("Missing certificates: " + expectedCertificates, expectedCertificates.isEmpty());
+        assertEquals("Missing CA certificates", Collections.EMPTY_SET, expectedCertificates);
+    }
+
+    /**
+     * If you fail CTS as a result of adding a root CA that is not part of the Android root CA
+     * store, please see the following.
+     *
+     * First, this test exists because adding untrustworthy root CAs to a device has a very
+     * significant security impact. In the worst case, adding a rogue CA can permanently compromise
+     * the confidentiality and integrity of your users' network traffic. Because of this risk,
+     * adding new certificates should be done sparingly and as a last resort -- never as a first
+     * response or short term fix. Before attempting to modify this test, please consider whether
+     * adding a new certificate authority is in your users' best interests.
+     *
+     * Second, because the addition of a new root CA by an OEM can have such dire consequences for
+     * so many people it is imperative that it be done transparently and in the open. Any request to
+     * modify the certificate list used by this test must have a corresponding change in AOSP
+     * (one certificate per change) authored by the OEM in question and including:
+     *
+     *     - the certificate in question:
+     *       - The certificate must be in a file under
+     *         cts/tests/tests/security/assets/oem_cacerts, in PEM (Privacy-enhanced Electronic
+     *         Mail) format, with the textual representation of the certificate following the PEM
+     *         section.
+     *       - The file name must be in the format of <hash>.<n> where "hash" is the subject hash
+     *         produced by:
+     *           openssl x509 -in cert_file -subject_hash -noout
+     *         and the "n" is a unique integer identifier starting at 0 to deal with collisions.
+     *         See OpenSSL's c_rehash manpage for details.
+     *       - cts/tests/tests/security/tools/format_cert.sh helps meet the above requirements.
+     *
+     *     - information about who created and maintains both the certificate and the corresponding
+     *       keypair.
+     *
+     *     - information about what the certificate is to be used for and why the certificate is
+     *       appropriate for inclusion.
+     *
+     *     - a statement from the OEM indicating that they have sufficient confidence in the
+     *       security of the key, the security practices of the issuer, and the validity of the
+     *       intended use that they believe adding the certificate is not detrimental to the
+     *       security of the user.
+     *
+     * Finally, please note that this is not the usual process for adding root CAs to Android. If
+     * you have a certificate that you believe should be present on all Android devices, please file
+     * a public bug at https://code.google.com/p/android/issues/entry or http://b.android.com to
+     * seek resolution.
+     *
+     * For questions, comments, and code reviews please contact security@android.com.
+     */
+    public void testNoAddedCertificates() throws Exception {
+        Set<String> oemWhitelistedCertificates = getOemWhitelistedCertificates();
+        Set<String> expectedCertificates = new HashSet<String>(
+                Arrays.asList(CertificateData.CERTIFICATE_DATA));
+        Set<String> deviceCertificates = getDeviceCertificates();
+        deviceCertificates.removeAll(expectedCertificates);
+        deviceCertificates.removeAll(oemWhitelistedCertificates);
+        assertEquals("Unknown CA certificates", Collections.EMPTY_SET, deviceCertificates);
     }
 
     public void testBlockCertificates() throws Exception {
@@ -48,15 +108,7 @@
 
         Set<String> deviceCertificates = getDeviceCertificates();
         deviceCertificates.retainAll(blockCertificates);
-        assertTrue("Blocked certificates: " + deviceCertificates, deviceCertificates.isEmpty());
-    }
-
-    private Set<String> getExpectedCertificates() {
-        Set<String> certificates = new HashSet<String>();
-        for (int i = 0; i < CertificateData.CERTIFICATE_DATA.length; i++) {
-            certificates.add(CertificateData.CERTIFICATE_DATA[i]);
-        }
-        return certificates;
+        assertEquals("Blocked CA certificates", Collections.EMPTY_SET, deviceCertificates);
     }
 
     private Set<String> getDeviceCertificates() throws KeyStoreException,
@@ -80,6 +132,30 @@
         return certificates;
     }
 
+    private static final String ASSETS_DIR_OEM_CERTS = "oem_cacerts";
+
+    private Set<String> getOemWhitelistedCertificates() throws Exception {
+        Set<String> certificates = new HashSet<String>();
+        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+        AssetManager assetManager = getInstrumentation().getContext().getAssets();
+        for (String path : assetManager.list(ASSETS_DIR_OEM_CERTS)) {
+            File certAssetFile = new File(ASSETS_DIR_OEM_CERTS, path);
+            InputStream in = null;
+            try {
+                in = assetManager.open(certAssetFile.toString());
+                X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(in);
+                certificates.add(getFingerprint(certificate));
+            } catch (Exception e) {
+                throw new Exception("Failed to load certificate from asset: " + certAssetFile, e);
+            } finally {
+                if (in != null) {
+                    in.close();
+                }
+            }
+        }
+        return certificates;
+    }
+
     private String getFingerprint(X509Certificate certificate) throws CertificateEncodingException,
             NoSuchAlgorithmException {
         MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
index 6928ee2..fc76027 100644
--- a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -35,13 +35,13 @@
     }
 
     /**
-     * Ensure that SELinux is not in enforcing mode.
+     * Ensure that SELinux is in enforcing mode.
      */
     public void testSELinuxEnforcing() throws IOException {
         try {
-            assertEquals("0", getFile("/sys/fs/selinux/enforce"));
+            assertEquals("1", getFile("/sys/fs/selinux/enforce"));
         } catch (FileNotFoundException e) {
-            // SELinux is not compiled into the kernel. Ignore exception.
+            fail("SELinux is not compiled into this kernel, or is disabled.");
         }
     }
 
diff --git a/tests/tests/security/src/android/security/cts/NativeCodeTest.java b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
index f6e6029..4c1da05 100644
--- a/tests/tests/security/src/android/security/cts/NativeCodeTest.java
+++ b/tests/tests/security/src/android/security/cts/NativeCodeTest.java
@@ -42,6 +42,12 @@
         assertTrue(doPerfEventTest2());
     }
 
+    public void testSockDiag() throws Exception {
+        int result = doSockDiagTest();
+        assertFalse("Encountered unexpected error: " + result + ".", (result == -1));
+        assertEquals(0, result);
+    }
+
     public void testFutex() throws Exception {
         assertTrue("Device is vulnerable to CVE-2014-3153, a vulnerability in the futex() system "
                    + "call. Please apply the security patch at "
@@ -102,4 +108,10 @@
      * false if the device is vulnerable.
      */
     private static native boolean doCVE20141710Test();
+
+    /**
+     * Hangs if device is vulnerable to CVE-2013-1763, returns -1 if
+     * unexpected error occurs, 0 otherwise.
+     */
+    private static native int doSockDiagTest();
 }
diff --git a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
index cbb95d4..5d8a050 100644
--- a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
+++ b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
@@ -97,6 +97,7 @@
 
             // CTS test
             "android.core.tests.libcore.package.com",
+            "android.core.tests.libcore.package.conscrypt",
             "android.core.tests.libcore.package.dalvik",
             "android.core.tests.libcore.package.libcore",
             "android.core.tests.libcore.package.org",
diff --git a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
index 5d7ff75..7de3baa 100644
--- a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
+++ b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
@@ -132,7 +132,9 @@
             }
 
             if (lines.size() == 1) {
-                if (!lines.get(0).contains("Permission Denial")) {
+                String message = lines.get(0);
+                if (!message.contains("Permission Denial") &&
+                        !message.contains("android.permission.DUMP")) {
                     fail("dump() for " + service + " produced a single line which didn't "
                             + "reference a permission; it may be leaking sensitive data.");
                 }
diff --git a/tests/tests/security/testeffect/Android.mk b/tests/tests/security/testeffect/Android.mk
index 3b23bc6..49441c7 100644
--- a/tests/tests/security/testeffect/Android.mk
+++ b/tests/tests/security/testeffect/Android.mk
@@ -17,8 +17,6 @@
 # Test effect library
 include $(CLEAR_VARS)
 
-LOCAL_MODULE_TAGS := tests
-
 LOCAL_SRC_FILES:= \
   CTSTestEffect.cpp
 
diff --git a/tests/tests/security/testeffect/CTSTestEffect.cpp b/tests/tests/security/testeffect/CTSTestEffect.cpp
index 2276f73..9724a32 100644
--- a/tests/tests/security/testeffect/CTSTestEffect.cpp
+++ b/tests/tests/security/testeffect/CTSTestEffect.cpp
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#include <string.h>
 #include <hardware/audio_effect.h>
 
 
@@ -42,7 +41,6 @@
 //--- Effect Library Interface Implementation
 //
 
-
 int CTSEffectsLib_Create(const effect_uuid_t *uuid,
                          int32_t sessionId,
                          int32_t ioId,
diff --git a/tests/tests/security/tools/format_cert.sh b/tests/tests/security/tools/format_cert.sh
new file mode 100755
index 0000000..94407a0
--- /dev/null
+++ b/tests/tests/security/tools/format_cert.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+# Outputs the provided certificate (PEM or DER) in a format used by CTS tests.
+# The format is PEM block, followed by the textual representation of the
+# certificate, followed by the SHA-1 fingerprint.
+
+# OpenSSL binary built from this Android source
+OPENSSL="$ANDROID_HOST_OUT/bin/openssl"
+if [ "$ANDROID_HOST_OUT" == "" ]; then
+  echo "Android build environment not set up"
+  echo
+  echo "Run the following from the root of the Android source tree:"
+  echo "  . build/envsetup.sh && lunch"
+  exit 1
+fi
+if [ ! -f "$OPENSSL" ]; then
+  echo "openssl binary not found"
+  echo
+  echo "Run 'mmm external/openssl' or 'make openssl' from the root of the" \
+      "Android source tree to build it."
+  exit 1
+fi
+
+# Input file containing the certificate in PEM or DER format
+in_file="$1"
+
+# Output file. If not specified, the file will be named <hash>.0 where "hash"
+# is the certificate's subject hash produced by:
+#   openssl x509 -in cert_file -subject_hash -noout
+out_file="$2"
+
+# Detect whether the input file is PEM or DER.
+in_form="pem"
+subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash \
+    -noout 2>/dev/null)
+if [ "$?" != "0" ]; then
+  in_form="der"
+  subject_hash=$("$OPENSSL" x509 -in "$in_file" -inform $in_form -subject_hash \
+      -noout)
+  if [ "$?" != "0" ]; then
+    echo "Certificate file format is neither PEM nor DER"
+    exit 1
+  fi
+fi
+
+# Name the output file <hash>.0 if the name is not specified explicitly.
+if [ "$out_file" == "" ]; then
+  out_file="$subject_hash.0"
+  echo "Auto-generated output file name: $out_file"
+fi
+
+# Output the certificate in the target format
+"$OPENSSL" x509 -in "$in_file" -inform $in_form -outform pem > "$out_file" && \
+"$OPENSSL" x509 -in "$in_file" -inform $in_form -noout -text -fingerprint \
+    >> "$out_file"
diff --git a/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
new file mode 100644
index 0000000..fbe65b1
--- /dev/null
+++ b/tests/tests/telephony/src/android/telephony/cts/SmsUsageMonitorShortCodeTest.java
@@ -0,0 +1,501 @@
+/*
+ * Copyright (C) 2012 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 android.telephony.cts;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.internal.telephony.SmsUsageMonitor;
+
+/**
+ * Test cases for SMS short code pattern matching in SmsUsageMonitor.
+ */
+public class SmsUsageMonitorShortCodeTest extends AndroidTestCase {
+
+    private PackageManager mPackageManager;
+
+    /** Return value from {@link SmsUsageMonitor#checkDestination} for regular phone numbers. */
+    static final int CATEGORY_NOT_SHORT_CODE = 0;
+
+    /**
+     * Return value from {@link SmsUsageMonitor#checkDestination} for free (no cost)
+     * short codes.
+     */
+    static final int CATEGORY_FREE_SHORT_CODE = 1;
+
+    /**
+     * Return value from {@link SmsUsageMonitor#checkDestination} for standard rate (non-premium)
+     * short codes.
+     */
+    static final int CATEGORY_STANDARD_SHORT_CODE = 2;
+
+    /**
+     * Return value from {@link SmsUsageMonitor#checkDestination} for possible premium
+     * short codes.
+     */
+    static final int CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3;
+
+    /** Return value from {@link SmsUsageMonitor#checkDestination} for premium short codes. */
+    static final int CATEGORY_PREMIUM_SHORT_CODE = 4;
+
+    private static final class ShortCodeTest {
+        final String countryIso;
+        final String address;
+        final int category;
+
+        ShortCodeTest(String countryIso, String destAddress, int category) {
+            this.countryIso = countryIso;
+            this.address = destAddress;
+            this.category = category;
+        }
+    }
+
+    /**
+     * List of short code test cases.
+     */
+    private static final ShortCodeTest[] sShortCodeTests = new ShortCodeTest[] {
+            new ShortCodeTest("al", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("al", "4321", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("al", "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("al", "15191", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("al", "55500", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("al", "55600", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("al", "654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("am", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("am", "101", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("am", "102", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("am", "103", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("am", "222", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "1111", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "9999", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "1121", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "1141", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "1161", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("am", "3024", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("at", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("at", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("at", "0901234", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("at", "0900666266", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("au", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("au", "180000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("au", "190000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("au", "1900000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("au", "19000000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("au", "19998882", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("az", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("az", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "12345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "87744", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "3301", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "3302", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "9012", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "9014", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "9394", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "87744", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "93101", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("az", "123456", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("be", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("be", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("be", "567890", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("be", "8000", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("be", "6566", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("be", "7777", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("bg", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("bg", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("bg", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "12345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "1816", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "1915", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "1916", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "1935", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("bg", "18423", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("by", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("by", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("by", "3336", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("by", "5013", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("by", "5014", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("by", "7781", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("ca", "911", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ca", "+18005551234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ca", "8005551234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ca", "20000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ca", "200000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ca", "2000000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ca", "60999", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ca", "88188", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("ch", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ch", "123", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ch", "234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ch", "3456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ch", "98765", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ch", "543", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ch", "83111", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ch", "234567", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ch", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("cn", "120", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("cn", "1062503000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("cn", "1065123456", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("cn", "1066335588", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("cy", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("cy", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("cy", "4321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cy", "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cy", "654321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cy", "7510", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cy", "987654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("cz", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("cz", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("cz", "9090150", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cz", "90901599", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("cz", "987654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("de", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("de", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("de", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "12345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "8888", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "11111", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "11886", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "22022", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "23300", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "3434", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "34567", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "41414", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "55655", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "66766", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "66777", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "77677", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "80888", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "1232286", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("de", "987654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("dk", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("dk", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("dk", "1259", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("dk", "16123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("dk", "987654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ee", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ee", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("ee", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "1259", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "15330", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "17999", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "17010", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "17013", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "9034567", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ee", "34567890", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("es", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("es", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("es", "25165", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("es", "27333", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("es", "995399", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("es", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("fi", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("fi", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("fi", "12345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "123456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "17159", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "17163", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "0600123", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "070012345", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fi", "987654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("fr", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("fr", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("fr", "34567", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("fr", "45678", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fr", "81185", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("fr", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("gb", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("gb", "999", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("gb", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("gb", "4567", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "45678", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "56789", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "79067", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "80079", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "654321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gb", "7654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ge", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ge", "8765", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ge", "2345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ge", "8012", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ge", "8013", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ge", "8014", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ge", "8889", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("gr", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("gr", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("gr", "54321", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gr", "19567", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gr", "19678", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("gr", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("hu", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("hu", "012", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "0123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "1784", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "2345", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "01234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "012345678", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "0123456789", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "1234567890", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "0691227910", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("hu", "2345678901", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("hu", "01234567890", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ie", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ie", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("ie", "50123", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("ie", "51234", CATEGORY_STANDARD_SHORT_CODE),
+            new ShortCodeTest("ie", "52345", CATEGORY_STANDARD_SHORT_CODE),
+            new ShortCodeTest("ie", "57890", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ie", "67890", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ie", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("il", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("il", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("il", "4422", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("il", "4545", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("il", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("it", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("it", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("it", "4567", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("it", "48000", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("it", "45678", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("it", "56789", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("it", "456789", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("kg", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("kg", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kg", "4152", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kg", "4157", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kg", "4449", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kg", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("kz", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("kz", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kz", "9194", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kz", "7790", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("kz", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("lt", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("lt", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("lt", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "1381", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "1394", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "1645", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "12345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lt", "123456", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("lu", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("lu", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("lu", "1234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("lu", "12345", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("lu", "64747", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lu", "678901", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("lv", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("lv", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("lv", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lv", "1819", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lv", "1863", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lv", "1874", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("lv", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("mx", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("mx", "2345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("mx", "7766", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("mx", "23456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("mx", "53035", CATEGORY_PREMIUM_SHORT_CODE),
+
+            new ShortCodeTest("my", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("my", "1234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("my", "23456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("my", "32298", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("my", "33776", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("my", "345678", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("nl", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("nl", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("nl", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nl", "4466", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nl", "5040", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nl", "23456", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("no", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("no", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("no", "2201", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("no", "2226", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("no", "2227", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("no", "23456", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("no", "234567", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("nz", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("nz", "123", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nz", "2345", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nz", "3903", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nz", "8995", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("nz", "23456", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("pl", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("pl", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("pl", "7890", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "34567", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "7910", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "74240", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "79866", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "92525", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pl", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("pt", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("pt", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("pt", "61000", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pt", "62345", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pt", "68304", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pt", "69876", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("pt", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ro", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ro", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("ro", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "1263", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "1288", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "1314", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "1380", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "7890", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ro", "12345", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ru", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ru", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ru", "1161", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ru", "2097", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ru", "3933", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ru", "7781", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ru", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("se", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("se", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("se", "1234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("se", "72345", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("se", "72999", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("se", "123456", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("se", "87654321", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("sg", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("sg", "1234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("sg", "70000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sg", "79999", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sg", "73800", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sg", "74688", CATEGORY_STANDARD_SHORT_CODE),
+            new ShortCodeTest("sg", "987654", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("si", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("si", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("si", "1234", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("si", "3838", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("si", "72999", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("sk", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("sk", "116117", CATEGORY_FREE_SHORT_CODE),
+            new ShortCodeTest("sk", "1234", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sk", "6674", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sk", "7604", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("sk", "72999", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("tj", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("tj", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("tj", "1161", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("tj", "1171", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("tj", "4161", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("tj", "4449", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("tj", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("ua", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("ua", "5432", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ua", "4448", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ua", "7094", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ua", "7540", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("ua", "98765", CATEGORY_NOT_SHORT_CODE),
+
+            new ShortCodeTest("us", "911", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("us", "+18005551234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("us", "8005551234", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("us", "20000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("us", "200000", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("us", "2000000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("us", "20433", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("us", "21472", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("us", "23333", CATEGORY_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("us", "99807", CATEGORY_PREMIUM_SHORT_CODE),
+
+            // generic rules for other countries: 5 digits or less considered potential short code
+            new ShortCodeTest("zz", "2000000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest("zz", "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("zz", "4321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("zz", "321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest("zz", "112", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest(null, "2000000", CATEGORY_NOT_SHORT_CODE),
+            new ShortCodeTest(null, "54321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest(null, "4321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest(null, "321", CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE),
+            new ShortCodeTest(null, "112", CATEGORY_NOT_SHORT_CODE),
+    };
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mPackageManager = getContext().getPackageManager();
+    }
+
+    @SmallTest
+    public void testSmsUsageMonitor() {
+        if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+            // do not test if device does not support telephony (voice or sms)
+            return;
+        }
+
+        SmsUsageMonitor monitor = new SmsUsageMonitor(getContext());
+        for (ShortCodeTest test : sShortCodeTests) {
+            assertEquals("country: " + test.countryIso + " number: " + test.address,
+                    test.category, monitor.checkDestination(test.address, test.countryIso));
+        }
+    }
+}
diff --git a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
index 3223573..09c7cc7 100644
--- a/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/TelephonyManagerTest.java
@@ -135,6 +135,12 @@
         assertTrue(mTelephonyManager.getDataState() >= TelephonyManager.DATA_DISCONNECTED);
         assertTrue(mTelephonyManager.getCallState() >= TelephonyManager.CALL_STATE_IDLE);
 
+        // Make sure devices without MMS service won't fail on this
+        if (mTelephonyManager.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE) {
+            assertFalse(mTelephonyManager.getMmsUserAgent().isEmpty());
+            assertFalse(mTelephonyManager.getMmsUAProfUrl().isEmpty());
+        }
+
         // The following methods may return null. Simply call them to make sure they do not
         // throw any exceptions.
         mTelephonyManager.getVoiceMailNumber();
diff --git a/tests/tests/text/src/android/text/cts/EmojiConstants.java b/tests/tests/text/src/android/text/cts/EmojiConstants.java
old mode 100755
new mode 100644
diff --git a/tests/tests/text/src/android/text/cts/EmojiTest.java b/tests/tests/text/src/android/text/cts/EmojiTest.java
old mode 100755
new mode 100644
index a8d8d2d..f5f191f
--- a/tests/tests/text/src/android/text/cts/EmojiTest.java
+++ b/tests/tests/text/src/android/text/cts/EmojiTest.java
@@ -222,6 +222,14 @@
 
             webViewOnUiThread.loadDataAndWaitForCompletion("<html><body>" + String.valueOf(c) + "</body></html>",
                     "text/html; charset=utf-8", "utf-8");
+            // The Chromium-powered WebView renders asynchronously and there's nothing reliable
+            // we can easily wait for to be sure that capturePicture will return a fresh frame.
+            // So, just sleep for a sufficient time.
+            try {
+                Thread.sleep(250);
+            } catch (InterruptedException e) {
+                return null;
+            }
 
             Picture picture = webViewOnUiThread.capturePicture();
             if (picture == null || picture.getHeight() <= 0 || picture.getWidth() <= 0) {
diff --git a/tests/tests/text/src/android/text/cts/HtmlTest.java b/tests/tests/text/src/android/text/cts/HtmlTest.java
index 74008f7..cf47ab9 100644
--- a/tests/tests/text/src/android/text/cts/HtmlTest.java
+++ b/tests/tests/text/src/android/text/cts/HtmlTest.java
@@ -208,4 +208,14 @@
         Spanned s = Html.fromHtml("<p>\u0124\u00eb\u0142\u0142o, world!</p>");
         assertEquals("<p dir=\"ltr\">&#292;&#235;&#322;&#322;o, world!</p>\n", Html.toHtml(s));
     }
+
+    public void testSurrogates() throws Exception {
+        Spanned s = Html.fromHtml("\ud83d\udc31");
+        assertEquals("<p dir=\"ltr\">&#128049;</p>\n", Html.toHtml(s));
+    }
+
+    public void testBadSurrogates() throws Exception {
+        Spanned s = Html.fromHtml("\udc31\ud83d");
+        assertEquals("<p dir=\"ltr\"></p>\n", Html.toHtml(s));
+    }
 }
diff --git a/tests/tests/text/src/android/text/cts/MyanmarTest.java b/tests/tests/text/src/android/text/cts/MyanmarTest.java
new file mode 100644
index 0000000..60fe608
--- /dev/null
+++ b/tests/tests/text/src/android/text/cts/MyanmarTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 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 android.text.cts;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.test.ActivityInstrumentationTestCase2;
+import android.widget.TextView;
+
+public class MyanmarTest extends ActivityInstrumentationTestCase2<Activity> {
+
+    public MyanmarTest() {
+        super("com.android.cts.stub", Activity.class);
+    }
+
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Tests Unicode composition semantics.
+     */
+    public void testCompositionSemantics() {
+        String textA = "\u1019\u102d\u102f";
+        String textB = "\u1019\u102f\u102d"; // wrong order for Unicode
+
+        CaptureTextView cviewA = new CaptureTextView(getInstrumentation().getContext());
+        Bitmap bitmapA = cviewA.capture(textA);
+        CaptureTextView cviewB = new CaptureTextView(getInstrumentation().getContext());
+        Bitmap bitmapB = cviewB.capture(textB);
+        if (bitmapA.sameAs(bitmapB)) {
+            // if textA and textB render identically, test against replacement characters
+            String textC = "\ufffd\ufffd\ufffd"; // replacement characters are acceptable
+            CaptureTextView cviewC = new CaptureTextView(getInstrumentation().getContext());
+            Bitmap bitmapC = cviewC.capture(textC);
+            if (!bitmapA.sameAs(bitmapC)) {
+                // ...or against blank/empty glyphs
+                Bitmap bitmapD = Bitmap.createBitmap(bitmapC.getWidth(), bitmapC.getHeight(),
+                        bitmapC.getConfig());
+                assertTrue(bitmapA.sameAs(bitmapD));
+            }
+        }
+    }
+
+    private class CaptureTextView extends TextView {
+
+        CaptureTextView(Context context) {
+            super(context);
+        }
+
+        Bitmap capture(String text) {
+            setText(text);
+
+            invalidate();
+
+            setDrawingCacheEnabled(true);
+            measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
+            layout(0, 0, 200,200);
+
+            Bitmap bitmap = Bitmap.createBitmap(getDrawingCache());
+            setDrawingCacheEnabled(false);
+            return bitmap;
+        }
+
+    }
+}
diff --git a/tests/tests/text/src/android/text/cts/TextPaintTest.java b/tests/tests/text/src/android/text/cts/TextPaintTest.java
index fb34274..fef492b 100644
--- a/tests/tests/text/src/android/text/cts/TextPaintTest.java
+++ b/tests/tests/text/src/android/text/cts/TextPaintTest.java
@@ -25,7 +25,8 @@
  * Test {@link TextPaint}.
  */
 public class TextPaintTest extends AndroidTestCase {
-    private static final int DEFAULT_PAINT_FLAGS = TextPaint.DEV_KERN_TEXT_FLAG;
+    private static final int DEFAULT_PAINT_FLAGS = TextPaint.DEV_KERN_TEXT_FLAG
+            | TextPaint.EMBEDDED_BITMAP_TEXT_FLAG;
 
     public void testConstructor() {
         TextPaint textPaint;
diff --git a/tests/tests/text/src/android/text/cts/TextUtilsTest.java b/tests/tests/text/src/android/text/cts/TextUtilsTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java b/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
index 0e8f73e..1e62819 100644
--- a/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
+++ b/tests/tests/text/src/android/text/format/cts/DateUtilsTest.java
@@ -220,31 +220,6 @@
         assertFalse(DateUtils.isToday(mBaseTime - ONE_DAY_IN_MS));
     }
 
-    /**
-     * DateUtils used to use Time rather than Calendar, which is broken
-     * because Time uses a 32-bit time_t rather than Calendar's 64-bit Java long.
-     * http://code.google.com/p/android/issues/detail?id=13050
-     */
-    public void test2038() {
-        assertEquals("00:00, Thursday, January 1, 1970", formatFull(0L));
-        assertEquals("17:31, Sunday, November 24, 1833",
-                     formatFull(((long) Integer.MIN_VALUE + Integer.MIN_VALUE) * 1000L));
-        assertEquals("20:45, Friday, December 13, 1901", formatFull(Integer.MIN_VALUE * 1000L));
-        assertEquals("03:14, Tuesday, January 19, 2038", formatFull(Integer.MAX_VALUE * 1000L));
-        assertEquals("06:28, Sunday, February 7, 2106",
-                     formatFull((2L + Integer.MAX_VALUE + Integer.MAX_VALUE) * 1000L));
-    }
-
-    private String formatFull(long millis) {
-        Formatter formatter = new Formatter();
-        int flags = DateUtils.FORMAT_SHOW_DATE
-                | DateUtils.FORMAT_SHOW_WEEKDAY
-                | DateUtils.FORMAT_SHOW_TIME
-                | DateUtils.FORMAT_24HOUR;
-        DateUtils.formatDateRange(null, formatter, millis, millis, flags, "UTC");
-        return formatter.toString();
-    }
-
     public void test_bug_7548161() {
         long now = System.currentTimeMillis();
         long today = now;
diff --git a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
index 6e9996c..1d8a032 100644
--- a/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
+++ b/tests/tests/text/src/android/text/method/cts/ArrowKeyMovementMethodTest.java
@@ -180,9 +180,10 @@
         // last line
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressBothShiftAlt();
+        KeyEvent event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_UP, 0, KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_UP, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_UP)));
+                KeyEvent.KEYCODE_DPAD_UP, event));
         // |first line
         // second |line
         // last line
@@ -190,9 +191,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressShift();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_UP, 0, KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_UP, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_UP)));
+                KeyEvent.KEYCODE_DPAD_UP, event));
         // first lin|e
         // second |line
         // last line
@@ -212,9 +214,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressAlt();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_UP, 0, KeyEvent.META_ALT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_UP, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_UP)));
+                KeyEvent.KEYCODE_DPAD_UP, event));
         // |first line
         // second line
         // last line
@@ -312,9 +315,10 @@
         // last line
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressBothShiftAlt();
+        KeyEvent event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_LEFT, 0, KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_LEFT)));
+                KeyEvent.KEYCODE_DPAD_LEFT, event));
         // first line
         // |second |line
         // last line
@@ -322,8 +326,7 @@
 
         pressBothShiftAlt();
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_LEFT)));
+                KeyEvent.KEYCODE_DPAD_LEFT, event));
         // first line
         // |second |line
         // last line
@@ -331,9 +334,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressShift();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_LEFT, 0, KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_LEFT)));
+                KeyEvent.KEYCODE_DPAD_LEFT, event));
         // first line
         // second| |line
         // last line
@@ -350,9 +354,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressAlt();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_LEFT, 0, KeyEvent.META_ALT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_LEFT)));
+                KeyEvent.KEYCODE_DPAD_LEFT, event));
         // first line
         // |second line
         // last line
@@ -360,8 +365,7 @@
 
         pressAlt();
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_LEFT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_LEFT)));
+                KeyEvent.KEYCODE_DPAD_LEFT, event));
         // first line
         // |second line
         // last line
@@ -397,9 +401,10 @@
         // last line
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressBothShiftAlt();
+        KeyEvent event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_RIGHT, 0, KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second |line|
         // last line
@@ -407,8 +412,7 @@
 
         pressBothShiftAlt();
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second |line|
         // last line
@@ -416,9 +420,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressShift();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_RIGHT, 0, KeyEvent.META_SHIFT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second |l|ine
         // last line
@@ -426,8 +431,7 @@
 
         pressShift();
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second |li|ne
         // last line
@@ -435,9 +439,10 @@
 
         Selection.setSelection(mEditable, SPACE_IN_2ND_LINE);
         pressAlt();
+        event = new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+            KeyEvent.KEYCODE_DPAD_RIGHT, 0, KeyEvent.META_ALT_ON);
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second line|
         // last line
@@ -445,8 +450,7 @@
 
         pressAlt();
         assertTrue(mArrowKeyMovementMethod.onKeyDown(mTextView, mEditable,
-                KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(KeyEvent.ACTION_DOWN,
-                        KeyEvent.KEYCODE_DPAD_RIGHT)));
+                KeyEvent.KEYCODE_DPAD_RIGHT, event));
         // first line
         // second line|
         // last line
diff --git a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
index a0e03f5..34ed2dc 100644
--- a/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/BaseKeyListenerTest.java
@@ -16,187 +16,139 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
 import android.os.SystemClock;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Selection;
+import android.text.Spannable;
 import android.text.method.BaseKeyListener;
+import android.text.method.cts.KeyListenerTestCase;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
-import android.view.View;
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 
 /**
- * Test the main functionalities of the BaseKeyListener.
+ * Test {@link android.text.method.BaseKeyListener}.
  */
-public class BaseKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
+public class BaseKeyListenerTest extends KeyListenerTestCase {
     private static final CharSequence TEST_STRING = "123456";
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public BaseKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
 
     public void testBackspace() {
         final Editable content = Editable.Factory.getInstance().newEditable(TEST_STRING);
-        setTextViewText(content);
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
 
         // Nothing to delete when the cursor is at the beginning.
-        final MockBaseKeyListener baseKeyListener = new MockBaseKeyListener();
-        KeyEvent delKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
-        Selection.setSelection(content, 0, 0);
-        baseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        final KeyEvent delKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
         assertEquals("123456", content.toString());
 
         // Delete the first three letters using a selection.
-        setTextViewText(content);
-        Selection.setSelection(content, 0, 3);
-        baseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 3);
+        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, delKeyEvent);
         assertEquals("456", content.toString());
 
-        // Delete the entire line wit ALT + DEL
-        setTextViewText(content);
-        KeyEvent altDelKeyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL,
-                0, KeyEvent.META_ALT_ON);
-        Selection.setSelection(content, 0, 0);
-        baseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, altDelKeyEvent);
+        // Delete the entire line with ALT + DEL
+        final KeyEvent altDelKeyEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_DEL, 0, KeyEvent.META_ALT_ON);
+        prepTextViewSync(content, mockBaseKeyListener, false, 0, 0);
+        mockBaseKeyListener.backspace(mTextView, content, KeyEvent.KEYCODE_DEL, altDelKeyEvent);
         assertEquals("", content.toString());
     }
 
-    private void setTextViewText(final CharSequence content) {
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setText(content, BufferType.EDITABLE);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-    }
-
     public void testBackspace_withSendKeys() {
-        final MockBaseKeyListener baseKeyListener = new MockBaseKeyListener();
-        final String str = "123456";
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
 
         // Delete the first character '1'
-        prepareTextView(str, baseKeyListener, 1, 1);
+        prepTextViewSync(TEST_STRING, mockBaseKeyListener, true, 1, 1);
         sendKeys(KeyEvent.KEYCODE_DEL);
         assertEquals("23456", mTextView.getText().toString());
 
         // Delete character '2' and '3'
-        prepareTextView(str, baseKeyListener, 1, 3);
+        prepTextViewSync(TEST_STRING, mockBaseKeyListener, true, 1, 3);
         sendKeys(KeyEvent.KEYCODE_DEL);
         assertEquals("1456", mTextView.getText().toString());
 
         // Delete everything on the line the cursor is on.
-        prepareTextView(str, baseKeyListener, 0, 0);
+        prepTextViewSync(TEST_STRING, mockBaseKeyListener, true, 0, 0);
         sendAltDelete();
         assertEquals("", mTextView.getText().toString());
 
         // ALT+DEL deletes the selection only.
-        prepareTextView(str, baseKeyListener, 2, 4);
+        prepTextViewSync(TEST_STRING, mockBaseKeyListener, true, 2, 4);
         sendAltDelete();
         assertEquals("1256", mTextView.getText().toString());
 
         // DEL key does not take effect when TextView does not have BaseKeyListener.
-        prepareTextView(str, null, 1, 1);
+        prepTextViewSync(TEST_STRING, null, true, 1, 1);
         sendKeys(KeyEvent.KEYCODE_DEL);
-        assertEquals(str, mTextView.getText().toString());
+        assertEquals(TEST_STRING, mTextView.getText().toString());
     }
 
-    private void prepareTextView(final CharSequence content, final BaseKeyListener keyListener,
-            final int selectionStart, final int selectionEnd) {
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setText(content, BufferType.EDITABLE);
-                mTextView.setKeyListener(keyListener);
-                mTextView.requestFocus();
-                Selection.setSelection((Editable) mTextView.getText(), selectionStart,
-                        selectionEnd);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-    }
-
-    private void sendAltDelete() {
-        mInstrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT));
-        sendKeys(KeyEvent.KEYCODE_DEL);
-        mInstrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT));
-    }
-
-    /**
+    /*
      * Check point:
      * 1. Press 0 key, the content of TextView does not changed.
      * 2. Set a selection and press DEL key, the selection is deleted.
      * 3. ACTION_MULTIPLE KEYCODE_UNKNOWN by inserting the event's text into the content.
      */
     public void testPressKey() {
-        final CharSequence str = "123456";
-        final MockBaseKeyListener baseKeyListener = new MockBaseKeyListener();
+        final MockBaseKeyListener mockBaseKeyListener = new MockBaseKeyListener();
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setText(str, BufferType.EDITABLE);
-                mTextView.setKeyListener(baseKeyListener);
-                mTextView.requestFocus();
-                Selection.setSelection((Editable) mTextView.getText(), 0, 0);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
-        assertEquals("123456", mTextView.getText().toString());
         // press '0' key.
+        prepTextViewSync(TEST_STRING, mockBaseKeyListener, true, 0, 0);
         sendKeys(KeyEvent.KEYCODE_0);
         assertEquals("123456", mTextView.getText().toString());
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                Selection.setSelection((Editable) mTextView.getText(), 1, 2);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
         // delete character '2'
+        prepTextViewSync(mTextView.getText(), mockBaseKeyListener, true, 1, 2);
         sendKeys(KeyEvent.KEYCODE_DEL);
         assertEquals("13456", mTextView.getText().toString());
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                Selection.setSelection((Editable) mTextView.getText(), 2, 2);
-            }
-        });
-        mInstrumentation.waitForIdleSync();
         // test ACTION_MULTIPLE KEYCODE_UNKNOWN key event.
         KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), "abcd",
                 KeyCharacterMap.BUILT_IN_KEYBOARD, 0);
+        prepTextViewSync(mTextView.getText(), mockBaseKeyListener, true, 2, 2);
         mInstrumentation.sendKeySync(event);
         mInstrumentation.waitForIdleSync();
         // the text of TextView is never changed, onKeyOther never works.
 //        assertEquals("13abcd456", mTextView.getText().toString());
     }
 
+    /**
+     * Prepares mTextView state for tests by synchronously setting the content and key listener, on
+     * the UI thread.
+     */
+    private void prepTextViewSync(final CharSequence content, final BaseKeyListener keyListener,
+            final boolean selectInTextView, final int selectionStart, final int selectionEnd) {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.setText(content, BufferType.EDITABLE);
+                mTextView.setKeyListener(keyListener);
+                Selection.setSelection(
+                        (Spannable) (selectInTextView ? mTextView.getText() : content),
+                        selectionStart, selectionEnd);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+        assertTrue(mTextView.hasWindowFocus());
+    }
+
+    /**
+     * Sends alt-delete key combo via {@link #sendKeys(int... keys)}.
+     */
+    private void sendAltDelete() {
+        mInstrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ALT_LEFT));
+        mInstrumentation.sendKeySync(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN,
+                KeyEvent.KEYCODE_DEL, 0, KeyEvent.META_ALT_ON));
+        mInstrumentation.sendKeySync(new KeyEvent(0, 0, KeyEvent.ACTION_UP,
+                KeyEvent.KEYCODE_DEL, 0, KeyEvent.META_ALT_ON));
+        mInstrumentation.sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ALT_LEFT));
+    }
+
+    /**
+     * A mocked {@link android.text.method.BaseKeyListener} for testing purposes.
+     */
     private class MockBaseKeyListener extends BaseKeyListener {
         public int getInputType() {
             return InputType.TYPE_CLASS_DATETIME
diff --git a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
index 6551b52..067a62e 100644
--- a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
@@ -16,46 +16,16 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.DateKeyListener;
 import android.view.KeyEvent;
 import android.widget.TextView;
 
 /**
- * Test {@link DateKeyListener}.
+ * Test {@link android.text.method.DateKeyListener}.
  */
-public class DateKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public DateKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
-
+public class DateKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new DateKeyListener();
     }
@@ -70,21 +40,20 @@
     }
 
     public void testGetAcceptedChars() {
-        MyDataKeyListener dataKeyListener = new MyDataKeyListener();
+        MockDateKeyListener mockDateKeyListener = new MockDateKeyListener();
 
         TextMethodUtils.assertEquals(DateKeyListener.CHARACTERS,
-                dataKeyListener.getAcceptedChars());
+                mockDateKeyListener.getAcceptedChars());
     }
 
     public void testGetInputType() {
-        MyDataKeyListener dataKeyListener = new MyDataKeyListener();
+        DateKeyListener dateKeyListener = new DateKeyListener();
 
-        int expected = InputType.TYPE_CLASS_DATETIME
-                | InputType.TYPE_DATETIME_VARIATION_DATE;
-        assertEquals(expected, dataKeyListener.getInputType());
+        int expected = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE;
+        assertEquals(expected, dateKeyListener.getInputType());
     }
 
-    /**
+    /*
      * Scenario description:
      * 1. Press '1' key and check if the content of TextView becomes "1"
      * 2. Press '2' key and check if the content of TextView becomes "12"
@@ -96,13 +65,7 @@
     public void testDateTimeKeyListener() {
         final DateKeyListener dateKeyListener = DateKeyListener.getInstance();
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(dateKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(dateKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '1' key.
@@ -129,13 +92,7 @@
         assertEquals("12-/", mTextView.getText().toString());
 
         // remove DateKeyListener
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(null);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(null);
         assertEquals("12-/", mTextView.getText().toString());
 
         // press '/' key, it will not be accepted.
@@ -143,7 +100,13 @@
         assertEquals("12-/", mTextView.getText().toString());
     }
 
-    private class MyDataKeyListener extends DateKeyListener {
+    /**
+     * A mocked {@link android.text.method.DateKeyListener} for testing purposes.
+     *
+     * Allows {@link DateKeyListenerTest} to call
+     * {@link android.text.method.DateKeyListener#getAcceptedChars()}.
+     */
+    private class MockDateKeyListener extends DateKeyListener {
         @Override
         protected char[] getAcceptedChars() {
             return super.getAcceptedChars();
diff --git a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
index 9aac08b..03683dc 100644
--- a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
@@ -16,47 +16,16 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.DateTimeKeyListener;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
-import android.widget.TextView;
 
 /**
- * Test {@link DateTimeKeyListener}.
+ * Test {@link android.DateTimeKeyListener}.
  */
-public class DateTimeKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public DateTimeKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        new PollingCheck() {
-            @Override
-            protected boolean check() {
-                return mActivity.hasWindowFocus();
-            }
-        }.run();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-    }
-
+public class DateTimeKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new DateTimeKeyListener();
     }
@@ -71,10 +40,10 @@
     }
 
     public void testGetAcceptedChars() {
-        MyDateTimeKeyListener dataTimeKeyListener = new MyDateTimeKeyListener();
+        MockDateTimeKeyListener mockDateTimeKeyListener = new MockDateTimeKeyListener();
 
         TextMethodUtils.assertEquals(DateTimeKeyListener.CHARACTERS,
-                dataTimeKeyListener.getAcceptedChars());
+                mockDateTimeKeyListener.getAcceptedChars());
     }
 
     public void testGetInputType() {
@@ -85,7 +54,7 @@
         assertEquals(expected, listener.getInputType());
     }
 
-    /**
+    /*
      * Scenario description:
      * 1. Press '1' key and check if the content of TextView becomes "1"
      * 2. Press '2' key and check if the content of TextView becomes "12"
@@ -97,15 +66,8 @@
      */
     public void testDateTimeKeyListener() {
         final DateTimeKeyListener dateTimeKeyListener = DateTimeKeyListener.getInstance();
+        setKeyListenerSync(dateTimeKeyListener);
         String expectedText = "";
-
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(dateTimeKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
         assertEquals(expectedText, mTextView.getText().toString());
 
         // press '1' key.
@@ -148,20 +110,21 @@
         }
 
         // remove DateTimeKeyListener
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(null);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(null);
         assertEquals(expectedText, mTextView.getText().toString());
 
         mInstrumentation.sendStringSync("1");
         assertEquals(expectedText, mTextView.getText().toString());
     }
 
-    private class MyDateTimeKeyListener extends DateTimeKeyListener {
+
+    /**
+     * A mocked {@link android.text.method.DateTimeKeyListener} for testing purposes.
+     *
+     * Allows {@link DateTimeKeyListenerTest} to call
+     * {@link android.text.method.DateTimeKeyListener#getAcceptedChars()}.
+     */
+    private class MockDateTimeKeyListener extends DateTimeKeyListener {
         @Override
         protected char[] getAcceptedChars() {
             return super.getAcceptedChars();
diff --git a/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
index a02bdfe..9456c7e 100644
--- a/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DialerKeyListenerTest.java
@@ -16,17 +16,17 @@
 
 package android.text.method.cts;
 
-import junit.framework.TestCase;
 import android.text.InputType;
 import android.text.Spannable;
 import android.text.SpannableString;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.DialerKeyListener;
 import android.view.KeyEvent;
 
 /**
- * Test {@link DialerKeyListener}.
+ * Test {@link android.text.method.DialerKeyListener}.
  */
-public class DialerKeyListenerTest extends TestCase {
+public class DialerKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new DialerKeyListener();
     }
@@ -76,11 +76,20 @@
         assertEquals(InputType.TYPE_CLASS_PHONE, listener.getInputType());
     }
 
+    /**
+     * A mocked {@link android.text.method.DialerKeyListener} for testing purposes.
+     *
+     * Allows {@link DialerKeyListenerTest} to call
+     * {@link android.text.method.DialerKeyListener#getAcceptedChars()} and
+     * {@link android.text.method.DialerKeyListener#lookup(KeyEvent, Spannable)}.
+     */
     private class MockDialerKeyListener extends DialerKeyListener {
+        @Override
         protected char[] getAcceptedChars() {
             return super.getAcceptedChars();
         }
 
+        @Override
         protected int lookup(KeyEvent event, Spannable content) {
             return super.lookup(event, content);
         }
diff --git a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
index 16d9364..33a23e3 100644
--- a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
@@ -16,56 +16,25 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.Spanned;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.DigitsKeyListener;
 import android.view.KeyEvent;
-import android.widget.TextView;
 
 /**
  * Test {@link DigitsKeyListener}.
  */
-public class DigitsKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public DigitsKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
-
+public class DigitsKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new DigitsKeyListener();
 
         new DigitsKeyListener(true, true);
     }
 
-    /**
+    /*
      * Check point:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'.
      * 1. filter "123456", return null.
@@ -114,7 +83,7 @@
         assertEquals(destString, dest.toString());
     }
 
-    /**
+    /*
      * Check point:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+'.
      * 1. filter "-123456", return null
@@ -217,7 +186,7 @@
         assertEquals(startSign, dest.toString());
     }
 
-    /**
+    /*
      * Check point:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'.
      * 1. filter "123.456", return null
@@ -287,7 +256,7 @@
         assertEquals(startDecimal, dest.toString());
     }
 
-    /**
+    /*
      * Check point:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '-',
      * '+'.
@@ -410,7 +379,7 @@
         assertEquals(startSign, dest.toString());
     }
 
-    /**
+    /*
      * Scenario description:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'.
      *  1. Press '-' key and this key could not be accepted.
@@ -421,13 +390,7 @@
     public void testDigitsKeyListener1() {
         final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance();
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(digitsKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(digitsKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '-' key.
@@ -447,7 +410,7 @@
         assertEquals("12", mTextView.getText().toString());
     }
 
-    /**
+    /*
      * Scenario description:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+'.
      *  1. Press '-' key and check if the content of TextView becomes "-"
@@ -461,13 +424,7 @@
     public void testDigitsKeyListener2() {
         final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(true, false);
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(digitsKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(digitsKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '-' key.
@@ -495,7 +452,7 @@
         assertEquals("-12", mTextView.getText().toString());
     }
 
-    /**
+    /*
      * Scenario description:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'.
      *  1. Press '-' key and check if the content of TextView becomes ""
@@ -509,13 +466,7 @@
     public void testDigitsKeyListener3() {
         final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(false, true);
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(digitsKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(digitsKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '-' key.
@@ -543,7 +494,7 @@
         assertEquals("1.2", mTextView.getText().toString());
     }
 
-    /**
+    /*
      * Scenario description:
      * Current accepted characters are '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+',
      * '.'.
@@ -559,13 +510,7 @@
     public void testDigitsKeyListener4() {
         final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(true, true);
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(digitsKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(digitsKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '+' key.
@@ -593,7 +538,7 @@
         assertEquals("+1.2", mTextView.getText().toString());
     }
 
-    /**
+    /*
      * Scenario description:
      * Current accepted characters are '5', '6', '7', '8', '9'.
      *  1. Press '1' key and this key could not be accepted.
@@ -606,13 +551,7 @@
         final String accepted = "56789";
         final DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(accepted);
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(digitsKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(digitsKeyListener);
         assertEquals("", mTextView.getText().toString());
 
         // press '1' key.
@@ -680,7 +619,7 @@
     }
 
     public void testGetAcceptedChars() {
-        MyDigitsKeyListener digitsKeyListener = new MyDigitsKeyListener();
+        MockDigitsKeyListener mockDigitsKeyListener = new MockDigitsKeyListener();
 
         final char[][] expected = new char[][] {
             new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' },
@@ -689,20 +628,16 @@
             new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '+', '.' },
         };
 
-        TextMethodUtils.assertEquals(expected[0],
-                digitsKeyListener.getAcceptedChars());
+        TextMethodUtils.assertEquals(expected[0], mockDigitsKeyListener.getAcceptedChars());
 
-        digitsKeyListener = new MyDigitsKeyListener(true, false);
-        TextMethodUtils.assertEquals(expected[1],
-                digitsKeyListener.getAcceptedChars());
+        mockDigitsKeyListener = new MockDigitsKeyListener(true, false);
+        TextMethodUtils.assertEquals(expected[1], mockDigitsKeyListener.getAcceptedChars());
 
-        digitsKeyListener = new MyDigitsKeyListener(false, true);
-        TextMethodUtils.assertEquals(expected[2],
-                digitsKeyListener.getAcceptedChars());
+        mockDigitsKeyListener = new MockDigitsKeyListener(false, true);
+        TextMethodUtils.assertEquals(expected[2], mockDigitsKeyListener.getAcceptedChars());
 
-        digitsKeyListener = new MyDigitsKeyListener(true, true);
-        TextMethodUtils.assertEquals(expected[3],
-                digitsKeyListener.getAcceptedChars());
+        mockDigitsKeyListener = new MockDigitsKeyListener(true, true);
+        TextMethodUtils.assertEquals(expected[3], mockDigitsKeyListener.getAcceptedChars());
     }
 
     public void testGetInputType() {
@@ -727,12 +662,18 @@
         assertEquals(expected, digitsKeyListener.getInputType());
     }
 
-    private class MyDigitsKeyListener extends DigitsKeyListener {
-        public MyDigitsKeyListener() {
+    /**
+     * A mocked {@link android.text.method.DigitsKeyListener} for testing purposes.
+     *
+     * Allows {@link DigitsKeyListenerTest} to call
+     * {@link android.text.method.DigitsKeyListener#getAcceptedChars()}.
+     */
+    private class MockDigitsKeyListener extends DigitsKeyListener {
+        public MockDigitsKeyListener() {
             super();
         }
 
-        public MyDigitsKeyListener(boolean sign, boolean decimal) {
+        public MockDigitsKeyListener(boolean sign, boolean decimal) {
             super(sign, decimal);
         }
 
diff --git a/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
new file mode 100644
index 0000000..4007f33
--- /dev/null
+++ b/tests/tests/text/src/android/text/method/cts/KeyListenerTestCase.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 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 android.text.method.cts;
+
+import com.android.cts.stub.R;
+
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.text.format.DateUtils;
+import android.text.method.cts.KeyListenerStubActivity;
+import android.text.method.KeyListener;
+import android.widget.TextView;
+
+/**
+ * Base class for various KeyListener tests.
+ * {@link BaseKeyListenerTest}
+ * {@link DateKeyListenerTest}
+ * {@link DateTimeKeyListenerTest}
+ * {@link DigitsKeyListenerTest}
+ * {@link MultiTapKeyListenerTest}
+ * {@link NumberKeyListenerTest}
+ * {@link QwertyKeyListenerTest}
+ * {@link TextKeyKeyListenerTest}
+ *
+ * @see BaseKeyListenerTest
+ * @see DateKeyListenerTest
+ * @see DateTimeKeyListenerTest
+ * @see DigitsKeyListenerTest
+ * @see MultiTapKeyListenerTest
+ * @see NumberKeyListenerTest
+ * @see QwertyKeyListenerTest
+ * @see TextKeyKeyListenerTest
+ */
+public abstract class KeyListenerTestCase extends
+        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
+    protected KeyListenerStubActivity mActivity;
+    protected Instrumentation mInstrumentation;
+    protected TextView mTextView;
+
+    public KeyListenerTestCase() {
+        super("com.android.cts.stub", KeyListenerStubActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mActivity = getActivity();
+        mInstrumentation = getInstrumentation();
+        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
+
+        assertTrue(mActivity.waitForWindowFocus(5 * DateUtils.SECOND_IN_MILLIS));
+    }
+
+    /**
+     * Synchronously sets mTextView's key listener on the UI thread.
+     */
+    protected void setKeyListenerSync(final KeyListener keyListener) {
+        mActivity.runOnUiThread(new Runnable() {
+            public void run() {
+                mTextView.setKeyListener(keyListener);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+    }
+}
diff --git a/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
index b4a18b2..c6eb78c 100644
--- a/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/MetaKeyKeyListenerTest.java
@@ -16,12 +16,11 @@
 
 package android.text.method.cts;
 
-
-import android.test.AndroidTestCase;
 import android.text.Editable;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.Spanned;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.DateKeyListener;
 import android.text.method.MetaKeyKeyListener;
 import android.view.KeyCharacterMap;
@@ -32,11 +31,11 @@
 /**
  * Test {@link MetaKeyKeyListener}.
  */
-public class MetaKeyKeyListenerTest extends AndroidTestCase {
+public class MetaKeyKeyListenerTest extends KeyListenerTestCase {
     public void testPressKey() {
         final CharSequence str = "123456";
         final MetaKeyKeyListener numberKeyListener = new DateKeyListener();
-        final View view = new ImageView(getContext());
+        final View view = new ImageView(mInstrumentation.getTargetContext());
         final Editable content = Editable.Factory.getInstance().newEditable(str);
 
         content.setSpan(Selection.SELECTION_START, 0, 0, Spanned.SPAN_POINT_POINT);
@@ -61,7 +60,7 @@
     public void testReleaseKey() {
         final CharSequence str = "123456";
         final MetaKeyKeyListener numberKeyListener = new DateKeyListener();
-        final View view = new ImageView(getContext());
+        final View view = new ImageView(mInstrumentation.getTargetContext());
         final Editable content = Editable.Factory.getInstance().newEditable(str);
 
         content.setSpan(Selection.SELECTION_START, 0, 0, Spanned.SPAN_POINT_POINT);
@@ -343,12 +342,21 @@
         assertEquals(0, state);
     }
 
+    /**
+     * A mocked {@link android.text.method.MetaKeyKeyListener} for testing purposes.
+     *
+     * Allows {@link MetaKeyKeyListenerTest} to call
+     * {@link android.text.method.MetaKeyKeyListener.resetLockedMeta(Spannable)}.
+     */
     private class MockMetaKeyKeyListener extends MetaKeyKeyListener {
         public void callResetLockedMeta(Spannable content) {
             MetaKeyKeyListener.resetLockedMeta(content);
         }
     }
 
+    /**
+     * A mocked {@link android.text.Spannable} for testing purposes.
+     */
     private class MockSpannable implements Spannable {
         private int mFlags;
         private boolean mCalledRemoveSpan = false;
diff --git a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
old mode 100755
new mode 100644
index 3b4b259..e537b24
--- a/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/MultiTapKeyListenerTest.java
@@ -16,16 +16,11 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.SpannableStringBuilder;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.MultiTapKeyListener;
 import android.text.method.TextKeyListener.Capitalize;
 import android.view.KeyEvent;
@@ -34,27 +29,11 @@
 
 import java.util.concurrent.TimeUnit;
 
-public class MultiTapKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
+public class MultiTapKeyListenerTest extends KeyListenerTestCase {
     /**
      * time out of MultiTapKeyListener. longer than 2000ms in case the system is sluggish.
      */
     private static final long TIME_OUT = 3000;
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public MultiTapKeyListenerTest() {
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-    }
 
     public void testConstructor() {
         new MultiTapKeyListener(Capitalize.NONE, true);
@@ -65,20 +44,20 @@
     }
 
     public void testOnSpanAdded() {
-        final MockMultiTapKeyListener multiTapKeyListener
+        final MockMultiTapKeyListener mockMultiTapKeyListener
                 = new MockMultiTapKeyListener(Capitalize.CHARACTERS, true);
         final Spannable text = new SpannableStringBuilder("123456");
 
-        assertFalse(multiTapKeyListener.hadAddedSpan());
+        assertFalse(mockMultiTapKeyListener.hadAddedSpan());
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
-                mTextView.setKeyListener(multiTapKeyListener);
+                mTextView.setKeyListener(mockMultiTapKeyListener);
                 mTextView.setText(text, BufferType.EDITABLE);
             }
         });
         mInstrumentation.waitForIdleSync();
 
-        assertTrue(multiTapKeyListener.hadAddedSpan());
+        assertTrue(mockMultiTapKeyListener.hadAddedSpan());
     }
 
     public void testOnSpanChanged() {
@@ -263,6 +242,11 @@
         assertEquals(expected, listener.getInputType());
     }
 
+    /**
+     * A mocked {@link android.text.method.MultiTapKeyListener} for testing purposes.
+     *
+     * Tracks whether {@link MockMultiTapKeyListener#onSpanAdded()} has been called.
+     */
     private class MockMultiTapKeyListener extends MultiTapKeyListener {
         private boolean mHadAddedSpan;
 
diff --git a/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
index 795382c..fa0db0d 100644
--- a/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/NumberKeyListenerTest.java
@@ -16,18 +16,12 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.Editable;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.Spanned;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.NumberKeyListener;
 import android.view.KeyEvent;
 import android.view.View;
@@ -35,31 +29,8 @@
 import android.widget.TextView.BufferType;
 
 
-public class NumberKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-
-    private MockNumberKeyListener mNumberKeyListener;
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public NumberKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
+public class NumberKeyListenerTest extends KeyListenerTestCase {
+    private MockNumberKeyListener mMockNumberKeyListener;
 
     /**
      * Check point:
@@ -70,29 +41,31 @@
      * 5. Filter Spanned("12345 Android"), return Spanned("12345") and copy spans.
      */
     public void testFilter() {
-        mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
+        mMockNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
         String source = "Android test";
         SpannableString dest = new SpannableString("012345");
-        assertEquals("", mNumberKeyListener.filter(source, 0, source.length(),
+        assertEquals("", mMockNumberKeyListener.filter(source, 0, source.length(),
                 dest, 0, dest.length()).toString());
 
         source = "12345";
         dest = new SpannableString("012345");
-        assertNull(mNumberKeyListener.filter(source, 0, source.length(), dest, 0, dest.length()));
+        assertNull(mMockNumberKeyListener.filter(source, 0, source.length(), dest, 0,
+                dest.length()));
 
         source = "";
         dest = new SpannableString("012345");
-        assertNull(mNumberKeyListener.filter(source, 0, source.length(), dest, 0, dest.length()));
+        assertNull(mMockNumberKeyListener.filter(source, 0, source.length(), dest, 0,
+                dest.length()));
 
         source = "12345 Android";
         dest = new SpannableString("012345 Android-test");
-        assertEquals("12345", mNumberKeyListener.filter(source, 0, source.length(),
+        assertEquals("12345", mMockNumberKeyListener.filter(source, 0, source.length(),
                 dest, 0, dest.length()).toString());
 
         Object what = new Object();
         Spannable spannableSource = new SpannableString("12345 Android");
         spannableSource.setSpan(what, 0, spannableSource.length(), Spanned.SPAN_POINT_POINT);
-        Spanned filtered = (Spanned) mNumberKeyListener.filter(spannableSource,
+        Spanned filtered = (Spanned) mMockNumberKeyListener.filter(spannableSource,
                 0, spannableSource.length(), dest, 0, dest.length());
         assertEquals("12345", filtered.toString());
         assertEquals(Spanned.SPAN_POINT_POINT, filtered.getSpanFlags(what));
@@ -100,7 +73,7 @@
         assertEquals("12345".length(), filtered.getSpanEnd(what));
 
         try {
-            mNumberKeyListener.filter(null, 0, 1, dest, 0, dest.length());
+            mMockNumberKeyListener.filter(null, 0, 1, dest, 0, dest.length());
             fail("should throw NullPointerException.");
         } catch (NullPointerException e) {
         }
@@ -112,18 +85,18 @@
      * key event, return the char; otherwise return '\0'.
      */
     public void testLookup() {
-        mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
+        mMockNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
         KeyEvent event1 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0);
         SpannableString str = new SpannableString("012345");
-        assertEquals('0', mNumberKeyListener.lookup(event1, str));
+        assertEquals('0', mMockNumberKeyListener.lookup(event1, str));
 
-        mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.NOTHING);
+        mMockNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.NOTHING);
         KeyEvent event2 = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A);
         str = new SpannableString("ABCD");
-        assertEquals('\0', mNumberKeyListener.lookup(event2, str));
+        assertEquals('\0', mMockNumberKeyListener.lookup(event2, str));
 
         try {
-            mNumberKeyListener.lookup(null, str);
+            mMockNumberKeyListener.lookup(null, str);
             fail("should throw NullPointerException.");
         } catch (NullPointerException e) {
             // expected.
@@ -131,13 +104,13 @@
     }
 
     public void testOk() {
-        mNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
+        mMockNumberKeyListener = new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
 
-        assertTrue(mNumberKeyListener.callOk(mNumberKeyListener.getAcceptedChars(), '3'));
-        assertFalse(mNumberKeyListener.callOk(mNumberKeyListener.getAcceptedChars(), 'e'));
+        assertTrue(mMockNumberKeyListener.callOk(mMockNumberKeyListener.getAcceptedChars(), '3'));
+        assertFalse(mMockNumberKeyListener.callOk(mMockNumberKeyListener.getAcceptedChars(), 'e'));
 
         try {
-            mNumberKeyListener.callOk(null, 'm');
+            mMockNumberKeyListener.callOk(null, 'm');
             fail("should throw NullPointerException.");
         } catch (NullPointerException e) {
         }
@@ -151,13 +124,13 @@
      */
     public void testPressKey() {
         final CharSequence text = "123456";
-        final MockNumberKeyListener numberKeyListener =
+        final MockNumberKeyListener mockNumberKeyListener =
             new MockNumberKeyListener(MockNumberKeyListener.DIGITS);
 
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
                 mTextView.setText(text, BufferType.EDITABLE);
-                mTextView.setKeyListener(numberKeyListener);
+                mTextView.setKeyListener(mockNumberKeyListener);
                 mTextView.requestFocus();
                 Selection.setSelection((Editable) mTextView.getText(), 0, 0);
             }
@@ -188,8 +161,15 @@
         assertEquals("0123456", mTextView.getText().toString());
     }
 
+    /**
+     * A mocked {@link android.text.method.NumberKeyListener} for testing purposes.
+     *
+     * Allows {@link NumberKeyListenerTest} to call
+     * {@link android.text.method.NumberKeyListener#getAcceptedChars()},
+     * {@link android.text.method.NumberKeyListener#lookup(KeyEvent, Spannable)}, and
+     * {@link android.text.method.NumberKeyListener@ok(char[], char)}.
+     */
     private static class MockNumberKeyListener extends NumberKeyListener {
-
         static final char[] DIGITS =
                 new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
 
diff --git a/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java b/tests/tests/text/src/android/text/method/cts/PasswordTransformationMethodTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
index c97edd9..b66e19a 100644
--- a/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/QwertyKeyListenerTest.java
@@ -16,16 +16,11 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.SpannableStringBuilder;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.QwertyKeyListener;
 import android.text.method.TextKeyListener;
 import android.text.method.TextKeyListener.Capitalize;
@@ -33,24 +28,7 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 
-public class QwertyKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public QwertyKeyListenerTest() {
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-    }
-
+public class QwertyKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new QwertyKeyListener(Capitalize.NONE, false);
 
diff --git a/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java b/tests/tests/text/src/android/text/method/cts/ScrollingMovementMethodTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
index 9984efe..3e09a60 100644
--- a/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TextKeyListenerTest.java
@@ -16,19 +16,14 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
 import android.os.SystemClock;
-import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Selection;
 import android.text.Spannable;
 import android.text.SpannableStringBuilder;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.TextKeyListener;
 import android.text.method.TextKeyListener.Capitalize;
 import android.view.KeyCharacterMap;
@@ -37,33 +32,11 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 
-public class TextKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
+public class TextKeyListenerTest extends KeyListenerTestCase {
     /**
      * time out of MultiTapKeyListener. longer than 2000ms in case the system is sluggish.
      */
     private static final long TIME_OUT = 3000;
-    private KeyListenerStubActivity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public TextKeyListenerTest() {
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
 
     public void testConstructor() {
         new TextKeyListener(Capitalize.NONE, true);
@@ -104,22 +77,22 @@
     }
 
     public void testOnSpanAdded() {
-        final MockTextKeyListener textKeyListener
+        final MockTextKeyListener mockTextKeyListener
                 = new MockTextKeyListener(Capitalize.CHARACTERS, true);
         final Spannable text = new SpannableStringBuilder("123456");
 
-        assertFalse(textKeyListener.hadAddedSpan());
+        assertFalse(mockTextKeyListener.hadAddedSpan());
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
-                mTextView.setKeyListener(textKeyListener);
+                mTextView.setKeyListener(mockTextKeyListener);
                 mTextView.setText(text, BufferType.EDITABLE);
             }
         });
         mInstrumentation.waitForIdleSync();
 
-        assertTrue(textKeyListener.hadAddedSpan());
+        assertTrue(mockTextKeyListener.hadAddedSpan());
 
-        textKeyListener.release();
+        mockTextKeyListener.release();
     }
 
     public void testGetInstance1() {
@@ -243,7 +216,6 @@
         mActivity.runOnUiThread(new Runnable() {
             public void run() {
                 mTextView.setText("", BufferType.EDITABLE);
-                mTextView.requestFocus();
                 Selection.setSelection((Editable) mTextView.getText(), 0, 0);
                 mTextView.setKeyListener(textKeyListener);
             }
@@ -275,6 +247,12 @@
         listener.release();
     }
 
+    /**
+     * A mocked {@link android.text.method.TextKeyListener} for testing purposes.
+     *
+     * Tracks whether {@link MockTextKeyListener#onSpanAdded(Spannable, Object, int, int)} has been
+     * called.
+     */
     private class MockTextKeyListener extends TextKeyListener {
         private boolean mHadAddedSpan;
 
diff --git a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
index f9c172b..7d8631b 100644
--- a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
@@ -16,44 +16,13 @@
 
 package android.text.method.cts;
 
-import com.android.cts.stub.R;
-
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
 import android.text.InputType;
+import android.text.method.cts.KeyListenerTestCase;
 import android.text.method.TimeKeyListener;
 import android.view.KeyCharacterMap;
 import android.view.KeyEvent;
-import android.widget.TextView;
 
-public class TimeKeyListenerTest extends
-        ActivityInstrumentationTestCase2<KeyListenerStubActivity> {
-    private Activity mActivity;
-    private Instrumentation mInstrumentation;
-    private TextView mTextView;
-
-    public TimeKeyListenerTest(){
-        super("com.android.cts.stub", KeyListenerStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        mActivity = getActivity();
-        mInstrumentation = getInstrumentation();
-        mTextView = (TextView) mActivity.findViewById(R.id.keylistener_textview);
-        new PollingCheck(1000) {
-            @Override
-            protected boolean check() {
-                return mTextView.hasWindowFocus();
-            }
-        }.run();
-    }
-
+public class TimeKeyListenerTest extends KeyListenerTestCase {
     public void testConstructor() {
         new TimeKeyListener();
     }
@@ -68,9 +37,9 @@
     }
 
     public void testGetAcceptedChars() {
-        MyTimeKeyListener timeKeyListener = new MyTimeKeyListener();
+        MockTimeKeyListener mockTimeKeyListener = new MockTimeKeyListener();
         TextMethodUtils.assertEquals(TimeKeyListener.CHARACTERS,
-                timeKeyListener.getAcceptedChars());
+                mockTimeKeyListener.getAcceptedChars());
     }
 
     public void testGetInputType() {
@@ -80,7 +49,7 @@
         assertEquals(expected, listener.getInputType());
     }
 
-    /**
+    /*
      * Scenario description:
      * 1. Press '1' key and check if the content of TextView becomes "1"
      * 2. Press '2' key and check if the content of TextView becomes "12"
@@ -94,13 +63,7 @@
         final TimeKeyListener timeKeyListener = TimeKeyListener.getInstance();
         String expectedText = "";
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(timeKeyListener);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(timeKeyListener);
         assertEquals(expectedText, mTextView.getText().toString());
 
         // press '1' key.
@@ -142,20 +105,20 @@
             assertEquals(expectedText, mTextView.getText().toString());
         }
 
-        mActivity.runOnUiThread(new Runnable() {
-            public void run() {
-                mTextView.setKeyListener(null);
-                mTextView.requestFocus();
-            }
-        });
-        mInstrumentation.waitForIdleSync();
+        setKeyListenerSync(null);
 
         // press '1' key.
         mInstrumentation.sendStringSync("1");
         assertEquals(expectedText, mTextView.getText().toString());
     }
 
-    private class MyTimeKeyListener extends TimeKeyListener {
+    /**
+     * A mocked {@link android.text.method.TimeKeyListener} for testing purposes.
+     *
+     * Allows {@link TimeKeyListenerTest} to call
+     * {@link android.text.method.TimeKeyListener#getAcceptedChars()}.
+     */
+    private class MockTimeKeyListener extends TimeKeyListener {
         @Override
         protected char[] getAcceptedChars() {
             return super.getAcceptedChars();
diff --git a/tests/tests/text/src/android/text/method/cts/TouchTest.java b/tests/tests/text/src/android/text/method/cts/TouchTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java b/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
index d7c1895..fd8fa53 100644
--- a/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
+++ b/tests/tests/util/src/android/util/cts/DisplayMetricsTest.java
@@ -36,9 +36,9 @@
         outMetrics.setToDefaults();
         assertEquals(0, outMetrics.widthPixels);
         assertEquals(0, outMetrics.heightPixels);
-        // according to Android enmulator doc UI -scale confine density should between 0.1 to 3
-        assertTrue((0.1 <= outMetrics.density) && (outMetrics.density <= 3));
-        assertTrue((0.1 <= outMetrics.scaledDensity) && (outMetrics.scaledDensity <= 3));
+        // according to Android emulator doc UI -scale confine density should between 0.1 to 4
+        assertTrue((0.1 <= outMetrics.density) && (outMetrics.density <= 4));
+        assertTrue((0.1 <= outMetrics.scaledDensity) && (outMetrics.scaledDensity <= 4));
         assertTrue(0 < outMetrics.xdpi);
         assertTrue(0 < outMetrics.ydpi);
 
@@ -48,9 +48,9 @@
         metrics.setTo(outMetrics);
         assertEquals(display.getHeight(), metrics.heightPixels);
         assertEquals(display.getWidth(), metrics.widthPixels);
-        // according to Android enmulator doc UI -scale confine density should between 0.1 to 3
-        assertTrue((0.1 <= metrics.density) && (metrics.density <= 3));
-        assertTrue((0.1 <= metrics.scaledDensity) && (metrics.scaledDensity <= 3));
+        // according to Android emulator doc UI -scale confine density should between 0.1 to 4
+        assertTrue((0.1 <= metrics.density) && (metrics.density <= 4));
+        assertTrue((0.1 <= metrics.scaledDensity) && (metrics.scaledDensity <= 4));
         assertTrue(0 < metrics.xdpi);
         assertTrue(0 < metrics.ydpi);
     }
diff --git a/tests/tests/util/src/android/util/cts/LongSparseArrayTest.java b/tests/tests/util/src/android/util/cts/LongSparseArrayTest.java
new file mode 100644
index 0000000..e5b23f8
--- /dev/null
+++ b/tests/tests/util/src/android/util/cts/LongSparseArrayTest.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2013 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 android.util.cts;
+
+import android.util.LongSparseArray;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for {@link LongSparseArray}.
+ */
+public class LongSparseArrayTest extends TestCase {
+    private static final long[] KEYS = {12, 23, 4, 6, 8, 1, 3, -12, 0, -3, 11, 14, -23};
+    private static final Integer[] VALUES = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+    private static final int LENGTH = VALUES.length;
+    private static final long NON_EXISTED_KEY = 123;
+    private static final Integer VALUE_FOR_NON_EXISTED_KEY = -1;
+
+    public void testSparseArrayWithDefaultCapacity() {
+        LongSparseArray<Integer> sparseArray = new LongSparseArray<Integer>();
+        assertEquals(0, sparseArray.size());
+
+        int length = VALUES.length;
+
+        for (int i = 0; i < length; i++) {
+            sparseArray.put(KEYS[i], VALUES[i]);
+            assertEquals(i + 1, sparseArray.size());
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(new Integer(i), sparseArray.get(KEYS[i]));
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(sparseArray.indexOfValue(VALUES[i]), sparseArray.indexOfKey(KEYS[i]));
+        }
+
+        // for key already exist, old value will be replaced
+        long existKey = KEYS[0];
+        Integer oldValue = VALUES[0]; // 0
+        Integer newValue = 100;
+        assertEquals(oldValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+        sparseArray.put(existKey, newValue);
+        assertEquals(newValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY));
+        assertNull(sparseArray.get(NON_EXISTED_KEY)); // the default value is null
+
+        int size = sparseArray.size();
+        sparseArray.append(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY);
+        assertEquals(size + 1, sparseArray.size());
+        assertEquals(size, sparseArray.indexOfKey(NON_EXISTED_KEY));
+        assertEquals(size, sparseArray.indexOfValue(VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(NON_EXISTED_KEY, sparseArray.keyAt(size));
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY, sparseArray.valueAt(size));
+
+        sparseArray.setValueAt(size, VALUES[1]);
+        assertTrue(VALUE_FOR_NON_EXISTED_KEY != sparseArray.valueAt(size));
+        assertEquals(VALUES[1], sparseArray.valueAt(size));
+
+        size = sparseArray.size();
+        assertEquals(VALUES[1], sparseArray.get(KEYS[1]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[1]);
+        sparseArray.delete(KEYS[1]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[1], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        size = sparseArray.size();
+        assertEquals(VALUES[2], sparseArray.get(KEYS[2]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[2]);
+        sparseArray.remove(KEYS[2]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[2], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        sparseArray.clear();
+        assertEquals(0, sparseArray.size());
+    }
+
+    public void testSparseArrayWithSpecifiedCapacity() {
+        LongSparseArray<Integer> sparseArray = new LongSparseArray<Integer>(5);
+        assertEquals(0, sparseArray.size());
+
+        int length = VALUES.length;
+
+        for (int i = 0; i < length; i++) {
+            sparseArray.put(KEYS[i], VALUES[i]);
+            assertEquals(i + 1, sparseArray.size());
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(VALUES[i], sparseArray.get(KEYS[i]));
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(sparseArray.indexOfValue(VALUES[i]), sparseArray.indexOfKey(KEYS[i]));
+        }
+
+        // for key already exist, old value will be replaced
+        long existKey = KEYS[0];
+        Integer oldValue = VALUES[0]; // 0
+        Integer newValue = 100;
+        assertEquals(oldValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+        sparseArray.put(existKey, newValue);
+        assertEquals(newValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                     sparseArray.get(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY));
+        assertNull(sparseArray.get(NON_EXISTED_KEY)); // the default value is null
+
+        int size = sparseArray.size();
+        sparseArray.append(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY);
+        assertEquals(size + 1, sparseArray.size());
+        assertEquals(size, sparseArray.indexOfKey(NON_EXISTED_KEY));
+        assertEquals(size, sparseArray.indexOfValue(VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(NON_EXISTED_KEY, sparseArray.keyAt(size));
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY, sparseArray.valueAt(size));
+
+        sparseArray.setValueAt(size, VALUES[1]);
+        assertTrue(VALUE_FOR_NON_EXISTED_KEY != sparseArray.valueAt(size));
+        assertEquals(VALUES[1], sparseArray.valueAt(size));
+
+        size = sparseArray.size();
+        assertEquals(VALUES[1], sparseArray.get(KEYS[1]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[1]);
+        sparseArray.delete(KEYS[1]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[1], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        size = sparseArray.size();
+        assertEquals(VALUES[2], sparseArray.get(KEYS[2]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[2]);
+        sparseArray.remove(KEYS[2]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[2], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        sparseArray.clear();
+        assertEquals(0, sparseArray.size());
+    }
+
+    public void testIterationOrder() {
+        LongSparseArray<Long> sparseArray = new LongSparseArray<Long>();
+        // No matter in which order they are inserted.
+        sparseArray.put(1L, Long.valueOf(2L));
+        sparseArray.put(10L, Long.valueOf(20L));
+        sparseArray.put(5L, Long.valueOf(40L));
+        sparseArray.put(Long.MAX_VALUE, Long.valueOf(Long.MIN_VALUE));
+        // The keys are returned in order.
+        assertEquals(1L, sparseArray.keyAt(0));
+        assertEquals(5L, sparseArray.keyAt(1));
+        assertEquals(10L, sparseArray.keyAt(2));
+        assertEquals(Long.MAX_VALUE, sparseArray.keyAt(3));
+        // The values are returned in the order of the corresponding keys.
+        assertEquals(2L, sparseArray.valueAt(0).longValue());
+        assertEquals(40L, sparseArray.valueAt(1).longValue());
+        assertEquals(20L, sparseArray.valueAt(2).longValue());
+        assertEquals(Long.MIN_VALUE, sparseArray.valueAt(3).longValue());
+    }
+
+}
diff --git a/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java b/tests/tests/util/src/android/util/cts/PrintStreamPrinterTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/util/src/android/util/cts/SparseArrayTest.java b/tests/tests/util/src/android/util/cts/SparseArrayTest.java
index dfb722b..6dbb571 100644
--- a/tests/tests/util/src/android/util/cts/SparseArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseArrayTest.java
@@ -155,4 +155,23 @@
         sparseArray.clear();
         assertEquals(0, sparseArray.size());
     }
+
+    public void testIterationOrder() {
+        SparseArray<Long> sparseArray = new SparseArray<Long>();
+        // No matter in which order they are inserted.
+        sparseArray.put(1, Long.valueOf(2L));
+        sparseArray.put(10, Long.valueOf(20L));
+        sparseArray.put(5, Long.valueOf(40L));
+        sparseArray.put(Integer.MAX_VALUE, Long.valueOf(Long.MIN_VALUE));
+        // The keys are returned in order.
+        assertEquals(1, sparseArray.keyAt(0));
+        assertEquals(5, sparseArray.keyAt(1));
+        assertEquals(10, sparseArray.keyAt(2));
+        assertEquals(Integer.MAX_VALUE, sparseArray.keyAt(3));
+        // The values are returned in the order of the corresponding keys.
+        assertEquals(2L, sparseArray.valueAt(0).longValue());
+        assertEquals(40L, sparseArray.valueAt(1).longValue());
+        assertEquals(20L, sparseArray.valueAt(2).longValue());
+        assertEquals(Long.MIN_VALUE, sparseArray.valueAt(3).longValue());
+    }
 }
diff --git a/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java b/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
index 0914d46..0ac8ea4 100644
--- a/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseBooleanArrayTest.java
@@ -143,5 +143,24 @@
         assertEquals(0, sparseBooleanArray.size());
     }
 
+    public void testIterationOrder() {
+        SparseBooleanArray sparseArray = new SparseBooleanArray();
+        // No matter in which order they are inserted.
+        sparseArray.put(1, true);
+        sparseArray.put(10, false);
+        sparseArray.put(5, true);
+        sparseArray.put(Integer.MAX_VALUE, false);
+        // The keys are returned in order.
+        assertEquals(1, sparseArray.keyAt(0));
+        assertEquals(5, sparseArray.keyAt(1));
+        assertEquals(10, sparseArray.keyAt(2));
+        assertEquals(Integer.MAX_VALUE, sparseArray.keyAt(3));
+        // The values are returned in the order of the corresponding keys.
+        assertEquals(true, sparseArray.valueAt(0));
+        assertEquals(true, sparseArray.valueAt(1));
+        assertEquals(false, sparseArray.valueAt(2));
+        assertEquals(false, sparseArray.valueAt(3));
+    }
+
 }
 
diff --git a/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java b/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
index a3637a1..d0e4447 100644
--- a/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
+++ b/tests/tests/util/src/android/util/cts/SparseIntArrayTest.java
@@ -171,5 +171,24 @@
         }
     }
 
+    public void testIterationOrder() {
+        SparseIntArray sparseArray = new SparseIntArray();
+        // No matter in which order they are inserted.
+        sparseArray.put(1, 2);
+        sparseArray.put(10, 20);
+        sparseArray.put(5, 40);
+        sparseArray.put(Integer.MAX_VALUE, Integer.MIN_VALUE);
+        // The keys are returned in order.
+        assertEquals(1, sparseArray.keyAt(0));
+        assertEquals(5, sparseArray.keyAt(1));
+        assertEquals(10, sparseArray.keyAt(2));
+        assertEquals(Integer.MAX_VALUE, sparseArray.keyAt(3));
+        // The values are returned in the order of the corresponding keys.
+        assertEquals(2, sparseArray.valueAt(0));
+        assertEquals(40, sparseArray.valueAt(1));
+        assertEquals(20, sparseArray.valueAt(2));
+        assertEquals(Integer.MIN_VALUE, sparseArray.valueAt(3));
+    }
+
 }
 
diff --git a/tests/tests/util/src/android/util/cts/SparseLongArrayTest.java b/tests/tests/util/src/android/util/cts/SparseLongArrayTest.java
new file mode 100644
index 0000000..c40691c
--- /dev/null
+++ b/tests/tests/util/src/android/util/cts/SparseLongArrayTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2013 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 android.util.cts;
+
+import android.util.SparseLongArray;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for {@link SparseLongArray}.
+ */
+public class SparseLongArrayTest extends TestCase {
+    private static final int[] KEYS = {12, 23, 4, 6, 8, 1, 3, -12, 0, -3, 11, 14, -23};
+    private static final long[] VALUES = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
+    private static final int LENGTH = VALUES.length;
+    private static final int NON_EXISTED_KEY = 123;
+    private static final long VALUE_FOR_NON_EXISTED_KEY = -1;
+
+    public void testSparseArrayWithDefaultCapacity() {
+        SparseLongArray sparseArray = new SparseLongArray();
+        assertEquals(0, sparseArray.size());
+
+        int length = VALUES.length;
+
+        for (int i = 0; i < length; i++) {
+            sparseArray.put(KEYS[i], VALUES[i]);
+            assertEquals(i + 1, sparseArray.size());
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(i, sparseArray.get(KEYS[i]));
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(sparseArray.indexOfValue(VALUES[i]), sparseArray.indexOfKey(KEYS[i]));
+        }
+
+        // for key already exist, old value will be replaced
+        int existKey = KEYS[0];
+        long oldValue = VALUES[0]; // 0
+        long newValue = 100;
+        assertEquals(oldValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+        sparseArray.put(existKey, newValue);
+        assertEquals(newValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(0L, sparseArray.get(NON_EXISTED_KEY)); // the default value is 0
+
+        int size = sparseArray.size();
+        sparseArray.append(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY);
+        assertEquals(size + 1, sparseArray.size());
+        assertEquals(size, sparseArray.indexOfKey(NON_EXISTED_KEY));
+        assertEquals(size, sparseArray.indexOfValue(VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(NON_EXISTED_KEY, sparseArray.keyAt(size));
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY, sparseArray.valueAt(size));
+
+        size = sparseArray.size();
+        assertEquals(VALUES[1], sparseArray.get(KEYS[1]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[1]);
+        sparseArray.delete(KEYS[1]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[1], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        size = sparseArray.size();
+        assertEquals(VALUES[2], sparseArray.get(KEYS[2]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[2]);
+        sparseArray.delete(KEYS[2]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[2], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        sparseArray.clear();
+        assertEquals(0, sparseArray.size());
+    }
+
+    public void testSparseArrayWithSpecifiedCapacity() {
+        SparseLongArray sparseArray = new SparseLongArray(5);
+        assertEquals(0, sparseArray.size());
+
+        int length = VALUES.length;
+
+        for (int i = 0; i < length; i++) {
+            sparseArray.put(KEYS[i], VALUES[i]);
+            assertEquals(i + 1, sparseArray.size());
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(VALUES[i], sparseArray.get(KEYS[i]));
+        }
+
+        for (int i = 0; i < length; i++) {
+            assertEquals(sparseArray.indexOfValue(VALUES[i]), sparseArray.indexOfKey(KEYS[i]));
+        }
+
+        // for key already exist, old value will be replaced
+        int existKey = KEYS[0];
+        long oldValue = VALUES[0]; // 0
+        long newValue = 100;
+        assertEquals(oldValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+        sparseArray.put(existKey, newValue);
+        assertEquals(newValue, sparseArray.get(existKey));
+        assertEquals(LENGTH, sparseArray.size());
+
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                     sparseArray.get(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(0L, sparseArray.get(NON_EXISTED_KEY)); // the default value is 0
+
+        int size = sparseArray.size();
+        sparseArray.append(NON_EXISTED_KEY, VALUE_FOR_NON_EXISTED_KEY);
+        assertEquals(size + 1, sparseArray.size());
+        assertEquals(size, sparseArray.indexOfKey(NON_EXISTED_KEY));
+        assertEquals(size, sparseArray.indexOfValue(VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(NON_EXISTED_KEY, sparseArray.keyAt(size));
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY, sparseArray.valueAt(size));
+
+        size = sparseArray.size();
+        assertEquals(VALUES[1], sparseArray.get(KEYS[1]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[1]);
+        sparseArray.delete(KEYS[1]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[1], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        size = sparseArray.size();
+        assertEquals(VALUES[2], sparseArray.get(KEYS[2]));
+        assertFalse(VALUE_FOR_NON_EXISTED_KEY == VALUES[2]);
+        sparseArray.delete(KEYS[2]);
+        assertEquals(VALUE_FOR_NON_EXISTED_KEY,
+                sparseArray.get(KEYS[2], VALUE_FOR_NON_EXISTED_KEY));
+        assertEquals(size - 1, sparseArray.size());
+
+        sparseArray.clear();
+        assertEquals(0, sparseArray.size());
+    }
+
+    public void testIterationOrder() {
+        SparseLongArray sparseArray = new SparseLongArray();
+        // No matter in which order they are inserted.
+        sparseArray.put(1, 2L);
+        sparseArray.put(10, 20L);
+        sparseArray.put(5, 40L);
+        sparseArray.put(Integer.MAX_VALUE, Long.MIN_VALUE);
+        // The keys are returned in order.
+        assertEquals(1, sparseArray.keyAt(0));
+        assertEquals(5, sparseArray.keyAt(1));
+        assertEquals(10, sparseArray.keyAt(2));
+        assertEquals(Integer.MAX_VALUE, sparseArray.keyAt(3));
+        // The values are returned in the order of the corresponding keys.
+        assertEquals(2L, sparseArray.valueAt(0));
+        assertEquals(40L, sparseArray.valueAt(1));
+        assertEquals(20L, sparseArray.valueAt(2));
+        assertEquals(Long.MIN_VALUE, sparseArray.valueAt(3));
+    }
+
+}
diff --git a/tests/tests/view/src/android/view/cts/KeyEventTest.java b/tests/tests/view/src/android/view/cts/KeyEventTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 27c98cc..95a365f 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -38,6 +38,7 @@
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.TouchUtils;
 import android.test.UiThreadTest;
+import android.text.format.DateUtils;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.SparseArray;
@@ -47,11 +48,13 @@
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Display;
 import android.view.HapticFeedbackConstants;
+import android.view.InputDevice;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.SoundEffectConstants;
 import android.view.TouchDelegate;
 import android.view.View;
+import android.view.MotionEvent.PointerProperties;
 import android.view.View.BaseSavedState;
 import android.view.View.OnClickListener;
 import android.view.View.OnCreateContextMenuListener;
@@ -90,7 +93,7 @@
 
     private Resources mResources;
     private MockViewParent mMockParent;
-    private Activity mActivity;
+    private ViewTestStubActivity mActivity;
 
     /** timeout delta when wait in case the system is sluggish */
     private static final long TIMEOUT_DELTA = 10000;
@@ -109,6 +112,7 @@
         }.run();
         mResources = mActivity.getResources();
         mMockParent = new MockViewParent(mActivity);
+        assertTrue(mActivity.waitForWindowFocus(5 * DateUtils.SECOND_IN_MILLIS));
     }
 
     public void testConstructor() {
@@ -1860,25 +1864,17 @@
         });
         getInstrumentation().waitForIdleSync();
 
-        int[] xy = new int[2];
-        view.getLocationOnScreen(xy);
-
-        final int viewWidth = view.getWidth();
-        final int viewHeight = view.getHeight();
-        final float x = xy[0] + viewWidth / 2.0f;
-        final float y = xy[1] + viewHeight / 2.0f;
-
         long downTime = SystemClock.uptimeMillis();
-        long eventTime = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN,
-                x, y, 0);
+        long eventTime = downTime;
+        MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE,
+                1, 2, 0);
         getInstrumentation().sendTrackballEventSync(event);
         getInstrumentation().waitForIdleSync();
         assertTrue(view.hasCalledOnTrackballEvent());
     }
 
     @UiThreadTest
-    public void testDispatchTrackballEvent() {
+    public void testDispatchTrackballMoveEvent() {
         ViewGroup viewGroup = (ViewGroup) mActivity.findViewById(R.id.viewlayout_root);
         MockView mockView1 = new MockView(mActivity);
         MockView mockView2 = new MockView(mActivity);
@@ -1889,8 +1885,8 @@
         mockView2.requestFocus();
 
         long downTime = SystemClock.uptimeMillis();
-        long eventTime = SystemClock.uptimeMillis();
-        MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN,
+        long eventTime = downTime;
+        MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE,
                 1, 2, 0);
         mockView1.dispatchTrackballEvent(event);
         // issue 1695243
@@ -1901,8 +1897,8 @@
         mockView1.reset();
         mockView2.reset();
         downTime = SystemClock.uptimeMillis();
-        eventTime = SystemClock.uptimeMillis();
-        event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, 1, 2, 0);
+        eventTime = downTime;
+        event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, 1, 2, 0);
         mockView2.dispatchTrackballEvent(event);
         assertFalse(mockView1.hasCalledOnTrackballEvent());
         assertTrue(mockView2.hasCalledOnTrackballEvent());
@@ -2750,6 +2746,136 @@
         assertFalse(view.isPaddingOffsetRequired());
     }
 
+    @UiThreadTest
+    public void testPadding() {
+        MockView view = (MockView) mActivity.findViewById(R.id.mock_view_padding_full);
+        Drawable background = view.getBackground();
+        Rect backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a non null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left != 0);
+        assertTrue(backgroundPadding.right != 0);
+        assertTrue(backgroundPadding.top != 0);
+        assertTrue(backgroundPadding.bottom != 0);
+
+        // The XML defines android:padding="0dp" and that should be the resulting padding
+        assertEquals(0, view.getPaddingLeft());
+        assertEquals(0, view.getPaddingTop());
+        assertEquals(0, view.getPaddingRight());
+        assertEquals(0, view.getPaddingBottom());
+
+        // LEFT case
+        view = (MockView) mActivity.findViewById(R.id.mock_view_padding_left);
+        background = view.getBackground();
+        backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a non null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left != 0);
+        assertTrue(backgroundPadding.right != 0);
+        assertTrue(backgroundPadding.top != 0);
+        assertTrue(backgroundPadding.bottom != 0);
+
+        // The XML defines android:paddingLeft="0dp" and that should be the resulting padding
+        assertEquals(0, view.getPaddingLeft());
+        assertEquals(backgroundPadding.top, view.getPaddingTop());
+        assertEquals(backgroundPadding.right, view.getPaddingRight());
+        assertEquals(backgroundPadding.bottom, view.getPaddingBottom());
+
+        // RIGHT case
+        view = (MockView) mActivity.findViewById(R.id.mock_view_padding_right);
+        background = view.getBackground();
+        backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a non null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left != 0);
+        assertTrue(backgroundPadding.right != 0);
+        assertTrue(backgroundPadding.top != 0);
+        assertTrue(backgroundPadding.bottom != 0);
+
+        // The XML defines android:paddingRight="0dp" and that should be the resulting padding
+        assertEquals(backgroundPadding.left, view.getPaddingLeft());
+        assertEquals(backgroundPadding.top, view.getPaddingTop());
+        assertEquals(0, view.getPaddingRight());
+        assertEquals(backgroundPadding.bottom, view.getPaddingBottom());
+
+        // TOP case
+        view = (MockView) mActivity.findViewById(R.id.mock_view_padding_top);
+        background = view.getBackground();
+        backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a non null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left != 0);
+        assertTrue(backgroundPadding.right != 0);
+        assertTrue(backgroundPadding.top != 0);
+        assertTrue(backgroundPadding.bottom != 0);
+
+        // The XML defines android:paddingTop="0dp" and that should be the resulting padding
+        assertEquals(backgroundPadding.left, view.getPaddingLeft());
+        assertEquals(0, view.getPaddingTop());
+        assertEquals(backgroundPadding.right, view.getPaddingRight());
+        assertEquals(backgroundPadding.bottom, view.getPaddingBottom());
+
+        // BOTTOM case
+        view = (MockView) mActivity.findViewById(R.id.mock_view_padding_bottom);
+        background = view.getBackground();
+        backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a non null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left != 0);
+        assertTrue(backgroundPadding.right != 0);
+        assertTrue(backgroundPadding.top != 0);
+        assertTrue(backgroundPadding.bottom != 0);
+
+        // The XML defines android:paddingBottom="0dp" and that should be the resulting padding
+        assertEquals(backgroundPadding.left, view.getPaddingLeft());
+        assertEquals(backgroundPadding.top, view.getPaddingTop());
+        assertEquals(backgroundPadding.right, view.getPaddingRight());
+        assertEquals(0, view.getPaddingBottom());
+
+        // Case for interleaved background/padding changes
+        view = (MockView) mActivity.findViewById(R.id.mock_view_padding_runtime_updated);
+        background = view.getBackground();
+        backgroundPadding = new Rect();
+        background.getPadding(backgroundPadding);
+
+        // There is some background with a null padding
+        assertNotNull(background);
+        assertTrue(backgroundPadding.left == 0);
+        assertTrue(backgroundPadding.right == 0);
+        assertTrue(backgroundPadding.top == 0);
+        assertTrue(backgroundPadding.bottom == 0);
+
+        final int paddingLeft = view.getPaddingLeft();
+        final int paddingRight = view.getPaddingRight();
+        final int paddingTop = view.getPaddingTop();
+        final int paddingBottom = view.getPaddingBottom();
+        assertEquals(8, paddingLeft);
+        assertEquals(0, paddingTop);
+        assertEquals(8, paddingRight);
+        assertEquals(0, paddingBottom);
+
+        // Manipulate background and padding
+        background.setState(view.getDrawableState());
+        background.jumpToCurrentState();
+        view.setBackground(background);
+        view.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
+
+        assertEquals(8, view.getPaddingLeft());
+        assertEquals(0, view.getPaddingTop());
+        assertEquals(8, view.getPaddingRight());
+        assertEquals(0, view.getPaddingBottom());
+    }
+
     public void testGetWindowVisibleDisplayFrame() {
         Rect outRect = new Rect();
         View view = new View(mActivity);
@@ -3161,6 +3287,57 @@
         });
     }
 
+    public void testFilterTouchesWhenObscured() throws Throwable {
+        OnTouchListenerImpl touchListener = new OnTouchListenerImpl();
+        View view = new View(mActivity);
+        view.setOnTouchListener(touchListener);
+
+        MotionEvent.PointerProperties[] props = new MotionEvent.PointerProperties[] {
+                new MotionEvent.PointerProperties()
+        };
+        MotionEvent.PointerCoords[] coords = new MotionEvent.PointerCoords[] {
+                new MotionEvent.PointerCoords()
+        };
+        MotionEvent obscuredTouch = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN,
+                1, props, coords, 0, 0, 0, 0, -1, 0, InputDevice.SOURCE_TOUCHSCREEN,
+                MotionEvent.FLAG_WINDOW_IS_OBSCURED);
+        MotionEvent unobscuredTouch = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN,
+                1, props, coords, 0, 0, 0, 0, -1, 0, InputDevice.SOURCE_TOUCHSCREEN,
+                0);
+
+        // Initially filter touches is false so all touches are dispatched.
+        assertFalse(view.getFilterTouchesWhenObscured());
+
+        view.dispatchTouchEvent(unobscuredTouch);
+        assertTrue(touchListener.hasOnTouch());
+        touchListener.reset();
+        view.dispatchTouchEvent(obscuredTouch);
+        assertTrue(touchListener.hasOnTouch());
+        touchListener.reset();
+
+        // Set filter touches to true so only unobscured touches are dispatched.
+        view.setFilterTouchesWhenObscured(true);
+        assertTrue(view.getFilterTouchesWhenObscured());
+
+        view.dispatchTouchEvent(unobscuredTouch);
+        assertTrue(touchListener.hasOnTouch());
+        touchListener.reset();
+        view.dispatchTouchEvent(obscuredTouch);
+        assertFalse(touchListener.hasOnTouch());
+        touchListener.reset();
+
+        // Set filter touches to false so all touches are dispatched.
+        view.setFilterTouchesWhenObscured(false);
+        assertFalse(view.getFilterTouchesWhenObscured());
+
+        view.dispatchTouchEvent(unobscuredTouch);
+        assertTrue(touchListener.hasOnTouch());
+        touchListener.reset();
+        view.dispatchTouchEvent(obscuredTouch);
+        assertTrue(touchListener.hasOnTouch());
+        touchListener.reset();
+    }
+
     private static class MockEditText extends EditText {
         private boolean mCalledCheckInputConnectionProxy = false;
         private boolean mCalledOnCreateInputConnection = false;
@@ -3393,7 +3570,8 @@
         }
 
         @Override
-        public void childAccessibilityStateChanged(View child) {
+        public void notifySubtreeAccessibilityStateChanged(View child,
+            View source, int changeType) {
 
         }
     }
diff --git a/tests/tests/view/src/android/view/cts/WindowTest.java b/tests/tests/view/src/android/view/cts/WindowTest.java
old mode 100755
new mode 100644
index 8f45f5c..7e147ab
--- a/tests/tests/view/src/android/view/cts/WindowTest.java
+++ b/tests/tests/view/src/android/view/cts/WindowTest.java
@@ -18,37 +18,52 @@
 
 import com.android.cts.stub.R;
 
-
 import android.app.Instrumentation;
+import android.app.Presentation;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.TypedArray;
+import android.cts.util.PollingCheck;
 import android.graphics.Color;
 import android.graphics.PixelFormat;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.VirtualDisplay;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.DisplayMetrics;
+import android.util.Log;
 import android.view.ActionMode;
+import android.view.Display;
 import android.view.Gravity;
+import android.view.InputDevice;
 import android.view.InputQueue;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MotionEvent;
+import android.view.Surface;
 import android.view.SurfaceHolder;
+import android.view.SurfaceView;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
+import android.widget.Button;
 import android.widget.TextView;
 
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
 public class WindowTest extends ActivityInstrumentationTestCase2<WindowStubActivity> {
+    static final String TAG = "WindowTest";
     private Window mWindow;
     private Context mContext;
     private Instrumentation mInstrumentation;
@@ -57,6 +72,10 @@
     private static final int VIEWGROUP_LAYOUT_HEIGHT = 100;
     private static final int VIEWGROUP_LAYOUT_WIDTH = 200;
 
+    // for testing setLocalFocus
+    private ProjectedPresentation mPresentation;
+    private VirtualDisplay mVirtualDisplay;
+
     public WindowTest() {
         super("com.android.cts.stub", WindowStubActivity.class);
     }
@@ -629,6 +648,189 @@
         // No way to test protected final method
     }
 
+    /**
+     * Test setLocalFocus together with injectInputEvent.
+     */
+    public void testSetLocalFocus() throws Throwable {
+        final SurfaceView surfaceView = new SurfaceView(mContext);
+        final Semaphore waitingSemaphore = new Semaphore(0);
+        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {
+            }
+
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+                destroyPresentation();
+                createPresentation(holder.getSurface(), width, height);
+                waitingSemaphore.release();
+            }
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {
+                destroyPresentation();
+            }
+          });
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mWindow.setContentView(surfaceView);
+            }
+        });
+        assertTrue(waitingSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+        assertNotNull(mVirtualDisplay);
+        assertNotNull(mPresentation);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return (mPresentation.button1 != null) && (mPresentation.button2 != null) &&
+                        (mPresentation.button3 != null) && mPresentation.ready;
+            }
+        }.run();
+        assertTrue(mPresentation.button1.isFocusable() && mPresentation.button2.isFocusable() &&
+                mPresentation.button3.isFocusable());
+        // currently it is only for debugging
+        View.OnFocusChangeListener listener = new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                Log.d(TAG, "view " + v + " focus " + hasFocus);
+            }
+        };
+
+        // check key event focus
+        mPresentation.button1.setOnFocusChangeListener(listener);
+        mPresentation.button2.setOnFocusChangeListener(listener);
+        mPresentation.button3.setOnFocusChangeListener(listener);
+        final Window presentationWindow = mPresentation.getWindow();
+        presentationWindow.setLocalFocus(true, false);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mPresentation.button1.hasWindowFocus();
+            }
+        }.run();
+        checkPresentationButtonFocus(true, false, false);
+        assertFalse(mPresentation.button1.isInTouchMode());
+        injectKeyEvent(presentationWindow, KeyEvent.KEYCODE_TAB);
+        checkPresentationButtonFocus(false, true, false);
+        injectKeyEvent(presentationWindow, KeyEvent.KEYCODE_TAB);
+        checkPresentationButtonFocus(false, false, true);
+
+        // check touch input injection
+        presentationWindow.setLocalFocus(true, true);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mPresentation.button1.isInTouchMode();
+            }
+        }.run();
+        View.OnClickListener clickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Log.d(TAG, "onClick " + v);
+                if (v == mPresentation.button1) {
+                    waitingSemaphore.release();
+                }
+            }
+        };
+        mPresentation.button1.setOnClickListener(clickListener);
+        mPresentation.button2.setOnClickListener(clickListener);
+        mPresentation.button3.setOnClickListener(clickListener);
+        injectTouchEvent(presentationWindow, mPresentation.button1.getX() +
+                mPresentation.button1.getWidth() / 2,
+                mPresentation.button1.getY() + mPresentation.button1.getHeight() / 2);
+        assertTrue(waitingSemaphore.tryAcquire(5, TimeUnit.SECONDS));
+
+        destroyPresentation();
+    }
+
+    private void checkPresentationButtonFocus(final boolean button1Focused,
+            final boolean button2Focused, final boolean button3Focused) {
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return (mPresentation.button1.isFocused() == button1Focused) &&
+                        (mPresentation.button2.isFocused() == button2Focused) &&
+                        (mPresentation.button3.isFocused() == button3Focused);
+            }
+        }.run();
+    }
+
+    private void injectKeyEvent(Window window, int keyCode) {
+        KeyEvent downEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
+        window.injectInputEvent(downEvent);
+        KeyEvent upEvent = new KeyEvent(KeyEvent.ACTION_UP, keyCode);
+        window.injectInputEvent(upEvent);
+    }
+
+    private void injectTouchEvent(Window window, float x, float y) {
+        Log.d(TAG, "injectTouchEvent " + x + "," + y);
+        long downTime = SystemClock.uptimeMillis();
+        MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,
+                x, y, 0);
+        downEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+        window.injectInputEvent(downEvent);
+        long upTime = SystemClock.uptimeMillis();
+        MotionEvent upEvent = MotionEvent.obtain(downTime, upTime, MotionEvent.ACTION_UP,
+                x, y, 0);
+        upEvent.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+        window.injectInputEvent(upEvent);
+    }
+
+    private void createPresentation(final Surface surface, final int width,
+            final int height) {
+        Context context = getInstrumentation().getTargetContext();
+        DisplayManager displayManager =
+                (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
+        mVirtualDisplay = displayManager.createVirtualDisplay("localFocusTest",
+                width, height, 300, surface, 0);
+        mPresentation = new ProjectedPresentation(
+                context, mVirtualDisplay.getDisplay());
+        mPresentation.show();
+    }
+
+    private void destroyPresentation() {
+        if (mPresentation != null) {
+            mPresentation.dismiss();
+        }
+        if (mVirtualDisplay != null) {
+            mVirtualDisplay.release();
+        }
+    }
+
+    private class ProjectedPresentation extends Presentation {
+        public Button button1 = null;
+        public Button button2 = null;
+        public Button button3 = null;
+        public volatile boolean ready = false;
+
+        public ProjectedPresentation(Context outerContext, Display display) {
+            super(outerContext, display);
+            getWindow().setType(WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE);
+        }
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setContentView(R.layout.windowstub_presentation);
+            button1 = (Button) findViewById(R.id.presentation_button1);
+            button2 = (Button) findViewById(R.id.presentation_button2);
+            button3 = (Button) findViewById(R.id.presentation_button3);
+        }
+
+        @Override
+        public void show() {
+            super.show();
+            new Handler().post(new Runnable() {
+
+                @Override
+                public void run() {
+                    ready = true;
+                }
+            });
+        }
+    }
+
     public class MockWindow extends Window {
         public boolean mIsOnConfigurationChangedCalled = false;
         public boolean mIsOnActiveCalled = false;
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java b/tests/tests/view/src/android/view/inputmethod/cts/BaseInputConnectionTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
index 722c1b3..9f92d23 100644
--- a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
+++ b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodInfoTest.java
@@ -17,20 +17,27 @@
 package android.view.inputmethod.cts;
 
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
 import android.os.Parcel;
 import android.test.AndroidTestCase;
 import android.util.Printer;
 import android.view.inputmethod.InputMethod;
 import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
 import org.xmlpull.v1.XmlPullParserException;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
 
 public class InputMethodInfoTest extends AndroidTestCase {
@@ -187,7 +194,46 @@
                 subtype.overridesImplicitlyEnabledSubtype());
     }
 
+    public void testInputMethodSubtypesOfSystemImes() {
+        final InputMethodManager imm = (InputMethodManager) mContext
+                .getSystemService(Context.INPUT_METHOD_SERVICE);
+        final List<InputMethodInfo> imis = imm.getInputMethodList();
+        final ArrayList<String> localeList = new ArrayList<String>(Arrays.asList(
+                Resources.getSystem().getAssets().getLocales()));
+        boolean foundEnabledSystemImeSubtypeWithValidLanguage = false;
+        for (InputMethodInfo imi : imis) {
+            if ((imi.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+                continue;
+            }
+            final int subtypeCount = imi.getSubtypeCount();
+            // System IME must have one subtype at least.
+            assertTrue(subtypeCount > 0);
+            if (foundEnabledSystemImeSubtypeWithValidLanguage) {
+                continue;
+            }
+            final List<InputMethodSubtype> enabledSubtypes =
+                    imm.getEnabledInputMethodSubtypeList(imi, true);
+            SUBTYPE_LOOP:
+            for (InputMethodSubtype subtype : enabledSubtypes) {
+                final String subtypeLocale = subtype.getLocale();
+                if (subtypeLocale.length() < 2) {
+                    continue;
+                }
+                // TODO: Detect language more strictly.
+                final String subtypeLanguage = subtypeLocale.substring(0, 2);
+                for (final String locale : localeList) {
+                    if (locale.startsWith(subtypeLanguage)) {
+                        foundEnabledSystemImeSubtypeWithValidLanguage = true;
+                        break SUBTYPE_LOOP;
+                    }
+                }
+            }
+        }
+        assertTrue(foundEnabledSystemImeSubtypeWithValidLanguage);
+    }
+
     class MockPrinter implements Printer {
+        @Override
         public void println(String x) {
         }
     }
diff --git a/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java b/tests/tests/view/src/android/view/inputmethod/cts/InputMethodManagerTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/webkit/AndroidManifest.xml b/tests/tests/webkit/AndroidManifest.xml
index 493762e..f4424a8 100644
--- a/tests/tests/webkit/AndroidManifest.xml
+++ b/tests/tests/webkit/AndroidManifest.xml
@@ -22,6 +22,9 @@
     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
     <application>
+        <provider android:name="android.webkit.cts.MockContentProvider"
+                  android:exported="true"
+                  android:authorities="android.webkit.cts.MockContentProvider" />
         <uses-library android:name="android.test.runner" />
     </application>
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java b/tests/tests/webkit/src/android/webkit/cts/CookieManagerTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
index 820bc79..016d7c2 100644
--- a/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/GeolocationTest.java
@@ -43,6 +43,7 @@
 import java.io.UnsupportedEncodingException;
 import java.util.concurrent.Callable;
 import java.util.Date;
+import java.util.List;
 import java.util.Random;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -64,7 +65,7 @@
 
     private static final String JS_INTERFACE_NAME = "Android";
     private static final int POLLING_TIMEOUT = 60 * 1000;
-    private static final String PROVIDER_NAME = LocationManager.NETWORK_PROVIDER;
+    private static final int LOCATION_THREAD_UPDATE_WAIT_MS = 250;
 
     // static HTML page always injected instead of the url loaded
     private static final String RAW_HTML =
@@ -102,6 +103,9 @@
     private JavascriptStatusReceiver mJavascriptStatusReceiver;
     private LocationManager mLocationManager;
     private WebViewOnUiThread mOnUiThread;
+    private Thread mLocationUpdateThread;
+    private volatile boolean mLocationUpdateThreadExitRequested;
+    private List<String> mProviders;
 
     public GeolocationTest() throws Exception {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -151,36 +155,102 @@
         mLocationManager = (LocationManager)getActivity().getApplicationContext()
                 .getSystemService(Context.LOCATION_SERVICE);
         // Add a test provider before each test to inject a location
-        addTestProvider(PROVIDER_NAME);
+        mProviders = mLocationManager.getAllProviders();
+        for (String provider : mProviders) {
+            // Can't mock passive provider.
+            if (provider.equals(LocationManager.PASSIVE_PROVIDER)) {
+                mProviders.remove(provider);
+                break;
+            }
+        }
+        addTestProviders();
     }
 
     @Override
     protected void tearDown() throws Exception {
+        stopUpdateLocationThread();
         // Remove the test provider after each test
-        try {
-          mLocationManager.removeTestProvider(PROVIDER_NAME);
-        } catch (IllegalArgumentException e) {} // Not much to do about this
+        for (String provider : mProviders) {
+            try {
+                // Work around b/11446702 by clearing the test provider before removing it
+                mLocationManager.clearTestProviderEnabled(provider);
+                mLocationManager.removeTestProvider(provider);
+            } catch (IllegalArgumentException e) {} // Not much to do about this
+        }
         mOnUiThread.cleanUp();
         // This will null all member and static variables
         super.tearDown();
     }
 
+    private void addTestProviders() {
+        for (String providerName : mProviders) {
+            LocationProvider provider = mLocationManager.getProvider(providerName);
+            mLocationManager.addTestProvider(provider.getName(),
+                    provider.requiresNetwork(), //requiresNetwork,
+                    provider.requiresSatellite(), // requiresSatellite,
+                    provider.requiresCell(),  // requiresCell,
+                    provider.hasMonetaryCost(), // hasMonetaryCost,
+                    provider.supportsAltitude(), // supportsAltitude,
+                    provider.supportsSpeed(), // supportsSpeed,
+                    provider.supportsBearing(), // supportsBearing,
+                    provider.getPowerRequirement(), // powerRequirement
+                    provider.getAccuracy()); // accuracy
+            mLocationManager.setTestProviderEnabled(provider.getName(), true);
+        }
+    }
+
+    private void startUpdateLocationThread() {
+        // Only start the thread once
+        if (mLocationUpdateThread == null) {
+            mLocationUpdateThreadExitRequested = false;
+            mLocationUpdateThread = new Thread() {
+                @Override
+                public void run() {
+                    while (!mLocationUpdateThreadExitRequested) {
+                        try {
+                            Thread.sleep(LOCATION_THREAD_UPDATE_WAIT_MS);
+                        } catch(Exception e) {
+                            // Do nothing, an extra update is no problem
+                        }
+                        updateLocation();
+                    }
+                }
+            };
+            mLocationUpdateThread.start();
+        }
+    }
+
+    private void stopUpdateLocationThread() {
+        // Only stop the thread if it was started
+        if (mLocationUpdateThread != null) {
+            mLocationUpdateThreadExitRequested = true;
+            try {
+                mLocationUpdateThread.join();
+            } catch (InterruptedException e) {
+                // Do nothing
+            }
+            mLocationUpdateThread = null;
+        }
+    }
+
     // Update location with a fixed latitude and longtitude, sets the time to the current time.
-    private void updateLocation(final String providerName) {
-        Location location = new Location(providerName);
-        location.setLatitude(40);
-        location.setLongitude(40);
-        location.setAccuracy(1.0f);
-        location.setTime(java.lang.System.currentTimeMillis());
-        location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
-        mLocationManager.setTestProviderLocation(providerName, location);
+    private void updateLocation() {
+        for (int i = 0; i < mProviders.size(); i++) {
+            Location location = new Location(mProviders.get(i));
+            location.setLatitude(40);
+            location.setLongitude(40);
+            location.setAccuracy(1.0f);
+            location.setTime(java.lang.System.currentTimeMillis());
+            location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
+            mLocationManager.setTestProviderLocation(mProviders.get(i), location);
+        }
     }
 
     // Need to set the location just after loading the url. Setting it after each load instead of
     // using a maximum age.
     private void loadUrlAndUpdateLocation(String url) {
         mOnUiThread.loadUrlAndWaitForCompletion(url);
-        updateLocation(PROVIDER_NAME);
+        startUpdateLocationThread();
     }
 
     // WebChromeClient that accepts each location for one load. WebChromeClient is used in
@@ -206,20 +276,6 @@
         }
     }
 
-    private void addTestProvider(final String providerName) {
-        mLocationManager.addTestProvider(providerName,
-                true, //requiresNetwork,
-                false, // requiresSatellite,
-                true,  // requiresCell,
-                false, // hasMonetaryCost,
-                false, // supportsAltitude,
-                false, // supportsSpeed,
-                false, // supportsBearing,
-                Criteria.POWER_MEDIUM, // powerRequirement
-                Criteria.ACCURACY_FINE); // accuracy
-        mLocationManager.setTestProviderEnabled(providerName, true);
-    }
-
     // Test loading a page and accepting the domain for one load
     public void testSimpleGeolocationRequestAcceptOnce() throws Exception {
         final TestSimpleGeolocationRequestWebChromeClient chromeClientAcceptOnce =
@@ -430,7 +486,7 @@
         final TestSimpleGeolocationRequestWebChromeClient chromeClientRejectOnce =
                 new TestSimpleGeolocationRequestWebChromeClient(mOnUiThread, false, false);
         mOnUiThread.setWebChromeClient(chromeClientRejectOnce);
-        // Load url once, and the callback should accept the domain for all future loads
+        // Load url once, and the callback should reject it once
         mOnUiThread.loadUrlAndWaitForCompletion(URL_1);
         Callable<Boolean> receivedRequest = new Callable<Boolean>() {
             @Override
@@ -445,11 +501,12 @@
                 return mJavascriptStatusReceiver.mDenied;
             }
         };
-        PollingCheck.check("JS didn't get position", POLLING_TIMEOUT, locationDenied);
+        PollingCheck.check("JS got position", POLLING_TIMEOUT, locationDenied);
         // Same result should happen on next run
+        chromeClientRejectOnce.mReceivedRequest = false;
         mOnUiThread.loadUrlAndWaitForCompletion(URL_1);
         PollingCheck.check("Geolocation prompt not called", POLLING_TIMEOUT, receivedRequest);
-        PollingCheck.check("JS didn't get position", POLLING_TIMEOUT, locationDenied);
+        PollingCheck.check("JS got position", POLLING_TIMEOUT, locationDenied);
 
         // Try to reject forever
         final TestSimpleGeolocationRequestWebChromeClient chromeClientRejectAlways =
diff --git a/tests/tests/webkit/src/android/webkit/cts/MockContentProvider.java b/tests/tests/webkit/src/android/webkit/cts/MockContentProvider.java
new file mode 100644
index 0000000..b9f3891
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/MockContentProvider.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2013 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 android.webkit.cts;
+
+import android.content.ContentProvider;
+import android.content.ContentProvider.PipeDataWriter;
+import android.content.ContentValues;
+import android.content.res.AssetFileDescriptor;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+
+public class MockContentProvider extends ContentProvider
+        implements PipeDataWriter<String> {
+
+    public static final String AUTHORITY = MockContentProvider.class.getName();
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        return "text/html";
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues initialValues) {
+        return null;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection,
+            String[] selectionArgs, String sortOrder) {
+        return null;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection,
+            String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public AssetFileDescriptor openAssetFile(Uri uri, String mode)
+            throws FileNotFoundException {
+        return new AssetFileDescriptor(openPipeHelper(uri, "text/html", null,
+                "<html><title>" + uri.toString() + "</title></html>", this), 0,
+                AssetFileDescriptor.UNKNOWN_LENGTH);
+    }
+
+    @Override
+    public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String mimeType, Bundle opts,
+            String args) {
+        FileOutputStream outputStream = new FileOutputStream(output.getFileDescriptor());
+        PrintWriter printWriter = null;
+        try {
+            printWriter = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
+            printWriter.print(args);
+        } catch (UnsupportedEncodingException e) {
+        } finally {
+            if (printWriter != null) {
+                printWriter.flush();
+            }
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+            }
+        }
+    }
+}
+
diff --git a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
index 47ec475..11cc1a5 100644
--- a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
+++ b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
@@ -64,6 +64,7 @@
     public static final String IFRAME_ACCESS_URL = "webkit/test_iframeaccess.html";
     public static final String DATABASE_ACCESS_URL = "webkit/test_databaseaccess.html";
     public static final String STOP_LOADING_URL = "webkit/test_stop_loading.html";
+    public static final String BLANK_TAG_URL = "webkit/blank_tag.html";
 
     // Must match the title of the page at
     // android/frameworks/base/core/res/res/raw/loaderror.html
diff --git a/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java b/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java
deleted file mode 100644
index 005ede3..0000000
--- a/tests/tests/webkit/src/android/webkit/cts/UrlInterceptRegistryTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.webkit.cts;
-
-
-import android.test.AndroidTestCase;
-import android.webkit.PluginData;
-import android.webkit.UrlInterceptHandler;
-import android.webkit.UrlInterceptRegistry;
-import android.webkit.CacheManager.CacheResult;
-
-import java.util.Map;
-
-@SuppressWarnings("deprecation")
-public class UrlInterceptRegistryTest extends AndroidTestCase {
-    private int mService;
-
-    public void testRegisterHandler() {
-        UrlInterceptHandler handler1 = new MockUrlInterceptHandler();
-        UrlInterceptHandler handler2 = new MockUrlInterceptHandler();
-
-        assertFalse(UrlInterceptRegistry.unregisterHandler(handler1));
-
-        assertTrue(UrlInterceptRegistry.registerHandler(handler1));
-        assertFalse(UrlInterceptRegistry.registerHandler(handler1));
-        assertTrue(UrlInterceptRegistry.registerHandler(handler2));
-
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler1));
-        assertTrue(UrlInterceptRegistry.unregisterHandler(handler2));
-        assertFalse(UrlInterceptRegistry.unregisterHandler(handler1));
-    }
-
-    public void testGetSurrogate() {
-        mService = 0;
-
-        UrlInterceptHandler handler1 = new UrlInterceptHandler() {
-            public CacheResult service(String url, Map<String, String> headers) {
-                mService = 1;
-                return new CacheResult();
-            }
-
-            public PluginData getPluginData(String url,
-                    Map<String, String> headers) {
-                return null;
-            }
-        };
-        UrlInterceptHandler handler2 = new UrlInterceptHandler() {
-            public CacheResult service(String url, Map<String, String> headers) {
-                mService = 2;
-                return new CacheResult();
-            }
-
-            public PluginData getPluginData(String url,
-                    Map<String, String> headers) {
-                return null;
-            }
-        };
-        UrlInterceptHandler handler3 = new UrlInterceptHandler() {
-            public CacheResult service(String url, Map<String, String> headers) {
-                mService = 3;
-                return null;
-            }
-
-            public PluginData getPluginData(String url,
-                    Map<String, String> headers) {
-                return null;
-            }
-        };
-        UrlInterceptRegistry.registerHandler(handler1);
-        UrlInterceptRegistry.registerHandler(handler2);
-        UrlInterceptRegistry.registerHandler(handler3);
-
-        UrlInterceptRegistry.setUrlInterceptDisabled(true);
-        assertNull(UrlInterceptRegistry.getSurrogate(null, null));
-        assertNull(UrlInterceptRegistry.getPluginData(null, null));
-        // no handlers get called
-        assertEquals(mService, 0);
-
-        UrlInterceptRegistry.setUrlInterceptDisabled(false);
-        assertNotNull(UrlInterceptRegistry.getSurrogate(null, null));
-        // handler3 gets called first, but returns null, handler2 returns the surrogate
-        assertEquals(mService, 2);
-    }
-
-    private class MockUrlInterceptHandler implements UrlInterceptHandler {
-        public CacheResult service(String url, Map<String, String> headers) {
-            return null;
-        }
-
-        public PluginData getPluginData(String url, Map<String, String> headers) {
-            return null;
-        }
-    }
-}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
index 2a5044e..5c9c958 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebChromeClientTest.java
@@ -34,6 +34,8 @@
     private CtsTestServer mWebServer;
     private WebIconDatabase mIconDb;
     private WebViewOnUiThread mOnUiThread;
+    private boolean mBlockWindowCreationSync;
+    private boolean mBlockWindowCreationAsync;
 
     public WebChromeClientTest() {
         super(WebViewStubActivity.class);
@@ -122,7 +124,7 @@
         }.run();
     }
 
-    public void testWindows() throws Exception {
+    public void runWindowTest(boolean expectWindowClose) throws Exception {
         final MockWebChromeClient webChromeClient = new MockWebChromeClient();
         mOnUiThread.setWebChromeClient(webChromeClient);
 
@@ -144,12 +146,30 @@
                 return webChromeClient.hadOnCreateWindow();
             }
         }.run();
-        new PollingCheck(TEST_TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return webChromeClient.hadOnCloseWindow();
-            }
-        }.run();
+
+        if (expectWindowClose) {
+            new PollingCheck(TEST_TIMEOUT) {
+                @Override
+                protected boolean check() {
+                    return webChromeClient.hadOnCloseWindow();
+                }
+            }.run();
+        } else {
+            assertFalse(webChromeClient.hadOnCloseWindow());
+        }
+    }
+    public void testWindows() throws Exception {
+        runWindowTest(true);
+    }
+
+    public void testBlockWindowsSync() throws Exception {
+        mBlockWindowCreationSync = true;
+        runWindowTest(false);
+    }
+
+    public void testBlockWindowsAsync() throws Exception {
+        mBlockWindowCreationAsync = true;
+        runWindowTest(false);
     }
 
     public void testOnJsBeforeUnload() throws Exception {
@@ -380,16 +400,23 @@
         @Override
         public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture,
                 Message resultMsg) {
-            WebView childView = new WebView(getActivity());
-            final WebSettings settings = childView.getSettings();
-            settings.setJavaScriptEnabled(true);
-            childView.setWebChromeClient(this);
-            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
-            transport.setWebView(childView);
-            resultMsg.sendToTarget();
             mHadOnCreateWindow = true;
-            getActivity().addContentView(childView, new ViewGroup.LayoutParams(
-                    ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+            if (mBlockWindowCreationSync) {
+                return false;
+            }
+            WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
+            if (mBlockWindowCreationAsync) {
+                transport.setWebView(null);
+            } else {
+                WebView childView = new WebView(getActivity());
+                final WebSettings settings = childView.getSettings();
+                settings.setJavaScriptEnabled(true);
+                childView.setWebChromeClient(this);
+                transport.setWebView(childView);
+                getActivity().addContentView(childView, new ViewGroup.LayoutParams(
+                        ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+            }
+            resultMsg.sendToTarget();
             return true;
         }
 
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
index 2eb81fc..468430f 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
@@ -16,16 +16,35 @@
 
 package android.webkit.cts;
 
+import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.test.ActivityInstrumentationTestCase2;
 import android.webkit.WebBackForwardList;
+import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 import android.webkit.WebHistoryItem;
-
+import android.webkit.WebIconDatabase;
+import android.webkit.WebView;
 
 public class WebHistoryItemTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private final static long TEST_TIMEOUT = 10000;
     private CtsTestServer mWebServer;
     private WebViewOnUiThread mOnUiThread;
+    private WebIconDatabase mIconDb;
+
+    class WaitForIconClient extends WaitForProgressClient {
+        private boolean mReceivedIcon;
+
+        public WaitForIconClient(WebViewOnUiThread onUiThread) {
+            super(onUiThread);
+        }
+
+        @Override
+        public synchronized void onReceivedIcon(WebView webview, Bitmap icon) {
+            mReceivedIcon = true;
+        }
+
+        public synchronized boolean receivedIcon() { return mReceivedIcon; }
+    };
 
     public WebHistoryItemTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
@@ -43,14 +62,37 @@
         mOnUiThread.cleanUp();
         mWebServer.shutdown();
         super.tearDown();
+        if (mIconDb != null) {
+            mIconDb.removeAllIcons();
+            mIconDb.close();
+        }
     }
 
-    public void testWebHistoryItem() {
+    public void testWebHistoryItem() throws Throwable {
+        final WaitForIconClient waitForIconClient = new WaitForIconClient(mOnUiThread);
+        mOnUiThread.setWebChromeClient(waitForIconClient);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // getInstance must run on the UI thread
+                mIconDb = WebIconDatabase.getInstance();
+                String dbPath = getActivity().getFilesDir().toString() + "/icons";
+                mIconDb.open(dbPath);
+            }
+        });
+
         WebBackForwardList list = mOnUiThread.copyBackForwardList();
         assertEquals(0, list.getSize());
 
         String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         mOnUiThread.loadUrlAndWaitForCompletion(url);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return waitForIconClient.receivedIcon();
+            }
+        }.run();
+
         list = mOnUiThread.copyBackForwardList();
         assertEquals(1, list.getSize());
         WebHistoryItem item = list.getCurrentItem();
@@ -59,7 +101,7 @@
         assertEquals(url, item.getOriginalUrl());
         assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, item.getTitle());
         Bitmap icon = mOnUiThread.getFavicon();
-        assertEquals(icon, item.getFavicon());
+        assertTrue(icon.sameAs(item.getFavicon()));
 
         url = mWebServer.getAssetUrl(TestHtmlConstants.BR_TAG_URL);
         mOnUiThread.loadUrlAndWaitForCompletion(url);
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index b9c338b..6186a02 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -86,7 +86,8 @@
      * <p/>
      * Mozilla/5.0 (Linux;[ U;] Android <version>;[ <language>-<country>;]
      * [<devicemodel>;] Build/<buildID>) AppleWebKit/<major>.<minor> (KHTML, like Gecko)
-     * Version/<major>.<minor>[ Mobile] Safari/<major>.<minor>
+     * Version/<major>.<minor> Chrome/<major>.<minor>.<branch>.<build>[ Mobile]
+     * Safari/<major>.<minor>
      */
     public void testUserAgentString_default() {
         final String actualUserAgentString = mSettings.getUserAgentString();
@@ -94,7 +95,8 @@
         final String patternString =
                 "Mozilla/5\\.0 \\(Linux;( U;)? Android ([^;]+);( (\\w+)-(\\w+);)?" +
                 "\\s?(.*)\\sBuild/(.+)\\) AppleWebKit/(\\d+)\\.(\\d+) \\(KHTML, like Gecko\\) " +
-                "Version/\\d+\\.\\d+( Mobile)? Safari/(\\d+)\\.(\\d+)";
+                "Version/\\d+\\.\\d+ Chrome/\\d+\\.\\d+\\.\\d+\\.\\d+( Mobile)? " +
+                "Safari/(\\d+)\\.(\\d+)";
         // Groups used:
         //  1 - SSL encryption strength token " U;" (optional)
         //  2 - Android version
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 3353d50..f4df82a 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -16,12 +16,16 @@
 
 package android.webkit.cts;
 
+import android.cts.util.EvaluateJsResultPollingCheck;
 import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.os.Message;
 import android.test.ActivityInstrumentationTestCase2;
 import android.view.KeyEvent;
+import android.view.ViewGroup;
 import android.webkit.HttpAuthHandler;
+import android.webkit.ValueCallback;
+import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
@@ -30,6 +34,7 @@
 
 public class WebViewClientTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private static final long TEST_TIMEOUT = 5000;
+    private static final String TEST_URL = "http://foo.com/";
 
     private WebViewOnUiThread mOnUiThread;
     private CtsTestServer mWebServer;
@@ -60,9 +65,70 @@
         super.tearDown();
     }
 
+    // Verify that the shouldoverrideurlloading is false by default
+    public void testShouldOverrideUrlLoadingDefault() {
+        final WebViewClient webViewClient = new WebViewClient();
+        assertFalse(webViewClient.shouldOverrideUrlLoading(mOnUiThread.getWebView(), null));
+    }
+
+    // Verify shouldoverrideurlloading called on top level navigation
     public void testShouldOverrideUrlLoading() {
         final MockWebViewClient webViewClient = new MockWebViewClient();
-        assertFalse(webViewClient.shouldOverrideUrlLoading(mOnUiThread.getWebView(), null));
+        mOnUiThread.setWebViewClient(webViewClient);
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        String data = "<html><body>" +
+                "<a href=\"" + TEST_URL + "\" id=\"link\">new page</a>" +
+                "</body></html>";
+        mOnUiThread.loadDataAndWaitForCompletion(data, "text/html", null);
+        clickOnLinkUsingJs("link");
+        assertEquals(TEST_URL, webViewClient.getLastShouldOverrideUrl());
+    }
+
+    // Verify shouldoverrideurlloading called on webview called via onCreateWindow
+    public void testShouldOverrideUrlLoadingOnCreateWindow() throws Exception {
+        mWebServer = new CtsTestServer(getActivity());
+        // WebViewClient for main window
+        final MockWebViewClient mainWebViewClient = new MockWebViewClient();
+        // WebViewClient for child window
+        final MockWebViewClient childWebViewClient = new MockWebViewClient();
+        mOnUiThread.setWebViewClient(mainWebViewClient);
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        mOnUiThread.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
+        mOnUiThread.getSettings().setSupportMultipleWindows(true);
+        mOnUiThread.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public boolean onCreateWindow(
+                WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
+                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
+                WebView childWebView = new WebView(view.getContext());
+                childWebView.setWebViewClient(childWebViewClient);
+                childWebView.getSettings().setJavaScriptEnabled(true);
+                transport.setWebView(childWebView);
+                getActivity().addContentView(childWebView, new ViewGroup.LayoutParams(
+                            ViewGroup.LayoutParams.FILL_PARENT,
+                            ViewGroup.LayoutParams.WRAP_CONTENT));
+                resultMsg.sendToTarget();
+                return true;
+            }
+        });
+        mOnUiThread.loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.BLANK_TAG_URL));
+
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return childWebViewClient.hasOnPageFinishedCalled();
+            }
+        }.run();
+        assertEquals(mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL),
+                childWebViewClient.getLastShouldOverrideUrl());
+    }
+
+    private void clickOnLinkUsingJs(final String linkId) {
+        EvaluateJsResultPollingCheck jsResult = new EvaluateJsResultPollingCheck("null");
+        mOnUiThread.evaluateJavascript(
+                "document.getElementById('" + linkId + "').click();" +
+                "console.log('element with id [" + linkId + "] clicked');", jsResult);
+        jsResult.run();
     }
 
     public void testLoadPage() throws Exception {
@@ -192,11 +258,26 @@
     public void testOnScaleChanged() throws Throwable {
         final MockWebViewClient webViewClient = new MockWebViewClient();
         mOnUiThread.setWebViewClient(webViewClient);
+        mWebServer = new CtsTestServer(getActivity());
 
         assertFalse(webViewClient.hasOnScaleChangedCalled());
-        mOnUiThread.zoomIn();
-        getInstrumentation().waitForIdleSync();
-        assertTrue(webViewClient.hasOnScaleChangedCalled());
+        String url1 = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.canZoomIn();
+            }
+        }.run();
+
+        assertTrue(mOnUiThread.zoomIn());
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return webViewClient.hasOnScaleChangedCalled();
+            }
+        }.run();
     }
 
     private void requireLoadedPage() throws Throwable {
@@ -213,6 +294,7 @@
         private boolean mOnReceivedHttpAuthRequestCalled;
         private boolean mOnUnhandledKeyEventCalled;
         private boolean mOnScaleChangedCalled;
+        private String mLastShouldOverrideUrl;
 
         public MockWebViewClient() {
             super(mOnUiThread);
@@ -254,6 +336,10 @@
             return mOnScaleChangedCalled;
         }
 
+        public String getLastShouldOverrideUrl() {
+            return mLastShouldOverrideUrl;
+        }
+
         @Override
         public void onPageStarted(WebView view, String url, Bitmap favicon) {
             super.onPageStarted(view, url, favicon);
@@ -312,5 +398,11 @@
             super.onScaleChanged(view, oldScale, newScale);
             mOnScaleChangedCalled = true;
         }
+
+        @Override
+        public boolean shouldOverrideUrlLoading(WebView view, String url) {
+            mLastShouldOverrideUrl = url;
+            return false;
+        }
     }
 }
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
new file mode 100644
index 0000000..a7ee974
--- /dev/null
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewStartupTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 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 android.webkit.cts;
+
+
+import android.content.Context;
+import android.cts.util.PollingCheck;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.util.Log;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.WebView;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class WebViewStartupTest
+        extends ActivityInstrumentationTestCase2<WebViewStartupStubActivity> {
+
+    private static final int TEST_TIMEOUT = 5000;
+    private static final String TAG = "WebViewStartupTest";
+
+    private WebViewStartupStubActivity mActivity;
+
+    public WebViewStartupTest() {
+        super("com.android.cts.stub", WebViewStartupStubActivity.class);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        mActivity = getActivity();
+    }
+
+    @UiThreadTest
+    public void testCookieManagerBlockingUiThread() throws Throwable {
+        CtsTestServer server = new CtsTestServer(mActivity, false);
+        final String url = server.getCookieUrl("death.html");
+
+        Thread background = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                CookieSyncManager csm = CookieSyncManager.createInstance(mActivity);
+                CookieManager cookieManager = CookieManager.getInstance();
+
+                cookieManager.removeAllCookie();
+                cookieManager.setAcceptCookie(true);
+                cookieManager.setCookie(url, "count=41");
+                Log.i(TAG, "done setting cookie before creating webview");
+            }
+        });
+        background.start();
+        background.join();
+
+        // Now create WebView and test that setting the cookie beforehand really worked.
+        mActivity.createAndAttachWebView();
+        WebViewOnUiThread onUiThread = new WebViewOnUiThread(this, mActivity.getWebView());
+        onUiThread.loadUrlAndWaitForCompletion(url);
+        assertEquals("1|count=41", onUiThread.getTitle()); // outgoing cookie
+        CookieManager cookieManager = CookieManager.getInstance();
+        String cookie = cookieManager.getCookie(url);
+        assertNotNull(cookie);
+        final Pattern pat = Pattern.compile("count=(\\d+)");
+        Matcher m = pat.matcher(cookie);
+        assertTrue(m.matches());
+        assertEquals("42", m.group(1)); // value got incremented
+    }
+
+}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
old mode 100755
new mode 100644
index f0dcf51..75eb752
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -16,8 +16,10 @@
 
 package android.webkit.cts;
 
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.res.AssetManager;
+import android.cts.util.EvaluateJsResultPollingCheck;
 import android.cts.util.PollingCheck;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
@@ -30,12 +32,20 @@
 import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Bundle;
+import android.os.CancellationSignal;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.os.ParcelFileDescriptor;
 import android.os.StrictMode;
 import android.os.StrictMode.ThreadPolicy;
 import android.os.SystemClock;
+import android.print.PageRange;
+import android.print.PrintAttributes;
+import android.print.PrintDocumentAdapter;
+import android.print.PrintDocumentAdapter.LayoutResultCallback;
+import android.print.PrintDocumentAdapter.WriteResultCallback;
+import android.print.PrintDocumentInfo;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.UiThreadTest;
 import android.util.AttributeSet;
@@ -43,10 +53,13 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
 import android.webkit.ConsoleMessage;
+import android.webkit.CookieSyncManager;
 import android.webkit.DownloadListener;
 import android.webkit.JavascriptInterface;
 import android.webkit.SslErrorHandler;
+import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebIconDatabase;
@@ -60,17 +73,30 @@
 import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 import android.widget.LinearLayout;
 
-
 import junit.framework.Assert;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
 import java.util.Date;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+import java.util.HashMap;
+
+import org.apache.http.Header;
+import org.apache.http.HttpRequest;
 
 public class WebViewTest extends ActivityInstrumentationTestCase2<WebViewStubActivity> {
     private static final String LOGTAG = "WebViewTest";
     private static final int INITIAL_PROGRESS = 100;
     private static long TEST_TIMEOUT = 20000L;
+    private static final String X_REQUESTED_WITH = "X-Requested-With";
+    private static final String PRINTER_TEST_FILE = "print.pdf";
+    private static final String PDF_PREAMBLE = "%PDF-1";
+
     /**
      * This is the minimum number of milliseconds to wait for scrolling to
      * start. If no scrolling has started before this timeout then it is
@@ -151,6 +177,12 @@
     }
 
     @UiThreadTest
+    public void testCreatingWebViewCreatesCookieSyncManager() throws Exception {
+        new WebView(getActivity());
+        assertNotNull(CookieSyncManager.getInstance());
+    }
+
+    @UiThreadTest
     public void testFindAddress() {
         /*
          * Info about USPS
@@ -188,65 +220,88 @@
         mWebView.invokeZoomPicker();
     }
 
-    @UiThreadTest
-    public void testZoom() {
-        WebSettings settings = mWebView.getSettings();
+    public void testZoom() throws Throwable {
+        // Pinch zoom is not supported in wrap_content layouts.
+        mOnUiThread.setLayoutHeightToMatchParent();
+
+        final ScaleChangedWebViewClient webViewClient = new ScaleChangedWebViewClient();
+        mOnUiThread.setWebViewClient(webViewClient);
+
+        mWebServer = new CtsTestServer(getActivity());
+        mOnUiThread.loadUrlAndWaitForCompletion(
+                mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL));
+        pollingCheckForCanZoomIn();
+
+        WebSettings settings = mOnUiThread.getSettings();
         settings.setSupportZoom(false);
         assertFalse(settings.supportZoom());
-        float currScale = mWebView.getScale();
+        float currScale = mOnUiThread.getScale();
         float previousScale = currScale;
 
         // can zoom in or out although zoom support is disabled in web settings
-        assertTrue(mWebView.zoomIn());
-        currScale = mWebView.getScale();
+        assertTrue(mOnUiThread.zoomIn());
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
         assertTrue(currScale > previousScale);
 
-        // zoom in
-        assertTrue(mWebView.zoomOut());
+        assertTrue(mOnUiThread.zoomOut());
         previousScale = currScale;
-        currScale = mWebView.getScale();
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
         assertTrue(currScale < previousScale);
 
         // enable zoom support
         settings.setSupportZoom(true);
         assertTrue(settings.supportZoom());
-        currScale = mWebView.getScale();
+        previousScale = mOnUiThread.getScale();
 
-        assertTrue(mWebView.zoomIn());
-        previousScale = currScale;
-        currScale = mWebView.getScale();
+        assertTrue(mOnUiThread.zoomIn());
+        webViewClient.waitForScaleChanged();
+
+        currScale = mOnUiThread.getScale();
         assertTrue(currScale > previousScale);
 
         // zoom in until it reaches maximum scale
-        while (currScale > previousScale) {
-            mWebView.zoomIn();
+        while (mOnUiThread.zoomIn()) {
             previousScale = currScale;
-            currScale = mWebView.getScale();
+            webViewClient.waitForScaleChanged();
+            currScale = mOnUiThread.getScale();
+            assertTrue(currScale > previousScale);
         }
 
-        // can not zoom in further
-        assertFalse(mWebView.zoomIn());
         previousScale = currScale;
-        currScale = mWebView.getScale();
+        // can not zoom in further
+        assertFalse(mOnUiThread.zoomIn());
+        // We sleep to assert to the best of our ability
+        // that a scale change does *not* happen.
+        Thread.sleep(500);
+        currScale = mOnUiThread.getScale();
         assertEquals(currScale, previousScale);
 
         // zoom out
-        assertTrue(mWebView.zoomOut());
+        assertTrue(mOnUiThread.zoomOut());
         previousScale = currScale;
-        currScale = mWebView.getScale();
+        webViewClient.waitForScaleChanged();
+        currScale = mOnUiThread.getScale();
         assertTrue(currScale < previousScale);
 
         // zoom out until it reaches minimum scale
-        while (currScale < previousScale) {
-            mWebView.zoomOut();
+        while (mOnUiThread.zoomOut()) {
             previousScale = currScale;
-            currScale = mWebView.getScale();
+            webViewClient.waitForScaleChanged();
+            currScale = mOnUiThread.getScale();
+            assertTrue(currScale < previousScale);
         }
 
-        // can not zoom out further
-        assertFalse(mWebView.zoomOut());
         previousScale = currScale;
-        currScale = mWebView.getScale();
+        assertFalse(mOnUiThread.zoomOut());
+
+        // We sleep to assert to the best of our ability
+        // that a scale change does *not* happen.
+        Thread.sleep(500);
+        currScale = mOnUiThread.getScale();
         assertEquals(currScale, previousScale);
     }
 
@@ -295,6 +350,64 @@
         assertEquals(url, mWebView.getUrl());
         assertEquals(url, mWebView.getOriginalUrl());
         assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, mWebView.getTitle());
+
+        // verify that the request also includes X-Requested-With header
+        HttpRequest request = mWebServer.getLastRequest(TestHtmlConstants.HELLO_WORLD_URL);
+        Header[] matchingHeaders = request.getHeaders(X_REQUESTED_WITH);
+        assertEquals(1, matchingHeaders.length);
+
+        Header header = matchingHeaders[0];
+        assertEquals(mWebView.getContext().getApplicationInfo().packageName, header.getValue());
+    }
+
+    @UiThreadTest
+    public void testLoadUrlDoesNotStripParamsWhenLoadingContentUrls() throws Exception {
+        Uri.Builder uriBuilder = new Uri.Builder().scheme(
+                ContentResolver.SCHEME_CONTENT).authority(MockContentProvider.AUTHORITY);
+        uriBuilder.appendPath("foo.html").appendQueryParameter("param","bar");
+        String url = uriBuilder.build().toString();
+        mOnUiThread.loadUrlAndWaitForCompletion(url);
+        // verify the parameter is not stripped.
+        Uri uri = Uri.parse(mWebView.getTitle());
+        assertEquals("bar", uri.getQueryParameter("param"));
+    }
+
+    @UiThreadTest
+    public void testAppInjectedXRequestedWithHeaderIsNotOverwritten() throws Exception {
+        startWebServer(false);
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        HashMap<String, String> map = new HashMap<String, String>();
+        final String requester = "foo";
+        map.put(X_REQUESTED_WITH, requester);
+        mOnUiThread.loadUrlAndWaitForCompletion(url, map);
+
+        // verify that the request also includes X-Requested-With header
+        // but is not overwritten by the webview
+        HttpRequest request = mWebServer.getLastRequest(TestHtmlConstants.HELLO_WORLD_URL);
+        Header[] matchingHeaders = request.getHeaders(X_REQUESTED_WITH);
+        assertEquals(1, matchingHeaders.length);
+
+        Header header = matchingHeaders[0];
+        assertEquals(requester, header.getValue());
+    }
+
+    @UiThreadTest
+    public void testAppCanInjectHeadersViaImmutableMap() throws Exception {
+        startWebServer(false);
+        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        HashMap<String, String> map = new HashMap<String, String>();
+        final String requester = "foo";
+        map.put(X_REQUESTED_WITH, requester);
+        mOnUiThread.loadUrlAndWaitForCompletion(url, Collections.unmodifiableMap(map));
+
+        // verify that the request also includes X-Requested-With header
+        // but is not overwritten by the webview
+        HttpRequest request = mWebServer.getLastRequest(TestHtmlConstants.HELLO_WORLD_URL);
+        Header[] matchingHeaders = request.getHeaders(X_REQUESTED_WITH);
+        assertEquals(1, matchingHeaders.length);
+
+        Header header = matchingHeaders[0];
+        assertEquals(requester, header.getValue());
     }
 
     @SuppressWarnings("deprecation")
@@ -553,51 +666,88 @@
         assertEquals("removedObject", resultObject.getResult());
     }
 
+    public void testJavascriptInterfaceCustomPropertiesClearedOnReload() throws Exception {
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+
+        class DummyJavaScriptInterface {
+        }
+        final DummyJavaScriptInterface obj = new DummyJavaScriptInterface();
+        mOnUiThread.addJavascriptInterface(obj, "dummy");
+        mOnUiThread.loadUrlAndWaitForCompletion("about:blank");
+
+        EvaluateJsResultPollingCheck jsResult;
+        jsResult = new EvaluateJsResultPollingCheck("42");
+        mOnUiThread.evaluateJavascript("dummy.custom_property = 42", jsResult);
+        jsResult.run();
+        jsResult = new EvaluateJsResultPollingCheck("true");
+        mOnUiThread.evaluateJavascript("'custom_property' in dummy", jsResult);
+        jsResult.run();
+
+        mOnUiThread.reload();
+
+        jsResult = new EvaluateJsResultPollingCheck("false");
+        mOnUiThread.evaluateJavascript("'custom_property' in dummy", jsResult);
+        jsResult.run();
+    }
+
+    private final class TestPictureListener implements PictureListener {
+        public int callCount;
+
+        @Override
+        public void onNewPicture(WebView view, Picture picture) {
+            // Need to inform the listener tracking new picture
+            // for the "page loaded" knowledge since it has been replaced.
+            mOnUiThread.onNewPicture();
+            this.callCount += 1;
+        }
+    }
+
+    private Picture waitForPictureToHaveColor(int color,
+            final TestPictureListener listener) throws Throwable {
+        final int MAX_ON_NEW_PICTURE_ITERATIONS = 5;
+        final AtomicReference<Picture> pictureRef = new AtomicReference<Picture>();
+        for (int i = 0; i < MAX_ON_NEW_PICTURE_ITERATIONS; i++) {
+            final int oldCallCount = listener.callCount;
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    pictureRef.set(mWebView.capturePicture());
+                }
+            });
+            if (isPictureFilledWithColor(pictureRef.get(), color))
+                break;
+            new PollingCheck(TEST_TIMEOUT) {
+                @Override
+                protected boolean check() {
+                    return listener.callCount > oldCallCount;
+                }
+            }.run();
+        }
+        return pictureRef.get();
+    }
+
     public void testCapturePicture() throws Exception, Throwable {
+        final TestPictureListener listener = new TestPictureListener();
+
         startWebServer(false);
         final String url = mWebServer.getAssetUrl(TestHtmlConstants.BLANK_PAGE_URL);
-        // showing the blank page will make the picture filled with background color
+        mOnUiThread.setPictureListener(listener);
+        // Showing the blank page will fill the picture with the background color.
         mOnUiThread.loadUrlAndWaitForCompletion(url);
-        getInstrumentation().waitForIdleSync();
-
-        class PictureRunnable implements Runnable {
-            private Picture mPicture;
-            @Override
-            public void run() {
-                mPicture = mWebView.capturePicture();
-                Bitmap b = Bitmap.createBitmap(mPicture.getWidth(), mPicture.getHeight(),
-                        Config.ARGB_8888);
-                mPicture.draw(new Canvas(b));
-                // default color is white
-                assertBitmapFillWithColor(b, Color.WHITE);
-
-                mWebView.setBackgroundColor(Color.CYAN);
-                mOnUiThread.reloadAndWaitForCompletion();
-            }
-            public Picture getPicture() {
-                return mPicture;
-            }
-        }
-        PictureRunnable runnable = new PictureRunnable();
-        runTestOnUiThread(runnable);
-        getInstrumentation().waitForIdleSync();
-
-        // the content of the picture will not be updated automatically
-        Picture picture = runnable.getPicture();
-        Bitmap b = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Config.ARGB_8888);
-        picture.draw(new Canvas(b));
-        assertBitmapFillWithColor(b, Color.WHITE);
+        // The default background color is white.
+        Picture oldPicture = waitForPictureToHaveColor(Color.WHITE, listener);
 
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
-                // update the content
-                Picture p = mWebView.capturePicture();
-                Bitmap b = Bitmap.createBitmap(p.getWidth(), p.getHeight(), Config.ARGB_8888);
-                p.draw(new Canvas(b));
-                assertBitmapFillWithColor(b, Color.CYAN);
+                mWebView.setBackgroundColor(Color.CYAN);
             }
         });
+        mOnUiThread.reloadAndWaitForCompletion();
+        waitForPictureToHaveColor(Color.CYAN, listener);
+
+        // The content of the previously captured picture will not be updated automatically.
+        assertTrue(isPictureFilledWithColor(oldPicture, Color.WHITE));
     }
 
     public void testSetPictureListener() throws Exception, Throwable {
@@ -752,6 +902,7 @@
         // Verify that the resource request makes it to the server.
         assertTrue(mWebServer.wasResourceRequested(imgUrl));
         assertEquals(historyUrl, mWebView.getUrl());
+        assertEquals(historyUrl, mWebView.getOriginalUrl());
 
         // Check that reported URL is "about:blank" when supplied history URL
         // is null.
@@ -761,6 +912,7 @@
                 "text/html", "UTF-8", null);
         assertTrue(mWebServer.wasResourceRequested(imgUrl));
         assertEquals("about:blank", mWebView.getUrl());
+        assertEquals("about:blank", mWebView.getOriginalUrl());
 
         // Test that JavaScript can access content from the same origin as the base URL.
         mWebView.getSettings().setJavaScriptEnabled(true);
@@ -779,16 +931,67 @@
                 historyUrl);
         assertTrue("URL: " + mWebView.getUrl(), mWebView.getUrl().indexOf("data:text/html") == 0);
         assertTrue("URL: " + mWebView.getUrl(), mWebView.getUrl().indexOf("bar") > 0);
+
+        // Check that when a non-data: base URL is used, we treat the String to load as
+        // a raw string and just dump it into the WebView, i.e. not decoding any URL entities.
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion("http://www.foo.com",
+                HTML_HEADER + "<title>Hello World%21</title><body>bar</body></html>",
+                "text/html", "UTF-8", null);
+        assertEquals("Hello World%21", mWebView.getTitle());
+
+        // Check that when a data: base URL is used, we treat the String to load as a data: URL
+        // and run load steps such as decoding URL entities (i.e., contrary to the test case
+        // above.)
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion("data:foo",
+                HTML_HEADER + "<title>Hello World%21</title></html>", "text/html", "UTF-8", null);
+        assertEquals("Hello World!", mWebView.getTitle());
+
+        // Check the method is null input safe.
+        mOnUiThread.loadDataWithBaseURLAndWaitForCompletion(null, null, null, null, null);
+        assertEquals("about:blank", mWebView.getUrl());
+        assertEquals("about:blank", mWebView.getOriginalUrl());
     }
 
-    @UiThreadTest
-    public void testFindAll() {
-        String p = "<p>Find all instances of find on the page and highlight them.</p>";
+    private static class WaitForFindResultsListener extends FutureTask<Integer>
+            implements WebView.FindListener {
+        public WaitForFindResultsListener() {
+            super(new Runnable() {
+                @Override
+                public void run() { }
+            }, null);
+        }
+
+        @Override
+        public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
+                boolean isDoneCounting) {
+            if (isDoneCounting) {
+                set(numberOfMatches);
+            }
+        }
+    }
+
+    public void testFindAll()  throws Throwable {
+        // Make the page scrollable, so we can detect the scrolling to make sure the
+        // content fully loaded.
+        mOnUiThread.setInitialScale(100);
+        DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
+        int dimension = Math.max(metrics.widthPixels, metrics.heightPixels);
+        // create a paragraph high enough to take up the entire screen
+        String p = "<p style=\"height:" + dimension + "px;\">" +
+                "Find all instances of find on the page and highlight them.</p>";
 
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "</body></html>", "text/html", null);
 
-        assertEquals(2, mWebView.findAll("find"));
+        WaitForFindResultsListener l = new WaitForFindResultsListener();
+        int previousScrollY = mOnUiThread.getScrollY();
+        mOnUiThread.pageDown(true);
+        // Wait for content fully loaded.
+        waitForScrollingComplete(previousScrollY);
+        mOnUiThread.setFindListener(l);
+        mOnUiThread.findAll("find");
+
+        assertEquals(2, l.get().intValue());
     }
 
     public void testFindNext() throws Throwable {
@@ -903,9 +1106,15 @@
                 "Scroll by half the size of the page.</p>";
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + p + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
 
-        assertTrue(mOnUiThread.pageDown(false));
+        // Wait for UI thread to settle and receive page dimentions from renderer
+        // such that we can invoke page down.
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                 return mOnUiThread.pageDown(false);
+            }
+        }.run();
 
         do {
             getInstrumentation().waitForIdleSync();
@@ -937,25 +1146,38 @@
     public void testGetContentHeight() throws Throwable {
         mOnUiThread.loadDataAndWaitForCompletion(
                 "<html><body></body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getScale() != 0 && mOnUiThread.getContentHeight() != 0
+                    && mOnUiThread.getHeight() != 0;
+            }
+        }.run();
+        assertEquals(mOnUiThread.getHeight(),
+                mOnUiThread.getContentHeight() * mOnUiThread.getScale(), 2f);
 
         final int pageHeight = 600;
         // set the margin to 0
         final String p = "<p style=\"height:" + pageHeight
                 + "px;margin:0px auto;\">Get the height of HTML content.</p>";
-        assertEquals(mOnUiThread.getHeight(), mOnUiThread.getContentHeight() * mOnUiThread.getScale(), 2f);
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getContentHeight() > pageHeight;
+            }
+        }.run();
 
-        assertTrue(mOnUiThread.getContentHeight() > pageHeight);
-        int extraSpace = mOnUiThread.getContentHeight() - pageHeight;
-
+        final int extraSpace = mOnUiThread.getContentHeight() - pageHeight;
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + p + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
-        assertEquals(pageHeight + pageHeight + extraSpace,
-                mOnUiThread.getContentHeight());
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return pageHeight + pageHeight + extraSpace == mOnUiThread.getContentHeight();
+            }
+        }.run();
     }
 
     @UiThreadTest
@@ -981,34 +1203,31 @@
 
     public void testFlingScroll() throws Throwable {
         DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
-        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+        final int dimension = 10 * Math.max(metrics.widthPixels, metrics.heightPixels);
         String p = "<p style=\"height:" + dimension + "px;" +
                 "width:" + dimension + "px\">Test fling scroll.</p>";
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "</body></html>", "text/html", null);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getContentHeight() >= dimension;
+            }
+        }.run();
         getInstrumentation().waitForIdleSync();
 
-        int previousScrollX = mOnUiThread.getScrollX();
-        int previousScrollY = mOnUiThread.getScrollY();
+        final int previousScrollX = mOnUiThread.getScrollX();
+        final int previousScrollY = mOnUiThread.getScrollY();
 
         mOnUiThread.flingScroll(100, 100);
 
-        int timeSlice = 500;
-        Thread.sleep(timeSlice);
-        assertTrue(mOnUiThread.getScrollX() > previousScrollX);
-        assertTrue(mOnUiThread.getScrollY() > previousScrollY);
-
-        previousScrollY = mOnUiThread.getScrollY();
-        previousScrollX = mOnUiThread.getScrollX();
-        Thread.sleep(timeSlice);
-        assertTrue(mOnUiThread.getScrollX() >= previousScrollX);
-        assertTrue(mOnUiThread.getScrollY() >= previousScrollY);
-
-        previousScrollY = mOnUiThread.getScrollY();
-        previousScrollX = mOnUiThread.getScrollX();
-        Thread.sleep(timeSlice);
-        assertTrue(mOnUiThread.getScrollX() >= previousScrollX);
-        assertTrue(mOnUiThread.getScrollY() >= previousScrollY);
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getScrollX() > previousScrollX &&
+                        mOnUiThread.getScrollY() > previousScrollY;
+            }
+        }.run();
     }
 
     public void testRequestFocusNodeHref() throws Throwable {
@@ -1230,31 +1449,47 @@
 
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
 
-        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return Math.abs(defaultScale - mOnUiThread.getScale()) < .01f;
+            }
+        }.run();
 
         mOnUiThread.setInitialScale(0);
         // modify content to fool WebKit into re-loading
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "2" + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
 
-        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return Math.abs(defaultScale - mOnUiThread.getScale()) < .01f;
+            }
+        }.run();
 
         mOnUiThread.setInitialScale(50);
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "3" + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
 
-        assertEquals(0.5f, mOnUiThread.getScale(), .02f);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return Math.abs(0.5 - mOnUiThread.getScale()) < .01f;
+            }
+        }.run();
 
         mOnUiThread.setInitialScale(0);
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "4" + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
 
-        assertEquals(defaultScale, mOnUiThread.getScale(), .01f);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return Math.abs(defaultScale - mOnUiThread.getScale()) < .01f;
+            }
+        }.run();
     }
 
     @UiThreadTest
@@ -1354,29 +1589,17 @@
     }
 
     public void testSetWebViewClient() throws Throwable {
-        final class MockWebViewClient extends WaitForLoadedClient {
-            private boolean mOnScaleChangedCalled = false;
-            public MockWebViewClient() {
-                super(mOnUiThread);
-            }
-            @Override
-            public void onScaleChanged(WebView view, float oldScale, float newScale) {
-                super.onScaleChanged(view, oldScale, newScale);
-                mOnScaleChangedCalled = true;
-            }
-            public boolean onScaleChangedCalled() {
-                return mOnScaleChangedCalled;
-            }
-        }
-
-        final MockWebViewClient webViewClient = new MockWebViewClient();
+        final ScaleChangedWebViewClient webViewClient = new ScaleChangedWebViewClient();
         mOnUiThread.setWebViewClient(webViewClient);
-        getInstrumentation().waitForIdleSync();
-        assertFalse(webViewClient.onScaleChangedCalled());
+        startWebServer(false);
 
-        mOnUiThread.zoomIn();
-        getInstrumentation().waitForIdleSync();
-        assertTrue(webViewClient.onScaleChangedCalled());
+        assertFalse(webViewClient.onScaleChangedCalled());
+        String url1 = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
+        mOnUiThread.loadUrlAndWaitForCompletion(url1);
+        pollingCheckForCanZoomIn();
+
+        assertTrue(mOnUiThread.zoomIn());
+        webViewClient.waitForScaleChanged();
     }
 
     @UiThreadTest
@@ -1578,17 +1801,20 @@
 
     public void testRequestChildRectangleOnScreen() throws Throwable {
         DisplayMetrics metrics = mOnUiThread.getDisplayMetrics();
-        int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
+        final int dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
         String p = "<p style=\"height:" + dimension + "px;width:" + dimension + "px\">&nbsp;</p>";
         mOnUiThread.loadDataAndWaitForCompletion("<html><body>" + p
                 + "</body></html>", "text/html", null);
-        getInstrumentation().waitForIdleSync();
+        new PollingCheck() {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getContentHeight() >= dimension;
+            }
+        }.run();
 
         int origX = mOnUiThread.getScrollX();
         int origY = mOnUiThread.getScrollY();
 
-        metrics = mOnUiThread.getDisplayMetrics();
-        dimension = 2 * Math.max(metrics.widthPixels, metrics.heightPixels);
         int half = dimension / 2;
         Rect rect = new Rect(half, half, half + 1, half + 1);
         assertTrue(mOnUiThread.requestChildRectangleOnScreen(mWebView, rect, true));
@@ -1628,9 +1854,13 @@
         // the WebView will load the new URL.
         mOnUiThread.setDownloadListener(listener);
         mOnUiThread.getSettings().setJavaScriptEnabled(true);
+
+        // See b/13675265 for discussion on why the setTimeout is necessary.
+        // Works around a Blink bug.
         mOnUiThread.loadDataAndWaitForCompletion(
-                "<html><body onload=\"window.location = \'" + url + "\'\"></body></html>",
-                "text/html", null);
+                "<html><body onload=\"setTimeout(" +
+                "function() { window.location = \'" + url + "\'; }, 100);\">" +
+                "</body></html>", "text/html", null);
         // Wait for layout to complete before setting focus.
         getInstrumentation().waitForIdleSync();
 
@@ -1802,6 +2032,110 @@
         assertEquals("anchor", mOnUiThread.getTitle());
     }
 
+    public void testEvaluateJavascript() {
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        mOnUiThread.loadUrlAndWaitForCompletion("about:blank");
+
+        EvaluateJsResultPollingCheck jsResult = new EvaluateJsResultPollingCheck("2");
+        mOnUiThread.evaluateJavascript("1+1", jsResult);
+        jsResult.run();
+
+        jsResult = new EvaluateJsResultPollingCheck("9");
+        mOnUiThread.evaluateJavascript("1+1; 4+5", jsResult);
+        jsResult.run();
+
+        final String EXPECTED_TITLE = "test";
+        mOnUiThread.evaluateJavascript("document.title='" + EXPECTED_TITLE + "';", null);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getTitle().equals(EXPECTED_TITLE);
+            }
+        }.run();
+    }
+
+    // Verify Print feature can create a PDF file with a correct preamble.
+    public void testPrinting() throws Throwable {
+        mOnUiThread.loadDataAndWaitForCompletion("<html><head></head>" +
+                "<body>foo</body></html>",
+                "text/html", null);
+        final PrintDocumentAdapter adapter =  mOnUiThread.createPrintDocumentAdapter();
+        printDocumentStart(adapter);
+        PrintAttributes attributes = new PrintAttributes.Builder()
+                .setMediaSize(PrintAttributes.MediaSize.ISO_A4)
+                .setResolution(new PrintAttributes.Resolution("foo", "bar", 300, 300))
+                .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
+                .build();
+        final WebViewStubActivity activity = getActivity();
+        final File file = activity.getFileStreamPath(PRINTER_TEST_FILE);
+        final ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(file,
+                ParcelFileDescriptor.parseMode("w"));
+        final FutureTask<Boolean> result =
+                new FutureTask<Boolean>(new Callable<Boolean>() {
+                            public Boolean call() {
+                                return true;
+                            }
+                        });
+        printDocumentLayout(adapter, null, attributes,
+                new LayoutResultCallback() {
+                    // Called on UI thread
+                    @Override
+                    public void onLayoutFinished(PrintDocumentInfo info, boolean changed) {
+                        savePrintedPage(adapter, descriptor, result);
+                    }
+                });
+        try {
+            result.get(TEST_TIMEOUT, TimeUnit.MILLISECONDS);
+            assertTrue(file.length() > 0);
+            FileInputStream in = new FileInputStream(file);
+            byte[] b = new byte[PDF_PREAMBLE.length()];
+            in.read(b);
+            String preamble = new String(b);
+            assertEquals(PDF_PREAMBLE, preamble);
+        } finally {
+            // close the descriptor, if not closed already.
+            descriptor.close();
+            file.delete();
+        }
+    }
+
+    private void savePrintedPage(final PrintDocumentAdapter adapter,
+            final ParcelFileDescriptor descriptor, final FutureTask<Boolean> result) {
+        adapter.onWrite(new PageRange[] {PageRange.ALL_PAGES}, descriptor,
+                new CancellationSignal(),
+                new WriteResultCallback() {
+                    @Override
+                    public void onWriteFinished(PageRange[] pages) {
+                        try {
+                            descriptor.close();
+                            result.run();
+                        } catch (IOException ex) {
+                            fail("Failed file operation: " + ex.toString());
+                        }
+                    }
+                });
+    }
+
+    private void printDocumentStart(final PrintDocumentAdapter adapter) {
+        mOnUiThread.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                adapter.onStart();
+            }
+        });
+    }
+
+    private void printDocumentLayout(final PrintDocumentAdapter adapter,
+            final PrintAttributes oldAttributes, final PrintAttributes newAttributes,
+            final LayoutResultCallback layoutResultCallback) {
+        mOnUiThread.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                adapter.onLayout(oldAttributes, newAttributes, new CancellationSignal(),
+                        layoutResultCallback, null);
+            }
+        });
+    }
 
     @UiThreadTest
     public void testInternals() {
@@ -1884,11 +2218,22 @@
         }
     }
 
-    private void assertBitmapFillWithColor(Bitmap bitmap, int color) {
-        for (int i = 0; i < bitmap.getWidth(); i ++)
+    private boolean isPictureFilledWithColor(Picture picture, int color) {
+        if (picture.getWidth() == 0 || picture.getHeight() == 0)
+            return false;
+
+        Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(),
+                Config.ARGB_8888);
+        picture.draw(new Canvas(bitmap));
+
+        for (int i = 0; i < bitmap.getWidth(); i ++) {
             for (int j = 0; j < bitmap.getHeight(); j ++) {
-                assertEquals(color, bitmap.getPixel(i, j));
+                if (color != bitmap.getPixel(i, j)) {
+                    return false;
+                }
             }
+        }
+        return true;
     }
 
     // Find b1 inside b2
@@ -1985,4 +2330,44 @@
             return mErrorUrl;
         }
     }
+
+    private void pollingCheckForCanZoomIn() {
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.canZoomIn();
+            }
+        }.run();
+    }
+
+    final class ScaleChangedWebViewClient extends WaitForLoadedClient {
+        private boolean mOnScaleChangedCalled = false;
+        public ScaleChangedWebViewClient() {
+            super(mOnUiThread);
+        }
+
+        @Override
+        public void onScaleChanged(WebView view, float oldScale, float newScale) {
+            super.onScaleChanged(view, oldScale, newScale);
+            synchronized (this) {
+                mOnScaleChangedCalled = true;
+            }
+        }
+
+        public void waitForScaleChanged() {
+            new PollingCheck(TEST_TIMEOUT) {
+                 @Override
+                 protected boolean check() {
+                     return onScaleChangedCalled();
+                 }
+            }.run();
+            synchronized (this) {
+                mOnScaleChangedCalled = false;
+            }
+        }
+
+        public synchronized boolean onScaleChangedCalled() {
+            return mOnScaleChangedCalled;
+        }
+    }
 }
diff --git a/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java b/tests/tests/widget/src/android/widget/cts/AdapterViewTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java b/tests/tests/widget/src/android/widget/cts/DialerFilterTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/widget/src/android/widget/cts/GridViewTest.java b/tests/tests/widget/src/android/widget/cts/GridViewTest.java
old mode 100755
new mode 100644
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index d2bd4f4..7af8c2e 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -44,6 +44,9 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import junit.framework.Assert;
@@ -745,4 +748,94 @@
             return new MockView(getContext());
         }
     }
+
+    public void testTransientStateUnstableIds() throws Exception {
+        final ListView listView = mListView;
+        final ArrayList<String> items = new ArrayList<String>(Arrays.asList(mCountryList));
+        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, items);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                listView.setAdapter(adapter);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View oldItem = listView.getChildAt(2);
+        final CharSequence oldText = ((TextView) oldItem.findViewById(android.R.id.text1))
+                .getText();
+        oldItem.setHasTransientState(true);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                adapter.remove(adapter.getItem(0));
+                adapter.notifyDataSetChanged();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View newItem = listView.getChildAt(2);
+        final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
+                .getText();
+
+        Assert.assertFalse(oldText.equals(newText));
+    }
+
+    public void testTransientStateStableIds() throws Exception {
+        final ListView listView = mListView;
+        final ArrayList<String> items = new ArrayList<String>(Arrays.asList(mCountryList));
+        final StableArrayAdapter<String> adapter = new StableArrayAdapter<String>(mActivity,
+                android.R.layout.simple_list_item_1, items);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                listView.setAdapter(adapter);
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final Object tag = new Object();
+        final View oldItem = listView.getChildAt(2);
+        final CharSequence oldText = ((TextView) oldItem.findViewById(android.R.id.text1))
+                .getText();
+        oldItem.setHasTransientState(true);
+        oldItem.setTag(tag);
+
+        mInstrumentation.runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                adapter.remove(adapter.getItem(0));
+                adapter.notifyDataSetChanged();
+            }
+        });
+        mInstrumentation.waitForIdleSync();
+
+        final View newItem = listView.getChildAt(1);
+        final CharSequence newText = ((TextView) newItem.findViewById(android.R.id.text1))
+                .getText();
+
+        Assert.assertTrue(newItem.hasTransientState());
+        Assert.assertEquals(oldText, newText);
+        Assert.assertEquals(tag, newItem.getTag());
+    }
+
+    private static class StableArrayAdapter<T> extends ArrayAdapter<T> {
+        public StableArrayAdapter(Context context, int resource, List<T> objects) {
+            super(context, resource, objects);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return getItem(position).hashCode();
+        }
+
+        @Override
+        public boolean hasStableIds() {
+            return true;
+        }
+    }
 }
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
old mode 100755
new mode 100644
index 905a0ee..36ace30
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -632,7 +632,8 @@
 
     public void testAccessPaintFlags() {
         mTextView = new TextView(mActivity);
-        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
+        assertEquals(Paint.DEV_KERN_TEXT_FLAG | Paint.EMBEDDED_BITMAP_TEXT_FLAG
+                | Paint.ANTI_ALIAS_FLAG, mTextView.getPaintFlags());
 
         mTextView.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG);
         assertEquals(Paint.UNDERLINE_TEXT_FLAG | Paint.FAKE_BOLD_TEXT_FLAG,
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
index d6abf9a..2109bbf 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/CtsApiCoverage.java
@@ -55,10 +55,12 @@
         System.out.println("directory and dexdeps must be built via \"make dexdeps\".");
         System.out.println();
         System.out.println("Options:");
-        System.out.println("  -o FILE              output file or standard out if not given");
-        System.out.println("  -f [txt|xml|html]    format of output");
-        System.out.println("  -d PATH              path to dexdeps or expected to be in $PATH");
-        System.out.println("  -a PATH              path to the API XML file");
+        System.out.println("  -o FILE                output file or standard out if not given");
+        System.out.println("  -f [txt|xml|html]      format of output");
+        System.out.println("  -d PATH                path to dexdeps or expected to be in $PATH");
+        System.out.println("  -a PATH                path to the API XML file");
+        System.out.println("  -p PACKAGENAMEPREFIX   report coverage only for package that start with");
+        System.out.println("  -t TITLE               report title");
         System.out.println();
         System.exit(1);
     }
@@ -69,6 +71,9 @@
         int format = FORMAT_TXT;
         String dexDeps = "dexDeps";
         String apiXmlPath = "";
+        // By default only care about packages starting with "android"
+        String packageFilter = "android";
+        String reportTitle = "CTS API Coverage";
 
         for (int i = 0; i < args.length; i++) {
             if (args[i].startsWith("-")) {
@@ -89,6 +94,10 @@
                     dexDeps = getExpectedArg(args, ++i);
                 } else if ("-a".equals(args[i])) {
                     apiXmlPath = getExpectedArg(args, ++i);
+                } else if ("-p".equals(args[i])) {
+                    packageFilter = getExpectedArg(args, ++i);
+                } else if ("-t".equals(args[i])) {
+                    reportTitle = getExpectedArg(args, ++i);
                 } else {
                     printUsage();
                 }
@@ -113,7 +122,7 @@
         for (File testApk : testApks) {
             addApiCoverage(apiCoverage, testApk, dexDeps);
         }
-        outputCoverageReport(apiCoverage, testApks, outputFile, format);
+        outputCoverageReport(apiCoverage, testApks, outputFile, format, packageFilter, reportTitle);
     }
 
     /** Get the argument or print out the usage and exit. */
@@ -172,8 +181,8 @@
     }
 
     private static void outputCoverageReport(ApiCoverage apiCoverage, List<File> testApks,
-            File outputFile, int format) throws IOException, TransformerException,
-                    InterruptedException {
+            File outputFile, int format, String packageFilter, String reportTitle)
+                throws IOException, TransformerException, InterruptedException {
 
         OutputStream out = outputFile != null
                 ? new FileOutputStream(outputFile)
@@ -182,15 +191,15 @@
         try {
             switch (format) {
                 case FORMAT_TXT:
-                    TextReport.printTextReport(apiCoverage, out);
+                    TextReport.printTextReport(apiCoverage, packageFilter, out);
                     break;
 
                 case FORMAT_XML:
-                    XmlReport.printXmlReport(testApks, apiCoverage, out);
+                    XmlReport.printXmlReport(testApks, apiCoverage, packageFilter, reportTitle, out);
                     break;
 
                 case FORMAT_HTML:
-                    HtmlReport.printHtmlReport(testApks, apiCoverage, out);
+                    HtmlReport.printHtmlReport(testApks, apiCoverage, packageFilter, reportTitle, out);
                     break;
             }
         } finally {
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
index 9243fe0..dfe609d 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/HtmlReport.java
@@ -37,14 +37,15 @@
 class HtmlReport {
 
     public static void printHtmlReport(final List<File> testApks, final ApiCoverage apiCoverage,
-            final OutputStream out) throws IOException, TransformerException {
+            final String packageFilter, final String reportTitle, final OutputStream out)
+                throws IOException, TransformerException {
         final PipedOutputStream xmlOut = new PipedOutputStream();
         final PipedInputStream xmlIn = new PipedInputStream(xmlOut);
 
         Thread t = new Thread(new Runnable() {
             @Override
             public void run() {
-                XmlReport.printXmlReport(testApks, apiCoverage, xmlOut);
+                XmlReport.printXmlReport(testApks, apiCoverage, packageFilter, reportTitle, xmlOut);
 
                 // Close the output stream to avoid "Write dead end" errors.
                 try {
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
index ebcefe5..23b44c3 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/TextReport.java
@@ -27,7 +27,7 @@
  */
 class TextReport {
 
-    public static void printTextReport(ApiCoverage api, OutputStream outputStream) {
+    public static void printTextReport(ApiCoverage api, String packageFilter, OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
 
         CoverageComparator comparator = new CoverageComparator();
@@ -35,7 +35,7 @@
         Collections.sort(packages, comparator);
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith("android")
+            if (apiPackage.getName().startsWith(packageFilter)
                     && apiPackage.getTotalMethods() > 0) {
                 printPackage(apiPackage, out);
             }
@@ -45,7 +45,7 @@
         out.println();
 
         for (ApiPackage apiPackage : packages) {
-            if (apiPackage.getName().startsWith("android")) {
+            if (apiPackage.getName().startsWith(packageFilter)) {
                 printPackage(apiPackage, out);
 
                 List<ApiClass> classes = new ArrayList<ApiClass>(apiPackage.getClasses());
diff --git a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
index e76343e..df10fa4 100644
--- a/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
+++ b/tools/cts-api-coverage/src/com/android/cts/apicoverage/XmlReport.java
@@ -32,14 +32,14 @@
 class XmlReport {
 
     public static void printXmlReport(List<File> testApks, ApiCoverage apiCoverage,
-            OutputStream outputStream) {
+            String packageFilter, String reportTitle, OutputStream outputStream) {
         PrintStream out = new PrintStream(outputStream);
         out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
         out.println("<?xml-stylesheet type=\"text/xsl\"  href=\"api-coverage.xsl\"?>");
 
         SimpleDateFormat format = new SimpleDateFormat("EEE, MMM d, yyyy h:mm a z");
         String date = format.format(new Date(System.currentTimeMillis()));
-        out.println("<api-coverage generatedTime=\"" + date + "\">");
+        out.println("<api-coverage generatedTime=\"" + date + "\" title=\"" + reportTitle +"\">");
 
         out.println("<debug>");
         out.println("<sources>");
@@ -57,8 +57,8 @@
         int totalMethods = 0;
         int totalCoveredMethods = 0;
         for (ApiPackage pkg : packages) {
-            if (pkg.getName().startsWith("android")
-                    && pkg.getTotalMethods() > 0) {
+            if (pkg.getName().startsWith(packageFilter)
+                   && pkg.getTotalMethods() > 0) {
                 int pkgTotal = pkg.getTotalMethods();
                 totalMethods += pkgTotal;
                 int pkgTotalCovered = pkg.getNumCoveredMethods();
diff --git a/tools/cts-api-coverage/src/res/api-coverage.xsl b/tools/cts-api-coverage/src/res/api-coverage.xsl
index 9cd4aeb..1ac3402 100644
--- a/tools/cts-api-coverage/src/res/api-coverage.xsl
+++ b/tools/cts-api-coverage/src/res/api-coverage.xsl
@@ -78,7 +78,7 @@
                 </style>
             </head>
             <body>
-                <h1>CTS API Coverage</h1>
+                <h1><xsl:value-of select="api-coverage/@title" /></h1>
                 <div class="info">
                     Generated: <xsl:value-of select="api-coverage/@generatedTime" />
                 </div>
diff --git a/tools/cts-holo-generation/Android.mk b/tools/cts-holo-generation/Android.mk
new file mode 100644
index 0000000..5f12ef0
--- /dev/null
+++ b/tools/cts-holo-generation/Android.mk
@@ -0,0 +1,34 @@
+# Copyright (C) 2014 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)
+
+# don't include this package in any target
+LOCAL_MODULE_TAGS := optional
+# and when built explicitly put it in the data partition
+LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
+# and because it is in data, do not strip classes.dex
+LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := CtsHoloGeneration
+
+LOCAL_SDK_VERSION := current
+
+include $(BUILD_PACKAGE)
diff --git a/tools/cts-holo-generation/AndroidManifest.xml b/tools/cts-holo-generation/AndroidManifest.xml
new file mode 100644
index 0000000..d7de891
--- /dev/null
+++ b/tools/cts-holo-generation/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+      package="com.android.cts.holo_capture"
+      android:versionCode="1"
+      android:versionName="1.0">
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+    <instrumentation
+        android:name="android.test.InstrumentationTestRunner"
+        android:targetPackage="com.android.cts.holo_capture" />
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+        <activity android:name=".CaptureActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureActivity.java b/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureActivity.java
new file mode 100644
index 0000000..48ba9c7
--- /dev/null
+++ b/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.holo_capture;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+
+public class CaptureActivity extends Activity {
+    private static final String TAG = "CaptureActivity";
+    private CountDownLatch mLatch = new CountDownLatch(1);
+
+    public void waitForCompletion() throws InterruptedException {
+        mLatch.await();
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Intent intent = new Intent();
+        intent.setClassName("com.android.cts.holo", "android.holo.cts.ThemeTestActivity");
+        intent.putExtra("task", 2);
+        intent.putExtra("layoutAdapterMode", 1);
+        int requestCode = 0;
+        startActivityForResult(intent, requestCode);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        Log.i(TAG, "onActivityResult req:" + requestCode + " res:" + resultCode);
+        mLatch.countDown();
+    }
+}
diff --git a/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureHolo.java b/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureHolo.java
new file mode 100644
index 0000000..cc68e1c
--- /dev/null
+++ b/tools/cts-holo-generation/src/com/android/cts/holo_capture/CaptureHolo.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.holo_capture;
+
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.test.ActivityInstrumentationTestCase2;
+
+public class CaptureHolo extends ActivityInstrumentationTestCase2<CaptureActivity> {
+    public CaptureHolo() {
+        super(CaptureActivity.class);
+    }
+
+    public void testCaptureHolo() throws InterruptedException {
+        setActivityInitialTouchMode(true);
+        CaptureActivity activity = getActivity();
+        KeyguardManager keyguardManager =
+                (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
+        keyguardManager.newKeyguardLock("holo_capture").disableKeyguard();
+        activity.waitForCompletion();
+    }
+}
diff --git a/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java b/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java
index 4086093..40a3d05 100644
--- a/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java
+++ b/tools/cts-java-scanner-doclet/src/com/android/cts/javascannerdoclet/CtsJavaScannerDoclet.java
@@ -86,7 +86,7 @@
                     AnnotationDesc[] annotations = method.annotations();
                     for (AnnotationDesc annot : annotations) {
                         AnnotationTypeDoc atype = annot.annotationType();
-                        if (atype.toString().equals("android.cts.util.TimeoutReq")) {
+                        if (atype.toString().equals("com.android.cts.util.TimeoutReq")) {
                             ElementValuePair[] cpairs = annot.elementValues();
                             for (ElementValuePair pair: cpairs) {
                                 AnnotationTypeElementDoc elem = pair.element();
diff --git a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
index 2afc4fa..8c8dd4f 100644
--- a/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
+++ b/tools/cts-java-scanner/src/com/android/cts/javascanner/DocletRunner.java
@@ -69,10 +69,10 @@
         sourcePath.add("./development/tools/hosttestlib/src");
         sourcePath.add("./libcore/dalvik/src/main/java");
         sourcePath.add("./cts/tests/src");
-        // PTS adds PtsAndroidTestCase
-        sourcePath.add("./cts/suite/pts/deviceTests/ptsutil/src");
-        sourcePath.add("./cts/libs/util/src");
+        sourcePath.add("./cts/libs/commonutil/src");
+        sourcePath.add("./cts/libs/deviceutil/src");
         sourcePath.add("./frameworks/testing/uiautomator/library/testrunner-src");
+        sourcePath.add("./frameworks/testing/uiautomator_test_libraries/src");
         sourcePath.add(sourceDir.toString());
         return join(sourcePath, ":");
     }
diff --git a/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java b/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java
index a7599b0..2414138 100644
--- a/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java
+++ b/tools/cts-native-scanner/src/com/android/cts/nativescanner/CtsNativeScanner.java
@@ -15,7 +15,8 @@
  */
 package com.android.cts.nativescanner;
 
-import java.io.File;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.List;
 
@@ -27,18 +28,18 @@
 
     private static void usage(String[] args) {
         System.err.println("Arguments: " + Arrays.asList(args));
-        System.err.println("Usage: cts-native-scanner -s SOURCE_DIR -t TEST_SUITE");
+        System.err.println("Usage: cts-native-scanner -t TEST_SUITE");
+        System.err.println("  This code reads from stdin the list of tests.");
+        System.err.println("  The format expected:");
+        System.err.println("    TEST_CASE_NAME.");
+        System.err.println("      TEST_NAME");
         System.exit(1);
     }
 
     public static void main(String[] args) throws Exception {
-        File sourceDir = null;
         String testSuite = null;
-
         for (int i = 0; i < args.length; i++) {
-            if ("-s".equals(args[i])) {
-                sourceDir = new File(getArg(args, ++i, "Missing value for source directory"));
-            } else if ("-t".equals(args[i])) {
+            if ("-t".equals(args[i])) {
                 testSuite = getArg(args, ++i, "Missing value for test suite");
             } else {
                 System.err.println("Unsupported flag: " + args[i]);
@@ -46,19 +47,14 @@
             }
         }
 
-        if (sourceDir == null) {
-            System.out.println("Source directory is required");
-            usage(args);
-        }
-
         if (testSuite == null) {
             System.out.println("Test suite is required");
             usage(args);
         }
 
-        TestScanner scanner = new TestScanner(sourceDir, testSuite);
-        List<String> testNames = scanner.getTestNames();
-        for (String name : testNames) {
+        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+        TestScanner scanner = new TestScanner(reader, testSuite);
+        for (String name : scanner.getTestNames()) {
             System.out.println(name);
         }
     }
diff --git a/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java b/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java
index 0a1b207..6fcb353 100644
--- a/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java
+++ b/tools/cts-native-scanner/src/com/android/cts/nativescanner/TestScanner.java
@@ -16,98 +16,60 @@
 
 package com.android.cts.nativescanner;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FilenameFilter;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Scanner;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 /**
- * Scanner of C++ gTest source files.
+ * Read from the BufferedReader a list of test case names and test cases.
  *
- * It looks for test declarations and outputs a file following this format:
- * suite:TestSuite
- * case:TestCase1
- * test:Test1
- * test:Test2
- * suite:TestSuite
- * case:TestCase2
- * test:Test1
- * test:Test2
+ * The expected format of the incoming test list:
+ *   TEST_CASE_NAME.
+ *     TEST_NAME1
+ *     TEST_NAME2
  *
+ * The output:
+ *   suite:TestSuite
+ *   case:TEST_CASE_NAME
+ *   test:TEST_NAME1
+ *   test:TEST_NAME2
  */
 class TestScanner {
 
-    /** Directory to recursively scan for gTest test declarations. */
-    private final File mSourceDir;
-
     private final String mTestSuite;
 
-    TestScanner(File sourceDir, String testSuite) {
-        mSourceDir = sourceDir;
+    private final BufferedReader mReader;
+
+    TestScanner(BufferedReader reader, String testSuite) {
         mTestSuite = testSuite;
+        mReader = reader;
     }
 
     public List<String> getTestNames() throws IOException {
         List<String> testNames = new ArrayList<String>();
-        scanDir(mSourceDir, testNames);
-        return testNames;
-    }
 
-    private void scanDir(File dir, List<String> testNames) throws FileNotFoundException {
-        // Find both C++ files to find tests and directories to look for more tests!
-        File[] files = dir.listFiles(new FilenameFilter() {
-            @Override
-            public boolean accept(File dir, String filename) {
-                return filename.endsWith(".cpp") || filename.endsWith(".cc")
-                        || new File(dir, filename).isDirectory();
-            }
-        });
-
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
-            if (file.isDirectory()) {
-                scanDir(file, testNames);
+        String testCaseName = null;
+        String line;
+        while ((line = mReader.readLine()) != null) {
+          if (line.length() > 0) {
+            if (line.charAt(0) == ' ') {
+              if (testCaseName != null) {
+                testNames.add("test:" + line.trim());
+              } else {
+                throw new IOException("TEST_CASE_NAME not defined before first test.");
+              }
             } else {
-                scanFile(new Scanner(file), testNames);
+              testCaseName = line.trim();
+              if (testCaseName.endsWith(".")) {
+                testCaseName = testCaseName.substring(0, testCaseName.length()-1);
+              }
+              testNames.add("suite:" + mTestSuite);
+              testNames.add("case:" + testCaseName);
             }
+          }
         }
-    }
-
-    // We want to find lines like TEST_F(SLObjectCreationTest, testAudioPlayerFromFdCreation) { ...
-    // and extract the "SLObjectCreationTest" as group #1,
-    // "testAudioPlayerFromFdCreation" as group #2
-    private static final Pattern METHOD_REGEX =
-            Pattern.compile("\\s*TEST_F\\((\\w+),\\s*(\\w+)\\).*");
-
-    public void scanFile(Scanner scanner, List<String> testNames) {
-        try {
-            String lastCase = "";
-            while (scanner.hasNextLine()) {
-                String line = scanner.nextLine();
-
-                Matcher matcher = METHOD_REGEX.matcher(line);
-
-                if (!matcher.matches()) {
-                    continue;
-                }
-
-                if (!lastCase.equals(matcher.group(1))) {
-                    testNames.add("suite:" + mTestSuite);
-                    testNames.add("case:" + matcher.group(1));
-                    lastCase = matcher.group(1);
-                }
-
-                testNames.add("test:" + matcher.group(2));
-            }
-        } finally {
-            if (scanner != null) {
-                scanner.close();
-            }
-        }
+        return testNames;
     }
 }
diff --git a/tools/cts-native-scanner/tests/src/com/android/cts/nativescanner/TestScannerTest.java b/tools/cts-native-scanner/tests/src/com/android/cts/nativescanner/TestScannerTest.java
index 18732fd..b00c7dc 100644
--- a/tools/cts-native-scanner/tests/src/com/android/cts/nativescanner/TestScannerTest.java
+++ b/tools/cts-native-scanner/tests/src/com/android/cts/nativescanner/TestScannerTest.java
@@ -19,12 +19,10 @@
 
 import junit.framework.TestCase;
 
-import java.io.File;
+import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.StringReader;
-import java.lang.StringBuilder;
-import java.util.Scanner;
 import java.util.List;
-import java.util.ArrayList;
 import java.util.Iterator;
 
 /**
@@ -32,31 +30,49 @@
  */
 public class TestScannerTest extends TestCase {
 
-    public void testScanFile() {
-        TestScanner testScanner = new TestScanner(new File("unused"), "TestSuite");
+    public void testSingleTestNamesCase() throws Exception {
+        StringReader singleTestString = new StringReader("FakeTestCase.\n  FakeTestName\n");
+        BufferedReader reader = new BufferedReader(singleTestString);
 
-        String newLine = System.getProperty("line.separator");
-        StringBuilder sb = new StringBuilder();
-        sb.append("foobar" + newLine);  // ignored
-        sb.append("TEST_F(TestCase1, TestName1)" + newLine);  // valid
-        sb.append("TEST_F(TestCase1, TestName2)" + newLine);  // valid
-        sb.append("TEST_F(TestCase2, TestName1) foo" + newLine);  // valid
-        sb.append("TEST_F(TestCase2, TestName1 foo)" + newLine);  // ignored
-        sb.append("foo TEST_F(TestCase2, TestName1)" + newLine);  // ignored
+        TestScanner testScanner = new TestScanner(reader, "TestSuite");
 
-        List<String> names = new ArrayList<String>();
-        Scanner scanner = new Scanner(new StringReader(sb.toString()));
-        testScanner.scanFile(scanner, names);
+        List<String> names = testScanner.getTestNames();
         Iterator it = names.iterator();
-
         assertEquals("suite:TestSuite", it.next());
-        assertEquals("case:TestCase1", it.next());
-        assertEquals("test:TestName1", it.next());
-        assertEquals("test:TestName2", it.next());
-        assertEquals("suite:TestSuite", it.next());
-        assertEquals("case:TestCase2", it.next());
-        assertEquals("test:TestName1", it.next());
+        assertEquals("case:FakeTestCase", it.next());
+        assertEquals("test:FakeTestName", it.next());
         assertFalse(it.hasNext());
-        scanner.close();
+    }
+
+    public void testMultipleTestNamesCase() throws Exception {
+        StringReader singleTestString = new StringReader(
+          "Case1.\n  Test1\n  Test2\nCase2.\n  Test3\n Test4\n");
+        BufferedReader reader = new BufferedReader(singleTestString);
+
+        TestScanner testScanner = new TestScanner(reader, "TestSuite");
+
+        List<String> names = testScanner.getTestNames();
+        Iterator it = names.iterator();
+        assertEquals("suite:TestSuite", it.next());
+        assertEquals("case:Case1", it.next());
+        assertEquals("test:Test1", it.next());
+        assertEquals("test:Test2", it.next());
+        assertEquals("case:Case2", it.next());
+        assertEquals("test:Test3", it.next());
+        assertEquals("test:Test4", it.next());
+        assertFalse(it.hasNext());
+    }
+
+    public void testMissingTestCaseNameCase() {
+        StringReader singleTestString = new StringReader("  Test1\n");
+        BufferedReader reader = new BufferedReader(singleTestString);
+
+        TestScanner testScanner = new TestScanner(reader, "TestSuite");
+
+        try {
+          List<String> names = testScanner.getTestNames();
+          fail();
+        } catch (IOException expected) {
+        }
     }
 }
diff --git a/tools/device-setup/TestDeviceSetup/Android.mk b/tools/device-setup/TestDeviceSetup/Android.mk
index efa50bf..ba1998c 100644
--- a/tools/device-setup/TestDeviceSetup/Android.mk
+++ b/tools/device-setup/TestDeviceSetup/Android.mk
@@ -23,10 +23,11 @@
 LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
 # and because it is in data, do not strip classes.dex
 LOCAL_DEX_PREOPT := false
+LOCAL_PROGUARD_ENABLED := disabled
 
 LOCAL_JAVA_LIBRARIES := android.test.runner
 
-LOCAL_SDK_VERSION := 17
+LOCAL_SDK_VERSION := current
 
 LOCAL_PACKAGE_NAME := TestDeviceSetup
 
diff --git a/tools/device-setup/TestDeviceSetup/AndroidManifest.xml b/tools/device-setup/TestDeviceSetup/AndroidManifest.xml
index d55ecdf..0a20e1c 100644
--- a/tools/device-setup/TestDeviceSetup/AndroidManifest.xml
+++ b/tools/device-setup/TestDeviceSetup/AndroidManifest.xml
@@ -30,12 +30,6 @@
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
-
-    <receiver android:name="android.tests.util.DisableKeyguardReceiver">
-            <intent-filter>
-                <action android:name="android.tests.util.disablekeyguard" />
-            </intent-filter>
-        </receiver>
     </application>
 
     <instrumentation android:name="android.tests.getinfo.DeviceInfoInstrument"
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
index 3614e22..4df8e62 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoActivity.java
@@ -22,11 +22,13 @@
 import android.content.pm.ConfigurationInfo;
 import android.content.res.Configuration;
 import android.os.Bundle;
+import android.view.Window;
+import android.view.WindowManager;
 
+import java.util.HashSet;
 import java.util.Locale;
 import java.util.concurrent.CountDownLatch;
 
-
 /**
  * Collect device information on target device.
  */
@@ -34,7 +36,10 @@
 
     // work done should be reported in GLES..View
     private CountDownLatch mDone = new CountDownLatch(1);
-    private GLESSurfaceView mGLView;
+    private HashSet<String> mOpenGlExtensions = new HashSet<String>();
+    private HashSet<String> mFormats = new HashSet<String>();
+    private String mGraphicsVendor;
+    private String mGraphicsRenderer;
 
     /**
      * Other classes can call this function to wait for this activity
@@ -47,17 +52,74 @@
         }
     }
 
+    private void runIterations(int glVersion) {
+        for (int i = 1; i <= glVersion; i++) {
+            final CountDownLatch done = new CountDownLatch(1);
+            final int version = i;
+            DeviceInfoActivity.this.runOnUiThread(new Runnable() {
+                public void run() {
+                    setContentView(new GLESSurfaceView(DeviceInfoActivity.this, version, done));
+                }
+            });
+            try {
+                done.await();
+            } catch (InterruptedException e) {
+                // just move on
+            }
+        }
+
+        StringBuilder textureBuilder = new StringBuilder();
+        for (String format: mFormats) {
+            textureBuilder.append(format).append(";");
+        }
+        StringBuilder extensionBuilder = new StringBuilder();
+        for (String extension : mOpenGlExtensions) {
+            extensionBuilder.append(extension).append(";");
+        }
+        DeviceInfoInstrument.addResult(
+                DeviceInfoConstants.OPEN_GL_EXTENSIONS,
+                extensionBuilder.toString());
+        DeviceInfoInstrument.addResult(
+                DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS,
+                textureBuilder.toString());
+        DeviceInfoInstrument.addResult(
+                DeviceInfoConstants.GRAPHICS_VENDOR,
+                mGraphicsVendor);
+        DeviceInfoInstrument.addResult(
+                DeviceInfoConstants.GRAPHICS_RENDERER,
+                mGraphicsRenderer);
+        mDone.countDown();
+    }
+
+    public void addOpenGlExtension(String openGlExtension) {
+        mOpenGlExtensions.add(openGlExtension);
+    }
+
+    public void addCompressedTextureFormat(String format) {
+        mFormats.add(format);
+    }
+
+    public void setGraphicsInfo(String vendor, String renderer) {
+        mGraphicsVendor = vendor;
+        mGraphicsRenderer = renderer;
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        Window w = getWindow();
+        w.setFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
+                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
 
         ActivityManager am =
                 (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
         ConfigurationInfo info = am.getDeviceConfigurationInfo();
-        boolean useGL20 = (info.reqGlEsVersion >= 0x20000);
-
-        mGLView = new GLESSurfaceView(this, useGL20, mDone);
-        setContentView(mGLView);
+        final int glVersion = (info.reqGlEsVersion & 0xffff0000) >> 16;
+        new Thread() {
+            public void run() {
+                runIterations(glVersion);
+            }
+        }.start();
 
         Configuration con = getResources().getConfiguration();
         String touchScreen = null;
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
index f251360..d77a44c 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoConstants.java
@@ -63,4 +63,6 @@
     public static final String BUILD_VERSION = "buildVersion";
     public static final String BUILD_TAGS = "build_tags";
     public static final String SERIAL_NUMBER = "deviceID";
+    public static final String STORAGE_DEVICES = "storage_devices";
+    public static final String MULTI_USER = "multi_user";
 }
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
index 49e96a0..cdf1df3 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/DeviceInfoInstrument.java
@@ -25,6 +25,8 @@
 import android.content.res.Configuration;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Environment;
+import android.os.UserManager;
 import android.telephony.TelephonyManager;
 import android.util.DisplayMetrics;
 import android.util.Log;
@@ -33,6 +35,8 @@
 
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -56,7 +60,6 @@
 
     @Override
     public void onStart() {
-
         addResult(BUILD_ID, Build.ID);
         addResult(PRODUCT_NAME, Build.PRODUCT);
         addResult(BUILD_DEVICE, Build.DEVICE);
@@ -135,6 +138,12 @@
         String sysLibraries = getSystemLibraries();
         addResult(SYS_LIBRARIES, sysLibraries);
 
+        // Storage devices
+        addResult(STORAGE_DEVICES, getStorageDevices());
+
+        // Multi-user support
+        addResult(MULTI_USER, getMultiUserInfo());
+
         finish(Activity.RESULT_OK, mResults);
     }
 
@@ -343,4 +352,42 @@
 
         return builder.toString();
     }
+
+    private String getStorageDevices() {
+        int count = 0;
+        count = Math.max(count, getContext().getExternalCacheDirs().length);
+        count = Math.max(count, getContext().getExternalFilesDirs(null).length);
+        count = Math.max(
+                count, getContext().getExternalFilesDirs(Environment.DIRECTORY_PICTURES).length);
+        count = Math.max(count, getContext().getObbDirs().length);
+
+        final String result;
+        if (Environment.isExternalStorageEmulated()) {
+            if (count == 1) {
+                return "1 emulated";
+            } else {
+                return "1 emulated, " + (count - 1) + " physical media";
+            }
+        } else {
+            return count + " physical media";
+        }
+    }
+
+    private String getMultiUserInfo() {
+        try {
+            final Method method = UserManager.class.getMethod("getMaxSupportedUsers");
+            final Integer maxUsers = (Integer) method.invoke(null);
+            if (maxUsers == 1) {
+                return "single user";
+            } else {
+                return maxUsers + " users supported";
+            }
+        } catch (ClassCastException e) {
+        } catch (NoSuchMethodException e) {
+        } catch (InvocationTargetException e) {
+        } catch (IllegalAccessException e) {
+        }
+
+        return "unknown";
+    }
 }
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
index 792a5f2..1d3bf7f 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/GLESSurfaceView.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.opengl.GLES20;
+import android.opengl.GLES30;
 import android.opengl.GLSurfaceView;
 import android.util.Log;
 
@@ -30,22 +31,24 @@
 class GLESSurfaceView extends GLSurfaceView {
     private static final String TAG = "GLESSurfaceView";
 
-    private boolean mUseGL20;
-    CountDownLatch mDone;
-
+    private int mGLVersion;//1, 2, 3
+    private CountDownLatch mDone;
+    private DeviceInfoActivity mParent;
     /**
      *
-     * @param context
-     * @param useGL20 whether to use GLES2.0 API or not inside the view
+     * @param parent
+     * @param glVersion the version of GLES API to use inside the view
      * @param done to notify the completion of the task
      */
-    public GLESSurfaceView(Context context, boolean useGL20, CountDownLatch done){
-        super(context);
+    public GLESSurfaceView(DeviceInfoActivity parent, int glVersion, CountDownLatch done){
+        super(parent);
 
-        mUseGL20 = useGL20;
+        mParent = parent;
+        mGLVersion = glVersion;
         mDone = done;
-        if (mUseGL20) {
-            setEGLContextClientVersion(2);
+        if (glVersion > 1) {
+            // Default is 1 so only set if bigger than 1
+            setEGLContextClientVersion(glVersion);
         }
         setRenderer(new OpenGLESRenderer());
     }
@@ -57,10 +60,14 @@
             String extensions;
             String vendor;
             String renderer;
-            if (mUseGL20) {
+            if (mGLVersion == 2) {
                 extensions = GLES20.glGetString(GLES20.GL_EXTENSIONS);
                 vendor = GLES20.glGetString(GLES20.GL_VENDOR);
                 renderer = GLES20.glGetString(GLES20.GL_RENDERER);
+            } else if (mGLVersion == 3) {
+                extensions = GLES30.glGetString(GLES30.GL_EXTENSIONS);
+                vendor = GLES30.glGetString(GLES30.GL_VENDOR);
+                renderer = GLES30.glGetString(GLES30.GL_RENDERER);
             } else {
                 extensions = gl.glGetString(GL10.GL_EXTENSIONS);
                 vendor = gl.glGetString(GL10.GL_VENDOR);
@@ -69,35 +76,20 @@
             Log.i(TAG, "extensions : " + extensions);
             Log.i(TAG, "vendor : " + vendor);
             Log.i(TAG, "renderer : " + renderer);
+            mParent.setGraphicsInfo(vendor, renderer);
             Scanner scanner = new Scanner(extensions);
             scanner.useDelimiter(" ");
-            StringBuilder extensionsBuilder = new StringBuilder();
-            StringBuilder builder = new StringBuilder();
             while (scanner.hasNext()) {
                 String ext = scanner.next();
-                extensionsBuilder.append(ext).append(";");
+                mParent.addOpenGlExtension(ext);
                 if (ext.contains("texture")) {
                     if (ext.contains("compression") || ext.contains("compressed")) {
                         Log.i(TAG, "Compression supported: " + ext);
-                        builder.append(ext);
-                        builder.append(";");
+                        mParent.addCompressedTextureFormat(ext);
                     }
                 }
             }
 
-            DeviceInfoInstrument.addResult(
-                    DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS,
-                    builder.toString());
-            DeviceInfoInstrument.addResult(
-                    DeviceInfoConstants.OPEN_GL_EXTENSIONS,
-                    extensionsBuilder.toString());
-            DeviceInfoInstrument.addResult(
-                    DeviceInfoConstants.GRAPHICS_VENDOR,
-                    vendor);
-            DeviceInfoInstrument.addResult(
-                    DeviceInfoConstants.GRAPHICS_RENDERER,
-                    renderer);
-
             mDone.countDown();
         }
 
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
index 4763287..fefff99 100644
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
+++ b/tools/device-setup/TestDeviceSetup/src/android/tests/getinfo/RootProcessScanner.java
@@ -31,7 +31,9 @@
             "debuggerd",
             "init",
             "installd",
+            "netd",
             "servicemanager",
+            "ueventd",
             "vold",
             "zygote"
     );
diff --git a/tools/device-setup/TestDeviceSetup/src/android/tests/util/DisableKeyguardReceiver.java b/tools/device-setup/TestDeviceSetup/src/android/tests/util/DisableKeyguardReceiver.java
deleted file mode 100644
index 3e5012d..0000000
--- a/tools/device-setup/TestDeviceSetup/src/android/tests/util/DisableKeyguardReceiver.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.tests.util;
-
-import android.app.KeyguardManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-/**
- * A utility receiver to disable the keyguard on devices.
- * Intended to be used so UI related tests can be executed successfully.
- */
-public class DisableKeyguardReceiver extends BroadcastReceiver {
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        KeyguardManager keyguardManager =
-            (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
-        keyguardManager.newKeyguardLock("cts").disableKeyguard();
-    }
-}
diff --git a/tools/tradefed-host/Android.mk b/tools/tradefed-host/Android.mk
index 8281b20..0b5d764 100644
--- a/tools/tradefed-host/Android.mk
+++ b/tools/tradefed-host/Android.mk
@@ -17,7 +17,8 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
-	$(call all-java-files-under, src)
+    $(call all-java-files-under, src) \
+    $(call all-java-files-under, ../../libs/commonutil/src)
 
 LOCAL_JAVA_RESOURCE_DIRS := res
 
@@ -26,6 +27,8 @@
 LOCAL_JAVA_LIBRARIES := ddmlib-prebuilt tradefed-prebuilt hosttestlib
 LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceinfolib
 
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+
 include $(BUILD_HOST_JAVA_LIBRARY)
 
 # Build all sub-directories
diff --git a/tools/tradefed-host/README b/tools/tradefed-host/README
index bd29c23..545d4b4 100644
--- a/tools/tradefed-host/README
+++ b/tools/tradefed-host/README
@@ -38,8 +38,12 @@
 To run a test plan on a single device:
 
 1. Make sure you have at least one device connected
-2. Launch the cts-tradefed console by running the 'cts-tradefed' script at
-android-cts/tools/cts-tradefed
+2. Launch the cts-tradefed console by running the 'cts-tradefed'. If you've
+downloaded and extracted the CTS zip, the script can be found at
+  android-cts/tools/cts-tradefed
+Or else if you are working from the Android source tree and have run make cts,
+the script can be found at
+  out/host/linux-x86/cts/android-cts/tools/cts-tradefed
 3. Type:
 'run cts --plan CTS' to run the default CTS plan
 
diff --git a/tools/tradefed-host/res/report/cts_result.xsd b/tools/tradefed-host/res/report/cts_result.xsd
index 3f7f384..ce606e9 100644
--- a/tools/tradefed-host/res/report/cts_result.xsd
+++ b/tools/tradefed-host/res/report/cts_result.xsd
@@ -78,6 +78,8 @@
         <xs:attribute name="partitions" type="xs:string"/>
         <xs:attribute name="build_abi" type="xs:string"/>
         <xs:attribute name="build_abi2" type="xs:string"/>
+        <xs:attribute name="storage_devices" type="xs:string"/>
+        <xs:attribute name="multi_user" type="xs:string"/>
       </xs:complexType>
     </xs:element>
     <xs:element name="FeatureInfo" type="featureInfoType"/>
diff --git a/tools/tradefed-host/res/report/cts_result.xsl b/tools/tradefed-host/res/report/cts_result.xsl
index 0c38be1..fe49308 100644
--- a/tools/tradefed-host/res/report/cts_result.xsl
+++ b/tools/tradefed-host/res/report/cts_result.xsl
@@ -72,7 +72,7 @@
                                         </TD>
                                     </TR>
                                     <TR>
-                                        <TD class="rowtitle">Build Name</TD>
+                                        <TD class="rowtitle">Build Product</TD>
                                         <TD>
                                             <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildName"/>
                                         </TD>
@@ -96,13 +96,13 @@
                                         </TD>
                                     </TR>
                                     <TR>
-                                        <TD class="rowtitle">Firmware Version</TD>
+                                        <TD class="rowtitle">Android Version</TD>
                                         <TD>
                                             <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildVersion"/>
                                         </TD>
                                     </TR>
                                     <TR>
-                                        <TD class="rowtitle">Firmware Build Number</TD>
+                                        <TD class="rowtitle">Build ID</TD>
                                         <TD>
                                             <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@buildID"/>
                                         </TD>
@@ -128,7 +128,7 @@
                                         </TD>
                                     </TR>
                                     <TR>
-                                        <TD class="rowtitle">Android Platform Version</TD>
+                                        <TD class="rowtitle">Android API Level</TD>
                                         <TD>
                                             <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@androidPlatformVersion"/>
                                         </TD>
@@ -298,6 +298,18 @@
                                             </pre>
                                         </TD>
                                     </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Storage devices</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@storage_devices"/>
+                                        </TD>
+                                    </TR>
+                                    <TR>
+                                        <TD class="rowtitle">Multi-user support</TD>
+                                        <TD>
+                                            <xsl:value-of select="TestResult/DeviceInfo/BuildInfo/@multi_user"/>
+                                        </TD>
+                                    </TR>
                                 </TABLE>
                             </TD>
                         </TR>
@@ -526,7 +538,7 @@
                                                             <xsl:value-of select="@result"/>
                                                         </div>
                                                     </TD>
-                                                    <TD class="failuredetails"></TD>
+                                                    <TD class="failuredetails"/>
                                                 </xsl:if>
 
                                                 <xsl:if test="@result='fail'">
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index afb0700..ccdb0eb 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -31,7 +31,7 @@
     @Option(name="cts-install-path", description="the path to the cts installation to use")
     private String mCtsRootDirPath = System.getProperty("CTS_ROOT");
 
-    public static final String CTS_BUILD_VERSION = "4.3_r2";
+    public static final String CTS_BUILD_VERSION = "4.4_r3";
 
     /**
      * {@inheritDoc}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java
new file mode 100644
index 0000000..97f607e
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsReportUtil.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.tradefed.result;
+
+import java.util.Map;
+
+/**
+ * Static utility class for handling Cts Results.
+ */
+public class CtsReportUtil {
+    private static final String CTS_RESULT_KEY = "CTS_RESULT";
+
+    /**
+     * Utility method to extract CTS result from test metrics
+     * @param testMetrics
+     * @return result or null if not found
+     */
+    public static String getCtsResultFromMetrics(Map<String, String> testMetrics) {
+        for (Map.Entry<String, String> entry: testMetrics.entrySet()) {
+            if (CTS_RESULT_KEY.equals(entry.getKey())) {
+                return entry.getValue();
+            }
+        }
+        return null;
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
index 71c093b..70310ca 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/CtsXmlResultReporter.java
@@ -19,6 +19,7 @@
 import com.android.cts.tradefed.build.CtsBuildHelper;
 import com.android.cts.tradefed.device.DeviceInfoCollector;
 import com.android.cts.tradefed.testtype.CtsTest;
+import com.android.cts.tradefed.util.CtsHostStore;
 import com.android.ddmlib.Log;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestIdentifier;
@@ -26,7 +27,6 @@
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.result.ILogFileSaver;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.InputStreamSource;
 import com.android.tradefed.result.LogDataType;
@@ -58,7 +58,7 @@
     private static final String LOG_TAG = "CtsXmlResultReporter";
 
     static final String TEST_RESULT_FILE_NAME = "testResult.xml";
-    private static final String CTS_RESULT_FILE_VERSION = "1.14";
+    static final String CTS_RESULT_FILE_VERSION = "4.4";
     private static final String[] CTS_RESULT_RESOURCES = {"cts_result.xsl", "cts_result.css",
         "logo.gif", "newrule-green.png"};
 
@@ -99,7 +99,7 @@
     private File mLogDir;
     private String mSuiteName;
 
-    private static final Pattern mPtsLogPattern = Pattern.compile("(.*)\\+\\+\\+\\+(.*)");
+    private static final Pattern mCtsLogPattern = Pattern.compile("(.*)\\+\\+\\+\\+(.*)");
 
     public void setReportDir(File reportDir) {
         mReportDir = reportDir;
@@ -212,11 +212,11 @@
     }
 
     /**
-     * Return the {@link ILogFileSaver} to use.
+     * Return the {@link LogFileSaver} to use.
      * <p/>
      * Exposed for unit testing.
      */
-    ILogFileSaver getLogFileSaver() {
+    LogFileSaver getLogFileSaver() {
         return new LogFileSaver(mLogDir);
     }
 
@@ -264,7 +264,7 @@
      */
     @Override
     public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
-        collectPtsResults(test, testMetrics);
+        collectCtsResults(test, testMetrics);
         mCurrentPkgResult.reportTestEnded(test);
         Test result = mCurrentPkgResult.findTest(test);
         String stack = result.getStackTrace() == null ? "" : "\n" + result.getStackTrace();
@@ -273,26 +273,26 @@
     }
 
     /**
-     * Collect Pts results for both device and host tests to the package result.
+     * Collect Cts results for both device and host tests to the package result.
      * @param test test ran
      * @param testMetrics test metrics which can contain performance result for device tests
      */
-    private void collectPtsResults(TestIdentifier test, Map<String, String> testMetrics) {
+    private void collectCtsResults(TestIdentifier test, Map<String, String> testMetrics) {
         // device test can have performance results in testMetrics
-        String perfResult = PtsReportUtil.getPtsResultFromMetrics(testMetrics);
-        // host test should be checked in PtsHostStore.
+        String perfResult = CtsReportUtil.getCtsResultFromMetrics(testMetrics);
+        // host test should be checked in CtsHostStore.
         if (perfResult == null) {
-            perfResult = PtsHostStore.removePtsResult(mDeviceSerial, test);
+            perfResult = CtsHostStore.removeCtsResult(mDeviceSerial, test.toString());
         }
         if (perfResult != null) {
-            // PTS result is passed in Summary++++Details format.
+            // CTS result is passed in Summary++++Details format.
             // Extract Summary and Details, and pass them.
-            Matcher m = mPtsLogPattern.matcher(perfResult);
+            Matcher m = mCtsLogPattern.matcher(perfResult);
             if (m.find()) {
                 mCurrentPkgResult.reportPerformanceResult(test, CtsTestStatus.PASS, m.group(1),
                         m.group(2));
             } else {
-                logResult("PTS Result unrecognizable:" + perfResult);
+                logResult("CTS Result unrecognizable:" + perfResult);
             }
         }
     }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
index ce228c7..dd91af0 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/DeviceInfoResult.java
@@ -108,7 +108,8 @@
         String textureData = getMetric(metricsCopy,
                 DeviceInfoConstants.OPEN_GL_COMPRESSED_TEXTURE_FORMATS);
         String openGlExtensionData = getMetric(metricsCopy,
-                    DeviceInfoConstants.OPEN_GL_EXTENSIONS);
+                DeviceInfoConstants.OPEN_GL_EXTENSIONS);
+
         // dump the remaining metrics without translation
         serializer.startTag(ns, BUILD_TAG);
         for (Map.Entry<String, String> metricEntry : metricsCopy.entrySet()) {
@@ -121,6 +122,7 @@
         serializeSystemLibrariesInfo(serializer, sysLibData);
         serializeOpenGLCompressedTextureFormatsInfo(serializer, textureData);
         serializeOpenGLExtensions(serializer, openGlExtensionData);
+        // End
         serializer.endTag(ns, TAG);
     }
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsHostStore.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsHostStore.java
deleted file mode 100644
index 5944c66..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsHostStore.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2013 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 com.android.cts.tradefed.result;
-
-import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.tradefed.device.ITestDevice;
-
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Utility class for storing Pts Results.
- * This is necessary for host tests where test metrics cannot be passed.
- */
-public class PtsHostStore {
-
-    // needs concurrent verion as there can be multiple client accessing this.
-    // But there is no additional protection for the same key as that should not happen.
-    private static final ConcurrentHashMap<String, String> mMap =
-            new ConcurrentHashMap<String, String>();
-
-    /**
-     * Stores PTS result. Existing result with the same key will be replaced.
-     * Note that key is generated in the form of device_serial#class#method name.
-     * So there should be no concurrent test for the same (serial, class, method).
-     * @param device
-     * @param test
-     * @param result PTS result string
-     */
-    public static void storePtsResult(String deviceSerial, String classMethodName, String result) {
-        mMap.put(generateTestKey(deviceSerial, classMethodName), result);
-    }
-
-    /**
-     * retrieves a PTS result for the given condition and remove it from the internal
-     * storage. If there is no result for the given condition, it will return null.
-     */
-    public static String removePtsResult(String deviceSerial, TestIdentifier test) {
-        return mMap.remove(generateTestKey(deviceSerial, test));
-    }
-
-    /**
-     * return test key in the form of device_serial#class_name#method_name
-     */
-    private static String generateTestKey(String deviceSerial, TestIdentifier test) {
-        return String.format("%s#%s", deviceSerial, test.toString());
-
-    }
-
-    /**
-     * return test key in the form of device_serial#class_name#method_name
-     */
-    private static String generateTestKey(String deviceSerial, String classMethodName) {
-        return String.format("%s#%s", deviceSerial, classMethodName);
-
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsReportUtil.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsReportUtil.java
deleted file mode 100644
index 2e3dab1..0000000
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/PtsReportUtil.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2013 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 com.android.cts.tradefed.result;
-
-import com.android.ddmlib.testrunner.TestIdentifier;
-import com.android.tradefed.device.ITestDevice;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Static utility class for handling Pts Results.
- */
-public class PtsReportUtil {
-    private static final String PTS_RESULT_KEY = "PTS_RESULT";
-
-    /**
-     * Utility method to extract PTS result from test metrics
-     * @param testMetrics
-     * @return result or null if not found
-     */
-    public static String getPtsResultFromMetrics(Map<String, String> testMetrics) {
-        for (Map.Entry<String, String> entry: testMetrics.entrySet()) {
-            if (PTS_RESULT_KEY.equals(entry.getKey())) {
-                return entry.getValue();
-            }
-        }
-        return null;
-    }
-}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java b/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
index 72e2e27..8c5b8d1 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/result/Test.java
@@ -44,7 +44,7 @@
     private static final String SCORETYPE_ATTR = "scoreType";
     private static final String UNIT_ATTR = "unit";
     private static final String SOURCE_ATTR = "source";
-    // separators for the message from PTS
+    // separators for the message
     private static final String LOG_SEPARATOR = "\\+\\+\\+";
     private static final String LOG_ELEM_SEPARATOR = "\\|";
 
@@ -54,7 +54,7 @@
     private String mEndTime;
     private String mMessage;
     private String mStackTrace;
-    // summary and details passed from pts
+    // summary and details passed from cts
     private String mSummary;
     private String mDetails;
 
@@ -184,7 +184,7 @@
                 serializer.endTag(CtsXmlResultReporter.ns, SUMMARY_TAG);
                 // add details only if summary is present
                 // <Details>
-                //   <ValueArray source=”com.android.pts.dram.BandwidthTest#doRunMemcpy:98”
+                //   <ValueArray source=”com.android.cts.dram.BandwidthTest#doRunMemcpy:98”
                 //                    message=”measure1” unit="ms" scoretype="higherBetter">
                 //     <Value>0.0</Value>
                 //     <Value>0.1</Value>
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
new file mode 100644
index 0000000..4cfd263
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/AccessibilityServiceTestRunner.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2012 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 com.android.cts.tradefed.testtype;
+
+import com.android.cts.tradefed.build.CtsBuildHelper;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.util.FileUtil;
+
+import junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * Running the accessibility tests requires modification of secure
+ * settings. Secure settings cannot be changed from device CTS tests
+ * since system signature permission is required. Such settings can
+ * be modified by the shell user, so a host side test is used for
+ * installing a package with a delegating accessibility service, enabling
+ * this service, running these tests, disabling the service, and removing
+ * the delegating accessibility service package.
+ *
+ * @deprecated This class is not required in current CTS builds. Still
+ * maintained so cts-tradefed can run against older CTS builds that still
+ * require this class.
+ */
+public class AccessibilityServiceTestRunner extends InstrumentationApkTest {
+
+    private static final String DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME =
+        "android.accessibilityservice.delegate";
+
+    private static final String DELEGATING_ACCESSIBLITY_SERVICE_NAME =
+        "android.accessibilityservice.delegate.DelegatingAccessibilityService";
+
+    private static final String DELEGATING_ACCESSIBLITY_SERVICE_APK =
+        "CtsDelegatingAccessibilityService.apk";
+
+    private CtsBuildHelper mCtsBuild;
+
+    @Override
+    public void setBuild(IBuildInfo build) {
+        super.setBuild(build);
+        mCtsBuild  = CtsBuildHelper.createBuildHelper(build);
+    }
+
+    @Override
+    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
+        beforeTest();
+        super.run(listener);
+        afterTest();
+    }
+
+    private void beforeTest() throws DeviceNotAvailableException {
+        installApkAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_APK);
+        enableAccessibilityAndDelegatingService();
+    }
+
+    private void afterTest() throws DeviceNotAvailableException {
+        AccessibilityTestRunner.disableAccessibilityAndServices(getDevice());
+        uninstallAndAssert(DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME);
+    }
+
+    private void installApkAndAssert(String apkName) throws DeviceNotAvailableException {
+        File file = FileUtil.getFileForPath(mCtsBuild.getTestCasesDir(), apkName);
+        String errorMessage = getDevice().installPackage(file, true);
+        TestCase.assertNull("Error installing: " + apkName, errorMessage);
+    }
+
+    private void uninstallAndAssert(String packageName) throws DeviceNotAvailableException {
+        String errorMessage = getDevice().uninstallPackage(packageName);
+        TestCase.assertNull("Error uninstalling: " + packageName, errorMessage);
+    }
+
+    private void enableAccessibilityAndDelegatingService() throws DeviceNotAvailableException {
+        String componentName = DELEGATING_ACCESSIBLITY_SERVICE_PACKAGE_NAME + "/"
+            + DELEGATING_ACCESSIBLITY_SERVICE_NAME;
+        AccessibilityTestRunner.enableAccessibilityAndServices(getDevice(),
+                componentName);
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestFilter.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestFilter.java
index 053b265..f1a0485 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestFilter.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestFilter.java
@@ -33,6 +33,10 @@
 
     private final Set<String> mExcludedClasses;
     private final Set<TestIdentifier> mExcludedTests;
+
+    private final Set<String> mIncludedClasses;
+    private final Set<TestIdentifier> mIncludedTests;
+
     private String mIncludedClass = null;
     private String mIncludedMethod = null;
 
@@ -42,6 +46,9 @@
     public TestFilter() {
         mExcludedClasses = new HashSet<String>();
         mExcludedTests = new HashSet<TestIdentifier>();
+
+        mIncludedClasses = new HashSet<String>();
+        mIncludedTests = new HashSet<TestIdentifier>();
     }
 
     /**
@@ -79,6 +86,36 @@
     }
 
     /**
+     * Adds a test class to the filter.
+     * <p/>
+     * All tests in this class should be allowed.
+     */
+    public void addIncludedClass(String className) {
+        mIncludedClasses.add(className);
+    }
+
+    /**
+     * Adds a test class to the filter. All tests in this class should be excluded.
+     */
+    public void addIncludedTest(TestIdentifier test) {
+        mIncludedTests.add(test);
+    }
+
+    /**
+     * @return the mIncludedClasses
+     */
+    public Set<String> getIncludedClasses() {
+        return mIncludedClasses;
+    }
+
+    /**
+     * @return the mIncludedTests
+     */
+    public Set<TestIdentifier> getIncludedTests() {
+        return mIncludedTests;
+    }
+
+    /**
      * Sets the class name and optionally method that should pass this filter. If non-null, all
      * other tests will be excluded.
      *
@@ -96,7 +133,7 @@
      * @param tests the list of tests to filter
      * @return a new sorted list of tests that passed the filter
      */
-    public Collection<TestIdentifier> filter(Collection<TestIdentifier > tests) {
+    public Collection<TestIdentifier> filter(Collection<TestIdentifier> tests) {
         List<TestIdentifier> filteredTests = new ArrayList<TestIdentifier>(tests.size());
         for (TestIdentifier test : tests) {
             if (mIncludedClass != null && !test.getClassName().equals(mIncludedClass)) {
@@ -115,6 +152,12 @@
                 // skip
                 continue;
             }
+            if ((!mIncludedTests.isEmpty() || !mIncludedClasses.isEmpty())
+                    && !(mIncludedClasses.contains(test.getClassName())
+                            || mIncludedTests.contains(test))) {
+                // skip
+                continue;
+            }
             filteredTests.add(test);
         }
         Collections.sort(filteredTests, new TestIdComparator());
@@ -129,6 +172,13 @@
     }
 
     /**
+     * @return true if there are inclusion rules defined.
+     */
+    public boolean hasInclusion() {
+        return !mIncludedClasses.isEmpty() || !mIncludedTests.isEmpty();
+    }
+
+    /**
      * A {@link Comparator} for {@link TestIdentifier} that compares using
      * {@link TestIdentifier#toString()}
      */
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 59babec..8ab5d18 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -48,12 +48,14 @@
     public static final String VM_HOST_TEST = "vmHostTest";
     public static final String ACCESSIBILITY_TEST =
         "com.android.cts.tradefed.testtype.AccessibilityTestRunner";
+    public static final String ACCESSIBILITY_SERVICE_TEST =
+        "com.android.cts.tradefed.testtype.AccessibilityServiceTestRunner";
     public static final String DISPLAY_TEST =
             "com.android.cts.tradefed.testtype.DisplayTestRunner";
     public static final String UIAUTOMATOR_TEST = "uiAutomator";
 
     private static final String SIGNATURE_TEST_METHOD = "testSignature";
-    private static final String SIGNATURE_TEST_CLASS = "android.tests.sigtest.SimpleSignatureTest";
+    private static final String SIGNATURE_TEST_CLASS = "android.tests.sigtest.SignatureTest";
 
     private String mUri = null;
     private String mAppNameSpace = null;
@@ -228,6 +230,9 @@
         } else if (ACCESSIBILITY_TEST.equals(mTestType)) {
             AccessibilityTestRunner test = new AccessibilityTestRunner();
             return setInstrumentationTest(test, testCaseDir);
+        } else if (ACCESSIBILITY_SERVICE_TEST.equals(mTestType)) {
+            AccessibilityServiceTestRunner test = new AccessibilityServiceTestRunner();
+            return setInstrumentationTest(test, testCaseDir);
         } else if (DISPLAY_TEST.equals(mTestType)) {
             DisplayTestRunner test = new DisplayTestRunner();
             return setInstrumentationTest(test, testCaseDir);
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
index 675c986..bd67f78 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageXmlParser.java
@@ -84,7 +84,9 @@
                 mPackageDef.setTestType(getTestType(attributes));
                 mPackageDef.setJarPath(jarPath);
                 mPackageDef.setIsSignatureCheck(parseBoolean(signatureCheck));
-                mPackageDef.setTestPackageName(javaPackageFilter);
+                if (!"".equals(javaPackageFilter)) {
+                    mPackageDef.setTestPackageName(javaPackageFilter);
+                }
                 mPackageDef.setTargetBinaryName(targetBinaryName);
                 mPackageDef.setTargetNameSpace(targetNameSpace);
 
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
index 3639a9c..c2a1348 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPlan.java
@@ -47,6 +47,7 @@
     private static final String TEST_DELIM = ";";
     private static final String METHOD_DELIM = "#";
     private static final String EXCLUDE_ATTR = "exclude";
+    private static final String INCLUDE_ATTR = "include";
     private static final String URI_ATTR = "uri";
 
     private final String mName;
@@ -61,21 +62,23 @@
                 throws SAXException {
             if (ENTRY_TAG.equals(localName)) {
                 final String entryUriValue = attributes.getValue(URI_ATTR);
-                TestFilter filter = parseExcludedTests(attributes.getValue(EXCLUDE_ATTR));
+                TestFilter filter = parseTestList(
+                        attributes.getValue(EXCLUDE_ATTR), attributes.getValue(INCLUDE_ATTR));
                 mUriExcludedTestsMap.put(entryUriValue, filter);
             }
         }
 
         /**
-         * Parse the semi colon separated list of tests to exclude.
+         * Parse a semicolon separated list of tests.
          * <p/>
          * Expected format:
          * testClassName[#testMethodName][;testClassName2...]
          *
          * @param excludedString the excluded string list
+         * @param includedString the included string list
          * @return
          */
-        private TestFilter parseExcludedTests(String excludedString) {
+        private TestFilter parseTestList(String excludedString, String includedString) {
             TestFilter filter = new TestFilter();
             if (excludedString != null) {
                 String[] testStrings = excludedString.split(TEST_DELIM);
@@ -89,6 +92,19 @@
                     }
                 }
             }
+            if (includedString != null) {
+                String[] testStrings = includedString.split(TEST_DELIM);
+                for (String testString : testStrings) {
+                    String[] classMethodPair = testString.split(METHOD_DELIM);
+                    if (classMethodPair.length == 2) {
+                        filter.addIncludedTest(new TestIdentifier(classMethodPair[0],
+                                classMethodPair[1]));
+                    } else {
+                        filter.addIncludedClass(testString);
+                    }
+                }
+            }
+
             return filter;
         }
     }
@@ -198,16 +214,27 @@
      */
     private void serializeFilter(KXmlSerializer serializer, TestFilter testFilter)
             throws IOException {
-        if (!testFilter.hasExclusion()) {
-            return;
+        if (testFilter.hasExclusion()) {
+            List<String> exclusionStrings = new ArrayList<String>();
+            exclusionStrings.addAll(testFilter.getExcludedClasses());
+            for (TestIdentifier test : testFilter.getExcludedTests()) {
+                // TODO: this relies on TestIdentifier.toString() using METHOD_DELIM.
+                exclusionStrings.add(test.toString());
+            }
+            String exclusionAttrValue = ArrayUtil.join(TEST_DELIM, exclusionStrings);
+            serializer.attribute(null, EXCLUDE_ATTR, exclusionAttrValue);
         }
-        List<String> exclusionStrings = new ArrayList<String>();
-        exclusionStrings.addAll(testFilter.getExcludedClasses());
-        for (TestIdentifier test : testFilter.getExcludedTests()) {
-            // TODO: this relies on TestIdentifier.toString() using METHOD_DELIM.
-            exclusionStrings.add(test.toString());
+
+        if (testFilter.hasInclusion()) {
+            List<String> inclusionStrings = new ArrayList<String>();
+            inclusionStrings.addAll(testFilter.getIncludedClasses());
+            for (TestIdentifier test : testFilter.getIncludedTests()) {
+                // TODO: this relies on TestIdentifier.toString() using METHOD_DELIM.
+                inclusionStrings.add(test.toString());
+            }
+            String exclusionAttrValue = ArrayUtil.join(TEST_DELIM, inclusionStrings);
+            serializer.attribute(null, INCLUDE_ATTR, exclusionAttrValue);
         }
-        String exclusionAttrValue = ArrayUtil.join(TEST_DELIM, exclusionStrings);
-        serializer.attribute(null, EXCLUDE_ATTR, exclusionAttrValue);
+
     }
 }
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
new file mode 100644
index 0000000..9c1e283
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/CtsHostStore.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.tradefed.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Utility class for storing Cts Results.
+ * This is necessary for host tests where test metrics cannot be passed.
+ */
+public class CtsHostStore {
+
+    // needs concurrent verion as there can be multiple client accessing this.
+    // But there is no additional protection for the same key as that should not happen.
+    private static final ConcurrentHashMap<String, String> mMap =
+            new ConcurrentHashMap<String, String>();
+
+    /**
+     * Stores CTS result. Existing result with the same key will be replaced.
+     * Note that key is generated in the form of device_serial#class#method name.
+     * So there should be no concurrent test for the same (serial, class, method).
+     * @param deviceSerial
+     * @param classMethodName
+     * @param result CTS result string
+     */
+    public static void storeCtsResult(String deviceSerial, String classMethodName, String result) {
+        mMap.put(generateTestKey(deviceSerial, classMethodName), result);
+    }
+
+    /**
+     * retrieves a CTS result for the given condition and remove it from the internal
+     * storage. If there is no result for the given condition, it will return null.
+     */
+    public static String removeCtsResult(String deviceSerial, String classMethodName) {
+        return mMap.remove(generateTestKey(deviceSerial, classMethodName));
+    }
+
+    /**
+     * return test key in the form of device_serial#class_name#method_name
+     */
+    private static String generateTestKey(String deviceSerial, String classMethodName) {
+        return String.format("%s#%s", deviceSerial, classMethodName);
+
+    }
+}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
new file mode 100644
index 0000000..125c56e
--- /dev/null
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/util/HostReportLog.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2013 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 com.android.cts.tradefed.util;
+
+import com.android.cts.util.ReportLog;
+
+/**
+ * ReportLog for host tests
+ * Note that setTestInfo should be set before throwing report
+ */
+public class HostReportLog extends ReportLog {
+    private String mDeviceSerial;
+    private String mClassMethodName;
+
+    /**
+     * @param deviceSerial serial number of the device
+     * @param classMethodName class name and method name of the test in class#method format.
+     *        Note that ReportLog.getClassMethodNames() provide this.
+     */
+    public HostReportLog(String deviceSerial, String classMethodName) {
+        mDeviceSerial = deviceSerial;
+        mClassMethodName = classMethodName;
+    }
+
+    public void deliverReportToHost() {
+        CtsHostStore.storeCtsResult(mDeviceSerial, mClassMethodName, generateReport());
+    }
+}
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
index 9515446..5776568 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/result/CtsXmlResultReporterTest.java
@@ -15,6 +15,8 @@
  */
 package com.android.cts.tradefed.result;
 
+import static com.android.cts.tradefed.result.CtsXmlResultReporter.CTS_RESULT_FILE_VERSION;
+
 import com.android.ddmlib.testrunner.ITestRunListener.TestFailure;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IFolderBuildInfo;
@@ -84,8 +86,9 @@
     public void testEmptyGeneration() {
         final String expectedHeaderOutput = "<?xml version='1.0' encoding='UTF-8' standalone='no' ?>" +
             "<?xml-stylesheet type=\"text/xsl\" href=\"cts_result.xsl\"?>";
-        final String expectedTestOutput =
-            "<TestResult testPlan=\"NA\" starttime=\"ignore\" endtime=\"ignore\" version=\"1.13\"> ";
+        final String expectedTestOutput = String.format(
+            "<TestResult testPlan=\"NA\" starttime=\"ignore\" endtime=\"ignore\" " +
+                    "version=\"%s\" suite=\"%s\"> ", CTS_RESULT_FILE_VERSION, "CTS" );
         final String expectedSummaryOutput =
             "<Summary failed=\"0\" notExecuted=\"0\" timeout=\"0\" pass=\"0\" />";
         final String expectedEndTag = "</TestResult>";
@@ -93,10 +96,10 @@
         mResultReporter.invocationEnded(1);
         String actualOutput = getOutput();
         assertTrue(actualOutput.startsWith(expectedHeaderOutput));
-        assertTrue(String.format("test output did not contain expected test result. Got %s",
-                actualOutput), actualOutput.contains(expectedTestOutput));
-        assertTrue(String.format("test output did not contain expected test summary. Got %s",
-                actualOutput), actualOutput.contains(expectedSummaryOutput));
+        assertTrue(String.format("test output did not contain expected test result [%s]. Got %s",
+                expectedTestOutput, actualOutput), actualOutput.contains(expectedTestOutput));
+        assertTrue(String.format("test output did not contain expected test summary [%s]. Got %s",
+                expectedTestOutput, actualOutput), actualOutput.contains(expectedSummaryOutput));
         assertTrue(String.format("test output did not contain expected TestResult end tag. Got %s",
                 actualOutput), actualOutput.endsWith(expectedEndTag));
     }
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestFilterTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestFilterTest.java
index 676b912..2f76e1f 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestFilterTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/TestFilterTest.java
@@ -25,7 +25,7 @@
 import java.util.List;
 
 /**
- *
+ * Unit tests for {@link TestFilter}.
  */
 public class TestFilterTest extends TestCase {
 
@@ -87,7 +87,7 @@
     }
 
     /**
-     * Test {@link TestFilter#filter(java.util.Collection)} with at class
+     * Test {@link TestFilter#filter(java.util.Collection)} with a class
      */
     public void testFilter_includeTest() {
         mFilter.setTestInclusion(TEST1.getClassName(), TEST1.getTestName());
@@ -96,4 +96,82 @@
         Iterator<TestIdentifier> iter = filteredList.iterator();
         assertEquals(TEST1, iter.next());
     }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} with an included test filter
+     */
+    public void testFilter_includeClasses() {
+        mFilter.addIncludedClass(TEST3.getClassName());
+        Collection<TestIdentifier> filteredList = mFilter.filter(mTestList);
+        assertEquals(1, filteredList.size());
+        assertEquals(TEST3, filteredList.iterator().next());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} with an included test filter
+     */
+    public void testFilter_includeTests() {
+        mFilter.addIncludedTest(TEST1);
+        mFilter.addIncludedTest(TEST3);
+        Collection<TestIdentifier> filteredList = mFilter.filter(mTestList);
+        assertEquals(2, filteredList.size());
+        Iterator<TestIdentifier> iter = filteredList.iterator();
+        assertEquals(TEST1, iter.next());
+        assertEquals(TEST3, iter.next());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)}. Exclusion overrides
+     * inclusion.
+     */
+    public void testFilter_includeAndExcludeClasses() {
+        String className = TEST3.getClassName();
+        mFilter.addExcludedClass(className);
+        mFilter.addIncludedClass(className);
+        assertTrue(mFilter.filter(mTestList).isEmpty());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} Exclusion overrides
+     * inclusion.
+     */
+    public void testFilter_includeAndExcludeTests() {
+        mFilter.addExcludedTest(TEST1);
+        mFilter.addIncludedTest(TEST1);
+        assertTrue(mFilter.filter(mTestList).isEmpty());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} Exclusion overrides
+     * inclusion.
+     */
+    public void testFilter_includeTestAndExcludeClass() {
+        mFilter.addExcludedClass(TEST1.getClassName());
+        mFilter.addIncludedTest(TEST1);
+        assertTrue(mFilter.filter(mTestList).isEmpty());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} Exclusion overrides
+     * inclusion.
+     */
+    public void testFilter_includeClassAndExcludeTest() {
+        mFilter.addExcludedTest(TEST1);
+        mFilter.addIncludedClass(TEST1.getClassName());
+        Collection<TestIdentifier> filteredList = mFilter.filter(mTestList);
+        assertEquals(1, filteredList.size());
+        Iterator<TestIdentifier> iter = filteredList.iterator();
+        assertEquals(TEST2, iter.next());
+    }
+
+    /**
+     * Test {@link TestFilter#filter(java.util.Collection)} Exclusion overrides
+     * inclusion.
+     */
+    public void testFilter_includeClassAndExcludeTests() {
+        mFilter.addExcludedTest(TEST1);
+        mFilter.addExcludedTest(TEST2);
+        mFilter.addIncludedClass(TEST1.getClassName());
+        assertTrue(mFilter.filter(mTestList).isEmpty());
+    }
 }
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index e9069ec..b269be8 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -153,6 +153,8 @@
     plan.Include('android\.renderscript')
     plan.Include('android\.telephony')
     plan.Include('android\.nativemedia.*')
+    plan.Include('com\.android\.cts\..*')#TODO(stuartscott): Should PDK have all these?
+    #TODO(stuartscott): Maybe move away from com.android.* to android.* - less typing
     self.__WritePlan(plan, 'PDK')
 
     #dirty hack to copy over pre-populated CTS plans - flaky vs stable - to streamline autoCTS
@@ -171,7 +173,7 @@
   package.AddAttribute('appNameSpace', 'android.tests.sigtest')
   package.AddAttribute('signatureCheck', 'true')
   package.AddAttribute('runner', '.InstrumentationRunner')
-  package.AddTest('android.tests.sigtest.SignatureTest.signatureTest')
+  package.AddTest('android.tests.sigtest.SignatureTest.testSignature')
   description = open(os.path.join(test_repository, 'SignatureTest.xml'), 'w')
   package.WriteDescription(description)
   description.close()
diff --git a/tools/utils/rm_dup_holo_imgs.py b/tools/utils/rm_dup_holo_imgs.py
new file mode 100755
index 0000000..2464d0b
--- /dev/null
+++ b/tools/utils/rm_dup_holo_imgs.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2014 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.
+#
+import hashlib
+import os
+import subprocess
+import sys
+
+densities = [
+    "ldpi",
+    "mdpi",
+    "tvdpi",
+    "hdpi",
+    "xhdpi",
+    "400dpi",
+    "xxhdpi",
+    "xxxhdpi"
+]
+
+# A script to find holo images which are duplicated in the landscape and
+# portrait folder. The landscape images will then be deleted as Android will
+# look up landscape resources in the portrait folder if it doesn't exist in the
+# landscape folder. This will reduce the size of the Holo test case.
+def main(argv):
+  run(True)
+  run(False)
+
+def run(sw):
+  for density in densities:
+    portDir = getDirName(density, sw, False)
+    landDir = getDirName(density, sw, True)
+    portrait = getAllHashes(portDir)
+    landscape = getAllHashes(landDir)
+    for f in portrait:
+      if f in landscape and landscape[f] == portrait[f]:
+        subprocess.call(["rm", landDir + "/" + f])
+
+def getAllHashes(dirName):
+  files = {}
+  for f in os.listdir(dirName):
+    if f.endswith(".png"):
+      files[f] = getHash(open(dirName + "/" + f, 'rb'))
+  return files
+
+def getHash(f):
+  return hashlib.sha1(f.read()).hexdigest()
+
+def getDirName(density, sw, land):
+  name = "drawable-"
+  if sw:
+    name += "sw600dp-"
+  if land:
+    name += "land-"
+  return name + density
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
index 43df2b2..f4fe940 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/Test_aput_boolean.java
@@ -175,19 +175,6 @@
             DxUtil.checkVerifyException(t);
         }
     }
-    
-    /**
-     * @constraint B15 
-     * @title put value 2 into boolean array
-     */
-    public void testVFE9() {
-        try {
-            Class.forName("dot.junit.opcodes.aput_boolean.d.T_aput_boolean_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
 
     /**
      * @constraint B1
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
deleted file mode 100644
index 64eb60e..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_boolean/d/T_aput_boolean_10.d
+++ /dev/null
@@ -1,34 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_aput_boolean_10.java
-.class public dot.junit.opcodes.aput_boolean.d.T_aput_boolean_10
-.super java/lang/Object
-
-
-.method public <init>()V
-.limit regs 1
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run([ZIZ)V
-.limit regs 11
-
-       const v10, 2
-       aput-boolean v10, v8, v9
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
index 96ef2b6..396e5b7 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/Test_aput_byte.java
@@ -178,19 +178,6 @@
     }
 
     /**
-     * @constraint B15 
-     * @title put value 128 into byte array
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dot.junit.opcodes.aput_byte.d.T_aput_byte_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
      * @constraint B1
      * @title Type of index argument - float. The verifier checks that ints
      * and floats are not used interchangeably.
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
deleted file mode 100644
index b65ae76..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_byte/d/T_aput_byte_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_aput_byte_10.java
-.class public dot.junit.opcodes.aput_byte.d.T_aput_byte_10
-.super java/lang/Object
-
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run([BIB)V
-.limit regs 11
-
-       const v10, 128
-       aput-byte v10, v8, v9
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java
index 66265c7..8698034 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/Test_aput_char.java
@@ -192,17 +192,4 @@
         }
     }
 
-    /**
-     * @constraint B15 
-     * @title put value 65536 into char array
-     */
-    public void testVFE9() {
-        try {
-            Class.forName("dot.junit.opcodes.aput_char.d.T_aput_char_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
 }
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
deleted file mode 100644
index dd68792..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_char/d/T_aput_char_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_aput_char_10.java
-.class public dot.junit.opcodes.aput_char.d.T_aput_char_10
-.super java/lang/Object
-
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run([CIC)V
-.limit regs 11
-
-       const v10, 65536
-       aput-char v10, v8, v9
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java
index 82959db..a3dcf18 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/Test_aput_short.java
@@ -175,19 +175,6 @@
             DxUtil.checkVerifyException(t);
         }
     }
-    
-    /**
-     * @constraint B15 
-     * @title put value 32768 into array of shorts
-     */
-    public void testVFE8() {
-        try {
-            Class.forName("dot.junit.opcodes.aput_short.d.T_aput_short_10");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
 
     /**
      * @constraint B1
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d b/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
deleted file mode 100644
index bbb541c..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/aput_short/d/T_aput_short_10.d
+++ /dev/null
@@ -1,35 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_aput_short_10.java
-.class public dot.junit.opcodes.aput_short.d.T_aput_short_10
-.super java/lang/Object
-
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run([SIS)V
-.limit regs 11
-
-       const v10, 32768    
-       aput-short v10, v8, v9
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
index eff1f49..e806df2 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iget_short/d/T_iget_short_21.d
@@ -30,7 +30,7 @@
        new-instance v0, Ldot/junit/opcodes/iget_short/TestStubs;
        invoke-direct {v0}, dot/junit/opcodes/iget_short/TestStubs/<init>()V
        
-       iget-wide v1, v0, dot.junit.opcodes.iget_short.TestStubs.TestStubProtectedField S
+       iget-short v1, v0, dot.junit.opcodes.iget_short.TestStubs.TestStubProtectedField S
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
index e7c6a0b..1772f22 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/Test_invoke_direct.java
@@ -23,6 +23,7 @@
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_16;
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_2;
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_21;
+import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_26;
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_6;
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_7;
 import dot.junit.opcodes.invoke_direct.d.T_invoke_direct_8;
@@ -276,8 +277,10 @@
         //@uses dot.junit.opcodes.invoke_direct.TAbstract
         try {
             new T_invoke_direct_13().run();
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or verification exception");
         } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -314,8 +317,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE20() {
+        //@uses dot.junit.opcodes.invoke_direct.d.T_invoke_direct_26
         try {
-            Class.forName("dot.junit.opcodes.invoke_direct.d.T_invoke_direct_26");
+            new T_invoke_direct_26().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
index 6230fa9..9f79d59 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_12.d
@@ -27,7 +27,7 @@
 .method public run()I
 .limit regs 3
 
-       invoke-direct {v1}, dot/junit/opcodes/invoke_direct/TSuper/toIntPvt()I
+       invoke-direct {v2}, dot/junit/opcodes/invoke_direct/TSuper/toIntPvt()I
        move-result v0
        return v0
 .end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.java
new file mode 100644
index 0000000..970478f
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_26.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_direct.d;
+
+public class T_invoke_direct_26 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
index e6e7511..ed919f9 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4.d
@@ -27,6 +27,7 @@
 .end method
 
 .method public run()V
-    invoke-direct {v0}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4/<clinit>()V
+    invoke-direct {}, dot/junit/opcodes/invoke_direct/d/T_invoke_direct_4/<clinit>()V
+    return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
index 1682c68..d4f194b 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/Test_invoke_direct_range.java
@@ -23,6 +23,7 @@
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_16;
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_2;
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_21;
+import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_26;
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_6;
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_7;
 import dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_8;
@@ -277,8 +278,10 @@
         //@uses dot.junit.opcodes.invoke_direct_range.TAbstract
         try {
             new T_invoke_direct_range_13().run();
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or verification exception");
         } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -315,8 +318,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE20() {
+        //@uses dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_26
         try {
-            Class.forName("dot.junit.opcodes.invoke_direct_range.d.T_invoke_direct_range_26");
+            new T_invoke_direct_range_26().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
index a107ac3..7dd13f0 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_12.d
@@ -27,7 +27,7 @@
 .method public run()I
 .limit regs 3
 
-       invoke-direct/range {v1}, dot/junit/opcodes/invoke_direct_range/TSuper/toIntPvt()I
+       invoke-direct/range {v2}, dot/junit/opcodes/invoke_direct_range/TSuper/toIntPvt()I
        move-result v0
        return v0
 .end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.java
new file mode 100644
index 0000000..b0ad389
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_direct_range/d/T_invoke_direct_range_26.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_direct_range.d;
+
+public class T_invoke_direct_range_26 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
index ae06cda..f846374 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/Test_invoke_interface.java
@@ -166,8 +166,9 @@
     public void testVFE2() {
         try {
             new T_invoke_interface_4().run();
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or IncompatibleClassChangeError");
         } catch (NoSuchMethodError t) {
+        } catch (IncompatibleClassChangeError e) {
         }
     }
 
@@ -216,13 +217,13 @@
      * @title invoke-interface may not be used to call <init>.
      */
     public void testVFE10() {
-        //@uses dot.junit.opcodes.invoke_interface.ITest
-        //@uses dot.junit.opcodes.invoke_interface.ITestImpl
-        //@uses dot.junit.opcodes.invoke_interface.ITestImplAbstract
+        //@uses dot.junit.opcodes.invoke_interface.d.T_invoke_interface_18
         try {
             new T_invoke_interface_18().run(new ITestImpl());
-            fail("expected InstantiationError");
-        } catch (InstantiationError t) {
+            fail("expected NoSuchMethodError or verification exception");
+        } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -235,8 +236,10 @@
         //@uses dot.junit.opcodes.invoke_interface.ITestImpl
         try {
             new T_invoke_interface_20().run(new ITestImpl());
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or verification exception");
         } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
index f792a3b..d974005 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface/d/T_invoke_interface_18.d
@@ -20,14 +20,7 @@
 .method public <init>()V
 .limit regs 2
 
-       invoke-direct {v1}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run(Ldot/junit/opcodes/invoke_interface/ITest;)V
-.limit regs 8
-       new-instance v2, dot/junit/opcodes/invoke_interface/ITestImplAbstract
-       invoke-interface {v2}, dot/junit/opcodes/invoke_interface/ITestImplAbstract/<init>()V
+       invoke-interface {v1}, java/lang/Object/<init>()V
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
index abb4855..9f98d4c 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/Test_invoke_interface_range.java
@@ -143,8 +143,9 @@
     public void testVFE2() {
         try {
             new T_invoke_interface_range_4().run();
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or IncompatibleClassChangeError");
         } catch (NoSuchMethodError t) {
+        } catch (IncompatibleClassChangeError e) {
         }
     }
 
@@ -193,13 +194,13 @@
      * @title invoke-interface may not be used to call <init>.
      */
     public void testVFE10() {
-        //@uses dot.junit.opcodes.invoke_interface_range.ITest
-        //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
-        //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
+        //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18
         try {
             new T_invoke_interface_range_18().run(new ITestImpl());
-            fail("expected InstantiationError");
-        } catch (InstantiationError t) {
+            fail("expected NoSuchMethodError or verification exception");
+        } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -212,8 +213,10 @@
         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
         try {
             new T_invoke_interface_range_20().run(new ITestImpl());
-            fail("expected NoSuchMethodError");
+            fail("expected NoSuchMethodError or verification exception");
         } catch (NoSuchMethodError t) {
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
index 0174a71..014b348 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_interface_range/d/T_invoke_interface_range_18.d
@@ -20,14 +20,7 @@
 .method public <init>()V
 .limit regs 2
 
-       invoke-direct {v1}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run(Ldot/junit/opcodes/invoke_interface_range/ITest;)V
-.limit regs 8
-       new-instance v2, dot/junit/opcodes/invoke_interface_range/ITestImplAbstract
-       invoke-interface/range {v2}, dot/junit/opcodes/invoke_interface_range/ITestImplAbstract/<init>()V
+       invoke-interface/range {v1}, java/lang/Object/<init>()V
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
index c7b77aa..02793fd 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/Test_invoke_static.java
@@ -26,6 +26,7 @@
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_18;
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_19;
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_2;
+import dot.junit.opcodes.invoke_static.d.T_invoke_static_24;
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_4;
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_5;
 import dot.junit.opcodes.invoke_static.d.T_invoke_static_6;
@@ -156,8 +157,9 @@
     public void testVFE5() {
         try {
             new T_invoke_static_19().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -260,8 +262,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_static.d.T_invoke_static_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_static.d.T_invoke_static_24");
+            new T_invoke_static_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.java
new file mode 100644
index 0000000..90e404d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static/d/T_invoke_static_24.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_static.d;
+
+public class T_invoke_static_24 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
index c62b333..7db6776 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/Test_invoke_static_range.java
@@ -26,6 +26,7 @@
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_18;
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_19;
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_2;
+import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_24;
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_4;
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_5;
 import dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_6;
@@ -155,8 +156,9 @@
     public void testVFE5() {
         try {
             new T_invoke_static_range_19().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -259,8 +261,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_static_range.d.T_invoke_static_range_24");
+            new T_invoke_static_range_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.java
new file mode 100644
index 0000000..84e6831
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_static_range/d/T_invoke_static_range_24.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_static_range.d;
+
+public class T_invoke_static_range_24 {
+    public void run() {
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
index 6efac8b..b1602b6 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/Test_invoke_super.java
@@ -27,6 +27,7 @@
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_19;
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_2;
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_20;
+import dot.junit.opcodes.invoke_super.d.T_invoke_super_24;
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_4;
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_5;
 import dot.junit.opcodes.invoke_super.d.T_invoke_super_6;
@@ -142,8 +143,9 @@
     public void testVFE3() {
         try {
             new T_invoke_super_10().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -324,8 +326,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_super.d.T_invoke_super_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_super.d.T_invoke_super_24");
+            new T_invoke_super_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.java
new file mode 100644
index 0000000..38ebc44
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super/d/T_invoke_super_24.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_super.d;
+
+public class T_invoke_super_24 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
index d65b8d4..51291f1 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/Test_invoke_super_range.java
@@ -27,6 +27,7 @@
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19;
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_2;
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20;
+import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24;
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4;
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5;
 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6;
@@ -142,8 +143,9 @@
     public void testVFE3() {
         try {
             new T_invoke_super_range_10().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -324,8 +326,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24");
+            new T_invoke_super_range_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.java
new file mode 100644
index 0000000..d1c8a31
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_super_range/d/T_invoke_super_range_24.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_super_range.d;
+
+public class T_invoke_super_range_24 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
index 6e41ec1..03f2bb6 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/Test_invoke_virtual.java
@@ -26,6 +26,7 @@
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_18;
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_19;
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_20;
+import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_24;
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_4;
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_5;
 import dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_6;
@@ -139,8 +140,9 @@
     public void testVFE3() {
         try {
             new T_invoke_virtual_10().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -316,8 +318,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_virtual.d.T_invoke_virtual_24");
+            new T_invoke_virtual_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.java
new file mode 100644
index 0000000..02e2efd
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual/d/T_invoke_virtual_24.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_virtual.d;
+
+public class T_invoke_virtual_24 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
index 2368dc3..6200ce7 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/Test_invoke_virtual_range.java
@@ -27,6 +27,7 @@
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_19;
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_2;
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_20;
+import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_24;
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_4;
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_5;
 import dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_6;
@@ -148,8 +149,9 @@
     public void testVFE3() {
         try {
             new T_invoke_virtual_range_10().run();
-            fail("expected IncompatibleClassChangeError");
-        } catch (IncompatibleClassChangeError t) {
+            fail("expected a verification exception");
+        } catch (Throwable t) {
+            DxUtil.checkVerifyException(t);
         }
     }
 
@@ -324,8 +326,9 @@
      * @title attempt to invoke interface method
      */
     public void testVFE18() {
+        //@uses dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_24
         try {
-            Class.forName("dot.junit.opcodes.invoke_virtual_range.d.T_invoke_virtual_range_24");
+            new T_invoke_virtual_range_24().run();
             fail("expected a verification exception");
         } catch (Throwable t) {
             DxUtil.checkVerifyException(t);
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.java b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.java
new file mode 100644
index 0000000..8ad860d
--- /dev/null
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/invoke_virtual_range/d/T_invoke_virtual_range_24.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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 dot.junit.opcodes.invoke_virtual_range.d;
+
+public class T_invoke_virtual_range_24 {
+
+    public int run() {
+        return 0;
+    }
+}
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
index 6a2419b..5736c7c 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/Test_iput_boolean.java
@@ -124,20 +124,6 @@
     /**
      *
      * @constraint B14
-     * @title put value '2' into boolean field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B14
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
deleted file mode 100644
index 29230ed..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_boolean/d/T_iput_boolean_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_iput_boolean_6.java
-.class public dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6
-.super java/lang/Object
-
-.field public  s Z
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 6
-
-       const v2, 2    
-       iput-boolean v2, v5, dot.junit.opcodes.iput_boolean.d.T_iput_boolean_6.s Z
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
index f67e22b..d421980 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/Test_iput_byte.java
@@ -122,20 +122,6 @@
     /**
      *
      * @constraint B14
-     * @title put value '256' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.iput_byte.d.T_iput_byte_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B14
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
index 9f8bd0f..78dde15 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_21.d
@@ -16,7 +16,7 @@
 .class public dot.junit.opcodes.iput_byte.d.T_iput_byte_21
 .super java/lang/Object
 
-.field public  st_s I
+.field public  st_s S
 
 .method public <init>()V
 .limit regs 1
@@ -28,7 +28,7 @@
 .method public run()V
 .limit regs 4
        const v0, 12    
-       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_21.st_s I
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_21.st_s S
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
index e0a19be..a81dfb6 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_22.d
@@ -16,7 +16,7 @@
 .class public dot.junit.opcodes.iput_byte.d.T_iput_byte_22
 .super java/lang/Object
 
-.field public  st_b I
+.field public  st_i I
 
 .method public <init>()V
 .limit regs 1
@@ -28,7 +28,7 @@
 .method public run()V
 .limit regs 4
        const v0, 1    
-       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_22.st_b I
+       iput-byte v0, v3, dot.junit.opcodes.iput_byte.d.T_iput_byte_22.st_i I
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
deleted file mode 100644
index d349e8e..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_byte/d/T_iput_byte_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_iput_byte_6.java
-.class public dot.junit.opcodes.iput_byte.d.T_iput_byte_6
-.super java/lang/Object
-
-.field public  st_i1 B
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 256
-       iput-byte v0, v2, dot.junit.opcodes.iput_byte.d.T_iput_byte_6.st_i1 B
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java
index f3a4f9e..87634c7 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/Test_iput_char.java
@@ -123,20 +123,6 @@
     /**
      *
      * @constraint B14
-     * @title put value '66000' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.iput_char.d.T_iput_char_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B14
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
deleted file mode 100644
index 5614d67..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_char/d/T_iput_char_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_iput_char_6.java
-.class public dot.junit.opcodes.iput_char.d.T_iput_char_6
-.super java/lang/Object
-
-.field public  st_i1 C
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 66000
-       iput-char v0, v2, dot.junit.opcodes.iput_char.d.T_iput_char_6.st_i1 C
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java
index 0ea32e5..1895953 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/Test_iput_short.java
@@ -124,20 +124,6 @@
     /**
      *
      * @constraint B14
-     * @title put value '66000' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.iput_short.d.T_iput_short_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B14
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
deleted file mode 100644
index ba79d41..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/iput_short/d/T_iput_short_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_iput_short_6.java
-.class public dot.junit.opcodes.iput_short.d.T_iput_short_6
-.super java/lang/Object
-
-.field public  st_i1 S
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 66000
-       iput-short v0, v2, dot.junit.opcodes.iput_short.d.T_iput_short_6.st_i1 S
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
index 7417a8e..9ad99fc 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_enter/d/T_monitor_enter_3.d
@@ -29,5 +29,6 @@
 
        const/4 v5, 0
        monitor-enter v5
+       monitor-exit v5
        return-void
 .end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
index bef8390..1f83d57 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/monitor_exit/d/T_monitor_exit_1.d
@@ -32,6 +32,9 @@
 .method public run(Ljava/lang/Object;)V
 .limit regs 5
 
+       new-instance v2, java/lang/Object
+       invoke-direct {v2}, java/lang/Object/<init>()V
+       monitor-enter v2
        monitor-exit v3
        return-void
 .end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
index 2410da3..1ab9dc1 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_return/d/T_opc_return_3.d
@@ -27,6 +27,9 @@
 .method private declared_synchronized test()F
 .limit regs 4
 
+    new-instance v2, java/lang/Object
+    invoke-direct {v2}, java/lang/Object/<init>()V
+    monitor-enter v2
     monitor-exit v3
     const v0, 1.0
     return v0
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
index e096f4c..67366f6 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_12.d
@@ -50,4 +50,4 @@
     return v1
 
 .catch java/lang/RuntimeException from Label0 to Label1 using Label1
-.end method
\ No newline at end of file
+.end method
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
index 4e23269..f37a447 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/opc_throw/d/T_opc_throw_5.d
@@ -27,6 +27,9 @@
 .method public declared_synchronized run()V
 .limit regs 6
 
+       new-instance v2, java/lang/Object
+       invoke-direct {v2}, java/lang/Object/<init>()V
+       monitor-enter v2
        monitor-exit v5
 
        new-instance v1, java/lang/NullPointerException
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
index bc2f85f..e82e7d6 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_object/d/T_return_object_8.d
@@ -26,7 +26,10 @@
 
 .method private declared_synchronized test()Ljava/lang/String;
 .limit regs 4
- 
+
+    new-instance v2, java/lang/Object
+    invoke-direct {v2}, java/lang/Object/<init>()V
+    monitor-enter v2
     monitor-exit v3
     const-string v0, "abc"
     return-object v0
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
index ff12b06..b6bad32 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_void/d/T_return_void_3.d
@@ -25,9 +25,12 @@
 .end method
 
 .method private declared_synchronized test()V
-.limit regs 1
+.limit regs 2
 
-    monitor-exit v0
+    new-instance v0, java/lang/Object
+    invoke-direct {v0}, java/lang/Object/<init>()V
+    monitor-enter v0
+    monitor-exit v1
     return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
index 1a6fdb6..479e777 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/return_wide/d/T_return_wide_3.d
@@ -27,6 +27,9 @@
 .method private declared_synchronized test()D
 .limit regs 4
 
+    new-instance v2, java/lang/Object
+    invoke-direct {v2}, java/lang/Object/<init>()V
+    monitor-enter v2
     monitor-exit v3
     const-wide v0, 1.0
     return-wide v0
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
index f503ec6..1b8d96c 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/Test_sput_boolean.java
@@ -125,20 +125,6 @@
     /**
      *
      * @constraint B13
-     * @title put value '2' into boolean field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B13
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
deleted file mode 100644
index d50c573..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_boolean/d/T_sput_boolean_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_sput_boolean_6.java
-.class public dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6
-.super java/lang/Object
-
-.field public static s Z
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 6
-
-       const v2, 2    
-       sput-boolean v2, dot.junit.opcodes.sput_boolean.d.T_sput_boolean_6.s Z
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
index c64f876..5ac828d 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/Test_sput_byte.java
@@ -123,20 +123,6 @@
     /**
      *
      * @constraint B13
-     * @title put value '256' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.sput_byte.d.T_sput_byte_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B13
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
index 15a924b..e643cb9 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_21.d
@@ -16,7 +16,7 @@
 .class public dot.junit.opcodes.sput_byte.d.T_sput_byte_21
 .super java/lang/Object
 
-.field public static st_s I
+.field public static st_s S
 
 .method public <init>()V
 .limit regs 1
@@ -28,7 +28,7 @@
 .method public run()V
 .limit regs 4
        const v0, 12    
-       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_21.st_s I
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_21.st_s S
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
index 3501490..7a59d06 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_22.d
@@ -16,7 +16,7 @@
 .class public dot.junit.opcodes.sput_byte.d.T_sput_byte_22
 .super java/lang/Object
 
-.field public static st_b I
+.field public static st_i I
 
 .method public <init>()V
 .limit regs 1
@@ -28,7 +28,7 @@
 .method public run()V
 .limit regs 4
        const v0, 1    
-       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_22.st_b I
+       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_22.st_i I
        return-void
 .end method
 
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
deleted file mode 100644
index f41929a..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_byte/d/T_sput_byte_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_sput_byte_6.java
-.class public dot.junit.opcodes.sput_byte.d.T_sput_byte_6
-.super java/lang/Object
-
-.field public static st_i1 B
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 256
-       sput-byte v0, dot.junit.opcodes.sput_byte.d.T_sput_byte_6.st_i1 B
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java
index 120b45a..8585365 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/Test_sput_char.java
@@ -123,20 +123,6 @@
     /**
      *
      * @constraint B13
-     * @title put value '66000' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.sput_char.d.T_sput_char_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B13
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
deleted file mode 100644
index a2e504a..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_char/d/T_sput_char_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_sput_char_6.java
-.class public dot.junit.opcodes.sput_char.d.T_sput_char_6
-.super java/lang/Object
-
-.field public static st_i1 C
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 66000
-       sput-char v0, dot.junit.opcodes.sput_char.d.T_sput_char_6.st_i1 C
-       return-void
-.end method
-
-
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java
index f14c4a7..5fcbe58 100644
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java
+++ b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/Test_sput_short.java
@@ -123,20 +123,6 @@
     /**
      *
      * @constraint B13
-     * @title put value '66000' into byte field
-     */
-    public void testVFE6() {
-        try {
-            Class.forName("dot.junit.opcodes.sput_short.d.T_sput_short_6");
-            fail("expected a verification exception");
-        } catch (Throwable t) {
-            DxUtil.checkVerifyException(t);
-        }
-    }
-
-    /**
-     *
-     * @constraint B13
      * @title type of field doesn't match opcode - attempt to modify double
      * field with single-width register
      */
diff --git a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d b/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
deleted file mode 100644
index 1b3904f..0000000
--- a/tools/vm-tests-tf/src/dot/junit/opcodes/sput_short/d/T_sput_short_6.d
+++ /dev/null
@@ -1,36 +0,0 @@
-; Copyright (C) 2008 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.
-
-.source T_sput_short_6.java
-.class public dot.junit.opcodes.sput_short.d.T_sput_short_6
-.super java/lang/Object
-
-.field public static st_i1 S
-
-.method public <init>()V
-.limit regs 1
-
-       invoke-direct {v0}, java/lang/Object/<init>()V
-       return-void
-.end method
-
-.method public run()V
-.limit regs 3
-
-       const v0, 66000
-       sput-short v0, dot.junit.opcodes.sput_short.d.T_sput_short_6.st_i1 S
-       return-void
-.end method
-
-